# 權益移回相關工作盤點 ### 將過期的會員主檔改為 斷訂戶2/贈閱結束5 1. subscribeStatus: 1:現訂戶 2:斷訂戶 3:止寄 4:贈閱 5:贈閱結束 - [ ] 數位產品要過期七天(寬限期)才改嗎? - [ ] ```sql SELECT * FROM CustomerSubscribe WHERE rightDueDate < now() AND subscribeStatus IN ('1','4'); -- 將過期的會員主檔改為 斷訂戶2/贈閱結束5 UPDATE MemberSubscribe SET subscribeStatus = '2' WHERE rightDueDate < now() AND subscribeStatus = '1'; UPDATE MemberSubscribe SET subscribeStatus = '5' WHERE rightDueDate < now() AND subscribeStatus = '4'; ``` ### 續訂單邏輯 1. 根據訂單提供的方案代碼建立續訂單。 2. 續定日期依據方案內容的商品,以收件人權益到期日(數位商品)或是到期雜誌出刊日(雜誌),先到的日期的**前一天**為續訂單扣款日。 3. 扣款日前七天發送扣款通知信件給(客戶)付款人,月訂制商品只發送第一次。 4. 扣款日當天續訂單會依據設定自動建立一張新的訂單,並啟動金流請款,若是數位商品,會設定七天的臨時權益。 5. 若能成功請款,就會開始計算權益,並產生下一張續訂單;若無法成功請款,會發出扣款失敗通知信給客戶(付款人)。信中提供修改信用卡號的連結,客戶可以修改卡號,並能在會員中心看見扣款失敗的訂單,重新請求扣款,便能完成訂單交易。 ### 續訂單後蓋前邏輯 1. 建立續訂單之前,如果該客戶已經有續訂中的續訂單,則取出續訂單中的方案內容與新訂單中的方案進行比較。 2. 若新的續訂方案包含的產品無法完全包含原本續訂單的內容,則會建立新的續訂單,不影響原本的續訂單,客戶會看見兩張續訂中的續訂單。 3. 若新的續訂方案包含的產品完全包含原本續訂單的內容,則會採用新的續訂方案進行續訂,將原本的續訂單狀態改為過期。 4. 若新的續訂方案包含的產品屬於原本的續訂單,則會更新原本續訂單日期,不建立新的續訂單。 |原續訂單產品|新訂單續訂產品|續訂結果| |--|--|--| |天下+全閱讀|天下+全閱讀|建立新的續訂單;將原本續訂單過期| |天下|天下+全閱讀|建立新的續訂單;將原本續訂單過期| |天下+全閱讀|天下+全閱讀+換日線|建立新的續訂單;將原本續訂單過期| |天下+全閱讀+換日線|天下+全閱讀+微笑季刊|建立新的續訂單;根據權益到期日調整原本續訂單扣款日| |天下+全閱讀|全閱讀|根據權益到期日調整原本續訂單扣款日| ### 現訂戶的權益可以先更新 贈閱單是否會列入權益計算 10/21 到期 |item|action|data from|time|duration| |--|--|--|--|--| |關貿臨時權益匯入|1500筆匯入MemberProfile|SQL dump CSV|約10分|可提前| |APP權益現訂戶|8000筆|SQL CSV|約150分|當天匯入| |APP權益斷訂戶|140000筆|SQL CSV|約3000分|事後匯入,不建續訂單| |ERP權益檔的Customer資料|80萬筆| |1小時5萬筆,約16小時| |ERP權益檔 11/2之後有效的權益|8萬筆| |1.5小時| |關貿資料匯出| | |約30分| |關貿全閱讀權益現訂戶|26000筆|SQL CSV|約90分| |關貿全閱讀權益斷訂戶|37000筆|SQL CSV|約150分| |ERP雜誌權益||spreadsheet|約120分|| |ERP雜誌客戶狀態||spreadsheet|約120分|| |ERP續訂單||spreadsheet|約30分|| |ERP續訂單repay token|||-|待綠界回覆| |關貿會員、訂戶關聯|30萬筆|SQL CSV|約360分|| ## 開帳當天 ### 建立Customer 匯入localCustomer.csv ```sql -- 建立差異化資料 INSERT INTO Customer(id, customerNo, `name`, email, phone, createdAt, updatedAt, parent, address, customerID) SELECT lc.* FROM localCustomer lc LEFT JOIN Customer c ON lc.customerNo = c.customerNo WHERE c.customerNo IS NULL AND lc.customerID IS NULL ``` #### 全閱讀權益匯入 全閱讀現訂:25662 / 90min 全閱讀斷訂:36897 / 150min ```console python3 spreadsheet.py -s csv -m upsertMemberSubscribe -c 1 ``` ### 3. 開帳,更新MemberSubscribeInfoes ```sql INSERT INTO MemberSubscribeInfo(id, endVolume, endVolumeDate, `status`, createdAt, updatedAt, customerSubscribe) SELECT cs.id, cs.endVolume, cs.endVolumeDate, "1" AS `status`, cs.createdAt AS createdAt, cs.updatedAt AS updatedAt, cs.id AS customerSubscribe FROM CustomerSubscribe cs LEFT JOIN CustomerSubscribeInfo csi ON cs.id = csi.customerSubscribe WHERE csi.id IS NULL ``` 更新ERP匯入的權益資料 ### 0. 執行ETL跑權益檔,更新雜誌訂戶權益 前置:Vivi提供excel,存成customer.csv 這個動作會先將customer建立起來,再依據權益,寫入customerSubscribe 如果現訂戶,訂戶狀態為"2",續訂狀態一律為"0",由續訂單寫入時變更 ```console # 約 2hrs > python3 spreadsheet.py -s csv -m subscribe -c 30 ``` ### 最後執行:訂戶/會員關聯 358274 根據關貿MEMBERSUBNO, 建立會員/訂戶關聯,共358274筆,大約6hr ```console python3 spreadsheet.py -s csv -m memberRelatedCustomer -c 1 ``` ## 雜誌權益匯入中台 ### 0. 將Vivi提供的權益轉入中台 - 本機到測試機約2hr 1. 整理csv 2. 更新Owen給的檔案(訂戶身份) ```console python3 spreadsheet.py -s csv -m subscribe_1023 -c 30 ``` ### 1. 更新ERP匯入的權益資料CustomerSubscribe.endVolumeDate & CustomerSubscribe.rightDueDate - 測試機 30 mins ```sql -- 重複12個產品 DELETE FROM CustomerSubscribe WHERE endVolume = 0; UPDATE CustomerSubscribe cs INNER JOIN Item i ON i.mzVolume = cs.endVolume AND i.category = '雜誌' AND i.subCategory = '天下' AND cs.productCode = 'GCV' AND i.itemStatus = 'Active' SET cs.endVolumeDate = i.publishDate; UPDATE CustomerSubscribe cs INNER JOIN Item i ON i.mzVolume = (cs.endVolume+1) AND i.category = '雜誌' AND i.subCategory = '天下' AND cs.productCode = 'GCV' AND i.itemStatus = 'Active' SET cs.rightDueDate = i.publishDate; UPDATE CustomerSubscribe cs INNER JOIN Item i ON i.mzVolume = cs.endVolume AND i.category = '雜誌' AND i.subCategory = '康健' AND cs.productCode = 'GHV' AND i.itemStatus = 'Active' SET cs.endVolumeDate = i.publishDate; UPDATE CustomerSubscribe cs INNER JOIN Item i ON i.mzVolume = (cs.endVolume+1) AND i.category = '雜誌' AND i.subCategory = '康健' AND cs.productCode = 'GHV' AND i.itemStatus = 'Active' SET cs.rightDueDate = i.publishDate; UPDATE CustomerSubscribe cs INNER JOIN Item i ON i.mzVolume = cs.endVolume AND i.category = '雜誌' AND i.subCategory = 'Cheers' AND cs.productCode = 'GJV' AND i.itemStatus = 'Active' SET cs.endVolumeDate = i.publishDate; UPDATE CustomerSubscribe cs INNER JOIN Item i ON i.mzVolume = (cs.endVolume+1) AND i.category = '雜誌' AND i.subCategory = 'Cheers' AND cs.productCode = 'GJV' AND i.itemStatus = 'Active' SET cs.rightDueDate = i.publishDate; UPDATE CustomerSubscribe cs INNER JOIN Item i ON i.mzVolume = cs.endVolume AND i.category = '雜誌' AND i.subCategory = '親子天下' AND cs.productCode = 'GKV' AND i.itemStatus = 'Active' SET cs.endVolumeDate = i.publishDate; UPDATE CustomerSubscribe cs INNER JOIN Item i ON i.mzVolume = (cs.endVolume+1) AND i.category = '雜誌' AND i.subCategory = '親子天下' AND cs.productCode = 'GKV' AND i.itemStatus = 'Active' SET cs.rightDueDate = i.publishDate; UPDATE CustomerSubscribe cs INNER JOIN Item i ON i.mzVolume = cs.endVolume AND i.category = '雜誌' AND i.subCategory = '天下電子' AND cs.productCode = 'FCV' AND i.itemStatus = 'Active' SET cs.endVolumeDate = i.publishDate; UPDATE CustomerSubscribe cs INNER JOIN Item i ON i.mzVolume = (cs.endVolume+1) AND i.category = '雜誌' AND i.subCategory = '天下電子' AND cs.productCode = 'FCV' AND i.itemStatus = 'Active' SET cs.rightDueDate = i.publishDate; UPDATE CustomerSubscribe cs INNER JOIN Item i ON i.mzVolume = cs.endVolume AND i.category = '雜誌' AND i.subCategory = '康健電子' AND cs.productCode = 'FHV' AND i.itemStatus = 'Active' SET cs.endVolumeDate = i.publishDate; UPDATE CustomerSubscribe cs INNER JOIN Item i ON i.mzVolume = (cs.endVolume+1) AND i.category = '雜誌' AND i.subCategory = '康健電子' AND cs.productCode = 'FHV' AND i.itemStatus = 'Active' SET cs.rightDueDate = i.publishDate; UPDATE CustomerSubscribe cs INNER JOIN Item i ON i.mzVolume = cs.endVolume AND i.category = '雜誌' AND i.subCategory = 'Cheers電子' AND cs.productCode = 'FJV' AND i.itemStatus = 'Active' SET cs.endVolumeDate = i.publishDate; UPDATE CustomerSubscribe cs INNER JOIN Item i ON i.mzVolume = (cs.endVolume+1) AND i.category = '雜誌' AND i.subCategory = 'Cheers電子' AND cs.productCode = 'FJV' AND i.itemStatus = 'Active' SET cs.rightDueDate = i.publishDate; UPDATE CustomerSubscribe cs INNER JOIN Item i ON i.mzVolume = cs.endVolume AND i.category = '雜誌' AND i.subCategory = '親子天下電子' AND cs.productCode = 'FKV' AND i.itemStatus = 'Active' SET cs.endVolumeDate = i.publishDate; UPDATE CustomerSubscribe cs INNER JOIN Item i ON i.mzVolume = (cs.endVolume+1) AND i.category = '雜誌' AND i.subCategory = '親子天下電子' AND cs.productCode = 'FKV' AND i.itemStatus = 'Active' SET cs.rightDueDate = i.publishDate; -- # ,"GRV" // (換日線) -- # ,"GMV" // (微笑季刊) -- # ,"GSV" // (小行星幼兒誌) -- # ,"FRV" // (換日線電子) -- # ,"FMV" // (微笑台灣電子) UPDATE CustomerSubscribe cs INNER JOIN Item i ON i.mzVolume = cs.endVolume AND i.category = '雜誌' AND i.subCategory = '換日線' AND cs.productCode = 'GRV' AND i.itemStatus = 'Active' SET cs.endVolumeDate = i.publishDate; UPDATE CustomerSubscribe cs INNER JOIN Item i ON i.mzVolume = (cs.endVolume+1) AND i.category = '雜誌' AND i.subCategory = '換日線' AND cs.productCode = 'GRV' AND i.itemStatus = 'Active' SET cs.rightDueDate = i.publishDate; UPDATE CustomerSubscribe cs INNER JOIN Item i ON i.mzVolume = cs.endVolume AND i.category = '雜誌' AND i.subCategory = '微笑季刊' AND cs.productCode = 'GMV' AND i.itemStatus = 'Active' SET cs.endVolumeDate = i.publishDate; UPDATE CustomerSubscribe cs INNER JOIN Item i ON i.mzVolume = (cs.endVolume+1) AND i.category = '雜誌' AND i.subCategory = '微笑季刊' AND cs.productCode = 'GMV' AND i.itemStatus = 'Active' SET cs.rightDueDate = i.publishDate; UPDATE CustomerSubscribe cs INNER JOIN Item i ON i.mzVolume = cs.endVolume AND i.category = '雜誌' AND i.subCategory = '小行星幼兒誌' AND cs.productCode = 'GSV' AND i.itemStatus = 'Active' SET cs.endVolumeDate = i.publishDate; UPDATE CustomerSubscribe cs INNER JOIN Item i ON i.mzVolume = (cs.endVolume+1) AND i.category = '雜誌' AND i.subCategory = '小行星幼兒誌' AND cs.productCode = 'GSV' AND i.itemStatus = 'Active' SET cs.rightDueDate = i.publishDate; UPDATE CustomerSubscribe cs INNER JOIN Item i ON i.mzVolume = cs.endVolume AND i.category = '雜誌' AND i.subCategory = '換日線電子' AND cs.productCode = 'FRV' AND i.itemStatus = 'Active' SET cs.endVolumeDate = i.publishDate; UPDATE CustomerSubscribe cs INNER JOIN Item i ON i.mzVolume = (cs.endVolume+1) AND i.category = '雜誌' AND i.subCategory = '換日線電子' AND cs.productCode = 'FRV' AND i.itemStatus = 'Active' SET cs.rightDueDate = i.publishDate; UPDATE CustomerSubscribe cs INNER JOIN Item i ON i.mzVolume = cs.endVolume AND i.category = '雜誌' AND i.subCategory = '微笑台灣電子' AND cs.productCode = 'FMV' AND i.itemStatus = 'Active' SET cs.endVolumeDate = i.publishDate; UPDATE CustomerSubscribe cs INNER JOIN Item i ON i.mzVolume = (cs.endVolume+1) AND i.category = '雜誌' AND i.subCategory = '微笑台灣電子' AND cs.productCode = 'FMV' AND i.itemStatus = 'Active' SET cs.rightDueDate = i.publishDate; ``` ### 3. 開帳,更新CustomerSubscribeInfoes - 測試機 15s ```sql INSERT INTO CustomerSubscribeInfo(id, endVolume, endVolumeDate, `status`, createdAt, updatedAt, customerSubscribe) SELECT cs.id, cs.endVolume, cs.endVolumeDate, "1" AS `status`, cs.createdAt AS createdAt, cs.updatedAt AS updatedAt, cs.id AS customerSubscribe FROM CustomerSubscribe cs LEFT JOIN CustomerSubscribeInfo csi ON cs.id = csi.customerSubscribe WHERE csi.id IS NULL; ``` ### 4. 執行ETL跑續訂單,更新renewStatus 1. 會建立upsertCustomer假檔 ```console # 約 2hrs > python3 spreadsheet.py -m upsertRenew -c 30 -j 5000 -t 6000 > python3 spreadsheet.py -m upsertRenew -c 30 ``` ### 5. 回補customerStatus: null ```sql UPDATE CustomerSubscribe SET subscribeStatus = "1" WHERE subscribeStatus IS NULL AND endVolumeDate >= '2020-11-01 16:00:00'; UPDATE CustomerSubscribe SET subscribeStatus = "2" WHERE subscribeStatus IS NULL AND endVolumeDate < '2020-11-01 16:00:00'; UPDATE CustomerSubscribe SET subscribeStatus = "5" WHERE subscribeStatus IS NULL AND endVolumeDate IS NULL; ``` ### 6. 更新ValidDate到MemberProfile 大約10m 1. output ```sql SELECT M.[SERNO] ,CONVERT(VARCHAR(MAX), CAST('' AS XML).value('xs:base64Binary(sql:column("EMAIL"))', 'VARBINARY(MAX)')) AS EMAIL ,[MEMBERID] ,[USERID] ,[CVALIDDAYS] ,[HVALIDDAYS] ,[JVALIDDAYS] ,[KVALIDDAYS] ,[CVALIDDATE] ,[HVALIDDATE] ,[JVALIDDATE] ,[KVALIDDATE] ,[WVALIDDATE] ,[MARKETINGYN] ,[VERIFYSTATUS] ,[CONTENTYN] ,[UUID] FROM [PCWMMCS].[sche_pcwmmcsmgr].[MEMBER] M LEFT OUTER JOIN [PCWM].[sche_pcwmmngmgr].[SUBSCRIPTORHT] S ON M.EMAIL = S.RCVEMAIL WHERE (CVALIDDATE >= GETDATE() OR HVALIDDATE >= GETDATE() OR JVALIDDATE >= GETDATE() OR KVALIDDATE >= GETDATE() OR WVALIDDATE >= GETDATE()) ``` 2. python3 spreadsheet.py -s csv -m upsertMemberProfile -c 30 ### 7. 更新訂戶與會員關聯,30萬筆,大約5hr 1. download csv to memberRelatedCustomer.csv ```sql SELECT [SERNO] ,[USERID] ,[SUBNO] ,[KNOWLEDGEYN] ,[CREATEUSER] ,[CREATETIME] ,[UPDATEUSER] ,[UPDATETIME] ,[SYSMEMO] FROM [PCWMMCS].[sche_pcwmmcsmgr].[MEMBERSUBNO] ``` 2. python3 spreadsheet.py -s csv -m memberRelatedCustomer -c 30 ## 訂閱單 數位產品: 1. 數次產品建立完整/待更新訂單 2. 數位產品建立新會員 3. 更新待更新訂單 訂單中台 1. 完整訂單可計算權益 2. 訂單更新可計算權益 訂閱中台 1. 更新訂單資料重新取訂戶資料 ## APP IAP Server backlogs: 1. 建立訂單時如果綁定會員,建立APP訂單 2. 綁定會員時,將所有訂單送出 3. 到期日檢查APP扣款成功時,建立APP訂單 4. APP取消續訂時,通知中台更新權益主檔的狀態 ```mermaid sequenceDiagram title: APP 訂閱單開通流程 APP->>+APP Store: 購買訂閱商品 APP Store-->>-APP: 購買成功 opt 會員綁定 APP->>+IAP Server: Request IAP Server->>訂單平台: Async建立訂單 IAP Server->>-APP: Done note over 訂閱平台: 開通權益<br>更新訂閱、續訂狀態 訂單平台->>訂閱平台: Async開通權益 訂閱平台->>訂單平台: Webhook權益開通完成 訂單平台->>訂單平台: 建立續訂單 end ``` ```mermaid sequenceDiagram title: APP 續訂單開通流程 IAP Server->>APP Store: Daily 到期訂單查詢 APP Store->>IAP Server: result alt APP新訂單建立成功 IAP Server->>訂單中台: Async 建立APP訂單流程 else APP無新建訂單 IAP Server->>訂單中台: Async 訂閱權限取消 end ``` - 天下 - 每日報 - 須申請新的料號、ProductCode, 續訂型商品 ## 關貿會員資料檔 1. 轉移VALIDDATE > GETDATE()大約1700筆。 2. 建立spreedsheet同步機制 3. 客服後台新增會員臨時權益異動機制,Webhook給數位產品即時開通權益 4. member-api 調整權益查詢範圍 ```sql SELECT TOP (1000) SD.* ,M.[SERNO] ,CONVERT(VARCHAR(MAX), CAST('' AS XML).value('xs:base64Binary(sql:column("EMAIL"))', 'VARBINARY(MAX)')) AS EMAIL ,[MEMBERID] -- ,[USERID] ,[CVALIDDAYS] ,[HVALIDDAYS] ,[JVALIDDAYS] ,[KVALIDDAYS] ,[CVALIDDATE] ,[HVALIDDATE] ,[JVALIDDATE] ,[KVALIDDATE] ,[WVALIDDATE] ,[MARKETINGYN] ,[VERIFYSTATUS] ,[CONTENTYN] ,[UUID] ,MS.SUBNO FROM [PCWMMCS].[sche_pcwmmcsmgr].[MEMBER] M LEFT OUTER JOIN [PCWM].[sche_pcwmmngmgr].[APPSUBSCRIPTOR] A ON M.USERID = A.USERID LEFT OUTER JOIN [PCWM].[sche_pcwmmngmgr].[MEMBERSUBNO] MS ON M.USERID = MS.USERID LEFT OUTER JOIN [PCWM].[sche_pcwmmngmgr].[SUBSCRIPTORHT] S ON MS.SUBNO = S.SUBNO LEFT OUTER JOIN [PCWM].[sche_pcwmmngmgr].[SUBSCRIPTORDL] SD ON S.SERNO = SD.SUBSCRIPTOR_SERNO LEFT OUTER JOIN [PCWM].[sche_pcwmmngmgr].[SUBSCRIPTORDLHIS] SH ON S.SERNO =SH.SUBSCRIPTORDL_SERNO -- WHERE (CVALIDDAYS+HVALIDDAYS+JVALIDDAYS+KVALIDDAYS) > 4 WHERE 1 = 1 -- AND USERID = 'tn1658@yahoo.com.tw' AND M.MEMBERID = '37743' -- AND EMAIL = 'dG4xNjU4QHlhaG9vLmNvbS50dw==' ORDER BY M.USERID DESC ``` ## ERP客戶資料檔 不轉 ## ERP 客戶>-<會員關聯檔 這個是找關貿嗎? ## ERP 自動續訂單 - 約兩小時 - [x] 1. 建立現訂戶資料customer(權益檔後匯) - [x] 2. 建立空訂單order+orderCustomer for 訂單編號 - [x] 3. 建立續訂單 - [ ] 4. 信用卡號轉檔寫回paymentToken - [x] 5. 確認信用卡到期日? - [x] 6. (新)productName 用來區分不同通路的續訂單 |說明|欄位|資料|中台處理方式 |--|--|--|--| |續訂單編號|undefined||renew.id| |ERP客戶編號|CUSTOMER_NUMBER|368548|customer.customerNo| |ERP客戶ID|CUSTOMER_ID|406249|customer.customerID| |同意續訂訂單編號|GC_ORDER_NUMBER|601038327|需要同步該訂單到中台| |產品|PROD_TYPE|P+E|productName| |原訂單購買料號|SEGMENT1|KCW000015|undefined| |續訂方案|PROMOTION|GC18080026|renew.promotionCode| |信用卡|CREDIT_CARD_NUMBER|570224|需要請綠界轉換成Token| |信用卡到期日|C_CARD_EXP_DATE|2022/9/1|undefined| |出貨客戶手機|SH_MOBILE|0910588882|receiver.mobile| |出貨客戶email|SH_EMAIL|kuo88888@gmail.com|receiver.email| |雜誌到期日|GC_SUB_END_DATE|2021/11/17|deductDate |雜誌到期期數|GC_SUB_END_VOLUMN|736|undefined |全閱讀到期日|KC_SUB_END_DATE|2021/11/30|deductDate |雜誌寄送人(收件人)|CUSTOMER_NAME||orderReceiver.name |雜誌寄送地址|COUNTRY POSTAL_CODE TOWN_OR_CITY SHIP_ADDRESS||orderReceiver.address{} |雜誌寄送電話|SH_MOBILE||orderReceiver.phone |續訂金額|default(方案金額)||deductPrice |運費|FREIGHT_CHARGE||shippingFee |ERP認列收入方式|default("信用卡")||payment |續訂單狀態|default("1":待執行)||renewStatus |發票抬頭|default: receiver.name||invoiceTitle |發票類型|default("1":紙本)||invoiceType |發票開立方式|default(null)||invoiceIssueType |發票統編|default(null)||invoiceVat |發票載具類型|default(null)||deviceType |發票載具碼|default(null)||deviceCode |捐贈碼|default(null)||donationCode |<font color="red">寄送方式|default(null)||shipping |<font color="red">來源別|default("AUTO")||source |<font color="red">來源代碼|default(null)||sourceCode deductDate: DateTime # 續訂時間 deductPrice: Int # 續訂價格 shippingFee: Int # 運費 payment: String # ERP認列收入方式 paymentMethod: String # 付款方式 paymentCard: String # 信用卡後四碼 paymentToken: String # 續訂repay token renewStatus: String # 續訂單狀態 0=停訂 1=待執行 2=已執行 3=執行失敗 4=不執行(因為有更新的續訂單)5=APP續訂單 invoiceTitle: String # 發票抬頭 invoiceType: String # 發票類型 1紙本 2會員載具 3手機條碼載具 4自然人憑證載具 5公司戶電子發票 6捐贈發票 invoiceIssueType: String # 發票開立方式 invoiceVat: String # 發票統編 deviceType: String # 發票載具類型 deviceCode: String # 發票載具碼 donationCode: String # 捐贈碼 ## ERP 雜誌權益檔 |說明|欄位|資料|中台處理方式 |--|--|--|--| |ERP客戶ID|CUSTOMER_ID|220588|customerID |<font color="red">ERP客戶No|required|null|customerNo |天下截訂日|GC_SUB_END_DATE|2023/4/19|**ProductCode:GCV**<br/>endVolumeDate |天下截訂期|GC_SUB_END_VOLUMN|771|endVolume |訂閱天下年資|GC_ACC_SENIORITY|20.842|seniority |產品代碼||GCV|productCode |<font color="orange">權益起期|default(null)|null|startVolume |<font color="orange">權益起日|default(null)|null|startVolumeDate |<font color="red">續訂狀態|required|null|renewStatus |<font color="red">權益狀態|default("1":現訂戶)|null|subscribeStatus |康健截訂日|GH_SUB_END_DATE|2014/7/1|GHV |康健截訂期|GH_SUB_END_VOLUMN|188| |康健訂閱年資|GH_ACC_SENIORITY|1.747| |Cheers截訂日|GJ_SUB_END_DATE||GJV |Cheers截訂期|GJ_SUB_END_VOLUMN|| |Cheers訂閱年資|GJ_ACC_SENIORTY|| |親子天下截訂日|GK_SUB_END_DATE||GKV |親子天下截訂期|GK_SUB_END_VOLUMN|| |親子天下訂閱年資|GK_ACC_SENIORITY|| |小行星截訂日|GS_SUB_END_DATE||GSV |小行星截訂期|GS_SUB_END_VOLUMN| |小行星訂閱年資|GS_ACC_SENIORITY|| |親子寶寶截訂日|GB_SUB_END_DATE||x |親子寶寶截訂期|GB_SUB_END_VOLUMN|| |親子寶寶訂閱年資|GB_ACC_SENIORITY|| |微笑截訂日|GM_SUB_END_DATE||GMV |微笑截訂期|GM_SUB_END_VOLUMN|| |微笑訂閱年資|GM_ACC_SENIORITY|| |換日線截訂日|GR_SUB_END_DATE||GRV |換日線截訂期|GR_SUB_END_VOLUMN|| |換日線訂閱年資|GR_ACC_SENIORITY|| |寶寶電子截訂日|FB_SUB_END_DATE||X |寶寶電子截訂期|FB_SUB_END_VOLUMN| |寶寶電子訂閱年資|FB_ACC_SENIORITY|| |天下電子截訂日|FC_SUB_END_DATE||FCV |天下電子截訂期|FC_SUB_END_VOLUMN|| |天下電子訂閱年資|FC_ACC_SENIORITY|| |康健電子截訂日|FH_SUB_END_DATE||FHV |康健電子截訂期|FH_SUB_END_VOLUMN|| |康健電子訂閱年資|FH_ACC_SENIORITY|| |Cheers電子截訂日|FJ_SUB_END_DATE||FJV |Cheers電子截訂期|FJ_SUB_END_VOLUMN|| |Cheers電子訂閱年資|FJ_ACC_SENIORITY|| |微笑電子截訂日|FM_SUB_END_DATE||FMV |微笑電子截訂期|FM_SUB_END_VOLUMN|| |微笑電子訂閱年資|FM_ACC_SENIORITY|| |換日線電子截訂日|FR_SUB_END_DATE||FRV |換日線電子截訂期|FR_SUB_END_VOLUMN|| |換日線電子訂閱年資|FR_ACC_SENIORITY|| |小行星電子截訂日|FS_SUB_END_DATE||X |小行星電子截訂期|FS_SUB_END_VOLUMN|| |小行星電子訂閱年資|FS_ACC_SENIORITY|| |天下ipad子截訂日|PC_SUB_END_DATE||X |天下ipad截訂期|PC_SUB_END_VOLUMN|| |天下ipad訂閱年資|PC_ACC_SENIORITY|| |全閱讀截訂日|KC_SUB_END_DATE||KCW<br/>memberSubscribe<br/>rightDueDate |全閱讀訂閱年資|KC_ACC_SENIORITY||seniority ## 關貿數位權益檔 續訂 SUBSCRIPTIONHTHIS.AUTOSUB = 'Y' PAYTYPE =? SALEPRICE=3480 SUBSCRIPTIONHT.PID = PromotionCode 全閱讀的開通依據是來自 ORDERHT.PAYSTATUS='Y' and h.ORDSTATUS='2' 開通要靠天下拋 D09 續訂訂單資料檔匯入進來,系統開通權益的,這部分可以請教布蘭登 |說明|欄位|資料|中台處理方式 |--|--|--|--| |ERP客戶ID|CUSTOMER_ID|220588|customerID |天下截訂日|GC_SUB_END_DATE|2023/4/19|**ProductCode:GCV**<br/>endVolumeDate |天下截訂期|GC_SUB_END_VOLUMN|771|endVolume |訂閱天下年資|GC_ACC_SENIORITY|20.842|seniority |權益起期|default(null) |權益起日|default(null) |續訂狀態|required |權益狀態|default("1":現訂戶) ```sql SELECT HT.*, DL.[MAGNAME],DL.[SUBBEGINDATE] ,DL.[SUBENDDATE] ,DL.[magcode] ,DL.[ORDER_NUMBER] ,DL.[EXTEND_STATUS] ,DL.[LAST_UPDATE] FROM( SELECT [SERNO], [SUBNO], RCVNAME , CONVERT( VARCHAR(MAX), CAST('' AS XML).value('xs:base64Binary(sql:column("RCVEMAIL"))', 'VARBINARY(MAX)') ) AS RCVEMAIL , [CUSTOMER_ID], [NATIONNAME], [CITYNAME], [AREANAME], [ZIPCODE], [RCVADDR] , CONVERT( VARCHAR(MAX), CAST('' AS XML).value('xs:base64Binary(sql:column("RCVMOBILE"))', 'VARBINARY(MAX)') ) AS RCVMOBILE FROM [PCWM].[sche_pcwmmngmgr].[SUBSCRIPTORHT] WHERE 1=1 AND SUBNO In('CW2644120','CW0473766','CW2910880','CW2313920') ) AS HT INNER JOIN [PCWM].[sche_pcwmmngmgr].[SUBSCRIPTORDL] AS DL ON HT.SERNO = DL.SUBSCRIPTOR_SERNO WHERE 1=1 ORDER BY DL.[SERNO] DESC -- AND RCVMOBILE = 'sun1229@gmail.com' ``` ## 其他 - 雜誌權益檔移回-ERP - 0820跟ERP確認流程,準備估計工時 - 全閱讀權益移回-關貿(SUBSCRIPTORDL) - 0820請紹謙向關貿詢問權益計算與存放方式 - VIP贈閱相關資料-關貿 - VIP閱讀權益異動流程? - 計算與存放方式? - APP權益檔移回-中台 - APP申請新料號,用來給APP訂閱商品計算權益 - 客戶主檔-ERP API同步 - 開發API - 訂戶編號-建立訂單前,ERP 發出 Webhook更新 - 訂單中台修改 - 待確認事項: - 續訂單是否要增加paymentBank, cardType? 0824版本 - 中台可以接受方案代碼作為商品料號 1. 整理orderProduct的時候,檢查itemNo是否為方案或是料號,如果是方案的話,將方案新增為料號: 0831版本 - 訂單中台收到方案時,從中台取得方案 ```gql query{ promotion(promotionCode: "itemNo"){ totalAmount protmotionItems{ sellingPrice item{ itemNo name category subCategory } } } } ``` 拆單 1. 依據商品訂單的方案金額來換算單一商品的金額 ``` 折扣比例 = TS商品折扣後金額/totalAmount 單一商品的金額 = int (折扣我我比例 * sellingPrice) 尾數 = TS商品折扣後金額 - sum(單一商品金額) 最後一筆商品金額 += 尾數 ``` 2. 出貨倉庫 subinventory 改為A01 3. 處理商品類別,定義商品狀態 - 雜誌 - 立即 Confirm - 數位 - 立即 Confirm - 書 - 立即 Confirm - 活動(票)- 立即 Confirm - 贈品或是聯賣 - 立即 Confirm 4. ERP回傳配送狀態 只要有書、活動類型商品,這張ts單就是ERP回傳任一商品出貨,就回打91 ts訂單出貨。 退貨單,任一商品退貨,回打91 ts退貨。 文件要求 --- 1. 91欄位對應到中台的規則書(TGCode/TSCode如何對應) 2. 中台補寫91訂單明細資料(1:1)。 3. 資料的轉換邏輯應該讓ERP來提供,定義在規格書裡。 4. 中台資料集中蒐集後、經過適度運算,擔任跨系統資料整合串接的角色。 5. 以後跨系統的SA要共用一份文件,最高指導原則為business(商業邏輯),依據商業邏輯進行討論。 6. 規格書需要描述傳給東拓資料轉換的方式。 7. 會員資料轉移也需要一份文件 91銷售全閱讀開通方式 --- 全閱讀開通需要有EMAIL,目前打算是用91APP的會員EMAIL作為全閱讀的帳號 但: 1. 91APP訂單內容沒有提供EMAIL 2. 91APP結帳流程中的EMAIL欄位會同步到91會員資訊,但不會發出API修改中台資料 3. 91APP會員資料中,沒有會員地址 問題: 1. 結帳流程中的EMAIL無法檢核,EMAIL有可能跟會員本人不同。 2. 91APP的全閱讀無法贈送他人,是否需調整說明? 結論: 1. 91訂單開通全閱讀一律送天下會員account 2. 91訂單不接受全閱讀轉贈,如有需要請到secant 3. 91全閱讀商品說明請提供天下會員查詢account功能 ```gql { "data": { "member": [ { "account": "sun1229@gmail.com", "email": "sun1229@gmail.com", "nineOneMemberInfo": { "profession": "FinanceOrInsurance", "jobPosition": "企業負責人", "interest": "商業財經", "knowFrom": "LINE官方帳號", "email": "sun1229+91app@gmail.com", "address": null } } ] } } ``` --- 請搭配:https://docs.google.com/spreadsheets/d/18OnAlo69hSDxgbvl4V9FrfWeH2mLvXEG9kNJOgESBKo/edit?pli=1#gid=1718424954 EC 索取UUID循序圖 --- ```sequence title:Request UUID EC->MemberAPI:索取uuid MemberAPI-->EC:取得uuid ``` 訂單平台 下訂循序圖 --- ```sequence title:Order a Order Note over EC,MemberAPI:Alt-If 使用綠界付款 Note over EC,MemberAPI:**索取UUID流程** Note over EC,MemberAPI:Alt End EC->Order:建立訂單 Order->Order:建立訂單主檔 Order->graphQL:建立訂單 graphQL-->Order:建立訂單成功 Order-->EC:回應訂單編號 EC->Payment:建立付款交易 Payment->Payment:建立付款主檔 Payment->第三方金流:導向第三方金流 第三方金流->第三方金流:使用者付款 第三方金流->Payment:回應付款成功/失敗 Payment->EC:Redirect 付款成功/失敗 Payment-->EC:Webhook 付款成功/失敗 Payment-->Order:Callback 付款成功/失敗 Order->graphQL:更新訂單付款成功/失敗 graphQL-->Order:更新成功 Note over EC,Order:Alt-If Secant Note over EC,Order:**訂單綁定會員流程** Note over EC,Order:Alt End Note over EC,ERP:**付款成功後流程** ``` 訂單平台 訂單綁定會員循序圖 --- ```sequence title:Create Member and Bind Order EC->MemberAPI:建立會員 with UUID MemberAPI-->EC:建立會員成功 EC->Order:更新訂單會員 with 帳號 Order->graphQL:訂單綁定會員 graphQL-->Order:訂單綁定會員結果 Order-->EC:訂單綁定會員結果 ``` 訂單平台 付款成功後循序圖 --- ```sequence title: Process After Paid Note over Order,graphQL:Alt—If 尚有訂單商品權益待計算,且訂單已綁定會員 Note over Order,graphQL:**權益計算流程** Note over Order,graphQL:Alt—Else Order->ERP:T02 API ERP-->Order:拋轉成功 Order-->EC:Webhook 訂單已成立 Note over Order,graphQL:Alt End ``` 訂單平台 權益計算循序圖 --- ```sequence title: Calculate Subscriptions Note over Order,graphQL:Loop Queue 訂單商品權益計算 Begin Order->graphQL:發送權益新增計算請求 Note over Order,graphQL:Loop Queue 訂單商品權益計算 End ``` 訂單平台 權益計算Webhook循序圖 --- ```sequence title: Calculate Subscriptions graphQL-->Order:Webhook 權益新增計算結果 Note over Order,EC:Alt—If 權益新增計算成功 Begin Order-->EC:Webhook 權益新增計算成功 Note over Order,EC:Alt—If 權益新增計算失敗 Begin Order-->EC:Webhook 權益新增計算失敗 Note over Order,EC:Alt End Note over graphQL,EC:Alt—If 訂單商品權益皆計算完成,且訂單含有續訂方案或續訂料號資訊 Begin Note over graphQL,EC:**續訂單建立流程** Note over graphQL,EC:Alt End ``` 訂單平台 續訂單建立循序圖 --- ```sequence title: Create Renew After Transfered T02 Order->Order:每5分鐘指令撈出已綁會員 && 權益皆成功算畢 && 續訂單未建之訂單 Note over Order,graphQL:Loop 續訂單建立 Begin Order->graphQL:建立續訂單 graphQL-->Order:建立續訂單成功 Order-->EC:Webhook 續訂單建立成功 Note over Order,graphQL:Loop 續訂單建立 End ``` 訂單平台 續訂循序圖 --- ```sequence title: Renew Order->graphQL:索取到期續訂單清單 graphQL-->Order:回應清單 Note over Order:Loop 續訂單續訂 Begin Order->Order:建立續訂訂單 Order->graphQL:建立續訂訂單 graphQL-->Order:建立續訂訂單成功 Order->Payment:API請求付款 Payment->第三方金流:請求付款授權 第三方金流->Payment:回應付款結果 Payment->Order:回應付款結果 Payment-->EC:Webhook 續訂付款成功/失敗 Order->Order:更新訂單付款狀態 Order->graphQL:更新訂單付款狀態 graphQL-->Order:更新成功 Note over Order:Loop 續訂單續訂 End Note over Order,EC:**付款成功後流程** Note over Order,ERP:**續訂單建立流程** ``` 權益平台 循序圖 --- ```flow st=>start: 開始 e=>end: 結束 ckuuid=>condition: 提供uuid st->ckuuid ckuuid ``` ```sequence title: createMember flow->memberAPI: 依據account取得註冊資料 note right of memberAPI: uuid\nemail\nname memberAPI->flow: 註冊資料 ``` member API 循序圖 --- ```sequence Title: ssoQryMember 數位產品->memberAPI: ssoQryMember API memberAPI->memberAPI: 0901前: 呼叫關貿會員資料API\n0901後: 查詢gql.member.tradeVanMemberInfo memberAPI->graphQL: create/updateMember memberAPI-->數位產品: 會員資料 ``` ```sequence Title: ssoUpdMember 數位產品->memberAPI: ssoUpdMember API memberAPI->memberAPI: 0901前: 呼叫關貿會員資料API\n0901後: 更新gql.member.tradeVanMemberInfo memberAPI->graphQL: create/updateMember memberAPI-->數位產品: 會員資料 ``` 91APP 循序圖 --- ```sequence Title: 91APP退貨(含補收款) User->91APP:後台商品退貨 Order.cwg->91APP:取得商品退貨單 91APP-->Order.cwg:商品退貨單內容 Order.cwg->graphQL: 91商品退貨單寫入graphQL graphQL-->Order.cwg: graphQL商品資訊 Order.cwg->Order.cwg: 修改中台商品狀態 Order.cwg->graphQL: 修改graphQL商品狀態 Order.cwg->91APP:取得補收款單 91APP-->Order.cwg:補收款單內容 Order.cwg->graphQL: 91補收款單內容寫入graphQL Order.cwg->ERP: Next scheduled 退貨單資料(含補收款單) ``` ```sequence Title: 91APP退運費 客服->91APP:後台設定退運費 Order.cwg->91APP:取得退運費單 91APP-->Order.cwg:退運費單內容 Order.cwg->graphQL: 退運費單寫入graphQL graphQL-->Order.cwg: 訂單資料(含退運費單) Order.cwg->graphQL: 更新退運費資料 graphQL-->Order.cwg: 訂單資料(含退運費單) Order.cwg->ERP: 拋轉91退運費單 ``` ```sequence Title: 91APP東拓標籤 Order.cwg->graphQL: 00:30 取得可出貨的超取訂單資料 graphQL-->Order.cwg: 訂單資料 Order.cwg->Order.cwg: 產生xml Order.cwg->東拓: FTP 拋轉xml, 1 record per time/1s ``` ## Issue List: ```graphviz digraph hierarchy { ERP客戶主檔->{聯絡人 地址} 聯絡人->{聯絡人1 聯絡人2} 地址->{地址1 地址2} 聯絡人1->{地址A 電話或emailA 電話或emailB} {rank=same;地址A, 地址1 地址2} // Put them on the same level } ``` ```graphviz digraph hierarchy { 客制訂單主檔Header->{line} line->{產品A 產品B 產品C} 產品A->收件客戶->收件人->Email {rank=same;} // Put them on the same level } ``` ```graphviz digraph hierarchy { 標準訂單Header->{line} line->{產品A 產品B 產品C} 產品A->出貨客戶->收件人->Email {rank=same;} // Put them on the same level } ``` <style> .blue { color: blue; } </style>