chore: 首次簽入 Thinkyu ASP.NET 專案

- 加入 Visual Studio / ASP.NET .gitignore
- 排除建置輸出、IDE 設定、NuGet packages、大型 MSI 安裝檔
This commit is contained in:
2026-09-10 09:42:37 +08:00
commit 577060bc78
2496 changed files with 501389 additions and 0 deletions
+363
View File
@@ -0,0 +1,363 @@
function CreateReceiptSearchApp() {
const loadMarker = document.getElementById('receiptSearchApp');
if (loadMarker) {
DoCreateReceiptSearchApp();
}
}
function DoCreateReceiptSearchApp() {
window.__vms = window.__vms || {}
if (window.__vms.receiptSearchApp)
return;
console.log('Create receiptSearchApp');
window.__vms.receiptSearchApp = new Vue({
el: '#receiptSearchApp',
mixins: [DateMixin, ToastMixin, ApiMixin],
data: {
searchParams: {
計畫代號: '',
計畫名稱: '',
活動日期_1: '',
活動日期_2: '',
身分別: '',
講師_非講師編號: '',
憑證類別: '',
活動類別: '',
付款方式: '',
領款人姓名: ''
},
dropdown: {
身分別: [],
憑證類別: [],
付款方式: []
},
dataList: [],
selectedItems: [],
selectAll: false,
currentPage: 1,
pageSize: 20,
totalCount: 0,
totalPages: 0,
loading: false
},
created() {
// 從 AJAX 取得查詢用下拉選單資料
this.loadSearchDropdownLists();
// 取回保存的查詢條件
this.searchParams.計畫代號 = document.getElementById('ctl00_ContentPlaceHolder1_hid計畫代號').value;
this.searchParams.計畫名稱 = document.getElementById('ctl00_ContentPlaceHolder1_hid計畫名稱').value;
this.searchParams.活動日期_1 = document.getElementById('ctl00_ContentPlaceHolder1_hid活動日期_1').value;
this.searchParams.活動日期_2 = document.getElementById('ctl00_ContentPlaceHolder1_hid活動日期_2').value;
this.searchParams.身分別 = document.getElementById('ctl00_ContentPlaceHolder1_hid身分別').value;
this.searchParams.憑證類別 = document.getElementById('ctl00_ContentPlaceHolder1_hid憑證類別').value;
this.searchParams.活動類別 = document.getElementById('ctl00_ContentPlaceHolder1_hid活動類別').value;
this.searchParams.付款方式 = document.getElementById('ctl00_ContentPlaceHolder1_hid付款方式').value;
this.searchParams.領款人姓名 = document.getElementById('ctl00_ContentPlaceHolder1_hid領款人姓名').value;
this.currentPage = 1 * document.getElementById('ctl00_ContentPlaceHolder1_hidCurrentPage').value || 1;
this.pageSize = 1 * document.getElementById('ctl00_ContentPlaceHolder1_hidPageSize').value || 20;
},
computed: {
displayPages() {
const pages = [];
const start = Math.max(1, this.currentPage - 2);
const end = Math.min(this.totalPages, this.currentPage + 2);
for (let i = start; i <= end; i++) {
pages.push(i);
}
return pages;
}
},
mounted() {
this.search();
},
methods: {
async loadSearchDropdownLists() {
this.dropdown.身分別 = await this.loadSearchDropdownList("身分別");
this.dropdown.憑證類別 = await this.loadSearchDropdownList("憑證類別");
this.dropdown.付款方式 = await this.loadSearchDropdownList("付款方式");
},
async loadSearchDropdownList(key) {
try {
const result = await this.callApiWithErrorMsg(
'領據處理',
'GetSearchDropdownLists',
{ key: key },
'載入下拉選單'
);
return result.Data || [];
}
catch(error) {
console.error('載入下拉選單失敗:', error);
return [];
}
},
clearSearch() {
this.searchParams.計畫代號 = '';
this.searchParams.計畫名稱 = '';
this.searchParams.活動日期_1 = '';
this.searchParams.活動日期_2 = '';
this.searchParams.身分別 = '';
this.searchParams.憑證類別 = '';
this.searchParams.活動類別 = '';
this.searchParams.付款方式 = '';
this.searchParams.領款人姓名 = '';
this.currentPage = 1;
this.search();
},
async search() {
this.loading = true;
const params = {
pageIndex: this.currentPage,
pageSize: parseInt(this.pageSize),
活動日期_1: this.searchParams.活動日期_1 || null,
活動日期_2: this.searchParams.活動日期_2 || null,
身分別: this.searchParams.身分別 || null,
講師_非講師編號: this.searchParams.講師_非講師編號 || null,
憑證類別: this.searchParams.憑證類別 || null,
計畫代號: this.searchParams.計畫代號 || null,
計畫名稱: this.searchParams.計畫名稱 || null,
活動類別: this.searchParams.活動類別 || null,
付款方式: this.searchParams.付款方式 || null,
領款人姓名: this.searchParams.領款人姓名 || null,
orderBy: ''
};
// 保存查詢條件
document.getElementById('ctl00_ContentPlaceHolder1_hid計畫代號').value = params.計畫代號;
document.getElementById('ctl00_ContentPlaceHolder1_hid計畫名稱').value = params.計畫名稱;
document.getElementById('ctl00_ContentPlaceHolder1_hid活動日期_1').value = params.活動日期_1;
document.getElementById('ctl00_ContentPlaceHolder1_hid活動日期_2').value = params.活動日期_2;
document.getElementById('ctl00_ContentPlaceHolder1_hid身分別').value = params.身分別;
document.getElementById('ctl00_ContentPlaceHolder1_hid憑證類別').value = params.憑證類別;
document.getElementById('ctl00_ContentPlaceHolder1_hid活動類別').value = params.活動類別;
document.getElementById('ctl00_ContentPlaceHolder1_hid付款方式').value = params.付款方式;
document.getElementById('ctl00_ContentPlaceHolder1_hid領款人姓名').value = params.領款人姓名;
document.getElementById('ctl00_ContentPlaceHolder1_hidCurrentPage').value = this.currentPage;
document.getElementById('ctl00_ContentPlaceHolder1_hidPageSize').value = this.pageSize;
try {
let value = null;
const result = await this.callApiWithErrorMsg(
'領據處理',
'SelectPage',
params,
'查詢'
);
// 使用 ConvertDatesInObject 自動轉換日期
this.dataList = this.ConvertDatesInObject(result.Data || [], '-');
this.totalCount = result.TotalCount;
this.totalPages = Math.ceil(this.totalCount / this.pageSize);
this.selectedItems = [];
this.selectAll = false;
// 花花: 儲存當前頁編號清單及總頁數,供領據處理上下筆導航使用
document.getElementById('ctl00_ContentPlaceHolder1_hidIdList').value =
JSON.stringify(this.dataList.map(item => item.編號));
document.getElementById('ctl00_ContentPlaceHolder1_hidNavTotalPages').value = this.totalPages;
}
catch (error) {
console.error('查詢失敗:', error);
}
finally {
this.loading = false;
};
},
searchButtonClick()
{
this.currentPage = 1;
this.search();
},
changePage(page) {
if (page >= 1 && page <= this.totalPages) {
this.currentPage = page;
this.search();
}
},
toggleSelectAll() {
if (this.selectAll) {
this.selectedItems = [...this.dataList];
} else {
this.selectedItems = [];
}
},
addNew() {
// 切換到領據登錄與修改分頁
document.getElementById('ctl00_ContentPlaceHolder1_hid編號').value = '';
window.__doPostBack('ctl00$ContentPlaceHolder1$btnTab2', '');
},
edit(編號) {
// 切換到領據登錄與修改分頁,並進入該行資料的修改
document.getElementById('ctl00_ContentPlaceHolder1_hid編號').value = 編號;
window.__doPostBack('ctl00$ContentPlaceHolder1$btnTab2', '');
},
async printSelected() {
if (this.selectedItems.length === 0) {
this.ShowWarning('請選擇要列印的領據');
return;
}
this.loading = true;
try {
const idList = this.selectedItems.map(item => item.編號);
const result = await this.callApiWithErrorMsg(
'領據處理',
'Print',
{ idList: idList },
'列印領據'
);
if (result.Success) {
// 下載 Excel 檔案
if (result.Data && result.Data.fileName) {
const link = document.createElement('a');
link.href = `data:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;base64,${result.Data.excelData}`;
link.download = result.Data.fileName;
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
this.ShowSuccess(result.Message);
} else {
this.ShowWarning(result.Message);
}
} else
{
this.ShowError('列印失敗: ' + (error.message || '請稍後重試'));
}
// 列印完成後,刷新列表
this.search();
} catch (error) {
this.ShowError('列印失敗: ' + (error.message || '請檢查網路連線'));
} finally {
this.loading = false;
}
},
async doExport() {
if (this.dataList.length === 0) {
this.ShowWarning('請先查詢再匯出');
return;
}
this.loading = true;
try {
const idList = this.selectedItems.map(item => item.編號);
const params = {
活動日期_1: this.searchParams.活動日期_1 || null,
活動日期_2: this.searchParams.活動日期_2 || null,
身分別: this.searchParams.身分別 || null,
講師_非講師編號: this.searchParams.講師_非講師編號 || null,
憑證類別: this.searchParams.憑證類別 || null,
計畫代號: this.searchParams.計畫代號 || null,
計畫名稱: this.searchParams.計畫名稱 || null,
活動類別: this.searchParams.活動類別 || null,
付款方式: this.searchParams.付款方式 || null,
領款人姓名: this.searchParams.領款人姓名 || null,
orderBy: ''
};
const result = await this.callApiWithErrorMsg(
'領據處理',
'Export',
params,
'領據匯出'
);
// 下載 Excel 檔案
if (result.Data && result.Data.fileName) {
const link = document.createElement('a');
link.href = `data:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;base64,${result.Data.excelData}`;
link.download = result.Data.fileName;
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
this.ShowSuccess('匯出完成');
} else {
this.ShowError('匯出失敗,沒有檔案內容');
}
} catch (error) {
this.ShowError('匯出失敗: ' + (error.message || '請檢查網路連線'));
} finally {
this.loading = false;
}
},
//async voidSelected() {
// if (this.selectedItems.length === 0) {
// this.ShowWarning('請選擇要作廢的領據');
// return;
// }
// if (!confirm('確定要作廢/取消作廢選取的領據嗎?')) {
// return;
// }
// this.loading = true;
// try {
// // 並行調用多個 API
// const promises = this.selectedItems.map(item => {
// return this.callApi('領據處理', 'Void', {
// no: item.編號,
// dbAppNo: item.DB_APPNO
// });
// });
// await Promise.all(promises);
// this.ShowSuccess('作廢操作完成');
// this.search();
// } catch (error) {
// console.error('Void error:', error);
// this.ShowError('作廢操作失敗: ' + (error.message || '請檢查網路連線'));
// } finally {
// this.loading = false;
// }
//},
//async deleteSelected() {
// if (this.selectedItems.length === 0) {
// this.ShowWarning('請選擇要刪除的領據');
// return;
// }
// if (!confirm('確定要刪除選取的領據嗎?此操作無法復原!')) {
// return;
// }
// this.loading = true;
// try {
// // 並行調用多個 API
// const promises = this.selectedItems.map(item => {
// return this.callApi('領據處理', 'Delete', {
// no: item.編號,
// dbAppNo: item.DB_APPNO
// });
// });
// await Promise.all(promises);
// this.ShowSuccess('刪除完成');
// this.search();
// } catch (error) {
// console.error('Delete error:', error);
// this.ShowError('刪除失敗: ' + (error.message || '請檢查網路連線'));
// } finally {
// this.loading = false;
// }
//}
}
});
}