cmms/frontend/dist/assets/useMeterManagement-CqU4p7ia.js

2 lines
14 KiB
JavaScript

import{aO as D,r as M,c as E,bs as h}from"./index-BUdRbiwj.js";const B=D("meters",()=>{const r=M([]),n=M(null),y=M([]),F=M({}),d=M(!1),x=M(!1),o=M(null),w=M(0),v=M({status:null,type:null,asset:null,location:null,assignedUser:null,search:"",dueDateRange:null}),T=M({page:0,size:20,sort:"name_asc",sortDirection:"asc"}),C=E(()=>{let a=r.value;if(v.value.status&&(a=a.filter(t=>t.status===v.value.status)),v.value.type&&(a=a.filter(t=>t.type===v.value.type)),v.value.asset&&(a=a.filter(t=>t.assetId===v.value.asset)),v.value.location&&(a=a.filter(t=>t.locationId===v.value.location)),v.value.assignedUser&&(a=a.filter(t=>{var u;return((u=t.users)==null?void 0:u.some(i=>i.id===v.value.assignedUser))||t.primaryUserId===v.value.assignedUser})),v.value.search){const t=v.value.search.toLowerCase();a=a.filter(u=>{var i,R,b,V,U;return((i=u.name)==null?void 0:i.toLowerCase().includes(t))||((R=u.description)==null?void 0:R.toLowerCase().includes(t))||((b=u.assetName)==null?void 0:b.toLowerCase().includes(t))||((V=u.locationName)==null?void 0:V.toLowerCase().includes(t))||((U=u.id)==null?void 0:U.toString().includes(t))})}return a}),N=E(()=>r.value.reduce((a,t)=>(a[t.status]||(a[t.status]=[]),a[t.status].push(t),a),{})),S=E(()=>r.value.reduce((a,t)=>(a[t.type]||(a[t.type]=[]),a[t.type].push(t),a),{})),L=E(()=>r.value.filter(a=>a.status==="active")),I=E(()=>r.value.filter(a=>a.status==="inactive")),A=E(()=>{const a=new Date;return r.value.filter(t=>t.nextReadingDate&&new Date(t.nextReadingDate)<=a&&t.status==="active")}),e=E(()=>{const a=new Date;return r.value.filter(t=>t.nextReadingDate&&new Date(t.nextReadingDate)<a&&t.status==="active")}),l=E(()=>{const a=new Date;return r.value.filter(t=>t.nextCalibrationDate&&new Date(t.nextCalibrationDate)<=a&&t.status==="active")}),s=E(()=>r.value.filter(a=>["out_of_service","maintenance","faulty"].includes(a.status))),c=async(a={})=>{try{x.value=!0,o.value=null;const t={...T.value,...a},u=await h.search(t);return r.value=u.content||u,w.value=u.totalElements||u.length,u}catch(t){throw o.value=t.message||"Failed to search meters",t}finally{x.value=!1}},p=async(a={})=>{try{d.value=!0,o.value=null;const t=await h.getAll(a);return r.value=t.content||t,w.value=t.totalElements||t.length,t}catch(t){throw o.value=t.message||"Failed to fetch meters",t}finally{d.value=!1}};return{meters:r,currentMeter:n,metersMini:y,metersByAsset:F,loading:d,loadingGet:x,error:o,totalCount:w,filters:v,pagination:T,filteredMeters:C,metersByStatus:N,metersByType:S,activeMeters:L,inactiveMeters:I,dueForReading:A,overdueReadings:e,dueForCalibration:l,outOfService:s,searchMeters:c,fetchMeters:p,fetchMetersMini:async()=>{try{const a=await h.getMini();return y.value=a,a}catch(a){throw o.value=a.message||"Failed to fetch meters mini",a}},fetchMeterById:async a=>{try{x.value=!0,o.value=null;const t=await h.getById(a);n.value=t;const u=r.value.findIndex(i=>i.id===a);return u!==-1&&(r.value[u]=t),t}catch(t){throw o.value=t.message||"Failed to fetch meter",t}finally{x.value=!1}},fetchMetersByAsset:async a=>{try{const t=await h.getByAsset(a);return F.value[a]=t,t}catch(t){throw o.value=t.message||"Failed to fetch meters by asset",t}},createMeter:async a=>{try{d.value=!0,o.value=null;const t=await h.create(a);return r.value.unshift(t),w.value+=1,t}catch(t){throw o.value=t.message||"Failed to create meter",t}finally{d.value=!1}},updateMeter:async(a,t)=>{var u;try{d.value=!0,o.value=null;const i=await h.update(a,t),R=r.value.findIndex(b=>b.id===a);return R!==-1&&(r.value[R]=i),((u=n.value)==null?void 0:u.id)===a&&(n.value=i),i}catch(i){throw o.value=i.message||"Failed to update meter",i}finally{d.value=!1}},deleteMeter:async a=>{var t;try{d.value=!0,o.value=null,await h.delete(a);const u=r.value.findIndex(i=>i.id===a);return u!==-1&&(r.value.splice(u,1),w.value-=1),((t=n.value)==null?void 0:t.id)===a&&(n.value=null),!0}catch(u){throw o.value=u.message||"Failed to delete meter",u}finally{d.value=!1}},updateMeterStatus:async(a,t)=>{var u;try{d.value=!0,o.value=null;const i=await h.updateStatus(a,t),R=r.value.findIndex(b=>b.id===a);return R!==-1&&(r.value[R]=i),((u=n.value)==null?void 0:u.id)===a&&(n.value=i),i}catch(i){throw o.value=i.message||"Failed to update meter status",i}finally{d.value=!1}},recordMeterReading:async(a,t)=>{var u;try{d.value=!0,o.value=null;const i=await h.recordReading(a,t),R=r.value.findIndex(b=>b.id===a);return R!==-1&&(r.value[R]={...r.value[R],currentReading:t.value,lastReadingDate:t.readingDate,nextReadingDate:i.nextReadingDate}),((u=n.value)==null?void 0:u.id)===a&&(n.value={...n.value,currentReading:t.value,lastReadingDate:t.readingDate,nextReadingDate:i.nextReadingDate}),i}catch(i){throw o.value=i.message||"Failed to record meter reading",i}finally{d.value=!1}},getMetersDueForReading:async(a={})=>{try{return await h.getDueForReading(a)}catch(t){throw o.value=t.message||"Failed to get meters due for reading",t}},getMetersDueForCalibration:async(a={})=>{try{return await h.getDueForCalibration(a)}catch(t){throw o.value=t.message||"Failed to get meters due for calibration",t}},getMeterStatistics:async(a={})=>{try{return await h.getStatistics(a)}catch(t){throw o.value=t.message||"Failed to get meter statistics",t}},bulkUpdateMeters:async a=>{try{d.value=!0,o.value=null;const t=await h.bulkUpdate(a);return await p(),t}catch(t){throw o.value=t.message||"Failed to perform bulk update",t}finally{d.value=!1}},clearCurrentMeter:()=>{n.value=null},clearMeters:()=>{r.value=[],n.value=null,y.value=[],F.value={},w.value=0,o.value=null},updateFilters:a=>{v.value={...v.value,...a}},updatePagination:a=>{T.value={...T.value,...a}}}}),m={COUNTER:"counter",GAUGE:"gauge",RUNTIME:"runtime",TEMPERATURE:"temperature",PRESSURE:"pressure",FLOW:"flow",LEVEL:"level",VIBRATION:"vibration",ELECTRICAL:"electrical",OTHER:"other"},q={[m.COUNTER]:"Counter",[m.GAUGE]:"Gauge",[m.RUNTIME]:"Runtime Hours",[m.TEMPERATURE]:"Temperature",[m.PRESSURE]:"Pressure",[m.FLOW]:"Flow Rate",[m.LEVEL]:"Level",[m.VIBRATION]:"Vibration",[m.ELECTRICAL]:"Electrical",[m.OTHER]:"Other"},f={ACTIVE:"active",INACTIVE:"inactive",OUT_OF_SERVICE:"out_of_service",MAINTENANCE:"maintenance",CALIBRATION_DUE:"calibration_due",FAULTY:"faulty"},P={[f.ACTIVE]:"Active",[f.INACTIVE]:"Inactive",[f.OUT_OF_SERVICE]:"Out of Service",[f.MAINTENANCE]:"Under Maintenance",[f.CALIBRATION_DUE]:"Calibration Due",[f.FAULTY]:"Faulty"},ne=[{label:"Daily",value:1},{label:"Every 2 Days",value:2},{label:"Every 3 Days",value:3},{label:"Weekly",value:7},{label:"Bi-weekly",value:14},{label:"Monthly",value:30},{label:"Quarterly",value:90},{label:"Semi-annually",value:180},{label:"Annually",value:365},{label:"As Needed",value:0}],le={id:null,name:"",description:"",type:m.COUNTER,status:f.ACTIVE,unit:"count",assetId:null,assetName:"",locationId:null,locationName:"",categoryId:null,categoryName:"",updateFrequency:30,isMonotonic:!0,allowNegativeReadings:!1,decimalPlaces:2,minValue:null,maxValue:null,warningThreshold:null,criticalThreshold:null,currentReading:null,previousReading:null,lastReadingDate:null,nextReadingDate:null,users:[],primaryUserId:null,image:null,attachments:[],lastCalibrationDate:null,nextCalibrationDate:null,calibrationInterval:365,isActive:!0,requiresComment:!1,autoCalculateDue:!0,createdAt:null,updatedAt:null,createdBy:null,updatedBy:null},re={id:null,meterId:null,value:null,readingDate:null,comment:"",readingMethod:"manual",imageAttachment:null,location:null,isEstimated:!1,isRollover:!1,previousValue:null,difference:null,recordedBy:null,verifiedBy:null,verifiedDate:null,createdAt:null,updatedAt:null},g={name:{minLength:2,maxLength:100,pattern:/^[a-zA-Z0-9\s\-_.,()&]+$/},type:{validValues:Object.values(m)},unit:{maxLength:10},updateFrequency:{min:0,max:365},decimalPlaces:{min:0,max:6}},O={comment:{maxLength:500}};Object.keys(f).map(r=>({label:P[f[r]],value:f[r]})),Object.keys(m).map(r=>({label:q[m[r]],value:m[r]}));function ue(){const r=B(),n=M(null),y=M(!1),F=e=>{if(n.value=null,!e.name||typeof e.name!="string")return n.value="Meter name is required",!1;const l=e.name.trim();if(l.length<g.name.minLength)return n.value=`Meter name must be at least ${g.name.minLength} characters`,!1;if(l.length>g.name.maxLength)return n.value=`Meter name must be less than ${g.name.maxLength} characters`,!1;if(!g.name.pattern.test(l))return n.value="Meter name contains invalid characters",!1;if(!e.type||!g.type.validValues.includes(e.type))return n.value="Valid meter type is required",!1;if(!e.unit||typeof e.unit!="string")return n.value="Meter unit is required",!1;if(e.unit.length>g.unit.maxLength)return n.value=`Meter unit must be less than ${g.unit.maxLength} characters`,!1;if(e.updateFrequency===null||e.updateFrequency===void 0)return n.value="Update frequency is required",!1;const s=parseInt(e.updateFrequency);if(isNaN(s)||s<g.updateFrequency.min||s>g.updateFrequency.max)return n.value=`Update frequency must be between ${g.updateFrequency.min} and ${g.updateFrequency.max} days`,!1;if(e.decimalPlaces!==null&&e.decimalPlaces!==void 0){const c=parseInt(e.decimalPlaces);if(isNaN(c)||c<g.decimalPlaces.min||c>g.decimalPlaces.max)return n.value=`Decimal places must be between ${g.decimalPlaces.min} and ${g.decimalPlaces.max}`,!1}if(e.minValue!==null&&e.minValue!==void 0&&e.maxValue!==null&&e.maxValue!==void 0){const c=parseFloat(e.minValue),p=parseFloat(e.maxValue);if(!isNaN(c)&&!isNaN(p)&&c>=p)return n.value="Minimum value must be less than maximum value",!1}if(e.warningThreshold!==null&&e.warningThreshold!==void 0&&e.criticalThreshold!==null&&e.criticalThreshold!==void 0){const c=parseFloat(e.warningThreshold),p=parseFloat(e.criticalThreshold);if(!isNaN(c)&&!isNaN(p)&&c>=p)return n.value="Warning threshold must be less than critical threshold",!1}return!0},d=(e,l)=>{if(n.value=null,e.value===null||e.value===void 0||e.value==="")return n.value="Reading value is required",!1;const s=parseFloat(e.value);return isNaN(s)?(n.value="Reading value must be a valid number",!1):l.minValue!==null&&s<l.minValue?(n.value=`Reading value cannot be less than minimum value (${l.minValue})`,!1):l.maxValue!==null&&s>l.maxValue?(n.value=`Reading value cannot be greater than maximum value (${l.maxValue})`,!1):l.isMonotonic&&l.currentReading!==null&&s<l.currentReading&&!e.isRollover?(n.value="Reading value cannot be less than current reading for monotonic meters (check rollover if applicable)",!1):!l.allowNegativeReadings&&s<0?(n.value="Negative readings are not allowed for this meter",!1):e.readingDate?new Date(e.readingDate)>new Date?(n.value="Reading date cannot be in the future",!1):l.requiresComment&&(!e.comment||!e.comment.trim())?(n.value="Comment is required for this meter",!1):e.comment&&e.comment.length>O.comment.maxLength?(n.value=`Comment must be less than ${O.comment.maxLength} characters`,!1):!0:(n.value="Reading date is required",!1)},x=e=>{var s,c,p;return{...e,name:(s=e.name)==null?void 0:s.trim(),description:((c=e.description)==null?void 0:c.trim())||"",unit:(p=e.unit)==null?void 0:p.trim(),updateFrequency:parseInt(e.updateFrequency)||30,decimalPlaces:parseInt(e.decimalPlaces)||2,minValue:e.minValue?parseFloat(e.minValue):null,maxValue:e.maxValue?parseFloat(e.maxValue):null,warningThreshold:e.warningThreshold?parseFloat(e.warningThreshold):null,criticalThreshold:e.criticalThreshold?parseFloat(e.criticalThreshold):null,calibrationInterval:parseInt(e.calibrationInterval)||365,isMonotonic:!!e.isMonotonic,allowNegativeReadings:!!e.allowNegativeReadings,requiresComment:!!e.requiresComment,autoCalculateDue:!!e.autoCalculateDue,isActive:e.isActive!==void 0?!!e.isActive:!0,createdAt:e.createdAt||new Date().toISOString(),updatedAt:new Date().toISOString()}},o=e=>{var l;return{...e,value:parseFloat(e.value),comment:((l=e.comment)==null?void 0:l.trim())||"",readingDate:e.readingDate||new Date().toISOString(),readingMethod:e.readingMethod||"manual",isEstimated:!!e.isEstimated,isRollover:!!e.isRollover,createdAt:new Date().toISOString()}},w=async e=>{try{if(y.value=!0,n.value=null,!F(e))throw new Error(n.value);const l=x(e);return await r.createMeter(l)}catch(l){throw n.value=l.message||"Failed to create meter",l}finally{y.value=!1}},v=async(e,l)=>{try{if(y.value=!0,n.value=null,!F(l))throw new Error(n.value);const s=x(l);return await r.updateMeter(e,s)}catch(s){throw n.value=s.message||"Failed to update meter",s}finally{y.value=!1}},T=async e=>{try{return y.value=!0,n.value=null,await r.deleteMeter(e),!0}catch(l){throw n.value=l.message||"Failed to delete meter",l}finally{y.value=!1}},C=async(e,l,s)=>{try{if(y.value=!0,n.value=null,!d(l,s))throw new Error(n.value);const c=o(l);return await r.recordMeterReading(e,c)}catch(c){throw n.value=c.message||"Failed to record meter reading",c}finally{y.value=!1}},N=(e,l)=>{if(!l||e.updateFrequency===0)return null;const s=new Date(l),c=new Date(s);return c.setDate(c.getDate()+e.updateFrequency),c.toISOString()},S=(e,l,s=!1)=>l==null?null:s?e:e-l,L=e=>({...e,formattedCurrentReading:e.currentReading!==null?e.currentReading.toFixed(e.decimalPlaces||2):"No reading",formattedLastReadingDate:e.lastReadingDate?new Date(e.lastReadingDate).toLocaleDateString():"Never",formattedNextReadingDate:e.nextReadingDate?new Date(e.nextReadingDate).toLocaleDateString():"Not scheduled",isReadingDue:e.nextReadingDate&&new Date(e.nextReadingDate)<=new Date,isReadingOverdue:e.nextReadingDate&&new Date(e.nextReadingDate)<new Date,statusColor:I(e.status),readingStatusColor:A(e)}),I=e=>({[f.ACTIVE]:"text-green-600 bg-green-100",[f.INACTIVE]:"text-gray-600 bg-gray-100",[f.OUT_OF_SERVICE]:"text-red-600 bg-red-100",[f.MAINTENANCE]:"text-yellow-600 bg-yellow-100",[f.CALIBRATION_DUE]:"text-orange-600 bg-orange-100",[f.FAULTY]:"text-red-700 bg-red-200"})[e]||"text-gray-600 bg-gray-100",A=e=>{if(!e.nextReadingDate)return"text-gray-600 bg-gray-100";const l=new Date(e.nextReadingDate),s=new Date;return l<s?"text-red-600 bg-red-100":l.toDateString()===s.toDateString()?"text-yellow-600 bg-yellow-100":"text-green-600 bg-green-100"};return{error:E(()=>n.value),processing:E(()=>y.value),validateMeter:F,validateMeterReading:d,processMeterData:x,processMeterReadingData:o,createMeter:w,updateMeter:v,deleteMeter:T,recordMeterReading:C,calculateNextReadingDate:N,calculateReadingDifference:S,formatMeterForDisplay:L,getStatusColor:I,getReadingStatusColor:A}}export{q as M,ne as U,ue as a,m as b,le as c,P as d,re as e,f,B as u};