56 Commits
Author SHA1 Message Date
minom be5352efed 疏文 2026-09-11 17:56:59 +08:00
minom dfb6a8e6a4 疏文 2026-09-11 15:43:56 +08:00
minom fa0ab417e1 修正快速報名 2026-09-09 16:51:48 +08:00
minom 52a10420ae 調整排版 2026-09-07 16:14:35 +08:00
minom 22e7c008ef 修正排版 2026-09-07 15:09:46 +08:00
minom 666b3e0c16 調整版面 2026-09-04 17:41:08 +08:00
minom 126e46e6ed 調整牌位版面 2026-09-04 10:01:07 +08:00
minom 78ac144a32 sql script 2026-08-28 17:40:19 +08:00
minom db19f6d1a5 信眾牌位範本,活動總疏文 2026-08-27 16:06:15 +08:00
minom b02fc8ec52 更新 2026-08-26 18:03:54 +08:00
minom b7ae0abc20 信眾牌位範本 2026-08-26 17:46:49 +08:00
minom fa1ed1f827 增加信眾牌位範本及疏文 2026-08-25 17:52:36 +08:00
minom a8d3990784 牌位顯示版面調整 2026-08-21 18:03:49 +08:00
minom 71e619dda2 還是有問題 2026-08-20 18:02:53 +08:00
minom 24de2c6071 還是怪的 2026-08-20 17:55:01 +08:00
minom 7c5e5ab984 調整牌位,還是有點怪怪的 2026-08-20 17:46:25 +08:00
minom 466ec11c91 總疏文 2026-08-18 17:54:18 +08:00
minom c03bcfea64 總疏文 2026-08-17 18:05:22 +08:00
minom b1c05c82cb .. 2026-08-14 18:13:52 +08:00
minom 68860331ce 人事資料 2026-08-14 15:54:52 +08:00
minom 700f92fcbc 修正列印牌位異常,修正報名新增功德項目,避免用到不存在的套表造成null pointer 2026-08-10 15:18:40 +08:00
minom 68206fcab2 功能條整 2026-08-07 18:00:51 +08:00
minom e60b172b39 modify 2026-08-06 18:00:04 +08:00
minom b30cc47184 調整版面 2026-08-05 17:40:06 +08:00
minom d6c817475c 客堂登記報名 2026-08-04 18:06:23 +08:00
minom da913d2584 增加客堂簡易報名 2026-08-03 18:09:15 +08:00
minom 12634b942c 客堂報名 2026-07-31 17:46:21 +08:00
minom 7f1e7dd419 牌位版型調整 2026-07-31 14:45:08 +08:00
minom 4b9448d548 牌位排版調整 2026-07-30 18:01:35 +08:00
minom cc85cb5bd7 窯整縮放 2026-07-29 20:59:49 +08:00
minom ced4eabe71 .. 2026-07-29 18:01:45 +08:00
minom 35a0be701b 調整 2026-07-27 18:22:22 +08:00
minom d823cedd3c 調整 2026-07-27 06:28:06 +08:00
minom 5f8c5a8430 功能調整 2026-07-24 18:04:53 +08:00
minom da58dc92d0 調整 2026-07-22 18:04:17 +08:00
minom 07c5027ad8 行板 2026-07-19 19:48:17 +08:00
minom 59bb0ff824 調整版型設計 2026-07-17 17:40:17 +08:00
minom dee05d6ff9 修正信眾資料換頁異常 2026-07-15 17:48:49 +08:00
minom 94ce54577e 功德芳名列印,bug修正 2026-07-15 17:35:47 +08:00
minom 681d5293a6 疏文產生 2026-07-14 17:59:45 +08:00
minom fbfa8dd361 調整牌位排版,增加疏文列印 2026-07-13 17:49:11 +08:00
minom d71cc605dc 牌位版面調整 2026-07-12 21:22:38 +08:00
minom 2686506f9c 修正很多東西 2026-07-10 17:35:02 +08:00
minom 266aeb4426 修改按鈕文字 2026-07-09 17:54:41 +08:00
minom eeed2c8651 修正調整很多東西 2026-07-09 17:48:47 +08:00
minom 8d8cf9fed4 調整列印時的尺寸,還有問題 2026-07-03 17:46:08 +08:00
minom 301d329add 排版調整 2026-07-03 17:35:31 +08:00
minom 1d09b445d3 牌位列印調整,活動刪除提示訊息調整 2026-07-02 16:43:18 +08:00
minom 31e382070f 超出範圍要拉回 2026-07-01 17:49:37 +08:00
minom 82c9f51bcd 版面調整 2026-07-01 09:09:15 +08:00
minom 7db39117b4 批次報名移除排序功能·移除一些console.log 2026-06-23 07:56:12 +08:00
minom 5fa147f960 功能修正調整 2026-06-22 17:58:04 +08:00
minom 5f3ac3ec7f 牌位版型設計,增加刪除版型跟紙張尺寸 2026-06-16 09:44:16 +08:00
minom c249e84240 modify 2026-06-08 17:02:17 +08:00
minom 23da5f0dc0 modify 2026-06-08 13:41:33 +08:00
minom dce5d52a70 merge to main 2026-06-08 13:32:21 +08:00
103 changed files with 18069 additions and 2537 deletions
+85 -5
View File
@@ -1,4 +1,5 @@
using DocumentFormat.OpenXml.Office2010.Excel;
using AjaxControlToolkit.HTMLEditor.Popups;
using DocumentFormat.OpenXml.Office2010.Excel;
using DocumentFormat.OpenXml.Wordprocessing;
using MINOM.COM.Utility;
using Model;
@@ -224,9 +225,9 @@ public class StyleDataAccess
sb.Clear();
sb.Append("insert into TabletStyleDetail(StyleID,Name,Descr,ElementID,StartX,StartY,FontSize,BreakLen,FontFamily,TwoOffset,");
sb.Append("ThreeOffset,FourOffSet,IsActive,Width,Height,TextWidth,TextHeight,CUser,CDate,CTime,UUser,UDate,UTime) ");
sb.Append("ThreeOffset,FourOffSet,IsActive,Width,Height,TextWidth,TextHeight,TextSpan,CUser,CDate,CTime,UUser,UDate,UTime) ");
sb.Append("values (@StyleID,@Name,@Descr,@ElementID,@StartX,@StartY,@FontSize,@BreakLen,@FontFamily,@TwoOffset,");
sb.Append("@ThreeOffset,@FourOffSet,@IsActive,@Width,@Height,@TextWidth,@TextHeight,@CUser,@CDate,@CTime,@UUser,@UDate,@UTime) ");
sb.Append("@ThreeOffset,@FourOffSet,@IsActive,@Width,@Height,@TextWidth,@TextHeight,@TextSpan,@CUser,@CDate,@CTime,@UUser,@UDate,@UTime) ");
foreach (var item in list)
{
SqlParameter[] sp1 = new SqlParameter[] {
@@ -247,6 +248,7 @@ public class StyleDataAccess
new SqlParameter("@Height",item.Height),
new SqlParameter("@TextWidth",item.TextWidth),
new SqlParameter("@TextHeight",item.TextHeight),
new SqlParameter("@TextSpan",item.TextSpan),
new SqlParameter("@CUser",""),
new SqlParameter("@CDate",""),
new SqlParameter("@CTime",""),
@@ -293,7 +295,7 @@ public class StyleDataAccess
new SqlParameter("@UTime",""),
};
sb.Append("update TabletStyle set Descr=@Descr,PaperSize=@PaperSize,BackendImg=@BackendImg,PrintSize=@PrintSize,");
sb.Append("update TabletStyle set Name=@Name,Descr=@Descr,PaperSize=@PaperSize,BackendImg=@BackendImg,PrintSize=@PrintSize,");
sb.Append("PrintMode=@PrintMode,Orientation=@Orientation,PrintPageCount=@PrintPageCount,RosterLimit=@RosterLimit,");
sb.Append("CUser=@CUser,CDate=@CDate,CTime=@CTime,UUser=@UUSer,UDate=@UDate,UTime=@UTime ");
sb.Append("where StyleID=@StyleID ");
@@ -303,7 +305,7 @@ public class StyleDataAccess
sb.Clear();
sb.Append("update TabletStyleDetail set Descr=@Descr,StartX=@StartX,StartY=@StartY,FontSize=@FontSize,BreakLen=@BreakLen,");
sb.Append("FontFamily=@FontFamily,TwoOffset=@TwoOffset,ThreeOffset=@ThreeOffset,FourOffset=@FourOffset,IsActive=@IsActive,");
sb.Append("Width=@Width,Height=@Height,TextWidth=@TextWidth,TextHeight=@TextHeight,UUser=@UUser,UDate=@UDate,UTime=@UTime ");
sb.Append("Width=@Width,Height=@Height,TextWidth=@TextWidth,TextHeight=@TextHeight,TextSpan=@TextSpan,UUser=@UUser,UDate=@UDate,UTime=@UTime ");
sb.Append("where StyleID=@StyleID and ElementID=@ElementID ");
//sb.Append("insert into TabletStyleDetail(StyleID,Name,Descr,ElementID,StartX,StartY,FontSize,BreakLen,FontFamily,TwoOffset,");
//sb.Append("ThreeOffset,FourOffSet,IsActive,Width,Height,TextWidth,TextHeight,CUser,CDate,CTime,UUser,UDate,UTime) ");
@@ -329,6 +331,7 @@ public class StyleDataAccess
new SqlParameter("@Height",item.Height),
new SqlParameter("@TextWidth",item.TextWidth),
new SqlParameter("@TextHeight",item.TextHeight),
new SqlParameter("@TextSpan",item.TextSpan),
new SqlParameter("@CUser",""),
new SqlParameter("@CDate",""),
new SqlParameter("@CTime",""),
@@ -348,4 +351,81 @@ public class StyleDataAccess
}
return obj;
}
public object[] DelTabletPaper(string paperID)
{
try
{
using (var context = new ezEntities())
{
StringBuilder sb = new StringBuilder();
SqlParameter[] sp = new SqlParameter[] {
new SqlParameter("@PaperID",paperID),
};
sb.Clear();
sb.Append("if not exists (select StyleID from TabletStyle where PaperSize=@paperID or PrintSize=@paperID)");
sb.Append("begin ");
sb.Append("delete TabletPaperSize where paperID=@paperID ");
sb.Append("end;");
sb.Append("select @@ROWCOUNT ;");
int i = context.Database.ExecuteSqlCommand(sb.ToString(), sp.ToArray());
if (i > 0)
{
obj[0] = "Y";
obj[1] = "刪除成功";
}
else
{
obj[0] = "N";
obj[1] = "刪除失敗,已有活動使用";
}
}
}
catch (Exception ex)
{
obj[0] = "N";
obj[1] = "刪除失敗:" + ex.Message;
}
return obj;
}
public object[] DelTabletStyle(string styleID)
{
try
{
using (var context = new ezEntities())
{
StringBuilder sb = new StringBuilder();
SqlParameter[] sp = new SqlParameter[] {
new SqlParameter("@StyleID",styleID),
};
sb.Clear();
sb.Append("if not exists (select defaultStyle from actItem where defaultStyle=@styleID)");
sb.Append("begin ");
sb.Append("delete TabletStyle where styleID=@styleID ");
sb.Append("delete TabletStyleDetail where StyleID=@StyleID ");
sb.Append("end;");
sb.Append("select @@ROWCOUNT ;");
int i = context.Database.ExecuteSqlCommand(sb.ToString(), sp.ToArray());
if (i > 0)
{
obj[0] = "Y";
obj[1] = "刪除成功";
}
else
{
obj[0] = "N";
obj[1] = "刪除失敗,已有活動使用";
}
}
}
catch (Exception ex)
{
obj[0] = "N";
obj[1] = "刪除失敗:"+ex.Message;
}
return obj;
}
}
+81 -80
View File
@@ -6,87 +6,88 @@ using System.Web;
/// <summary>
/// Style 的摘要描述
/// </summary>
public class TabletStyle
{
public TabletStyle()
{
//
// TODO: 在這裡新增建構函式邏輯
//
}
//public class TabletStyle
//{
// public TabletStyle()
// {
// //
// // TODO: 在這裡新增建構函式邏輯
// //
// }
public string StyleID { get; set; }
public string Name { get; set; }
public string Descr { get; set; }
public string PaperSize { get; set; }
public string BackendImg { get; set; }
public string PrintSize { get; set; }
public string PrintMode { get; set; }
public string Orientation { get; set; }
public string PrintPageCount { get; set; }
public string RosterLimit { get; set; }
public string CUser { get; set; }
public string CDate { get; set; }
public string CTime { get; set; }
public string UUser { get; set; }
public string UDate { get; set; }
public string UTime { get; set; }
}
// public string StyleID { get; set; }
// public string Name { get; set; }
// public string Descr { get; set; }
// public string PaperSize { get; set; }
// public string BackendImg { get; set; }
// public string PrintSize { get; set; }
// public string PrintMode { get; set; }
// public string Orientation { get; set; }
// public string PrintPageCount { get; set; }
// public string RosterLimit { get; set; }
// public string CUser { get; set; }
// public string CDate { get; set; }
// public string CTime { get; set; }
// public string UUser { get; set; }
// public string UDate { get; set; }
// public string UTime { get; set; }
//}
public class TabletStyleDetail
{
public TabletStyleDetail() { }
public string StyleID { get; set; }
public string Name { get; set; }
public string Descr { get; set; }
public string ElementID { get; set; }
public string StartX { get; set; }
public string StartY { get; set; }
public string FontSize { get; set; }
public string FontFamily { get; set; }
public string TwoOffset { get; set; }
public string ThreeOffset { get; set; }
public string FourOffset { get; set; }
public string IsActive { get; set; }
public string Width { get; set; }
public string Height { get; set; }
public string TextWidth { get; set; }
public string TextHeight { get; set; }
public string BreakLen { get; set; }
public string CUser { get; set; }
public string CDate { get; set; }
public string CTime { get; set; }
public string UUser { get; set; }
public string UDate { get; set; }
public string UTime { get; set; }
}
//public class TabletStyleDetail
//{
// public TabletStyleDetail() { }
// public string StyleID { get; set; }
// public string Name { get; set; }
// public string Descr { get; set; }
// public string ElementID { get; set; }
// public string StartX { get; set; }
// public string StartY { get; set; }
// public string FontSize { get; set; }
// public string FontFamily { get; set; }
// public string TwoOffset { get; set; }
// public string ThreeOffset { get; set; }
// public string FourOffset { get; set; }
// public string IsActive { get; set; }
// public string Width { get; set; }
// public string Height { get; set; }
// public string TextWidth { get; set; }
// public string TextHeight { get; set; }
// public string TextSpan { get; set; }
// public string BreakLen { get; set; }
// public string CUser { get; set; }
// public string CDate { get; set; }
// public string CTime { get; set; }
// public string UUser { get; set; }
// public string UDate { get; set; }
// public string UTime { get; set; }
//}
public class TabletElement
{
public TabletElement() { }
public string ElementID { get; set; }
public string Name { get; set; }
public string ElementType { get; set; }
public string SampleContent { get; set; }
public string CUser { get; set; }
public string CDate { get; set; }
public string CTime { get; set; }
public string UUser { get; set; }
public string UDate { get; set; }
public string UTime { get; set; }
}
//public class TabletElement
//{
// public TabletElement() { }
// public string ElementID { get; set; }
// public string Name { get; set; }
// public string ElementType { get; set; }
// public string SampleContent { get; set; }
// public string CUser { get; set; }
// public string CDate { get; set; }
// public string CTime { get; set; }
// public string UUser { get; set; }
// public string UDate { get; set; }
// public string UTime { get; set; }
//}
public class TabletPaperSize
{
public TabletPaperSize() { }
public string PaperID { get; set; }
public string PaperName { get; set; }
public string Width { get; set; }
public string Height { get; set; }
public string CUser { get; set; }
public string CDate { get; set; }
public string CTime { get; set; }
public string UUser { get; set; }
public string UDate { get; set; }
public string UTime { get; set; }
}
//public class TabletPaperSize
//{
// public TabletPaperSize() { }
// public string PaperID { get; set; }
// public string PaperName { get; set; }
// public string Width { get; set; }
// public string Height { get; set; }
// public string CUser { get; set; }
// public string CDate { get; set; }
// public string CTime { get; set; }
// public string UUser { get; set; }
// public string UDate { get; set; }
// public string UTime { get; set; }
//}
+24
View File
@@ -95,6 +95,30 @@ namespace Model
public virtual DbSet<AncestralTabletStatus> AncestralTabletStatus { get; set; }
public virtual DbSet<GuaDanOrderGuest> GuaDanOrderGuest { get; set; }
public virtual DbSet<auto_enroll> auto_enroll { get; set; }
public virtual DbSet<receipt_detail> receipt_detail { get; set; }
public virtual DbSet<receipt_master> receipt_master { get; set; }
public virtual DbSet<receipt_style> receipt_style { get; set; }
public virtual DbSet<receipt_style_d> receipt_style_d { get; set; }
public virtual DbSet<pre_order> pre_order { get; set; }
public virtual DbSet<followers_tablet_template> followers_tablet_template { get; set; }
public virtual DbSet<hr_arrange> hr_arrange { get; set; }
public virtual DbSet<hr_company> hr_company { get; set; }
public virtual DbSet<hr_employee> hr_employee { get; set; }
public virtual DbSet<hr_employee_family> hr_employee_family { get; set; }
public virtual DbSet<hr_employee_ins> hr_employee_ins { get; set; }
public virtual DbSet<hr_employee_ins_fam> hr_employee_ins_fam { get; set; }
public virtual DbSet<hr_employee_job> hr_employee_job { get; set; }
public virtual DbSet<hr_employee_traffic> hr_employee_traffic { get; set; }
public virtual DbSet<hr_ins_grade> hr_ins_grade { get; set; }
public virtual DbSet<hr_ins_ratio> hr_ins_ratio { get; set; }
public virtual DbSet<hr_org> hr_org { get; set; }
public virtual DbSet<hr_section> hr_section { get; set; }
public virtual DbSet<activity_shuwen> activity_shuwen { get; set; }
public virtual DbSet<shuwen_temp> shuwen_temp { get; set; }
public virtual DbSet<TabletElement> TabletElement { get; set; }
public virtual DbSet<TabletPaperSize> TabletPaperSize { get; set; }
public virtual DbSet<TabletStyle> TabletStyle { get; set; }
public virtual DbSet<TabletStyleDetail> TabletStyleDetail { get; set; }
public virtual int pager_eztrust(Nullable<int> startRowIndex, Nullable<int> pageSize, string tableName, string columnName, string sqlWhere, string orderBy, ObjectParameter rowCount)
{
+483 -2
View File
@@ -423,6 +423,22 @@ namespace Model
using System;
using System.Collections.Generic;
public partial class activity_shuwen
{
public int act_num { get; set; }
public Nullable<int> shuwen_num { get; set; }
public string shuwen_type { get; set; }
public string contents { get; set; }
public Nullable<System.DateTime> reg_time { get; set; }
public string paper_size { get; set; }
public string direction { get; set; }
}
}
namespace Model
{
using System;
using System.Collections.Generic;
public partial class activity_spares
{
public int num { get; set; }
@@ -694,8 +710,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<System.DateTime> start_date { get; set; }
public Nullable<System.DateTime> end_date { get; set; }
public string receipt_title { get; set; }
public string receipt_address { get; set; }
@@ -1026,6 +1042,21 @@ namespace Model
using System;
using System.Collections.Generic;
public partial class followers_tablet_template
{
public int num { get; set; }
public Nullable<int> follower_num { get; set; }
public string name { get; set; }
public string style_id { get; set; }
public string tablet { get; set; }
public string shuwen { get; set; }
}
}
namespace Model
{
using System;
using System.Collections.Generic;
public partial class GuaDanOrder
{
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
@@ -1108,6 +1139,247 @@ namespace Model
using System;
using System.Collections.Generic;
public partial class hr_arrange
{
public string company_id { get; set; }
public string arrange_id { get; set; }
public string name { get; set; }
public string descriptions { get; set; }
public string default_time { get; set; }
}
}
namespace Model
{
using System;
using System.Collections.Generic;
public partial class hr_company
{
public string company_id { get; set; }
public string name { get; set; }
public string parent_id { get; set; }
public string super_visor { get; set; }
public string contactor { get; set; }
public string web_site { get; set; }
public string tel { get; set; }
public string address { get; set; }
public string email { get; set; }
public string fax { get; set; }
public string compiled { get; set; }
public string eng_name { get; set; }
public string descriptions { get; set; }
}
}
namespace Model
{
using System;
using System.Collections.Generic;
public partial class hr_employee
{
public string company_id { get; set; }
public string employee_id { get; set; }
public string name { get; set; }
public string org_no { get; set; }
public string emp_type { get; set; }
public string salary_type { get; set; }
public string status { get; set; }
public string eng_name { get; set; }
public string work_email { get; set; }
public string self_email { get; set; }
public string tel { get; set; }
public string mobile { get; set; }
public string address { get; set; }
public string contactor { get; set; }
public string contactor_tel { get; set; }
public string contactor_mobile { get; set; }
public string contactor_address { get; set; }
public string contactor_email { get; set; }
public Nullable<System.DateTime> birth_day { get; set; }
public string blood { get; set; }
public Nullable<decimal> height { get; set; }
public Nullable<decimal> weight { get; set; }
public string marrige { get; set; }
public string sex { get; set; }
public string military { get; set; }
public string religion { get; set; }
public string political { get; set; }
public string nation { get; set; }
public string aboriginal { get; set; }
public string disability { get; set; }
public string animal { get; set; }
public string star { get; set; }
public string id_no { get; set; }
public string stay_id { get; set; }
}
}
namespace Model
{
using System;
using System.Collections.Generic;
public partial class hr_employee_family
{
public string company_id { get; set; }
public string employee_id { get; set; }
public string family_seq { get; set; }
public string name { get; set; }
public string relation { get; set; }
public string sex { get; set; }
public string id_no { get; set; }
public Nullable<System.DateTime> birth_day { get; set; }
public string tel { get; set; }
public string mobile { get; set; }
public string email { get; set; }
public string status { get; set; }
}
}
namespace Model
{
using System;
using System.Collections.Generic;
public partial class hr_employee_ins
{
public string id { get; set; }
public string company_id { get; set; }
public string employee_id { get; set; }
public string ins_type { get; set; }
public System.DateTime effective_date { get; set; }
public string effective_type { get; set; }
public string ins_grade { get; set; }
public string ins_condition { get; set; }
public string reason { get; set; }
public string descriptions { get; set; }
}
}
namespace Model
{
using System;
using System.Collections.Generic;
public partial class hr_employee_ins_fam
{
public string ins_id { get; set; }
public string family_seq { get; set; }
public System.DateTime effective_date { get; set; }
public string effective_type { get; set; }
public string reason { get; set; }
public string descriptions { get; set; }
public string ins_condition { get; set; }
}
}
namespace Model
{
using System;
using System.Collections.Generic;
public partial class hr_employee_job
{
public string company_id { get; set; }
public string employee_id { get; set; }
public string job_company { get; set; }
public string job_org { get; set; }
public string title { get; set; }
public string role_id { get; set; }
}
}
namespace Model
{
using System;
using System.Collections.Generic;
public partial class hr_employee_traffic
{
public string company_id { get; set; }
public string employee_id { get; set; }
public string traffic_type { get; set; }
public string license { get; set; }
public string car { get; set; }
}
}
namespace Model
{
using System;
using System.Collections.Generic;
public partial class hr_ins_grade
{
public string ins_type { get; set; }
public string seq_no { get; set; }
public Nullable<decimal> start_amt { get; set; }
public Nullable<decimal> end_amt { get; set; }
public Nullable<decimal> self_pay { get; set; }
public Nullable<decimal> comp_pay { get; set; }
public Nullable<decimal> gov_pay { get; set; }
public Nullable<decimal> ins_amt { get; set; }
public System.DateTime effective_date { get; set; }
}
}
namespace Model
{
using System;
using System.Collections.Generic;
public partial class hr_ins_ratio
{
public string ins_type { get; set; }
public Nullable<decimal> ratio { get; set; }
public Nullable<decimal> employee_ratio { get; set; }
public Nullable<decimal> company_ratio { get; set; }
public Nullable<decimal> gov_ratio { get; set; }
public Nullable<decimal> avg_dependents { get; set; }
public string round_mode { get; set; }
public string round_precision { get; set; }
public string calc_sequence { get; set; }
public string remainder_bearer { get; set; }
public System.DateTime effective_date { get; set; }
}
}
namespace Model
{
using System;
using System.Collections.Generic;
public partial class hr_org
{
public string company_id { get; set; }
public string org_no { get; set; }
public string name { get; set; }
public string parent_no { get; set; }
public string charge_role { get; set; }
public string eng_name { get; set; }
public string descriptions { get; set; }
public string status { get; set; }
public string org_type { get; set; }
}
}
namespace Model
{
using System;
using System.Collections.Generic;
public partial class hr_section
{
public string company_id { get; set; }
public string section_id { get; set; }
public string name { get; set; }
public string start_time { get; set; }
public string end_time { get; set; }
public string start_buffer { get; set; }
public string end_buffer { get; set; }
public string launch_rest_start { get; set; }
public string launch_rest_end { get; set; }
public string dinner_rest_start { get; set; }
public string dinner_rest_end { get; set; }
public Nullable<decimal> work_time { get; set; }
}
}
namespace Model
{
using System;
using System.Collections.Generic;
public partial class item
{
public int num { get; set; }
@@ -1355,6 +1627,24 @@ namespace Model
using System;
using System.Collections.Generic;
public partial class pre_order
{
public int num { get; set; }
public Nullable<int> f_num { get; set; }
public string order_no { get; set; }
public Nullable<int> item_count { get; set; }
public Nullable<int> total_amt { get; set; }
public Nullable<int> act_num { get; set; }
public Nullable<int> admin_num { get; set; }
public Nullable<System.DateTime> reg_time { get; set; }
public Nullable<int> receipt_num { get; set; }
}
}
namespace Model
{
using System;
using System.Collections.Generic;
public partial class pro_order
{
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
@@ -1539,6 +1829,87 @@ namespace Model
using System;
using System.Collections.Generic;
public partial class receipt_detail
{
public int num { get; set; }
public Nullable<int> receipt_num { get; set; }
public string title { get; set; }
public Nullable<int> 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; }
public string receipt_date { get; set; }
public string receipt_item { 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<int> total_amt { get; set; }
public string receipt_date { get; set; }
public Nullable<int> 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<int> 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")]
@@ -1721,6 +2092,20 @@ namespace Model
using System;
using System.Collections.Generic;
public partial class shuwen_temp
{
public int num { get; set; }
public string shuwen_type { get; set; }
public string name { get; set; }
public string contents { get; set; }
public Nullable<System.DateTime> reg_time { get; set; }
}
}
namespace Model
{
using System;
using System.Collections.Generic;
public partial class stock
{
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
@@ -1881,6 +2266,102 @@ namespace Model
using System;
using System.Collections.Generic;
public partial class TabletElement
{
public string ElementID { get; set; }
public string Name { get; set; }
public string ElementType { get; set; }
public string CUser { get; set; }
public string CDate { get; set; }
public string CTime { get; set; }
public string UUser { get; set; }
public string UDate { get; set; }
public string UTime { get; set; }
public string SampleContent { get; set; }
}
}
namespace Model
{
using System;
using System.Collections.Generic;
public partial class TabletPaperSize
{
public string PaperID { get; set; }
public string PaperName { get; set; }
public string Width { get; set; }
public string Height { get; set; }
public string CUser { get; set; }
public string CDate { get; set; }
public string CTime { get; set; }
public string UUser { get; set; }
public string UDate { get; set; }
public string UTime { get; set; }
}
}
namespace Model
{
using System;
using System.Collections.Generic;
public partial class TabletStyle
{
public string StyleID { get; set; }
public string Name { get; set; }
public string Descr { get; set; }
public string PaperSize { get; set; }
public string BackendImg { get; set; }
public string PrintSize { get; set; }
public string PrintMode { get; set; }
public string Orientation { get; set; }
public string PrintPageCount { get; set; }
public string CUser { get; set; }
public string CDate { get; set; }
public string CTime { get; set; }
public string UUser { get; set; }
public string UDate { get; set; }
public string UTime { get; set; }
public string RosterLimit { get; set; }
}
}
namespace Model
{
using System;
using System.Collections.Generic;
public partial class TabletStyleDetail
{
public string StyleID { get; set; }
public string Name { get; set; }
public string Descr { get; set; }
public string ElementID { get; set; }
public string StartX { get; set; }
public string StartY { get; set; }
public string FontSize { get; set; }
public string BreakLen { get; set; }
public string FontFamily { get; set; }
public string TwoOffset { get; set; }
public string ThreeOffset { get; set; }
public string FourOffset { get; set; }
public string IsActive { get; set; }
public string CUser { get; set; }
public string CDate { get; set; }
public string CTime { get; set; }
public string UUser { get; set; }
public string UDate { get; set; }
public string UTime { get; set; }
public string Width { get; set; }
public string Height { get; set; }
public string TextWidth { get; set; }
public string TextHeight { get; set; }
public string TextSpan { get; set; }
}
}
namespace Model
{
using System;
using System.Collections.Generic;
public partial class transfer_register
{
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
File diff suppressed because it is too large Load Diff
+24
View File
@@ -165,6 +165,30 @@
<EntityTypeShape EntityType="Model.auto_enroll" Width="1.5" PointX="5.25" PointY="37.875" />
<AssociationConnector Association="Model.FK_auto_enroll_followers" />
<AssociationConnector Association="Model.FK_pro_order_auto_enroll" />
<EntityTypeShape EntityType="Model.receipt_detail" Width="1.5" PointX="23.375" PointY="7.75" />
<EntityTypeShape EntityType="Model.receipt_master" Width="1.5" PointX="25.375" PointY="7.75" />
<EntityTypeShape EntityType="Model.receipt_style" Width="1.5" PointX="19.375" PointY="25.75" />
<EntityTypeShape EntityType="Model.receipt_style_d" Width="1.5" PointX="26.375" PointY="0.75" />
<EntityTypeShape EntityType="Model.pre_order" Width="1.5" PointX="0.75" PointY="26.75" />
<EntityTypeShape EntityType="Model.followers_tablet_template" Width="1.5" PointX="30.375" PointY="30.75" />
<EntityTypeShape EntityType="Model.hr_arrange" Width="1.5" PointX="0.75" PointY="5.75" />
<EntityTypeShape EntityType="Model.hr_company" Width="1.5" PointX="25.75" PointY="26.75" />
<EntityTypeShape EntityType="Model.hr_employee" Width="1.5" PointX="27.75" PointY="4.75" />
<EntityTypeShape EntityType="Model.hr_employee_family" Width="1.5" PointX="27.75" PointY="22.75" />
<EntityTypeShape EntityType="Model.hr_employee_ins" Width="1.5" PointX="27.75" PointY="26.75" />
<EntityTypeShape EntityType="Model.hr_employee_ins_fam" Width="1.5" PointX="28.75" PointY="0.75" />
<EntityTypeShape EntityType="Model.hr_employee_job" Width="1.5" PointX="29.75" PointY="4.75" />
<EntityTypeShape EntityType="Model.hr_employee_traffic" Width="1.5" PointX="29.75" PointY="7.75" />
<EntityTypeShape EntityType="Model.hr_ins_grade" Width="1.5" PointX="29.75" PointY="22.75" />
<EntityTypeShape EntityType="Model.hr_ins_ratio" Width="1.5" PointX="29.75" PointY="26.75" />
<EntityTypeShape EntityType="Model.hr_org" Width="1.5" PointX="30.75" PointY="0.75" />
<EntityTypeShape EntityType="Model.hr_section" Width="1.5" PointX="0.75" PointY="30.75" />
<EntityTypeShape EntityType="Model.activity_shuwen" Width="1.5" PointX="10.375" PointY="30.75" />
<EntityTypeShape EntityType="Model.shuwen_temp" Width="1.5" PointX="23.375" PointY="31.75" />
<EntityTypeShape EntityType="Model.TabletElement" Width="1.5" PointX="25.375" PointY="31.75" />
<EntityTypeShape EntityType="Model.TabletPaperSize" Width="1.5" PointX="27.375" PointY="31.75" />
<EntityTypeShape EntityType="Model.TabletStyle" Width="1.5" PointX="32.375" PointY="4.75" />
<EntityTypeShape EntityType="Model.TabletStyleDetail" Width="1.5" PointX="32.375" PointY="22.75" />
</Diagram>
</edmx:Diagrams>
</edmx:Designer>
+2 -1
View File
@@ -35,7 +35,8 @@ namespace Model.ViewModel
public string up_time1 { get; set; }
public string up_time2 { get; set; }
public string deadline { get; set; }
public string startDate_solar { get; set; }
public string endDate_solar { get; set; }
}
public class actItem
+10 -7
View File
@@ -1,15 +1,16 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data;
using System.Configuration;
using Newtonsoft.Json;
using System;
//using System.Data.OleDb;
//using System.Data.SqlClient;
using System.Collections;
using Newtonsoft.Json;
using System.Collections.Generic;
using System.ComponentModel;
using System.Configuration;
using System.Data;
using System.Globalization;
using System.Linq;
using System.Text.RegularExpressions;
using System.Web;
namespace Model.ViewModel
{
@@ -96,5 +97,7 @@ namespace Model.ViewModel
public List<family_members> mid_items { get; set; }
public List<family_members> left_items { get; set; }
}
}
+32
View File
@@ -0,0 +1,32 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace Model.ViewModel
{
/// <summary>
/// preOrder 的摘要描述
/// </summary>
public class preOrder
{
public preOrder()
{
//
// TODO: 在這裡新增建構函式邏輯
//
}
public int? num { get; set; }
public Nullable<int> f_num { get; set; }
public string order_no { get; set; }
public Nullable<int> item_count { get; set; }
public Nullable<int> total_amt { get; set; }
public Nullable<int> act_num { get; set; }
public Nullable<int> admin_num { get; set; }
public Nullable<System.DateTime> reg_time { get; set; }
public Nullable<int> receipt_num { get; set; }
public string f_name { get; set; }
public string act_name { get; set; }
}
}
+44
View File
@@ -0,0 +1,44 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace Model.ViewModel
{
/// <summary>
/// receipt 的摘要描述
/// </summary>
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<receipt_detail> 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; }
public string receipt_date { get; set; }
public string receipt_item { get; set; }
}
}
+1 -1
View File
@@ -42,7 +42,7 @@ namespace MyWeb
}
//定義欄位cookie==================end
private AdmItem JDecode(string json)
public AdmItem JDecode(string json)
{
json = encrypt.DecryptAutoKey(json); //解密
AdmItem mItem = JsonConvert.DeserializeObject<AdmItem>(json);
+87 -6
View File
@@ -143,6 +143,25 @@ public class FollowerController : ApiController
return count;
}
[HttpPost]
[Route("api/follower/GetFollowerFamilies")]
public IHttpActionResult GetFollowerFamilies([FromBody] Model.ViewModel.follower q)
{
var qry = _db.family_members.AsQueryable();
if (q.num.HasValue&&q.num>0)
{
qry = qry.Where(x=>x.follower_num==q.num);
}
return Ok(new
{
list = qry.Select(x => new
{
x.num,x.follower_num,x.fam_name,x.deceased,x.fam_gender,x.fam_title
}).ToList(),
});
}
[HttpPost]
[Route("api/follower/GetFollowerNew")]
public IHttpActionResult GetFollowerNew([FromBody] Model.ViewModel.follower q)
@@ -738,8 +757,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?? "",
}),
@@ -758,6 +777,7 @@ public class FollowerController : ApiController
// ===== 新增 =====
autoEnroll = new Model.auto_enroll()
{
num=0,
f_num = item.f_num,
start_date = item.start_date,
end_date = item.end_date,
@@ -767,7 +787,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
{
@@ -780,7 +800,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
@@ -788,8 +808,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,
};
@@ -1221,6 +1241,67 @@ public class FollowerController : ApiController
}
[HttpPost]
[Route("api/follower/GetTabletTemplateNameList")]
public IHttpActionResult GetTabletTemplateNameList([FromBody] Model.ViewModel.follower q)
{
var qry=_db.followers_tablet_template.AsQueryable();
if (q.num.HasValue&&q.num>0)
{
qry= qry.Where(x => x.follower_num == q.num);
}
return Ok(new
{
list=qry.Select(x=>new
{
x.name,x.num,x.follower_num
}).ToList()
});
}
[HttpPost]
[Route("api/follower/GetTabletTemplateList")]
public IHttpActionResult GetTabletTemplateList([FromBody] Model.ViewModel.follower q)
{
var qry = _db.followers_tablet_template.AsQueryable();
if (q.num.HasValue && q.num > 0)
{
qry = qry.Where(x => x.follower_num == q.num);
}
return Ok(new
{
list = qry.Select(x => new
{
x.name,
x.num,
x.follower_num,x.style_id,x.tablet,x.shuwen
}).ToList()
});
}
[HttpPost]
[Route("api/follower/SaveTabletTemplate")]
public IHttpActionResult SaveTabletTemplate([FromBody] Model.followers_tablet_template q)
{
if (q.num>0)
{//表示要更新
var qry = _db.followers_tablet_template.AsQueryable();
qry = qry.Where(x => x.num == q.num);
var d=qry.FirstOrDefault();
d.name = q.name;
d.style_id = q.style_id;
d.shuwen = q.shuwen;
d.tablet = q.tablet;
}
else
{
_db.followers_tablet_template.Add(q);
}
_db.SaveChanges();
return Ok();
}
}
public static class AutoOrderService
+542 -15
View File
@@ -1,20 +1,22 @@
using Model;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Http;
using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Bibliography;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Wordprocessing;
using System.IO;
using System.Net.Http;
using System.Net;
using DocumentFormat.OpenXml;
using static Model.admin_log;
using DocumentFormat.OpenXml.Bibliography;
using Model;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using PagedList;
using System;
using System.Collections.Generic;
using System.Data.Entity;
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 static Model.admin_log;
/// <summary>
/// ShuWenController 的摘要描述
@@ -262,6 +264,8 @@ public class ShuWenController : ApiController
}
public void GenerateShuWenWord_OpenXml(string json, Stream outputStream, string ActivityName ="")
{
JObject root = JObject.Parse(json);
@@ -395,4 +399,527 @@ public class ShuWenController : ApiController
}
}
[HttpPost]
[Route("api/shuwen/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("~/tempfile/");
// 確保資料夾存在
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, 0));
}
if (string.IsNullOrEmpty(preItemName))
{
preItemName = dd.subject;
}
List<string> preItemTitle = new List<string>();
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, 1134));
}
}
//ChangePage(body);
//if (list1.Count > 0)
//{
// Hashtable ht = new Hashtable();
// string preOrderNo = string.Empty;
// body.Append(RenderParagraph(44, $"{act.subject} 消災祈福名單", true));
// List<string> preItemTitle = new List<string>();
// 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<Shuwen> shuwenList = new List<Shuwen>();
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<string>();
}
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<string> leftList = new List<string>();
List<string> midList = new List<string>();
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<string>();
}
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, 0));
}
body.Append(RenderParagraph(44, "佛力超薦", true, 0));
//foreach (var wen in shu.mid_item)
//{
// body.Append(RenderParagraph(44, $" {wen}", false));
//}
//這裡要改切段落
List<string> para = new List<string>();
foreach (var p in shu.mid_item)
{
if (string.Join(" ", para).Length + p.Length > 25)
{
body.Append(RenderParagraph(44, $" {string.Join(" ", para)}", false, 1134));
para.Clear();
}
para.Add(p.ToString());
}
if (para.Count > 0)
{
body.Append(RenderParagraph(44, $" {string.Join(" ", para)}", false, 1134));
para.Clear();
}
body.Append(RenderParagraph(44, $"陽上報恩人", true,0));
body.Append(RenderParagraph(44, $" {shu.alive}", false, 1134));
preItem = shu.subject;
}
SetStraight(body);
}
}
// 讀取檔案串流
var fileStream = new FileStream(fullPath, FileMode.Open, FileAccess.Read);
// 建立原始的 HttpResponseMessage
var response = new HttpResponseMessage(HttpStatusCode.OK)
{
Content = new StreamContent(fileStream)
};
// 設定 Word 檔案的 Content-Type 與下載檔名
response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/vnd.openxmlformats-officedocument.wordprocessingml.document");
response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
{
FileName = $"{act.subject}_{mode}.docx"
};
// 使用 ResponseMessage 方法將 HttpResponseMessage 轉為 IHttpActionResult
return ResponseMessage(response);
//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,int indentSize)
{
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 = $"{ indentSize }"; // 整體左縮排量
indent.Hanging = $"{indentSize}";
//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;
}
[HttpPost]
[Route("api/shuwen/PrintItemReport")]
public IHttpActionResult PrintItemReport([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 actItems = (json.actItems == null ? new JArray() : (JArray)json.actItems);
List<int?> primitiveIds = actItems.ToObject<List<int?>>();
var qry=_db.pro_order_detail.AsQueryable();
qry = qry.Where(x=>(_db.pro_order.Where(y=>y.activity_num==num).Select(y=>y.order_no).ToList().
Contains(x.order_no))).Where(x=> primitiveIds.Contains(x.actItem_num));
var list = qry.Select(x => new
{
x.qty,x.price,
name=_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()
}).ToList();
//string filePath = "範例文件.docx";
string folderPath = HttpContext.Current.Server.MapPath("~/tempfile/");
// 確保資料夾存在
if (!Directory.Exists(folderPath))
{
Directory.CreateDirectory(folderPath);
}
// 2. 使用 GUID 命名防衝突
string fileName = Guid.NewGuid().ToString() + ".docx";
string fullPath = Path.Combine(folderPath, fileName);
using (WordprocessingDocument wordDocument = WordprocessingDocument.Create(fullPath, WordprocessingDocumentType.Document, true))
{
Body body = new Body();
var doc = GenerateDocument(wordDocument, body);
// 1. 建立表格物件
Table table = new Table();
// 2. 設定表格邊框樣式 (選擇性)
TableProperties tblProp = new TableProperties(
new TableBorders(
new TopBorder { Val = BorderValues.Single, Size = 4 },
new BottomBorder { Val = BorderValues.Single, Size = 4 },
new LeftBorder { Val = BorderValues.Single, Size = 4 },
new RightBorder { Val = BorderValues.Single, Size = 4 },
new InsideHorizontalBorder { Val = BorderValues.Single, Size = 4 }, // 修正這行
new InsideVerticalBorder { Val = BorderValues.Single, Size = 4 } // 修正這行
)
);
TableWidth tableWidthPercent = new TableWidth()
{
Width = "5000",
Type = TableWidthUnitValues.Pct
};
tblProp.AppendChild(tableWidthPercent);
table.AppendChild(tblProp);
// 3. 建立第一列 (標頭列)
TableRow row1 = new TableRow();
TableCell cell1 = new TableCell(RenderParagraph(44, "姓名", false,0));
TableCell cell2 = new TableCell(RenderParagraph(44, "姓名", false, 0));
row1.Append(cell1, cell2);
table.Append(row1);
TableRow row2 = new TableRow();
int i = 0;
var newList=list.GroupBy(x => x.name).Select(g => new
{
name=g.Key,qty=g.Sum(s=>s.qty),price=g.FirstOrDefault().price
}).ToList();
foreach (var d in newList) {
// 4. 建立第二列 (資料列)
TableCell cell3 = new TableCell(RenderParagraph(44, d.name.u_name, false, 0));
if (i == 0)
{
row2 = new TableRow();
}
row2.Append(cell3);
if (i == 1)
{
table.Append(row2);
}
if (i == 0) {
i = 1;
}
else
{
i = 0;
}
}
if (newList.Count%2!=0)
{
TableCell cell3 = new TableCell(RenderParagraph(44, "", false, 0));
row2.Append(cell3);
table.Append(row2);
}
body.Append(table);
// 將表格加入到文件主體中
//mainPart.Document.Body.Append(table);
//mainPart.Document.Save();
}
// 讀取檔案串流
var fileStream = new FileStream(fullPath, FileMode.Open, FileAccess.Read);
// 建立原始的 HttpResponseMessage
var response = new HttpResponseMessage(HttpStatusCode.OK)
{
Content = new StreamContent(fileStream)
};
// 設定 Word 檔案的 Content-Type 與下載檔名
response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/vnd.openxmlformats-officedocument.wordprocessingml.document");
response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
{
FileName = $"{mode}.docx"
};
// 使用 ResponseMessage 方法將 HttpResponseMessage 轉為 IHttpActionResult
return ResponseMessage(response);
}
}
public class Shuwen
{
public Shuwen() { }
public string order_no { get; set; }
public List<string> mid_item { get; set; }
public string alive { get; set; }
public string subject { get; set; }
}
+388 -28
View File
@@ -1,16 +1,22 @@
using DocumentFormat.OpenXml.Drawing.Spreadsheet;
using Microsoft.Ajax.Utilities;
using MINOM.COM.Utility;
using Model;
using Newtonsoft.Json;
using OfficeOpenXml;
using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Crypto.Tls;
using PagedList;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data.Entity;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web;
using System.Web.Http;
using System.Web.Services;
using static TreeView;
@@ -68,35 +74,43 @@ public class activityController : ApiController
// DELETE api/<controller>/5
public void Delete(int id)
{
var prod = _db.activities.Where(q => q.num == id).FirstOrDefault(); //刪除該筆資料
if (prod != null)
try
{
//刪除相關資料
var prod2 = _db.activity_relating.Where(q => q.activity_num == id).ToList(); //相關項目
if (prod2.Count > 0)
var prod = _db.activities.Where(q => q.num == id).FirstOrDefault(); //刪除該筆資料
if (prod != null)
{
//查詢結果全部刪除
_db.activity_relating.RemoveRange(prod2);
}
var prod3 = _db.activity_spares.Where(q => q.activity_num == id).ToList(); //備品項目
if (prod3.Count > 0)
{
_db.activity_spares.RemoveRange(prod3);
}
//訊息、庫存、收支,從資料庫設定null
_db.activities.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.Activity, (int)Model.admin_log.Status.Delete, prod.subject);
//刪除相關資料
var prod2 = _db.activity_relating.Where(q => q.activity_num == id).ToList(); //相關項目
if (prod2.Count > 0)
{
//查詢結果全部刪除
_db.activity_relating.RemoveRange(prod2);
}
var prod3 = _db.activity_spares.Where(q => q.activity_num == id).ToList(); //備品項目
if (prod3.Count > 0)
{
_db.activity_spares.RemoveRange(prod3);
}
//訊息、庫存、收支,從資料庫設定null
_db.activities.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.Activity, (int)Model.admin_log.Status.Delete, prod.subject);
}
}
}
catch (Exception ex)
{
LogUtility log=new LogUtility();
log.writeErrorPath(ex.ToString()+ex.StackTrace);
}
}
[HttpDelete]
@@ -297,6 +311,21 @@ public class activityController : ApiController
qry = qry.Where(o => o.startDate_solar <=s&&o.endDate_solar>=s);
}
if (!string.IsNullOrEmpty(q.startDate_solar)&& !string.IsNullOrEmpty(q.endDate_solar))
{
var sDate = DateTime.Parse(q.startDate_solar);
var eDate = DateTime.Parse(q.endDate_solar);
qry = qry.Where(o => o.startDate_solar <= eDate && o.endDate_solar >= sDate);
}else if (!string.IsNullOrEmpty(q.startDate_solar))
{
var s = DateTime.Parse(q.startDate_solar);
qry = qry.Where(o => o.startDate_solar <= s && o.endDate_solar >= s);
}
else if (!string.IsNullOrEmpty(q.endDate_solar))
{
var s = DateTime.Parse(q.endDate_solar);
qry = qry.Where(o => o.startDate_solar <= s && o.endDate_solar >= s);
}
//if (!string.IsNullOrEmpty(q.up_time2))
//{
// var end = DateTime.Parse(q.up_time2);
@@ -363,6 +392,8 @@ public class activityController : ApiController
}).ToList(), x.kind) : "",
startDate_solar = x.startDate_solar,
endDate_solar = x.endDate_solar,
startDate = x.startDate_solar?.ToString("yyyy-MM-dd"),
endDate = x.endDate_solar?.ToString("yyyy-MM-dd"),
startDate_lunar = x.startDate_lunar,
endDate_lunar = x.endDate_lunar,
dueDate = x.dueDate,
@@ -809,13 +840,13 @@ public class activityController : ApiController
//price = (_activity_id > 0) ? (relatingDt.Where(o => o.actItem_num == x.num).Select(o => o.price).FirstOrDefault()?? x.price) : (x.price ) , //預設金額,有活動抓活動預設,沒活動抓品項預設
price = (_activity_id > 0) ? (x.activity_relating.Select(o => o.price).FirstOrDefault() ?? x.price) : (x.price), //預設金額,有活動抓活動預設,沒活動抓品項預設
customize_data = x.customize_data ?? "",
files = x.actItem_files.Select(f => new
files =x.actItem_files!=null? x.actItem_files.Select(f => new
{
num = f.file.num,
subject = f.file.subject,
word = f.file.word,
cuz_column = f.file.customize_data ?? "", //定義欄位需求
}),
}):null,
}),
count = count
};
@@ -1051,6 +1082,256 @@ public class activityController : ApiController
}
}
[HttpPost]
[Route("api/activity/GetActRelaList2")]
public IHttpActionResult GetActRelaList2([FromBody] Model.activity q, int page, int pageSize = 100,
string sortBy = "", bool sortDesc = false)
{ //if pagesize==-1 get all data
int this_act_id = q.num;
if (this_act_id > 0)
{
//檢查
var prod = _db.activities.Where(o => o.num == this_act_id).FirstOrDefault();
if (prod != null)
{
int kind = prod.kind ?? 0; //分類
var qry = _db.activity_relating.AsQueryable();
qry = qry.Where(o => o.activity_num == this_act_id);
qry = qry.OrderBy(o => o.num);
//IEnumerable<Model.activity_relating> qry1=qry.AsEnumerable();
IEnumerable<Model.activity_relating> qry1 = null;
//var retD = qry1;
var count = qry.Count(); //pageSize = count;//一次取回??
if (count > 0)
{
int i = 1;
//已有值
if (pageSize > 0)
{
qry1 = qry.ToPagedList(page, pageSize);
}
else
{
qry1 = qry.ToList();
}
var orderDetails = _db.pro_order_detail
.Where(o => o.pro_order.activity_num == this_act_id)
.ToList();
var ret = new
{
//list = qry1.ToPagedList(page, pageSize).Select(x => new
list = qry1.Select(x => new
{
id = i++,
num = x.num,
activity_num = x.activity_num,
act_item_selected = new
{
text = x.actItem?.subject,
val = x.actItem_num,
style = x.actItem.defaultStyle
},
price = x.price ?? 0,
qty = x.qty ?? 0,
has_yang_limit = x.has_yang_limit ?? false,
has_chao_limit = x.has_yang_limit ?? false,
yang_limit_count = x.yang_limit_count ?? 0,
chao_limit_count = x.chao_limit_count ?? 0,
files = x.actItem?.actItem_files.Select(f => new
{
num = f.file.num,
subject = f.file.subject,
list = orderDetails
.Where(o => o.actItem_num == x.actItem_num)
.OrderBy(o => o.print_id)
.ThenBy(o => o.num)
.Select(o => new
{
num = o.num,
print_id = o.print_id,
order_no = o.order_no,
from_id = o.follower1?.u_name,
printed_files = o.printed_files,
isPrinted = (o.printed_files ?? "").Contains("\"" + f.file.num.ToString() + "\""),
}),
}),
}),
count = count,
};
if (ret.list == null) throw new HttpResponseException(HttpStatusCode.NotFound);
return Ok(ret);
}
else
{
//未有資料
//帶分類預設
if (kind > 0)
{
int i = 1;
var qry2 = _db.activity_kind_detail.Where(o => o.activity_kind_num == kind);
var count2 = qry2.Count(); //pageSize = count2;//一次取回??
var qry2List = (pageSize > 0) ? qry2.ToPagedList(page, pageSize).ToList() : qry2.ToList();
var ret = new
{
list = qry2List.Select(x => new
{
id = i++,
num = 0,
activity_num = this_act_id,
act_item_selected = new
{
text = x.actItem?.subject,
val = x.actItem_num,
style = x.actItem.defaultStyle
},
price = x.price ?? 0,
qty = x.qty ?? 0,
files = new
{
num = "",
subject = "",
list = new
{
num = "",
from_id = "",
printed_files = "",
isPrinted = false,
},
},
}),
count = count2
};
if (ret.list == null) throw new HttpResponseException(HttpStatusCode.NotFound);
return Ok(ret);
}
else
{
return NotFound();
}
}
}
else
{
return NotFound();
}
}
else
{
return NotFound();
}
}
[HttpPost]
[Route("api/activity/GetActRelaList1")]
public IHttpActionResult GetActRelaList1([FromBody] Model.activity q,string order_no,int actItem_num)
{ //if pagesize==-1 get all data
int this_act_id = q.num;
if (this_act_id > 0)
{
//檢查
var prod = _db.activities.Where(o => o.num == this_act_id).FirstOrDefault();
if (prod != null)
{
int kind = prod.kind ?? 0; //分類
var qry = _db.activity_relating.AsQueryable();
qry = qry.Where(o => o.activity_num == this_act_id);
qry = qry.OrderBy(o => o.num);
//IEnumerable<Model.activity_relating> qry1=qry.AsEnumerable();
IEnumerable<Model.activity_relating> qry1 = null;
//var retD = qry1;
var count = qry.Count(); //pageSize = count;//一次取回??
if (count > 0)
{
int i = 1;
qry1 = qry.ToList();
var orderDetails = _db.pro_order_detail
.Where(o => o.pro_order.activity_num == this_act_id&&o.order_no==order_no&&o.actItem_num==actItem_num)
.ToList();
var ret = new
{
//list = qry1.ToPagedList(page, pageSize).Select(x => new
list = qry1.Select(x => new
{
id = i++,
num = x.num,
activity_num = x.activity_num,
act_item_selected = new
{
text = x.actItem?.subject,
val = x.actItem_num,
style = x.actItem.defaultStyle
},
price = x.price ?? 0,
qty = x.qty ?? 0,
has_yang_limit = x.has_yang_limit ?? false,
has_chao_limit = x.has_yang_limit ?? false,
yang_limit_count = x.yang_limit_count ?? 0,
chao_limit_count = x.chao_limit_count ?? 0,
files = x.actItem?.actItem_files.Select(f => new
{
num = f.file.num,
subject = f.file.subject,
list = orderDetails
.Where(o => o.actItem_num == x.actItem_num)
.OrderBy(o => o.print_id)
.ThenBy(o => o.num)
.Select(o => new
{
num = o.num,
print_id = o.print_id,
order_no = o.order_no,
from_id = o.follower1?.u_name,
printed_files = o.printed_files,
isPrinted = (o.printed_files ?? "").Contains("\"" + f.file.num.ToString() + "\""),
}),
}),
}),
count = count,
};
if (ret.list == null) throw new HttpResponseException(HttpStatusCode.NotFound);
return Ok(ret);
}
else
{
return Ok(new {result="N",message="沒有資料"});
}
}
else
{
//return NotFound();
return Ok(new { result = "N", message = $"找不到活動 {q.num}" });
}
}
else
{
return NotFound();
}
}
[HttpPost]
[Route("api/activity/GetActRelaList")]
public IHttpActionResult GetActRelaList([FromBody] Model.activity q, int page, int pageSize = 100,
@@ -1144,8 +1425,13 @@ public class activityController : ApiController
{
int i = 1;
var qry2 = _db.activity_kind_detail.Where(o => o.activity_kind_num == kind);
qry2 = qry2.OrderBy(o => o.num);
var count2 = qry2.Count(); //pageSize = count2;//一次取回??
var qry2List = (pageSize > 0) ? qry2.ToPagedList(page, pageSize).ToList() : qry2.ToList();
IEnumerable<Model.activity_kind_detail> qry2List = null;
if (pageSize > 0)
qry2List = qry2.ToPagedList(page, pageSize);
else
qry2List=qry2.ToList();
var ret = new
{
list = qry2List.Select(x => new
@@ -1899,4 +2185,78 @@ public class activityController : ApiController
}
}
[HttpPost]
[Route("api/activity/ComparePreAndOrder")]
public IHttpActionResult ComparePreAndOrder([FromBody] Model.ViewModel.activity act)
{
//用活動撈pre_order
//檢查pro_order_detail 的數量跟金額與pre_order登記是否相符
var qry = _db.pre_order.AsQueryable();
qry = qry.Where(x => x.act_num == act.num);
var dqry = _db.pro_order_detail.AsQueryable();
dqry = dqry.Where(y => _db.pro_order.Where(z => z.activity_num == act.num).Select(z => z.order_no).ToList().Contains(y.order_no));
var list = qry.Select(x => new
{
x.num,
x.order_no,
x.reg_time,
x.receipt_num,
x.item_count,
x.f_num,
x.total_amt,
x.admin_num,
act_name=_db.activities.Where(w=>w.num==act.num).Select(w=>w.subject).FirstOrDefault(),
f_name=_db.followers.Where(z=>z.num==x.f_num).Select(z=>z.u_name).FirstOrDefault(),
order_amt=dqry.Where(y=>y.order_no==x.order_no).Sum(y=>y.qty*y.price),
order_count=dqry.Where(y=> y.order_no == x.order_no&&!y.parent_num.HasValue).ToList().Count(),
}).ToList();
string rootPath = HttpRuntime.AppDomainAppPath;
string name = $"output{DateTime.Now.ToString("yyyyMMddHHmmss")}.xlsx";
string fileName = Path.Combine(new string[] { rootPath, "rpt", name });
var file = new FileInfo($"{fileName}"); // 檔案路徑
using (var excel = new ExcelPackage())
{
LogUtility log = new LogUtility();
// 建立分頁
var ws = excel.Workbook.Worksheets.Add("MySheet");
int i = 0;
i++;
ws.Cells[i, 1].Value = "序號";
ws.Cells[i, 2].Value = "法會名稱";
ws.Cells[i, 3].Value = "信眾";
ws.Cells[i, 4].Value = "登記數量";
ws.Cells[i, 5].Value = "登記金額";
ws.Cells[i, 6].Value = "報名數量";
ws.Cells[i, 7].Value = "報名金額";
ws.Cells[i, 8].Value = "是否相符";
i++;
foreach (var data in list)
{
ws.Cells[i, 1].Value = i-1;
ws.Cells[i, 2].Value =data.act_name;
ws.Cells[i, 3].Value = data.f_name;
ws.Cells[i, 4].Value = data.item_count;
ws.Cells[i, 5].Value = data.total_amt;
ws.Cells[i, 6].Value = data.order_count;
ws.Cells[i, 7].Value = data.order_amt;
if (data.total_amt != data.order_amt || data.item_count != data.order_count)
{
ws.Cells[i, 8].Value = "否";
}
else
{
ws.Cells[i, 8].Value = "是";
}
}
excel.SaveAs(file);
}
return Ok(new { result = "Y", filename = $"rpt/{name}" });
}
}
+67
View File
@@ -3,6 +3,7 @@ using MINOM.COM.Utility;
using Model;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using PagedList;
using System;
using System.Collections.Generic;
using System.Linq;
@@ -159,6 +160,7 @@ public class designerController : ApiController
tsd.Height = item.height == null ? "" : (string)item.height;
tsd.TextWidth = item.textWidth == null ? "" : (string)item.textWidth;
tsd.TextHeight = item.textHeight == null ? "" : (string)item.textHeight;
tsd.TextSpan = item.textSpan == null ? "" : (string)item.textSpan;
tsd.TwoOffset = item.twoOffset == null ? "" : (string)item.twoOffset;
tsd.ThreeOffset = item.threeOffset == null ? "" : (string)item.threeOffset;
tsd.FourOffset = item.fourOffset == null ? "" : (string)item.fourOffset;
@@ -229,6 +231,7 @@ public class designerController : ApiController
tsd.Height = item.height == null ? "" : (string)item.height;
tsd.TextWidth = item.textWidth == null ? "" : (string)item.textWidth;
tsd.TextHeight = item.textHeight == null ? "" : (string)item.textHeight;
tsd.TextSpan = item.textSpan == null ? "" : (string)item.textSpan;
list.Add(tsd);
}
@@ -299,4 +302,68 @@ public class designerController : ApiController
}
}
[HttpPost]
[Route("api/tablet/DelPaperSize")]
public IHttpActionResult DelPaperSize([FromBody] dynamic data)
{
LogUtility log = new LogUtility();
var json = data;
log.writeLogPath((string)json.paperSize);
string paperSize = (json == null || json.paperSize == null) ? "" : (string)json.paperSize;
//先檢查有沒有用過
object[] obj = new StyleDataAccess().DelTabletPaper(paperSize);
return Ok(new { result = obj[0].ToString(), message = obj[1].ToString() });
}
[HttpPost]
[Route("api/tablet/DelTabletStyle")]
public IHttpActionResult DelTabletStyle([FromBody] dynamic data)
{
LogUtility log = new LogUtility();
var json = data;
log.writeLogPath((string)json.styleID);
string StyleID = (json == null || json.styleID == null) ? "" : (string)json.styleID;
//先檢查有沒有用過
object[] obj = new StyleDataAccess().DelTabletStyle(StyleID);
return Ok(new { result = obj[0].ToString(), message = obj[1].ToString() });
}
[HttpPost]
[Route("api/tablet/GetTabletStyleList")]
public IHttpActionResult GetTabletStyleList([FromBody] dynamic data)
{
var qry = _db.TabletStyle.AsQueryable();
//var count = qry.Count(); //pageSize = count;//一次取回??
//var qryList = (pageSize > 0) ? qry.ToPagedList(page, pageSize).ToList() : qry.ToList();
qry = qry.Where(x=>x.StyleID!= "000001");
var ret = new
{
list = qry.Select(x => new
{
x.StyleID,
x.BackendImg,
x.Name,
x.RosterLimit,
x.Descr,
x.PrintMode,
x.PrintSize,
x.PaperSize,
details = _db.TabletStyleDetail.Where(y => y.StyleID == x.StyleID).Select(y => new
{
y.StyleID,
y.ElementID, y.Name,y.Descr,y.FontFamily,y.FontSize,y.Height,y.Width,
y.TextHeight,y.TextSpan,y.StartX,y.StartY,y.IsActive
}).ToList()
}),
papers = _db.TabletPaperSize.Select(z => new { z.PaperID, z.PaperName, z.Width, z.Height }).ToList(),
elements = _db.TabletElement.Select(w => new {w.Name,w.ElementID,w.SampleContent}).ToList(),
//count = count
};
if (ret.list == null) throw new HttpResponseException(HttpStatusCode.NotFound);
return Ok(ret);
}
}
+17 -7
View File
@@ -1,4 +1,5 @@
using System;
using MINOM.COM.Utility;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
@@ -47,12 +48,21 @@ public class ezAuthorizeAttribute : AuthorizeAttribute
protected override bool IsAuthorized(HttpActionContext actionContext)
{
MyWeb.admin admin = new MyWeb.admin();
bool isLogin = admin.isLoign();
//if (admin.chkAdmIP && (admin.chkTwIP || admin.chkAdmIP_Enable)) { }
//判斷是否登入
if (!isLogin) {
return false;
try
{
MyWeb.admin admin = new MyWeb.admin();
bool isLogin = admin.isLoign();
//if (admin.chkAdmIP && (admin.chkTwIP || admin.chkAdmIP_Enable)) { }
//判斷是否登入
if (!isLogin)
{
return false;
}
}
catch (Exception ex)
{
LogUtility log = new LogUtility();
log.writeErrorPath(ex.ToString()+ex.StackTrace);
}
/*
if (actionContext == null)
+2 -1
View File
@@ -94,7 +94,8 @@ public class familyMembersController : ApiController
return Ok(familyMember);
}
// GET api/familymembers/follower/5
// GET api/familymembers/follower/5
[HttpGet]
[Route("api/familymembers/follower/{followerId}")]
public IHttpActionResult GetByFollower(int followerId)
{
+47
View File
@@ -0,0 +1,47 @@
using PagedList;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Http;
/// <summary>
/// companyController 的摘要描述
/// </summary>
[ezAuthorize]
public class companyController : BaseApiController
{
public companyController()
{
//
// TODO: 在這裡新增建構函式邏輯
//
}
[HttpPost]
[Route("api/hrs/basic/GetCompanys")]
public IHttpActionResult GetCompanys([FromBody] Model.hr_company comp, int page, int pageSize = 10,
string sortBy = "", bool sortDesc = false)
{
var qry = _db.hr_company.AsQueryable();
var count = qry.Count();
var qryList = (pageSize > 0) ? qry.ToPagedList(page, pageSize).ToList() : qry.ToList();
var ret = new
{
list = qryList.Select(x => new
{
x.company_id,
x.name,
x.parent_id,
x.super_visor,
x.contactor
}),
count = count
};
return Ok(ret);
}
}
+236 -90
View File
@@ -1,4 +1,5 @@
using DocumentFormat.OpenXml.Drawing.Charts;
using DocumentFormat.OpenXml.Spreadsheet;
using Model;
using MyWeb;
using Newtonsoft.Json;
@@ -17,6 +18,7 @@ using System.Linq;
using System.Net;
using System.Net.Http;
using System.Text;
using System.Text.RegularExpressions;
using System.Web.Helpers;
using System.Web.Http;
using static TreeView;
@@ -224,7 +226,10 @@ public class orderController : ApiController
var act=_db.activities.Where(x=>x.num==po.activity_num).FirstOrDefault();
var hasList = _db.pro_order.AsNoTracking().Where(x => x.activity_num == po.activity_num).AsNoTracking().ToList();
var actItemList=_db.activity_relating.AsNoTracking().Where(x=>x.activity_num==po.activity_num).AsNoTracking().ToList();
List<int> rp=new List<int>();
string print_id=string.Empty;
var items = _db.actItems.AsQueryable();
//要檢查是否已經報名
foreach (var item in list)
{
@@ -252,11 +257,20 @@ public class orderController : ApiController
item.up_time= DateTime.Now;
item.order_no= createOrderNumber();
item.activity_num= po.activity_num;
item.activity = act;
print_id=string.Empty;
_db.pro_order.Add(item);
_db.SaveChanges();
orders.Add(item);
foreach (var detail in item.pro_order_detail)
{
//要檢查功德項目在這次的法會有沒有
var actItem = actItemList.Where(y => y.actItem_num == detail.actItem_num).FirstOrDefault();
if (actItem==null)
{
continue;
}
//Model.pro_order_detail order_detail = new Model.pro_order_detail();
//order_detail.order_no = order.order_no;
//order_detail.actItem_num = detail.actItem_num;
@@ -276,15 +290,42 @@ public class orderController : ApiController
detail.UpdateTime= DateTime.Now;
detail.start_date= act.startDate_solar;
detail.due_date= act.endDate_solar;
_db.pro_order_detail.Add(detail);
}
detail.printed_files = "";
detail.actItem_num = actItem.num;
//if (string.IsNullOrEmpty(print_id))
//{
// print_id = GenerateSequentialId(detail, item);
//}
//else
//{
// string last_three = print_id.Substring(print_id.Length - 3);
// if (int.TryParse(last_three, out int result))
// {
// print_id = print_id.Substring(0, print_id.Length - 3) + string.Format("{0:D3}", result + 1);
// }
// else
// {
// string last_two = print_id.Substring(print_id.Length - 2);
// if (int.TryParse(last_two, out int result1))
// {
// print_id = print_id.Substring(0, print_id.Length - 2) + string.Format("{0:D2}", result1 + 1);
// }
// }
//}
var defaultStyle=items.Where(i => i.num == detail.actItem_num).Select(i=>i.defaultStyle).FirstOrDefault();
detail.style = defaultStyle==null?"":defaultStyle;
detail.print_id = GenerateSequentialId(detail, item);
_db.pro_order_detail.Add(detail);
_db.SaveChanges();
}
}
//_db.pro_order.AddRange(orders);
//_db.SaveChanges();
//_db.pro_order_detail.AddRange(order_details);
_db.SaveChanges();
return Ok(new {result="Y",message="完成",data=rp});
}
catch (Exception ex)
@@ -379,6 +420,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)
{
@@ -502,6 +544,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)
@@ -565,8 +609,10 @@ public class orderController : ApiController
subject = x.activity_num.HasValue ? x.activity.subject : "",
keyin1 = x.keyin1,
up_time = x.up_time,
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
};
@@ -599,7 +645,7 @@ public class orderController : ApiController
//qry1 = qry1.Where(o => o.order_no == order_no);
//var qry1 = prod.pro_order_detail.AsEnumerable();
var qry1 = prod.pro_order_detail.AsQueryable().include(o=>o.pro_order.activity.activity_relating);
var qry1 = prod.pro_order_detail.AsQueryable().Include(o=>o.pro_order.activity.activity_relating);
//if (!string.IsNullOrEmpty(q.subject))
@@ -723,83 +769,7 @@ public class orderController : ApiController
// c,
// //pay_kind = tdesc2[c.payment.HasValue && x.keyin1.Value > 0 ? x.keyin1.Value : 1],
//}),
var tmpActivityRelating = x.pro_order?.activity?.activity_relating?.Where(a => a.actItem_num == x.actItem_num).FirstOrDefault();
return new
{
has_yang_limit = tmpActivityRelating?.has_yang_limit ?? false,
has_chao_limit = tmpActivityRelating?.has_chao_limit ?? false,
yang_limit_count = tmpActivityRelating?.yang_limit_count ?? 0,
chao_limit_count = tmpActivityRelating?.chao_limit_count ?? 0,
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],
//}),
};
})
@@ -1038,7 +1008,7 @@ public class orderController : ApiController
var last_order = _db.pro_order.Where(x => x.order_no == last_order_no).FirstOrDefault();
if (last_order != null)
{
var activity = _db.activities.Where(z => z.num == item.activity_num).FirstOrDefault();
new_pro_order.up_time = DateTime.Now;
new_pro_order.reg_time = DateTime.Now;
new_pro_order.phone = last_order.phone;
@@ -1050,27 +1020,57 @@ public class orderController : ApiController
new_pro_order.customize_data = last_order.customize_data;
new_pro_order.send_receipt = last_order.send_receipt;
new_pro_order.receipt_title = last_order.receipt_title;
new_pro_order.activity = activity;
_db.pro_order.Add(new_pro_order);
var items = _db.actItems.AsQueryable();
string print_id = "";
//判斷如果details只有一個,要檢查是否為功德主,是的話撈出牌位,做成功德主底下的
foreach (var item1 in details)
{//如果item1 change_item_num 有值且不為0,表示要複製過來
var last_detail = _db.pro_order_detail.Where(x => x.num == item1.num).FirstOrDefault();
var detail = new pro_order_detail();
detail.order_no = new_pro_order.order_no;
detail.actItem_num = (item1.change_item_num!=null&&item1.change_item_num!=0)?item1.change_item_num: last_detail.actItem_num;
detail.f_num_tablet = last_detail.f_num_tablet;
detail.from_id = (item1.change_item_num != null && item1.change_item_num != 0) ? item.f_num: last_detail.from_id;
detail.price = (item1.change_item_num != null && item1.change_item_num != 0) ? item1.price : last_detail.price;
detail.qty = (item1.change_item_num != null && item1.change_item_num != 0) ? item1.qty : last_detail.qty;
detail.printed_files = (item1.change_item_num != null && item1.change_item_num != 0) ? item1.printed_files : last_detail.printed_files;
detail.style = (item1.change_item_num != null && item1.change_item_num != 0) ? item1.style : last_detail.style;
detail.printed_files = "";//(item1.change_item_num != null && item1.change_item_num != 0) ? item1.printed_files : last_detail.printed_files;
//要改抓回牌位的預設版型
var defaultStyle = items.Where(i => i.num == detail.actItem_num).Select(i => i.defaultStyle).FirstOrDefault();
detail.style = defaultStyle == null ? "" : defaultStyle;
//detail.style = (item1.change_item_num != null && item1.change_item_num != 0) ? item1.style : last_detail.style;
detail.UpdateTime = DateTime.Now;
detail.start_date = DateTime.Now;//這兩個要用活動的
detail.due_date = DateTime.Now;//
// //因為還沒進資料庫,所以會跑出一樣的號碼
//if (string.IsNullOrEmpty(print_id))
//{
// print_id = GenerateSequentialId(detail, new_pro_order);
//}
//else
//{
// string last_three = print_id.Substring(print_id.Length - 3);
// if (int.TryParse(last_three, out int result))
// {
// print_id = print_id.Substring(0,print_id.Length - 3)+string.Format("{0:D3}",result+1);
// }
// else
// {
// string last_two = print_id.Substring(print_id.Length - 2);
// if (int.TryParse(last_two, out int result1))
// {
// print_id = print_id.Substring(0, print_id.Length - 2) + string.Format("{0:D2}", result1 + 1);
// }
// }
//}
detail.print_id =GenerateSequentialId(detail, new_pro_order);
_db.pro_order_detail.Add(detail);
_db.SaveChanges();
}
_db.SaveChanges();
return Ok(new
{
result = "Y",
@@ -1096,6 +1096,132 @@ public class orderController : ApiController
}
}
public string GenerateSequentialId(pro_order_detail detail,pro_order order)
{
Model.ezEntities _db = new Model.ezEntities();
string r = detail.print_id;
try
{
bool chk = true;
actItem actitem = null;
int? actitem_id = null;
// 處理子項目的ID生成
if (!(detail.parent_num == null || detail.parent_num == 0))
{
// 1. 查找父項目的資料
var parent_order_item = _db.pro_order_detail.Where(
q => q.num == detail.parent_num).FirstOrDefault();
// 2. 確認父項目存在且當前項目還沒有 print_id
if (parent_order_item != null && string.IsNullOrEmpty(detail.print_id))
{
actitem_id = parent_order_item.actItem_num;
string parent_print_id = parent_order_item.print_id;
// 1. 獲取當前子項目的品項前綴
var currentActItem = _db.actItems
.Where(q => q.num == detail.actItem_num)
.FirstOrDefault();
if (currentActItem != null && !string.IsNullOrEmpty(currentActItem.print_init))
{
var itemPrefix = currentActItem.print_init.Trim();
// 2. 獲取同父項目且同品項的子項目編號
var siblings = _db.pro_order_detail
.Where(q => q.parent_num == detail.parent_num) // 找出同一個父項目的子項目
.Where(q => q.actItem_num == detail.actItem_num) // 同品項
.Where(q => q.print_id != null) // Ensure print_id is not null
.Select(q => q.print_id) // Just select the print_id
.AsEnumerable() // ✅ 合理使用:EF 無法轉換 StartsWith/Contains/Replace 到 SQL
.Where(q => q.StartsWith(parent_print_id)) // Now do string operations in memory
.Where(q => q.Contains(itemPrefix))
.Select(q => q.Trim().Replace("\t", ""))
.Select(q => q.Replace($"{parent_print_id}-{itemPrefix}", ""))
.ToList();
// 3. 將所有序號轉換為數字陣列並過濾無效值
int[] intArray = siblings
.Select(s =>
{
int result;
return int.TryParse(s, out result) ? (int?)result : null;
})
.Where(i => i.HasValue && i.Value != 0)
.Select(i => i.Value)
.ToArray();
// 4. 生成新的序號(最大序號+1,並格式化為兩位數)
int maxNum = 1 + (intArray.Any() ? intArray.Max() : 0);
string formattedNum = maxNum < 10 ? "0" + maxNum : maxNum.ToString();
// 5. 組合新的 print_id(父項目ID-品項前綴序號)
r = $"{parent_print_id}-{itemPrefix}{formattedNum}";
}
}
}
// 處理主項目的ID生成
else
{
actitem_id = detail.actItem_num;
actitem = _db.actItems
.Where(q => q.num == actitem_id).FirstOrDefault();
//var proorder = _db.pro_order.Where(q => q.order_no == detail.order_no).FirstOrDefault();
// 檢查是否需要生成新的 print_id
chk = String.IsNullOrEmpty(r) &&
//actitem != null &&
//proorder != null &&
!string.IsNullOrEmpty(actitem.print_init);
if (chk)
{
// 1. 組合活動和品項的前綴
var print_init = string.IsNullOrEmpty(order?.activity?.print_init) ? "" : order?.activity?.print_init.Trim();
var actitem_print_init = actitem.print_init.Trim();
var combinedPrintInit = print_init + actitem_print_init;
// 2. 查找相同活動和品項的已存在編號
var actitems = _db.pro_order_detail
.Where(q => q.pro_order.activity_num == order.activity_num)
.Where(q => q.actItem_num == detail.actItem_num)
.Where(q => !string.IsNullOrEmpty(q.print_id))
.Where(q => q.print_id.StartsWith(combinedPrintInit))
.Where(q => q.parent_num == 0 || q.parent_num == null)
.Select(q => q.print_id)
.ToList();
// 3. 獲取最大序號
var maxNum = actitems
.Select(item =>
{
var match = Regex.Match(item, @"\d+");
return match.Success ? (int?)int.Parse(match.Value.TrimStart('0')) : null;
})
.Where(num => num.HasValue)
.DefaultIfEmpty(0)
.Max() ?? 0;
// 4. 生成新的序號(四位數格式)
int newNum = maxNum + 1;
string formattedNum = newNum.ToString().PadLeft(4, '0');
// 5. 組合最終的 print_id
r = $"{combinedPrintInit}{formattedNum}";
}
}
}
catch (Exception ex)
{
// 異常處理:記錄錯誤並返回原始 print_id
Console.WriteLine($"Error generating sequential ID: {ex.Message} {ex.StackTrace}");
r = detail.print_id;
}
return r;
}
protected string createOrderNumber()
{
//Application.Lock();
@@ -1151,7 +1277,7 @@ public class orderController : ApiController
? 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.print_id =(!string.IsNullOrEmpty(order.print_id)? order.print_id: item.GenerateSequentialId());
order.address = item.address;
order.start_date = item.start_date.HasValue
? item.start_date : null;
@@ -1374,13 +1500,33 @@ public class orderController : ApiController
return NotFound();
}
[HttpPost]
[Route("api/order/printMultiFileLogNew")]
public IHttpActionResult printMultiFileLogNew([FromBody] List<int> list, int item, int file)
{
string _num = "\"" + file.ToString() + "\"";
var order = _db.pro_order_detail.Where(q => list.Any(a => a == q.num)).ToList();
if (order.Count > 0)
{
foreach (var row in order)
row.printed_files = (row.printed_files ?? "") + _num + ",";
_db.SaveChanges();
return Ok();
}
return NotFound();
}
[HttpPost]
[Route("api/order/printMultiFileLog")]
public IHttpActionResult printMultiFileLog([FromBody] List<int> 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();
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)
+13 -1
View File
@@ -1,17 +1,26 @@
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;
/// <summary>
@@ -21,6 +30,7 @@ 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)
@@ -98,4 +108,6 @@ public class orderdetailController:ApiController
throw new HttpResponseException(HttpStatusCode.NotFound);
}
}
}
}
+256
View File
@@ -0,0 +1,256 @@
using DocumentFormat.OpenXml.EMMA;
using MINOM.COM.Utility;
using MyWeb;
using PagedList;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Net;
using System.Text;
using System.Web;
using System.Web.Http;
using static MyWeb.admin;
// api/pre_order
//[ezAuthorize(Roles = "admin")]//群組:*
//[ezAuthorize]
public class preOrderController : ApiController
{
private Model.ezEntities _db = new Model.ezEntities();
public preOrderController()
{
//
// TODO: 在這裡新增建構函式邏輯
//
}
[HttpPost]
[Route("api/preOrder/CheckPreVsOrder")]
public IHttpActionResult CheckPreVsOrder([FromBody] Model.ViewModel.preOrder pre)
{
try
{
//用order_no去檢查pre_order登記的總數量跟pro_order_detail數量比較
var order_qry = _db.pro_order_detail.AsQueryable();
order_qry = order_qry.Where(x => x.order_no == pre.order_no);
var order = order_qry.ToList();
var pre_qry = _db.pre_order.AsQueryable();
pre_qry = pre_qry.Where(y => y.order_no == pre.order_no);
var pre_order = pre_qry.FirstOrDefault();
if (order != null && pre_order != null)
{
StringBuilder sb = new StringBuilder();
if (pre_order.total_amt != order.Sum(x => x.price * x.qty))
{
sb.Append("金額與客堂登記不符\n");
}
int order_count = order.Where(x => !x.parent_num.HasValue).ToList().Count;
if (pre_order.item_count != order_count)
{
sb.Append("功德項目數與客堂登記不符\n");
}
if (sb.Length > 0)
{
return Ok(new
{
result = "Y",
message = sb.ToString(),
});
}
else
{
return Ok(new
{
result = "Y",
message = "與客堂登記相符",
});
}
}
else
{
return Ok(new
{
result = "Y",
message = "無客堂登記資料",
});
}
}
catch (Exception ex)
{
return Ok(new
{
result = "N",
message = ex.Message,
});
}
}
[HttpPost]
[Route("api/preOrder/GetPreOrder")]
public IHttpActionResult GetPreOrder([FromBody] Model.ViewModel.preOrder pre, int page, int pageSize = 10,
string sortBy = "", bool sortDesc = false)
{
var qry = _db.pre_order.AsQueryable();
if (!string.IsNullOrEmpty(pre.f_name))
{
qry = qry.Where(x => _db.followers.Where(y => y.u_name.Contains(pre.f_name)).Select(y => y.num).ToList().Contains((int)x.f_num));
}
if (!string.IsNullOrEmpty(pre.order_no))
{
qry = qry.Where(x => x.order_no.Contains(pre.order_no));
}
if (!string.IsNullOrEmpty(pre.act_name))
{
qry = qry.Where(x => _db.activities.Where(z => z.subject.Contains(pre.act_name)).Select(z => z.num).ToList().Contains((int)x.act_num));
}
//sortBy = sortBy ?? string.Empty;
qry = qry.OrderByDescending(x => x.num);
var count = qry.Count(); //pageSize = count;//一次取回??
if (pageSize == -1)
{
pageSize = count;
}
if (pageSize == 0)
pageSize = 10;
var ret = new
{
list = qry.ToPagedList(page, pageSize).Select(x => new
{
x.num,
x.f_num,
x.admin_num,
x.order_no,
x.item_count,
x.total_amt,
x.reg_time,
x.receipt_num,
x.act_num,
admin_name=_db.admins.Where(q=>q.num==x.admin_num).Select(q=>q.u_name).FirstOrDefault(),
f_name = _db.followers.Where(z => z.num == x.f_num).Select(z => z.u_name).FirstOrDefault(),
act_name = _db.activities.Where(w => w.num == x.act_num).Select(w => w.subject).FirstOrDefault(),
receipt_amt = (_db.receipt_detail.Where(rd => _db.receipt_master.Where(rm => rm.order_no == x.order_no).Select(rm => rm.num).ToList().Contains((int)rd.receipt_num))).Select(rd => rd.amt).Sum()
}).ToList(),
count = count
};
if (ret.list == null) throw new HttpResponseException(HttpStatusCode.NotFound);
return Ok(ret);
}
[HttpPost]
[Route("api/preOrder/SavePreOrder")]
public IHttpActionResult SavePreOrder([FromBody] Model.ViewModel.preOrder pre)
{
try
{
//要檢查有無報過名
var qry1 = _db.pro_order.AsQueryable();
qry1 = qry1.Where(y => y.f_num == pre.f_num && y.activity_num == pre.act_num);
var o = qry1.FirstOrDefault();
if (o != null && !string.IsNullOrEmpty(o.order_no))
{
throw new Exception("已經報過名,請勿重複報名");
}
string scc = ConfigurationManager.AppSettings["shopCarCode"].ToString();
int admin_num =0;
if (HttpContext.Current.Session[scc + "admin"] != null)
{
MyWeb.admin admin = new MyWeb.admin();
AdmItem item = admin.JDecode(HttpContext.Current.Session[scc + "admin"].ToString());
string info = item.u_id;
if (!string.IsNullOrEmpty(info))
{
admin_num=_db.admins.Where(x => x.u_id == info).Select(x=>x.num).FirstOrDefault();
}
}
var qry = _db.followers.AsQueryable();
qry = qry.Where(x => x.num == pre.f_num);
var f = qry.FirstOrDefault();
//寫入pre_order,同時寫入pro_order
pre.order_no = new MyWeb.autoNum().createOrderNumber();
Model.pre_order preO = new Model.pre_order();
Model.pro_order proO = new Model.pro_order();
preO.order_no = pre.order_no;
preO.act_num = pre.act_num;
preO.f_num = pre.f_num;
preO.item_count = pre.item_count;
if (admin_num!=0) {
preO.admin_num = admin_num;
}
preO.total_amt = pre.total_amt;
preO.reg_time = DateTime.Now;
proO.up_time = DateTime.Now;
proO.reg_time = DateTime.Now;
proO.order_no = preO.order_no;
proO.activity_num = pre.act_num;
proO.f_num = pre.f_num;
proO.keyin1 = "A01";
proO.phone = f.phone;
proO.address = f.address ?? "";
proO.demo = "";
_db.pre_order.Add(preO);
_db.pro_order.Add(proO);
_db.SaveChanges();
return Ok(new { result = "Y", message = "新增成功" });
}
catch (Exception ex)
{
LogUtility log = new LogUtility();
log.writeErrorPath(ex.Message + ex.StackTrace);
return Ok(new { result = "N", message = $"新增失敗 {ex.Message}" });
}
}
[HttpPost]
[Route("api/preOrder/GetPreOrderByNum")]
public IHttpActionResult GetPreOrderByNum([FromBody] Model.ViewModel.preOrder pre)
{
var qry = _db.pre_order.AsQueryable();
qry = qry.Where(x => x.order_no == pre.order_no);
//sortBy = sortBy ?? string.Empty;
qry = qry.OrderByDescending(x => x.num);
var ret = new
{
data = qry.Select(x => new
{
x.num,
x.f_num,
x.admin_num,
x.order_no,
x.item_count,
x.total_amt,
x.reg_time,
x.receipt_num,
x.act_num,
f_name = _db.followers.Where(z => z.num == x.f_num).Select(z => z.u_name).FirstOrDefault(),
act_name = _db.activities.Where(w => w.num == x.act_num).Select(w => w.subject).FirstOrDefault(),
}).FirstOrDefault()
};
if (ret.data == null)
{
return Ok(new { result = "N", message = "" });
}
;
return Ok(new
{
result = "Y",
ret
});
}
}
+490
View File
@@ -0,0 +1,490 @@
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;
/// <summary>
/// receiptController 的摘要描述
/// </summary>
[ezAuthorize]
public class receiptController: ApiController
{
private Model.ezEntities _db = new Model.ezEntities();
public receiptController()
{
//
// TODO: 在這裡新增建構函式邏輯
//
}
public string generend_receiptNo(string source,string receipt_date)
{
string start ="1"+ (source=="1"?"A":"B");
string no = start + receipt_date; //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 + receipt_date.Replace("-","")).Length);
return start + receipt_date.Replace("-", "") + string.Format("{0:D4}", Int32.Parse(receipt_no)+1);
}
else
{
return start + receipt_date.Replace("-", "") + "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<Model.receipt_detail> list = new List<Model.receipt_detail>();
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,d.receipt_date.Replace("-",""));
}
else
{
string new_no = pre_no.Remove(0, 10);
dd.receipt_no = "1"+(master.source=="1"?"A":"B" )+d.receipt_date.Replace("-","") + 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_date= d.receipt_date;
dd.receipt_item = d.receipt_item;
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.receipt_item=d.receipt_item;
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<Model.receipt_detail> list = new List<Model.receipt_detail>();
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, d.receipt_date.Replace("-", ""));
}
else
{
string new_no = pre_no.Remove(0,10);
dd.receipt_no ="1"+ (m.source=="1"?"A":"B") + d.receipt_date.Replace("-", "") + 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_date=d.receipt_date;
dd.receipt_item = d.receipt_item;
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 sample = $"~/rpt/sample/receipt_sample{string.Format("{0:D2}",data.style_num)}.docx";
string templatePath = HttpContext.Current.Server.MapPath(sample);
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<Table>().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<DocumentFormat.OpenXml.Drawing.Wordprocessing.DocProperties>())
{
docPr.Id = (uint)docPrIdCounter++;
// 順便變更 Name,避免如 "直線接點 2" 的名稱重複
docPr.Name = $"直線接點_{docPrIdCounter}";
}
// --- 步驟 B:修復 VML 的 id 與 o:spid ---
foreach (var line in newTable.Descendants<Line>())
{
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<BookmarkStart>().ToList();
var bookmarksEnds = newTable.Descendants<BookmarkEnd>().ToList();
foreach (var bm in bookmarksStarts) bm.Remove();
foreach (var bm in bookmarksEnds) bm.Remove();
foreach (var p in newTable.Descendants<Paragraph>())
{
p.RsidParagraphAddition = null;
p.RsidParagraphDeletion = null;
p.RsidParagraphProperties = null;
p.RsidRunAdditionDefault = null;
}
var textElements = newTable.Descendants<Text>().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.details[i].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 ?? "");
}
if (textNode.Text.Contains("$ReceiptItem"))
{
textNode.Text = textNode.Text.Replace("$ReceiptItem", data.details[i].receipt_item ?? "");
}
}
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}");
}
}
}
+957
View File
@@ -0,0 +1,957 @@
using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Drawing.Charts;
using DocumentFormat.OpenXml.Office2010.PowerPoint;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Wordprocessing;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using PagedList;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.Http;
/// <summary>
/// shuwensController 的摘要描述
/// </summary
[ezAuthorize]
public class shuwensController : BaseApiController
{
public shuwensController()
{
//
// TODO: 在這裡新增建構函式邏輯
//
}
[HttpPost]
[Route("api/shuwens/GetActShuwen")]
public IHttpActionResult GetActShuwen([FromBody] Model.activity_shuwen temp)
{
var qry = _db.activity_shuwen.AsQueryable();
if (temp.act_num > 0)
{
qry = qry.Where(x => x.act_num == temp.act_num);
}
if (!string.IsNullOrEmpty(temp.shuwen_type))
{
qry = qry.Where(x => x.shuwen_type == temp.shuwen_type);
}
return Ok(new
{
result = "Y",
data = qry.Select(x => new
{
x.act_num,
x.shuwen_type,
x.shuwen_num,
x.contents,
x.paper_size,
x.direction
}).FirstOrDefault()
});
}
[HttpPost]
[Route("api/shuwens/GetShuwenTemplate")]
public IHttpActionResult GetShuwenTemplate([FromBody] Model.shuwen_temp temp)
{
var qry = _db.shuwen_temp.AsQueryable();
if (temp.num > 0)
{
qry = qry.Where(x => x.num == temp.num);
}
return Ok(new { result = "Y", data = qry.Select(x => new
{
x.num, x.shuwen_type, x.name, x.contents
}).FirstOrDefault() });
}
[HttpPost]
[Route("api/shuwens/ListShuwenTemplate")]
public IHttpActionResult ListShuwenTemplate([FromBody] Model.shuwen_temp temp)
{
var qry = _db.shuwen_temp.AsQueryable();
if (temp != null && !string.IsNullOrEmpty(temp.shuwen_type))
{
qry = qry.Where(x => x.shuwen_type == temp.shuwen_type);
}
return Ok(new
{
result = "Y",
data = qry.Select(x => new
{
x.num,
x.shuwen_type,
x.name,
x.contents
}).ToList()
});
}
[HttpPost]
[Route("api/shuwens/SaveActShuwen")]
public IHttpActionResult SaveActShuwen([FromBody] Model.activity_shuwen s)
{
var qry = _db.activity_shuwen.AsQueryable();
qry = qry.Where(x => x.act_num == s.act_num && x.shuwen_type == s.shuwen_type);
var d = qry.FirstOrDefault();
if (d != null)
{
d.contents = s.contents;
d.direction = s.direction;
d.paper_size = s.paper_size;
d.reg_time = DateTime.Now;
}
else
{
s.reg_time = DateTime.Now;
_db.activity_shuwen.Add(s);
}
_db.SaveChanges();
return Ok();
}
[HttpPost]
[Route("api/shuwens/SaveAsShuwenTemplate")]
public IHttpActionResult SaveAsShuwenTemplate([FromBody] Model.shuwen_temp t)
{
if (t.num > 0)
{//跑更新
var qry = _db.shuwen_temp.AsQueryable();
qry = qry.Where(x => x.num == t.num);
var d = qry.FirstOrDefault();
if (d != null)
{
d.contents = t.contents;
d.name = t.name;
d.reg_time = DateTime.Now;
}
}
else
{
t.reg_time = DateTime.Now;
_db.shuwen_temp.Add(t);
}
_db.SaveChanges();
return Ok();
}
[HttpPost]
[Route("api/shuwen/RenderShuWenByGong")]
public IHttpActionResult RenderShuWenByGong([FromBody] dynamic data)
{
var jsonData = data;
var mode=(string)jsonData.mode;
mode = "A";
StringBuilder sb= new StringBuilder();
sb.Append("with gong as (select* from pro_order_detail ");
sb.Append("where order_no in (select order_no from pro_order ");
sb.Append("where activity_num in (72, 73)) ");
sb.Append("and(actItem_num in ");
sb.Append("(select item_num from act_bom a ");
sb.Append("left join actItem b on a.item_num = b.num ");
sb.Append("where a.package_num is null)) ");
sb.Append(") ");
sb.Append("select * from pro_order_detail a ");
sb.Append("where (num in (select num from gong) ");
sb.Append("or parent_num in (select num from gong)) ");
var list=_db.Database.SqlQuery<Model.pro_order_detail>(sb.ToString()).ToList();
var head_list=list.Where(x=>x.parent_num==null).ToList();//消災,要參數化
var qry = _db.TabletStyleDetail.AsQueryable();
var styles = qry.ToList();
var ret = new object() { };
using (WordprocessingDocument wordDocument = WordprocessingDocument.Create("d://HelloWorld.docx", WordprocessingDocumentType.Document))
{
// Add a main document part
MainDocumentPart mainPart = wordDocument.AddMainDocumentPart();
mainPart.Document = new Document();
Body body = mainPart.Document.AppendChild(new Body());
List<string> result = new List<string>();
var nowContent = new List<string>();
foreach (var item in head_list)
{
//消災牌位
var detail_list = list.Where(x => x.parent_num == item.num && x.print_id.Contains("X")).ToList();
foreach (var d in detail_list)
{
//因為有分身 福德正神 福德夫人這種,所以還要考慮位置關係,才知道 mid right mid_items mid_left的順序
var style=styles.Where(y=>y.StyleID==d.style).ToList();
var leftTitle = style.Where(z => z.ElementID == "lefttitle").FirstOrDefault();
var midTitle = style.Where(z=>z.ElementID=="title1").FirstOrDefault();
var rightTitle = style.Where(z => z.ElementID == "righttitle").FirstOrDefault();
var json = JsonConvert.DeserializeObject<dynamic>(d.f_num_tablet);
// 1. 先安全地把 mid_items 轉成 JArray
Newtonsoft.Json.Linq.JArray midItemsArray = json.mid_items as Newtonsoft.Json.Linq.JArray;
Newtonsoft.Json.Linq.JArray leftItemsArray = json.mid_left as Newtonsoft.Json.Linq.JArray;
Newtonsoft.Json.Linq.JArray rightItemsArray = json.mid_right as Newtonsoft.Json.Linq.JArray;
//如果字數超過6個字要強制換行
//前面先截掉,後面也重新開始
var orderType = "A";//右中左
if (midTitle.StartX.CompareTo(rightTitle.StartX) > 0 && rightTitle.StartX.CompareTo(leftTitle.StartX) > 0)
{
orderType = "B";//中右左
if (midItemsArray != null && midItemsArray.Count > 0)
{
string s = string.Empty;
int i = 0;
foreach (var m in midItemsArray)
{
if (m["fam_name"]?.ToString().Length >= 6)
{
s = s + ";" + m["fam_name"] + ";";
}
else
{
s = s + " " + m["fam_name"];
}
i++;
}
nowContent.Add(s);
}
if (rightItemsArray != null&&rightItemsArray.Count>0)
nowContent.Add(string.Join(" ", rightItemsArray.Select(token => token["fam_name"]?.ToString().Replace("\r", "").Replace("\n", ""))));
if (leftItemsArray != null&&leftItemsArray.Count>0)
nowContent.Add(string.Join(" ", leftItemsArray.Select(token => token["fam_name"]?.ToString().Replace("\r", "").Replace("\n", "")))+";");
}
else if (leftTitle.StartX.CompareTo(midTitle.StartX) > 0 && midTitle.StartX.CompareTo(rightTitle.StartX) > 0)
{
orderType = "C";//左中右
if (leftItemsArray != null && leftItemsArray.Count > 0)
nowContent.Add(string.Join(" ", leftItemsArray.Select(token => token["fam_name"]?.ToString().Replace("\r", "").Replace("\n", ""))));
if (midItemsArray != null && midItemsArray.Count > 0)
{
string s = string.Empty;
int i = 0;
foreach (var m in midItemsArray)
{
if (m["fam_name"]?.ToString().Length >= 6)
{
s = s +";" + m["fam_name"] +";";
}
else
{
s = s + " " + m["fam_name"];
}
i++;
}
nowContent.Add(s);
}
if (rightItemsArray != null && rightItemsArray.Count > 0)
nowContent.Add(string.Join(" ", rightItemsArray.Select(token => token["fam_name"]?.ToString().Replace("\r", "").Replace("\n", ""))) + ";");
}
else if (rightTitle.StartX.CompareTo(midTitle.StartX) > 0 && leftTitle.StartX.CompareTo(midTitle.StartX) > 0)
{
orderType = "D";//右左中
if (rightItemsArray != null && rightItemsArray.Count > 0)
nowContent.Add(string.Join(" ", rightItemsArray.Select(token => token["fam_name"]?.ToString().Replace("\r", "").Replace("\n", ""))));
if (leftItemsArray != null && leftItemsArray.Count > 0)
nowContent.Add(string.Join(" ", leftItemsArray.Select(token => token["fam_name"]?.ToString().Replace("\r", "").Replace("\n", ""))));
if (midItemsArray != null && midItemsArray.Count > 0)
{
string s = string.Empty;
int i = 0;
foreach (var m in midItemsArray)
{
if (m["fam_name"]?.ToString().Length >= 6)
{
s = s + ";" + m["fam_name"] + ";";
}
else
{
s = s + " " + m["fam_name"];
}
i++;
}
nowContent.Add(s);
}
}
else if (midTitle.StartX.CompareTo(leftTitle.StartX) > 0 && leftTitle.StartX.CompareTo(rightTitle.StartX) > 0)
{
orderType = "E";//中左右
if (midItemsArray != null && midItemsArray.Count > 0)
{
string s = string.Empty;
int i = 0;
foreach (var m in midItemsArray)
{
if (m["fam_name"]?.ToString().Length >= 6)
{
s = s + ";" + m["fam_name"] + ";";
}
else
{
s = s + " " + m["fam_name"];
}
i++;
}
nowContent.Add(s);
}
if (leftItemsArray != null && leftItemsArray.Count > 0)
nowContent.Add(string.Join(" ", leftItemsArray.Select(token => token["fam_name"]?.ToString().Replace("\r", "").Replace("\n", ""))));
if (rightItemsArray != null && rightItemsArray.Count > 0)
nowContent.Add(string.Join(" ", rightItemsArray.Select(token => token["fam_name"]?.ToString().Replace("\r", "").Replace("\n", ""))) + ";");
}
else if (leftTitle.StartX.CompareTo(rightTitle.StartX) > 0 && rightTitle.StartX.CompareTo(midTitle.StartX) > 0)
{
orderType = "F";//左右中
if (leftItemsArray != null && leftItemsArray.Count > 0)
nowContent.Add(string.Join(" ", leftItemsArray.Select(token => token["fam_name"]?.ToString().Replace("\r", "").Replace("\n", ""))));
if (rightItemsArray != null && rightItemsArray.Count > 0)
nowContent.Add(string.Join(" ", rightItemsArray.Select(token => token["fam_name"]?.ToString().Replace("\r", "").Replace("\n", ""))));
if (midItemsArray != null && midItemsArray.Count > 0)
{
string s = string.Empty;
int i = 0;
foreach (var m in midItemsArray)
{
if (m["fam_name"]?.ToString().Length >= 6)
{
s = s + ";" + m["fam_name"] + ";";
}
else
{
s = s + " " + m["fam_name"];
}
i++;
}
nowContent.Add(s);
}
}
else
{//右中左
if (rightItemsArray != null && rightItemsArray.Count > 0)
nowContent.Add(string.Join(" ", rightItemsArray.Select(token => token["fam_name"]?.ToString().Replace("\r", "").Replace("\n", ""))));
if (midItemsArray != null && midItemsArray.Count > 0)
{
string s = string.Empty;
int i = 0;
foreach (var m in midItemsArray)
{
if (m["fam_name"]?.ToString().Length >= 6)
{
s = s + ";" + m["fam_name"] + ";";
}
else
{
s = s + " " + m["fam_name"];
}
i++;
}
nowContent.Add(s);
}
if (leftItemsArray != null && leftItemsArray.Count > 0)
nowContent.Add(string.Join(" ", leftItemsArray.Select(token => token["fam_name"]?.ToString().Replace("\r", "").Replace("\n", ""))) + ";");
}
//if (nowContent.Count > 6)
//{
// Paragraph para1 = new Paragraph();
// //Run run1 = para1.AppendChild(new Run());
// Run run1 = new Run();
// RunProperties runProps1 = new RunProperties(
// //new Bold(),
// //new Italic(),
// new FontSize() { Val = "36" }, // 12 pt
// //new Color() { Val = "FF0000" }, // Red Text
// new RunFonts()
// {
// Ascii = "DFKai-SB", // 英數字型使用標楷體
// EastAsia = "DFKai-SB" // 中文字型使用標楷體
// }
// );
// // 建立段落屬性
// ParagraphProperties pPr1 = new ParagraphProperties();
// pPr1.Append(new TextDirection() { Val = TextDirectionValues.TopToBottomRightToLeft });
// // 建立縮排物件
// // 設定左縮排為 0,首行縮排 480 dxa (約 2 中文字寬)
// Indentation ind = new Indentation() { Left = "720", LeftChars = 300 };
// // 將縮排加入段落屬性
// pPr1.Append(ind);
// para1.Append(pPr1);
// run1.Append(runProps1);
// string[] splits = string.Join("", nowContent).Split(';');
// int j = 0;
// foreach (var txt in splits)
// {
// run1.Append(new Text($"{string.Join(" ", txt)}"));
// if (j != splits.Length - 1)
// {
// run1.Append(new Break());
// }
// j++;
// }
// para1.Append(run1);
// body.AppendChild(para1);
// nowContent.Clear();
//}
//if(string.Join(" ",nowContent).Length > 6)
//{
// if (result.Count > 0)
// {
// Paragraph para = body.AppendChild(new Paragraph());
// Run run = para.AppendChild(new Run());
// RunProperties runProps = new RunProperties(
// //new Bold(),
// //new Italic(),
// new FontSize() { Val = "36" }, // 12 pt
// //new Color() { Val = "FF0000" }, // Red Text
// new RunFonts()
// {
// Ascii = "DFKai-SB", // 英數字型使用標楷體
// EastAsia = "DFKai-SB" // 中文字型使用標楷體
// }
// );
// run.Append(runProps);
// run.AppendChild(new Text($"{string.Join(" ", result)}"));
// }
// result = new List<string>();
// Paragraph para1 = body.AppendChild(new Paragraph());
// Run run1 = para1.AppendChild(new Run());
// RunProperties runProps1 = new RunProperties(
// //new Bold(),
// //new Italic(),
// new FontSize() { Val = "36" }, // 12 pt
// //new Color() { Val = "FF0000" }, // Red Text
// new RunFonts()
// {
// Ascii = "DFKai-SB", // 英數字型使用標楷體
// EastAsia = "DFKai-SB" // 中文字型使用標楷體
// }
// );
// run1.Append(runProps1);
// run1.AppendChild(new Text($"{string.Join(" ", nowContent)}"));
//}
//else
//{
// result.AddRange(nowContent);
//}
}
//if (result.Count > 5)
//{
// Paragraph para = body.AppendChild(new Paragraph());
// Run run = para.AppendChild(new Run());
// RunProperties runProps = new RunProperties(
// //new Bold(),
// //new Italic(),
// new FontSize() { Val = "36" }, // 12 pt
// //new Color() { Val = "FF0000" }, // Red Text
// new RunFonts()
// {
// Ascii = "DFKai-SB", // 英數字型使用標楷體
// EastAsia = "DFKai-SB" // 中文字型使用標楷體
// }
// );
// run.Append(runProps);
// run.AppendChild(new Text($"{string.Join(" ", result)}"));
// result = new List<string>();
//}
if (nowContent.Count > 10000)
{
Paragraph para1 = new Paragraph();
//Run run1 = para1.AppendChild(new Run());
Run run1 = new Run();
RunProperties runProps1 = new RunProperties(
//new Bold(),
//new Italic(),
new FontSize() { Val = "36" }, // 12 pt
//new Color() { Val = "FF0000" }, // Red Text
new RunFonts()
{
Ascii = "DFKai-SB", // 英數字型使用標楷體
EastAsia = "DFKai-SB" // 中文字型使用標楷體
}
);
// 建立段落屬性
ParagraphProperties pPr1 = new ParagraphProperties();
pPr1.Append(new TextDirection() { Val = TextDirectionValues.TopToBottomRightToLeft });
// 建立縮排物件
// 設定左縮排為 0,首行縮排 480 dxa (約 2 中文字寬)
Indentation ind = new Indentation() { Left = "720", LeftChars = 300 };
// 將縮排加入段落屬性
pPr1.Append(ind);
para1.Append(pPr1);
run1.Append(runProps1);
string[] splits = string.Join("", nowContent).Split(';');
int j = 0;
foreach (var txt in splits)
{
if (!string.IsNullOrWhiteSpace(txt))
{
if (txt.Length>=6&&j!=0)
{
run1.Append(new Break());
}
run1.Append(new Text($"{string.Join(" ", txt)}"));
//if (j != splits.Length - 1)
//{
// run1.Append(new Break());
//}
}
j++;
}
para1.Append(run1);
body.AppendChild(para1);
nowContent.Clear();
}
}
if (nowContent.Count > 0)
{
Paragraph para1 = new Paragraph();
//Run run1 = para1.AppendChild(new Run());
Run run1 = new Run();
RunProperties runProps1 = new RunProperties(
//new Bold(),
//new Italic(),
new FontSize() { Val = "36" }, // 12 pt
//new Color() { Val = "FF0000" }, // Red Text
new RunFonts()
{
Ascii = "DFKai-SB", // 英數字型使用標楷體
EastAsia = "DFKai-SB" // 中文字型使用標楷體
}
);
// 建立段落屬性
ParagraphProperties pPr1 = new ParagraphProperties();
pPr1.Append(new TextDirection() { Val = TextDirectionValues.TopToBottomRightToLeft });
// 建立縮排物件
// 設定左縮排為 0,首行縮排 480 dxa (約 2 中文字寬)
Indentation ind = new Indentation() { Left = "720", LeftChars = 300 };
// 將縮排加入段落屬性
pPr1.Append(ind);
para1.Append(pPr1);
run1.Append(runProps1);
string[] splits = string.Join("", nowContent).Split(';');
int j = 0;
foreach (var txt in splits)
{
if (!string.IsNullOrWhiteSpace(txt))
{
if (txt.Length >= 6&&j!=0)
{
run1.Append(new Break());
}
run1.Append(new Text($"{string.Join(" ", txt)}"));
//if (j != splits.Length - 1)
//{
// run1.Append(new Break());
//}
}
j++;
}
para1.Append(run1);
body.AppendChild(para1);
nowContent.Clear();
}
//if (result.Count > 0)
//{
// Paragraph para = body.AppendChild(new Paragraph());
// Run run = para.AppendChild(new Run());
// RunProperties runProps = new RunProperties(
// //new Bold(),
// //new Italic(),
// new FontSize() { Val = "36" }, // 12 pt
// //new Color() { Val = "FF0000" }, // Red Text
// new RunFonts()
// {
// Ascii = "DFKai-SB", // 英數字型使用標楷體
// EastAsia = "DFKai-SB" // 中文字型使用標楷體
// }
// );
// run.Append(runProps);
// run.AppendChild(new Text($"{string.Join(" ", result)}"));
// result = new List<string>();
//}
Paragraph pageBreakParagraph = new Paragraph(
new Run(
new Break() { Type = BreakValues.Page }
)
);
// 將這個段落附加到文件的 Body 中
body.Append(pageBreakParagraph);
//先強制換頁
//在處理超薦牌位
result = new List<string>();
foreach (var item in head_list)
{
//S要參數化
var detail_list = list.Where(x => x.parent_num == item.num && x.print_id.Contains("S")).ToList();
//分兩種,一種每一張呈現,一種同樣陽上的拚在一起
foreach(var d in detail_list)
{
var style = styles.Where(y => y.StyleID == d.style).ToList();
var addr= style.Where(z => z.ElementID == "address").FirstOrDefault();
var leftTitle = style.Where(z => z.ElementID == "lefttitle").FirstOrDefault();
var midTitle = style.Where(z => z.ElementID == "title1").FirstOrDefault();
var rightTitle = style.Where(z => z.ElementID == "righttitle").FirstOrDefault();
var alive = style.Where(z => z.ElementID == "alive").FirstOrDefault();
var json = JsonConvert.DeserializeObject<dynamic>(d.f_num_tablet);
// 1. 先安全地把 mid_items 轉成 JArray
Newtonsoft.Json.Linq.JArray midItemsArray = json.mid_items as Newtonsoft.Json.Linq.JArray;
Newtonsoft.Json.Linq.JArray leftItemsArray = json.mid_left as Newtonsoft.Json.Linq.JArray;
Newtonsoft.Json.Linq.JArray rightItemsArray = json.mid_right as Newtonsoft.Json.Linq.JArray;
string addrItemsArray =json.addr_items==null?"":(string )json.addr_items;
Newtonsoft.Json.Linq.JArray aliveItemsArray = json.left_items as Newtonsoft.Json.Linq.JArray;
if (mode=="A")
{//一張一張
//地址 正名 陽上
nowContent = new List<string>();
var orderType = "A";//右中左
if (midTitle.StartX.CompareTo(rightTitle.StartX) > 0 && rightTitle.StartX.CompareTo(leftTitle.StartX) > 0)
{
orderType = "B";//中右左
if (midItemsArray != null && midItemsArray.Count > 0)
{
string s = string.Empty;
int i = 0;
foreach (var m in midItemsArray)
{
if (m["fam_name"]?.ToString().Length > 6)
{
s = s + m["fam_name"] + (i != midItemsArray.Count - 1 ? ";" : "");
}
else
{
s = s + " " + m["fam_name"];
}
i++;
}
nowContent.Add(s);
}
if (rightItemsArray != null && rightItemsArray.Count > 0)
nowContent.Add(string.Join(" ", rightItemsArray.Select(token => token["fam_name"]?.ToString().Replace("\r", "").Replace("\n", ""))));
if (leftItemsArray != null && leftItemsArray.Count > 0)
nowContent.Add(string.Join(" ", leftItemsArray.Select(token => token["fam_name"]?.ToString().Replace("\r", "").Replace("\n", ""))));
}
else if (leftTitle.StartX.CompareTo(midTitle.StartX) > 0 && midTitle.StartX.CompareTo(rightTitle.StartX) > 0)
{
orderType = "C";//左中右
if (leftItemsArray != null && leftItemsArray.Count > 0)
nowContent.Add(string.Join(" ", leftItemsArray.Select(token => token["fam_name"]?.ToString().Replace("\r", "").Replace("\n", ""))));
if (midItemsArray != null && midItemsArray.Count > 0)
{
string s = string.Empty;
int i = 0;
foreach (var m in midItemsArray)
{
if (m["fam_name"]?.ToString().Length > 6)
{
s = s + m["fam_name"] + (i != midItemsArray.Count - 1 ? ";" : "");
}
else
{
s = s + " " + m["fam_name"];
}
i++;
}
nowContent.Add(s);
}
if (rightItemsArray != null && rightItemsArray.Count > 0)
nowContent.Add(string.Join(" ", rightItemsArray.Select(token => token["fam_name"]?.ToString().Replace("\r", "").Replace("\n", ""))));
}
else if (rightTitle.StartX.CompareTo(midTitle.StartX) > 0 && leftTitle.StartX.CompareTo(midTitle.StartX) > 0)
{
orderType = "D";//右左中
if (rightItemsArray != null && rightItemsArray.Count > 0)
nowContent.Add(string.Join(" ", rightItemsArray.Select(token => token["fam_name"]?.ToString().Replace("\r", "").Replace("\n", ""))));
if (leftItemsArray != null && leftItemsArray.Count > 0)
nowContent.Add(string.Join(" ", leftItemsArray.Select(token => token["fam_name"]?.ToString().Replace("\r", "").Replace("\n", ""))));
if (midItemsArray != null && midItemsArray.Count > 0)
{
string s = string.Empty;
int i = 0;
foreach (var m in midItemsArray)
{
if (m["fam_name"]?.ToString().Length > 6)
{
s = s + m["fam_name"] + (i != midItemsArray.Count - 1 ? ";" : "");
}
else
{
s = s + " " + m["fam_name"];
}
i++;
}
nowContent.Add(s);
}
}
else if (midTitle.StartX.CompareTo(leftTitle.StartX) > 0 && leftTitle.StartX.CompareTo(rightTitle.StartX) > 0)
{
orderType = "E";//中左右
if (midItemsArray != null && midItemsArray.Count > 0)
{
string s = string.Empty;
int i = 0;
foreach (var m in midItemsArray)
{
if (m["fam_name"]?.ToString().Length > 6)
{
s = s + m["fam_name"] + (i != midItemsArray.Count - 1 ? ";" : "");
}
else
{
s = s + " " + m["fam_name"];
}
i++;
}
nowContent.Add(s);
}
if (leftItemsArray != null && leftItemsArray.Count > 0)
nowContent.Add(string.Join(" ", leftItemsArray.Select(token => token["fam_name"]?.ToString().Replace("\r", "").Replace("\n", ""))));
if (rightItemsArray != null && rightItemsArray.Count > 0)
nowContent.Add(string.Join(" ", rightItemsArray.Select(token => token["fam_name"]?.ToString().Replace("\r", "").Replace("\n", ""))));
}
else if (leftTitle.StartX.CompareTo(rightTitle.StartX) > 0 && rightTitle.StartX.CompareTo(midTitle.StartX) > 0)
{
orderType = "F";//左右中
if (leftItemsArray != null && leftItemsArray.Count > 0)
nowContent.Add(string.Join(" ", leftItemsArray.Select(token => token["fam_name"]?.ToString().Replace("\r", "").Replace("\n", ""))));
if (rightItemsArray != null && rightItemsArray.Count > 0)
nowContent.Add(string.Join(" ", rightItemsArray.Select(token => token["fam_name"]?.ToString().Replace("\r", "").Replace("\n", ""))));
if (midItemsArray != null && midItemsArray.Count > 0)
{
string s = string.Empty;
int i = 0;
foreach (var m in midItemsArray)
{
if (m["fam_name"]?.ToString().Length > 6)
{
s = s + m["fam_name"] + (i != midItemsArray.Count - 1 ? ";" : "");
}
else
{
s = s + " " + m["fam_name"];
}
i++;
}
nowContent.Add(s);
}
}
else
{//右中左
if (rightItemsArray != null && rightItemsArray.Count > 0)
nowContent.Add(string.Join(" ", rightItemsArray.Select(token => token["fam_name"]?.ToString().Replace("\r", "").Replace("\n", ""))));
if (midItemsArray != null && midItemsArray.Count > 0)
{
string s = string.Empty;
int i = 0;
foreach(var m in midItemsArray)
{
if (m["fam_name"]?.ToString().Length > 6)
{
s=s+m["fam_name"]+ (i != midItemsArray.Count-1 ? ";" : "");
}else
{
s = s + " " + m["fam_name"];
}
i++;
}
nowContent.Add(s);
}
//nowContent.Add(string.Join(" ", midItemsArray.Select(token => token["fam_name"]?.ToString().Replace("\r", "").Replace("\n", ""))));
if (leftItemsArray != null && leftItemsArray.Count > 0)
nowContent.Add(string.Join(" ", leftItemsArray.Select(token => token["fam_name"]?.ToString().Replace("\r", "").Replace("\n", ""))));
}
Paragraph para3 = body.AppendChild(new Paragraph());
Run run3 = para3.AppendChild(new Run());
RunProperties runProps3 = new RunProperties(
new Bold(),
//new Italic(),
new FontSize() { Val = "36" }, // 12 pt
//new Color() { Val = "FF0000" }, // Red Text
new RunFonts()
{
Ascii = "DFKai-SB", // 英數字型使用標楷體
EastAsia = "DFKai-SB" // 中文字型使用標楷體
}
);
run3.Append(runProps3);
run3.AppendChild(new Text($"佛力超薦"));
if (!string.IsNullOrWhiteSpace(addrItemsArray))
{
Paragraph para = body.AppendChild(new Paragraph());
Run run = para.AppendChild(new Run());
RunProperties runProps = new RunProperties(
//new Bold(),
//new Italic(),
new FontSize() { Val = "36" }, // 12 pt
//new Color() { Val = "FF0000" }, // Red Text
new RunFonts()
{
Ascii = "DFKai-SB", // 英數字型使用標楷體
EastAsia = "DFKai-SB" // 中文字型使用標楷體
}
);
run.Append(runProps);
run.AppendChild(new Text($"地址 {string.Join(" ", addrItemsArray?.ToString())}"));
}
Paragraph para1 = new Paragraph();
//Run run1 = para1.AppendChild(new Run());
Run run1 = new Run();
RunProperties runProps1 = new RunProperties(
//new Bold(),
//new Italic(),
new FontSize() { Val = "36" }, // 12 pt
//new Color() { Val = "FF0000" }, // Red Text
new RunFonts()
{
Ascii = "DFKai-SB", // 英數字型使用標楷體
EastAsia = "DFKai-SB" // 中文字型使用標楷體
}
);
// 建立段落屬性
ParagraphProperties pPr1 = new ParagraphProperties();
pPr1.Append(new TextDirection() { Val = TextDirectionValues.TopToBottomRightToLeft });
// 建立縮排物件
// 設定左縮排為 0,首行縮排 480 dxa (約 2 中文字寬)
Indentation ind = new Indentation() { Left = "720", LeftChars = 300 };
// 將縮排加入段落屬性
pPr1.Append(ind);
para1.Append(pPr1);
run1.Append(runProps1);
string[] splits = string.Join("", nowContent).Split(';');
int j = 0;
foreach (var txt in splits)
{
run1.Append(new Text($"{string.Join(" ", txt)}"));
if (j != splits.Length - 1)
{
run1.Append(new Break());
}
j++;
}
para1.Append(run1);
body.AppendChild(para1);
Paragraph para2 = body.AppendChild(new Paragraph());
ParagraphProperties pPr2 = new ParagraphProperties();
// 2. 建立段落邊框物件
ParagraphBorders pBdr = new ParagraphBorders();
// 在直書中,BottomBorder 會變成「段落左側的垂直分隔線」
BottomBorder bottomBorder = new BottomBorder()
{
Val = BorderValues.Dashed, // 單實線
Size = 12, // 線條粗細 (1/8 點,12 代表 1.5 點)
Space = 4, // 線條與文字的間距
Color = "000000" // 黑色
};
pBdr.Append(bottomBorder);
pPr2.Append(pBdr);
para2.Append(pPr2);
Run run2 = para2.AppendChild(new Run());
RunProperties runProps2 = new RunProperties(
new Bold(),
//new Italic(),
new FontSize() { Val = "36" }, // 12 pt
//new Color() { Val = "FF0000" }, // Red Text
new RunFonts()
{
Ascii = "DFKai-SB", // 英數字型使用標楷體
EastAsia = "DFKai-SB" // 中文字型使用標楷體
}
);
run2.Append(runProps2);
run2.AppendChild(new Text($"陽上報恩人 "));
Run run4 = para2.AppendChild(new Run());
RunProperties runProps4 = new RunProperties(
//new Bold(),
//new Italic(),
new FontSize() { Val = "36" }, // 12 pt
//new Color() { Val = "FF0000" }, // Red Text
new RunFonts()
{
Ascii = "DFKai-SB", // 英數字型使用標楷體
EastAsia = "DFKai-SB" // 中文字型使用標楷體
}
);
run4.Append(runProps4);
run4.AppendChild(new Text($" {string.Join(" ", aliveItemsArray.Select(token => token["fam_name"]?.ToString()))}"));
run4.Append(new Break());
}
else
{//同樣陽上合併
}
}
}
// 3. 設定【整頁直書】的重要步驟:
// 檢查 Body 最後有沒有 SectionProperties,沒有就新增一個
DocumentFormat.OpenXml.Wordprocessing.SectionProperties sectionProps = body.Elements<DocumentFormat.OpenXml.Wordprocessing.SectionProperties>().LastOrDefault();
if (sectionProps == null)
{
sectionProps = new DocumentFormat.OpenXml.Wordprocessing.SectionProperties();
body.AppendChild(sectionProps); // 必須是 Body 的最後一個子元素
}
// 2. 建立頁面大小物件 (PageSize)
PageSize pageSize = new PageSize();
// 3. 設定為 A4 橫向 (把原本縱向的寬高數值對調,並指定 Orient)
pageSize.Width = 16838; // A4 橫向寬度 (Twips)
pageSize.Height = 11906; // A4 橫向高度 (Twips)
pageSize.Orient = PageOrientationValues.Landscape;
// 4. 將設定附加到章節屬性中
sectionProps.AppendChild(pageSize);
// 4. 將直書屬性套用到章節中 (TopToBottomRightToLeft)
sectionProps.AppendChild(new TextDirection() { Val = TextDirectionValues.TopToBottomRightToLeft });
}
return Ok(new
{
list= head_list
});
}
}
+44 -12
View File
@@ -7,6 +7,7 @@ using NPOI.SS.UserModel;
using OfficeOpenXml;
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Data.SqlClient;
using System.IO;
using System.Linq;
@@ -146,10 +147,18 @@ public class statisticsController: ApiController
return Ok(data);
}
//public static IEnumerable<T> Between<T>(
// this IEnumerable<T> source,
// T low,
// T high) where T : IComparable<T>
//{
// // 運用 IComparable 比較大小,泛型可支援 int, double, DateTime 等
// return source.Where(item => item.CompareTo(low) >= 0 && item.CompareTo(high) <= 0);
//}
[HttpPost]
[Route("api/statistics/GetStatistic")]
public IHttpActionResult GetStatistic(string statistic_mode)
public IHttpActionResult GetStatistic(string statistic_mode,string s_date,string e_date)
{
try
{
@@ -166,11 +175,20 @@ public class statisticsController: ApiController
LogUtility log = new LogUtility();
// 建立分頁
var ws = excel.Workbook.Worksheets.Add("MySheet");
//var query = _db.activities.AsQueryable();
//if (!string.IsNullOrEmpty(s_date))
//{
// query= query.Where(a => a.startDate_solar.Value.ToString("yyyyMMdd").CompareTo(s_date) >= 0);
//}
//if (!string.IsNullOrEmpty(e_date))
//{
// query = query.Where(a => a.endDate_solar.Value.ToString("yyyyMMdd").CompareTo(e_date) <= 0);
//}
var data = (from a in _db.activities
join b in _db.pro_order on a.num equals b.activity_num
join c in _db.pro_order_detail on b.order_no equals c.order_no
//join d in _db.activity_relating on a.num equals d.activity_num
join f in _db.actItems on c.actItem_num equals f.num
join f in _db.actItems on c.actItem_num equals f.num
select new
{
a.num,
@@ -181,9 +199,19 @@ public class statisticsController: ApiController
c.actItem_num,
item_subject = f.subject,
c.qty,
c.price
c.price,
a.startDate_solar,
a.endDate_solar
}).ToList();
if (!string.IsNullOrEmpty(s_date))
{
data = data.Where(a => a.startDate_solar.Value.ToString("yyyyMMdd").CompareTo(s_date) >= 0).ToList();
}
if (!string.IsNullOrEmpty(e_date))
{
data = data.Where(a => a.endDate_solar.Value.ToString("yyyyMMdd").CompareTo(e_date) <= 0).ToList();
}
int i = 0;
i++;
if (statistic_mode == "01")
@@ -198,7 +226,7 @@ public class statisticsController: ApiController
ws.Cells[i, 8].Value = "應收";
ws.Cells[i, 9].Value = "應付";
i++;
var list = data.GroupBy(x => new { x.num, x.subject, x.actItem_num, x.item_subject }).Select(y =>
var list = data.ToList().GroupBy(x => new { x.num, x.subject, x.actItem_num, x.item_subject }).Select(y =>
new
{
y.Key.num,
@@ -213,8 +241,8 @@ public class statisticsController: ApiController
ws.Cells[i, 1].Value = i - 1;
ws.Cells[i, 2].Value = item.subject;
ws.Cells[i, 3].Value = item.item_subject;
ws.Cells[i, 4].Value = item.qty.Value;
ws.Cells[i, 5].Value = item.price.Value;
ws.Cells[i, 4].Value =item.qty==null?0: item.qty.Value;
ws.Cells[i, 5].Value =item.price==null?0: item.price.Value;
ws.Cells[i, 6].Formula = $"=D{i}*E{i}";
var draftList = (from a in drafts
@@ -240,13 +268,17 @@ public class statisticsController: ApiController
}
else
{
var jj = JsonConvert.DeserializeObject<JObject>(items.draft);
foreach (var j in jj["pro_order_detail_items"])
if (jj["pro_order_detail_items"]!=null)
{
if (item.subject == j["activity_name"].ToString() &&
item.item_subject == j["actitem_name"].ToString())
foreach (var j in jj["pro_order_detail_items"])
{
payed = payed + decimal.Parse(j["reconcile"].ToString());
if (item.subject == j["activity_name"].ToString() &&
item.item_subject == j["actitem_name"].ToString())
{
payed = payed + decimal.Parse(j["reconcile"].ToString());
}
}
}
}
@@ -301,7 +333,7 @@ public class statisticsController: ApiController
decimal payed = 0;
foreach (var d in dd)
{
payed = payed + (decimal)d.check_amount;// -(decimal)d.remain_amount;
payed = payed +d.check_amount==null?0: (decimal)d.check_amount;// -(decimal)d.remain_amount;
}
ws.Cells[i, 5].Value = payed;
ws.Cells[i, 6].Formula = $"=if(D{i}>E{i},D{i}-E{i},0)";
@@ -357,7 +389,7 @@ public class statisticsController: ApiController
}
catch (Exception ex)
{
return Ok(new { result = "N", message = ex.Message});
return Ok(new { result = "N", message = ex.Message+ex.StackTrace});
//return BadRequest($"{ex.Message}{ex.StackTrace}");
}
}
+52
View File
@@ -0,0 +1,52 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace MyWeb
{
/// <summary>
/// autoNum 的摘要描述
/// </summary>
public class autoNum
{
private Model.ezEntities _db = new Model.ezEntities();
public autoNum()
{
//
// TODO: 在這裡新增建構函式邏輯
//
}
public string createOrderNumber()
{
//Application.Lock();
string order_no = "AA" + DateTime.Now.ToString("yyMMdd");
var qry = _db.companies.AsQueryable();
//var prod = qry.Where(q => q.last_order_no.Contains(order_no)).FirstOrDefault();
var prod = qry.Where(q => q.num == 1).FirstOrDefault();
if (prod != null)
{
if (!string.IsNullOrEmpty(prod.last_order_no) && prod.last_order_no.Contains(order_no))
{
int tmp = Convert.ToInt32(prod.last_order_no.Replace(order_no, "")) + 1;
order_no = order_no + tmp.ToString("0000");
}
else
{
order_no = order_no + "0001";
}
prod.last_order_no = order_no;
_db.SaveChanges();
}
else
order_no = "";
//Application.UnLock();
return order_no;
}
}
}
Binary file not shown.
@@ -29,7 +29,7 @@
</asp:ContentPlaceHolder>
</head>
<body id="PageBody" class="" runat="server">
<form id="form1" runat="server">
<form id="form1" runat="server" onkeydown="if(event.keyCode==13&& event.target.tagName != 'TEXTAREA') return false;">
<%-- ScriptManager 必需移除 --%>
<asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager>
<div id="app">
@@ -8,6 +8,7 @@ window.addEventListener('DOMContentLoaded', event => {
// document.body.classList.toggle('sb-sidenav-toggled');
//}
sidebarToggle.addEventListener('click', event => {
console.log("QQ");
event.preventDefault();
document.body.classList.toggle('sb-sidenav-toggled');
localStorage.setItem('sb|sidebar-toggle', document.body.classList.contains('sb-sidenav-toggled'));
+1 -1
View File
@@ -1,7 +1,7 @@
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="nav.ascx.cs" Inherits="admin_Templates_TBS5ADM001_uc_nav" %>
<nav class="sb-topnav navbar navbar-expand navbar-dark bg-dark ps-1 ps-md-2">
<!-- Sidebar Toggle-->
<button class="btn btn-link btn-sm order-0 me-0 bg-white bg-opacity-10 rounded-circle" id="sidebarToggle" href="#!">
<button type="button" class="btn btn-link btn-sm order-0 me-0 bg-white bg-opacity-10 rounded-circle" id="sidebarToggle" href="#!">
<i class="mdi mdi-menu"></i>
</button>
<!-- Navbar Brand-->
+2 -2
View File
@@ -114,7 +114,7 @@
.catch(error => console.log(error))
},
editItem(item) {
console.log("edit", item);
},
deleteItem(item) {
if (confirm('是否確定刪除此筆資料?')) {
@@ -123,7 +123,7 @@
axios
.delete(HTTP_HOST + 'api/accounting/' + item.num)
.then(response => {
console.log("del", item);
this.data_table.list.splice(index, 1);
this.data_table.count = this.data_table.list.length
})
+7 -8
View File
@@ -29,7 +29,7 @@
],
selected: {},
select(t) {
console.log("select search1", t);
}
}, search2: {
id: 'search2',
@@ -45,7 +45,7 @@
],
selected: {},
select(t) {
console.log("select search2", t);
}
},
search3: {
@@ -64,7 +64,7 @@
],
selected: {},
select(t) {
console.log("select search3", t);
}
},
@@ -86,8 +86,7 @@
],
selected: {},
select(t) {
console.log("select search4", t);
}
},
@@ -151,7 +150,7 @@
options: {
handler() {
this.search_get()
console.log("watch2", this.search_dialog, this.search_dialog.page);
},
deep: true,
},
@@ -188,7 +187,7 @@
search[t.id] = t.value;
});
console.log("search_get", api_url, search, params, this.options);
this.search_dialog.loading = true
axios.post(api_url, search, { params: params })
.then(response => {
@@ -375,7 +374,7 @@
axios
.delete(HTTP_HOST + 'api/accounting/DeleteFilesItem/' + item.num)
.then(response => {
console.log("del", item);
this.desserts.splice(index, 1)
this.desserts_count = this.desserts_count - 1;
})
+41 -6
View File
@@ -81,7 +81,38 @@
deep: true,
},
},
methods: {
methods: {
compare(item) {
// console.log("compare:", item);
axios
.post(HTTP_HOST + 'api/activity/ComparePreAndOrder', {num:item.num})
.then(response => {
if (response.data.result == "N") {
this.message_dialog.message = response.data.message;
this.message_dialog.show = true;
} else if (response.data.result == "Y") {
const link = document.createElement('a');
link.href = HTTP_HOST + "/" + response.data.filename;
link.target = "_blank";
// 5. Specify the filename for the download
//link.setAttribute('download', 'my-downloaded-file.pdf');
// 6. Append link to the body, click it, and remove it immediately
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
// 7. Free up memory by revoking the object URL
//window.URL.revokeObjectURL(blobUrl);
//window.open(HTTP_HOST +"/" +response.data.filename, "_blank");
}
this.isdisabled = false;
this.isloading = false;
})
.catch(error => console.log(error))
},
getDefault(clearpage = false) {
const { sortBy, sortDesc, page, itemsPerPage } = this.options
const params = {
@@ -99,7 +130,7 @@
.catch(error => console.log(error))
},
editItem(item) {
console.log("edit", item);
},
copyItem(item) {
@@ -126,13 +157,13 @@
},
deleteItem(item) {
if (confirm('是否確定刪除此筆資料?')) {
if (confirm('是否確定刪除此筆資料,如有報名資料將一併刪除?')) {
const index = this.data_table.list.indexOf(item)
if (index != -1) {
axios
.delete(HTTP_HOST + 'api/activity/' + item.num)
.then(response => {
console.log("del", item);
this.data_table.list.splice(index, 1);
this.data_table.count = this.data_table.list.length
})
@@ -206,9 +237,13 @@
{{ item.dueDate|timeString('YYYY/MM/DD') }}
</template>
<template #item.slot_btn="{ item }">
<a :href="'reg.aspx?num='+item.num" class="btn btn-outline-secondary btn-sm"><i class="mdi mdi-pencil-box-outline"></i>修改</a>
<a :href="'reg.aspx?num='+item.num" class="btn btn-outline-secondary btn-sm"><i class="mdi mdi-pencil-box-outline"></i>編輯</a>
<a @click="copyItem(item)" class="btn btn-outline-secondary btn-sm"><i class="mdi mdi-pencil-box-outline"></i>複製</a>
<a @click="deleteItem(item)" class="btn btn-outline-secondary btn-sm"><i class="mdi mdi-trash-can"></i>刪除</a>
<a @click="deleteItem(item)" class="btn btn-outline-secondary btn-sm"><i class="mdi mdi-trash-can"></i>刪除</a>
<% if (IsPreOrder == "true")
{ %>
<a @click="compare(item)" class="btn btn-outline-secondary btn-sm"><i class="mdi mdi-trash-can"></i>比對</a>
<% } %>
</template>
</v-data-table>
<v-container>
+2 -1
View File
@@ -14,12 +14,13 @@ using static TreeView;
public partial class admin_activity_index : MyWeb.config
{
private Model.ezEntities _db = new Model.ezEntities();
public string IsPreOrder = "false";
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
IsPreOrder = ConfigurationManager.AppSettings["IsPreOrder"];
BuildKind();
}
+4 -4
View File
@@ -107,7 +107,7 @@
select(t, data) {
data.search.kind = t.num;
data.btn_search()
console.log("select search1", t);
}
}
},
@@ -215,7 +215,7 @@
},
editItem(item) {
console.log("edit", item);
},
deleteItem(item) {
@@ -306,7 +306,7 @@
search[t.id] = t.value;
});
console.log("search_get", api_url, search, params, this.options);
this.search_dialog.loading = true
axios.post(api_url, search, { params: params })
.then(response => {
@@ -454,7 +454,7 @@
<template #item.slot_btn="{ item }" >
<a v-if="!isEditing" :href="'item_reg.aspx?num='+item.num" class="btn btn-outline-secondary btn-sm"><i class="mdi mdi-pencil-box-outline"></i>修改</a>
<a v-if="!isEditing" :href="'item_reg.aspx?num='+item.num" class="btn btn-outline-secondary btn-sm"><i class="mdi mdi-pencil-box-outline"></i>編輯</a>
<a v-if="!isEditing" @click="deleteItem(item)" class="btn btn-outline-secondary btn-sm"><i class="mdi mdi-trash-can"></i>刪除</a>
</template>
</v-data-table>
+1 -1
View File
@@ -12,7 +12,7 @@
<i class="mdi mdi-sort"></i> 排序選項</asp:LinkButton>
</nav>
<nav class="mb-1">
<asp:Button ID="edit" runat="server" Text="修改" Visible="false" OnClick="edit_Click" CssClass="btn btn-primary" />
<asp:Button ID="edit" runat="server" Text="儲存" Visible="false" OnClick="edit_Click" CssClass="btn btn-primary" />
<asp:Button ID="add" runat="server" Text="新增" Visible="false" OnClick="add_Click" CssClass="btn btn-primary" />
<asp:PlaceHolder ID="down_table" runat="server">
+32 -12
View File
@@ -46,7 +46,7 @@
],
selected: {},
select(item, t) {
console.log("select search1", t);
}
},
search2: {
@@ -63,7 +63,7 @@
],
selected: {},
select(item, t) {
console.log("select search2", t);
item.files_num_selected.text = t.subject //=====?
item.files_num_selected.val = t.num //=====?
@@ -85,7 +85,7 @@
],
selected: {},
select(item, t) {
console.log("select search3", item, t);
//debugger;
item.actItem.subject = t.subject
item.actItem.num = t.num
@@ -371,7 +371,7 @@
axios
.delete(HTTP_HOST + 'api/activity/DeleteFilesItem/' + item.num)
.then(response => {
console.log("del", item);
this.desserts.splice(index, 1)
this.desserts_count = this.desserts_count - 1;
})
@@ -496,6 +496,14 @@
}, 300)
},
bom_addNew() {
if (this.prod_bom_num === undefined || this.prod_bom_num ===0) {
this.snackbar.text = "請先點選設定或儲存子項目,點選前先確定此為群組功德項目"
this.snackbar.show = true;
return
} else {
console.log(this.prod_bom_num === undefined || this.prod_bom_num === 0);
}
this.spliceNullData();
//addObj.id = this.desserts.length + 1;
@@ -583,8 +591,8 @@
</div>
<div class="">
<asp:Button ID="add" runat="server" Text="送出" OnClick="add_Click" CssClass="btn btn-primary" />
<asp:Button ID="edit" runat="server" Text="修改" Visible="false" OnClick="edit_Click" CssClass="btn btn-primary" />
<asp:Button ID="goback" runat="server" Text="回列表" Visible="false" CausesValidation="false" OnClick="goback_Click" CssClass="btn btn-outline-secondary" />
<asp:Button ID="edit" runat="server" Text="儲存" Visible="false" OnClick="edit_Click" CssClass="btn btn-primary" />
<asp:Button ID="goback" runat="server" Text="返回" Visible="false" CausesValidation="false" OnClick="goback_Click" CssClass="btn btn-outline-secondary" />
</div>
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server">
@@ -598,12 +606,15 @@
<button class="nav-link active" id="sec2-tab1" data-bs-toggle="tab" data-bs-target="#sec2-page1"
type="button" role="tab" aria-controls="home" aria-selected="true">
基本資料</button>
<button class="nav-link" id="sec2-tab2" data-bs-toggle="tab" data-bs-target="#sec2-page2"
<%--<button class="nav-link" id="sec2-tab2" data-bs-toggle="tab" data-bs-target="#sec2-page2"
type="button" role="tab" aria-controls="profile" aria-selected="false">
相關文件</button>
相關文件</button>--%>
<button class="nav-link" id="sec2-tab3" data-bs-toggle="tab" data-bs-target="#sec2-page3"
type="button" role="tab" aria-controls="bom" aria-selected="false">
功德項目</button>
<%--<button class="nav-link" id="sec2-tab4" data-bs-toggle="tab" data-bs-target="#sec2-page4"
type="button" role="tab" aria-controls="bom" aria-selected="false">
總疏文維護</button>--%>
</div>
</nav>
</div>
@@ -645,9 +656,11 @@
<asp:TextBox ID="subject" MaxLength="100" runat="server" CssClass="form-control" placeholder="請輸入品項名稱"></asp:TextBox>
<asp:RequiredFieldValidator ID="RequiredFieldValidator1" ControlToValidate="subject" runat="server" ErrorMessage="必填!" Display="Dynamic" SetFocusOnError="true"></asp:RequiredFieldValidator>
</div>
<label class="col-sm-2 col-form-label">牌位編號開頭</label>
<label class="col-sm-2 col-form-label">牌位編號開頭 *</label>
<div class="col-sm-4">
<asp:TextBox ID="print_init" MaxLength="20" runat="server" CssClass="form-control" placeholder="請輸入牌位編號開頭"></asp:TextBox>
<asp:RequiredFieldValidator ID="RequiredFieldValidator5" ControlToValidate="print_init" runat="server" ErrorMessage="必填!" Display="Dynamic" SetFocusOnError="true"></asp:RequiredFieldValidator>
</div>
</div>
<div class="row mb-1 label-sm-right">
@@ -724,7 +737,7 @@
</div>
</div>
</div>
<div class="tab-pane fade giftItems label-sm-right" id="sec2-page2" role="tabpanel" aria-labelledby="sec2-tab2">
<%-- <div class="tab-pane fade giftItems label-sm-right" id="sec2-page2" role="tabpanel" aria-labelledby="sec2-tab2">
<v-card class="mx-auto mt-10" outlined v-if="this_id!=''">
<v-data-table
:headers="headersDetail"
@@ -732,7 +745,7 @@
:footer-props="footersDetail"
:search="searchDetail"
:options.sync="optionsDetail" class="elevation-1" fixed-header height="350px"
<%-- :server-items-length="desserts_count"--%>
>
<v-divider inset></v-divider>
<template v-slot:top>
@@ -785,7 +798,8 @@
<div class="mx-auto" v-else >
<p class="lead">請先儲存基本資料後再新增相關文件</p>
</div>
</div>
</div>--%>
<%-- :server-items-length="desserts_count"--%>
<div class="tab-pane fade giftItems label-sm-right" id="sec2-page3" role="tabpanel" aria-labelledby="sec2-tab3">
<asp:Panel ID="bom_panel" runat="server">
<div class="row mb-1">
@@ -795,8 +809,10 @@
</div>
<div class="col-md-4">
<asp:button class="btn btn-primary" id="setBom" runat="server"
OnClientClick="if (!confirm('警告!!是否確定此為群組功德項目??')) return false;"
Text="設定子項目" OnClick="setBom_Click" Visible="true"></asp:button>
<asp:button class="btn btn-primary" id="saveBom" runat="server"
OnClientClick="if (!confirm('警告!!是否確定此為群組功德項目??')) return false;"
Text="儲存子項目" OnClick="saveBom_Click" Visible="true"></asp:button>
</div>
<div class="packageNum">
@@ -871,6 +887,10 @@
</div>
</asp:Panel>
</div>
<%-- <div class="tab-pane fade giftItems label-sm-right" id="sec2-page4" role="tabpanel" aria-labelledby="sec2-tab4">
總疏文維護
</div>--%>
</div>
</div>
</div>
+10 -1
View File
@@ -92,7 +92,7 @@ public partial class admin_activity_item_reg : MyWeb.config
//bom_qty.Enabled = prodBom != null;//有對應的act_bom項目..
bom_qty.Text = (prodBom?.qty??0).ToString();
bom_memo.Text = (prodBom?.memo ?? "");
packageNum.Value=(prodBom?.num.ToString());
packageNum.Value=(prodBom?.num.ToString());
prod_bom_num = prodBom?.num ?? 0;
}
else
@@ -162,10 +162,17 @@ public partial class admin_activity_item_reg : MyWeb.config
actItem.sort_order = maxSort + 1;
_db.actItems.Add(actItem);
_db.SaveChanges();
int _id = actItem.num;
if( _id > 0)
{
Model.actItem_files file=new Model.actItem_files();
file.actItem_num= _id;
file.files_num = 211;
file.reg_time=DateTime.Now;
_db.actItem_files.Add(file);
_db.SaveChanges();
Model.admin_log admin_log = new Model.admin_log();
admin_log.writeLog(admin.info.u_id, (int)Model.admin_log.Systems.Item, (int)Model.admin_log.Status.Insert, subject.Text);
@@ -265,6 +272,7 @@ public partial class admin_activity_item_reg : MyWeb.config
actBom.memo = bom_memo.Text;
_db.act_bom.Add(actBom);
_db.SaveChanges();
prod_bom_num=actBom.num;
Response.Redirect("item_reg.aspx?num=" + _num);
}
}
@@ -283,6 +291,7 @@ public partial class admin_activity_item_reg : MyWeb.config
prodBom.qty = Val(bom_qty.Text);
prodBom.memo = bom_memo.Text;
_db.SaveChanges();
prod_bom_num=prodBom.num;
//Response.Redirect("item_reg.aspx?num=" + _num);
}
}
+7 -9
View File
@@ -10,7 +10,7 @@
el: '#app',
vuetify: new Vuetify(vuetify_options),
data() {
console.log("yes",<%= _this_id %>);
return {
this_id: '<%= _this_id %>',
options: {},
@@ -33,9 +33,7 @@
],
selected: {},
select(item,t) {
console.log("select search1", t);
item.actItem_num.text = t.subject
item.actItem_num.val = t.num
item.price = t.price
@@ -114,7 +112,7 @@
handler() {
//console.log("watch1", this.search_dialog, this.search_dialog.page);
this.search_get()
console.log("watch2", this.search_dialog, this.search_dialog.page);
},
deep: true,
},
@@ -154,7 +152,7 @@
if (this.search_dialog.current.id == 'search1') {
search['categorys'] = "1,2,4";//報名,掛單,贊助
}
console.log("search_get", api_url, search, params, this.options);
this.search_dialog.loading = true
axios.post(api_url, search, { params: params })
.then(response => {
@@ -233,7 +231,7 @@
axios
.delete(HTTP_HOST + 'api/activity/DeleteActKindDetail/' + item.num)
.then(response => {
console.log("del", item);
this.desserts.splice(index, 1)
this.desserts_count = this.desserts_count - 1;
})
@@ -321,7 +319,7 @@
}
}, customSearch(value, item) {
console.log(value, item)
},
searchData(event) {
this.desserts = this.desserts.filter(item => item.actItem_num.text.toLowerCase().includes(event));
@@ -345,7 +343,7 @@
<i class="mdi mdi-sort"></i> 排序選項</asp:LinkButton>
</nav>
<nav class="mb-1">
<asp:Button ID="edit" runat="server" Text="修改" Visible="false" OnClick="edit_Click" CssClass="btn btn-primary" />
<asp:Button ID="edit" runat="server" Text="儲存" Visible="false" OnClick="edit_Click" CssClass="btn btn-primary" />
<asp:Button ID="add" runat="server" Text="新增" Visible="false" OnClick="add_Click" CssClass="btn btn-primary" />
<asp:PlaceHolder ID="down_table" runat="server">
+136 -207
View File
@@ -2,6 +2,7 @@
<%@ Register Src="~/admin/_uc/alert.ascx" TagPrefix="uc1" TagName="alert" %>
<asp:Content ID="Content1" ContentPlaceHolderID="page_header" runat="Server">
<script src="/js/httpVueLoader.js"></script>
</asp:Content>
<asp:Content ID="Content4" ContentPlaceHolderID="footer_script" runat="Server">
<script>
@@ -24,11 +25,11 @@
if (data.isOk) {
$(btn).parents('.row.label-sm-right').find('.lunar').text(data.cDate);
} else {
console.log(data.msg);
}
});
}
console.log(_date);
}
let VueApp = new Vue({
@@ -57,13 +58,13 @@
{ id: 'kind', title: '分類名稱' },
],
selected: {},
select(item,t) {
console.log("select search1", t);
select(item, t) {
//帶入預設日期
axios
.get(HTTP_HOST + 'api/activity/GetKindDate/' + t.num )
.get(HTTP_HOST + 'api/activity/GetKindDate/' + t.num)
.then(response => {
console.log(response.data.startDate_solar);
$('#<%= startDate_solar.ClientID%>').val(response.data.startDate_solar);
$('#<%= endDate_solar.ClientID%>').val(response.data.endDate_solar);
$('#<%= startDate_lunar.ClientID%>').val(response.data.startDate_lunar);
@@ -90,12 +91,10 @@
{ id: 'kindTxt', title: '項目分類' },
],
selected: {},
select(item,t) {
console.log("select search2", t);
select(item, t) {
item.act_item_selected.text = t.subject
item.act_item_selected.val = t.num
item.price = t.price
item.act_item_selected.val = t.num
item.price = t.price
item.qty = t.qty
}
},
@@ -114,12 +113,11 @@
{ id: 'kindTxt', title: '項目分類' },
],
selected: {},
select(item,t) {
console.log("select search3", t);
select(item, t) {
item.act_item_selected.text = t.subject
item.act_item_selected.val = t.num
}
},
search4: {
@@ -136,12 +134,11 @@
],
selected: {},
select(item, t) {
console.log("select search4", t);
}
},
},
show: false,
current: {},
list: [],
@@ -165,8 +162,8 @@
{ text: '* 品項名稱', value: 'act_item_selected.text', sortable: false },
{ text: '預設金額', value: 'price', sortable: false },
{ text: '數量', value: 'qty', sortable: false },
{ text: '陽上/祈福人數限制', value: 'limit_yang', sortable: false },
{ text: '超渡人數限制', value: 'limit_chao', sortable: false },
{ text: '陽上/祈福人數限制', value: 'limit_yang', sortable: false },
{ text: '超渡人數限制', value: 'limit_chao', sortable: false },
{ text: '', value: 'actions', sortable: false, width: "200px" },
],
footersDetail: {
@@ -180,12 +177,12 @@
'items-per-page-options': []
},
desserts: [],
desserts_count :0,
editedIndex: -1,
desserts_count: 0,
editedIndex: -1,
editedItem: {
id: 0,
num: 0,
activity_num: 0,
activity_num: 0,
act_item_selected: {
text: '',
val: 0
@@ -196,114 +193,106 @@
has_yang_limit: false,
has_chao_limit: false,
yang_limit_count: 0,
chao_limit_count: 0,
defaultItem: {
id: 0,
num: 0,
activity_num: 0,
act_item_selected: {
text: '',
val: 0
chao_limit_count: 0,
},
defaultItem: {
id: 0,
num: 0,
activity_num: 0,
act_item_selected: {
text: '',
val: 0
},
price: 0,
qty: 0,
files: [],
has_yang_limit: false,
has_chao_limit: false,
yang_limit_count: 0,
chao_limit_count: 0,
},
price: 0,
qty: 0,
files: [],
has_yang_limit: false,
has_chao_limit: false,
yang_limit_count: 0,
chao_limit_count: 0,
},
//列印
data_table: {
selected: [],
editFilesItem: [],
headersFilesList: [
{ text: '訂單編號', value: 'order_no', sortable: false },
{ text: '牌位編號', value: 'print_id', sortable: false },
//{ text: '信眾姓名', value: 'from_id', sortable: false },
{ text: '已列印', value: 'isprinted', sortable: false },
],
singleSelect: false,
searchList: '',
},
thisFilesSelected: {
text: '',
val: 0,
},
thisItemSelected: {
text: '',
val: 0,
},
printfiles:[],
//備品項目
searchSpares: '',
headersSpares: [//項目名稱
{ text: '* 品項名稱', value: 'act', sortable: false },
{ text: '總數量', value: 'totalqty', sortable: false },
{ text: '備註', value: 'demo', sortable: false },
{ text: '', value: 'actions', sortable: false, width: "200px" },
],
sparesItems: [],
sparesItems_count:0,
modifyIndex: -1,
modifyItem: {
id: 0,
num: 0,
activity_num: 0,
act_item_selected: {
text: '',
val: 0
//列印
data_table: {
selected: [],
editFilesItem: [],
headersFilesList: [
{ text: '訂單編號', value: 'order_no', sortable: false },
{ text: '牌位編號', value: 'print_id', sortable: false },
//{ text: '信眾姓名', value: 'from_id', sortable: false },
{ text: '已列印', value: 'isprinted', sortable: false },
],
singleSelect: false,
searchList: '',
},
totalqty: 0,
demo: '',
},
simpleItem: {
id: 0,
num: 0,
activity_num: 0,
act_item_selected: {
thisFilesSelected: {
text: '',
val: 0
val: 0,
},
totalqty: 0,
demo: '',
},
//列印文件
file_dialog: {
show: false,
},
//報名名單
order_dialog: {
show: false,
},
loading: false,
search: '',
headers: [
{ text: '訂單編號', value: 'order_no' },
{ text: '信眾編號', value: 'f_number' },
{ text: '信眾姓名', value: 'u_name' },
{ text: '聯絡電話', value: 'phone' },
{ text: '建立日期', value: 'order_date' },
],
items: [
{ order_no: "D", member_name: "S", order_date:"2025-12-07"}
],
unfilled_list: {
loading: false,
search: '',
headers: [
{ text: '訂單編號', value: 'order_no' },
{ text: '信眾編號', value: 'f_number' },
{ text: '信眾姓名', value: 'u_name' },
{ text: '聯絡電話', value: 'phone' },
{ text: '建立日期', value: 'order_date' },
],
items: [
{ order_no: "D", member_name: "S", order_date:"2025-12-07"}
thisItemSelected: {
text: '',
val: 0,
},
printfiles: [],
//備品項目
searchSpares: '',
headersSpares: [//項目名稱
{ text: '* 品項名稱', value: 'act', sortable: false },
{ text: '總數量', value: 'totalqty', sortable: false },
{ text: '備註', value: 'demo', sortable: false },
{ text: '', value: 'actions', sortable: false, width: "200px" },
],
sparesItems: [],
sparesItems_count: 0,
modifyIndex: -1,
modifyItem: {
id: 0,
num: 0,
activity_num: 0,
act_item_selected: {
text: '',
val: 0
},
totalqty: 0,
demo: '',
},
simpleItem: {
id: 0,
num: 0,
activity_num: 0,
act_item_selected: {
text: '',
val: 0
},
totalqty: 0,
demo: '',
},
//列印文件
file_dialog: {
show: false,
},
//報名名單
order_dialog: {
show: false,
},
unfilled_list: {
loading: false,
search: '',
headers: [
{ text: '訂單編號', value: 'order_no' },
{ text: '信眾編號', value: 'f_number' },
{ text: '信眾姓名', value: 'u_name' },
{ text: '聯絡電話', value: 'phone' },
{ text: '建立日期', value: 'order_date' },
],
items: [
{ order_no: "D", member_name: "S", order_date: "2025-12-07" }
],
},
currentView: 'shuwen-component',
}
},
mounted() {
this.search_dialog.current = this.search_dialog.controls.search1
this.loadUnfilledList();
@@ -314,7 +303,7 @@
handler() {
//console.log("watch1", this.search_dialog, this.search_dialog.page);
this.search_get()
console.log("watch2", this.search_dialog, this.search_dialog.page);
},
deep: true,
},
@@ -331,6 +320,9 @@
deep: true,
},
},
components: {
'shuwen-component': httpVueLoader('./shuwen02.vue'),
},
methods: {
search_show(curr) {
//console.log("btn_click:", curr, curr.api_url);
@@ -360,7 +352,7 @@
if (this.search_dialog.current.id == 'search3') {
search['category'] = "3";//備品
}
console.log("search_get", api_url, search, params, this.options);
this.search_dialog.loading = true
axios.post(api_url, search, { params: params })
.then(response => {
@@ -452,7 +444,7 @@
axios
.delete(HTTP_HOST + 'api/activity/DeleteRelatingData/' + item.num)
.then(response => {
console.log("del", item);
this.desserts.splice(index, 1)
this.desserts_count = this.desserts_count - 1;
})
@@ -752,7 +744,7 @@
};
// Add form fields
console.log(this.thisItemSelected.val, this.thisFilesSelected.val,JSON.stringify(list));
addHiddenField("item", this.thisItemSelected.val);
addHiddenField("file", this.thisFilesSelected.val);
addHiddenField("list", JSON.stringify(list));
@@ -1050,13 +1042,13 @@
</div>
<div class="">
<asp:Button ID="add" runat="server" Text="送出" OnClick="add_Click" CssClass="btn btn-primary" />
<asp:Button ID="edit" runat="server" Text="修改" Visible="false" OnClick="edit_Click" CssClass="btn btn-primary" />
<asp:Button ID="goback" runat="server" Text="取消" Visible="true" CausesValidation="false" OnClick="goback_Click" CssClass="btn btn-outline-secondary" />
<asp:Button ID="edit" runat="server" Text="儲存" Visible="false" OnClick="edit_Click" CssClass="btn btn-primary" />
<asp:Button ID="goback" runat="server" Text="返回" Visible="true" CausesValidation="false" OnClick="goback_Click" CssClass="btn btn-outline-secondary" />
</div>
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server">
<uc1:alert runat="server" ID="L_msg" Text="" />
<div id="content" class="container-lg">
<div id="content" class="container-fluid">
<div class="card shadow-sm my-2" id="sec2">
<div class="card-header py-0">
@@ -1075,6 +1067,10 @@
type="button" role="tab" aria-controls="profile" aria-selected="false" @click="loadUnfilledList">
未填寫名單
</button>
<button v-if="this_id!=''" class="nav-link" id="sec2-tab5" data-bs-toggle="tab" data-bs-target="#sec2-page5"
type="button" role="tab" aria-controls="profile" aria-selected="false">
總疏文維護
</button>
</div>
</nav>
</div>
@@ -1328,83 +1324,7 @@
</div>
<div class="tab-pane fade giftItems" id="sec2-page3" role="tabpanel" aria-labelledby="sec2-tab3" v-if="this_id!=''">
<v-card class="mx-auto" outlined v-if="this_id!=''">
<v-data-table
:headers="headersSpares"
:items="sparesItems"
:footer-props="footersDetail"
:search="searchSpares"
:options.sync="optionsSpares" class="elevation-1" fixed-header height="350px"
>
<v-divider inset></v-divider>
<template v-slot:top>
<v-toolbar flat color="white">
<div class="d-flex w-100">
<v-text-field v-model="searchSpares" append-icon="mdi-magnify" label="查詢" dense outlined single-line hide-details></v-text-field>
<v-btn
color="primary"
class="ml-2 white--text"
@click="addNewSp">
<v-icon dark>mdi-plus</v-icon>新增
</v-btn>
</div>
</v-toolbar>
</template>
<template v-slot:item.act="{ item }">
<div class="input-group mb-3" data-search-control="search3" @click="search_show(search_dialog.controls.search3)" v-if="item.id === modifyItem.id">
<input class="form-control search-text" type="text" readonly
placeholder="品項名稱" v-model="modifyItem.act_item_selected.text" >
<input type="hidden" v-model="modifyItem.act_item_selected.val">
<button class="btn btn-outline-secondary" type="button">
<i class="mdi mdi-view-list-outline"></i>
</button>
</div>
<span v-else>{{item.act_item_selected.text}}
<span v-if="item.num==0" class="text-danger">(預設資料,未存檔)</span>
</span>
</template>
<%-- <template v-slot:item.qty1="{ item }">
<v-text-field v-model="modifyItem.qty1" :hide-details="true" dense single-line v-if="item.id === modifyItem.id" ></v-text-field>
<span v-else>{{item.qty1}}</span>
</template>
<template v-slot:item.qty2="{ item }">
<v-text-field v-model="modifyItem.qty2" :hide-details="true" dense single-line v-if="item.id === modifyItem.id" ></v-text-field>
<span v-else>{{item.qty2}}</span>
</template>--%>
<template v-slot:item.demo="{ item }">
<v-text-field v-model="modifyItem.demo" :hide-details="true" dense single-line v-if="item.id === modifyItem.id" ></v-text-field>
<span v-else>{{item.demo}}</span>
</template>
<template v-slot:item.actions="{ item }">
<div v-if="item.id === modifyItem.id">
<v-icon color="red" class="mr-3" @click="cancelSp">
mdi-window-close
</v-icon>
<v-icon color="green" @click="saveSp">
mdi-content-save
</v-icon>
</div>
<div v-else>
<v-icon color="green" class="mr-3" @click="editItem(item,true);">
mdi-pencil
</v-icon>
<v-icon color="red" @click="deleteItemSp(item)">
mdi-delete
</v-icon>
</div>
</template>
</v-data-table>
</v-card>
</div>
<div class="tab-pane fade" id="sec2-page4" role="tabpanel" aria-labelledby="sec2-tab4" v-if="this_id!=''">
<v-card class="mx-auto" outlined id="print-unfilled-area">
@@ -1439,7 +1359,16 @@
</v-data-table>
</v-card>
</div>
</div>
<div class="tab-pane fade" id="sec2-page5" role="tabpanel" aria-labelledby="sec2-tab5" v-if="this_id!=''">
<v-card class="mx-auto" outlined >
<keep-alive>
<component :is="currentView" :num="this_id">
</component>
</keep-alive>
</v-card>
</div>
</div>
</asp:Panel>
</div>
+8 -85
View File
@@ -311,14 +311,14 @@ public partial class admin_activity_reg : MyWeb.config
//var printInitValue = printInit.Text.Trim();
//activity.print_init = !string.IsNullOrEmpty(printInitValue) ? printInitValue : null;
activity.kind = Val(kind.Value);
activity.category_kind = Val(category_kind.Value);
//activity.category_kind = Val(category_kind.Value);
activity.reg_time = DateTime.Now;
_db.activities.Add(activity);
_db.SaveChanges();
int _id = activity.num;
if (_id > 0)
int t_id = activity.num;
if (t_id > 0)
{
RunAutoEnroll(_id);
RunAutoEnroll(t_id);
Model.admin_log admin_log = new Model.admin_log();
admin_log.writeLog(admin.info.u_id, (int)Model.admin_log.Systems.Activity, (int)Model.admin_log.Status.Insert, subject.Text);
@@ -336,8 +336,8 @@ public partial class admin_activity_reg : MyWeb.config
activity.reg_time = DateTime.Now;
_db.activities.Add(activity);
_db.SaveChanges();
int _id = activity.num;
if (_id > 0)
t_id = activity.num;
if (t_id > 0)
{
Model.admin_log admin_log = new Model.admin_log();
admin_log.writeLog(admin.info.u_id, (int)Model.admin_log.Systems.Activity, (int)Model.admin_log.Status.Insert, subject.Text);
@@ -421,7 +421,7 @@ public partial class admin_activity_reg : MyWeb.config
else
{
//activity.category_kind = Val(category_kind.Value);
activity.category_kind = Val(category_kind.Value);
//activity.category_kind = Val(category_kind.Value);
_db.SaveChanges();
RunAutoEnroll(activity.num);
@@ -524,84 +524,7 @@ private void RunAutoEnroll(int activityNum)
}
}
private void RunAutoEnroll(int activityNum)
{
var activity = _db.activities.FirstOrDefault(a => a.num == activityNum);
if (activity == null || !activity.startDate_solar.HasValue) return;
DateTime actDate = activity.startDate_solar.Value;
var validConfigs = _db.auto_enroll
.Where(ae => actDate >= ae.start_date && actDate <= ae.end_date)
.ToList();
foreach (var config in validConfigs)
{
if (_db.pro_order.Any(o => o.activity_num == activity.num && o.f_num == config.f_num))
continue;
var follower = _db.followers.FirstOrDefault(f => f.num == config.f_num);
if (follower == null) continue;
string newOrderNo = AutoOrderService.CreateAutoOrderNumber(_db);
Model.pro_order proOrder = new Model.pro_order
{
order_no = newOrderNo,
up_time = DateTime.Now,
reg_time = DateTime.Now,
keyin1 = "A01",
f_num = follower.num,
au_num = config.num,
phone = !string.IsNullOrEmpty(follower.cellphone) ? follower.cellphone : (follower.phone ?? ""),
activity_num = activity.num,
address = config.receipt_address ?? "",
receipt_title = config.receipt_title ?? "",
demo = "",
customize_data = ""
};
_db.pro_order.Add(proOrder);
CopyLatestOrderDetails(newOrderNo, config.f_num, (int)activity.kind);
}
_db.SaveChanges();
}
private void CopyLatestOrderDetails(string newOrderNo, int f_num, int activityKind)
{
var latestOrder = _db.pro_order
.Where(o => o.f_num == f_num && o.activity.kind == activityKind && _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)
{
Model.pro_order_detail newDetail = new Model.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,
qty = detail.qty,
price = detail.price,
start_date = DateTime.Today,
pay = 0,
UpdateTime = DateTime.Now
};
_db.pro_order_detail.Add(newDetail);
}
}
}
#endregion
+558
View File
@@ -0,0 +1,558 @@
<template>
<div id="control-panel">
<div class="control-group">
<label>紙張大小</label><select id="paper-size" onchange="updateLayout()">
<option value="A4" data-w="210" data-h="297" selected>A4</option>
<option value="A3" data-w="297" data-h="420">A3</option>
<option value="B5" data-w="176" data-h="250">B5</option>
</select>
</div>
<div class="control-group">
<label>紙張方向</label><select id="paper-orientation" onchange="updateLayout()">
<option value="portrait" selected>直向</option>
<option value="landscape">橫向</option>
</select>
</div>
<div class="control-group">
<label>一次修改全部行距: <span id="global-margin-lbl">10</span>px</label>
<div class="adjust-row">
<button onclick="adjustAllMargins(-1)">
-
</button><input type="range"
id="global-margin-slide"
min="0"
max="80"
value="10"
oninput="changeAllMargins(this.value)" /><button onclick="adjustAllMargins(1)">+</button>
</div>
</div>
<hr />
<p style="
font-size: 11px;
color: #c0392b;
font-weight: 700;
background: #fde8e7;
padding: 6px;
border-radius: 4px;
margin: 0;
">
💡 提示:在右側文字上【按滑鼠右鍵】觸發設定,面板固定顯示在左下角!
</p>
<hr />
<button class="action-btn"
style="background: #28a745"
onclick="saveData()">
1. 儲存至資料庫
</button>
<button class="action-btn" onclick="window.print()">
2. 產生 PDF / 列印
</button>
</div>
<div id="preview-container" onclick="hideFloatingMenu(event)">
<div id="paper-preview">
<div id="editor"
contenteditable="true"
oncontextmenu="rightClickLineTrack(event)">
<div style="
font-size: 28px;
font-weight: bold;
align-items: center;
margin-left: 25px;
">
中元普渡祈福文疏
</div>
<div></div>
<div style="font-size: 16px; letter-spacing: 4px; margin-left: 12px">
今逢佳節齋供養,花果盡是素佳餚。
</div>
<div style="font-size: 16px; margin-left: 12px">
誠心祈求風調雨順、國泰民安。
</div>
<div></div>
<div style="font-size: 14px; align-items: flex-end; margin-left: 30px">
歲次天運民國一一五[YEAR]年七[MONTH]月十五[DAY]日。
</div>
</div>
</div>
<div id="line-floating-menu" onclick="event.stopPropagation()">
<h4 id="menu-header">✥ 拖拉此處移動面板</h4>
<div class="control-group">
<label>字型大小: <span id="f-size-lbl">16</span>px</label>
<div class="adjust-row">
<button onclick="
stepSingleLine(
'fontSize',
'f-size-slide',
'f-size-lbl',
-1,
'px',
)
">
-
</button><input type="range"
id="f-size-slide"
min="12"
max="60"
value="16"
oninput="
adjustLineStyle(
'fontSize',
this.value + 'px',
'f-size-lbl',
this.value,
)
" /><button onclick="
stepSingleLine(
'fontSize',
'f-size-slide',
'f-size-lbl',
1,
'px',
)
">
+
</button>
</div>
</div>
<div class="control-group">
<label>字距: <span id="f-space-lbl">2</span>px</label>
<div class="adjust-row">
<button onclick="
stepSingleLine(
'letterSpacing',
'f-space-slide',
'f-space-lbl',
-1,
'px',
)
">
-
</button><input type="range"
id="f-space-slide"
min="0"
max="25"
value="2"
oninput="
adjustLineStyle(
'letterSpacing',
this.value + 'px',
'f-space-lbl',
this.value,
)
" /><button onclick="
stepSingleLine(
'letterSpacing',
'f-space-slide',
'f-space-lbl',
1,
'px',
)
">
+
</button>
</div>
</div>
<div class="control-group">
<label>行距(與左側): <span id="f-margin-lbl">10</span>px</label>
<div class="adjust-row">
<button onclick="
stepSingleLine(
'marginLeft',
'f-margin-slide',
'f-margin-lbl',
-1,
'px',
)
">
-
</button><input type="range"
id="f-margin-slide"
min="0"
max="80"
value="10"
oninput="
adjustLineStyle(
'marginLeft',
this.value + 'px',
'f-margin-lbl',
this.value,
)
" /><button onclick="
stepSingleLine(
'marginLeft',
'f-margin-slide',
'f-margin-lbl',
1,
'px',
)
">
+
</button>
</div>
</div>
<div class="control-group">
<label>垂直位置對齊</label>
<div class="menu-btn-group">
<button id="f-align-top"
onclick="adjustLineAlign('flex-start', this)">
上
</button><button id="f-align-center"
onclick="adjustLineAlign('center', this)">
中
</button><button id="f-align-bottom"
onclick="adjustLineAlign('flex-end', this)">
下
</button>
</div>
</div>
</div>
</div>
</template>
<script>
let currentTargetLine = null;
function updateLayout() {
const e = document.getElementById("paper-size"),
t = document.getElementById("paper-orientation"),
n = document.getElementById("paper-preview"),
a = document.getElementById("print-style"),
o = e.options[e.selectedIndex],
i = parseFloat(o.getAttribute("data-w")),
r = parseFloat(o.getAttribute("data-h")),
d = e.value,
l = t.value;
let s = "portrait" === l ? i : r,
c = "portrait" === l ? r : i;
((n.style.width = s + "mm"),
(n.style.height = c + "mm"),
(a.innerHTML = `@media print { @page { size: ${d} ${l}; margin: 0mm; } }`),
hideFloatingMenu());
}
function rightClickLineTrack(e) {
s
let t = e.target;
const n = document.getElementById("editor");
while (t && t.parentNode !== n && t !== n) {
t = t.parentNode;
}
if (!t || t === n || "DIV" !== t.tagName) return;
(e.preventDefault(),
currentTargetLine &&
currentTargetLine.classList.remove("selected-line"),
(currentTargetLine = t),
currentTargetLine.classList.add("selected-line"));
const a = window.getComputedStyle(currentTargetLine),
o = parseInt(a.fontSize) || 16;
((document.getElementById("f-size-slide").value = o),
(document.getElementById("f-size-lbl").innerText = o));
const i = "normal" === a.letterSpacing ? 0 : parseInt(a.letterSpacing);
((document.getElementById("f-space-slide").value = i),
(document.getElementById("f-space-lbl").innerText = i));
const r = parseInt(a.marginLeft) || 10;
((document.getElementById("f-margin-slide").value = r),
(document.getElementById("f-margin-lbl").innerText = r),
document
.querySelectorAll(".menu-btn-group button")
.forEach((e) => e.classList.remove("active")),
"flex-start" === a.alignItems &&
document.getElementById("f-align-top").classList.add("active"),
"center" === a.alignItems &&
document.getElementById("f-align-center").classList.add("active"),
"flex-end" === a.alignItems &&
document.getElementById("f-align-bottom").classList.add("active"),
(document.getElementById("line-floating-menu").style.display =
"flex"));
}
function hideFloatingMenu(e) {
if (
e &&
("preview-container" === e.target.id ||
"paper-preview" === e.target.id)
) {
((document.getElementById("line-floating-menu").style.display =
"none"),
currentTargetLine &&
currentTargetLine.classList.remove("selected-line"),
(currentTargetLine = null));
}
}
function adjustLineStyle(e, t, n, a) {
currentTargetLine &&
((currentTargetLine.style[e] = t),
(document.getElementById(n).innerText = a));
}
function stepSingleLine(e, t, n, a, o) {
if (currentTargetLine) {
const i = document.getElementById(t);
let r = parseInt(i.value) + a;
(r < parseInt(i.min) && (r = parseInt(i.min)),
r > parseInt(i.max) && (r = parseInt(i.max)),
(i.value = r),
adjustLineStyle(e, r + o, n, r));
}
}
function changeAllMargins(e) {
((document.getElementById("global-margin-lbl").innerText = e),
document.querySelectorAll("#editor > div").forEach((t) => {
t.style.marginLeft = e + "px";
}));
}
function adjustAllMargins(e) {
const t = document.getElementById("global-margin-slide");
let n = parseInt(t.value) + e;
(n < parseInt(t.min) && (n = parseInt(t.min)),
n > parseInt(t.max) && (n = parseInt(t.max)),
(t.value = n),
changeAllMargins(n));
}
function adjustLineAlign(e, t) {
currentTargetLine &&
((currentTargetLine.style.alignItems = e),
document
.querySelectorAll(".menu-btn-group button")
.forEach((e) => e.classList.remove("active")),
t.classList.add("active"));
}
function saveData() {
((document.getElementById("line-floating-menu").style.display = "none"),
currentTargetLine &&
currentTargetLine.classList.remove("selected-line"),
console.log(document.getElementById("editor").innerHTML),
alert("已成功擷取 HTML 結構至 Console!"));
}
window.onload = function () {
updateLayout();
};
(function () {
const e = document.getElementById("line-floating-menu"),
t = document.getElementById("menu-header");
let n = !1,
a,
o;
(t.addEventListener("mousedown", (r) => {
const i = e.getBoundingClientRect();
((a = r.clientX - i.left),
(o = r.clientY - i.top),
r.target === t && ((n = !0), (e.style.position = "fixed")));
}),
document.addEventListener("mousemove", (t) => {
if (n) {
t.preventDefault();
let i = t.clientX - a,
r = t.clientY - o;
((e.style.left = i + "px"),
(e.style.top = r + "px"),
(e.style.bottom = "auto"));
}
}),
document.addEventListener("mouseup", () => (n = !1)));
})();
</script>
<style>
@media print {
@page {
size: A4 portrait;
margin: 0mm;
}
}
body {
font-family: "Microsoft JhengHei", sans-serif;
margin: 0;
padding: 20px;
background: #f5f5f5;
display: flex;
gap: 20px;
}
#control-panel {
width: 240px;
background: #fff;
padding: 20px;
border-radius: 8px;
box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);
display: flex;
flex-direction: column;
gap: 15px;
height: fit-content;
}
.control-group {
display: flex;
flex-direction: column;
gap: 5px;
font-size: 14px;
}
select,
input[type="range"] {
padding: 6px;
border: 1px solid #ccc;
border-radius: 4px;
}
button.action-btn {
padding: 12px;
background: #007bff;
color: #fff;
border: none;
border-radius: 4px;
cursor: pointer;
font-size: 16px;
font-weight: 700;
}
#preview-container {
display: flex;
flex-grow: 1;
background: #ddd;
padding: 20px;
overflow: auto;
position: relative;
}
#paper-preview {
background: #fff;
padding: 20mm;
box-sizing: border-box;
width: 210mm;
height: 297mm;
}
#editor {
width: 100%;
height: 100%;
outline: none;
writing-mode: vertical-rl;
text-orient: upright;
}
#editor > div {
min-height: 1em;
display: flex !important;
flex-direction: column;
align-items: flex-start;
margin-left: 10px;
padding: 0 4px;
}
#editor > div:hover {
background: rgba(0, 123, 255, 0.05);
}
#editor > div.selected-line {
background: rgba(0, 123, 255, 0.1) !important;
box-shadow: 0 0 0 1px #ff7675;
}
#line-floating-menu {
display: none;
position: fixed;
bottom: 20px;
left: 280px;
background: #fff0f1;
border: 2px solid #ff7675;
padding: 12px;
border-radius: 8px;
box-shadow: 0 4px 15px rgba(0, 0, 0, 0.3);
z-index: 99999;
flex-direction: column;
gap: 8px;
width: 210px;
}
#line-floating-menu h4 {
margin: 0;
color: #d63031;
font-size: 14px;
cursor: move;
background: #ffe4e6;
padding: 4px;
border-radius: 4px;
text-align: center;
user-select: none;
}
.menu-btn-group {
display: flex;
gap: 4px;
}
.menu-btn-group button {
flex: 1;
padding: 6px;
border: 1px solid #ccc;
background: #fff;
cursor: pointer;
border-radius: 4px;
font-weight: 700;
}
.menu-btn-group button.active {
background: #28a745;
color: #fff;
border-color: #28a745;
}
.adjust-row {
display: flex;
align-items: center;
gap: 5px;
}
.adjust-row button {
padding: 4px 10px;
border: 1px solid #ccc;
background: #fff;
cursor: pointer;
border-radius: 4px;
font-weight: 700;
user-select: none;
}
.adjust-row button:hover {
background: #eee;
}
.adjust-row input[type="range"] {
flex-grow: 1;
padding: 0;
}
@media print {
#control-panel,
#line-floating-menu {
display: none !important;
}
body,
#preview-container {
background: #fff;
padding: 0;
margin: 0;
}
#paper-preview {
width: 100% !important;
height: 100% !important;
box-shadow: none;
/* 1. 移除原本的 flex 與置中設定,改為一般的區塊顯示 */
display: block !important;
/* 2. 透過 padding 設定您需要的上邊界與右邊界 (數值可自由調整) */
padding-top: 30mm !important; /* 控制上方留白 */
padding-right: 30mm !important; /* 控制右側留白 */
padding-bottom: 0 !important;
padding-left: 0 !important;
/* padding: 0;
display: flex !important;
justify-content: center !important;
align-items: center !important; */
}
#editor {
height: auto !important;
/* width: auto !important; 加入這行,讓寬度貼合內容 */
max-height: 100% !important;
}
}
</style>
File diff suppressed because it is too large Load Diff
+2 -3
View File
@@ -110,7 +110,7 @@
.then(res => {
this.activity_statistics.items = res.data.items;
this.activity_statistics.totalItems = res.data.count;
console.log(this.activity_statistics.options)
})
.catch(error => {
@@ -123,8 +123,7 @@
watch: {
selected_activity: {
handler(newvalue, oldvalue) {
console.log('新值:', newvalue);
console.log('舊值:', oldvalue);
},
deep: true
},
@@ -400,7 +400,7 @@
async saveRegistrantMethod() {
try {
const response = await axios.post(HTTP_HOST + 'api/ancestraltablet/registrant/create', this.form.createRegister);
console.log('保存成功', response.data);
// 可選:提示用戶、關閉對話框、刷新數據等
this.$toast?.success('登記人保存成功'); // 取決於你是否使用 toast 插件
@@ -416,7 +416,7 @@
updateRegistrantMethod() {
axios.post(HTTP_HOST + 'api/ancestraltablet/registrant/update', this.form.createRegister)
.then(response => {
console.log('登記人更新成功:', response.data);
this.$toast?.success?.('登記人更新成功'); // 可選:使用 toast 彈出提示
//this.showCreatePWFlag = false; // 關閉彈出視窗
// 可選:刷新列表等
+2 -2
View File
@@ -76,7 +76,7 @@
if (getArray != undefined && getArray != null ) {
var keys = Object.keys(getArray);
for (let i = 0; i < keys.length; i++) {
console.log(`${keys[i]}:${getArray[keys[i]]}`); //value : text
var _tmp = {
text: getArray[keys[i]],
val: parseInt(keys[i]),
@@ -125,7 +125,7 @@
axios
.delete(HTTP_HOST + 'api/bed_kind/DeleteBedKindDetail/' + item.num)
.then(response => {
console.log("del", item);
this.desserts.splice(index, 1)
this.desserts_count = this.desserts_count - 1;
})
+3 -3
View File
@@ -528,7 +528,7 @@
if (selectedItem.price) {
this.currentRow.selected_items_text += ` (NT$${Number(selectedItem.price).toLocaleString()})`;
}
console.log('已選擇項目:', selectedItem.subject, '項目編號:', selectedItem.num);
}
}
}
@@ -731,7 +731,7 @@
search.is_reconcile = 'Y';
}
console.log("search_get", api_url, search, params, this.options);
this.search_dialog.loading = true;
axios.post(api_url, search, { params: params })
@@ -770,7 +770,7 @@
curr.select(this, row);
}
this.search_dialog.show = false;
console.log('Selected row:', row);
},
showItemSelectDialog(item) {
// 設定當前正在編輯的行
+1 -1
View File
@@ -245,7 +245,7 @@
'group-component': httpVueLoader('./group_reconcile.vue'),
'personal-component': httpVueLoader('./personal_reconcile.vue'),
'balance-component': httpVueLoader('./balance_reconcile.vue'),
'verify_query-component': httpVueLoader('./verify_order_record_query.vue'),
'verify_query-component': httpVueLoader('./audit.vue'),
'balance_query-component': httpVueLoader('./balance_reconcile_query.vue'),
'statistic_query-component': httpVueLoader('./statistic.vue'),
},
+1 -1
View File
@@ -70,7 +70,7 @@
this.message_dialog.show = true;
return false;
}
const params = { statistic_mode: this.category_id }
const params = { statistic_mode: this.category_id, s_date: this.query.s_date, e_date: this.query.e_date }
const search = {
num: 0, kind: 0, kindName: "", order_no: "", u_name: "", pay_type: "", subject: "", amount: 0, price: 0, pay_mode: "", status: "",
acc_num: 0, f_num: 0, acc_kind: 0, check_amount: 0, remain_amount: 0, check_status: "", actItem_num: 0, draft: "", d_nnum: 0
+38 -23
View File
@@ -233,7 +233,7 @@
checkStatusOptions: [
{ text: '', value: '' },
{ text: '未核對', value: '1' },
{ text: '核對', value: '2' },
{ text: '已核對', value: '2' },
{ text: '金額不符', value: '3' },
{ text: '其他問題', value: '4' },
{ text: '作廢', value: '5' }
@@ -287,6 +287,7 @@
openFollowerDialog(item) {
this.follower_dialog.current_item = item;
this.follower_dialog.show = true;
//this.follower_dialog.search = true;
// 若開啟時已有關鍵字,可以自動帶入搜尋
// this.searchFollowers();
},
@@ -296,7 +297,7 @@
this.follower_dialog.loading = true;
try {
const response = await axios.post(HTTP_HOST + 'api/follower/GetList', {
f_number: this.follower_dialog.search,
//f_number: this.follower_dialog.search,
u_name: this.follower_dialog.search
}, {
params: {
@@ -387,6 +388,7 @@
verify_note: item.verify_note
// 備註:依您的原本邏輯,這裡並未傳送 check_date, check_amount 等欄位,若後端 API 需要這些沖帳資訊,請在這裡一併補上。
}));
try {
const res = await axios.post('../../api/transfer_register/batch_update', updateList);
@@ -402,28 +404,28 @@
},
async submitData() {
// 檢查必填欄位 - 入帳銀行/帳戶
const missingAccNum = this.items.filter(item => !item.acc_num);
if (missingAccNum.length > 0) {
alert('請選擇入帳銀行/帳戶!有 ' + missingAccNum.length + ' 筆資料未選擇。');
return;
}
//const missingAccNum = this.items.filter(item => !item.acc_num);
//if (missingAccNum.length > 0) {
// alert('請選擇入帳銀行/帳戶!有 ' + missingAccNum.length + ' 筆資料未選擇。');
// return;
//}
// 檢查必填欄位 - 入帳日期
const missingCheckDate = this.items.filter(item => !item.check_date);
if (missingCheckDate.length > 0) {
alert('請填寫入帳日期!有 ' + missingCheckDate.length + ' 筆資料未填寫。');
return;
}
//// 檢查必填欄位 - 入帳日期
//const missingCheckDate = this.items.filter(item => !item.check_date);
//if (missingCheckDate.length > 0) {
// alert('請填寫入帳日期!有 ' + missingCheckDate.length + ' 筆資料未填寫。');
// return;
//}
// 檢查必填欄位 - 入帳金額
const missingCheckAmount = this.items.filter(item => !item.check_amount || item.check_amount <= 0);
if (missingCheckAmount.length > 0) {
alert('請填寫入帳金額!有 ' + missingCheckAmount.length + ' 筆資料未填寫或金額無效。');
return;
}
//// 檢查必填欄位 - 入帳金額
//const missingCheckAmount = this.items.filter(item => !item.check_amount || item.check_amount <= 0);
//if (missingCheckAmount.length > 0) {
// alert('請填寫入帳金額!有 ' + missingCheckAmount.length + ' 筆資料未填寫或金額無效。');
// return;
//}
// 組出要更新的資料
const updateList = this.items.map(item => ({
const updateList = this.items.filter(item => item.f_num && item.acc_num && item.check_date && item.check_amount && item.check_status).map(item => ({
id: item.id,
f_num: item.f_num,
status: '2',
@@ -436,18 +438,31 @@
kind: item.kind,
verify_note: item.verify_note
}));
//console.log(updateList)
if (updateList.length === 0) {
this.snackbar.text = "無資料可以送出"
this.snackbar.show=true
return
}
;
try {
const res = await axios.post('../../api/transfer_register/batch_update', updateList);
if (res.data && res.data.success) {
alert('送出成功!');
// alert('送出成功!');
this.snackbar.text = "送出成功"
this.snackbar.show = true
// 重新載入資料
await this.loadData();
} else {
alert('送出失敗,請重試 :' + res.data.message);
this.snackbar.text = '送出失敗,請重試 :' + res.data.message
this.snackbar.show = true
//alert('送出失敗,請重試 :' + res.data.message);
}
} catch (e) {
console.error('送出失敗:', e);
alert('送出失敗,請再試一次!');
this.snackbar.text = '送出失敗,請再試一次!'
this.snackbar.show = true
//alert('送出失敗,請再試一次!');
}
},
closeWindow() {
+5 -3
View File
@@ -151,7 +151,8 @@
<v-btn icon @click="followerDialog.show = false"><v-icon>mdi-close</v-icon></v-btn>
</v-card-title>
<v-card-text class="mt-4">
<v-text-field v-model="followerDialog.search" label="搜尋信眾" dense outlined @keyup.enter="searchFollower"></v-text-field>
<v-text-field v-model="followerDialog.search" label="搜尋信眾" dense outlined
@keydown.enter.prevent="searchFollower"></v-text-field>
<v-data-table :headers="followerDialog.headers"
:items="followerDialog.items"
:loading="followerDialog.loading"
@@ -336,11 +337,12 @@
},
showFollowerDialog() {
this.followerDialog.show = true;
this.searchFollower();
//this.searchFollower();
},
searchFollower() {
//event.preventDefault();
this.followerDialog.loading = true;
axios.post('../..../..../../api/follower/GetList', { u_name: this.followerDialog.search }, { params: { page: 1, pageSize: 10 } })
axios.post('/api/follower/GetList', { u_name: this.followerDialog.search }, { params: { page: 1, pageSize: 10 } })
.then(res => { this.followerDialog.items = res.data.list; })
.catch(() => { this.followerDialog.items = []; })
.finally(() => { this.followerDialog.loading = false; });
+4 -4
View File
@@ -81,7 +81,7 @@
.catch(error => console.log(error))
},
editItem(item) {
console.log("edit", item);
},
deleteItem(item) {
@@ -91,7 +91,7 @@
axios
.delete(HTTP_HOST + 'api/FilesSet/' + item.num)
.then(response => {
console.log("del", item);
this.data_table.list.splice(index, 1);
this.data_table.count = this.data_table.list.length
})
@@ -104,7 +104,7 @@
axios
.delete(HTTP_HOST + 'api/FilesSet/Delete/' + this.data_table.selected.map(x => x.num))
.then(response => {
console.log("delAll");
for (var i = 0; i < this.data_table.selected.length; i++) {
const index = this.data_table.list.indexOf(this.data_table.selected[i]);
@@ -161,7 +161,7 @@
</template>
<template #item.slot_btn="{ item }">
<a :href="'reg.aspx?num='+item.num" class="btn btn-outline-secondary btn-sm"><i class="mdi mdi-pencil-box-outline"></i>修改</a>
<a :href="'reg.aspx?num='+item.num" class="btn btn-outline-secondary btn-sm"><i class="mdi mdi-pencil-box-outline"></i>編輯</a>
<a @click="deleteItem(item)" class="btn btn-outline-secondary btn-sm"><i class="mdi mdi-trash-can"></i>刪除</a>
</template>
</v-data-table>
+2 -2
View File
@@ -16,8 +16,8 @@
</div>
<div class="">
<asp:Button ID="add" runat="server" Text="送出" OnClick="add_Click" CssClass="btn btn-primary" />
<asp:Button ID="edit" runat="server" Text="修改" Visible="false" OnClick="edit_Click" CssClass="btn btn-primary" />
<asp:Button ID="goback" runat="server" Text="回列表" Visible="false" CausesValidation="false" OnClick="goback_Click" CssClass="btn btn-outline-secondary" />
<asp:Button ID="edit" runat="server" Text="儲存" Visible="false" OnClick="edit_Click" CssClass="btn btn-primary" />
<asp:Button ID="goback" runat="server" Text="返回" Visible="false" CausesValidation="false" OnClick="goback_Click" CssClass="btn btn-outline-secondary" />
</div>
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server">
+6 -4
View File
@@ -135,9 +135,10 @@
},
watch: {
options: {
handler() {
handler() {
this.getList()
if (this.isSearched) {
this.getList()
}
else {
this.data_table.loading = false;
@@ -158,6 +159,7 @@
this.search_dialog.current = this.search_dialog.controls.search1 ///default
this.initPrintSearch();
this.getList();
const navEntries = performance.getEntriesByType("navigation");
const isReload = navEntries.length > 0 && navEntries[0].type === "reload";
@@ -498,7 +500,7 @@
$btn.click();
let el = document.getElementById('offcanvasRight');
let offcanvas = bootstrap.Offcanvas.getOrCreateInstance(el);
offcanvas.show();
//offcanvas.show();
}
});
</script>
@@ -543,7 +545,7 @@
</div>
</template>
<template #item.slot_btn="{ item }">
<a :href="'reg.aspx?num='+item.num" class="btn btn-outline-secondary btn-sm"><i class="mdi mdi-pencil-box-outline"></i>修改</a>
<a :href="'reg.aspx?num='+item.num" class="btn btn-outline-secondary btn-sm"><i class="mdi mdi-pencil-box-outline"></i>編輯</a>
<a @click="deleteItem(item)" class="btn btn-outline-secondary btn-sm"><i class="mdi mdi-trash-can"></i>刪除</a>
</template>
<template #item.order_record="{item}">
+56 -30
View File
@@ -2,6 +2,7 @@
<%@ Register Src="~/admin/_uc/alert.ascx" TagPrefix="uc1" TagName="alert" %>
<asp:Content ID="Content1" ContentPlaceHolderID="page_header" runat="Server">
<script src="/js/httpVueLoader.js"></script>
</asp:Content>
<asp:Content ID="Content4" ContentPlaceHolderID="footer_script" runat="Server">
<script>
@@ -72,11 +73,11 @@
$('#L1').text(data.cDate)
$('#L2').text(data.sign)
} else {
console.log(data.msg);
//console.log(data.msg);
}
});
}
console.log(_date);
// console.log(_date);
}
function checkNumber(btn) {
$('#errormsg').hide();
@@ -98,7 +99,7 @@
if (data.isOk) {
} else {
console.log(data.msg);
//console.log(data.msg);
$('#errormsg').text(data.msg);
$('#errormsg').show();
}
@@ -159,7 +160,7 @@
],
selected: {},
select(item, index, t) {
console.log("select search1", t);
//console.log("select search1", t);
}
},
search2: {
@@ -215,7 +216,7 @@
],
selected: {},
select(item, index, t) {
console.log("select search3", t);
//console.log("select search3", t);
}
},
search4: {
@@ -231,7 +232,7 @@
],
selected: {},
select(item, index, t) {
console.log("select search4", t);
//console.log("select search4", t);
//edit item
item.appellation_id_selected.text = t.title //=====?
item.appellation_id_selected.val = t.num //=====?
@@ -255,7 +256,7 @@
],
selected: {},
select(item, index, t) {
console.log("select search5", t);
//console.log("select search5", t);
}
},
@@ -547,26 +548,30 @@
{ text: '酉時 (17:00~19:00)', value: '酉時' },
{ text: '戌時 (19:00~21:00)', value: '戌時' },
{ text: '亥時 (21:00~23:00)', value: '亥時' }
]
],
currentView: 'shuwen-component',
externalHtml:'<p>loading...</p>'
}
},
mounted() {
this.search_dialog.current = this.search_dialog.controls.search1 ///default
//console.log("mounted");
//this.initialize();
//取得家人列表
this.getFamilyMembers();
this.getCityOptions();
this.onCityChange();
this.initAutoEnroll();
this.loadExternalHtml();
},
watch: {
options: {
handler() {
//console.log("watch1", this.search_dialog, this.search_dialog.page);
this.search_get()
console.log("watch2", this.search_dialog, this.search_dialog.page);
//console.log("watch2", this.search_dialog, this.search_dialog.page);
},
deep: true,
},
@@ -602,7 +607,26 @@
color: 'error'
}
},
components: {
'shuwen-component': httpVueLoader('./tablet_template.vue'),
},
methods: {
async loadExternalHtml() {
try {
// 請求外部的 HTML 檔案或 API 路由
const response = await axios.get('tablet_template.html');
// 將取得的 HTML 字串存入變數
this.externalHtml = response.data;
$("#sec2-page6").html(this.externalHtml);
setTimeout(() => {
//console.log("load html:",this.follower_id);
designer.follower_num = this.follower_id;
//designer.getFamilies();
},100);
} catch (error) {
console.error('載入失敗', error);
}
},
initAutoEnroll() {
if (this.follower_id != '') {
axios.get(HTTP_HOST + `api/follower/GetAutoEnrollList/${this.follower_id}`)
@@ -743,7 +767,7 @@
this.confirm_dialog.pendingDeleteItem = null; // 清空暫存
})
.catch(error => {
console.log("刪除失敗", error);
//console.log("刪除失敗", error);
this.snackbar.text = "刪除失敗:" + error;
this.snackbar.show = true;
})
@@ -915,13 +939,13 @@
}
})
.catch(error => {
console.log("刪除訂單失敗", error);
//console.log("刪除訂單失敗", error);
this.snackbar.text = "刪除訂單失敗:" + error;
this.snackbar.show = true;
})
},
search_show(curr) {
console.log("btn_click:", curr, curr.api_url);
//console.log("btn_click:", curr, curr.api_url);
this.search_dialog.current = curr;
this.search_clear()
//this.search_get()//清除完自動會重抓, 故取消
@@ -961,14 +985,14 @@
}
// }
console.log("search_get", api_url, search, params, this.options);
//console.log("search_get", api_url, search, params, this.options);
this.search_dialog.loading = true
axios.post(api_url, search, { params: params })
.then(response => {
this.search_dialog.list = response.data.list
this.search_dialog.count = response.data.count
this.search_dialog.loading = false
console.log(this.search_dialog.list)
//console.log(this.search_dialog.list)
})
.catch(error => {
console.log(error)
@@ -1079,7 +1103,7 @@
axios
.post(HTTP_HOST + 'api/follower/familyDelete', pro_order_detail)
.then(response => {
console.log("del", item);
// console.log("del", item);
this.desserts.splice(index, 1)
this.desserts_count = this.desserts_count - 1;
})
@@ -1354,7 +1378,7 @@
axios
.delete(HTTP_HOST + 'api/follower/tabletDelete/' + item.num)
.then(response => {
console.log("del", item);
//console.log("del", item);
this.tabletTable.desserts.splice(index, 1)
this.tabletTable.desserts_count = this.tabletTable.desserts_count - 1;
})
@@ -1388,7 +1412,7 @@
})
},
getFamilyMembers() {
console.log("getFamilyMembers", this.follower_id);
// console.log("getFamilyMembers", this.follower_id);
if (this.follower_id) {
this.family.loading = true;
// 假設您有一個 API 端點來獲取特定 follower 的 family members
@@ -1400,7 +1424,7 @@
birthdate: member.birthdate ? member.birthdate.split('T')[0] : null
}));
this.family.members_count = response.data.length;
console.log("family.members", this.family.members);
//console.log("family.members", this.family.members);
})
.catch(error => {
console.error("Error fetching family members:", error);
@@ -1435,7 +1459,7 @@
//this.editedItem = $.extend(true, {}, this.defaultItem);
},
fam_save(item) {
console.log("fam_save 1:", this.family.edItem);
//console.log("fam_save 1:", this.family.edItem);
// 驗證必填欄位 - 只有姓名必填
if (!this.family.edItem.fam_name || this.family.edItem.fam_name.trim() === '') {
@@ -1458,7 +1482,7 @@
savePromise
.then(response => {
console.log("fam_save 2: Server response", response);
//console.log("fam_save 2: Server response", response);
//const updatedMember = fam_item;
const updatedMember = { ...fam_item, num: response.data.num };
@@ -1735,7 +1759,7 @@
</div>
<asp:Button ID="add" runat="server" Text="送出" OnClick="add_Click" CssClass="btn btn-primary edit_Click noedit" />
<asp:Button ID="edit" runat="server" Text="儲存" Visible="false" OnClick="edit_Click" CssClass="btn btn-primary edit_Click noedit" />
<asp:Button ID="goback" runat="server" Text="取消" Visible="true" CausesValidation="false" OnClick="goback_Click" CssClass="btn btn-outline-secondary" />
<asp:Button ID="goback" runat="server" Text="返回" Visible="true" CausesValidation="false" OnClick="goback_Click" CssClass="btn btn-outline-secondary" />
</div>
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server">
@@ -1760,12 +1784,15 @@
<button class="nav-link" id="sec2-tab3" data-bs-toggle="tab" data-bs-target="#sec2-page3"
type="button" role="tab" aria-controls="profile" aria-selected="false" v-if="lists.length > 0">
未付款紀錄 </button>
<button class="nav-link" id="sec2-tab4" data-bs-toggle="tab" data-bs-target="#sec2-page4"
<%--<button class="nav-link" id="sec2-tab4" data-bs-toggle="tab" data-bs-target="#sec2-page4"
type="button" role="tab" aria-controls="profile" aria-selected="false" display="none">
牌位標題 </button>
牌位標題 </button>--%>
<button class="nav-link" id="sec2-tab5" data-bs-toggle="tab" data-bs-target="#sec2-page5"
type="button" role="tab" aria-controls="profile" aria-selected="false">
全年報名 </button>
<button class="nav-link" id="sec2-tab6" data-bs-toggle="tab" data-bs-target="#sec2-page6"
type="button" role="tab" aria-controls="profile" aria-selected="false">
牌位範本 </button>
</div>
</nav>
</div>
@@ -2278,15 +2305,11 @@
</v-data-table>
</v-card>
</div>
<div class="tab-pane fade" id="sec2-page4" role="tabpanel" aria-labelledby="sec2-tab4" >
<%--<div class="tab-pane fade" id="sec2-page4" role="tabpanel" aria-labelledby="sec2-tab4" >
<v-card class="mx-auto" outlined v-if="follower_id!=''">
<v-data-table
:headers="tabletTable.headersDetail"
:items="filteredTabletItems"
<%--:footer-props="footersDetail"--%>
<%--
:items="tabletTable.desserts"
--%>
:search="tabletTable.searchDetail"
:loading="tabletTable.Loading"
:options.sync="tabletsDetail" class="elevation-1" fixed-header height="350px">
@@ -2362,7 +2385,7 @@
</v-data-table>
</v-card>
</div>
</div>--%>
<div class="tab-pane fade" id="sec2-page5" role="tabpanel" aria-labelledby="sec2-tab5" >
<v-card class="mx-auto" outlined v-if="follower_id!=''">
<v-data-table class="elevation-1" fixed-header
@@ -2492,6 +2515,9 @@
</v-card>
</div>
<div class="tab-pane fade" id="sec2-page6" role="tabpanel" aria-labelledby="sec2-tab6" >
<%--<div v-html="externalHtml"></div>--%>
</div>
</div>
</asp:Panel>
+862
View File
@@ -0,0 +1,862 @@

<style>
/* ================= 基礎排版與重設 ================= */
.print-preview-app {
font-family: "Microsoft JhengHei", DFKai-sb, sans-serif;
margin: 0;
background: #f8f9fa;
display: flex;
gap: 24px;
height: 100vh;
overflow: hidden;
box-sizing: border-box;
padding: 24px;
}
#preview-container {
display: flex;
flex-grow: 1;
background: #e2e8f0;
padding: 32px;
overflow: auto;
position: relative;
border-radius: 12px;
justify-content: center;
align-items: flex-start;
}
#paper-preview {
background: #fff;
padding: 20mm;
box-sizing: border-box;
box-shadow: 0 10px 25px rgba(0, 0, 0, 0.08);
width: 210mm;
height: 297mm;
display: flex;
flex-direction: column;
position: relative;
transform-origin: top center;
}
.dual-editor-wrapper {
display: flex;
flex-direction: row-reverse;
width: 100%;
height: 100%;
gap: 40px;
justify-content: space-between;
}
.editor {
display: flex;
outline: none;
box-sizing: border-box;
border: 1px dashed #cbd5e1;
overflow: hidden;
width: 105mm;
height: 297mm;
position: relative;
background-size: 100% 100%;
}
.tablet-element {
cursor: pointer;
border: 1px solid transparent;
transition: border 0.2s;
}
.tablet-element:hover {
border: 1px dashed #94a3b8;
}
/* ================= 浮動選單樣式 ================= */
#line-floating-menu {
position: fixed;
background: rgba(255, 255, 255, 0.95);
backdrop-filter: blur(8px);
border: 1px solid #e2e8f0;
padding: 16px;
border-radius: 10px;
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1);
z-index: 99999;
display: flex;
flex-direction: column;
gap: 12px;
width: 30vw;
height: 80vh;
left: 50px;
top: 50px;
overflow: auto;
}
#line-floating-menu h4 {
margin: 0;
color: #4a5568;
font-size: 12px;
cursor: move;
background: #f8fafc;
padding: 8px;
border-radius: 6px;
text-align: center;
user-select: none;
border: 1px solid #edf2f7;
}
.control-group {
display: flex;
flex-direction: column;
gap: 8px;
font-size: 13px;
font-weight: 500;
color: #4a5568;
}
.adjust-row {
display: flex;
align-items: center;
gap: 8px;
}
.adjust-row button {
padding: 4px 12px;
border: 1px solid #e2e8f0;
background: #fff;
color: #4a5568;
cursor: pointer;
border-radius: 6px;
font-weight: 600;
}
.adjust-row button:hover {
background: #f1f5f9;
}
.adjust-row input[type="range"] {
flex-grow: 1;
padding: 0;
}
/* ================= 名單 UI 與排版樣式 ================= */
.item-list {
list-style: none;
padding: 0;
margin: 0;
max-height: 120px;
overflow-y: auto;
border: 1px solid #e2e8f0;
border-radius: 6px;
background: #fff;
}
.item-list li {
display: flex;
justify-content: space-between;
align-items: center;
padding: 4px 8px;
border-bottom: 1px solid #edf2f7;
font-size: 13px;
color: #4a5568;
}
.list-actions {
display: flex;
gap: 4px;
}
.list-actions button, .item-list button {
padding: 2px 6px;
background: #f8fafc;
border: 1px solid #cbd5e1;
border-radius: 4px;
cursor: pointer;
font-size: 12px;
color: #4a5568;
line-height: 1;
}
.list-actions button:hover, .item-list button:hover {
background: #e2e8f0;
}
/* 直書排版容器 */
.vertical-text {
writing-mode: vertical-rl;
text-orientation: mixed;
}
.nameList, .liveList {
writing-mode: vertical-rl;
display: flex;
flex-direction: row;
flex-wrap: wrap;
align-content: center;
align-items: center;
margin: auto;
border: 0px solid transparent;
}
.nameSpan, .liveSpan {
display: block;
line-height: 1.1;
text-align: justify;
text-align-last: justify;
text-justify: inter-character;
word-break: break-all;
white-space: pre-line;
}
/* 列印設定 */
@media print {
.print-preview-app {
padding: 0;
height: auto;
overflow: visible;
}
#line-floating-menu {
display: !important;
}
#preview-container {
background: #fff;
padding: 0;
margin: 0;
position: absolute;
left: 0;
top: 0;
}
#paper-preview {
width: 100% !important;
height: 100% !important;
box-shadow: none;
display: block !important;
padding-top: 30mm !important;
padding-right: 30mm !important;
padding-bottom: 0 !important;
padding-left: 0 !important;
border: none;
}
.editor {
height: auto !important;
max-height: 100% !important;
border: none;
}
.no-print {
display: none !important;
}
}
</style>
<!-- 頂端控制列 -->
<div class="row mt-2 no-print" style="padding: 0 24px; background: white; z-index: 10;">
<div class="col-3">
範本設定:
<select id="templateSel" class="form-select">
<option value="">請選擇範本</option>
</select>
</div>
<div class="col-3">
範本名稱:
<input type="text" id="template_name_txt" class="form-control" placeholder="" />
</div>
<div class="col-2 d-flex align-items-end gap-2">
<button class="btn btn-outline-secondary" id="btn_new_template">新增範本</button>
<button class="btn btn-primary" id="btn_save">儲存範本</button>
</div>
<div class="col-4">
<div style="display: flex; align-items: center; padding: 8px; background-color: #f5f5f5; border-radius: 4px;">
<span style="margin-right: 8px; cursor:pointer;" id="zoomOut">➖</span>
<input type="range" id="scaleSlider" min="0.0" max="1.0" step="0.05" value="0.5" style="flex-grow: 1; cursor: pointer;">
<span style="margin-left: 8px; cursor:pointer;" id="zoomIn">➕</span>
<span id="scaleSize" style="margin-left: 12px; min-width: 45px; font-weight: bold; font-size: 14px; text-align: right;">50%</span>
</div>
</div>
</div>
<div class="print-preview-app">
<div id="preview-container">
<div id="paper-preview" style="transform: scale(0.5);">
<div class="dual-editor-wrapper">
<div id="editor-right" class="editor"></div>
<div id="editor-left" class="editor printArea"></div>
</div>
</div>
<!-- 浮動設定面板 -->
<div id="line-floating-menu" class="no-print" style="display: ;">
<h4 id="menu-header">✥ 拖拉此處移動面板</h4>
<div class="control-group">
<label>版型設定</label>
<div class="adjust-row">
<select class="styleSelector" style="width: 100%; padding: 6px; font-size: 13px; border: 1px solid #e2e8f0; border-radius: 6px; outline: none; background-color: #f8fafc;">
<option value="">請選擇版型</option>
</select>
</div>
</div>
<hr style="margin: 15px 0;">
<div class="control-group">
<label style="color:#d63031; font-weight:bold;" id="current-edit-label">目前編輯:請點擊牌位區塊</label>
</div>
<div class="control-group" style="height:50%;">
<label>已選</label>
<div class="adjust-row">
<input type="text" id="custom_txt" placeholder="請輸入名稱" style="padding:4px; font-size:12px; width: 100%;">
<button id="btn_add_custom" style="width: 32px; padding: 4px;">+</button>
</div>
<ul id="selectedItem" class="item-list"></ul>
</div>
<div class="control-group" style="height:50%;">
<label>可選</label>
<input type="text" id="filter_txt" placeholder="篩選條件..." style="padding:4px; font-size:12px;">
<ul id="canselectItem" class="item-list"></ul>
</div>
</div>
</div>
</div>
<script>
const designer = {
zoomScale: 0.5,
familyMembers: [],
allStyle: [],
papers: [],
follower_id: "",
// 動態名單資料
properTitle: [],
leftProperTitle: [],
rightProperTitle: [],
alive: [],
address: "",
shuwenList: [],
selectedElement: null,
selectStyle: "",
tabletTempNameList: [],
selectedTemplate: {},
bg: [
{ name: "超薦1", path: "../print/html/tablet-1_new.svg" },
{ name: "超薦2", path: "../print/html/tablet-1B_new.svg" },
{ name: "消災1", path: "../print/html/tablet-2.svg" },
{ name: "消災2", path: "../print/html/tablet-2B.svg" },
{ name: "消災3", path: "../print/html/tablet-2C.svg" },
{ name: "消災4", path: "../print/html/tablet-2D.svg" }
],
async init() {
this.follower_id = typeof VueApp !== 'undefined' ? VueApp.follower_id : "";
this.bindZoom();
this.bindFloatingMenu();
this.bindListEvents();
await Promise.all([
this.getTabletStyles(),
this.getFamilies(),
this.getTemplateNameList(),
this.getData()
]);
},
// ================= 1. API 資料撈取 =================
async getFamilies() {
let res = await axios.post('/api/follower/GetFollowerFamilies', { num: this.follower_id });
if (res.status === 200 && res.data.list) this.familyMembers = res.data.list;
},
async getTabletStyles() {
let res = await axios.post('/api/tablet/GetTabletStyleList', {});
if (res.status === 200 && res.data.list) {
this.allStyle = res.data.list.filter(x => x.styleID !== "000001");
$('.styleSelector').empty().append('<option value="">請選擇版型</option>');
this.allStyle.forEach(x => $('.styleSelector').append(`<option value="${x.styleID}">${x.name}</option>`));
this.papers = res.data.papers || [];
}
},
async getData() {
this.properTitle = []; this.leftProperTitle = []; this.rightProperTitle = []; this.alive = [];
// 參數建議統一為 num 或 follower_num,依您後端 API 實際定義為主
let res = await axios.post('/api/follower/GetTabletTemplateList', { num: this.follower_id });
// 🌟 修正:確保 res.data.list 存在,再對其進行 forEach
if (res.status === 200 && res.data.list) {
res.data.list.forEach(x => {
if (x.style_id) {
this.selectStyle = x.style_id;
$(".styleSelector").val(x.style_id);
}
if (x.tablet) {
let tablet = JSON.parse(x.tablet);
if (tablet.mid_items) this.properTitle = tablet.mid_items;
if (tablet.left_items) this.alive = tablet.left_items;
if (tablet.mid_left) this.leftProperTitle = tablet.mid_left;
if (tablet.mid_right) this.rightProperTitle = tablet.mid_right;
this.address = tablet.addr_items || x.address || "";
}
});
this.renderEditorLeft();
this.renderEditorRight();
}
},
async getTemplateNameList() {
$("#templateSel").empty().append('<option value="">請選擇範本</option>');
this.tabletTempNameList = [];
let res = await axios.post('/api/follower/GetTabletTemplateList', { num: this.follower_id });
if (res.status === 200 && res.data.list) {
this.tabletTempNameList = res.data.list;
this.tabletTempNameList.forEach(x => $('#templateSel').append(`<option value="${x.num}">${x.name}</option>`));
}
},
// ================= 2. 動態渲染排版 =================
// 🌟 輔助函式:統一萃取名稱,避免重複寫 if-else
getExtractedNames(arr) {
if (!arr || arr.length === 0) return ["請選擇"];
return arr.map(x => typeof x === 'string' ? x : x.fam_name);
},
// 🌟 輔助函式:統一根據 elementID 產生對應 HTML,解決 renderEditorLeft 與 rerenderPart 的冗餘
generateElementHtml(d) {
let pTitleNames = this.getExtractedNames(this.properTitle);
let aliveNames = this.getExtractedNames(this.alive);
let leftNames = this.getExtractedNames(this.leftProperTitle);
let rightNames = this.getExtractedNames(this.rightProperTitle);
let addressStr = typeof this.address === 'string' ? this.address : (this.address ? this.address.fam_name : "");
if (!addressStr) addressStr = "請選擇";
if (d.elementID === 'title1') return this.buildNameList(pTitleNames, d);
if (d.elementID === 'titletriangle') return this.buildRosterList(pTitleNames, d);
if (d.elementID === 'combined' || d.elementID === 'tricombined') return this.buildCombinedList(pTitleNames, d);
if (d.elementID === 'alive') return this.buildLiveList(aliveNames, d);
if (d.elementID === 'lefttitle') return this.buildNormalWithSpace(leftNames, d, 'lefttitle');
if (d.elementID === 'righttitle') return this.buildNormalWithSpace(rightNames, d, 'righttitle');
if (d.elementID === 'address') return `<div class='address' style='width:${d.width}px; height:${d.height}px; font-size:${d.fontSize}px; font-family:${d.fontFamily};'>${addressStr}</div>`;
return "";
},
renderEditorLeft() {
$('#editor-left').empty();
let style = this.allStyle.find(y => y.styleID == this.selectStyle);
if (!style) return;
let size = this.papers.find(y => y.paperID == style.paperSize);
let printSize = this.papers.find(y => y.paperID == style.printSize);
let img = this.bg.find(y => y.name == style.backendImg);
$('#paper-preview').css({ width: (Number(printSize.width) * 2) + 'mm', height: (Number(printSize.height) + 20) + 'mm' });
$('#editor-left').css({ width: Number(size.width) + 'mm', height: Number(size.height) + 'mm', backgroundImage: `url(${img.path})` });
$('#editor-right').css({ width: '297mm', height: Number(size.height) + 'mm' });
(style.details || []).forEach(d => {
if (d.isActive !== "hidden") {
let html = this.generateElementHtml(d);
if (html) {
let wrapper = $(`<div class="tablet-element vertical-text"></div>`).css({
position: 'absolute', left: d.startX + 'mm', top: d.startY + 'mm',
fontFamily: d.fontFamily, fontWeight: 'bold', zIndex: 9999, visibility: d.isActive
}).html(html);
$('#editor-left').append(wrapper);
}
}
});
},
rerenderPart() {
if (!this.selectedElement) return;
let target = this.selectedElement.children().first();
let style = this.allStyle.find(y => y.styleID == this.selectStyle);
if (!style) return;
let d = (style.details || []).find(y => (
(target.hasClass("nameList") && y.elementID == "title1") ||
(target.hasClass("rosterList") && y.elementID == "titletriangle") ||
(target.hasClass("ancestor-wrapper") && (y.elementID == "combined" || y.elementID == "tricombined")) ||
(target.hasClass("liveList") && y.elementID == "alive") ||
(target.hasClass("lefttitle") && y.elementID == "lefttitle") ||
(target.hasClass("righttitle") && y.elementID == "righttitle") ||
(target.hasClass("address") && y.elementID == "address")
));
if (!d) return;
this.selectedElement.empty();
this.selectedElement.append(this.generateElementHtml(d));
},
renderEditorRight() {
let $editorRight = $('#editor-right').empty();
$editorRight.css({ "writing-mode": "vertical-rl", "text-orientation": "mixed", "padding": "40px 20px 20px 20px", "display": "block" });
this.shuwenList.forEach((name, idx) => {
if (!name || name === "請選擇") return;
let $div = $('<div></div>').css({
"font-size": "16pt", "font-family": "DFKai-sb", "line-height": "1.2", "letter-spacing": "2px",
"white-space": "pre-line", "margin-left": "25px", "position": "relative"
}).text(name);
let $controls = $(`
<div class="no-print" style="position: absolute; top: -30px; left: 50%; transform: translateX(-50%); writing-mode: horizontal-tb; display: flex; gap: 4px; z-index: 10;">
<button class="btn-shuwen-up" data-idx="${idx}" style="padding: 0 4px; font-size: 12px; cursor: pointer; border: 1px solid #ccc; border-radius: 4px; background: #fff;" title="往右移">↑</button>
<button class="btn-shuwen-down" data-idx="${idx}" style="padding: 0 4px; font-size: 12px; cursor: pointer; border: 1px solid #ccc; border-radius: 4px; background: #fff;" title="往左移">↓</button>
</div>
`);
$div.append($controls);
$editorRight.append($div);
});
$editorRight.off('click', '.btn-shuwen-up').on('click', '.btn-shuwen-up', (e) => {
e.preventDefault(); let idx = $(e.currentTarget).data('idx');
if (idx > 0) { [this.shuwenList[idx - 1], this.shuwenList[idx]] = [this.shuwenList[idx], this.shuwenList[idx - 1]]; this.renderEditorRight(); }
});
$editorRight.off('click', '.btn-shuwen-down').on('click', '.btn-shuwen-down', (e) => {
e.preventDefault(); let idx = $(e.currentTarget).data('idx');
if (idx < this.shuwenList.length - 1) { [this.shuwenList[idx], this.shuwenList[idx + 1]] = [this.shuwenList[idx + 1], this.shuwenList[idx]]; this.renderEditorRight(); }
});
},
// ================= 3. 排版引擎 =================
buildNameList(names, d) {
let w = parseFloat(d.width), h = parseFloat(d.height), th = parseFloat(d.textHeight) || h;
let v_gap = parseFloat(d.textSpan) || 0, h_gap = 5;
let shrinkLimit = (h < 500) ? 8 : ((h < 300) ? 12 : 6);
let long_s = parseFloat(d.fontSize), short_s = parseFloat(d.fontSize);
let testNames = [...names];
if (h<500&&testNames.length === 1 && testNames[0].includes("暨無始劫以來累世冤親債主")) testNames[0] = testNames[0].split("暨")[0] + "暨";
let items = testNames.map((name, i) => {
let l = name.length, isShort = (testNames.length > 1) && ((l * 40) <= (th + (v_gap / 2)));
return { name: names[i], l: l, isShort: isShort, isMulti: false, size: 0 };
});
let max_short_effective = shrinkLimit, min_long_limit = parseFloat(d.fontSize);
items.forEach(item => {
if (item.isShort) { let ms = Math.floor(th / (item.l * 1.333)); if (ms > max_short_effective) max_short_effective = ms; }
else { let mh = Math.floor((h - 10) / (item.l * 1.333)); if (mh < min_long_limit) min_long_limit = mh; }
});
if (short_s > max_short_effective) short_s = max_short_effective;
if (long_s > min_long_limit) long_s = min_long_limit;
let sizes = [], shrink_turn = 'long';
while (true) {
let totalWidth = 0, current_col_h = 0, current_col_w = 0, cols_width = [], any_wrapped = false;
for (let i = 0; i < items.length; i++) {
let item = items[i], s = item.isShort ? short_s : long_s;
if (item.isShort) { let ms = Math.floor(th / (item.l * 1.333)); if (s > ms) s = ms; }
item.size = s; let size_px = s * 1.333;
if (item.isShort) {
let item_h = Math.max(th, item.l * size_px);
if (current_col_h === 0) { current_col_h = item_h; current_col_w = size_px; }
else if ((current_col_h + v_gap + item_h) <= h) { current_col_h += (v_gap + item_h); if (size_px > current_col_w) current_col_w = size_px; }
else { cols_width.push(current_col_w); current_col_h = item_h; current_col_w = size_px; }
} else {
if (current_col_h > 0) { cols_width.push(current_col_w); current_col_h = 0; current_col_w = 0; }
let item_w = size_px;
if ((item.l * size_px) > (h - 10)) {
item.isMulti = true; any_wrapped = true;
item_w = Math.ceil(item.l / Math.max(1, Math.floor((h - 10) / size_px))) * (size_px * 1.1);
} else { item.isMulti = false; }
cols_width.push(item_w);
}
}
if (current_col_h > 0) cols_width.push(current_col_w);
totalWidth = cols_width.reduce((a, b) => a + b, 0) + (cols_width.length > 1 ? (cols_width.length - 1) * h_gap : 0);
if (totalWidth <= w && (!any_wrapped || long_s === shrinkLimit)) {
sizes = items.map(x => { let fs = x.size; if (x.isShort) { let ms = Math.floor(th / (x.l * 1.333)); if (fs > ms) fs = ms; } return { name: x.name, size: fs, isMulti: x.isMulti, isShort: x.isShort }; });
break;
}
if (any_wrapped && long_s > shrinkLimit) long_s--;
else {
let hasLong = items.some(x => !x.isShort), hasShort = items.some(x => x.isShort);
if (hasLong && hasShort) { if (shrink_turn === 'long') { if (long_s > shrinkLimit) { long_s--; shrink_turn = 'short'; } else if (short_s > shrinkLimit) { short_s--; shrink_turn = 'long'; } else break; } else { if (short_s > shrinkLimit) { short_s--; shrink_turn = 'long'; } else if (long_s > shrinkLimit) { long_s--; shrink_turn = 'short'; } else break; } }
else if (hasLong) { if (long_s > shrinkLimit) long_s--; else break; } else { if (short_s > shrinkLimit) short_s--; else break; }
}
}
if (sizes.length === 0) sizes = names.map(name => ({ name: name, size: shrinkLimit, isMulti: false, isShort: true }));
let $namelist = $(`<div class='nameList'></div>`).css({ width: `${w}px`, height: `${h}px`, "column-gap": `${v_gap}px` });
sizes.forEach(item => {
let minH = item.isShort ? `${th}px` : `${h}px`;
let alignStyle = item.isMulti || (!item.isMulti && !item.isShort) ? "start" : "justify";
$namelist.append($(`<span class="nameSpan" style="font-size: ${item.size}pt; min-height: ${minH}; max-height: ${h}px; text-align: ${alignStyle}; text-align-last: ${alignStyle}; margin-left: 5px;">${item.name}</span>`));
});
return $namelist;
},
buildLiveList(names, d) {
let w = parseFloat(d.width), h = parseFloat(d.height), th = parseFloat(d.textHeight) || h, v_gap = parseFloat(d.textSpan) || 0, h_gap = 5;
let shrinkLimit = (h < 300) ? 8 : ((h < 500) ? 6 : 4), s = parseFloat(d.fontSize);
while (s >= shrinkLimit) {
let size_px = s * 1.333, current_col_h = 0, current_col_w = 0, cols_width = [], any_wrapped = false;
for (let i = 0; i < names.length; i++) {
let l = names[i].length, item_h = Math.max(th, l * size_px);
if (item_h > (h - 5)) {
any_wrapped = true;
if (current_col_h > 0) { cols_width.push(current_col_w); current_col_h = 0; current_col_w = 0; }
cols_width.push(Math.ceil(l / Math.max(1, Math.floor((h - 5) / size_px))) * (size_px * 1.1));
} else {
if (current_col_h === 0) { current_col_h = item_h; current_col_w = size_px; }
else if (current_col_h + v_gap + item_h <= h) { current_col_h += v_gap + item_h; if (size_px > current_col_w) current_col_w = size_px; }
else { cols_width.push(current_col_w); current_col_h = item_h; current_col_w = size_px; }
}
}
if (current_col_h > 0) cols_width.push(current_col_w);
if ((cols_width.reduce((a, b) => a + b, 0) + (cols_width.length > 1 ? (cols_width.length - 1) * h_gap : 0)) <= w && (!any_wrapped || s === shrinkLimit)) break;
s -= 1;
}
if (s < shrinkLimit) s = shrinkLimit;
let $namelist = $(`<div class='liveList'></div>`).css({ width: `${w}px`, height: `${h}px`, "column-gap": `${v_gap}px` });
names.forEach(name => $namelist.append($(`<span class="liveSpan" style="font-size: ${s}pt; min-height: ${th}px; max-height: ${h}px; margin-left: 0px;">${name}</span>`)));
return $namelist;
},
buildRosterList(names, d) {
const mid = names.length === 1 ? 1 : Math.floor(names.length / 2);
const top = names.slice(0, mid), bot = names.slice(mid);
let baseSize = parseFloat(d.fontSize), maxLen = Math.max(...names.map(n => n.length), 0);
let finalSize = maxLen > 5 ? Math.max(baseSize * (5 / maxLen), baseSize * 0.6) : baseSize;
let $wrapper = $(`<div class="rosterList"></div>`).css({ width: `${d.width}px`, height: `${d.height}px`, "writing-mode": "vertical-rl", "display": "flex", "flex-direction": "row", "align-items": "center", "justify-content": "start", "gap": "20px" });
let renderGroup = (items) => {
let $g = $(`<div class="rosterspan"></div>`).css({ "display": "flex", "flex-direction": "column", "justify-content": "center", "height": (parseFloat(d.textHeight) || parseFloat(d.height)) + 'px', "white-space": "pre-line" });
items.forEach(x => $g.append($(`<div style="letter-spacing: 10px; text-align: justify; text-align-last: justify; font-size: ${finalSize}px; font-family: ${d.fontFamily};">${x}</div>`)));
return $g;
};
$wrapper.append(renderGroup(top));
if (bot.length) $wrapper.append(renderGroup(bot));
return $wrapper;
},
buildCombinedList(names, d) {
let baseFontSize = parseFloat(d.fontSize), parts = names.join("\n").split('\n');
return $(`
<div class="ancestor-wrapper" style="width:${d.width}px !important; height:${d.height}px !important; display: flex; flex-direction: column; align-items: center; justify-content: flex-start; writing-mode: horizontal-tb; font-family: ${d.fontFamily};">
<span class="main-name" style="line-height: 1.2; font-size: ${baseFontSize}px;">${parts[0] || ''}</span>
<span class="sub-text" style="font-size: ${baseFontSize}px; line-height: 1.2; margin-top: 4px; white-space: normal; writing-mode: vertical-rl;">${parts[1] || ''}</span>
</div>`);
},
buildNormalWithSpace(names, d, className) {
let $div = $(`<div class='${className}'></div>`).css({ "width": `${d.width}px`, "height": `${d.height}px`, "writing-mode": "vertical-rl", "display": "flex", "flex-direction": "row", "flex-wrap": "wrap", "column-gap": `${d.textSpan || 0}px`, "align-items": "flex-start", "justify-content": "start", "font-size": `${d.fontSize}px`, "font-family": d.fontFamily });
names.forEach(x => $div.append($(`<div>${x}</div>`).css({ "margin-bottom": "10px", "margin-left": "5px", "text-justify": "inter-character", "white-space": "pre-line" })));
return $div;
},
// ================= 4. UI 互動與事件綁定 =================
bindZoom() {
let updateZoom = () => { $('#scaleSize').html(Math.floor(this.zoomScale * 100) + "%"); $('#scaleSlider').val(this.zoomScale); $('#paper-preview').css("transform", `scale(${this.zoomScale})`); };
$('#scaleSlider').on("input", e => { this.zoomScale = parseFloat($(e.target).val()); updateZoom(); });
$('#zoomOut').on("click", () => { this.zoomScale = Math.max(0.1, this.zoomScale - 0.05); updateZoom(); });
$('#zoomIn').on("click", () => { this.zoomScale = Math.min(2.0, this.zoomScale + 0.05); updateZoom(); });
},
bindFloatingMenu() {
let isDragging = false, startX = 0, startY = 0;
$('#menu-header').on('mousedown', e => { isDragging = true; startX = e.clientX - $('#line-floating-menu').offset().left; startY = e.clientY - $('#line-floating-menu').offset().top; });
$(document).on('mousemove', e => { if (isDragging) $('#line-floating-menu').css({ left: (e.clientX - startX) + 'px', top: (e.clientY - startY) + 'px', bottom: 'auto' }); }).on('mouseup', () => isDragging = false);
$('#preview-container').on('click', e => {
if (e.target.id === 'preview-container' || e.target.id === 'paper-preview') {
$('#line-floating-menu').hide();
$('#editor-left .tablet-element').css('border', '1px solid transparent');
this.selectedElement = null;
}
});
$('#editor-left').on('click', '.tablet-element', e => {
e.preventDefault(); e.stopPropagation();
this.selectedElement = $(e.currentTarget);
$('#editor-left .tablet-element').css('border', '1px solid transparent');
this.selectedElement.css('border', '1px dashed #ff7675');
this.renderItemMenu(this.selectedElement.children().first());
$('#line-floating-menu').show();
});
$('input[type="range"]').on('input', e => {
let val = parseInt($(e.target).val()); $('#lbl-fontSize').text(val);
if (this.selectedElement) {
let target = this.selectedElement.children().first();
let style = this.allStyle.find(y => y.styleID == this.selectStyle);
if (!style) return;
let d = (style.details || []).find(y => (target.hasClass("nameList") && y.elementID == "title1") || (target.hasClass("liveList") && y.elementID == "alive"));
if (d) { d.fontSize = val; this.rerenderPart(); }
}
});
},
renderItemMenu(element) {
$("#selectedItem").empty(); $("#canselectItem").empty();
let currentData = [], editLabel = "未定義區塊";
let isChaojian = (typeof VueApp !== 'undefined' && VueApp.item_type === 'B') || (this.allStyle.find(y => y.styleID == this.selectStyle)?.name || "").includes("超薦");
let requireDeceased = isChaojian;
if (element.hasClass("liveList")) { editLabel = "陽上"; currentData = this.alive; requireDeceased = false; }
else if (element.hasClass("nameList") || element.hasClass("rosterList") || element.hasClass("ancestor-wrapper")) { editLabel = "正名"; currentData = this.properTitle; }
else if (element.hasClass("lefttitle")) { editLabel = "左正名"; currentData = this.leftProperTitle; }
else if (element.hasClass("righttitle")) { editLabel = "右正名"; currentData = this.rightProperTitle; }
else if (element.hasClass("address")) { editLabel = "地址"; currentData = this.address ? [this.address] : []; }
$("#current-edit-label").text("目前編輯:" + editLabel);
currentData.forEach((item, index) => {
let displayName = typeof item === 'string' ? item : item.fam_name;
$("#selectedItem").append(`<li><span class="selected">${displayName}</span><div class="list-actions"><button class="itemUp" data-idx="${index}">↑</button><button class="itemDown" data-idx="${index}">↓</button><button class="itemRemove" data-idx="${index}">-</button></div></li>`);
});
if (element.hasClass("address")) { this.bindListEvents(); return; }
let currentNames = currentData.map(x => typeof x === 'string' ? x : x.fam_name);
let filterKeyword = $('#filter_txt').val().trim() || "";
this.familyMembers.forEach(f => {
let isDead = (f.deceased === true || f.deceased === "true" || f.deceased === "True");
if (isDead === requireDeceased && !currentNames.includes(f.fam_name) && f.fam_name.includes(filterKeyword)) {
$("#canselectItem").append(`<li><span style="opacity:0.5">卍</span> <span class="unselect">${f.fam_name}</span><span><i class="rounded-pill rounded-3 ${(f && f.fam_title) ? 'p-1' : ''}" style="background-color:lightgray">${f.fam_title ? f.fam_title : ""}</i></span><span class='itemAppend' style="float:right;cursor:pointer;">&#43;</span></li>`);
}
});
this.bindListEvents();
},
bindListEvents() {
let self = this;
$("#canselectItem").off("click", ".itemAppend").on("click", ".itemAppend", function (e) {
e.preventDefault(); let name = $(this).siblings(".unselect").text(); let fam = self.familyMembers.find(f => f.fam_name === name);
self.modifyDataAndRerender("add", { IsShuWen: false, deceased: fam ? (fam.deceased === true || fam.deceased === "True") : false, fam_gender: "", fam_name: name, fam_file: "", nospace: true, num: fam ? fam.num : 0, option_break: false });
});
$("#selectedItem").off("click", ".itemRemove").on("click", ".itemRemove", function (e) { e.preventDefault(); self.modifyDataAndRerender("remove", $(this).data("idx")); });
$("#selectedItem").off("click", ".itemUp").on("click", ".itemUp", function (e) { e.preventDefault(); self.modifyDataAndRerender("up", $(this).data("idx")); });
$("#selectedItem").off("click", ".itemDown").on("click", ".itemDown", function (e) { e.preventDefault(); self.modifyDataAndRerender("down", $(this).data("idx")); });
$('#btn_add_custom').off("click").on('click', function (e) {
e.preventDefault(); let val = $('#custom_txt').val().trim();
if (val) { self.modifyDataAndRerender("add", { IsShuWen: false, deceased: false, fam_gender: "", fam_name: val, fam_file: "", nospace: true, num: 0, option_break: false }); $('#custom_txt').val(''); }
});
$('#filter_txt').off("keyup").on('keyup', () => { if (this.selectedElement) this.renderItemMenu(this.selectedElement.children().first()); });
$('.styleSelector').off("change").on('change', (e) => {
this.selectStyle = $(e.target).val(); this.renderEditorLeft();
});
$('#templateSel').off('change').on('change', async (e) => {
let template_num = $(e.target).val();
if (!template_num) return;
try {
this.selectedTemplate = this.tabletTempNameList.find(x => x.num == template_num);
if (!this.selectedTemplate) return;
if (this.selectedTemplate.tablet) {
let tablet = JSON.parse(this.selectedTemplate.tablet);
this.properTitle = tablet.mid_items || []; this.alive = tablet.left_items || []; this.leftProperTitle = tablet.mid_left || []; this.rightProperTitle = tablet.mid_right || []; this.address = tablet.addr_items || "";
} else { this.properTitle = []; this.alive = []; this.leftProperTitle = []; this.rightProperTitle = []; this.address = ""; }
if (this.selectedTemplate.shuwen && this.selectedTemplate.shuwen !== "[]") this.shuwenList = JSON.parse(this.selectedTemplate.shuwen);
else this.shuwenList = [...this.getExtractedNames(this.properTitle), ...this.getExtractedNames(this.leftProperTitle), ...this.getExtractedNames(this.rightProperTitle)];
this.selectStyle = this.selectedTemplate.style_id; $('.styleSelector').val(this.selectStyle);
$('#template_name_txt').val(this.selectedTemplate.name || "");
this.renderEditorLeft(); this.renderEditorRight();
if (this.selectedElement) this.renderItemMenu(this.selectedElement.children().first());
} catch (error) { alert("範本載入失敗!資料格式可能有誤。"); }
});
$('#btn_save').off('click').on('click', async function (e) {
e.preventDefault();
let tablet = { mid_items: self.properTitle, left_items: self.alive, mid_left: self.leftProperTitle, mid_right: self.rightProperTitle, addr_items: self.address, style: self.selectStyle }
let thenum = $("#templateSel").val();
let data = { num: thenum == "" ? "0" : thenum, name: $("#template_name_txt").val(), follower_num: self.follower_id, style_id: $(".styleSelector").val(), tablet: JSON.stringify(tablet), shuwen: JSON.stringify(self.shuwenList) }
await axios.post('/api/follower/SaveTabletTemplate', data).then(res => {
if (res.status == 200) {
//alert("儲存成功!");
VueApp.snackbar.show = true;
VueApp.snackbar.message = "儲存成功";
self.getTemplateNameList();
// (可選) 如果您希望存檔後,下拉選單保持在剛存好的那個範本,
// 可以在這裡把 thenum 塞回去(前提是 API 有回傳新 ID 或原本就是更新舊檔)
if (thenum !== "") {
$("#templateSel").val(thenum);
}
} else {
VueApp.snackbar.show = true;
VueApp.snackbar.message = "儲存失敗";
};
});
});
// ==========================================
// 🌟 4. 新增範本按鈕事件 (清空所有資料)
// ==========================================
$('#btn_new_template').off('click').on('click', (e) => {
e.preventDefault();
// 1. 清空頂端的選單與名稱
$("#templateSel").val("");
$("#template_name_txt").val("");
// 2. 清空所有名單資料與狀態
this.selectedTemplate = {};
this.properTitle = [];
this.alive = [];
this.leftProperTitle = [];
this.rightProperTitle = [];
this.address = "";
this.shuwenList = [];
// 3. 重新渲染畫面 (這時會印出空的牌位區塊)
this.renderEditorLeft();
this.renderEditorRight();
// 4. 如果浮動選單目前開著,也要同步清空選單裡的「已選」清單
if (this.selectedElement) {
let target = this.selectedElement.children().first();
this.renderItemMenu(target);
}
});
},
modifyDataAndRerender(action, payload) {
if (!this.selectedElement) return;
let target = this.selectedElement.children().first(), targetArr = null;
if (target.hasClass("liveList")) targetArr = this.alive;
else if (target.hasClass("nameList") || target.hasClass("rosterList") || target.hasClass("ancestor-wrapper")) targetArr = this.properTitle;
else if (target.hasClass("lefttitle")) targetArr = this.leftProperTitle;
else if (target.hasClass("righttitle")) targetArr = this.rightProperTitle;
else if (target.hasClass("address")) {
if (action === "add") this.address = typeof payload === 'string' ? payload : payload.fam_name;
else if (action === "remove") this.address = ""; targetArr = null;
}
if (targetArr) {
if (action === "add") {
if (targetArr.some(x => x.fam_name === payload.fam_name)) { alert("名稱已存在!"); return; }
targetArr.push(payload);
if (targetArr !== this.alive && targetArr !== null) this.shuwenList.push(payload.fam_name);
} else if (action === "remove") {
if (targetArr !== this.alive && targetArr !== null) {
let nameToRemove = typeof targetArr[payload] === 'string' ? targetArr[payload] : targetArr[payload].fam_name;
let sIdx = this.shuwenList.indexOf(nameToRemove); if (sIdx > -1) this.shuwenList.splice(sIdx, 1);
}
targetArr.splice(payload, 1);
} else if (action === "up" && payload > 0) { [targetArr[payload - 1], targetArr[payload]] = [targetArr[payload], targetArr[payload - 1]]; }
else if (action === "down" && payload < targetArr.length - 1) { [targetArr[payload], targetArr[payload + 1]] = [targetArr[payload + 1], targetArr[payload]]; }
}
this.renderItemMenu(target); this.rerenderPart(); this.renderEditorRight();
}
};
$(() => { designer.init(); });
</script>
+155
View File
@@ -0,0 +1,155 @@
<%@ Page Title="" Language="C#" MasterPageFile="~/admin/Templates/TBS5ADM001/MasterPage.master" AutoEventWireup="true" CodeFile="company.aspx.cs" Inherits="admin_hrs_basic_company" %>
<asp:Content ID="Content1" ContentPlaceHolderID="page_header" Runat="Server">
<script src="/js/httpVueLoader.js"></script>
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="page_nav" Runat="Server">
<div class="mb-2 mb-sm-0">
<a class="btn btn-primary">
<i class="mdi mdi-plus"></i>新增
</a>
</div>
</asp:Content>
<asp:Content ID="Content3" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
<div id="content" class="container-fluid">
<v-data-table
v-model="data_table.selected"
:items="data_table.list"
:search-props="search"
item-key="order_no"
:options.sync="options"
:headers="data_table.header"
:footer-props="data_table.footer"
:server-items-length="data_table.count"
:loading="data_table.loading"
:single-select="data_table.singleSelect"
show-select
hide-default-footer
:page.sync="data_table.page"
:items-per-page.sync="data_table.pageSize"
class="elevation-1">
<template #item.slot_btn="{ item }">
<%-- <a :href="'reg.aspx?num='+item.num" class="btn btn-outline-secondary btn-sm"><i class="mdi mdi-pencil-box-outline"></i>修改</a>
<a @click="deleteItem(item)" class="btn btn-outline-secondary btn-sm"><i class="mdi mdi-trash-can"></i>刪除</a> --%>
</template>
</v-data-table>
<v-container>
<v-row class="align-baseline" wrap>
<v-col cols="12" md="9">
<v-pagination
v-model="data_table.page"
:length="pageCount">
</v-pagination>
</v-col>
<v-col class="text-truncate text-right" cols="12" md="2">
共 {{ data_table.count }} 筆, 頁數:
</v-col>
<v-col cols="6" md="1">
<v-text-field
v-model="data_table.page"
type="number"
hide-details
dense
min="1"
:max="pageCount"
@input="data_table.page = parseInt($event, 10)"
></v-text-field>
</v-col>
</v-row>
</v-container>
<v-dialog v-model="modify_dialog.show" class="modify_modal">
<template>
<keep-alive exclude="company_component" >
<component :is="currentView" :mode="modify_dialog.mode"></component>
</keep-alive>
</template>
</v-dialog>
</div>
</asp:Content>
<asp:Content ID="Content4" ContentPlaceHolderID="offCanvasRight" Runat="Server">
</asp:Content>
<asp:Content ID="Content5" ContentPlaceHolderID="footer_script" Runat="Server">
<script>
Vue.filter('timeString', function (value, myFormat) {
return value == null || value == "" ? "" : moment(value).format(myFormat || 'YYYY-MM-DD, HH:mm:ss');
});
let VueApp = new Vue({
el: '#app',
vuetify: new Vuetify(vuetify_options),
data() {
return {
options: { multiSort: false },
search_options: { multiSort: false },
data_table: {
loading: true,
list: [],
selected: [],
singleSelect: false,
count: 0,
page: 1,
pageSize: 10,
header: [
{ text: '分院代號', value: 'company_id' },
{ text: '名稱', value: 'name' },
{ text: '上層分院', value: 'parent_id' },
{ text: '負責人', value: 'super_visor', align: 'start' },
{ text: '聯絡人', value: 'contactor' },
{ text: '', value: 'slot_btn', sortable: false, align: 'end' }
],
footer: {
showFirstLastPage: true,
itemsPerPageOptions: [5, 10, 20, 30],
},
},
modify_dialog: {
show: false,
mode:'view'
},
currentView:'company-component',
search: {}
}
},
components: {
'company-component': httpVueLoader('./company.vue'),
},
mounted() {
this.getData()
},
methods: {
getData(clearpage = false) {
const { sortBy, sortDesc, page, itemsPerPage } = this.options
const params = {
sortBy: sortBy[0], sortDesc: sortDesc[0],
page: clearpage ? '1' : page, pageSize: itemsPerPage
};
this.data_table.loading = true
axios
.post(HTTP_HOST + 'api/hrs/basic/GetCompanys', this.search, { params: params })
.then(response => {
this.data_table.list = response.data.list
this.data_table.count = response.data.count;
this.data_table.loading = false
//const dataToStore = JSON.stringify(this.data_table);
//sessionStorage.setItem("order_list_cache", dataToStore);
})
.catch(error => console.log(error))
}
},
computed: {
pageCount() {
return Math.ceil(this.data_table.count / this.data_table.pageSize)
},
}
});
</script>
</asp:Content>
+15
View File
@@ -0,0 +1,15 @@
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_hrs_basic_company : MyWeb.config
{
private Model.ezEntities _db = new Model.ezEntities();
protected void Page_Load(object sender, EventArgs e)
{
}
}
+229 -59
View File
@@ -11,9 +11,11 @@
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server">
<div class="d-flex overflow-hidden" style="height:1920px">
<div class="p-2 bg-dark text-white floting-box" style="width: 250px; left: 20px; top: 80px;">
<h6 class="border-bottom pb-2">設計工具箱</h6>
<div class="input-group mb-3">
<button class="btn btn-outline-secondary dropdown-toggle" type="button"
@@ -22,15 +24,43 @@
<ul class="dropdown-menu style-menu">
<%--<li><span class="dropdown-item" data-value="">選擇版型</span></li>--%>
</ul>
<input type="text" id="styleName" class="form-control" aria-label="版型名稱">
</div>
<div class="input-group mb-3">
<div class="row">
<div class="col-2">
<a class="" style="cursor:pointer;text-decoration: none;color:white;width:30px;height:30px;font-size:30px;"
title="增加版型" onclick="Designer.styleID='000001';Designer.changeStyle('000001')">+</a></div>
<div class="col-8"> <input type="text" id="styleName" class="form-control" aria-label="版型名稱"></div>
<div class="col-2">
<a class="" style="cursor:pointer;text-decoration: none;color:white;width:30px;height:30px;font-size:30px;"
title="刪除版型" onclick="Designer.removeStyle()">-</a></div>
</div>
</div>
<div class="form-floating mb-3">
<select class="form-select form-select-sm mb-2 " onchange="Designer.changePaper()" id="paperSize">
<option value="">請選擇</option>
</select>
<label for="paperSize" style="color: black">尺寸</label>
</div>
<div class="row">
<div class="col-2">
<a class="" style="cursor:pointer;text-decoration: none;color:white;width:30px;height:30px;font-size:30px;"
title="增加尺寸" onclick="Designer.changePaper1('newsize')">+</a>
</div>
<div class="col-8">
<div class="form-floating mb-3">
<select class="form-select form-select-sm mb-2 " onchange="Designer.changePaper()" id="paperSize">
<option value="">請選擇</option>
</select>
<label for="paperSize" style="color: black">內容尺寸</label>
</div>
</div>
<div class="col-2">
<a class="" style="cursor:pointer;text-decoration: none;color:white;width:30px;height:30px;font-size:30px;"
title="刪除尺寸" onclick="Designer.removePaper()">-</a>
</div>
</div>
<div id="sizeDiv" style="display: none;">
<div class="form-floating mb-3">
<input type="text" class="form-control form-select-sm mb-2 " id="paperName" />
@@ -52,14 +82,14 @@
<span class="btn btn-info" onclick="Designer.savePaperSize()">儲存</span>
</div>
</div>
<div id="paperOrientation" onclick="Designer.changeOrientation()" class="mb-2">
<%-- <div id="paperOrientation" onclick="Designer.changeOrientation()" class="mb-2">
<span></span>
</div>
</div>--%>
<div>
<ul class="navbar-nav">
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" aria-expanded="false">顯示物件
</a>
<a class="nav-link dropdown-toggle" href="#" role="button"
data-bs-toggle="dropdown" aria-expanded="false">選擇牌位顯示項目</a>
<ul class="dropdown-menu">
<li><span class="btn btn-sm btn-outline-light w-100 mb-2 dropdown-item" onclick="Designer.displayItem('address')">地址欄</span></li>
<li><span class="btn btn-sm btn-outline-light w-100 mb-2 dropdown-item" onclick="Designer.displayItem('title1')">牌位正名</span></li>
@@ -93,14 +123,14 @@
</select>
<label for="printSize" style="color: black">列印尺寸</label>
</div>
<%--<div class="form-floating mb-3">
<div class="form-floating mb-3">
<select class="form-select form-select-sm mb-2 " onchange="Designer.changePrintMode()" id="printMode">
<option value="">請選擇</option>
<option value="combine">合併</option>
<option value="origin">原尺寸</option>
</select>
<label for="printMode" style="color: black">列印模式</label>
</div>--%>
</div>
<%-- <div class="form-floating mb-3">
<input type="number" id="rosterLimit" onchange="Designer.changeRosterLimit()" class="form-control form-control-sm mb-2">
<label class="small" for="rosterLimit" style="color: black;">正名上限</label>
@@ -207,6 +237,14 @@
</div>
</div>
</div>
<div class="row">
<div class="col-6">
<div class="form-floating mb-3">
<input type="number" id="textSpan" class="form-control form-control-sm mb-2">
<label class="small" for="textSpan">文字間距</label>
</div>
</div>
</div>
</div>
</div>
@@ -224,11 +262,15 @@
</div>
</div>
</asp:Content>
<asp:Content ID="Content4" ContentPlaceHolderID="footer_script" runat="Server">
<script>
const Designer = {
vuetify: new Vuetify(vuetify_options),
tab: "疏文",
elements: [],
activeId: null,
styleID: null,
@@ -240,7 +282,9 @@
{ name: "超薦1", path: "../../admin/print/html/tablet-1_new.svg" },
{ name: "超薦2", path: "../../admin/print/html/tablet-1B_new.svg" },
{ name: "消災1", path: "../../admin/print/html/tablet-2.svg" },
{ name: "消災2", path: "../../admin/print/html/tablet-2B.svg" }
{ name: "消災2", path: "../../admin/print/html/tablet-2B.svg" },
{ name: "消災3", path: "../../admin/print/html/tablet-2C.svg" },
{ name: "消災4", path: "../../admin/print/html/tablet-2D.svg" }
],
allStyle: [
],
@@ -259,7 +303,7 @@
this.bg.forEach(x => {
$("#backendInp").append("<option value='" + x.name + "'>" + x.name + "</option>")
});
$("#paperOrientation").html("<span>直向</span>")
//$("#paperOrientation").html("<span>直向</span>")
this.toast = new bootstrap.Toast($('#liveToast'));
},
print() {
@@ -440,6 +484,9 @@
},
async getPaperSize() {
let self = this
self.allSize.length = 0;
$("#paperSize").html("")
$("#printSize").html("")
await axios
.post(HTTP_HOST + 'api/tablet/GetPaperSize', {})
.then(response => {
@@ -464,9 +511,11 @@
await axios
.post(HTTP_HOST + 'api/tablet/GetTabletElement', {})
.then(response => {
//console.log(response)
//if (response.result=="Y") {
if (response.status == "200") {
let data = response.data;
//console.log("data:",data)
if (data.result == "Y") {
data.data.forEach(x => {
self.tabletElements.push(x);
@@ -476,6 +525,9 @@
});
},
async getStyles() {
let self = this
self.allSize.length = 0
$(".style-menu").html("")
await axios
.post(HTTP_HOST + 'api/tablet/GetStyleData', {})
.then(response => {
@@ -484,7 +536,7 @@
let data = response.data;
if (data.result == "Y") {
data.data.forEach(x => {
this.allStyle.push(x);
self.allStyle.push(x);
$(".style-menu").append("<li><span class='dropdown-item style-item' data-value='" + x.styleID + "'>" + x.name + "</span></li>");
});
@@ -504,7 +556,7 @@
self.changeStyle(e.target.getAttribute("data-value"));
let style = self.allStyle.find(x => x.styleID == e.target.getAttribute("data-value"));
if (style) {
let size = self.allSize.find(x => x.name == style.paperSize);
let size = self.allSize.find(x => x.id == style.paperSize);
if (size) {
self.paper.width = size.width;
self.paper.height = size.height;
@@ -571,7 +623,8 @@
textWidth: el.textWidth,
textHeight: el.textHeight,
breakLen: el.breakLen,
backendInp: el.backendImg
backendInp: el.backendImg,
textSpan:el.textSpan
};
obj.push(config)
@@ -597,6 +650,10 @@
el.y = $("#yPosition").val();
$(`.tablet-element[id="${this.activeId}"]`).css({ left: el.x + "mm", top: el.y + "mm" });
},
changePaper1(val) {
$("#paperSize").val(val)
this.changePaper()
},
changePaper() {
let paperSize = $("#paperSize").val()
let self = this;
@@ -613,13 +670,69 @@
});
}
},
async removePaper() {
let self = this;
let paperSize = $("#paperSize").val()
//console.log("paperSize:",paperSize);
if (paperSize == "newsize" || paperSize == "" || paperSize == null || paperSize==undefined) {
$("#toast_body").html("請選擇要刪除的尺寸")
self.toast.show();
return false
}
let ps = { paperSize: paperSize }
await axios
.post(HTTP_HOST + 'api/tablet/DelPaperSize', ps)
.then(response => {
if (response.status == "200") {
//if (response.data.result == "Y") {
$("#toast_body").html(`${response.data.message}`)
self.toast.show();
//}
if (response.data.result == "Y") {
self.getPaperSize()
$("#paperSize").val("")
this.changePaper()
}
}
});
},
async removeStyle() {
let self = this;
let sID = this.styleID
//console.log("styleID:", sID);
if (sID == "000001" || sID == null || sID == undefined) {
$("#toast_body").html("請選擇要刪除的版型")
self.toast.show();
return false
}
let ps = { styleID: sID }
await axios
.post(HTTP_HOST + 'api/tablet/DelTabletStyle', ps)
.then(response => {
if (response.status == "200") {
//if (response.data.result == "Y") {
$("#toast_body").html(`${response.data.message}`)
self.toast.show();
//}
if (response.data.result == "Y") {
self.getStyles()
}
}
});
},
async savePaperSize() {
let ps = {
paperName: $("#paperName").val(),
width: $("#paperWidth").val(),
height: $("#paperHeight").val()
}
console.log(ps);
let self = this;
//console.log(ps);
await axios
.post(HTTP_HOST + 'api/tablet/SavePaperSize', ps)
.then(response => {
@@ -628,6 +741,9 @@
$("#toast_body").html(`${"ok"}`)
self.toast.show();
self.getPaperSize()
$("#paperSize").val("")
self.changePaper()
}
}
});
@@ -642,7 +758,7 @@
bindEvents() {
// 文字變更連動渲染
//$('#rosterLimit').on('input', (e) =>this.)
console.log("OOQ");
//console.log("OOQ");
$('#inp-text').on('input', (e) => this.updateActive('text', $(e.target).val()));
$('#inp-size').on('input', (e) => this.updateActive('fontSize', $(e.target).val()));
$('#width').on('input', (e) => this.updateActive('width', $(e.target).val()))
@@ -654,6 +770,7 @@
$('#height').on('input', (e) => this.updateActive('height', $(e.target).val()))
$('#textWidth').on('input', (e) => this.updateActive('textWidth', $(e.target).val()))
$('#textHeight').on('input', (e) => this.updateActive('textHeight', $(e.target).val()))
$('#textSpan').on('input', (e) => this.updateActive('textSpan', $(e.target).val()))
$(document).on('mousedown', '.tablet-element', (e) => {
e.stopPropagation();
this.select($(e.currentTarget).attr('id'));
@@ -709,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') {
@@ -726,11 +852,27 @@
html = el.text.replace(/(\d+)/g, '<span class="tate-chu-yoko">$1</span>');
}
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;
@@ -738,12 +880,12 @@
return $(`<div class="tablet-element vertical-text ${this.activeId === el.id ? 'selected' : ''}" id="${el.id}"></div>`)
.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 = $(`<div class='nameList'></div>`).css({
"writing-mode": "vertical rl",
display: "flex",
@@ -755,32 +897,33 @@
border: "0px solid #ccc",
padding: "1px",
"font-family": el.fontFamily,
"letter-spacing": "0.1em",
"column-gap": "1px",
"row-gap": "1px",
//"letter-spacing": `${el.textSpan}px`,
"column-gap": `${el.textSpan}px`,
"align-items": "center",
});
//
//"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 $(`<span>${name}</span>`).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",
"margin-bottom": "40px",
"margin-left": "5px",
"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 = $(`<div class='liveList'></div>`).css({
"writing-mode": "vertical rl",
@@ -793,31 +936,31 @@
border: "0px solid #ccc",
padding: "1px",
"font-family": "BiauKai",
"letter-spacing": "0.1em",
"column-gap": "1px",
"row-gap": "1px",
//"letter-spacing": `${el.textSpan}px`,
"column-gap": `${el.textSpan}px`,
"align-items": "center",
});
// "column-gap": `${el.textSpan}px`,
//"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 $(`<span>${name}</span>`).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",
"margin-bottom": "15px",
"margin-left": "5px",
"text-justify": "inter-character",
});
});//"margin-bottom": `${el.textSpan}px`,
},
// 品字佈局邏輯:一上二下
renderRoster(names, el) {
@@ -836,7 +979,7 @@
"flex-direction": "row", /* 上下分層 (Top / Bottom) */
"align-items": "center", /* 左右置中對齊 */
"justify-content": "start",
gap: "20px",
gap: `${el.textSpan}px`,
});
h.append(this.renderNameGroups(top,el));
if (bot.length) h.append(this.renderNameGroups(bot,el));
@@ -850,7 +993,7 @@
"height": el.textHeight,
})
items.forEach(x => {
g.append($(`<div class="" style="font-size:${el.style.fontSize}pt;letter-spacing: 10px;">${x}</div>`))
g.append($(`<div class="" style="font-size:${el.style.fontSize}pt;letter-spacing: 10px;text-align: justify; text-align-last: justify;">${x}</div>`))
})
return g;
},
@@ -881,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');
@@ -899,12 +1042,13 @@
$("#height").val(el.height);
$("#textWidth").val(el.textWidth);
$("#textHeight").val(el.textHeight);
$("#textSpan").val(el.textSpan);
//this.render();
},
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);
@@ -922,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 = `<div class="ancestor-wrapper" style='width:${el.width}px !important;height:${el.height}px !important' >
@@ -938,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({
@@ -975,8 +1136,17 @@
//this.render();
},
displayItem(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)
if (el.x > this.paper.width) {
el.x = this.paper.width/2
}
if (el.y>this.paper.height) {
el.y=this.paper.height/2
}
$("#" + id).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
})
@@ -1055,7 +1225,7 @@
detail.push({
elementID: el.id, startX: el.x.toString(), startY: el.y.toString(), fontSize: el.style.fontSize, fontFamily: el.style.fontFamily,
breakLen: el.breakLen, twoOffset: el.twoOffset, threeOffset: el.threeOffset, fourOffset: el.fourOffset,
isActive: el.style.visibility, width: el.width, height: el.height, textWidth: el.textWidth, textHeight: el.textHeight
isActive: el.style.visibility, width: el.width, height: el.height, textWidth: el.textWidth, textHeight: el.textHeight,textSpan:el.textSpan
});
});
let sID = this.styleID
@@ -1068,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"
+38 -32
View File
@@ -12,12 +12,12 @@
</v-text-field>-->
<!--</v-col>-->
<v-col cols="2" md="2">
<v-col cols="12" md="2">
<v-text-field label="法會名稱" v-model="search.subject">
</v-text-field>
</v-col>
<v-col cols="2" md="2">
<v-col cols="12" md="2">
<!--<v-text-field label="開始日期" v-model="search.uptime1">
</v-text-field>-->
@@ -39,7 +39,7 @@
@input="startmenu = false"></v-date-picker>
</v-menu>
</v-col>
<v-col cols="2" md="2">
<v-col cols="12" md="2">
<v-btn @click.prevent="getDefault()">查詢</v-btn>
<v-btn @click.prevent="clearSearch()">清空條件</v-btn>
</v-col>
@@ -47,33 +47,31 @@
</v-expansion-panel-content>
</v-expansion-panel>
</v-expansion-panels>
<v-data-table v-model="data_table.selected"
:items="data_table.list"
item-key="order_no"
:options.sync="options"
:headers="data_table.header"
:footer-props="data_table.footer"
:server-items-length="data_table.count"
:loading="data_table.loading"
:single-select="data_table.singleSelect"
hide-default-footer
:page.sync="data_table.page"
:items-per-page.sync="data_table.pageSize"
class="elevation-1">
<template #item.up_time="{ item }">
{{ item.up_time|timeString('YYYY/MM/DD') }}
</template>
<template #item.u_name="{ item }">
<a v-if="item.f_num != null && item.activity_num != null" @click="checkInMsg(item)" class="btn btn-outline-secondary btn-sm"><i class="mdi mdi-account-check"></i>報到</a>
{{ item.u_name }}
</template>
<template #item.slot_btn="{ item }">
<a @click="gotoSignup(item)" class="btn btn-outline-secondary btn-sm">報名</a>
<a @click="gotoBatchSignup(item)" class="btn btn-outline-secondary btn-sm">批次報名</a>
<a @click="gotoSignupList(item)" class="btn btn-outline-secondary btn-sm">明細</a>
<v-data-table v-model="data_table.selected"
:items="data_table.list"
item-key="order_no"
:options.sync="options"
:headers="data_table.header"
:footer-props="data_table.footer"
:server-items-length="data_table.count"
:loading="data_table.loading"
:single-select="data_table.singleSelect"
hide-default-footer
:page.sync="data_table.page"
:items-per-page.sync="data_table.pageSize"
disable-sort
class="elevation-1">
<template #item.u_name="{ item }">
<a v-if="item.f_num != null && item.activity_num != null" @click="checkInMsg(item)" class="btn btn-outline-secondary btn-sm"><i class="mdi mdi-account-check"></i>報到</a>
{{ item.u_name }}
</template>
<template #item.slot_btn="{ item }">
<a @click="gotoSignup(item)" class="btn btn-outline-secondary btn-sm">報名</a>
<a @click="gotoBatchSignup(item)" class="btn btn-outline-secondary btn-sm">批次報名</a>
<a @click="gotoSignupList(item)" class="btn btn-outline-secondary btn-sm">明細</a>
</template>
</v-data-table>
</template>
</v-data-table>
<v-container class="container-fluid">
<v-row class="align-baseline" wrap>
<v-col cols="12" md="9">
@@ -99,7 +97,6 @@
</template>
<script>
module.exports = {
props: ['formData'],
data() {
@@ -121,8 +118,8 @@
header: [
{ text: '活動分類', value: 'kindsTxt' },
{ text: '活動名稱', value: 'subject' },
{ text: '開始日期', value: 'startDate_solar' },
{ text: '結束日期', value: 'endDate_solar', align: 'start' },
{ text: '開始日期', value: 'startDate' },
{ text: '結束日期', value: 'endDate' },
{ text: '報名人數', value: 'orderCounts' },
{ text: '', value: 'slot_btn', sortable: false, align: 'end' }
],
@@ -192,7 +189,16 @@
deep: true,
},
},
filters: {
timestring(value) {
console.log("timeString:", value)
return "20260102";
//return (value == null || value == "") ? "" : moment(value).format('YYYY-MM-DD');
},
},
methods: {
initKindList() {
axios
//.get(HTTP_HOST + 'api/activity_kind')
+20 -11
View File
@@ -8,38 +8,38 @@
<v-expansion-panel-header color="#006fc9"
class="white--text">
<v-row>
<v-col cols="10" md="10">
<v-col cols="4" sm="4" md="10">
<label>查詢條件</label>
</v-col>
<v-col cols="2" md="2">
<v-btn @click.prevent='fast_signup' class="ms-auto">快速報名</v-btn>
<v-col cols="8" sm="8" md="2">
<!--<v-btn @click.prevent='fast_signup' class="ms-auto">快速報名</v-btn>-->
<v-btn @click.prevent="back01()" class="ms-auto">返回</v-btn>
</v-col>
</v-row>
</v-expansion-panel-header>
<v-expansion-panel-content>
<v-row>
<v-col cols="2" md="2">
<v-col cols="12" sm="12" md="2">
<v-text-field label="姓名" v-model="search.u_name">
</v-text-field>
</v-col>
<v-col cols="2" md="2">
<v-col cols="12" sm="12" md="2">
<v-text-field label="電話" v-model="search.phone">
</v-text-field>
</v-col>
<v-col cols="2" md="2">
<v-col cols="12" sm="12" md="2">
<v-text-field label="行動電話" v-model="search.cellphone">
</v-text-field>
</v-col>
<v-col cols="2" md="2">
<v-col cols="12" sm="12" md="2">
<v-text-field label="身分證號" v-model="search.id_code">
</v-text-field>
</v-col>
<v-col cols="2" md="2">
<v-col cols="12" sm="12" md="4">
<v-btn @click.prevent="getDetail()">查詢</v-btn>
<v-btn @click.prevent="clearSearch()">清空條件</v-btn>
</v-col>
@@ -62,11 +62,13 @@
hide-default-footer
:page.sync="detail_table.page"
:items-per-page.sync="detail_table.pageSize"
disable-sort
class="elevation-1">
<template #item.slot_btn="{ item }">
<!--<a :href="'reg.aspx?order_no='+item.order_no" class="btn btn-outline-secondary btn-sm"><i class="mdi mdi-pencil-box-outline"></i>修改</a>
<a @click="$root.currentView='step-three';$root.selected_order=item.order_no" class="btn btn-outline-secondary btn-sm">明細</a>
<a @click="deleteItem(item)" class="btn btn-outline-secondary btn-sm"><i class="mdi mdi-trash-can"></i>刪除</a>-->
<a @click="$root.currentView='step-three';$root.selected_order=item.order_no" class="btn btn-outline-secondary btn-sm">明細</a>
<a @click="deleteItem(item)" class="btn btn-outline-secondary btn-sm"><i class="mdi mdi-trash-can"></i>刪除</a>-->
</template>
</v-data-table>
<v-container>
@@ -95,6 +97,7 @@
</template>
<script>
module.exports = {
props: {
num: {
@@ -122,7 +125,7 @@
header: [
{ text: '單號', value: 'order_no' },
{ text: '姓名', value: 'u_name' },
{ text: '報名日期', value: 'up_time' },
{ text: '報名日期', value: 'uptime' },
{ text: '單據狀態', value: 'keyin1_txt', align: 'start' },
{ text: '', value: 'slot_btn', sortable: false, align: 'end' }
],
@@ -148,6 +151,12 @@
},
},
filters: {
timeString(value, myFormat) {
console.log("timeString:", value, myFormat)
return value == null || value == "" ? "" : moment(value).format(myFormat || 'YYYY-MM-DD, HH:mm:ss');
},
},
methods: {
back01() {
this.$emit('custom-event', { action: 'signup1', item: this.num });
+20 -9
View File
@@ -381,11 +381,15 @@
.catch(error => console.log(error))
},
renderTabletContent(item) {
//console.log("renderTabletContent:", item, item.f_num_tablet)
if (item.f_num_tablet==="") {
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("、")
@@ -412,21 +416,28 @@
let detail = []
//整理資料存檔//只要抓那個活動的那幾筆功德項目代號
this.tablet_list.forEach(x => {
if (x.actitem_num_checked && x.actitem_num_checked == true) {
//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({
num: x.num, order_no: x.order_no, change_item_num: x.changeActitem,
price: actItem.price, qty: 1, style: actItem.act_item_selected.style, printed_files: actItem.files[0].num
price: actItem.price, qty: 1, style: actItem.act_item_selected.style, printed_files: ""//actItem.files[0].num
})
// console.log("saveOrder:", x, x.num, x.order_no)
}
})
if (detail.length === 0) {
this.message_dialog.show_confirm = false
this.message_dialog.show = true
this.message_dialog.message = "沒有選擇功德項目,如果無法選擇,請使用一般報名程序"
return false
}
//放主檔資料,
let main = {
activity_num: this.num, f_num: this.follower.num,
activity_num: this.num, f_num: this.follower?.num,
details: detail
}
//console.log("saveOrderDetail:",detail);
@@ -445,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)
});
}
}
+38 -15
View File
@@ -4,8 +4,8 @@
<v-card-title class="bg-primary white--text text-center">
<h4>快速報名</h4>
<div class="ms-auto">
<v-btn @click.prevent="addOrderWithDetail()">儲存</v-btn>
<v-btn @click.prevent="back01()">返回</v-btn>
<v-btn @click.prevent="addOrderWithDetail()" :disabled="statusAfterClick">儲存</v-btn>
<v-btn @click.prevent="back01()" :disabled="statusAfterClick">返回</v-btn>
</div>
</v-card-title>
<v-card-text>
@@ -24,13 +24,13 @@
</v-col>
<v-col cols="2" md="2">
e <v-select :items="countrys" :rules="requiredrules"
label="*國籍"
item-text="name_zh"
item-value="id" v-model="follower.country">
<v-select :items="countrys" :rules="requiredrules"
label="*國籍"
item-text="name_zh"
item-value="id" v-model="follower.country">
</v-select>
<!--<v-text-field v-model="follower.country" :rules="requiredrules"
label="*國籍"></v-text-field>-->
label="*國籍"></v-text-field>-->
</v-col>
<v-col cols="2" md="2">
<v-text-field v-model="follower.id_code"
@@ -47,7 +47,7 @@
item-value="val" v-model="follower.sex">
</v-select>
<!--<v-text-field v-model="follower.sex" :rules="[rules.required]"
label="*性別"></v-text-field>-->
label="*性別"></v-text-field>-->
</v-col>
<v-col cols="2" md="2">
<v-select :items="identity_items" :rules="requiredrules"
@@ -56,7 +56,7 @@
item-value="val" v-model="follower.identity_type">
</v-select>
<!--<v-text-field v-model="follower.identity_type" :rules="[rules.required]"
label="*身分別"></v-text-field>-->
label="*身分別"></v-text-field>-->
</v-col>
<v-col cols="2" md="2">
<v-menu v-model="menu"
@@ -77,9 +77,9 @@
@input="menu = false"></v-date-picker>
</v-menu>
<!--<v-date-picker v-model="follower.birthday"
label="生日"></v-date-picker>-->
label="生日"></v-date-picker>-->
<!--<v-text-field v-model="follower.birthday"
label="生日"></v-text-field>-->
label="生日"></v-text-field>-->
</v-col>
<v-col cols="2" md="2">
<v-checkbox v-model="follower.send_receipt"
@@ -135,7 +135,7 @@
item-value="val" v-model="title_new.islive">
</v-select>
<!--<v-text-field v-model="title_new.islive"
label="存/歿"></v-text-field>-->
label="存/歿"></v-text-field>-->
</v-col>
<v-col>
<v-btn @click.prevent="addTitle(item)">加入</v-btn>
@@ -165,7 +165,7 @@
item-value="val" v-model="alive_new.islive">
</v-select>
<!--<v-text-field v-model="alive_new.islive"
label="存/歿"></v-text-field>-->
label="存/歿"></v-text-field>-->
</v-col>
<v-col>
<v-btn @click.prevent="addLive(item)">加入</v-btn>
@@ -187,7 +187,14 @@
</v-row>
</v-card-text>
</v-card>
</div>
<v-snackbar v-model="snackbar.show" :timeout="3000" top color="error">
{{ snackbar.text }}
<template v-slot:action="{ attrs }">
<v-btn dark text v-bind="attrs" @click="snackbar.show = false">關閉</v-btn>
</template>
</v-snackbar>
</div>
</template>
<script>
@@ -199,6 +206,11 @@
},
data() {
return {
statusAfterClick:false,
snackbar: {
show: false,
text: ''
},
follower: {
u_name: "", sex: "", identity_type: "", phone: "",
cellphone: "", country: "", address: "",
@@ -252,7 +264,8 @@
addOrderWithDetail() {
//組資料,信眾資料,報名資料,功德資料
let details = []
let self = this
this.statusAfterClick = true;
this.tablets.forEach(x => {
let mid_items = []
@@ -313,6 +326,16 @@
.post(HTTP_HOST + 'api/order/AddOrderWithDetail', order)
.then(response => {
console.log(response);
this.snackbar.text = response.data.message
this.snackbar.show = true;
if (response.data.result == "Y") {
//
setTimeout(() => {
self.back01()
}, 2000);
} else {
this.statusAfterClick = true;
}
})
},
renderContent(titles) {
+1
View File
@@ -25,6 +25,7 @@
hide-default-footer
:page.sync="detail_table.page"
:items-per-page.sync="detail_table.pageSize"
disable-sort
class="elevation-1">
<template #item.slot_btn="{ item }">
</template>
+21 -16
View File
@@ -73,7 +73,7 @@
year: '',
month: '',
season: '',
chk_hasact: false,
chk_hasact: true,
chk_noact: false,
select_act: '',
select_actitem: '',
@@ -217,6 +217,7 @@
this.search.activity_num = this.this_act;
this.initPrintSearch();
this.initActivity();
this.getDefault();
const navEntries = performance.getEntriesByType("navigation");
const isReload = navEntries.length > 0 && navEntries[0].type === "reload";
@@ -247,7 +248,7 @@
this.isSearched = true;
}
}
if (printResult === 'nodata' || printResult === 'success') {
@@ -266,16 +267,18 @@
window.history.replaceState({}, '', cleanUrl);
}, 100);
});
},
watch: {
options: {
handler() {
if (this.isSearched) {
//if (this.isSearched) {
this.getDefault()
}
else {
this.data_table.loading = false;
}
//}
//else {
// this.data_table.loading = false;
//}
},
deep: true,
},
@@ -411,12 +414,14 @@
},
getDefault(clearpage = false) {
const { sortBy, sortDesc, page, itemsPerPage } = this.options
//page = this.data_table.page;
const params = {
sortBy: sortBy[0], sortDesc: sortDesc[0],
page: clearpage ? '1' : page, pageSize: itemsPerPage
};
this.data_table.loading = true
sessionStorage.setItem('orderpage', clearpage ? '1' : page);
//sessionStorage.setItem('orderpage', clearpage ? '1' : page);
axios
.post(HTTP_HOST + 'api/order/GetList', this.search, { params: params })
.then(response => {
@@ -425,7 +430,7 @@
this.data_table.loading = false
const dataToStore = JSON.stringify(this.data_table);
sessionStorage.setItem("order_list_cache", dataToStore);
//sessionStorage.setItem("order_list_cache", dataToStore);
})
.catch(error => console.log(error))
},
@@ -700,7 +705,7 @@
$btn.click();
let el = document.getElementById('offcanvasRight');
let offcanvas = bootstrap.Offcanvas.getOrCreateInstance(el);
offcanvas.show();
//offcanvas.show();
}
});
</script>
@@ -747,7 +752,7 @@
<a v-if="item.f_num != null && item.activity_num != null && item.status == 1" class="btn btn-outline-secondary btn-sm opacity-50" style="pointer-events: none" ><i class="mdi mdi-account-check"></i>已報到</a>
</template>
<template #item.slot_btn="{ item }">
<a :href="'reg.aspx?order_no='+item.order_no" class="btn btn-outline-secondary btn-sm"><i class="mdi mdi-pencil-box-outline"></i>修改</a>
<a :href="'reg.aspx?order_no='+item.order_no" class="btn btn-outline-secondary btn-sm"><i class="mdi mdi-pencil-box-outline"></i>編輯</a>
<a @click="deleteItem(item)" class="btn btn-outline-secondary btn-sm"><i class="mdi mdi-trash-can"></i>刪除</a>
</template>
</v-data-table>
@@ -877,16 +882,16 @@
<span class="fs-6 text text-dark">活動 *</span>
</v-col>
<v-col :cols="10" class="pt-5" >
活動/非活動至少勾選一項
<%--活動/非活動至少勾選一項
<v-checkbox
v-model="print_search.chk_noact"
:label="`非活動報名`"
></v-checkbox>
<v-checkbox
></v-checkbox> --%>
<%-- <v-checkbox
v-model="print_search.chk_hasact"
:label="`活動報名`"
@change="chk_hasact_change"
></v-checkbox>
></v-checkbox>--%>
<%-- <v-row densee class="pt-3" >
<v-col :cols="10" class="pt-5" > --%>
<div class="input-group mb-3 single-line d-none" data-search-control="search2" @click="print_search.chk_hasact && search_show(search_dialog.controls.search2)" :disabled="!print_search.chk_hasact">
@@ -955,7 +960,7 @@
<v-card-text >
<v-row>
<v-col v-for="item in search_dialog.current.keys"
:cols="search_dialog.current.keys.length>1?6:12" >
:cols="search_dialog.current.keys.length>1?6:12" v-bind:key="item.value">
<v-text-field v-model="item.value" :label="item.title" v-if="item.visible===undefined || item.visible==true "></v-text-field>
</v-col>
<v-col cols="12" class="text-end">
+2 -1
View File
@@ -62,7 +62,7 @@
header: [
{ text: '單號', value: 'order_no' },
{ text: '姓名', value: 'u_name' },
{ text: '報名日期', value: 'up_time' },
{ text: '報名日期', value: 'uptime' },
{ text: '單據狀態', value: 'keyin1_txt', align: 'start' },
{ text: '', value: 'slot_btn', sortable: false, align: 'end' }
],
@@ -109,6 +109,7 @@
methods: {
changeView(item) {
if (item.action === "detail") {
console.log("change to fastSignup2")
this.twoData = item.item.num
this.currentView = "fastSignUp2-component"
} else if (item.action === "add") {
+97
View File
@@ -0,0 +1,97 @@
<%@ Page Title="" Language="C#" MasterPageFile="~/admin/Templates/TBS5ADM001/MasterPage.master" AutoEventWireup="true" CodeFile="pre_index.aspx.cs" Inherits="admin_order_pre_index" %>
<%@ Register Src="~/admin/_uc/alert.ascx" TagPrefix="uc1" TagName="alert" %>
<asp:Content ID="Content1" ContentPlaceHolderID="page_header" Runat="Server">
<script src="/js/httpVueLoader.js"></script>
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="page_nav" Runat="Server">
</asp:Content>
<asp:Content ID="Content3" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
<div id="content" class="container-fluid py-4">
<keep-alive :exclude="['pre_order-component']">
<component :is="currentView" ref="myChild" :reload="reload"
@custom-event="changeView" :search="search">
</component>
</keep-alive>
</div>
</asp:Content>
<asp:Content ID="Content4" ContentPlaceHolderID="offCanvasRight" Runat="Server">
<div id="search_panel" alt="查詢">
<div class="mb-3">
<label class="form-label">信眾</label>
<input type="text" v-model="search.f_name" class="form-control" placeholder="可輸入關鍵字查詢">
</div>
<div class="mb-3">
<label class="form-label">活動</label>
<input type="text" v-model="search.act_name" class="form-control" placeholder="可輸入關鍵字查詢">
</div>
<div class="mb-3">
<label class="form-label">報名單號</label>
<input type="text" v-model="search.order_no" class="form-control" placeholder="可輸入關鍵字查詢">
</div>
<div class="mb-3 p-2 border-top">
<a @click.prevent="btn_search" class="btn btn-outline-primary"><i class="mdi mdi-filter"></i> 搜尋</a>
<a class="btn btn-outline-secondary" @click.prevent="btn_all"><i class="mdi mdi-filter-remove"></i> 所有資料</a>
</div>
</div>
</asp:Content>
<asp:Content ID="Content5" ContentPlaceHolderID="footer_script" Runat="Server">
<script>
let VueApp = new Vue({
el: '#app',
vuetify: new Vuetify(vuetify_options),
data() {
return {
currentView: 'pre_order-component',
options: { multiSort: false },
search_options: { multiSort: false },
search: {
act_name: '',
order_no: '',
f_name:'',
},
reload:0,
}
},
components: {
'pre_order-component': httpVueLoader('./pre_order.vue'),
'pre_order_reg-component': httpVueLoader('./pre_order_reg.vue'),
},
watch: {
search_options: {
handler() {
},
deep: true,
},
},
methods: {
search_show(curr) {
this.search_dialog.current = curr;
this.search_clear()
this.search_dialog.show = true;
},
btn_search() {
this.$refs.myChild.loadData();
},
btn_all() {
this.search.act_name= ''
this.search.order_no= ''
this.search.f_name= ''
this.btn_search();
},
changeView(item) {
if (item.action === "add") {
this.currentView = "pre_order_reg-component";
} else if (item.action === "list") {
this.reload++;
this.currentView = "pre_order-component";
}
},
},
})
</script>
</asp:Content>
+14
View File
@@ -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_order_pre_index :MyWeb.config
{
protected void Page_Load(object sender, EventArgs e)
{
}
}
+234
View File
@@ -0,0 +1,234 @@
<template>
<div id="content" class="container-fluid">
<v-btn @click.prevent="gotoAdd()" color="primary">新增</v-btn>
<v-data-table v-model="data_table.selected"
:items="data_table.list"
item-key="order_no"
:options.sync="options"
:headers="data_table.header"
:footer-props="data_table.footer"
:server-items-length="data_table.count"
:loading="data_table.loading"
:single-select="data_table.singleSelect"
hide-default-footer
:page.sync="data_table.page"
:items-per-page.sync="data_table.pageSize"
class="elevation-1">
<template #item.reg_time="{ item }">
{{ item.reg_time|timeString('YYYY/MM/DD') }}
</template>
<template #item.slot_btn="{ item }">
<a @click.prevent="openReceipt(item)" class="btn btn-outline-secondary btn-sm"><i class="mdi mdi-receipt-text"></i>開立收據</a>
<!--<a :href="'reg.aspx?order_no='+item.order_no" class="btn btn-outline-secondary btn-sm"><i class="mdi mdi-pencil-box-outline"></i>編輯</a>
<a @click="deleteItem(item)" class="btn btn-outline-secondary btn-sm"><i class="mdi mdi-trash-can"></i>刪除</a>-->
</template>
</v-data-table>
<v-container>
<v-row class="align-baseline" wrap>
<v-col cols="12" md="9">
<v-pagination v-model="data_table.page"
:length="pageCount">
</v-pagination>
</v-col>
<v-col class="text-truncate text-right" cols="12" md="2">
共 {{ data_table.count }} 筆, 頁數:
</v-col>
<v-col cols="6" md="1">
<v-text-field v-model="data_table.page"
type="number"
hide-details
dense
min="1"
:max="pageCount"
@input="data_table.page = parseInt($event, 10)"></v-text-field>
</v-col>
</v-row>
</v-container>
<div v-if="isModalOpen" class="modal-backdrop" @click.self="closeModal"
style="top: 5vh !important; left: 5vw !important; display: flex; margin: auto !important; width: 100% !important; height: 100% !important; ">
<!-- Modal Window Box -->
<div class="modal-window" style="height: 100% !important; width: 100% !important; ">
<header class="modal-header">
<!--<h2>Modal Title</h2>-->
<button @click="closeModal" class="close-btn">&times;</button>
</header>
<main class="modal-body" style="overflow: auto !important; height: 100% !important; width: 100% !important; width: 80vw !important; height: 80vh !important; ">
<!-- Async component loaded dynamically via v-if -->
<receipt-component :form-data="formData" @close-dialog="closeModal" mode="preOrder" :order_no="receiptComponent.order_no" :total_amt="receiptComponent.total_amt" />
</main>
</div>
</div>
</div>
</template>
<script>
Vue.filter('timeString', function (value, myFormat) {
return value == null || value == "" ? "" : moment(value).format(myFormat || 'YYYY-MM-DD, HH:mm:ss');
});
module.exports = {
props: {
formData: {},
search: {
},
reload: {
type: Number
}
},
name:"ParentComponent",
components: {
// Add .then(m => m.default || m) to safely handle module.exports
'ReceiptComponent': httpVueLoader('../receipt/receipt.vue'),
},
data() {
return {
options: { multiSort: false },
search_options: { multiSort: false },
isModalOpen: false,
receiptComponent: {
order_no: "",
total_amt:0
},
data_table: {
loading: true,
list: [],
selected: [],
singleSelect: false,
count: 0,
page: 1,
pageSize: 10,
header: [
{ text: '信眾', value: 'f_name' },
{ text: '報名單號', value: 'order_no' },
{ text: '活動', value: 'act_name'},
{ text: '功德項目數量', value: 'item_count' },
{ text: '總金額', value: 'total_amt' },
{ text: '收據金額', value: 'receipt_amt' },
{ text: '登錄人員', value: 'admin_name' },
{ text: '登錄時間', value: 'reg_time' },
{ text: '', value: 'slot_btn', sortable: false, align: 'end' }
],
footer: {
showFirstLastPage: true,
itemsPerPageOptions: [5, 10, 20, 30],
},
},
}
},
mounted() {
this.loadData()
},
methods: {
openModal() {
this.isModalOpen = true;
},
closeModal(param="") {
this.isModalOpen = false;
if (param=="reload") {
this.loadData()
}
},
openReceipt(item) {///開收據
this.openModal();
this.receiptComponent.order_no = item.order_no;
this.receiptComponent.total_amt = item.total_amt;
},
gotoAdd() {
this.$emit('custom-event', { action: 'add' });
},
loadData(clearpage = false) {
const { sortBy, sortDesc, page, itemsPerPage } = this.options
//page = this.data_table.page;
//let search = {}
const params = {
sortBy: "", sortDesc: false,
page: clearpage ? '1' : page, pageSize: itemsPerPage
};
this.data_table.loading = true
axios
.post(HTTP_HOST + 'api/preOrder/GetPreOrder', this.search, { params: params })
.then(response => {
console.log(response)
this.data_table.list = response.data.list
this.data_table.count = response.data.count;
this.data_table.loading = false
const dataToStore = JSON.stringify(this.data_table);
//sessionStorage.setItem("order_list_cache", dataToStore);
})
.catch(error => console.log(error))
},
search_headers() {
},
search_select() {
}
},
watch: {
options: {
handler() {
this.loadData()
},
deep: true,
},
reload: {
handler() {
this.loadData()
},
deep: true,
}
},
computed: {
pageCount() {
return Math.ceil(this.data_table.count / this.data_table.pageSize)
},
}
};
</script>
<style scoped>
/* Basic Modal Styles */
.modal-backdrop {
position: fixed;
top: 0;
left: 0;
width: 100vw;
height: 100vh;
background: rgba(0, 0, 0, 0.5);
display: flex;
justify-content: center;
align-items: center;
z-index: 10001;
}
.modal-window {
background: white;
padding: 20px;
border-radius: 8px;
min-width: 300px;
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.3);
}
.modal-header {
display: flex;
justify-content: space-between;
align-items: center;
}
.close-btn {
background: none;
border: none;
font-size: 1.5rem;
cursor: pointer;
}
</style>
+313
View File
@@ -0,0 +1,313 @@
<template>
<div class="container-fluid">
<v-card>
<v-card-title class="bg-primary white--text text-center">
<h5 class="mb-0">客堂登錄</h5>
<div class="ms-auto">
<v-btn @click.prevent="savePreOrder()">儲存</v-btn>
<v-btn @click.prevent="back01()">返回</v-btn>
</div>
</v-card-title>
<v-card-text>
<v-row>
<v-col cols="12" md="4">
<v-text-field v-model="formData.f_name"
:readonly="true"
label="信眾">
<v-icon slot="append" style="cursor:pointer" @click.prevent="pickFollower"
color="red">
mdi-account
</v-icon>
</v-text-field>
</v-col>
<v-col cols="12" md="4">
<v-text-field v-model="formData.item_count"
label="功德項目數"></v-text-field>
</v-col>
<v-col cols="12" md="4">
<v-text-field v-model="formData.total_amt"
label="總金額"></v-text-field>
</v-col>
<v-col cols="12" md="8">
<v-text-field v-model="formData.act_name"
:readonly="true"
label="法會/活動">
<v-icon slot="append" style="cursor:pointer" @click.prevent="pickAct"
color="red">
mdi-selection-search
</v-icon>
</v-text-field>
</v-col>
<v-col cols="12" md="4">
<v-text-field v-model="formData.order_no"
:readonly="true" :disabled="true"
label="報名單號"></v-text-field>
</v-col>
</v-row>
</v-card-text>
</v-card>
<v-dialog v-model="picker.show" class="container-fluid">
<template>
<v-card>
<v-card-title>
<v-text-field v-model="picker.search.name" :label="picker.search.text" @keyup.enter.prevent="getFollowers"></v-text-field>
</v-card-title>
<v-card-text>
<div class="row">
<div class="col-12">
<v-data-table v-model="picker.data_table.selected"
:items="picker.data_table.list"
:options.sync="options"
:headers="picker.data_table.header"
:footer-props="picker.data_table.footer"
:server-items-length="picker.data_table.count"
:loading="picker.data_table.loading"
:single-select="picker.data_table.singleSelect"
hide-default-footer
:page.sync="picker.data_table.page"
:items-per-page.sync="picker.data_table.pageSize"
class="elevation-1"
@click:row="handleRowClick">
</v-data-table>
</div>
<div class="col-12">
<v-container>
<v-row class="align-baseline">
<v-col cols="12" md="9">
<v-pagination v-model="picker.data_table.page"
:length="pageCount">
</v-pagination>
</v-col>
<v-col class="text-truncate text-right" cols="12" md="2">
共 {{ picker.data_table.count }} 筆, 頁數:
</v-col>
<v-col cols="6" md="1">
<v-text-field v-model="picker.data_table.page"
type="number"
hide-details
dense
min="1"
:max="pageCount"
@input="data_table.page = parseInt($event, 10)"></v-text-field>
</v-col>
</v-row>
</v-container>
</div>
</div>
</v-card-text>
<v-card-actions>
<v-btn @click.prevent="picker.show=false">關閉</v-btn>
<v-btn @click.prevent="picker_confirm()">確認</v-btn>
</v-card-actions>
</v-card>
</template>
</v-dialog>
<v-snackbar v-model="snackbar.show">
{{ snackbar.text }}
<template v-slot:action="{ attrs }">
<v-btn color="pink"
text
v-bind="attrs"
@click="snackbar.show = false">
Close
</v-btn>
</template>
</v-snackbar>
</div>
</template>
<script>
module.exports = {
props: {
num: {
type: Number // num
}
},
data() {
return {
options: { multiSort: false },
formData: {
f_num: 0,
order_no: "自動編號",
item_count: 0,
total_amt: 0,
act_num: 0,
admin_num: 0,
receipt_no: "",
f_name: "",
act_name:""
},
picker: {
show: false,
target: "",
data_table: {
loading: false,
list: [],
selected: [],
singleSelect: false,
count: 0,
page: 1,
pageSize: 10,
header: [
],
footer: {
showFirstLastPage: true,
itemsPerPageOptions: [5, 10, 20, 30],
},
},
search: {
name: "",
text: "法會名稱"
},
change: 0
},
snackbar: {
show: false,
text: "",
},
}
},
watch: {
"picker.target": {
handler(newVal) {
//this.options.page = 1;
//this.options.pageSize = 10;
this.options = { multiSort: false }
this.picker.data_table.page = 1;
this.picker.data_table.pageSize=10;
if (this.picker.target === "follower") {
this.picker.search.name = ""
this.picker.search.text = "信眾姓名"
this.picker.change++
this.getFollowers()
} else if (this.picker.target === "act") {
this.picker.search.name = ""
this.picker.search.text = "法會名稱"
this.picker.change++
this.getActivity()
}
},
deep: true,
},
options: {
handler() {
this.getFollowers()
},
deep: true,
}
},
methods: {
handleRowClick(item, row) {
if (this.picker.target === "follower") {
this.formData.f_num = item.num;
this.formData.f_name = item.u_name;
} else if (this.picker.target === "act") {
this.formData.act_num = item.num;
this.formData.act_name = item.subject;
}
this.picker.show = false;
},
savePreOrder() {
axios
.post(HTTP_HOST + 'api/preOrder/SavePreOrder', this.formData)
.then(response => {
this.snackbar.text = response.data.message;
this.snackbar.show = true;
if (response.data.result=="Y") {
this.$emit('custom-event', { action: 'list' });
}
}).catch(error => console.log(error));
},
back01() {
this.$emit('custom-event', { action: 'list' });
},
getFollowers(clearPage=false) {
const { sortBy, sortDesc, page, itemsPerPage } = this.options
const params = {
sortBy: "num", sortDesc: false,
page: page??1, pageSize: itemsPerPage??10
};
this.picker.data_table.loading = true;
let search = {u_name:this.picker.search.name}
axios
.post(HTTP_HOST + 'api/follower/GetList', search, { params: params })
.then(response => {
console.log(response)
this.picker.data_table.list = response.data.list
this.picker.data_table.count = response.data.count;
this.picker.data_table.loading = false
const dataToStore = JSON.stringify(this.data_table);
//sessionStorage.setItem("order_list_cache", dataToStore);
})
.catch(error => console.log(error))
},
getActivity(clearPage=false) {
const { sortBy, sortDesc, page, itemsPerPage } = this.options
const params = {
sortBy: "num", sortDesc: false,
page: page??1, pageSize: itemsPerPage??10
};
this.picker.data_table.loading = true;
let search = {}
axios
.post(HTTP_HOST + 'api/activity/GetListNew', search, { params: params })
.then(response => {
console.log(response)
this.picker.data_table.list = response.data.list
this.picker.data_table.count = response.data.count;
this.picker.data_table.loading = false
const dataToStore = JSON.stringify(this.data_table);
//sessionStorage.setItem("order_list_cache", dataToStore);
})
.catch(error => console.log(error))
},
pickFollower() {
this.picker.data_table.list.length = 0;
this.picker.show = true;
this.picker.target = "follower";
this.picker.data_table.header = [
{ text: '信眾編號', value: 'num' },
{ text: '姓名', value: 'u_name' },
{ text: '電話', value: 'phoneDes' },
{ text: '行動電話', value: 'cellphoneDes' },
{ text: '', value: 'slot_btn', sortable: false, align: 'end' }
]
this.getFollowers(false);
},
pickAct() {
this.picker.data_table.list.length = 0;
this.picker.show = true;
this.picker.target = "act";
this.picker.data_table.header = [
{ text: '活動編號', value: 'num' },
{ text: '名稱', value: 'subject' },
{ text: '報名截止日', value: 'dueDate' },
{ text: '', value: 'slot_btn', sortable: false, align: 'end' }
]
this.getActivity(false);
},
picker_confirm() {
}
},
computed: {
pageCount() {
return Math.ceil(this.picker.data_table.count / this.picker.data_table.pageSize)
},
}
};
</script>
+143 -20
View File
@@ -229,6 +229,7 @@
select(item, t) {
}
}, search8: {
id: 'search8',
id: 'search8',
title: '牌位標題:陽上',
text_prop: 'title',
@@ -394,6 +395,11 @@
customize_data_comb: [],
printed_files: '',
},
preOrder: {
order_no: "",
item_count: 0,
total_amt: 0
},
keyin1_items: [{ //報名狀態
text: "請選擇",
val: 0
@@ -601,6 +607,10 @@
this.tablet_edit_new.initialized = true;
};
}
if (this.order_no != "" ) {
this.getPreOrder();
}
},
watch: {
options: {
@@ -666,6 +676,29 @@
}
},
methods: {
checkPreOrder() {
axios
.post(HTTP_HOST + 'api/preOrder/CheckPreVsOrder', {order_no:this.order_no})
.then(response => {
console.log(response)
let resp = response.data;
this.snackbar.text = resp.message;
this.snackbar.show = true;
})
},
getPreOrder() {
let search = { order_no: this.order_no }
axios
.post(HTTP_HOST + 'api/preOrder/GetPreOrderByNum', search)
.then(response => {
console.log(response)
if (response.data.result === "Y") {
this.preOrder.order_no = response.data.ret.data.order_no;
this.preOrder.item_count = response.data.ret.data.item_count;
this.preOrder.total_amt = response.data.ret.data.total_amt;
}
});
},
dataDialogClose() {
},
@@ -859,7 +892,7 @@
isValidDate = Date.parse(item.pay_date);
if (!isNaN(isValidDate))
item.pay_date = new Date(item.pay_date).format("yyyy-MM-dd")
console.log(item);
this.editedItem = $.extend(true, {}, item);
this.data_dialog.show = true;
this.data_dialog.isAddNew = false;
@@ -869,12 +902,51 @@
this.editedIndex = this.desserts.indexOf(item);
this.editedItem = $.extend(true, {}, item);
this.file_dialog.show = true;
},
printItemNew(item) {
let list = [{
num: item.num, print_id: item.print_id, order_no: item.order_no, from_id: item.from_id,
printed_files: item.printed_files
}]
let list_count = 1;
//// 送出列印
let _url = HTTP_HOST + 'admin/print/print_multi_new.aspx';
var form = document.createElement("form");
form.method = "POST";
form.action = _url;
form.target = "_blank"; // Open the result in a new tab
// Helper function to add hidden fields
const addHiddenField = (name, value) => {
const hiddenField = document.createElement("input");
hiddenField.type = "hidden";
hiddenField.name = name;
hiddenField.value = value;
form.appendChild(hiddenField);
};
// Add form fields
//console.log(item.actitem_num_selected, item.num, JSON.stringify(list));
addHiddenField("item", item.actitem_num_selected.val);
addHiddenField("file", item.num);
addHiddenField("list", JSON.stringify(list));
addHiddenField("title", `${item.actitem_num_selected} / ${item.subject}`);
//console.log("底家:",this.data_table.selected);
localStorage.setItem("item", item.actitem_num_selected.val);
localStorage.setItem("list", JSON.stringify(list));
localStorage.setItem("mode","preview");
document.body.appendChild(form); // Not entirely sure if this is necessary
form.submit();
document.body.removeChild(form);
},
async editTabletNew(item) {
this.editedIndex = this.desserts.indexOf(item);
this.editedItem = $.extend(true, {}, item);
//console.log("editTabletNew:",this.editedItem,item)
try {
//console.log("editTabletNew:",this.editItem)
//document.getElementById("tablet_edit_new_iframe").contentWindow.location.reload();
// 如果是新項目,先保存
if (this.editedItem.num <= 0 || this.editedItem.num === null || this.editedItem.num === undefined) {
@@ -883,6 +955,7 @@
if (savedItem) {
this.$set(this.desserts, this.editedIndex, savedItem);
this.editedItem = $.extend(true, {}, savedItem);
//console.log("savedItem:", this.editedItem)
}
}
// 先發送消息
@@ -937,7 +1010,8 @@
try {
// 嘗試獲取家族成員數據
const response = await axios.get(HTTP_HOST + 'api/familymembers/follower/' + this.follower_id);
console.log("哩來哩來:",this.follower_id)
const response = await axios.get( '/api/familymembers/follower/' + this.follower_id);
familyMembers = response.data;
} catch (error) {
console.warn('error:', error);
@@ -1092,7 +1166,8 @@
async save(shouldClose = true) {
if (this.editedIndex > -1) {
if (this.order_no != '') {
console.log("ok:",this.editedItem);
this.editedItem.order_no=this.order_no
//console.log("ok:",this.editedItem);
//chcck necessary params
if (this.editedItem.actitem_num_selected.val != 0 &&
this.editedItem.keyin1_selected.val !=0 &&
@@ -1100,11 +1175,11 @@
/* (this.editedItem.category=="1"? this.editedItem.from_id_selected.val != 0 : true) &&*/
this.requireData(this.editedItem.qty, (this.editedItem.num == 0 ? false : true)) ) /* qty為0視為不需要此項目,不儲存此筆資料*/
{
console.log(this.editedItem);
//console.log(this.editedItem);
//check price
if (this.editedItem.pay <= this.editedItem.price * this.editedItem.qty) {
console.log(this.editedItem.f_num_selected.val);
console.log(this.editedItem.from_id_selected.val);
//console.log(this.editedItem.f_num_selected.val);
//console.log(this.editedItem.from_id_selected.val);
//check qty
//數量不可小於掛單明細的數量
if (this.editedItem.qty >= this.editedItem.writeBedQty + this.editedItem.notBedQty) {
@@ -1820,7 +1895,7 @@
const data = typeof f_num_tablet === 'string'
? JSON.parse(f_num_tablet)
: f_num_tablet;
console.log("data:",data);
// 格式化函數
const formatItems = (items) => {
if (!items || !Array.isArray(items)) return '';
@@ -1833,7 +1908,9 @@
return {
mid: formatItems(data.mid_items),
left: formatItems(data.left_items)
left: formatItems(data.left_items),
mid_left: formatItems(data.mid_left),
mid_right: formatItems(data.mid_right)
};
} catch (e) {
console.error('Error in getTabletText:', e);
@@ -1849,6 +1926,14 @@
},
}
})
function validateHiddenField(sender, args) {
// 透過 ClientID 取得 HiddenField 的值
var hiddenValue = document.getElementById('<%= activity_num.ClientID %>').value;
// 如果值不為空,則驗證通過 (true)
args.IsValid = (hiddenValue.trim() !== "");
}
</script>
</asp:Content>
<asp:Content ID="Content3" ContentPlaceHolderID="page_nav" runat="Server">
@@ -1858,8 +1943,8 @@
</div>
<div class="">
<asp:Button ID="add" runat="server" Text="送出" OnClick="add_Click" CssClass="btn btn-primary" />
<asp:Button ID="edit" runat="server" Text="修改" Visible="false" OnClick="edit_Click" CssClass="btn btn-primary" />
<asp:Button ID="goback" runat="server" Text="取消" CausesValidation="false" OnClick="goback_Click" CssClass="btn btn-outline-secondary" />
<asp:Button ID="edit" runat="server" Text="儲存" Visible="false" OnClick="edit_Click" CssClass="btn btn-primary" />
<asp:Button ID="goback" runat="server" Text="返回" CausesValidation="false" OnClick="goback_Click" CssClass="btn btn-outline-secondary" />
</div>
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server">
@@ -1876,7 +1961,7 @@
type="button" role="tab" aria-controls="profile" aria-selected="false">
報名明細</button>
<button class="nav-link" id="sec2-tab5" data-bs-toggle="tab" data-bs-target="#sec2-page5"
type="button" role="tab" aria-controls="profile" aria-selected="false">
type="button" role="tab" aria-controls="profile" aria-selected="false" style="display:none;">
疏文名單</button>
<button class="nav-link" id="sec2-tab3" data-bs-toggle="tab" data-bs-target="#sec2-page3"
type="button" role="tab" aria-controls="profile" aria-selected="false" v-if="lists.length > 0">
@@ -1915,7 +2000,7 @@
</div>
</div>
<div class="row mb-1 ">
<label class="col-sm-2 col-lg-1 col-form-label">報名活動</label>
<label class="col-sm-2 col-lg-1 col-form-label">報名活動 *</label>
<div class="col-sm-10 col-lg-3">
<asp:PlaceHolder ID="activity_numPH" runat="server">
<div class="input-group mb-3" data-search-control="search3" @click="order_no=='' && search_show(search_dialog.controls.search3)">
@@ -1925,7 +2010,10 @@
<button class="btn btn-outline-secondary" type="button">
<i class="mdi mdi-view-list-outline"></i>
</button>
</div>
<asp:CustomValidator ID="CustomValidator1" runat="server"
ErrorMessage="活動不可為空!"
ClientValidationFunction="validateHiddenField" />
</div>
</asp:PlaceHolder>
<asp:Literal ID="activity_num_txt2" runat="server"></asp:Literal>
</div>
@@ -1999,17 +2087,41 @@
</div>
</div>
<div class="tab-pane fade label-sm-right" id="sec2-page2" role="tabpanel" aria-labelledby="sec2-tab2">
<v-card class="mx-auto" outlined v-if="order_no!=''">
<v-card-title>
<%if (IsPreOrder == "true")
{ %>
<div class="container-lg" >
<div class="row">
<div class="col-12 col-md-4 ">
客堂登記功德項目數:{{ preOrder.item_count }}
</div>
<div class="col-12 col-md-4 ">
客堂登記總金額:{{ preOrder.total_amt }}
</div>
<div class="col-12 col-md-4 ">
<button class="btn btn-primary" title="檢查客堂登記與文書組登打差異" @click.prevent="checkPreOrder">檢查</button>
</div>
<%--<div class="col-12 col-md-6 "></div>--%>
</div>
</div>
<% } %>
</v-card-title>
<v-data-table
:headers="headersDetail"
:items="desserts"
:footer-props="footersDetail"
:search="searchDetail"
:options.sync="optionsDetail" class="elevation-1" fixed-header height="350px"
item-key="num"
<%--item-key="num"--%>
<%-- :server-items-length="desserts_count"--%>
>
<v-divider inset></v-divider>
<template v-slot:top>
<v-toolbar flat color="white">
<div class="d-flex w-100">
@@ -2063,6 +2175,14 @@
<span class="badge rounded-pill bg-secondary">陽上</span>
<span v-html="getTabletText(item.f_num_tablet).left"></span>
</div>
<div v-if="getTabletText(item.f_num_tablet).mid_left">
<span class="badge rounded-pill bg-secondary">左正名</span>
<span v-html="getTabletText(item.f_num_tablet).mid_left"></span>
</div>
<div v-if="getTabletText(item.f_num_tablet).mid_right">
<span class="badge rounded-pill bg-secondary">右正名</span>
<span v-html="getTabletText(item.f_num_tablet).mid_right"></span>
</div>
<div class="d-none">
{{item.f_num_tablet}}
</div>
@@ -2128,14 +2248,17 @@
<v-icon title="刪除" color="red" class="mr-2" @click="deleteItem(item)">
mdi-delete
</v-icon>
<v-icon title="編輯牌位" color="blue" class="mr-2" @click="editTablet(item);">
<%-- <v-icon title="編輯牌位" color="blue" class="mr-2" @click="editTablet(item);">
mdi-file-document-edit-outline
</v-icon> --%>
<v-icon title="編輯牌位" color="blue" class="mr-2" @click="editTabletNew(item);">
mdi-file-document-edit-outline
</v-icon>
<v-icon title="編輯牌位New" color="blue" class="mr-2" @click="editTabletNew(item);">
mdi-file-document-edit-outline
</v-icon>
<v-icon title="列印" color="blue" class="mr-2" @click="printItem(item);" v-if="canPrint || lists.length==0" >
<%--<v-icon title="列印" color="blue" class="mr-2" @click="printItem(item);" v-if="canPrint || lists.length==0" >
mdi-printer
</v-icon>--%>
<v-icon title="預覽" color="blue" class="mr-2" @click="printItemNew(item);" v-if="canPrint || lists.length==0" >
mdi-printer-eye
</v-icon>
</div>
+2
View File
@@ -20,11 +20,13 @@ public partial class admin_order_reg : MyWeb.config
public string _org_from_id_cuz_data = "";
public string _org_activity_cuz_data = "";
public Dictionary<int, string> _keyin1Item = null;
public string IsPreOrder="false";
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
IsPreOrder = ConfigurationManager.AppSettings["IsPreOrder"];
Model.pro_order order = new Model.pro_order();
ArrayList options = order.keyin1_list();
foreach (Model.pro_order.keyin optionKey in options)
+1 -1
View File
@@ -778,7 +778,7 @@
{ text: '開始日期', value: '開始日期', width: 120 },
{ text: '結束日期', value: '結束日期', width: 120 },
{ text: '報名截止', value: '報名截止日', width: 120 },
{ text: '報名數', value: '功德數量', width: 100, align: 'center' },
{ text: '功德數量', value: '功德數量', width: 100, align: 'center' },
{ text: '總金額', value: '合計', width: 120, align: 'end' },
{ text: '操作', value: 'actions', width: 120, sortable: false, align: 'center' }
],
+2 -2
View File
@@ -102,14 +102,14 @@
<v-icon left>mdi-currency-usd</v-icon>
收入統計
</v-tab>
<v-tab :disabled="!hasData">
<%-- <v-tab :disabled="!hasData">
<v-icon left>mdi-chart-line</v-icon>
趨勢分析
</v-tab>
<v-tab :disabled="!hasData">
<v-icon left>mdi-compare</v-icon>
對比分析
</v-tab>
</v-tab>--%>
</v-tabs>
<!-- 頁籤內容 -->
File diff suppressed because it is too large Load Diff
+14
View File
@@ -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_print_TabletDesign :MyWeb.config
{
protected void Page_Load(object sender, EventArgs e)
{
}
}
+4 -4
View File
@@ -138,9 +138,9 @@
<rect class="st0" height="510.2" id="TXT_x5F_L" width="98.8" x="8.6" y="483.5"/>
<rect class="st0" height="45.4" id="TXT_x5F_T1" width="283.5" x="141.7" y="8.5"/>
<rect class="st0" height="34" id="TXT_x5F_T2" width="70.9" x="484.5" y="62.1"/>
<text fill="#000000" font-family="DFKai-SB" font-size="8" font-weight="bold" id="svg_119" stroke="#000000" stroke-width="0" text-anchor="middle" transform="matrix(3.87205 0 0 4.99075 -145.896 -1658.19)" x="54.95" xml:space="preserve" y="420.1">陽</text>
<text fill="#000000" font-family="DFKai-SB" font-size="8" font-weight="bold" id="svg_120" stroke="#000000" stroke-width="0" text-anchor="middle" transform="matrix(3.87205 0 0 4.99075 -145.896 -1658.19)" x="54.95" xml:space="preserve" y="430.1">上</text>
<text fill="#000000" font-family="DFKai-SB" font-size="8" font-weight="bold" id="svg_121" stroke="#000000" stroke-width="0" text-anchor="middle" transform="matrix(3.87205 0 0 4.99075 -145.896 -1658.19)" x="54.95" xml:space="preserve" y="520.1">拜</text>
<text fill="#000000" font-family="DFKai-SB" font-size="8" font-weight="bold" id="svg_122" stroke="#000000" stroke-width="0" text-anchor="middle" transform="matrix(3.87205 0 0 4.99075 -145.896 -1658.19)" x="54.95" xml:space="preserve" y="530.1">薦</text>
<text fill="#000000" font-family="DFKai-SB" font-size="8" font-weight="bold" id="svg_119" stroke="#000000" stroke-width="0" text-anchor="middle" transform="matrix(3.87205 0 0 4.99075 -145.896 -1658.19)" x="50.95" xml:space="preserve" y="420.1">陽</text>
<text fill="#000000" font-family="DFKai-SB" font-size="8" font-weight="bold" id="svg_120" stroke="#000000" stroke-width="0" text-anchor="middle" transform="matrix(3.87205 0 0 4.99075 -145.896 -1658.19)" x="50.95" xml:space="preserve" y="430.1">上</text>
<text fill="#000000" font-family="DFKai-SB" font-size="8" font-weight="bold" id="svg_121" stroke="#000000" stroke-width="0" text-anchor="middle" transform="matrix(3.87205 0 0 4.99075 -145.896 -1658.19)" x="50.95" xml:space="preserve" y="520.1">拜</text>
<text fill="#000000" font-family="DFKai-SB" font-size="8" font-weight="bold" id="svg_122" stroke="#000000" stroke-width="0" text-anchor="middle" transform="matrix(3.87205 0 0 4.99075 -145.896 -1658.19)" x="50.95" xml:space="preserve" y="530.1">薦</text>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 81 KiB

After

Width:  |  Height:  |  Size: 81 KiB

+4 -4
View File
@@ -147,9 +147,9 @@
<rect fill="none" height="510.24" id="TXT_x5F_L" width="51.02" x="16.06" y="479.15"/>
<rect fill="none" height="45.35" id="TXT_x5F_T1" width="283.46" x="39.43" y="4.16"/>
<rect fill="none" height="34.02" id="TXT_x5F_T2" width="70.87" x="274.24" y="57.72"/>
<text fill="#000000" font-family="DFKai-SB" font-size="24" font-weight="bold" id="svg_129" stroke="#000000" stroke-width="0" text-anchor="middle" x="50.58" xml:space="preserve" y="491.14">陽</text>
<text fill="#000000" font-family="DFKai-SB" font-size="24" font-weight="bold" id="svg_130" stroke="#000000" stroke-width="0" text-anchor="middle" x="50.58" xml:space="preserve" y="521.14">上</text>
<text fill="#000000" font-family="DFKai-SB" font-size="24" font-weight="bold" id="svg_131" stroke="#000000" stroke-width="0" text-anchor="middle" x="50.58" xml:space="preserve" y="920.14">拜</text>
<text fill="#000000" font-family="DFKai-SB" font-size="24" font-weight="bold" id="svg_132" stroke="#000000" stroke-width="0" text-anchor="middle" x="50.58" xml:space="preserve" y="950.14">薦</text>
<text fill="#000000" font-family="DFKai-SB" font-size="24" font-weight="bold" id="svg_129" stroke="#000000" stroke-width="0" text-anchor="middle" x="35.58" xml:space="preserve" y="491.14">陽</text>
<text fill="#000000" font-family="DFKai-SB" font-size="24" font-weight="bold" id="svg_130" stroke="#000000" stroke-width="0" text-anchor="middle" x="35.58" xml:space="preserve" y="521.14">上</text>
<text fill="#000000" font-family="DFKai-SB" font-size="24" font-weight="bold" id="svg_131" stroke="#000000" stroke-width="0" text-anchor="middle" x="35.58" xml:space="preserve" y="920.14">拜</text>
<text fill="#000000" font-family="DFKai-SB" font-size="24" font-weight="bold" id="svg_132" stroke="#000000" stroke-width="0" text-anchor="middle" x="35.58" xml:space="preserve" y="950.14">薦</text>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 99 KiB

After

Width:  |  Height:  |  Size: 99 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 89 KiB

+674
View File
@@ -0,0 +1,674 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 28.2.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 566.9 1133.9" style="enable-background:new 0 0 566.9 1133.9;" xml:space="preserve">
<style type="text/css">
.st0{fill:none;}
.st1{fill:#040000;}
</style>
<g id="圖層_1">
<g id="TOP">
<path d="M289.1,63.7c-0.3,3.5-3,6-2.1,9.5c4.4,1.1,4.3-4.2,7.4-3.2c1.4,1.7,0.9,5.2,1.1,8.1c1.4,0.6,4-3.3,6-1.1
c1.2,2.7-3.4,4.1-2.1,7.1c2.3,0.6,3.1-4.7,6.7-2.8c1,3.8-2.9,6.6-3.5,9.9c-0.3,1.3,0.4,2.6,0.3,3.9c-0.3,5.1-3.7,7.4-8.5,9.2
c0,1.7-0.2,3.5,1.1,3.9c3.9-0.2,3.8-2.5,5.6-3.9c4.5-3.5,11.7-4.6,19.4-5.3c13.7-1.2,23.9,4,34.2,8.1c4.2,1.7,8.3,3.4,12.4,4.9
c5.9,2.3,13,6.5,21.5,3.9c1.8-0.6,5.1-3.4,5.3-4.9c0.7-6.4-8.9-3.5-12-6.7c2.8-4.8,10.3-6.2,18-4.9c1.4-6.6,8.9-4.5,9.9,1.1
c11.6-2.1,16.3,13,6.4,13.1c-3.5,0-4.9-3.7-7.4-3.5c-1.6,0.1-3.4,2.1-2.8,4.2c0.3,1.3,4.9,3.5,6.4,4.6c4.3,3.2,6.2,6.9,10.6,9.9
c2-0.5,2-2.9,5.3-2.1c1.6,1.3,1.2,2.7,1.1,5.3c1.6,0.2,4.7-0.9,6,1.1c1.2,1.6-1.8,1.6-1.4,3.5c3.7,2.9,10.1,4.9,16.6,3.9
c0.8-4.6,0.8-10,5.6-12.4c6.5-3.2,22.3-1.6,21.9,6c-3.5,4.1-10.2-0.8-15.2,0.7c-2.2,2.9-1.4,6.3-3.2,8.8c-3,4.3-8.6,1.9-14.1,3.5
c3.1,2.7,11.8,3.9,17.3,2.8c6.4-1.3,9.4-8.7,16.6-10.2c6.1-1.3,21.4,0.9,20.8,6.7c-0.5,4.8-8.5,1.8-13.4,1.8
c-6.8-0.1-11.8,4.5-14.5,5.3c-1.3,0.4-2.8,0.1-3.5,0.4c-1.5,0.5-3.1,2.2-4.2,2.5c-2.1,0.6-5.6,0.5-7.8,0.3
c-14.3-0.7-26.6-8.8-33.2-15.9c-1.5,0.4-3.4,0.4-4.9,0c0.3-4.6-3-5.7-6.3-6.7c-0.1-1.2,0.5-1.9,0.3-3.2c-0.2-1.3-2.8-5.7-4.2-6.7
c-1.8-1.3-10.4-2-15.9-2.5c-3.9-0.3-11,1.1-13.1,2.5c-2.7,1.7-4.4,6.5-8.1,7.4c0.5,7.4-2.6,11.1-6.3,14.1
c2.4,2.3,7.8-0.6,11.7-1.4c3.3-0.7,8.3,0.6,8.8-2.1c0.9-4.7-6.9-1.2-8.1-3.9c0.6-4.7,5.7-3.2,10.2-3.5c4.6-0.3,8.6-3.6,13.1-3.2
c2.1,2.1,0.9,4.8,1.8,7.1c1.3,3.3,7.1,3.2,6.4,8.1c-4.5,2.1-9-2.7-14.5-0.7c1.5,3.4,6.4,6.2,9.9,8.8c2.5-0.8,5.9-2.2,9.2-1.1
c1,1.4,0.8,3.9,1.4,5.6c0.6,1.1,2.3,1.2,3.2,2.1c0.5,0.8,0.1,2.4,0.7,3.2c3,4,11.3,5,15.5,1.8c2.2-1.7,2.9-5.6,5.3-6.7
c7.5-3.5,14.9,1.8,21.2,4.9c0.3,2.5-2.2,2.2-2.5,4.2c2.9,1.9,6.1,3.5,8.5,6c2.8,0.2,2.9-4.2,4.6-6c2.6-2.8,7.5-2.1,11.3-3.2
c4.1-1.2,6.2-4.3,9.5-3.5c2.5,0.6,3.4,3.2,5.3,4.2c5.9,0,13.2,1.8,14.1,6.7c0.6,3.2-1.7,4.5-2.1,8.1c-5.7,4.2-9.5-1.9-13.4-3.9
c-2.7,1.2-1,3.7-3.2,6c-2,2.1-5.4,1.9-5.6,5.3c-0.1,1.8,1.5,3.7,1.4,5.6c-0.1,2-2,3.3-2.5,5.3c-1.2,5.4,1.3,11.8,2.1,17.6
c0.3,2.3,0.1,5.9,0,7.8c-1.7,2.3-6.5,1.3-8.1-0.4c-2.1-3.8,0.9-7.3,0.4-10.6c-0.2-1.5-2.2-2.4-2.5-3.9c-0.2-0.8,0.7-2.4,0.7-3.2
c0.1-3.5-1.2-7.2-1.1-11.6c-3.1,0-6.7,2.5-8.8,4.6c-0.1,11-6.7,15.6-10.9,22.6c3.3,2.8,8.4-0.4,12-0.7c1.2,1.4-0.6,3.7,0,5.6
c0.6,1.9,3.9,1.9,5.3,3.9c2.4,3.5,0.3,11-4.2,10.9c-2.6-0.1-4.9-4.6-8.1-5.3c-5.7-1.1-9.4,2.1-14.5,3.5c-0.3,4,0.2,7.1,1.8,9.2
c0,1.8-2.3,1.2-2.5,2.8c1.3,4.4-0.1,9.4,0.7,14.8c0.5,3.3,3.3,7.5,2.5,10.2c-0.5,1.7-2.3,1.6-3.5,2.5c0.2,1.3,0.6,2.4,0,3.5
c-2.4,1.3-4.8,0-6-1.8c0.8-3.3-0.4-5.1-1.4-7.4c2.8-4.7-2.5-10.4,0.4-15.2c-0.2-1.5-1.4-2.2-1.8-3.5c3.4-3.2-0.9-7.9,2.8-10.6
c-1-1.4-2.1-2.6-3.2-3.9c-4.8,0.7-8,1.7-12.3,1.1c-1.6-0.2-3.1-1.3-4.9-1.4c-7-0.6-10.5,4.7-15.5,6c-3.4,0.8-6.8-0.2-10.2,1.1
c-3.4,1.2-5.2,5-8.1,6.7c-9.5,5.7-20.7,3.3-31.4,6c-4.7,1.2-8.6,3.5-12.7,4.9c-8.1,2.7-18.8,4.3-30,2.1c-1.8-0.3-3.1-1.3-4.9-1.1
c-1.8,0.2-2.7,1.7-4.2,2.5c-6.2,3-14.3,3.8-23.6,3.2c-5.5-0.3-9.4-1.9-15.9-3.5c-6.5-1.6-14.5,1.5-21.5,1.8
c-17.4,0.8-31.2-8.7-44.5-14.5c-17.7-1.9-31.7-7.6-46.2-14.1c-3.3-1.5-8.4-4.5-11.3-4.6c-1.6,0-2.8,1.1-4.6,1.4
c-3.5,0.5-7.2-0.7-10.6,0.4c-1,0.3-0.8,1.8-1.4,2.5c2.1,5.5-2,12.3,2.5,16.9c-0.3,1.2-1.3,2.1-1.4,3.5c0,0.8,1.1,2.2,1.1,3.5
c0,0.6-1.1,1.9-1.1,2.5c0.1,1,1.3,1.7,1.4,2.8c0.2,3.8-1.1,7.5-3.2,10.9c-10.5,1.5-6.2-10.9-4.6-15.5c-0.8-1.7-2.8-1.2-3.2-3.2
c-0.3-1.8,1.2-2.7,2.1-4.2c-2.1-2.6,0.8-6.1-1.8-8.1c1.2-2.9-0.4-6.7,2.5-8.1c-1.1-1.9-2.7-2.9-1.8-6c-4.7,0.2-8.8-0.6-12.7-1.8
c-2.7-0.8-5.3-2.8-7.4-3.2c-6-1-11.7,5.8-16.9,1.1c2-3.8,6.9-4.9,9.2-8.5c1.3-2,1.5-6.2,3.5-7.4c3.6-2.1,6.4,1.2,10.2,1.4
c2.9,0.1,4.7-1.5,7.4-2.5c-1.8-5.7-4.2-14.1,0-19.1c-2.2-1.9-6.6-2.2-11.3-3.2c-4.1-0.9-8.2-3.8-11.3-2.8
c-2.5,0.8-1.8,3.9-4.2,4.9c1.1,1.4,1,4.2,1.8,7.1c0.3,1.1,1.3,2,1.4,3.2c0.1,1.1-0.7,2.5-0.7,3.9c0,1.6,0.8,3.4,0.7,4.6
c-0.1,1.2-1.1,2.1-1.4,3.5c-0.6,2.6,0.1,4.8-1.1,6c-2.9,3-11.7,0.1-7.1-4.6c-2.6-2.7,0.6-4.8-1.4-7.8c1-1.5,3-2.2,3.9-3.9
c0.2-1.7-1.4-1.7-1.8-2.8c2.4-2.7-1.8-4.5,0.4-7.8c-0.2-1.1-1.6-1-1.4-2.5c1.9-1.7,2.3-5,3.9-7.1c-1.5-2.1-3.3-2.6-4.9-4.6
c-1.9-2.3-3.1-7.4-5.6-8.1c-2.3-0.6-5.1,2-8.1,1.4c-1.5-0.3-2-2-3.5-2.8c-0.6-5.9,3.8-6.8,7.8-8.1c1.4-2.5,1.5-7.9,4.9-8.5
c3.6-0.6,5.3,5.8,9.2,7.1c1.9,0.6,4.1-0.2,5.7,0c2.9,0.4,8.8,4.1,8.5,6.4c-0.6,4.2-6.5,0.6-10.2,2.1c0.3,2.7,1.5,3.1,1.4,5.6
c2.3,1.2,6.3,0.8,8.5,2.1c0.4,1.5-0.7,1.4-0.7,2.5c7.3,4.5,18.6,6.7,30.3,6c17.4-1.1,28-10.4,42.7-16.6c7.6-3.2,15.3-5.2,23.3-6.4
c7.9-1.2,16.8-0.4,24.7-4.9c-3.5-2.9-5.8-6.8-4.6-12.7c-7-1-15.1,1.6-22.9,1.1c-2.3-0.2-4.5-1.1-6.7-0.7c-2.1,0.3-5.2,2.7-7.8,4.2
c-4.5,2.6-8.3,3.7-9.9,8.1c-6.4,1.4-11.7,3.1-17.6,5.3c-7.2,2.6-12.9,7-22.9,6c-3.4-0.4-6.2-2.5-9.5-2.8
c-3.8-0.3-8.9,3.4-10.6-1.4c3.6-2.6,7.1-5.1,12.3-4.6c4.2,0.4,7.7,5.2,11.6,2.8c-2.1-1.4-6-5.4-8.8-6.4c-2.9-1-6.7,1.3-8.5-1.8
c1.4-3.1,7.9-3.6,11.6-3.2c4.9,0.5,5.4,4.9,8.8,7.1c4.9,3.1,14.4,3.1,16.9-1.4c0.2-1.8-1.1-2.2-0.7-4.2c1.9-0.9,3.9,0.4,6.4,0
c2.2-0.5,1.6-3.9,4.2-3.9c4.3,7.3,16.3-0.6,12.7-9.9c-7.2-4.9-7.7,11.7-14.1,5.3c-1.1-1.1-1.6-3.7-1.1-6c0.4-1.7,2.6-2.3,3.9-4.6
c1.8-3.3,1.3-8,5.6-8.8c2.9-0.6,5.4,1.8,8.5,2.5c2.5,0.5,6.1-0.3,8.1,0.4c2.2,0.7,5,3.7,6.7,5.3c-0.5,4.2-7.4,0.5-9.5,2.5
c3.7,5.9,15.9,5.5,23.6,3.5c-0.7-2.4-3-3.1-4.6-4.6c-1.6-1.5-2.8-3.7-4.6-5.3c-5-4.5-13.4-5.1-15.9-12.4c-4.6,1.9-6.3-2.9-9.9-3.2
c-5.7-0.4-11.7,7.2-15.5,9.5c0.2,2,2.8,1.7,2.5,4.2c-1.3,1.1-2,0.5-3.5,1.4c-2.4,1.4-3.5,5.1-5.3,5.6c-3,0.9-4.4-1-6.7-2.5
c-9.1,5.5-19.5,17-35.3,16.6c-7.8-0.2-17.7-4.3-20.5-11.3c-4.4-2.6-15.5,1.1-18.7-3.5c1.3-4.9,5.5-0.5,10.2-1.4
c4.7-1,14.5-6.7,19.4-1.1c1.5,1.7,1.4,4.5,2.5,6.4c3.2,5.7,11.5,7.2,18.7,2.5c-5.8-3.4-15.2-4.7-13.1-14.8c-5.4-2-14.9,0.1-16.9-6
c7.5,0.7,18.2-5.9,25.4-1.1c0.7,4.7-1,10.5,1.1,14.1c4.3,7.6,17.9,0.9,21.2-3.5c-0.1-1.4-1.2-2.1-0.4-3.5c2.5-0.9,5.2-0.1,6.7-2.5
c-0.1-1.5-0.8-3,0.4-3.9c3.2-0.5,3,2.4,5.3,2.8c3.3-2.9,5.6-5.2,9.9-8.1c1.9-1.3,5.3-3.2,5.3-4.9c0.2-6.5-6.4,0.1-8.5,0.3
c-9.1,1.1-10.9-14,1.8-12.7c1.4-0.1,0.2-2.9,1.1-3.5c3.5-4.2,7.4,1.3,10.6,1.4c1.8,0.1,3.2-1.9,5.3-2.1c5-0.6,9.5,3.2,7.4,9.2
c-12.9,1.8-3.7,8.9,6.7,8.1c8.6-0.6,16.2-5.3,25.4-8.8c19.7-7.5,46.9-10.1,63.5,3.9c-0.2-2.9-4-3.8-6-5.6c-1.3-1.2-2-2.9-3.2-3.9
c-1.6-1.4-4.1-1.9-4.9-3.9c-0.8-2,0.4-4.7-0.4-7.1c-0.5-1.8-3.2-2.1-3.2-4.6c3.7-2.5,6.4,3.3,9.5,2.5c2.9-4.4-4.5-4.4-5.3-7.4
c3.3-5.6,7.6,3.2,11.6,2.5c3.3-0.6,3.2-4.2,1.4-7.4c0-1.7,1.7-1.6,2.5-2.5c-1-2.7-0.3-4.9,1.8-4.9c2.4,0,1.7,2.9,3.9,3.5
c1.3-0.7,0.6-3.4,1.4-4.6C282.8,63.9,286.7,60.5,289.1,63.7z M275,80c-1.3,2.5-4.4,3.7-8.1,2.8c-1,1.7,0.4,3.9-0.4,5.3
c-2.2,1.1-4.8-1.1-6.7-0.4c-1.3,5.9,3,9,6,11.3c1,0.8,1.4,2.1,2.5,2.8c2.5,1.7,7.9,2.9,11.6,2.8c10.8-0.1,22.9-3,18.7-14.1
c0.2-1.4,2.1-1.2,2.1-2.8c-5.4,1-7.7-0.7-5.3-6c-0.9-0.7-3.4,0.1-3.5-1.4c0.1-2,0.8-4.2,0-6c-2.9,0-3.7,2.2-6,2.8
c-1.1-0.1-1-1.3-2.1-1.4c-3.9,4.5-5.9,0.4-6.7-3.5C272.9,71.9,275.5,77,275,80z M159.6,99c-1.8-0.6-2.9-1.8-5.6-1.4
c-0.5,1.1-0.6,2.7-1.4,3.5c-3,1.2-6.7,1.8-8.5,4.2c0.1,3.1,1.6,4.8,4.2,5.3c1.9-1,2.3-2.3,4.2-2.8c4.7-1.3,7.2,2.9,11.6,3.5
c1.6-1.8,0.1-4.1,0.7-6c0.9-2.9,4.8-3.5,4.9-5.6C167.5,97.7,163.3,99.3,159.6,99z M353.4,109.6c-8.4-3.9-16.6-7.2-26.5-7.8
c-7.4-0.4-15.5-0.3-20.5,2.1c-2.8,1.3-4.7,4.1-7.8,5.6c-7.6,3.8-19.7,5.8-29.3,1.4c-4.3-2-6.5-5.2-9.5-6.7
c-5.9-2.9-15.1-4.7-24.3-4.6c-23.2,0.4-37.4,15.7-62.5,14.8c-12-5.2-21.7,4.7-27.5,11.3c3.3-1.6,6-3.7,9.2-6
c2.8-2.1,5.8-5.5,9.5-5.6c3.1-0.1,4.2,2.3,7.4,3.5c1.5,0.6,4,0.4,5.3,1.1c1.9,1,2.7,3.6,4.6,5.3c4,3.6,8.7,4.6,12.7,6.7
c2.1,4.1,4.4,8.1,9.9,8.8c0.5-2.4-2.1-4-3.5-5.6c-1.4-1.7-2.5-4.1-4.6-5.3c-2.1-1.2-5.1-1.1-7.4-2.1c-4-1.9-6-5-7.1-9.5
c1.1-1.5,6.3-0.2,9.5-0.7c1.3-0.2,2.5-1.1,3.9-1.4c3.9-0.9,7.5-1.4,11.3-2.8c3.3-1.2,6.6-2.9,10.2-4.2c9.2-3.2,26.7-7.3,36.7-3.2
c10.1,4.1,16.5,12.7,30.7,11.6c11-0.8,16.1-6.5,24.3-9.5c4.7-1.8,11.1-2.5,17.6-2.5c13.6,0.1,20.9,5.6,31.4,10.2
c4,1.8,16.9,4.9,17.3,7.1c0.6,3-6.6,6.4-7.8,9.5c-0.8,2.2-0.3,4.2-0.7,5.6c-0.6,2.1-2.2,2.8-2.1,4.9c4.6-0.6,4.8-5.5,4.9-10.6
c4.1-2.1,5.3-8.1,9.9-9.9c3-1.2,7.5,0.1,10.2-2.5C374.2,119.8,363.9,114.6,353.4,109.6z M389.7,103.6c4,0.3,5.5,2.9,8.5,4.2
c1-1.7,1.5-3.9,3.9-4.2c2.3,0.4,2.1,3.3,4.2,3.9c4-2.7,6.4,2.6,10.2,1.1c-0.1-5.5-6-5.3-10.6-5.3c-1-0.9-0.2-3.6-2.1-3.5
C400.9,102.9,392.1,100,389.7,103.6z M280,109.6c0.8,1.5,3.9,1.9,4.2-0.4C284,106.8,279.8,107,280,109.6z M216.5,113.5
c-6.1,2-12.5,3.4-16.2,7.1c2.3,4.2,8.3,4.6,9.5,9.9c5.6-2.6,10-6.9,15.2-10.2c5.4-3.5,10.7-6.6,18-7.8c2.8-0.4,6.1,0.2,7.8-2.1
C238.5,105.8,226.2,110.2,216.5,113.5z M396.7,111c0.7,2.4,5.6,3.1,5.6-0.4C400.9,109.7,397.2,108.2,396.7,111z M319.1,111
c1,3.5,5.2,4.5,7.8,6c2.9,1.7,6.1,3.2,8.8,4.9c5.6,3.5,9.9,9.2,16.2,11.6c1.4-0.7,2-2.2,1.8-4.6c1.7-2.5,5.9-2.6,6-6.7
c-3.7-3.6-10-4.6-15.5-6.4c1.8,3.3,6.2,4.2,9.5,6c-1.8,2.6-2.5,6.5-5.6,7.8c-5.7-3.7-9.9-10.1-15.5-13.4c-2-1.2-5-1-6.3-3.5
c3.7-0.9,7.6,0.8,11.3,1.1C333.4,111,324.9,110,319.1,111z M348.8,139.6c-10.2-6.8-18.1-13-28.6-19.1c-5.2-3-12.7-8.4-18.7-7.8
c-6.2,0.7-11.5,6.1-18.7,6.7c-6.4,0.6-9.7-2.3-13.8-3.5c-3.4-1-7.4-1.7-12.3-1.4c-9.4,0.5-16.9,4.8-23.3,8.5
c-3.1,1.8-6.8,3.4-9.2,5.3c-4.8,3.9-7,9.7-13.1,12.7c-7.1,3.5-14.6,3.2-25,4.6c6.4,2.7,13.2,0.9,18.7,0c5.8-0.9,11.5-2.4,15.5-6
c1.8-1.6,2.9-4.1,4.6-5.6c7.7-6.7,20.6-16.1,32.5-17.3c13.3-1.4,19.2,8.8,32.5,6c3.9-0.8,7.7-4.2,12.4-4.6
c6.4-0.5,13.9,3.9,19.4,7.1c5.7,3.3,11.7,6.9,15.9,10.9c3,2.9,5.4,6.2,8.5,8.1c5.5,3.4,12.8,5.5,19.4,5.6
c3.7,0.1,8.5-0.2,11.7-2.1C363.7,149.5,357.2,145.3,348.8,139.6z M397.1,116c-0.1-1-0.6-1.5-1.8-1.4
C395.3,115.7,396.2,115.8,397.1,116z M399.2,116.3c3.7,0,3.9,3.7,7.4,3.9c-0.2,0.7-1.1,0.7-0.4,1.4c2.4,0.3,4.4,1,7.4,0.7
c-0.1-2.6-4.8-0.7-6.4-1.8C408.2,117.4,401.8,114.9,399.2,116.3z M338.9,118.8c3.3,1.2,8,9.8,11.3,4.2c-5.5-0.1-6.1-5.2-11.3-5.6
C338.9,117.8,338.9,118.3,338.9,118.8z M397.5,119.8c0.9,0.8,3.6,1.2,3.5-0.7C400.7,117.1,397.2,117.5,397.5,119.8z M240.1,129.7
c-2.9,2.1-10.6,8.8-9.9,12.4c0.4,2.2,3.1,1.9,6.7,3.2c2.3,0.8,3.6,2.5,5.3,2.8c1.5,0.3,3.2-0.3,4.9,0c2.5,0.4,5.1,2.2,7.8,2.5
c3.3,0.4,6.4,0.1,9.2,0.7c3.2,0.7,5.7,1.9,7.8,2.1c4.1,0.4,9.7-0.7,14.5-0.4c2.8,0.2,5.1,0.9,7.4,0.7c1.6-0.2,2.3-1.1,4.9-1.4
c3.7-0.5,8.6,0.4,12.4-0.4c3.6-0.7,7.5-2.5,11.3-3.2c5.5-1,9.3-2.1,9.5-5.3c0.4-4.9-7.7-11-11.6-13.8c-4.1-2.9-11.6-8.2-16.6-8.8
c-4.2-0.5-7.9,1.7-11.6,2.8c-3.5,1-8,1.9-12.3,1.4c-8.3-1-11.9-6.4-20.1-4.9C252.4,121.4,246.2,125.3,240.1,129.7z M92.3,124.4
c1.5,2.5,6-0.1,9.2,0.7c1.3,8,4.2,17.2,13.4,15.2c-8.1-1.1-10.9-7.4-10.9-16.6C99,123.2,96.7,124,92.3,124.4z M415.8,130.4
c0.5,0,0.9,0,1.4,0c0.9-1.2-0.1-2.8-1.4-2.8C415.1,128.3,415.6,129.6,415.8,130.4z M136.7,129.7c1.1,1.6,2.2,3.2,3.9,4.2
c2.2-0.6,3.9-1.8,4.6-3.9C142.5,129.1,138.8,126.4,136.7,129.7z M459.6,131.1c1.9,0.5,8.2-0.2,10.6-0.7
C467.7,129.5,461,128.9,459.6,131.1z M170.6,133.6c-2.6-3.2-8.8-3.9-9.5,1.4c-0.2,1.1,0.6,1.2,0.4,2.5c-2.2,1.6-7.4,3.3-4.2,7.1
c3.2-1.4,4.9-4.3,8.5-5.3c-0.2-2-2.4-3.2-1.4-5.3c9-1.4,3.5,11.4,10.9,10.6c0.8-2.4-2.2-2.3-2.5-4.2c-0.6-4,3.2-3.9,6.7-5.3
C178.5,131.7,174,134.3,170.6,133.6z M420,134c0.1,2.2,5,1.7,5.6,0.4c-1.2-0.3-1.2-1.6-2.5-1.8C422.2,133.1,421.1,133.5,420,134z
M132.1,132.9c-1.1,1.5-3.5,2.5-5.3,3.9c-1.6,1.2-4.3,2.8-3.5,4.2c3.8-2.6,9-3.8,10.9-8.1C133.5,132.9,132.8,132.9,132.1,132.9z
M385.5,136.8c0.1,2.7,3.5,2.1,5.3,3.2c1.9-2,5.8-1.9,7.1-4.6C395,133.3,390.3,137.4,385.5,136.8z M77.1,137.1
c7.2-0.5,9.3,5,12.7,8.1c6.4,5.8,20.3,5.9,27.5-0.7c-6.3-0.1-11.4,4.5-18.3,3.2c-6.8-1.3-8.7-9-13.8-12.4
C81.7,135.6,79,134.9,77.1,137.1z M431.3,143.1c-0.4-2.9-1.6-4.9-4.2-5.6C427.4,140.4,428.6,142.6,431.3,143.1z M394.6,143.1
c1.8,0.7,5.6,1.1,7.8,0.4C402.4,139.8,395.4,140.6,394.6,143.1z M438.4,143.1c0.6,0,1.2,0,1.8,0c0.2-1.1,0.2-0.7,0-1.8
C439.2,141.6,438.2,141.7,438.4,143.1z M477.5,143.1c-2.1,1-3.3,3.9-5.6,5.6c-4.1,3-8.2,3.9-13.4,4.6c-3.5-1.1-8.8-2.2-12-2.5
c3.2,3.2,9.3,2.9,13.7,3.2c10.9,0.6,12.2-6,18-8.5c4.4-1.9,9.8,0.4,14.5-0.7C489.9,141.2,481.5,141.2,477.5,143.1z M389,143.8
c1,0.8,2.1,0.6,3.2,0C392.4,141.9,388.8,141.9,389,143.8z M446.1,143.5c0.5,0.5,2.4,0.6,2.1-0.7
C447.3,142.4,446.6,142.6,446.1,143.5z M336.8,153.7c-5,1-10.9-0.7-15.9,0.4c-2.8,0.6-5.1,3.4-7.8,3.9c-3.7,0.7-8-0.2-12,0
c-11.3,0.6-25.2,1.7-36.3-1.1c-1.8-0.4-3.2-1.5-4.9-1.8c-5.8-0.7-10.4-0.1-14.8-1.4c-2.1-0.6-3.7-2.5-6-3.2
c-3.3-1-7.7-0.7-11.3-2.1c-5-2-10.1-7.9-13.1-1.4c2.2,1.7,4.8,2.6,7.4,3.9c2.4,1.2,5,3,7.8,3.9c2.3,0.7,5.2,0.4,7.8,1.1
c2.5,0.6,4.7,2.6,7.4,3.2c3.6,0.8,7.1,0,10.6,0c5.3,0,8.9,2,12.4,2.8c9.5,2.4,19.9,0.9,28.6,0c6.4-0.7,12.4,0.8,18.4,0.3
c3.8-0.3,7-2.4,10.9-3.2c3.1-0.6,6.2-0.2,9.2-1.1c3-0.9,6.3-2.3,8.8-3.5c2.5-1.2,6.1-2.4,7.1-4.9
C345.8,148.8,342.1,152.6,336.8,153.7z M393.9,150.5c-2.8-2.1-5.7-3.8-9.2-4.9c-0.1-0.3-0.3-0.4-0.7-0.4c-4.2,3.3,1.9,4.2,4.9,5.6
c4.5,2.2,8.4,5.9,12,6.4C399.8,154,396.4,152.4,393.9,150.5z M395.3,157.6c-1.7-1.5-4.2-2.8-7.1-3.9c-2.4-0.9-5.6-2.9-8.1-3.2
c-2.8-0.3-4.5,0.8-7.1,1.1c-9.3,0.9-19-1.4-22.9,3.5c0.7,1.7-1.6,3.3-1.1,4.6c1.2,1.1,3.7,1,5.6,1.4c1.3,0.6,1.3,2.4,2.5,3.2
c4.9,1.4,11.8,1.6,16.9,2.5c13.8,2.3,22.1,6.9,33.2,12.4c13.9,6.9,29.3,12.9,46.9,14.1c9.3,0.6,15.3-1,21.5-3.5
c0.2-4,2.5-5.7,4.9-7.4c0-2.1,0.1-4.3-0.3-6c-4.5-0.4-7.2,2.8-10.9,1.1c-0.7,3.2-4.3,4.5-7.1,3.9c-2.3-0.5-3.8-5.2-6-6.7
c-1.9-1.3-4.9-1.7-8.1-1.4c-5.9,0.5-12.9,2.9-19,3.2c-5.5,0.2-11.2-0.6-15.2-4.9c-1.9-2-2.3-4.5-3.9-4.9c-1.7-0.5-3.7,0.7-4.9,0.4
c-2.3-0.6-1.9-3.2-3.5-4.2c-1.9-1.1-3,0.6-4.9-0.7C395.9,160.8,396,158.9,395.3,157.6z M216.8,157.6c0.2-2.9-1.2-4.2-3.5-4.6
C212.3,155.3,214.2,157.6,216.8,157.6z M222.8,155.5c-1.9,3.3,2.6,7.6,6.4,6.4C230.5,157.7,226,156.3,222.8,155.5z M114.8,157.9
c1.1,1.1,4.4,0.5,5.6-0.4C119.7,156.7,115.1,156.2,114.8,157.9z M150.8,160.8c1.7,0.6,3.7-1.2,6-1.1
C156.8,154.5,149.6,157.8,150.8,160.8z M334.7,160.1c2,1.5,6.4-0.3,7.1-2.5C339,156.8,335.2,157.6,334.7,160.1z M409.1,157.2
c-1.2,0.9-2.6,1.7-3.5,2.8c0.9,3.3,4.3,3.8,6.7,1.4C411.1,160.2,410.8,158,409.1,157.2z M239.4,163.6c0-3.3-2-4.6-5.6-4.2
C233,163.3,236.4,164.5,239.4,163.6z M323,162.9c1.5,1.1,5.7,0.8,5.3-2.1C326.3,160.6,323.2,160.3,323,162.9z M242.6,161.1
c0.7,3.3,4.4,5.4,7.8,4.9C251.4,162.3,245.4,160.9,242.6,161.1z M217.2,162.2c0.5,0.5,2.3,0.5,2.8,0
C220.2,160.4,217.1,161,217.2,162.2z M440.5,162.2c-0.3,3.7-5.6,4.3-6,6.7c4.8-0.7,8-5,12.7-5.6c1.2-0.2,3.1,0.8,3.9-0.4
C448.9,160.9,443.3,160.5,440.5,162.2z M345.9,162.9c1.3,0.6,3.6,1.1,3.9-0.7C349,161.7,345.9,161.4,345.9,162.9z M78.5,165.7
c-3.3-0.6-5-3.8-7.4-3.5c-1.3,0.5-0.9,2.6-1.4,3.9c-2.3,2.2-7.2,1.7-7.1,6.4c3.5,0,7.2,0.1,10.2-0.3c-0.2-2.4-1.4-4.9,0.7-6
c2.7,1.2,4.5,3.2,4.9,6.7c-0.9,0.9-3,0.5-4.2,1.1c1.4,4.7,4,8.2,8.5,9.9c0.6-1,1.4-1.6,1.8-2.8c-2-2.4-4.7-5.7-3.5-10.2
c1.4-2.1,7.4,0.3,8.1-2.5C87.6,164.4,82.5,166.4,78.5,165.7z M254.9,164.6c1.5,1.1,4.6,2.4,7.1,1.4
C262.1,163.4,255.4,162.3,254.9,164.6z M289.1,166.8c1.8,3.6,8,1.3,9.5-1.4C295.9,163.2,291.9,165.8,289.1,166.8z M201.6,166.8
c-15.5,0.9-26.2,3.9-37.4,9.2c-15.1,7.1-28.7,15.2-47.6,15.2c-5.5,0-10.7-0.9-15.2-2.1c-4.3-1.2-8.3-4-13.1-3.2
c-0.1,2.2,2.9,2.9,4.6,3.5c6.1,2.2,13.4,4,20.1,4.6c13.5,1.1,24.8-2.6,34.6-6.4c7.3-2.8,13.6-6.7,20.8-10.2c7.5-3.7,15.5-5,24-7.1
c4.4-1.1,8.7-1.8,13.4-2.1c4.8-0.4,10.5,0.8,13.4-2.1C214.5,163.3,207.7,166.4,201.6,166.8z M311.7,167.1c2,0.7,5.3,0.3,5.3-2.1
C315.1,164.3,311.3,164.4,311.7,167.1z M323.7,165.4c0.2,2.2,4.5,2,6.4,1.4C329.3,164.3,326.2,164.7,323.7,165.4z M124.7,168.9
c-5.3,0.4-8.5-3.9-13.1-3.5c-0.5,0.3-0.8,0.9-0.7,1.8c0.7,1,2.6,0.7,4.2,0.7c3.2,2.3,14.3,3.9,16.6-0.3
C128.5,166.9,127.2,168.7,124.7,168.9z M273.3,167.1C268.7,160.7,268,171.5,273.3,167.1L273.3,167.1z M299.7,167.1
c0.7,2.7,7.1,1.5,7.1-1.1C305.2,163.9,300.9,165.7,299.7,167.1z M490.6,165.4c-0.4,0-0.7,0-1.1,0c-1.9,0.8-2.1,3.2-4.6,3.9
c-5.1,1.4-12.9-1.8-12.4,5.6c4.4-0.8,8.6-3.3,13.1-1.1c0.3-2.7,1.9-4.2,4.2-4.9c1.7,1,2.1,3.3,3.2,4.9c6.7-1.3,9.3,3.3,13.4,3.5
c0.7-1.2,0.4-4.1,0-5.3C501.5,169.5,492.9,170.6,490.6,165.4z M445.1,166.1c0,0.5-0.2,0.8-0.3,1.1c1.4,1.7,6.2,1.3,7.4-0.4
C450.6,165.9,447,165.4,445.1,166.1z M399.9,178.1c-16.1-8.7-34.7-12.2-60.3-12c-0.4,0-0.4,0.3-0.7,0.4c0,0.4,0.1,0.8,0.7,0.7
c24.3,0.9,43.1,4.5,59.6,12.7c16.1,8,31.9,18.2,54.7,16.2C431.5,194.4,416,186.7,399.9,178.1z M282.8,167.8
c-0.6-1.2-3-0.6-4.6-0.7C277.5,169.4,282.9,170.4,282.8,167.8z M256,168.9c-0.4,2.3,3.9,2.3,3.5,0
C258.9,168.3,256.6,168.3,256,168.9z M314.2,169.6c1.1,2.2,7.4,2.4,8.5,0C321.5,168.2,315.2,167.7,314.2,169.6z M303.2,170.3
c0,0.4,0,0.7,0,1.1c0.9,1.6,3.6,2.3,5.7,1.8C309.2,170.2,305.5,169.5,303.2,170.3z M451.1,170.6c2.4,0.5,5.4,0.4,7.4,1.4
C458.5,169.5,452.6,169.3,451.1,170.6z M419.3,170.6c1,4.5,12.5,4.8,15.5,1.8C429.3,172.8,423.4,171.4,419.3,170.6z M247.2,174.9
c-16.7,4.9-29.6,11.7-40.6,20.8c-4.6,3.8-8,8.4-12.3,12.3c-9.4,8.5-18.9,13.9-30.3,18.7c-8.8,3.7-18.6,6.6-29.3,7.8
c-3.3,0.3-7.4-0.7-10.6,1.8c15.6,2.5,29-3.5,40.6-7.8c6.7-2.4,12.5-4.2,18-7.1c10.1-5.2,18.9-15.7,26.5-23.3
c10.2-10.2,28.2-14.3,42.7-19.8c2.5-1,6.8-1.5,7.8-4.9C256.1,171.3,251.4,173.6,247.2,174.9z M206.6,173.1
c-30.5,1.8-44.3,23.6-76.6,24.3c0.5,8.8,7.8,8.4,13.8,11.3c4.8,2.4,7.5,6.9,11.6,8.5c14.8,5.6,22.1-13,31.8-17.6
c8-3.9,15.1-6.9,21.9-11.3c5.1-3.3,11.3-7.1,12-13.4C217.2,173,211.8,172.8,206.6,173.1z M486,180.5c2.3,0.2,3-1.2,3.5-2.8
c-1.4-0.8-2.9-0.4-4.6-1.4C484.8,178.2,485.2,179.6,486,180.5z M422.1,199.6c-3.5-1.4-6.8-3.1-10.2-4.6c-20.3-9-42.6-17.6-71.3-18
c-0.4,0-0.4,0.3-0.7,0.4c0.1,0.3,0,0.7,0.4,0.7c11.9,7.3,28.4,16.9,39.5,25.8c4.2,3.3,7,7.3,10.9,10.9c2.8,2.7,11,8.3,15.5,7.8
c5.1-0.6,6.8-8.6,10.6-11.3c5.4-3.9,14.1,0,15.5-7.4C429.4,201.4,425.5,200.9,422.1,199.6z M311.7,178.4c0.4,3.4,4.8,3.1,6.7,3.5
c20.9,4.8,31.8,17.1,46.2,27.9c7.8,5.8,15.6,12.7,24,18.3c8.3,5.5,19.1,10.8,30.7,10.2c-45.2-10.4-60.4-50.8-106.2-60.7
C312.6,177.9,312.2,178.2,311.7,178.4z M276.4,183.3c-4.7-0.5-8.9-3.8-12-3.2c-0.3,0.1-0.4,0.3-0.3,0.7c3.1,3.2,11,5.7,16.9,6.4
c5.5,0.6,6.6-1.6,9.9-2.8c3-1.1,7.2-0.1,8.1-3.2C292,180.2,284.6,184.1,276.4,183.3z M259.9,182.3c-2.2,2.1-6.2,6.2-10.2,7.4
c-3.5,1.1-7.1,0.5-10.6,1.4c-2.8,0.7-6.3,2.1-8.8,3.5c-9.5,5.3-18.2,14.5-28.2,19.4c-5.9,2.9-15.5,5.7-15.2,13.8
c0.2,3.8,5.1,7.1,9.5,7.1c3.8,0,10.5-2.5,7.4-7.4c-1,0-12.1,5.6-12.7-1.1c-0.6-6.5,8.9-6.2,13.8-7.8c5.2-1.7,8.4-7.7,12-10.6
c2.5-2,5.4-3.3,8.1-5.3c2.8-2.1,5-4.4,7.8-5.6c6-2.8,15.4-2.4,21.5-4.9c2.6-1.1,5.8-3.9,9.2-4.6c2.5-0.5,5.4,0.5,6.3-1.1
C266.6,184.9,263.1,183.7,259.9,182.3z M351.2,213.3c-6-4.8-11.3-14.4-18.3-16.9c-5.2-1.8-14.2-0.5-19.1-4.2
c-3-2.3-4.2-6.7-7.4-7.8c-2.6-0.9-5.1,0-6,0.4c-2.2,0.9-5.2,0.8-7.8,1.1c-2,0.2-3.3,2.2-4.9,2.8c-3.3,1.2-6.6,0.8-9.9,1.1
c6.1,11,19.1-3.8,25.1-3.2c3.2,0.3,5.8,6.4,8.8,8.1c5.2,3,13.7,2.2,18,3.9c7.3,2.7,10.3,12.5,16.2,17.6c2.5,2.2,6.4,4.1,10.6,6
c3.7,1.7,10.1,2.8,9.5,7.1c-0.4,2.7-3.8,2.5-6.3,2.5c1.2,4,8.3,2.2,11.6,1.4C378.3,221.1,358.6,219.2,351.2,213.3z M352.3,222.5
c-3.3-1.6-7.1-3.6-9.9-6.4c-4.1-4.1-9.5-13.7-14.5-15.5c-7.4-2.8-15.4-1.6-21.2-6.4c-1.3-1-2.9-4.7-5.3-4.9
c-2.5-0.2-6.1,3.2-7.4,3.9c-5,2.4-11.7,3.3-16.6,0.7c-1.5-0.8-2.6-2.7-4.6-3.5c-9.4-3.9-15.9,3.4-23.6,5.3
c-5.6,1.4-12.1,1-16.6,3.5c-2.1,1.2-3.7,3.4-6,4.9c-2.3,1.6-5.3,2.5-7.1,3.9c-3.1,2.4-4.4,6.5-7.4,9.2c-5.1,4.5-15.1,1.9-18,9.2
c0.8,1.1,3.4,1.4,4.9,0.7c2-0.1,0.5-3.7,2.5-3.9c4.9-0.1,5.3,4.4,7.8,6.7c4.2,2.1,9-2.7,13.1-2.1c2.4,0.4,4.2,4.4,6,5.6
c5.7,3.9,16,4.2,25.1,3.5c3.2-0.2,6.3-2.1,9.5-2.1c2.3,0,4.3,1.5,6.7,2.1c8.4,2.2,19.6,2.1,27.2-0.7c1.8-0.7,3.3-2.4,5.3-2.5
c2.2-0.1,4.5,1.7,6.4,2.1c6.7,1.4,13.2,1.1,18,0c5.2-1.2,7.8-4.7,12.4-6.4c6-2.2,10.4,1.2,15.5,0.7c0.7-5.5,5.1-2.2,7.8-1.8
C360.6,224.3,355.6,224.1,352.3,222.5z M459.6,196.8c2.4-0.4,6.4,0.9,6.7-1.4C464.3,194.7,460,194.8,459.6,196.8z M456.7,199.6
c-4.2,3.3-7.3,7.1-11.6,9.9c-4.3,2.7-9.8,2.6-15.2,5.3c-4.5,2.3-7.4,8.5-11.3,11.3c-1.5,1.1-4.2,1.6-4.9,3.5
c10.1,2.1,12.4-7.1,19.4-11.3c9.7-5.8,24-5.7,25.4-18.7c-0.5,0-0.9,0-1.4,0C457,199.6,456.9,199.6,456.7,199.6z M130.4,215.1
c4,7.1,11,14.8,20.8,13.8c-1.8-2.7-5.2-3-7.8-4.6c-2.3-1.5-4.9-3.8-6.7-6c-1.5-1.8-2.1-4.2-3.9-5.3c-2.3-1.4-5.5-1.2-7.8-2.5
c-4.2-2.3-6.7-5.8-8.8-10.2c-0.4,0-0.7,0-1.1,0C116.4,209,123.5,211.9,130.4,215.1z M457.8,215.5c1-0.7,1.2-4.4-0.4-4.6
C457,211.7,456.6,215.1,457.8,215.5z M114.5,216.2c1.8-0.1,1.8-3.8,0-3.9C113.7,213.5,113.7,215,114.5,216.2z M119.1,218.6
c1.3-0.9,2-6.1-0.7-6C117.4,214.1,117.1,218.1,119.1,218.6z M123.7,222.2c1.3-1,2.1-6.7-0.7-6.7
C122.1,217.3,121.6,221.3,123.7,222.2z M446.9,220.7c1.2-0.2,0.8-3.2,0.3-3.9c-0.3,0-0.7,0-1.1,0
C445.8,217.9,445.2,220.7,446.9,220.7z M128.2,225.3c1.7-1.1,1.3-6.1,0.4-7.8c-0.4,0-0.7,0-1.1,0
C126.8,219.6,126.1,224.3,128.2,225.3z M99.7,221.8c-2.2-0.3-2.5-3.2-5.3-1.8c1.2,3.4,8.7,2.3,8.5,6c-3.4,3.7-6.1-1.6-9.2-2.5
c-0.2,3.9-5.2,3-6.4,6c3.3,1.1,6.8-0.4,9.2-1.4c5.6,1.9,10.4,6.5,16.9,6.4c-1.1-3.5-5.4-3.1-5.6-6.4c-0.3-3.1,3.9-4.9,3.5-9.2
C106.8,217.6,103.7,222.3,99.7,221.8z M441.9,222.5c1.6,0.3,1.6-4.2,0-3.9C441.4,219.4,441.4,221.8,441.9,222.5z M437.3,227.1
c1.2-1.1,2.1-6.7-0.7-6.7C435.7,222.1,435.3,226.3,437.3,227.1z M115.5,222.5c-2.8,0-4.7,3.3-4.2,5.6c0.9,4.4,11.5,5.7,16.6,4.6
C127.1,229.6,118.8,222.5,115.5,222.5z M432,230.6c1-1.2,0.9-4.7,0.4-6.4c-0.5,0-0.5-0.5-1.1-0.4C430,225.3,429.5,230.2,432,230.6
z M447.9,225c1.6,2.5,5.3,2.9,8.1,4.2c0.8-0.7,1.8-1,1.4-2.8C454.6,225.8,451.3,223.9,447.9,225z M132.8,226
c-1.7-3.6-4.1,2.9-1.1,3.2C132.5,228.5,133,227.6,132.8,226z M462,226.7c0.7,0.5,3.2,0.5,3.9,0C466.4,224.2,461.6,224.5,462,226.7
z M135.7,230.3c1.1-0.5,1.1-3.8-0.4-3.9C134.6,227.1,133.9,230.1,135.7,230.3z M140.2,231.7c1.2-0.3,1.1-4-0.4-3.9
C139.1,228.6,138.7,231.4,140.2,231.7z M442.6,228.5c-1.5,0.3-3.6,2.7-5.6,3.9c-2.3,1.2-5.7,1.7-5.7,3.9c6.3,1.3,15.9,0,18.7-4.6
C448.5,229.3,445.6,227.8,442.6,228.5z M426,232.4c1-0.8,1.6-3.3-0.7-3.2C424.6,230.1,424.9,232.3,426,232.4z M465.2,230.3
c-3.2,0.4-14,3.9-14.1,6.7c5,1.1,8.6-3.4,13.7-2.8c2.1,0.3,3.8,2.7,6,0.7C471.4,231.7,468.8,229.8,465.2,230.3z M167.4,231.3
c1.3,5,9.4,9.4,16.6,11.6c3.8,1.2,7.5,1.9,11.3,2.5c4.4,0.7,8.9,0.5,13.1,1.1c3.2,0.5,6.4,3.7,9.2,4.9c9.3,4.3,21,6.4,34.9,5.3
c2.7-0.2,4.9-1.3,7.8-1.1c2.3,0.2,4.8,1.6,7.1,2.1c8.7,2,22.7,2.6,32.1,0c2.2-0.6,4.5-2.4,6.7-2.5c3.5-0.1,6.2,1.4,9.5,1.4
c7.8,0,14.3-1.3,20.1-3.2c5.6-1.8,10.6-5.2,16.9-6.7c9.3-2.2,19.3-0.4,27.2-3.9c2.4-1.1,5.5-5,8.8-6.4c2.6-1.1,5.4-0.3,5.6-2.1
c0.3-2-3.2-1.9-3.9-1.8c-5,0.6-9.4,5-13.8,6.4c-8.9,2.8-14.8,1.7-23.6,2.8c-4.4,0.6-8.5,3.6-12.3,5.3c-7.7,3.3-14.2,5.3-24.3,4.6
c-3.3-0.2-6.9-1.6-9.5-1.4c-2.9,0.2-6.4,2.4-9.9,3.2c-8.1,1.8-17,1.6-25,0.4c-4-0.6-7.6-2.8-11.3-3.2c-3.7-0.3-7.7,1.2-11.3,1.4
c-12.5,0.9-23.7,0-32.8-4.6c-2.5-1.3-5-4.4-7.8-4.9c-3.8-0.8-8.3,0.3-12,0c-6-0.4-11.3-2.1-15.5-4.2c-4.5-2.3-8.7-6.8-12.7-7.8
C168,230.8,167.7,231,167.4,231.3z M349.8,232.7c-2.5-0.3-5.2-1.6-7.8-1.4c-4.2,0.4-7.5,4.1-10.9,5.6c-5.2,2.3-12.3,2.8-18.7,2.1
c-3.2-0.3-6.5-2.6-10.2-2.5c-3,0.1-6.2,1.5-8.8,2.1c-7.6,1.8-15.8,3.3-24.7,0.4c-1.8-0.6-3.1-2-4.9-2.1c-3.9-0.2-8,1.9-11.6,2.1
c-4.6,0.3-9.2,0.4-13.4,0c-7-0.7-11.5-5.7-18.3-7.4c-0.9-0.2-0.4-0.2-1.4,0c-3.7,0.7-8.9-0.3-12.7,2.1c2.2,5.7,9.3,1,13.4,1.4
c2,0.2,3.8,2.3,5.6,3.2c8,3.9,17,5.2,26.8,4.2c3-0.3,6.4-1.3,9.9-1.1c6.5,0.5,12.7,4.1,19.1,4.2c8.1,0.2,14.9-4,22.9-4.6
c3.3-0.3,6.2,0.9,9.5,1.1c5.3,0.3,11.8-0.1,17.3-0.7c5.8-0.7,11-6,17.3-6.4c3.7-0.2,7.9,2.3,10.9-0.4
C357.6,231.5,353,233.2,349.8,232.7z M420.4,234.9c1.5,0,1.1-2.2,0.7-3.2c-0.5,0-0.9,0-1.4,0C419.3,232.6,418.9,234.8,420.4,234.9
z M163.5,242.6c1-2.2,1.1-7,0-9.2c-0.4,0-0.7,0-1.1,0C161.7,235.7,160.7,242,163.5,242.6z M158.6,240.5c1.5-1.1,1.7-6.1-0.4-6.7
C157,234.9,156.3,240,158.6,240.5z M153.3,239.5c1.9,0.1,1.5-2.7,1.1-3.9c-0.4,0-0.7,0-1.1,0C152.8,236.6,152.8,238.4,153.3,239.5
z M167.4,245.4c2.6-0.5,2.4-7.8,0.3-8.8c-0.2,0-0.5,0-0.7,0C166.3,239.4,166,243.2,167.4,245.4z M120.1,239.8
c1.1,0.4,1.2,0.1,2.1-0.4C122.4,237.7,119.6,237.6,120.1,239.8z M398.9,242.6c0.8-1.2,1.3-4.3-0.7-4.6
C397.2,238.8,396.8,242.8,398.9,242.6z M393.6,243.3c1-0.9,1.3-4.9-0.7-4.9C392.6,239.5,391.6,243.3,393.6,243.3z M406.3,242.6
c1.3-0.6,1.6-3.8-0.7-3.5C405.1,239.8,404.6,242.9,406.3,242.6z M173.1,246.5c1.6-0.8,1.2-4.7,0.4-6c-0.4,0-0.7,0-1.1,0
C171.4,241.9,171,246,173.1,246.5z M387.9,244.7c1.6,0.4,1.6-3.9,0-3.5C387.6,242.6,387.6,243.3,387.9,244.7z M177.3,247.9
c1-0.9,0.9-4-0.4-4.6C176.3,244.4,175.6,247.5,177.3,247.9z M119.8,244.7c0,0.4,0,0.7,0,1.1C122.3,247.6,122.3,242.9,119.8,244.7z
M383.3,250.7c2.1-0.3,1.9-6,0-6.4C382.8,246,382.8,249.2,383.3,250.7z M182.6,250c1-0.7,1.3-5.1-0.3-5.3
C180.9,245.6,180.6,249.7,182.6,250z M378.8,252.2c1.6-0.9,1.5-5.5-0.4-6C377.5,247,377,251.8,378.8,252.2z M187.2,251.1
c0.7-1.1,1.3-3.8-0.7-3.9C185.6,248.1,185.3,251.1,187.2,251.1z M374.2,254.6c1.4-1.7,1.1-5.2,0.3-7.4c-0.3,0-0.7,0-1,0
C372.8,249.5,372.2,253.3,374.2,254.6z M444,249.3c1.1,0,2.3,0.2,2.1-1.1c0-0.9-1.2-0.7-2.1-0.7
C443.8,248.7,443.8,248.2,444,249.3z M191.4,252.2c1.9-0.1,1.9-4.1,0-4.2C190.6,249.1,190.6,251,191.4,252.2z M196.3,253.2
c2.3-0.8,1.7-3.3,1.1-4.9c-0.4,0-0.7,0-1.1,0C195.3,249.4,195.5,252,196.3,253.2z M201.6,254.6c2.1-0.7,1.7-5.6-0.4-6
C200.1,249.9,199.6,253.8,201.6,254.6z M207.3,256.7c1.4-1.4,1.8-7.2-0.3-8.1C205.1,249.9,204.8,255.8,207.3,256.7z M119.1,250.7
c0.5,0.5,1.7,0.5,2.1,0C121.3,249,119,249,119.1,250.7z M369.6,255c1.3-1.2,1.1-3.6,0.4-5.3c-0.4,0-0.7,0-1.1,0
C368,251.2,367.9,254.2,369.6,255z M364.3,255.3c1-0.6,1.3-4.8-0.7-4.6C363.5,252.4,362.7,254.7,364.3,255.3z M359,256
c0.8-0.8,1.5-4.7-0.3-4.9C357.9,252.5,357.6,255.1,359,256z M349.1,257.8c2.1-0.3,1.9-5.7,0-6C348.3,253.6,348.3,256,349.1,257.8z
M211.9,258.9c1.1-1.8,1.5-5.4-0.4-6.7C210.2,253.6,209.9,257.9,211.9,258.9z M353.7,256c1.8-0.1,1.4-2.1,1.1-3.5
c-0.4,0-0.7,0-1.1,0C352.8,253.5,353,254.9,353.7,256z M344.2,261.7c2.3-0.8,2.3-6.6,0-7.4C343.1,255.7,343.1,260.2,344.2,261.7z
M441.9,256c1.1,0,2.3,0.2,2.1-1.1c0-0.9-1.2-0.7-2.1-0.7C441.7,255.4,441.7,254.9,441.9,256z M119.4,255c0,0.4,0,0.7,0,1.1
C122,257.9,122,253.1,119.4,255z M217.9,261c0.7-1.2,1.4-5.4-0.4-6c-0.2,0-0.5,0-0.7,0C216.4,256.8,215.8,260.5,217.9,261z
M340.3,262.7c1.1-1.8,1.7-6.2-0.7-7.1C338.4,257.4,337.8,262,340.3,262.7z M222.8,262.4c1.3-0.9,2-6.4-0.7-6.4
C221.2,257.2,220.6,262.2,222.8,262.4z M228.1,264.1c1.3-1.2,1.7-5.7-0.4-6.4c-0.2,0-0.5,0-0.7,0
C226.3,259.6,225.6,263.8,228.1,264.1z M233.7,258.1c-2.1,1.7-2.3,6.8,0,8.5C236.8,266.1,236.6,258.7,233.7,258.1z M333.9,264.9
c2-1,1.6-5.2,0.4-6.7C331.4,258.1,331.5,264.5,333.9,264.9z M256.7,264.5c2.1-0.1,2-5.8,0-6C254.7,259.1,254.7,263.9,256.7,264.5z
M239.7,267c1.2-1.2,2.2-7.6-0.7-7.8C238.2,261.2,237.7,265.9,239.7,267z M261.3,265.2c1.6-0.7,1.3-4.8,0.4-6c-0.4,0-0.7,0-1.1,0
C259.7,260.9,259.4,264.3,261.3,265.2z M307.8,264.1c1.3-1.1,1.2-3.5,0.4-4.9c-0.4,0-0.7,0-1.1,0
C306.4,260.6,306,263.6,307.8,264.1z M323,264.1c1.1-1.2,1.6-4.3-0.4-4.9C320.8,259.8,320.8,264,323,264.1z M328.3,264.1
c1.5-0.5,1.3-4,0.4-4.9c-0.4,0-0.7,0-1,0C326.7,260.5,326.5,263.6,328.3,264.1z M245,267.3c1.8-1.2,2.2-7.1-0.4-7.8
C243.2,261,243,266.3,245,267.3z M251.4,265.9c2.5-0.1,2.4-6.2,0-6.4C249.2,260.2,249,265.3,251.4,265.9z M265.5,267
c2.3-0.8,2.3-6.6,0-7.4C264.1,261.4,264.2,265.1,265.5,267z M303.2,265.9c1.5-1.1,1.3-4.8,0.4-6.4
C300.3,259.4,300.6,265.6,303.2,265.9z M312.8,263.4c1.3-0.6,1.5-3.7-0.4-3.9C311.7,260.4,311.2,263.1,312.8,263.4z M318.4,263.8
c1.1-0.6,0.9-3.6,0-4.2c-0.4,0-0.7,0-1.1,0C316.6,260.7,316.1,263.9,318.4,263.8z M120.8,261.7c2.1,0.8,2.4-2.2,0.4-1.8
C120.9,260.3,120.7,260.9,120.8,261.7z M271.8,268c1-1.4,1.4-6.5-0.4-7.4C270.5,262,270.1,267.2,271.8,268z M298.7,267.3
c1-1.3,1.3-6-0.4-6.7C296.9,261.9,296.7,266.5,298.7,267.3z M443,261.3c0,0.5,0,0.9,0,1.4c0.9,0.8,2.6,0.3,2.5-1.1
C444.8,261,444,260.9,443,261.3z M286.7,261.7c-1.7,1.3-2.2,6.7,0.4,7.4C289.4,268.2,289.4,262.2,286.7,261.7z M276.8,267.7
c1.5-0.5,1.2-3.9,0.7-5.3c-0.5,0-0.5-0.5-1.1-0.4C275.6,263,275.1,267.2,276.8,267.7z M282.1,268.4c0.9-1.6,1.3-5.7-0.7-6.4
C279.9,263.1,279.6,268.2,282.1,268.4z M293.4,267c1.2-0.7,0.7-3.7,0.3-4.9c-0.3,0-0.7,0-1.1,0C291.9,263.2,291.3,266.7,293.4,267
z M120.5,267c0.9,0.4,1.1,0.8,2.1,0.4C123.1,265.1,120.3,265.2,120.5,267z M443.3,268c0,0.5,0,0.9,0,1.4c0.8,0.7,2.3,0.3,2.5-0.7
C445.2,267.9,444.5,267.4,443.3,268z M120.8,273.3c1.1,0.2,0.7,0.2,1.8,0C123.2,271.1,120.3,271.1,120.8,273.3z M443.3,273.7
c-0.1,1.3,1.6,1.8,2.5,1.1c0-0.5,0-0.9,0-1.4C444.7,272.9,444,273,443.3,273.7z M119.1,277.6c0,1.1,2.5,1,2.1-0.4
C120.8,276.3,119,276.3,119.1,277.6z M442.6,281.4c0.5,0.5,2,0.5,2.5,0c0.1-1.2-0.4-1.7-1.4-1.8
C443.1,280,442.5,280.3,442.6,281.4z"/>
<path d="M277.5,83.5c7.9-1.1,17,1.7,17.3,8.8c0.6,13.4-28.6,13.3-28.6,0.4C266.2,87.5,270.8,84.4,277.5,83.5z M269,94.1
c1.5,9,25.1,9,22.9-2.8c-0.4-2-2-3.4-4.2-4.2c-0.3,4.2,0.1,11.1-5.6,10.2c-0.3-2.7,2.6-2.1,3.2-3.9c0.4-3.4-1.4-5.2,0-7.8
C277.6,83.6,267.7,86.1,269,94.1z"/>
<path d="M162.8,106.1c-3,2.9-7.8-0.9-7.4-3.5C156,98.3,163.9,101,162.8,106.1z"/>
<path d="M235.5,111.7c-3.8,3.3-8.8,3.6-13.1,5.6c-4,1.9-5.7,6.9-10.2,7.8c-2.4-1.6-6.2-1.8-7.4-4.6c0.8-0.7,2.2-0.8,3.9-0.7
c5.2-2.6,11.5-4.7,18.3-6.7C230.1,112.2,232.6,110.3,235.5,111.7z M211.9,122c2.1,0.8,3.8-1.2,4.6-2.8
C214.6,118.5,211.8,119.6,211.9,122z"/>
<path d="M263,123.7c7.5,0,13,4.8,20.5,4.9c7.1,0.1,11.5-5.8,19.8-4.9c4.8,0.5,10,4.7,14.5,7.8c1.9,1.3,3.9,3.3,6,5.3
c1.4,1.3,5.2,3.8,4.6,6.4c-0.8,3.5-7.3,2.4-11.3,3.5c-2.1,0.6-3.1,2.9-5.3,3.5c-4.2,1.3-7.8-0.8-12.7-0.7
c-1.9,0.1-3.5,1.1-5.6,1.4c-2.9,0.4-7-0.7-10.9-0.7c-2.1,0-3.8,0.6-5.6,0.4c-2.2-0.3-3.5-1.7-5.6-2.1c-3.1-0.6-6.1,0.5-8.8,0.4
c-1.7-0.1-3.5-0.9-5.3-1.1c-2-0.2-4,0.3-6,0c-2-0.3-16-4-16.6-5.6c-1.4-4.2,8.6-11.2,10.9-12.7C250.9,125.8,255.4,123.7,263,123.7
z M263.7,146.7c2.5,0.1,5.1-0.7,7.8-0.4c1.9,0.2,3.7,1.5,5.6,1.8c6.6,0.9,14.8-0.4,19.8-0.7c4.3-0.2,7.6,1.1,10.6,0.7
c2.6-0.4,4.1-2.5,6.7-3.2c3.5-0.9,9.2-0.3,9.9-2.8c0.9-3.3-7.3-7.9-9.9-9.5c-4.4-2.8-8.9-6.1-13.4-6.4c-5.6-0.4-11.1,3.9-17.3,3.9
c-5.4,0-10.6-3.4-16.2-3.9c-9.1-0.8-14.8,2-19.8,5.3c-3.6,2.4-8.3,5-8.8,9.9C246.3,144.3,254.4,146.2,263.7,146.7z"/>
<path d="M254.2,132.2c3.4-0.6,5.6,0.3,5.6,2.8C259.9,142.8,242.7,134.2,254.2,132.2z M254.2,135.7c1.1,0,2.3,0.2,2.1-1.1
c-0.4-0.4-1.2-0.4-2.1-0.4C254.2,134.8,254.2,135.2,254.2,135.7z"/>
<path d="M311,135.4c-0.5,4.7-9.2,4.4-9.5,0.7C301,131.8,309.6,131.3,311,135.4z M305,135.4c-0.2,1.3,1,1.1,2.1,1.1
C307.8,134.6,305.6,134.8,305,135.4z"/>
<path d="M291.3,133.6c1.7-0.4,6-0.1,6,2.8C297.1,144,280.4,135.9,291.3,133.6z M291.6,137.1c1.1,0,2.3,0.2,2.1-1.1
c-0.4-0.4-1.2-0.4-2.1-0.4C291.6,136.2,291.6,136.7,291.6,137.1z"/>
<path d="M266.2,134.3c3.1-0.6,5.7,0.2,5.6,2.8c0,4.4-9.2,4.3-9.2,0C262.7,135,263.9,134.7,266.2,134.3z M266.2,137.8
c1.1,0,2.3,0.2,2.1-1.1c-0.4-0.4-1.2-0.4-2.1-0.4C266.2,136.9,266.2,137.4,266.2,137.8z"/>
<path d="M278.6,134.7c2.3-0.7,6.5-0.4,6.7,2.5C285.6,144.5,269,137.7,278.6,134.7z M280,138.2c1.1,0.2,1.6-0.3,1.4-1.4
C280.4,135.7,278.9,137.2,280,138.2z"/>
<path d="M216.1,178.1c-1.2,2.6-4.4,3.6-6.7,4.9c-11.5,6.4-25.4,12.2-36,21.2c-3.1,2.6-8.4,9.7-12.3,10.2c-7.4,0.9-7.8-5.9-12-9.2
c-4.3-3.4-8.6-1.5-12.4-5.3c2.3-2,5.4-2.2,8.1-2.8c8.6-2.1,16-4.1,23.6-8.1C182.4,181.7,196.8,173.4,216.1,178.1z M172,189.7
c-6.8,3.7-13.7,6-21.5,8.1c-2.3,0.6-5.3,1.1-7.4,2.8c2.4,2.2,7.2,1.9,10.2,3.5c1.4,2.4,2.5,7.7,6.7,7.8c3.5,0.1,8.5-6.7,11.3-9.2
c7.9-6.9,17-10.4,25.8-15.2c4.5-2.4,9-5,12-8.5C193.4,177.9,182.7,184,172,189.7z"/>
<path d="M426.7,203.8c-2.5,4.1-8.9,4.3-14.1,5.6c-2.5,3.5-5.1,9.7-9.9,9.5c-3.2-0.1-4.3-4.1-6-6.4c-2.1-2.7-5.9-5.8-9.2-8.8
c-9-8.4-21.4-16.8-33.2-21.5c-0.1-0.4,0.1-0.6,0.4-0.7C385.7,180.7,402,197.4,426.7,203.8z M366.1,185.8
c11.1,3.7,21.2,12.7,29.3,21.5c1.3,1.5,6.7,8.6,8.8,8.5c3.7-0.2,4-6.5,6-8.8c2.7-1.2,6.1-1.7,9.2-2.5c-3.5-3-8.1-3.8-12.3-5.6
c-12.9-5.6-26.2-12.3-41.3-14.5C365.7,185,365.8,185.5,366.1,185.8z"/>
<path d="M309.2,199.9c2.2-0.7,6.6-0.4,6.7,2.5C316.4,209.9,299.5,202.8,309.2,199.9z M309.9,202c0,0.4,0,0.7,0,1.1
C312.5,204.9,312.5,200.2,309.9,202z"/>
<path d="M240.4,205.9c1.2-3.7,9.1-3.6,9.5,0C250.4,210.2,241.1,211.1,240.4,205.9z M244.3,205.9c-0.3,1.9,2.2,1.5,2.1,0
C246,205.4,244.8,205.4,244.3,205.9z"/>
<path d="M263,205.2c2.6-0.7,5.9-0.4,6.4,2.1C270.8,215.5,253.1,208,263,205.2z M263.7,207.3c-0.5,1.6,1.4,1.7,2.1,1.1
C265.8,207,264.8,206.8,263.7,207.3z"/>
<path d="M294.4,205.6c3.2-0.5,5.7,0.4,5.6,2.8C300,216.2,282.8,207.4,294.4,205.6z M294.4,209.1c0.6,0,1.2,0,1.8,0
c0-0.5,0-0.9,0-1.4c-0.6,0-1.2,0-1.8,0C294.4,208.2,294.4,208.6,294.4,209.1z"/>
<path d="M281,206.3c2.7-0.9,6.4-0.5,6.7,2.1C288.7,216.2,271.6,209.3,281,206.3z M283.5,209.8c0.3-0.4,0.5-0.9,0.4-1.8
c-0.6,0-1.2,0-1.8,0C281.6,209.1,282,209.8,283.5,209.8z"/>
</g>
<g id="BOT">
<path d="M432.5,1018.3c1.9-0.6,1.9-3.1,3.1-4.5c8.2,1.2,7.7-8.1,12.7-9c2.5,1.3,1,5,1.7,7.2c0.9,2.9,5.2,5,6.2,8.3
c0.6,1.8,1.1,4.6,1.7,7.2c0.6,2.7,1.6,5.6,1.7,7.2c0.7,13.1-12,14.3-15.5,25.1c18.3,2.9,36.9,11.4,57.8,10.7
c3.1-0.1,7-1.9,8.6,1.7c-1.7,5.4-7,7.2-12.4,8.9c-6.5,8.7-15.4,13.9-27.2,17.2c-2.5,0.7-5.6,1-8.3,2.1c-3,1.2-5.9,4-9,5.9
c-6.5,3.8-13.5,5.4-23.1,6.5c-4.1,0.5-9,0.1-13.4,1c-3.2,0.7-5.7,3.3-8.6,4.5c-8.5,3.3-21,1.6-31.3,1.7c-4.2,0-8.5,0.5-12.4,0
c-3.5-0.4-6.3-2.1-11-1.4c-6.5,1-12,2.8-18.2,2.4c-10.5-0.6-18.9-4.7-27.9-9.3c-3.5,1.8-5.4,5.1-9,7.2
c-6.3,3.8-14.6,5.3-17.9,12.4c-3.2-2.1-5.9-7-10.3-9.3c-3.3-1.7-7.9-2.2-11.7-4.1c-1.4-0.7-3.2-1.9-4.8-3.1
c-1.2-0.9-3.5-3.2-4.5-3.4c-3-0.6-10.3,2.9-14.8,3.8c-4.7,0.9-10.8,2-16.2,2.4c-7.9,0.6-15.8-0.2-22.4,0.3c-2.8,0.3-6.3,0.1-9.3,0
c-3.3-0.1-6.8,0.1-9.6-0.3c-3.6-0.6-7.2-3.3-12.4-3.8c-3.4-0.3-6.5,0.3-9.6-0.4c-2-0.4-3.9-1.7-5.8-2.1c-3.5-0.7-7.1-0.3-10.3-0.7
c-15-1.9-28.2-8.3-41-13.1c-5-1.9-10.6-3.1-14.5-7.2c2.4-2.8,8.9-1.4,12.1-3.4c-2-3.9-7.3-3.1-11.4-4.1c-8-2-14.5-5.1-21-10
c-3.5-2.6-11.7-10.4-1.4-11c2.6-0.2,5.3,0.5,8.3,0.3c7.7-0.4,16.6-1.8,25.1-2.8c8.4-0.9,16.9-1.3,23.1-4.5
c-5.7-3.6-11.5-4.6-16.2-10.3c-7.7-9.5-5.3-31.2,4.5-37.2c0.5-2.8-3-3.1-1.7-5.5c9.4,0.8,10.2,10.3,14.8,15.8
c3-5,5.4-10.7,11.7-12.4c0-1.5-1.1-1.9-0.7-3.8c13.5-13.6,35.9-17.5,59.9-20.3c11.8-1.4,24.2-2.4,36.8-3.1
c44.6-2.4,92.5-1.2,132.2,3.8c21.4,2.7,42.2,6,59.6,14.5c4.9,2.4,12.3,7.2,12.4,12C431.9,1011.6,426.2,1017.1,432.5,1018.3z
M194.7,987c-10.3,1.3-23.1,3.5-31.7,5.5c-7,1.6-25.4,5.5-24.4,12.7c0.4,3.1,8.9,5.5,13.1,6.5c16.6,3.9,36.9,4.9,54,5.8
c49.3,2.7,98.2,6.5,152.8,5.2c12.1-0.3,24.1-0.5,36.8-2.4c8.6-1.3,28.2-3.8,28.9-11c0.4-4.2-5.9-8.6-11.4-11
c-4.7-2-12.3-3.9-17.9-5.2c-37.5-8.6-83.5-11.5-129.1-9.3C240.9,985.1,218.3,983.9,194.7,987z M113.8,1019
c0.2-3.2-1.8-7.1-4.8-8.3C105.2,1014,111.6,1017.3,113.8,1019z M441.5,1018c3.2-0.3,4.3-2.9,4.8-5.8
C443.5,1012.9,442.3,1015.2,441.5,1018z M135.8,1019.3c2.9,0.2,1.6-5.1,1.4-6.9C133.8,1011.5,135,1018.3,135.8,1019.3z
M141,1023.1c1.9-1.4,1-6.9,0.7-9.3C137.8,1013.2,138.5,1022.8,141,1023.1z M126.5,1015.6c-2.9,1.2-2.3,6.1-1.4,8.3
c1.1,2.5,5.3,4.8,7.9,7.2c3.1,2.8,5.1,6.6,7.9,6.5C141.1,1026.6,131.8,1022.2,126.5,1015.6z M144.8,1015.9c-0.3,0.5-0.6,1-1,1.4
c1.2,5.3-2.9,16,3.1,16.5c0.9-4.6,0.7-12,0-17.6C146,1016.2,145.8,1015.6,144.8,1015.9z M150.6,1028.6c4.1-0.1,2.4-9.1,1.7-11.7
C147.8,1016.5,149.4,1026.6,150.6,1028.6z M156.5,1025.2c1.7-0.8,1.3-6.5,0.3-7.9C154.1,1017,154.4,1025,156.5,1025.2z
M115.5,1044.1c-0.4-5.7,1.9-11.6,0-15.8c-1.8-3.9-6.9-10.2-10.3-10.3c-0.9,4.7-2.4,13.6,1.4,16.2c0.9-2.8,0.8-8.4,3.4-8.3
c1.8,6.8,0.1,19.5,5.5,23.7C116.9,1047.8,115.7,1046.2,115.5,1044.1z M162.7,1021.4c0.5-0.6,0.5-2.5,0-3.1
C159.9,1017.5,159.9,1022.2,162.7,1021.4z M173.3,1029.7c1.5-1.3,2-9.2-0.3-10C170.8,1020.6,170.7,1029.2,173.3,1029.7z
M167.5,1023.8c0.6,0,1.1,0,1.7,0c0.5-0.7,0.5-3.1,0-3.8C166.6,1019.2,166.9,1022.6,167.5,1023.8z M447.7,1035.9
c1.1-1.6,0.7-4.8,1.7-6.5c0.8,0.2,2.1,0.7,2.8,0c-0.2-2.8-0.1-8.5-3.4-9.3C445.4,1022.2,441.6,1033.7,447.7,1035.9z M181.9,1020.7
c0,0.4-0.4,0.5-0.3,1c0,2.7,0,6.2,0,9.3c0,3.2-0.8,6.9,1,8.6c2.4-1.3,1.4-5.6,1.4-9c0-3.5,0.3-7.5-0.3-10
C183.1,1020.7,182.5,1020.7,181.9,1020.7z M178.2,1032.8c2-1.9,0.9-8.7,0.7-11.7C175.3,1021.1,176.2,1031.6,178.2,1032.8z
M423.6,1024.2c1.1-0.6,0.9-3.6-1-3.1C422,1021.8,421.7,1024.7,423.6,1024.2z M419.5,1027.6c0.3-1.3,1.2-6-0.7-6.2
C417.9,1022.2,417.1,1027.9,419.5,1027.6z M187.1,1021.7c-0.1,0.5-0.6,0.6-0.7,1c0,2.7,0,6.3,0,9.6c0,2.9-1.1,7.4,1.7,7.6
c1.8-1.5,1-5.9,1-9.3c0-3.5,0.9-7.9-1.4-9C187.6,1021.7,187.3,1021.7,187.1,1021.7z M193.3,1034.1c1.8-2.1,1.3-9.7,0.3-12.4
C190.3,1022.1,190.7,1033.3,193.3,1034.1z M414.6,1033.5c1.6-1.7,1.7-9.7,0-11.4c-0.2,0-0.5,0-0.7,0
C413.8,1025,412.6,1031.7,414.6,1033.5z M436.3,1060.6c11.2-9.7,3.8-25.6-1.4-37.9c-0.2,0-0.5,0-0.7,0
c-6.6,3.9-14.6,9.2-19.3,16.2c6.1-3.8,10.6-9.1,18.2-11.4c2.3,1.6,2.7,5.2,3.4,8.3c0.8,3.3,2.1,6.4,2.8,9.3
c3,13.9-10.5,19.1-20.7,20.6c-1.8,0.3-4.8-0.1-5.8,2.1C423,1068.2,430.8,1065.4,436.3,1060.6z M197.8,1031c2.4-0.4,1.3-6,1-7.9
c-0.4,0-0.5-0.4-1-0.3C197.2,1024.8,197.2,1029,197.8,1031z M203.6,1026.9c1.2-0.2,0.8-3.4,0.3-4.1c-0.3,0-0.7,0-1,0
C202.6,1023.6,201.9,1027.1,203.6,1026.9z M219.5,1023.1c-2.1,0.8-1.6,5.9-0.7,7.6C222.6,1031.7,221.9,1023.1,219.5,1023.1z
M226.7,1034.8c1.9-1.8,1-8.1,0.7-11C222.9,1021.3,222.7,1035.3,226.7,1034.8z M409.8,1033.8c1.6-1.3,1.9-9.5-0.4-10.3
C408,1024.8,407.4,1033,409.8,1033.8z M405.7,1033.8c1-2,1.4-8.5-0.3-10C402.6,1024.1,402.6,1034,405.7,1033.8z M230.8,1035.5
c2.9-0.7,2.4-10.1,0.3-11.4C228.9,1025.2,229.2,1033.9,230.8,1035.5z M400.2,1028.3c0.6,0,1.2,0,1.7,0c0.5-0.8,0.5-3.3,0-4.1
c-0.6,0-1.2,0-1.7,0C399.7,1026.2,400.1,1026.2,400.2,1028.3z M166.5,1028.3c-0.9-1.1-1.4-2.6-2.1-3.8c-0.2,0-0.5,0-0.7,0
c-3.3,1.8-7.7,4.4-10.7,7.6c-11.4,12.2-8.6,40,14.5,38.2c5.7-0.4,9.1-3.7,12.7-7.6c-3.9,1.3-7.2,4-11.7,4.5
c-5.2,0.5-11.1-0.7-14.5-4.1c-9.9-10.3-1.6-29.3,8.3-33.7c1.7,4.8,6.4,6.4,9.6,9.3c2.1,1.9,4.3,4.2,5.8,6.9c1.8,3,1.6,6.2,5.5,8.3
C184.8,1041,172.7,1036.2,166.5,1028.3z M236,1025.2c0,0.7-0.9,0.4-0.7,1.4c0.7,3.5-1.6,10.1,1.4,11.4c1.9-2.2,1.3-10,0.3-12.7
C236.7,1025.2,236.3,1025.2,236,1025.2z M256.3,1034.5c2-0.9,0.9-6.6,0.7-8.6c-0.5,0-0.9,0-1.4,0
C255.4,1028,254.3,1033.5,256.3,1034.5z M240.5,1027.3c0.4,3.6-1.6,13.3,1.4,14.5c1.4-3.6,0.7-11,0.3-15.1c-0.4,0-0.5-0.4-1-0.3
C241.1,1026.8,240.3,1026.5,240.5,1027.3z M251.8,1039.3c1.3-2.8,0.7-9.4,0.3-12.7c-0.4,0-0.5-0.4-1-0.3
C250.3,1029.1,249.3,1037.5,251.8,1039.3z M377.8,1034.5c1.8-0.9,1.3-6.8,0.3-8.3C375.4,1026,375.7,1034.2,377.8,1034.5z
M386.8,1029.3c1.5,0.2,1.7-2.2,1-3.1c-0.5,0-0.9,0-1.4,0C385.7,1027,386.1,1028.9,386.8,1029.3z M245.3,1027.3c0,2.6,0,6.1,0,9.3
c0,2.9-1.1,7.1,1.7,7.6c2.2-1,1.4-5.2,1.4-8.6c0-3.3,0.6-7.4-1-9C246.3,1026.4,246,1027.1,245.3,1027.3z M266.6,1030.7
c0.5-0.8,0.5-3.3,0-4.1C263.8,1025.8,263.8,1031.5,266.6,1030.7z M302.4,1026.6c-0.8,2.1-1.8,11.9,0.7,12.7
c1.9-2.1,1.2-10,0.3-12.7C303.1,1026.6,302.8,1026.6,302.4,1026.6z M327.5,1026.6c0.3,3.1-2.5,10.9,1.7,10.7
c0.7-2.7,0.3-8.1,0.3-10.3C329.2,1026.5,328.4,1026.5,327.5,1026.6z M261.1,1031.7c2-0.2,1.9-5-0.3-4.8
C260,1027.5,259.3,1031.7,261.1,1031.7z M298.6,1038.3c0.9-2.3,1.6-9.7-0.3-11.4c-0.2,0-0.5,0-0.7,0
C297.5,1029.9,296,1036.9,298.6,1038.3z M322.4,1026.9c-1.4,2.3-2.4,12.2,0.7,13.4c1.3-2.9,0.7-9.6,0.3-13.1
C323,1027.2,322.9,1026.8,322.4,1026.9z M332.7,1033.8c0.7,0,1.4,0,2.1,0c0.4-1.7,0.8-5.7-0.3-6.9
C331.1,1026.3,332.5,1032,332.7,1033.8z M367.1,1027.6c0.9,4.4-2,13.6,1.7,15.1c2.2-0.6,1.4-4.9,1.4-7.9c0-3,0.9-7.3-1.4-7.9
C368,1026.9,367.8,1027.4,367.1,1027.6z M381.6,1033.8c0.8,0,1.6,0,2.4,0c0.7-1.6,0.2-4.4,0.3-6.5
C380.5,1025,380.9,1031.5,381.6,1033.8z M230.1,1073c9.5-3.9,18.4-16.1,10.3-26.5c-6.6-8.5-23.3-11.6-30.6-19.3
c-8,4.5-17.6,11.2-20.3,20c-3.8,12.5,7.8,22.1,19.3,25.1c-3.4-4.4-10.9-6.9-13.1-13.1c-4.4-12.4,8.3-21.6,15.5-26.8
c8.9,7.9,30.5,10.5,28.6,26.8c-0.8,6.6-8.2,11.5-13.8,13.1c-1.7,0.5-4.3-0.2-5.5,1.7C223.3,1076.3,227.3,1074.2,230.1,1073z
M294.5,1035.5c1.3-1.4,0.7-6.3,0.3-8.3c-0.3,0-0.7,0-1,0C293,1028.8,292.2,1035,294.5,1035.5z M289.3,1032.8
c1.6-0.3,1.1-3.8,0.7-5.2c-0.6,0-1.1,0-1.7,0C287.9,1028.9,287.3,1032.9,289.3,1032.8z M307.6,1027.6c0,0.5-0.2,0.8-0.3,1
c0,2.3,0,5.2,0,7.9c0,2.6-0.9,6.2,1.4,6.5c1.2-1.5,0.7-5.1,0.7-7.9c0-2.9,0.8-6.5-1-7.6C308,1027.6,307.8,1027.6,307.6,1027.6z
M337.5,1032.8c1,0.3,1.1,0.3,2.1,0c-0.2-1.7,0.4-4-0.3-5.2C336.2,1027.5,337.5,1031.1,337.5,1032.8z M359.2,1038.3
c2-1.4,0.9-7.8,0.7-10.3C356.8,1026.6,356.9,1037.5,359.2,1038.3z M373.3,1037.9c0.9-1.9,1.7-9.5-0.7-10.3
C371.4,1029.8,370.8,1036.6,373.3,1037.9z M313.4,1027.9c0,0.5-0.6,0.3-0.7,0.7c0.7,4.5-1.6,12.1,1.4,14.5
c1.9-3,1.3-11.6,0.3-15.1C314.1,1027.9,313.8,1027.9,313.4,1027.9z M318.2,1027.9c-0.8,2.9-1.9,11.6,0.7,13.4
c1.9-2.4,1.3-10.5,0.3-13.4C318.9,1027.9,318.6,1027.9,318.2,1027.9z M349.2,1034.1c3.2,0.8,2.3-5.1,1.4-6.2c-0.5,0-0.9,0-1.4,0
C348.7,1029.3,348.7,1032.8,349.2,1034.1z M353.7,1035.9c2.9,0.1,1.8-6.5,1-7.9c-0.5,0-0.9,0-1.4,0
C353,1029.8,352.4,1034.5,353.7,1035.9z M270.4,1032.4c-1.7,0.6-3.8,0.5-6.2,1.4c-14.6,5.4-18.9,30-3.8,38.9
c14.1,8.3,38.5,4.9,45.4-5.9c1.9-2.9,3.7-8.6,3.1-13.4c-1.3-10.2-16.9-14.6-24.4-20c-2-1.4-3.7-4.5-6.2-5.2
c-0.4-0.1-0.6,0.3-0.7,0.3C274.7,1029,272.4,1031.7,270.4,1032.4z M371.3,1051c-4.5,11.8,3.3,25.3,14.5,25.8
c8.9,0.4,16.3-6,19.3-11.4c6.8-12.2-3.1-26.3-9-36.5c-0.3,0-0.4-0.3-0.7-0.4C386.6,1032.4,374.6,1042.3,371.3,1051z M130.7,1035.5
c-2.6-2.6-5.3-5.5-7.9-5.9c-3.1,8.3-1.6,22.6,5.8,24.8c-0.4-3.9-5.6-9.1-1.7-12.7c2.9,3.3,2.2,8.5,4.8,12.1
c2.5,3.2,6.6,5.6,11.4,4.5C144.3,1048.2,136.1,1040.9,130.7,1035.5z M361.3,1052.7c-1.1-9.1-12.9-18.4-17.2-20.3
c-4.1,3-9.8,6.4-16.2,10c-5.5,3.1-11.9,6.1-13.8,10.7c-5.2,12.1,7.7,27.7,21,21.7c-11.5-0.4-23.2-12.4-15.1-22.4
c5.3-6.6,18.9-10.1,25.5-15.5c7.6,3.7,16.5,17.5,10.7,28.2c-1.3,2.4-4.3,3.7-4.1,5.5C358.6,1068.1,362.4,1061.8,361.3,1052.7z
M418.8,1044.1c-3.2,4.2-7.9,8.7-6.5,13.8c7.8,1.2,9.4-8.7,15.5-9.3c-0.6,3.7-4,6.1-6.5,8.3c-2.6,2.3-6.5,3.7-7.2,6.9
c8.5-1.8,18.5-4.3,19.6-13.4c0.7-5.7,0.2-14.3-2.8-17.2C425.7,1034.2,422,1039.9,418.8,1044.1z M171.6,1063.4
c4.6,0.1,4.6-9.1,4.1-13.1c-0.7-5.8-11.1-14.2-15.1-15.5c-7.2,5.5-8.9,29.2,4.5,29.3c-1.1-5.1-6.7-9-5.5-14.1
C165.8,1050.1,165.8,1063.2,171.6,1063.4z M364,1045.5c2.6-1,1.2-7.7,1-10.3c-0.4,0-0.5-0.4-1-0.4
C363.5,1037.6,363.5,1042.7,364,1045.5z M218.4,1062c1.4,2.6,5.2,6.8,7.9,6.9c4.3,0.1,8.5-5.3,8.9-9.6
c1.1-10.7-8.5-14.2-14.1-17.9c-2.8-1.8-5.4-3.3-8.3-5.2c-8.1,3.3-17.5,16-10,26.2c3.1,4.2,9.8,8.5,16.2,7.6
c0.4-2.5-2.9-4.2-4.5-7.2c-1.7-3.2-4-9.9,0.3-12C217.3,1053.5,216.5,1058.5,218.4,1062z M448.7,1045.2c3.2-0.7,5.7-5.7,4.1-9
C448.8,1035.1,444.8,1042.4,448.7,1045.2z M352.7,1059.3c1.4-8.2-4.4-14.2-9-17.9c0-0.2-0.1-0.4-0.3-0.4c-1.9,2-4.2,3.2-7.6,4.8
c-2.4,1.1-5.5,2.3-7.6,3.8c-6.4,4.7-9,20.2,4.8,20.3c4.6-1.4,2.1-9.8,3.8-14.1c1.3-0.1,2.5,0,3.5,0.3c2,4.7,0.6,10.5-1.4,14.1
C345.8,1070.8,351.7,1065.3,352.7,1059.3z M127.2,1060.6c-14.6-0.5-29.9,3.2-44.1,4.5c-4.2,0.4-8.8,0-11.7,2.1
c2.3,2.2,6.9,2.4,10.7,2.4c17.2-0.1,34.7-5.7,53.7-4.8c2.8,0.1,5.6,0.9,8.6,0C140.6,1061.3,132.9,1060.8,127.2,1060.6z
M235.3,1076.5c7-1.4,15.4-1.1,22.7-1.4c-4.6-3.4-7.4-8.7-11.7-12.4C244.6,1069.2,239.6,1072.5,235.3,1076.5z M196.4,1070.3
c-3.2-2.6-6.2-5.5-10.3-7.2c-1.7,4.3-6.2,6-9.6,8.6c1.2,1.9,3.9,2.1,6.2,2.8c6.8,1.8,12,1.2,18.2-1
C201.1,1071.9,198.6,1070.4,196.4,1070.3z M461.1,1068.9c-7.1-1.9-14.8-5-21.3-4.1c-1.4,0.2-2.9,0.3-3.4,2.1
c2,2.5,4.4,1.4,6.9,1.7c6.8,0.9,14.3,2.9,21.7,4.5c7.4,1.6,15.1,4.3,21.7,4.8c3.3,0.2,8.3,0,10.3-2.8
C482.5,1074.9,472.4,1072,461.1,1068.9z M366.8,1065.1c-3.2,2.3-6.3,4.7-7.9,8.6c4.1,0.5,9.1,1.9,13.1,1.4
C372.6,1070.7,368.3,1068.4,366.8,1065.1z M136.2,1068.9c-21.3-0.7-40.6,3.8-60.9,4.8c1.8,3.2,6.6,3.9,10.3,4.8
c4.1,1.1,8.8,2.1,13.1,2.4c13,0.9,21.1-2.1,30.6-4.8c7-2,13.8-2.8,20.3-4.8C146.7,1068.2,141,1069.1,136.2,1068.9z M312.7,1072
c-0.1-2.2-1.6-2.9-4.1-2.7C308.2,1071.9,310.7,1072.8,312.7,1072z M436,1071.7c-5.9-0.7-13.3-2.7-18.2,1c7,3.9,16,6.2,25.1,9.6
c8.7,3.2,17.5,8.2,26.8,7.9c7.3-0.2,13.7-3.5,18.2-7.6C471.3,1079.3,454.2,1073.8,436,1071.7z M166.1,1075.1c-23-1-37.4,5.6-54,11
c-4.3,1.4-9.2,1.8-12.4,4.8c4.8,3.2,10,0.6,14.5-0.7c4.6-1.4,9.6-2.7,14.1-4.1c9.2-2.9,18.9-6.5,29.3-7.2
c7.4-0.5,15.9,1.1,22.7,0.3C178.2,1075.7,171.5,1075.3,166.1,1075.1z M434.2,1084c-10.1-4.1-19.6-9.6-31.7-8.3
c-2.4,0.3-4.6-0.2-5.5,2.1c13.5,1.5,24.6,3.5,35.1,8.3c4.7,2.2,10.1,4.5,15.1,6.5c4.6,1.9,12,5.9,16.5,2.1
C454.3,1091.1,444.5,1088.2,434.2,1084z M361.6,1110.2c-4-3.3-6.9-7.8-10.3-11.4c-10.3-10.6-23.9-20.4-43-22
c-4.1-0.4-10.1-0.8-11.4,2.4c16.2,3,30.7,4.8,40.3,13.8c9.1,8.5,14.5,23.5,31,22.7C367.1,1112.7,363.9,1112.1,361.6,1110.2z
M413.6,1103.7c-2.7-1.2-5.5-2.5-8.3-3.8c-5.4-2.5-9.9-5.8-15.1-9.3c-10.1-6.6-22.2-12.9-35.1-13.8c-2.8-0.2-6.5-0.1-7.6,1
c2.8,2.3,6.5,2.5,9.6,3.4c10.2,3.2,18.6,7,26.2,13.1c9.8,8,22.1,13.2,37.2,14.5C419.8,1105.7,416,1104.8,413.6,1103.7z
M214.6,1077.2c-9.7-0.3-18.6,1.8-26.2,4.5c-11.2,4-21.4,8.7-31,13.8c-4.8,2.5-9.5,6.3-14.5,7.9c-2.3,0.8-5.7-0.2-6.9,3.1
c3,2.1,7.2,0.5,10-0.3c8.5-2.6,13.4-6.8,19.6-11c10.3-7,24.7-14.4,40.3-15.5c5.5-0.4,11.4,1.6,14.8-1
C219.8,1076.8,216.9,1077.2,214.6,1077.2z M224.3,1085.8c-12.3,5.7-21,16.3-33.7,21.7c-4.2,1.8-8.8,2-12.4,4.5
c2.5,2.4,7.2,2.6,10,2.4c14.6-0.8,25.2-9.9,35.1-17.9c8.3-6.8,16.9-9.5,27.2-12.7c3.1-1,6.8-1.6,9.3-4.1
C246.2,1079.6,233,1081.7,224.3,1085.8z M303.5,1099.9c-1.7-12.1-12.5-21.1-25.8-20.3c-14,0.8-31.5,15.8-22.7,29.9
c5.2,8.3,16.8,8.5,25.8,13.8C290.1,1117,305.6,1115.8,303.5,1099.9z M145.8,1084.7c-3.9,1-7.1,2.9-11,4.5
c-7.5,3-15.4,4.5-24.1,6.9c1,3.2,5.8,3.6,9.3,4.1c14.7,2,23.2-1.3,32.4-6.9c6-3.6,12.2-6.6,16.5-10.7
C160.5,1081.8,152.3,1083.1,145.8,1084.7z M389.9,1104.7c-5.8-3.2-10.8-7.6-16.5-10.7c-7.4-4-19.8-8.9-28.6-11
c-0.4,0-0.4,0.3-0.7,0.3c0,0.3,0,0.7,0,1c5.4,3.1,10.1,7.1,15.2,12c4.7,4.6,8.1,10.7,12.7,14.5c6.4,5.2,17.3,5.8,27.9,4.1
c3.7-0.6,8-0.9,10-3.1C402.8,1109.1,396.1,1108.1,389.9,1104.7z M401.5,1092c3.3,2,7.1,3.8,11.4,5.9c5.8,2.7,17.9,10,25.8,9
c5-0.7,8.3-4.8,11.4-8.3c-16.8-7.6-34.6-15.9-59.9-13.8C393.9,1087.4,397.2,1089.4,401.5,1092z M177.8,1093.3
c-6.2,2.8-11.3,8-16.5,11.4c-1.8,1.2-4.8,1.7-5.5,4.1c13.5,2.8,25.9-2.7,36.5-8.6c7.4-4.1,15.6-8.2,17.9-15.5
C197.9,1086.1,186.9,1089.2,177.8,1093.3z M341.3,1105.7c-3.2-3.5-6.1-7.8-9.6-10.7c-6.1-5-16.6-8.5-26.5-9.3
c-0.3,0-0.4,0.3-0.7,0.4c3.3,6.6,5.3,14.7,6.9,23.1c8,7,24.9,8.8,38.9,7.6C348.4,1112.5,344.6,1109.3,341.3,1105.7z M220.5,1104.7
c-3,2-7,3.7-8.6,7.2c2.4,2.4,8.1,2,11.4,1.7c8.8-0.7,16.8-4.6,24.8-5.5c-2.6-7.1,0.3-15.1,3.4-19.6c0-0.6-0.3-0.9-0.7-1
C239.2,1091.5,229.7,1098.5,220.5,1104.7z"/>
<path d="M288.6,987.3c3.3-0.6,8.5-0.1,8.6,3.4c0.2,5.2-13.1,5.7-13.4,0.3C283.7,988.8,285.1,987.9,288.6,987.3z M288,991.8
c1.2,1.1,4.7,0.9,5.2-0.7C293.2,988.8,287,988.4,288,991.8z"/>
<path d="M263.9,988c3.8-1,9.3-0.4,9.3,3.4C273.1,1000.5,250.2,991.5,263.9,988z M263.9,991.8c0.9,1.6,5.1,2.1,5.2-0.7
C268.2,989.3,264,989.3,263.9,991.8z"/>
<path d="M317.2,988.4c9.3-1.5,10.6,7.2,2.1,7.6C312.6,996.2,309.1,989.7,317.2,988.4z M316.5,992.8c1,0.9,4.6,1.2,4.8-0.7
C321.7,989.6,315.4,989.6,316.5,992.8z"/>
<path d="M231.5,990.1c3.7-0.8,9-0.4,8.9,3.4c0,5-13,5.3-13.4,0.3C226.9,991.7,228.2,990.8,231.5,990.1z M231.2,993.9
c1,1.4,4.8,2,5.2-0.3C236,991.1,231.1,991.3,231.2,993.9z"/>
<path d="M346.5,992.1c3.7-0.9,9-0.5,9.3,3.1c0.5,5.6-13.3,5.7-13.4,0.3C342.3,993.7,343.4,992.9,346.5,992.1z M346.5,995.9
c0.5,1.5,5.1,1.7,5.2-0.3C351.4,993.2,346.4,993.4,346.5,995.9z"/>
<path d="M201.9,992.5c2.8-0.5,8.2,0,8.3,3.4c0.2,5.5-13.6,5.4-13.4,0C196.8,993.4,199.2,992.9,201.9,992.5z M200.9,996.6
c1.1,1.3,5.3,1.7,5.2-1C205.3,994,200.4,994,200.9,996.6z"/>
<path d="M177.1,996.3c2-0.2,7.7,0.4,7.9,3.4c0.3,5.2-13.3,5.7-13.4,0.3C171.5,997.1,174.1,996.6,177.1,996.3z M175.7,1000.7
c1.2,1,5.2,1.2,5.2-1C180.2,997.9,175.2,997.6,175.7,1000.7z"/>
<path d="M397.4,997.6c2.7-0.2,7.4,0.1,7.6,3.4c0.3,5.6-13.8,5.7-13.4,0C391.7,999,393.5,998,397.4,997.6z M395.7,1002.1
c1.2,1,5.2,1.2,5.2-1C400.3,999.1,395.1,999,395.7,1002.1z"/>
<path d="M372.6,999.7c3.5-0.7,8.9-0.2,8.9,3.4c0.1,5-13,5.6-13.4,0.3C368,1000.9,369.2,1000.4,372.6,999.7z M372.3,1003.5
c0.6,2,4.8,1.7,5.2-0.3C377.3,1001.4,371.9,1000.8,372.3,1003.5z"/>
<path d="M164.7,1001.8c2.5-0.1,7,0.2,6.9,3.8c-0.1,5.1-13.4,5.3-13.4,0C158.2,1003.3,160.5,1002,164.7,1001.8z M162.3,1005.2
c0.3,2.4,4.5,2.6,5.2,0.3C167.2,1003.2,163.1,1003.6,162.3,1005.2z"/>
<path d="M413.3,1005.6c3-0.3,7.7,0,7.9,3.5c0.3,5.4-13.3,5.7-13.4,0.3C407.7,1007,409.4,1006,413.3,1005.6z M411.9,1009.4
c0.5,1.9,5.1,2,5.2-0.3C416.5,1007.1,412,1007,411.9,1009.4z"/>
<path d="M187.1,1006.3c3-0.4,7.7,0,7.9,3.4c0.3,5.4-13.3,5.7-13.4,0.3C181.5,1007.7,183.2,1006.7,187.1,1006.3z M185.7,1009.7
c-0.3,2.7,5.3,2.2,5.2,0C190.4,1007.9,186.1,1007.8,185.7,1009.7z"/>
<path d="M215.7,1006.9c3-0.3,7.7,0,7.9,3.5c0.3,5.2-13.3,5.8-13.4,0.3C210.1,1008.3,211.8,1007.4,215.7,1006.9z M214.3,1010.4
c-0.3,2.7,5.3,2.2,5.2,0C219,1008.6,214.8,1008.4,214.3,1010.4z"/>
<path d="M243.2,1008.3c2.8-0.3,7.7,0.1,7.9,3.4c0.3,5.3-13.3,5.8-13.4,0.4C237.6,1009.7,239.3,1008.8,243.2,1008.3z M241.5,1012.1
c0.5,1.8,5.5,2.1,5.5-0.4C246.3,1009.8,241.9,1010,241.5,1012.1z"/>
<path d="M357.8,1009c3.8-0.9,9.6-0.3,9.3,3.8c-0.3,4.4-13.4,5.2-13.4-0.3C353.7,1010.3,354.6,1009.7,357.8,1009z M357.8,1012.5
c0.3,2.4,5.1,2.1,5.2-0.3C362.1,1010.6,358.3,1010.1,357.8,1012.5z"/>
<path d="M391.9,1009.7c3.7-0.8,9.3-0.3,9.3,3.4c0,4.9-13.4,5.5-13.4,0C387.8,1011.1,388.7,1010.4,391.9,1009.7z M391.9,1013.5
c0.9,1.8,5,1.8,5.2-0.7C396.2,1011.2,391.9,1010.7,391.9,1013.5z"/>
<path d="M273.8,1011.4c3.2-0.7,9.3-0.4,9.3,3.4c0,4.9-13.3,5.4-13.4,0C269.7,1012.2,271.4,1012,273.8,1011.4z M273.8,1015.2
c0.9,1.8,5,1.8,5.2-0.7C278.1,1012.9,273.9,1012.4,273.8,1015.2z"/>
<path d="M333.7,1012.1c2.9-0.6,8.7-0.3,9,3.1c0.5,5.8-13.1,5.6-13.4,0.7C329.1,1013.1,331.2,1012.6,333.7,1012.1z M333.4,1015.6
c0.3,2.2,3.2,1.7,4.8,1C339.4,1013.3,333.5,1013.5,333.4,1015.6z"/>
<path d="M302.8,1012.5c2.6-0.2,7.9,0.5,7.6,4.1c-0.5,4.7-13.3,4.6-13.4-0.4C296.8,1013.2,299.5,1012.7,302.8,1012.5z M301,1016.9
c1.2,1.1,5.1,1.1,5.2-1C305.5,1014.1,300.5,1013.7,301,1016.9z"/>
<path d="M276.9,1032.1c-0.1-0.3,0.1-0.3,0.3-0.4c7.7,8.8,31.5,14.7,25.5,31.7c-2.7,7.7-16,11.7-25.1,11.7
c-12.7,0-22.6-8.4-21.3-22.4C257.4,1040.7,268.6,1037.5,276.9,1032.1z M287.6,1069.6c3.6,0.2,9.1-4.3,10-6.9
c0.5-1.5,0.6-3.8,0.3-5.8c-1.2-8.6-15.7-17.9-20.6-19.3c-2.2-0.6-9.3,4.1-10.7,5.5c-3,3-4.5,8.6-4.5,12.7
c0.1,8.3,4.5,12.3,10.3,14.4c2.5,1,6.9,2.8,9.6,0.4c0.5-2.5-3.9-4.5-4.8-7.9c-1-3.6-0.5-8.9,4.5-8.9
C281,1060.6,281.6,1069.3,287.6,1069.6z"/>
<path d="M395,1033.8c3.3,8.3,10.3,12.9,9.6,23.7c-0.4,6-5.1,12.3-10.3,14.1c-7.6,2.7-19.8-0.1-21-8.3
C371.4,1049.7,388.1,1039.6,395,1033.8z M392.9,1040.7c-5.2,3-13,13.2-13.8,19.3c-0.4,3.5,0.4,6.4,2.4,6.5
c5.9,0.3,3.1-18,9.3-17.2c1.6,6.7-4.5,13.3-3.4,20.6c8.4-1.1,14.2-11.8,10.7-21.3c-1.1-2.9-4.1-5.1-4.8-7.9
C393.2,1040.7,393.1,1040.7,392.9,1040.7z"/>
<path d="M281.4,1120.2c-2.7-0.5-4.4-3-6.9-4.5c-6.3-3.9-13.6-5.8-13.8-15.1c-0.2-8.8,7.1-15.6,16.5-16.5c5-0.5,12.6,0.8,15.5,4.8
c2.9,4.1,3.7,11.9,1.7,16.5C292.1,1110.8,285,1115.5,281.4,1120.2z M269.7,1108.8c1.1,0.9,9.6,6.3,10.7,6.2
c1.2-0.1,4.5-4.1,5.9-5.5c1.8-2,4-4.3,4.5-6.9c1.9-9.8-5.1-14.4-14.1-13.1C266.2,1091.1,262.4,1102.8,269.7,1108.8z"/>
</g>
<rect id="TXT_x5F_R" x="465.9" y="289.3" class="st0" width="93" height="708.7"/>
<rect id="TXT_x5F_C" x="136.3" y="348.5" class="st0" width="297.3" height="557.2"/>
<rect id="TXT_x5F_L" x="8.6" y="483.5" class="st0" width="98.8" height="510.2"/>
<rect id="TXT_x5F_T1" x="141.7" y="8.5" class="st0" width="283.5" height="45.4"/>
<rect id="TXT_x5F_T2" x="484.5" y="62.1" class="st0" width="70.9" height="34"/>
</g>
<g id="圖層_2">
<g id="VL_00000162354016201825962000000002353486273823408524_">
<text x="121" y="300" font-weight="bold" font-family="標楷體, serif" font-size="20" fill="#040000" text-anchor="middle" dominant-baseline="middle">卍</text>
<text x="121" y="325" font-weight="bold" font-family="標楷體, serif" font-size="20" fill="#040000" text-anchor="middle" dominant-baseline="middle">卍</text>
<text x="121" y="350" font-weight="bold" font-family="標楷體, serif" font-size="20" fill="#040000" text-anchor="middle" dominant-baseline="middle">卍</text>
<text x="121" y="375" font-weight="bold" font-family="標楷體, serif" font-size="20" fill="#040000" text-anchor="middle" dominant-baseline="middle">卍</text>
<text x="121" y="400" font-weight="bold" font-family="標楷體, serif" font-size="20" fill="#040000" text-anchor="middle" dominant-baseline="middle">卍</text>
<text x="121" y="425" font-weight="bold" font-family="標楷體, serif" font-size="20" fill="#040000" text-anchor="middle" dominant-baseline="middle">卍</text>
<text x="121" y="450" font-weight="bold" font-family="標楷體, serif" font-size="20" fill="#040000" text-anchor="middle" dominant-baseline="middle">卍</text>
<text x="121" y="475" font-weight="bold" font-family="標楷體, serif" font-size="20" fill="#040000" text-anchor="middle" dominant-baseline="middle">卍</text>
<text x="121" y="500" font-weight="bold" font-family="標楷體, serif" font-size="20" fill="#040000" text-anchor="middle" dominant-baseline="middle">卍</text>
<text x="121" y="525" font-weight="bold" font-family="標楷體, serif" font-size="20" fill="#040000" text-anchor="middle" dominant-baseline="middle">卍</text>
<text x="121" y="550" font-weight="bold" font-family="標楷體, serif" font-size="20" fill="#040000" text-anchor="middle" dominant-baseline="middle">卍</text>
<text x="121" y="575" font-weight="bold" font-family="標楷體, serif" font-size="20" fill="#040000" text-anchor="middle" dominant-baseline="middle">卍</text>
<text x="121" y="600" font-weight="bold" font-family="標楷體, serif" font-size="20" fill="#040000" text-anchor="middle" dominant-baseline="middle">卍</text>
<text x="121" y="625" font-weight="bold" font-family="標楷體, serif" font-size="20" fill="#040000" text-anchor="middle" dominant-baseline="middle">卍</text>
<text x="121" y="650" font-weight="bold" font-family="標楷體, serif" font-size="20" fill="#040000" text-anchor="middle" dominant-baseline="middle">卍</text>
<text x="121" y="675" font-weight="bold" font-family="標楷體, serif" font-size="20" fill="#040000" text-anchor="middle" dominant-baseline="middle">卍</text>
<text x="121" y="700" font-weight="bold" font-family="標楷體, serif" font-size="20" fill="#040000" text-anchor="middle" dominant-baseline="middle">卍</text>
<text x="121" y="725" font-weight="bold" font-family="標楷體, serif" font-size="20" fill="#040000" text-anchor="middle" dominant-baseline="middle">卍</text>
<text x="121" y="750" font-weight="bold" font-family="標楷體, serif" font-size="20" fill="#040000" text-anchor="middle" dominant-baseline="middle">卍</text>
<text x="121" y="775" font-weight="bold" font-family="標楷體, serif" font-size="20" fill="#040000" text-anchor="middle" dominant-baseline="middle">卍</text>
<text x="121" y="800" font-weight="bold" font-family="標楷體, serif" font-size="20" fill="#040000" text-anchor="middle" dominant-baseline="middle">卍</text>
<text x="121" y="825" font-weight="bold" font-family="標楷體, serif" font-size="20" fill="#040000" text-anchor="middle" dominant-baseline="middle">卍</text>
<text x="121" y="850" font-weight="bold" font-family="標楷體, serif" font-size="20" fill="#040000" text-anchor="middle" dominant-baseline="middle">卍</text>
<text x="121" y="875" font-weight="bold" font-family="標楷體, serif" font-size="20" fill="#040000" text-anchor="middle" dominant-baseline="middle">卍</text>
<text x="121" y="900" font-weight="bold" font-family="標楷體, serif" font-size="20" fill="#040000" text-anchor="middle" dominant-baseline="middle">卍</text>
<text x="121" y="925" font-weight="bold" font-family="標楷體, serif" font-size="20" fill="#040000" text-anchor="middle" dominant-baseline="middle">卍</text>
<text x="121" y="950" font-weight="bold" font-family="標楷體, serif" font-size="20" fill="#040000" text-anchor="middle" dominant-baseline="middle">卍</text>
<text x="121" y="975" font-weight="bold" font-family="標楷體, serif" font-size="20" fill="#040000" text-anchor="middle" dominant-baseline="middle">卍</text>
</g>
<g id="VL_00000028317782333724075960000010437444498308702396_">
<text x="448" y="300" font-weight="bold" font-family="標楷體, serif" font-size="20" fill="#040000" text-anchor="middle" dominant-baseline="middle">卍</text>
<text x="448" y="325" font-weight="bold" font-family="標楷體, serif" font-size="20" fill="#040000" text-anchor="middle" dominant-baseline="middle">卍</text>
<text x="448" y="350" font-weight="bold" font-family="標楷體, serif" font-size="20" fill="#040000" text-anchor="middle" dominant-baseline="middle">卍</text>
<text x="448" y="375" font-weight="bold" font-family="標楷體, serif" font-size="20" fill="#040000" text-anchor="middle" dominant-baseline="middle">卍</text>
<text x="448" y="400" font-weight="bold" font-family="標楷體, serif" font-size="20" fill="#040000" text-anchor="middle" dominant-baseline="middle">卍</text>
<text x="448" y="425" font-weight="bold" font-family="標楷體, serif" font-size="20" fill="#040000" text-anchor="middle" dominant-baseline="middle">卍</text>
<text x="448" y="450" font-weight="bold" font-family="標楷體, serif" font-size="20" fill="#040000" text-anchor="middle" dominant-baseline="middle">卍</text>
<text x="448" y="475" font-weight="bold" font-family="標楷體, serif" font-size="20" fill="#040000" text-anchor="middle" dominant-baseline="middle">卍</text>
<text x="448" y="500" font-weight="bold" font-family="標楷體, serif" font-size="20" fill="#040000" text-anchor="middle" dominant-baseline="middle">卍</text>
<text x="448" y="525" font-weight="bold" font-family="標楷體, serif" font-size="20" fill="#040000" text-anchor="middle" dominant-baseline="middle">卍</text>
<text x="448" y="550" font-weight="bold" font-family="標楷體, serif" font-size="20" fill="#040000" text-anchor="middle" dominant-baseline="middle">卍</text>
<text x="448" y="575" font-weight="bold" font-family="標楷體, serif" font-size="20" fill="#040000" text-anchor="middle" dominant-baseline="middle">卍</text>
<text x="448" y="600" font-weight="bold" font-family="標楷體, serif" font-size="20" fill="#040000" text-anchor="middle" dominant-baseline="middle">卍</text>
<text x="448" y="625" font-weight="bold" font-family="標楷體, serif" font-size="20" fill="#040000" text-anchor="middle" dominant-baseline="middle">卍</text>
<text x="448" y="650" font-weight="bold" font-family="標楷體, serif" font-size="20" fill="#040000" text-anchor="middle" dominant-baseline="middle">卍</text>
<text x="448" y="675" font-weight="bold" font-family="標楷體, serif" font-size="20" fill="#040000" text-anchor="middle" dominant-baseline="middle">卍</text>
<text x="448" y="700" font-weight="bold" font-family="標楷體, serif" font-size="20" fill="#040000" text-anchor="middle" dominant-baseline="middle">卍</text>
<text x="448" y="725" font-weight="bold" font-family="標楷體, serif" font-size="20" fill="#040000" text-anchor="middle" dominant-baseline="middle">卍</text>
<text x="448" y="750" font-weight="bold" font-family="標楷體, serif" font-size="20" fill="#040000" text-anchor="middle" dominant-baseline="middle">卍</text>
<text x="448" y="775" font-weight="bold" font-family="標楷體, serif" font-size="20" fill="#040000" text-anchor="middle" dominant-baseline="middle">卍</text>
<text x="448" y="800" font-weight="bold" font-family="標楷體, serif" font-size="20" fill="#040000" text-anchor="middle" dominant-baseline="middle">卍</text>
<text x="448" y="825" font-weight="bold" font-family="標楷體, serif" font-size="20" fill="#040000" text-anchor="middle" dominant-baseline="middle">卍</text>
<text x="448" y="850" font-weight="bold" font-family="標楷體, serif" font-size="20" fill="#040000" text-anchor="middle" dominant-baseline="middle">卍</text>
<text x="448" y="875" font-weight="bold" font-family="標楷體, serif" font-size="20" fill="#040000" text-anchor="middle" dominant-baseline="middle">卍</text>
<text x="448" y="900" font-weight="bold" font-family="標楷體, serif" font-size="20" fill="#040000" text-anchor="middle" dominant-baseline="middle">卍</text>
<text x="448" y="925" font-weight="bold" font-family="標楷體, serif" font-size="20" fill="#040000" text-anchor="middle" dominant-baseline="middle">卍</text>
<text x="448" y="950" font-weight="bold" font-family="標楷體, serif" font-size="20" fill="#040000" text-anchor="middle" dominant-baseline="middle">卍</text>
<text x="448" y="975" font-weight="bold" font-family="標楷體, serif" font-size="20" fill="#040000" text-anchor="middle" dominant-baseline="middle">卍</text>
</g>
<g id="TXT_TOP">
<path d="M299.7,286.1c0.4,0,0.6,0.2,0.6,0.7c0,0.3-0.1,0.7-0.3,1.2c-0.6,1.2-1.3,2.3-2.2,3.5c-0.2,0.2-0.3,0.5-0.6,0.7
c0.2,0.4,0.4,0.8,0.4,1.3c-0.2,1.3-0.3,3.3-0.3,6.2c0,2.1,0.1,4.7,0.1,8c0,2.2-0.5,3.3-1.5,3.3c-1.1,0-1.7-0.8-1.7-2.5
c0.4-2.4,0.6-5.2,0.6-8.4c0-1.9-0.1-3.7-0.4-5.3c-0.3,0.2-0.5,0.2-0.6,0.2c-1.1,0-2.2-0.5-3.2-1.4c-0.6-0.4-1-0.9-1-1.3
c0-0.5,0.2-0.8,0.7-0.9c1.8-0.2,3.2-0.6,4.4-1.3c1.4-0.8,2.9-2.1,4.6-3.9C299.4,286.1,299.6,286.1,299.7,286.1L299.7,286.1z
M305.6,288.4c0-0.2,0-0.4-0.1-0.6c0-0.9,0.4-1.4,1.1-1.4c1,0,1.5,0.5,1.5,1.4v0.5l3.1,0.1v-0.6c0-1.1,0.4-1.7,1.3-1.7
c1,0,1.5,0.7,1.5,2c0,0.1,0,0.3,0,0.4l1.1,0c0.6,0,1.4-0.1,2.5-0.1c1.4,0,2.1,0.5,2.1,1.4c-0.5,1.3-0.8,2.6-0.8,4.1
c-0.1,1.1-0.7,1.7-2,1.7c-1-0.2-2.1-0.3-3.4-0.4c0,0.6,0,1.2,0,1.9c1.4,0,3.1,0.1,5,0.2c0.8-0.2,1.4-0.2,1.8-0.2
c1,0,1.5,0.4,1.5,1.3c0,0.1-0.1,0.3-0.2,0.5c-0.2,0.4-0.5,1.8-0.9,4.1c-0.1,0.9-0.6,1.6-1.4,2.2c-0.8,0.6-1.9,1-3.5,1
c-0.4,0-0.6-0.3-0.7-1c-0.1-0.7-0.2-1.6-0.5-2.7c0-0.5,0.3-0.7,0.9-0.7c0.7,0.2,1.2,0.3,1.7,0.3c0.2,0,0.4-0.1,0.5-0.2
c0.1-0.1,0.2-0.6,0.4-1.4c0-0.4-0.1-0.7-0.5-0.7c-1.2-0.1-2.6-0.1-4.2-0.1c0.1,2.4,0.3,5.1,0.6,8.1c0,1.8-0.6,2.7-1.7,2.7
c-0.7,0-1-0.4-1.1-1.3c-0.2-1.4-0.4-4.6-0.4-9.5c-1.2,0-2.3,0-3.3,0.1c-0.1,1.5-0.2,2.5-0.4,3.2c-0.5,2.2-1.1,3.9-2.1,5.2
c-0.8,1.1-1.5,1.6-2,1.6c-0.9,0-1.9-0.5-3-1.4c-1-0.7-1.6-1.4-1.6-2.1c0-0.3,0.3-0.5,0.9-0.5c1.7,0,2.9-0.5,3.8-1.4
c0.9-0.9,1.6-2.4,2-4.5c-0.3,0-0.6,0-0.9,0.1c-1.2,0.1-2.1,0.4-2.8,0.7c-0.3,0.1-0.5,0.2-0.6,0.2c-0.9,0-1.4-0.4-1.4-1.2
c0-0.2,0-0.4,0.1-0.7c0.4-1.1,0.7-2.1,0.7-2.8v-2.3c0-0.8,0.4-1.3,1.2-1.3c0.5,0,0.9,0.1,1.2,0.2c0.8-0.1,1.8-0.2,3-0.3v-0.6
c0-0.3,0-0.6,0-0.8c-1.3,0.1-2.6,0.2-4,0.4c-0.8,0-1.2-0.4-1.2-1.3c0-1,0.5-1.5,1.4-1.7L305.6,288.4L305.6,288.4z M305.7,297.2
c0-0.6,0.1-1.2,0.1-1.9c-0.8,0.1-1.6,0.2-2.4,0.3c0,0.4-0.1,0.8-0.1,1.3c0,0.3,0.2,0.4,0.6,0.4
C304.6,297.2,305.1,297.2,305.7,297.2L305.7,297.2z M311.1,297v-2h-0.3c-1,0-1.9,0-2.8,0.1c0,0.7,0,1.3-0.1,1.9c1,0,2,0,3,0
C311,297,311.1,297,311.1,297L311.1,297z M308.2,290.9c0,0.5,0,1,0,1.5h0.2c0.8,0,1.8,0,2.9,0.1c0-0.6,0-1.1,0-1.6h-1.8
C309,290.9,308.6,290.9,308.2,290.9L308.2,290.9z M313.8,290.9c0,0.5-0.1,1.1-0.1,1.6c0.4,0,0.8,0.1,1.2,0.1c0.8,0,1.2,0,1.1-0.1
c0.1-0.3,0.1-0.6,0.1-1c0-0.4-0.3-0.5-0.8-0.5C314.9,291,314.4,290.9,313.8,290.9L313.8,290.9z"/>
<path d="M305.7,317.3c1.1,0,1.6,0.6,1.6,1.7l-0.3,8h7.2l3.1-0.1c0.5,0,0.8,0.4,0.8,1.2c0,0.5-0.2,0.9-0.6,1.3
c-0.4,0.4-0.8,0.6-1.2,0.6c-2-0.1-4.3-0.2-6.9-0.3c0,0.1,0.1,0.2,0.1,0.3c0,1.8-0.1,4-0.3,6.7c0,0.5,0.1,0.8,0.4,0.8
c0.4,0.1,1.4,0.2,3.1,0.2c3.3,0,6.5-0.5,9.5-1.4c0.4,0,0.5,0.3,0.5,1c0,0.9-0.4,1.9-1.2,2.9c-0.9,1.2-1.8,1.8-2.6,1.8
c-0.4,0-4-0.5-10.8-1.4c-1-0.2-1.6-0.7-1.6-1.6c0.2-2.3,0.3-4.1,0.3-5.3s-0.1-2.5-0.3-3.9c-0.5,0-1.1,0-1.5,0v0.1
c-0.6,2.9-1.3,4.9-2.3,6.3c-0.9,1.4-2.3,2.7-4.1,3.8c-1.8,1.1-3.1,1.7-4.2,1.7s-2.1-0.6-3.1-1.7c-0.8-0.9-1.2-1.7-1.2-2.4
c0-0.6,0.2-0.8,0.6-0.8l1.9,0.3c1.6,0,3-0.3,4.3-0.8c1.7-0.6,2.9-1.4,3.8-2.3c1-1,1.6-2.3,1.8-3.9v-0.2c-0.8,0.1-1.6,0.1-2.4,0.1
c-1.8,0-3.6,0.2-5.6,0.6c-1.1,0-1.7-0.5-1.7-1.4c0-0.4,0.3-1,0.8-1.5c0.4-0.4,0.9-0.6,1.6-0.6c1,0.2,1.8,0.3,2.5,0.3l6.7-0.1
l-0.2-8.1C304.1,317.8,304.7,317.3,305.7,317.3L305.7,317.3z M294.7,321.2c0.8,0.1,1.4,0.1,1.8,0.1c1.1,0,2.6-0.6,4.4-1.7
c0.3,0,0.5,0.2,0.5,0.6c0,0.5-0.6,1.5-1.8,3c-1.2,1.5-2.2,2.3-3.1,2.3c-0.6,0-1.2-0.3-1.6-0.9c-0.6-0.8-0.8-1.6-0.8-2.6
C294.1,321.5,294.3,321.2,294.7,321.2L294.7,321.2z M311.3,319.7c0,0,0.1,0,0.2,0c1.4,0.4,2.6,0.6,3.4,0.7
c0.7,0.1,1.5,0.1,2.4,0.2c0.4,0,0.5,0.2,0.5,0.7c0,0.5-0.5,1.1-1.4,1.9c-1.2,0.9-2.3,1.3-3.1,1.3c-0.2,0-0.4-0.1-0.5-0.3
c-0.3-0.3-1-1.4-2.2-3.3c-0.1-0.2-0.1-0.3-0.1-0.4C310.6,320,310.8,319.7,311.3,319.7L311.3,319.7z"/>
<path d="M254.8,295.6c0.4,0,0.7,0.2,0.7,0.7c0,0.6-0.2,0.9-0.5,1l-6.8,2.4c-1,0-1.5-0.5-1.5-1.5c0-1.2,0.4-1.8,1.3-2L254.8,295.6z
M249.7,286.8c0.2,0,0.6,0.1,1.3,0.3c1.2,0.8,2.7,1.6,4.3,2.4c0.2,0.1,0.3,0.2,0.3,0.4c0,0.6-0.3,0.9-0.9,0.9
c-0.2,0-0.5,0-0.8-0.1c-2.3-0.3-3.9-0.4-4.7-0.5c-0.9-0.4-1.3-1-1.3-2C247.9,287.2,248.5,286.8,249.7,286.8z M255.3,302.8
c0.8,0,1.2,0.3,1.2,0.8c0,0.4-0.2,0.7-0.6,1c-3.2,3.1-5.4,4.6-6.3,4.6c-1,0-1.5-0.5-1.5-1.6c0-0.7,0.3-1.2,0.9-1.4
C248.9,305.9,251,304.8,255.3,302.8L255.3,302.8z M265.9,286.4c1.3,0,2,0.6,2,1.9l-0.3,2.8c3.4,0,5.8,0,7.3-0.1
c0.5,0,0.7,0.3,0.7,1c0,0.4-0.2,0.7-0.6,1c-0.5,0.5-1,0.8-1.5,0.8c-1.4-0.1-3.3-0.2-5.8-0.2l-0.1,4h3l2.8-0.1
c0.6,0,0.9,0.4,0.9,1.2c0,0.4-0.2,0.8-0.6,1.1c-0.3,0.3-0.7,0.4-1.1,0.4c-1.3-0.1-2.9-0.1-4.7-0.1h-0.4l-0.1,5
c1.1,0,2.2,0.1,3.4,0.1c1.4,0,2.5,0.1,3.4,0.1c1.6,0,3-0.1,4-0.3c0.6,0,1,0.3,1,1c0,0.9-0.5,1.9-1.6,2.9c-0.8,0.8-1.4,1.1-2,1.1
c-0.4,0-1-0.2-1.6-0.7c-1-0.7-2.1-1.2-3.4-1.4c-1.3-0.3-2.8-0.4-4.4-0.4c-1.8,0-3.5,0.1-5.1,0.2c-1,0.1-2.5,0.6-4.5,1.4
c-1.1,0-1.7-0.4-1.7-1.3c0-0.5,0.2-1,0.6-1.4c0.5-0.6,1.3-1,2.2-1c2.9-0.2,5.2-0.4,7-0.4l-0.1-4.9c-0.4,0-0.9,0-1.3,0.1
c-1.1,0.1-2.3,0.2-3.5,0.5c-1.1,0-1.7-0.4-1.7-1.2c0-0.4,0.3-0.9,0.8-1.4c0.4-0.4,0.8-0.6,1.4-0.6c0.9,0.2,1.7,0.3,2.4,0.3
l1.9-0.1l0-4.1H264c-1.3,0-3.1,0.2-5.4,0.6c-1,0-1.5-0.4-1.5-1.2c0-0.4,0.2-0.9,0.7-1.4c0.4-0.4,0.8-0.6,1.3-0.6l2,0.1h3.4
l-0.4-2.9C264.1,286.9,264.7,286.3,265.9,286.4L265.9,286.4z"/>
<path d="M247.8,338.9c0.8,0.1,1.4,0.1,1.8,0.1c1.3,0,2.8-0.8,4.6-2.4c0.4,0,0.6,0.2,0.6,0.6c0,0.6-0.6,1.7-1.9,3.4
c-1.3,1.8-2.4,2.7-3.3,2.7c-0.6,0-1.1-0.3-1.6-0.9c-0.5-0.7-0.8-1.6-0.8-2.6C247.3,339.2,247.5,338.9,247.8,338.9L247.8,338.9z
M250.7,319c0.5,0,0.9,0,1.4,0.1c0.5,0.1,1.1,0.1,2.1,0.1h1.4c0.3,0,0.7,0,1.1,0.1c0.5,0,1.1,0,1.8-0.1c1,0,1.5,0.4,1.5,1.3
c-0.1,0.2-0.3,1-0.5,2.4c-0.1,1.3-0.2,2.7-0.2,4.2c0.1,4.3,0.1,6.7,0.1,7c0,0.8-0.5,1.3-1.4,1.4c-1.5-0.3-2.9-0.4-4.1-0.4
c-1.2,0-2,0.1-2.3,0.2c-0.3,0-0.7,0.2-1.1,0.4c-0.9,0-1.4-0.5-1.4-1.4c0.3-2.6,0.4-4.9,0.4-6.8s-0.1-4.4-0.4-7.1
C249.3,319.5,249.7,319,250.7,319L250.7,319z M254,333c0.7,0,1.5,0.1,2.4,0.3c0.1,0,0.2-0.1,0.2-0.3v-5.5
c-1.8,0.1-3.2,0.2-4.2,0.5c-0.1,1.7-0.2,3.3-0.3,4.9c0,0.2,0.1,0.3,0.4,0.3C253,333.1,253.5,333,254,333z M252.5,325.6h3.6
c0.2,0,0.4,0,0.5,0c0-1.8-0.1-3.1-0.1-3.9h-0.3c-0.8-0.2-1.8-0.3-3.2-0.3c-0.2,0-0.4,0.1-0.5,0.3
C252.6,323,252.6,324.3,252.5,325.6z M259.8,336.7c1,0,1.5,0.4,1.5,1.2l-0.8,3c-0.1,0.5-0.4,0.7-0.7,0.7c-0.6,0-1-0.3-1.1-0.8
l-0.5-2.9C258.2,337.1,258.7,336.7,259.8,336.7z M267.5,318c2.1,0,4.3,0.1,6.6,0.4c0.2,0,0.7,0,1.4-0.1c0.9,0,1.4,0.4,1.4,1.1
c0,0.1-0.1,0.2-0.2,0.4c-0.3,0.5-0.5,1.2-0.7,2.2c-0.2,1.1-0.4,2.2-0.5,3.4c-0.1,0.6-0.3,1.1-0.8,1.3c-0.5,0.3-1.4,0.4-2.7,0.4
c-0.5,0-0.8-0.2-1-0.7c-0.2-0.7-0.6-1.5-1.1-2.4c0-0.4,0.2-0.5,0.7-0.5l1.7,0.1c0.3,0,0.5-0.1,0.7-0.1c0.1,0,0.2-0.2,0.2-0.4
c0.2-0.7,0.4-1.5,0.7-2.3c0-0.3-0.1-0.5-0.2-0.5c-0.3-0.1-1.6-0.1-3.9-0.1h-0.9c-0.3,1.4-0.6,2.4-1.1,3.1c-0.5,1.1-1.2,2-2.1,2.7
c-0.7,0.6-1.4,0.8-2.1,0.8c-0.5,0-1-0.2-1.7-0.6c-0.5-0.4-0.7-0.7-0.7-0.9c0-0.2,0.1-0.5,0.4-0.7c1.9-0.7,3.2-1.5,4-2.4
c0.6-0.7,0.9-1.4,1.2-1.9c-0.5,0.1-0.9,0.1-1.3,0.2c-0.8,0.1-1.4,0.3-2,0.5c-0.7,0-1.1-0.3-1.1-1c0-0.5,0.1-0.9,0.3-1.3
c0.2-0.4,0.5-0.6,1-0.6C264.3,318.1,265.7,318,267.5,318L267.5,318z M263.7,327.5c0.4,0,0.9,0.1,1.3,0.2c0.4,0.1,1.1,0.1,1.9,0.1
h3c0.7,0,1.5,0,2.4,0.1c0.4,0,1-0.1,1.7-0.1c0.9,0,1.4,0.4,1.4,1.3c-0.1,0.1-0.2,0.5-0.5,1.1c-0.1,0.6-0.1,1.2-0.1,1.9
c0.1,1.5,0.1,2.3,0.1,2.4c0,0.8-0.4,1.3-1.3,1.4c-1.8-0.3-3.5-0.4-5-0.4c-1.9,0-3.1,0.1-3.6,0.2c-0.4,0-1,0.1-1.6,0.4
c-0.8,0-1.3-0.5-1.3-1.4c0.3-1.2,0.4-2.3,0.4-3.1c0-0.7-0.1-1.6-0.4-2.6C262.3,328,262.8,327.6,263.7,327.5L263.7,327.5z
M266.1,336.7c1,0,1.5,0.4,1.5,1.2l-0.8,3c-0.1,0.5-0.4,0.7-0.7,0.7c-0.6,0-1-0.3-1-0.8l-0.5-2.9
C264.5,337.1,265,336.7,266.1,336.7L266.1,336.7z M268.7,333.4c1,0,2.1,0.1,3.4,0.3c0.2,0,0.3-0.1,0.3-0.3c0-1.6-0.1-2.7-0.2-3.2
h-0.1c-1.4-0.2-3.5-0.3-6.3-0.3c-0.1,0-0.2,0.1-0.2,0.3c0,1.1-0.1,2.1-0.4,3.2c0,0.2,0.1,0.3,0.3,0.3
C266.4,333.5,267.5,333.4,268.7,333.4L268.7,333.4z M272.1,336.7c0,0,0.1,0,0.2,0c1.3,0.5,2.3,0.8,3.1,1c0.6,0.1,1.3,0.2,2.1,0.2
c0.4,0,0.6,0.2,0.6,0.7c0,0.5-0.5,1.1-1.4,1.9c-1.3,0.9-2.3,1.3-3.1,1.3c-0.1,0-0.3-0.1-0.4-0.3c-0.2-0.4-0.8-1.6-1.7-3.7
c-0.1-0.2-0.1-0.3-0.1-0.5C271.5,336.9,271.7,336.7,272.1,336.7L272.1,336.7z"/>
</g>
<g id="TXT_BOT">
<path d="M301.8,912.6l1.8,0.1c5.2,0,8.7,0,10.6-0.1c0.4,0,0.5,0.3,0.5,0.8c0,0.4-0.2,0.8-0.5,1.1c-0.4,0.5-0.9,0.7-1.4,0.7
c-1.3-0.2-3.4-0.3-6.4-0.3c-1.2,0-2.7,0.2-4.6,0.5v0.6h0.1l1.8,0.1c4.5,0,7.6,0,9.1-0.1c0.4,0,0.6,0.3,0.6,0.8
c0,0.4-0.2,0.7-0.5,1c-0.4,0.5-0.9,0.8-1.4,0.8c-1-0.2-2.7-0.3-5-0.3c-1.2,0-2.7,0.2-4.7,0.5c0,0.2,0,0.4,0,0.6c0.1,0,0.1,0,0.2,0
l1.8,0.1c4.6,0,7.7,0,9.3-0.1c0.4,0,0.6,0.3,0.6,0.9c0,0.4-0.2,0.7-0.6,1.1c-0.4,0.5-0.9,0.7-1.4,0.7c-1.1-0.2-2.8-0.2-5.1-0.2
c-1.2,0-2.9,0.2-5,0.5h0c0,0.3-0.1,0.6-0.1,0.8c1.9-0.1,3.5-0.2,4.6-0.2c1.6,0,3.7,0,6.3,0.1c2.4-0.1,4.7-0.2,6.8-0.5
c0.7,0,1,0.3,1,0.8c0,0.6-0.5,1.3-1.4,2.1c-1,0.9-2,1.4-3.1,1.4c-1.2-0.3-2.1-0.5-3-0.6c0,0.2,0.1,0.3,0.1,0.5
c0,0.5-0.3,0.9-0.8,1.2c-0.5,0.3-1.1,0.6-1.8,0.9c3,1.4,5.1,2.3,6.3,2.7c1.2,0.3,2.9,0.6,5,0.7c0.4,0,0.6,0.1,0.6,0.2
c0,1-1,2-3.1,3c-1.6,0.8-3.1,1.2-4.4,1.2c-0.2,0-0.6-0.3-1.1-0.8c-2.1-2.2-4.1-4.2-6-6c-0.2,0.1-0.3,0.1-0.4,0.2
c-1.5,0.6-2.3,0.9-2.6,0.9c-0.8,0-1.2-0.3-1.2-1c0-0.4,0.2-0.6,0.6-0.8c2.6-1.2,4.7-2.4,6.2-3.4c-1.8-0.3-3.6-0.4-5.5-0.4
c-1.1,0-2.3,0.1-3.6,0.2c0.1,0.2,0.1,0.4,0.1,0.6c0,2.2,0,4.2-0.1,6c0,0.4,0.2,0.7,0.5,0.7c2.6-0.6,4.2-0.9,4.6-0.9
c0.7,0,1.1,0.4,1.1,1.1c0,1-0.5,1.5-1.6,1.7c-1.5,0.2-3,0.6-4.4,1.1c-0.9,0.3-1.5,0.7-1.9,1.1c-0.3,0.3-0.6,0.5-0.8,0.5
c-0.9,0-1.4-0.6-1.4-1.8c0-0.1,0.1-0.3,0.3-0.7c0.2-0.3,0.4-0.7,0.4-1.3c0.2-1.2,0.3-2.3,0.3-3.3c0-1.4-0.1-2.7-0.4-4.1v-0.1
c-1.4,0.2-3.1,0.5-5.2,1c-1.1,0-1.7-0.6-1.7-1.7c0-0.2,0.2-0.6,0.6-1.1c0.5-0.6,0.9-0.8,1.3-0.8c0.9,0.1,1.6,0.2,2,0.3
c1.6-0.2,3-0.3,4.2-0.4c0.1-1.5,0.2-3.1,0.2-4.7s-0.2-3.3-0.6-5.2c0-0.7,0.5-1.1,1.4-1.1c0.5,0,1,0.1,1.2,0.3
C301.3,912.7,301.6,912.6,301.8,912.6L301.8,912.6z"/>
<path d="M296.7,945.4c1,0,1.5,0.6,1.5,1.8c0,0.1,0,0.3-0.1,0.5c-0.1,0.4-0.2,0.7-0.2,1h0.1c1,0.2,1.8,0.3,2.5,0.3l3.9-0.1
l-0.1-4.1c0-1,0.5-1.5,1.5-1.5c1.1,0,1.7,0.6,1.7,1.7v3.8h5.7l3.1-0.1c0.6,0,0.9,0.4,0.9,1.2c0,0.5-0.2,0.9-0.7,1.2
c-0.3,0.3-0.7,0.5-1.1,0.5c-2-0.2-4.4-0.2-7.1-0.2h-0.7v5h4.6l3.1-0.1c0.6,0,0.8,0.4,0.8,1.2c0,0.5-0.2,0.9-0.6,1.2
c-0.4,0.3-0.7,0.5-1.1,0.5c-1.9-0.2-4.1-0.2-6.6-0.2h-0.1v4.7c1.2,0,2.4,0,3.8,0.1c1.9,0,3.5,0.1,4.8,0.1c1.9,0,3.4-0.1,4.6-0.3
c0.7,0,1,0.4,1,1.2c0,1-0.6,2-1.9,3c-0.9,0.8-1.6,1.2-2.3,1.2c-0.5,0-1.2-0.2-2.2-0.7c-1.4-0.7-2.9-1.2-4.6-1.5
c-1.8-0.3-3.8-0.4-6-0.4c-2.3,0-4.6,0.1-6.8,0.3c-1.3,0.2-3.3,0.8-6,1.9c-1.1,0-1.7-0.4-1.7-1.2c0-0.6,0.2-1.1,0.7-1.6
c0.6-0.7,1.4-1,2.4-1c5-0.6,8.9-0.9,11.5-0.9h0.1l-0.2-4.7c-1,0-2,0.1-2.9,0.2c-1.4,0.1-2.9,0.3-4.5,0.6c-1.1,0-1.7-0.5-1.7-1.4
c0-0.5,0.3-1,0.8-1.5c0.4-0.4,0.9-0.6,1.6-0.6c1,0.2,1.8,0.3,2.5,0.3l4.1-0.1l-0.2-4.9c-0.8,0-1.6,0.1-2.4,0.1
c-1.5,0.1-3.1,0.3-4.8,0.6c-0.2,0-0.4,0-0.6-0.1c-0.4,1-0.9,1.9-1.4,2.5c-0.3,0.4-0.6,0.7-0.9,0.7c-1,0-1.9-0.3-3-1
c-1-0.4-1.5-0.9-1.5-1.4c0-0.2,0.1-0.5,0.4-0.6c2.1-0.9,3.5-2,4.3-3.3c0.6-0.9,1-2,1.4-3.2C296,945.6,296.2,945.4,296.7,945.4
L296.7,945.4z"/>
<path d="M249.7,918.7l7.4,0.1c0.7,0,1.2,0.1,1.7,0.2c0.5,0.1,0.7,0.4,0.7,0.9c0,0.6-0.3,0.9-0.9,0.9c-1.2,0-2.2,0-3.1,0
c0.1,0.2,0.1,0.5,0.1,0.7v2.6c0.7,0.5,1.6,1.2,2.8,2.2c0.3,0.4,0.5,0.7,0.5,0.9c0,0.5-0.2,0.8-0.7,0.8c-0.2,0-1.1-0.4-2.7-1.2
c0,3.1,0.1,5.4,0.1,7c0,2.3-0.5,3.4-1.5,3.4c-1,0-1.5-0.9-1.5-2.8c0.3-3.4,0.5-5.6,0.5-6.8c0-0.5,0-1,0-1.6
c-0.4,1.2-0.9,2.5-1.5,3.9c-0.9,1.8-1.6,2.7-2.1,2.7c-0.8,0-1.5-0.3-2.3-0.9c-0.6-0.5-0.9-1-0.9-1.5c0-0.3,0.1-0.5,0.4-0.6
c1.3,0,2.5-0.8,3.8-2.4c1-1.2,1.8-2.8,2.5-4.7c0-0.2,0-0.3,0-0.5c0-0.4,0-0.8,0.1-1.1c-1.7,0.1-3,0.3-4,0.6
c-0.8,0-1.2-0.4-1.2-1.2c0-0.3,0.1-0.7,0.4-1.1C248.6,918.9,249.1,918.7,249.7,918.7L249.7,918.7z M250.7,913.4l5.7,0.1
c0.6,0,1.2,0.1,1.7,0.3c0.4,0.1,0.6,0.4,0.6,0.8c0,0.7-0.3,1-0.8,1c-3.7,0-6.4,0.2-8,0.7c-0.8,0-1.2-0.4-1.2-1.2
c0-0.3,0.2-0.6,0.5-1C249.6,913.6,250.1,913.4,250.7,913.4L250.7,913.4z M265.4,912.7c0.5,0,1,0.2,1.3,0.5c1.7,0,3.4,0.1,5,0.3
c0.7-0.2,1.3-0.3,1.7-0.3c0.8,0,1.2,0.4,1.2,1.2c0,0.2-0.2,0.6-0.6,1c-0.5,0.4-1.2,1.3-2.1,2.7c-0.9,1.3-1.5,2.3-1.8,2.9
c0.4,0,0.9,0.1,1.4,0.1c2.1,0,4-0.2,5.8-0.4c0.5,0,0.8,0.2,0.8,0.7s-0.4,1.1-1.2,1.8c-0.8,0.8-1.7,1.2-2.6,1.2
c-1.6-0.5-2.7-0.8-3.2-0.9c-0.6-0.1-1.2-0.2-1.8-0.3c0,0.2,0.1,0.5,0.1,0.7c0,4.7,0.1,7.9,0.3,9.8c0,2.3-0.5,3.4-1.5,3.4
c-1,0-1.5-0.9-1.5-2.8c0.3-2.6,0.4-4.3,0.4-5.2c0-1.1-0.1-2.7-0.3-4.6c0-0.6,0.1-1.1,0.2-1.4c-1,0-2,0.2-3.2,0.3
c-0.9,0.1-2.2,0.4-3.8,0.9c-0.9,0-1.4-0.5-1.4-1.4c0-0.2,0.2-0.5,0.6-1c0.4-0.4,0.8-0.7,1.1-0.7c0.8,0.1,1.3,0.2,1.7,0.3
c2.5-0.4,4.4-0.6,5.8-0.7c0.3-0.7,0.6-1.4,0.9-2.1c-0.6-0.1-1.2-0.1-1.9-0.1c-1.3,0-2.4,0.1-3.2,0.2c-0.5,0.1-1.2,0.3-2,0.6
c-0.6,0-0.9-0.3-0.9-0.8c0-0.1,0-0.2,0.1-0.3c0.7-0.8,1.2-1.5,1.7-2.1c0.6-0.9,1-1.7,1.3-2.4C264.1,913.2,264.6,912.7,265.4,912.7
L265.4,912.7z M264.4,931.3c0.2,0,0.3,0.2,0.3,0.5c0,0.2-0.1,0.4-0.2,0.7c-0.2,1-0.6,1.8-1,2.6c-0.1,0.4-0.4,0.6-0.7,0.6
c-0.8,0-1.6-0.2-2.4-0.7c-0.8-0.5-1.2-1-1.2-1.3c0-0.3,0.1-0.5,0.4-0.6c0.8-0.1,1.5-0.2,2-0.3C262.2,932.5,263.2,932,264.4,931.3
L264.4,931.3z M264.8,926.1c0.2,0,0.3,0.1,0.3,0.4c0,0.1-0.1,0.3-0.2,0.6c-0.3,0.8-0.7,1.5-1.1,2.1c-0.2,0.3-0.4,0.5-0.8,0.5
c-0.7,0-1.4-0.2-2.2-0.6c-0.7-0.5-1.1-0.9-1.1-1.3s0.1-0.5,0.2-0.6c0.9-0.1,1.5-0.1,2-0.2C262.6,926.8,263.6,926.5,264.8,926.1
L264.8,926.1z M269.8,917c0.2-0.5,0.5-0.9,0.7-1.3c0-0.3-0.1-0.5-0.3-0.5h-1.4c-0.8,0.1-1.4,0.2-2,0.4c-0.4,0.1-0.6,0.2-0.8,0.2
c-0.1,0.2-0.3,0.4-0.4,0.6c-0.1,0.2-0.2,0.3-0.2,0.3c0,0.2,0.2,0.3,0.5,0.3c0.3-0.2,0.7-0.3,1-0.3
C268.2,916.7,269.2,916.8,269.8,917L269.8,917z M272.2,925.9c1.6,0.7,3.2,1,4.8,1.2c0.3,0.1,0.4,0.3,0.4,0.6
c0,0.3-0.4,0.7-1.2,1.2c-0.6,0.3-1.2,0.5-1.9,0.5c-0.6,0-1-0.2-1.4-0.6c-0.4-0.6-0.9-1.4-1.3-2.6
C271.7,926.1,271.8,925.9,272.2,925.9z M272.3,931.2c0,0,0.1,0,0.2,0c1.1,0.3,2,0.6,2.7,0.7c0.6,0.1,1.2,0.2,1.9,0.2
c0.4,0,0.5,0.2,0.5,0.5c0,0.5-0.4,1-1.2,1.7c-1.1,0.8-2.1,1.2-2.8,1.2c-0.1,0-0.2-0.1-0.3-0.2c-0.2-0.3-0.7-1.3-1.4-3
c-0.1-0.1-0.1-0.3-0.1-0.3C271.8,931.4,272,931.2,272.3,931.2L272.3,931.2z"/>
<path d="M256.6,943.3c0.4,0,0.5,0.2,0.5,0.7c0,0.3-0.1,0.7-0.4,1.1c-0.6,1.2-1.4,2.3-2.4,3.4c-0.3,0.4-0.7,0.8-1,1.2
c0.1,0.3,0.2,0.7,0.2,1.1c-0.2,1.2-0.3,3.3-0.3,6.1v8.2c0,2.2-0.5,3.3-1.5,3.3c-1.1,0-1.7-0.8-1.7-2.5c0.5-2.5,0.7-5.4,0.7-8.6
c0-2-0.1-3.8-0.4-5.4c-0.1,0-0.3,0.1-0.4,0.1c-1.1,0-2.2-0.5-3.2-1.3c-0.6-0.4-0.9-0.9-0.9-1.2c0-0.5,0.2-0.8,0.7-0.9
c1.9-0.2,3.4-0.6,4.6-1.2c1.5-0.8,3.1-2.1,4.8-3.9C256.3,943.3,256.5,943.3,256.6,943.3L256.6,943.3z M261.5,953.9
c1.2,0,1.8,0.6,1.8,1.7l0.6,6.8c0.9,0,1.7-0.1,2.3-0.1h3.1l0.7-7.4c0.2-0.8,0.7-1.2,1.5-1.2c1.2,0,1.8,0.6,1.8,1.7l-1.6,6.9h3.4
c1.4,0,2.5-0.2,3.4-0.7c0.6,0,0.9,0.4,0.9,1.1c0,1-0.4,2.2-1.3,3.3c-0.6,0.8-1.1,1.2-1.6,1.2c-0.4,0-1-0.2-1.8-0.7
c-1.1-0.7-2.3-1.2-3.7-1.4c-1.5-0.2-3.1-0.4-4.9-0.4s-3.5,0.1-5.1,0.3c-1,0.1-2.5,0.7-4.6,1.6c-1.1,0-1.7-0.4-1.7-1.2
c0-0.6,0.2-1.1,0.7-1.6c0.6-0.7,1.4-1,2.4-1c1.5-0.1,2.8-0.3,3.9-0.4c0-0.1-0.1-0.3-0.1-0.3l-1.8-6.8
C259.8,954.4,260.4,953.9,261.5,953.9L261.5,953.9z M266.7,943.7c1.3,0,1.9,0.5,1.9,1.5c-0.2,1.2-0.4,2.3-0.6,3.4
c2,0,3.7-0.1,5.1-0.1l2.9-0.4c0.6,0,1,0.3,1,0.9s-0.3,1.3-0.9,2c-0.8,0.8-1.7,1.2-2.6,1.2c-0.9-0.3-2-0.6-3.3-0.8
c-1.6-0.2-3-0.3-4.2-0.3c-1.8,0-3.4,0.1-4.8,0.3c-0.9,0.1-1.9,0.3-3.1,0.7c-1,0-1.5-0.5-1.5-1.3c0-0.4,0.2-0.9,0.7-1.5
c0.5-0.5,1-0.8,1.4-0.8c0.4,0,0.9,0,1.4,0.1c0.9,0.1,1.8,0.1,2.7,0.1c0.9,0,1.8-0.1,2.5-0.1c-0.1-1.2-0.3-2.3-0.6-3.3
C264.7,944.3,265.3,943.7,266.7,943.7L266.7,943.7z"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 76 KiB

+6
View File
@@ -71,6 +71,10 @@ public partial class admin_order_print : MyWeb.function
string[] k = detail_data.Split('$');
if (!string.IsNullOrEmpty(orderItem.address))
{
_word = _word.Replace("{$右標題}", orderItem.address);
}
//取代
for (int i=0; i < k.Length; i++)
{
@@ -87,6 +91,8 @@ public partial class admin_order_print : MyWeb.function
}
}
//加入固定欄位變數定義
//日期
string[] _type = { "zh", "min", "lunar" };
+580
View File
@@ -0,0 +1,580 @@
<%@ Page Title="" Language="C#" MasterPageFile="~/admin/Templates/TBS5ADM001/MasterPage.master" AutoEventWireup="true" CodeFile="print_list.aspx.cs" Inherits="admin_print_print_list" %>
<asp:Content ID="Content1" ContentPlaceHolderID="page_header" Runat="Server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="page_nav" Runat="Server">
<div class="mb-2 mb-sm-0">
<label>請選擇需要列印的活動(法會)</label>
<div class="input-group mb-3" data-search-control="search2" @click="search_show(search_dialog.controls.search2)">
<input class="form-control search-text" type="text" readonly
id="activity_txt" runat="server" placeholder="活動(法會)" value="">
<asp:HiddenField ID="activity" runat="server" Value="" />
<button class="btn btn-outline-secondary" type="button">
<i class="mdi mdi-view-list-outline"></i>
</button>
</div>
<%--<select class="form-select" v-model="selected_activity">
<option value="-1">請選擇活動</option>
<option v-for="item in activity_list" :key="item.activity_num" :value="item.num">
{{item.subject}}
</option>
</select>--%>
</div>
<%-- <div>
<a @click="print" class="btn btn-primary">列印牌位</a>
</div>--%>
</asp:Content>
<asp:Content ID="Content3" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
<div id="content" class="container-md">
<v-data-table
v-model="order_data.selected"
:items="order_data.list"
item-key="order_no"
:headers="order_data.header"
:loading="order_data.loading"
class="elevation-1">
<template #item.files ="{item}">
{{getItemCount(item.files)}}
</template>
<template #item.print="{item}">
<v-icon color="blue" class="mr-2" @click="print(item);" >
mdi-printer
</v-icon>
</template>
</v-data-table>
</div>
<v-dialog v-model="print_data.print_dialog.show" max-width="700px">
<div id="content1" class="container-md">
<v-card-title class="justify-space-between grey lighten-2">
列印清單
<v-btn icon @click="print_data.print_dialog.show=false;print_data.selected=[]"><v-icon>mdi-close</v-icon></v-btn>
</v-card-title>
<v-data-table
v-model="print_data.selected"
:items="processedItems"
item-key="compositeKey"
:headers="print_data.header"
:loading="print_data.loading"
show-select
class="elevation-1">
<v-divider inset></v-divider>
<template v-slot:top>
<v-toolbar flat color="white">
<div class="d-flex w-100">
<v-btn
color="primary"
class="ml-2 white--text"
@click.prevent="multiPrintNew">
列印<v-icon dark>mdi-turn-right</v-icon>
</v-btn>
<v-btn
color="primary"
class="ml-2 white--text"
@click.prevent="multiPreviewNew">
預覽<v-icon dark>mdi-turn-right</v-icon>
</v-btn>
</div>
</v-toolbar>
</template>
</v-data-table>
</div>
</v-dialog>
<v-dialog v-model="search_dialog.show" max-width="700px">
<v-card>
<v-card-title class="justify-space-between grey lighten-2">
查詢:{{search_dialog.current.title}}
<v-btn icon @click="search_dialog.show=false; search_dialog.page = 1;"><v-icon>mdi-close</v-icon></v-btn>
</v-card-title>
<v-card-text >
<v-row>
<v-col v-for="item in search_dialog.current.keys"
:cols="search_dialog.current.keys.length>1?6:12" >
<v-text-field v-model="item.value" :label="item.title" v-if="item.visible===undefined || item.visible==true "></v-text-field>
</v-col>
<v-col cols="12" class="text-end">
<v-btn color="primary" elevation="0" @click="search_get()">查詢</v-btn>
<v-btn elevation="0" @click="search_clear()">清除條件</v-btn>
</v-col>
</v-row>
<v-data-table
:headers="search_headers()"
:items="search_dialog.list"
:footer-props="search_dialog.footer"
:items-per-page="10"
:server-items-length="search_dialog.count"
:page.sync="search_dialog.page"
:options.sync="options"
@click:row="search_select"
:loading="search_dialog.loading"
></v-data-table>
</v-card-text>
<v-card-actions>
</v-card-actions>
</v-card>
</v-dialog>
</asp:Content>
<asp:Content ID="Content4" ContentPlaceHolderID="offCanvasRight" Runat="Server">
</asp:Content>
<asp:Content ID="Content5" ContentPlaceHolderID="footer_script" Runat="Server">
<script>
Vue.filter('timeString', function (value, myFormat) {
return value == null || value == "" ? "" : moment(value).format(myFormat || 'YYYY-MM-DD, HH:mm:ss');
});
let VueApp = new Vue({
el: '#app',
vuetify: new Vuetify(vuetify_options),
data() {
return {
canPrint: false,
options: {},
activity_list: [],
order_data: {
loading: false,
list: [],
selected: [],
count: 0,
header: [
{ text: '功德項目', value: 'act_item_selected.text' },
{ text: '數量', value: 'files' },
{ text: '列印', value: 'print'}
],
},
print_data: {
item:[],
loading: false,
list: [],
selected: [],
count: 0,
header: [
{ text: '報名單號', value: 'order_no' },
{ text: '列印編號', value: 'print_id' },
{ text: '已列印', value: 'isPrinted' }
],
print_dialog: { show: false }
},
search_dialog: {
controls: {
search2: {
id: 'search2',
title: '活動(法會)',
text_prop: 'subject',
value_prop: 'num',
keys: [
{ id: 'num', title: '編號', value: '' },
{ id: 'subject', title: '活動(法會)名稱', value: '' },
],
api_url: HTTP_HOST + 'api/activity/GetList',
columns: [
{ id: 'num', title: '編號' },
{ id: 'subject', title: '活動(法會)名稱' },
],
selected: {},
select(item, t) {
}
},
},
show: false,
current: {},
list: [],
count: 0,
page: 1,
loading: false,
footer: {
showFirstLastPage: true,
disableItemsPerPage: true,
itemsPerPageAllText: '',
itemsPerPageText: '',
//'items-per-page-options': [10, 20, 30, 40, 50, 100]
},
},
selected_activity: '-1',
search: {
kind: 0,
subject: '',
},
snackbar: {
show: false,
text: "",
},
}
},
computed: {
processedItems() {
return this.print_data.list.map(item => ({
...item,
compositeKey: `${item.order_no}_${item.num.toString()}_${item.print_id}`
}))
}
},
methods: {
getItemCount(item) {
//console.log("getItemCount:",item[0]?.list.length)
return item[0]?.list.length
},
search_show(curr) {
this.search_dialog.current = curr;
this.search_clear()
//this.search_get()//清除完自動會重抓, 故取消
this.search_dialog.show = true;
},
search_clear() {
if (!this.search_dialog.current.keys) return;
this.search_dialog.current.keys.forEach((t, i) => { t.value = '' })
this.search_get()
},
search_get() {
if (!this.search_dialog.current.keys) return;
let api_url = this.search_dialog.current.api_url;
let keys = this.search_dialog.current.keys;
//const { page, itemsPerPage } = this.options
//const { sortBy, sortDesc, page, itemsPerPage } = this.options
this.search_dialog.page = this.options.page ?? 1
let params = { page: this.search_dialog.page, pageSize: 10 };//url params
var search = {};//post body
keys.forEach((t, i) => {
search[t.id] = t.value;
});
if (this.search_dialog.current.id == 'search5') {
search['num'] = this.activity_id;
}
if (this.search_dialog.current.id == 'search4') {
search['num'] = this.follower_id;
}
if (this.search_dialog.current.id == 'search6') {
search['num'] = this.follower_id;
}
if (this.search_dialog.current.id == 'search7' || this.search_dialog.current.id == 'search8') {
search['num'] = this.follower_id;
}
//console.log("search_get", api_url, search, params, this.options);
this.search_dialog.loading = true
axios.post(api_url, search, { params: params })
.then(response => {
this.search_dialog.list = response.data.list
this.search_dialog.count = response.data.count
this.search_dialog.loading = false
})
.catch(error => {
console.log(error)
this.search_dialog.list = []
this.search_dialog.count = 0
this.search_dialog.loading = false
this.snackbar.text = "錯誤:" + error
this.snackbar.show = true
})
},
search_headers() {
if (!this.search_dialog.current.columns) return;
r = [];
this.search_dialog.current.columns.forEach((t, i) => {
//console.log("search_headers:", t, i);
r.push({
text: t.title,
width: t.width,
align: 'start',
sortable: false,
value: t.id,
})
})
return r
},
search_select(row) {
let curr = this.search_dialog.current;
let target = $(`[data-search-control=${curr.id}]`);
curr.selected = row;
//牌位
if (curr.id == 'search7') {
this.editedItem.f_num_tablet = curr.selected[curr.text_prop];
} else if (curr.id == 'search8') {
this.editedItem.from_id_tablet = curr.selected[curr.text_prop];
} else {
target.children("input.search-text").val(curr.selected[curr.text_prop])//text
target.children("input:hidden").val(curr.selected[curr.value_prop])//value
}
if (curr.select instanceof Function) {
curr.select(this.editedItem, row);
}
this.search_dialog.show = false;
this.search_dialog.page = 1;
this.get_activity()
//console.log(row, row["u_name"], row["f_number"], curr.id, target);
},
get_activity() {
const params = {
page: 1, pageSize: 1000
};
let curr = this.search_dialog.current;
let target = $(`[data-search-control=${curr.id}]`)
this.search = { num: target.children("input:hidden").val() }
this.order_data.loading = true
axios
.post(HTTP_HOST + 'api/activity/GetActRelaList', this.search, { params: params })
.then(response => {
//console.log("GetActRelaList:", response);
this.order_data.list = response.data.list
this.order_data.list.forEach(val => {
val.files.forEach(y => {
y.list.forEach(z => {
if (z.printed_files.includes(y.num.toString())) {
z.isPrinted = true
}
}
)
})
//if(val.files.list) val.files.num
});
this.order_data.count = response.data.count;
this.order_data.loading = false
})
.catch(error => console.log(error))
},
get_actItem() {
},
multiPreviewNew() {
let list = []
//console.log("print_data.selected:",this.print_data.item);
this.print_data.selected.forEach(item => {
list.push({
num: item.num, print_id: item.print_id, order_no: item.order_no, from_id: item.from_id,
printed_files: item.printed_files
})
})
if (list.length > 0) {
let item = this.print_data.item[0]
var params = {
item: item.act_item_selected?.val,
file: this.print_data.item[0].files[0].num,
};
// 記錄已列印
//let list_num = []
//list.forEach(val => {
// list_num.push(val.num)
//})
//let _url = HTTP_HOST + 'api/order/printMultiFileLogNew';
//axios.post(_url, list_num, { params: params })
// .then(response => {
// this.order_data.list.forEach(val => {
// val.files.forEach(y => {
// y.list.forEach(z => {
// if (list_num.includes(z.num)) {
// z.isPrinted = true
// }
// }
// )
// })
// });
// })
// .catch(error => {
// console.log(error)
// })
_url = HTTP_HOST + 'admin/print/print_multi_new.aspx';
var form = document.createElement("form");
form.method = "POST";
form.action = _url;
form.target = "_blank";
const addHiddenField = (name, value) => {
const hiddenField = document.createElement("input");
hiddenField.type = "hidden";
hiddenField.name = name;
hiddenField.value = value;
form.appendChild(hiddenField);
};
// Add form fields
addHiddenField("item", item.act_item_selected?.val);
addHiddenField("file", this.print_data.item[0].files[0].num);
addHiddenField("list", JSON.stringify(list));
addHiddenField("title", `${item.act_item_selected} / ${item.subject}`);
localStorage.setItem("item", item.act_item_selected?.val);
localStorage.setItem("list", JSON.stringify(list));
localStorage.setItem("mode", "print");
document.body.appendChild(form); // Not entirely sure if this is necessary
form.submit();
document.body.removeChild(form);
}
},
multiPrintNew() {
let list = []
//console.log("print_data.selected:",this.print_data.item);
this.print_data.selected.forEach(item => {
list.push({
num: item.num, print_id: item.print_id, order_no: item.order_no, from_id: item.from_id,
printed_files: item.printed_files
})
})
if (list.length > 0) {
let item = this.print_data.item[0]
var params = {
item: item.act_item_selected?.val,
file: this.print_data.item[0].files[0].num,
};
// 記錄已列印
let list_num = []
list.forEach(val => {
list_num.push(val.num)
})
let _url = HTTP_HOST + 'api/order/printMultiFileLogNew';
axios.post(_url, list_num, { params: params })
.then(response => {
this.order_data.list.forEach(val => {
val.files.forEach(y => {
y.list.forEach(z => {
if (list_num.includes(z.num)) {
z.isPrinted=true
}
//if (z.printed_files.includes(y.num.toString())) {
// z.isPrinted = true
//}
}
)
})
});
//for (let i = 0; i < this.print_data.selected.length; i++) {
// for (let j = 0; j < this.print_data.item.length; j++) {
// if (this.print_data.selected[i].num == this.print_data.item[j].num) {
// this.print_data.item[j].isPrinted = true;
// break;
// }
// }
//}
})
.catch(error => {
console.log(error)
})
_url = HTTP_HOST + 'admin/print/print_multi_new.aspx';
var form = document.createElement("form");
form.method = "POST";
form.action = _url;
form.target = "_blank";
const addHiddenField = (name, value) => {
const hiddenField = document.createElement("input");
hiddenField.type = "hidden";
hiddenField.name = name;
hiddenField.value = value;
form.appendChild(hiddenField);
};
// Add form fields
addHiddenField("item", item.act_item_selected?.val);
addHiddenField("file", this.print_data.item[0].files[0].num);
addHiddenField("list", JSON.stringify(list));
addHiddenField("title", `${item.act_item_selected} / ${item.subject}`);
localStorage.setItem("item", item.act_item_selected?.val);
localStorage.setItem("list", JSON.stringify(list));
localStorage.setItem("mode","print");
document.body.appendChild(form); // Not entirely sure if this is necessary
form.submit();
document.body.removeChild(form);
}
},
print(item) {
console.log("print:", item)
//let list = []
this.print_data.list.length = 0
this.print_data.item.length = 0
item.files[0].list.forEach(val => {
this.print_data.list.push(val)
})
this.print_data.item.push(item)
//let list_count = list.length;
this.print_data.print_dialog.show = true
//_url = HTTP_HOST + 'admin/print/print_multi_new.aspx';
//var form = document.createElement("form");
//form.method = "POST";
//form.action = _url;
//form.target = "_blank";
//const addHiddenField = (name, value) => {
// const hiddenField = document.createElement("input");
// hiddenField.type = "hidden";
// hiddenField.name = name;
// hiddenField.value = value;
// form.appendChild(hiddenField);
//};
//// Add form fields
//console.log(JSON.stringify(list));
//addHiddenField("item", item.actitem_num_selected.val);
//addHiddenField("file", item.num);
//addHiddenField("list", JSON.stringify(list));
//addHiddenField("title", `${item.actitem_num_selected} / ${item.subject}`);
//localStorage.setItem("item", item.actitem_num_selected.val);
//localStorage.setItem("list", JSON.stringify(list));
//document.body.appendChild(form); // Not entirely sure if this is necessary
//form.submit();
//document.body.removeChild(form);
},
yulan_single(item) {
_url = HTTP_HOST + '/admin/printpw/index.aspx';
var form = document.createElement("form");
form.method = "POST";
form.action = _url;
form.target = "_blank"; // Open the result in a new tab
// Helper function to add hidden fields
const addHiddenField = (name, value) => {
const hiddenField = document.createElement("input");
hiddenField.type = "hidden";
hiddenField.name = name;
hiddenField.value = value;
form.appendChild(hiddenField);
};
addHiddenField("order_no", item.order_no);
document.body.appendChild(form); // Not entirely sure if this is necessary
form.submit();
document.body.removeChild(form);
},
},
mounted() {
//this.get_activity()
},
watch: {
options: {
handler() {
this.search_get()
},
deep: true,
},
selected_activity(newValue, oldValue) {
const params = {
page: 1, pageSize: 100
};
console.log("selected_activity:",newValue)
if (newValue !== oldValue) {
axios
.post(HTTP_HOST + 'api/orderdetail/GetList', { activity_num: this.selected_activity }, { params: params })
.then(response => {
this.order_data.list = response.data.list
})
.catch(error => console.log(error))
}
},
'order_data.selected'(newValue, oldValue){
console.log(newValue)
}
}
})
</script>
</asp:Content>
+15
View File
@@ -0,0 +1,15 @@
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_print_print_list : MyWeb.config
{
private Model.ezEntities _db = new Model.ezEntities();
protected void Page_Load(object sender, EventArgs e)
{
}
}
+6
View File
@@ -100,6 +100,12 @@ public partial class admin_print_print_multi : MyWeb.function
string detail_data = newStrList.Count > 0 ? string.Join("\r\n", newStrList) : "";//參數集合((名稱及值​
string[] k = detail_data.Split('$');
if (!string.IsNullOrEmpty(orderItem.address))
{
_word = _word.Replace("{$右標題}", orderItem.address);
}
for (int i = 0; i < k.Length; i++)
{
try{
File diff suppressed because it is too large Load Diff
+681
View File
@@ -0,0 +1,681 @@
<%@ Page Title="" Language="C#" MasterPageFile="~/admin/Templates/TBS5ADM001/MasterPage.master" AutoEventWireup="true" CodeFile="shuwen.aspx.cs" Inherits="admin_print_shuwen" %>
<asp:Content ID="Content1" ContentPlaceHolderID="page_header" Runat="Server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="page_nav" Runat="Server">
<div class="mb-2 mb-sm-0">
<label>請選擇需要列印的活動(法會)</label>
<div class="input-group mb-3" data-search-control="search2" @click="search_show(search_dialog.controls.search2)">
<input class="form-control search-text" type="text" readonly
id="activity_txt" runat="server" placeholder="活動(法會)" value="">
<asp:HiddenField ID="activity" runat="server" Value="" />
<button class="btn btn-outline-secondary" type="button">
<i class="mdi mdi-view-list-outline"></i>
</button>
</div>
</div>
</asp:Content>
<asp:Content ID="Content3" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
<div id="content" class="container-md">
<v-tabs
v-model="tab"
background-color="primary"
centered
dark
icons-and-text>
<v-tabs-slider></v-tabs-slider>
<v-tab href="#疏文">
疏文
<v-icon>mdi-book-open-outline</v-icon>
</v-tab>
<v-tab href="#打齋">
打齋
<v-icon>mdi-bowl-mix-outline</v-icon>
</v-tab>
<v-tab href="#點燈">
點燈
<v-icon>mdi-dome-light</v-icon>
</v-tab>
<v-tab href="#供佛">
供佛
<v-icon>mdi-weather-cloudy</v-icon>
</v-tab>
<v-tab href="#供僧">
供僧
<v-icon>mdi-account-circle-outline</v-icon>
</v-tab>
<v-tab href="#供花果">
供花果
<v-icon>mdi-flower</v-icon>
</v-tab>
<v-tab href="#普桌">
普桌
<v-icon>mdi-desk</v-icon>
</v-tab>
</v-tabs>
<v-tabs-items v-model="tab">
<v-tab-item
value="疏文">
<v-card flat>
<v-card-text>
<button type="button" class="btn btn-primary" @click.prevent="getShuwen('消')">消災疏文</button>
<button type="button" class="btn btn-primary" @click.prevent="getShuwen('超')">超薦疏文</button>
</v-card-text>
</v-card>
</v-tab-item>
<v-tab-item
value="打齋">
<v-card flat>
<v-card-text>
<button type="button" class="btn btn-primary" @click.prevent="print('齋')">列印</button>(請先勾選歸屬打齋功德項目)
<v-data-table
v-model="fast.selected"
:items="actItems"
item-key="num"
:headers="fast.header"
:loading="fast.loading"
hide-default-footer
:items-per-page="-1"
show-select
class="elevation-1">
<%-- <template #item.print="{item}">
<v-icon color="blue" class="mr-2" @click="print(item);" >
mdi-printer
</v-icon>
</template>--%>
</v-data-table>
</v-card-text>
</v-card>
</v-tab-item>
<v-tab-item
value="點燈">
<v-card flat>
<v-card-text>
<button type="button" class="btn btn-primary" @click.prevent="print('燈')">列印</button>(請先勾選歸屬點燈功德項目)
<v-data-table
v-model="lighter.selected"
:items="actItems"
item-key="num"
:headers="lighter.header"
:loading="lighter.loading"
hide-default-footer
:items-per-page="-1"
show-select
class="elevation-1">
</v-data-table>
</v-card-text>
</v-card>
</v-tab-item>
<v-tab-item
value="供佛">
<v-card flat>
<v-card-text>
<button type="button" class="btn btn-primary" @click.prevent="print('佛')">列印</button>(請先勾選歸屬供佛功德項目)
<v-data-table
v-model="buda.selected"
:items="actItems"
item-key="num"
:headers="buda.header"
:loading="buda.loading"
hide-default-footer
:items-per-page="-1"
show-select
class="elevation-1">
</v-data-table>
</v-card-text>
</v-card>
</v-tab-item>
<v-tab-item
value="供僧">
<v-card flat>
<v-card-text>
<button type="button" class="btn btn-primary" @click.prevent="print('僧')">列印</button>(請先勾選歸屬供僧功德項目)
<v-data-table
v-model="monk.selected"
:items="actItems"
item-key="num"
:headers="monk.header"
:loading="monk.loading"
hide-default-footer
:items-per-page="-1"
show-select
class="elevation-1">
</v-data-table>
</v-card-text>
</v-card>
</v-tab-item>
<v-tab-item
value="供花果">
<v-card flat>
<v-card-text>
<button type="button" class="btn btn-primary" @click.prevent="print('花')">列印</button>(請先勾選歸屬供花果功德項目)
<v-data-table
v-model="fruit.selected"
:items="actItems"
item-key="num"
:headers="fruit.header"
:loading="fruit.loading"
hide-default-footer
:items-per-page="-1"
show-select
class="elevation-1">
</v-data-table>
</v-card-text>
</v-card>
</v-tab-item>
<v-tab-item
value="普桌">
<v-card flat>
<v-card-text>
<button type="button" class="btn btn-primary" @click.prevent="print('普')">列印</button>(請先勾選歸屬普桌功德項目)
<v-data-table
v-model="desk.selected"
:items="actItems"
item-key="num"
:headers="desk.header"
:loading="desk.loading"
hide-default-footer
:items-per-page="-1"
show-select
class="elevation-1">
</v-data-table>
</v-card-text>
</v-card>
</v-tab-item>
</v-tabs-items>
</div>
<v-dialog v-model="search_dialog.show" max-width="700px">
<v-card>
<v-card-title class="justify-space-between grey lighten-2">
查詢:{{search_dialog.current.title}}
<v-btn icon @click="search_dialog.show=false; search_dialog.page = 1;"><v-icon>mdi-close</v-icon></v-btn>
</v-card-title>
<v-card-text >
<v-row>
<v-col v-for="item in search_dialog.current.keys"
:cols="search_dialog.current.keys.length>1?6:12" >
<v-text-field v-model="item.value" :label="item.title" v-if="item.visible===undefined || item.visible==true "></v-text-field>
</v-col>
<v-col cols="12" class="text-end">
<v-btn color="primary" elevation="0" @click="search_get()">查詢</v-btn>
<v-btn elevation="0" @click="search_clear()">清除條件</v-btn>
</v-col>
</v-row>
<v-data-table
:headers="search_headers()"
:items="search_dialog.list"
:footer-props="search_dialog.footer"
:items-per-page="10"
:server-items-length="search_dialog.count"
:page.sync="search_dialog.page"
:options.sync="options"
@click:row="search_select"
:loading="search_dialog.loading"
></v-data-table>
</v-card-text>
<v-card-actions>
</v-card-actions>
</v-card>
</v-dialog>
<v-snackbar
v-model="snackbar.show"
timeout="2000"
>
{{ snackbar.text }}
<template v-slot:action="{ attrs }">
<v-btn
text
v-bind="attrs"
@click="snackbar.show = false"
>
關閉
</v-btn>
</template>
</v-snackbar>
</asp:Content>
<asp:Content ID="Content4" ContentPlaceHolderID="offCanvasRight" Runat="Server">
</asp:Content>
<asp:Content ID="Content5" ContentPlaceHolderID="footer_script" Runat="Server">
<script>
let VueApp = new Vue({
el: '#app',
vuetify: new Vuetify(vuetify_options),
data() {
return {
tab: "疏文",
canPrint: false,
options: {},
activity_list: [],
actItems: [],
snackbar: {
show: false,
text: "",
},
fast: {
loading: false,
list: [],
selected: [],
count: 0,
order_no: "",
header: [
{ text: '編號', value: 'num' },
{ text: '功德項目', value: 'subject' },
],
},
lighter: {
loading: false,
list: [],
selected: [],
count: 0,
order_no: "",
header: [
{ text: '功德項目', value: 'subject' },
],
},
buda: {
loading: false,
list: [],
selected: [],
count: 0,
order_no: "",
header: [
{ text: '功德項目', value: 'subject' },
],
},
monk: {
loading: false,
list: [],
selected: [],
count: 0,
order_no: "",
header: [
{ text: '功德項目', value: 'subject' },
],
},
fruit: {
loading: false,
list: [],
selected: [],
count: 0,
order_no: "",
header: [
{ text: '功德項目', value: 'subject' },
],
},
desk: {
loading: false,
list: [],
selected: [],
count: 0,
order_no: "",
header: [
{ text: '功德項目', value: 'subject' },
],
},
order_data: {
loading: false,
list: [],
selected: [],
count: 0,
header: [
{ text: '功德項目', value: 'act_item_selected.text' },
{ text: '數量', value: 'files' },
{ text: '列印', value: 'print' }
],
},
print_data: {
item: [],
loading: false,
list: [],
selected: [],
count: 0,
header: [
{ text: '報名單號', value: 'order_no' },
{ text: '列印編號', value: 'print_id' },
{ text: '已列印', value: 'isPrinted' }
],
print_dialog: { show: false }
},
search_dialog: {
controls: {
search2: {
id: 'search2',
title: '活動(法會)',
text_prop: 'subject',
value_prop: 'num',
keys: [
{ id: 'num', title: '編號', value: '' },
{ id: 'subject', title: '活動(法會)名稱', value: '' },
],
api_url: HTTP_HOST + 'api/activity/GetList',
columns: [
{ id: 'num', title: '編號' },
{ id: 'subject', title: '活動(法會)名稱' },
],
selected: {},
select(item, t) {
}
},
},
show: false,
current: {},
list: [],
count: 0,
page: 1,
loading: false,
footer: {
showFirstLastPage: true,
disableItemsPerPage: true,
itemsPerPageAllText: '',
itemsPerPageText: '',
//'items-per-page-options': [10, 20, 30, 40, 50, 100]
},
},
selected_activity: '-1',
search: {
kind: 0,
subject: '',
},
snackbar: {
show: false,
text: "",
},
}
},
computed: {
processedItems() {
return this.print_data.list.map(item => ({
...item,
compositeKey: `${item.order_no}_${item.num.toString()}_${item.print_id}`
}))
}
},
methods: {
print(item) {
let curr = this.search_dialog.current;
let target = $(`[data-search-control=${curr.id}]`)
let searchData = { activity_num: target.children("input:hidden").val(), mode: item, actItems: [] }
if (searchData.activity_num == null || searchData.activity_num=="") {
this.snackbar.text = "請先選擇法會"
this.snackbar.show = true
return false;
}
switch (item) {
case "齋":
Object.assign(searchData.actItems, this.fast.selected.map(item => item.num))
break
case "佛":
Object.assign(searchData.actItems, this.buda.selected.map(item => item.num))
break
case "僧":
Object.assign(searchData.actItems, this.monk.selected.map(item => item.num))
break
case "花":
Object.assign(searchData.actItems, this.fruit.selected.map(item => item.num))
break
case "普":
Object.assign(searchData.actItems, this.desk.selected.map(item => item.num))
break
case "燈":
Object.assign(searchData.actItems, this.lighter.selected.map(item => item.num))
break
}
if (searchData.actItems.length == 0) {
this.snackbar.text = "請勾選歸屬功德項目"
this.snackbar.show = true
return false;
}
axios
.post(HTTP_HOST + 'api/shuwen/PrintItemReport', searchData, { responseType: 'blob' })
.then(response => {
// 1. Create a dynamic URL object from the binary blob
const blob = new Blob([response.data], {
type: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'
});
const fileUrl = window.URL.createObjectURL(blob);
// 2. Create a temporary 'a' element to trigger download
const link = document.createElement('a');
link.href = fileUrl;
// 3. Set desired file name
link.setAttribute('download', `${searchData.activity_num}_${searchData.mode}.docx`);
// 4. Append, click and cleanup
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
window.URL.revokeObjectURL(fileUrl); // Free up memory allocation
})
},
getShuwen(mode) {
let curr = this.search_dialog.current;
let target = $(`[data-search-control=${curr.id}]`)
let searchData = { activity_num: target.children("input:hidden").val(), mode: mode }
if (searchData.activity_num == null || searchData.activity_num == "") {
this.snackbar.text = "請選擇法會"
this.snackbar.show = true
return false;
}
try {
axios
.post(HTTP_HOST + 'api/shuwen/GetShuwenData', searchData, { responseType: 'blob' })
.then(response => {
// 1. Create a dynamic URL object from the binary blob
const blob = new Blob([response.data], {
type: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'
});
const fileUrl = window.URL.createObjectURL(blob);
// 2. Create a temporary 'a' element to trigger download
const link = document.createElement('a');
link.href = fileUrl;
// 3. Set desired file name
link.setAttribute('download', `${searchData.activity_num}_${searchData.mode}.docx`);
// 4. Append, click and cleanup
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
window.URL.revokeObjectURL(fileUrl); // Free up memory allocation
})
} catch (error) {
console.error('Error downloading the file:', error);
alert('Failed to download file.');
} finally {
this.loading = false;
}
},
getItemCount(item) {
//console.log("getItemCount:",item[0]?.list.length)
return item[0]?.list.length
},
search_show(curr) {
this.search_dialog.current = curr;
this.search_clear()
//this.search_get()//清除完自動會重抓, 故取消
this.search_dialog.show = true;
},
search_clear() {
if (!this.search_dialog.current.keys) return;
this.search_dialog.current.keys.forEach((t, i) => { t.value = '' })
this.search_get()
},
search_get() {
if (!this.search_dialog.current.keys) return;
let api_url = this.search_dialog.current.api_url;
let keys = this.search_dialog.current.keys;
//const { page, itemsPerPage } = this.options
//const { sortBy, sortDesc, page, itemsPerPage } = this.options
this.search_dialog.page = this.options.page ?? 1
let params = { page: this.search_dialog.page, pageSize: 10 };//url params
var search = {};//post body
keys.forEach((t, i) => {
search[t.id] = t.value;
});
if (this.search_dialog.current.id == 'search5') {
search['num'] = this.activity_id;
}
if (this.search_dialog.current.id == 'search4') {
search['num'] = this.follower_id;
}
if (this.search_dialog.current.id == 'search6') {
search['num'] = this.follower_id;
}
if (this.search_dialog.current.id == 'search7' || this.search_dialog.current.id == 'search8') {
search['num'] = this.follower_id;
}
//console.log("search_get", api_url, search, params, this.options);
this.search_dialog.loading = true
axios.post(api_url, search, { params: params })
.then(response => {
this.search_dialog.list = response.data.list
this.search_dialog.count = response.data.count
this.search_dialog.loading = false
})
.catch(error => {
console.log(error)
this.search_dialog.list = []
this.search_dialog.count = 0
this.search_dialog.loading = false
this.snackbar.text = "錯誤:" + error
this.snackbar.show = true
})
},
search_headers() {
if (!this.search_dialog.current.columns) return;
r = [];
this.search_dialog.current.columns.forEach((t, i) => {
//console.log("search_headers:", t, i);
r.push({
text: t.title,
width: t.width,
align: 'start',
sortable: false,
value: t.id,
})
})
return r
},
search_select(row) {
let curr = this.search_dialog.current;
let target = $(`[data-search-control=${curr.id}]`);
curr.selected = row;
//牌位
if (curr.id == 'search7') {
this.editedItem.f_num_tablet = curr.selected[curr.text_prop];
} else if (curr.id == 'search8') {
this.editedItem.from_id_tablet = curr.selected[curr.text_prop];
} else {
target.children("input.search-text").val(curr.selected[curr.text_prop])//text
target.children("input:hidden").val(curr.selected[curr.value_prop])//value
}
if (curr.select instanceof Function) {
curr.select(this.editedItem, row);
}
this.search_dialog.show = false;
this.search_dialog.page = 1;
this.get_activity()
//console.log(row, row["u_name"], row["f_number"], curr.id, target);
},
getActItem() {
const params = {
page: 1, pageSize: 1000
};
axios
.post(HTTP_HOST + 'api/activity/GetItemList', {}, { params: params })
.then(response => {
console.log("getActItem:", response);
if (response.status == 200) {
Object.assign(this.actItems, response.data.list)
}
})
},
get_activity() {
const { sortBy, sortDesc, page, itemsPerPage } = this.options
const params = {
sortBy: "", sortDesc: false,
page: page, pageSize: itemsPerPage
};
//const params = {
// page: 1, pageSize: 10
//};
let curr = this.search_dialog.current;
let target = $(`[data-search-control=${curr.id}]`)
this.search = { num: target.children("input:hidden").val() }
this.order_data.loading = true
axios
.post(HTTP_HOST + 'api/activity/GetActRelaList', this.search, { params: params })
.then(response => {
//console.log("GetActRelaList:", response);
this.order_data.list = response.data.list
this.order_data.list.forEach(val => {
val.files.forEach(y => {
y.list.forEach(z => {
if (z.printed_files.includes(y.num.toString())) {
z.isPrinted = true
}
}
)
})
//if(val.files.list) val.files.num
});
this.order_data.count = response.data.count;
this.order_data.loading = false
})
.catch(error => console.log(error))
},
},
mounted() {
//this.get_activity()
this.getActItem();
},
watch: {
options: {
handler() {
this.search_get()
},
deep: true,
},
//selected_activity(newValue, oldValue) {
// const params = {
// page: 1, pageSize: 100
// };
// //console.log("selected_activity:", newValue)
// if (newValue !== oldValue) {
// axios
// .post(HTTP_HOST + 'api/orderdetail/GetList', { activity_num: this.selected_activity }, { params: params })
// .then(response => {
// this.order_data.list = response.data.list
// })
// .catch(error => console.log(error))
// }
//},
//'order_data.selected'(newValue, oldValue) {
// console.log(newValue)
//}
}
})
</script>
</asp:Content>
+22
View File
@@ -0,0 +1,22 @@
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.IO;
using System.Linq;
using System.Web;
using System.Web.Http;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class admin_print_shuwen : MyWeb.config
{
protected void Page_Load(object sender, EventArgs e)
{
}
}
File diff suppressed because it is too large Load Diff
+6 -6
View File
@@ -175,7 +175,7 @@
class="checkbox-narrow d-inline-flex align-center" />
</v-list-item-action>
<v-list-item-content>
<v-list-item-title>
<v-list-item-title :title="member.fam_name">
<span class="badge-zero" v-if="member.num==0">0</span>
<span class="badge-deceased" v-if="member.deceased">{{ member.deceased ? '卍' : '' }}</span>
{{ member.fam_name }}
@@ -215,7 +215,7 @@
<v-list-item-group>
<v-list-item v-for="member in family_deceased_Y_unselected" :key="member.fam_name">
<v-list-item-content>
<v-list-item-title>
<v-list-item-title :title="member.fam_name">
<span class="badge-deceased" v-if="member.deceased">{{ member.deceased ? '卍' : '' }}</span>
{{ member.fam_name }}
<v-chip v-if="member.fam_title" small>
@@ -265,9 +265,9 @@
class="checkbox-narrow d-inline-flex align-center" />
</v-list-item-action>
<v-list-item-content>
<v-list-item-title>
<v-list-item-title :title="member.fam_name">
<span class="badge-zero" v-if="member.num==0">0</span>
<span class="badge-deceased" v-if="member.deceased">{{ member.deceased ? '卍' : '' }}</span>
<span class="badge-deceased" v-if="member.deceased" >{{ member.deceased ? '卍' : '' }}</span>
{{ member.fam_name }}
<v-chip v-if="member.fam_title" small>
{{ member.fam_title }}
@@ -305,8 +305,8 @@
<v-list-item-group>
<v-list-item v-for="member in family_deceased_N_unselected" :key="member.fam_name">
<v-list-item-content>
<v-list-item-title>
<span class="badge-deceased" v-if="member.deceased">{{ member.deceased ? '卍' : '' }}</span>
<v-list-item-title :title="member.fam_name">
<span class="badge-deceased" v-if="member.deceased" >{{ member.deceased ? '卍' : '' }}</span>
{{ member.fam_name }}
<v-chip v-if="member.fam_title" small>
{{ member.fam_title }}
+12
View File
@@ -37,6 +37,18 @@ public partial class admin_printpw_index : MyWeb.function
Repeater1.DataSource = oderList;
Repeater1.DataBind();
}
else if (!String.IsNullOrEmpty(Request["orders"]))
{
var orders = Request["orders"];
var oderList = _db.pro_order_detail
.Where(u =>orders.Contains( u.order_no))
.Where(u => (u.parent_num != null)
|| u.actItem.subject.Contains("牌")
|| !string.IsNullOrEmpty(u.f_num_tablet))
.Select(u => new { detail_num = u.num, actItem_num = u.actItem_num }).ToArray();
Repeater1.DataSource = oderList;
Repeater1.DataBind();
}
else
{
Response.Clear();
+227 -14
View File
@@ -6,16 +6,58 @@
<asp:Content ID="Content3" ContentPlaceHolderID="page_nav" runat="Server">
<div class="mb-2 mb-sm-0">
<label>請選擇需要預覽的活動</label>
<select class="form-select" v-model="selected_activity">
<div class="input-group mb-3" data-search-control="search2" @click="search_show(search_dialog.controls.search2)">
<input class="form-control search-text" type="text" readonly
id="activity_txt" runat="server" placeholder="活動(法會)" value="">
<asp:HiddenField ID="activity" runat="server" Value="" />
<button class="btn btn-outline-secondary" type="button">
<i class="mdi mdi-view-list-outline"></i>
</button>
</div>
<%-- <select class="form-select" v-model="selected_activity">
<option value="-1">請選擇活動</option>
<option v-for="item in activity_list" :key="item.activity_num" :value="item.num">
{{item.subject}}
</option>
</select>
</select>--%>
</div>
<div>
<a @click="yulan_print" class="btn btn-primary">列印預覽牌位</a>
<a @click="yulan_print" class="btn btn-primary">列印預覽牌位</a>
</div>
<v-dialog v-model="search_dialog.show" max-width="700px">
<v-card>
<v-card-title class="justify-space-between grey lighten-2">
查詢:{{search_dialog.current.title}}
<v-btn icon @click="search_dialog.show=false; search_dialog.page = 1;"><v-icon>mdi-close</v-icon></v-btn>
</v-card-title>
<v-card-text >
<v-row>
<v-col v-for="item in search_dialog.current.keys"
:cols="search_dialog.current.keys.length>1?6:12" >
<v-text-field v-model="item.value" :label="item.title" v-if="item.visible===undefined || item.visible==true "></v-text-field>
</v-col>
<v-col cols="12" class="text-end">
<v-btn color="primary" elevation="0" @click="search_get()">查詢</v-btn>
<v-btn elevation="0" @click="search_clear()">清除條件</v-btn>
</v-col>
</v-row>
<v-data-table
:headers="search_headers()"
:items="search_dialog.list"
:footer-props="search_dialog.footer"
:items-per-page="10"
:server-items-length="search_dialog.count"
:page.sync="search_dialog.page"
:options.sync="options"
@click:row="search_select"
:loading="search_dialog.loading"
></v-data-table>
</v-card-text>
<v-card-actions>
</v-card-actions>
</v-card>
</v-dialog>
</asp:Content>
<asp:Content ID="Script_Content" ContentPlaceHolderID="footer_script" runat="server">
@@ -29,6 +71,7 @@
data() {
return {
activity_list: [],
options: {},
order_data: {
loading: false,
list: [],
@@ -40,12 +83,49 @@
{ text: '報名日期', value: 'up_time' },
{ text: '報名活動', value: 'subject', align: 'start' },
{ text: '單據狀態', value: 'keyin1_txt' },
{ text: '牌位数量', value: 'detail' },
{ text: '报名项目', value: 'slot_type' },
{ text: '牌位数量', value: 'detail.count' },
{ text: '預覽', value: 'print'}
],
},
search_dialog: {
controls: {
search2: {
id: 'search2',
title: '活動(法會)',
text_prop: 'subject',
value_prop: 'num',
keys: [
{ id: 'num', title: '編號', value: '' },
{ id: 'subject', title: '活動(法會)名稱', value: '' },
],
api_url: HTTP_HOST + 'api/activity/GetList',
columns: [
{ id: 'num', title: '編號' },
{ id: 'subject', title: '活動(法會)名稱' },
],
selected: {},
select(item, t) {
}
},
},
show: false,
current: {},
list: [],
count: 0,
page: 1,
loading: false,
footer: {
showFirstLastPage: true,
disableItemsPerPage: true,
itemsPerPageAllText: '',
itemsPerPageText: '',
//'items-per-page-options': [10, 20, 30, 40, 50, 100]
},
},
selected_activity: '-1',
search: {
kind: 0,
@@ -72,7 +152,7 @@
.catch(error => console.log(error))
},
yulan_print() {
_url = HTTP_HOST + '/admin/printpw/index.aspx';
_url = HTTP_HOST + 'admin/printpw/index.aspx';
var form = document.createElement("form");
form.method = "POST";
form.action = _url;
@@ -86,7 +166,14 @@
hiddenField.value = value;
form.appendChild(hiddenField);
};
addHiddenField("activity_num", this.selected_activity);
let orders=[]
this.order_data.selected.forEach(x => {
orders.push(x.order_no)
})
if (orders.length==0) {
return false;
}
addHiddenField("orders", orders);
document.body.appendChild(form); // Not entirely sure if this is necessary
form.submit();
document.body.removeChild(form);
@@ -111,11 +198,142 @@
form.submit();
document.body.removeChild(form);
},
search_show(curr) {
this.search_dialog.current = curr;
this.search_clear()
//this.search_get()//清除完自動會重抓, 故取消
this.search_dialog.show = true;
},
search_clear() {
if (!this.search_dialog.current.keys) return;
this.search_dialog.current.keys.forEach((t, i) => { t.value = '' })
this.search_get()
},
search_get() {
if (!this.search_dialog.current.keys) return;
let api_url = this.search_dialog.current.api_url;
let keys = this.search_dialog.current.keys;
//const { page, itemsPerPage } = this.options
//const { sortBy, sortDesc, page, itemsPerPage } = this.options
this.search_dialog.page = this.options.page ?? 1
let params = { page: this.search_dialog.page, pageSize: 10 };//url params
var search = {};//post body
keys.forEach((t, i) => {
search[t.id] = t.value;
});
if (this.search_dialog.current.id == 'search5') {
search['num'] = this.activity_id;
}
if (this.search_dialog.current.id == 'search4') {
search['num'] = this.follower_id;
}
if (this.search_dialog.current.id == 'search6') {
search['num'] = this.follower_id;
}
if (this.search_dialog.current.id == 'search7' || this.search_dialog.current.id == 'search8') {
search['num'] = this.follower_id;
}
//console.log("search_get", api_url, search, params, this.options);
this.search_dialog.loading = true
axios.post(api_url, search, { params: params })
.then(response => {
this.search_dialog.list = response.data.list
this.search_dialog.count = response.data.count
this.search_dialog.loading = false
})
.catch(error => {
console.log(error)
this.search_dialog.list = []
this.search_dialog.count = 0
this.search_dialog.loading = false
this.snackbar.text = "錯誤:" + error
this.snackbar.show = true
})
},
search_headers() {
if (!this.search_dialog.current.columns) return;
r = [];
this.search_dialog.current.columns.forEach((t, i) => {
//console.log("search_headers:", t, i);
r.push({
text: t.title,
width: t.width,
align: 'start',
sortable: false,
value: t.id,
})
})
return r
},
search_select(row) {
let curr = this.search_dialog.current;
let target = $(`[data-search-control=${curr.id}]`);
curr.selected = row;
//牌位
if (curr.id == 'search7') {
this.editedItem.f_num_tablet = curr.selected[curr.text_prop];
} else if (curr.id == 'search8') {
this.editedItem.from_id_tablet = curr.selected[curr.text_prop];
} else {
target.children("input.search-text").val(curr.selected[curr.text_prop])//text
target.children("input:hidden").val(curr.selected[curr.value_prop])//value
}
if (curr.select instanceof Function) {
curr.select(this.editedItem, row);
}
this.search_dialog.show = false;
this.search_dialog.page = 1;
this.selected_activity = row.num
//this.get_activity()
//console.log(row, row["u_name"], row["f_number"], curr.id, target);
},
//get_activity() {
// const params = {
// page: 1, pageSize: 1000
// };
// let curr = this.search_dialog.current;
// let target = $(`[data-search-control=${curr.id}]`)
// this.search = { num: target.children("input:hidden").val() }
// this.order_data.loading = true
// axios
// .post(HTTP_HOST + 'api/activity/GetActRelaList', this.search, { params: params })
// .then(response => {
// let dd=response.data
// this.order_data.list = dd.list
// this.order_data.list.forEach(val => {
// val.files.forEach(y => {
// y.list.forEach(z => {
// if (z.printed_files!=null && z.printed_files.includes(y.num.toString())) {
// z.isPrinted = true
// }
// }
// )
// })
// //if(val.files.list) val.files.num
// });
// this.order_data.count = dd.count;
// this.order_data.loading = false
// })
// .catch(error => console.log(error))
//},
},
mounted() {
this.get_activity()
},
watch: {
options: {
handler() {
this.search_get()
},
deep: true,
},
selected_activity(newValue, oldValue) {
const params = {
page: 1, pageSize: 100
@@ -143,16 +361,11 @@
v-model="order_data.selected"
:items="order_data.list"
item-key="order_no"
show-select
:headers="order_data.header"
:loading="order_data.loading"
show-select
class="elevation-1">
<template #item.detail ="{item}">
{{item.detail.count}}
</template>
<template #item.slot_type ="{item}">
{{item.detail.actItem?.substring(0,3)}}
</template>
<template #item.up_time ="{item}">
{{item.up_time|timeString('YYYY-MM-DD')}}
</template>
+446
View File
@@ -0,0 +1,446 @@
<%@ Page Title="" Language="C#" MasterPageFile="~/admin/Templates/TBS5ADM001/MasterPage.master" AutoEventWireup="true" CodeFile="index.aspx.cs" Inherits="admin_receipt_index" %>
<asp:Content ID="Content1" ContentPlaceHolderID="page_header" Runat="Server">
<script src="/js/httpVueLoader.js"></script>
<style>
.modify_modal{
width:80vw !important;
}
</style>
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="page_nav" Runat="Server">
<div class="mb-2 mb-sm-0">
<a @click.prevent="newReceipt" class="btn btn-primary">
<i class="mdi mdi-plus"></i>新增
</a>
<%--<a @click="deleteAll" class="btn btn-outline-danger" title="刪除勾選的資料" ><i class="mdi mdi-trash-can"></i> 刪除勾選</a>--%>
</div>
</asp:Content>
<asp:Content ID="Content3" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
<div id="content" class="container-fluid">
<v-data-table
v-model="data_table.selected"
:items="data_table.list"
:search-props="search"
item-key="num"
:options.sync="options"
:headers="data_table.header"
:footer-props="data_table.footer"
:server-items-length="data_table.count"
:loading="data_table.loading"
:single-select="data_table.singleSelect"
hide-default-footer
:page.sync="data_table.page"
:items-per-page.sync="data_table.pageSize"
class="elevation-1">
<template #item.source="{ item }">
{{ getSourceName(item.source) }}
</template>
<template #item.slot_btn="{ item }">
<a @click.prevent="viewReceipt(item)" class="btn btn-outline-secondary btn-sm"><i class="mdi mdi-view-list-outline"></i>明細</a>
<a @click.prevent="editReceipt(item)" class="btn btn-outline-secondary btn-sm"><i class="mdi mdi-pencil-box-outline"></i>編輯</a>
<a @click.prevent="printReceipt(item)" class="btn btn-outline-secondary btn-sm"><i class="mdi mdi-printer"></i>列印</a>
<%--<a :href="'reg.aspx?order_no='+item.order_no" class="btn btn-outline-secondary btn-sm"><i class="mdi mdi-pencil-box-outline"></i>編輯</a>--%>
<%--<a @click="deleteItem(item)" class="btn btn-outline-secondary btn-sm"><i class="mdi mdi-trash-can"></i>刪除</a>--%>
</template>
</v-data-table>
<v-container>
<v-row class="align-baseline" wrap>
<v-col cols="12" md="9">
<v-pagination
v-model="data_table.page"
:length="pageCount">
</v-pagination>
</v-col>
<v-col class="text-truncate text-right" cols="12" md="2">
共 {{ data_table.count }} 筆, 頁數:
</v-col>
<v-col cols="6" md="1">
<v-text-field
v-model="data_table.page"
type="number"
hide-details
dense
min="1"
:max="pageCount"
@input="data_table.page = parseInt($event, 10)"
></v-text-field>
</v-col>
</v-row>
</v-container>
<v-dialog v-model="search_dialog.show" max-width="500px">
<v-card>
<v-card-title class="justify-space-between grey lighten-2">
查詢:{{search_dialog.current.title}}
<v-btn icon @click="search_dialog.show=false"><v-icon>mdi-close</v-icon></v-btn>
</v-card-title>
<v-card-text >
<v-row>
<v-col v-for="item in search_dialog.current.keys"
:cols="search_dialog.current.keys.length>1?6:12" v-bind:key="item.value">
<v-text-field v-model="item.value" :label="item.title" v-if="item.visible===undefined || item.visible==true "></v-text-field>
</v-col>
<v-col cols="12" class="text-end">
<v-btn color="primary" elevation="0" @click="search_get()">查詢</v-btn>
<v-btn elevation="0" @click="search_clear()">清除條件</v-btn>
</v-col>
</v-row>
<v-data-table
:headers="search_headers()"
:items="search_dialog.list"
:footer-props="search_dialog.footer"
:items-per-page="10"
:server-items-length="search_dialog.count"
:page.sync="search_dialog.page"
:options.sync="search_options"
@click:row="search_select"
></v-data-table>
</v-card-text>
<v-card-actions>
</v-card-actions>
</v-card>
</v-dialog>
<v-dialog v-model="modify_dialog.show" class="modify_modal">
<template>
<keep-alive exclude="receipt_component" >
<component :is="currentView" :num="twoData" :mode="modify_dialog.mode" @close-dialog="changeModifyDialog($event)"></component>
</keep-alive>
</template>
</v-dialog>
</div>
</asp:Content>
<asp:Content ID="Content4" ContentPlaceHolderID="offCanvasRight" Runat="Server">
<div id="search_panel" alt="查詢收據資料">
<div class="mb-3">
<label class="form-label">資料來源</label>
<v-select :items="sources_items" item-text="text" item-value="value" v-model="search.source">
</v-select>
</div>
<div class="mb-3">
<label class="form-label">報名單號</label>
<input type="text" v-model="search.order_no" class="form-control" placeholder="" id="s_order_no" runat="server">
</div>
<div class="mb-3 p-2 border-top">
<a @click="btn_search" class="btn btn-outline-primary"><i class="mdi mdi-filter"></i> 搜尋</a>
<a class="btn btn-outline-secondary" @click="btn_all"><i class="mdi mdi-filter-remove"></i> 所有資料</a>
</div>
</div>
</asp:Content>
<asp:Content ID="Content5" ContentPlaceHolderID="footer_script" Runat="Server">
<script>
let VueApp = new Vue({
el: '#app',
vuetify: new Vuetify(vuetify_options),
data() {
return {
options: { multiSort: false },
search_options: { multiSort: false },
twoData:0,
data_table: {
loading: true,
list: [],
selected: [],
singleSelect: false,
count: 0,
page: 1,
pageSize: 10,
header: [
{ text: '序號', value: 'num' },
{ text: '來源', value: 'source' },
{ text: '報名單號', value: 'order_no', align: 'start' },
{ text: '信眾', value: 'follower.u_name' },
{ text: '總金額', value: 'total_amt' },
{ text: '收據張數', value: 'receipt_count' },
{ text: '', value: 'slot_btn', sortable: false, align: 'end' }
],
footer: {
showFirstLastPage: true,
itemsPerPageOptions: [5, 10, 20, 30],
},
},
modify_dialog: {
show: false,
mode: ""
},
search_dialog: {
controls: {
search2: {
id: 'search2',
title: '報名活動',
text_prop: 'subject',
value_prop: 'num',
keys: [
{ id: 'subject', title: '活動名稱', value: '' },
{ id: 'kindTxt', title: '活動分類' },
],
api_url: HTTP_HOST + 'api/activity/GetList',
columns: [
{ id: 'subject', title: '活動名稱' },
{ id: 'kindTxt', title: '活動分類' },
],
selected: {},
select(item, t) {
t.print_search.select_act = item.num;
}
},
},
show: false,
current: {},
list: [],
count: 0,
page: 1,
loading: false,
footer: {
showFirstLastPage: true,
disableItemsPerPage: true,
itemsPerPageAllText: '',
itemsPerPageText: '',
},
},
search: {
source: '',
order_no: '',
},
sources_items: [
{ text: "法會/活動", value: "1" },
{text:"其他",value:"2"}
],
currentView: 'receipt-component'
}
},
mounted() {
},
components: {
'receipt-component': httpVueLoader('./receipt.vue'),
},
watch: {
options: {
handler() {
this.getDefault()
},
deep: true,
},
search_options: {
handler() {
this.search_get()
},
deep: true,
},
},
methods: {
changeModifyDialog(event) {
this.modify_dialog.show = false
this.modify_dialog.mode = ""
this.twoData = 0
this.currentView = "";
this.twoData = 0
if (event === "reload") {
this.getDefault()
}
},
getSourceName(id) {
return id=="1"?"活動/法會":"其他"
},
viewReceipt(item) {
this.twoData = item.num;
this.modify_dialog.show = true;
this.modify_dialog.mode = "view";
this.currentView = "receipt-component";
},
editReceipt(item) {
this.twoData = item.num;
this.modify_dialog.show = true;
this.modify_dialog.mode = "edit";
this.currentView = "receipt-component";
},
printReceipt(item) {
try {
let searchData = { num: item.num }
axios
.post(HTTP_HOST + 'api/receipt/PrintReceipt', searchData, { responseType: 'blob' })
.then(response => {
// 1. Create a dynamic URL object from the binary blob
const blob = new Blob([response.data], {
type: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'
});
const fileUrl = window.URL.createObjectURL(blob);
// 2. Create a temporary 'a' element to trigger download
const link = document.createElement('a');
link.href = fileUrl;
// 3. Set desired file name
link.setAttribute('download', `${searchData.activity_num}_${searchData.mode}.docx`);
// 4. Append, click and cleanup
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
window.URL.revokeObjectURL(fileUrl); // Free up memory allocation
})
} catch (error) {
//alert('Failed to download file.');
this.showSnack('Failed to download file.');
} finally {
this.loading = false;
}
},
newReceipt() {
this.modify_dialog.show = true;
this.modify_dialog.mode = "add";
this.twoData = 0;
this.currentView = "receipt-component";
},
search_show(curr) {
this.search_dialog.current = curr;
this.search_clear()
//this.search_get()//清除完自動會重抓, 故取消
this.search_dialog.show = true;
},
search_clear() {
if (!this.search_dialog.current.keys) return;
this.search_dialog.current.keys.forEach((t, i) => { t.value = '' })
this.search_get()
},
search_get() {
if (!this.search_dialog.current.keys) return;
let api_url = this.search_dialog.current.api_url;
let keys = this.search_dialog.current.keys;
//const { page, itemsPerPage } = this.options
//const { sortBy, sortDesc, page, itemsPerPage } = this.options
this.search_dialog.page = this.search_options.page ?? 1
let params = { page: this.search_dialog.page, pageSize: 10 };//url params
var search = {};//post body
keys.forEach((t, i) => {
search[t.id] = t.value;
});
//necessary parameter===
if (this.search_dialog.current.id == 'search2') {
params = { sortBy: 'startDate_solar', sortDesc: true, page: this.search_dialog.page, pageSize: 10 };//url params
}
this.search_dialog.loading = true
axios.post(api_url, search, { params: params })
.then(response => {
this.search_dialog.list = response.data.list
this.search_dialog.count = response.data.count
this.search_dialog.loading = false
})
.catch(error => {
this.search_dialog.list = []
this.search_dialog.count = 0
this.search_dialog.loading = false
this.snackbar.text = "錯誤:" + error
this.snackbar.show = true
})
},
search_headers() {
if (!this.search_dialog.current.columns) return;
r = [];
this.search_dialog.current.columns.forEach((t, i) => {
r.push({
text: t.title,
align: 'start',
sortable: false,
value: t.id,
})
})
return r
},
search_select(row) {
let curr = this.search_dialog.current;
let target = $(`[data-search-control=${curr.id}]`);
curr.selected = row;
target.children("input.search-text").val(curr.selected[curr.text_prop])//text
target.children("input:hidden").val(curr.selected[curr.value_prop])//value
if (curr.select instanceof Function) {
curr.select(row, this);
}
this.search_dialog.show = false;
//console.log(row, row["u_name"], row["f_number"], curr.id, target);
},
getDefault(clearpage = false) {
const { sortBy, sortDesc, page, itemsPerPage } = this.options
//page = this.data_table.page;
const params = {
sortBy: sortBy[0], sortDesc: sortDesc[0],
page: clearpage ? '1' : page, pageSize: itemsPerPage
};
this.data_table.loading = true
//sessionStorage.setItem('orderpage', clearpage ? '1' : page);
axios
.post(HTTP_HOST + 'api/receipt/GetList', this.search, { params: params })
.then(response => {
this.data_table.list = response.data.list
this.data_table.count = response.data.count;
this.data_table.loading = false
const dataToStore = JSON.stringify(this.data_table);
//sessionStorage.setItem("order_list_cache", dataToStore);
})
.catch(error => console.log(error))
},
editItem(item) {
console.log("edit", item);
},
deleteItem(item) {
if (confirm('是否確定刪除此筆資料?')) {
const index = this.data_table.list.indexOf(item)
if (index != -1) {
axios
.delete(HTTP_HOST + 'api/receipt/' + item.order_no)
.then(response => {
console.log("del", item);
this.data_table.list.splice(index, 1);
this.data_table.count = this.data_table.list.length
})
.catch(error => console.log(error))
}
}
},
deleteAll() {
if (confirm('是否確定刪除已勾選的資料?')) {
axios
.delete(HTTP_HOST + 'api/receipt/DeleteAll/' + this.data_table.selected.map(x => x.order_no))
.then(response => {
this.getDefault();
})
.catch(error => console.log(error))
}
},
btn_search() {
this.getDefault()
bootstrap.Offcanvas.getInstance(document.getElementById("offcanvasRight")).hide()
},
btn_all() {
this.search.source = "";
this.search.order_no = "";
clearObjProps(this.search);
this.btn_search();
},
},
computed: {
pageCount() {
return Math.ceil(this.data_table.count / this.data_table.pageSize)
},
}
})
</script>
</asp:Content>
+14
View File
@@ -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)
{
}
}
+701
View File
@@ -0,0 +1,701 @@
<template>
<div class="row justify-content-center">
<div class="col-12 col-md-10 col-lg-10">
<div class="card shadow">
<div class="card-header bg-primary text-white text-center">
<h4 class="mb-0">收據基本資料</h4>
</div>
<div class="card-body">
<div class="row">
<div class="mb-3 col-12 col-md-6">
<label for="source" class="form-label">來源 <span class="text-danger">*</span></label>
<select class="form-select" id="source" v-model="formData.source" required :disabled="mode=='view'||mode=='edit'">
<option value="">請選擇</option>
<option v-for="(desc, value) in sources" :key="value" :value="value">
{{desc}}
</option>
</select>
</div>
<div class="mb-3 col-12 col-md-6">
<!--source=1 就要有-->
<label for="order_no" class="form-label">報名單號 <span class="text-danger" v-show="order_no_need">*</span></label>
<div class="input-group mb-3"
@click.prevent="showPickOrder" :disabled="mode=='view'||mode=='edit'">
<input class="form-control search-text" type="text" readonly
id="order_no" runat="server" placeholder="報名單號" v-model="formData.order_no">
<button class="btn btn-outline-secondary" type="button">
<i class="mdi mdi-view-list-outline"></i>
</button>
</div>
</div>
<!--<div class="mb-3 col-12 col-md-6">
<label for="" class="form-label">開立日期 <span class="text-danger">*</span></label>
<v-menu ref="menu"
v-model="menu"
:close-on-content-click="false"
:return-value.sync="formData.receipt_date"
transition="scale-transition"
offset-y
min-width="auto"
:disabled="mode=='view'||mode=='edit'">
<template v-slot:activator="{ on, attrs }">
<v-text-field v-model="formData.receipt_date"
prepend-icon="mdi-calendar"
readonly
v-bind="attrs"
v-on="on"></v-text-field>
</template>
<v-date-picker v-model="formData.receipt_date"
:active-picker.sync="activePicker"
:max="(new Date(Date.now() - (new Date()).getTimezoneOffset() * 60000)).toISOString().substring(0, 10)"
min="1950-01-01">
<v-spacer></v-spacer>
<v-btn text
color="primary"
@click.prevent="menu = false">
Cancel
</v-btn>
<v-btn text
color="primary"
@click.prevent="$refs.menu.save(formData.receipt_date)">
OK
</v-btn>
</v-date-picker>
</v-menu>
</div>-->
<div class="mb-3 col-12 col-md-6">
<label for="receiptStyle" class="form-label">收據格式 <span class="text-danger">*</span></label>
<select class="form-select" id="receiptStyle" v-model="formData.style_num" required
:disabled="mode=='view'||mode=='edit'">
<option value="">請選擇</option>
<option v-for="r in receiptStyles" :key="r.num" :value="r.num">
{{r.name}}
</option>
</select>
</div>
<div class="mb-3 col-12 col-md-6">
<label for="total_amt" class="form-label" >應收總金額</label>
<v-text-field v-model="formData.total_amt" id="total_amt"
:disabled="mode=='view'||mode=='edit'||formData.source=='1'"></v-text-field><!--從報名來的不能改總金額-->
</div>
<div class="mb-3 col-12 col-md-6">
<label for="alreadyAmt" class="form-label">已收總金額</label>
<v-text-field v-model="alreadyAmt" id="alreadyAmt"
:disabled="mode=='view'||mode=='edit'||formData.source=='1'"></v-text-field>
</div>
</div>
</div>
</div>
<div class="card">
<div class="card-title bg-primary text-white">
<h4>收據明細</h4>
</div>
<div class="card-body">
<div class="row" v-show="mode!='view'">
<div class="col-12 col-md-2">
<label for="" class="form-label">抬頭 <span class="text-danger">*</span></label>
<v-text-field v-model="newDetail.title"></v-text-field>
</div>
<div class="col-12 col-md-2">
<label for="" class="form-label">金額 <span class="text-danger">*</span></label>
<v-text-field v-model="newDetail.amt"></v-text-field>
</div>
<div class="col-12 col-md-2">
<label for="" class="form-label">開立日期 <span class="text-danger">*</span></label>
<v-menu ref="menu"
v-model="menu"
:close-on-content-click="false"
:return-value.sync="newDetail.receipt_date"
transition="scale-transition"
offset-y
min-width="auto"
:disabled="mode=='view'">
<template v-slot:activator="{ on, attrs }">
<v-text-field v-model="newDetail.receipt_date"
prepend-icon="mdi-calendar"
readonly
v-bind="attrs"
v-on="on"></v-text-field>
</template>
<v-date-picker v-model="newDetail.receipt_date"
:active-picker.sync="activePicker"
:max="(new Date(Date.now() - (new Date()).getTimezoneOffset() * 60000)).toISOString().substring(0, 10)"
min="1950-01-01">
<v-spacer></v-spacer>
<v-btn text
color="primary"
@click.prevent="menu = false">
Cancel
</v-btn>
<v-btn text
color="primary"
@click.prevent="$refs.menu.save(newDetail.receipt_date)">
OK
</v-btn>
</v-date-picker>
</v-menu>
</div>
<div class="col-12 col-md-6">
<label for="" class="form-label">功德項目</label>
<v-text-field v-model="newDetail.receipt_item"> </v-text-field>
</div>
<!--</div>
<div class="row" v-show="mode!='view'">-->
<div class="col-12 col-md-8">
<label for="" class="form-label">地址</label>
<v-text-field v-model="newDetail.addr" ></v-text-field>
</div>
<div class="col-12 col-md-2">
<label for="" class="form-label">經手人 <span class="text-danger">*</span></label>
<v-text-field v-model="newDetail.caseofficer" ></v-text-field>
</div>
<div class="col-12 col-md-2">
<button class="btn btn-info" @click.prevent="addDetail">新增</button>
</div>
</div>
<div class="row" v-for="d in formDetail">
<div class="row">
<div class="col-12 col-md-2">
<v-text-field v-model="d.title" label="抬頭" :disabled="mode=='view'"></v-text-field>
</div>
<div class="col-12 col-md-2">
<v-text-field v-model="d.amt" label="金額" :disabled="mode=='view'"></v-text-field>
</div>
<div class="col-12 col-md-2">
<!-- <v-text-field v-model="d.receipt_date" label="開立日期" :disabled="mode=='view'"></v-text-field>-->
<v-menu ref="menu"
v-model="menu"
:close-on-content-click="false"
:return-value.sync="d.receipt_date"
transition="scale-transition"
offset-y
min-width="auto"
:disabled="mode=='view'">
<template v-slot:activator="{ on, attrs }">
<v-text-field v-model="d.receipt_date"
prepend-icon="mdi-calendar"
readonly
label="開立日期"
v-bind="attrs"
v-on="on"></v-text-field>
</template>
<v-date-picker v-model="d.receipt_date"
:active-picker.sync="activePicker"
:max="(new Date(Date.now() - (new Date()).getTimezoneOffset() * 60000)).toISOString().substring(0, 10)"
min="1950-01-01">
<v-spacer></v-spacer>
<v-btn text
color="primary"
@click.prevent="menu = false">
Cancel
</v-btn>
<v-btn text
color="primary"
@click.prevent="$refs.menu.save(d.receipt_date)">
OK
</v-btn>
</v-date-picker>
</v-menu>
</div>
<div class="col-12 col-md-6">
<v-text-field v-model="d.receipt_item" label="功德項目" :disabled="mode=='view'"></v-text-field>
</div>
<div class="col-12 col-md-8">
<v-text-field v-model="d.addr" label="地址" :disabled="mode=='view'"></v-text-field>
</div>
<div class="col-12 col-md-2">
<v-text-field v-model="d.caseofficer" label="經手人" :disabled="mode=='view'"></v-text-field>
</div>
<div class="col-12 col-md-2">
<v-text-field v-model="d.receipt_no" label="收據編號" v-show="mode=='view'" :disabled="mode=='view'||mode=='edit'"></v-text-field>
</div>
</div>
</div>
<div class="row">
<div class="col-12 col-md-2">
收據已開立總金額 {{ countReceiptTotal() }}
</div>
</div>
</div>
</div>
<div class="card">
<div class="card-footer">
<button class="btn btn-primary" @click.prevent="saveReceipt" v-show="mode!='view'">存檔</button>
<button class="btn btn-primary" @click.prevent="printReceipt" v-show="mode=='view'">列印</button>
<button class="btn btn-primary" @click.prevent="closeWindow('')">取消</button>
</div>
</div>
</div>
<v-dialog v-model="order_dialog.show" max-width="800px">
<v-card>
<v-card-title class="grey lighten-2">
選擇報名表
<v-spacer></v-spacer>
<v-btn icon @click.prevent="order_dialog.show = false">
<v-icon>mdi-close</v-icon>
</v-btn>
</v-card-title>
<v-card-text class="pt-4">
<v-row>
<v-col cols="12">
<v-text-field v-model="order_dialog.search"
label="依法會名稱搜尋報名表 (按 Enter 搜尋)"
prepend-icon="mdi-magnify"
@keydown.enter.prevent="searchOrders"
clearable></v-text-field>
</v-col>
</v-row>
<v-data-table :headers="order_dialog.headers"
:items="order_dialog.list"
:loading="order_dialog.loading"
item-key="num"
:server-items-length="order_dialog.count"
:page.sync="order_dialog.page"
:items-per-page.sync="order_dialog.pageSize"
:options.sync="options"
class="elevation-1"
@click:row="selectOrder">
<template v-slot:item.actions="{ item }">
<v-btn small color="primary" @click.stop="selectOrder(item)">
選擇
</v-btn>
</template>
</v-data-table>
</v-card-text>
</v-card>
</v-dialog>
<v-snackbar v-model="snackbar.show" :timeout="3000" top color="error">
{{ snackbar.text }}
<template v-slot:action="{ attrs }">
<v-btn dark text v-bind="attrs" @click="snackbar.show = false">關閉</v-btn>
</template>
</v-snackbar>
</div>
</template>
<script>
module.exports = {
name:"receipt_component",
props: {
num: {
type: Number // num
},
order_no: {
type: String,
default:''
},
total_amt: {
type:Number
},
mode: {
type: String,
default:''
}
},
data() {
return {
snackbar: {
show: false,
text: ''
},
options: { multiSort: false },
formData: {
source: '',
order_no: '',
receipt_date: null,
receipt_style: "",
total_amt: 0,
style_num: 0,
num:0
},
alreadyAmt:0,
order_no_need:false,
newDetail: {
num:0,
receipt_no: "",
title: "",
addr: "",
amt: 0,
caseofficer: "",
receipt_date: "",
receipt_item:"",
},
formDetail: [
],
sources: {
'1': '活動/法會',
'2':'其他'
},
orders: [],
receiptStyles:[],
activePicker: null,
date: null,
menu: false,
order_dialog: {
show: false,
search: '',
headers: [
{ text: '活動/法會', value: 'subject' },
{ text: '單號', value: 'order_no' },
{ text: '姓名', value: 'u_name' },
],
loading: false,
items: [],
list: [],
count: 0,
page: 1,
pageSize: 10,
options: { multiSort: false },
}
}
},
watch: {
options: {
handler() {
this.searchOrders()
},
deep: true,
},
formData: {
handler(newVal) {
if (newVal.source === "1") {
this.order_no_need = true;
} else {
this.order_no_need = false;
}
},
deep:true,
},
num: {
handler(newVal) {
//console.log("........", newVal)
this.formData = {
source: '',
order_no: '',
receipt_date: null,
receipt_style: "",
total_amt: 0,
style_num: 0,
num: 0
}
if ((this.mode == "view"||this.mode=="edit")&&newVal!=0) {
this.getReceipt();
}
},
deep: true,
immediate: true
},
order_no: {
handler(newVal) {
console.log(this.mode,this.order_no,this.total_amt)
if (this.mode == "preOrder" && newVal != "") {
this.formData.source = "1"
this.formData.order_no = newVal
this.formData.total_amt = this.total_amt
}
}
}
},
methods: {
showPickOrder() {
this.order_dialog.show = true;
},
selectOrder(item) {
//console.log(item)
this.formData.order_no = item.order_no
this.formData.total_amt = item.amt
this.order_dialog.show=false
},
searchOrders() {
const { sortBy, sortDesc, page, itemsPerPage } = this.options
//page = this.data_table.page;
let self = this;
const params = {
page: page == null ? 1 : page, pageSize: itemsPerPage == null ? 10 : itemsPerPage,
sortBy: sortBy[0], sortDesc: sortDesc[0],
};
this.order_dialog.loading = true
let search = { subject: this.order_dialog.search }
//sessionStorage.setItem('orderpage', clearpage ? '1' : page);
axios
.post(HTTP_HOST + 'api/order/GetList', search, { params: params })
.then(response => {
//console.log(response)
self.order_dialog.list = response.data.list
self.order_dialog.count = response.data.count;
self.order_dialog.loading = false
//sessionStorage.setItem("order_list_cache", dataToStore);
})
.catch(error => console.log(error))
},
getReceiptStyles() {
axios
.post(HTTP_HOST + 'api/receipt/GetAllStyle')
.then(response => {
let data = response.data.list;
this.receiptStyles = data;
});
},
getOrders() {
},
getReceipt() {
let search = { num: this.num }
axios
.post(HTTP_HOST + 'api/receipt/GetData', search)
.then(response => {
let data = response.data.data;
this.formData = {
source: data.source,
order_no: data.order_no,
receipt_date: data.receipt_date,
style_num: data.style_num,
total_amt: data.total_amt,
num: data.num
}
data.orderdetails.forEach(x => {
x.records.forEach(y => {
this.alreadyAmt = Number(this.alreadyAmt) + (isNaN(y.price) ? 0 : Number(y.price))
})
})
this.formDetail=[...data.receipt_detail]
})
.catch(error => console.log(error))
},
addDetail() {
if (this.newDetail.title === "") {
this.showSnack("抬頭必須填寫")
return
}
if (this.newDetail.amt ===0 ) {
this.showSnack("金額不可為0")
return
}
if (this.newDetail.receipt_date === "") {
this.showSnack("開立日期必須填寫")
return
}
if (this.newDetail.caseofficer === "") {
this.showSnack("經手人必須填寫")
return
}
this.formDetail.push({ ...this.newDetail })
this.newDetail = {
receipt_no: "",
title: "",
addr: "",
amt: 0,
caseofficer: "",
num: 0,
receipt_num: 0,
receipt_date: "",
receipt_item:""
}
},
showSnack(message) {
this.snackbar.text = message;
this.snackbar.show = true;
},
saveReceipt() {
if (this.formDetail.length === 0) {
this.showSnack("沒有明細資料");
return false;
}
if (this.formData.source == "") {
this.showSnack("請選擇來源");
return false;
}
if (this.formData.source === "1" && this.formData.order_no== "") {
this.showSnack("請選擇活動/法會");
return false;
}
//if (this.formData.receipt_date == "") {
// this.showSnack("請選擇開立日期");
// return false;
//}
if (this.formData.style_num==0) {
this.showSnack("請選擇收據格式");
return false;
}
if (this.formData.total_amt == 0) {
this.showSnack("總金額不可為0");
return false;
}
let total=0
let detail = []
this.formDetail.forEach(x => {
detail.push({ ...x })
total=total+Number(x.amt)
})
if (total > this.formData.total_amt) {
this.showSnack("收據總金額超過應收總金額!!!");
return false
}
let master = {
...this.formData, list: detail
}
let targetUrl = "SaveReceiptWithDetail";
if (this.mode === "edit")
targetUrl = "UpdateReceiptWithDetail";
axios
.post(HTTP_HOST + `api/receipt/${targetUrl}`, master)
.then(response => {
this.snackbar.text = response.data.message;
this.snackbar.show = true;
if (response.data.result == "Y") {
this.closeWindow('reload');
}
})
.catch(error => console.log(error))
},
closeWindow(param) {
//this.num=0
this.formDetail.length = 0
this.formData = {
source: '',
order_no: '',
receipt_date: null,
receipt_style: "",
total_amt: 0,
style_num: 0,
num: 0
}
this.$emit('close-dialog', param);
},
printReceipt() {
try {
let searchData = {num:this.formData.num}
axios
.post(HTTP_HOST + 'api/receipt/PrintReceipt', searchData, { responseType: 'blob' })
.then(response => {
// 1. Create a dynamic URL object from the binary blob
const blob = new Blob([response.data], {
type: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'
});
const fileUrl = window.URL.createObjectURL(blob);
// 2. Create a temporary 'a' element to trigger download
const link = document.createElement('a');
link.href = fileUrl;
// 3. Set desired file name
link.setAttribute('download', `${searchData.activity_num}_${searchData.mode}.docx`);
// 4. Append, click and cleanup
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
window.URL.revokeObjectURL(fileUrl); // Free up memory allocation
})
} catch (error) {
console.error('Error downloading the file:', error);
//alert('Failed to download file.');
this.showSnack('Failed to download file.');
} finally {
this.loading = false;
}
},
countReceiptTotal() {
let total=0
this.formDetail.forEach(x => {
total=Number(total)+Number(x.amt)
})
return total
}
},
deactivated() {
this.formData = {
source: '',
order_no: '',
receipt_date: null,
receipt_style: "",
total_amt: 0,
style_num: 0,
num: 0
}
this.formDetail.length = 0;
this.alreadyAmt = 0;
console.log("deactivated");
},
activated() {
this.getReceiptStyles();
this.formData = {
source: '',
order_no: '',
receipt_date: null,
receipt_style: "",
total_amt: 0,
style_num: 0,
num: 0
}
this.formDetail.length = 0;
this.alreadyAmt = 0;
},
beforeUnmount() {
console.log("beforeUnmount");
this.formData = {
source: '',
order_no: '',
receipt_date: null,
receipt_style: "",
total_amt: 0,
style_num: 0,
num: 0
}
this.formDetail.length = 0;
this.alreadyAmt = 0;
},
mounted() {
console.log(this.mode, this.order_no, this.total_amt)
this.getReceiptStyles();
if (this.mode !== "preOrder") {
this.formData = {
source: '',
order_no: '',
receipt_date: null,
receipt_style: "",
total_amt: 0,
style_num: 0,
num: 0
}
} else {
this.formData = {
source: '1',
order_no: this.order_no,
receipt_date: null,
receipt_style: "",
total_amt: this.total_amt,
style_num: 0,
num: 0
}
}
this.formDetail.length = 0;
this.alreadyAmt = 0;
},
computed: {
pageCount() {
return Math.ceil(this.order_dialog.count / (this.options.itemsPerPage??10))
},
}
}
</script>
+40 -10
View File
@@ -4,25 +4,46 @@
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="page_nav" Runat="Server">
<div class="mb-2 mb-sm-0 d-flex align-items-center gap-2">
<span>查看疏文</span>
<v-text-field v-model="query.start_date" label="活動起始日" type="date" dense outlined></v-text-field>
<v-text-field v-model="query.end_date" label="活動結束日" type="date" dense outlined></v-text-field>
<button class="btn btn-primary" @click="queryActivity">查詢</button>
<%--<span>查看疏文</span>
<select v-model="currentActivityNum" @change="onActivityChange" class="form-select" style="width: auto;">
<option value="">請選擇要查看的活動</option>
<option v-for="activity in activityList" :value="activity.num" :key="activity.num">
{{activity.subject}}
</option>
</select>
</select>--%>
<h4>
<span v-if="currentActivityNum">{{latest ? '當前疏文是最新版本': '當前疏文不是最新版本'}}</span>
<%--<span v-if="currentActivityNum">{{latest ? '當前疏文是最新版本': '當前疏文不是最新版本'}}</span>--%>
</h4>
</div>
<div class="">
<%-- </div>--%>
<%-- <div class="">
<a class="btn btn-outline-primary btn-print" @click="updateShuWen" v-if="currentActivityNum&&!latest">{{updateShuWenLoading ? '更新中': '更新疏文'}}</a>
<a :href="'<%=ResolveUrl("~/api/shuwen/download")%>?activitynum='+currentActivityNum" class="btn btn-outline-primary btn-print">下載疏文Word檔</a>
</div>
</div>--%>
</div>
</asp:Content>
<asp:Content ID="Content3" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
<div v-if="currentActivityNum">
<!--要同時可以選多個活動,因為會拆成捐贈跟報名 ,還要能設定消災跟超薦的區分-->
<template>
<v-container>
<v-row class="mb-0 mt-4">
<v-col cols="12" md="3">
<v-text-field v-model="query.xStart" label="消災列印編號前置" type="text" dense outlined></v-text-field>
</v-col>
<v-col cols="12" md="3">
<v-text-field v-model="query.sStart" label="超薦列印編號前置" type="text" dense outlined></v-text-field>
</v-col>
</v-row>
</v-container>
</template>
<%--<div v-if="currentActivityNum">
<div><h2 style="text-align:center">消災疏文</h2></div>
<div v-for="(item, index) in ShuWenJson?.xiaozai" :key="Object.keys(item)[0] + 'xz' + index">
<h4>報名信眾:{{ item[Object.keys(item)[0]].user.name }}</h4>
@@ -48,7 +69,7 @@
</ul>
<hr/>
</div>
</div>
</div>--%>
</asp:Content>
<asp:Content ID="Content4" ContentPlaceHolderID="offCanvasRight" Runat="Server">
@@ -65,10 +86,19 @@
ShuWenJson: {},
ShuWenItem: '',
updateShuWenLoading: false,
latest: false
latest: false,
query: {
start_date: '',
end_date: '',
xStart: '',//消災
sSatrt: ''//超薦
},
}
},
methods: {
queryActivity() {//列出區間內的活動/法會
},
initActivity() {
axios.get(HTTP_HOST + 'api/activity')
.then(response => {
@@ -100,7 +130,7 @@
},
getShuWen() {
if (this.currentActivityNum) {
axios.get(HTTP_HOST + 'api/shuwen/getshuwen', {
axios.post(HTTP_HOST + 'api/shuwen/RenderShuWenByGong', {
params: {
activitynum: this.currentActivityNum
}
+2 -2
View File
@@ -75,9 +75,9 @@
<nav class="mb-1">
</nav>
<nav class="mb-1">
<asp:Button ID="edit" runat="server" Text="修改" OnClick="edit_Click" CssClass="btn btn-primary" />
<asp:Button ID="edit" runat="server" Text="儲存" OnClick="edit_Click" CssClass="btn btn-primary" />
<asp:Button ID="add" runat="server" Text="新增" OnClick="add_Click" CssClass="btn btn-primary" />
<asp:Button ID="goback" runat="server" Text="回列表" CausesValidation="false" Visible="false" OnClick="goback_Click" CssClass="btn btn-outline-secondary" />
<asp:Button ID="goback" runat="server" Text="返回" CausesValidation="false" Visible="false" OnClick="goback_Click" CssClass="btn btn-outline-secondary" />
</nav>
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server">
+1 -1
View File
@@ -63,7 +63,7 @@
<ItemStyle CssClass="d-print-none text-end" />
<ItemTemplate>
<a href="group_reg.aspx?num=<%# Eval("g_name") %>&page=<%=GridView1.PageIndex%>"
title="" class="btn btn-outline-secondary btn-sm"><i class="mdi mdi-pencil-box-outline"></i>修改</a>
title="" class="btn btn-outline-secondary btn-sm"><i class="mdi mdi-pencil-box-outline"></i>編輯</a>
<asp:LinkButton ID="DelButton" runat="server" OnClick="DelButton_Click"
OnClientClick="return msgconfirm('是否確定刪除這筆資料?',this);"
CssClass="btn btn-outline-secondary btn-sm"><i class="mdi mdi-trash-can"></i>刪除</asp:LinkButton>
+1 -1
View File
@@ -94,7 +94,7 @@
<ItemStyle CssClass="d-print-none text-end" />
<ItemTemplate>
<a href="reg.aspx?num=<%# Eval("num") %>&page=<%=GridView1.PageIndex%>"
title="" class="btn btn-outline-secondary btn-sm"><i class="mdi mdi-pencil-box-outline"></i>修改</a>
title="" class="btn btn-outline-secondary btn-sm"><i class="mdi mdi-pencil-box-outline"></i>編輯</a>
<asp:LinkButton ID="DelButton" runat="server" OnClick="DelButton_Click"
OnClientClick="return msgconfirm('是否確定刪除這筆資料?',this);"
CssClass="btn btn-outline-secondary btn-sm"><i class="mdi mdi-trash-can"></i>刪除</asp:LinkButton>
+2 -2
View File
@@ -10,9 +10,9 @@
<div class="scroll-nav nav nav-tabs mb-2 mb-sm-0 d-none d-sm-flex">
</div>
<div class="">
<asp:Button ID="edit" runat="server" Text="修改" OnClick="edit_Click" CssClass="btn btn-primary" />
<asp:Button ID="edit" runat="server" Text="儲存" OnClick="edit_Click" CssClass="btn btn-primary" />
<asp:Button ID="add" runat="server" Text="新增" OnClick="add_Click" CssClass="btn btn-primary" />
<asp:Button ID="goback" runat="server" Text="回列表" CausesValidation="false" Visible="false" OnClick="goback_Click" CssClass="btn btn-outline-secondary" />
<asp:Button ID="goback" runat="server" Text="返回" CausesValidation="false" Visible="false" OnClick="goback_Click" CssClass="btn btn-outline-secondary" />
</div>
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server">
+25 -4
View File
@@ -1,25 +1,46 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Antlr" version="3.5.0.2" targetFramework="net48" />
<package id="BouncyCastle.Cryptography" version="2.6.2" targetFramework="net48" />
<package id="DocumentFormat.OpenXml" version="3.5.1" targetFramework="net48" />
<package id="DocumentFormat.OpenXml.Framework" version="3.5.1" targetFramework="net48" />
<package id="EntityFramework" version="6.4.4" targetFramework="net48" />
<package id="EntityFramework.zh-Hant" version="6.2.0" targetFramework="net48" />
<package id="Enums.NET" version="5.0.0" targetFramework="net48" />
<package id="ExtendedNumerics.BigDecimal" version="2025.1001.2.129" targetFramework="net48" />
<package id="MathNet.Numerics.Signed" version="5.0.0" targetFramework="net48" />
<package id="Microsoft.AspNet.Razor" version="3.2.7" targetFramework="net48" />
<package id="Microsoft.AspNet.Web.Optimization" version="1.1.3" targetFramework="net48" />
<package id="Microsoft.AspNet.Web.Optimization.WebForms" version="1.1.3" targetFramework="net48" />
<package id="Microsoft.AspNet.WebApi" version="5.2.7" targetFramework="net48" />
<package id="Microsoft.AspNet.WebApi.Client" version="5.2.7" targetFramework="net48" />
<package id="Microsoft.AspNet.WebApi.Client.zh-Hant" version="5.2.9" targetFramework="net48" />
<package id="Microsoft.AspNet.WebApi.Core" version="5.2.7" targetFramework="net48" />
<package id="Microsoft.AspNet.WebApi.Core.zh-Hant" version="5.2.9" targetFramework="net48" />
<package id="Microsoft.AspNet.WebApi.WebHost" version="5.2.7" targetFramework="net48" />
<package id="Microsoft.AspNet.WebApi.WebHost.zh-Hant" version="5.2.9" targetFramework="net48" />
<package id="Microsoft.AspNet.WebPages" version="3.2.7" targetFramework="net48" />
<package id="Microsoft.Build.Tasks.Git" version="8.0.0" targetFramework="net48" developmentDependency="true" />
<package id="Microsoft.CodeDom.Providers.DotNetCompilerPlatform" version="3.6.0" targetFramework="net48" />
<package id="Microsoft.IO.RecyclableMemoryStream" version="3.0.1" targetFramework="net48" />
<package id="Microsoft.Owin" version="4.2.0" targetFramework="net48" />
<package id="Microsoft.Owin.Security" version="4.2.0" targetFramework="net48" />
<package id="Microsoft.SourceLink.Common" version="8.0.0" targetFramework="net48" developmentDependency="true" />
<package id="Microsoft.SourceLink.GitHub" version="8.0.0" targetFramework="net48" developmentDependency="true" />
<package id="Microsoft.Web.Infrastructure" version="1.0.0.0" targetFramework="net48" />
<package id="Newtonsoft.Json" version="6.0.8" targetFramework="net48" />
<package id="NPOI" version="2.8.0" targetFramework="net48" />
<package id="Owin" version="1.0" targetFramework="net48" />
<package id="PagedList" version="1.17.0.0" targetFramework="net48" />
<package id="SharpZipLib" version="1.4.2" targetFramework="net48" />
<package id="SkiaSharp" version="3.119.2" targetFramework="net48" />
<package id="SkiaSharp.NativeAssets.Linux.NoDependencies" version="3.119.2" targetFramework="net48" />
<package id="SkiaSharp.NativeAssets.macOS" version="3.119.2" targetFramework="net48" />
<package id="SkiaSharp.NativeAssets.Win32" version="3.119.2" targetFramework="net48" />
<package id="System.Buffers" version="4.5.1" targetFramework="net48" />
<package id="System.Memory" version="4.5.5" targetFramework="net48" />
<package id="System.Numerics.Vectors" version="4.5.0" targetFramework="net48" />
<package id="System.Runtime.CompilerServices.Unsafe" version="6.0.0" targetFramework="net48" />
<package id="System.Security.Cryptography.Xml" version="8.0.2" targetFramework="net48" />
<package id="System.Text.Encoding.CodePages" version="8.0.0" targetFramework="net48" />
<package id="System.Threading.Tasks.Extensions" version="4.5.2" targetFramework="net48" />
<package id="vue" version="2.6.11" targetFramework="net48" />
<package id="WebGrease" version="1.6.0" targetFramework="net48" />
<package id="ZString" version="2.6.0" targetFramework="net48" />
</packages>
Binary file not shown.

Some files were not shown because too many files have changed in this diff Show More