Compare commits
56
Commits
824077858d
..
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
be5352efed | ||
|
|
dfb6a8e6a4 | ||
|
|
fa0ab417e1 | ||
|
|
52a10420ae | ||
|
|
22e7c008ef | ||
|
|
666b3e0c16 | ||
|
|
126e46e6ed | ||
|
|
78ac144a32 | ||
|
|
db19f6d1a5 | ||
|
|
b02fc8ec52 | ||
|
|
b7ae0abc20 | ||
|
|
fa1ed1f827 | ||
|
|
a8d3990784 | ||
|
|
71e619dda2 | ||
|
|
24de2c6071 | ||
|
|
7c5e5ab984 | ||
|
|
466ec11c91 | ||
|
|
c03bcfea64 | ||
|
|
b1c05c82cb | ||
|
|
68860331ce | ||
|
|
700f92fcbc | ||
|
|
68206fcab2 | ||
|
|
e60b172b39 | ||
|
|
b30cc47184 | ||
|
|
d6c817475c | ||
|
|
da913d2584 | ||
|
|
12634b942c | ||
|
|
7f1e7dd419 | ||
|
|
4b9448d548 | ||
|
|
cc85cb5bd7 | ||
|
|
ced4eabe71 | ||
|
|
35a0be701b | ||
|
|
d823cedd3c | ||
|
|
5f8c5a8430 | ||
|
|
da58dc92d0 | ||
|
|
07c5027ad8 | ||
|
|
59bb0ff824 | ||
|
|
dee05d6ff9 | ||
|
|
94ce54577e | ||
|
|
681d5293a6 | ||
|
|
fbfa8dd361 | ||
|
|
d71cc605dc | ||
|
|
2686506f9c | ||
|
|
266aeb4426 | ||
|
|
eeed2c8651 | ||
|
|
8d8cf9fed4 | ||
|
|
301d329add | ||
|
|
1d09b445d3 | ||
|
|
31e382070f | ||
|
|
82c9f51bcd | ||
|
|
7db39117b4 | ||
|
|
5fa147f960 | ||
|
|
5f3ac3ec7f | ||
|
|
c249e84240 | ||
|
|
23da5f0dc0 | ||
|
|
dce5d52a70 |
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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; }
|
||||
//}
|
||||
@@ -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
@@ -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")]
|
||||
|
||||
+1297
-14
File diff suppressed because it is too large
Load Diff
@@ -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>
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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; }
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
@@ -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; }
|
||||
|
||||
}
|
||||
}
|
||||
@@ -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; }
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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; }
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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}" });
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
});
|
||||
|
||||
}
|
||||
}
|
||||
@@ -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}");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -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
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -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}");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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,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-->
|
||||
|
||||
@@ -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
|
||||
})
|
||||
|
||||
@@ -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;
|
||||
})
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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();
|
||||
|
||||
}
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
@@ -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>
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
@@ -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; // 關閉彈出視窗
|
||||
// 可選:刷新列表等
|
||||
|
||||
@@ -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;
|
||||
})
|
||||
|
||||
@@ -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) {
|
||||
// 設定當前正在編輯的行
|
||||
|
||||
@@ -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'),
|
||||
},
|
||||
|
||||
@@ -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
@@ -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() {
|
||||
|
||||
@@ -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; });
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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
@@ -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>
|
||||
|
||||
@@ -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;">+</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>
|
||||
@@ -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>
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
@@ -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"
|
||||
|
||||
@@ -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')
|
||||
|
||||
@@ -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 });
|
||||
|
||||
@@ -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)
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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
@@ -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">
|
||||
|
||||
@@ -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") {
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
@@ -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">×</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>
|
||||
@@ -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
@@ -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>
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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' }
|
||||
],
|
||||
|
||||
@@ -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
@@ -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)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
@@ -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 |
@@ -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 |
@@ -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 |
@@ -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" };
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
@@ -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
@@ -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>
|
||||
|
||||
@@ -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
@@ -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 }}
|
||||
|
||||
@@ -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
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
@@ -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>
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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
@@ -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
Reference in New Issue
Block a user