migrate to new git
This commit is contained in:
55
data/MEMO250620.txt
Normal file
55
data/MEMO250620.txt
Normal file
@@ -0,0 +1,55 @@
|
||||
|
||||
[以這裡為準]
|
||||
1. 若入帳金額, 不全部沖帳 : 不可以?
|
||||
- 但加上: 暫存草稿功能, 可中途暫存**(需新增JSON)
|
||||
- 若: 入帳:10000, 可沖15000, 5000未沖, 不可只沖8000
|
||||
2. 若入帳金額, 超過餘款 -> 餘額處理原則?
|
||||
- 若: 入帳:10000, 可沖8000, 餘2000:轉:"餘額核銷", 不可再出現
|
||||
---
|
||||
transfer_register : 沖帳流程(經確認的)
|
||||
加欄位:
|
||||
入帳:10000, 可沖:8000, 餘2000
|
||||
加欄位: 記, 餘2000
|
||||
再新增一筆: 金額2000, 並記來源那筆ID
|
||||
|
||||
->
|
||||
畫面進來時:
|
||||
1. 前一步驟確認, 可沖帳金額
|
||||
2. 前次未沖餘額
|
||||
---
|
||||
例:
|
||||
#55, AAA,5/10,$10000,餘2000 -> 結掉
|
||||
....
|
||||
#88, AAA,5/10,$2000, 上一筆: #55
|
||||
|
||||
---
|
||||
[不採此案]
|
||||
A.在同TABLE, 加一列, 記關聯, 餘額
|
||||
B.加"預收款管理系統"?
|
||||
|
||||
----
|
||||
沖帳: 從報名明細中, "收款紀錄":
|
||||
- 由:沖帳流程新增
|
||||
- 例:該功德項目金額=10000, 收款記錄:4*1000, (餘額:6000)
|
||||
- 若有未收餘額, 就會在沖帳時列出, 做為日後收款的沖帳對像
|
||||
|
||||
報名時的金額:
|
||||
- 金額要由功德項目帶入, 不能改金額?
|
||||
- 隨喜金額, 需可改金額?
|
||||
方案:
|
||||
- 品項管理: 加勾選: 可否自訂金額
|
||||
- 報名(新增)時: 若品項有勾選, 就可自訂
|
||||
- 儲存後: 不可修改金額
|
||||
- "結緣": 獨立建立, 0元, 不可修改金額
|
||||
- 例: 隨喜 $10000, 結緣:3項 x $0
|
||||
|
||||
---
|
||||
討論: 溢收款銷帳?
|
||||
目前: 以EXCEL管理
|
||||
|
||||
---
|
||||
例1(OK): 入帳:10000, 可沖:8000, 餘2000 ->
|
||||
- 本筆入帳完成, 轉到: 餘額核銷, 另外沖帳新項目
|
||||
- 這筆不再出現在入帳/沖帳流程
|
||||
|
||||
例2(??): 入帳:10000, 可沖:12000, 但人工沖:8000,
|
||||
20
data/MEMO250627.txt
Normal file
20
data/MEMO250627.txt
Normal file
@@ -0,0 +1,20 @@
|
||||
# 17168, 06/27
|
||||
|
||||
http://localhost:33051/admin/transfer/balance_reconcile.aspx
|
||||
選取項目:加:金額
|
||||
核銷項目: 單項或多項??
|
||||
- 維持單項, 記錄: "依據來源", 信眾意思, 內部審核?
|
||||
- 建議: 嚴謹: 要先有"報名", 才能"沖帳", 不可以有"餘額核銷", 適合大道場
|
||||
- 加審核? 新增狀態確認?
|
||||
常用項目: 指定列表?
|
||||
- 沒有輸入金額: 因為必需全額核銷.
|
||||
- 在品項中, 加勾選 : 會計核銷參照
|
||||
- 在餘額核銷, 選取品項時:
|
||||
- 預設只抓"會計核銷參照"
|
||||
- 要有選項:可找, 選其它項目
|
||||
|
||||
Draft : single json list -> object of lists(and key/value)
|
||||
---
|
||||
http://localhost:33051/admin/transfer/verify.aspx
|
||||
出納: 2程序, 分畫面, 以便指定不同人負責
|
||||
|
||||
36
data/MEMO250711.txt
Normal file
36
data/MEMO250711.txt
Normal file
@@ -0,0 +1,36 @@
|
||||
AA2503300003
|
||||
AA2503300001
|
||||
|
||||
資料狀態:統合查詢->產出報表
|
||||
- ex: 從報名: by 活動, 人, 物(數量, 金額, 已收/未收),
|
||||
- 先做查詢條件,
|
||||
- req, ex: 每日: 報名人數, 報名項目, 統計
|
||||
- 綜效: 報名人數? 功德項目? 應收/未收/已收?
|
||||
- 報名人介定? 用品項區隔: 如: 一般:$100,結緣:$0,隨喜:$1
|
||||
|
||||
verify2:acc. ,
|
||||
personal_reconcile:pro-ord-rec
|
||||
|
||||
order/reg.aspx, 編輯牌位: 人名旁:顯示稱謂
|
||||
|
||||
|
||||
114年度清明祭祖法會
|
||||
AA2503290011
|
||||
2025/3/29 消災-隨喜牌位 1000 0 1,000
|
||||
|
||||
|
||||
---
|
||||
|
||||
|
||||
- 沖帳完查詢: 查詢沖帳結果: 參考
|
||||
http://localhost:33051/admin/transfer/balance_reconcile_query.aspx
|
||||
(指定條件, 有沖帳的項目)
|
||||
(日期, 法會, 信眾)
|
||||
- 收據編號:? 因為一筆入帳可能有多人分拆, 所以不宜在沖帳時做, 應另定流程處理
|
||||
|
||||
Q: 待繳金額:大額/長期?
|
||||
|
||||
---
|
||||
|
||||
|
||||
|
||||
BIN
data/SQL/17168_db_schema.sql
Normal file
BIN
data/SQL/17168_db_schema.sql
Normal file
Binary file not shown.
1
data/SQL/actItem.sql
Normal file
1
data/SQL/actItem.sql
Normal file
@@ -0,0 +1 @@
|
||||
ALTER TABLE actItem ADD IsDel BIT NOT NULL DEFAULT 0;
|
||||
1
data/SQL/followers.sql
Normal file
1
data/SQL/followers.sql
Normal file
@@ -0,0 +1 @@
|
||||
ALTER TABLE followers ADD IsDel BIT NOT NULL DEFAULT 0;
|
||||
202
data/SQL/transform_tablet.sql
Normal file
202
data/SQL/transform_tablet.sql
Normal file
@@ -0,0 +1,202 @@
|
||||
/*
|
||||
C# version of join_text:
|
||||
|
||||
public class TabletItem
|
||||
{
|
||||
public int num { get; set; }
|
||||
public string fam_name { get; set; }
|
||||
public object fam_gender { get; set; }
|
||||
public object deceased { get; set; }
|
||||
public bool option_break { get; set; }
|
||||
}
|
||||
|
||||
public class TabletJson
|
||||
{
|
||||
public List<TabletItem> mid_items { get; set; }
|
||||
public List<TabletItem> left_items { get; set; }
|
||||
}
|
||||
|
||||
public string JoinText(List<TabletItem> items)
|
||||
{
|
||||
if (items == null || items.Count == 0)
|
||||
return string.Empty;
|
||||
|
||||
StringBuilder result = new StringBuilder();
|
||||
|
||||
for (int i = 0; i < items.Count; i++)
|
||||
{
|
||||
result.Append(items[i].fam_name);
|
||||
|
||||
// Add break if option_break is true and not the last item
|
||||
if (items[i].option_break && i < items.Count - 1)
|
||||
{
|
||||
result.Append("<br>");
|
||||
}
|
||||
// Add space between names if not the last item and no break
|
||||
else if (i < items.Count - 1)
|
||||
{
|
||||
result.Append(" ");
|
||||
}
|
||||
}
|
||||
|
||||
return result.ToString();
|
||||
}
|
||||
|
||||
// Usage example:
|
||||
public string[] ProcessTabletJson(string jsonString)
|
||||
{
|
||||
string[] ret = new string[2];
|
||||
|
||||
// Deserialize JSON string to TabletJson object
|
||||
TabletJson tabletJsonObj = JsonConvert.DeserializeObject<TabletJson>(jsonString);
|
||||
|
||||
// Process mid_items and left_items
|
||||
ret[0] = JoinText(tabletJsonObj.mid_items);
|
||||
ret[1] = JoinText(tabletJsonObj.left_items);
|
||||
|
||||
return ret;
|
||||
}
|
||||
*/
|
||||
|
||||
-- {"mid_items":[
|
||||
-- {"num":0,"fam_name":" ","fam_gender":null,"deceased":null,"option_break":true},
|
||||
-- {"num":0,"fam_name":"無始劫以來累世冤親債主1 ","fam_gender":null,"deceased":null,"option_break":true},
|
||||
-- {"num":0,"fam_name":"無始劫以來累世冤親債主2 ","fam_gender":null,"deceased":null,"option_break":true},
|
||||
-- {"num":0,"fam_name":" ","fam_gender":null,"deceased":null,"option_break":true}],
|
||||
-- "left_items":[
|
||||
-- {"num":0,"fam_name":" ","fam_gender":null,"deceased":null,"option_break":true},
|
||||
-- {"num":0,"fam_name":"祁哲榮1 ","fam_gender":null,"deceased":null,"option_break":true},
|
||||
-- {"num":0,"fam_name":"祁哲榮2","fam_gender":null,"deceased":null,"option_break":true}
|
||||
-- ]}
|
||||
|
||||
-- 轉換牌位文本為 JSON 格式
|
||||
DECLARE @InputText NVARCHAR(MAX)
|
||||
DECLARE @Result NVARCHAR(MAX)
|
||||
DECLARE @MidText NVARCHAR(MAX)
|
||||
DECLARE @LeftText NVARCHAR(MAX)
|
||||
DECLARE @StartPos INT
|
||||
DECLARE @EndPos INT
|
||||
DECLARE @Line NVARCHAR(1000)
|
||||
DECLARE @First BIT
|
||||
DECLARE @MidStart INT
|
||||
DECLARE @LeftStart INT
|
||||
|
||||
-- 宣告游標變數
|
||||
DECLARE @num INT
|
||||
DECLARE @f_num_tablet NVARCHAR(MAX)
|
||||
DECLARE @from_id_tablet NVARCHAR(MAX)
|
||||
|
||||
-- 宣告游標
|
||||
DECLARE tablet_cursor CURSOR FOR
|
||||
SELECT num, f_num_tablet, from_id_tablet
|
||||
FROM pro_order_detail
|
||||
|
||||
-- 打開游標
|
||||
OPEN tablet_cursor
|
||||
|
||||
-- 讀取第一筆資料
|
||||
FETCH NEXT FROM tablet_cursor INTO @num, @f_num_tablet, @from_id_tablet
|
||||
|
||||
-- 開始處理每一筆資料
|
||||
WHILE @@FETCH_STATUS = 0
|
||||
BEGIN
|
||||
-- 設置輸入文本
|
||||
SET @InputText = @from_id_tablet
|
||||
|
||||
-- 找到 #牌位 和 #陽上 的位置
|
||||
SET @MidStart = CHARINDEX('#牌位', @InputText) + 3
|
||||
SET @LeftStart = CHARINDEX('#陽上', @InputText)
|
||||
|
||||
-- 如果找到正確的格式
|
||||
IF @MidStart > 3 AND @LeftStart > 0
|
||||
BEGIN
|
||||
-- 取得兩段文字
|
||||
SET @MidText = SUBSTRING(@InputText, @MidStart, @LeftStart - @MidStart)
|
||||
SET @LeftText = SUBSTRING(@InputText, @LeftStart + 3, LEN(@InputText))
|
||||
|
||||
-- 建立 JSON
|
||||
SET @Result = '{"mid_items":['
|
||||
|
||||
-- 處理 mid_items
|
||||
SET @StartPos = 1
|
||||
SET @EndPos = CHARINDEX(CHAR(10), @MidText, @StartPos)
|
||||
SET @First = 1
|
||||
|
||||
WHILE @EndPos > 0
|
||||
BEGIN
|
||||
SET @Line = LTRIM(RTRIM(REPLACE(REPLACE(REPLACE(
|
||||
SUBSTRING(@MidText, @StartPos, @EndPos - @StartPos),
|
||||
CHAR(13), ''), CHAR(10), ''), CHAR(9), '')))
|
||||
IF LEN(@Line) > 0
|
||||
BEGIN
|
||||
IF @First = 0
|
||||
SET @Result = @Result + ','
|
||||
SET @Result = @Result + '{"num":0,"fam_name":"' + @Line +
|
||||
'","fam_gender":null,"deceased":null,"option_break":true}'
|
||||
SET @First = 0
|
||||
END
|
||||
SET @StartPos = @EndPos + 1
|
||||
SET @EndPos = CHARINDEX(CHAR(10), @MidText, @StartPos)
|
||||
END
|
||||
|
||||
SET @Line = LTRIM(RTRIM(REPLACE(REPLACE(REPLACE(
|
||||
SUBSTRING(@MidText, @StartPos, LEN(@MidText)),
|
||||
CHAR(13), ''), CHAR(10), ''), CHAR(9), '')))
|
||||
IF LEN(@Line) > 0
|
||||
BEGIN
|
||||
IF @First = 0
|
||||
SET @Result = @Result + ','
|
||||
SET @Result = @Result + '{"num":0,"fam_name":"' + @Line +
|
||||
'","fam_gender":null,"deceased":null,"option_break":true}'
|
||||
END
|
||||
|
||||
SET @Result = @Result + '],"left_items":['
|
||||
|
||||
-- 處理 left_items
|
||||
SET @StartPos = 1
|
||||
SET @EndPos = CHARINDEX(CHAR(10), @LeftText, @StartPos)
|
||||
SET @First = 1
|
||||
|
||||
WHILE @EndPos > 0
|
||||
BEGIN
|
||||
SET @Line = LTRIM(RTRIM(REPLACE(REPLACE(REPLACE(
|
||||
SUBSTRING(@LeftText, @StartPos, @EndPos - @StartPos),
|
||||
CHAR(13), ''), CHAR(10), ''), CHAR(9), '')))
|
||||
IF LEN(@Line) > 0
|
||||
BEGIN
|
||||
IF @First = 0
|
||||
SET @Result = @Result + ','
|
||||
SET @Result = @Result + '{"num":0,"fam_name":"' + @Line +
|
||||
'","fam_gender":null,"deceased":null,"option_break":true}'
|
||||
SET @First = 0
|
||||
END
|
||||
SET @StartPos = @EndPos + 1
|
||||
SET @EndPos = CHARINDEX(CHAR(10), @LeftText, @StartPos)
|
||||
END
|
||||
|
||||
SET @Line = LTRIM(RTRIM(REPLACE(REPLACE(REPLACE(
|
||||
SUBSTRING(@LeftText, @StartPos, LEN(@LeftText)),
|
||||
CHAR(13), ''), CHAR(10), ''), CHAR(9), '')))
|
||||
IF LEN(@Line) > 0
|
||||
BEGIN
|
||||
IF @First = 0
|
||||
SET @Result = @Result + ','
|
||||
SET @Result = @Result + '{"num":0,"fam_name":"' + @Line +
|
||||
'","fam_gender":null,"deceased":null,"option_break":true}'
|
||||
END
|
||||
|
||||
SET @Result = @Result + ']}'
|
||||
|
||||
-- 更新資料庫
|
||||
UPDATE pro_order_detail
|
||||
SET f_num_tablet = @Result
|
||||
WHERE num = @num
|
||||
END
|
||||
|
||||
-- 讀取下一筆資料
|
||||
FETCH NEXT FROM tablet_cursor INTO @num, @f_num_tablet, @from_id_tablet
|
||||
END
|
||||
|
||||
-- 關閉並釋放游標
|
||||
CLOSE tablet_cursor
|
||||
DEALLOCATE tablet_cursor
|
||||
191
data/memo/DRAFT_FIELD_IMPROVEMENT.md
Normal file
191
data/memo/DRAFT_FIELD_IMPROVEMENT.md
Normal file
@@ -0,0 +1,191 @@
|
||||
# Draft 欄位改進方案
|
||||
|
||||
## 問題描述
|
||||
|
||||
原本的 `draft` 欄位被用於兩種不同目的,導致資料結構混亂:
|
||||
|
||||
1. **暫存沖帳分配** - 在個人沖帳流程中暫存使用者的沖帳金額分配
|
||||
2. **歷史沖帳記錄** - 記錄已完成的沖帳明細
|
||||
|
||||
這導致兩種不同用途的資料互相覆蓋,造成資料不一致的問題。
|
||||
|
||||
## 改進方案
|
||||
|
||||
將原本的純陣列格式改為物件格式,包含兩個子陣列:
|
||||
|
||||
### 新的 draft 欄位格式
|
||||
```json
|
||||
{
|
||||
"transfer_draft": [
|
||||
{
|
||||
"pro_order_detail_num": "訂單明細編號",
|
||||
"reconcile": "沖帳金額"
|
||||
}
|
||||
],
|
||||
"pro_order_detail_items": [
|
||||
{
|
||||
"pro_order_detail_num": "訂單明細編號",
|
||||
"reconcile": "沖帳金額",
|
||||
"activity_name": "活動名稱",
|
||||
"actitem_name": "項目名稱",
|
||||
"price": "原始金額",
|
||||
"register_date": "報名日期",
|
||||
"order_no": "訂單編號"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
### 1. `transfer_draft` - 暫存沖帳分配
|
||||
**用途:**
|
||||
- 在 `personal_reconcile.aspx` 中暫存使用者的沖帳金額分配
|
||||
- 顯示 📝 圖示表示有暫存資料
|
||||
- 支援「暫存」和「重新分配」功能
|
||||
|
||||
### 2. `pro_order_detail_items` - 沖帳明細記錄
|
||||
**用途:**
|
||||
- 在 `balance_reconcile.aspx` 中顯示歷史沖帳記錄
|
||||
- 在 `balance_reconcile_query.aspx` 中顯示選取項目
|
||||
- 包含完整的活動和項目資訊
|
||||
|
||||
## 向後相容性
|
||||
|
||||
程式碼會自動檢測格式並處理:
|
||||
|
||||
### 新格式(物件)
|
||||
```json
|
||||
{
|
||||
"transfer_draft": [...],
|
||||
"pro_order_detail_items": [...]
|
||||
}
|
||||
```
|
||||
|
||||
### 舊格式(陣列)
|
||||
```json
|
||||
[
|
||||
{
|
||||
"pro_order_detail_num": "12345",
|
||||
"reconcile": 5000
|
||||
}
|
||||
]
|
||||
```
|
||||
|
||||
## 修改的檔案
|
||||
|
||||
### personal_reconcile.aspx
|
||||
- 更新 `loadFromDraftOrAutoDistribute()` 方法支援新舊格式
|
||||
- 更新 `saveDraft()` 方法使用新格式
|
||||
- 新增 `hasTransferDraft()` 方法檢查暫存資料
|
||||
- 更新顯示邏輯使用新格式
|
||||
|
||||
### balance_reconcile.aspx
|
||||
- 更新歷史記錄載入邏輯支援新格式
|
||||
- 更新詳細資訊顯示邏輯支援新格式
|
||||
- 保持向後相容性
|
||||
|
||||
### balance_reconcile_query.aspx
|
||||
- 更新 `getDraftItems()` 方法支援新舊格式
|
||||
- 更新項目顯示邏輯
|
||||
|
||||
## 資料安全保護機制
|
||||
|
||||
為了確保 `transfer_draft` 和 `pro_order_detail_items` 的操作互不影響,實作了以下保護機制:
|
||||
|
||||
### 1. 統一工具函數
|
||||
所有頁面都使用統一的 `draft-utils.js` 工具函數:
|
||||
- `window.DraftUtils.getDraftObject(draft)` - 安全解析 draft 欄位
|
||||
- `window.DraftUtils.getDraftField(draft, fieldName)` - 安全取得特定欄位
|
||||
- `window.DraftUtils.updateDraftField(draft, fieldName, newValue)` - 安全更新特定欄位
|
||||
- `window.DraftUtils.hasTransferDraft(draft)` - 檢查是否有暫存資料
|
||||
- `window.DraftUtils.hasProOrderDetailItems(draft)` - 檢查是否有歷史記錄
|
||||
|
||||
### 2. 操作範例
|
||||
|
||||
**更新 transfer_draft(不會影響 pro_order_detail_items):**
|
||||
```javascript
|
||||
const currentDraft = this.dialog.selected.draft || '';
|
||||
const newTransferDraft = this.dialog.items
|
||||
.filter(item => Number(item.reconcile) > 0)
|
||||
.map(item => ({
|
||||
pro_order_detail_num: item.num,
|
||||
reconcile: Number(item.reconcile)
|
||||
}));
|
||||
|
||||
const newDraftObj = window.DraftUtils.updateDraftField(currentDraft, 'transfer_draft', newTransferDraft);
|
||||
```
|
||||
|
||||
**更新 pro_order_detail_items(不會影響 transfer_draft):**
|
||||
```javascript
|
||||
const currentDraft = item.draft || '';
|
||||
const newDetailItems = [
|
||||
{
|
||||
pro_order_detail_num: "123",
|
||||
reconcile: 5000,
|
||||
activity_name: "法會",
|
||||
actitem_name: "護持金"
|
||||
}
|
||||
];
|
||||
|
||||
const newDraftObj = window.DraftUtils.updateDraftField(currentDraft, 'pro_order_detail_items', newDetailItems);
|
||||
```
|
||||
|
||||
**檢查是否有暫存資料:**
|
||||
```javascript
|
||||
if (window.DraftUtils.hasTransferDraft(item.draft)) {
|
||||
console.log('有暫存資料');
|
||||
}
|
||||
```
|
||||
|
||||
**取得特定欄位:**
|
||||
```javascript
|
||||
const transferDraft = window.DraftUtils.getDraftField(item.draft, 'transfer_draft');
|
||||
const detailItems = window.DraftUtils.getDraftField(item.draft, 'pro_order_detail_items');
|
||||
```
|
||||
|
||||
### 3. 統一工具檔案
|
||||
建立了 `draft-utils.js` 統一工具檔案,所有頁面都引用此檔案:
|
||||
- 所有 draft 操作函數統一管理
|
||||
- 格式驗證功能
|
||||
- 向後相容性處理
|
||||
- 詳細的使用範例
|
||||
- 避免程式碼重複,提升維護性
|
||||
|
||||
### 4. 頁面引用方式
|
||||
每個 `.aspx` 頁面都在 `<script>` 標籤前加入:
|
||||
```html
|
||||
<script src="draft-utils.js"></script>
|
||||
```
|
||||
|
||||
然後使用 `window.DraftUtils` 來呼叫工具函數,確保所有頁面使用相同的邏輯。
|
||||
|
||||
### 5. 完整工具函數清單
|
||||
`draft-utils.js` 提供以下工具函數:
|
||||
|
||||
**基本操作:**
|
||||
- `getDraftObject(draft)` - 解析 draft 欄位,返回標準化物件
|
||||
- `getDraftField(draft, fieldName)` - 安全取得特定欄位
|
||||
- `updateDraftField(draft, fieldName, newValue)` - 安全更新特定欄位
|
||||
- `clearDraftField(draft, fieldName)` - 清除特定欄位
|
||||
|
||||
**檢查函數:**
|
||||
- `hasTransferDraft(draft)` - 檢查是否有暫存資料
|
||||
- `hasProOrderDetailItems(draft)` - 檢查是否有歷史記錄
|
||||
|
||||
**工具函數:**
|
||||
- `mergeDraftObjects(draft1, draft2)` - 合併兩個 draft 物件
|
||||
- `validateDraftFormat(draft)` - 驗證 draft 格式
|
||||
- `getDraftSummary(draft)` - 取得 draft 摘要資訊
|
||||
- `migrateLegacyFormat(draft)` - 將舊格式轉換為新格式
|
||||
- `cleanEmptyDraft(draft)` - 清理空的 draft 欄位
|
||||
- `formatDraftJson(draft)` - 格式化 draft JSON 為可讀字串
|
||||
|
||||
## 優點
|
||||
|
||||
1. **職責分離** - 每個子陣列有明確的用途
|
||||
2. **資料一致性** - 避免不同用途的資料互相覆蓋
|
||||
3. **向後相容** - 支援舊格式,無需資料庫變更
|
||||
4. **易於維護** - 程式碼邏輯更清晰
|
||||
5. **擴展性** - 未來可以添加更多子陣列
|
||||
6. **資料安全** - 確保各欄位操作互不影響
|
||||
7. **程式碼統一** - 所有頁面使用相同的工具函數
|
||||
8. **功能完整** - 提供豐富的工具函數支援各種操作需求
|
||||
79
data/memo/memo-0606.txt
Normal file
79
data/memo/memo-0606.txt
Normal file
@@ -0,0 +1,79 @@
|
||||
http://localhost:33051/admin/transfer/register.aspx
|
||||
法會名稱 --> 活動名稱, (或帶活動ID, 只顯示, 不選)
|
||||
要有"不確定, 待查"選項, 區隔出空值
|
||||
|
||||
"匯款"帳號後五碼 (註明: 若無免填)
|
||||
|
||||
付款 -> 支付
|
||||
|
||||
http://localhost:33051/admin/transfer/verify.aspx
|
||||
狀態:
|
||||
己確認: 人/錢 , 分開
|
||||
增加: 查詢功能, 狀態過濾, 期間
|
||||
(經查詢, 可把作廢資料調回, 注意: 帳已完成不可回溯)
|
||||
|
||||
階段1: 也要輸入核對記錄, 值:共用
|
||||
|
||||
階段12 -> 程序1,2
|
||||
2-> 2A, 2B :
|
||||
2A : 有報名 (目前)
|
||||
2B : 無報名 (待討論, 屬於勸募活動及一般性捐款)
|
||||
|
||||
"已"確認, 作廢 -> 不要"已"
|
||||
|
||||
--
|
||||
|
||||
## 11:19 🥬ྀྀི 鈺
|
||||
請問複製以往報名為什麼沒有清明法會的紀錄
|
||||
|
||||
## 19:46 Allen Wang (王振邦)
|
||||
請確認複製信眾以往報名資料,是否只會帶入信眾最近一次參加的法會
|
||||
(例如沒參加今年清明法會,但有參加過去年梁皇法會,所以只出現梁皇法會)。
|
||||
請再確認協助讓同仁釐清邏輯。
|
||||
|
||||
### 翻頁問題
|
||||
|
||||
## 19:55 Allen Wang (王振邦)
|
||||
明日會議一樣維持10:30,討論項目如下:
|
||||
1. 法會功德款收款及對帳功能進度。
|
||||
2. 不是講堂法會報名,僅列印牌位的處理方式。
|
||||
(稍晚再將今日齋僧大會列印牌位問題詳列)
|
||||
|
||||
## 20:27 Allen Wang (王振邦)
|
||||
今日處理齋僧大會僅列印牌位議題說明如下:
|
||||
|
||||
### 一、有關處理僅列印牌位,
|
||||
信眾報名法會帶入過往報名法會資料,系統功能待查問題:
|
||||
1. 複製過往法會信眾報名資料,只出現信眾前次報名法會,無法彈性選擇過往法會。(確認邏輯)
|
||||
2. 選擇過往法會報名信眾後,信眾的親友資料會有不完整現象。(查是否因只出現前次資料)
|
||||
3. 複製過往信眾報名資料後,功德項目的牌位上功德項目與編號不要帶入,例如總功德主複製後總功德主及編號不要帶入。
|
||||
4. 複製過往報名資料,牌位類型變更後,牌位內容版面需要調整,例如大牌位變更為隨喜牌位,版面需要人工修改。
|
||||
|
||||
### 二、基金會處理信眾報名的親友牌位資料問題:
|
||||
再次重申取得信眾報名時親友稱謂是重要的,若不完整,
|
||||
親屬、員工、其他等等混雜難以區分,當信眾要再次報名或只印牌位,只能人工確認,
|
||||
若舊親友資料太多乾脆重建新建親友資料。
|
||||
|
||||
### 三、法會報名順序涉及系統功能及邏輯,
|
||||
要再與各位說明清楚,目前順序如下:
|
||||
1. 選擇法會
|
||||
選擇要參加的法會(如果不是法會就要另建類似法會的活動)
|
||||
2. 選擇功德項目
|
||||
選擇要參加法會的功德項目,包含功德主及牌位類型。
|
||||
3. 選擇或新建親友資料(同時校正親友存歿資料)。
|
||||
|
||||
### 四、有關只印牌位處理方式:
|
||||
如果只要產出牌位,就不要在正常的法會報名程序處理,
|
||||
目前用例行性牌位處理要再思考合理性及便利性。
|
||||
|
||||
---
|
||||
# 因應調整:
|
||||
https://demo2.eztrust.tw/17168erp_e/admin/order/reg.aspx?order_no=AA2506130012
|
||||
編輯牌位 , "可選" , 加上"稱謂"
|
||||
|
||||
https://demo2.eztrust.tw/17168erp_e/admin/follower/reg.aspx?num=17691
|
||||
親友名單, 載入
|
||||
|
||||
https://demo2.eztrust.tw/17168erp_e/admin/order/reg.aspx?order_no=AA2506130012
|
||||
複製以往報名 : 訂單編號/牌位項目/活動: 合一欄,
|
||||
加一欄:標題/陽上
|
||||
41
data/memo/memo-0714.md
Normal file
41
data/memo/memo-0714.md
Normal file
@@ -0,0 +1,41 @@
|
||||
# localhost
|
||||
url: http://localhost:33051/admin/index.aspx
|
||||
path: D:\dev\ez\17168erp\git_gitea\web\index.htm
|
||||
sql: localhost, 17168erp_e2
|
||||
|
||||
# demo2: /17168erp , 測試資料, 最新DB(20250714)
|
||||
sql: demo2, 17168ERP_2022
|
||||
|
||||
# demo2: /17168erp_e , 正式資料
|
||||
sql: demo2, 17168ERP_e2
|
||||
結構:待更新為最新結構
|
||||
|
||||
# demo2: /17168erp_t
|
||||
sql: demo2, 17168ERP_t
|
||||
|
||||
--
|
||||
#GITEE
|
||||
https://git.hcu.edu.tw/user/login
|
||||
yiming
|
||||
XrxCAdgX3BwMc6r
|
||||
|
||||
----
|
||||
|
||||
新程式上傳:
|
||||
https://demo2.eztrust.tw/17168erp_t/admin
|
||||
此區: 新程式測試區, DB為新架構, 測試資料
|
||||
新功能: 權限設定進行中
|
||||
|
||||
https://demo2.eztrust.tw/17168erp_e/admin/
|
||||
此區: 正式資料, 前版程式,
|
||||
等"新程式測試區"設定好, 此區更新結構, 不動現有資料
|
||||
|
||||
GIT:
|
||||
己合併各分支於:main
|
||||
最新結構不含資料:
|
||||
~\data\SQL\17168_db_schema.sql
|
||||
|
||||
最新結構含測試資料:
|
||||
另傳雲端連結給開杰
|
||||
https://drive.google.com/file/d/1eefpyIdGjbQInSSDp7FrNGiFSD1sQ4q6/view?usp=sharing
|
||||
|
||||
218
data/memo/memo_plan_pay.md
Normal file
218
data/memo/memo_plan_pay.md
Normal file
@@ -0,0 +1,218 @@
|
||||
# DOCS
|
||||
|
||||
## files
|
||||
D:\dev\ez\17168erp\git_gitea\web\admin\activity\index.aspx.cs
|
||||
D:\dev\ez\17168erp\git_gitea\web\admin\follower\index.aspx.cs
|
||||
D:\dev\ez\17168erp\git_gitea\web\admin\follower\reg.aspx.cs
|
||||
D:\dev\ez\17168erp\git_gitea\web\admin\order\index.aspx.cs
|
||||
D:\dev\ez\17168erp\git_gitea\web\admin\order\reg.aspx.cs
|
||||
D:\dev\ez\17168erp\git_gitea\web\admin\accounting\kind_reg.aspx.cs
|
||||
D:\dev\ez\17168erp\git_gitea\web\admin\accounting\kind_reg2.aspx.cs
|
||||
D:\dev\ez\17168erp\git_gitea\web\admin\accounting\index.aspx.cs
|
||||
D:\dev\ez\17168erp\git_gitea\web\admin\accounting\news_reg.aspx.cs
|
||||
|
||||
D:\dev\ez\17168erp\git_gitea\web\App_Code\api\orderController.cs
|
||||
|
||||
## DESC
|
||||
|
||||
### 檔案主要功能說明
|
||||
|
||||
1. `activity/index.aspx.cs`:活動管理系統主頁,負責活動分類建立、管理及活動資料匯出Excel。
|
||||
2. `follower/index.aspx.cs`:信眾管理系統主頁,負責信眾資料查詢、管理及匯出。
|
||||
3. `order/index.aspx.cs`、`order/reg.aspx.cs`:訂單管理系統,負責訂單查詢與登記。
|
||||
4. `accounting/index.aspx.cs`:會計系統主頁。
|
||||
5. `accounting/kind_reg.aspx.cs`、`kind_reg2.aspx.cs`:會計科目分類登記。
|
||||
6. `accounting/news_reg.aspx.cs`:會計相關新聞或公告登記。
|
||||
|
||||
系統採用 ASP.NET Web Forms 與 Entity Framework,涵蓋信眾、活動、訂單、會計等模組。
|
||||
|
||||
---
|
||||
|
||||
### 訂單收款記錄管理作業流程
|
||||
|
||||
1. 使用者點擊「收款紀錄」按鈕,開啟對話框並呼叫 `payOrderList2()` 載入資料。
|
||||
2. 前端檢查訂單編號與明細編號,設定分頁參數,呼叫API取得收款記錄。
|
||||
3. 後端API接收查詢條件,查詢 `pro_order_record`,回傳付款日期、方式、金額、機構、銀行代碼等資訊。
|
||||
4. 前端以Vuetify資料表格顯示收款記錄,支援搜尋、分頁、排序。
|
||||
5. 支援新增、編輯、刪除收款記錄。
|
||||
6. 表格排序或分頁設定改變時自動重新載入資料。
|
||||
|
||||
用途:追蹤訂單收款狀況、管理多筆收款記錄、查詢與管理介面、支援多種付款方式。
|
||||
|
||||
---
|
||||
# 功能延伸
|
||||
|
||||
## 信眾-登錄匯款
|
||||
|
||||
### TABLE結構
|
||||
|
||||
新增暫存表 `remittance_register_tmp`:
|
||||
|
||||
| 欄位名稱 | 型態 | 說明 |
|
||||
|------------------|----------------|----------------------------|
|
||||
| id | int, PK, AI | 主鍵,自動編號 |
|
||||
| activity_id | int | 對應法會/活動ID(可選) |
|
||||
| name | nvarchar(50) | 姓名/暱稱/法號 |
|
||||
| phone | nvarchar(30) | 聯絡電話 |
|
||||
| pay_type | nvarchar(20) | 付款方式(現金/匯款等) |
|
||||
| account_last5 | nvarchar(10) | 帳號後五碼 |
|
||||
| amount | decimal(12,2) | 付款金額 |
|
||||
| pay_mode | nvarchar(10) | 付款型態(個人/共同) |
|
||||
| note | nvarchar(200) | 備註 |
|
||||
| proof_img | nvarchar(200) | 憑證圖檔路徑 |
|
||||
| status | nvarchar(20) | 狀態(待核對/已入帳/作廢) |
|
||||
| create_time | datetime | 建立時間 |
|
||||
| verify_time | datetime | 核對/入帳時間 |
|
||||
| verify_user | nvarchar(50) | 核對人員 |
|
||||
| verify_note | nvarchar(200) | 核對說明 |
|
||||
| recaptcha_token | nvarchar(200) | reCAPTCHA驗證(可選) |
|
||||
|
||||
---
|
||||
|
||||
### 畫面設計說明
|
||||
|
||||
1. 進入方式:法會/活動頁面連結或QRcode進入,可帶入活動ID參數。
|
||||
2. 表單欄位:姓名(可匿名/暱稱/法號)、電話、付款方式、帳號後5碼、付款金額、付款型態、備註、匯款憑證上傳、reCAPTCHA驗證。
|
||||
3. 操作流程:填寫表單送出,資料以JSON送API,成功後顯示訊息或QRcode,所有資料進入暫存表,不直接入帳,後台人工核對後正式入帳。
|
||||
4. 設計重點:手機友善、圖片上傳、送出後明確回饋、不強制檢查資料正確性但利於後續人工核對、加reCAPTCHA防灌單。
|
||||
|
||||
---
|
||||
## 核對入帳資訊
|
||||
|
||||
### TABLE結構說明
|
||||
|
||||
主表 `remittance_check`,記錄每筆待核對與已核對入帳資料。
|
||||
|
||||
| 欄位名稱 | 型態 | 說明 |
|
||||
|------------------|----------------|----------------------------------------|
|
||||
| id | int, PK, AI | 主鍵,自動編號 |
|
||||
| tmp_id | int | 對應暫存登錄表(remittance_register_tmp)的ID |
|
||||
| match_signup_id | int | 自動或人工比對到的報名信眾ID |
|
||||
| match_status | nvarchar(20) | 比對狀態(自動/人工/未比對) |
|
||||
| pay_type | nvarchar(20) | 付款方式(登錄資料) |
|
||||
| account_last5 | nvarchar(10) | 帳號後五碼(登錄資料) |
|
||||
| amount | decimal(12,2) | 付款金額(登錄資料) |
|
||||
| payer_name | nvarchar(50) | 付款人/登錄人(登錄資料) |
|
||||
| phone | nvarchar(30) | 電話(登錄資料) |
|
||||
| proof_img | nvarchar(200) | 憑證圖檔路徑 |
|
||||
| check_amount | decimal(12,2) | 實際入帳金額(出納填寫) |
|
||||
| check_date | datetime | 入帳日期(出納填寫) |
|
||||
| check_type | nvarchar(20) | 入帳方式(出納填寫) |
|
||||
| check_note | nvarchar(200) | 入帳備註(出納填寫) |
|
||||
| status | nvarchar(20) | 狀態(待核對/已確認/無效/沖帳) |
|
||||
| create_time | datetime | 建立時間 |
|
||||
| update_time | datetime | 最後更新時間 |
|
||||
| verify_user | nvarchar(50) | 核對人員 |
|
||||
|
||||
---
|
||||
|
||||
### 畫面設計說明
|
||||
|
||||
1. 資料來源與自動比對:左側顯示信眾登錄匯款資訊,系統自動比對報名信眾,結果顯示於DE欄,若失敗可手動選擇。
|
||||
2. 付款資訊與核對欄位:F~J欄顯示報名者填寫的付款資訊,K~O欄由出納填寫實際入帳資料。
|
||||
3. 核對狀態管理:O欄標註「確認」或「無效」後,該筆資料完成核對,下次不再顯示,未完成資料持續顯示。
|
||||
4. 輔助說明與操作提示:下方提供人工核對重點、注意事項、歷史紀錄查詢、憑證比對等輔助說明,支援人工補正、標註特殊狀況。
|
||||
5. 沖帳與分攤明細:支援沖帳與分攤金額明細管理,方便人工確認。
|
||||
|
||||
---
|
||||
|
||||
## 個人-沖帳流程
|
||||
|
||||
### TABLE結構說明
|
||||
|
||||
沖帳結果寫入 `pro_order_record`:
|
||||
|
||||
| 欄位名稱 | 型態 | 說明 |
|
||||
|------------------|----------------|----------------------------------------|
|
||||
| num | int, PK, AI | 主鍵,自動編號 |
|
||||
| detail_num | int | 對應訂單明細(pro_order_detail)的ID |
|
||||
| price | decimal(12,2) | 沖帳金額 |
|
||||
| payment | int | 付款方式(對應會計科目細分類ID) |
|
||||
| reg_time | datetime | 沖帳登記時間 |
|
||||
| pay_date | datetime | 實際付款日期 |
|
||||
| organization | nvarchar(100) | 匯款機構/銀行名稱 |
|
||||
| bank_code | nvarchar(20) | 銀行代碼 |
|
||||
| status | nvarchar(20) | 狀態(有效/作廢等) |
|
||||
| note | nvarchar(200) | 備註 |
|
||||
|
||||
---
|
||||
|
||||
### 畫面設計說明
|
||||
|
||||
1. 信眾沖帳清單:左側顯示所有待沖帳信眾及其入帳金額與沖帳狀態,點選信眾後彈出沖帳分配視窗。
|
||||
2. 彈窗內容:顯示信眾所有有報名但尚未完成繳費的項目清單,可自動分配入帳金額,也可人工調整分攤金額,支援部分繳費、溢繳、未繳等情境,並即時顯示分攤結果。
|
||||
3. 沖帳操作:可調整每個項目的沖帳金額,總金額需與入帳金額一致才能送出,確認後寫入 `pro_order_record`,完成核銷,沖帳完成後狀態更新避免重複處理。
|
||||
4. 輔助說明與彈性設計:下方提供沖帳規則、人工調整注意事項、分攤原則等輔助說明,支援查詢歷史沖帳紀錄。
|
||||
|
||||
---
|
||||
|
||||
# TABLE CREATE SQL
|
||||
```
|
||||
-- 信眾-登錄匯款暫存表
|
||||
CREATE TABLE remittance_register_tmp (
|
||||
id INT IDENTITY(1,1) PRIMARY KEY COMMENT '主鍵,自動編號',
|
||||
activity_id INT NULL COMMENT '對應法會/活動ID(可選)',
|
||||
name NVARCHAR(50) NOT NULL COMMENT '姓名/暱稱/法號',
|
||||
phone NVARCHAR(30) NULL COMMENT '聯絡電話',
|
||||
pay_type NVARCHAR(20) NOT NULL COMMENT '付款方式(現金/匯款等)',
|
||||
account_last5 NVARCHAR(10) NULL COMMENT '帳號後五碼',
|
||||
amount DECIMAL(12,2) NOT NULL COMMENT '付款金額',
|
||||
pay_mode NVARCHAR(10) NOT NULL COMMENT '付款型態(個人/共同)',
|
||||
note NVARCHAR(200) NULL COMMENT '備註',
|
||||
proof_img NVARCHAR(200) NULL COMMENT '憑證圖檔路徑',
|
||||
status NVARCHAR(20) NOT NULL DEFAULT '待核對' COMMENT '狀態(待核對/已入帳/作廢)',
|
||||
create_time DATETIME NOT NULL DEFAULT GETDATE() COMMENT '建立時間',
|
||||
verify_time DATETIME NULL COMMENT '核對/入帳時間',
|
||||
verify_user NVARCHAR(50) NULL COMMENT '核對人員',
|
||||
verify_note NVARCHAR(200) NULL COMMENT '核對說明',
|
||||
recaptcha_token NVARCHAR(200) NULL COMMENT 'reCAPTCHA驗證(可選)'
|
||||
);
|
||||
|
||||
-- 入帳核對主表
|
||||
CREATE TABLE remittance_check (
|
||||
id INT IDENTITY(1,1) PRIMARY KEY COMMENT '主鍵,自動編號',
|
||||
tmp_id INT NOT NULL COMMENT '對應暫存登錄表(remittance_register_tmp)的ID',
|
||||
match_signup_id INT NULL COMMENT '自動或人工比對到的報名信眾ID',
|
||||
match_status NVARCHAR(20) NOT NULL DEFAULT '未比對' COMMENT '比對狀態(自動/人工/未比對)',
|
||||
pay_type NVARCHAR(20) NOT NULL COMMENT '付款方式(登錄資料)',
|
||||
account_last5 NVARCHAR(10) NULL COMMENT '帳號後五碼(登錄資料)',
|
||||
amount DECIMAL(12,2) NOT NULL COMMENT '付款金額(登錄資料)',
|
||||
payer_name NVARCHAR(50) NULL COMMENT '付款人/登錄人(登錄資料)',
|
||||
phone NVARCHAR(30) NULL COMMENT '電話(登錄資料)',
|
||||
proof_img NVARCHAR(200) NULL COMMENT '憑證圖檔路徑',
|
||||
check_amount DECIMAL(12,2) NULL COMMENT '實際入帳金額(出納填寫)',
|
||||
check_date DATETIME NULL COMMENT '入帳日期(出納填寫)',
|
||||
check_type NVARCHAR(20) NULL COMMENT '入帳方式(出納填寫)',
|
||||
check_note NVARCHAR(200) NULL COMMENT '入帳備註(出納填寫)',
|
||||
status NVARCHAR(20) NOT NULL DEFAULT '待核對' COMMENT '狀態(待核對/已確認/無效/沖帳)',
|
||||
create_time DATETIME NOT NULL DEFAULT GETDATE() COMMENT '建立時間',
|
||||
update_time DATETIME NULL COMMENT '最後更新時間',
|
||||
verify_user NVARCHAR(50) NULL COMMENT '核對人員'
|
||||
);
|
||||
|
||||
-- 個人沖帳紀錄表
|
||||
CREATE TABLE pro_order_record (
|
||||
num INT IDENTITY(1,1) PRIMARY KEY COMMENT '主鍵,自動編號',
|
||||
detail_num INT NOT NULL COMMENT '對應訂單明細(pro_order_detail)的ID',
|
||||
price DECIMAL(12,2) NOT NULL COMMENT '沖帳金額',
|
||||
payment INT NOT NULL COMMENT '付款方式(對應會計科目細分類ID)',
|
||||
reg_time DATETIME NOT NULL DEFAULT GETDATE() COMMENT '沖帳登記時間',
|
||||
pay_date DATETIME NULL COMMENT '實際付款日期',
|
||||
organization NVARCHAR(100) NULL COMMENT '匯款機構/銀行名稱',
|
||||
bank_code NVARCHAR(20) NULL COMMENT '銀行代碼',
|
||||
status NVARCHAR(20) NOT NULL DEFAULT '有效' COMMENT '狀態(有效/作廢等)',
|
||||
note NVARCHAR(200) NULL COMMENT '備註'
|
||||
);
|
||||
```
|
||||
|
||||
# HTML 檔名及路徑規劃
|
||||
|
||||
| 功能 | 建議檔名/路徑 | 說明 |
|
||||
|----------------------|----------------------------------------------------|--------------------------|
|
||||
| 信眾-登錄匯款 | `/web/transfer/register.html` | 信眾匯款登錄前台 |
|
||||
| 核對入帳資訊 | `/web/admin/finance/remit_check.html` | 後台入帳核對作業 |
|
||||
| 個人-沖帳流程 | `/web/admin/finance/personal_offset.html` | 後台個人沖帳分攤 |
|
||||
| 共同-沖帳流程 | `/web/admin/finance/group_offset.html` | 後台多人/批次沖帳 |
|
||||
| 訂單收款紀錄 | `/web/admin/order/reg.aspx` | 現有訂單收款紀錄 |
|
||||
|
||||
前台頁面可用 `.html` 或 `.aspx`,依現有架構調整。後台建議統一於 `/web/admin/finance/` 目錄下,便於管理。API建議集中於 `/web/App_Code/api/`。
|
||||
299
data/memo/共同-沖帳流程.md
Normal file
299
data/memo/共同-沖帳流程.md
Normal file
@@ -0,0 +1,299 @@
|
||||
# 0718 MEMO
|
||||
餘額->溢繳
|
||||
千位點..一致
|
||||
---
|
||||
共同-沖帳流程
|
||||
- 基本流程: 類似個人沖帳流程的擴充
|
||||
- 進入時: 抓取: 原本登錄時, 指定為共同支付, 且:己確認入帳/未完成沖帳的項目
|
||||
- 欄位:基本上跟"個人沖帳"相同
|
||||
- 最後的:沖帳按鈕欄前面加2欄:
|
||||
1. 法會名稱(依登錄時指定)
|
||||
2. 選擇共同支付人(彈出視窗選擇)
|
||||
- 選擇共同支付人 彈出視窗:
|
||||
- 列出: 該場法會, 有報名單(pro_order), 且有未完成沖帳項目(pro_order_detail)的信眾
|
||||
- 可搜尋: 姓名, 可勾選
|
||||
- 確認後, 傳回勾選的信眾名單, 存在draft欄位, 新的列表{..:[],..:[], "follower_list":[]}
|
||||
- 並更新到資料庫該項transfer_register的draft欄位
|
||||
- 按沖帳時彈出視窗:
|
||||
- 列出: 共同支付人名單, 在該場法會報名, 未完成沖帳的項目, 應繳/已繳/待繳金額
|
||||
- 因為是多人報名, 故要加一欄: 報名人(名字), 加連結開新頁籤, 連到該信眾頁面
|
||||
- 輸入欄位: 沖帳金額(也是先進先出, 沖各筆:待繳金額)
|
||||
- 上方入帳金額試算:入帳金額,已沖金額,未繳餘款,入帳後餘額: 類似個人沖帳
|
||||
- 下方: 提示沖帳狀況資訊: 類似個人沖帳的提示
|
||||
- 下方按鈕: 重新分配, 暫存, 確認沖帳
|
||||
|
||||
---
|
||||
|
||||
# 補充
|
||||
|
||||
我來分析這些檔案,看看共同沖帳流程的規劃是否有不清楚的地方需要討論或補充。
|
||||
|
||||
Read file: admin/transfer/group_reconcile.aspx
|
||||
Ran tool
|
||||
Read file: admin/transfer/group_reconcile.aspx.cs
|
||||
根據我對這些檔案的分析,我發現共同沖帳流程的規劃有以下幾個不清楚或需要討論/補充的地方:
|
||||
|
||||
## 需要討論/補充的問題
|
||||
|
||||
### 1. **資料載入邏輯不清楚**
|
||||
- 參考:
|
||||
D:\dev\ez\17168erp\git_gitea\web\App_Code\api\transfer_registerController.cs
|
||||
D:\dev\ez\17168erp\git_gitea\web\admin\transfer\personal_reconcile.aspx
|
||||
- **需要確認**:
|
||||
- 如何查詢 `pay_mode == "共同"` 的 `transfer_register` 記錄?
|
||||
D:\dev\ez\17168erp\git_gitea\web\admin\transfer\register.aspx
|
||||
- 是否需要新增 `group_reconcile_list` API?
|
||||
放在:transfer_registerController
|
||||
|
||||
### 2. **共同支付人選擇邏輯需要明確**
|
||||
- **問題**:MD 文件中提到「選擇共同支付人彈出視窗」,但具體邏輯不清楚
|
||||
- **需要確認**:
|
||||
- 如何定義「該場法會有報名單且有未完成沖帳項目的信眾」?
|
||||
參考TABLE: pro_order, pro_order_detail, pro_order_record
|
||||
D:\dev\ez\17168erp\git_gitea\web\admin\order\index.aspx
|
||||
D:\dev\ez\17168erp\git_gitea\web\admin\order\index.aspx.cs
|
||||
D:\dev\ez\17168erp\git_gitea\web\admin\order\reg.aspx
|
||||
D:\dev\ez\17168erp\git_gitea\web\admin\order\reg.aspx.cs
|
||||
- 是否需要新增 `get_activity_followers` API?
|
||||
在:transfer_registerController
|
||||
- 選擇的信眾名單如何儲存到 `draft` 欄位?
|
||||
D:\dev\ez\17168erp\git_gitea\web\admin\transfer\draft-utils.js
|
||||
現已有2個清單, 再加一個
|
||||
|
||||
### 3. **沖帳明細查詢邏輯需要明確**
|
||||
- **問題**:MD 文件中提到「列出共同支付人名單在該場法會報名未完成沖帳的項目」
|
||||
- **需要確認**:
|
||||
- 是否需要新增 `group_follower_orders` API?
|
||||
在:transfer_registerController
|
||||
- 如何處理多個信眾的訂單明細?
|
||||
合併為單一表格, 同一信眾的在一起(排序)
|
||||
- 是否需要顯示「報名人」欄位?
|
||||
要
|
||||
|
||||
### 4. **draft 欄位格式需要定義**
|
||||
- **問題**:MD 文件中提到 `draft` 欄位格式為 `{..:[],..:[], "follower_list":[]}`
|
||||
- **需要確認**:
|
||||
- 具體的 JSON 結構是什麼?
|
||||
- 是否需要修改 `draft-utils.js` 來支援共同沖帳格式?
|
||||
都參考draft-utils.js, 並擴充
|
||||
|
||||
### 5. **沖帳 API 需要擴充**
|
||||
- **問題**:目前的 `reconcile` API 只處理個人沖帳
|
||||
- **需要確認**:
|
||||
- 是否需要新增 `group_reconcile` API?
|
||||
在:transfer_registerController
|
||||
- 如何處理多個信眾的沖帳記錄?
|
||||
請規劃
|
||||
- 是否需要修改 `pro_order_record` 的建立邏輯?
|
||||
請評估
|
||||
|
||||
### 6. **UI 架構需要統一**
|
||||
- **問題**:`group_reconcile.aspx` 使用 Bootstrap,而 `personal_reconcile.aspx` 使用 Vuetify
|
||||
- **需要確認**:
|
||||
- 是否要統一使用 Vuetify?
|
||||
都是Vuetify, Bootstrap只是MOCKUP
|
||||
- 是否需要重新設計 UI 架構?
|
||||
使用類似的UI
|
||||
|
||||
### 7. **狀態管理需要明確**
|
||||
- **問題**:共同沖帳完成後的狀態變化不清楚
|
||||
- **需要確認**:
|
||||
- 狀態是否與個人沖帳相同(90/99)?
|
||||
- 是否需要特殊的狀態碼?
|
||||
請評估, 我認為可以一樣
|
||||
|
||||
## 建議的討論重點
|
||||
|
||||
1. **API 設計**:需要定義哪些新的 API 端點?
|
||||
2. **資料結構**:`draft` 欄位的 JSON 格式如何定義?
|
||||
3. **UI 架構**:是否要重新設計 `group_reconcile.aspx`?
|
||||
4. **業務邏輯**:共同支付人的選擇和沖帳邏輯如何實現?
|
||||
5. **資料關聯**:如何處理多個信眾的訂單明細關聯?
|
||||
|
||||
您希望先討論哪個部分?或者有其他需要補充的地方嗎?
|
||||
|
||||
---
|
||||
我來逐一評估每個問題的回答,並提出進一步的分析:
|
||||
|
||||
## 1. **資料載入邏輯不清楚**
|
||||
- ✅ 查詢 `pay_mode == "共同"` 的 `transfer_register` 記錄
|
||||
- ✅ 新增 `group_reconcile_list` API 在 transfer_registerController
|
||||
|
||||
**評估:** 邏輯清楚,需要參考 `personal_reconcile_list` API 的結構
|
||||
|
||||
## 2. **共同支付人選擇邏輯需要明確**
|
||||
- ✅ 參考 pro_order, pro_order_detail, pro_order_record 資料表
|
||||
- ✅ 新增 `get_activity_followers` API 在 transfer_registerController
|
||||
- ✅ 使用 draft-utils.js,新增第三個清單欄位
|
||||
|
||||
**評估:** 需要明確定義「未完成沖帳項目」的查詢條件
|
||||
|
||||
## 3. **沖帳明細查詢邏輯需要明確**
|
||||
- ✅ 新增 `group_follower_orders` API 在 transfer_registerController
|
||||
- ✅ 合併為單一表格,同一信眾的在一起排序
|
||||
- ✅ 需要顯示「報名人」欄位
|
||||
|
||||
**評估:** 邏輯合理,需要設計排序和分組顯示
|
||||
|
||||
## 4. **draft 欄位格式需要定義**
|
||||
- ✅ 參考並擴充 draft-utils.js
|
||||
|
||||
**評估:** 需要具體定義 JSON 結構格式
|
||||
|
||||
## 5. **沖帳 API 需要擴充**
|
||||
- ✅ 新增 `group_reconcile` API 在 transfer_registerController
|
||||
- ❓ 需要規劃多個信眾的沖帳記錄處理
|
||||
- ❓ 需要評估 pro_order_record 建立邏輯
|
||||
|
||||
**評估:** 關鍵問題,需要詳細設計
|
||||
|
||||
## 6. **UI 架構需要統一**
|
||||
- ✅ 統一使用 Vuetify
|
||||
- ✅ 使用類似 personal_reconcile.aspx 的 UI
|
||||
|
||||
**評估:** 明確,需要重新設計 group_reconcile.aspx
|
||||
|
||||
## 7. **狀態管理需要明確**
|
||||
- ✅ 使用與個人沖帳相同的狀態碼(90/99)
|
||||
|
||||
**評估:** 合理,可以複用現有邏輯
|
||||
|
||||
---
|
||||
|
||||
## 🎯 實作計劃
|
||||
|
||||
基於以上評估,我提出以下實作計劃:
|
||||
|
||||
### **階段一:後端 API 開發**
|
||||
|
||||
#### 1.1 新增 `group_reconcile_list` API
|
||||
```csharp
|
||||
// 查詢條件:pay_mode == "共同" && status == "2" && check_status == "2"
|
||||
[HttpGet]
|
||||
[Route("api/transfer_register/group_reconcile_list")]
|
||||
```
|
||||
|
||||
#### 1.2 新增 `get_activity_followers` API
|
||||
```csharp
|
||||
// 查詢指定法會中有未完成沖帳項目的信眾
|
||||
[HttpGet]
|
||||
[Route("api/transfer_register/activity_followers")]
|
||||
```
|
||||
|
||||
#### 1.3 新增 `group_follower_orders` API
|
||||
```csharp
|
||||
// 查詢多個信眾在指定法會的未完成沖帳項目
|
||||
[HttpGet]
|
||||
[Route("api/transfer_register/group_follower_orders")]
|
||||
```
|
||||
|
||||
#### 1.4 新增 `group_reconcile` API
|
||||
```csharp
|
||||
// 處理共同沖帳,建立多筆 pro_order_record
|
||||
[HttpPost]
|
||||
[Route("api/transfer_register/group_reconcile")]
|
||||
```
|
||||
|
||||
### **階段二:draft 欄位格式設計**
|
||||
|
||||
#### 2.1 擴充 draft-utils.js
|
||||
```javascript
|
||||
// 新增 follower_list 欄位支援
|
||||
{
|
||||
"transfer_draft": [...],
|
||||
"pro_order_detail_items": [...],
|
||||
"follower_list": [
|
||||
{
|
||||
"f_num": 123,
|
||||
"f_name": "張三",
|
||||
"activity_num": 456
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
### **階段三:前端重構**
|
||||
|
||||
#### 3.1 重新設計 group_reconcile.aspx
|
||||
- 使用 Vuetify 架構
|
||||
- 參考 personal_reconcile.aspx 的 UI 設計
|
||||
- 新增「選擇共同支付人」對話框
|
||||
- 新增「沖帳明細」對話框,支援多信眾顯示
|
||||
|
||||
#### 3.2 主要功能
|
||||
1. **主表格**:顯示 `pay_mode == "共同"` 的匯款記錄
|
||||
2. **選擇支付人**:彈出視窗選擇該法會的信眾
|
||||
3. **沖帳明細**:顯示所選信眾的未完成項目
|
||||
4. **沖帳處理**:支援多信眾的沖帳分配
|
||||
|
||||
### **階段四:業務邏輯整合**
|
||||
|
||||
#### 4.1 沖帳記錄建立
|
||||
- 每個信眾的每個項目建立獨立的 `pro_order_record`
|
||||
- 所有記錄都關聯到同一個 `transfer_register.id`
|
||||
- 使用相同的付款日期和銀行資訊
|
||||
|
||||
#### 4.2 狀態管理
|
||||
- 使用現有的狀態碼(90:有剩餘,99:完成)
|
||||
- 剩餘金額計算邏輯與個人沖帳相同
|
||||
|
||||
---
|
||||
好的!我開始實作共同沖帳流程。我會按照計劃逐步實作,細節可以後續調整。
|
||||
|
||||
## 階段一:後端 API 開發
|
||||
|
||||
先新增後端 API:
|
||||
## 階段二:擴充 draft-utils.js
|
||||
讓我先檢查 draft-utils.js 的內容:
|
||||
Read file: admin/transfer/draft-utils.js
|
||||
現在我新增 follower_list 相關的函數到 draft-utils.js:
|
||||
同時更新 Node.js 的匯出:
|
||||
## 階段三:重新設計 group_reconcile.aspx
|
||||
Read file: admin/transfer/group_reconcile.aspx
|
||||
很好!頁面已經成功更新為 Vuetify 架構。現在讓我們建立一個測試用的TODO任務清單來追蹤實作進度:
|
||||
Ran tool
|
||||
## 🎉 階段性完成報告
|
||||
|
||||
我已經成功完成了共同沖帳流程的核心功能實作:
|
||||
|
||||
### ✅ 已完成項目
|
||||
|
||||
#### 1. 後端 API 開發
|
||||
- `group_reconcile_list`:查詢共同支付的匯款記錄
|
||||
- `activity_followers`:查詢法會中有未完成沖帳項目的信眾
|
||||
- `group_follower_orders`:查詢多個信眾的訂單明細
|
||||
- `group_reconcile`:處理共同沖帳,建立 pro_order_record
|
||||
|
||||
#### 2. draft-utils.js 擴充
|
||||
- 新增 `hasFollowerList`、`getFollowerList`、`updateFollowerList` 函數
|
||||
- 支援新的 draft 格式:`{ transfer_draft: [], pro_order_detail_items: [], follower_list: [] }`
|
||||
|
||||
#### 3. 前端重構
|
||||
- 完全重新設計 `group_reconcile.aspx`,使用 Vuetify 架構
|
||||
- 實作「選擇共同支付人」對話框
|
||||
- 實作「共同沖帳明細」對話框
|
||||
- 支援自動分配、重新分配、暫存、確認沖帳功能
|
||||
|
||||
### 🔧 主要功能特色
|
||||
|
||||
1. **兩階段流程**:
|
||||
- 階段1:選擇該法會的共同支付人
|
||||
- 階段2:分配沖帳金額到各個項目
|
||||
|
||||
2. **智能分配**:
|
||||
- 先進先出自動分配沖帳金額
|
||||
- 支援手動調整每個項目的沖帳金額
|
||||
|
||||
3. **資料暫存**:
|
||||
- 選擇的支付人清單會儲存到 draft 欄位
|
||||
- 支援暫存沖帳分配結果
|
||||
|
||||
4. **多信眾顯示**:
|
||||
- 表格按信眾分組顯示
|
||||
- 清楚顯示每個信眾的訂單資訊
|
||||
|
||||
### 📋 後續待測試項目
|
||||
|
||||
我已經建立了TODO清單來追蹤後續的測試和優化工作。現在可以開始測試功能了!
|
||||
|
||||
您想要先測試哪個部分?或者有什麼需要調整的地方嗎?
|
||||
45
data/memo/掛單區樓層範例.json
Normal file
45
data/memo/掛單區樓層範例.json
Normal file
@@ -0,0 +1,45 @@
|
||||
{
|
||||
"東區": {
|
||||
"慈悲樓": {
|
||||
"慈悲樓1F": ["R01", "R02", "R03", "R04", "R05", "R06", "R07", "R08", "R09", "R10", "R11", "R12", "R13", "R14", "R15", "R16", "R17", "R18", "R19", "R20"],
|
||||
"慈悲樓2F": ["R01", "R02", "R03", "R04", "R05", "R06", "R07", "R08", "R09", "R10", "R11", "R12", "R13", "R14", "R15", "R16", "R17", "R18", "R19", "R20"],
|
||||
"慈悲樓3F": ["R01", "R02", "R03", "R04", "R05", "R06", "R07", "R08", "R09", "R10", "R11", "R12", "R13", "R14", "R15", "R16", "R17", "R18", "R19", "R20"],
|
||||
"慈悲樓4F": ["R01", "R02", "R03", "R04", "R05", "R06", "R07", "R08", "R09", "R10", "R11", "R12", "R13", "R14", "R15", "R16", "R17", "R18", "R19", "R20"],
|
||||
"慈悲樓5F": ["R01", "R02", "R03", "R04", "R05", "R06", "R07", "R08", "R09", "R10", "R11", "R12", "R13", "R14", "R15", "R16", "R17", "R18", "R19", "R20"]
|
||||
},
|
||||
"智慧舍": {
|
||||
"智慧舍1F": ["R01", "R02", "R03", "R04", "R05", "R06", "R07", "R08", "R09", "R10", "R11", "R12", "R13", "R14", "R15", "R16", "R17", "R18", "R19", "R20"],
|
||||
"智慧舍2F": ["R01", "R02", "R03", "R04", "R05", "R06", "R07", "R08", "R09", "R10", "R11", "R12", "R13", "R14", "R15", "R16", "R17", "R18", "R19", "R20"],
|
||||
"智慧舍3F": ["R01", "R02", "R03", "R04", "R05", "R06", "R07", "R08", "R09", "R10", "R11", "R12", "R13", "R14", "R15", "R16", "R17", "R18", "R19", "R20"],
|
||||
"智慧舍4F": ["R01", "R02", "R03", "R04", "R05", "R06", "R07", "R08", "R09", "R10", "R11", "R12", "R13", "R14", "R15", "R16", "R17", "R18", "R19", "R20"],
|
||||
"智慧舍5F": ["R01", "R02", "R03", "R04", "R05", "R06", "R07", "R08", "R09", "R10", "R11", "R12", "R13", "R14", "R15", "R16", "R17", "R18", "R19", "R20"]
|
||||
},
|
||||
"禪悅樓": {
|
||||
"禪悅樓1F": ["R01", "R02", "R03", "R04", "R05", "R06", "R07", "R08", "R09", "R10", "R11", "R12", "R13", "R14", "R15", "R16", "R17", "R18", "R19", "R20"],
|
||||
"禪悅樓2F": ["R01", "R02", "R03", "R04", "R05", "R06", "R07", "R08", "R09", "R10", "R11", "R12", "R13", "R14", "R15", "R16", "R17", "R18", "R19", "R20"],
|
||||
"禪悅樓3F": ["R01", "R02", "R03", "R04", "R05", "R06", "R07", "R08", "R09", "R10", "R11", "R12", "R13", "R14", "R15", "R16", "R17", "R18", "R19", "R20"],
|
||||
"禪悅樓4F": ["R01", "R02", "R03", "R04", "R05", "R06", "R07", "R08", "R09", "R10", "R11", "R12", "R13", "R14", "R15", "R16", "R17", "R18", "R19", "R20"],
|
||||
"禪悅樓5F": ["R01", "R02", "R03", "R04", "R05", "R06", "R07", "R08", "R09", "R10", "R11", "R12", "R13", "R14", "R15", "R16", "R17", "R18", "R19", "R20"]
|
||||
}
|
||||
},
|
||||
"西區": {
|
||||
"淨心樓": { "淨心樓1F": [...], "淨心樓2F": [...], "淨心樓3F": [...], "淨心樓4F": [...], "淨心樓5F": [...] },
|
||||
"安忍舍": { "安忍舍1F": [...], "安忍舍2F": [...], "安忍舍3F": [...], "安忍舍4F": [...], "安忍舍5F": [...] },
|
||||
"悲願樓": { "悲願樓1F": [...], "悲願樓2F": [...], "悲願樓3F": [...], "悲願樓4F": [...], "悲願樓5F": [...] }
|
||||
},
|
||||
"南區": {
|
||||
"寧靜樓": { "寧靜樓1F": [...], "寧靜樓2F": [...], "寧靜樓3F": [...], "寧靜樓4F": [...], "寧靜樓5F": [...] },
|
||||
"法雨舍": { "法雨舍1F": [...], "法雨舍2F": [...], "法雨舍3F": [...], "法雨舍4F": [...], "法雨舍5F": [...] },
|
||||
"覺林樓": { "覺林樓1F": [...], "覺林樓2F": [...], "覺林樓3F": [...], "覺林樓4F": [...], "覺林樓5F": [...] }
|
||||
},
|
||||
"北區": {
|
||||
"圓滿樓": { "圓滿樓1F": [...], "圓滿樓2F": [...], "圓滿樓3F": [...], "圓滿樓4F": [...], "圓滿樓5F": [...] },
|
||||
"正念舍": { "正念舍1F": [...], "正念舍2F": [...], "正念舍3F": [...], "正念舍4F": [...], "正念舍5F": [...] },
|
||||
"法華樓": { "法華樓1F": [...], "法華樓2F": [...], "法華樓3F": [...], "法華樓4F": [...], "法華樓5F": [...] }
|
||||
},
|
||||
"中區": {
|
||||
"福慧樓": { "福慧樓1F": [...], "福慧樓2F": [...], "福慧樓3F": [...], "福慧樓4F": [...], "福慧樓5F": [...] },
|
||||
"慈恩舍": { "慈恩舍1F": [...], "慈恩舍2F": [...], "慈恩舍3F": [...], "慈恩舍4F": [...], "慈恩舍5F": [...] },
|
||||
"妙樂樓": { "妙樂樓1F": [...], "妙樂樓2F": [...], "妙樂樓3F": [...], "妙樂樓4F": [...], "妙樂樓5F": [...] }
|
||||
}
|
||||
}
|
||||
76
data/memo250307.md
Normal file
76
data/memo250307.md
Normal file
@@ -0,0 +1,76 @@
|
||||
# TODO
|
||||
* 資料庫SQL:
|
||||
* 結構:GIT
|
||||
* 含資料: 傳檔
|
||||
* 確認編號規則**
|
||||
* 一般:
|
||||
* 活動: 選項
|
||||
* 牌位類型
|
||||
* 流水號(4碼起)(依類型)
|
||||
* 例: 消災0001,消災0002
|
||||
* 功德主:
|
||||
* 活動: 選項
|
||||
* 功德主類型
|
||||
* 流水號(4碼起)(依類型)
|
||||
* "-"
|
||||
* 牌位類型
|
||||
* 流水號(不補0)(依功德主+類型)
|
||||
* 例:
|
||||
* 如意主0001-消災1, 如意主0001-消災2
|
||||
* 如意主0001-超1, 如意主0001-超2
|
||||
* 如意主0002-消災1, 如意主0002-消災2
|
||||
* 如意主0002-超1, 如意主0002-超2
|
||||
* 少字的字距
|
||||
* 親友名換行"|"
|
||||
* 可依上述SQL做綜合查詢/列印
|
||||
* 列印參考:~/admin/activity/reg.aspx
|
||||
|
||||
# SQL
|
||||
|
||||
## 報名牌位綜合查詢
|
||||
```SQL
|
||||
SELECT activity.subject AS 活動_名稱, activity.startDate_solar AS 活動_報名日, activity.print_init AS 活動_編碼開頭, followers.u_name AS 信眾_名稱, pro_order_detail.order_no AS 報名_編號, pro_order.up_time AS 報名_時間,
|
||||
pro_order_detail.num AS 項目_序號, pro_order_detail.parent_num AS 項目_上層, pro_order_detail.actItem_num AS 項目_品項, actItem.subject AS 品項_名稱, actItem.print_init AS 品項_編碼開頭,
|
||||
pro_order_detail.print_id AS 項目_牌位編號, pro_order_detail.f_num_tablet AS 項目_牌位文字, pro_order_detail.price AS 項目_金額, pro_order_detail.qty AS 項目_數量, pro_order_detail.printed_files AS 項目_已列印
|
||||
FROM pro_order_detail INNER JOIN
|
||||
pro_order ON pro_order_detail.order_no = pro_order.order_no INNER JOIN
|
||||
actItem ON pro_order_detail.actItem_num = actItem.num INNER JOIN
|
||||
followers ON pro_order.f_num = followers.num INNER JOIN
|
||||
activity ON pro_order.activity_num = activity.num
|
||||
ORDER BY 活動_報名日, 項目_序號, 報名_編號
|
||||
```
|
||||
|
||||
## 功德主(套餐)
|
||||
https://demo2.eztrust.tw/17168erp_e/admin/activity/item_reg.aspx?num=1264
|
||||
以下查詢為概念:
|
||||
actItem : 品項 (基本資料)
|
||||
act_bom : 主項/細項 (功德項目:上/下)
|
||||
```
|
||||
SELECT actItem.num, actItem.partno, actItem.subject, actItem.print_init, act_bom.num, act_bom.package_num, act_bom_1.num, act_bom_1.package_num, act_bom_1.item_num
|
||||
FROM actItem INNER JOIN
|
||||
act_bom ON actItem.num = act_bom.item_num INNER JOIN
|
||||
act_bom AS act_bom_1 ON actItem.num = act_bom_1.item_num AND act_bom.package_num = act_bom_1.num
|
||||
```
|
||||
|
||||
## 家屬
|
||||
```
|
||||
SELECT followers.num AS 信眾_序號, followers.f_number AS 信眾_編號, followers.u_name AS 信眾_姓名, family_members.num AS 親友_序號, family_members.fam_name AS 親友_姓名,
|
||||
family_members.deceased AS 親友_往生
|
||||
FROM followers INNER JOIN
|
||||
family_members ON followers.num = family_members.follower_num
|
||||
```
|
||||
|
||||
## 牌位文字格式
|
||||
```JSON
|
||||
{"mid_items":[
|
||||
{"num":0,"fam_name":"姓名","option_break":true},
|
||||
{"num":0,"fam_name":"姓名","option_break":true},
|
||||
{"num":0,"fam_name":"姓名","option_break":true}
|
||||
],
|
||||
"left_items":[
|
||||
{"num":0,"fam_name":"姓名","option_break":true},
|
||||
{"num":0,"fam_name":"姓名","option_break":true},
|
||||
{"num":0,"fam_name":"姓名","option_break":true}
|
||||
]}
|
||||
```
|
||||
|
||||
BIN
data/script_25-僅結構.sql
Normal file
BIN
data/script_25-僅結構.sql
Normal file
Binary file not shown.
27
data/shuwen_table.sql
Normal file
27
data/shuwen_table.sql
Normal file
@@ -0,0 +1,27 @@
|
||||
USE [17168erp]
|
||||
GO
|
||||
|
||||
/****** Object: Table [dbo].[ShuWen] Script Date: 2025/5/6 下午 12:01:21 ******/
|
||||
SET ANSI_NULLS ON
|
||||
GO
|
||||
|
||||
SET QUOTED_IDENTIFIER ON
|
||||
GO
|
||||
|
||||
CREATE TABLE [dbo].[ShuWen](
|
||||
[ID] [int] IDENTITY(1,1) NOT NULL,
|
||||
[ActivityNum] [int] NOT NULL,
|
||||
[CreateTime] [datetime2](7) NOT NULL,
|
||||
[UpdateTime] [datetime2](7) NOT NULL,
|
||||
[ShuWenList] [nvarchar](max) NULL,
|
||||
[IsGenerating] [bit] NOT NULL,
|
||||
PRIMARY KEY CLUSTERED
|
||||
(
|
||||
[ID] ASC
|
||||
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
|
||||
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
|
||||
GO
|
||||
|
||||
ALTER TABLE [dbo].[ShuWen] ADD DEFAULT ((0)) FOR [IsGenerating]
|
||||
GO
|
||||
|
||||
BIN
data/v2407/17168erp_script.sql
Normal file
BIN
data/v2407/17168erp_script.sql
Normal file
Binary file not shown.
BIN
data/v2407/ER圖-Bom相關.pdf
Normal file
BIN
data/v2407/ER圖-Bom相關.pdf
Normal file
Binary file not shown.
BIN
data/v2407/ER圖-主要TABLES.pdf
Normal file
BIN
data/v2407/ER圖-主要TABLES.pdf
Normal file
Binary file not shown.
BIN
data/v2407/desktop.ini
Normal file
BIN
data/v2407/desktop.ini
Normal file
Binary file not shown.
BIN
data/v2407/資料字典.xlsx
Normal file
BIN
data/v2407/資料字典.xlsx
Normal file
Binary file not shown.
210
data/信眾APP規劃相關/appFollowerController.md
Normal file
210
data/信眾APP規劃相關/appFollowerController.md
Normal file
@@ -0,0 +1,210 @@
|
||||
|
||||
# appapi/appfollower (信眾管理)
|
||||
|
||||
```C#
|
||||
[RoutePrefix("api/appfollower")]
|
||||
public class appFollowerController : ApiController
|
||||
```
|
||||
|
||||
## Get()
|
||||
### 介面
|
||||
``` C#
|
||||
public IEnumerable<Model.follower> Get()
|
||||
```
|
||||
取得所有信眾資料列表
|
||||
|
||||
### 傳回
|
||||
``` C#
|
||||
IEnumerable<Model.follower>
|
||||
```
|
||||
### 介面
|
||||
``` C#
|
||||
public IEnumerable<Model.follower> Get
|
||||
(int page, int pageSize = 10,
|
||||
string sortBy="", bool sortDesc=false)
|
||||
```
|
||||
取得指定分頁信眾資料列表
|
||||
### 傳回
|
||||
``` C#
|
||||
IEnumerable<Model.follower>
|
||||
```
|
||||
### 介面
|
||||
``` C#
|
||||
// GET appapi/<controller>/5
|
||||
public Model.follower Get(int id)
|
||||
```
|
||||
依ID取得指定單筆信眾
|
||||
### 傳回
|
||||
``` C#
|
||||
Model.follower
|
||||
```
|
||||
## Post()
|
||||
### 介面
|
||||
``` C#
|
||||
// POST appapi/<controller>
|
||||
public void Post([FromBody] Model.follower item)
|
||||
```
|
||||
新增信眾
|
||||
|
||||
### 傳回
|
||||
``` C#
|
||||
|
||||
```
|
||||
## Put()
|
||||
### 介面
|
||||
``` C#
|
||||
// PUT appapi/<controller>/5
|
||||
public void Put(int id, [FromBody] Model.follower item)
|
||||
```
|
||||
修改信眾
|
||||
|
||||
### 傳回
|
||||
``` C#
|
||||
|
||||
```
|
||||
## Delete()
|
||||
### 介面
|
||||
``` C#
|
||||
// DELETE appapi/<controller>/5
|
||||
public void Delete(int id)
|
||||
```
|
||||
刪除指定ID信眾
|
||||
### 傳回
|
||||
``` C#
|
||||
|
||||
```
|
||||
|
||||
## [HttpDelete] api/appfollower/Delete/{nums}
|
||||
### 介面
|
||||
``` C#
|
||||
[HttpDelete]
|
||||
[Route("api/appfollower/Delete/{nums}")]
|
||||
public void Delete(string nums)
|
||||
```
|
||||
刪除指定信眾編號信眾
|
||||
|
||||
### 傳回
|
||||
``` C#
|
||||
|
||||
```
|
||||
|
||||
## [HttpGet] api/appfollower/count
|
||||
### 介面
|
||||
``` C#
|
||||
[HttpGet]
|
||||
[Route("api/appfollower/count")]
|
||||
public int Count()
|
||||
```
|
||||
傳回筆數
|
||||
### 傳回
|
||||
``` C#
|
||||
int
|
||||
```
|
||||
|
||||
## [HttpPost] api/appfollower/GetList
|
||||
### 介面
|
||||
``` C#
|
||||
[HttpPost]
|
||||
[Route("api/appfollower/GetList")]
|
||||
public IHttpActionResult GetList(
|
||||
[FromBody] Model.ViewModel.follower q,
|
||||
int page, int pageSize = 10,
|
||||
string sortBy = "", bool sortDesc = false)
|
||||
```
|
||||
對信眾資料:分頁查詢, 排序, 傳回列表
|
||||
### 傳回
|
||||
``` C#
|
||||
{
|
||||
list = IEnumerable<Model.follower>, //分頁列表
|
||||
count = int //筆數
|
||||
}
|
||||
```
|
||||
<!--
|
||||
## [HttpPost] api/appfollower/GetFamilyList
|
||||
### 介面
|
||||
``` C#
|
||||
[HttpPost]
|
||||
[Route("api/appfollower/GetFamilyList")]
|
||||
public IHttpActionResult GetFamilyList([FromBody] Model.ViewModel.follower q,
|
||||
qry = qry.OrderByDescending(o => o.num);
|
||||
MyWeb.encrypt encrypt = new MyWeb.encrypt();
|
||||
var tdesc = publicFun.enum_desc<Model.follower.type>();
|
||||
```
|
||||
取得指定信眾的家人資訊
|
||||
### 傳回
|
||||
``` C#
|
||||
IEnumerable<Model.follower>
|
||||
```
|
||||
|
||||
## [HttpPost] api/appfollower/familySave
|
||||
### 介面
|
||||
``` C#
|
||||
[HttpPost]
|
||||
[Route("api/appfollower/familySave")]
|
||||
public IHttpActionResult SaveDetailData([FromBody] Model.ViewModel.follower item)
|
||||
```
|
||||
取得指定信眾的家人資訊
|
||||
### 傳回
|
||||
``` C#
|
||||
|
||||
```
|
||||
|
||||
## [HttpPost] api/appfollower/familyDelete
|
||||
### 介面
|
||||
``` C#
|
||||
[HttpPost]
|
||||
[Route("api/appfollower/familyDelete")]
|
||||
public IHttpActionResult familyDelete([FromBody] Model.ViewModel.follower item)
|
||||
```
|
||||
移陁指定信眾的家人資訊
|
||||
### 傳回
|
||||
``` C#
|
||||
|
||||
```
|
||||
-->
|
||||
|
||||
## [HttpPost] api/appfollower/GetTabletList
|
||||
### 介面
|
||||
``` C#
|
||||
[HttpPost]
|
||||
[Route("api/appfollower/GetTabletList")]
|
||||
public IHttpActionResult GetTabletList([FromBody] Model.follower q,
|
||||
int page, int pageSize = 10,
|
||||
string sortBy = "", bool sortDesc = false)
|
||||
```
|
||||
取得牌位資訊
|
||||
### 傳回
|
||||
``` C#
|
||||
List of: new
|
||||
{
|
||||
id = i++,
|
||||
num = x.num,
|
||||
f_num = x.f_num,
|
||||
type = x.type, //型式
|
||||
title = x.title, //標題
|
||||
})
|
||||
```
|
||||
## [HttpPost] api/appfollower/tabletSave
|
||||
### 介面
|
||||
``` C#
|
||||
[HttpPost]
|
||||
[Route("api/appfollower/tabletSave")]
|
||||
public IHttpActionResult tabletSave([FromBody] Model.ViewModel.followers_tablet item)
|
||||
```
|
||||
儲存牌位資訊
|
||||
### 傳回
|
||||
``` C#
|
||||
int //牌位編號
|
||||
```
|
||||
## [HttpDelete] api/appfollower/tabletDelete/{id}
|
||||
### 介面
|
||||
``` C#
|
||||
[HttpDelete]
|
||||
[Route("api/appfollower/tabletDelete/{id}")]
|
||||
public void tabletDelete(int id)
|
||||
```
|
||||
刪除牌位資訊
|
||||
### 傳回
|
||||
``` C#
|
||||
|
||||
```
|
||||
366
data/信眾APP規劃相關/apporderController.md
Normal file
366
data/信眾APP規劃相關/apporderController.md
Normal file
@@ -0,0 +1,366 @@
|
||||
|
||||
# appapi/apporder (報名管理)
|
||||
|
||||
### 介面
|
||||
``` C#
|
||||
public class apporderController : ApiController
|
||||
```
|
||||
## Get()
|
||||
### 介面
|
||||
```
|
||||
// GET appapi/<controller>
|
||||
public IEnumerable<Model.pro_order> Get()
|
||||
```
|
||||
取得全部報名資料列表
|
||||
### 傳回
|
||||
``` C#
|
||||
IEnumerable<Model.pro_order>
|
||||
```
|
||||
### 介面
|
||||
``` C#
|
||||
public IEnumerable<Model.pro_order> Get(int page, int pageSize = 10,
|
||||
string sortBy="", bool sortDesc=false)
|
||||
```
|
||||
取得指定分頁報名資料列表
|
||||
### 傳回
|
||||
``` C#
|
||||
IEnumerable<Model.pro_order>
|
||||
```
|
||||
### 介面
|
||||
``` C#
|
||||
// GET appapi/<controller>/5
|
||||
public Model.pro_order Get(string id)
|
||||
```
|
||||
取得指定ID(報名編號)分頁報名
|
||||
|
||||
### 傳回
|
||||
``` C#
|
||||
Model.pro_order
|
||||
```
|
||||
## Post()
|
||||
### 介面
|
||||
``` C#
|
||||
// POST appapi/<controller>
|
||||
public void Post([FromBody] Model.pro_order item)
|
||||
```
|
||||
新增報名資料
|
||||
|
||||
### 傳回
|
||||
``` C#
|
||||
void
|
||||
```
|
||||
## Put()
|
||||
### 介面
|
||||
``` C#
|
||||
// PUT appapi/<controller>/5
|
||||
public void Put(int id, [FromBody] Model.pro_order item)
|
||||
```
|
||||
修改報名資料
|
||||
|
||||
### 傳回
|
||||
``` C#
|
||||
|
||||
```
|
||||
## Delete()
|
||||
### 介面
|
||||
``` C#
|
||||
// DELETE appapi/<controller>/5
|
||||
public void Delete(string id)
|
||||
```
|
||||
刪除指定ID(報名編號)報名資料(主檔)
|
||||
|
||||
### 傳回
|
||||
``` C#
|
||||
|
||||
```
|
||||
## [HttpDelete] api/apporder/DeleteItem/{id}
|
||||
### 介面
|
||||
``` C#
|
||||
[HttpDelete]
|
||||
[Route("api/apporder/DeleteItem/{id}")]
|
||||
public void DeleteDetail(int id) //刪除訂單明細
|
||||
```
|
||||
刪除指定ID(報名編號)報名資料(明細)
|
||||
|
||||
### 傳回
|
||||
``` C#
|
||||
|
||||
```
|
||||
## [HttpDelete] api/apporder/DeleteAll/{nums}
|
||||
### 介面
|
||||
``` C#
|
||||
[HttpDelete]
|
||||
[Route("api/apporder/DeleteAll/{nums}")]
|
||||
public void DeleteAll(string nums)
|
||||
```
|
||||
刪除指定ID(報名編號)報名資料(整筆)
|
||||
|
||||
### 傳回
|
||||
``` C#
|
||||
|
||||
```
|
||||
## [HttpGet] api/apporder/count
|
||||
### 介面
|
||||
``` C#
|
||||
[HttpGet]
|
||||
[Route("api/apporder/count")]
|
||||
public int Count()
|
||||
```
|
||||
傳回筆數
|
||||
|
||||
### 傳回
|
||||
``` C#
|
||||
int
|
||||
```
|
||||
## [HttpPost] api/apporder/GetList
|
||||
### 介面
|
||||
``` C#
|
||||
[HttpPost]
|
||||
[Route("api/apporder/GetList")]
|
||||
public IHttpActionResult GetList([FromBody] Model.ViewModel.pro_order q,
|
||||
int page, int pageSize = 10,
|
||||
string sortBy = "", bool sortDesc = false)
|
||||
```
|
||||
對報名資料:分頁查詢, 排序, 傳回列表
|
||||
|
||||
### 傳回
|
||||
``` C#
|
||||
{
|
||||
list = IEnumerable<Model.pro_order>, //分頁列表
|
||||
count = int //筆數
|
||||
}
|
||||
```
|
||||
|
||||
## [HttpPost] api/apporder/GetItemList
|
||||
### 介面
|
||||
``` C#
|
||||
[HttpPost]
|
||||
[Route("api/apporder/GetItemList")]
|
||||
public IHttpActionResult GetItemList(
|
||||
[FromBody] Model.ViewModel.pro_order_detail q,
|
||||
int page, int pageSize = 10,
|
||||
string sortBy = "", bool sortDesc = false)
|
||||
```
|
||||
取得報名明細
|
||||
### 傳回
|
||||
``` C#
|
||||
new{
|
||||
list = List of pro_order_detail
|
||||
count = int
|
||||
}
|
||||
```
|
||||
|
||||
## [HttpPost] api/apporder/SaveDetailData
|
||||
### 介面
|
||||
``` C#
|
||||
[HttpPost]
|
||||
[Route("api/apporder/SaveDetailData")]
|
||||
public IHttpActionResult SaveDetailData([FromBody] Model.pro_order_detail item)
|
||||
```
|
||||
儲存報名明細
|
||||
### 傳回
|
||||
``` C#
|
||||
new
|
||||
{
|
||||
num = order.num,
|
||||
customize_data = order.customize_data,
|
||||
}
|
||||
```
|
||||
## [HttpPost] api/apporder/GetUnpayList
|
||||
### 介面
|
||||
``` C#
|
||||
[HttpPost]
|
||||
[Route("api/apporder/GetUnpayList")]
|
||||
public IHttpActionResult GetUnpayList([FromBody] Model.ViewModel.follower q,
|
||||
string order_no , int page, int pageSize = 10,
|
||||
string sortBy = "", bool sortDesc = false)
|
||||
```
|
||||
傳回未付款的訂單列表
|
||||
### 傳回
|
||||
``` C#
|
||||
new
|
||||
{
|
||||
list = List of new
|
||||
{
|
||||
id ,
|
||||
order_no ,
|
||||
up_time ,
|
||||
reg_time ,
|
||||
f_num ,
|
||||
u_name ,
|
||||
totalPrice , //訂單金額
|
||||
payPrice = , //已收金額
|
||||
}),
|
||||
count = orderDt.Count(),
|
||||
}
|
||||
```
|
||||
## [HttpPost] api/apporder/GetUnpayDetail
|
||||
### 介面
|
||||
``` C#
|
||||
[HttpPost]
|
||||
[Route("api/apporder/GetUnpayDetail")]
|
||||
public IHttpActionResult GetUnpayDetail([FromBody] Model.ViewModel.pro_order q,
|
||||
int page, int pageSize = 10,
|
||||
string sortBy = "", bool sortDesc = false)
|
||||
```
|
||||
傳回未付款的訂單明細
|
||||
### 傳回
|
||||
``` C#
|
||||
new {
|
||||
list = List of new {
|
||||
id,
|
||||
order_no,
|
||||
actItem_num,
|
||||
actItem_numTxt,
|
||||
f_num,
|
||||
u_name,
|
||||
price, //訂單金額
|
||||
pay, //已收金額
|
||||
|
||||
},
|
||||
count = unpayDt.Count(),
|
||||
}
|
||||
```
|
||||
##
|
||||
### 介面
|
||||
``` C#
|
||||
[HttpGet]
|
||||
[Route("api/apporder/printFileLog/{num}/{detail}")]
|
||||
public IHttpActionResult printFileLog(int num , int detail)
|
||||
```
|
||||
更新已列印記錄
|
||||
### 傳回
|
||||
``` C#
|
||||
order.printed_files //已列印記錄
|
||||
```
|
||||
## [HttpPost] api/apporder/printMultiFileLog
|
||||
### 介面
|
||||
``` C#
|
||||
[HttpPost]
|
||||
[Route("api/apporder/printMultiFileLog")]
|
||||
public IHttpActionResult printMultiFileLog([FromBody] List<int> list,
|
||||
int item, int file)
|
||||
```
|
||||
更新多筆列印記錄
|
||||
### 傳回
|
||||
``` C#
|
||||
|
||||
```
|
||||
## [HttpGet] api/apporder/copyDetailData/{num}/{qty}
|
||||
### 介面
|
||||
``` C#
|
||||
[HttpGet]
|
||||
[Route("api/apporder/copyDetailData/{num}/{qty}")]
|
||||
public IHttpActionResult copyDetailData(int num, int qty)
|
||||
```
|
||||
複製指定的報名項目
|
||||
### 傳回
|
||||
``` C#
|
||||
|
||||
```
|
||||
## [HttpPost] api/apporder/GetPastOrderList
|
||||
### 介面
|
||||
``` C#
|
||||
[HttpPost]
|
||||
[Route("api/apporder/GetPastOrderList")]
|
||||
public IHttpActionResult GetPastOrderList([FromBody] Model.pro_order q,
|
||||
int page, int pageSize = 10,
|
||||
string sortBy = "", bool sortDesc = false)
|
||||
```
|
||||
複製以往報名
|
||||
### 傳回
|
||||
``` C#
|
||||
new
|
||||
{
|
||||
list = List of new
|
||||
{
|
||||
id,
|
||||
num,
|
||||
order_no,
|
||||
up_time,
|
||||
activity_selected = new
|
||||
{
|
||||
text,
|
||||
val,
|
||||
},
|
||||
actitem_num_selected = new
|
||||
{
|
||||
text,
|
||||
val,
|
||||
},
|
||||
}),
|
||||
count = qry.Count(),
|
||||
}
|
||||
```
|
||||
<!--
|
||||
-->
|
||||
|
||||
## [HttpPost] api/apporder/copyMultiPastItem
|
||||
### 介面
|
||||
``` C#
|
||||
[HttpPost]
|
||||
[Route("api/apporder/copyMultiPastItem")]
|
||||
public IHttpActionResult copyMultiPastItem([FromBody] List<int> list,
|
||||
string order_no)
|
||||
```
|
||||
複製以往報名(勾選多筆)
|
||||
### 傳回
|
||||
``` C#
|
||||
|
||||
```
|
||||
## [HttpPost] api/apporder/GetPayOrderList
|
||||
### 介面
|
||||
``` C#
|
||||
[HttpPost]
|
||||
[Route("api/apporder/GetPayOrderList")]
|
||||
public IHttpActionResult GetPayOrderList([FromBody] Model.pro_order_record q,
|
||||
int page, int pageSize = 10,
|
||||
string sortBy = "", bool sortDesc = false)
|
||||
```
|
||||
收款註記
|
||||
### 傳回
|
||||
``` C#
|
||||
new
|
||||
{
|
||||
list = List of new
|
||||
{
|
||||
id ,
|
||||
num ,
|
||||
order_no ,
|
||||
pay_date ,
|
||||
payment_selected = new
|
||||
{
|
||||
text,
|
||||
val ,
|
||||
},
|
||||
price,
|
||||
organization,
|
||||
bank_code,
|
||||
}),
|
||||
count,
|
||||
}
|
||||
```
|
||||
## [HttpDelete] api/apporder/DeleteRecordDetail/{id}")]
|
||||
刪除收款註記
|
||||
### 介面
|
||||
``` C#
|
||||
[HttpDelete]
|
||||
[Route("api/apporder/DeleteRecordDetail/{id}")]//刪除收款註記
|
||||
public void DeleteRecordDetail(int id)
|
||||
```
|
||||
### 傳回
|
||||
``` C#
|
||||
|
||||
```
|
||||
## [HttpPost] api/apporder/SaveRecordDetail
|
||||
### 介面
|
||||
``` C#
|
||||
[HttpPost]
|
||||
[Route("api/apporder/SaveRecordDetail")]
|
||||
public IHttpActionResult SaveRecordDetail([FromBody] Model.pro_order_record item)
|
||||
```
|
||||
儲存收款紀錄
|
||||
### 傳回
|
||||
``` C#
|
||||
|
||||
```
|
||||
BIN
data/信眾APP規劃相關/desktop.ini
Normal file
BIN
data/信眾APP規劃相關/desktop.ini
Normal file
Binary file not shown.
4
data/信眾APP規劃相關/index.md
Normal file
4
data/信眾APP規劃相關/index.md
Normal file
@@ -0,0 +1,4 @@
|
||||
# 17168 API DOOC
|
||||
|
||||
* [信眾API](./appFollowerController.html)
|
||||
* [報名API](./apporderController.html.html)
|
||||
BIN
data/信眾APP規劃相關/~$資料字典.xlsx
Normal file
BIN
data/信眾APP規劃相關/~$資料字典.xlsx
Normal file
Binary file not shown.
BIN
data/信眾APP規劃相關/加密參考/desktop.ini
Normal file
BIN
data/信眾APP規劃相關/加密參考/desktop.ini
Normal file
Binary file not shown.
125
data/信眾APP規劃相關/加密參考/encrypt.cs
Normal file
125
data/信眾APP規劃相關/加密參考/encrypt.cs
Normal file
@@ -0,0 +1,125 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Security.Cryptography;
|
||||
using System.Text;
|
||||
using System.Web;
|
||||
using System.Web.Security;
|
||||
|
||||
/// <summary>
|
||||
/// 加密相關
|
||||
/// </summary>
|
||||
///
|
||||
|
||||
namespace MyWeb
|
||||
{
|
||||
public class encrypt
|
||||
{
|
||||
public string MD5(string str, int bits = 32) //MD5加密
|
||||
{
|
||||
if (bits == 16)
|
||||
{
|
||||
return FormsAuthentication.HashPasswordForStoringInConfigFile(str, "MD5").ToLower().Substring(8, 16);
|
||||
}
|
||||
else
|
||||
{
|
||||
return FormsAuthentication.HashPasswordForStoringInConfigFile(str, "MD5").ToLower();
|
||||
}
|
||||
}
|
||||
|
||||
public string SHA1(string SourceStr) //SHA1加密
|
||||
{
|
||||
return FormsAuthentication.HashPasswordForStoringInConfigFile(SourceStr, "SHA1");
|
||||
}
|
||||
|
||||
private byte[] Keys = { 0xEF, 0xAB, 0x56, 0x78, 0x90, 0x34, 0xCD, 0x12 };
|
||||
|
||||
public string EncryptDes(string SourceStr, string skey) //使用標準DES對稱加密, skey請帶入8位數自訂KEY
|
||||
{
|
||||
try
|
||||
{
|
||||
byte[] rgbKey = Encoding.UTF8.GetBytes(skey.Substring(0, 8));
|
||||
byte[] rgbIV = Keys;
|
||||
byte[] inputByteArray = Encoding.UTF8.GetBytes(SourceStr);
|
||||
DESCryptoServiceProvider dCSP = new DESCryptoServiceProvider();
|
||||
MemoryStream mStream = new MemoryStream();
|
||||
CryptoStream cStream = new CryptoStream(mStream, dCSP.CreateEncryptor(rgbKey, rgbIV), CryptoStreamMode.Write);
|
||||
cStream.Write(inputByteArray, 0, inputByteArray.Length);
|
||||
cStream.FlushFinalBlock();
|
||||
string str = Convert.ToBase64String(mStream.ToArray());
|
||||
return str;
|
||||
}
|
||||
catch
|
||||
{
|
||||
return SourceStr;
|
||||
}
|
||||
}
|
||||
|
||||
public string DecryptDes(string SourceStr, string skey) //使用標準DES對稱解密, skey請帶入8位數自訂KEY
|
||||
{
|
||||
try
|
||||
{
|
||||
byte[] rgbKey = Encoding.UTF8.GetBytes(skey.Substring(0, 8));
|
||||
byte[] rgbIV = Keys;
|
||||
byte[] inputByteArray = Convert.FromBase64String(SourceStr);
|
||||
DESCryptoServiceProvider DCSP = new DESCryptoServiceProvider();
|
||||
MemoryStream mStream = new MemoryStream();
|
||||
CryptoStream cStream = new CryptoStream(mStream, DCSP.CreateDecryptor(rgbKey, rgbIV), CryptoStreamMode.Write);
|
||||
cStream.Write(inputByteArray, 0, inputByteArray.Length);
|
||||
cStream.FlushFinalBlock();
|
||||
return Encoding.UTF8.GetString(mStream.ToArray());
|
||||
}
|
||||
catch
|
||||
{
|
||||
return SourceStr;
|
||||
}
|
||||
}
|
||||
|
||||
public string EncryptAutoKey(string str)
|
||||
{
|
||||
function f = new function();
|
||||
if (!f.isStrNull(str))
|
||||
{
|
||||
string key = f.randKey(8);
|
||||
string encode = EncryptDes(str, key);
|
||||
str = f.randKey(3) + f.Left(key, 5) + f.Left(encode, encode.Length - 2) + f.Right(key, 3) + f.Right(encode, 2);
|
||||
return str;
|
||||
}
|
||||
return "";
|
||||
}
|
||||
public string DecryptAutoKey(string str)
|
||||
{
|
||||
try
|
||||
{
|
||||
function f = new function();
|
||||
if (!string.IsNullOrEmpty(str))
|
||||
{
|
||||
string str2 = str?.Substring(3, (str ?? "").Length - 3);
|
||||
string key = f.Left(str2, 5) + f.Left(f.Right(str2, 5), 3);
|
||||
str2 = str2.Substring(5, str2.Length - 10) + f.Right(str2, 2);
|
||||
return DecryptDes(str2, key);
|
||||
}
|
||||
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
|
||||
}
|
||||
return str;
|
||||
}
|
||||
|
||||
|
||||
public string SHA256(string str)
|
||||
{
|
||||
using (SHA256 hash = SHA256Managed.Create())
|
||||
{
|
||||
return string.Concat(hash
|
||||
.ComputeHash(Encoding.UTF8.GetBytes(str))
|
||||
.Select(item => item.ToString("x2")));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
587
data/信眾APP規劃相關/加密參考/function.cs
Normal file
587
data/信眾APP規劃相關/加密參考/function.cs
Normal file
@@ -0,0 +1,587 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Web;
|
||||
using System.Web.UI;
|
||||
using System.Text;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Net;
|
||||
using System.Reflection;
|
||||
using System.ComponentModel;
|
||||
using System.Web.UI.WebControls;
|
||||
|
||||
namespace MyWeb
|
||||
{
|
||||
public class function : System.Web.UI.Page
|
||||
{
|
||||
public function()
|
||||
{
|
||||
//
|
||||
// TODO: 在這裡新增建構函式邏輯
|
||||
//
|
||||
}
|
||||
|
||||
public string randCode(int count)
|
||||
{
|
||||
//產生驗證碼
|
||||
Random rnd = new Random(Guid.NewGuid().GetHashCode());
|
||||
string[] code = {
|
||||
"1",
|
||||
"2",
|
||||
"3",
|
||||
"4",
|
||||
"5",
|
||||
"6",
|
||||
"7",
|
||||
"8",
|
||||
"9",
|
||||
"a",
|
||||
"b",
|
||||
"c",
|
||||
"d",
|
||||
"e",
|
||||
"f",
|
||||
"g",
|
||||
"h",
|
||||
"i",
|
||||
"j",
|
||||
"k",
|
||||
"m",
|
||||
"n",
|
||||
"p",
|
||||
"q",
|
||||
"r",
|
||||
"s",
|
||||
"t",
|
||||
"u",
|
||||
"v",
|
||||
"w",
|
||||
"x",
|
||||
"y",
|
||||
"z"
|
||||
};
|
||||
string rnd_code = null;
|
||||
//產生10碼
|
||||
for (int i = 1; i <= count; i++)
|
||||
{
|
||||
rnd_code += "" + code[rnd.Next(0, code.Length - 1)];
|
||||
}
|
||||
return rnd_code;
|
||||
}
|
||||
|
||||
public string randKey(int count)
|
||||
{
|
||||
//產生驗證碼
|
||||
Random rnd = new Random(Guid.NewGuid().GetHashCode());
|
||||
string[] code = {
|
||||
"0","1","2","3","4","5","6","7","8","9",
|
||||
"a","b","c","d","e","f","g","h","i", "j","k","l","m", "n", "o","p","q","r","s","t","u","v","w","x","y","z",
|
||||
"A","B","B","D","E","F","G","H","I", "J","K","L","M", "N", "O","P","Q","R","S","T","U","V","W","X","Y","Z",
|
||||
"+","/"
|
||||
};
|
||||
string rnd_code = null;
|
||||
//產生10碼
|
||||
for (int i = 1; i <= count; i++)
|
||||
{
|
||||
rnd_code += "" + code[rnd.Next(0, code.Length - 1)];
|
||||
}
|
||||
return rnd_code;
|
||||
}
|
||||
|
||||
public bool IsNumeric(object Expression)
|
||||
{
|
||||
bool isNum;
|
||||
double retNum;
|
||||
isNum = Double.TryParse(Convert.ToString(Expression), System.Globalization.NumberStyles.Any, System.Globalization.NumberFormatInfo.InvariantInfo, out retNum);
|
||||
return isNum;
|
||||
}
|
||||
|
||||
public bool isDate(object chkString)
|
||||
{
|
||||
DateTime dt;
|
||||
return DateTime.TryParse(Convert.ToString(chkString), out dt);
|
||||
}
|
||||
|
||||
public DateTime ValDate(object Expression)
|
||||
{
|
||||
DateTime _DateTime = Convert.ToDateTime(Expression);
|
||||
return _DateTime;
|
||||
}
|
||||
|
||||
|
||||
public int Val(object Expression)
|
||||
{
|
||||
int _Int = 0;
|
||||
if (IsNumeric(Expression))
|
||||
{
|
||||
_Int = Convert.ToInt32(Expression.ToString().Replace(",", ""));
|
||||
}
|
||||
return _Int;
|
||||
}
|
||||
|
||||
public float ValFloat(object Expression)
|
||||
{
|
||||
float _Int = 0;
|
||||
if (!isStrNull(Expression))
|
||||
{
|
||||
_Int = Convert.ToSingle(ValString(Expression).Replace(",", ""));
|
||||
}
|
||||
return _Int;
|
||||
}
|
||||
|
||||
public string ValMoney(object Expression, int DecimalLength = 2) //千分位,預設最多到小數點第2位
|
||||
{
|
||||
string format = "N0";
|
||||
string[] m = ValString(Expression).Replace(",", "").Split('.');
|
||||
if (ValString(Expression).IndexOf(".") > -1)
|
||||
{
|
||||
int ML = (m[m.Length - 1].Length > DecimalLength ? DecimalLength : m[m.Length - 1].Length);
|
||||
if (!isStrNull(m[m.Length - 1])) { format = "N" + ML.ToString(); }
|
||||
}
|
||||
return ValFloat(Expression).ToString(format);
|
||||
}
|
||||
|
||||
public string ValString(object Expression)
|
||||
{
|
||||
string _String = "";
|
||||
_String = Convert.ToString(Expression);
|
||||
return _String;
|
||||
}
|
||||
|
||||
public string ValMoneyCh(object Expression)
|
||||
{
|
||||
string price = Expression.ToString().Split('.')[0]; //去除小數點
|
||||
string i = price.Replace(",", ""); //去除千分位
|
||||
|
||||
string[] numc_arr = ("零,壹,貳,參,肆,伍,陸,柒,捌,玖").Split(',');
|
||||
string[] unic_arr = (",拾,佰,仟").Split(',');
|
||||
string[] unic1_arr = ("元整,萬,億,兆,京").Split(',');
|
||||
|
||||
int c0 = 0;
|
||||
List<string> str = new List<string>();
|
||||
do
|
||||
{
|
||||
int aa = 0;
|
||||
int c1 = 0;
|
||||
string s = "";
|
||||
//取最右邊四位數跑迴圈,不足四位就全取
|
||||
int lan = (i.Length >= 4 ? 4 : i.Length);
|
||||
int j = Convert.ToInt32(i.Substring(i.Length - lan, lan));
|
||||
while (j > 0)
|
||||
{
|
||||
int k = j % 10; //餘數
|
||||
if (k > 0) { aa = 1; s = numc_arr[k] + unic_arr[c1] + s; }
|
||||
else if (k == 0 && aa == 1) { s = "0" + s; }
|
||||
j = j / 10; //商
|
||||
c1++;
|
||||
}
|
||||
//轉成中文後丟入陣列,全部為零不加單位
|
||||
str.Add((s == "" ? "" : s + unic1_arr[c0]));
|
||||
//計算剩餘字串長度
|
||||
int count_len = i.Length - 4;
|
||||
i = (count_len > 0 ? i.Substring(0, count_len) : "");
|
||||
c0++;
|
||||
} while (!string.IsNullOrEmpty(i));
|
||||
|
||||
string chstring = "";
|
||||
while (str.Count > 0) { chstring += str[str.Count - 1]; str.Remove(str[str.Count - 1]); }
|
||||
|
||||
string pattern = "0+";
|
||||
string replacement = "零";
|
||||
Regex rgx = new Regex(pattern);
|
||||
string result = rgx.Replace(chstring, replacement);
|
||||
|
||||
return result;
|
||||
|
||||
}
|
||||
|
||||
public string Left(object Expression, int Length)
|
||||
{
|
||||
string str = "";
|
||||
str = ValString(Expression);
|
||||
if (Length > str.Length) { Length = str.Length; }
|
||||
str = str.Substring(0, Length);
|
||||
return str;
|
||||
}
|
||||
|
||||
public string Right(object Expression, int Length)
|
||||
{
|
||||
string str = "";
|
||||
str = ValString(Expression);
|
||||
int startIndex = str.Length - Length;
|
||||
if (startIndex < 0)
|
||||
{
|
||||
startIndex = 0;
|
||||
Length = str.Length;
|
||||
}
|
||||
str = str.Substring(startIndex, Length);
|
||||
return str;
|
||||
}
|
||||
|
||||
public bool isStrNull(object value)
|
||||
{
|
||||
return (value == null || value == DBNull.Value || Convert.ToString(value) == "" ? true : false);
|
||||
}
|
||||
|
||||
//截字
|
||||
public string cut_str(string str, int limit)
|
||||
{
|
||||
return str; //不截字,避免顏文字之類的圖在viewstate會出錯
|
||||
MatchCollection findCount;
|
||||
string Based = "[\u0080-\uFFFF]";
|
||||
//中日韓3byte以上的字符
|
||||
string tmp = null;
|
||||
int j = 0;
|
||||
for (int i = 0; i < str.Length; i++)
|
||||
{
|
||||
findCount = Regex.Matches(str.Substring(i, 1), Based, RegexOptions.Compiled);
|
||||
//找str裡面是否有Based指定的字
|
||||
if (findCount.Count == 0)
|
||||
{
|
||||
j += 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
j += 2;
|
||||
//一個中文字占兩個
|
||||
}
|
||||
if (j <= limit)
|
||||
{
|
||||
tmp = tmp + str.Substring(i, 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
i -= 1;
|
||||
if (i < str.Length)
|
||||
{
|
||||
if (!isStrNull(str.Substring(i, 1).Trim()))
|
||||
{
|
||||
//捨棄不完整的英文單字或數字
|
||||
int n = 0;
|
||||
for (int t = tmp.Length - 1; t >= 0; t--)
|
||||
{
|
||||
n++;
|
||||
if (Regex.Matches(tmp.Substring(t, 1), Based, RegexOptions.Compiled).Count > 0) //中文字
|
||||
{
|
||||
tmp = Left(tmp, tmp.Length - n + 1);
|
||||
break;
|
||||
}
|
||||
else if (isStrNull(tmp.Substring(t, 1).Trim()))
|
||||
{
|
||||
tmp = Left(tmp, tmp.Length - n);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
tmp = tmp + "...";
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
return tmp;
|
||||
}
|
||||
|
||||
public enum msgIcon : int
|
||||
{
|
||||
none = 0,
|
||||
success = 1,
|
||||
error = 2,
|
||||
warning = 3,
|
||||
info = 4,
|
||||
question = 5
|
||||
}
|
||||
|
||||
public void ScriptMsg(string txt, string url="", msgIcon icon= msgIcon.none)
|
||||
{
|
||||
ScriptManager.RegisterClientScriptBlock((Page)HttpContext.Current.Handler, typeof(string), "js", "msgbox('" + txt + "','" + (icon != msgIcon.none ? icon.ToString() : "") + "','" + url + "');", true);
|
||||
}
|
||||
|
||||
public void ScriptMsgTop(string txt, msgIcon icon)
|
||||
{
|
||||
ScriptManager.RegisterClientScriptBlock((Page)HttpContext.Current.Handler, typeof(string), "js", "msgtop('" + txt + "','" + (icon != msgIcon.none ? icon.ToString() : "") + "');", true);
|
||||
}
|
||||
|
||||
|
||||
public void ScriptJS(string script)
|
||||
{
|
||||
ScriptManager.RegisterClientScriptBlock((Page)HttpContext.Current.Handler, typeof(string), "js", script, true);
|
||||
}
|
||||
|
||||
public void ScriptMsg2(string txt, string url = "", msgIcon icon = msgIcon.none)
|
||||
{
|
||||
ScriptManager.RegisterStartupScript(Page, Page.GetType(), "init", "msgbox('" + txt + "','" + (icon != msgIcon.none ? icon.ToString() : "") + "','" + url + "');", true);
|
||||
}
|
||||
|
||||
public void ScriptMsgTop2(string txt, msgIcon icon)
|
||||
{
|
||||
ScriptManager.RegisterStartupScript(Page, Page.GetType(), "init", "msgtop('" + txt + "','" + (icon != msgIcon.none ? icon.ToString() : "") + "');", true);
|
||||
}
|
||||
|
||||
public void ScriptJS2(string script)
|
||||
{
|
||||
ScriptManager.RegisterStartupScript(Page, Page.GetType(), "init", script, true);
|
||||
}
|
||||
|
||||
public string br(string str)
|
||||
{
|
||||
return str.Replace(Convert.ToString((char)10), "<br>").Replace(Convert.ToString((char)13), "");
|
||||
}
|
||||
|
||||
|
||||
//日期格式
|
||||
public string datetype(string dtmp)
|
||||
{
|
||||
if (dtmp != null)
|
||||
{
|
||||
System.DateTime d = ValDate(dtmp);
|
||||
return d.ToString("yyyy-MM-dd");
|
||||
}
|
||||
else
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public string datetype(string dtmp, string format)
|
||||
{
|
||||
if (dtmp != null)
|
||||
{
|
||||
System.DateTime d = ValDate(dtmp);
|
||||
return d.ToString(format);
|
||||
}
|
||||
else
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
string allowReqAtt = System.Configuration.ConfigurationManager.AppSettings["allowReqAtt"].ToString();
|
||||
public bool AllowReq(string name)
|
||||
{
|
||||
if (!isStrNull(allowReqAtt))
|
||||
{
|
||||
string[] qns = allowReqAtt.Split(',');
|
||||
foreach (string qn in qns)
|
||||
if (qn.ToLower() == name.ToLower())
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
//傳回GET值並拿掉不要的,回傳格式為?xxxx=xxxx&yyyy=yyyy
|
||||
public string rtnQueryString(string noUseQuery)
|
||||
{
|
||||
string new_query = "";
|
||||
if (HttpContext.Current.Request.Url.AbsoluteUri.Split('?').Length == 2)
|
||||
{
|
||||
string[] query = HttpContext.Current.Request.Url.AbsoluteUri.Split('?')[1].Split('&');
|
||||
for (int i = 0; i < query.Length; i++)
|
||||
{
|
||||
string[] qs = query[i].Split('=');
|
||||
if (qs.Length == 2 && qs[0].ToLower() != noUseQuery.ToLower())
|
||||
{
|
||||
if (AllowReq(qs[0]))
|
||||
new_query += (new_query == "" ? "?" : "&") + qs[0] + "=" + Server.UrlEncode(Server.UrlDecode(qs[1]));
|
||||
}
|
||||
}
|
||||
}
|
||||
return new_query;
|
||||
}
|
||||
|
||||
public string rtnQueryString(Array noUseQuery)
|
||||
{
|
||||
string new_query = "";
|
||||
if (HttpContext.Current.Request.Url.AbsoluteUri.Split('?').Length == 2)
|
||||
{
|
||||
string[] query = HttpContext.Current.Request.Url.AbsoluteUri.Split('?')[1].Split('&');
|
||||
for (int i = 0; i < query.Length; i++)
|
||||
{
|
||||
string[] qs = query[i].Split('=');
|
||||
if (qs.Length == 2)
|
||||
{
|
||||
bool setAdd = true;
|
||||
foreach (string nq in noUseQuery)
|
||||
{
|
||||
if (qs[0].ToLower() == nq.ToLower())
|
||||
{
|
||||
setAdd = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (setAdd)
|
||||
{
|
||||
if (AllowReq(qs[0]))
|
||||
new_query += (new_query == "" ? "?" : "&") + qs[0] + "=" + Server.UrlEncode(Server.UrlDecode(qs[1]));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
return new_query;
|
||||
}
|
||||
|
||||
public string UrlHost()
|
||||
{
|
||||
string url = (IsHttps() ? "https://" : "http://")
|
||||
//+ HttpContext.Current.Request.Url.Host
|
||||
+ Request.ServerVariables["HTTP_HOST"]
|
||||
+ VirtualPathUtility.ToAbsolute("~/");
|
||||
return url;
|
||||
}
|
||||
|
||||
public string UrlAddr()
|
||||
{
|
||||
string url = (IsHttps() ? "https://" : "http://") + HttpContext.Current.Request.Url.Host + HttpContext.Current.Request.Url.AbsolutePath;
|
||||
return url;
|
||||
}
|
||||
|
||||
public static bool IsHttps()
|
||||
{
|
||||
return HttpContext.Current.Request.IsSecureConnection;
|
||||
}
|
||||
|
||||
#region 列舉
|
||||
|
||||
public string GetEnumsDescription(Enum value)
|
||||
{
|
||||
FieldInfo fi = value.GetType().GetField(value.ToString());
|
||||
DescriptionAttribute[] attributes = (DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute), false);
|
||||
return attributes.Length > 0 ? attributes[0].Description : value.ToString();
|
||||
}
|
||||
|
||||
public void InitEnumsOptions<T>(Control obj)
|
||||
{
|
||||
foreach (object value in Enum.GetValues(typeof(T)))
|
||||
if (obj is DropDownList)
|
||||
((DropDownList)obj).Items.Add(new ListItem(GetEnumsDescription((Enum)value), ((int)value).ToString()));
|
||||
else if (obj is RadioButtonList)
|
||||
((RadioButtonList)obj).Items.Add(new ListItem(GetEnumsDescription((Enum)value), ((int)value).ToString()));
|
||||
else if (obj is CheckBoxList)
|
||||
((CheckBoxList)obj).Items.Add(new ListItem(GetEnumsDescription((Enum)value), ((int)value).ToString()));
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
|
||||
public class WreqInfo
|
||||
{
|
||||
public string log = "";
|
||||
public string data = "";
|
||||
}
|
||||
|
||||
public enum Method { POST, GET, PUT, DELETE }
|
||||
|
||||
public WreqInfo WRequest(string URL, Method method, string POSTdata, string Referer = "", string UserAgent = "")
|
||||
{
|
||||
WreqInfo responseData = new WreqInfo();
|
||||
|
||||
try
|
||||
{
|
||||
|
||||
HttpWebRequest hwrequest = (HttpWebRequest)WebRequest.Create(URL);
|
||||
hwrequest.Accept = "*/*";
|
||||
hwrequest.AllowAutoRedirect = true;
|
||||
hwrequest.Timeout = 5000;
|
||||
hwrequest.Method = method.ToString();
|
||||
|
||||
if (!isStrNull(UserAgent))
|
||||
hwrequest.UserAgent = UserAgent;
|
||||
else
|
||||
hwrequest.UserAgent = "http_requester/0.1";
|
||||
|
||||
if (!isStrNull(Referer))
|
||||
hwrequest.Referer = Referer;
|
||||
|
||||
if (URL.ToLower().IndexOf("https://") > -1)
|
||||
{
|
||||
ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
|
||||
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
|
||||
hwrequest.ClientCertificates.Add(new System.Security.Cryptography.X509Certificates.X509Certificate());
|
||||
}
|
||||
|
||||
|
||||
if (hwrequest.Method == "POST")
|
||||
{
|
||||
hwrequest.ContentType = "application/x-www-form-urlencoded";
|
||||
//ASCIIEncoding encoding = new ASCIIEncoding();
|
||||
UTF8Encoding encoding = new UTF8Encoding();
|
||||
byte[] postByteArray = encoding.GetBytes(POSTdata);
|
||||
hwrequest.ContentLength = postByteArray.Length;
|
||||
Stream postStream = hwrequest.GetRequestStream();
|
||||
postStream.Write(postByteArray, 0, postByteArray.Length);
|
||||
postStream.Close();
|
||||
}
|
||||
HttpWebResponse hwresponse = (HttpWebResponse)hwrequest.GetResponse();
|
||||
if (hwresponse.StatusCode == HttpStatusCode.OK)
|
||||
{
|
||||
StreamReader responseStream = new StreamReader(hwresponse.GetResponseStream());
|
||||
responseData.data = responseStream.ReadToEnd();
|
||||
}
|
||||
hwresponse.Close();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
responseData.log = ex.Message;
|
||||
}
|
||||
|
||||
return responseData;
|
||||
}
|
||||
|
||||
#region 繁簡轉換
|
||||
|
||||
public static class ChineseConverter
|
||||
{
|
||||
internal const int LOCALE_SYSTEM_DEFAULT = 0x0800;
|
||||
internal const int LCMAP_SIMPLIFIED_CHINESE = 0x02000000;
|
||||
internal const int LCMAP_TRADITIONAL_CHINESE = 0x04000000;
|
||||
|
||||
[System.Runtime.InteropServices.DllImport("kernel32", CharSet = System.Runtime.InteropServices.CharSet.Auto, SetLastError = true)]
|
||||
internal static extern int LCMapString(int Locale, int dwMapFlags, string lpSrcStr, int cchSrc, [System.Runtime.InteropServices.Out] string lpDestStr, int cchDest);
|
||||
|
||||
public static string ToSimplified(string pSource)
|
||||
{
|
||||
String tTarget = new String(' ', pSource.Length);
|
||||
int tReturn = LCMapString(LOCALE_SYSTEM_DEFAULT, LCMAP_SIMPLIFIED_CHINESE, pSource, pSource.Length, tTarget, pSource.Length);
|
||||
return tTarget;
|
||||
}
|
||||
|
||||
public static string ToTraditional(string pSource)
|
||||
{
|
||||
String tTarget = new String(' ', pSource.Length);
|
||||
int tReturn = LCMapString(LOCALE_SYSTEM_DEFAULT, LCMAP_TRADITIONAL_CHINESE, pSource, pSource.Length, tTarget, pSource.Length);
|
||||
return tTarget;
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 讀檔
|
||||
|
||||
public string ReadFileContent(string path)
|
||||
{
|
||||
string text = "";
|
||||
try
|
||||
{
|
||||
if (path.IndexOf("~/") > -1) { path = Server.MapPath(path); }
|
||||
|
||||
Stream stream = File.Open(path, FileMode.Open, FileAccess.Read, FileShare.Read);
|
||||
StreamReader objReader = new StreamReader(stream);
|
||||
text = objReader.ReadToEnd();
|
||||
objReader.Close();
|
||||
objReader.Dispose();
|
||||
stream.Close();
|
||||
stream.Dispose();
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
//throw;
|
||||
}
|
||||
return text;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
}
|
||||
}
|
||||
44
data/信眾APP規劃相關/加密參考/加密說明.txt
Normal file
44
data/信眾APP規劃相關/加密參考/加密說明.txt
Normal file
@@ -0,0 +1,44 @@
|
||||
~\17168erp\App_Code\encrypt.cs // 加密程式
|
||||
~\17168erp\App_Code\function.cs // 輔助功能
|
||||
|
||||
// 有加密的欄位
|
||||
phone 聯絡電話
|
||||
id_code 身份證號
|
||||
passport 護照號碼
|
||||
cellphone 手機號碼
|
||||
contactor_phone 緊急連絡人電話
|
||||
|
||||
// Page_Load
|
||||
// ** 解密 DecryptAutoKey **
|
||||
if (!isStrNull(prod.phone))
|
||||
{
|
||||
MyWeb.encrypt encrypt = new MyWeb.encrypt();
|
||||
contactor_phone.Text = encrypt.DecryptAutoKey(prod.phone.ToString());
|
||||
}
|
||||
|
||||
// edit_Click
|
||||
// ** 加密 EncryptAutoKey **
|
||||
encrypt.EncryptAutoKey(textBox.Text.Trim())
|
||||
|
||||
// 使用參考
|
||||
foreach (Control obj in cardBodyPanel.Controls)
|
||||
{
|
||||
if (obj is TextBox)
|
||||
{
|
||||
var ObjValue = followers.GetType().GetProperty(obj.ID);
|
||||
var textBox = (TextBox)obj;
|
||||
if (!isStrNull(textBox.Text))
|
||||
{
|
||||
if (textBox.TextMode == TextBoxMode.Date)
|
||||
ObjValue.SetValue(followers, selectDate(textBox));
|
||||
else if (!isStrNull(((TextBox)obj).Attributes["data-encrypt"])
|
||||
&& ValString(textBox.Attributes["data-encrypt"]).Equals("Y"))
|
||||
ObjValue.SetValue(followers, encrypt.EncryptAutoKey(textBox.Text.Trim()));
|
||||
else
|
||||
ObjValue.SetValue(followers, ((TextBox)obj).Text.Trim());
|
||||
}
|
||||
else
|
||||
ObjValue.SetValue(followers, null);
|
||||
|
||||
}
|
||||
}
|
||||
BIN
data/資料字典.xlsx
Normal file
BIN
data/資料字典.xlsx
Normal file
Binary file not shown.
Reference in New Issue
Block a user