calculator2026/33/static/js/HtFeeMethodGrid-BpYIiL-T.js
2026-06-25 09:43:48 +08:00

1 line
12 KiB
JavaScript

import{$ as e,At as t,Bt as n,Cr as r,Dt as i,Er as a,G as o,H as s,K as c,M as l,Ot as ee,Pt as te,Q as u,U as d,W as ne,Wn as f,er as p,ft as m,mn as h,tt as g,xr as re,yn as _}from"./vendor-ag-grid~XmMajorFactor~XmConsultCategoryFactor~xmInfo~ZxFwView~HtFeeMethodTypeLineVie~ntegcu2a-CFxQnYK4.js";import{t as ie}from"./vendor-ag-grid~XmMajorFactor~XmConsultCategoryFactor~xmInfo~ZxFwView~HtFeeMethodTypeLineVie~ntegcu2a-BnO-wAhh.js";import{D as ae}from"./workspace-DxKKyh8w.js";import{c as v,i as y,o as b,u as oe}from"./decimal-D3bp1pbs.js";import{a as se,d as ce,dt as le,ft as ue,gt as de,ht as fe,lt as pe,mt as me,pt as he,ut as ge}from"./vendor-ui-B4V4Cf1T.js";import{n as _e,r as ve}from"./numberFormat-jhZZmX17.js";import{A as ye,C as be,k as x}from"./index-CAPJG_im.js";import{t as xe}from"./vendor-ag-grid~XmMajorFactor~XmConsultCategoryFactor~xmInfo~ZxFwView~HtFeeMethodTypeLineVie~ntegcu2a-DXO754eW.js";import{a as Se,i as Ce,o as we,r as Te,t as Ee}from"./agGridReadonlyAutoHeight-BpRhYCq1.js";var De={class:`h-full min-h-0 flex flex-col`},Oe={class:`rounded-lg border bg-card xmMx flex min-h-0 flex-1 flex-col`},ke={class:`flex items-center justify-between border-b px-4 py-3`},Ae={class:`text-sm font-semibold text-foreground`},je={class:`mt-4 flex items-center justify-end gap-2`},S=`fee-method-summary`,C=g({__name:`HtFeeMethodGrid`,props:{title:{},storageKey:{},contractId:{},contractName:{},fixedNames:{}},setup(C){let w=C,{t:T}=ae(),E=ye(),D=be(),O=()=>`fee-method-${Date.now()}-${Math.random().toString(16).slice(2,8)}`,k=(e=``)=>({id:O(),name:e,rateFee:null,hourlyFee:null,quantityUnitPriceFee:null}),A=e=>e?.id===S,j=e=>String(e||``).includes(`-reserve`),M=(e,t)=>{let n=b(e.map(e=>t(e)));return n==null?null:y(n,3)},N=e=>{if(!e)return null;let t=b([e.rateFee,e.hourlyFee,e.quantityUnitPriceFee]);return t==null?null:y(t,3)},Me=e=>!Array.isArray(e)||e.length===0?null:M(e,e=>N(e)),Ne=async e=>{try{let t=`htExtraFee-${e}-additional-work`;return Me((await D.loadHtFeeMainState(t))?.detailRows)}catch(e){return console.error(`loadAdditionalWorkFeeTotal failed:`,e),null}},Pe=async()=>{let e=String(w.contractId||``).trim();if(!e)return null;try{await D.loadContract(e);let t=D.getBaseSubtotal(e);if(!j(w.storageKey))return t==null?null:y(t,3);let n=await Ne(e);return t!=null||n!=null?y(oe(t)+oe(n),3):null}catch(e){return console.error(`loadContractServiceFeeBase failed:`,e),null}},Fe=e=>{let t=e?.detailRows?e?.detailRows?.filter(e=>e.serviceBudget!==null):[];if(t.length===0)return null;let n=0,r=!1;for(let e of t){let t=v(e?.serviceBudget);if(t!=null){n+=t,r=!0;continue}let i=v(e?.adoptedBudgetUnitPrice),a=v(e?.personnelCount),o=v(e?.workdayCount);i==null||a==null||o==null||(n+=i*a*o,r=!0)}return r?y(n,3):null},Ie=e=>{let t=e?.detailRows?e?.detailRows?.filter(e=>e.budgetFee!==null):[];if(t.length===0)return null;let n=0,r=!1;for(let e of t){if(String(e?.id||``)===`fee-subtotal-fixed`)continue;let t=v(e?.budgetFee);if(t!=null){n+=t,r=!0;continue}let i=v(e?.quantity),a=v(e?.unitPrice);i==null||a==null||(n+=i*a,r=!0)}return r?y(n,3):null},P=async e=>{if(!Array.isArray(e)||e.length===0)return e;let t=await Pe();return await Promise.all(e.map(async e=>{if(!e?.id)return e;let[n,r,i]=await Promise.all([D.loadHtFeeMethodState(w.storageKey,e.id,`rate-fee`),D.loadHtFeeMethodState(w.storageKey,e.id,`hourly-fee`),D.loadHtFeeMethodState(w.storageKey,e.id,`quantity-unit-price-fee`)]),a=v(n?.budgetFee),o=v(n?.rate),s=t!=null&&o!=null?y(t*o/100,2):a==null?null:y(a,2),c=Fe(r),l=Ie(i);return{...e,rateFee:s,hourlyFee:c,quantityUnitPriceFee:l}}))},F=s(()=>Array.isArray(w.fixedNames)?w.fixedNames.map(e=>({name:e.name,id:e.id})):[]),I=s(()=>F.value.length>0),Le=s(()=>JSON.stringify(F.value.map(e=>({id:String(e?.id||``),name:String(e?.name||``)})))),L=s({get:()=>{let e=D.getHtFeeMainState(w.storageKey)?.detailRows;return Array.isArray(e)?e:[]},set:e=>{D.setHtFeeMainState(w.storageKey,{detailRows:e})}}),Re=s(()=>{let e=M(L.value,e=>e.rateFee),t=M(L.value,e=>e.hourlyFee),n=M(L.value,e=>e.quantityUnitPriceFee),r={id:S,name:T(`htFeeGrid.subtotal`),rateFee:e,hourlyFee:t,quantityUnitPriceFee:n};return r.subtotal=N(r),r}),ze=s(()=>[...L.value,Re.value]),R=f(null),z=f(!1),B=f(null),V=f(``),Be=f(``),H=(e,t)=>{B.value=e,V.value=String(t||``).trim()||T(`htFeeGrid.currentRow`),z.value=!0},Ve=e=>{z.value=e},He=async()=>{let e=B.value;e&&(await q(e),z.value=!1,B.value=null,V.value=``)},Ue=e=>e.value==null||e.value===``?(A(e.data),``):String(e.value),U=e=>e.value==null||e.value===``?(A(e.data),``):_e(e.value,3),W=e=>ve(e,{precision:3}),We=e=>typeof e.budgetFee==`number`&&Number.isFinite(e.budgetFee)?e.budgetFee:typeof e.quantity==`number`&&Number.isFinite(e.quantity)&&typeof e.unitPrice==`number`&&Number.isFinite(e.unitPrice)?y(e.quantity*e.unitPrice,2):null,G=e=>{let t=(Array.isArray(e)?e:[]).filter(e=>e?.id!==S).map(e=>{let t=e;return{id:typeof t.id==`string`&&t.id?t.id:O(),name:typeof t.name==`string`?t.name:typeof t.feeItem==`string`?t.feeItem:``,rateFee:typeof t.rateFee==`number`?t.rateFee:null,hourlyFee:typeof t.hourlyFee==`number`?t.hourlyFee:null,quantityUnitPriceFee:typeof t.quantityUnitPriceFee==`number`?t.quantityUnitPriceFee:We(t)}});if(I.value){let e=new Map(t.map(e=>[String(e.id||``),e])),n=new Map(t.map(e=>[e.name,e]));return F.value.map((t,r)=>{let i=String(t?.id||`fee-method-fixed-${r}`),a=e.get(i)||n.get(t.name);return{id:i,name:t.name,rateFee:a?.rateFee??null,hourlyFee:a?.hourlyFee??null,quantityUnitPriceFee:a?.quantityUnitPriceFee??null}})}return t.length>0?t:[k()]},Ge=()=>L.value.map(e=>({...e})),K=async(e=!1)=>{try{let t={detailRows:JSON.parse(JSON.stringify(Ge()))},n=JSON.stringify(t.detailRows);if(!e&&n===Be.value)return;D.setHtFeeMainState(w.storageKey,t,{force:e}),Be.value=n}catch(e){console.error(`saveToIndexedDB failed:`,e)}},Ke=async()=>{try{L.value=await P(G((await D.loadHtFeeMainState(w.storageKey))?.detailRows)),await K(!0)}catch(e){console.error(`loadFromIndexedDB failed:`,e),L.value=await P(G([])),await K(!0)}},qe=()=>{L.value=[...L.value,k()],K()},q=async e=>{E.removeTab(`ht-fee-edit-${w.storageKey}-${e}`),await i(),D.removeHtFeeMethodState(w.storageKey,e,`rate-fee`),D.removeHtFeeMethodState(w.storageKey,e,`hourly-fee`),D.removeHtFeeMethodState(w.storageKey,e,`quantity-unit-price-fee`),L.value=L.value.map(t=>t.id===e?{...t,rateFee:null,hourlyFee:null,quantityUnitPriceFee:null}:t),await K()},J=e=>{let t=L.value.find(t=>t.id===e);t&&E.openTab({id:`ht-fee-edit-${w.storageKey}-${e}`,title:T(`htFeeGrid.editTabTitle`,{name:t.name||T(`htFeeGrid.unnamed`)}),componentName:`HtFeeMethodTypeLineView`,props:{sourceTitle:w.title,storageKey:w.storageKey,rowId:e,rowName:t.name||``,contractId:w.contractId,contractName:w.contractName}})},Je=g({name:`HtFeeMethodActionCellRenderer`,props:{params:{type:Object,required:!0}},setup(e){return()=>{if(A(e.params.data))return null;let t=t=>n=>{n.preventDefault(),n.stopPropagation();let r=String(e.params.data?.id||``).trim();if(r){if(t===`edit`){e.params.context?.onActionEdit?.(r);return}e.params.context?.onActionRequestClear?.(r,String(e.params.data?.name||``))}};return m(`div`,{class:`zxfw-action-wrap`},[m(`div`,{class:`zxfw-action-group`},[m(`button`,{class:`zxfw-action-btn`,"data-action":`edit`,type:`button`,onClick:t(`edit`)},[m(se,{size:13,"aria-hidden":`true`}),m(`span`,T(`htFeeGrid.edit`))]),m(`button`,{class:`zxfw-action-btn zxfw-action-btn--danger`,"data-action":`clear`,type:`button`,onClick:t(`clear`)},[m(ce,{size:13,"aria-hidden":`true`}),m(`span`,T(`htFeeGrid.clear`))])])])}}}),Ye=[{headerName:T(`htFeeGrid.columns.name`),field:`name`,minWidth:180,flex:1.8,editable:!1,valueFormatter:Ue,cellClass:e=>e.context?.fixedNames===!0||A(e.data)?``:`editable-cell-line`,cellClassRules:{"editable-cell-empty":e=>e.value==null||e.value===``}},{headerName:T(`htFeeGrid.columns.rateFee`),field:`rateFee`,minWidth:130,flex:1.2,editable:!1,headerClass:`ag-right-aligned-header`,valueParser:e=>W(e.newValue),valueFormatter:U,cellClassRules:{"ag-right-aligned-cell":()=>!0,"editable-cell-empty":e=>e.value==null||e.value===``}},{headerName:T(`htFeeGrid.columns.hourlyFee`),field:`hourlyFee`,minWidth:130,flex:1.2,editable:!1,headerClass:`ag-right-aligned-header`,valueParser:e=>W(e.newValue),valueFormatter:U,cellClassRules:{"ag-right-aligned-cell":()=>!0,"editable-cell-empty":e=>e.value==null||e.value===``}},{headerName:T(`htFeeGrid.columns.quantityUnitPriceFee`),field:`quantityUnitPriceFee`,minWidth:130,flex:1.2,editable:!1,headerClass:`ag-right-aligned-header`,valueParser:e=>W(e.newValue),valueFormatter:U,cellClassRules:{"ag-right-aligned-cell":()=>!0,"editable-cell-empty":e=>e.value==null||e.value===``}},{headerName:T(`htFeeGrid.columns.subtotal`),field:`subtotal`,minWidth:140,flex:1.2,editable:!1,headerClass:`ag-right-aligned-header`,cellClassRules:{"ag-right-aligned-cell":()=>!0},valueGetter:e=>N(e.data),valueFormatter:U},{headerName:T(`htFeeGrid.columns.actions`),field:`actions`,minWidth:220,flex:1.6,maxWidth:260,editable:!1,sortable:!1,filter:!1,suppressMovable:!0,cellRenderer:Je}],Xe=s(()=>Ee(Ye)),Y={...Se,treeData:!1,getDataPath:void 0,context:{fixedNames:I.value,onActionEdit:J,onActionClear:q,onActionRequestClear:H},onCellClicked:e=>{if(e.colDef.field!==`actions`||!e.data||A(e.data))return;let t=((e.event?.target)?.closest(`button[data-action]`))?.dataset.action;if(t===`edit`){J(e.data.id);return}if(t===`clear`){H(e.data.id,e.data.name);return}}},X=null,Z=()=>{X&&clearTimeout(X),X=setTimeout(()=>{Ke()},80)},Ze=e=>{R.value=e.api},Q=!1,Qe=()=>{K()},$e=e=>{Q||A(e.data)||Qe()},et=()=>{Q=!0},$=()=>{Q=!1,Qe()};te(async()=>{await Ke()}),ee(()=>{Z()});let tt=s(()=>w.storageKey),nt=s(()=>{if(!j(w.storageKey))return``;let e=String(w.contractId||``).trim();if(!e)return``;let t=`htExtraFee-${e}-additional-work`;return JSON.stringify(D.htFeeMainStates[t]||null)});return h(tt,()=>{Z()}),h(()=>JSON.stringify(D.htFeeMethodStates[w.storageKey]||null),(e,t)=>{!e&&!t||e!==t&&Z()}),h(()=>{let e=String(w.contractId||``).trim();return e?JSON.stringify(D.contracts[e]||null):``},(e,t)=>{e!==t&&Z()}),h(nt,(e,t)=>{e!==t&&Z()}),h([I],()=>{Y.context&&(Y.context.fixedNames=I.value,Y.context.onActionEdit=J,Y.context.onActionClear=q,Y.context.onActionRequestClear=H,R.value?.refreshCells({force:!0}))}),h(Le,async(e,t)=>{if(!I.value||!e||e===t)return;let n=G(L.value);JSON.stringify(n)!==JSON.stringify(L.value)&&(L.value=n,await K(!0),R.value?.refreshCells({force:!0}))}),t(()=>{X&&clearTimeout(X),R.value=null,K(!0)}),(t,i)=>(n(),c(l,null,[d(`div`,De,[d(`div`,Oe,[d(`div`,ke,[d(`h3`,Ae,a(C.title),1),I.value?o(``,!0):(n(),ne(p(x),{key:0,type:`button`,variant:`outline`,size:`sm`,onClick:qe},{default:_(()=>[u(a(p(T)(`htFeeGrid.add`)),1)]),_:1}))]),d(`div`,{class:re(p(Ce))},[e(p(ie),{style:r(p(Te)),rowData:ze.value,columnDefs:Xe.value,gridOptions:Y,theme:p(we),animateRows:!0,treeData:!1,localeText:p(xe),tooltipShowDelay:500,headerHeight:50,suppressColumnVirtualisation:!0,suppressRowVirtualisation:!0,cellSelection:{handle:{mode:`range`}},enableClipboard:!0,undoRedoCellEditing:!0,undoRedoCellEditingLimit:20,onGridReady:Ze,onCellValueChanged:$e,onPasteStart:et,onPasteEnd:$,onFillStart:et,onFillEnd:$},null,8,[`style`,`rowData`,`columnDefs`,`theme`,`localeText`])],2)])]),e(p(ge),{open:z.value,"onUpdate:open":Ve},{default:_(()=>[e(p(le),null,{default:_(()=>[e(p(ue),{class:`fixed inset-0 z-50 bg-black/45`}),e(p(fe),{class:`fixed left-1/2 top-1/2 z-[70] w-[92vw] max-w-md -translate-x-1/2 -translate-y-1/2 rounded-lg border bg-background p-5 shadow-xl`},{default:_(()=>[e(p(pe),{class:`text-base font-semibold`},{default:_(()=>[u(a(p(T)(`htFeeGrid.dialog.clearTitle`)),1)]),_:1}),e(p(he),{class:`mt-2 text-sm text-muted-foreground`},{default:_(()=>[u(a(p(T)(`htFeeGrid.dialog.clearDesc`,{name:V.value})),1)]),_:1}),d(`div`,je,[e(p(me),{"as-child":``},{default:_(()=>[e(p(x),{variant:`outline`},{default:_(()=>[u(a(p(T)(`common.cancel`)),1)]),_:1})]),_:1}),e(p(de),{"as-child":``},{default:_(()=>[e(p(x),{variant:`destructive`,onClick:He},{default:_(()=>[u(a(p(T)(`htFeeGrid.dialog.confirmClear`)),1)]),_:1})]),_:1})])]),_:1})]),_:1})]),_:1},8,[`open`])],64))}});export{C as t};