From 78ac144a32c17fc228c8a88f4727f85399fcfb45 Mon Sep 17 00:00:00 2001 From: minom Date: Fri, 28 Aug 2026 17:40:19 +0800 Subject: [PATCH] sql script --- web/admin/print/print_list.aspx | 75 ++++++++++++++++++++++++++++++++- 銷帳查詢.sql | 65 ++++++++++++++++++++++++++++ 2 files changed, 139 insertions(+), 1 deletion(-) create mode 100644 銷帳查詢.sql 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; -- 依主單序號排序,讓結構「頭是頭、明細是明細」一目了然