PageSourceSearch

https://logisticspoe-6xbwz3cw.manus.space/assets/TimetreeImport-LNMiDXdX.js

js logisticspoe-6xbwz3cw.manus.space collected 2026-10-03 05:03:56 UTC 12,856 bytes, 5 lines download raw bytes

1import{r as d,t as f,F as i,j as s,x as y,B as l,C as T,D as K,z as $}from"./index-BSDW1oXO.js";import{A as Q}from"./AppLayout-Cygsc5g6.js";import{T as V}from"./textarea-Dt-aCe2h.js";import{T as ee}from"./TimeTreeRepairProgressPanel-DJIzcqGo.js";import{A as te}from"./arrow-left-BZi9p_2F.js";import{U as se}from"./upload-4z0etFfm.js";import{C as ae}from"./circle-check-CoKTsn8F.js";import{Z as re}from"./zap-D4r2ryjp.js";import{T as ie}from"./badge-C9VVw_VW.js";import"./DriverOfflineQueueContext-BEufZpdi.js";import"./index-kDhvbWGq.js";import"./select--Ol-BrhX.js";import"./chevron-down-BLn-uhAC.js";import"./settings-CGT12rKW.js";import"./wrench-Bpj9hFtT.js";import"./index-Byu38Y_L.js";import"./progress-CzQR2Smy.js";import"./search-D9fK1HFq.js";import"./eye-DF0rd5JS.js";import"./truck-BwipagV7.js";import"./users-DBgza2Az.js";import"./chart-column-B79fz39p.js";import"./chevron-right-DYXrKHZe.js";import"./clock-3-EOigJxhq.js";import"./phone-C9TJVbMn.js";function He(){const[I,j]=d.useState(""),[m,p]=d.useState([]),[N,x]=d.useState(!1),[v,u]=d.useState(!1);f.orders.create.useMutation({onSuccess:()=>{i.success("工單建立成功")},onError:e=>{i.error(`建立失敗: ${e.message}`)}});const C=f.timetree.importFullHistory.useMutation({onSuccess:e=>{u(!1),i.success(`✅ 成功匯入 ${e.imported} 筆工單!(回溯 ${e.totalDaysBack} 天)`)},onError:e=>{u(!1),i.error(`匯入失敗: ${e.message}`)}}),M=async()=>{u(!0);try{await C.mutateAsync({})}catch(e){console.error("匯入歷史行程失敗:",e)}},S=e=>{const t=/(?:09\d{8}|0\d{1,2}-?\d{3,4}-?\d{4})/,a=e.match(t);return a?a[0]:void 0},k=e=>{const t=e.replace(/09\d{8}|0\d{1,2}-?\d{3,4}-?\d{4}/g,"").replace(/\d{1,2}:\d{2}/g,"").trim(),a=t.match(/[台澳門香港][\w\d\-號街路巷弄里區市縣鎮鄉村]+/);return a?a[0]:t.substring(0,50)},w=e=>{let t=e.match(/(?:姓名|客戶|聯絡人)[::]\s*([\u4e00-\u9fff]{2,4})/);if(t||(t=e.match(/(?:^|\s)([\u4e00-\u9fff]{2,4})(?:\s|$|[0-9]|[a-zA-Z])/),t))return t[1]},H=e=>{let t=e.match(/(\d{4}[-/]\d{1,2}[-/]\d{1,2})/);if(t)return t[1].replace(/\//g,"-");if(t=e.match(/(\d{1,2})[-/](\d{1,2})/),t&&!e.match(/\d{4}/)){const r=new Date().getFullYear(),c=t[1].padStart(2,"0"),n=t[2].padStart(2,"0");return`${r}-${c}-${n}`}},h=(e,t)=>{let a=parseInt(e);const r=t.toUpperCase().trim();return r==="PM"||r==="P.M."?a!==12&&(a+=12):(r==="AM"||r==="A.M.")&&a===12&&(a=0),a.toString().padStart(2,"0")},A=e=>{let t=e.match(/(\d{1,2}):(\d{2})\s*(AM|PM|am|pm)\s*[-~]\s*(\d{1,2}):(\d{2})\s*(AM|PM|am|pm)/i);if(t){const a=h(t[1],t[3]),r=t[2],c=h(t[4],t[6]),n=t[5];return`${a}:${r}-${c}:${n}`}if(t=e.match(/(\d{1,2}):(\d{2})\s*(AM|PM|am|pm)/i),t){const a=h(t[1],t[3]),r=t[2];return`${a}:${r}`}if(t=e.match(/(\d{1,2}):(\d{2})\s*[-~]\s*(\d{1,2}):(\d{2})/),t){const a=t[1].padStart(2,"0"),r=t[2],c=t[3].padStart(2,"0"),n=t[4];return`${a}:${r}-${c}:${n}`}if(t=e.match(/(\d{1,2}):(\d{2})/),t){const a=t[1].padStart(2,"0"),r=t[2];return`${a}:${r}`}},D=e=>
1/^取消|^cancel/i.test(e.trim()),P=e=>{const t={細佬:"David",豪:"Ho",旭:"Wang Xu"};for(const[a,r]of Object.entries(t))if(e.includes(a))return r},z=e=>{const t=[];let a=!1,r=!1;return/黑色|已完成|完成/.test(e)&&(a=!0,t.push("completed")),/放假|休假/.test(e)&&t.push("vacation"),/需要零件|訂貨|零件/.test(e)&&(t.push("parts_needed"),r=!0),/裝修|裝潢/.test(e)&&(t.push("renovation"),r=!0),{tags:t,isCompleted:a,isPending:r}},Y=()=>{const t=I.split(`
2`).filter(a=>a.trim()).map((a,r)=>{const c=D(a),n=S(a),L=k(a),U=w(a),Z=H(a),o=A(a),q=P(a),{tags:_,isCompleted:W,isPending:X}=z(a);let g,b;if(o&&o.includes("-")){const[G,J]=o.split("-");g=G,b=J}else g=o;return{id:`temp-${r}`,title:a.substring(0,50),description:a,phone:n,address:L,customerName:U,scheduledDate:Z,scheduledTime:g,scheduledEndTime:b,technicianName:q,tags:_,isCompleted:W,isPending:X,isCancelled:c,rawText:a}});p(t),i.success(`已解析 ${t.length} 筆工單`)},E=f.timetree.quickSync.useMutation({onSuccess:e=>{x(!1),e.importResult?i.success(`✅ 自動同步完成!成功匯入 ${e.importResult.imported} 筆工單,跳過 ${e.importResult.duplicateSkipped} 筆重複`):i.info(`📅 已取得 ${e.events.length} 筆事件,可手動確認後匯入`),j(""),p([])},onError:e=>{x(!1),i.error(`同步失敗: ${e.message}`)}}),R=async()=>{x(!0);try{await E.mutateAsync({daysBack:1,daysForward:14,autoImport:!0})}catch(e){console.error("快速同步失敗:",e)}},F=e=>{p(m.filter(t=>t.id!==e))},B=m.filter(e=>e.isCancelled).length,O=m.filter(e=>!e.isCancelled).length;return s.jsx(Q,{"data-loc":"client/src/pages/admin/TimetreeImport.tsx:313",title:"TimeTree 匯入",children:s.jsxs("div",{"data-loc":"client/src/pages/admin/TimetreeImport.tsx:314",className:"container mx-auto py-6 px-4 space-y-6",children:[s.jsxs("div",{"data-loc":"client/src/pages/admin/TimetreeImport.tsx:315",className:"flex items-center justify-between",children:[s.jsxs("div",{"data-loc":"client/src/pages/admin/TimetreeImport.tsx:316",className:"flex-1",children:[s.jsx("h1",{"data-loc":"client/src/pages/admin/TimetreeImport.tsx:317",className:"text-3xl font-bold mb-2",children:"Timetree 工單匯入"}),s.jsx("p",{"data-loc":"client/src/pages/admin/TimetreeImport.tsx:318",className:"text-muted-foreground",children:"貼上 Timetree 事件內容,系統會自動識別客戶姓名、預約日期時間、電話號碼、地址和取消狀態"})]}),s.jsx(y,{"data-loc":"client/src/pages/admin/TimetreeImport.tsx:322",href:"/admin",children:s.jsxs(l,{"data-loc":"client/src/pages/admin/TimetreeImport.tsx:323",variant:"outline",size:"sm",className:"gap-2 ml-4",children:[s.jsx(te,{"data-loc":"client/src/pages/admin/TimetreeImport.tsx:328",size:24}),"返回主頁"]})})]}),s.jsx(ee,{"data-loc":"client/src/pages/admin/TimetreeImport.tsx:334"}),s.jsxs(T,{"data-loc":"client/src/pages/admin/TimetreeImport.tsx:337",className:"p-6 space-y-4",children:[s.jsxs("div",{"data-loc":"client/src/pages/admin/TimetreeImport.tsx:338",children:[s.jsx("label",{"data-loc":"client/src/pages/admin/TimetreeImport.tsx:339",className:"text-sm font-medium mb-2 block",children:"貼上 Timetree 內容"}),s.jsx(V,{"data-loc":"client/src/pages/admin/TimetreeImport.tsx:340",placeholder:`每行一筆工單
3支援格式:
4- 正常工單:地址 電話 描述
5- 取消工單:取消 地址 電話 描述`,value:I,onChange:e=>j(e.target.value),className:"min-h-32 font-mono text-sm"})]}),s.jsxs("div",{"data-loc":"client/src/pages/admin/TimetreeImport.tsx:348",className:"flex gap-2 flex-wrap",children:[s.jsxs(l,{"data-loc":"client/src/pages/admin/TimetreeImport.tsx:349",onClick:Y,variant:"outline",className:"gap-2",children:[s.jsx(se,{"data-loc":"client/src/pages/admin/TimetreeImport.tsx:350",size:16}),"解析工單"]}),s.jsxs(l,{"data-loc":"client/src/pages/admin/TimetreeImport.tsx:353",onClick:R,disabled:m.length===0||N,className:"gap-2",children:[s.jsx(ae,{"data-loc":"client/src/pages/admin/TimetreeImport.tsx:358",size:16}),N?"匯入中...":"匯入工單"]}),s.jsxs(l,{"data-loc":"client/src/pages/admin/TimetreeImport.tsx:361",onClick:M,disabled:v,variant:"outline",className:"gap-2",title:"自動匯入 TimeTree 過去 365 天 + 系統運行天數的行程",children:[s.jsx(K,{"data-loc":"client/src/pages/admin/TimetreeImport.tsx:368",size:16}),v?"匯入中...":"匯入歷史行程"]}),s.jsx(y,{"data-loc":"client/src/pages/admin/TimetreeImport.tsx:371",href:"/admin/ai-dashboard",children:s.jsxs(l,{"data-loc":"client/src/pages/admin/TimetreeImport.tsx:372",variant:"outline",className:"gap-2",children:[s.jsx(re,{"data-loc":"client/src/pages/admin/TimetreeImport.tsx:373",size:16}),"AI 助手"]})})]})]}),m.length>0&&s.jsxs(T,{"data-loc":"client/src/pages/admin/TimetreeImport.tsx:382",className:"p-6 space-y-4",children:[s.jsxs("div",{"data-loc":"client/src/pages/admin/TimetreeImport.tsx:383",className:"flex justify-between items-center",children:[s.jsx("h2",{"data-loc":"client/src/pages/admin/TimetreeImport.tsx:384",className:"text-lg font-semibold",children:"解析結果"}),s.jsxs("div",{"data-loc":"client/src/pages/admin/TimetreeImport.tsx:385",className:"text-sm text-muted-foreground",children:["有效:",O," | 取消:",B]})]}),s.jsx("div",{"data-loc":"client/src/pages/admin/TimetreeImport.tsx:390",className:"space-y-2 max-h-96 overflow-y-auto",children:m.map(e=>s.jsxs("div",{"data-loc":"client/src/pages/admin/TimetreeImport.tsx:392",className:`p-3 rounded-lg border flex justify-between items-start gap-2 ${e.isCancelled?"bg-red-50 border-red-200 line-through text-red-700":"bg-blue-50 border-blue-200"}`,children:[s.jsxs("div",{"data-loc":"client/src/pages/admin/TimetreeImport.tsx:400",className:"flex-1 min-w-0",children:[s.jsxs("div",{"data-loc":"client/src/pages/admin/TimetreeImport.tsx:401",className:"flex items-center gap-2 mb-1",children:[e.isCancelled&&s.jsx($,{"data-loc":"client/src/pages/admin/TimetreeImport.tsx:403",size:16,className:"text-red-500 flex-shrink-0"}),s.jsx("span",{"data-loc":"client/src/pages/admin/TimetreeImport.tsx:405",className:"font-medium truncate",children:e.title})]}),s.jsxs("div",{"data-loc":"client/src/pages/admin/TimetreeImport.tsx:408",className:"text-xs space-y-1",children:[e.customerName&&s.jsxs("div",{"data-loc":"client/src/pages/admin/TimetreeImport.tsx:410",className:"text-muted-foreground",children:["👤 ",e.customerName]}),e.technicianName&&s.jsxs("div",{"data-loc":"client/src/pages/admin/TimetreeImport.tsx:413",className:"text-muted-foreground",children:["🔧 ",e.technicianName]}),e.scheduledDate&&s.jsxs("div",{"data-loc":"client/src/pages/admin/TimetreeImport.tsx:416",className:"text-muted-foreground",children:["📅 ",e.scheduledDate,e.scheduledTime&&s.jsxs("span",{"data-loc":"client/src/pages/admin/TimetreeImport.tsx:419",children:[` ${e.scheduledTime}`,e.scheduledEndTime&&` - ${e.scheduledEndTime}`]})]}),e.address&&s.jsxs("div",{"data-loc":"client/src/pages/admin/TimetreeImport.tsx:427",className:"text-muted-foreground",children:["📍 ",e.address]}),e.phone&&s.jsxs("div",{"data-loc":"client/src/pages/admin/TimetreeImport.tsx:430",className:"text-muted-foreground",children:["📞 ",e.phone]}
5),e.tags.length>0&&s.jsx("div",{"data-loc":"client/src/pages/admin/TimetreeImport.tsx:433",className:"flex flex-wrap gap-1 mt-1",children:e.tags.map(t=>s.jsx("span",{"data-loc":"client/src/pages/admin/TimetreeImport.tsx:435",className:`px-2 py-0.5 rounded text-xs font-medium ${e.isCompleted?"bg-black text-white":e.isPending?"bg-yellow-100 text-yellow-800":"bg-blue-100 text-blue-800"}`,children:t==="completed"?"✓ 完成":t==="vacation"?"放假":t==="parts_needed"?"需零件":t==="renovation"?"裝修":t},t))})]})]}),s.jsx("button",{"data-loc":"client/src/pages/admin/TimetreeImport.tsx:451",onClick:()=>F(e.id),className:"text-red-500 hover:text-red-700 flex-shrink-0",children:s.jsx(ie,{"data-loc":"client/src/pages/admin/TimetreeImport.tsx:455",size:16})})]},e.id))})]}),s.jsxs(T,{"data-loc":"client/src/pages/admin/TimetreeImport.tsx:464",className:"p-6 bg-blue-50 border-blue-200",children:[s.jsxs("h3",{"data-loc":"client/src/pages/admin/TimetreeImport.tsx:465",className:"font-semibold mb-3 flex items-center gap-2",children:[s.jsx($,{"data-loc":"client/src/pages/admin/TimetreeImport.tsx:466",size:16,className:"text-blue-600"}),"使用說明"]}),s.jsxs("ul",{"data-loc":"client/src/pages/admin/TimetreeImport.tsx:469",className:"text-sm space-y-2 text-muted-foreground",children:[s.jsx("li",{"data-loc":"client/src/pages/admin/TimetreeImport.tsx:470",children:"• 每行輸入一筆工單"}),s.jsx("li",{"data-loc":"client/src/pages/admin/TimetreeImport.tsx:471",children:"• 系統會自動識別客戶姓名(2-4 個中文字,或「姓名:」「客戶:」後的名字)"}),s.jsx("li",{"data-loc":"client/src/pages/admin/TimetreeImport.tsx:472",children:"• 系統會自動識別預約日期(YYYY-MM-DD、YYYY/MM/DD 或 MM-DD 格式)"}),s.jsx("li",{"data-loc":"client/src/pages/admin/TimetreeImport.tsx:473",children:"• 系統會自動識別預約時間(HH:mm 或 H:mm 格式,也支援 HH:mm-HH:mm 時間段)"}),s.jsx("li",{"data-loc":"client/src/pages/admin/TimetreeImport.tsx:474",children:"• 系統會自動識別台灣電話號碼(09xxxxxxxx 或 0x-xxxx-xxxx 格式)"}),s.jsx("li",{"data-loc":"client/src/pages/admin/TimetreeImport.tsx:475",children:"• 系統會自動識別地址(包含地區名稱的文本)"}),s.jsx("li",{"data-loc":"client/src/pages/admin/TimetreeImport.tsx:476",children:"• 如果行首寫「取消」或「cancel」,該工單會標示為取消(紅色)並不會被匯入"}),s.jsx("li",{"data-loc":"client/src/pages/admin/TimetreeImport.tsx:477",children:"• 可以手動移除不需要的工單"}),s.jsx("li",{"data-loc":"client/src/pages/admin/TimetreeImport.tsx:478",children:"• 確認無誤後點擊「匯入工單」完成"})]})]})]})})}export{He as default};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.