diff --git a/web/admin/print/print_list.aspx b/web/admin/print/print_list.aspx
index ef38b51..64b5626 100644
--- a/web/admin/print/print_list.aspx
+++ b/web/admin/print/print_list.aspx
@@ -66,9 +66,15 @@
+ @click.prevent="multiPrintNew">
列印mdi-turn-right
+
+ 預覽mdi-turn-right
+
@@ -334,6 +340,73 @@
},
get_actItem() {
+ },
+ multiPreviewNew() {
+ let list = []
+ //console.log("print_data.selected:",this.print_data.item);
+ this.print_data.selected.forEach(item => {
+ list.push({
+ num: item.num, print_id: item.print_id, order_no: item.order_no, from_id: item.from_id,
+ printed_files: item.printed_files
+ })
+ })
+ if (list.length > 0) {
+ let item = this.print_data.item[0]
+ var params = {
+ item: item.act_item_selected?.val,
+ file: this.print_data.item[0].files[0].num,
+ };
+ // 記錄已列印
+ //let list_num = []
+ //list.forEach(val => {
+ // list_num.push(val.num)
+ //})
+ //let _url = HTTP_HOST + 'api/order/printMultiFileLogNew';
+ //axios.post(_url, list_num, { params: params })
+ // .then(response => {
+ // this.order_data.list.forEach(val => {
+ // val.files.forEach(y => {
+ // y.list.forEach(z => {
+ // if (list_num.includes(z.num)) {
+ // z.isPrinted = true
+ // }
+ // }
+ // )
+
+ // })
+
+ // });
+ // })
+ // .catch(error => {
+ // console.log(error)
+
+ // })
+ _url = HTTP_HOST + 'admin/print/print_multi_new.aspx';
+ var form = document.createElement("form");
+ form.method = "POST";
+ form.action = _url;
+ form.target = "_blank";
+ const addHiddenField = (name, value) => {
+ const hiddenField = document.createElement("input");
+ hiddenField.type = "hidden";
+ hiddenField.name = name;
+ hiddenField.value = value;
+ form.appendChild(hiddenField);
+ };
+
+ // Add form fields
+ addHiddenField("item", item.act_item_selected?.val);
+ addHiddenField("file", this.print_data.item[0].files[0].num);
+ addHiddenField("list", JSON.stringify(list));
+ addHiddenField("title", `${item.act_item_selected} / ${item.subject}`);
+ localStorage.setItem("item", item.act_item_selected?.val);
+ localStorage.setItem("list", JSON.stringify(list));
+ localStorage.setItem("mode", "print");
+
+ document.body.appendChild(form); // Not entirely sure if this is necessary
+ form.submit();
+ document.body.removeChild(form);
+ }
},
multiPrintNew() {
let list = []
diff --git a/銷帳查詢.sql b/銷帳查詢.sql
new file mode 100644
index 0000000..359f6d7
--- /dev/null
+++ b/銷帳查詢.sql
@@ -0,0 +1,65 @@
+WITH Combined_JSON_Details AS (
+ SELECT
+ t.id AS register_id,
+ -- 關鍵點:不管 pay_mode 是什麼,功德人代號與姓名一律優先認 JSON 明細裡面的真正主人
+ -- 如果 JSON 內沒有(格式B),才自動 fallback 回主表的付款人
+ COALESCE(items.[f_num], CASE WHEN t.pay_mode = '個人' THEN t.f_num END) AS final_f_num,
+ COALESCE(items.[follower_name], CASE WHEN t.pay_mode = '個人' THEN t.name END) AS final_follower_name,
+ items.[pro_order_detail_num],
+ items.[reconcile],
+ items.[actitem_name],
+ items.[activity_name],
+ items.[register_date],
+ items.[order_no],
+ items.[price]
+ FROM [transfer_register] AS t
+ -- 動態判定外殼:有 pro_order_detail_items 就走特定路徑,沒有就直接解析陣列根目錄
+ CROSS APPLY OPENJSON(t.[draft], CASE WHEN t.[draft] LIKE '%pro_order_detail_items%' THEN '$.pro_order_detail_items' ELSE '$' END)
+ WITH (
+ [f_num] INT '$.f_num',
+ [follower_name] NVARCHAR(50) '$.follower_name',
+ [pro_order_detail_num] INT '$.pro_order_detail_num',
+ [reconcile] DECIMAL(18,2) '$.reconcile',
+ [actitem_name] NVARCHAR(100) '$.actitem_name',
+ [activity_name] NVARCHAR(100) '$.activity_name',
+ [register_date] DATETIME2 '$.register_date',
+ [order_no] VARCHAR(50) '$.order_no',
+ [price] DECIMAL(18,2) '$.price'
+ ) AS items
+),
+Unique_Order_Activity AS (
+ SELECT pd.num AS pro_order_detail_num, MAX(p.activity_num) AS activity_num
+ FROM pro_order_detail pd
+ INNER JOIN pro_order p ON pd.order_no = p.order_no
+ GROUP BY pd.num
+)
+SELECT
+ t.id AS [轉帳序號],
+ t.pay_mode AS [沖帳型態],
+ t.name AS [主要付款人],
+ t.phone AS [付款人電話],
+ t.amount AS [主單總金額],
+ t.status AS [主單狀態],
+ t.check_amount AS [已核對金額],
+ t.f_num AS [付款人代號],
+
+ -- 【這是關聯實體表】
+ a.activity_num AS [法會編號],
+
+ -- 【這是明細】:共同沖帳已完美歸回「原來功德人」的資訊,不會被付款人蓋過
+ j.final_f_num AS [實際功德人代號],
+ j.final_follower_name AS [實際功德人姓名],
+ j.pro_order_detail_num AS [訂單明細編號],
+ j.order_no AS [訂單編號],
+ j.actitem_name AS [牌位/點燈項目],
+ j.activity_name AS [法會名稱],
+ j.price AS [項目原價],
+ j.reconcile AS [本次實際沖帳金額], -- 金額不重複,可安全進行 SUM 統計
+ j.register_date AS [登記時間],
+ [總金額] =(select sum(price) from pro_order_detail pd where pd.order_no in (
+ select order_no from pro_order p where activity_num=a.activity_num and p.f_num=j.final_f_num
+ ) )
+FROM [transfer_register] AS t
+INNER JOIN Combined_JSON_Details j ON t.id = j.register_id
+LEFT JOIN Unique_Order_Activity a ON a.pro_order_detail_num = j.pro_order_detail_num
+ORDER BY a.activity_num,j.order_no --t.id, j.pro_order_detail_num; -- 依主單序號排序,讓結構「頭是頭、明細是明細」一目了然