15 Commits

Author SHA1 Message Date
minom 07e29c32aa 調整匯款沖帳 2026-05-11 15:59:23 +08:00
minom 3c5617b403 merge dapper and 0.1 into dapper 2026-04-28 17:09:04 +08:00
minomdu 50c2203ebf Merge remote-tracking branch 'origin/0.1' into dapper
# Conflicts:
#	web/App_Code/Model/Model.Designer.cs
#	web/App_Code/Model/Model.cs
#	web/App_Code/Model/Model.edmx
#	web/web.config
2026-04-28 16:26:19 +08:00
EnChia 7644df57d0 1. 優化報名頁面:彈出查詢頁面、顯示剛新增資料
2. 新增報名頁面加上取消鍵
3. 優化登入頁面:按下 enter 自動換格/送出
4. 修復新增報名頁面中,不同 search_dialog 中的 page 參數相互連動之異常
5. 修改報名頁面列印格式
6. 修復報名頁面匯出功能
7. 優化報到功能
8. 報名頁面中,無查詢資料時不可點選匯出/列印按鈕
9. 匯出/列印報名管理報表時,若無資料則顯示提示
10. 修復列印管理報表後父視窗 UI 不能點擊的問題
11. 新增報名管理表單匯出 excel 功能
12. 於新增信眾、新增活動頁面加上取消鍵
13. 優化報名管理匯出功能:若篩選條件包含特定活動,自動於「匯出條件」欄位標註活動名稱
14. 優化報名查詢匯出功能:匯出之文件中加上「匯出條件」欄位
15. 修復信眾資料頁面中,使用「生日」作為篩選基準時,後續執行「列印查詢資料」與「匯出查詢資料」會報錯
16. 修復「列印信眾查詢」功能中,電話搜尋欄位未正確帶入查詢條件之異常
17. 解決中文輸入法輸入電話號碼的跳字問題
18. 新增品項管理介面排序功能
2026-04-21 09:03:57 +08:00
minom 3273072fb3 排版設定 2026-04-16 17:51:02 +08:00
minom d9e651fe72 左右正名可選可輸入 2026-04-15 17:46:35 +08:00
minom 08b339e0cd 牌位報名與列印 2026-04-14 15:45:42 +08:00
minom a81967ddbd 新增親友功能 2026-04-13 17:44:13 +08:00
minom 1afb90f3ba 新增親友 2026-04-12 20:55:09 +08:00
minom 21a3ec6198 still 牌位版面調整 2026-04-10 17:24:46 +08:00
minom c5fc2469d7 1.報名牌位 2.牌位列印 2026-04-09 17:42:29 +08:00
EnChia aa5941a324 1. 加上返回鍵
2. 修改報名記錄中的活動開始結束時間
3. 修正列印問題
4. 信眾資料及報名管理起始不會出現資料
5. 信眾不得重複報名相同活動
6. 信眾資料的 cache(含結果與搜尋條件)
7. 修復信眾、活動、品項刪除功能
8. 增加自訂是否自動編號
9. 優化信眾資料頁面(彈出查詢頁面、顯示剛新增資料)
10. 新增管理表單匯出 excel 功能
11. 無查詢資料時不可點選匯出/列印按鈕
12. 匯出/列印管理報表時,若無資料則顯示提示
13. 新增信眾資料時,加入日期預設為今日
2026-04-09 17:37:00 +08:00
minom 8fe243356e 牌位設定 2026-04-08 17:54:28 +08:00
minom 83a7c67439 增加一個新的報名牌位編輯功能 2026-04-07 18:04:08 +08:00
minom 36174834a8 牌位排版 2026-04-06 19:06:22 +08:00
45 changed files with 5515 additions and 882 deletions
+1 -1
View File
@@ -1,4 +1,4 @@
// 已啟用模型 'C:\project\17168ERP\web\App_Code\Model\Model.edmx' 的 T4 程式碼產生。 // 已啟用模型 'D:\project\17168ERP\web\App_Code\Model\Model.edmx' 的 T4 程式碼產生。
// 若要啟用舊版程式碼產生,請將 [程式碼產生策略] 設計工具屬性的值 // 若要啟用舊版程式碼產生,請將 [程式碼產生策略] 設計工具屬性的值
//變更為 [舊版 ObjectContext]。當模型在設計工具中開啟時,這個屬性便可 //變更為 [舊版 ObjectContext]。當模型在設計工具中開啟時,這個屬性便可
//以在 [屬性] 視窗中使用。 //以在 [屬性] 視窗中使用。
+1
View File
@@ -187,6 +187,7 @@ namespace Model
public string pageSize { get; set; } public string pageSize { get; set; }
public string printSize { get; set; } public string printSize { get; set; }
public string defaultStyle { get; set; } public string defaultStyle { get; set; }
public Nullable<int> sort_order { get; set; }
public virtual actItem_kind actItem_kind { get; set; } public virtual actItem_kind actItem_kind { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
+22 -9
View File
@@ -94,6 +94,7 @@
<Property Name="pageSize" Type="varchar" MaxLength="50" /> <Property Name="pageSize" Type="varchar" MaxLength="50" />
<Property Name="printSize" Type="varchar" MaxLength="50" /> <Property Name="printSize" Type="varchar" MaxLength="50" />
<Property Name="defaultStyle" Type="varchar" MaxLength="50" /> <Property Name="defaultStyle" Type="varchar" MaxLength="50" />
<Property Name="sort_order" Type="int" />
</EntityType> </EntityType>
<EntityType Name="actItem_files"> <EntityType Name="actItem_files">
<Key> <Key>
@@ -607,8 +608,8 @@
</Key> </Key>
<Property Name="num" Type="int" StoreGeneratedPattern="Identity" Nullable="false" /> <Property Name="num" Type="int" StoreGeneratedPattern="Identity" Nullable="false" />
<Property Name="kind" Type="nvarchar" MaxLength="100" /> <Property Name="kind" Type="nvarchar" MaxLength="100" />
<Property Name="starttime" Type="time" Precision="0" /> <Property Name="starttime" Type="time" Precision="7" />
<Property Name="offtime" Type="time" Precision="0" /> <Property Name="offtime" Type="time" Precision="7" />
<Property Name="resttime" Type="int" /> <Property Name="resttime" Type="int" />
<Property Name="root" Type="int" /> <Property Name="root" Type="int" />
<Property Name="range" Type="int" /> <Property Name="range" Type="int" />
@@ -1083,7 +1084,9 @@
</ReferentialConstraint> </ReferentialConstraint>
</Association> </Association>
<Association Name="FK_act_bom_actItem1"> <Association Name="FK_act_bom_actItem1">
<End Role="actItem" Type="Self.actItem" Multiplicity="0..1" /> <End Role="actItem" Type="Self.actItem" Multiplicity="0..1">
<OnDelete Action="Cascade" />
</End>
<End Role="act_bom" Type="Self.act_bom" Multiplicity="*" /> <End Role="act_bom" Type="Self.act_bom" Multiplicity="*" />
<ReferentialConstraint> <ReferentialConstraint>
<Principal Role="actItem"> <Principal Role="actItem">
@@ -1203,7 +1206,9 @@
</ReferentialConstraint> </ReferentialConstraint>
</Association> </Association>
<Association Name="FK_activity_relating_activity"> <Association Name="FK_activity_relating_activity">
<End Role="activity" Type="Self.activity" Multiplicity="1" /> <End Role="activity" Type="Self.activity" Multiplicity="1">
<OnDelete Action="Cascade" />
</End>
<End Role="activity_relating" Type="Self.activity_relating" Multiplicity="*" /> <End Role="activity_relating" Type="Self.activity_relating" Multiplicity="*" />
<ReferentialConstraint> <ReferentialConstraint>
<Principal Role="activity"> <Principal Role="activity">
@@ -1629,7 +1634,9 @@
</ReferentialConstraint> </ReferentialConstraint>
</Association> </Association>
<Association Name="FK_pro_order_activity"> <Association Name="FK_pro_order_activity">
<End Role="activity" Type="Self.activity" Multiplicity="0..1" /> <End Role="activity" Type="Self.activity" Multiplicity="0..1">
<OnDelete Action="Cascade" />
</End>
<End Role="pro_order" Type="Self.pro_order" Multiplicity="*" /> <End Role="pro_order" Type="Self.pro_order" Multiplicity="*" />
<ReferentialConstraint> <ReferentialConstraint>
<Principal Role="activity"> <Principal Role="activity">
@@ -1679,7 +1686,9 @@
</ReferentialConstraint> </ReferentialConstraint>
</Association> </Association>
<Association Name="FK_pro_order_detail_pro_order"> <Association Name="FK_pro_order_detail_pro_order">
<End Role="pro_order" Type="Self.pro_order" Multiplicity="1" /> <End Role="pro_order" Type="Self.pro_order" Multiplicity="1">
<OnDelete Action="Cascade" />
</End>
<End Role="pro_order_detail" Type="Self.pro_order_detail" Multiplicity="*" /> <End Role="pro_order_detail" Type="Self.pro_order_detail" Multiplicity="*" />
<ReferentialConstraint> <ReferentialConstraint>
<Principal Role="pro_order"> <Principal Role="pro_order">
@@ -1691,7 +1700,9 @@
</ReferentialConstraint> </ReferentialConstraint>
</Association> </Association>
<Association Name="FK_pro_order_followers"> <Association Name="FK_pro_order_followers">
<End Role="followers" Type="Self.followers" Multiplicity="0..1" /> <End Role="followers" Type="Self.followers" Multiplicity="0..1">
<OnDelete Action="Cascade" />
</End>
<End Role="pro_order" Type="Self.pro_order" Multiplicity="*" /> <End Role="pro_order" Type="Self.pro_order" Multiplicity="*" />
<ReferentialConstraint> <ReferentialConstraint>
<Principal Role="followers"> <Principal Role="followers">
@@ -2604,6 +2615,7 @@
<Property Name="pageSize" Type="String" MaxLength="50" FixedLength="false" Unicode="false" /> <Property Name="pageSize" Type="String" MaxLength="50" FixedLength="false" Unicode="false" />
<Property Name="printSize" Type="String" MaxLength="50" FixedLength="false" Unicode="false" /> <Property Name="printSize" Type="String" MaxLength="50" FixedLength="false" Unicode="false" />
<Property Name="defaultStyle" Type="String" MaxLength="50" FixedLength="false" Unicode="false" /> <Property Name="defaultStyle" Type="String" MaxLength="50" FixedLength="false" Unicode="false" />
<Property Name="sort_order" Type="Int32" ConcurrencyMode="None" />
</EntityType> </EntityType>
<EntityType Name="actItem_files"> <EntityType Name="actItem_files">
<Key> <Key>
@@ -3053,8 +3065,8 @@
</Key> </Key>
<Property Name="num" Type="Int32" Nullable="false" annotation:StoreGeneratedPattern="Identity" /> <Property Name="num" Type="Int32" Nullable="false" annotation:StoreGeneratedPattern="Identity" />
<Property Name="kind" Type="String" MaxLength="100" FixedLength="false" Unicode="true" /> <Property Name="kind" Type="String" MaxLength="100" FixedLength="false" Unicode="true" />
<Property Name="starttime" Type="Time" Precision="0" /> <Property Name="starttime" Type="Time" Precision="7" />
<Property Name="offtime" Type="Time" Precision="0" /> <Property Name="offtime" Type="Time" Precision="7" />
<Property Name="resttime" Type="Int32" /> <Property Name="resttime" Type="Int32" />
<Property Name="root" Type="Int32" /> <Property Name="root" Type="Int32" />
<Property Name="range" Type="Int32" /> <Property Name="range" Type="Int32" />
@@ -5326,6 +5338,7 @@
<EntitySetMapping Name="actItems"> <EntitySetMapping Name="actItems">
<EntityTypeMapping TypeName="Model.actItem"> <EntityTypeMapping TypeName="Model.actItem">
<MappingFragment StoreEntitySet="actItem"> <MappingFragment StoreEntitySet="actItem">
<ScalarProperty Name="sort_order" ColumnName="sort_order" />
<ScalarProperty Name="defaultStyle" ColumnName="defaultStyle" /> <ScalarProperty Name="defaultStyle" ColumnName="defaultStyle" />
<ScalarProperty Name="printSize" ColumnName="printSize" /> <ScalarProperty Name="printSize" ColumnName="printSize" />
<ScalarProperty Name="pageSize" ColumnName="pageSize" /> <ScalarProperty Name="pageSize" ColumnName="pageSize" />
+1 -1
View File
@@ -9,7 +9,7 @@
<EntityTypeShape EntityType="Model.accounting_files" Width="1.5" PointX="15.75" PointY="27.75" IsExpanded="true" /> <EntityTypeShape EntityType="Model.accounting_files" Width="1.5" PointX="15.75" PointY="27.75" IsExpanded="true" />
<EntityTypeShape EntityType="Model.accounting_kind" Width="1.5" PointX="11.25" PointY="27.625" IsExpanded="true" /> <EntityTypeShape EntityType="Model.accounting_kind" Width="1.5" PointX="11.25" PointY="27.625" IsExpanded="true" />
<EntityTypeShape EntityType="Model.accounting_kind2" Width="1.5" PointX="13.5" PointY="11.25" IsExpanded="true" /> <EntityTypeShape EntityType="Model.accounting_kind2" Width="1.5" PointX="13.5" PointY="11.25" IsExpanded="true" />
<EntityTypeShape EntityType="Model.actItem" Width="1.5" PointX="9.25" PointY="7.875" IsExpanded="true" /> <EntityTypeShape EntityType="Model.actItem" Width="1.5" PointX="8.375" PointY="27.25" IsExpanded="true" />
<EntityTypeShape EntityType="Model.actItem_files" Width="1.5" PointX="16.5" PointY="5.875" IsExpanded="true" /> <EntityTypeShape EntityType="Model.actItem_files" Width="1.5" PointX="16.5" PointY="5.875" IsExpanded="true" />
<EntityTypeShape EntityType="Model.actItem_kind" Width="1.5" PointX="6.125" PointY="7.875" IsExpanded="true" /> <EntityTypeShape EntityType="Model.actItem_kind" Width="1.5" PointX="6.125" PointY="7.875" IsExpanded="true" />
<EntityTypeShape EntityType="Model.activity" Width="1.5" PointX="3" PointY="8.875" IsExpanded="true" /> <EntityTypeShape EntityType="Model.activity" Width="1.5" PointX="3" PointY="8.875" IsExpanded="true" />
+1 -1
View File
@@ -28,7 +28,7 @@ namespace MyWeb
public AdmItem info { get; set; } public AdmItem info { get; set; }
//定義欄位cookie==================start //定義欄位cookie==================start
public class AdmItem public class AdmItem
{ {
public int num { get; set; } public int num { get; set; }
public string u_id { get; set; } public string u_id { get; set; }
+16 -11
View File
@@ -103,17 +103,18 @@ public class FollowerController : ApiController
{ {
foreach (var item in prod) foreach (var item in prod)
{ {
foreach (var item2 in item.pro_order_detail1) //foreach (var item2 in item.pro_order_detail1)
item2.from_id = null; //清空訂單明細的陽上報恩者from_id //f_num設定串聯刪除 // item2.from_id = null; //清空訂單明細的陽上報恩者from_id //f_num設定串聯刪除
foreach (var item2 in item.pro_order) //foreach (var item2 in item.pro_order)
item2.introducer = null; // item2.introducer = null;
item.leader = null;//清空leader //item.leader = null;//清空leader
_db.followers.RemoveRange(prod);
} }
_db.followers.RemoveRange(prod); //_db.followers.RemoveRange(prod);
_db.SaveChanges(); _db.SaveChanges();
Model.admin_log admin_log = new Model.admin_log(); Model.admin_log admin_log = new Model.admin_log();
@@ -150,8 +151,10 @@ public class FollowerController : ApiController
qry = qry.Where(o => o.u_name.Contains(q.u_name.Trim())); qry = qry.Where(o => o.u_name.Contains(q.u_name.Trim()));
if (q.birthday.HasValue) if (q.birthday.HasValue)
qry = qry.Where(o => o.birthday >= q.birthday.Value); qry = qry.Where(o => o.birthday >= q.birthday.Value);
if (q.birthday2.HasValue) if (q.birthday2.HasValue) {
qry = qry.Where(o => o.birthday < Convert.ToDateTime(q.birthday2.Value).AddDays(1)); var tmpBirthday2 = Convert.ToDateTime(q.birthday2.Value).AddDays(1);
qry = qry.Where(o => o.birthday < tmpBirthday2);
}
if (!string.IsNullOrEmpty(q.address)) if (!string.IsNullOrEmpty(q.address))
qry = qry.Where(o => o.address !=null && o.address.Contains(q.address.Trim())); qry = qry.Where(o => o.address !=null && o.address.Contains(q.address.Trim()));
//if (q.num.HasValue && q.num.Value>0) //if (q.num.HasValue && q.num.Value>0)
@@ -173,7 +176,7 @@ public class FollowerController : ApiController
} }
} }
// 電話/證號搜尋 (使用 search_keywords HEX 編碼) // 電話/證號搜尋 (使用 search_keywords HEX 編碼)
if (!string.IsNullOrEmpty(q.phone_idcode) && GlobalVariables.UseSearchKeywords) if (!string.IsNullOrEmpty(q.phone_idcode) && GlobalVariables.UseSearchKeywords)
{ {
@@ -655,8 +658,10 @@ public class FollowerController : ApiController
list = orderrecord.Select(x => new list = orderrecord.Select(x => new
{ {
orderno = x.order_no, orderno = x.order_no,
startdate = x.reg_time, //startdate = x.reg_time,
endtime = x.up_time, //endtime = x.up_time,
startdate = x.activity.startDate_solar,
enddate = x.activity.endDate_solar,
pwcount = x.pro_order_detail.Where(a => a.actItem.act_bom.Where(b => b.item_num == a.actItem_num && b.package_num == null).Count() == 0).Count(), pwcount = x.pro_order_detail.Where(a => a.actItem.act_bom.Where(b => b.item_num == a.actItem_num && b.package_num == null).Count() == 0).Count(),
amount = x.pro_order_detail.Select(o => (float?)o.price).Sum(), amount = x.pro_order_detail.Select(o => (float?)o.price).Sum(),
activityname = x.activity.subject, activityname = x.activity.subject,
+65 -13
View File
@@ -1,14 +1,18 @@
using System; using DocumentFormat.OpenXml.Drawing.Spreadsheet;
using Model;
using Newtonsoft.Json;
using Org.BouncyCastle.Crypto;
using PagedList;
using System;
using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using System.Data.Entity;
using System.Linq; using System.Linq;
using System.Net; using System.Net;
using System.Net.Http; using System.Net.Http;
using System.Web.Http; using System.Web.Http;
using PagedList; using System.Web.Services;
using Newtonsoft.Json;
using System.Collections;
using static TreeView; using static TreeView;
using System.Data.Entity;
// api/activity // api/activity
//[ezAuthorize(Roles = "admin")]//群組:* //[ezAuthorize(Roles = "admin")]//群組:*
@@ -126,6 +130,12 @@ public class activityController : ApiController
if (prod != null) if (prod != null)
{ {
////prod.IsDel = true; ////不確定是否新增欄位? 先註解 ////prod.IsDel = true; ////不確定是否新增欄位? 先註解
// 先刪除子項目
var prod2 = _db.act_bom.Where(q => q.package_num == prod.num).ToList();
_db.act_bom.RemoveRange(prod2);
_db.actItems.Remove(prod);
_db.SaveChanges(); _db.SaveChanges();
Model.admin_log admin_log = new Model.admin_log(); Model.admin_log admin_log = new Model.admin_log();
MyWeb.admin admin = new MyWeb.admin();//api裡不可以用MyWeb MyWeb.admin admin = new MyWeb.admin();//api裡不可以用MyWeb
@@ -190,12 +200,18 @@ public class activityController : ApiController
if (prod.Count() > 0) if (prod.Count() > 0)
{ {
//var prod2 = _db.actItem_files.AsEnumerable().Where(q => ids.Contains(Convert.ToInt32(q.actItem_num))).ToList(); //var prod2 = _db.actItem_files.AsEnumerable().Where(q => ids.Contains(Convert.ToInt32(q.actItem_num))).ToList();
var prod2 = _db.actItem_files.Where(q => ids.Contains(q.actItem_num)).ToList(); //var prod2 = _db.actItem_files.Where(q => ids.Contains(q.actItem_num)).ToList();
if (prod2.Count > 0) //if (prod2.Count > 0)
{ //{
_db.actItem_files.RemoveRange(prod2); // _db.actItem_files.RemoveRange(prod2);
//_db.SaveChanges(); // //_db.SaveChanges();
} //}
// 先刪除子項目
var parentBoms = _db.act_bom.Where(q => q.item_num.HasValue && ids.Contains(q.item_num.Value)).ToList();
var parentIds = parentBoms.Select(x => x.num).ToList(); // 取得母件 id
var childBoms = _db.act_bom.Where(q => q.package_num.HasValue && parentIds.Contains(q.package_num.Value)).ToList();
_db.act_bom.RemoveRange(childBoms);
_db.actItems.RemoveRange(prod); _db.actItems.RemoveRange(prod);
_db.SaveChanges(); _db.SaveChanges();
@@ -314,6 +330,36 @@ public class activityController : ApiController
return Ok(ret); return Ok(ret);
} }
public class SortOrderRequest
{
public List<int> ids { get; set; }
}
[HttpPost]
[Route("api/activity/SaveItemList")]
public IHttpActionResult UpdateSortOrder([FromBody] SortOrderRequest request)
{
if (request == null || request.ids == null) return BadRequest();
using (Model.ezEntities _db = new Model.ezEntities())
{
int totalCount = request.ids.Count;
for (int i = 0; i < totalCount; i++)
{
int id = request.ids[i];
var item = _db.actItems.FirstOrDefault(x => x.num == id);
if (item != null)
{
// 改成總數減去索引,這樣第一筆 (i=0) 會拿到最大的數字
item.sort_order = totalCount - i;
}
}
_db.SaveChanges();
}
return Ok();
}
[HttpPost] [HttpPost]
[Route("api/activity/GetItemList")] [Route("api/activity/GetItemList")]
public IHttpActionResult GetItemList([FromBody] Model.ViewModel.actItem q, int page, int pageSize = 10, public IHttpActionResult GetItemList([FromBody] Model.ViewModel.actItem q, int page, int pageSize = 10,
@@ -418,8 +464,14 @@ public class activityController : ApiController
else else
qry = qry.OrderBy(o => o.status); qry = qry.OrderBy(o => o.status);
} }
else else if (sortBy.Equals("num"))
{
qry = qry.OrderByDescending(o => o.num); qry = qry.OrderByDescending(o => o.num);
}
else
{
qry = qry.OrderByDescending(o => o.sort_order);
}
var tdesc = publicFun.enum_desc<Model.activity.category>(); var tdesc = publicFun.enum_desc<Model.activity.category>();
var count = qry.Count(); //pageSize = count;//一次取回?? var count = qry.Count(); //pageSize = count;//一次取回??
@@ -1303,7 +1355,7 @@ public class activityController : ApiController
[Route("api/activity/OrderCheckIn")] [Route("api/activity/OrderCheckIn")]
public IHttpActionResult OrderCheckIn([FromBody] Model.activity_check item) public IHttpActionResult OrderCheckIn([FromBody] Model.activity_check item)
{ {
if (item.f_num.HasValue && item.activity_num.HasValue && item.qty.HasValue && item.status.HasValue) if (item.f_num.HasValue && item.activity_num.HasValue && item.status.HasValue)
{ {
//同一天不能簽到兩次以上 //同一天不能簽到兩次以上
Model.activity_check check = _db.activity_check Model.activity_check check = _db.activity_check
+22
View File
@@ -76,6 +76,28 @@ public class designerController : ApiController
//return Ok(data); //return Ok(data);
} }
[HttpPost]
[Route("api/tablet/saveFamily")]
public IHttpActionResult saveFamily([FromBody] family_members familyMember)
{
LogUtility log = new LogUtility();
_db.family_members.Add(familyMember);
_db.SaveChanges();
return Ok(new { result = "Y", data= familyMember });
//object[] obj = new StyleDataAccess().GetStyle("", "");
//if (obj[0].ToString() == "Y")
//{
// return Ok(new { result = "Y", data = obj[2] });
//}
//else
//{
// return Ok(new { result = "N", message = obj[1] });
// //throw new HttpResponseException(HttpStatusCode.NotFound);
//}
//return Ok(data);
}
[HttpPost] [HttpPost]
[Route("api/tablet/GetStyleData")] [Route("api/tablet/GetStyleData")]
public IHttpActionResult GetStyleData([FromBody] dynamic data) public IHttpActionResult GetStyleData([FromBody] dynamic data)
+24 -11
View File
@@ -1,17 +1,19 @@
using System; using DocumentFormat.OpenXml.Drawing.Charts;
using Model;
using MyWeb;
using Newtonsoft.Json;
using PagedList;
using System;
using System.Activities.Expressions;
using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics;
using System.IdentityModel.Metadata;
using System.Linq; using System.Linq;
using System.Net; using System.Net;
using System.Net.Http; using System.Net.Http;
using System.Web.Http; using System.Web.Http;
using PagedList;
using Newtonsoft.Json;
using System.Collections;
using static TreeView; using static TreeView;
using Model;
using System.IdentityModel.Metadata;
using MyWeb;
using DocumentFormat.OpenXml.Drawing.Charts;
// api/order // api/order
@@ -206,7 +208,7 @@ public class orderController : ApiController
string sortBy = "", bool sortDesc = false) string sortBy = "", bool sortDesc = false)
{ {
var qry = _db.pro_order.AsQueryable(); var qry = _db.pro_order.Include("activity").Include("activity.activity_check").AsQueryable();
//var aIDt = _db.actItems.AsEnumerable().Where(f => f.subject.Contains(q.actItemTxt.Trim())).Select(f => f.num);//品項 //var aIDt = _db.actItems.AsEnumerable().Where(f => f.subject.Contains(q.actItemTxt.Trim())).Select(f => f.num);//品項
@@ -221,7 +223,10 @@ public class orderController : ApiController
if (q.up_time1.HasValue) if (q.up_time1.HasValue)
qry = qry.Where(o => o.up_time >= q.up_time1.Value); qry = qry.Where(o => o.up_time >= q.up_time1.Value);
if (q.up_time2.HasValue) if (q.up_time2.HasValue)
qry = qry.Where(o => o.up_time < Convert.ToDateTime(q.up_time2.Value).AddDays(1)); {
var tmp_up_time2 = Convert.ToDateTime(q.up_time2.Value).AddDays(1);
qry = qry.Where(o => o.up_time < tmp_up_time2);
}
if (!string.IsNullOrEmpty(q.address)) if (!string.IsNullOrEmpty(q.address))
qry = qry.Where(o => o.address.Contains(q.address.Trim())); qry = qry.Where(o => o.address.Contains(q.address.Trim()));
if (!string.IsNullOrEmpty(q.subject)) if (!string.IsNullOrEmpty(q.subject))
@@ -291,6 +296,13 @@ public class orderController : ApiController
else else
qry = qry.OrderBy(o => o.activity != null ? o.activity.subject : ""); qry = qry.OrderBy(o => o.activity != null ? o.activity.subject : "");
} }
else if(sortBy.Equals("status"))
{
if (sortDesc)
qry = qry.OrderByDescending(o => o.activity.activity_check.FirstOrDefault(a => o.activity_num == a.activity_num && o.f_num == a.f_num).status ?? 0);
else
qry = qry.OrderBy(o => o.activity.activity_check.FirstOrDefault(a => o.activity_num == a.activity_num && o.f_num == a.f_num).status ?? 0);
}
else else
qry = qry.OrderByDescending(o => o.reg_time); qry = qry.OrderByDescending(o => o.reg_time);
@@ -307,6 +319,7 @@ public class orderController : ApiController
keyin1 = x.keyin1, keyin1 = x.keyin1,
up_time = x.up_time, up_time = x.up_time,
keyin1_txt = Model.pro_order.keyin1_value_to_text(x.keyin1), 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,
}), }),
count = count count = count
}; };
@@ -684,7 +697,7 @@ public class orderController : ApiController
.Where(q => q.num == item.num) .Where(q => q.num == item.num)
.FirstOrDefault();//修改 .FirstOrDefault();//修改
if (order != null) if (order != null)
{ {
order.actItem_num = (item.actItem_num.HasValue && item.actItem_num.Value > 0) order.actItem_num = (item.actItem_num.HasValue && item.actItem_num.Value > 0)
? item.actItem_num : null; ? item.actItem_num : null;
order.f_num = (item.f_num.HasValue && item.f_num.Value > 0) order.f_num = (item.f_num.HasValue && item.f_num.Value > 0)
@@ -10,6 +10,7 @@ using System.Collections;
using MyWeb; using MyWeb;
using System.Web.WebPages; using System.Web.WebPages;
using System.Data.Entity; using System.Data.Entity;
using Model;
[ezAuthorize] [ezAuthorize]
public class transfer_registerController : ApiController public class transfer_registerController : ApiController
@@ -269,6 +270,7 @@ public class transfer_registerController : ApiController
public string check_memo { get; set; } public string check_memo { get; set; }
public string draft { get; set; } public string draft { get; set; }
public int? acc_kind { get; set; } // 新增關聯欄位 public int? acc_kind { get; set; } // 新增關聯欄位
public int? kind { get; set; }
} }
[HttpPost] [HttpPost]
@@ -315,7 +317,7 @@ public class transfer_registerController : ApiController
{ {
uptime = dto.check_date, uptime = dto.check_date,
category = 1, // 收入 category = 1, // 收入
kind = 27, // 固定值:法會收入/功德項目 kind = dto.kind,//27, // 固定值:法會收入/功德項目
kind2 = dto.acc_num, kind2 = dto.acc_num,
price = (float)(dto.check_amount ?? 0), price = (float)(dto.check_amount ?? 0),
tax = 0, tax = 0,
@@ -346,6 +348,7 @@ public class transfer_registerController : ApiController
item.check_memo = dto.check_memo; item.check_memo = dto.check_memo;
item.draft = dto.draft; item.draft = dto.draft;
item.acc_kind = dto.acc_kind; item.acc_kind = dto.acc_kind;
} }
} }
_db.SaveChanges(); _db.SaveChanges();
@@ -958,7 +961,10 @@ public class transfer_registerController : ApiController
activity_name = x.activity != null ? x.activity.subject : "", activity_name = x.activity != null ? x.activity.subject : "",
activity_num = x.activity_num, activity_num = x.activity_num,
acc_name = x.acc_num != null ? _db.accounting_kind2.Where(a => a.num == x.acc_num).Select(a => a.kind).FirstOrDefault() : "", acc_name = x.acc_num != null ? _db.accounting_kind2.Where(a => a.num == x.acc_num).Select(a => a.kind).FirstOrDefault() : "",
price_totals=_db.pro_order_detail.
Where(a => _db.pro_order.Where (po=>po.f_num==x.f_num&&po.activity_num==x.activity_num).
Select(po => po.order_no).Any(p=>p.Equals(a.order_no))).Sum(a => a.price*a.qty),
pay_totals=_db.transfer_register.Where(a=>a.activity_num==x.activity_num&&a.f_num==x.f_num).Sum(a=>a.check_amount),
// pro_order_record 資訊 (透過 transfer_id 關聯) // pro_order_record 資訊 (透過 transfer_id 關聯)
pro_order_records = x.pro_order_record.Select(pr => new { pro_order_records = x.pro_order_record.Select(pr => new {
pr.num, pr.num,
@@ -8,7 +8,7 @@
<LastUsedPlatform>Any CPU</LastUsedPlatform> <LastUsedPlatform>Any CPU</LastUsedPlatform>
<LaunchSiteAfterPublish>true</LaunchSiteAfterPublish> <LaunchSiteAfterPublish>true</LaunchSiteAfterPublish>
<PublishProvider>FileSystem</PublishProvider> <PublishProvider>FileSystem</PublishProvider>
<PublishUrl>D:\17168web</PublishUrl> <PublishUrl>C:\17168web</PublishUrl>
<WebPublishMethod>FileSystem</WebPublishMethod> <WebPublishMethod>FileSystem</WebPublishMethod>
<_TargetId>Folder</_TargetId> <_TargetId>Folder</_TargetId>
<SiteUrlToLaunchAfterPublish /> <SiteUrlToLaunchAfterPublish />
@@ -16,6 +16,8 @@
<asp:Repeater ID="Repeater2" runat="server" OnItemDataBound="Repeater2_ItemDataBound"> <asp:Repeater ID="Repeater2" runat="server" OnItemDataBound="Repeater2_ItemDataBound">
<ItemTemplate> <ItemTemplate>
<a class="nav-link" href="<%#ResolveUrl(ValString(Eval("url"))) %>" <a class="nav-link" href="<%#ResolveUrl(ValString(Eval("url"))) %>"
onclick="sessionStorage.removeItem('member_list_cache'); sessionStorage.removeItem('member_query_params');
sessionStorage.removeItem('order_list_cache'); sessionStorage.removeItem('order_query_params');"
target="<%#(ValString(Eval("target"))=="B"?"_blank":"_self") %>"> target="<%#(ValString(Eval("target"))=="B"?"_blank":"_self") %>">
<%#Eval("title") %></a> <%#Eval("title") %></a>
</ItemTemplate> </ItemTemplate>
+216 -115
View File
@@ -7,19 +7,20 @@
<div class="mb-2 mb-sm-0"> <div class="mb-2 mb-sm-0">
<ul class="nav ps-0"> <ul class="nav ps-0">
<li class="nav-item pe-3"> <li class="nav-item pe-3">
<select class="form-select" v-model="search.kind" @change="btn_search"> <select class="form-select" v-model="search.kind" @change="btn_search" :disabled="isEditing">
<option value="">選擇分類</option> <option value="">選擇分類</option>
<option v-for="item in itemKindList" :value="item.num">{{item.kind}}</option> <option v-for="item in itemKindList" :value="item.num">{{item.kind}}</option>
</select> </select>
</li> </li>
<li class="nav-item pe-1"> <li class="nav-item pe-1">
<a href="item_reg.aspx" class="btn btn-primary"> <a href="item_reg.aspx" class="btn btn-primary" :class="{ 'disabled': isEditing }" >
<i class="mdi mdi-plus"></i>新增 <i class="mdi mdi-plus"></i>新增
</a> </a>
</li> </li>
<li class="nav-item pe-1">
<a @click="deleteAll" class="btn btn-outline-danger" title="刪除勾選的資料" ><i class="mdi mdi-trash-can"></i> 刪除勾選</a> <li class="nav-item pe-1">
</li> <a @click="deleteAll" class="btn btn-outline-danger" title="刪除勾選的資料" :class="{ 'disabled': isEditing }" ><i class="mdi mdi-trash-can"></i> 刪除勾選</a>
</li>
</ul> </ul>
<%-- <div class="input-group mb-3" data-search-control="search1" @click="search_show(search_dialog.controls.search1)"> <%-- <div class="input-group mb-3" data-search-control="search1" @click="search_show(search_dialog.controls.search1)">
<input class="form-control search-text" type="text" readonly <input class="form-control search-text" type="text" readonly
@@ -29,26 +30,31 @@
<i class="mdi mdi-view-list-outline"></i> <i class="mdi mdi-view-list-outline"></i>
</button> </button>
</div>--%> </div>--%>
</div> </div>
<div>
<div class="">
<asp:LinkButton ID="excel" runat="server" CssClass="btn btn-outline-success" OnClick="excel_Click"><span class="fa-solid fa-file-excel"></span> 匯出Excel</asp:LinkButton> <a v-if="!isEditing" @click="editClick" class="btn btn-outline-secondary" title="編輯排列順序"><i class="mdi mdi-swap-vertical"></i> 編輯排列順序</a>
<a v-else @click="editClick" class="btn btn-outline-secondary" title="完成編輯排列順序"><i class="mdi mdi-swap-vertical"></i> 完成編輯</a>
<div :style="isEditing ? 'pointer-events: none; opacity: 0.5;' : ''" style="display:inline-block;">
<asp:LinkButton ID="excel" runat="server" CssClass="btn btn-outline-success" OnClick="excel_Click" ><span class="fa-solid fa-file-excel"></span> 匯出Excel</asp:LinkButton>
</div> </div> </div>
</asp:Content> </asp:Content>
<asp:Content ID="Content5" ContentPlaceHolderID="footer_script" runat="Server"> <asp:Content ID="Content5" ContentPlaceHolderID="footer_script" runat="Server">
<script src="https://cdn.jsdelivr.net/npm/sortablejs@1.14.0/Sortable.min.js"></script>
<script> <script>
Vue.filter('timeString', function (value, myFormat) { Vue.filter('timeString', function (value, myFormat) {
return value == null || value == "" ? "" : moment(value).format(myFormat || 'YYYY-MM-DD, HH:mm:ss'); return value == null || value == "" ? "" : moment(value).format(myFormat || 'YYYY-MM-DD, HH:mm:ss');
}); });
let VueApp=new Vue({ let VueApp = new Vue({
el: '#app', el: '#app',
vuetify: new Vuetify(vuetify_options), vuetify: new Vuetify(vuetify_options),
data() { data() {
return { return {
isEditing: false,
options: { multiSort: false }, options: { multiSort: false },
data_table: { data_table: {
loading: true, loading: true,
@@ -63,20 +69,20 @@
{ text: '項目分類', value: 'kindsTxt' }, { text: '項目分類', value: 'kindsTxt' },
{ text: '類別', value: 'categoryTxt' }, { text: '類別', value: 'categoryTxt' },
{ text: '預設金額', value: 'price' }, { text: '預設金額', value: 'price' },
{ text: '庫存狀態', value: 'stock' }, { text: '庫存狀態', value: 'stock' },
{ text: '停用', value: 'status' }, { text: '停用', value: 'status' },
{ text: '', value: 'slot_btn', sortable: false, align: 'end' }, { text: '', value: 'slot_btn', sortable: false, align: 'end' },
], ],
footer:{ footer: {
showFirstLastPage: true, showFirstLastPage: true,
itemsPerPageOptions:[5,10,20,30], itemsPerPageOptions: [5, 10, 20, 30],
}, },
}, },
search: { search: {
kind: '', kind: '',
subject: '', subject: '',
selltime1:'', selltime1: '',
selltime2: '', selltime2: '',
uptime1: '', uptime1: '',
uptime2: '', uptime2: '',
@@ -98,7 +104,7 @@
{ id: 'kind', title: '品項分類', value: '' }, { id: 'kind', title: '品項分類', value: '' },
], ],
selected: {}, selected: {},
select(t,data) { select(t, data) {
data.search.kind = t.num; data.search.kind = t.num;
data.btn_search() data.btn_search()
console.log("select search1", t); console.log("select search1", t);
@@ -120,9 +126,9 @@
}, snackbar: { }, snackbar: {
show: false, show: false,
text: "", text: "",
}, itemKindList:{ }, itemKindList: {
num: 0, num: 0,
kind:'' kind: ''
} }
} }
}, },
@@ -149,9 +155,9 @@
if (!isNaN(actItemPage) && actItemPage !== 1) { if (!isNaN(actItemPage) && actItemPage !== 1) {
this.options.page = actItemPage; this.options.page = actItemPage;
} }
} }
}, },
methods: { methods: {
initKindList() { initKindList() {
axios axios
//.get(HTTP_HOST + 'api/activity_kind') //.get(HTTP_HOST + 'api/activity_kind')
@@ -174,26 +180,45 @@
}, },
getDefault(clearpage = false) { getDefault(clearpage = false) {
const { sortBy, sortDesc, page, itemsPerPage } = this.options if (this.isEditing) {
const params = { const { sortBy, sortDesc, page, itemsPerPage } = this.options
sortBy: sortBy[0], sortDesc: sortDesc[0], const params = {
page: clearpage ? '1' :page, pageSize: itemsPerPage sortBy: "sort_order", sortDesc: sortDesc[0],
}; page: clearpage ? '1' : page, pageSize: 0
this.data_table.loading = true };
axios this.data_table.loading = true
.post(HTTP_HOST + 'api/activity/GetItemList', this.search, { params: params }) axios
.then(response => { .post(HTTP_HOST + 'api/activity/GetItemList', this.search, { params: params })
this.data_table.list = response.data.list .then(response => {
this.data_table.count = response.data.count; this.data_table.list = response.data.list
this.data_table.loading = false this.data_table.count = response.data.count;
}) this.data_table.loading = false
.catch(error => console.log(error)) })
}, .catch(error => console.log(error))
editItem(item) { }
console.log("edit", item); else {
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/activity/GetItemList', 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
})
.catch(error => console.log(error))
}
}, },
deleteItem(item) { editItem(item) {
console.log("edit", item);
},
deleteItem(item) {
if (confirm('是否確定刪除此筆資料?')) { if (confirm('是否確定刪除此筆資料?')) {
const index = this.data_table.list.indexOf(item) const index = this.data_table.list.indexOf(item)
if (index != -1) { if (index != -1) {
@@ -203,7 +228,7 @@
this.getDefault(); this.getDefault();
}) })
.catch(error => console.log(error)) .catch(error => console.log(error))
} }
} }
}, },
deleteAll() { deleteAll() {
@@ -225,100 +250,155 @@
.catch(error => console.log(error)) .catch(error => console.log(error))
} }
}, },
btn_search() { editClick() {
if (this.isEditing) {
this.isEditing = false;
const sortedIds = this.data_table.list.map(item => item.num);
axios.post(HTTP_HOST + 'api/activity/SaveItemList', { ids: sortedIds })
.then(response => {
this.isEditing = false;
this.getDefault();
})
.catch(error => {
alert("儲存排序失敗:" + error);
})
.finally(() => {
this.data_table.loading = false;
});
}
else {
this.isEditing = true;
this.getDefault()
}
},
btn_search() {
this.getDefault(true) this.getDefault(true)
}, },
btn_all() { btn_all() {
clearObjProps(this.search); clearObjProps(this.search);
this.btn_search() this.btn_search()
}, },
//=== //===
search_show(curr) { 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_dialog.current = curr;
this.search_clear() this.search_clear()
//this.search_get()//清除完自動會重抓, 故取消 //this.search_get()//清除完自動會重抓, 故取消
this.search_dialog.show = true; this.search_dialog.show = true;
}, },
search_clear() { search_clear() {
if (!this.search_dialog.current.keys) return; if (!this.search_dialog.current.keys) return;
this.search_dialog.current.keys.forEach((t, i) => { t.value = '' }) this.search_dialog.current.keys.forEach((t, i) => { t.value = '' })
this.search_get() this.search_get()
}, },
search_get() { search_get() {
if (!this.search_dialog.current.keys) return; if (!this.search_dialog.current.keys) return;
let api_url = this.search_dialog.current.api_url; let api_url = this.search_dialog.current.api_url;
let keys = this.search_dialog.current.keys; let keys = this.search_dialog.current.keys;
//const { page, itemsPerPage } = this.options //const { page, itemsPerPage } = this.options
//const { sortBy, sortDesc, page, itemsPerPage } = this.options //const { sortBy, sortDesc, page, itemsPerPage } = this.options
this.search_dialog.page = this.options.page ?? 1 this.search_dialog.page = this.options.page ?? 1
let params = { page: this.search_dialog.page, pageSize: 10 };//url params let params = { page: this.search_dialog.page, pageSize: 10 };//url params
var search = {};//post body var search = {};//post body
keys.forEach((t, i) => { keys.forEach((t, i) => {
search[t.id] = t.value; search[t.id] = t.value;
}); });
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 this.search_dialog.loading = true
axios.post(api_url, search, { params: params }) axios.post(api_url, search, { params: params })
.then(response => { .then(response => {
this.search_dialog.list = response.data.list this.search_dialog.list = response.data.list
this.search_dialog.count = response.data.count this.search_dialog.count = response.data.count
this.search_dialog.loading = false 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) => {
r.push({
text: t.title,
align: 'start',
sortable: false,
value: t.id,
})
}) })
.catch(error => { return r
console.log(error) },
this.search_dialog.list = [] search_select(row) {
this.search_dialog.count = 0 let curr = this.search_dialog.current;
this.search_dialog.loading = false let target = $(`[data-search-control=${curr.id}]`);
this.snackbar.text = "錯誤:" + error curr.selected = row;
this.snackbar.show = true 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) {
search_headers() { curr.select(row, this);
if (!this.search_dialog.current.columns) return; }
r = []; this.search_dialog.show = false;
this.search_dialog.current.columns.forEach((t, i) => { },
r.push({ saveOrder(event) {
text: t.title, const movedItem = this.data_table.list.splice(event.oldIndex, 1)[0];
align: 'start', this.data_table.list.splice(event.newIndex, 0, movedItem);
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;
},
}, },
computed: { computed: {
pageCount() { pageCount() {
return Math.ceil(this.data_table.count / this.data_table.pageSize) return Math.ceil(this.data_table.count / this.data_table.pageSize)
}, },
computedHeaders() {
return this.data_table.header.map(h => {
if (h.value === 'slot_btn') {
return { ...h, sortable: false };
}
return {
...h,
sortable: this.isEditing ? false : (h.sortable !== false)
};
});
},
}, },
filters: { filters: {
currency: function (value) { currency: function (value) {
return value == null || value == "" ? "" : return value == null || value == "" ? "" :
('$' + parseFloat(value).toFixed(2).replace(/(\d)(?=(\d{3})+\.)/g, "$1,").replace(".00", "")); ('$' + parseFloat(value).toFixed(2).replace(/(\d)(?=(\d{3})+\.)/g, "$1,").replace(".00", ""));
}, },
} },
directives: {
sortableDataTable: {
bind(el, binding, vnode) {
const options = {
animation: 150,
onUpdate: function (event) {
vnode.child.$emit('sorted', event)
}
}
Sortable.create(el.getElementsByTagName('tbody')[0], options)
}
}
},
}) })
</script> </script>
</asp:Content> </asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server"> <asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server">
<uc1:alert runat="server" ID="L_msg" Text="" /> <uc1:alert runat="server" ID="L_msg" Text="" />
<div id="content" class="container-fluid"> <div id="content" class="container-fluid">
<v-data-table <v-data-table
v-sortable-data-table
@sorted="saveOrder"
:headers="computedHeaders"
v-model="data_table.selected" v-model="data_table.selected"
:items="data_table.list" :items="data_table.list"
:search-props="search" :search-props="search"
@@ -332,8 +412,29 @@
show-select show-select
hide-default-footer hide-default-footer
:page.sync="data_table.page" :page.sync="data_table.page"
:items-per-page.sync="data_table.pageSize" :items-per-page.sync= "isEditing ? -1 :data_table.pageSize"
class="elevation-1"> class="elevation-1">
<template v-slot:header.data-table-select="{ on, props }">
<v-simple-checkbox
v-if="!isEditing"
v-bind="props"
v-on="on"
></v-simple-checkbox>
<v-icon v-else small>mdi-swap-vertical</v-icon>
</template>
<template v-slot:item.data-table-select="{ item, isSelected, select }">
<v-simple-checkbox
v-if="!isEditing"
:value="isSelected"
@input="select($event)"
></v-simple-checkbox>
<div v-else class="handle" style="cursor: grab;">
<v-icon color="grey darken-1">mdi-drag-vertical</v-icon>
</div>
</template>
<template #item.price="{ item }" > <template #item.price="{ item }" >
{{item.price | currency }} {{item.price | currency }}
</template> </template>
@@ -352,12 +453,12 @@
</template> </template>
<template #item.slot_btn="{ item }"> <template #item.slot_btn="{ item }" >
<a :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 @click="deleteItem(item)" class="btn btn-outline-secondary btn-sm"><i class="mdi mdi-trash-can"></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> </template>
</v-data-table> </v-data-table>
<v-container> <v-container v-if="!isEditing">
<v-row class="align-baseline" wrap> <v-row class="align-baseline" wrap>
<v-col cols="12" md="9"> <v-col cols="12" md="9">
<v-pagination <v-pagination
+1 -1
View File
@@ -148,7 +148,7 @@ public partial class admin_activity_index2 : MyWeb.config
} }
var tdesc = publicFun.enum_desc<Model.activity.category>(); var tdesc = publicFun.enum_desc<Model.activity.category>();
qry = qry.OrderByDescending(o => o.num); qry = qry.OrderByDescending(o => o.sort_order);
var list = qry.ToList(); var list = qry.ToList();
if (list.Count > 0) if (list.Count > 0)
{ {
+111 -115
View File
@@ -24,7 +24,7 @@
return { return {
this_id: '<%= Request["num"] %>', this_id: '<%= Request["num"] %>',
paperlist: [], paperlist: [],
stylelist:[], stylelist: [],
options: {}, options: {},
optionsDetail: { optionsDetail: {
multiSort: false, multiSort: false,
@@ -45,7 +45,7 @@
{ id: 'kind', title: '分類名稱' }, { id: 'kind', title: '分類名稱' },
], ],
selected: {}, selected: {},
select(item,t) { select(item, t) {
console.log("select search1", t); console.log("select search1", t);
} }
}, },
@@ -62,7 +62,7 @@
{ id: 'subject', title: '文件名稱' }, { id: 'subject', title: '文件名稱' },
], ],
selected: {}, selected: {},
select(item,t) { select(item, t) {
console.log("select search2", t); console.log("select search2", t);
item.files_num_selected.text = t.subject //=====? item.files_num_selected.text = t.subject //=====?
@@ -73,26 +73,26 @@
id: 'search3', id: 'search3',
title: '子項目', title: '子項目',
text_prop: 'subject', text_prop: 'subject',
value_prop: 'num', value_prop: 'num',
keys: [ keys: [
{ id: 'subject', title: '項目名稱', value: '' }, { id: 'subject', title: '項目名稱', value: '' },
{ id: 'kindTxt', title: '項目分類' }, { id: 'kindTxt', title: '項目分類' },
], ],
api_url: HTTP_HOST + 'api/activity/GetItemList', api_url: HTTP_HOST + 'api/activity/GetItemList',
columns: [ columns: [
{ id: 'subject', title: '項目名稱', value: '' }, { id: 'subject', title: '項目名稱', value: '' },
{ id: 'kindTxt', title: '項目分類' }, { id: 'kindTxt', title: '項目分類' },
], ],
selected: {}, selected: {},
select(item,t) { select(item, t) {
console.log("select search3", item, t); console.log("select search3", item, t);
//debugger; //debugger;
item.actItem.subject = t.subject item.actItem.subject = t.subject
item.actItem.num = t.num item.actItem.num = t.num
item.item_num_selected={ item.item_num_selected = {
text: t.subject, text: t.subject,
val : t.num val: t.num
} }
// item.bom_editedItem.actItem.subject = t.subject // item.bom_editedItem.actItem.subject = t.subject
// item.bom_editedItem.actItem.num = t.num // item.bom_editedItem.actItem.num = t.num
@@ -100,11 +100,11 @@
// text : t.subject, // text : t.subject,
// val = t.num // val = t.num
// } // }
} }
////新增/修改+關閉時, 會清空/還原 ////新增/修改+關閉時, 會清空/還原
}, },
}, },
show: false, show: false,
current: {}, current: {},
list: [], list: [],
@@ -144,7 +144,7 @@
editedItem: { editedItem: {
id: 0, id: 0,
num: 0, num: 0,
actItem_num: 0, actItem_num: 0,
files_num_selected: { files_num_selected: {
text: '', text: '',
val: 0 val: 0
@@ -177,12 +177,12 @@
'items-per-page-options': [] 'items-per-page-options': []
}, },
bom_list: [], bom_list: [],
bom_count: 0, bom_count: 0,
bom_editedIndex: -1, bom_editedIndex: -1,
bom_editedItem: { bom_editedItem: {
id: 0, id: 0,
num: 0, num: 0,
package_num: 0, package_num: 0,
//item_num: 0, //item_num: 0,
item_num_selected: { item_num_selected: {
text: '', text: '',
@@ -192,13 +192,13 @@
bom_defaultItem: { bom_defaultItem: {
id: 0, id: 0,
num: 0, num: 0,
package_num: 0, package_num: 0,
//item_num: 0, //item_num: 0,
item_num_selected: { item_num_selected: {
text: '', text: '',
val: 0 val: 0
}, },
}, },
} }
}, },
mounted() { mounted() {
@@ -245,8 +245,8 @@
}); });
//necessary parameter=== //necessary parameter===
if (this.search_dialog.current.id == 'search1') { if (this.search_dialog.current.id == 'search1') {
if (this.this_id=="") if (this.this_id == "")
search['status'] = "Y";//啟用 search['status'] = "Y";//啟用
} }
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 this.search_dialog.loading = true
@@ -294,7 +294,7 @@
target.children("input.search-text").val(curr.selected[curr.text_prop])//text target.children("input.search-text").val(curr.selected[curr.text_prop])//text
target.children("input:hidden").val(curr.selected[curr.value_prop])//value target.children("input:hidden").val(curr.selected[curr.value_prop])//value
if (curr.select instanceof Function) { if (curr.select instanceof Function) {
curr.select(editem,row); curr.select(editem, row);
} }
this.search_dialog.show = false; this.search_dialog.show = false;
//console.log(row, row["u_name"], row["f_number"], curr.id, target); //console.log(row, row["u_name"], row["f_number"], curr.id, target);
@@ -311,7 +311,7 @@
actItem_num: this.this_id, actItem_num: this.this_id,
} }
axios axios
.post(HTTP_HOST + 'api/activity/GetItemFiles', .post(HTTP_HOST + 'api/activity/GetItemFiles',
searchItemDetail, { params: params }) searchItemDetail, { params: params })
.then(response => { .then(response => {
this.desserts = response.data.list this.desserts = response.data.list
@@ -325,7 +325,7 @@
item_num: this.this_id, item_num: this.this_id,
} }
axios axios
.post(HTTP_HOST + 'api/activity/GetItemBomList', .post(HTTP_HOST + 'api/activity/GetItemBomList',
searchItemBom, { params: params }) searchItemBom, { params: params })
.then(response => { .then(response => {
this.bom_list = response.data.list this.bom_list = response.data.list
@@ -333,48 +333,53 @@
}) })
.catch( .catch(
error => console.log(error) error => console.log(error)
)
axios
.post(HTTP_HOST + 'api/tablet/GetPaperSize', {})
.then(response => {
console.log(response);
if (response.status == "200") {
let data = response.data;
if (data.result == "Y") {
data.data.forEach(x => {
this.paperlist.push({ name: x.paperName, id: x.paperID, width: x.width, height: x.height })
$("#pageSize").append(`<option value="${x.paperID}">${x.paperName}</option>`);
$("#printSize").append(`<option value="${x.paperID}">${x.paperName}</option>`);
});
}
}
})
.catch(
error => console.log(error)
)
axios
.post(HTTP_HOST + 'api/tablet/GetStyleData', {})
.then(response => {
console.log(response);
if (response.status == "200") {
let data = response.data;
if (data.result == "Y") {
data.data.forEach(x => {
if (x.styleID != "000001") {
this.stylelist.push({ styleID: x.styleID, name: x.name })
$("#defaultStyle").append(`<option value="${x.styleID}">${x.name}</option>`);
}
});
}
}
})
.catch(
error => console.log(error)
) )
} }
axios
.post(HTTP_HOST + 'api/tablet/GetPaperSize', {})
.then(response => {
console.log(response);
if (response.status == "200") {
let data = response.data;
if (data.result == "Y") {
data.data.forEach(x => {
this.paperlist.push({ name: x.paperName, id: x.paperID, width: x.width, height: x.height })
$('#<%= ddlPageSize.ClientID %>').append(`<option value="${x.paperID}">${x.paperName}</option>`);
$('#<%= ddlPrintSize.ClientID %>').append(`<option value="${x.paperID}">${x.paperName}</option>`);
});
$('#<%= ddlPageSize.ClientID %>').val($("#<%= hidPageSize.ClientID %>").val())
$('#<%= ddlPrintSize.ClientID %>').val($("#<%= hidPrintSize.ClientID %>").val())
}
}
})
.catch(
error => console.log(error)
)
axios
.post(HTTP_HOST + 'api/tablet/GetStyleData', {})
.then(response => {
console.log(response);
if (response.status == "200") {
let data = response.data;
if (data.result == "Y") {
data.data.forEach(x => {
if (x.styleID != "000001") {
this.stylelist.push({ styleID: x.styleID, name: x.name })
$('#<%= ddlDefaultStyle.ClientID %>').append(`<option value="${x.styleID}">${x.name}</option>`);
//$("#defaultStyle").append(`<option value="${x.styleID}">${x.name}</option>`);
}
});
$('#<%= ddlDefaultStyle.ClientID %>').val($("#<%= hidDefaultStyle.ClientID %>").val())
}
}
})
.catch(
error => console.log(error)
)
}, },
editItem(item) { editItem(item) {
this.editedIndex = this.desserts.indexOf(item); this.editedIndex = this.desserts.indexOf(item);
@@ -401,7 +406,7 @@
} }
}, },
cancel() { cancel() {
this.spliceNullData(); this.spliceNullData();
this.close(); this.close();
}, },
@@ -424,7 +429,7 @@
}, 300) }, 300)
}, },
addNew() { addNew() {
this.spliceNullData(); this.spliceNullData();
//addObj.id = this.desserts.length + 1; //addObj.id = this.desserts.length + 1;
@@ -440,12 +445,12 @@
addObj.id = (isFinite(_c) ? _c : 0) + 1; addObj.id = (isFinite(_c) ? _c : 0) + 1;
this.desserts.unshift(addObj); this.desserts.unshift(addObj);
this.editItem(addObj); this.editItem(addObj);
}, },
save() { save() {
if (this.editedIndex > -1) { if (this.editedIndex > -1) {
if (this.this_id != '') { if (this.this_id != '') {
//chcck necessary params //chcck necessary params
if (this.editedItem.files_num_selected.val != 0 ) { if (this.editedItem.files_num_selected.val != 0) {
//insert or update data //insert or update data
var pro_order_detail = var pro_order_detail =
{ {
@@ -475,27 +480,27 @@
} }
} }
}, },
titleword() { titleword() {
var e = document.getElementById("<%= category.ClientID%>"); var e = document.getElementById("<%= category.ClientID%>");
const strUser = e.options[e.selectedIndex].text; const strUser = e.options[e.selectedIndex].text;
const _kind_txt = $('#<%= kind_txt.ClientID%>').val(); const _kind_txt = $('#<%= kind_txt.ClientID%>').val();
const _subject = $('#<%= subject.ClientID%>').val(); const _subject = $('#<%= subject.ClientID%>').val();
return "" + strUser + "" + " " + _kind_txt + " " + _subject; return "" + strUser + "" + " " + _kind_txt + " " + _subject;
}, },
bom_editItem(item){ bom_editItem(item) {
this.bom_editedIndex = this.bom_list.indexOf(item); this.bom_editedIndex = this.bom_list.indexOf(item);
this.bom_editedItem = $.extend(true, {}, item); this.bom_editedItem = $.extend(true, {}, item);
console.log("bom_editItem:", this.bom_editedIndex, this.bom_editedItem); console.log("bom_editItem:", this.bom_editedIndex, this.bom_editedItem);
//debugger; //debugger;
}, },
bom_deleteItem(item){ bom_deleteItem(item) {
confirm('確定要刪除此筆資料嗎?') && this.bom_list.splice(index, 1); confirm('確定要刪除此筆資料嗎?') && this.bom_list.splice(index, 1);
}, },
bom_cancel(){ bom_cancel() {
this.bom_spliceNullData(); this.bom_spliceNullData();
this.bom_close(); this.bom_close();
}, },
bom_spliceNullData() { bom_spliceNullData() {
//if new data ,then splice it //if new data ,then splice it
@@ -513,7 +518,7 @@
this.bom_editedItem = -1; this.bom_editedItem = -1;
}, 300) }, 300)
}, },
bom_addNew(){ bom_addNew() {
this.spliceNullData(); this.spliceNullData();
//addObj.id = this.desserts.length + 1; //addObj.id = this.desserts.length + 1;
@@ -532,13 +537,13 @@
if (!!this.bom_list) this.bom_list?.unshift(addObj); if (!!this.bom_list) this.bom_list?.unshift(addObj);
this.bom_editItem(addObj); this.bom_editItem(addObj);
}, },
bom_save(){ bom_save() {
if (this.bom_editedIndex > -1) { if (this.bom_editedIndex > -1) {
if (this.this_id != '') { if (this.this_id != '') {
//chcck necessary params //chcck necessary params
if (this.bom_editedItem.item_num_selected.val != 0 ) { if (this.bom_editedItem.item_num_selected.val != 0) {
//insert or update data //insert or update data
var package_num = $(".packageNum input[type=hidden]").val(); var package_num = $(".packageNum input[type=hidden]").val();
var bom_detail = var bom_detail =
{ {
num: this.bom_editedItem.num, num: this.bom_editedItem.num,
@@ -566,13 +571,13 @@
} }
} }
}, },
selectChange(what) { changeSel(selType) {
if (what == "pageSize") { if (selType=="ddlPageSize") {
document.getElementById('<%= pageSizeSel.ClientID %>').value = $("#pageSize").val(); $("#<%= hidPageSize.ClientID %>").val($("#<%= ddlPageSize.ClientID %>").val())
} else if (what == "printSize") { } else if (selType == "ddlPrintSize") {
document.getElementById('<%= printSizeSel.ClientID %>').value = $("#printSize").val(); $("#<%= hidPrintSize.ClientID %>").val($("#<%=ddlPrintSize.ClientID %>").val())
} else if (what=="defaultStyle") { } else if (selType == "ddlDefaultStyle") {
document.getElementById('<%= defaultStyleSel.ClientID %>').value = $("#defaultStyle").val(); $("#<%= hidDefaultStyle.ClientID %>").val($("#<%= ddlDefaultStyle.ClientID %>").val())
} }
} }
}, },
@@ -591,8 +596,8 @@
function setCss() { function setCss() {
$(".cyclePanel input").addClass("form-check-input"); $(".cyclePanel input").addClass("form-check-input");
} }
</script> </script>
</asp:Content> </asp:Content>
<asp:Content ID="Content3" ContentPlaceHolderID="page_nav" runat="Server"> <asp:Content ID="Content3" ContentPlaceHolderID="page_nav" runat="Server">
@@ -678,33 +683,24 @@
<div class="row mb-1 label-sm-right"> <div class="row mb-1 label-sm-right">
<label class="col-sm-2 col-form-label">預設頁面尺寸</label> <label class="col-sm-2 col-form-label">預設頁面尺寸</label>
<div class="col-sm-4"> <div class="col-sm-4">
<select id="pageSize" onchange="VueApp.selectChange('pageSize')"> <select ID="ddlPageSize" runat="server" onchange="VueApp.changeSel('ddlPageSize')"></select>
<option value="">請選擇</option> <asp:HiddenField ID="hidPageSize" runat="server" />
</select>
<asp:HiddenField ID="pageSizeSel" runat="server" Value="" />
<%--<asp:DropDownList ID="pageSize" runat="server"></asp:DropDownList> --%>
</div> </div>
<label class="col-sm-2 col-form-label">預設列印尺寸</label> <label class="col-sm-2 col-form-label">預設列印尺寸</label>
<div class="col-sm-4"> <div class="col-sm-4">
<select id="printSize" onchange="VueApp.selectChange('printSize')"> <select ID="ddlPrintSize" runat="server" onchange="VueApp.changeSel('ddlPrintSize')"></select>
<option value="">請選擇</option> <asp:HiddenField ID="hidPrintSize" runat="server" />
</select>
<asp:HiddenField ID="printSizeSel" runat="server" Value="" />
<%-- <asp:DropDownList ID="printSize" runat="server"></asp:DropDownList> --%>
</div> </div>
</div> </div>
<div class="row mb-1 label-sm-right"> <div class="row mb-1 label-sm-right">
<label class="col-sm-2 col-form-label">預設版型</label> <label class="col-sm-2 col-form-label">預設版型</label>
<div class="col-sm-4"> <div class="col-sm-4">
<select id="defaultStyle" onchange="VueApp.selectChange('defaultStyle')"> <select ID="ddlDefaultStyle" runat="server" onchange="VueApp.changeSel('ddlDefaultStyle')"></select>
<option value="">請選擇</option> <asp:HiddenField ID="hidDefaultStyle" runat="server" />
</select>
<asp:HiddenField ID="defaultStyleSel" runat="server" Value="" />
<%--<asp:DropDownList ID="pageSize" runat="server"></asp:DropDownList> --%>
</div> </div>
</div> </div>
</div>
<asp:UpdatePanel ID="UpdatePanel1" runat="server" class="row mb-1 label-sm-right"> <asp:UpdatePanel ID="UpdatePanel1" runat="server" class="row mb-1 label-sm-right">
<ContentTemplate> <ContentTemplate>
<label class="col-sm-2 col-form-label"></label> <label class="col-sm-2 col-form-label"></label>
+41 -12
View File
@@ -44,6 +44,21 @@ public partial class admin_activity_item_reg : MyWeb.config
print_init.Text = prod.print_init; print_init.Text = prod.print_init;
PARTNO.Text = prod.partno; PARTNO.Text = prod.partno;
//kind.SelectedValue = prod.kind.ToString(); //kind.SelectedValue = prod.kind.ToString();
if (!isStrNull(prod.pageSize))
{
ddlPageSize.Value = prod.pageSize.ToString();
hidPageSize.Value = prod.pageSize.ToString();
}
if (!isStrNull(prod.printSize))
{
ddlPrintSize.Value = prod.printSize.ToString();
hidPrintSize.Value = prod.printSize.ToString();
}
if (!isStrNull(prod.defaultStyle))
{
ddlDefaultStyle.Value = prod.defaultStyle.ToString();
hidDefaultStyle.Value = prod.defaultStyle.ToString();
}
if (prod.kind.HasValue) if (prod.kind.HasValue)
{ {
kind_txt.Value = prod.actItem_kind.kind; kind_txt.Value = prod.actItem_kind.kind;
@@ -118,20 +133,21 @@ public partial class admin_activity_item_reg : MyWeb.config
L_msg.Text = ""; L_msg.Text = "";
Model.actItem actItem = new Model.actItem();//新增 Model.actItem actItem = new Model.actItem();//新增
int maxSort = _db.actItems.Max(x => (int?)x.sort_order) ?? 0;
actItem.subject = subject.Text; actItem.subject = subject.Text;
actItem.print_init = print_init.Text; actItem.print_init = print_init.Text;
actItem.partno = PARTNO.Text; actItem.partno = PARTNO.Text;
if (!isStrNull(pageSizeSel.Value)) if (!isStrNull(ddlPageSize.Value))
{ {
actItem.pageSize =(pageSizeSel.Value); actItem.pageSize = ddlPageSize.Value;
} }
if (!isStrNull(printSizeSel.Value)) if (!isStrNull(ddlPrintSize.Value))
{ {
actItem.printSize = (printSizeSel.Value); actItem.printSize = ddlPrintSize.Value;
} }
if (!isStrNull(defaultStyleSel.Value)) if (!isStrNull(ddlDefaultStyle.Value))
{ {
actItem.defaultStyle = (defaultStyleSel.Value); actItem.defaultStyle = (ddlDefaultStyle.Value);
} }
//if (!isStrNull(kind.SelectedValue)) { actItem.kind = Val(kind.SelectedValue); } else { actItem.kind = null; } //if (!isStrNull(kind.SelectedValue)) { actItem.kind = Val(kind.SelectedValue); } else { actItem.kind = null; }
if (!isStrNull(category.SelectedValue)) { actItem.category = Val(category.SelectedValue); } else { actItem.category = null; } if (!isStrNull(category.SelectedValue)) { actItem.category = Val(category.SelectedValue); } else { actItem.category = null; }
@@ -143,6 +159,7 @@ public partial class admin_activity_item_reg : MyWeb.config
actItem.is_reconcile = is_reconcile_item.Checked ? "Y" : "N"; actItem.is_reconcile = is_reconcile_item.Checked ? "Y" : "N";
actItem.demo = demo.Text; actItem.demo = demo.Text;
actItem.customize_data = customize_data.Text; actItem.customize_data = customize_data.Text;
actItem.sort_order = maxSort + 1;
_db.actItems.Add(actItem); _db.actItems.Add(actItem);
_db.SaveChanges(); _db.SaveChanges();
@@ -180,17 +197,17 @@ public partial class admin_activity_item_reg : MyWeb.config
actItem.subject = subject.Text; actItem.subject = subject.Text;
actItem.print_init = print_init.Text; actItem.print_init = print_init.Text;
actItem.partno = PARTNO.Text; actItem.partno = PARTNO.Text;
if (!isStrNull(pageSizeSel.Value)) if (!isStrNull(hidPageSize.Value))
{ {
actItem.pageSize = (pageSizeSel.Value); actItem.pageSize = hidPageSize.Value;
} }
if (!isStrNull(printSizeSel.Value)) if (!isStrNull(hidPrintSize.Value))
{ {
actItem.printSize = (printSizeSel.Value); actItem.printSize = hidPrintSize.Value;
} }
if (!isStrNull(defaultStyleSel.Value)) if (!isStrNull(hidDefaultStyle.Value))
{ {
actItem.defaultStyle = (defaultStyleSel.Value); actItem.defaultStyle = (hidDefaultStyle.Value);
} }
//if (!isStrNull(kind.SelectedValue)) { actItem.kind = Val(kind.SelectedValue); } else { actItem.kind = null; } //if (!isStrNull(kind.SelectedValue)) { actItem.kind = Val(kind.SelectedValue); } else { actItem.kind = null; }
if (!isStrNull(category.SelectedValue)) { actItem.category = Val(category.SelectedValue); } else { actItem.category = null; } if (!isStrNull(category.SelectedValue)) { actItem.category = Val(category.SelectedValue); } else { actItem.category = null; }
@@ -270,4 +287,16 @@ public partial class admin_activity_item_reg : MyWeb.config
} }
} }
} }
//protected override void Render(HtmlTextWriter writer)
//{
// ClientScript.RegisterForEventValidation(
// ddlDefaultStyle.UniqueID, "ddlDefaultStyle");
// ClientScript.RegisterForEventValidation(
// ddlPageSize.UniqueID, "ddlPageSize");
// ClientScript.RegisterForEventValidation(
// ddlPrintSize.UniqueID, "ddlPrintSize");
// base.Render(writer);
//}
} }
+81 -3
View File
@@ -590,7 +590,79 @@
this.data_table.selected.push(this.data_table.editFilesItem[i]) this.data_table.selected.push(this.data_table.editFilesItem[i])
} }
} }
}, multiPrint() { },
multiPrintNew() {
var params = {
item: this.thisItemSelected.val,
file: this.thisFilesSelected.val,
//list: this.data_table.selected.map(x => x.num)
};
var list = [];
//list = this.data_table.selected.map(x => x.num);
list = this.data_table.selected
.sort((a, b) => (a.print_id == null ? "" : a.print_id).localeCompare(b.print_id == null ? "" : b.print_id))
.map(x => x.num);
//console.log("what:",list);
if (list.length > 0) {
// 記錄已列印
let _url = HTTP_HOST + 'api/order/printMultiFileLog';
axios.post(_url, list, { params: params })
.then(response => {
for (let i = 0; i < this.data_table.selected.length; i++) {
for (let j = 0; i < this.data_table.editFilesItem.length; j++) {
if (this.data_table.selected[i].num == this.data_table.editFilesItem[j].num) {
this.data_table.editFilesItem[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"; // 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(this.thisItemSelected.val, this.thisFilesSelected.val, JSON.stringify(list));
addHiddenField("item", this.thisItemSelected.val);
addHiddenField("file", this.thisFilesSelected.val);
addHiddenField("list", JSON.stringify(list));
addHiddenField("title", `${this.thisItemSelected.text} / ${this.thisFilesSelected.text}`);
//console.log("底家:",this.data_table.selected);
localStorage.setItem("item", this.thisItemSelected.val);
localStorage.setItem("list", JSON.stringify(this.data_table.selected));
document.body.appendChild(form); // Not entirely sure if this is necessary
form.submit();
document.body.removeChild(form);
}
else {
this.snackbar.text = "未選擇列印項目";
this.snackbar.show = true
}
},
multiPrint() {
var params = { var params = {
item: this.thisItemSelected.val, item: this.thisItemSelected.val,
file: this.thisFilesSelected.val, file: this.thisFilesSelected.val,
@@ -625,7 +697,7 @@
}) })
// 送出列印 // 送出列印
_url = HTTP_HOST + 'admin/print/print_multi_new.aspx'; _url = HTTP_HOST + 'admin/print/print_multi.aspx';
var form = document.createElement("form"); var form = document.createElement("form");
form.method = "POST"; form.method = "POST";
form.action = _url; form.action = _url;
@@ -833,7 +905,7 @@
<div class=""> <div class="">
<asp:Button ID="add" runat="server" Text="送出" OnClick="add_Click" CssClass="btn btn-primary" /> <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="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="goback" runat="server" Text="取消" Visible="true" CausesValidation="false" OnClick="goback_Click" CssClass="btn btn-outline-secondary" />
</div> </div>
</asp:Content> </asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server"> <asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server">
@@ -1205,6 +1277,12 @@
@click="multiPrint"> @click="multiPrint">
列印<v-icon dark>mdi-turn-right</v-icon> 列印<v-icon dark>mdi-turn-right</v-icon>
</v-btn> </v-btn>
<v-btn
color="primary"
class="ml-2 white--text"
@click="multiPrintNew">
列印(New)<v-icon dark>mdi-turn-right</v-icon>
</v-btn>
</div> </div>
</v-toolbar> </v-toolbar>
</template> </template>
+822
View File
@@ -0,0 +1,822 @@
<%@ Page Title="匯款/沖帳管" Language="C#" MasterPageFile="~/admin/Templates/TBS5ADM001/MasterPage.master" AutoEventWireup="true" CodeFile="index.aspx.cs" Inherits="admin_bill_index" %>
<asp:Content ID="Content1" ContentPlaceHolderID="page_header" Runat="Server">
<link rel="stylesheet" href="../../js/_bootstrap-icons-1.8.1/bootstrap-icons.css">
<style>
.function-icon {
font-size: 2em;
line-height: 1;
align-content: center;
}
.external-link-icon {
font-size: 0.8em;
}
</style>
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="page_nav" Runat="Server">
<h2 class="mb-3">匯款/沖帳管理</h2>
</asp:Content>
<asp:Content ID="Content3" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
<div id="content" class="container py-4">
<div class="row">
<!-- 第一欄:匯款登錄與核對 -->
<div class="col-lg-4 mb-4">
<h5 class="text-primary mb-3">
<i class="bi bi-upload"></i> 匯款登錄與核對
</h5>
<div class="list-group">
<a href="register.aspx" class="list-group-item list-group-item-action" target="_blank">
<div class="d-flex justify-content-between align-items-start">
<div class="d-flex">
<i class="bi bi-plus-circle text-success me-3 function-icon"></i>
<div>
<div>
登錄匯款資料
<i class="bi bi-box-arrow-up-right text-muted ms-1 external-link-icon"></i>
</div>
<small class="text-muted">報名者自行填寫匯款相關資訊</small>
</div>
</div>
<span class="badge bg-primary">報名者</span>
</div>
</a>
<a href="verify.aspx" class="list-group-item list-group-item-action d-none">
<div class="d-flex justify-content-between align-items-start">
<div class="d-flex">
<i class="bi bi-person-check text-info me-3 function-icon"></i>
<div>
<div>出納核對匯款人</div>
<small class="text-muted">核對匯款人身份與報名資料</small>
</div>
</div>
<span class="badge bg-info">出納</span>
</div>
</a>
<a href="verify1.aspx" class="list-group-item list-group-item-action">
<div class="d-flex justify-content-between align-items-start">
<div class="d-flex">
<i class="bi bi-person-check text-info me-3 function-icon"></i>
<div>
<div>出納核對匯款人(階段1</div>
<small class="text-muted">初步核對匯款人身份資料</small>
</div>
</div>
<span class="badge bg-info">出納</span>
</div>
</a>
<a href="verify2.aspx" class="list-group-item list-group-item-action">
<div class="d-flex justify-content-between align-items-start">
<div class="d-flex">
<i class="bi bi-currency-dollar text-warning me-3 function-icon"></i>
<div>
<div>出納核對金額(階段2</div>
<small class="text-muted">核對匯款金額與入帳資料</small>
</div>
</div>
<span class="badge bg-warning text-dark">出納</span>
</div>
</a>
</div>
</div>
<!-- 第二欄:沖帳流程 -->
<div class="col-lg-4 mb-4">
<h5 class="text-primary mb-3">
<i class="bi bi-receipt"></i> 沖帳流程
</h5>
<div class="list-group">
<a href="personal_reconcile.aspx" class="list-group-item list-group-item-action">
<div class="d-flex justify-content-between align-items-start">
<div class="d-flex">
<i class="bi bi-person text-primary me-3 function-icon"></i>
<div>
<div>個人-沖帳流程</div>
<small class="text-muted">處理個人匯款的沖帳作業</small>
</div>
</div>
<span class="badge bg-success">會計</span>
</div>
</a>
<a href="group_reconcile.aspx" class="list-group-item list-group-item-action">
<div class="d-flex justify-content-between align-items-start">
<div class="d-flex">
<i class="bi bi-people text-success me-3 function-icon"></i>
<div>
<div>共同-沖帳流程</div>
<small class="text-muted">處理多人共同支付的沖帳作業</small>
</div>
</div>
<span class="badge bg-success">會計</span>
</div>
</a>
<a href="balance_reconcile.aspx" class="list-group-item list-group-item-action">
<div class="d-flex justify-content-between align-items-start">
<div class="d-flex">
<i class="bi bi-calculator text-danger me-3 function-icon"></i>
<div>
<div>餘額核銷</div>
<small class="text-muted">處理沖帳後剩餘金額的核銷</small>
</div>
</div>
<span class="badge bg-danger">會計</span>
</div>
</a>
</div>
</div>
<!-- 第三欄:查詢功能 -->
<div class="col-lg-4 mb-4">
<h5 class="text-primary mb-3">
<i class="bi bi-search"></i> 查詢功能
</h5>
<div class="list-group">
<a href="verify_order_record_query.aspx" class="list-group-item list-group-item-action">
<div class="d-flex justify-content-between align-items-start">
<div class="d-flex">
<i class="bi bi-journal-check text-info me-3 function-icon"></i>
<div>
<div>沖帳查詢</div>
<small class="text-muted">查詢所有沖帳記錄與明細</small>
</div>
</div>
<span class="badge bg-info">會計</span>
</div>
</a>
<a href="balance_reconcile_query.aspx" class="list-group-item list-group-item-action">
<div class="d-flex justify-content-between align-items-start">
<div class="d-flex">
<i class="bi bi-file-text text-secondary me-3 function-icon"></i>
<div>
<div>餘額核銷查詢</div>
<small class="text-muted">查詢已完成的餘額核銷記錄</small>
</div>
</div>
<span class="badge bg-secondary">會計</span>
</div>
</a>
</div>
</div>
</div>
<!-- 統計資訊 -->
<div class="row mt-4">
<div class="col-12">
<div class="alert alert-info">
<h6 class="alert-heading">
<i class="bi bi-info-circle"></i> 系統說明
</h6>
<ul class="mb-0">
<li><strong>匯款登錄與核對</strong>:處理報名者匯款資料的登錄與出納核對作業</li>
<li><strong>沖帳流程</strong>:處理個人與共同支付的沖帳作業,以及剩餘金額的核銷</li>
<li><strong>查詢功能</strong>:提供各類沖帳記錄的查詢與統計功能</li>
</ul>
</div>
</div>
</div>
</div>
<keep-alive>
<component
:is="currentView" :form-data="$data">
</component>
</keep-alive>
</asp:Content>
<asp:Content ID="Content4" ContentPlaceHolderID="offCanvasRight" Runat="Server">
</asp:Content>
<asp:Content ID="Content5" ContentPlaceHolderID="footer_script" Runat="Server">
<script>
Vue.component('step-one', {
template: document.getElementById("content"),
props: ['formData'],
data() {
return {
this_act: '<%= Request["act_id"]%>',
options: { multiSort: false },
search_options: { multiSort: false },
data_table: {
loading: true,
list: [],
selected: [],
singleSelect: false,
count: 0,
page: 1,
pageSize: 10,
header: [
{ text: '活動分類', value: 'kindsTxt' },
{ text: '活動名稱', value: 'subject' },
{ text: '開始日期', value: 'startDate_solar' },
{ text: '結束日期', value: 'endDate_solar', align: 'start' },
{ text: '報名人數', value: 'orderCounts' },
{ text: '', value: 'slot_btn', sortable: false, align: 'end' }
],
footer: {
showFirstLastPage: true,
itemsPerPageOptions: [5, 10, 20, 30],
},
},
//列印管理報表
print_conditions: 'yy',
print_search: {
year: '',
month: '',
season: '',
chk_hasact: false,
chk_noact: false,
select_act: '',
select_actitem: '',
},
select_act_list: [],
select_items: {
month: [{
text: "請選擇",
val: 0
},],
season: [{
text: "請選擇",
val: 0
},],
},
print_dialog: {
show: false,
},
search_dialog: {
controls: {
search1: {
id: 'search1',
title: '國籍',
text_prop: 'name_zh',
value_prop: 'id',
keys: [
{ id: 'keyword', title: '關鍵字' },
],
api_url: HTTP_HOST + 'api/country/GetList',
columns: [
{ id: 'id', title: '代碼' },
{ id: 'name_en', title: '英文短名稱' },
{ id: 'name_zh', title: '中文名稱' },
],
selected: {},
select(item, t) {
//console.log("select search1", t);
t.search.country = item.id;
t.search.country2 = '';
}
},
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;
}
},
search3: {
id: 'search3',
title: '活動品項',
text_prop: 'subject',
value_prop: 'num',
keys: [
{ id: 'subject', title: '項目名稱', value: '' },
{ id: 'kindTxt', title: '項目分類' },
{ id: 'num', visible: false },
],
api_url: HTTP_HOST + 'api/activity/GetOrderList',
columns: [
{ id: 'subject', title: '項目名稱' },
{ id: 'kindTxt', title: '項目分類' },
],
selected: {},
select(item, t) {
t.print_search.select_actitem = item.num;
}
}
}, show: false,
current: {},
list: [],
count: 0,
page: 1,
loading: false,
footer: {
showFirstLastPage: true,
disableItemsPerPage: true,
itemsPerPageAllText: '',
itemsPerPageText: '',
},
},
search: {
keyin1: '',
order_no: '',
subject: '',
u_name: '',
up_time1: '',
up_time2: '',
actItemTxt: '',
introducerTxt: '',
activity_num: '',
country: '',
country2: '',
hasPrice: '',
}
//報到
, check_dialog: {
show: false,
},
check_data: {
f_num: 0,
u_name: '',
activity_num: 0,
activity_name: '',
qty: 1,
status: {
text: '',
val: 1
},
},
keyin1_items: [//狀態
//{
//text: "請選擇",
//val: 0
//},
],
};
},
mounted() {
this.detalKeyinArray();
this.search_dialog.current = this.search_dialog.controls.search1 ///default
if (this.this_act != '')
this.search.activity_num = this.this_act;
//this.initPrintSearch();
//this.initActivity();
const navEntries = performance.getEntriesByType("navigation");
const isReload = navEntries.length > 0 && navEntries[0].type === "reload";
if (isReload) {
sessionStorage.removeItem("orderpage");
}
else {
const savedPage = parseInt(sessionStorage.getItem('orderpage'));
if (savedPage) {
this.options.page = savedPage;
}
}
},
watch: {
options: {
handler() {
this.getDefault()
},
deep: true,
},
search_options: {
handler() {
this.search_get()
},
deep: true,
},
},
methods: {
search_show(curr) {
//console.log("btn_click:", curr, curr.api_url);
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
}
console.log("search_get", api_url, search, params, this.search_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) => {
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);
},
getDetail(clearpage = false) {
console.log("test");
const { sortBy, sortDesc, page, itemsPerPage } = this.options
const params = {
sortBy: sortBy[0], sortDesc: sortDesc[0],
page: clearpage ? '1' : page, pageSize: itemsPerPage
};
this.detail_table.loading = true
sessionStorage.setItem('orderpage', clearpage ? '1' : page);
axios
//.post(HTTP_HOST + 'api/order/GetList', this.search, { params: params })
.post(HTTP_HOST + 'api/order/GetList', this.search, { params: params })
.then(response => {
this.detail_table.list = response.data.list
this.detail_table.count = response.data.count;
this.detail_table.loading = false
})
.catch(error => console.log(error))
},
getDefault(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
sessionStorage.setItem('orderpage', clearpage ? '1' : page);
axios
//.post(HTTP_HOST + 'api/order/GetList', this.search, { params: params })
.post(HTTP_HOST + 'api/activity/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
})
.catch(error => console.log(error))
},
detalKeyinArray() {
var getArray = <%=Newtonsoft.Json.JsonConvert.SerializeObject(_keyin1Item, Newtonsoft.Json.Formatting.Indented) %>;
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]),
}
this.keyin1_items.push(_tmp);
}
},
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/order/' + 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/order/DeleteAll/' + this.data_table.selected.map(x => x.order_no))
.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]);
// this.data_table.list.splice(index, 1);
//}
//this.data_table.selected = [];
//this.data_table.count = this.data_table.list.length
location.reload();
})
.catch(error => console.log(error))
}
},
btn_search() {
this.this_act = '';
this.search.activity_num = '';
this.getDefault(true)
},
btn_all() {
this.this_act = '';
this.search.activity_num = '';
clearObjProps(this.search);
this.btn_search()
},
checkInMsg(item) {
this.check_data.f_num = item.f_num;
this.check_data.u_name = item.u_name;
this.check_data.activity_num = item.activity_num;
this.check_data.activity_name = item.subject;
this.check_dialog.show = true;
},
checkIn() {
if (this.check_data.qty > 0 && this.check_data.status.val > 0) {
var chechdata =
{
f_num: this.check_data.f_num,
activity_num: this.check_data.activity_num,
status: this.check_data.status.val,
qty: this.check_data.qty,
}
axios
.post(HTTP_HOST + 'api/activity/OrderCheckIn', chechdata)
.then(response => {
//清空
this.check_data.f_num = 0;
this.check_data.u_name = '';
this.check_data.activity_num = 0;
this.check_data.activity_name = '';
this.check_data.qty = 1;
this.check_data.status.text = '';
this.check_data.status.val = 1;
this.check_dialog.show = false;
msgtop('簽到成功')
})
.catch(
error => {
console.log(error)
msgtop('簽到失敗', 'error')
}
)
} else {
msgbox('報到資訊請填寫完整');
}
}, goPrint() {
let _qry = "";
Object.keys(this.search).forEach(key => {
//console.log(`${key}: ${this.search[key]}`);
if (this.search[key] != undefined && this.search[key] != null && this.search[key] != '') {
_qry += (_qry != '' ? '&' : '?') + (key + '=' + this.search[key]);
}
});
window.open("print.aspx" + _qry, '_blank');
},
countryChange() {
this.search.country = '';
$('#country_txt').val('')
},
//列印管理報表
print_close() {
this.print_dialog.show = false;
}
,
initPrintSearch() {
//下拉選單
for (let i = 1; i <= 12; i++) {
var _tmp = {
text: i,
val: i,
}
this.select_items.month.push(_tmp);
}
for (let i = 1; i <= 4; i++) {
var _tmp = {
text: i,
val: i,
}
this.select_items.season.push(_tmp);
}
//預設值
const Today = new Date();//現在日期時間
const first_date = new Date(Today.getFullYear(), Today.getMonth(), 1); //本月第一天
const last_month_date = new Date(first_date - 1); //上個月最後一天
this.print_search.year = last_month_date.getFullYear();
this.print_search.month = last_month_date.getMonth() + 1 //預設上個月的年份
let _season = 1;
const _month = first_date.getMonth() + 1; //本月
if (_month >= 1 && _month <= 3) {
_season = 4;
} else if (_month >= 4 && _month <= 6) {
_season = 1;
} else if (_month >= 7 && _month <= 9) {
_season = 2;
} else if (_month >= 10 && _month <= 12) {
_season = 3;
}
this.print_search.season = _season; //預設上一季
},
goPrint2() {
if (this.print_search.year != '') {
if (this.print_search.chk_noact || this.print_search.chk_hasact) {
let _qry = "";
Object.keys(this.print_search).forEach(key => {
if (this.print_search[key] != undefined && this.print_search[key] != null && this.print_search[key] != '') {
if (key == 'month') {
if (this.print_conditions == 'mm') {
_qry += "&month=" + this.print_search.month;
}
} else if (key == 'season') {
if (this.print_conditions == 'ss') {
_qry += "&season=" + this.print_search.season;
}
}
else {
_qry += (_qry != '' ? '&' : '?') + (key + '=' + this.print_search[key]);
}
}
});
this.print_dialog.show = false;
window.open("print.aspx" + _qry, '_blank');
} else {
msgbox('活動/非活動至少勾選一項');
}
} else {
msgbox('請輸入年份');
}
}, chk_hasact_change() {
if (!this.print_search.chk_hasact) {
//$('#activity_num_txt').val('')
//this.print_search.select_act = '';
this.clear_select_act();
$('#activity_num_txt').attr("placeholder", "可選擇單一活動(需先勾選活動報名)");
} else {
$('#activity_num_txt').attr("placeholder", "可選擇單一活動");
}
},
clear_select_act() {
$('#activity_num_txt').val('')
this.print_search.select_act = '';
}, clear_select_actitem() {
$('#actItem_num_txt').val('')
this.print_search.select_actitem = '';
},
initActivity() {
axios.get(HTTP_HOST + 'api/activity')
.then(response => {
this.select_act_list = response.data
})
.catch(error => {
console.log(error)
})
}
},
computed: {
pageCount() {
return Math.ceil(this.data_table.count / this.data_table.pageSize)
},
}
});
let VueApp = new Vue({
el: '#app',
vuetify: new Vuetify(),
data() {
return {
currentView: 'step-one',
selected_act: '',
selected_order: '',
};
}, activated() {
console.log("yes ,go go");
this.getDetail();
},
data() {
return {
options: { multiSort: false },
search_options: { multiSort: false },
sign_table: {
loading: true,
list: [],
selected: [],
singleSelect: false,
count: 0,
page: 1,
pageSize: 10,
header: [
{ text: '單號', value: 'order_no' },
{ text: '姓名', value: 'u_name' },
{ text: '報名日期', value: 'up_time' },
{ text: '單據狀態', value: 'keyin1_txt', align: 'start' },
{ text: '', value: 'slot_btn', sortable: false, align: 'end' }
],
footer: {
showFirstLastPage: true,
itemsPerPageOptions: [5, 10, 20, 30],
},
},
search: {
keyin1: '',
order_no: '',
subject: '',
u_name: '',
up_time1: '',
up_time2: '',
actItemTxt: '',
introducerTxt: '',
activity_num: '',
country: '',
country2: '',
hasPrice: '',
}
};
},
watch: {
options: {
handler() {
this.getDetail()
},
deep: true,
},
},
methods: {
getDetail() {
const { sortBy, sortDesc, page, itemsPerPage } = this.options
const params = {
//sortBy: sortBy == undefined ? "order_no" : sortBy[0],
//sortDesc: sortDesc == undefined ? "" : sortDesc[0],
//page: clearpage ? '1' : page, pageSize: itemsPerPage,
page: '1', pageSize: 10,
};
this.search = { activity_num: this.$root.selected_act }
this.detail_table.loading = true
sessionStorage.setItem('orderpage', '1');// clearpage ? '1' : page
axios
.post(HTTP_HOST + 'api/order/GetList', this.search, { params: params })
.then(response => {
this.detail_table.list = response.data.list
this.detail_table.count = response.data.count;
this.detail_table.loading = false
})
.catch(error => console.log(error))
},
},
computed: {
pageCount() {
return Math.ceil(this.detail_table.count / this.detail_table.pageSize)
},
}
});
</script>
</asp:Content>
+14
View File
@@ -0,0 +1,14 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class admin_bill_index : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
}
+1 -1
View File
@@ -260,7 +260,7 @@ public partial class admin_follower_import : MyWeb.config
follower.introducer = ValString(sheet.Cells[currentRow, 17].Text.Trim()); follower.introducer = ValString(sheet.Cells[currentRow, 17].Text.Trim());
//檢查國籍代碼是否存在 //檢查國籍代碼是否存在
var country = _country.Where(x => x.name_zh == ValString(sheet.Cells[currentRow, 18].Text.Trim())).FirstOrDefault(); var country = _country.Where(x => x.name_zh == ValString(sheet.Cells[currentRow, 18].Text.Trim())).FirstOrDefault();
if(country != null) if(country != null)
{ {
//follower.country = ValString(sheet.Cells[currentRow, 18].Text.Trim()); //follower.country = ValString(sheet.Cells[currentRow, 18].Text.Trim());
+146 -20
View File
@@ -13,10 +13,12 @@
<a @click="print_dialog.show=true" class="btn btn-outline-primary btn-print" target="_blank"> <a @click="print_dialog.show=true" class="btn btn-outline-primary btn-print" target="_blank">
<i class="mdi mdi-printer"></i>列印管理報表 <i class="mdi mdi-printer"></i>列印管理報表
</a> </a>
<a @click="goPrint" class="btn btn-outline-primary btn-print" target="_blank"> <a @click="goPrint" class="btn btn-outline-primary btn-print" :class="{ 'disabled': data_table.list.length === 0 }" target="_blank">
<i class="mdi mdi-printer"></i>列印查詢資料 <i class="mdi mdi-printer"></i>列印查詢資料
</a> </a>
<asp:LinkButton ID="excel" runat="server" CssClass="btn btn-outline-success" OnClick="excel_Click"><span class="fa-solid fa-file-excel"></span> 匯出Excel</asp:LinkButton> <div :style="data_table.list.length === 0 ? 'pointer-events: none; opacity: 0.5;' : ''" style="display:inline-block;">
<asp:LinkButton ID="excel" runat="server" CssClass="btn btn-outline-success" OnClick="export_Click"><span class="fa-solid fa-file-excel"></span> 匯出查詢資料(Excel</asp:LinkButton>
</div>
</div> </div>
</asp:Content> </asp:Content>
<asp:Content ID="Content5" ContentPlaceHolderID="footer_script" runat="Server"> <asp:Content ID="Content5" ContentPlaceHolderID="footer_script" runat="Server">
@@ -24,11 +26,13 @@
Vue.filter('timeString', function (value, myFormat) { Vue.filter('timeString', function (value, myFormat) {
return value == null || value == "" ? "" : moment(value).format(myFormat || 'YYYY-MM-DD, HH:mm:ss'); return value == null || value == "" ? "" : moment(value).format(myFormat || 'YYYY-MM-DD, HH:mm:ss');
}); });
let VueApp=new Vue({ let VueApp = new Vue({
el: '#app', el: '#app',
vuetify: new Vuetify(vuetify_options), vuetify: new Vuetify(vuetify_options),
data() { data() {
return { return {
isSearched: false,
print_error_msg: '',
options: { multiSort: false }, options: { multiSort: false },
search_options: { multiSort: false }, search_options: { multiSort: false },
data_table: { data_table: {
@@ -38,10 +42,10 @@
singleSelect: false, singleSelect: false,
count: 0, count: 0,
page: 1, page: 1,
pageSize: 10, pageSize: 10,
header: [ header: [
{ text: '信眾編號', value: 'f_number', align: 'start' }, { text: '信眾編號', value: 'f_number', align: 'start' },
{ text: '信眾姓名', value: 'u_name'}, { text: '信眾姓名', value: 'u_name' },
{ text: '身分別', value: 'identity_type_desc' }, { text: '身分別', value: 'identity_type_desc' },
{ text: '性別', value: 'sex' }, { text: '性別', value: 'sex' },
{ text: '生日', value: 'birthday' }, { text: '生日', value: 'birthday' },
@@ -49,9 +53,9 @@
{ text: '', value: 'slot', sortable: false }, { text: '', value: 'slot', sortable: false },
{ text: '', value: 'slot_btn', sortable: false, align: 'end' }, { text: '', value: 'slot_btn', sortable: false, align: 'end' },
], ],
footer:{ footer: {
showFirstLastPage: true, showFirstLastPage: true,
pageSizeOptions:[5,10,20,30], pageSizeOptions: [5, 10, 20, 30],
}, },
}, },
search: { search: {
@@ -60,7 +64,7 @@
sex: '', sex: '',
//birthday: new Date().toISOString().split('T')[0], //birthday: new Date().toISOString().split('T')[0],
//birthday2: new Date().toISOString().split('T')[0] //birthday2: new Date().toISOString().split('T')[0]
birthday:'', birthday: '',
birthday2: '', birthday2: '',
address: '', address: '',
country: '', country: '',
@@ -69,14 +73,14 @@
/*注意這邊的參數不能跟下方print_search重複*/ /*注意這邊的參數不能跟下方print_search重複*/
}, },
//列印管理報表 //列印管理報表
print_conditions:'yy', print_conditions: 'yy',
print_search: { print_search: {
year: '', year: '',
month: '', month: '',
season: '', season: '',
}, },
select_items: { select_items: {
month: [{ month: [{
text: "請選擇", text: "請選擇",
val: 0 val: 0
},], },],
@@ -126,13 +130,18 @@
itemsPerPageText: '', itemsPerPageText: '',
}, },
}, },
} }
}, },
watch: { watch: {
options: { options: {
handler() { handler() {
this.getList() if (this.isSearched) {
this.getList()
}
else {
this.data_table.loading = false;
}
}, },
deep: true, deep: true,
}, },
@@ -141,23 +150,101 @@
this.search_get() this.search_get()
}, },
deep: true, deep: true,
}, }
}, mounted() { }, mounted() {
const printResult = document.getElementById('<%= hid_err_msg.ClientID %>').value;
document.getElementById('<%= hid_err_msg.ClientID %>').value = '';
window._printResult = printResult
this.search_dialog.current = this.search_dialog.controls.search1 ///default this.search_dialog.current = this.search_dialog.controls.search1 ///default
this.initPrintSearch(); this.initPrintSearch();
const navEntries = performance.getEntriesByType("navigation"); const navEntries = performance.getEntriesByType("navigation");
const isReload = navEntries.length > 0 && navEntries[0].type === "reload"; const isReload = navEntries.length > 0 && navEntries[0].type === "reload";
const url = new URL(window.location.href);
let params = url.searchParams;
if (params.get('dirty') === '1') { // 資料有更新時執行 getlist
this.search = JSON.parse(sessionStorage.getItem("member_query_params"));
this.getList();
params.delete('dirty');
window.history.replaceState({}, '', url.pathname + url.search);
}
if (isReload) { if (isReload) {
sessionStorage.removeItem("followerpage"); sessionStorage.removeItem("followerpage");
sessionStorage.removeItem("member_list_cache");
sessionStorage.removeItem("member_query_params");
}
else if ("<%=lastAddedID%>" !== "") {
const newQuery = { f_number: '<%=lastAddedID%>' };
sessionStorage.setItem('member_query_params', JSON.stringify(newQuery));
this.search = newQuery;
this.isSearched = true;
} }
else { else {
const savedPage = parseInt(sessionStorage.getItem('followerpage')); const savedPage = parseInt(sessionStorage.getItem('followerpage'));
const savedData = sessionStorage.getItem("member_list_cache");
const savedQuery = JSON.parse(sessionStorage.getItem("member_query_params"));
if (savedQuery) {
this.search = savedQuery;
this.isSearched = true;
}
if (savedPage) { if (savedPage) {
this.options.page = savedPage; this.options.page = savedPage;
} }
if (savedData && savedData !== "undefined") {
this.data_table = JSON.parse(savedData);
this.isSearched = true;
}
} }
if (printResult === 'nodata' || printResult === 'success') {
this.$nextTick(() => {
this.print_search.year = parseInt(document.getElementById('<%= hid_print_year.ClientID %>').value) || this.print_search.year;
this.print_search.month = parseInt(document.getElementById('<%= hid_print_month.ClientID %>').value) || this.print_search.month;
this.print_search.season = parseInt(document.getElementById('<%= hid_print_season.ClientID %>').value) || this.print_search.season;
this.print_conditions = document.getElementById('<%= hid_print_mode.ClientID %>').value || 'yy';
this.print_dialog.show = true;
if (printResult === 'nodata') {
this.print_error_msg = "查無資料,請重新選擇區間";
}
});
}
this.$nextTick(() => {
setTimeout(() => {
// 清空 URL
const cleanUrl = window.location.protocol + "//" + window.location.host + window.location.pathname;
window.history.replaceState({}, '', cleanUrl);
}, 100);
});
}, },
methods: { methods: {
triggerManagementExport(mode) {
this.print_dialog.show = false;
this.print_error_msg = "";
if (this.print_search.year == '') {
msgbox('請輸入年份');
return;
}
document.getElementById('<%= hid_print_mode.ClientID %>').value = this.print_conditions;
document.getElementById('<%= hid_print_year.ClientID %>').value = this.print_search.year;
if (this.print_conditions == 'mm') {
document.getElementById('<%= hid_print_month.ClientID %>').value = this.print_search.month;
}
else if (this.print_conditions == 'ss') {
document.getElementById('<%= hid_print_season.ClientID %>').value = this.print_search.season;
}
if (mode === 'print') {
document.getElementById('<%= print_management.ClientID %>').click();
}
else if (mode === "excel") {
document.getElementById('<%= excel_management.ClientID %>').click();
}
},
search_show(curr) { 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_dialog.current = curr;
@@ -228,6 +315,7 @@
//console.log(row, row["u_name"], row["f_number"], curr.id, target); //console.log(row, row["u_name"], row["f_number"], curr.id, target);
}, },
getList(clearpage = false) { getList(clearpage = false) {
console.log("do getlist")
const { sortBy, sortDesc, page, itemsPerPage } = this.options const { sortBy, sortDesc, page, itemsPerPage } = this.options
const params = { const params = {
sortBy: sortBy[0], sortDesc: sortDesc[0], sortBy: sortBy[0], sortDesc: sortDesc[0],
@@ -241,6 +329,9 @@
this.data_table.list = response.data.list this.data_table.list = response.data.list
this.data_table.count = response.data.count; this.data_table.count = response.data.count;
this.data_table.loading = false this.data_table.loading = false
const dataToStore = JSON.stringify(this.data_table);
sessionStorage.setItem("member_list_cache", dataToStore);
}) })
.catch( .catch(
error => console.log(error) error => console.log(error)
@@ -262,7 +353,7 @@
const index = this.data_table.list.indexOf(item) const index = this.data_table.list.indexOf(item)
if (index != -1) { if (index != -1) {
axios axios
.delete(HTTP_HOST + 'api/follower/' + item.num) .delete(HTTP_HOST + 'api/follower/Delete/' + item.num)
.then(response => { .then(response => {
this.getList(); this.getList();
}) })
@@ -282,18 +373,23 @@
//} //}
//this.data_table.selected = []; //this.data_table.selected = [];
//this.data_table.count = this.data_table.list.length //this.data_table.count = this.data_table.list.length
location.reload(); //location.reload();
this.getList();
}) })
.catch(error => console.log(error)) .catch(error => console.log(error))
} }
}, },
btn_search() { btn_search() {
this.isSearched = true;
sessionStorage.setItem("member_query_params", JSON.stringify(this.search));
this.getList(true) this.getList(true)
bootstrap.Offcanvas.getInstance(document.getElementById("offcanvasRight")).hide() bootstrap.Offcanvas.getInstance(document.getElementById("offcanvasRight")).hide()
}, },
btn_all() { btn_all() {
this.isSearched = false;
clearObjProps(this.search); clearObjProps(this.search);
this.btn_search() sessionStorage.setItem("member_query_params", JSON.stringify(this.search));
//this.btn_search()
}, },
goPrint() { goPrint() {
//debugger; //debugger;
@@ -309,6 +405,7 @@
//列印管理報表 //列印管理報表
print_close() { print_close() {
this.print_dialog.show = false; this.print_dialog.show = false;
this.print_error_msg = "";
} }
, ,
initPrintSearch() { initPrintSearch() {
@@ -391,10 +488,31 @@
$('#country2').val(''); $('#country2').val('');
VueApp.search.country2 = ''; VueApp.search.country2 = '';
}); });
$(document).ready(function () {
// 判斷是否彈出 search dialog
let hasSearchResult = sessionStorage.getItem("member_list_cache") !== null;
if (!hasSearchResult && window._printResult === '') {
let $btn = $("a[data-bs-target='#offcanvasRight'][href='#search_panel']");
$btn.click();
let el = document.getElementById('offcanvasRight');
let offcanvas = bootstrap.Offcanvas.getOrCreateInstance(el);
offcanvas.show();
}
});
</script> </script>
</asp:Content> </asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server"> <asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server">
<uc1:alert runat="server" ID="L_msg" Text="" /> <uc1:alert runat="server" ID="L_msg" Text="" />
<asp:HiddenField ID="hid_err_msg" runat="server" />
<asp:HiddenField ID="hid_print_year" runat="server" />
<asp:HiddenField ID="hid_print_month" runat="server" />
<asp:HiddenField ID="hid_print_season" runat="server" />
<asp:HiddenField ID="hid_print_mode" runat="server" />
<asp:HiddenField ID="hid_qry" runat="server" />
<asp:LinkButton ID="excel_management" runat="server" OnClick="export_Click" style="display:none;" />
<asp:LinkButton ID="print_management" runat="server" OnClick="export_Click" style="display:none;" />
<div id="content" class="container-fluid"> <div id="content" class="container-fluid">
<v-data-table <v-data-table
v-model="data_table.selected" v-model="data_table.selected"
@@ -508,9 +626,17 @@
</v-col> </v-col>
</v-row> </v-row>
<v-row>
<v-col>
<div v-if="print_error_msg" class="red--text mt-2 text-center" style="font-weight: bold;">
{{ print_error_msg }}
</div>
</v-col>
</v-row>
<v-row densee class="pt-3" > <v-row densee class="pt-3" >
<v-col :cols="12" class="pt-3 text-center" > <v-col :cols="12" class="pt-3 text-center" >
<v-btn class="ma-2" color="primary" dark @click="goPrint2" > 列印 </v-btn> <v-btn class="ma-2" color="primary" dark @click="triggerManagementExport('print')" > 列印 </v-btn>
<v-btn class="ma-2" color="primary" dark @click="triggerManagementExport('excel')"> 匯出 Excel </v-btn>
<v-btn class="ma-2" color="green" dark @click="print_close" > 取消 </v-btn> <v-btn class="ma-2" color="green" dark @click="print_close" > 取消 </v-btn>
</v-col> </v-col>
</v-row> </v-row>
+294 -183
View File
@@ -1,17 +1,20 @@
using System; using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;
using System;
using System.Collections; using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using System.Configuration;
using System.Data; using System.Data;
using System.Data.OleDb; using System.Data.OleDb;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Web; using System.Web;
using System.Web.UI; using System.Web.UI;
using System.Web.UI.WebControls; using System.Web.UI.WebControls;
using System.Configuration; using System.Windows.Controls;
using System.IO; using System.Windows.Interop;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Spreadsheet;
using System.Linq;
using static TreeView; using static TreeView;
@@ -19,16 +22,22 @@ public partial class admin_follower_index : MyWeb.config
{ {
public int page = 1; public int page = 1;
private Model.ezEntities _db = new Model.ezEntities(); private Model.ezEntities _db = new Model.ezEntities();
protected string lastAddedID;
protected void Page_Load(object sender, EventArgs e) protected void Page_Load(object sender, EventArgs e)
{ {
if (!IsPostBack) if (!IsPostBack)
{ {
if (Session["LastAddedID"] != null)
{
lastAddedID = Session["LastAddedID"].ToString();
Session.Remove("LastAddedID");
}
BuildKind(); BuildKind();
} }
else else
{ {
} }
} }
@@ -42,10 +51,10 @@ public partial class admin_follower_index : MyWeb.config
//國籍 //國籍
s_country.Items.Clear(); s_country.Items.Clear();
s_country.Items.Add(new ListItem("請選擇", "")); s_country.Items.Add(new ListItem("請選擇", ""));
var qry =_db.countries.OrderBy(x => x.range).ThenBy(x => x.name_en).ToList(); var qry = _db.countries.OrderBy(x => x.range).ThenBy(x => x.name_en).ToList();
if (qry.Count > 0) if (qry.Count > 0)
{ {
foreach(var x in qry) foreach (var x in qry)
s_country.Items.Add(new ListItem(x.name_zh, x.ID)); s_country.Items.Add(new ListItem(x.name_zh, x.ID));
} }
@@ -68,208 +77,310 @@ public partial class admin_follower_index : MyWeb.config
#endregion #endregion
#region Excel #region
protected void excel_Click(object sender, EventArgs e) protected void export_Click(object sender, EventArgs e)
{ {
var memoryStream = new MemoryStream(); var memoryStream = new MemoryStream();
using (var doc = SpreadsheetDocument.Create(memoryStream, SpreadsheetDocumentType.Workbook))
LinkButton btn = sender as LinkButton;
if (btn == null) return;
bool isPrintMode = (btn.ID == "print_management");
bool isExcelMode = (btn.ID == "excel_management" || btn.ID == "excel");
bool isManagementMode = (btn.ID == "excel_management" || btn.ID == "print_management");
//查詢要匯出的資料
string _query = ""; // 紀錄匯出條件
var list = searchData(ref _query, isManagementMode);
if (isExcelMode)
{ {
var wb = doc.AddWorkbookPart();
wb.Workbook = new Workbook();
var sheets = wb.Workbook.AppendChild(new Sheets());
//建立第一個頁籤
var ws = wb.AddNewPart<WorksheetPart>();
ws.Worksheet = new Worksheet();
sheets.Append(new Sheet()
{
Id = wb.GetIdOfPart(ws),
SheetId = 1,
Name = "信眾資料"
});
//設定欄寬
var cu = new Columns();
cu.Append(
new Column { Min = 1, Max = 2, Width = 15, CustomWidth = true },
new Column { Min = 3, Max = 3, Width = 10, CustomWidth = true },
new Column { Min = 4, Max = 11, Width = 15, CustomWidth = true },
new Column { Min = 12, Max = 12, Width = 25, CustomWidth = true },
new Column { Min = 13, Max = 13, Width = 8, CustomWidth = true },
new Column { Min = 14, Max = 14, Width = 35, CustomWidth = true },
new Column { Min = 15, Max = 16, Width = 15, CustomWidth = true }
);
ws.Worksheet.Append(cu);
//建立資料頁
var sd = new SheetData();
ws.Worksheet.AppendChild(sd);
//第一列資料
var tr = new Row();
tr.Append(
new Cell() { CellValue = new CellValue("信眾編號"), DataType = CellValues.String },
new Cell() { CellValue = new CellValue("信眾姓名"), DataType = CellValues.String },
new Cell() { CellValue = new CellValue("性別"), DataType = CellValues.String },
new Cell() { CellValue = new CellValue("身分別"), DataType = CellValues.String },
new Cell() { CellValue = new CellValue("生日(國曆)"), DataType = CellValues.String },
new Cell() { CellValue = new CellValue("聯絡電話"), DataType = CellValues.String },
new Cell() { CellValue = new CellValue("手機號碼"), DataType = CellValues.String },
new Cell() { CellValue = new CellValue("皈依道場"), DataType = CellValues.String },
new Cell() { CellValue = new CellValue("皈依法名"), DataType = CellValues.String },
new Cell() { CellValue = new CellValue("皈依日期"), DataType = CellValues.String },
new Cell() { CellValue = new CellValue("加入日期"), DataType = CellValues.String },
new Cell() { CellValue = new CellValue("緊急連絡人"), DataType = CellValues.String },
new Cell() { CellValue = new CellValue("緊急連絡人電話"), DataType = CellValues.String },
new Cell() { CellValue = new CellValue("血型"), DataType = CellValues.String },
new Cell() { CellValue = new CellValue("國籍"), DataType = CellValues.String },
new Cell() { CellValue = new CellValue("收件地址"), DataType = CellValues.String },
new Cell() { CellValue = new CellValue("介紹人"), DataType = CellValues.String },
new Cell() { CellValue = new CellValue("LINE帳號"), DataType = CellValues.String },
new Cell() { CellValue = new CellValue("其它社群帳號"), DataType = CellValues.String },
new Cell() { CellValue = new CellValue("建檔日期"), DataType = CellValues.String }
,new Cell() { CellValue = new CellValue("身分證號"), DataType = CellValues.String }
//,new Cell() { CellValue = new CellValue("SHA"), DataType = CellValues.String }
);
sd.AppendChild(tr);
//查詢要匯出的資料
//紀錄匯出條件
string _query = "";
var list = searchData(ref _query);
if (list.Count > 0) if (list.Count > 0)
{ {
MyWeb.encrypt encrypt = new MyWeb.encrypt(); using (var doc = SpreadsheetDocument.Create(memoryStream, SpreadsheetDocumentType.Workbook))
Model.country country = new Model.country();
var tdesc = publicFun.enum_desc<Model.follower.type>();
foreach (var item in list)
{ {
//新增資料列 var wb = doc.AddWorkbookPart();
tr = new Row(); wb.Workbook = new Workbook();
string s1, s2, sha; var sheets = wb.Workbook.AppendChild(new Sheets());
s1= encrypt.DecryptAutoKey(item.phone);
s2= encrypt.DecryptAutoKey(item.id_code); //建立第一個頁籤
sha = encrypt.followerHash(s1, s2); var ws = wb.AddNewPart<WorksheetPart>();
ws.Worksheet = new Worksheet();
sheets.Append(new Sheet()
{
Id = wb.GetIdOfPart(ws),
SheetId = 1,
Name = "信眾資料"
});
//設定欄寬
var cu = new Columns();
cu.Append(
new Column { Min = 1, Max = 2, Width = 15, CustomWidth = true },
new Column { Min = 3, Max = 3, Width = 10, CustomWidth = true },
new Column { Min = 4, Max = 11, Width = 15, CustomWidth = true },
new Column { Min = 12, Max = 12, Width = 25, CustomWidth = true },
new Column { Min = 13, Max = 13, Width = 8, CustomWidth = true },
new Column { Min = 14, Max = 14, Width = 35, CustomWidth = true },
new Column { Min = 15, Max = 16, Width = 15, CustomWidth = true }
);
ws.Worksheet.Append(cu);
//建立資料頁
var sd = new SheetData();
ws.Worksheet.AppendChild(sd);
//第一列資料
var tr = new Row();
tr.Append( tr.Append(
new Cell() { CellValue = new CellValue(item.f_number), DataType = CellValues.String }, new Cell() { CellValue = new CellValue("信眾編號"), DataType = CellValues.String },
new Cell() { CellValue = new CellValue(item.u_name), DataType = CellValues.String }, new Cell() { CellValue = new CellValue("信眾姓名"), DataType = CellValues.String },
new Cell() { CellValue = new CellValue(item.sex), DataType = CellValues.String }, new Cell() { CellValue = new CellValue("性別"), DataType = CellValues.String },
new Cell() { CellValue = new CellValue(!isStrNull(item.identity_type)? tdesc[item.identity_type ?? 1] :""), DataType = CellValues.String }, new Cell() { CellValue = new CellValue("身分別"), DataType = CellValues.String },
new Cell() { CellValue = new CellValue(item.birthday.HasValue ? ValDate(item.birthday.Value).ToString("yyyy/MM/dd") : ""), DataType = CellValues.String }, new Cell() { CellValue = new CellValue("生日(國曆)"), DataType = CellValues.String },
new Cell() { CellValue = new CellValue(encrypt.DecryptAutoKey(item.phone)), DataType = CellValues.String }, new Cell() { CellValue = new CellValue("聯絡電話"), DataType = CellValues.String },
new Cell() { CellValue = new CellValue(encrypt.DecryptAutoKey(item.cellphone)), DataType = CellValues.String }, new Cell() { CellValue = new CellValue("手機號碼"), DataType = CellValues.String },
new Cell() { CellValue = new CellValue(item.refuge_area), DataType = CellValues.String }, new Cell() { CellValue = new CellValue("皈依道場"), DataType = CellValues.String },
new Cell() { CellValue = new CellValue(item.refuge_name), DataType = CellValues.String }, new Cell() { CellValue = new CellValue("皈依法名"), DataType = CellValues.String },
new Cell() { CellValue = new CellValue(item.refugedate.HasValue ? ValDate(item.refugedate.Value).ToString("yyyy/MM/dd") : ""), DataType = CellValues.String }, new Cell() { CellValue = new CellValue("皈依日期"), DataType = CellValues.String },
new Cell() { CellValue = new CellValue(item.join_date.HasValue ? ValDate(item.join_date.Value).ToString("yyyy/MM/dd") : ""), DataType = CellValues.String }, new Cell() { CellValue = new CellValue("加入日期"), DataType = CellValues.String },
new Cell() { CellValue = new CellValue(item.contactor), DataType = CellValues.String }, new Cell() { CellValue = new CellValue("緊急連絡人"), DataType = CellValues.String },
new Cell() { CellValue = new CellValue(encrypt.DecryptAutoKey(item.contactor_phone)), DataType = CellValues.String }, new Cell() { CellValue = new CellValue("緊急連絡人電話"), DataType = CellValues.String },
new Cell() { CellValue = new CellValue(item.blood), DataType = CellValues.String }, new Cell() { CellValue = new CellValue("血型"), DataType = CellValues.String },
new Cell() { CellValue = new CellValue(!isStrNull(item.country) ? item.country1.name_zh : ""), DataType = CellValues.String }, new Cell() { CellValue = new CellValue("國籍"), DataType = CellValues.String },
new Cell() { CellValue = new CellValue(item.address), DataType = CellValues.String }, new Cell() { CellValue = new CellValue("收件地址"), DataType = CellValues.String },
new Cell() { CellValue = new CellValue(item.introducer), DataType = CellValues.String }, new Cell() { CellValue = new CellValue("介紹人"), DataType = CellValues.String },
new Cell() { CellValue = new CellValue(item.socialid1), DataType = CellValues.String }, new Cell() { CellValue = new CellValue("LINE帳號"), DataType = CellValues.String },
new Cell() { CellValue = new CellValue(item.socialid2), DataType = CellValues.String }, new Cell() { CellValue = new CellValue("其它社群帳號"), DataType = CellValues.String },
new Cell() { CellValue = new CellValue(item.reg_time.HasValue ? ValDate(item.reg_time.Value).ToString("yyyy/MM/dd HH:mm:ss") : ""), DataType = CellValues.String } new Cell() { CellValue = new CellValue("建檔日期"), DataType = CellValues.String }
,new Cell() { CellValue = new CellValue(encrypt.DecryptAutoKey(item.id_code)), DataType = CellValues.String } , new Cell() { CellValue = new CellValue("身分證號"), DataType = CellValues.String }
//, new Cell() { CellValue = new CellValue(sha), DataType = CellValues.String } //,new Cell() { CellValue = new CellValue("SHA"), DataType = CellValues.String }
); );
sd.AppendChild(tr); sd.AppendChild(tr);
MyWeb.encrypt encrypt = new MyWeb.encrypt();
Model.country country = new Model.country();
var tdesc = publicFun.enum_desc<Model.follower.type>();
foreach (var item in list)
{
//新增資料列
tr = new Row();
string s1, s2, sha;
s1 = encrypt.DecryptAutoKey(item.phone);
s2 = encrypt.DecryptAutoKey(item.id_code);
sha = encrypt.followerHash(s1, s2);
tr.Append(
new Cell() { CellValue = new CellValue(item.f_number), DataType = CellValues.String },
new Cell() { CellValue = new CellValue(item.u_name), DataType = CellValues.String },
new Cell() { CellValue = new CellValue(item.sex), DataType = CellValues.String },
new Cell() { CellValue = new CellValue(!isStrNull(item.identity_type) ? tdesc[item.identity_type ?? 1] : ""), DataType = CellValues.String },
new Cell() { CellValue = new CellValue(item.birthday.HasValue ? ValDate(item.birthday.Value).ToString("yyyy/MM/dd") : ""), DataType = CellValues.String },
new Cell() { CellValue = new CellValue(encrypt.DecryptAutoKey(item.phone)), DataType = CellValues.String },
new Cell() { CellValue = new CellValue(encrypt.DecryptAutoKey(item.cellphone)), DataType = CellValues.String },
new Cell() { CellValue = new CellValue(item.refuge_area), DataType = CellValues.String },
new Cell() { CellValue = new CellValue(item.refuge_name), DataType = CellValues.String },
new Cell() { CellValue = new CellValue(item.refugedate.HasValue ? ValDate(item.refugedate.Value).ToString("yyyy/MM/dd") : ""), DataType = CellValues.String },
new Cell() { CellValue = new CellValue(item.join_date.HasValue ? ValDate(item.join_date.Value).ToString("yyyy/MM/dd") : ""), DataType = CellValues.String },
new Cell() { CellValue = new CellValue(item.contactor), DataType = CellValues.String },
new Cell() { CellValue = new CellValue(encrypt.DecryptAutoKey(item.contactor_phone)), DataType = CellValues.String },
new Cell() { CellValue = new CellValue(item.blood), DataType = CellValues.String },
new Cell() { CellValue = new CellValue(!isStrNull(item.country) ? item.country1.name_zh : ""), DataType = CellValues.String },
new Cell() { CellValue = new CellValue(item.address), DataType = CellValues.String },
new Cell() { CellValue = new CellValue(item.introducer), DataType = CellValues.String },
new Cell() { CellValue = new CellValue(item.socialid1), DataType = CellValues.String },
new Cell() { CellValue = new CellValue(item.socialid2), DataType = CellValues.String },
new Cell() { CellValue = new CellValue(item.reg_time.HasValue ? ValDate(item.reg_time.Value).ToString("yyyy/MM/dd HH:mm:ss") : ""), DataType = CellValues.String }
, new Cell() { CellValue = new CellValue(encrypt.DecryptAutoKey(item.id_code)), DataType = CellValues.String }
//, new Cell() { CellValue = new CellValue(sha), DataType = CellValues.String }
);
sd.AppendChild(tr);
}
//空一列
tr = new Row();
sd.AppendChild(tr);
//匯出資訊
string _data = "匯出時間 : " + DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss");
_data += " " + admin.info.u_id;
tr = new Row();
tr.Append(
new Cell() { CellValue = new CellValue(_data), DataType = CellValues.String }
);
sd.AppendChild(tr);
_data = "匯出條件 : " + (!isStrNull(_query) ? _query : "-");
tr = new Row();
tr.Append(
new Cell() { CellValue = new CellValue(_data), DataType = CellValues.String }
);
sd.AppendChild(tr);
Model.admin_log admin_log = new Model.admin_log();
admin_log.writeLog(admin.info.u_id, (int)Model.admin_log.Systems.Follower, (int)Model.admin_log.Status.Excel, admin_log.LogViewBtn(list.Select(x => x.f_number + x.u_name).ToList()));
} }
HttpContext.Current.Response.Clear();
HttpContext.Current.Response.AddHeader("content-disposition", "attachment; filename=信眾_data.xlsx");
HttpContext.Current.Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
HttpContext.Current.Response.BinaryWrite(memoryStream.ToArray());
HttpContext.Current.Response.End();
//空一列 hid_err_msg.Value = "success";
tr = new Row();
sd.AppendChild(tr);
//匯出資訊
string _data = "匯出時間 : " + DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss");
_data += " " + admin.info.u_id;
tr = new Row();
tr.Append(
new Cell() { CellValue = new CellValue(_data), DataType = CellValues.String }
);
sd.AppendChild(tr);
_data = "匯出條件 : " + (!isStrNull(_query) ? _query : "-");
tr = new Row();
tr.Append(
new Cell() { CellValue = new CellValue(_data), DataType = CellValues.String }
);
sd.AppendChild(tr);
Model.admin_log admin_log = new Model.admin_log();
admin_log.writeLog(admin.info.u_id, (int)Model.admin_log.Systems.Follower, (int)Model.admin_log.Status.Excel, admin_log.LogViewBtn(list.Select(x => x.f_number + x.u_name).ToList()));
} }
else else
{ {
ScriptMsg2("查無資料"); //ScriptMsg2("查無資料");
hid_err_msg.Value = "nodata";
} }
} }
else if (isPrintMode)
{
string urlParams = "";
int selYear = !string.IsNullOrEmpty(hid_print_year.Value) ? int.Parse(hid_print_year.Value) : 0;
int selMonth = !string.IsNullOrEmpty(hid_print_month.Value) ? int.Parse(hid_print_month.Value) : 0;
int selSeason = !string.IsNullOrEmpty(hid_print_season.Value) ? int.Parse(hid_print_season.Value) : 0;
string selMode = !string.IsNullOrEmpty(hid_print_mode.Value) ? hid_print_mode.Value : "";
var qry = _db.followers.AsQueryable();
if (selYear > 0)
{
urlParams += "&year=" + selYear;
}
if (selMode == "mm" && selMonth > 0)
{
urlParams += "&month=" + selMonth;
}
else if (selMode == "ss" && selSeason > 0)
{
urlParams += "&season=" + selSeason;
}
HttpContext.Current.Response.Clear(); if (list.Count > 0)
HttpContext.Current.Response.AddHeader("content-disposition", "attachment; filename=信眾_data.xlsx"); {
HttpContext.Current.Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; hid_err_msg.Value = "success";
HttpContext.Current.Response.BinaryWrite(memoryStream.ToArray()); hid_print_year.Value = selYear.ToString();
HttpContext.Current.Response.End(); hid_print_month.Value = selMonth.ToString();
hid_print_season.Value = selSeason.ToString();
hid_print_mode.Value = selMode;
string script = $@"window.open('print.aspx?{urlParams}&mode={selMode}', '列印信眾資料', 'noopener,noreferrer');";
ScriptManager.RegisterStartupScript(this, GetType(), "ExecutePrint", script, true);
}
else
{
hid_err_msg.Value = "nodata";
}
}
} }
protected List<Model.follower> searchData(ref string _query) protected List<Model.follower> searchData(ref string _query, bool isManagementMode = false)
{ {
//查詢要匯出的資料 //查詢要匯出的資料
var qry = _db.followers.AsQueryable(); var qry = _db.followers.AsQueryable();
//紀錄匯出條件 // 管理報表
if (!isStrNull(s_f_number.Value)) if (isManagementMode)
{ {
qry = qry.Where(o => o.f_number.Contains(s_f_number.Value.Trim())); int selYear = !string.IsNullOrEmpty(hid_print_year.Value) ? int.Parse(hid_print_year.Value) : 0;
int selMonth = !string.IsNullOrEmpty(hid_print_month.Value) ? int.Parse(hid_print_month.Value) : 0;
_query += "信眾編號:" + s_f_number.Value.Trim() + "\n"; int selSeason = !string.IsNullOrEmpty(hid_print_season.Value) ? int.Parse(hid_print_season.Value) : 0;
string selMode = !string.IsNullOrEmpty(hid_print_mode.Value) ? hid_print_mode.Value : "";
}
if (!isStrNull(s_u_name.Value)) if (selYear > 0)
{
qry = qry.Where(o => o.u_name.Contains(s_u_name.Value.Trim()));
_query += "信眾姓名:" + s_u_name.Value.Trim() + "\n";
}
if (!isStrNull(s_address.Value))
{
qry = qry.Where(o => o.address.Contains(s_address.Value.Trim()));
_query += "地址:" + s_u_name.Value.Trim() + "\n";
}
// 電話/證號搜尋 (使用 search_keywords HEX 編碼)
if (!isStrNull(s_phone_idcode.Value) && GlobalVariables.UseSearchKeywords)
{
MyWeb.encrypt encrypt = new MyWeb.encrypt();
string hexSearch = encrypt.ConvertToHex(s_phone_idcode.Value.Trim());
if (!string.IsNullOrEmpty(hexSearch))
{ {
qry = qry.Where(o => o.search_keywords != null && o.search_keywords.Contains(hexSearch)); qry = qry.Where(o => o.join_date.HasValue && o.join_date.Value.Year == selYear);
_query += "電話/證號:" + s_phone_idcode.Value.Trim() + "\n"; _query += "年份:" + selYear + "\n";
} }
if (selMode == "mm" && selMonth > 0)
{
qry = qry.Where(o => o.join_date.HasValue && o.join_date.Value.Month == selMonth);
_query += "月份:" + selMonth + "\n";
}
else if (selMode == "ss" && selSeason > 0)
{
if (selSeason == 1)
{
qry = qry.Where(o => o.join_date.HasValue)
.Where(o => o.join_date.Value.Month == 1 || o.join_date.Value.Month == 2 || o.join_date.Value.Month == 3);
}
else if (selSeason == 2)
{
qry = qry.Where(o => o.join_date.HasValue)
.Where(o => o.join_date.Value.Month == 4 || o.join_date.Value.Month == 5 || o.join_date.Value.Month == 6);
}
else if (selSeason == 3)
{
qry = qry.Where(o => o.join_date.HasValue)
.Where(o => o.join_date.Value.Month == 7 || o.join_date.Value.Month == 8 || o.join_date.Value.Month == 9);
}
else if (selSeason == 4)
{
qry = qry.Where(o => o.join_date.HasValue)
.Where(o => o.join_date.Value.Month == 10 || o.join_date.Value.Month == 11 || o.join_date.Value.Month == 12);
}
_query += "季度:" + selSeason + "\n";
}
qry = qry.OrderByDescending(o => o.num);
return qry.ToList();
} }
else
if (!isStrNull(s_birthday.Value) && isDate(s_birthday.Value)) // 匯出查詢資料
{ {
qry = qry.Where(o => o.birthday >= ValDate(s_birthday.Value)); //紀錄匯出條件
_query += "生日(起):" + s_birthday.Value.Trim() + "\n"; if (!isStrNull(s_f_number.Value))
{
qry = qry.Where(o => o.f_number.Contains(s_f_number.Value.Trim()));
_query += "信眾編號:" + s_f_number.Value.Trim() + "\n";
}
if (!isStrNull(s_u_name.Value))
{
qry = qry.Where(o => o.u_name.Contains(s_u_name.Value.Trim()));
_query += "信眾姓名:" + s_u_name.Value.Trim() + "\n";
}
if (!isStrNull(s_address.Value))
{
qry = qry.Where(o => o.address.Contains(s_address.Value.Trim()));
_query += "地址:" + s_address.Value.Trim() + "\n";
}
// 電話/證號搜尋 (使用 search_keywords HEX 編碼)
if (!isStrNull(s_phone_idcode.Value) && GlobalVariables.UseSearchKeywords)
{
MyWeb.encrypt encrypt = new MyWeb.encrypt();
string hexSearch = encrypt.ConvertToHex(s_phone_idcode.Value.Trim());
if (!string.IsNullOrEmpty(hexSearch))
{
qry = qry.Where(o => o.search_keywords != null && o.search_keywords.Contains(hexSearch));
_query += "電話/證號:" + s_phone_idcode.Value.Trim() + "\n";
}
}
if (!isStrNull(s_birthday.Value) && isDate(s_birthday.Value))
{
var tmp_s_birthday = ValDate(s_birthday.Value);
qry = qry.Where(o => o.birthday >= tmp_s_birthday);
_query += "生日(起):" + s_birthday.Value.Trim() + "\n";
}
if (!isStrNull(s_birthday2.Value) && isDate(s_birthday2.Value))
{
var tmp_s_birthday2 = Convert.ToDateTime(s_birthday2.Value).AddDays(1);
qry = qry.Where(o => o.birthday < tmp_s_birthday2);
_query += "生日(訖):" + s_birthday2.Value.Trim() + "\n";
}
qry = qry.OrderByDescending(o => o.num);
return qry.ToList();
} }
if (!isStrNull(s_birthday2.Value) && isDate(s_birthday2.Value))
{
qry = qry.Where(o => o.birthday < Convert.ToDateTime(s_birthday2.Value).AddDays(1));
_query += "生日(訖):" + s_birthday2.Value.Trim() + "\n";
}
qry = qry.OrderByDescending(o => o.num);
return qry.ToList();
} }
+1
View File
@@ -8,6 +8,7 @@
<span>信眾姓名:</span><asp:Literal runat="server" ID="username"></asp:Literal> <span>信眾姓名:</span><asp:Literal runat="server" ID="username"></asp:Literal>
</div> </div>
</div> </div>
<a href="index.aspx" class="btn btn-outline-secondary">返回</a>
</asp:Content> </asp:Content>
<asp:Content ID="Content3" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server"> <asp:Content ID="Content3" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
<div class="container-fluid"> <div class="container-fluid">
+5 -4
View File
@@ -4,10 +4,11 @@
</asp:Content> </asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="page_nav" Runat="Server"> <asp:Content ID="Content2" ContentPlaceHolderID="page_nav" Runat="Server">
<div class="scroll-nav nav nav-tabs mb-2 mb-sm-0 d-none d-sm-flex"> <div class="scroll-nav nav nav-tabs mb-2 mb-sm-0 d-none d-sm-flex">
<div class="ms-3"> <div class="ms-3">
<span>信眾姓名:</span><asp:Literal runat="server" ID="username"></asp:Literal> <span>信眾姓名:</span><asp:Literal runat="server" ID="username"></asp:Literal>
</div> </div>
</div> </div>
<a href="order_record.aspx?userid=<%=Request["userid"] %>" class="btn btn-outline-secondary">返回</a>
</asp:Content> </asp:Content>
<asp:Content ID="Content3" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server"> <asp:Content ID="Content3" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
<div class="container-fluid"> <div class="container-fluid">
+17 -3
View File
@@ -3,6 +3,7 @@ using DocumentFormat.OpenXml.Vml.Office;
using OfficeOpenXml.FormulaParsing.Excel.Functions.Information; using OfficeOpenXml.FormulaParsing.Excel.Functions.Information;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics;
using System.Linq; using System.Linq;
using System.Web; using System.Web;
using System.Web.UI; using System.Web.UI;
@@ -26,7 +27,7 @@ public partial class admin_follower_print_ : System.Web.UI.Page
//紀錄匯出條件 //紀錄匯出條件
string _query = ""; string _query = "";
var qry = _db.followers.AsQueryable(); var qry = _db.followers.AsQueryable();
// ❌ 錯誤寫法: qry = qry.Where(o => o.f_number.Contains(Request["f_number"].Trim())); // ❌ 錯誤寫法: qry = qry.Where(o => o.f_number.Contains(Request["f_number"].Trim()));
// LINQ to Entities 無法轉換 Request[] 方法,必須先轉換為變數再使用 // LINQ to Entities 無法轉換 Request[] 方法,必須先轉換為變數再使用
string fNumberParam = Request["f_number"]?.Trim(); string fNumberParam = Request["f_number"]?.Trim();
@@ -60,7 +61,8 @@ public partial class admin_follower_print_ : System.Web.UI.Page
if (!string.IsNullOrEmpty(Request["birthday2"])) if (!string.IsNullOrEmpty(Request["birthday2"]))
{ {
DateTime birthday2Param = Convert.ToDateTime(Request["birthday2"].Trim()); DateTime birthday2Param = Convert.ToDateTime(Request["birthday2"].Trim());
qry = qry.Where(o => o.birthday < birthday2Param.AddDays(1)); var tmpBirthday2Param = birthday2Param.AddDays(1);
qry = qry.Where(o => o.birthday < tmpBirthday2Param);
_query += "生日(訖):" + birthday2Param.ToString("yyyy/MM/dd") + "\n"; _query += "生日(訖):" + birthday2Param.ToString("yyyy/MM/dd") + "\n";
} }
// ❌ 錯誤寫法: _db.countries.Where(x => x.ID == Request["country"].ToString()) // ❌ 錯誤寫法: _db.countries.Where(x => x.ID == Request["country"].ToString())
@@ -85,7 +87,19 @@ public partial class admin_follower_print_ : System.Web.UI.Page
} }
_query += "國家:" + (_db.countries.Where(x => x.ID == country2Id).Select(x => x.name_zh).FirstOrDefault() ?? "") + "\n"; _query += "國家:" + (_db.countries.Where(x => x.ID == country2Id).Select(x => x.name_zh).FirstOrDefault() ?? "") + "\n";
} }
string phone_ipcode = Request["phone_idcode"]?.ToString();
if (!string.IsNullOrEmpty(phone_ipcode) && GlobalVariables.UseSearchKeywords)
{
MyWeb.encrypt encrypt = new MyWeb.encrypt();
string hexSearch = encrypt.ConvertToHex(phone_ipcode.Trim());
if (!string.IsNullOrEmpty(hexSearch))
{
qry = qry.Where(o => o.search_keywords != null && o.search_keywords.Contains(hexSearch));
_query += "電話/證號:" + phone_ipcode.Trim() + "\n";
}
}
//管理報表 //管理報表
if (!string.IsNullOrEmpty(Request["year"])) if (!string.IsNullOrEmpty(Request["year"]))
{ {
+53 -33
View File
@@ -190,7 +190,7 @@
text_prop: 'name_zh', text_prop: 'name_zh',
value_prop: 'id', value_prop: 'id',
keys: [ keys: [
{ id: 'keyword', title: '關鍵字' }, { id: 'keyword', title: '關鍵字' },
], ],
api_url: HTTP_HOST + 'api/country/GetList', api_url: HTTP_HOST + 'api/country/GetList',
columns: [ columns: [
@@ -208,11 +208,11 @@
title: '稱謂', title: '稱謂',
text_prop: 'title', text_prop: 'title',
value_prop: 'num', value_prop: 'num',
keys: [ keys: [
], ],
api_url: HTTP_HOST + 'api/appellation/GetList', api_url: HTTP_HOST + 'api/appellation/GetList',
columns: [ columns: [
{ id: 'title', title: '稱謂' }, { id: 'title', title: '稱謂' },
], ],
selected: {}, selected: {},
select(item, index, t) { select(item, index, t) {
@@ -230,7 +230,7 @@
{ id: 'f_number', title: '編號' }, { id: 'f_number', title: '編號' },
{ id: 'u_name', title: '姓名' }, { id: 'u_name', title: '姓名' },
{ id: 'address', title: '地址' }, { id: 'address', title: '地址' },
{ id: 'onlyfamily', title: '只查親屬'}, { id: 'onlyfamily', title: '只查親屬' },
], ],
api_url: HTTP_HOST + 'api/follower/GetList', api_url: HTTP_HOST + 'api/follower/GetList',
columns: [ columns: [
@@ -241,7 +241,7 @@
selected: {}, selected: {},
select(item, index, t) { select(item, index, t) {
console.log("select search5", t); console.log("select search5", t);
} }
}, },
}, },
@@ -314,10 +314,10 @@
birthday: '', birthday: '',
phoneDes: '', phoneDes: '',
demo: '', demo: '',
appellation_id_selected : appellation_id_selected:
{ {
text : '', text: '',
val : 0, val: 0,
}, },
}, },
@@ -372,33 +372,33 @@
], ],
tabletsDetail: { multiSort: false }, tabletsDetail: { multiSort: false },
tabletTable: { tabletTable: {
Loading:true, Loading: true,
disableButton: true, disableButton: true,
searchDetail: '', searchDetail: '',
headersDetail: [ headersDetail: [
{ text: '超渡/陽上', value: 'type', sortable: false, width: "100px" }, { text: '超渡/陽上', value: 'type', sortable: false, width: "100px" },
{ text: '* 牌位標題', value: 'title', sortable: true }, { text: '* 牌位標題', value: 'title', sortable: true },
{ text: '', value: 'actions', sortable: false, width: "100px" }, { text: '', value: 'actions', sortable: false, width: "100px" },
], ],
desserts: [], desserts: [],
desserts_count: 0, desserts_count: 0,
editedIndex: -1, editedIndex: -1,
editedItem: { editedItem: {
id: 0, id: 0,
num: 0, num: 0,
f_num: 0, f_num: 0,
title: '', title: '',
}, },
defaultItem: { defaultItem: {
id: 0, id: 0,
num: 0, num: 0,
f_num: 0, f_num: 0,
type: this.selectedTabletType, type: this.selectedTabletType,
title:'', title: '',
}, },
}, },
//新:家人 //新:家人
family:{ family: {
dialog: false, dialog: false,
isEditing: false, isEditing: false,
is_tw: true, is_tw: true,
@@ -420,8 +420,8 @@
chinese_year: "", chinese_year: "",
zodiac: "", zodiac: "",
birth_time: "", birth_time: "",
city:"", city: "",
area:"", area: "",
address: "", address: "",
phone: "", phone: "",
mobile: "", mobile: "",
@@ -440,8 +440,8 @@
chinese_year: "", chinese_year: "",
zodiac: "", zodiac: "",
birth_time: "", birth_time: "",
city:"", city: "",
area:"", area: "",
address: "", address: "",
phone: "", phone: "",
mobile: "", mobile: "",
@@ -458,11 +458,11 @@
areaOptions: {}, // 區域選項 areaOptions: {}, // 區域選項
//天干地支:甲子, 乙丑... //天干地支:甲子, 乙丑...
chineseYears: [ chineseYears: [
'甲子', '乙丑', '丙寅', '丁卯', '戊辰', '己巳', '庚午', '辛未', '壬申', '癸酉', '甲子', '乙丑', '丙寅', '丁卯', '戊辰', '己巳', '庚午', '辛未', '壬申', '癸酉',
'甲戌', '乙亥', '丙子', '丁丑', '戊寅', '己卯', '庚辰', '辛巳', '壬午', '癸未', '甲戌', '乙亥', '丙子', '丁丑', '戊寅', '己卯', '庚辰', '辛巳', '壬午', '癸未',
'甲申', '乙酉', '丙戌', '丁亥', '戊子', '己丑', '庚寅', '辛卯', '壬辰', '癸巳', '甲申', '乙酉', '丙戌', '丁亥', '戊子', '己丑', '庚寅', '辛卯', '壬辰', '癸巳',
'甲午', '乙未', '丙申', '丁酉', '戊戌', '己亥', '庚子', '辛丑', '壬寅', '癸卯', '甲午', '乙未', '丙申', '丁酉', '戊戌', '己亥', '庚子', '辛丑', '壬寅', '癸卯',
'甲辰', '乙巳', '丙午', '丁未', '戊申', '己酉', '庚戌', '辛亥', '壬子', '癸丑', '甲辰', '乙巳', '丙午', '丁未', '戊申', '己酉', '庚戌', '辛亥', '壬子', '癸丑',
'甲寅', '乙卯', '丙辰', '丁巳', '戊午', '己未', '庚申', '辛酉', '壬戌', '癸亥' '甲寅', '乙卯', '丙辰', '丁巳', '戊午', '己未', '庚申', '辛酉', '壬戌', '癸亥'
], ],
//生肖 //生肖
@@ -585,7 +585,7 @@
this.search_dialog.list = response.data.list this.search_dialog.list = response.data.list
this.search_dialog.count = response.data.count this.search_dialog.count = response.data.count
this.search_dialog.loading = false this.search_dialog.loading = false
console.log(this.search_dialog.list)
}) })
.catch(error => { .catch(error => {
console.log(error) console.log(error)
@@ -1318,13 +1318,32 @@
$('.tab-pane,.edit_Click').removeClass('pe-none'); // 移除 pe-none 類,允許編輯 $('.tab-pane,.edit_Click').removeClass('pe-none'); // 移除 pe-none 類,允許編輯
} }
}); });
let isComposing = false;
const cellphoneInput = document.querySelector('[id$="cellphone"]');
if (cellphoneInput) {
cellphoneInput.addEventListener('compositionstart', () => {
isComposing = true;
});
cellphoneInput.addEventListener('compositionend', (e) => {
isComposing = false;
formatCellphone(e.target);
});
cellphoneInput.addEventListener('input', (e) => {
if (!isComposing) {
formatCellphone(e.target);
}
});
}
</script> </script>
</asp:Content> </asp:Content>
<asp:Content ID="Content3" ContentPlaceHolderID="page_nav" runat="Server"> <asp:Content ID="Content3" ContentPlaceHolderID="page_nav" runat="Server">
<div class="scroll-nav nav nav-tabs mb-2 mb-sm-0 d-none d-sm-flex"> <div class="scroll-nav nav nav-tabs mb-2 mb-sm-0 d-none d-sm-flex">
<template v-if="follower_id !='' "> {{titleword()}} </template> <template v-if="follower_id !='' "> {{titleword()}} </template>
</div> </div>
<div class="d-flex align-items-center"> <div class="">
<div class="form-check me-3 d-none" id="editCheckboxContainer"> <div class="form-check me-3 d-none" id="editCheckboxContainer">
<input class="form-check-input" type="checkbox" id="editCheckbox"> <input class="form-check-input" type="checkbox" id="editCheckbox">
<label class="form-check-label" for="editCheckbox"> <label class="form-check-label" for="editCheckbox">
@@ -1332,8 +1351,8 @@
</label> </label>
</div> </div>
<asp:Button ID="add" runat="server" Text="送出" OnClick="add_Click" CssClass="btn btn-primary edit_Click noedit" /> <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="edit" runat="server" Text="儲存" Visible="false" OnClick="edit_Click" CssClass="btn btn-primary edit_Click noedit" />
<asp:Button ID="goback" runat="server" Text="回列表" Visible="false" 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> </div>
</asp:Content> </asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server"> <asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server">
@@ -1412,7 +1431,7 @@
</div> </div>
<label class="col-sm-2 col-lg-1 col-form-label">手機號碼<asp:Literal ID="cellphoneReqStar" runat="server" Text=" *"></asp:Literal></label> <label class="col-sm-2 col-lg-1 col-form-label">手機號碼<asp:Literal ID="cellphoneReqStar" runat="server" Text=" *"></asp:Literal></label>
<div class="col-sm-10 col-lg-3"> <div class="col-sm-10 col-lg-3">
<asp:TextBox ID="cellphone" MaxLength="12" runat="server" CssClass="form-control" data-encrypt="Y" placeholder="聯絡電話與手機號碼請至少填寫一項" oninput="formatCellphone(this)"></asp:TextBox> <asp:TextBox ID="cellphone" MaxLength="12" runat="server" CssClass="form-control" data-encrypt="Y" placeholder="聯絡電話與手機號碼請至少填寫一項"></asp:TextBox>
<asp:RegularExpressionValidator ControlToValidate="cellphone" Display="Dynamic" ErrorMessage="格式有誤" ID="RegularExpressionValidator2" runat="server" SetFocusOnError="true" ValidationExpression="^09\d{2}-?\d{3}-?\d{3}$" /> <asp:RegularExpressionValidator ControlToValidate="cellphone" Display="Dynamic" ErrorMessage="格式有誤" ID="RegularExpressionValidator2" runat="server" SetFocusOnError="true" ValidationExpression="^09\d{2}-?\d{3}-?\d{3}$" />
</div> </div>
</div> </div>
@@ -2155,4 +2174,5 @@
</template> </template>
</v-snackbar> </v-snackbar>
</div> </div>
</asp:Content> </asp:Content>
+81 -23
View File
@@ -1,34 +1,44 @@
using System; using Model;
using Newtonsoft.Json;
using System;
using System.Collections; using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using System.Configuration;
using System.Data; using System.Data;
using System.Data.Entity;
using System.Data.OleDb; using System.Data.OleDb;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Web; using System.Web;
using System.Web.UI; using System.Web.UI;
using System.Web.UI.WebControls; using System.Web.UI.WebControls;
using System.Configuration;
using System.IO;
using System.Linq;
using System.Globalization;
using Model;
public partial class admin_follower_reg : MyWeb.config public partial class admin_follower_reg : MyWeb.config
{ {
private Model.ezEntities _db = new Model.ezEntities(); private Model.ezEntities _db = new Model.ezEntities();
public ArrayList _tmp = new ArrayList(); public ArrayList _tmp = new ArrayList();
public bool isDataChanged = false;
public bool isAutoNumbering = ConfigurationManager.AppSettings["IsAutoNumbering"].ToString() == "true" ? true : false;
protected void Page_Load(object sender, EventArgs e) protected void Page_Load(object sender, EventArgs e)
{ {
CallAjax(); CallAjax();
if (!IsPostBack) if (!IsPostBack)
{ {
InitEnumsOptions<Model.follower.type>(identity_type); //身分別 InitEnumsOptions<Model.follower.type>(identity_type); //身分別
//var qry = _db.followers.AsEnumerable(); //var qry = _db.followers.AsEnumerable();
var qry = _db.followers.AsQueryable(); var qry = _db.followers.AsQueryable();
if (isStrNull(Request["num"])) if (isStrNull(Request["num"]))
{ {
if (!isAutoNumbering)
{
f_number.ReadOnly = false;
}
if (!isStrNull(Request["leader"])) if (!isStrNull(Request["leader"]))
{ {
int _num = Val(Request["leader"]); int _num = Val(Request["leader"]);
@@ -50,9 +60,14 @@ public partial class admin_follower_reg : MyWeb.config
//預設國籍 //預設國籍
country.Value = "158"; country.Value = "158";
country_txt.Value = "中華民國(台灣)"; country_txt.Value = "中華民國(台灣)";
// 預設加入日期
join_date.Text = DateTime.Now.ToString("yyyy-MM-dd");
} }
else else
{ {
f_number.ReadOnly = true;
int _num = Val(Request["num"]); int _num = Val(Request["num"]);
var prod = qry.Where(q => q.num == _num).FirstOrDefault(); var prod = qry.Where(q => q.num == _num).FirstOrDefault();
if (prod != null) if (prod != null)
@@ -206,8 +221,11 @@ public partial class admin_follower_reg : MyWeb.config
} }
} }
} }
// 使用新的 generate_f_number 方法,已內建重號檢查和重試機制 if (isAutoNumbering)
followers.f_number = follower.generate_f_number(sex.SelectedValue); {
// 使用新的 generate_f_number 方法,已內建重號檢查和重試機制
followers.f_number = follower.generate_f_number(sex.SelectedValue);
}
followers.identity_type = Val(identity_type.SelectedValue); followers.identity_type = Val(identity_type.SelectedValue);
if(!isStrNull(leader.Value)) followers.leader = Val(leader.Value); if(!isStrNull(leader.Value)) followers.leader = Val(leader.Value);
if (!isStrNull(country.Value)) followers.country = country.Value; if (!isStrNull(country.Value)) followers.country = country.Value;
@@ -239,7 +257,9 @@ public partial class admin_follower_reg : MyWeb.config
Model.admin_log admin_log = new Model.admin_log(); Model.admin_log admin_log = new Model.admin_log();
admin_log.writeLog(admin.info.u_id, (int)Model.admin_log.Systems.Follower, (int)Model.admin_log.Status.Insert, f_number.Text + u_name.Text); admin_log.writeLog(admin.info.u_id, (int)Model.admin_log.Systems.Follower, (int)Model.admin_log.Status.Insert, f_number.Text + u_name.Text);
Session["LastAddedID"] = followers.f_number;
Response.Redirect("index.aspx"); Response.Redirect("index.aspx");
} }
else else
@@ -282,7 +302,7 @@ public partial class admin_follower_reg : MyWeb.config
try try
{ {
foreach (Control obj in cardBodyPanel.Controls) foreach (Control obj in cardBodyPanel.Controls)
{ {
if (obj is TextBox) if (obj is TextBox)
{ {
var ObjValue = followers.GetType().GetProperty(obj.ID); var ObjValue = followers.GetType().GetProperty(obj.ID);
@@ -300,7 +320,7 @@ public partial class admin_follower_reg : MyWeb.config
ObjValue.SetValue(followers, null); ObjValue.SetValue(followers, null);
} }
} }
@@ -310,22 +330,60 @@ public partial class admin_follower_reg : MyWeb.config
followers.sex = sex.SelectedValue; followers.sex = sex.SelectedValue;
followers.blood = blood.SelectedValue; followers.blood = blood.SelectedValue;
followers.tab = tab.Value.Trim(','); followers.tab = tab.Value.Trim(',');
followers.admin_log = admin.info.u_id + " " + DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"); //followers.admin_log = admin.info.u_id + " " + DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss");
followers.follower_hash = encrypt.followerHash(followers.phone, followers.id_code); followers.follower_hash = encrypt.followerHash(followers.phone, followers.id_code);
// 如果啟用 search_keywords 功能,生成並更新 search_keywords // 如果啟用 search_keywords 功能,生成並更新 search_keywords
if (GlobalVariables.UseSearchKeywords) if (GlobalVariables.UseSearchKeywords)
{ {
followers.search_keywords = encrypt.GenerateSearchKeywords(followers); followers.search_keywords = encrypt.GenerateSearchKeywords(followers);
} }
_db.SaveChanges();
Model.admin_log admin_log = new Model.admin_log(); // 檢查是否有修改資料
admin_log.writeLog(admin.info.u_id, (int)Model.admin_log.Systems.Follower, (int)Model.admin_log.Status.Update, f_number.Text + u_name.Text); var entry = _db.Entry(followers);
this.isDataChanged = entry.CurrentValues.PropertyNames.Any(name =>
{
if (name == "admin_log" || name == "follower_hash")
return false;
Response.Redirect("index.aspx?page=" + Convert.ToString(Request["page"])); var originalVal = entry.OriginalValues[name]?.ToString();
var currentVal = entry.CurrentValues[name]?.ToString();
// 針對加密欄位進行特殊處理
bool isEncryptedField = (name == "phone" || name == "id_code");
if (isEncryptedField)
{
string originalPlain = !string.IsNullOrEmpty(originalVal) ? encrypt.DecryptAutoKey(originalVal) : "";
string currentPlain = !string.IsNullOrEmpty(currentVal) ? encrypt.DecryptAutoKey(currentVal) : "";
return originalPlain.Trim() != currentPlain.Trim();
}
return !object.Equals(originalVal, currentVal);
});
if (this.isDataChanged)
{
followers.admin_log = admin.info.u_id + " " + DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss");
}
else
{
entry.State = EntityState.Unchanged;
}
int isDataSaved = _db.SaveChanges();
if (isDataSaved > 0)
{
//L_msg.Type = alert_type.success;
//L_msg.Text = "修改成功";
Model.admin_log admin_log = new Model.admin_log();
admin_log.writeLog(admin.info.u_id, (int)Model.admin_log.Systems.Follower, (int)Model.admin_log.Status.Update, f_number.Text + u_name.Text);
Response.Redirect("index.aspx?dirty=1&page=" + Convert.ToString(Request["page"]));
}
else
{
Response.Redirect("index.aspx?page=" + Convert.ToString(Request["page"]));
}
} }
catch (Exception ex) catch (Exception ex)
{ {
@@ -339,7 +397,7 @@ public partial class admin_follower_reg : MyWeb.config
L_msg.Type = alert_type.danger; L_msg.Type = alert_type.danger;
L_msg.Text = "查無資料"; L_msg.Text = "查無資料";
} }
/* /*
if (chk_pro_num(f_number.Text, Val(Request["num"]))) if (chk_pro_num(f_number.Text, Val(Request["num"])))
{ {
} }
@@ -349,7 +407,7 @@ public partial class admin_follower_reg : MyWeb.config
L_msg.Text = "信眾編號重複"; L_msg.Text = "信眾編號重複";
} }
*/ */
} }
} }
#endregion #endregion
+32 -1
View File
@@ -85,7 +85,7 @@
<label for="u_gauth"><i class="mdi mdi-key-variant"></i> Google Authenticator 驗證碼</label> <label for="u_gauth"><i class="mdi mdi-key-variant"></i> Google Authenticator 驗證碼</label>
</div> </div>
<div class="mt-4 mb-0 d-grid gap-2"> <div class="mt-4 mb-0 d-grid gap-2">
<asp:LinkButton ID="Button1" runat="server" OnClick="Button1_Click" <asp:LinkButton ID="Button1" runat="server" OnClick="Button1_Click"
CssClass="btn btn-primary rounded-pill"> CssClass="btn btn-primary rounded-pill">
<i class="mdi mdi-login"></i> 登入</asp:LinkButton> <i class="mdi mdi-login"></i> 登入</asp:LinkButton>
<asp:LinkButton ID="DesignModeButton" runat="server" OnClick="DesignModeButton_Click" <asp:LinkButton ID="DesignModeButton" runat="server" OnClick="DesignModeButton_Click"
@@ -105,5 +105,36 @@
</div> </div>
</div> </div>
<!-- /.content_box --> <!-- /.content_box -->
<script>
document.addEventListener('DOMContentLoaded', function () {
var accountInput = document.getElementById('<%= u_id.ClientID %>');
var passwordInput = document.getElementById('<%= u_password.ClientID %>');
var chkInput = document.getElementById('<%= chknum.ClientID %>');
var btn = document.getElementById('<%= Button1.ClientID %>');
accountInput.addEventListener('keypress', function (e){
if (e.keyCode === 13) {
$("#<%= u_password.ClientID %>").focus();
return false;
}
})
passwordInput.addEventListener('keypress', function (e) {
if (e.keyCode === 13) {
$("#<%= chknum.ClientID %>").focus();
return false;
}
})
var triggerLogin = function (e) {
if (e.keyCode === 13) {
btn.click();
e.preventDefault();
return false;
}
};
if (chkInput) chkInput.addEventListener('keypress', triggerLogin);
});
</script>
</asp:Content> </asp:Content>
+67 -30
View File
@@ -101,14 +101,14 @@
</select> </select>
<label for="printMode" style="color: black">列印模式</label> <label for="printMode" style="color: black">列印模式</label>
</div> </div>
<div class="form-floating mb-3"> <%-- <div class="form-floating mb-3">
<input type="number" id="rosterLimit" onchange="Designer.changeRosterLimit()" class="form-control form-control-sm mb-2"> <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> <label class="small" for="rosterLimit" style="color: black;">正名上限</label>
</div> </div>
<div class="form-floating mb-3"> <div class="form-floating mb-3">
<input type="number" id="perpage" class="form-control form-control-sm mb-2"> <input type="number" id="perpage" class="form-control form-control-sm mb-2">
<label class="small" for="perpage" style="color: black;">每頁列印筆數</label> <label class="small" for="perpage" style="color: black;">每頁列印筆數</label>
</div> </div>--%>
<div class="row"> <div class="row">
<div class="col-6"> <div class="col-6">
<span class="btn btn-sm btn-outline-info w-100 mb-2" onclick="Designer.saveStyle()">存檔</span> <span class="btn btn-sm btn-outline-info w-100 mb-2" onclick="Designer.saveStyle()">存檔</span>
@@ -135,7 +135,7 @@
<label class="small" for="inp-size">字體大小 (pt)</label> <label class="small" for="inp-size">字體大小 (pt)</label>
</div> </div>
<div class="row "> <%-- <div class="row ">
<div class="col-6"> <div class="col-6">
<div class="form-floating mb-3"> <div class="form-floating mb-3">
<input type="number" id="2offset" class="form-control form-control-sm mb-2"> <input type="number" id="2offset" class="form-control form-control-sm mb-2">
@@ -163,7 +163,7 @@
<label class="small" for="breakLen">斷行字數</label> <label class="small" for="breakLen">斷行字數</label>
</div> </div>
</div> </div>
</div> </div>--%>
<div class="row"> <div class="row">
<div class="col-6"> <div class="col-6">
@@ -210,7 +210,19 @@
</div> </div>
</div> </div>
<div class="position-fixed top-50 start-50 p-3" style="z-index: 10001" >
<div id="liveToast" class="toast hide " role="alert" aria-live="assertive"
data-bs-delay="3000" aria-atomic="true"
style="color:white;background-color:dimgray;opacity:1;font-size:24px;">
<div class="toast-header">
<strong class="me-auto">提示訊息</strong>
<button type="button" class="btn-close" data-bs-dismiss="toast" aria-label="Close"></button>
</div>
<div class="toast-body" id="toast_body">
</div>
</div>
</div>
</asp:Content> </asp:Content>
@@ -235,6 +247,7 @@
tabletElements: [ tabletElements: [
], ],
orientation: "portrait", orientation: "portrait",
toast:null,
init() { init() {
//$(".tablet-element").draggable({}); //$(".tablet-element").draggable({});
this.getPaperSize(); this.getPaperSize();
@@ -247,13 +260,17 @@
$("#backendInp").append("<option value='" + x.name + "'>" + x.name + "</option>") $("#backendInp").append("<option value='" + x.name + "'>" + x.name + "</option>")
}); });
$("#paperOrientation").html("<span>直向</span>") $("#paperOrientation").html("<span>直向</span>")
this.toast = new bootstrap.Toast($('#liveToast'));
}, },
print() { print() {
let self = this;
let s = this.allStyle.find(x => x.styleID == this.styleID) let s = this.allStyle.find(x => x.styleID == this.styleID)
let size = this.allSize.find(x => x.id = s.paperSize) let size = this.allSize.find(x => x.id = s.paperSize)
let w = window.open('', '_blank'); let w = window.open('', '_blank');
if (!w) { if (!w) {
alert("請允許瀏覽器開啟彈出式視窗!");
$("#toast_body").html(`${"請允許瀏覽器開啟彈出式視窗!"}`)
self.toast.show();
return; return;
} }
@@ -345,15 +362,15 @@
} }
.ancestor-wrapper { // .ancestor-wrapper {
/* 重置為橫向流,這樣 column 才會是真正的上下堆疊 */ // /* 重置為橫向流,這樣 column 才會是真正的上下堆疊 */
writing-mode: horizontal-tb; // writing-mode: horizontal-tb;
display: flex; // display: flex;
flex-direction: column; // flex-direction: column;
align-items: center; /* 水平置中 */ // align-items: center; /* 水平置中 */
justify-content: center; // justify-content: flex-start;
width: fit-content; // width: fit-content;
} //}
.main-name { .main-name {
line-height: 1.2; line-height: 1.2;
@@ -586,7 +603,7 @@
if (paperSize == "newsize") { if (paperSize == "newsize") {
$("#sizeDiv").attr("style", "display:"); $("#sizeDiv").attr("style", "display:");
} else { } else {
console.log("paperSize:", paperSize); // console.log("paperSize:", paperSize);
let size = this.allSize.find(x => x.id == paperSize) let size = this.allSize.find(x => x.id == paperSize)
$(".tablet-paper").css({ $(".tablet-paper").css({
"background-color": "white", "background-color": "white",
@@ -607,7 +624,9 @@
.then(response => { .then(response => {
if (response.status == "200") { if (response.status == "200") {
if (response.data.result=="Y") { if (response.data.result=="Y") {
alert("ok");
$("#toast_body").html(`${"ok"}`)
self.toast.show();
} }
} }
}); });
@@ -690,7 +709,7 @@
// 2. 正名合併置中 // 2. 正名合併置中
else if (el.type === 'combined-center') { else if (el.type === 'combined-center') {
const parts = el.text.split('\n'); const parts = el.text.split('\n');
html = `<div class="ancestor-wrapper" > html = `<div class="ancestor-wrapper" style="width:${el.width}px !important;height:${el.height}px !important;" >
<span class="main-name" >${parts[0] || ''}</span> <span class="main-name" >${parts[0] || ''}</span>
<span class="sub-text">${parts[1] || ''}</span> <span class="sub-text">${parts[1] || ''}</span>
</div>`; </div>`;
@@ -807,13 +826,6 @@
"justify-content": "start", "justify-content": "start",
gap: "20px", gap: "20px",
}); });
//h.append(
// $(`<div class="name-group">${top.map(n => `<div class="roster-name" style="font-size:${size}pt">${n}</div>`).join('')}</div>`)
//)
//if (bot.length) h.append(`<div class="name-group">${bot.map(n => `<div class="roster-name" style="font-size:${size}pt">${n}</div>`).join('')}</div>`)
//h += `<div class="name-group">${top.map(n => `<div class="roster-name" style="font-size:${size}pt">${n}</div>`).join('')}</div>`;
///if (bot.length) h += `<div class="name-group">${bot.map(n => `<div class="roster-name" style="font-size:${size}pt">${n}</div>`).join('')}</div>`;
//return h + `</div>`;
h.append(this.renderNameGroups(top,el)); h.append(this.renderNameGroups(top,el));
if (bot.length) h.append(this.renderNameGroups(bot,el)); if (bot.length) h.append(this.renderNameGroups(bot,el));
return h return h
@@ -885,8 +897,8 @@
else if (key === '2offset') el.twoOffset = parseFloat(val); else if (key === '2offset') el.twoOffset = parseFloat(val);
else if (key === '3offset') el.threeOffset = parseFloat(val); else if (key === '3offset') el.threeOffset = parseFloat(val);
else if (key === '4offset') el.fourOffset = parseFloat(val); else if (key === '4offset') el.fourOffset = parseFloat(val);
else if (key === 'height') el.height = parseFloat(val);
else el[key] = val; else el[key] = val;
console.log("activeId:",this.activeId)
if (el.type == "roster") { if (el.type == "roster") {
const names = el.text.split('\n').filter(s => s.trim()); const names = el.text.split('\n').filter(s => s.trim());
@@ -894,13 +906,18 @@
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 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)); }).html(this.renderRoster(names.slice(0 * this.rosterLimit, (0 + 1) * this.rosterLimit), el));
} else if (el.type == "combined-center") { } else if (el.type == "combined-center") {
console.log("combined-center");
const parts = el.text.split('\n'); const parts = el.text.split('\n');
html = `<div class="ancestor-wrapper" > html = `<div class="ancestor-wrapper" style='width:${el.width}px !important;height:${el.height}px !important' >
<span class="main-name" >${parts[0] || ''}</span> <span class="main-name" >${parts[0] || ''}</span>
<span class="sub-text">${parts[1] || ''}</span> <span class="sub-text">${parts[1] || ''}</span>
</div>`; </div>`;
$(`.tablet-element[id="${this.activeId}"]`).css({ $(`.tablet-element[id="${this.activeId}"]`).css({
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 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(html); }).html(html);
} else if (this.activeId === "title1") { } else if (this.activeId === "title1") {
let names = el.text.split('\n').filter(s => s.trim()); let names = el.text.split('\n').filter(s => s.trim());
@@ -916,6 +933,24 @@
$(`.tablet-element[id="${this.activeId}"]`).css({ $(`.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: el.style.fontSize + 'pt', fontFamily: el.style.fontFamily, "z-index": 9999, visibility: el.style.visibility
}).html(html); }).html(html);
} else if (this.activeId==="righttitle") {
$(`.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,
width:el.width,height:el.height
}).text(el.text);
} else if (this.activeId === "lefttitle") {
$(`.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,
width: el.width, height: el.height
}).text(el.text);
} else if (this.activeId === "address") {
$(`.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,
width: el.width, height: el.height
}).text(el.text);
} else { } else {
$(`.tablet-element[id="${this.activeId}"]`).css({ $(`.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: el.style.fontSize + 'pt', fontFamily: el.style.fontFamily, "z-index": 9999, visibility: el.style.visibility
@@ -995,7 +1030,7 @@
}) })
}, },
async saveStyle() { async saveStyle() {
let self = this;
let detail = [ let detail = [
]; ];
@@ -1027,7 +1062,9 @@
.then(response => { .then(response => {
if (response.status == "200") { if (response.status == "200") {
if (response.data.result == "Y") { if (response.data.result == "Y") {
alert("ok");
$("#toast_body").html(`${"ok"}`)
self.toast.show();
} }
} }
}); });
+1 -1
View File
@@ -232,7 +232,7 @@
display: flex; display: flex;
flex-direction: column; flex-direction: column;
align-items: center; /* 水平置中 */ align-items: center; /* 水平置中 */
justify-content: center; justify-content: flex-start;
width: fit-content; width: fit-content;
} }
+1 -1
View File
@@ -8,7 +8,7 @@
<ul class="collapsible_item"> <ul class="collapsible_item">
<asp:Repeater ID="Repeater2" runat="server" OnItemDataBound="Repeater2_ItemDataBound"> <asp:Repeater ID="Repeater2" runat="server" OnItemDataBound="Repeater2_ItemDataBound">
<ItemTemplate> <ItemTemplate>
<li><a class="menu" href="<%#ResolveUrl(ValString(Eval("url"))) %>" <li><a class="menu" href="<%#ResolveUrl(ValString(Eval("url"))) %>"
target="<%#(ValString(Eval("target"))=="B"?"_blank":"_self") %>"><%#Eval("title") %></a></li> target="<%#(ValString(Eval("target"))=="B"?"_blank":"_self") %>"><%#Eval("title") %></a></li>
</ItemTemplate> </ItemTemplate>
</asp:Repeater> </asp:Repeater>
+233 -61
View File
@@ -14,17 +14,18 @@
<a @click="print_dialog.show=true" class="btn btn-outline-primary btn-print" target="_blank"> <a @click="print_dialog.show=true" class="btn btn-outline-primary btn-print" target="_blank">
<i class="mdi mdi-printer"></i>列印管理報表 <i class="mdi mdi-printer"></i>列印管理報表
</a> </a>
<div :style="data_table.list.length === 0 ? 'pointer-events: none; opacity: 0.5;' : ''" style="display:inline-block;">
<div class="dropdown d-inline-block"> <div class="dropdown d-inline-block">
<a class="btn btn-outline-primary btn-print dropdown-toggle" data-bs-toggle="dropdown" href="#" role="button" aria-expanded="false"><i class="mdi mdi-printer"></i>列印報名資料</a> <a class="btn btn-outline-primary btn-print dropdown-toggle" data-bs-toggle="dropdown" href="#" role="button" aria-expanded="false"><i class="mdi mdi-printer"></i>列印查詢資料</a>
<ul class="dropdown-menu ps-0 w-100" aria-labelledby="dropdownPrintLink"> <ul class="dropdown-menu ps-0 w-100" aria-labelledby="dropdownPrintLink">
<li><a @click="search.hasPrice='Y';goPrint()" class="dropdown-item"><i class="mdi mdi-printer me-1"></i>有金額</a></li> <li><a @click="search.hasPrice='Y';goPrint()" class="dropdown-item"><i class="mdi mdi-printer me-1"></i>有金額</a></li>
<li><a @click="search.hasPrice='N';goPrint()" class="dropdown-item"><i class="mdi mdi-printer me-1"></i>無金額</a></li> <li><a @click="search.hasPrice='N';goPrint()" class="dropdown-item"><i class="mdi mdi-printer me-1"></i>無金額</a></li>
</ul> </ul>
</div>
</div>
<div :style="data_table.list.length === 0 ? 'pointer-events: none; opacity: 0.5;' : ''" style="display:inline-block;">
<asp:LinkButton ID="excel" runat="server" CssClass="btn btn-outline-success" OnClick="excel_Click"><span class="fa-solid fa-file-excel"></span> 匯出查詢資料(Excel</asp:LinkButton>
</div> </div>
<asp:LinkButton ID="excel" runat="server" CssClass="btn btn-outline-success" OnClick="excel_Click"><span class="fa-solid fa-file-excel"></span> 匯出Excel</asp:LinkButton>
</div> </div>
</asp:Content> </asp:Content>
<asp:Content ID="Content5" ContentPlaceHolderID="footer_script" runat="Server"> <asp:Content ID="Content5" ContentPlaceHolderID="footer_script" runat="Server">
@@ -39,6 +40,8 @@
vuetify: new Vuetify(vuetify_options), vuetify: new Vuetify(vuetify_options),
data() { data() {
return { return {
print_error_msg: "",
isSearched: false,
this_act : '<%= Request["act_id"]%>', this_act : '<%= Request["act_id"]%>',
options: { multiSort: false }, options: { multiSort: false },
search_options: { multiSort: false }, search_options: { multiSort: false },
@@ -56,6 +59,7 @@
{ text: '報名日期', value: 'up_time' }, { text: '報名日期', value: 'up_time' },
{ text: '報名活動', value: 'subject', align: 'start' }, { text: '報名活動', value: 'subject', align: 'start' },
{ text: '單據狀態', value: 'keyin1_txt' }, { text: '單據狀態', value: 'keyin1_txt' },
{ text: '報到狀態', value: 'status' },
{ text: '', value: 'slot_btn', sortable: false, align: 'end' } { text: '', value: 'slot_btn', sortable: false, align: 'end' }
], ],
footer:{ footer:{
@@ -203,6 +207,10 @@
} }
}, },
mounted() { mounted() {
const printResult = document.getElementById('<%= hid_err_msg.ClientID %>').value;
document.getElementById('<%= hid_err_msg.ClientID %>').value = '';
window._printResult = printResult
this.detalKeyinArray(); this.detalKeyinArray();
this.search_dialog.current = this.search_dialog.controls.search1 ///default this.search_dialog.current = this.search_dialog.controls.search1 ///default
if (this.this_act != '') if (this.this_act != '')
@@ -211,20 +219,63 @@
this.initActivity(); this.initActivity();
const navEntries = performance.getEntriesByType("navigation"); const navEntries = performance.getEntriesByType("navigation");
const isReload = navEntries.length > 0 && navEntries[0].type === "reload"; const isReload = navEntries.length > 0 && navEntries[0].type === "reload";
if (isReload) { if (isReload) {
sessionStorage.removeItem("orderpage"); sessionStorage.removeItem("orderpage");
sessionStorage.removeItem("order_list_cache");
sessionStorage.removeItem("order_query_params");
}
else if ("<%=lastAddedNo%>" !== "") {
const newQuery = { order_no: '<%=lastAddedNo%>' };
sessionStorage.setItem('order_query_params', JSON.stringify(newQuery));
this.search = newQuery;
this.isSearched = true;
} }
else { else {
const savedPage = parseInt(sessionStorage.getItem('orderpage')); const savedPage = parseInt(sessionStorage.getItem('orderpage'));
const savedData = sessionStorage.getItem("order_list_cache");
const savedQuery = JSON.parse(sessionStorage.getItem("order_query_params"));
if (savedQuery) {
this.search = savedQuery;
this.isSearched = true;
}
if (savedPage) { if (savedPage) {
this.options.page = savedPage; this.options.page = savedPage;
} }
} if (savedData && savedData !== "undefined") {
this.data_table = JSON.parse(savedData);
this.isSearched = true;
}
}
if (printResult === 'nodata' || printResult === 'success') {
this.$nextTick(() => {
this.print_dialog.show = true;
if (printResult === 'nodata') {
this.print_error_msg = "查無資料,請重新選擇區間";
}
});
}
this.$nextTick(() => {
setTimeout(() => {
// 清空 URL
const cleanUrl = window.location.protocol + "//" + window.location.host + window.location.pathname;
window.history.replaceState({}, '', cleanUrl);
}, 100);
});
}, },
watch: { watch: {
options: { options: {
handler() { handler() {
this.getDefault() if (this.isSearched) {
this.getDefault()
}
else {
this.data_table.loading = false;
}
}, },
deep: true, deep: true,
}, },
@@ -236,6 +287,57 @@
}, },
}, },
methods: { methods: {
triggerManagementExport(mode) {
this.print_error_msg = "";
if (this.print_search.year == '') {
msgbox('請輸入年份');
return;
}
if (!this.print_search.chk_noact && !this.print_search.chk_hasact) {
msgbox('活動/非活動至少勾選一項');
return;
}
// 將 Vue 狀態同步至 ASP.NET HiddenField,供後端 PostBack 讀取參數
document.getElementById('<%= hid_print_mode.ClientID %>').value = this.print_conditions;
document.getElementById('<%= hid_print_year.ClientID %>').value = this.print_search.year;
if (this.print_conditions == 'mm')
document.getElementById('<%= hid_print_month.ClientID %>').value = this.print_search.month;
else if (this.print_conditions == 'ss')
document.getElementById('<%= hid_print_season.ClientID %>').value = this.print_search.season;
document.getElementById('<%= hid_select_act.ClientID %>').value = this.print_search.select_act;
document.getElementById('<%= hid_select_actitem.ClientID %>').value = this.print_search.select_actitem;
document.getElementById('<%= hid_chk_hasact.ClientID %>').value = this.print_search.chk_hasact;
document.getElementById('<%= hid_chk_noact.ClientID %>').value = this.print_search.chk_noact;
let qry = "";
Object.keys(this.print_search).forEach(key => {
if (this.print_search[key] != undefined && this.print_search[key] != null && this.print_search[key] != '') {
if (key == 'month' ) {
if (this.print_conditions == 'mm') {
qry += "&month=" + this.print_search.month;
}
} else if ( key == 'season')
{
if (this.print_conditions == 'ss') {
qry += "&season=" + this.print_search.season;
}
}
else {
qry += (qry != '' ? '&' : '?') + (key + '=' + this.print_search[key]);
}
}
});
document.getElementById('<%= hid_qry.ClientID %>').value = qry;
if (mode === 'print') {
document.getElementById('<%= print_management.ClientID %>').click();
}
else if (mode === "excel") {
document.getElementById('<%= excel_management.ClientID %>').click();
}
},
search_show(curr) { 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_dialog.current = curr;
@@ -321,19 +423,24 @@
this.data_table.list = response.data.list this.data_table.list = response.data.list
this.data_table.count = response.data.count; this.data_table.count = response.data.count;
this.data_table.loading = false this.data_table.loading = false
const dataToStore = JSON.stringify(this.data_table);
sessionStorage.setItem("order_list_cache", dataToStore);
}) })
.catch(error => console.log(error)) .catch(error => console.log(error))
}, },
detalKeyinArray() { detalKeyinArray() {
var getArray = <%=Newtonsoft.Json.JsonConvert.SerializeObject(_keyin1Item, Newtonsoft.Json.Formatting.Indented) %>; var getArray = <%=Newtonsoft.Json.JsonConvert.SerializeObject(_keyin1Item, Newtonsoft.Json.Formatting.Indented) %>;
var keys = Object.keys(getArray); if (getArray !== null) {
for (let i = 0; i < keys.length; i++) { var keys = Object.keys(getArray);
//console.log(`${keys[i]}:${getArray[keys[i]]}`); //value : text for (let i = 0; i < keys.length; i++) {
var _tmp = { //console.log(`${keys[i]}:${getArray[keys[i]]}`); //value : text
text: getArray[keys[i]], var _tmp = {
val: parseInt(keys[i]), text: getArray[keys[i]],
val: parseInt(keys[i]),
}
this.keyin1_items.push(_tmp);
} }
this.keyin1_items.push(_tmp);
} }
}, },
@@ -368,22 +475,28 @@
//} //}
//this.data_table.selected = []; //this.data_table.selected = [];
//this.data_table.count = this.data_table.list.length //this.data_table.count = this.data_table.list.length
location.reload(); //location.reload();
this.getDefault();
}) })
.catch(error => console.log(error)) .catch(error => console.log(error))
} }
}, },
btn_search() { btn_search() {
this.isSearched = true;
sessionStorage.setItem("order_query_params", JSON.stringify(this.search));
this.this_act = ''; this.this_act = '';
this.search.activity_num = ''; this.search.activity_num = '';
this.getDefault(true) this.getDefault(true)
bootstrap.Offcanvas.getInstance(document.getElementById("offcanvasRight")).hide()
}, },
btn_all() { btn_all() {
this.isSearched = false;
this.this_act = ''; this.this_act = '';
this.search.activity_num = ''; this.search.activity_num = '';
clearObjProps(this.search); clearObjProps(this.search);
this.btn_search() sessionStorage.setItem("order_query_params", JSON.stringify(this.search));
//this.btn_search()
}, },
checkInMsg(item) { checkInMsg(item) {
this.check_data.f_num = item.f_num; this.check_data.f_num = item.f_num;
@@ -392,39 +505,59 @@
this.check_data.activity_name = item.subject; this.check_data.activity_name = item.subject;
this.check_dialog.show = true; this.check_dialog.show = true;
}, },
checkIn() { checkIn(item) {
if (this.check_data.qty > 0 && this.check_data.status.val > 0) { var checkdata =
var chechdata = {
{ f_num: item.f_num,
f_num: this.check_data.f_num, activity_num: item.activity_num,
activity_num: this.check_data.activity_num, status: 1,
status: this.check_data.status.val, qty: 1,
qty: this.check_data.qty,
}
axios
.post(HTTP_HOST + 'api/activity/OrderCheckIn', chechdata)
.then(response => {
//清空
this.check_data.f_num = 0;
this.check_data.u_name = '';
this.check_data.activity_num = 0;
this.check_data.activity_name = '';
this.check_data.qty = 1;
this.check_data.status.text = '';
this.check_data.status.val = 1;
this.check_dialog.show = false;
msgtop('簽到成功')
})
.catch(
error => {
console.log(error)
msgtop('簽到失敗', 'error')
}
)
} else {
msgbox('報到資訊請填寫完整');
} }
console.log(checkdata)
axios
.post(HTTP_HOST + 'api/activity/OrderCheckIn', checkdata)
.then(response => {
msgtop('簽到成功');
this.getDefault();
})
.catch(
error => {
console.log(error)
msgtop('簽到失敗', 'error')
}
)
//if (this.check_data.qty > 0 && this.check_data.status.val > 0) {
// var chechdata =
// {
// f_num: this.check_data.f_num,
// activity_num: this.check_data.activity_num,
// status: this.check_data.status.val,
// qty: this.check_data.qty,
// }
// axios
// .post(HTTP_HOST + 'api/activity/OrderCheckIn', chechdata)
// .then(response => {
// //清空
// this.check_data.f_num = 0;
// this.check_data.u_name = '';
// this.check_data.activity_num = 0;
// this.check_data.activity_name = '';
// this.check_data.qty = 1;
// this.check_data.status.text = '';
// this.check_data.status.val = 1;
// this.check_dialog.show = false;
// msgtop('簽到成功')
// })
// .catch(
// error => {
// console.log(error)
// msgtop('簽到失敗', 'error')
// }
// )
//} else {
// msgbox('報到資訊請填寫完整');
//}
}, goPrint() { }, goPrint() {
let _qry = ""; let _qry = "";
Object.keys(this.search).forEach(key => { Object.keys(this.search).forEach(key => {
@@ -442,6 +575,7 @@
//列印管理報表 //列印管理報表
print_close() { print_close() {
this.print_dialog.show = false; this.print_dialog.show = false;
this.print_error_msg = "";
} }
, ,
initPrintSearch() { initPrintSearch() {
@@ -504,9 +638,9 @@
} }
} }
}); });
console.log(_qry);
this.print_dialog.show = false; this.print_dialog.show = false;
window.open("print.aspx" + _qry, '_blank'); //window.open("print.aspx" + _qry, '_blank');
} else { } else {
msgbox('活動/非活動至少勾選一項'); msgbox('活動/非活動至少勾選一項');
} }
@@ -537,7 +671,7 @@
initActivity() { initActivity() {
axios.get(HTTP_HOST + 'api/activity') axios.get(HTTP_HOST + 'api/activity')
.then(response => { .then(response => {
this.select_act_list = response.data this.select_act_list = response.data
}) })
.catch(error => { .catch(error => {
console.log(error) console.log(error)
@@ -556,10 +690,35 @@
$('#country2').val(''); $('#country2').val('');
VueApp.search.country2 = ''; VueApp.search.country2 = '';
}); });
$(document).ready(function () {
// 判斷是否彈出 search dialog
let hasSearchResult = sessionStorage.getItem("order_list_cache") !== null;
if (!hasSearchResult && window._printResult === '') {
let $btn = $("a[data-bs-target='#offcanvasRight'][href='#search_panel']");
$btn.click();
let el = document.getElementById('offcanvasRight');
let offcanvas = bootstrap.Offcanvas.getOrCreateInstance(el);
offcanvas.show();
}
});
</script> </script>
</asp:Content> </asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server"> <asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server">
<uc1:alert runat="server" ID="L_msg" Text="" /> <uc1:alert runat="server" ID="L_msg" Text="" />
<asp:HiddenField ID="hid_err_msg" runat="server" />
<asp:HiddenField ID="hid_print_year" runat="server" />
<asp:HiddenField ID="hid_print_month" runat="server" />
<asp:HiddenField ID="hid_print_season" runat="server" />
<asp:HiddenField ID="hid_print_mode" runat="server" />
<asp:HiddenField ID="hid_chk_hasact" runat="server" />
<asp:HiddenField ID="hid_chk_noact" runat="server" />
<asp:HiddenField ID="hid_select_act" runat="server" />
<asp:HiddenField ID="hid_select_actitem" runat="server" />
<asp:HiddenField ID="hid_qry" runat="server" />
<asp:LinkButton ID="print_management" runat="server" OnClick="export_Click" style="display:none;" />
<asp:LinkButton ID="excel_management" runat="server" OnClick="export_Click" style="display:none;" />
<div id="content" class="container-fluid"> <div id="content" class="container-fluid">
<v-data-table <v-data-table
v-model="data_table.selected" v-model="data_table.selected"
@@ -580,10 +739,13 @@
<template #item.up_time="{ item }" > <template #item.up_time="{ item }" >
{{ item.up_time|timeString('YYYY/MM/DD') }} {{ item.up_time|timeString('YYYY/MM/DD') }}
</template> </template>
<template #item.u_name="{ item }" > <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 }} {{ item.u_name }}
</template> </template>
<template #item.status="{ item }" >
<a v-if="item.f_num != null && item.activity_num != null && item.status == 0" @click="checkIn(item)" class="btn btn-outline-secondary btn-sm"><i class="mdi mdi-account"></i>報到</a>
<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 }"> <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> <a @click="deleteItem(item)" class="btn btn-outline-secondary btn-sm"><i class="mdi mdi-trash-can"></i>刪除</a>
@@ -692,7 +854,8 @@
item-text="text" item-text="text"
item-value="val" item-value="val"
v-model="print_search.month" v-model="print_search.month"
:items="select_items.month" :items="select_items.month"
eager
></v-select> ></v-select>
</v-col> </v-col>
<v-col :cols="2" class="pt-5" v-if="print_conditions=='ss' "> <v-col :cols="2" class="pt-5" v-if="print_conditions=='ss' ">
@@ -703,7 +866,8 @@
item-text="text" item-text="text"
item-value="val" item-value="val"
v-model="print_search.season" v-model="print_search.season"
:items="select_items.season" :items="select_items.season"
eager
></v-select> ></v-select>
</v-col> </v-col>
@@ -764,9 +928,17 @@
</v-row> </v-row>
</v-col>--%> </v-col>--%>
</v-row> </v-row>
<v-row>
<v-col>
<div v-if="print_error_msg" class="red--text mt-2 text-center" style="font-weight: bold;">
{{ print_error_msg }}
</div>
</v-col>
</v-row>
<v-row densee class="pt-3" > <v-row densee class="pt-3" >
<v-col :cols="12" class="pt-3 text-center" > <v-col :cols="12" class="pt-3 text-center" >
<v-btn class="ma-2" color="primary" dark @click="goPrint2" > 列印 </v-btn> <v-btn class="ma-2" color="primary" dark @click="triggerManagementExport('print')" > 列印 </v-btn>
<v-btn class="ma-2" color="primary" dark @click="triggerManagementExport('excel')"> 匯出 Excel </v-btn>
<v-btn class="ma-2" color="green" dark @click="print_close" > 取消 </v-btn> <v-btn class="ma-2" color="green" dark @click="print_close" > 取消 </v-btn>
</v-col> </v-col>
</v-row> </v-row>
+565 -26
View File
@@ -1,22 +1,28 @@
using System; using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;
using Newtonsoft.Json.Linq;
using System;
using System.Collections; using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using System.Configuration;
using System.Data; using System.Data;
using System.Data.OleDb; using System.Data.OleDb;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Web; using System.Web;
using System.Web.UI; using System.Web.UI;
using System.Web.UI.WebControls; using System.Web.UI.WebControls;
using System.Configuration; using static Model.admin_log;
using System.IO; using static regionController;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Spreadsheet;
using System.Linq;
public partial class admin_order_index : MyWeb.config public partial class admin_order_index : MyWeb.config
{ {
private Model.ezEntities _db = new Model.ezEntities(); private Model.ezEntities _db = new Model.ezEntities();
public Dictionary<int, string> _keyin1Item = null; public Dictionary<int, string> _keyin1Item = null;
protected string lastAddedNo;
protected void Page_Load(object sender, EventArgs e) protected void Page_Load(object sender, EventArgs e)
{ {
@@ -33,6 +39,13 @@ public partial class admin_order_index : MyWeb.config
} }
_keyin1Item = publicFun.enum_desc<Model.activity_check.keyin1>(); //狀態 _keyin1Item = publicFun.enum_desc<Model.activity_check.keyin1>(); //狀態
if (Session["LastAddedNo"] != null)
{
lastAddedNo = Session["LastAddedNo"].ToString();
Session.Remove("LastAddedNo");
}
BuildKind(); BuildKind();
} }
@@ -58,6 +71,452 @@ public partial class admin_order_index : MyWeb.config
#endregion #endregion
#region Excel #region Excel
protected void export_Click(object sender, EventArgs e)
{
LinkButton btn = sender as LinkButton;
if (btn == null) return;
bool isPrintMode = (btn.ID == "print_management");
bool isExcelMode = (btn.ID == "excel_management" || btn.ID == "excel");
//查詢要匯出的資料
string _query = ""; // 紀錄匯出條件
//var list = searchData(ref _query, isManagementMode);
if (isExcelMode)
{
int selYear = !string.IsNullOrEmpty(hid_print_year.Value) ? int.Parse(hid_print_year.Value) : 0;
int selMonth = !string.IsNullOrEmpty(hid_print_month.Value) ? int.Parse(hid_print_month.Value) : 0;
int selSeason = !string.IsNullOrEmpty(hid_print_season.Value) ? int.Parse(hid_print_season.Value) : 0;
string selMode = !string.IsNullOrEmpty(hid_print_mode.Value) ? hid_print_mode.Value : "";
bool chkHasAct = !string.IsNullOrEmpty(hid_chk_hasact.Value) && Convert.ToBoolean(hid_chk_hasact.Value);
bool chkNoAct = !string.IsNullOrEmpty(hid_chk_noact.Value) && Convert.ToBoolean(hid_chk_noact.Value);
int selAct = !string.IsNullOrEmpty(hid_select_act.Value) ? int.Parse(hid_select_act.Value) : 0;
int selActItem = !string.IsNullOrEmpty(hid_select_actitem.Value) ? int.Parse(hid_select_actitem.Value) : 0;
var qry = _db.pro_order.AsQueryable();
if (selYear > 0)
{
qry = qry.Where(o => o.up_time.HasValue && o.up_time.Value.Year == selYear);
_query += "年份:" + selYear + "\n";
}
if (selMode == "mm" && selMonth > 0)
{
qry = qry.Where(o => o.up_time.HasValue && o.up_time.Value.Month == selMonth);
_query += "月份:" + selMonth + "\n";
}
if (selMode == "ss" && selSeason > 0)
{
if (selSeason == 1)
{
qry = qry.Where(o => o.up_time.HasValue)
.Where(o => o.up_time.Value.Month == 1 || o.up_time.Value.Month == 2 || o.up_time.Value.Month == 3);
}
else if (selSeason == 2)
{
qry = qry.Where(o => o.up_time.HasValue)
.Where(o => o.up_time.Value.Month == 4 || o.up_time.Value.Month == 5 || o.up_time.Value.Month == 6);
}
else if (selSeason == 3)
{
qry = qry.Where(o => o.up_time.HasValue)
.Where(o => o.up_time.Value.Month == 7 || o.up_time.Value.Month == 8 || o.up_time.Value.Month == 9);
}
else if (selSeason == 4)
{
qry = qry.Where(o => o.up_time.HasValue)
.Where(o => o.up_time.Value.Month == 10 || o.up_time.Value.Month == 11 || o.up_time.Value.Month == 12);
}
_query += "季度:" + selSeason + "\n";
}
if (chkHasAct)
{
if(selAct > 0)
{
var actSubject = _db.activities.Where(a => a.num == selAct).Select(a => a.subject).FirstOrDefault();
_query += $"活動報名: {actSubject}\n";
}
else
{
_query += $"活動報名\n";
}
if (chkNoAct)
{
_query += "非活動報名\n";
if (selAct > 0)
qry = qry.Where(o => o.activity_num.HasValue && o.activity_num.Value == selAct);
}
else
{
qry = qry.Where(o => o.activity_num.HasValue);
if (selAct > 0)
qry = qry.Where(o => o.activity_num.Value == selAct);
}
}
else
{
if (chkNoAct)
{
qry = qry.Where(o => o.activity_num == null);
_query += "非活動報名\n";
}
}
if (selActItem > 0)
qry = qry.Where(o => o.pro_order_detail.Where(f2 => f2.actItem_num.HasValue && f2.actItem_num.Value == selActItem).Count() > 0);
if (selYear > 0)
qry = qry.OrderByDescending(o => o.activity != null ? o.activity.startDate_solar : null).ThenByDescending(o => o.up_time).ThenByDescending(o => o.order_no);
else
qry = qry.OrderByDescending(o => o.order_no);
MyWeb.encrypt encrypt = new MyWeb.encrypt();
var tdesc = publicFun.enum_desc<Model.pro_order.detailKeyin1>();
var bedDt = _db.bed_order_detail.AsQueryable();//掛單明細
//紀錄匯出條件
//var list = qry.ToList();
var list = qry.GroupJoin(
_db.pro_order_detail, o => o.order_no, p => p.order_no, (o, c) =>
new
{
//訂單資料
order_no = o.order_no,
up_time = o.up_time,
keyin1 = o.keyin1,
f_num = o.follower != null ? o.follower.u_name : "", //姓名/名稱
phone = o.phone,
activity_num = o.activity_num.HasValue ? o.activity.subject : "",
address = o.address,
demo = o.demo,
c
}).SelectMany(o => o.c.DefaultIfEmpty(), (o, d) => //SelectMany 展開
new
{
//訂單資料
order_no = o.order_no,
up_time = o.up_time,
keyin1 = o.keyin1,
f_num = o.f_num, //姓名/名稱
phone = o.phone,
activity_num = o.activity_num,
address = o.address,
demo = o.demo,
//訂單明細
//使用DefaultIfEmpty 因匿名型別無法輸出NULL(無法轉換成強型別),需特別注意Null的處理
d_actItem_num = d == null ? "" : (d.actItem_num.HasValue ? d.actItem.subject : ""), //項目名稱
d_category = d == null ? "" : (d.actItem_num.HasValue ? d.actItem.category.ToString() : ""),
d_f_num = d == null ? "" : (d.f_num.HasValue ? d.follower.u_name : ""), //姓名
d_address = d == null ? "" : d.address,
d_from_id = d == null ? "" : (d.from_id.HasValue ? d.follower1.u_name : ""), //陽上/報恩者
d_f_num_tablet = d == null ? "" : d.f_num_tablet,
d_start_date = d == null ? (DateTime?)null : d.start_date, //開始日期
d_due_date = d == null ? (DateTime?)null : d.due_date, //期滿日期
d_extend_date = d == null ? (DateTime?)null : d.extend_date, //應續約日
d_price = d == null ? (float?)null : d.price, //預設金額
d_qty = d == null ? "" : (d.qty.HasValue ? d.qty.Value.ToString() : "0"), //數量
d_writeBedQty = d == null ? 0 : bedDt.Where(b => (b.bed_order.o_detail_id.Value == d.num) && b.checkIn_date.HasValue && b.bed_kind_detail_id.HasValue).Count(), //已劃數量
d_notBedQty = d == null ? 0 : bedDt.Where(b => b.bed_order.o_detail_id.Value == d.num && (!b.checkIn_date.HasValue || !b.bed_kind_detail_id.HasValue)).Count(), //未劃數量
d_pay = d == null ? "" : (d.pay.HasValue ? d.pay.Value.ToString() : "0"), //已收金額
d_pay_date = d == null ? (DateTime?)null : d.start_date, //付款期限
d_keyin1 = d == null ? (int?)null : d.keyin1,
d_demo = d == null ? "" : d.demo, //狀態備註
}).ToList();
var memoryStream = new MemoryStream();
if (list.Count > 0)
{
using (var doc = SpreadsheetDocument.Create(memoryStream, SpreadsheetDocumentType.Workbook))
{
var wb = doc.AddWorkbookPart();
wb.Workbook = new Workbook();
var sheets = wb.Workbook.AppendChild(new Sheets());
//建立第一個頁籤
var ws = wb.AddNewPart<WorksheetPart>();
ws.Worksheet = new Worksheet();
sheets.Append(new Sheet()
{
Id = wb.GetIdOfPart(ws),
SheetId = 1,
Name = "報名"
});
//設定欄寬
var cu = new Columns();
cu.Append(
new Column { Min = 1, Max = 1, Width = 15, CustomWidth = true },
new Column { Min = 2, Max = 4, Width = 10, CustomWidth = true },
new Column { Min = 5, Max = 5, Width = 15, CustomWidth = true },
new Column { Min = 6, Max = 8, Width = 25, CustomWidth = true },
new Column { Min = 9, Max = 9, Width = 15, CustomWidth = true },
new Column { Min = 10, Max = 10, Width = 10, CustomWidth = true },
new Column { Min = 11, Max = 11, Width = 25, CustomWidth = true },
new Column { Min = 12, Max = 16, Width = 10, CustomWidth = true },
new Column { Min = 17, Max = 20, Width = 10, CustomWidth = true }
);
ws.Worksheet.Append(cu);
//建立資料頁
var sd = new SheetData();
ws.Worksheet.AppendChild(sd);
//第一列資料
var tr = new Row();
tr.Append(
new Cell() { CellValue = new CellValue("單號"), DataType = CellValues.String },
new Cell() { CellValue = new CellValue("報名日期"), DataType = CellValues.String },
new Cell() { CellValue = new CellValue("單據狀態"), DataType = CellValues.String },
new Cell() { CellValue = new CellValue("姓名/名稱"), DataType = CellValues.String },
new Cell() { CellValue = new CellValue("聯絡電話"), DataType = CellValues.String },
new Cell() { CellValue = new CellValue("報名活動"), DataType = CellValues.String },
new Cell() { CellValue = new CellValue("收件地址"), DataType = CellValues.String },
new Cell() { CellValue = new CellValue("備註"), DataType = CellValues.String },
new Cell() { CellValue = new CellValue("項目名稱"), DataType = CellValues.String },
new Cell() { CellValue = new CellValue("姓名"), DataType = CellValues.String },
new Cell() { CellValue = new CellValue("代表地址"), DataType = CellValues.String },
new Cell() { CellValue = new CellValue("標題"), DataType = CellValues.String },
new Cell() { CellValue = new CellValue("陽上/報恩者"), DataType = CellValues.String },
new Cell() { CellValue = new CellValue("開始日期"), DataType = CellValues.String },
new Cell() { CellValue = new CellValue("期滿日期"), DataType = CellValues.String },
new Cell() { CellValue = new CellValue("應續約日"), DataType = CellValues.String },
new Cell() { CellValue = new CellValue("劃位狀態"), DataType = CellValues.String },
new Cell() { CellValue = new CellValue("預設金額"), DataType = CellValues.String },
new Cell() { CellValue = new CellValue("數量"), DataType = CellValues.String },
new Cell() { CellValue = new CellValue("小計"), DataType = CellValues.String },
new Cell() { CellValue = new CellValue("已收金額"), DataType = CellValues.String },
new Cell() { CellValue = new CellValue("未收金額"), DataType = CellValues.String },
new Cell() { CellValue = new CellValue("付款期限"), DataType = CellValues.String },
new Cell() { CellValue = new CellValue("報名狀態"), DataType = CellValues.String },
new Cell() { CellValue = new CellValue("狀態備註"), DataType = CellValues.String }
);
sd.AppendChild(tr);
foreach (var item in list)
{
string midNamesResult = "";
string leftNamesResult = "";
string jsonString = item.d_f_num_tablet?.ToString() ?? "";
try
{
var jo = JObject.Parse(jsonString);
// 標題
var midList = jo["mid_items"]?
.Select(i => (string)i["fam_name"])
.Where(name => !string.IsNullOrEmpty(name))
.ToList();
if (midList != null && midList.Any())
{
midNamesResult = string.Join(", ", midList);
}
// 陽上
var leftList = jo["left_items"]?
.Select(i => (string)i["fam_name"])
.Where(name => !string.IsNullOrEmpty(name))
.ToList();
if (leftList != null && leftList.Any())
{
leftNamesResult = string.Join(", ", leftList);
}
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine($"JSON 解析失敗 (訂單:{item.order_no}): {ex.Message}");
}
//新增資料列
tr = new Row();
tr.Append(
new Cell() { CellValue = new CellValue(item.order_no), DataType = CellValues.String },
new Cell() { CellValue = new CellValue(item.up_time?.ToString("yyyy/MM/dd") ?? ""), DataType = CellValues.String },
new Cell() { CellValue = new CellValue(Model.pro_order.keyin1_value_to_text(item.keyin1)), DataType = CellValues.String },
new Cell() { CellValue = new CellValue(item.f_num), DataType = CellValues.String },
new Cell() { CellValue = new CellValue(encrypt.DecryptAutoKey(item.phone)), DataType = CellValues.String },
new Cell() { CellValue = new CellValue(item.activity_num), DataType = CellValues.String },
new Cell() { CellValue = new CellValue(item.address), DataType = CellValues.String },
new Cell() { CellValue = new CellValue(item.demo), DataType = CellValues.String },
new Cell() { CellValue = new CellValue(item.d_actItem_num), DataType = CellValues.String },
new Cell() { CellValue = new CellValue(item.d_f_num), DataType = CellValues.String },
new Cell() { CellValue = new CellValue(item.d_address), DataType = CellValues.String },
new Cell() { CellValue = new CellValue(midNamesResult), DataType = CellValues.String },
new Cell() { CellValue = new CellValue(leftNamesResult), DataType = CellValues.String },
//new Cell() { CellValue = new CellValue(item.d_from_id), DataType = CellValues.String },
new Cell() { CellValue = new CellValue(item.d_start_date?.ToString("yyyy/MM/dd") ?? ""), DataType = CellValues.String },
new Cell() { CellValue = new CellValue(item.d_due_date?.ToString("yyyy/MM/dd") ?? ""), DataType = CellValues.String },
new Cell() { CellValue = new CellValue(item.d_extend_date?.ToString("yyyy/MM/dd") ?? ""), DataType = CellValues.String },
new Cell() { CellValue = new CellValue((Val(item.d_category) == (int)Model.activity.category.Order) ? (item.d_notBedQty + "/" + item.d_writeBedQty) : ""), DataType = CellValues.String },
new Cell() { CellValue = new CellValue("$" + ValMoney(item.d_price)), DataType = CellValues.String },
new Cell() { CellValue = new CellValue(item.d_qty), DataType = CellValues.String },
new Cell() { CellValue = new CellValue("$" + ValMoney(ValFloat(item.d_price) * Val(item.d_qty))), DataType = CellValues.String },
new Cell() { CellValue = new CellValue("$" + ValMoney(item.d_pay)), DataType = CellValues.String },
new Cell() { CellValue = new CellValue("$" + ValMoney(ValFloat(item.d_price) * Val(item.d_qty) - ValFloat(item.d_pay))), DataType = CellValues.String },
new Cell() { CellValue = new CellValue(item.d_pay_date?.ToString("yyyy/MM/dd") ?? ""), DataType = CellValues.String },
new Cell() { CellValue = new CellValue(item.d_keyin1.HasValue ? tdesc[item.d_keyin1.Value] : ""), DataType = CellValues.String },
new Cell() { CellValue = new CellValue(item.d_demo), DataType = CellValues.String }
);
sd.AppendChild(tr);
}
//空一列
tr = new Row();
sd.AppendChild(tr);
//匯出資訊
string _data = "匯出時間 : " + DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss");
_data += " " + admin.info.u_id;
tr = new Row();
tr.Append(
new Cell() { CellValue = new CellValue(_data), DataType = CellValues.String }
);
sd.AppendChild(tr);
_data = "匯出條件 : " + (!isStrNull(_query) ? _query : "-");
tr = new Row();
tr.Append(
new Cell() { CellValue = new CellValue(_data), DataType = CellValues.String }
);
sd.AppendChild(tr);
Model.admin_log admin_log = new Model.admin_log();
admin_log.writeLog(admin.info.u_id, (int)Model.admin_log.Systems.Order, (int)Model.admin_log.Status.Excel, admin_log.LogViewBtn(list.Select(x => x.order_no).ToList()));
}
HttpContext.Current.Response.Clear();
HttpContext.Current.Response.AddHeader("content-disposition", "attachment; filename=報名.xlsx");
HttpContext.Current.Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
HttpContext.Current.Response.BinaryWrite(memoryStream.ToArray());
HttpContext.Current.Response.End();
hid_err_msg.Value = "success";
}
else
{
hid_err_msg.Value = "nodata";
}
}
else if (isPrintMode)
{
int selYear = !string.IsNullOrEmpty(hid_print_year.Value) ? int.Parse(hid_print_year.Value) : 0;
int selMonth = !string.IsNullOrEmpty(hid_print_month.Value) ? int.Parse(hid_print_month.Value) : 0;
int selSeason = !string.IsNullOrEmpty(hid_print_season.Value) ? int.Parse(hid_print_season.Value) : 0;
string selMode = !string.IsNullOrEmpty(hid_print_mode.Value) ? hid_print_mode.Value : "";
bool chkHasAct = !string.IsNullOrEmpty(hid_chk_hasact.Value) && Convert.ToBoolean(hid_chk_hasact.Value);
bool chkNoAct = !string.IsNullOrEmpty(hid_chk_noact.Value) && Convert.ToBoolean(hid_chk_noact.Value);
int selAct = !string.IsNullOrEmpty(hid_select_act.Value) ? int.Parse(hid_select_act.Value) : -1;
int selActItem = !string.IsNullOrEmpty(hid_select_actitem.Value) ? int.Parse(hid_select_actitem.Value) : -1;
string urlParams = !string.IsNullOrEmpty(hid_qry.Value) ? hid_qry.Value : "";
var qry = _db.pro_order.AsQueryable();
if (selYear > 0)
qry = qry.Where(o => o.up_time.HasValue && o.up_time.Value.Year == selYear);
if (selMode == "mm" && selMonth > 0)
qry = qry.Where(o => o.up_time.HasValue && o.up_time.Value.Month == selMonth);
else if (selMode == "ss" && selSeason > 0)
{
if (selSeason == 1)
qry = qry.Where(o => o.up_time.HasValue)
.Where(o => o.up_time.Value.Month == 1 || o.up_time.Value.Month == 2 || o.up_time.Value.Month == 3);
else if (selSeason == 2)
qry = qry.Where(o => o.up_time.HasValue)
.Where(o => o.up_time.Value.Month == 4 || o.up_time.Value.Month == 5 || o.up_time.Value.Month == 6);
else if (selSeason == 3)
qry = qry.Where(o => o.up_time.HasValue)
.Where(o => o.up_time.Value.Month == 7 || o.up_time.Value.Month == 8 || o.up_time.Value.Month == 9);
else if (selSeason == 4)
qry = qry.Where(o => o.up_time.HasValue)
.Where(o => o.up_time.Value.Month == 10 || o.up_time.Value.Month == 11 || o.up_time.Value.Month == 12);
}
if (chkHasAct)
{
if (chkNoAct)
{
if (selAct >= 0)
qry = qry.Where(o => o.activity_num.HasValue && o.activity_num.Value == selAct);
}
else
{
qry = qry.Where(o => o.activity_num.HasValue);
if (selAct >= 0)
qry = qry.Where(o => o.activity_num.Value == selAct);
}
}
else
{
if (chkNoAct)
qry = qry.Where(o => o.activity_num == null);
}
if (selActItem >= 0)
{
qry = qry.Where(o => o.pro_order_detail.Where(f2 => f2.actItem_num.HasValue && f2.actItem_num.Value == selActItem).Count() > 0);
}
var count = qry.Count();
if (count > 0)
{
hid_err_msg.Value = "success";
string script = $@"var otherWin = window.open('print.aspx{urlParams}', '列印報名資料', 'noopener,noreferrer');";
ScriptManager.RegisterStartupScript(this, GetType(), "ExecutePrint", script, true);
}
else
{
hid_err_msg.Value = "nodata";
}
//var qry = _db.followers.AsQueryable();
//if (selYear > 0)
//{
// urlParams += "&year=" + selYear;
//}
//if (selMode == "mm" && selMonth > 0)
//{
// urlParams += "&month=" + selMonth;
//}
//else if (selMode == "ss" && selSeason > 0)
//{
// urlParams += "&season=" + selSeason;
//}
//if (list.Count > 0)
//{
// hid_err_msg.Value = "success";
// hid_print_year.Value = selYear.ToString();
// hid_print_month.Value = selMonth.ToString();
// hid_print_season.Value = selSeason.ToString();
// hid_print_mode.Value = selMode;
// string script = $@"window.open('print.aspx?{urlParams}&mode={selMode}', '列印信眾資料');";
// ScriptManager.RegisterStartupScript(this, GetType(), "ExecutePrint", script, true);
//}
//else
//{
// hid_err_msg.Value = "nodata";
// string script = $@"
// var win = window.open('', '列印信眾資料');
// if (win) win.close()";
// ScriptManager.RegisterStartupScript(this, GetType(), "CancelPrint", script, true);
//}
}
}
protected void excel_Click(object sender, EventArgs e) protected void excel_Click(object sender, EventArgs e)
{ {
@@ -111,6 +570,7 @@ public partial class admin_order_index : MyWeb.config
new Cell() { CellValue = new CellValue("項目名稱"), DataType = CellValues.String }, new Cell() { CellValue = new CellValue("項目名稱"), DataType = CellValues.String },
new Cell() { CellValue = new CellValue("姓名"), DataType = CellValues.String }, new Cell() { CellValue = new CellValue("姓名"), DataType = CellValues.String },
new Cell() { CellValue = new CellValue("代表地址"), DataType = CellValues.String }, new Cell() { CellValue = new CellValue("代表地址"), DataType = CellValues.String },
new Cell() { CellValue = new CellValue("標題"), DataType = CellValues.String },
new Cell() { CellValue = new CellValue("陽上/報恩者"), DataType = CellValues.String }, new Cell() { CellValue = new CellValue("陽上/報恩者"), DataType = CellValues.String },
new Cell() { CellValue = new CellValue("開始日期"), DataType = CellValues.String }, new Cell() { CellValue = new CellValue("開始日期"), DataType = CellValues.String },
new Cell() { CellValue = new CellValue("期滿日期"), DataType = CellValues.String }, new Cell() { CellValue = new CellValue("期滿日期"), DataType = CellValues.String },
@@ -132,32 +592,57 @@ public partial class admin_order_index : MyWeb.config
// 改為整數陣列,避免後續查詢中使用 .ToString() // 改為整數陣列,避免後續查詢中使用 .ToString()
var aIDt = _db.actItems.Where(f => f.subject.Contains(s_actItemTxt.Value.Trim())).Select(f => f.num).ToArray();//品項 var aIDt = _db.actItems.Where(f => f.subject.Contains(s_actItemTxt.Value.Trim())).Select(f => f.num).ToArray();//品項
var qry = _db.pro_order.AsQueryable(); var qry = _db.pro_order.AsQueryable();
string _query = ""; // 紀錄匯出條件
if (!isStrNull(s_order_no.Value)) if (!isStrNull(s_order_no.Value))
{
_query += "單號:" + s_order_no.Value + "\n";
qry = qry.Where(o => o.order_no.Contains(s_order_no.Value.Trim())); qry = qry.Where(o => o.order_no.Contains(s_order_no.Value.Trim()));
}
if (!isStrNull(s_u_name.Value)) if (!isStrNull(s_u_name.Value))
{
_query += "姓名/名稱:" + s_u_name.Value + "\n";
qry = qry.Where(o => o.f_num.HasValue && o.follower.u_name.Contains(s_u_name.Value.Trim())); qry = qry.Where(o => o.f_num.HasValue && o.follower.u_name.Contains(s_u_name.Value.Trim()));
}
if (!isStrNull(s_introducerTxt.Value)) if (!isStrNull(s_introducerTxt.Value))
{
_query += "介紹人:" + s_introducerTxt.Value + "\n";
qry = qry.Where(o => o.f_num.HasValue && o.follower1.u_name.Contains(s_introducerTxt.Value.Trim())); qry = qry.Where(o => o.f_num.HasValue && o.follower1.u_name.Contains(s_introducerTxt.Value.Trim()));
}
if (!isStrNull(s_subject.Value)) if (!isStrNull(s_subject.Value))
{
_query += "報名活動:" + s_subject.Value + "\n";
qry = qry.Where(o => o.activity_num.HasValue && o.activity.subject.Contains(s_subject.Value.Trim())); qry = qry.Where(o => o.activity_num.HasValue && o.activity.subject.Contains(s_subject.Value.Trim()));
}
if (!isStrNull(s_actItemTxt.Value)) if (!isStrNull(s_actItemTxt.Value))
{ {
// ❌ 錯誤寫法: qry = qry.Where(o => o.pro_order_detail.Where(f2 => f2.order_no == o.order_no && aIDt.ToArray().Contains(f2.actItem_num.ToString())).Count() > 0); // ❌ 錯誤寫法: qry = qry.Where(o => o.pro_order_detail.Where(f2 => f2.order_no == o.order_no && aIDt.ToArray().Contains(f2.actItem_num.ToString())).Count() > 0);
// ✅ 實際比較:僅在 actItem_num 有值時才與整數陣列比對 // ✅ 實際比較:僅在 actItem_num 有值時才與整數陣列比對
_query += "品項:" + s_actItemTxt.Value + "\n";
qry = qry.Where(o => o.pro_order_detail.Any(f2 => qry = qry.Where(o => o.pro_order_detail.Any(f2 =>
f2.order_no == o.order_no && f2.order_no == o.order_no &&
f2.actItem_num.HasValue && f2.actItem_num.HasValue &&
aIDt.Contains(f2.actItem_num.Value))); aIDt.Contains(f2.actItem_num.Value)));
} }
if (!isStrNull(s_keyin1.SelectedValue)) if (!isStrNull(s_keyin1.SelectedValue))
{
_query += $"單據狀態:{Model.pro_order.keyin1_value_to_text(s_keyin1.SelectedValue)}\n";
qry = qry.Where(o => o.keyin1 == s_keyin1.SelectedValue); qry = qry.Where(o => o.keyin1 == s_keyin1.SelectedValue);
}
if (!isStrNull(s_up_time1.Value) && isDate(s_up_time1.Value)) if (!isStrNull(s_up_time1.Value) && isDate(s_up_time1.Value))
qry = qry.Where(o => o.up_time >= ValDate(s_up_time1.Value)); {
_query += "報名日期(起):" + s_up_time1.Value.Trim() + "\n";
var tmp_s_up_time1 = ValDate(s_up_time1.Value);
qry = qry.Where(o => o.up_time >= tmp_s_up_time1);
}
if (!isStrNull(s_up_time2.Value) && isDate(s_up_time2.Value)) if (!isStrNull(s_up_time2.Value) && isDate(s_up_time2.Value))
qry = qry.Where(o => o.up_time < Convert.ToDateTime(s_up_time2.Value).AddDays(1)); {
_query += "報名日期(訖):" + s_up_time2.Value.Trim() + "\n";
var tmp_s_up_time2 = Convert.ToDateTime(s_up_time2.Value).AddDays(1);
qry = qry.Where(o => o.up_time < tmp_s_up_time2);
}
qry = qry.OrderByDescending(o => o.reg_time); qry = qry.OrderByDescending(o => o.reg_time);
MyWeb.encrypt encrypt = new MyWeb.encrypt(); MyWeb.encrypt encrypt = new MyWeb.encrypt();
@@ -198,20 +683,21 @@ public partial class admin_order_index : MyWeb.config
//訂單明細 //訂單明細
//使用DefaultIfEmpty 因匿名型別無法輸出NULL(無法轉換成強型別),需特別注意Null的處理 //使用DefaultIfEmpty 因匿名型別無法輸出NULL(無法轉換成強型別),需特別注意Null的處理
d_actItem_num = d == null ? "" : (d.actItem_num.HasValue ? d.actItem.subject : ""), //項目名稱 d_actItem_num = d == null ? "" : (d.actItem_num.HasValue ? d.actItem.subject : ""), //項目名稱
d_category = d == null ? "" : (d.actItem_num.HasValue ? d.actItem.category.ToString() : ""), d_category = d == null ? "" : (d.actItem_num.HasValue ? d.actItem.category.ToString() : ""),
d_f_num = d == null ? "" : (d.f_num.HasValue ? d.follower.u_name : ""), //姓名 d_f_num = d == null ? "" : (d.f_num.HasValue ? d.follower.u_name : ""), //姓名
d_address = d == null ? "" : d.address, d_address = d == null ? "" : d.address,
d_from_id = d == null ? "" : (d.from_id.HasValue ? d.follower1.u_name : ""), //陽上/報恩者 d_from_id = d == null ? "" : (d.from_id.HasValue ? d.follower1.u_name : ""), //陽上/報恩者
d_start_date = d == null ? "" : (d.start_date.HasValue ? d.start_date.Value.ToString("yyyy/MM/dd") : ""), //開始日期 d_f_num_tablet = d == null ? "" : d.f_num_tablet,
d_due_date = d == null ? "" : (d.due_date.HasValue ? d.due_date.Value.ToString("yyyy/MM/dd") : ""), //期滿日期 d_start_date = d == null ? (DateTime?)null : d.start_date, //開始日期
d_extend_date = d == null ? "" : (d.extend_date.HasValue ? d.extend_date.Value.ToString("yyyy/MM/dd") : ""), //應續約日 d_due_date = d == null ? (DateTime?)null : d.due_date, //期滿日期
d_price = d == null ? "" : (d.price.HasValue ? d.price.Value.ToString() : "0"), //預設金額 d_extend_date = d == null ? (DateTime?)null : d.extend_date, //應續約日
d_price = d == null ? (float?)null : d.price, //預設金額
d_qty = d == null ? "" : (d.qty.HasValue ? d.qty.Value.ToString() : "0"), //數量 d_qty = d == null ? "" : (d.qty.HasValue ? d.qty.Value.ToString() : "0"), //數量
d_writeBedQty = d == null ? 0 : bedDt.Where(b =>( b.bed_order.o_detail_id.Value == d.num) && b.checkIn_date.HasValue && b.bed_kind_detail_id.HasValue).Count(), //已劃數量 d_writeBedQty = d == null ? 0 : bedDt.Where(b => (b.bed_order.o_detail_id.Value == d.num) && b.checkIn_date.HasValue && b.bed_kind_detail_id.HasValue).Count(), //已劃數量
d_notBedQty = d == null ? 0 : bedDt.Where(b => b.bed_order.o_detail_id.Value == d.num && (!b.checkIn_date.HasValue || !b.bed_kind_detail_id.HasValue)).Count(), //未劃數量 d_notBedQty = d == null ? 0 : bedDt.Where(b => b.bed_order.o_detail_id.Value == d.num && (!b.checkIn_date.HasValue || !b.bed_kind_detail_id.HasValue)).Count(), //未劃數量
d_pay = d == null ? "" : (d.pay.HasValue ? d.pay.Value.ToString() : "0"), //已收金額 d_pay = d == null ? "" : (d.pay.HasValue ? d.pay.Value.ToString() : "0"), //已收金額
d_pay_date = d == null ? "" : (d.pay_date.HasValue ? d.pay_date.Value.ToString("yyyy/MM/dd") : ""), //付款期限 d_pay_date = d == null ? (DateTime?)null : d.start_date, //付款期限
d_keyin1 = d == null ? "" : (d.keyin1.HasValue&& d.keyin1.Value>0 ? tdesc[d.keyin1 ?? 1] : ""), //報名狀態 d_keyin1 = d == null ? (int?)null : d.keyin1,
d_demo = d == null ? "" : d.demo, //狀態備註 d_demo = d == null ? "" : d.demo, //狀態備註
}).ToList(); }).ToList();
@@ -259,11 +745,43 @@ public partial class admin_order_index : MyWeb.config
{ {
foreach (var item in list) foreach (var item in list)
{ {
string midNamesResult = "";
string leftNamesResult = "";
string jsonString = item.d_f_num_tablet?.ToString() ?? "";
try
{
var jo = JObject.Parse(jsonString);
// 標題
var midList = jo["mid_items"]?
.Select(i => (string)i["fam_name"])
.Where(name => !string.IsNullOrEmpty(name))
.ToList();
if (midList != null && midList.Any())
{
midNamesResult = string.Join(", ", midList);
}
// 陽上
var leftList = jo["left_items"]?
.Select(i => (string)i["fam_name"])
.Where(name => !string.IsNullOrEmpty(name))
.ToList();
if (leftList != null && leftList.Any())
{
leftNamesResult = string.Join(", ", leftList);
}
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine($"JSON 解析失敗 (訂單:{item.order_no}): {ex.Message}");
}
//新增資料列 //新增資料列
tr = new Row(); tr = new Row();
tr.Append( tr.Append(
new Cell() { CellValue = new CellValue(item.order_no), DataType = CellValues.String }, new Cell() { CellValue = new CellValue(item.order_no), DataType = CellValues.String },
new Cell() { CellValue = new CellValue(item.up_time.Value.ToString("yyyy/MM/dd")), DataType = CellValues.String }, new Cell() { CellValue = new CellValue(item.up_time?.ToString("yyyy/MM/dd") ?? ""), DataType = CellValues.String },
new Cell() { CellValue = new CellValue(Model.pro_order.keyin1_value_to_text(item.keyin1)), DataType = CellValues.String }, new Cell() { CellValue = new CellValue(Model.pro_order.keyin1_value_to_text(item.keyin1)), DataType = CellValues.String },
new Cell() { CellValue = new CellValue(item.f_num), DataType = CellValues.String }, new Cell() { CellValue = new CellValue(item.f_num), DataType = CellValues.String },
new Cell() { CellValue = new CellValue(encrypt.DecryptAutoKey(item.phone)), DataType = CellValues.String }, new Cell() { CellValue = new CellValue(encrypt.DecryptAutoKey(item.phone)), DataType = CellValues.String },
@@ -274,23 +792,44 @@ public partial class admin_order_index : MyWeb.config
new Cell() { CellValue = new CellValue(item.d_actItem_num), DataType = CellValues.String }, new Cell() { CellValue = new CellValue(item.d_actItem_num), DataType = CellValues.String },
new Cell() { CellValue = new CellValue(item.d_f_num), DataType = CellValues.String }, new Cell() { CellValue = new CellValue(item.d_f_num), DataType = CellValues.String },
new Cell() { CellValue = new CellValue(item.d_address), DataType = CellValues.String }, new Cell() { CellValue = new CellValue(item.d_address), DataType = CellValues.String },
new Cell() { CellValue = new CellValue(item.d_from_id), DataType = CellValues.String }, new Cell() { CellValue = new CellValue(midNamesResult), DataType = CellValues.String },
new Cell() { CellValue = new CellValue(item.d_start_date), DataType = CellValues.String }, new Cell() { CellValue = new CellValue(leftNamesResult), DataType = CellValues.String },
new Cell() { CellValue = new CellValue(item.d_due_date), DataType = CellValues.String }, //new Cell() { CellValue = new CellValue(item.d_from_id), DataType = CellValues.String },
new Cell() { CellValue = new CellValue(item.d_extend_date), DataType = CellValues.String }, new Cell() { CellValue = new CellValue(item.d_start_date?.ToString("yyyy/MM/dd") ?? ""), DataType = CellValues.String },
new Cell() { CellValue = new CellValue((Val(item.d_category) ==(int)Model.activity.category.Order) ?( item.d_notBedQty +"/" + item.d_writeBedQty):""), DataType = CellValues.String }, new Cell() { CellValue = new CellValue(item.d_due_date?.ToString("yyyy/MM/dd") ?? ""), DataType = CellValues.String },
new Cell() { CellValue = new CellValue(item.d_extend_date?.ToString("yyyy/MM/dd") ?? ""), DataType = CellValues.String },
new Cell() { CellValue = new CellValue((Val(item.d_category) == (int)Model.activity.category.Order) ? (item.d_notBedQty + "/" + item.d_writeBedQty) : ""), DataType = CellValues.String },
new Cell() { CellValue = new CellValue("$" + ValMoney(item.d_price)), DataType = CellValues.String }, new Cell() { CellValue = new CellValue("$" + ValMoney(item.d_price)), DataType = CellValues.String },
new Cell() { CellValue = new CellValue(item.d_qty), DataType = CellValues.String }, new Cell() { CellValue = new CellValue(item.d_qty), DataType = CellValues.String },
new Cell() { CellValue = new CellValue("$" + ValMoney(ValFloat(item.d_price) * Val(item.d_qty))), DataType = CellValues.String }, new Cell() { CellValue = new CellValue("$" + ValMoney(ValFloat(item.d_price) * Val(item.d_qty))), DataType = CellValues.String },
new Cell() { CellValue = new CellValue("$" + ValMoney(item.d_pay)), DataType = CellValues.String }, new Cell() { CellValue = new CellValue("$" + ValMoney(item.d_pay)), DataType = CellValues.String },
new Cell() { CellValue = new CellValue("$" + ValMoney(ValFloat(item.d_price) * Val(item.d_qty) - ValFloat(item.d_pay))), DataType = CellValues.String }, new Cell() { CellValue = new CellValue("$" + ValMoney(ValFloat(item.d_price) * Val(item.d_qty) - ValFloat(item.d_pay))), DataType = CellValues.String },
new Cell() { CellValue = new CellValue(item.d_pay_date), DataType = CellValues.String }, new Cell() { CellValue = new CellValue(item.d_pay_date?.ToString("yyyy/MM/dd") ?? ""), DataType = CellValues.String },
new Cell() { CellValue = new CellValue(item.d_keyin1), DataType = CellValues.String }, new Cell() { CellValue = new CellValue(item.d_keyin1.HasValue ? tdesc[item.d_keyin1.Value] : ""), DataType = CellValues.String },
new Cell() { CellValue = new CellValue(item.d_demo), DataType = CellValues.String } new Cell() { CellValue = new CellValue(item.d_demo), DataType = CellValues.String }
); );
sd.AppendChild(tr); sd.AppendChild(tr);
} }
//空一列
tr = new Row();
sd.AppendChild(tr);
//匯出資訊
string _data = "匯出時間 : " + DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss");
_data += " " + admin.info.u_id;
tr = new Row();
tr.Append(
new Cell() { CellValue = new CellValue(_data), DataType = CellValues.String }
);
sd.AppendChild(tr);
_data = "匯出條件 : " + (!isStrNull(_query) ? _query : "-");
tr = new Row();
tr.Append(
new Cell() { CellValue = new CellValue(_data), DataType = CellValues.String }
);
sd.AppendChild(tr);
Model.admin_log admin_log = new Model.admin_log(); Model.admin_log admin_log = new Model.admin_log();
admin_log.writeLog(admin.info.u_id, (int)Model.admin_log.Systems.Order, (int)Model.admin_log.Status.Excel, admin_log.LogViewBtn(list.Select(x => x.order_no).ToList())); admin_log.writeLog(admin.info.u_id, (int)Model.admin_log.Systems.Order, (int)Model.admin_log.Status.Excel, admin_log.LogViewBtn(list.Select(x => x.order_no).ToList()));
+2 -2
View File
@@ -41,7 +41,7 @@
{ text: '活動名稱​', value: 'subject', }, { text: '活動名稱​', value: 'subject', },
{ text: '報到日期​', value: 'reg_time_date', }, { text: '報到日期​', value: 'reg_time_date', },
{ text: '報到時間​', value: 'reg_time_time' }, { text: '報到時間​', value: 'reg_time_time' },
{ text: '姓名(人數)', value: 'qty' }, { text: '姓名', value: 'qty' },
{ text: '狀態', value: 'statusTxt' }, { text: '狀態', value: 'statusTxt' },
{ text: '', value: 'slot_btn', sortable: false, align: 'end' } { text: '', value: 'slot_btn', sortable: false, align: 'end' }
@@ -199,7 +199,7 @@
{{item.reg_time |timeString('HH:mm:ss') }} {{item.reg_time |timeString('HH:mm:ss') }}
</template> </template>
<template #item.qty="{ item }" > <template #item.qty="{ item }" >
{{item.u_name }}({{item.qty }}) {{item.u_name }}
</template> </template>
+6 -13
View File
@@ -144,13 +144,10 @@
<tbody> <tbody>
<tr> <tr>
<th>項目名稱</th> <th>項目名稱</th>
<th class="nowarp">姓名</th> <th class="nowarp">陽上</th>
<th>代表地址</th> <th class="nowarp">標題</th>
<th class="nowarp">陽上/報恩</th>
<th class="fit">開始日</th> <th class="fit">開始日</th>
<th class="fit">期滿日</th> <th class="fit">期滿日</th>
<th class="fit">延續日</th>
<th class="fit">劃位</th>
<asp:PlaceHolder ID="PlaceHolder2" runat="server"> <asp:PlaceHolder ID="PlaceHolder2" runat="server">
<th class="fit">功德金</th> <th class="fit">功德金</th>
<th class="fit">數量</th> <th class="fit">數量</th>
@@ -167,18 +164,14 @@
<td> <td>
<asp:Literal ID="actitem_numTxt" runat="server"></asp:Literal></td> <asp:Literal ID="actitem_numTxt" runat="server"></asp:Literal></td>
<td class="nowarp"> <td class="nowarp">
<asp:Literal ID="f_numTxt" runat="server"></asp:Literal></td> <asp:Literal ID="left_nameTxt" runat="server"></asp:Literal></td>
<td><%# Eval("address") %></td>
<td class="nowarp"> <td class="nowarp">
<asp:Literal ID="from_idTxt" runat="server"></asp:Literal></td> <asp:Literal ID="mid_nameTxt" runat="server"></asp:Literal></td>
<td class="fit"><%# Eval("start_date") != null? Convert.ToDateTime( Eval("start_date")).ToString("yyyy/MM/dd") : "" %></td> <td class="fit"><%# Eval("start_date") != null? Convert.ToDateTime( Eval("start_date")).ToString("yyyy/MM/dd") : "" %></td>
<td class="fit"> <td class="fit">
<asp:Literal ID="due_date" runat="server"></asp:Literal></td> <asp:Literal ID="due_date" runat="server"></asp:Literal></td>
<td class="fit">
<asp:Literal ID="extend_date" runat="server"></asp:Literal></td>
<td class="fit">
<asp:Literal ID="BedQty" runat="server"></asp:Literal></td>
<asp:PlaceHolder ID="PlaceHolder2" runat="server"> <asp:PlaceHolder ID="PlaceHolder2" runat="server">
<td class="fit text-end"> <td class="fit text-end">
<asp:Literal ID="item_price" runat="server" Text='<%# Eval("price") %>'></asp:Literal></td> <asp:Literal ID="item_price" runat="server" Text='<%# Eval("price") %>'></asp:Literal></td>
+83 -25
View File
@@ -1,9 +1,15 @@
using DocumentFormat.OpenXml.Drawing.Charts; using DocumentFormat.OpenXml.Drawing.Charts;
using DocumentFormat.OpenXml.Vml.Office; using DocumentFormat.OpenXml.Vml.Office;
using Microsoft.Ajax.Utilities;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using OfficeOpenXml.FormulaParsing.Excel.Functions.Text;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics;
using System.Linq; using System.Linq;
using System.Web; using System.Web;
using System.Web.Helpers;
using System.Web.UI; using System.Web.UI;
using System.Web.UI.WebControls; using System.Web.UI.WebControls;
@@ -182,8 +188,20 @@ public partial class admin_follower_print_ : System.Web.UI.Page
if (!string.IsNullOrEmpty(_chkHasAct) && Convert.ToBoolean(_chkHasAct)) if (!string.IsNullOrEmpty(_chkHasAct) && Convert.ToBoolean(_chkHasAct))
{ {
_query += "活動報名\n"; if (!string.IsNullOrEmpty(_selectAct))
{
int selectAct = Convert.ToInt32(_selectAct);
if (selectAct > 0)
{
var actSubject = _db.activities.Where(a => a.num == selectAct).Select(a => a.subject).FirstOrDefault();
_query += $"活動報名: {actSubject}\n";
}
}
else
{
_query += $"活動報名\n";
}
if (!string.IsNullOrEmpty(_chkNoAct) && Convert.ToBoolean(_chkNoAct)) if (!string.IsNullOrEmpty(_chkNoAct) && Convert.ToBoolean(_chkNoAct))
{ {
_query += "非活動報名\n"; _query += "非活動報名\n";
@@ -200,7 +218,7 @@ public partial class admin_follower_print_ : System.Web.UI.Page
else else
{ {
qry = qry.Where(o => o.activity_num.HasValue); qry = qry.Where(o => o.activity_num.HasValue);
if (!string.IsNullOrEmpty(_selectAct)) if (!string.IsNullOrEmpty(_selectAct))
{ {
int selectAct = Convert.ToInt32(_selectAct); int selectAct = Convert.ToInt32(_selectAct);
@@ -404,16 +422,56 @@ public partial class admin_follower_print_ : System.Web.UI.Page
actitem_numTxt.Text = row.actItem_num.HasValue && row.actItem != null ? row.actItem.subject : ""; actitem_numTxt.Text = row.actItem_num.HasValue && row.actItem != null ? row.actItem.subject : "";
} }
Literal fNumTxtLit = (Literal)e.Item.FindControl("f_numTxt"); //Literal fNumTxtLit = (Literal)e.Item.FindControl("f_numTxt");
if (fNumTxtLit != null) //if (fNumTxtLit != null)
{ //{
fNumTxtLit.Text = row.f_num.HasValue && row.follower != null ? row.follower.u_name : ""; // fNumTxtLit.Text = row.f_num.HasValue && row.follower != null ? row.follower.u_name : "";
} //}
Literal fromIdTxtLit = (Literal)e.Item.FindControl("from_idTxt"); string jsonString = row.f_num_tablet?.ToString() ?? "";
if (fromIdTxtLit != null) if (!string.IsNullOrWhiteSpace(jsonString))
{ {
fromIdTxtLit.Text = row.from_id.HasValue && row.follower1 != null ? row.follower1.u_name : ""; var jo = JObject.Parse(jsonString);
List<string> allMidNames = new List<string>();
List<string> allLeftNames = new List<string>();
// 標題
var midNames = jo["mid_items"]?
.Select(item => (string)item["fam_name"])
.ToList();
if (midNames != null && midNames.Any())
{
allMidNames.AddRange(midNames);
}
if (allMidNames.Any())
{
Literal midNameTextLit = (Literal)e.Item.FindControl("mid_nameTxt");
if (midNameTextLit != null)
{
midNameTextLit.Text = string.Join(", ", allMidNames);
}
}
// 陽上
var leftNames = jo["left_items"]?
.Select(item => (string)item["fam_name"])
.ToList();
if (leftNames != null && leftNames.Any())
{
allLeftNames.AddRange(leftNames);
}
if (allLeftNames.Any())
{
Literal leftNameTextLit = (Literal)e.Item.FindControl("left_nameTxt");
if (leftNameTextLit != null)
{
leftNameTextLit.Text = string.Join(", ", allLeftNames);
}
}
} }
Literal dueDateLit = (Literal)e.Item.FindControl("due_date"); Literal dueDateLit = (Literal)e.Item.FindControl("due_date");
@@ -422,21 +480,21 @@ public partial class admin_follower_print_ : System.Web.UI.Page
dueDateLit.Text = row.due_date.HasValue ? row.due_date.Value.ToString("yyyy-MM-dd") : ""; dueDateLit.Text = row.due_date.HasValue ? row.due_date.Value.ToString("yyyy-MM-dd") : "";
} }
Literal extendDateLit = (Literal)e.Item.FindControl("extend_date"); //Literal extendDateLit = (Literal)e.Item.FindControl("extend_date");
if (extendDateLit != null) //if (extendDateLit != null)
{ //{
extendDateLit.Text = row.extend_date.HasValue ? row.extend_date.Value.ToString("yyyy-MM-dd") : ""; // extendDateLit.Text = row.extend_date.HasValue ? row.extend_date.Value.ToString("yyyy-MM-dd") : "";
} //}
//劃位狀態 ////劃位狀態
int writeBedQty = _bedDt.Where(b => b.bed_order != null && b.bed_order.o_detail_id == row.num && b.checkIn_date.HasValue && b.bed_kind_detail_id.HasValue).Count(); //int writeBedQty = _bedDt.Where(b => b.bed_order != null && b.bed_order.o_detail_id == row.num && b.checkIn_date.HasValue && b.bed_kind_detail_id.HasValue).Count();
int notBedQty = _bedDt.Where(b => b.bed_order != null && b.bed_order.o_detail_id == row.num && (!b.checkIn_date.HasValue || !b.bed_kind_detail_id.HasValue)).Count(); //int notBedQty = _bedDt.Where(b => b.bed_order != null && b.bed_order.o_detail_id == row.num && (!b.checkIn_date.HasValue || !b.bed_kind_detail_id.HasValue)).Count();
Literal bedQtyLit = (Literal)e.Item.FindControl("BedQty"); //Literal bedQtyLit = (Literal)e.Item.FindControl("BedQty");
if (bedQtyLit != null) //if (bedQtyLit != null)
{ //{
bedQtyLit.Text = (row.actItem != null && row.actItem.category.HasValue && Convert.ToInt32(row.actItem.category.Value) == (int)Model.activity.category.Order) ? (notBedQty + "/" + writeBedQty) : ""; // bedQtyLit.Text = (row.actItem != null && row.actItem.category.HasValue && Convert.ToInt32(row.actItem.category.Value) == (int)Model.activity.category.Order) ? (notBedQty + "/" + writeBedQty) : "";
} //}
Literal keyin1Lit = (Literal)e.Item.FindControl("keyin1"); Literal keyin1Lit = (Literal)e.Item.FindControl("keyin1");
if (keyin1Lit != null) if (keyin1Lit != null)
+154 -10
View File
@@ -11,9 +11,9 @@
border-bottom: 1px solid #eee; border-bottom: 1px solid #eee;
} }
</style> </style>
</asp:Content> </asp:Content>
<asp:Content ID="Content4" ContentPlaceHolderID="footer_script" runat="Server"> <asp:Content ID="Content4" ContentPlaceHolderID="footer_script" runat="Server">
<script> <script>
Vue.filter('timeString', function (value, myFormat) { Vue.filter('timeString', function (value, myFormat) {
return value == null || value == "" ? "" : moment(value).format(myFormat || 'YYYY-MM-DD, HH:mm:ss'); return value == null || value == "" ? "" : moment(value).format(myFormat || 'YYYY-MM-DD, HH:mm:ss');
@@ -464,6 +464,11 @@
initialized: false, initialized: false,
currentItem: {} currentItem: {}
}, },
tablet_edit_new: {
show: false,
initialized: false,
currentItem: {}
},
//收款註記 //收款註記
cash_dialog: { cash_dialog: {
show: false, show: false,
@@ -526,13 +531,13 @@
window.addEventListener('message', async (event) => { window.addEventListener('message', async (event) => {
if (event.data.source === 'editor.btn.click') { if (event.data.source === 'editor.btn.click') {
const receivedData = event.data.data; const receivedData = event.data.data;
// 更新編輯中的項目 // 更新編輯中的項目
//if (receivedData.tabletItem && this.editedIndex > -1) { //if (receivedData.tabletItem && this.editedIndex > -1) {
if (receivedData.tabletItem) { if (receivedData.tabletItem) {
// 將 tablet_data 轉換為 JSON 字串 // 將 tablet_data 轉換為 JSON 字串
//this.editedItem.f_num_tablet = JSON.stringify(receivedData.tablet_data); //this.editedItem.f_num_tablet = JSON.stringify(receivedData.tablet_data);
// 確保其他必要欄位保持不變 // 確保其他必要欄位保持不變
const currentItem = this.desserts[this.editedIndex]; const currentItem = this.desserts[this.editedIndex];
//currentItem.f_num_tablet = JSON.stringify(receivedData.tablet_data); //currentItem.f_num_tablet = JSON.stringify(receivedData.tablet_data);
@@ -544,13 +549,41 @@
// 呼叫 save 方法 // 呼叫 save 方法
await this.save(); await this.save();
} }
// 關閉編輯對話框 // 關閉編輯對話框
this.tablet_edit.show = false; this.tablet_edit.show = false;
this.tablet_edit_new.show = false;
// 顯示成功訊息 // 顯示成功訊息
this.snackbar.text = '牌位資料已更新'; this.snackbar.text = '牌位資料已更新';
this.snackbar.show = true; this.snackbar.show = true;
} else if (event.data.source === 'editorNew.btn.click') {
const receivedData = event.data.data;
// 更新編輯中的項目
//if (receivedData.tabletItem && this.editedIndex > -1) {
if (receivedData.tabletItem) {
// 將 tablet_data 轉換為 JSON 字串
//this.editedItem.f_num_tablet = JSON.stringify(receivedData.tablet_data);
// 確保其他必要欄位保持不變
const currentItem = this.desserts[this.editedIndex];
//currentItem.f_num_tablet = JSON.stringify(receivedData.tablet_data);
this.editedItem = {
...currentItem,
f_num_tablet: JSON.stringify(receivedData.tablet_data),
style: receivedData.style
};
// 呼叫 save 方法
await this.save();
}
this.tablet_edit_new.show = false;
// 顯示成功訊息
this.snackbar.text = '牌位資料已更新';
this.snackbar.show = true;
} }
}); });
@@ -561,6 +594,13 @@
this.tablet_edit.initialized = true; this.tablet_edit.initialized = true;
}; };
} }
const iframe1 = document.querySelector('iframe#tablet_edit_new_iframe');
if (iframe1) {
iframe1.onload = () => {
this.tablet_edit_new.initialized = true;
};
}
}, },
watch: { watch: {
options: { options: {
@@ -572,6 +612,17 @@
'tablet_edit.show': { 'tablet_edit.show': {
handler(newVal) { handler(newVal) {
if (!newVal && this._savedEditedItem) { if (!newVal && this._savedEditedItem) {
// console.log("三小");
this.editedItem = $.extend(true, {}, this._savedEditedItem);
this._savedEditedItem = null;
}
}
},
'tablet_edit_new.show': {
handler(newVal) {
if (!newVal && this._savedEditedItem) {
//console.log("不合理");
//$("#tablet_edit_new_iframe").src = $("#tablet_edit_new_iframe").src;
this.editedItem = $.extend(true, {}, this._savedEditedItem); this.editedItem = $.extend(true, {}, this._savedEditedItem);
this._savedEditedItem = null; this._savedEditedItem = null;
} }
@@ -704,6 +755,7 @@
curr.select(this.editedItem, row); curr.select(this.editedItem, row);
} }
this.search_dialog.show = false; this.search_dialog.show = false;
this.search_dialog.page = 1;
//console.log(row, row["u_name"], row["f_number"], curr.id, target); //console.log(row, row["u_name"], row["f_number"], curr.id, target);
}, },
//報名詳細資料 //報名詳細資料
@@ -808,7 +860,7 @@
isValidDate = Date.parse(item.pay_date); isValidDate = Date.parse(item.pay_date);
if (!isNaN(isValidDate)) if (!isNaN(isValidDate))
item.pay_date = new Date(item.pay_date).format("yyyy-MM-dd") item.pay_date = new Date(item.pay_date).format("yyyy-MM-dd")
console.log(item);
this.editedItem = $.extend(true, {}, item); this.editedItem = $.extend(true, {}, item);
this.data_dialog.show = true; this.data_dialog.show = true;
this.data_dialog.isAddNew = false; this.data_dialog.isAddNew = false;
@@ -819,6 +871,34 @@
this.editedItem = $.extend(true, {}, item); this.editedItem = $.extend(true, {}, item);
this.file_dialog.show = true; this.file_dialog.show = true;
}, },
async editTabletNew(item) {
this.editedIndex = this.desserts.indexOf(item);
this.editedItem = $.extend(true, {}, item);
try {
//document.getElementById("tablet_edit_new_iframe").contentWindow.location.reload();
// 如果是新項目,先保存
if (this.editedItem.num <= 0 || this.editedItem.num === null || this.editedItem.num === undefined) {
this.editedItem.qty = 1;
const savedItem = await this.save(false);
if (savedItem) {
this.$set(this.desserts, this.editedIndex, savedItem);
this.editedItem = $.extend(true, {}, savedItem);
}
}
// 先發送消息
await this.sendMessageToIframeNew();
// 保存當前的 editedItem 數據
const currentData = $.extend(true, {}, this.editedItem);
// 顯示對話框
this.tablet_edit_new.show = true;
// 立即恢復數據
this.editedItem = $.extend(true, {}, currentData);
} catch (error) {
console.error('Error in editTablet:', error);
}
},
async editTablet(item) { async editTablet(item) {
this.editedIndex = this.desserts.indexOf(item); this.editedIndex = this.desserts.indexOf(item);
this.editedItem = $.extend(true, {}, item); this.editedItem = $.extend(true, {}, item);
@@ -845,6 +925,54 @@
console.error('Error in editTablet:', error); console.error('Error in editTablet:', error);
} }
}, },
async sendMessageToIframeNew() {
const iframe = document.querySelector('iframe#tablet_edit_new_iframe');
// 在這裡深度複製 editedItem,確保數據不會被修改
const itemToSend = $.extend(true, {}, this.editedItem);
if (iframe) {
try {
// 準備要發送的數據
let familyMembers = [];
try {
// 嘗試獲取家族成員數據
const response = await axios.get(HTTP_HOST + 'api/familymembers/follower/' + this.follower_id);
familyMembers = response.data;
} catch (error) {
console.warn('error:', error);
}
// 準備發送的數據
const itemInfo = {
source: 'order.btn.click',
tabletItem: {
...itemToSend,
title: this.titleword() // 確保標題被包含
},
familyMembers: familyMembers,
host: HTTP_HOST,
follower_id:this.follower_id
};
iframe.contentWindow.postMessage(itemInfo, '*');
// 發送後確認數據完整性
// 如果數據被清除,立即恢復
if (!this.editedItem.num && itemToSend.num) {
this.$nextTick(() => {
this.editedItem = $.extend(true, {}, itemToSend);
});
}
} catch (error) {
console.error('Error in sendMessageToIframe:', error);
}
} else {
console.error('iframe not found');
}
},
async sendMessageToIframe() { async sendMessageToIframe() {
const iframe = document.querySelector('iframe#tablet_edit_iframe'); const iframe = document.querySelector('iframe#tablet_edit_iframe');
@@ -973,9 +1101,11 @@
/* (this.editedItem.category=="1"? this.editedItem.from_id_selected.val != 0 : true) &&*/ /* (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視為不需要此項目,不儲存此筆資料*/ this.requireData(this.editedItem.qty, (this.editedItem.num == 0 ? false : true)) ) /* qty為0視為不需要此項目,不儲存此筆資料*/
{ {
console.log(this.editedItem);
//check price //check price
if (this.editedItem.pay <= this.editedItem.price * this.editedItem.qty) { 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);
//check qty //check qty
//數量不可小於掛單明細的數量 //數量不可小於掛單明細的數量
if (this.editedItem.qty >= this.editedItem.writeBedQty + this.editedItem.notBedQty) { if (this.editedItem.qty >= this.editedItem.writeBedQty + this.editedItem.notBedQty) {
@@ -1730,7 +1860,7 @@
<div class=""> <div class="">
<asp:Button ID="add" runat="server" Text="送出" OnClick="add_Click" CssClass="btn btn-primary" /> <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="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="goback" runat="server" Text="取消" CausesValidation="false" OnClick="goback_Click" CssClass="btn btn-outline-secondary" />
</div> </div>
</asp:Content> </asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server"> <asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server">
@@ -2001,7 +2131,10 @@
</v-icon> </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 mdi-file-document-edit-outline
</v-icon> </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 mdi-printer
</v-icon> </v-icon>
@@ -2356,7 +2489,7 @@
<v-card> <v-card>
<v-card-title class="justify-space-between grey lighten-2"> <v-card-title class="justify-space-between grey lighten-2">
查詢:{{search_dialog.current.title}} 查詢:{{search_dialog.current.title}}
<v-btn icon @click="search_dialog.show=false"><v-icon>mdi-close</v-icon></v-btn> <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-title>
<v-card-text > <v-card-text >
<v-row> <v-row>
@@ -2569,6 +2702,17 @@
</v-card> </v-card>
</v-dialog> </v-dialog>
<v-dialog v-model="tablet_edit_new.show" min-width="100vw" min-height="100vh" persistent eager :class="{'d-none': !tablet_edit_new.initialized}">
<v-card>
<v-card-title class="justify-space-between grey lighten-2">
<span class="fs-6 text text-dark">編輯牌位 : {{editedItem.actitem_num_selected.text}} - {{editedItem.print_id}}</span>
<v-btn icon @click="tablet_edit_new.show=false"><v-icon>mdi-close</v-icon></v-btn>
</v-card-title>
<v-card-text>
<iframe id="tablet_edit_new_iframe" src="../print/tablet_edit/editorNewOne.html" style="width: 100%; height: 100%;min-height:100vh;min-width:100vw" frameborder="0"></iframe>
</v-card-text>
</v-card>
</v-dialog>
<v-dialog v-model="tablet_edit.show" max-width="1000px" persistent eager :class="{'d-none': !tablet_edit.initialized}"> <v-dialog v-model="tablet_edit.show" max-width="1000px" persistent eager :class="{'d-none': !tablet_edit.initialized}">
<v-card> <v-card>
<v-card-title class="justify-space-between grey lighten-2"> <v-card-title class="justify-space-between grey lighten-2">
+26 -12
View File
@@ -1,15 +1,16 @@
using System; using DocumentFormat.OpenXml.Spreadsheet;
using System;
using System.Collections; using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using System.Configuration;
using System.Data; using System.Data;
using System.Data.Entity.Infrastructure;
using System.Data.OleDb; using System.Data.OleDb;
using System.IO;
using System.Linq;
using System.Web; using System.Web;
using System.Web.UI; using System.Web.UI;
using System.Web.UI.WebControls; using System.Web.UI.WebControls;
using System.Configuration;
using System.IO;
using System.Linq;
using System.Data.Entity.Infrastructure;
public partial class admin_order_reg : MyWeb.config public partial class admin_order_reg : MyWeb.config
{ {
@@ -187,16 +188,29 @@ public partial class admin_order_reg : MyWeb.config
{ {
if (!isStrNull(pro_order.order_no)) if (!isStrNull(pro_order.order_no))
{ {
_db.pro_order.Add(pro_order); bool isRegistered = _db.pro_order.Any(x => x.f_num == pro_order.f_num && x.activity_num == pro_order.activity_num);
_db.SaveChanges();
Model.admin_log admin_log = new Model.admin_log(); if (isRegistered) // 重複報名
admin_log.writeLog(admin.info.u_id, (int)Model.admin_log.Systems.Order, (int)Model.admin_log.Status.Insert, pro_order.order_no); {
L_msg.Type = alert_type.warning;
L_msg.Text = "此信眾已報名過本活動";
}
else
{
_db.pro_order.Add(pro_order);
_db.SaveChanges();
Model.admin_log admin_log = new Model.admin_log();
admin_log.writeLog(admin.info.u_id, (int)Model.admin_log.Systems.Order, (int)Model.admin_log.Status.Insert, pro_order.order_no);
string url = "index.aspx"; string url = "index.aspx";
url = "reg.aspx?order_no=" + pro_order.order_no; url = "reg.aspx?order_no=" + pro_order.order_no;
Response.Redirect(url);
Session["LastAddedNo"] = pro_order.order_no;
Response.Redirect(url);
}
} }
else else
{ {
+467 -125
View File
@@ -17,54 +17,91 @@
<%--<link href="~/admin/item/css/tablet-design.css" rel="stylesheet" />--%> <%--<link href="~/admin/item/css/tablet-design.css" rel="stylesheet" />--%>
</head> </head>
<body> <body>
<span class="btn btn-primary no-print" onclick="Printer.print()">列印</span>
<select id="paperSizeSel" onchange="Printer.render()">
<!-- onchange="Printer.render()"-->
<option value="">紙張尺寸</option>
</select>
<div class="d-flex full-home no-print" style="height: auto;width:100%;">
<div id="printArea" class="printArea" style="width: auto; height: auto">
<%-- <div class="tablet-paper"> <div id="customMenu" style="top: 20px; right: 10mm; width: 20vw; height: 90vh; position: fixed; background-color: #f0f0f0; border: 1px solid #ccc; padding: 10px; z-index: 1000; opacity: 1;">
</div>--%> <div class="container">
<%-- </div>--%> <div class="row">
<div class="col-12">
<input type="radio" name="setup" id="indivualSetup" style="width: 30px; height: 30px;" checked="checked" />個別設定
<input type="radio" name="setup" id="allSetup" style="width: 30px; height: 30px;" />全域設定
</div>
</div> </div>
</div> <div class="row">
<div class="col-6">
<div class="form-floating mb-3">
<div id="customMenu" style="display: none; position: absolute; background-color: #f9f9f9; border: 1px solid #ccc; padding: 10px; z-index: 1000; opacity: 1;"> <input type="text" id="textX" class="form-control form-control-sm mb-2" onchange="Printer.changeSetup('X')" />
<div class="container"> <label class="small" for="textX">X軸位置</label>
<div class="row">
<div class="col-6">
<div class="form-floating mb-3">
<input type="text" id="textX" class="form-control form-control-sm mb-2" onchange="Printer.changeLocation()" />
<label class="small" for="textX">X軸位置</label>
</div>
</div> </div>
<div class="col-6"> </div>
<div class="form-floating mb-3"> <div class="col-6">
<input type="text" id="textY" class="form-control form-control-sm mb-2" onchange="Printer.changeLocation()" /> <div class="form-floating mb-3">
<label class="small" for="textY">Y軸位置</label> <input type="text" id="textY" class="form-control form-control-sm mb-2" onchange="Printer.changeSetup('Y')" />
</div> <label class="small" for="textY">Y軸位置</label>
</div> </div>
<div class="col-6"> </div>
<div class="form-floating mb-3"> <div class="col-6">
<input type="text" id="fontSize" class="form-control form-control-sm mb-2" onchange="Printer.changeSize()" /> <div class="form-floating mb-3">
<label class="small" for="fontSize">字體大小</label> <input type="text" id="fontSize" class="form-control form-control-sm mb-2" onchange="Printer.changeSetup('fontSize')" />
</div> <label class="small" for="fontSize">字體大小</label>
</div> </div>
<div class="col-6"> </div>
<div class="form-floating mb-3"> <div class="col-6">
<input type="text" id="textWidth" class="form-control form-control-sm mb-2" onchange="Printer.changeWidth()" /> <div class="form-floating mb-3">
<label class="small" for="textWidth">文字寬度</label> <input type="text" id="textWidth" class="form-control form-control-sm mb-2" onchange="Printer.changeSetup('width')" />
</div> <label class="small" for="textWidth">物件寬度</label>
</div>
</div>
<div class="col-6">
<div class="form-floating mb-3">
<input type="text" id="textHeight" class="form-control form-control-sm mb-2" onchange="Printer.changeSetup('height')" />
<label class="small" for="textHeight">物件高度</label>
</div>
</div>
<div class="col-6">
<div class="form-floating mb-3">
<input type="text" id="textBreakCount" class="form-control form-control-sm mb-2" onchange="Printer.changeWidth()" />
<label class="small" for="textBreakCount">文字斷行(依字數)</label>
</div>
</div>
<div class="col-6">
<div class="form-floating mb-3">
<input type="text" id="textBreakWord" class="form-control form-control-sm mb-2" onchange="Printer.changeWidth()" />
<label class="small" for="textBreakWord">文字斷行(依文字)</label>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<form id="form1" runat="server"> </div>
<span class="btn btn-primary no-print" onclick="Printer.print()">列印</span>
<select id="paperSizeSel" onchange="Printer.render()">
<!-- onchange="Printer.render()"-->
<option value="">紙張尺寸</option>
</select>
<div class="d-flex full-home no-print" style="height: auto; width: 100%;">
<div id="printArea" class="printArea" style="width: auto; height: auto">
<%-- <div class="tablet-paper">
</div>--%>
<%-- </div>--%>
</div>
</div>
<form id="form1" runat="server">
</form> </form>
<div class="position-fixed top-50 start-50 p-3" style="z-index: 10001">
<div id="liveToast" class="toast hide " role="alert" aria-live="assertive"
data-bs-delay="3000" aria-atomic="true"
style="color: white; background-color: dimgray; opacity: 1; font-size: 24px;">
<div class="toast-header">
<strong class="me-auto">提示訊息</strong>
<button type="button" class="btn-close" data-bs-dismiss="toast" aria-label="Close"></button>
</div>
<div class="toast-body" id="toast_body">
</div>
</div>
</div>
</body> </body>
<script src="<%=ResolveUrl("~/js/bootstrap5/js/bootstrap.bundle.min.js")%>"></script> <script src="<%=ResolveUrl("~/js/bootstrap5/js/bootstrap.bundle.min.js")%>"></script>
<script src="<%=ResolveUrl("~/js/jquery-4.0.0.min.js")%>"></script> <script src="<%=ResolveUrl("~/js/jquery-4.0.0.min.js")%>"></script>
@@ -77,19 +114,20 @@
<script src="<%=ResolveUrl("~/admin/item/jquery-ui/jquery-ui.min.js")%>"></script> <script src="<%=ResolveUrl("~/admin/item/jquery-ui/jquery-ui.min.js")%>"></script>
<script> <script>
// 建立 MutationObserver 實例,並傳入 callback 函式 // 建立 MutationObserver 實例,並傳入 callback 函式
const Printer = { const Printer = {
selected: null, selected: null,
http_host: "", http_host: "",
pageStyle: "", pageStyle: "",
pSize:"", pSize: "",
allStyle: [], allStyle: [],
allSize: [], allSize: [],
allStyleDetails: [], allStyleDetails: [],
printData: [], printData: [],
tabletElement: [], tabletElement: [],
observer: null, observer: null,
isInit:true, isInit: true,
toast: null,
bg: [ bg: [
{ name: "黃1", path: "../../admin/print/html/tablet-1_new.svg" }, { name: "黃1", path: "../../admin/print/html/tablet-1_new.svg" },
{ name: "黃2", path: "../../admin/print/html/tablet-1B_new.svg" }, { name: "黃2", path: "../../admin/print/html/tablet-1B_new.svg" },
@@ -97,23 +135,23 @@
{ name: "紅2", path: "../../admin/print/html/tablet-2B.svg" } { name: "紅2", path: "../../admin/print/html/tablet-2B.svg" }
], ],
async init() { async init() {
this.toast = new bootstrap.Toast($('#liveToast'));
let HTTP_HOST = "<%=UrlHost()%>"; let HTTP_HOST = "<%=UrlHost()%>";
this.http_host = HTTP_HOST; this.http_host = HTTP_HOST;
// //
Promise.all([ Promise.all([
this.getActItem(), this.getActItem(),
this.getPaperSize(), this.getPaperSize(),
]).then(() => { ]).then(() => {
Promise.all([ Promise.all([
this.getTabletElement(), this.getTabletElement(),
this.getTabletStyles(), this.getTabletStyles(),
this.getAllStyleDetails(), this.getAllStyleDetails(),
this.getData(), this.getData(),
]).then(() => { ]).then(() => {
this.render(); this.render();
}) })
}) })
}, },
async getActItem() { async getActItem() {
@@ -159,7 +197,7 @@
this.allSize = data.data; this.allSize = data.data;
//console.log(this.allSize); //console.log(this.allSize);
if (this.allSize) { if (this.allSize) {
this.allSize.forEach(x => { this.allSize.forEach(x => {
$("#paperSizeSel").append(`<option value="${x.paperID}">${x.paperName}</option>`); $("#paperSizeSel").append(`<option value="${x.paperID}">${x.paperName}</option>`);
}) })
//if (this.printSize) { //if (this.printSize) {
@@ -207,7 +245,7 @@
if (response.status == 200) { if (response.status == 200) {
this.printData = response.data; this.printData = response.data;
//this.render(); //this.render();
//this.print(); //this.print();
} }
@@ -223,19 +261,29 @@
let canvas = $(` <div class="canvas-area flex-grow-1 overflow-auto d-flex flex-row align-items-center position-relative" ></div>`) let canvas = $(` <div class="canvas-area flex-grow-1 overflow-auto d-flex flex-row align-items-center position-relative" ></div>`)
let nowPageWidth = 0; let nowPageWidth = 0;
let tabletpaper; let tabletpaper;
this.printData.forEach(x => { //列印紙張的尺寸
if ($("#paperSizeSel").val() == "") { if ($("#paperSizeSel").val() == "") {
if (this.pSize&&this.pSize!=undefined) { if (this.pSize && this.pSize != undefined) {
$("#paperSizeSel").val(this.pSize); $("#paperSizeSel").val(this.pSize);
} else { } else {
$("#paperSizeSel").val("0003"); $("#paperSizeSel").val("0001");
}
} }
}
let pageSize = self.allSize.find(y => y.paperID == $("#paperSizeSel").val());
this.printData.forEach(x => {
let style = self.allStyle.find(y => y.styleID == x.style); let style = self.allStyle.find(y => y.styleID == x.style);
//用來印內容的尺寸
let size = self.allSize.find(y => y.paperID == style.paperSize); let size = self.allSize.find(y => y.paperID == style.paperSize);
let pageSize = self.allSize.find(y => y.paperID == $("#paperSizeSel").val()); //包含空白用來折的尺寸
let printSize = self.allSize.find(y => y.paperID ==style.printSize); let printSize = self.allSize.find(y => y.paperID == style.printSize);
if ((nowPageWidth + parseFloat(printSize.width)) > pageSize.width) {
//用長根寬算出一張紙可以印幾張
let xCount = parseFloat(pageSize.width) / parseFloat(printSize.width);
let yCount = parseFloat(pageSize.height) / parseFloat(printSize.height);
let total = Math.floor(xCount) * Math.floor(yCount);
//if ((nowPageWidth + parseFloat(printSize.width)) > pageSize.width) {
if (nowPageWidth >= total) {
//$(canvas).css("width", printSize.width + "mm"); //$(canvas).css("width", printSize.width + "mm");
//$(canvas).css("height", printSize.height + "mm"); //$(canvas).css("height", printSize.height + "mm");
//$(canvas).css("justify-content", "center"); //$(canvas).css("justify-content", "center");
@@ -246,7 +294,7 @@
canvas = $(` <div class="canvas-area flex-grow-1 overflow-auto d-flex flex-row align-items-center position-relative" ></div>`) canvas = $(` <div class="canvas-area flex-grow-1 overflow-auto d-flex flex-row align-items-center position-relative" ></div>`)
nowPageWidth = 0; nowPageWidth = 0;
} }
nowPageWidth = nowPageWidth + parseFloat(printSize.width); nowPageWidth = nowPageWidth + 1; //parseFloat(printSize.width);
tabletpaper = $(` <div class="tablet-paper"> tabletpaper = $(` <div class="tablet-paper">
</div>`) </div>`)
let img = self.bg.find(y => y.name == style.backendImg); let img = self.bg.find(y => y.name == style.backendImg);
@@ -265,7 +313,10 @@
let mid_items = tablet.mid_items; let mid_items = tablet.mid_items;
let left_items = tablet.left_items; let left_items = tablet.left_items;
let mid_left = tablet.mid_left;
let mid_right = tablet.mid_right;
let addr_items = tablet.addr_items;
let details = this.allStyleDetails.filter(y => y.styleID == x.style); let details = this.allStyleDetails.filter(y => y.styleID == x.style);
let mid = []; let mid = [];
mid_items.forEach(y => { mid_items.forEach(y => {
@@ -277,11 +328,25 @@
left.push(y.fam_name); left.push(y.fam_name);
}); });
} }
let lefttitle = [];
if (mid_left) {
mid_left.forEach(y => {
lefttitle.push(y.fam_name);
});
}
let righttitle = [];
if (mid_right) {
mid_right.forEach(y => {
righttitle.push(y.fam_name);
});
}
let address = addr_items;
let ancestorFontSize = 16;
details.forEach(d => { details.forEach(d => {
if (d.isActive != "hidden") { if (d.isActive != "hidden") {
let newFontSize = self.scaleFontSize(mid, d.fontSize, d.width); let newFontSize = self.scaleFontSize(mid, d.fontSize, d.width);
let html = ""; let html = "";
let alive = ""; let alive = "";
let yang = ""; let yang = "";
@@ -312,7 +377,7 @@
if (info.width >= d.textHeight) { if (info.width >= d.textHeight) {
height = d.height; height = d.height;
} }
let $span = $(`<span>${z}</span>`).css({ let $span = $(`<span class="nameSpan">${z}</span>`).css({
display: "block", display: "block",
"min-height": `${height}px`, "min-height": `${height}px`,
"max-height": `${d.height}px`, "max-height": `${d.height}px`,
@@ -320,9 +385,10 @@
//width: `${newFontSize}px`, //width: `${newFontSize}px`,
"text-align": "justify", "text-align": "justify",
"text-align-last": "justify", "text-align-last": "justify",
"margin-bottom": "40px", "margin-bottom": "20px",
"margin-left": "5px", "margin-left": "5px",
"text-justify": "inter-character", "text-justify": "inter-character",
"white-space": "pre-line",
//"justify-content":"center" //"justify-content":"center"
}); });
$namelist.append($span); $namelist.append($span);
@@ -333,17 +399,35 @@
html = self.renderLiveList(left, d); html = self.renderLiveList(left, d);
newFontSize = d.fontSize; newFontSize = d.fontSize;
} else if (d.elementID === "titletriangle") {
html = self.renderRoster(mid, d)
} else if (d.elementID === "combined") {
ancestorFontSize = d.fontSize;
const parts = mid.join("\n").split('\n');
html = `<div class="ancestor-wrapper" style="width:${d.width}px !important;height:${d.height}px !important;" >
<span class="main-name" >${parts[0] || ''}</span>
<span class="sub-text">${parts[1] || ''}</span>
</div>`;
} else if (d.elementID === "address") {
html = self.renderNormal(address, d)
} else if (d.elementID === "lefttitle") {
html = self.renderNormal(lefttitle, d)
}
else if (d.elementID === "righttitle") {
html = self.renderNormal(righttitle, d)
}
if (newFontSize < 10) {
newFontSize = 10;
} }
let content = $(`<div class="tablet-element vertical-text "></div>`) let content = $(`<div class="tablet-element vertical-text "></div>`)
.css({ .css({
position: "absolute", left: d.startX + "mm", top: d.startY + "mm", fontSize: newFontSize + 'px', position: "absolute", left: d.startX + "mm", top: d.startY + "mm", fontSize: newFontSize + 'px',
fontFamily: d.fontFamily, "font-weight": "bold", "z-index": 9999, visibility: d.isActive, fontFamily: d.fontFamily, "font-weight": "bold", "z-index": 9999, visibility: d.isActive,
"align-items":"center" "align-items": "center"
}) })
.html(html); .html(html);
tabletpaper.append(content); tabletpaper.append(content);
html = ""; html = "";
alive = ""; alive = "";
yang = ""; yang = "";
@@ -352,6 +436,9 @@
}) })
//console.log("xCount:", Math.floor( xCount));
let xFloor = Math.floor(xCount);
self.pageStyle = `<style id="pageStyle"> self.pageStyle = `<style id="pageStyle">
{ {
-webkit-print-color-adjust: exact !important; -webkit-print-color-adjust: exact !important;
@@ -363,6 +450,10 @@
-webkit-writing-mode: vertical-rl !important; -webkit-writing-mode: vertical-rl !important;
text-orientation: mixed !important; text-orientation: mixed !important;
} }
body{
overflow: visible !important;
}
@media print{ @media print{
:host { :host {
width:auto !important; width:auto !important;
@@ -372,7 +463,7 @@
size:${pageSize.width}mm ${pageSize.height}mm !important; size:${pageSize.width}mm ${pageSize.height}mm !important;
margin:0; margin:0;
} }
html, body, form, .full-home, #printArea, .canvas-area { html, body, form, .full-home, #printArea, .canvas-area {
height: auto !important; height: auto !important;
width: auto !important; width: auto !important;
overflow: visible !important; /*必須為 visible */ overflow: visible !important; /*必須為 visible */
@@ -386,15 +477,23 @@
.canvas-area{ .canvas-area{
display:flex !important; display:${xFloor > 1 ? 'block' : 'flex'} !important;
grid-template-columns: repeat(${xFloor},1fr);
flex-direction: row !important; flex-direction: row !important;
justify-content: ${xFloor > 1 ? 'start' : 'center'} !important;
align-items:center !important;
${xFloor > 1 ? 'margin-left:20px !important' : ''};
${xFloor > 1 ? 'margin-right:20px !important' : ''};
${xFloor > 1 ? 'margin-top:-20px !important' : ''};
} }
.no-print, #customMenu { //.no-print, #customMenu {
display: none !important; // display: none !important;
} //}
.tablet-paper { .tablet-paper {
position: relative !important; position: relative !important;
display: block !important; display: ${xFloor > 1 ? 'inline-block' : 'block'} !important;
break-inline:avoid;
page-break-inline:avoid;
break-after: page !important; break-after: page !important;
page-break-after: always !important; page-break-after: always !important;
margin: 0 !important; margin: 0 !important;
@@ -461,7 +560,7 @@
display: flex; display: flex;
flex-direction: column; flex-direction: column;
align-items: center; /* 水平置中 */ align-items: center; /* 水平置中 */
justify-content: center; justify-content: felx-start;
width: fit-content; width: fit-content;
} }
@@ -471,7 +570,7 @@
} }
.sub-text { .sub-text {
font-size: 0.6em; /* 縮小字體 */ /*font-size: ${ancestorFontSize}px ;*//*0.8em;*/ /* 縮小字體 */
line-height: 1.2; line-height: 1.2;
margin-top: 4px; /* 與上方林張的間距 */ margin-top: 4px; /* 與上方林張的間距 */
white-space: normal; /* 避免自動換行 */ white-space: normal; /* 避免自動換行 */
@@ -479,22 +578,31 @@
} }
.canvas-area{ .canvas-area{
width: ${printSize.width}mm; width: ${pageSize.width}mm;
height: ${printSize.height}mm; height: ${pageSize.height}mm;
justify-content: center;
break-after: page; break-after: page;
page-break-after: always; page-break-after: always;
display:${xFloor > 1 ? 'block' : 'flex'} !important;
grid-template-columns: repeat(${xFloor},1fr);
${xFloor > 1 ? 'margin-left:20px !important' : ''};
${xFloor > 1 ? 'margin-right:20px !important' : ''};
/*align-items: center !important;
justify-content: ${xFloor > 1 ? 'start' : 'center'} !important;*/
} }
.tablet-paper{ .tablet-paper{
background-color: white; background-color: white;
display: inline-block;
width: ${size.width}mm !important; width: ${size.width}mm !important;
height: ${ size.height }mm !important; height: ${size.height}mm !important;
position: relative; position: relative;
margin-bottom: 0; margin-bottom: 0;
background-image: url(${ img.path }); background-image: url(${img.path});
background-size: 100% 100%; background-size: 100% 100%;
break-after: page; /*break-after: page;
page-break-after: always; page-break-after: always;*/
break-inline:avoid;
page-break-inline:avoid;
} }
.tablet-element { .tablet-element {
cursor: move; cursor: move;
@@ -505,6 +613,10 @@
} }
.tablet-element:hover { border-color: rgba(13, 110, 253, 0.3); } .tablet-element:hover { border-color: rgba(13, 110, 253, 0.3); }
.tablet-paper:last-child { page-break-after: auto; } .tablet-paper:last-child { page-break-after: auto; }
.tablet-element span{
z-index: 999;
}
</style> </style>
` `
$("#pageStyle").remove(); $("#pageStyle").remove();
@@ -515,47 +627,108 @@
//$(canvas).css("justify-content", "center"); //$(canvas).css("justify-content", "center");
$("#printArea").append(canvas); $("#printArea").append(canvas);
}); });
$(".tablet-element").draggable({ //$(".tablet-element").draggable({
start(e, ui) { // start(e, ui) {
//console.log("gogogogo"); // //console.log("gogogogo");
}, // },
stop(e, ui) { // stop(e, ui) {
//console.log(ui.position.left, ui.position.top); // //console.log(ui.position.left, ui.position.top);
} // }
}); //});
$(".tablet-element").on("click", function (e) { //$(".tablet-element").on("click", function (e) {
e.preventDefault(); // e.preventDefault();
self.selected = $(this); // self.selected = $(this);
let fontSize = $(this).css("fontSize"); // let fontSize = $(this).css("fontSize");
let fontFamily = $(this).css("fontFamily"); // let fontFamily = $(this).css("fontFamily");
let left = $(this).css("left"); // let left = $(this).css("left");
let top = $(this).css("top"); // let top = $(this).css("top");
}); //});
$(".tablet-element").on("contextmenu", function (e) { $(".tablet-element").on("contextmenu", function (e) {
e.preventDefault(); e.preventDefault();
self.selected = $(this); self.selected = $(this);
let fontSize = $(this).css("font-size"); let fontSize = $(this).css("font-size");
let fontFamily = $(this).css("font-family"); let fontFamily = $(this).css("font-family");
console.log($(this).css("font-size"));
let textWidth = $(this).find("span").first().css("width"); let textWidth;//= $(this).css("width");//find("span").first().css("width");
let textHeight; //= $(this).css("height");
if ($(this).find(".nameList").first().hasClass("nameList")) {
textWidth = $(this).find(".nameList").first().css("width");
textHeight = $(this).find(".nameList").first().css("height");
} else if ($(this).find(".liveList").first().hasClass("liveList")) {
textWidth = $(this).find(".liveList").first().css("width");
textHeight = $(this).find(".liveList").first().css("height");
} else if ($(this).find(".rosterList").first().hasClass("rosterList")) {
textWidth = $(this).find(".rosterList").first().css("width");
textHeight = $(this).find(".rosterList").first().css("height");
} else if ($(this).find(".ancestor-wrapper").first().hasClass("ancestor-wrapper")) {
textWidth = $(this).find(".ancestor-wrapper").first().css("width");
textHeight = $(this).find(".ancestor-wrapper").first().css("height");
}
let left = $(this).css("left"); let left = $(this).css("left");
let top = $(this).css("top"); let top = $(this).css("top");
$("#customMenu").css({
top: e.pageY + "px",
left: (e.pageX + 30) + "px"
});
left = left.replace("px", ""); left = left.replace("px", "");
top = top.replace("px", ""); top = top.replace("px", "");
$("#textX").val(self.fix2(left * 0.265)); $("#textX").val(self.fix2(left * 0.265));
$("#textY").val(self.fix2(top * 0.265)); $("#textY").val(self.fix2(top * 0.265));
$("#fontSize").val(fontSize); $("#fontSize").val(fontSize);
$("#textWidth").val(textWidth); $("#textWidth").val(textWidth);
$("#customMenu").show(); $("#textHeight").val(textHeight);
$("#textX").prop("readonly", false);
$("#textY").prop("readonly", false);
$("#fontSize").prop("readonly", false);
$("#textWidth").prop("readonly", false);
$("#textHeight").prop("readonly", false);
$("#textBreakCount").prop("readonly", true);
$("#textBreakWord").prop("readonly", true);
}); });
$(".tablet-element span").on("click", function (e) {
e.preventDefault();
self.selected = $(this);
let fontSize = $(this).css("font-size");
let fontFamily = $(this).css("font-family");
let textWidth = $(this).css("max-width");
let textHeight = $(this).css("min-height");
if ($(this).hasClass("liveSpan")) {
textWidth = $(this).css("width");
} else if ($(this).hasClass("main-name") || $(this).hasClass("sub-text")) {
textWidth = "";
textHeight = "";
}
let left = $(this).css("left");
let top = $(this).css("top");
left = left.replace("px", "");
top = top.replace("px", "");
$("#textX").val("");
$("#textY").val("");
$("#fontSize").val("");
$("#textWidth").val(textWidth);
$("#textHeight").val(textHeight);
let parentElement = this.parentElement;
if ($(parentElement).hasClass("nameList") || $(parentElement).hasClass("liveList") || $(parentElement).hasClass("rosterList")) {
$("#textX").prop("readonly", true);
$("#textY").prop("readonly", true);
$("#fontSize").prop("readonly", true);
$("#textBreakCount").prop("readonly", false);
$("#textBreakWord").prop("readonly", false);
} else if ($(this).hasClass("main-name") || $(this).hasClass("sub-text")) {
$("#textX").prop("readonly", true);
$("#textY").prop("readonly", true);
$("#fontSize").prop("readonly", true);
$("#textBreakCount").prop("readonly", true);
$("#textBreakWord").prop("readonly", true);
$("#textWidth").prop("readonly", true);
$("#textHeight").prop("readonly", true);
}
});
}, },
fix2(val) { fix2(val) {
return Number.parseFloat(val).toFixed(2); return Number.parseFloat(val).toFixed(2);
@@ -584,7 +757,7 @@
return $namelist; return $namelist;
}, },
renderLiveSpan(name, el) { renderLiveSpan(name, el) {
return $(`<span>${name}</span>`).css({ return $(`<span class="liveSpan">${name}</span>`).css({
display: "block", display: "block",
"min-height": `${el.textHeight}px`, "min-height": `${el.textHeight}px`,
"max-height": `${el.height}px`, "max-height": `${el.height}px`,
@@ -592,23 +765,72 @@
height: `${el.textHeight}px`, height: `${el.textHeight}px`,
"text-align": "justify", "text-align": "justify",
"text-align-last": "justify", "text-align-last": "justify",
"margin-bottom": "15px", "margin-bottom": "10px",
"text-justify": "inter-character", "text-justify": "inter-character",
"white-space": "pre-line"
}); });
}, },
getTextInfo(text,font) { // 品字佈局邏輯:一上二下
renderRoster(names, el) {
if (!names.length) return '';
const mid = names.length === 1 ? 1 : Math.floor(names.length / 2);
const top = names.slice(0, mid);
const bot = names.slice(mid);
const size = this.autoScale(names, el.fontSize);
let h = $(`<div class="rosterList"></div>`).css(
{
width: el.width, height: el.height,
"writing-mode": "vertical-rl", /* 直書 */
display: "flex",
"flex-direction": "row", /* 上下分層 (Top / Bottom) */
"align-items": "center", /* 左右置中對齊 */
"justify-content": "start",
gap: "20px",
});
h.append(this.renderNameGroups(top, el));
if (bot.length) h.append(this.renderNameGroups(bot, el));
return h
},
renderNameGroups(items, el) {
let g = $(`<div class="rosterspan"></div>`).css({
"display": "flex",
"flex-direction": "column",
"justify-content": "center",
"height": el.textHeight,
"white-space": "pre-line"
})
items.forEach(x => {
g.append($(`<div class="" style="letter-spacing: 10px;">${x}</div>`))
})
return g;
},
renderNormal(mid, d) {
//sconsole.log("renderNormal:", d)
let self = this;
let txt = $(`<div class='${d.elementID}'>${mid}</div>`).css({
"z-index": 9999, visibility: d.visibility,
width: d.width, height: d.height
});
return txt;
},
autoScale(names, base) {
const max = Math.max(...names.map(n => n.length), 0);
return max > 5 ? Math.max(base * (5 / max), base * 0.6) : base;
},
getTextInfo(text, font) {
const canvas = document.createElement("canvas"); const canvas = document.createElement("canvas");
const context = canvas.getContext("2d"); const context = canvas.getContext("2d");
context.font = font; context.font = font;
const metrics = context.measureText(text); const metrics = context.measureText(text);
return metrics return metrics
}, },
getTextWidth(text,font) { getTextWidth(text, font) {
const canvas = document.createElement("canvas"); const canvas = document.createElement("canvas");
const context = canvas.getContext("2d"); const context = canvas.getContext("2d");
context.font = font; context.font = font;
const metrics = context.measureText(text); const metrics = context.measureText(text);
return metrics; return metrics;
}, },
getTextSize(txt, fontsize) { getTextSize(txt, fontsize) {
@@ -626,24 +848,144 @@
document.body.removeChild(span); document.body.removeChild(span);
return result; return result;
}, },
scaleFontSize(txtContent, fontSize,elementWidth) { scaleFontSize(txtContent, fontSize, elementWidth) {
let font = this.getTextSize("講", parseInt(fontSize)); let font = this.getTextSize("講", parseInt(fontSize));
//自動判斷縮小字型的規則,要同時縮小間距 //自動判斷縮小字型的規則,要同時縮小間距
//if (dStyle.elementID === 'title1') {//表示是一般正名,也就是牌位正中間的一般格式,排法是上下上下 //if (dStyle.elementID === 'title1') {//表示是一般正名,也就是牌位正中間的一般格式,排法是上下上下
if ((Math.ceil(txtContent.length / 2) * font.width)*2 > parseFloat(elementWidth)) { if ((Math.ceil(txtContent.length / 2) * font.width) * 2 > parseFloat(elementWidth)) {
let newfontSize = parseInt(fontSize) - 1; let newfontSize = parseInt(fontSize) - 1;
//console.log("newfontSize:",newfontSize) if (newfontSize <= 10) {
return this.scaleFontSize(txtContent, newfontSize,elementWidth); return newfontSize;
} }
return fontSize; //console.log("newfontSize:",newfontSize)
return this.scaleFontSize(txtContent, newfontSize, elementWidth);
}
return fontSize;
}, },
breakWord(txtContent, style, dStyle) { breakWord(txtContent, style, dStyle) {
//自動判斷斷字 //自動判斷斷字
//1. by 特定字 2.by長度 //1. by 特定字 2.by長度
}, },
async changeSetup(config) {
let classList = ["liveList", "nameList", "address", "ancestor-wrapper", "lefttitle", "righttitle", "rosterList"]
switch (config) {
case "X":
if ($("#indivualSetup").prop("checked")) {
$(this.selected).css("left", $("#textX").val() + "mm");
} else if ($("#allSetup").prop("checked")) {
classList.forEach(w => {
if ($(this.selected.children()).first().hasClass(w)) {
$(`.${w}`).parent().each((index, y) => {
$(y).css("left", $("#textX").val() + "mm")
})
}
});
}
break;
case "Y":
if ($("#indivualSetup").prop("checked")) {
$(this.selected).css("top", $("#textY").val() + "mm");
} else if ($("#allSetup").prop("checked")) {
classList.forEach(w => {
if ($(this.selected.children()).first().hasClass(w)) {
$(`.${w}`).parent().each((index, y) => {
$(y).css("top", $("#textY").val() + "mm")
})
}
});
}
break;
case "fontSize":
if ($("#indivualSetup").prop("checked")) {
$(this.selected).css("font-size", $("#fontSize").val())
} else if ($("#allSetup").prop("checked")) {
$("#toast_body").html("字體大小不可在全域中修改");
this.toast.show();
}
break;
case "width":
if ($("#indivualSetup").prop("checked")) {
if (this.selected.find(".nameList").length >= 1) {
$(this.selected.find(".nameList").first()).css("width", $("#textWidth").val())
} else if (this.selected.find(".liveList").length >= 1) {
this.selected.find(".liveList").first().css("width", $("#textWidth").val())
} else if (this.selected.find(".rosterList").length >= 1) {
this.selected.find(".rosterList").first().css("width", $("#textWidth").val())
} else if (this.selected.hasClass("nameSpan")) {
let spans = $(this.selected.parent().first()).find(".nameSpan");
spans.each(function (index, x) {
$(x).css("max-width", $("#textWidth").val());
});
} else if (this.selected.hasClass("liveSpan")) {
let spans = $(this.selected.parent().first()).find(".liveSpan");
spans.each(function (index, x) {
$(x).css("width", $("#textWidth").val());
});
} else if (this.selected.hasClass("rosterSpan")) {
let spans = $(this.selected.parent().first()).find(".rosterSpan");
spans.each(function (index, x) {
$(x).css("max-width", $("#textWidth").val());
});
}
} else if ($("#allSetup").prop("checked")) {
$("#toast_body").html("寬度不可在全域中修改");
this.toast.show();
}
break;
case "height":
if ($("#indivualSetup").prop("checked")) {
if (this.selected.find(".nameList").length >= 1) {
$(this.selected.find(".nameList").first()).css("height", $("#textHeight").val())
} else if (this.selected.find(".liveList").length >= 1) {
this.selected.find(".liveList").first().css("height", $("#textHeight").val())
} else if (this.selected.find(".rosterList").length >= 1) {
this.selected.find(".rosterList").first().css("height", $("#textHeight").val())
} else if (this.selected.hasClass("nameSpan")) {
let spans = $(this.selected.parent().first()).find(".nameSpan");
spans.each(function (index, x) {
$(x).css("min-height", $("#textHeight").val());
});
} else if (this.selected.hasClass("liveSpan")) {
let spans = $(this.selected.parent().first()).find(".liveSpan");
spans.each(function (index, x) {
$(x).css("min-height", $("#textHeight").val());
$(x).css("height", $("#textHeight").val());
});
} else if (this.selected.hasClass("rosterSpan")) {
let spans = $(this.selected.parent().first()).find(".rosterSpan");
spans.each(function (index, x) {
$(x).css("min-height", $("#textHeight").val());
});
}
} else if ($("#allSetup").prop("checked")) {
$("#toast_body").html("高度不可在全域中修改");
this.toast.show();
}
break;
case "breakCount":
if ($("#indivualSetup").prop("checked")) {
} else if ($("#allSetup").prop("checked")) {
}
break;
case "breakWord":
if ($("#indivualSetup").prop("checked")) {
} else if ($("#allSetup").prop("checked")) {
}
break;
}
},
async changeLocation() { async changeLocation() {
$(this.selected).css("left", $("#textX").val() + "mm"); $(this.selected).css("left", $("#textX").val() + "mm");
$(this.selected).css("top", $("#textY").val() + "mm"); $(this.selected).css("top", $("#textY").val() + "mm");
@@ -723,9 +1065,9 @@
}, },
} }
$(document).click(function (e) { $(document).click(function (e) {
if (!$("#customMenu").is(e.target) && $("#customMenu").has(e.target).length === 0) { //if (!$("#customMenu").is(e.target) && $("#customMenu").has(e.target).length === 0) {
$("#customMenu").hide(); // $("#customMenu").hide();
} //}
}); });
$(() => Printer.init()); $(() => Printer.init());
</script> </script>
File diff suppressed because it is too large Load Diff
+13 -7
View File
@@ -403,7 +403,8 @@
style:"" style:""
}, },
actitem: "", actitem: "",
pageSize:"", pageSize: "",
defaultStyle:"",
isAllSelected: false, isAllSelected: false,
dialog: false, dialog: false,
addDialog: false, // 新增項目對話框 addDialog: false, // 新增項目對話框
@@ -506,12 +507,12 @@
window.addEventListener('message', (event) => { window.addEventListener('message', (event) => {
this.isAllSelected = false; this.isAllSelected = false;
console.log('editor.html - received message event'); console.log('editor.html - received message event');
console.log('editor.html - event origin:', event.origin); //console.log('editor.html - event origin:', event.origin);
console.log('editor.html - parent origin:', window.parent.location.origin); //console.log('editor.html - parent origin:', window.parent.location.origin);
if (event.origin === window.parent.location.origin) { if (event.origin === window.parent.location.origin) {
console.log('editor.html - origin check passed'); //console.log('editor.html - origin check passed');
console.log('editor.html - received data:', event.data); //console.log('editor.html - received data:', event.data);
const receivedData = event.data; const receivedData = event.data;
this.family_deceased_Y_selected = []; this.family_deceased_Y_selected = [];
this.family_deceased_N_selected = []; this.family_deceased_N_selected = [];
@@ -526,15 +527,16 @@
if (receivedData.tabletItem) { if (receivedData.tabletItem) {
this.tabletItem = receivedData.tabletItem; this.tabletItem = receivedData.tabletItem;
} }
//console.log("actitem:", receivedData.tabletItem.actitem_num_selected.val);
console.log("receivedData::",receivedData); console.log("receivedData::",receivedData);
if (receivedData.tabletItem.style) { if (receivedData.tabletItem.style) {
this.selected.style = receivedData.tabletItem.style; this.selected.style = receivedData.tabletItem.style;
} else { } else {
this.selected.style = ""; this.selected.style = "";
} }
//console.log("actitem:", receivedData.tabletItem.actitem_num_selected.val);
this.actitem = receivedData.tabletItem.actitem_num_selected.val; this.actitem = receivedData.tabletItem.actitem_num_selected.val;
console.log("actitem:",receivedData.tabletItem.actitem_num_selected.val); //console.log("actitem:",receivedData.tabletItem.actitem_num_selected.val);
// 處理 f_num_tablet 資料 // 處理 f_num_tablet 資料
if (this.tabletItem.f_num_tablet) { if (this.tabletItem.f_num_tablet) {
try { try {
@@ -595,6 +597,9 @@
console.log(response); console.log(response);
if (response.data.result == "Y" && response.data.data) { if (response.data.result == "Y" && response.data.data) {
this.pageSize = response.data.data.pageSize; this.pageSize = response.data.data.pageSize;
this.defaultStyle = response.data.data.defaultStyle;
this.selected.style = response.data.data.defaultStyle;
console.log("shit:",this.selected.style);
this.getStyle(); this.getStyle();
} }
} }
@@ -615,6 +620,7 @@
} }
} }
}) })
} }
}) })
.catch(error => console.log(error)) .catch(error => console.log(error))
+29 -2
View File
@@ -105,6 +105,23 @@
></v-text-field> ></v-text-field>
</div> </div>
</template> </template>
<template v-slot:item.kind="{ item }">
<div>
<div class="mb-2">
<span class="badge bg-primary me-1" title="支付方式">收支項目</span>
</div>
</div>
<div>
<v-select
:items="accountingKinds"
v-model="item.kind"
dense
outlined
hide-details
style="max-width: 200px"
></v-select>
</div>
</template>
<template v-slot:item.check_memo="{ item }"> <template v-slot:item.check_memo="{ item }">
<div class="d-flex align-center my-2" style="min-width: 300px"> <div class="d-flex align-center my-2" style="min-width: 300px">
<v-text-field <v-text-field
@@ -159,6 +176,7 @@ new Vue({
{ text: '*入帳銀行/帳戶 | 支付資訊/帳號後5碼', value: 'acc_num' }, { text: '*入帳銀行/帳戶 | 支付資訊/帳號後5碼', value: 'acc_num' },
{ text: '*入帳日期', value: 'check_date' }, { text: '*入帳日期', value: 'check_date' },
{ text: '*入帳金額', value: 'check_amount' }, { text: '*入帳金額', value: 'check_amount' },
{ text: '*收支項目', value: 'kind' },
{ text: '備註/狀態 | 核對記錄', value: 'check_memo' } { text: '備註/狀態 | 核對記錄', value: 'check_memo' }
], ],
items: [], items: [],
@@ -172,7 +190,8 @@ new Vue({
{ text: '其他問題', value: '4' }, { text: '其他問題', value: '4' },
{ text: '作廢', value: '5' } { text: '作廢', value: '5' }
], ],
bankOptions: [], bankOptions: [],
accountingKinds:[],
payTypeText: { payTypeText: {
1: '現金', 1: '現金',
2: '匯款', 2: '匯款',
@@ -212,6 +231,13 @@ new Vue({
text: x.kind + (x.bank_name ? ' - ' + x.bank_name : '') + (x.bank_id ? ' (' + x.bank_id + ')' : ''), text: x.kind + (x.bank_name ? ' - ' + x.bank_name : '') + (x.bank_id ? ' (' + x.bank_id + ')' : ''),
value: x.num value: x.num
})); }));
const kindRes = await axios.post('../../api/accounting/GetTitleKindList', {}, { params: { page: 1, pageSize: 1000 } });
this.accountingKinds = kindRes.data.list.map(x => ({
text: x.kind ,
value: x.num
}));
this.loading = false; this.loading = false;
}, },
async submitData() { async submitData() {
@@ -246,7 +272,8 @@ new Vue({
acc_num: item.acc_num, acc_num: item.acc_num,
check_date: item.check_date, check_date: item.check_date,
check_amount: item.check_amount, check_amount: item.check_amount,
check_memo: item.check_memo check_memo: item.check_memo,
kind: item.kind
})); }));
try { try {
const res = await axios.post('../../api/transfer_register/batch_update', updateList); const res = await axios.post('../../api/transfer_register/batch_update', updateList);
@@ -65,6 +65,7 @@
</template> </template>
<template v-slot:item.transfer_info="{ item }"> <template v-slot:item.transfer_info="{ item }">
<div> <div>
<div class="font-weight-bold text-primary">應收總額:{{ item.price_totals | currency }}</div>
<div class="font-weight-bold text-primary">入帳金額:{{ item.transfer_check_amount | currency }}</div> <div class="font-weight-bold text-primary">入帳金額:{{ item.transfer_check_amount | currency }}</div>
<div class="text-success">沖帳日期:{{ item.transfer_check_date | date }}</div> <div class="text-success">沖帳日期:{{ item.transfer_check_date | date }}</div>
<div v-if="item.transfer_remain_amount > 0" class="text-warning"> <div v-if="item.transfer_remain_amount > 0" class="text-warning">
@@ -202,6 +203,7 @@
<div class="mb-2"><span class="font-weight-bold">入帳帳戶:</span>{{ dialog.selected.acc_name }}</div> <div class="mb-2"><span class="font-weight-bold">入帳帳戶:</span>{{ dialog.selected.acc_name }}</div>
<div class="mb-2"><span class="font-weight-bold">入帳日期:</span>{{ dialog.selected.transfer_check_date | date }}</div> <div class="mb-2"><span class="font-weight-bold">入帳日期:</span>{{ dialog.selected.transfer_check_date | date }}</div>
<div class="mb-2"><span class="font-weight-bold">入帳金額:</span>{{ dialog.selected.transfer_check_amount | currency }}</div> <div class="mb-2"><span class="font-weight-bold">入帳金額:</span>{{ dialog.selected.transfer_check_amount | currency }}</div>
<div class="mb-2"><span class="font-weight-bold">應收總額:</span>{{ dialog.selected.price_totals | currency }}</div>
</v-col> </v-col>
</v-row> </v-row>
<v-divider class="my-4"></v-divider> <v-divider class="my-4"></v-divider>
+5 -3
View File
@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<configuration> <configuration>
<configSections> <configSections>
<!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 --> <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
@@ -43,11 +43,13 @@
<!--網站的簡稱,用來區別session和cookie--> <!--網站的簡稱,用來區別session和cookie-->
<add key="SC" value="erp17168" /> <add key="SC" value="erp17168" />
<add key="LogPath" value="C:\\log\\" /> <add key="LogPath" value="C:\\log\\" />
<!--是否啟用信眾自動編號 (true=啟用, false=停用)-->
<add key="IsAutoNumbering" value="true" />
</appSettings> </appSettings>
<connectionStrings> <connectionStrings>
<!--SQL用--> <!--SQL用-->
<add name="shopConn" providerName="System.Data.SqlClient" connectionString="Data Source=192.168.5.27;Initial Catalog=17168erp_c;User ID=sa;Password=linux@mssql1234;Encrypt=False;TrustServerCertificate=True;Provider=SQLOLEDB;Connection Timeout=10;" /> <add name="shopConn" providerName="System.Data.SqlClient" connectionString="Data Source=192.168.5.225;Initial Catalog=17168erp_c;User ID=sa;Password=linux@mssql1234;Encrypt=False;TrustServerCertificate=True;Provider=SQLOLEDB;Connection Timeout=10;" />
<add name="ezEntities" providerName="System.Data.EntityClient" connectionString="metadata=res://*/App_Code.Model.Model.csdl|res://*/App_Code.Model.Model.ssdl|res://*/App_Code.Model.Model.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=192.168.5.27;Initial Catalog=17168erp_c;User ID=sa;Password=linux@mssql1234;Encrypt=False;TrustServerCertificate=True;Connection Timeout=10;&quot;" /> <add name="ezEntities" providerName="System.Data.EntityClient" connectionString="metadata=res://*/App_Code.Model.Model.csdl|res://*/App_Code.Model.Model.ssdl|res://*/App_Code.Model.Model.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=192.168.5.225;Initial Catalog=17168erp_c;User ID=sa;Password=linux@mssql1234;Encrypt=False;TrustServerCertificate=True;Connection Timeout=10;&quot;" />
<!-- <!--
--> -->
<!--SQL用--> <!--SQL用-->
+8
View File
@@ -0,0 +1,8 @@
FK_act_bom_actItem1 刪除規則設為 cascade
FK_pro_order_followers 刪除規則設為 cascade
FK_pro_order_activity 刪除規則設為 cascade
FK_pro_order_detail_pro_order 刪除規則設為 cascade
FK_pro_order_detail_followers 刪除規則設為 沒有動作
FK_activity_relating_activity 刪除規則設為 cascade
actitem 加上 sort_order(int) 欄位