morningfast-plus 1.1.33 → 1.1.34

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "morningfast-plus",
3
- "version": "1.1.33",
3
+ "version": "1.1.34",
4
4
  "type": "module",
5
5
  "description": "A library based on Vue 3 and Element Plus",
6
6
  "author": "jishu_app@morningfast.com",
package/shared/format.cjs CHANGED
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./percent-2b7-3mxg.cjs");exports.createAmountFormatter=e.createAmountFormatter,exports.createPercentFormatter=e.createPercentFormatter,exports.formatAmount=e.formatAmount,exports.formatPercent=e.formatPercent;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./percent-xft1W83t.cjs");exports.createAmountFormatter=e.createAmountFormatter,exports.createPercentFormatter=e.createPercentFormatter,exports.formatAmount=e.formatAmount,exports.formatPercent=e.formatPercent;
package/shared/format.mjs CHANGED
@@ -1 +1 @@
1
- import{i as r,n as s,r as a,t}from"./percent-DRupnVdv.js";export{a as createAmountFormatter,t as createPercentFormatter,r as formatAmount,s as formatPercent};
1
+ import{i as r,n as s,r as a,t}from"./percent-DGbqbpBT.js";export{a as createAmountFormatter,t as createPercentFormatter,r as formatAmount,s as formatPercent};
package/shared/index.cjs CHANGED
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./download-CDI2JbRf.cjs"),t=require("./excel-DEgj_6cH.cjs"),r=require("./percent-2b7-3mxg.cjs");let s=require("element-plus");function n(e){const t=document.createElement("textarea");t.value=e,document.body.appendChild(t),t.select();try{if(document.execCommand("copy"))return!0}catch(r){return!1}document.body.removeChild(t)}var i=null,a="",o={},c={},l="",u="",h=void 0,d=null,p={accessKeyId:"",accessKeySecret:"",stsToken:"",region:"",bucket:"",refreshSTSTokenInterval:9999999};const f=new Proxy(p,{get:(e,t)=>e[t],set:()=>!1});async function m(){const e=await(await fetch(a,{headers:new Headers({"Content-Type":"application/json",...o||{}}),body:JSON.stringify(c||{}),method:"POST",credentials:"include"})).json();return e?.data?.accessKeySecret&&e?.data?.securityToken?e?.data:null}function w(e){p.accessKeyId=e.accessKeyId||p.accessKeyId,p.accessKeySecret=e.accessKeySecret||p.accessKeySecret,p.stsToken=e.securityToken||p.stsToken,p.region=e.region||p.region,p.bucket=e.bucket||p.bucket,l=e.accessUrl||l,u=e.uploadUrl||u,p.refreshSTSTokenInterval=(0,s.dayjs)(e.expiration).diff((0,s.dayjs)(),"millisecond"),p.refreshSTSToken=h||(async()=>{const e=await m();return p.refreshSTSTokenInterval=(0,s.dayjs)(e?.expiration).diff((0,s.dayjs)(),"millisecond"),{accessKeyId:e?.accessKeyId||"",accessKeySecret:e?.accessKeySecret||"",stsToken:e?.securityToken||""}}),d=new i(p)}async function g(e,t){const r=await d.put(`${t}/${e.name}`,e,{timeout:(new Date).getTime()+18e4});return r.name=r.name?.split("/").pop()||e.name,"https:"===window.location.protocol&&(r.url=r.url.replace("http://","https://")),l&&u&&(r.url=r.url.replace(l,u)),r}var y=class{constructor(){}static success(e="",t=""){}static info(e="",t=""){}static warn(e="",t=""){}static danger(e="",t=""){}static error(e="",t=""){}};const b={String:"string",Number:"number",Boolean:"boolean",Json:"json",Null:"null"};var v=class{constructor(e){this.structure=[],this.keyMap={id:"id",config_type:"config_type",config_name:"config_name",config_data:"config_data"},this.notError=!1,this.inited=!1,this.data=[],this.name=e.name,this.db=e.db,this.structure=e.structure,this.service=e.service,this.keyMap=e?.keyMap??this.keyMap,this.open()}get structureMap(){return this.structure.reduce((e,t)=>(e[t.name]=t,e),{})}async open(){this.validate(),this.extractPrimaryKey()}close(){this.structure=[]}validate(){if(!this.name)throw new Error("表名称不能为空");if(!this.structure)throw new Error(`表 ${this.name} 的结构未定义`);const e=this.structure.filter(e=>e.primaryKey);if(e.length>1)throw new Error(`表 ${this.name} 只能有一个主键,但找到了 ${e.length} 个, 分别是: ${e.map(e=>e.name).join(", ")}`);for(const t of this.structure){if(!t.name)throw new Error(`表 ${this.name} 的某个字段名称不能为空`);if(!b[t.type])throw new Error(`表 ${this.name} 的字段 ${t.name} 的类型 ${t.type} 无效`)}this.notError=!0}extractPrimaryKey(){this.primaryKey=this.structure.find(e=>e.primaryKey)?.name}updateStructure(e){this.structure=e,this.notError=!1,this.validate()}async fetchAsyncData(){const e=await(this.service?.queryTable(this.db,this.name));e&&(this.inited=!0,this.id=e?.[this.keyMap?.id],this.data=e?.[this.keyMap?.config_data]??[])}async getData(e=!1){return!e&&this.inited||await this.fetchAsyncData(),this.data}};const I=["=",">","<",">=","<=","!=","like"];var S=class{constructor(e){this.steps=[],this._run=e}start(){const e={collect:{select:void 0,insertInto:void 0,update:void 0,replaceInto:void 0,delete:void 0,from:void 0,where:void 0,limit:void 0},sentence:{DML:void 0}};return this.steps.push(e),this.currentStep=e,this}run(){return this._run(this)}validate(e,t,r){const s=this.currentStep;if(s?.collect?.[e])return s.error=`当前步骤已存在「${e}」操作,无法重复操作,请先调用start()重置「Action」再进行操作`,y.error("Action",s.error),!s.error;for(let n=0;n<(t?.length||0);n++){const r=t[n];if(s?.collect?.[r])break;if(n===(t?.length||0)-1)return s.error=`${e}操作缺少必要的依赖关系,请先进行「${t.join("/")}」操作`,y.error("Action",s.error),!s?.error}for(let n=0;n<(r?.length||0);n++){const t=r[n];if(s?.collect?.[t])return s.error=`「${e}」操作与「${t}」操作冲突,请只保留其中一个操作重试`,y.error("Action",s.error),!s.error}return!s.error}select(e){return this.validate("select",[],["insertInto","update","delete","replaceInto"])?(this.currentStep.collect.select=e,this.currentStep.sentence.DML="select",this):this}insertInto(e,t,r){return this.validate("insertInto",[],["select","update","delete","replaceInto"])?(this.currentStep.collect.insertInto={table:e,fields:t,values:r},this.currentStep.sentence.DML="insertInto",this):this}update(e,t,r){return this.validate("update",[],["select","insertInto","delete","replaceInto"])?(this.currentStep.collect.update={table:e,fields:t,values:r},this.currentStep.sentence.DML="update",this):this}replaceInto(e,t,r){return this.validate("replaceInto",[],["select","insertInto","update","delete"])?(this.currentStep.collect.replaceInto={table:e,fields:t,values:r},this.currentStep.sentence.DML="replaceInto",this):this}delete(){return this.validate("delete",[],["select","insertInto","update","replaceInto","limit"])?(this.currentStep.collect.delete=!0,this.currentStep.sentence.DML="delete",this):this}from(e){return this.validate("from",["select","insertInto","update","delete","replaceInto"])?(this.currentStep.collect.from=e,this):this}where(e,t="AND"){if(!this.validate("where",[],["insertInto","replaceInto"]))return this;if(!e?.length)return this;const r=this.currentStep,s={segments:[],relationship:t};for(let n=0;n<e.length;n++){const t=e[n],[i,a,o]=t?.split(" ").map(e=>e.trim());if(!i||!a||void 0===o)throw r.error=`条件语句 "${t}" 格式错误,请使用 "字段 操作符 值" 的格式`,new Error(r.error);if(!I.includes(a))throw r.error=`条件语句 "${t}" 中的操作符 "${a}" 不受支持,请使用 ${I.join(", ")} 之一`,new Error(r.error);let c;if(o.startsWith("'")&&o.endsWith("'"))c=o.slice(1,-1);else if(isNaN(Number(o)))if("true"===o.toLowerCase()||"false"===o.toLowerCase())c="true"===o.toLowerCase();else{if(isNaN(Date.parse(o)))throw r.error=`条件语句 "${t}" 中的值 "${o}" 格式错误,无法解析为字符串、数字、布尔值或日期`,new Error(r.error);c=new Date(o)}else c=Number(o);s.segments.push({leftField:i,operator:a,rightValue:c})}return this.currentStep.collect.where=s,this}limit(e){return this.validate("limit",["select"],["insertInto","update","delete","replaceInto"])?(this.currentStep.collect.limit=e,this):this}},k=class{get execution(){return window.structuredClone(this.__executions?.[this.__executions?.length-1])}get result(){return this.__executions?.[this.__executions?.length-1]?.result}constructor(e){this.tables=new Map,this.locks=new Map,this.views=new Map,this.name="",this.closed=!1,this.name=e.name,this.service=e.service,this.keyMap={id:"id",config_type:"config_type",config_name:"config_name",config_data:"config_data",...e?.keyMap||{}}}open(){this.closed=!1}close(){this.closed?y.error("校验失败",`数据库 ${this.name} 已经关闭,无需重复关闭.`):(delete this.service,delete this.__executions,this.tables.forEach(e=>e.close()),this.tables.clear(),this.locks.forEach(e=>e.close()),this.locks.clear(),this.views.forEach(e=>e.close()),this.views.clear(),this.closed=!0)}useTable(e,t){return this.tables.has(e)||this.tables.set(e,new v({name:e,db:this.name,structure:t||[],service:this.service,keyMap:this.keyMap})),this.tables.get(e)}createErrorReturn(e){return{error:e.error||""}}start(){return new S(this.run.bind(this)).start()}async run(e){const t=[];for(let s=0;s<e.steps.length;s++){const n=e.steps[s];if(n?.error){t.push(this.createErrorReturn(n));continue}if(!n?.sentence.DML){n.error="当前步骤没有明确的DML操作,无法执行,请先执行DML操作 (select/insertInto/update/replaceInto/delete)",t.push(this.createErrorReturn(n));continue}const i=n.collect?.from||(n.collect?.[n.sentence.DML])?.table,a=this.tables.get(i);if(!a||!a?.notError){n.error=`表 ${i} 不存在或错误,请先检查表.`,y.error("校验失败",n.error),t.push(this.createErrorReturn(n));continue}const o=0===s?await(a?.getData()):window.structuredClone(t?.[s-1]?.result||[]),c=window.structuredClone(o),l={id:a?.id,DML:n.sentence.DML,where:n.collect.where,limit:n.collect.limit||0,from:i,rawData:o,result:[]};t.push(l);try{switch(n.sentence.DML){case"select":l.result=this.runOnSelect(c,a,n);break;case"insertInto":l.result=this.runOnInsertInto(c,a,n);break;case"update":l.result=this.runOnUpdate(c,a,n);break;case"replaceInto":l.result=this.runOnReplaceInto(c,a,n);break;case"delete":l.result=this.runOnDelete(c,a,n)}}catch(r){n.error=r?.message,y.error("run 任务执行失败",n.error),t.push(this.createErrorReturn(n))}}return this.__executions=t,{acs:t,result:t?.[t.length-1]?.result||[],fetch:this.fetch.bind(this)}}validateTableStructure(e,t){if(t.includes("*"))return!0;const r=e.structureMap;for(let s=0;s<t.length;s++){const e=t[s];if(!r[e])return y.error("Table Structure",`表结构中不存在字段「${e}」,请检查表结构定义或查询字段是否正确`),!1}return!0}runOnSelect(e,t,r){if(!this.validateTableStructure(t,r?.collect.select||[]))throw new Error("表结构验证失败");if(!e?.length)return[];r?.collect.where&&(e=this.applicationConditions(e,r.collect.where));let s=[...e];return r?.collect?.select?.includes("*")||(s=e?.map(e=>{const t={};return(r?.collect.select||[]).forEach(r=>{t[r]=e[r]}),t})),Number(r?.collect?.limit)>0?s?.slice(0,r?.collect.limit):s||[]}generateRow(e,t){if(!["insertInto","replaceInto"].includes(t?.sentence?.DML))return void y.error("generateRow",`当前操作 ${t?.sentence?.DML} 不支持生成数据行,请检查 SQL 语句`);const r=t?.collect?.[t?.sentence?.DML];let s={};return r?.fields.forEach((e,t)=>{s[e]=r?.values[t]}),Object.keys(e.structureMap).forEach(t=>{if(void 0===s[t]){const r=e.structureMap[t];"function"==typeof r.default?s[t]=r.default():s[t]=r.default}}),s}runOnInsertInto(e,t,r){if(!this.validateTableStructure(t,r?.collect.insertInto?.fields||[]))throw new Error("表结构验证失败");if(r?.collect.insertInto?.fields.length!==r?.collect.insertInto?.values.length)throw new Error("插入数据的字段数量与值数量不匹配");const s=this.generateRow(t,r);return s&&e.push(s),e}runOnUpdate(e,t,r){if(!this.validateTableStructure(t,r?.collect.update?.fields||[]))throw new Error("表结构验证失败");return this.applicationConditions(e,r?.collect.where).forEach(e=>{r?.collect.update?.fields.forEach((t,s)=>{e[t]=r?.collect.update?.values[s]})}),e}runOnReplaceInto(e,t,r){if(!this.validateTableStructure(t,r?.collect.replaceInto?.fields||[]))throw new Error("表结构验证失败");if(r?.collect.replaceInto?.fields.length!==r?.collect.replaceInto?.values.length)throw new Error("插入数据的字段数量与值数量不匹配");if(!t?.primaryKey)throw new Error(`表 ${t.name} 没有定义主键,无法执行 replaceInto 操作,请检查表结构定义`);const s=r?.collect?.replaceInto?.fields?.findIndex(e=>e===t.primaryKey),n=r?.collect?.replaceInto?.values?.[s],i=e.findIndex(e=>e[t.primaryKey]===n),a=-1!==i?window.structuredClone(e.splice(i,1)[0]):void 0;if(a)r?.collect.replaceInto?.fields.forEach((e,t)=>{a[e]=r?.collect.replaceInto?.values[t]}),e.push(a);else{const s=this.generateRow(t,r);s&&e.push(s)}return e}runOnDelete(e,t,r){if(!r?.collect?.where)return[];if(!e?.length)throw new Error(`表 ${t.name} 为空,无法执行 delete 操作,请检查表数据`);return this.applicationConditions(e,r?.collect?.where).forEach(t=>{const r=e.indexOf(t);-1!==r&&e.splice(r,1)}),e}applicationConditions(e,t){if(!t||!t.segments.length)return e;const r=new Set;return"AND"===t?.relationship&&e?.forEach(e=>r.add(e)),t?.segments?.forEach(s=>{if("AND"===t?.relationship){const e=Array.from(r);r.clear(),e.filter(e=>this.isConditionPass(e,s)&&r.add(e))}else"OR"===t?.relationship&&e?.forEach(e=>this.isConditionPass(e,s)&&r.add(e))}),Array.from(r)}isConditionPass(e,t){if(void 0===e[t.leftField])return!1;switch(t.operator){case"=":return e[t.leftField]===t.rightValue;case">":return e[t.leftField]>t.rightValue;case"<":return e[t.leftField]<t.rightValue;case">=":return e[t.leftField]>=t.rightValue;case"<=":return e[t.leftField]<=t.rightValue;case"!=":return e[t.leftField]!==t.rightValue;case"like":return"string"==typeof e[t.leftField]&&"string"==typeof t.rightValue&&new RegExp("^"+t.rightValue.replace(/%/g,".*").replace(/_/g,".")+"$").test(e[t.leftField]);default:return!1}}async fetch(){const e=this.execution;if(!e)return y.error("fetch 失败","没有可用的执行结果,请确保已经执行了 SQL 语句并且有结果返回."),!1;const t=e.from,r=this.tables.get(t);if(!r)return y.error("fetch 失败",`表 ${t} 不存在,请检查 SQL 语句中的表名是否正确.`),!1;if(!r?.id){const e=!!(await(this.service?.createTable(this.name,this.execution?.from,this.execution?.result)));return await(r?.getData(!0)),e}switch(e.DML){case"insertInto":return!!(await(this.service?.createTable(this.name,e?.from,e.result)));case"delete":return e?.result?.length?!!(await(this.service?.updateTable(this.name,e?.from,r.id,e.result))):!!(await(this.service?.deleteTable(this.name,e?.from,r.id)));case"update":return!!(await(this.service?.updateTable(this.name,e?.from,r.id,e.result)));case"replaceInto":return e?.result?.length?!!(await(this.service?.updateTable(this.name,e?.from,r.id,e.result))):!!(await(this.service?.createTable(this.name,e?.from,e.result)));case"select":return!0;default:return!1}}},T=class{constructor(e){this.urls=e.urls,this.authToken=e.authToken||"",this.identifier=e.identifier||"",this.keyMap={id:"id",config_type:"config_type",config_name:"config_name",config_data:"config_data",...e?.keyMap||{}}}globalParams(e,t){return{[this.keyMap.config_type]:e,[this.keyMap.config_name]:this.identifier?`${t}|${this.identifier}`:t}}async fetch(e,t){const r=await fetch(e,{method:"POST",headers:{"Content-Type":"application/json",Authorization:this.authToken},body:JSON.stringify(t)});if(!r.ok)throw new Error(`指令执行失败. 响应码: ${r.status}, 响应消息: ${r.statusText}`);const s=await r.json();if(200!==s.code)throw new Error(`指令执行失败. 响应码: ${s.code}, 响应消息: ${s.message}`);return s.data}async createTable(e,t,r){try{return await this.fetch(this.urls.create,{...this.globalParams(e,t),[this.keyMap.config_data]:JSON.stringify(r)}),!0}catch(s){return!1}}async updateTable(e,t,r,s){try{return await this.fetch(this.urls.update,{...this.globalParams(e,t),[this.keyMap.id]:r,[this.keyMap.config_data]:JSON.stringify(s)}),!0}catch(n){return!1}}async deleteTable(e,t,r){try{return await this.fetch(this.urls.delete,{...this.globalParams(e,t),[this.keyMap.id]:r}),!0}catch(s){return!1}}async queryTable(e,t){return(await this.fetch(this.urls.query,{...this.globalParams(e,t)}))?.[0]}};exports.Database=k,exports.ExcelController=t.ExcelController,exports.IntegratedDb=class{constructor(e){this.databases=new Map,this.validateConfig(e),this.config=e,this.service=new T({urls:e.link.url,authToken:e.link.authToken,keyMap:e.fetchKeyMap,identifier:e.identifier})}validateConfig(e){if(!e.link?.url)throw new Error("IntegratedDb必须配置连接地址,请查看配置项中「link.url」是否为空");e.link?.authToken||y.warn("IntegratedDb","未传入「link.authToken」参数,连接存在无安全校验风险,请添加「link.authToken」以消除该警告")}openDb(e){return this.databases.has(e)||this.databases.set(e,new k({name:e,service:this.service,keyMap:this.config.fetchKeyMap})),this.databases.get(e)?.open(),this.databases.get(e)}closeDb(e){if(void 0===e)return this.databases.forEach(e=>e.close()),void this.databases.clear();this.databases.has(e)?(this.databases.get(e)?.close(),this.databases.delete(e)):y.warn("IntegratedDb",`尝试关闭数据库「${e}」,但该数据库未打开或已关闭,请检查数据库名称是否正确`)}},exports.Log=y,exports.Service=T,exports.copyText=async function(e,t){return Boolean(t?n(e):async function(e){try{return await(navigator?.clipboard?.writeText?.(e)),!0}catch(t){return n(e)}}(e))},exports.createAmountFormatter=r.createAmountFormatter,exports.createPercentFormatter=r.createPercentFormatter,exports.deleteUrlParams=function(e,t=!0){const r=new URLSearchParams(location.search);r?.delete(e);const s=r.toString();t&&history.replaceState(history.state,"",`${location.pathname}${s?`?${s}`:""}`)},exports.downloadBlob=e.downloadBlob,exports.downloadFile=e.downloadFile,exports.downloadFilesAsZip=e.downloadFilesAsZip,exports.formatAmount=r.formatAmount,exports.formatPercent=r.formatPercent,exports.generateUUID=t.generateUUID,exports.getFilenameWithoutExtension=function(e){const t=e.match(/\/([^\/]+)\.[\w]+$/);return t&&t[1]?t[1]:""},exports.getOsser=function(){return d},exports.getUrlParams=function(e){return new URLSearchParams(location.search)?.get(e)||""},exports.initUploadOss=async function(e,t,r,s){return await async function(){i=(await import("ali-oss")).default}(),!!i&&(h=s,"string"==typeof e?await async function(e,t,r){a=e||a,c=t||c,o=r||o;const s=await m();return!!s&&(w(s),!0)}(e,t,r):(p.refreshSTSTokenInterval=9999999,w(e),!0))},exports.ossConfiguration=f,exports.setUrlParams=function(e,t,r=!0){const s=new URLSearchParams(location.search);void 0!==s.get(e)?s.set(e,t):s.append(e,t);const n=s.toString();return r&&history.replaceState(history.state,"",`${location.pathname}?${n}`),s.toString()},exports.sleep=function(e){return new Promise(t=>setTimeout(t,e))},exports.uploadFileToOss=g,exports.uploadFilesToOss=async function(e,t){const r=e.map(e=>g(e,t));return await Promise.all(r)},exports.uuid=function(){return`${t.generateUUID()}-${Date.now()}`};
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./download-CDI2JbRf.cjs"),t=require("./excel-DEgj_6cH.cjs"),r=require("./percent-xft1W83t.cjs");let s=require("element-plus");function n(e){const t=document.createElement("textarea");t.value=e,document.body.appendChild(t),t.select();try{if(document.execCommand("copy"))return!0}catch(r){return!1}document.body.removeChild(t)}var i=null,a="",o={},c={},l="",u="",h=void 0,d=null,p={accessKeyId:"",accessKeySecret:"",stsToken:"",region:"",bucket:"",refreshSTSTokenInterval:9999999};const f=new Proxy(p,{get:(e,t)=>e[t],set:()=>!1});async function m(){const e=await(await fetch(a,{headers:new Headers({"Content-Type":"application/json",...o||{}}),body:JSON.stringify(c||{}),method:"POST",credentials:"include"})).json();return e?.data?.accessKeySecret&&e?.data?.securityToken?e?.data:null}function w(e){p.accessKeyId=e.accessKeyId||p.accessKeyId,p.accessKeySecret=e.accessKeySecret||p.accessKeySecret,p.stsToken=e.securityToken||p.stsToken,p.region=e.region||p.region,p.bucket=e.bucket||p.bucket,l=e.accessUrl||l,u=e.uploadUrl||u,p.refreshSTSTokenInterval=(0,s.dayjs)(e.expiration).diff((0,s.dayjs)(),"millisecond"),p.refreshSTSToken=h||(async()=>{const e=await m();return p.refreshSTSTokenInterval=(0,s.dayjs)(e?.expiration).diff((0,s.dayjs)(),"millisecond"),{accessKeyId:e?.accessKeyId||"",accessKeySecret:e?.accessKeySecret||"",stsToken:e?.securityToken||""}}),d=new i(p)}async function g(e,t){const r=await d.put(`${t}/${e.name}`,e,{timeout:(new Date).getTime()+18e4});return r.name=r.name?.split("/").pop()||e.name,"https:"===window.location.protocol&&(r.url=r.url.replace("http://","https://")),l&&u&&(r.url=r.url.replace(l,u)),r}var y=class{constructor(){}static success(e="",t=""){}static info(e="",t=""){}static warn(e="",t=""){}static danger(e="",t=""){}static error(e="",t=""){}};const b={String:"string",Number:"number",Boolean:"boolean",Json:"json",Null:"null"};var v=class{constructor(e){this.structure=[],this.keyMap={id:"id",config_type:"config_type",config_name:"config_name",config_data:"config_data"},this.notError=!1,this.inited=!1,this.data=[],this.name=e.name,this.db=e.db,this.structure=e.structure,this.service=e.service,this.keyMap=e?.keyMap??this.keyMap,this.open()}get structureMap(){return this.structure.reduce((e,t)=>(e[t.name]=t,e),{})}async open(){this.validate(),this.extractPrimaryKey()}close(){this.structure=[]}validate(){if(!this.name)throw new Error("表名称不能为空");if(!this.structure)throw new Error(`表 ${this.name} 的结构未定义`);const e=this.structure.filter(e=>e.primaryKey);if(e.length>1)throw new Error(`表 ${this.name} 只能有一个主键,但找到了 ${e.length} 个, 分别是: ${e.map(e=>e.name).join(", ")}`);for(const t of this.structure){if(!t.name)throw new Error(`表 ${this.name} 的某个字段名称不能为空`);if(!b[t.type])throw new Error(`表 ${this.name} 的字段 ${t.name} 的类型 ${t.type} 无效`)}this.notError=!0}extractPrimaryKey(){this.primaryKey=this.structure.find(e=>e.primaryKey)?.name}updateStructure(e){this.structure=e,this.notError=!1,this.validate()}async fetchAsyncData(){const e=await(this.service?.queryTable(this.db,this.name));e&&(this.inited=!0,this.id=e?.[this.keyMap?.id],this.data=e?.[this.keyMap?.config_data]??[])}async getData(e=!1){return!e&&this.inited||await this.fetchAsyncData(),this.data}};const I=["=",">","<",">=","<=","!=","like"];var S=class{constructor(e){this.steps=[],this._run=e}start(){const e={collect:{select:void 0,insertInto:void 0,update:void 0,replaceInto:void 0,delete:void 0,from:void 0,where:void 0,limit:void 0},sentence:{DML:void 0}};return this.steps.push(e),this.currentStep=e,this}run(){return this._run(this)}validate(e,t,r){const s=this.currentStep;if(s?.collect?.[e])return s.error=`当前步骤已存在「${e}」操作,无法重复操作,请先调用start()重置「Action」再进行操作`,y.error("Action",s.error),!s.error;for(let n=0;n<(t?.length||0);n++){const r=t[n];if(s?.collect?.[r])break;if(n===(t?.length||0)-1)return s.error=`${e}操作缺少必要的依赖关系,请先进行「${t.join("/")}」操作`,y.error("Action",s.error),!s?.error}for(let n=0;n<(r?.length||0);n++){const t=r[n];if(s?.collect?.[t])return s.error=`「${e}」操作与「${t}」操作冲突,请只保留其中一个操作重试`,y.error("Action",s.error),!s.error}return!s.error}select(e){return this.validate("select",[],["insertInto","update","delete","replaceInto"])?(this.currentStep.collect.select=e,this.currentStep.sentence.DML="select",this):this}insertInto(e,t,r){return this.validate("insertInto",[],["select","update","delete","replaceInto"])?(this.currentStep.collect.insertInto={table:e,fields:t,values:r},this.currentStep.sentence.DML="insertInto",this):this}update(e,t,r){return this.validate("update",[],["select","insertInto","delete","replaceInto"])?(this.currentStep.collect.update={table:e,fields:t,values:r},this.currentStep.sentence.DML="update",this):this}replaceInto(e,t,r){return this.validate("replaceInto",[],["select","insertInto","update","delete"])?(this.currentStep.collect.replaceInto={table:e,fields:t,values:r},this.currentStep.sentence.DML="replaceInto",this):this}delete(){return this.validate("delete",[],["select","insertInto","update","replaceInto","limit"])?(this.currentStep.collect.delete=!0,this.currentStep.sentence.DML="delete",this):this}from(e){return this.validate("from",["select","insertInto","update","delete","replaceInto"])?(this.currentStep.collect.from=e,this):this}where(e,t="AND"){if(!this.validate("where",[],["insertInto","replaceInto"]))return this;if(!e?.length)return this;const r=this.currentStep,s={segments:[],relationship:t};for(let n=0;n<e.length;n++){const t=e[n],[i,a,o]=t?.split(" ").map(e=>e.trim());if(!i||!a||void 0===o)throw r.error=`条件语句 "${t}" 格式错误,请使用 "字段 操作符 值" 的格式`,new Error(r.error);if(!I.includes(a))throw r.error=`条件语句 "${t}" 中的操作符 "${a}" 不受支持,请使用 ${I.join(", ")} 之一`,new Error(r.error);let c;if(o.startsWith("'")&&o.endsWith("'"))c=o.slice(1,-1);else if(isNaN(Number(o)))if("true"===o.toLowerCase()||"false"===o.toLowerCase())c="true"===o.toLowerCase();else{if(isNaN(Date.parse(o)))throw r.error=`条件语句 "${t}" 中的值 "${o}" 格式错误,无法解析为字符串、数字、布尔值或日期`,new Error(r.error);c=new Date(o)}else c=Number(o);s.segments.push({leftField:i,operator:a,rightValue:c})}return this.currentStep.collect.where=s,this}limit(e){return this.validate("limit",["select"],["insertInto","update","delete","replaceInto"])?(this.currentStep.collect.limit=e,this):this}},k=class{get execution(){return window.structuredClone(this.__executions?.[this.__executions?.length-1])}get result(){return this.__executions?.[this.__executions?.length-1]?.result}constructor(e){this.tables=new Map,this.locks=new Map,this.views=new Map,this.name="",this.closed=!1,this.name=e.name,this.service=e.service,this.keyMap={id:"id",config_type:"config_type",config_name:"config_name",config_data:"config_data",...e?.keyMap||{}}}open(){this.closed=!1}close(){this.closed?y.error("校验失败",`数据库 ${this.name} 已经关闭,无需重复关闭.`):(delete this.service,delete this.__executions,this.tables.forEach(e=>e.close()),this.tables.clear(),this.locks.forEach(e=>e.close()),this.locks.clear(),this.views.forEach(e=>e.close()),this.views.clear(),this.closed=!0)}useTable(e,t){return this.tables.has(e)||this.tables.set(e,new v({name:e,db:this.name,structure:t||[],service:this.service,keyMap:this.keyMap})),this.tables.get(e)}createErrorReturn(e){return{error:e.error||""}}start(){return new S(this.run.bind(this)).start()}async run(e){const t=[];for(let s=0;s<e.steps.length;s++){const n=e.steps[s];if(n?.error){t.push(this.createErrorReturn(n));continue}if(!n?.sentence.DML){n.error="当前步骤没有明确的DML操作,无法执行,请先执行DML操作 (select/insertInto/update/replaceInto/delete)",t.push(this.createErrorReturn(n));continue}const i=n.collect?.from||(n.collect?.[n.sentence.DML])?.table,a=this.tables.get(i);if(!a||!a?.notError){n.error=`表 ${i} 不存在或错误,请先检查表.`,y.error("校验失败",n.error),t.push(this.createErrorReturn(n));continue}const o=0===s?await(a?.getData()):window.structuredClone(t?.[s-1]?.result||[]),c=window.structuredClone(o),l={id:a?.id,DML:n.sentence.DML,where:n.collect.where,limit:n.collect.limit||0,from:i,rawData:o,result:[]};t.push(l);try{switch(n.sentence.DML){case"select":l.result=this.runOnSelect(c,a,n);break;case"insertInto":l.result=this.runOnInsertInto(c,a,n);break;case"update":l.result=this.runOnUpdate(c,a,n);break;case"replaceInto":l.result=this.runOnReplaceInto(c,a,n);break;case"delete":l.result=this.runOnDelete(c,a,n)}}catch(r){n.error=r?.message,y.error("run 任务执行失败",n.error),t.push(this.createErrorReturn(n))}}return this.__executions=t,{acs:t,result:t?.[t.length-1]?.result||[],fetch:this.fetch.bind(this)}}validateTableStructure(e,t){if(t.includes("*"))return!0;const r=e.structureMap;for(let s=0;s<t.length;s++){const e=t[s];if(!r[e])return y.error("Table Structure",`表结构中不存在字段「${e}」,请检查表结构定义或查询字段是否正确`),!1}return!0}runOnSelect(e,t,r){if(!this.validateTableStructure(t,r?.collect.select||[]))throw new Error("表结构验证失败");if(!e?.length)return[];r?.collect.where&&(e=this.applicationConditions(e,r.collect.where));let s=[...e];return r?.collect?.select?.includes("*")||(s=e?.map(e=>{const t={};return(r?.collect.select||[]).forEach(r=>{t[r]=e[r]}),t})),Number(r?.collect?.limit)>0?s?.slice(0,r?.collect.limit):s||[]}generateRow(e,t){if(!["insertInto","replaceInto"].includes(t?.sentence?.DML))return void y.error("generateRow",`当前操作 ${t?.sentence?.DML} 不支持生成数据行,请检查 SQL 语句`);const r=t?.collect?.[t?.sentence?.DML];let s={};return r?.fields.forEach((e,t)=>{s[e]=r?.values[t]}),Object.keys(e.structureMap).forEach(t=>{if(void 0===s[t]){const r=e.structureMap[t];"function"==typeof r.default?s[t]=r.default():s[t]=r.default}}),s}runOnInsertInto(e,t,r){if(!this.validateTableStructure(t,r?.collect.insertInto?.fields||[]))throw new Error("表结构验证失败");if(r?.collect.insertInto?.fields.length!==r?.collect.insertInto?.values.length)throw new Error("插入数据的字段数量与值数量不匹配");const s=this.generateRow(t,r);return s&&e.push(s),e}runOnUpdate(e,t,r){if(!this.validateTableStructure(t,r?.collect.update?.fields||[]))throw new Error("表结构验证失败");return this.applicationConditions(e,r?.collect.where).forEach(e=>{r?.collect.update?.fields.forEach((t,s)=>{e[t]=r?.collect.update?.values[s]})}),e}runOnReplaceInto(e,t,r){if(!this.validateTableStructure(t,r?.collect.replaceInto?.fields||[]))throw new Error("表结构验证失败");if(r?.collect.replaceInto?.fields.length!==r?.collect.replaceInto?.values.length)throw new Error("插入数据的字段数量与值数量不匹配");if(!t?.primaryKey)throw new Error(`表 ${t.name} 没有定义主键,无法执行 replaceInto 操作,请检查表结构定义`);const s=r?.collect?.replaceInto?.fields?.findIndex(e=>e===t.primaryKey),n=r?.collect?.replaceInto?.values?.[s],i=e.findIndex(e=>e[t.primaryKey]===n),a=-1!==i?window.structuredClone(e.splice(i,1)[0]):void 0;if(a)r?.collect.replaceInto?.fields.forEach((e,t)=>{a[e]=r?.collect.replaceInto?.values[t]}),e.push(a);else{const s=this.generateRow(t,r);s&&e.push(s)}return e}runOnDelete(e,t,r){if(!r?.collect?.where)return[];if(!e?.length)throw new Error(`表 ${t.name} 为空,无法执行 delete 操作,请检查表数据`);return this.applicationConditions(e,r?.collect?.where).forEach(t=>{const r=e.indexOf(t);-1!==r&&e.splice(r,1)}),e}applicationConditions(e,t){if(!t||!t.segments.length)return e;const r=new Set;return"AND"===t?.relationship&&e?.forEach(e=>r.add(e)),t?.segments?.forEach(s=>{if("AND"===t?.relationship){const e=Array.from(r);r.clear(),e.filter(e=>this.isConditionPass(e,s)&&r.add(e))}else"OR"===t?.relationship&&e?.forEach(e=>this.isConditionPass(e,s)&&r.add(e))}),Array.from(r)}isConditionPass(e,t){if(void 0===e[t.leftField])return!1;switch(t.operator){case"=":return e[t.leftField]===t.rightValue;case">":return e[t.leftField]>t.rightValue;case"<":return e[t.leftField]<t.rightValue;case">=":return e[t.leftField]>=t.rightValue;case"<=":return e[t.leftField]<=t.rightValue;case"!=":return e[t.leftField]!==t.rightValue;case"like":return"string"==typeof e[t.leftField]&&"string"==typeof t.rightValue&&new RegExp("^"+t.rightValue.replace(/%/g,".*").replace(/_/g,".")+"$").test(e[t.leftField]);default:return!1}}async fetch(){const e=this.execution;if(!e)return y.error("fetch 失败","没有可用的执行结果,请确保已经执行了 SQL 语句并且有结果返回."),!1;const t=e.from,r=this.tables.get(t);if(!r)return y.error("fetch 失败",`表 ${t} 不存在,请检查 SQL 语句中的表名是否正确.`),!1;if(!r?.id){const e=!!(await(this.service?.createTable(this.name,this.execution?.from,this.execution?.result)));return await(r?.getData(!0)),e}switch(e.DML){case"insertInto":return!!(await(this.service?.createTable(this.name,e?.from,e.result)));case"delete":return e?.result?.length?!!(await(this.service?.updateTable(this.name,e?.from,r.id,e.result))):!!(await(this.service?.deleteTable(this.name,e?.from,r.id)));case"update":return!!(await(this.service?.updateTable(this.name,e?.from,r.id,e.result)));case"replaceInto":return e?.result?.length?!!(await(this.service?.updateTable(this.name,e?.from,r.id,e.result))):!!(await(this.service?.createTable(this.name,e?.from,e.result)));case"select":return!0;default:return!1}}},T=class{constructor(e){this.urls=e.urls,this.authToken=e.authToken||"",this.identifier=e.identifier||"",this.keyMap={id:"id",config_type:"config_type",config_name:"config_name",config_data:"config_data",...e?.keyMap||{}}}globalParams(e,t){return{[this.keyMap.config_type]:e,[this.keyMap.config_name]:this.identifier?`${t}|${this.identifier}`:t}}async fetch(e,t){const r=await fetch(e,{method:"POST",headers:{"Content-Type":"application/json",Authorization:this.authToken},body:JSON.stringify(t)});if(!r.ok)throw new Error(`指令执行失败. 响应码: ${r.status}, 响应消息: ${r.statusText}`);const s=await r.json();if(200!==s.code)throw new Error(`指令执行失败. 响应码: ${s.code}, 响应消息: ${s.message}`);return s.data}async createTable(e,t,r){try{return await this.fetch(this.urls.create,{...this.globalParams(e,t),[this.keyMap.config_data]:JSON.stringify(r)}),!0}catch(s){return!1}}async updateTable(e,t,r,s){try{return await this.fetch(this.urls.update,{...this.globalParams(e,t),[this.keyMap.id]:r,[this.keyMap.config_data]:JSON.stringify(s)}),!0}catch(n){return!1}}async deleteTable(e,t,r){try{return await this.fetch(this.urls.delete,{...this.globalParams(e,t),[this.keyMap.id]:r}),!0}catch(s){return!1}}async queryTable(e,t){return(await this.fetch(this.urls.query,{...this.globalParams(e,t)}))?.[0]}};exports.Database=k,exports.ExcelController=t.ExcelController,exports.IntegratedDb=class{constructor(e){this.databases=new Map,this.validateConfig(e),this.config=e,this.service=new T({urls:e.link.url,authToken:e.link.authToken,keyMap:e.fetchKeyMap,identifier:e.identifier})}validateConfig(e){if(!e.link?.url)throw new Error("IntegratedDb必须配置连接地址,请查看配置项中「link.url」是否为空");e.link?.authToken||y.warn("IntegratedDb","未传入「link.authToken」参数,连接存在无安全校验风险,请添加「link.authToken」以消除该警告")}openDb(e){return this.databases.has(e)||this.databases.set(e,new k({name:e,service:this.service,keyMap:this.config.fetchKeyMap})),this.databases.get(e)?.open(),this.databases.get(e)}closeDb(e){if(void 0===e)return this.databases.forEach(e=>e.close()),void this.databases.clear();this.databases.has(e)?(this.databases.get(e)?.close(),this.databases.delete(e)):y.warn("IntegratedDb",`尝试关闭数据库「${e}」,但该数据库未打开或已关闭,请检查数据库名称是否正确`)}},exports.Log=y,exports.Service=T,exports.copyText=async function(e,t){return Boolean(t?n(e):async function(e){try{return await(navigator?.clipboard?.writeText?.(e)),!0}catch(t){return n(e)}}(e))},exports.createAmountFormatter=r.createAmountFormatter,exports.createPercentFormatter=r.createPercentFormatter,exports.deleteUrlParams=function(e,t=!0){const r=new URLSearchParams(location.search);r?.delete(e);const s=r.toString();t&&history.replaceState(history.state,"",`${location.pathname}${s?`?${s}`:""}`)},exports.downloadBlob=e.downloadBlob,exports.downloadFile=e.downloadFile,exports.downloadFilesAsZip=e.downloadFilesAsZip,exports.formatAmount=r.formatAmount,exports.formatPercent=r.formatPercent,exports.generateUUID=t.generateUUID,exports.getFilenameWithoutExtension=function(e){const t=e.match(/\/([^\/]+)\.[\w]+$/);return t&&t[1]?t[1]:""},exports.getOsser=function(){return d},exports.getUrlParams=function(e){return new URLSearchParams(location.search)?.get(e)||""},exports.initUploadOss=async function(e,t,r,s){return await async function(){i=(await import("ali-oss")).default}(),!!i&&(h=s,"string"==typeof e?await async function(e,t,r){a=e||a,c=t||c,o=r||o;const s=await m();return!!s&&(w(s),!0)}(e,t,r):(p.refreshSTSTokenInterval=9999999,w(e),!0))},exports.ossConfiguration=f,exports.setUrlParams=function(e,t,r=!0){const s=new URLSearchParams(location.search);void 0!==s.get(e)?s.set(e,t):s.append(e,t);const n=s.toString();return r&&history.replaceState(history.state,"",`${location.pathname}?${n}`),s.toString()},exports.sleep=function(e){return new Promise(t=>setTimeout(t,e))},exports.uploadFileToOss=g,exports.uploadFilesToOss=async function(e,t){const r=e.map(e=>g(e,t));return await Promise.all(r)},exports.uuid=function(){return`${t.generateUUID()}-${Date.now()}`};
package/shared/index.mjs CHANGED
@@ -1 +1 @@
1
- import{n as e,r as t,t as r}from"./download-DE5mxW8a.js";import{n as s,t as i}from"./excel-DkqK6Kr_.js";import{i as n,n as a,r as c,t as o}from"./percent-DRupnVdv.js";import{dayjs as l}from"element-plus";function h(e){const t=document.createElement("textarea");t.value=e,document.body.appendChild(t),t.select();try{if(document.execCommand("copy"))return!0}catch(r){return!1}document.body.removeChild(t)}async function u(e,t){return Boolean(t?h(e):async function(e){try{return await(navigator?.clipboard?.writeText?.(e)),!0}catch(t){return h(e)}}(e))}var d=null,f="",p={},m={},w="",y="",g=void 0,v=null,b={accessKeyId:"",accessKeySecret:"",stsToken:"",region:"",bucket:"",refreshSTSTokenInterval:9999999};const I=new Proxy(b,{get:(e,t)=>e[t],set:()=>!1});async function k(){const e=await(await fetch(f,{headers:new Headers({"Content-Type":"application/json",...p||{}}),body:JSON.stringify(m||{}),method:"POST",credentials:"include"})).json();return e?.data?.accessKeySecret&&e?.data?.securityToken?e?.data:null}function S(e){b.accessKeyId=e.accessKeyId||b.accessKeyId,b.accessKeySecret=e.accessKeySecret||b.accessKeySecret,b.stsToken=e.securityToken||b.stsToken,b.region=e.region||b.region,b.bucket=e.bucket||b.bucket,w=e.accessUrl||w,y=e.uploadUrl||y,b.refreshSTSTokenInterval=l(e.expiration).diff(l(),"millisecond"),b.refreshSTSToken=g||(async()=>{const e=await k();return b.refreshSTSTokenInterval=l(e?.expiration).diff(l(),"millisecond"),{accessKeyId:e?.accessKeyId||"",accessKeySecret:e?.accessKeySecret||"",stsToken:e?.securityToken||""}}),v=new d(b)}async function T(e,t,r,s){return await async function(){d=(await import("ali-oss")).default}(),!!d&&(g=s,"string"==typeof e?await async function(e,t,r){f=e||f,m=t||m,p=r||p;const s=await k();return!!s&&(S(s),!0)}(e,t,r):(b.refreshSTSTokenInterval=9999999,S(e),!0))}function M(){return v}async function E(e,t){const r=await v.put(`${t}/${e.name}`,e,{timeout:/* @__PURE__ */(new Date).getTime()+18e4});return r.name=r.name?.split("/").pop()||e.name,"https:"===window.location.protocol&&(r.url=r.url.replace("http://","https://")),w&&y&&(r.url=r.url.replace(w,y)),r}async function $(e,t){const r=e.map(e=>E(e,t));return await Promise.all(r)}function _(e){return new Promise(t=>setTimeout(t,e))}function D(e){return new URLSearchParams(location.search)?.get(e)||""}function L(e,t=!0){const r=new URLSearchParams(location.search);r?.delete(e);const s=r.toString();t&&history.replaceState(history.state,"",`${location.pathname}${s?`?${s}`:""}`)}function x(e,t,r=!0){const s=new URLSearchParams(location.search);void 0!==s.get(e)?s.set(e,t):s.append(e,t);const i=s.toString();return r&&history.replaceState(history.state,"",`${location.pathname}?${i}`),s.toString()}function K(e){const t=e.match(/\/([^\/]+)\.[\w]+$/);return t&&t[1]?t[1]:""}var C=class{constructor(){}static success(e="",t=""){}static info(e="",t=""){}static warn(e="",t=""){}static danger(e="",t=""){}static error(e="",t=""){}};const O={String:"string",Number:"number",Boolean:"boolean",Json:"json",Null:"null"};var P=class{constructor(e){this.structure=[],this.keyMap={id:"id",config_type:"config_type",config_name:"config_name",config_data:"config_data"},this.notError=!1,this.inited=!1,this.data=[],this.name=e.name,this.db=e.db,this.structure=e.structure,this.service=e.service,this.keyMap=e?.keyMap??this.keyMap,this.open()}get structureMap(){return this.structure.reduce((e,t)=>(e[t.name]=t,e),{})}async open(){this.validate(),this.extractPrimaryKey()}close(){this.structure=[]}validate(){if(!this.name)throw new Error("表名称不能为空");if(!this.structure)throw new Error(`表 ${this.name} 的结构未定义`);const e=this.structure.filter(e=>e.primaryKey);if(e.length>1)throw new Error(`表 ${this.name} 只能有一个主键,但找到了 ${e.length} 个, 分别是: ${e.map(e=>e.name).join(", ")}`);for(const t of this.structure){if(!t.name)throw new Error(`表 ${this.name} 的某个字段名称不能为空`);if(!O[t.type])throw new Error(`表 ${this.name} 的字段 ${t.name} 的类型 ${t.type} 无效`)}this.notError=!0}extractPrimaryKey(){this.primaryKey=this.structure.find(e=>e.primaryKey)?.name}updateStructure(e){this.structure=e,this.notError=!1,this.validate()}async fetchAsyncData(){const e=await(this.service?.queryTable(this.db,this.name));e&&(this.inited=!0,this.id=e?.[this.keyMap?.id],this.data=e?.[this.keyMap?.config_data]??[])}async getData(e=!1){return!e&&this.inited||await this.fetchAsyncData(),this.data}};const N=["=",">","<",">=","<=","!=","like"];var R=class{constructor(e){this.steps=[],this._run=e}start(){const e={collect:{select:void 0,insertInto:void 0,update:void 0,replaceInto:void 0,delete:void 0,from:void 0,where:void 0,limit:void 0},sentence:{DML:void 0}};return this.steps.push(e),this.currentStep=e,this}run(){return this._run(this)}validate(e,t,r){const s=this.currentStep;if(s?.collect?.[e])return s.error=`当前步骤已存在「${e}」操作,无法重复操作,请先调用start()重置「Action」再进行操作`,C.error("Action",s.error),!s.error;for(let i=0;i<(t?.length||0);i++){const r=t[i];if(s?.collect?.[r])break;if(i===(t?.length||0)-1)return s.error=`${e}操作缺少必要的依赖关系,请先进行「${t.join("/")}」操作`,C.error("Action",s.error),!s?.error}for(let i=0;i<(r?.length||0);i++){const t=r[i];if(s?.collect?.[t])return s.error=`「${e}」操作与「${t}」操作冲突,请只保留其中一个操作重试`,C.error("Action",s.error),!s.error}return!s.error}select(e){return this.validate("select",[],["insertInto","update","delete","replaceInto"])?(this.currentStep.collect.select=e,this.currentStep.sentence.DML="select",this):this}insertInto(e,t,r){return this.validate("insertInto",[],["select","update","delete","replaceInto"])?(this.currentStep.collect.insertInto={table:e,fields:t,values:r},this.currentStep.sentence.DML="insertInto",this):this}update(e,t,r){return this.validate("update",[],["select","insertInto","delete","replaceInto"])?(this.currentStep.collect.update={table:e,fields:t,values:r},this.currentStep.sentence.DML="update",this):this}replaceInto(e,t,r){return this.validate("replaceInto",[],["select","insertInto","update","delete"])?(this.currentStep.collect.replaceInto={table:e,fields:t,values:r},this.currentStep.sentence.DML="replaceInto",this):this}delete(){return this.validate("delete",[],["select","insertInto","update","replaceInto","limit"])?(this.currentStep.collect.delete=!0,this.currentStep.sentence.DML="delete",this):this}from(e){return this.validate("from",["select","insertInto","update","delete","replaceInto"])?(this.currentStep.collect.from=e,this):this}where(e,t="AND"){if(!this.validate("where",[],["insertInto","replaceInto"]))return this;if(!e?.length)return this;const r=this.currentStep,s={segments:[],relationship:t};for(let i=0;i<e.length;i++){const t=e[i],[n,a,c]=t?.split(" ").map(e=>e.trim());if(!n||!a||void 0===c)throw r.error=`条件语句 "${t}" 格式错误,请使用 "字段 操作符 值" 的格式`,new Error(r.error);if(!N.includes(a))throw r.error=`条件语句 "${t}" 中的操作符 "${a}" 不受支持,请使用 ${N.join(", ")} 之一`,new Error(r.error);let o;if(c.startsWith("'")&&c.endsWith("'"))o=c.slice(1,-1);else if(isNaN(Number(c)))if("true"===c.toLowerCase()||"false"===c.toLowerCase())o="true"===c.toLowerCase();else{if(isNaN(Date.parse(c)))throw r.error=`条件语句 "${t}" 中的值 "${c}" 格式错误,无法解析为字符串、数字、布尔值或日期`,new Error(r.error);o=new Date(c)}else o=Number(c);s.segments.push({leftField:n,operator:a,rightValue:o})}return this.currentStep.collect.where=s,this}limit(e){return this.validate("limit",["select"],["insertInto","update","delete","replaceInto"])?(this.currentStep.collect.limit=e,this):this}},j=class{get execution(){return window.structuredClone(this.__executions?.[this.__executions?.length-1])}get result(){return this.__executions?.[this.__executions?.length-1]?.result}constructor(e){this.tables=/* @__PURE__ */new Map,this.locks=/* @__PURE__ */new Map,this.views=/* @__PURE__ */new Map,this.name="",this.closed=!1,this.name=e.name,this.service=e.service,this.keyMap={id:"id",config_type:"config_type",config_name:"config_name",config_data:"config_data",...e?.keyMap||{}}}open(){this.closed=!1}close(){this.closed?C.error("校验失败",`数据库 ${this.name} 已经关闭,无需重复关闭.`):(delete this.service,delete this.__executions,this.tables.forEach(e=>e.close()),this.tables.clear(),this.locks.forEach(e=>e.close()),this.locks.clear(),this.views.forEach(e=>e.close()),this.views.clear(),this.closed=!0)}useTable(e,t){return this.tables.has(e)||this.tables.set(e,new P({name:e,db:this.name,structure:t||[],service:this.service,keyMap:this.keyMap})),this.tables.get(e)}createErrorReturn(e){return{error:e.error||""}}start(){return new R(this.run.bind(this)).start()}async run(e){const t=[];for(let s=0;s<e.steps.length;s++){const i=e.steps[s];if(i?.error){t.push(this.createErrorReturn(i));continue}if(!i?.sentence.DML){i.error="当前步骤没有明确的DML操作,无法执行,请先执行DML操作 (select/insertInto/update/replaceInto/delete)",t.push(this.createErrorReturn(i));continue}const n=i.collect?.from||(i.collect?.[i.sentence.DML])?.table,a=this.tables.get(n);if(!a||!a?.notError){i.error=`表 ${n} 不存在或错误,请先检查表.`,C.error("校验失败",i.error),t.push(this.createErrorReturn(i));continue}const c=0===s?await(a?.getData()):window.structuredClone(t?.[s-1]?.result||[]),o=window.structuredClone(c),l={id:a?.id,DML:i.sentence.DML,where:i.collect.where,limit:i.collect.limit||0,from:n,rawData:c,result:[]};t.push(l);try{switch(i.sentence.DML){case"select":l.result=this.runOnSelect(o,a,i);break;case"insertInto":l.result=this.runOnInsertInto(o,a,i);break;case"update":l.result=this.runOnUpdate(o,a,i);break;case"replaceInto":l.result=this.runOnReplaceInto(o,a,i);break;case"delete":l.result=this.runOnDelete(o,a,i)}}catch(r){i.error=r?.message,C.error("run 任务执行失败",i.error),t.push(this.createErrorReturn(i))}}return this.__executions=t,{acs:t,result:t?.[t.length-1]?.result||[],fetch:this.fetch.bind(this)}}validateTableStructure(e,t){if(t.includes("*"))return!0;const r=e.structureMap;for(let s=0;s<t.length;s++){const e=t[s];if(!r[e])return C.error("Table Structure",`表结构中不存在字段「${e}」,请检查表结构定义或查询字段是否正确`),!1}return!0}runOnSelect(e,t,r){if(!this.validateTableStructure(t,r?.collect.select||[]))throw new Error("表结构验证失败");if(!e?.length)return[];r?.collect.where&&(e=this.applicationConditions(e,r.collect.where));let s=[...e];return r?.collect?.select?.includes("*")||(s=e?.map(e=>{const t={};return(r?.collect.select||[]).forEach(r=>{t[r]=e[r]}),t})),Number(r?.collect?.limit)>0?s?.slice(0,r?.collect.limit):s||[]}generateRow(e,t){if(!["insertInto","replaceInto"].includes(t?.sentence?.DML))return void C.error("generateRow",`当前操作 ${t?.sentence?.DML} 不支持生成数据行,请检查 SQL 语句`);const r=t?.collect?.[t?.sentence?.DML];let s={};return r?.fields.forEach((e,t)=>{s[e]=r?.values[t]}),Object.keys(e.structureMap).forEach(t=>{if(void 0===s[t]){const r=e.structureMap[t];"function"==typeof r.default?s[t]=r.default():s[t]=r.default}}),s}runOnInsertInto(e,t,r){if(!this.validateTableStructure(t,r?.collect.insertInto?.fields||[]))throw new Error("表结构验证失败");if(r?.collect.insertInto?.fields.length!==r?.collect.insertInto?.values.length)throw new Error("插入数据的字段数量与值数量不匹配");const s=this.generateRow(t,r);return s&&e.push(s),e}runOnUpdate(e,t,r){if(!this.validateTableStructure(t,r?.collect.update?.fields||[]))throw new Error("表结构验证失败");return this.applicationConditions(e,r?.collect.where).forEach(e=>{r?.collect.update?.fields.forEach((t,s)=>{e[t]=r?.collect.update?.values[s]})}),e}runOnReplaceInto(e,t,r){if(!this.validateTableStructure(t,r?.collect.replaceInto?.fields||[]))throw new Error("表结构验证失败");if(r?.collect.replaceInto?.fields.length!==r?.collect.replaceInto?.values.length)throw new Error("插入数据的字段数量与值数量不匹配");if(!t?.primaryKey)throw new Error(`表 ${t.name} 没有定义主键,无法执行 replaceInto 操作,请检查表结构定义`);const s=r?.collect?.replaceInto?.fields?.findIndex(e=>e===t.primaryKey),i=r?.collect?.replaceInto?.values?.[s],n=e.findIndex(e=>e[t.primaryKey]===i),a=-1!==n?window.structuredClone(e.splice(n,1)[0]):void 0;if(a)r?.collect.replaceInto?.fields.forEach((e,t)=>{a[e]=r?.collect.replaceInto?.values[t]}),e.push(a);else{const s=this.generateRow(t,r);s&&e.push(s)}return e}runOnDelete(e,t,r){if(!r?.collect?.where)return[];if(!e?.length)throw new Error(`表 ${t.name} 为空,无法执行 delete 操作,请检查表数据`);return this.applicationConditions(e,r?.collect?.where).forEach(t=>{const r=e.indexOf(t);-1!==r&&e.splice(r,1)}),e}applicationConditions(e,t){if(!t||!t.segments.length)return e;const r=/* @__PURE__ */new Set;return"AND"===t?.relationship&&e?.forEach(e=>r.add(e)),t?.segments?.forEach(s=>{if("AND"===t?.relationship){const e=Array.from(r);r.clear(),e.filter(e=>this.isConditionPass(e,s)&&r.add(e))}else"OR"===t?.relationship&&e?.forEach(e=>this.isConditionPass(e,s)&&r.add(e))}),Array.from(r)}isConditionPass(e,t){if(void 0===e[t.leftField])return!1;switch(t.operator){case"=":return e[t.leftField]===t.rightValue;case">":return e[t.leftField]>t.rightValue;case"<":return e[t.leftField]<t.rightValue;case">=":return e[t.leftField]>=t.rightValue;case"<=":return e[t.leftField]<=t.rightValue;case"!=":return e[t.leftField]!==t.rightValue;case"like":return"string"==typeof e[t.leftField]&&"string"==typeof t.rightValue&&/* @__PURE__ */new RegExp("^"+t.rightValue.replace(/%/g,".*").replace(/_/g,".")+"$").test(e[t.leftField]);default:return!1}}async fetch(){const e=this.execution;if(!e)return C.error("fetch 失败","没有可用的执行结果,请确保已经执行了 SQL 语句并且有结果返回."),!1;const t=e.from,r=this.tables.get(t);if(!r)return C.error("fetch 失败",`表 ${t} 不存在,请检查 SQL 语句中的表名是否正确.`),!1;if(!r?.id){const e=!!(await(this.service?.createTable(this.name,this.execution?.from,this.execution?.result)));return await(r?.getData(!0)),e}switch(e.DML){case"insertInto":return!!(await(this.service?.createTable(this.name,e?.from,e.result)));case"delete":return e?.result?.length?!!(await(this.service?.updateTable(this.name,e?.from,r.id,e.result))):!!(await(this.service?.deleteTable(this.name,e?.from,r.id)));case"update":return!!(await(this.service?.updateTable(this.name,e?.from,r.id,e.result)));case"replaceInto":return e?.result?.length?!!(await(this.service?.updateTable(this.name,e?.from,r.id,e.result))):!!(await(this.service?.createTable(this.name,e?.from,e.result)));case"select":return!0;default:return!1}}},A=class{constructor(e){this.urls=e.urls,this.authToken=e.authToken||"",this.identifier=e.identifier||"",this.keyMap={id:"id",config_type:"config_type",config_name:"config_name",config_data:"config_data",...e?.keyMap||{}}}globalParams(e,t){return{[this.keyMap.config_type]:e,[this.keyMap.config_name]:this.identifier?`${t}|${this.identifier}`:t}}async fetch(e,t){const r=await fetch(e,{method:"POST",headers:{"Content-Type":"application/json",Authorization:this.authToken},body:JSON.stringify(t)});if(!r.ok)throw new Error(`指令执行失败. 响应码: ${r.status}, 响应消息: ${r.statusText}`);const s=await r.json();if(200!==s.code)throw new Error(`指令执行失败. 响应码: ${s.code}, 响应消息: ${s.message}`);return s.data}async createTable(e,t,r){try{return await this.fetch(this.urls.create,{...this.globalParams(e,t),[this.keyMap.config_data]:JSON.stringify(r)}),!0}catch(s){return!1}}async updateTable(e,t,r,s){try{return await this.fetch(this.urls.update,{...this.globalParams(e,t),[this.keyMap.id]:r,[this.keyMap.config_data]:JSON.stringify(s)}),!0}catch(i){return!1}}async deleteTable(e,t,r){try{return await this.fetch(this.urls.delete,{...this.globalParams(e,t),[this.keyMap.id]:r}),!0}catch(s){return!1}}async queryTable(e,t){return(await this.fetch(this.urls.query,{...this.globalParams(e,t)}))?.[0]}};function F(){return`${s()}-${Date.now()}`}var V=class{constructor(e){this.databases=/* @__PURE__ */new Map,this.validateConfig(e),this.config=e,this.service=new A({urls:e.link.url,authToken:e.link.authToken,keyMap:e.fetchKeyMap,identifier:e.identifier})}validateConfig(e){if(!e.link?.url)throw new Error("IntegratedDb必须配置连接地址,请查看配置项中「link.url」是否为空");e.link?.authToken||C.warn("IntegratedDb","未传入「link.authToken」参数,连接存在无安全校验风险,请添加「link.authToken」以消除该警告")}openDb(e){return this.databases.has(e)||this.databases.set(e,new j({name:e,service:this.service,keyMap:this.config.fetchKeyMap})),this.databases.get(e)?.open(),this.databases.get(e)}closeDb(e){if(void 0===e)return this.databases.forEach(e=>e.close()),void this.databases.clear();this.databases.has(e)?(this.databases.get(e)?.close(),this.databases.delete(e)):C.warn("IntegratedDb",`尝试关闭数据库「${e}」,但该数据库未打开或已关闭,请检查数据库名称是否正确`)}};export{j as Database,i as ExcelController,V as IntegratedDb,C as Log,A as Service,u as copyText,c as createAmountFormatter,o as createPercentFormatter,L as deleteUrlParams,r as downloadBlob,e as downloadFile,t as downloadFilesAsZip,n as formatAmount,a as formatPercent,s as generateUUID,K as getFilenameWithoutExtension,M as getOsser,D as getUrlParams,T as initUploadOss,I as ossConfiguration,x as setUrlParams,_ as sleep,E as uploadFileToOss,$ as uploadFilesToOss,F as uuid};
1
+ import{n as e,r as t,t as r}from"./download-DE5mxW8a.js";import{n as s,t as i}from"./excel-DkqK6Kr_.js";import{i as n,n as a,r as c,t as o}from"./percent-DGbqbpBT.js";import{dayjs as l}from"element-plus";function h(e){const t=document.createElement("textarea");t.value=e,document.body.appendChild(t),t.select();try{if(document.execCommand("copy"))return!0}catch(r){return!1}document.body.removeChild(t)}async function u(e,t){return Boolean(t?h(e):async function(e){try{return await(navigator?.clipboard?.writeText?.(e)),!0}catch(t){return h(e)}}(e))}var d=null,f="",p={},m={},w="",y="",g=void 0,v=null,b={accessKeyId:"",accessKeySecret:"",stsToken:"",region:"",bucket:"",refreshSTSTokenInterval:9999999};const I=new Proxy(b,{get:(e,t)=>e[t],set:()=>!1});async function k(){const e=await(await fetch(f,{headers:new Headers({"Content-Type":"application/json",...p||{}}),body:JSON.stringify(m||{}),method:"POST",credentials:"include"})).json();return e?.data?.accessKeySecret&&e?.data?.securityToken?e?.data:null}function S(e){b.accessKeyId=e.accessKeyId||b.accessKeyId,b.accessKeySecret=e.accessKeySecret||b.accessKeySecret,b.stsToken=e.securityToken||b.stsToken,b.region=e.region||b.region,b.bucket=e.bucket||b.bucket,w=e.accessUrl||w,y=e.uploadUrl||y,b.refreshSTSTokenInterval=l(e.expiration).diff(l(),"millisecond"),b.refreshSTSToken=g||(async()=>{const e=await k();return b.refreshSTSTokenInterval=l(e?.expiration).diff(l(),"millisecond"),{accessKeyId:e?.accessKeyId||"",accessKeySecret:e?.accessKeySecret||"",stsToken:e?.securityToken||""}}),v=new d(b)}async function T(e,t,r,s){return await async function(){d=(await import("ali-oss")).default}(),!!d&&(g=s,"string"==typeof e?await async function(e,t,r){f=e||f,m=t||m,p=r||p;const s=await k();return!!s&&(S(s),!0)}(e,t,r):(b.refreshSTSTokenInterval=9999999,S(e),!0))}function M(){return v}async function E(e,t){const r=await v.put(`${t}/${e.name}`,e,{timeout:/* @__PURE__ */(new Date).getTime()+18e4});return r.name=r.name?.split("/").pop()||e.name,"https:"===window.location.protocol&&(r.url=r.url.replace("http://","https://")),w&&y&&(r.url=r.url.replace(w,y)),r}async function $(e,t){const r=e.map(e=>E(e,t));return await Promise.all(r)}function _(e){return new Promise(t=>setTimeout(t,e))}function D(e){return new URLSearchParams(location.search)?.get(e)||""}function L(e,t=!0){const r=new URLSearchParams(location.search);r?.delete(e);const s=r.toString();t&&history.replaceState(history.state,"",`${location.pathname}${s?`?${s}`:""}`)}function x(e,t,r=!0){const s=new URLSearchParams(location.search);void 0!==s.get(e)?s.set(e,t):s.append(e,t);const i=s.toString();return r&&history.replaceState(history.state,"",`${location.pathname}?${i}`),s.toString()}function K(e){const t=e.match(/\/([^\/]+)\.[\w]+$/);return t&&t[1]?t[1]:""}var C=class{constructor(){}static success(e="",t=""){}static info(e="",t=""){}static warn(e="",t=""){}static danger(e="",t=""){}static error(e="",t=""){}};const O={String:"string",Number:"number",Boolean:"boolean",Json:"json",Null:"null"};var P=class{constructor(e){this.structure=[],this.keyMap={id:"id",config_type:"config_type",config_name:"config_name",config_data:"config_data"},this.notError=!1,this.inited=!1,this.data=[],this.name=e.name,this.db=e.db,this.structure=e.structure,this.service=e.service,this.keyMap=e?.keyMap??this.keyMap,this.open()}get structureMap(){return this.structure.reduce((e,t)=>(e[t.name]=t,e),{})}async open(){this.validate(),this.extractPrimaryKey()}close(){this.structure=[]}validate(){if(!this.name)throw new Error("表名称不能为空");if(!this.structure)throw new Error(`表 ${this.name} 的结构未定义`);const e=this.structure.filter(e=>e.primaryKey);if(e.length>1)throw new Error(`表 ${this.name} 只能有一个主键,但找到了 ${e.length} 个, 分别是: ${e.map(e=>e.name).join(", ")}`);for(const t of this.structure){if(!t.name)throw new Error(`表 ${this.name} 的某个字段名称不能为空`);if(!O[t.type])throw new Error(`表 ${this.name} 的字段 ${t.name} 的类型 ${t.type} 无效`)}this.notError=!0}extractPrimaryKey(){this.primaryKey=this.structure.find(e=>e.primaryKey)?.name}updateStructure(e){this.structure=e,this.notError=!1,this.validate()}async fetchAsyncData(){const e=await(this.service?.queryTable(this.db,this.name));e&&(this.inited=!0,this.id=e?.[this.keyMap?.id],this.data=e?.[this.keyMap?.config_data]??[])}async getData(e=!1){return!e&&this.inited||await this.fetchAsyncData(),this.data}};const N=["=",">","<",">=","<=","!=","like"];var R=class{constructor(e){this.steps=[],this._run=e}start(){const e={collect:{select:void 0,insertInto:void 0,update:void 0,replaceInto:void 0,delete:void 0,from:void 0,where:void 0,limit:void 0},sentence:{DML:void 0}};return this.steps.push(e),this.currentStep=e,this}run(){return this._run(this)}validate(e,t,r){const s=this.currentStep;if(s?.collect?.[e])return s.error=`当前步骤已存在「${e}」操作,无法重复操作,请先调用start()重置「Action」再进行操作`,C.error("Action",s.error),!s.error;for(let i=0;i<(t?.length||0);i++){const r=t[i];if(s?.collect?.[r])break;if(i===(t?.length||0)-1)return s.error=`${e}操作缺少必要的依赖关系,请先进行「${t.join("/")}」操作`,C.error("Action",s.error),!s?.error}for(let i=0;i<(r?.length||0);i++){const t=r[i];if(s?.collect?.[t])return s.error=`「${e}」操作与「${t}」操作冲突,请只保留其中一个操作重试`,C.error("Action",s.error),!s.error}return!s.error}select(e){return this.validate("select",[],["insertInto","update","delete","replaceInto"])?(this.currentStep.collect.select=e,this.currentStep.sentence.DML="select",this):this}insertInto(e,t,r){return this.validate("insertInto",[],["select","update","delete","replaceInto"])?(this.currentStep.collect.insertInto={table:e,fields:t,values:r},this.currentStep.sentence.DML="insertInto",this):this}update(e,t,r){return this.validate("update",[],["select","insertInto","delete","replaceInto"])?(this.currentStep.collect.update={table:e,fields:t,values:r},this.currentStep.sentence.DML="update",this):this}replaceInto(e,t,r){return this.validate("replaceInto",[],["select","insertInto","update","delete"])?(this.currentStep.collect.replaceInto={table:e,fields:t,values:r},this.currentStep.sentence.DML="replaceInto",this):this}delete(){return this.validate("delete",[],["select","insertInto","update","replaceInto","limit"])?(this.currentStep.collect.delete=!0,this.currentStep.sentence.DML="delete",this):this}from(e){return this.validate("from",["select","insertInto","update","delete","replaceInto"])?(this.currentStep.collect.from=e,this):this}where(e,t="AND"){if(!this.validate("where",[],["insertInto","replaceInto"]))return this;if(!e?.length)return this;const r=this.currentStep,s={segments:[],relationship:t};for(let i=0;i<e.length;i++){const t=e[i],[n,a,c]=t?.split(" ").map(e=>e.trim());if(!n||!a||void 0===c)throw r.error=`条件语句 "${t}" 格式错误,请使用 "字段 操作符 值" 的格式`,new Error(r.error);if(!N.includes(a))throw r.error=`条件语句 "${t}" 中的操作符 "${a}" 不受支持,请使用 ${N.join(", ")} 之一`,new Error(r.error);let o;if(c.startsWith("'")&&c.endsWith("'"))o=c.slice(1,-1);else if(isNaN(Number(c)))if("true"===c.toLowerCase()||"false"===c.toLowerCase())o="true"===c.toLowerCase();else{if(isNaN(Date.parse(c)))throw r.error=`条件语句 "${t}" 中的值 "${c}" 格式错误,无法解析为字符串、数字、布尔值或日期`,new Error(r.error);o=new Date(c)}else o=Number(c);s.segments.push({leftField:n,operator:a,rightValue:o})}return this.currentStep.collect.where=s,this}limit(e){return this.validate("limit",["select"],["insertInto","update","delete","replaceInto"])?(this.currentStep.collect.limit=e,this):this}},j=class{get execution(){return window.structuredClone(this.__executions?.[this.__executions?.length-1])}get result(){return this.__executions?.[this.__executions?.length-1]?.result}constructor(e){this.tables=/* @__PURE__ */new Map,this.locks=/* @__PURE__ */new Map,this.views=/* @__PURE__ */new Map,this.name="",this.closed=!1,this.name=e.name,this.service=e.service,this.keyMap={id:"id",config_type:"config_type",config_name:"config_name",config_data:"config_data",...e?.keyMap||{}}}open(){this.closed=!1}close(){this.closed?C.error("校验失败",`数据库 ${this.name} 已经关闭,无需重复关闭.`):(delete this.service,delete this.__executions,this.tables.forEach(e=>e.close()),this.tables.clear(),this.locks.forEach(e=>e.close()),this.locks.clear(),this.views.forEach(e=>e.close()),this.views.clear(),this.closed=!0)}useTable(e,t){return this.tables.has(e)||this.tables.set(e,new P({name:e,db:this.name,structure:t||[],service:this.service,keyMap:this.keyMap})),this.tables.get(e)}createErrorReturn(e){return{error:e.error||""}}start(){return new R(this.run.bind(this)).start()}async run(e){const t=[];for(let s=0;s<e.steps.length;s++){const i=e.steps[s];if(i?.error){t.push(this.createErrorReturn(i));continue}if(!i?.sentence.DML){i.error="当前步骤没有明确的DML操作,无法执行,请先执行DML操作 (select/insertInto/update/replaceInto/delete)",t.push(this.createErrorReturn(i));continue}const n=i.collect?.from||(i.collect?.[i.sentence.DML])?.table,a=this.tables.get(n);if(!a||!a?.notError){i.error=`表 ${n} 不存在或错误,请先检查表.`,C.error("校验失败",i.error),t.push(this.createErrorReturn(i));continue}const c=0===s?await(a?.getData()):window.structuredClone(t?.[s-1]?.result||[]),o=window.structuredClone(c),l={id:a?.id,DML:i.sentence.DML,where:i.collect.where,limit:i.collect.limit||0,from:n,rawData:c,result:[]};t.push(l);try{switch(i.sentence.DML){case"select":l.result=this.runOnSelect(o,a,i);break;case"insertInto":l.result=this.runOnInsertInto(o,a,i);break;case"update":l.result=this.runOnUpdate(o,a,i);break;case"replaceInto":l.result=this.runOnReplaceInto(o,a,i);break;case"delete":l.result=this.runOnDelete(o,a,i)}}catch(r){i.error=r?.message,C.error("run 任务执行失败",i.error),t.push(this.createErrorReturn(i))}}return this.__executions=t,{acs:t,result:t?.[t.length-1]?.result||[],fetch:this.fetch.bind(this)}}validateTableStructure(e,t){if(t.includes("*"))return!0;const r=e.structureMap;for(let s=0;s<t.length;s++){const e=t[s];if(!r[e])return C.error("Table Structure",`表结构中不存在字段「${e}」,请检查表结构定义或查询字段是否正确`),!1}return!0}runOnSelect(e,t,r){if(!this.validateTableStructure(t,r?.collect.select||[]))throw new Error("表结构验证失败");if(!e?.length)return[];r?.collect.where&&(e=this.applicationConditions(e,r.collect.where));let s=[...e];return r?.collect?.select?.includes("*")||(s=e?.map(e=>{const t={};return(r?.collect.select||[]).forEach(r=>{t[r]=e[r]}),t})),Number(r?.collect?.limit)>0?s?.slice(0,r?.collect.limit):s||[]}generateRow(e,t){if(!["insertInto","replaceInto"].includes(t?.sentence?.DML))return void C.error("generateRow",`当前操作 ${t?.sentence?.DML} 不支持生成数据行,请检查 SQL 语句`);const r=t?.collect?.[t?.sentence?.DML];let s={};return r?.fields.forEach((e,t)=>{s[e]=r?.values[t]}),Object.keys(e.structureMap).forEach(t=>{if(void 0===s[t]){const r=e.structureMap[t];"function"==typeof r.default?s[t]=r.default():s[t]=r.default}}),s}runOnInsertInto(e,t,r){if(!this.validateTableStructure(t,r?.collect.insertInto?.fields||[]))throw new Error("表结构验证失败");if(r?.collect.insertInto?.fields.length!==r?.collect.insertInto?.values.length)throw new Error("插入数据的字段数量与值数量不匹配");const s=this.generateRow(t,r);return s&&e.push(s),e}runOnUpdate(e,t,r){if(!this.validateTableStructure(t,r?.collect.update?.fields||[]))throw new Error("表结构验证失败");return this.applicationConditions(e,r?.collect.where).forEach(e=>{r?.collect.update?.fields.forEach((t,s)=>{e[t]=r?.collect.update?.values[s]})}),e}runOnReplaceInto(e,t,r){if(!this.validateTableStructure(t,r?.collect.replaceInto?.fields||[]))throw new Error("表结构验证失败");if(r?.collect.replaceInto?.fields.length!==r?.collect.replaceInto?.values.length)throw new Error("插入数据的字段数量与值数量不匹配");if(!t?.primaryKey)throw new Error(`表 ${t.name} 没有定义主键,无法执行 replaceInto 操作,请检查表结构定义`);const s=r?.collect?.replaceInto?.fields?.findIndex(e=>e===t.primaryKey),i=r?.collect?.replaceInto?.values?.[s],n=e.findIndex(e=>e[t.primaryKey]===i),a=-1!==n?window.structuredClone(e.splice(n,1)[0]):void 0;if(a)r?.collect.replaceInto?.fields.forEach((e,t)=>{a[e]=r?.collect.replaceInto?.values[t]}),e.push(a);else{const s=this.generateRow(t,r);s&&e.push(s)}return e}runOnDelete(e,t,r){if(!r?.collect?.where)return[];if(!e?.length)throw new Error(`表 ${t.name} 为空,无法执行 delete 操作,请检查表数据`);return this.applicationConditions(e,r?.collect?.where).forEach(t=>{const r=e.indexOf(t);-1!==r&&e.splice(r,1)}),e}applicationConditions(e,t){if(!t||!t.segments.length)return e;const r=/* @__PURE__ */new Set;return"AND"===t?.relationship&&e?.forEach(e=>r.add(e)),t?.segments?.forEach(s=>{if("AND"===t?.relationship){const e=Array.from(r);r.clear(),e.filter(e=>this.isConditionPass(e,s)&&r.add(e))}else"OR"===t?.relationship&&e?.forEach(e=>this.isConditionPass(e,s)&&r.add(e))}),Array.from(r)}isConditionPass(e,t){if(void 0===e[t.leftField])return!1;switch(t.operator){case"=":return e[t.leftField]===t.rightValue;case">":return e[t.leftField]>t.rightValue;case"<":return e[t.leftField]<t.rightValue;case">=":return e[t.leftField]>=t.rightValue;case"<=":return e[t.leftField]<=t.rightValue;case"!=":return e[t.leftField]!==t.rightValue;case"like":return"string"==typeof e[t.leftField]&&"string"==typeof t.rightValue&&/* @__PURE__ */new RegExp("^"+t.rightValue.replace(/%/g,".*").replace(/_/g,".")+"$").test(e[t.leftField]);default:return!1}}async fetch(){const e=this.execution;if(!e)return C.error("fetch 失败","没有可用的执行结果,请确保已经执行了 SQL 语句并且有结果返回."),!1;const t=e.from,r=this.tables.get(t);if(!r)return C.error("fetch 失败",`表 ${t} 不存在,请检查 SQL 语句中的表名是否正确.`),!1;if(!r?.id){const e=!!(await(this.service?.createTable(this.name,this.execution?.from,this.execution?.result)));return await(r?.getData(!0)),e}switch(e.DML){case"insertInto":return!!(await(this.service?.createTable(this.name,e?.from,e.result)));case"delete":return e?.result?.length?!!(await(this.service?.updateTable(this.name,e?.from,r.id,e.result))):!!(await(this.service?.deleteTable(this.name,e?.from,r.id)));case"update":return!!(await(this.service?.updateTable(this.name,e?.from,r.id,e.result)));case"replaceInto":return e?.result?.length?!!(await(this.service?.updateTable(this.name,e?.from,r.id,e.result))):!!(await(this.service?.createTable(this.name,e?.from,e.result)));case"select":return!0;default:return!1}}},A=class{constructor(e){this.urls=e.urls,this.authToken=e.authToken||"",this.identifier=e.identifier||"",this.keyMap={id:"id",config_type:"config_type",config_name:"config_name",config_data:"config_data",...e?.keyMap||{}}}globalParams(e,t){return{[this.keyMap.config_type]:e,[this.keyMap.config_name]:this.identifier?`${t}|${this.identifier}`:t}}async fetch(e,t){const r=await fetch(e,{method:"POST",headers:{"Content-Type":"application/json",Authorization:this.authToken},body:JSON.stringify(t)});if(!r.ok)throw new Error(`指令执行失败. 响应码: ${r.status}, 响应消息: ${r.statusText}`);const s=await r.json();if(200!==s.code)throw new Error(`指令执行失败. 响应码: ${s.code}, 响应消息: ${s.message}`);return s.data}async createTable(e,t,r){try{return await this.fetch(this.urls.create,{...this.globalParams(e,t),[this.keyMap.config_data]:JSON.stringify(r)}),!0}catch(s){return!1}}async updateTable(e,t,r,s){try{return await this.fetch(this.urls.update,{...this.globalParams(e,t),[this.keyMap.id]:r,[this.keyMap.config_data]:JSON.stringify(s)}),!0}catch(i){return!1}}async deleteTable(e,t,r){try{return await this.fetch(this.urls.delete,{...this.globalParams(e,t),[this.keyMap.id]:r}),!0}catch(s){return!1}}async queryTable(e,t){return(await this.fetch(this.urls.query,{...this.globalParams(e,t)}))?.[0]}};function F(){return`${s()}-${Date.now()}`}var V=class{constructor(e){this.databases=/* @__PURE__ */new Map,this.validateConfig(e),this.config=e,this.service=new A({urls:e.link.url,authToken:e.link.authToken,keyMap:e.fetchKeyMap,identifier:e.identifier})}validateConfig(e){if(!e.link?.url)throw new Error("IntegratedDb必须配置连接地址,请查看配置项中「link.url」是否为空");e.link?.authToken||C.warn("IntegratedDb","未传入「link.authToken」参数,连接存在无安全校验风险,请添加「link.authToken」以消除该警告")}openDb(e){return this.databases.has(e)||this.databases.set(e,new j({name:e,service:this.service,keyMap:this.config.fetchKeyMap})),this.databases.get(e)?.open(),this.databases.get(e)}closeDb(e){if(void 0===e)return this.databases.forEach(e=>e.close()),void this.databases.clear();this.databases.has(e)?(this.databases.get(e)?.close(),this.databases.delete(e)):C.warn("IntegratedDb",`尝试关闭数据库「${e}」,但该数据库未打开或已关闭,请检查数据库名称是否正确`)}};export{j as Database,i as ExcelController,V as IntegratedDb,C as Log,A as Service,u as copyText,c as createAmountFormatter,o as createPercentFormatter,L as deleteUrlParams,r as downloadBlob,e as downloadFile,t as downloadFilesAsZip,n as formatAmount,a as formatPercent,s as generateUUID,K as getFilenameWithoutExtension,M as getOsser,D as getUrlParams,T as initUploadOss,I as ossConfiguration,x as setUrlParams,_ as sleep,E as uploadFileToOss,$ as uploadFilesToOss,F as uuid};
@@ -1 +1 @@
1
- function r(r,n={}){const t="string"==typeof n?{currency:n}:n,i=t.fallback??"";if(null==r||""===r)return i;const e=Number(r);if(!Number.isFinite(e))return i;const u=t.digits??2,c=t.locale??"en-US",o=function(r){return"string"!=typeof r?"":r.trim().toUpperCase()}(t.currency);return`${t.symbol??function(r,n,t="narrowSymbol"){if(!r)return"";try{return new Intl.NumberFormat(n,{style:"currency",currency:r,currencyDisplay:t}).formatToParts(0).find(r=>"currency"===r.type)?.value??""}catch{return""}}(o,c,t.currencyDisplay)}${new Intl.NumberFormat(c,{minimumFractionDigits:u,maximumFractionDigits:u}).format(e)}`}function n(n={}){return(t,i,e)=>r(e,"function"==typeof n?n(t):n)}function t(r,n={}){const t=n.fallback??"";if(null==r||""===r)return t;const i=Number(r);if(!Number.isFinite(i))return t;const e=n.digits??2,u=n.locale??"en-US";return`${new Intl.NumberFormat(u,{minimumFractionDigits:e,maximumFractionDigits:e}).format(100*i)}%`}function i(r={}){return(n,i,e)=>t(e,"function"==typeof r?r(n):r)}export{r as i,t as n,n as r,i as t};
1
+ function r(r,n={}){const t="string"==typeof n?{currency:n}:n,i=t.fallback??"";if(null==r||""===r)return i;const e=Number(r);if(!Number.isFinite(e))return i;const u=t.digits??2,c=t.locale??"en-US",o=function(r){return"string"!=typeof r?"":r.trim().toUpperCase()}(t.currency);return`${t.symbol??function(r,n,t="narrowSymbol"){if(!r)return"";try{return new Intl.NumberFormat(n,{style:"currency",currency:r,currencyDisplay:t}).formatToParts(0).find(r=>"currency"===r.type)?.value??""}catch{return""}}(o,c,t.currencyDisplay)}${new Intl.NumberFormat(c,{minimumFractionDigits:u,maximumFractionDigits:u}).format(e)}`}function n(n={}){return(t,i,e)=>r(e,"function"==typeof n?n(t):n)}function t(r,n={}){const t=n.fallback??"";if(null==r||""===r)return t;const i=Number(r);if(!Number.isFinite(i))return t;const e=n.digits??2,u=n.locale??"en-US";return`${new Intl.NumberFormat(u,{minimumFractionDigits:e,maximumFractionDigits:e}).format(i)}%`}function i(r={}){return(n,i,e)=>t(e,"function"==typeof r?r(n):r)}export{r as i,t as n,n as r,i as t};
@@ -1 +1 @@
1
- function r(r,t={}){const e="string"==typeof t?{currency:t}:t,n=e.fallback??"";if(null==r||""===r)return n;const i=Number(r);if(!Number.isFinite(i))return n;const u=e.digits??2,o=e.locale??"en-US",c=function(r){return"string"!=typeof r?"":r.trim().toUpperCase()}(e.currency);return`${e.symbol??function(r,t,e="narrowSymbol"){if(!r)return"";try{return new Intl.NumberFormat(t,{style:"currency",currency:r,currencyDisplay:e}).formatToParts(0).find(r=>"currency"===r.type)?.value??""}catch{return""}}(c,o,e.currencyDisplay)}${new Intl.NumberFormat(o,{minimumFractionDigits:u,maximumFractionDigits:u}).format(i)}`}function t(t={}){return(e,n,i)=>r(i,"function"==typeof t?t(e):t)}function e(r,t={}){const e=t.fallback??"";if(null==r||""===r)return e;const n=Number(r);if(!Number.isFinite(n))return e;const i=t.digits??2,u=t.locale??"en-US";return`${new Intl.NumberFormat(u,{minimumFractionDigits:i,maximumFractionDigits:i}).format(100*n)}%`}function n(r={}){return(t,n,i)=>e(i,"function"==typeof r?r(t):r)}Object.defineProperty(exports,"createAmountFormatter",{enumerable:!0,get:function(){return t}}),Object.defineProperty(exports,"createPercentFormatter",{enumerable:!0,get:function(){return n}}),Object.defineProperty(exports,"formatAmount",{enumerable:!0,get:function(){return r}}),Object.defineProperty(exports,"formatPercent",{enumerable:!0,get:function(){return e}});
1
+ function r(r,t={}){const e="string"==typeof t?{currency:t}:t,n=e.fallback??"";if(null==r||""===r)return n;const i=Number(r);if(!Number.isFinite(i))return n;const u=e.digits??2,o=e.locale??"en-US",c=function(r){return"string"!=typeof r?"":r.trim().toUpperCase()}(e.currency);return`${e.symbol??function(r,t,e="narrowSymbol"){if(!r)return"";try{return new Intl.NumberFormat(t,{style:"currency",currency:r,currencyDisplay:e}).formatToParts(0).find(r=>"currency"===r.type)?.value??""}catch{return""}}(c,o,e.currencyDisplay)}${new Intl.NumberFormat(o,{minimumFractionDigits:u,maximumFractionDigits:u}).format(i)}`}function t(t={}){return(e,n,i)=>r(i,"function"==typeof t?t(e):t)}function e(r,t={}){const e=t.fallback??"";if(null==r||""===r)return e;const n=Number(r);if(!Number.isFinite(n))return e;const i=t.digits??2,u=t.locale??"en-US";return`${new Intl.NumberFormat(u,{minimumFractionDigits:i,maximumFractionDigits:i}).format(n)}%`}function n(r={}){return(t,n,i)=>e(i,"function"==typeof r?r(t):r)}Object.defineProperty(exports,"createAmountFormatter",{enumerable:!0,get:function(){return t}}),Object.defineProperty(exports,"createPercentFormatter",{enumerable:!0,get:function(){return n}}),Object.defineProperty(exports,"formatAmount",{enumerable:!0,get:function(){return r}}),Object.defineProperty(exports,"formatPercent",{enumerable:!0,get:function(){return e}});