Преглед на файлове

feat:软件包管理 预警规则

huang, kai (Contractor) преди 6 дни
родител
ревизия
fe929255f8

+ 723 - 0
admin.ui.plus-master/beiyong.vue

@@ -0,0 +1,723 @@
+<template>
+  <div class="layout">
+    <h1 style="margin-top: 10px;margin-bottom: 10px;">页面配置</h1>
+    <div style="color: #505050;margin-bottom: 20px;">将表单内容进行分步可以提高用户处理的专注度,降低页面的复杂性</div>
+    <el-card class="mt8" shadow="never" :body-style="{ paddingBottom: '0' }">
+      <div>
+        <el-form :inline="true" @submit.stop.prevent>
+          <el-form-item label="接口地址" style="width: 60%;">
+            <el-input v-model="state.filter.name" placeholder="请输入接口地址" @keyup.enter="onQuery" />
+          </el-form-item>
+          <el-form-item>
+            <el-button type="primary" icon="ele-Search" @click="onQuery"> 查询 </el-button>
+          </el-form-item>
+        </el-form>
+      </div>
+      <div>
+        <el-form :inline="true" @submit.stop.prevent>
+          <el-form-item label="查询页面接口来源" style="width: 70%;">
+            <el-select v-model="state.filter.api"  placeholder="请选择页面接口来源" @change="onChange(state.filter.api)">
+              <el-option v-for="(value, key) in state.api" :key="key" :label="value.api+' '+value.summary"  :value="value.api" />
+            </el-select>
+          </el-form-item>
+        </el-form>
+      </div>
+    </el-card>
+    <el-card class="mt8" shadow="never" :body-style="{ paddingBottom: '0' }">
+      <div>
+        <el-form :inline="true" @submit.stop.prevent>
+          <el-form-item label="查询按钮" style="width: 100%;"></el-form-item>
+          <el-form-item label="">
+            <el-row :gutter="70">
+              <el-col :xs="6" :sm="6" :md="6" :lg="6" :xl="4" v-for="(v, k) in state.selectBtn" :key="k">
+                <span style="margin-right: 10px;">{{ v.name }}</span>
+                <el-switch v-model="v.value" @change="change(k)"></el-switch>
+              </el-col>
+            </el-row>
+          </el-form-item>
+        </el-form>
+      </div>
+      <div>
+        <el-form :inline="true" @submit.stop.prevent>
+          <el-form-item label="查询条件配置" style="width: 100%;"></el-form-item>
+          <el-form-item label="">
+            <el-row :gutter="100">
+              <el-col :span="100" :xl="4" v-for="(v, k) in state.selectVal" :key="k">
+                <span style="margin-right: 10px;">{{ v.description }}</span>
+                <el-switch v-model="v.value" @change="change(k)"></el-switch>
+              </el-col>
+            </el-row>
+          </el-form-item>
+        </el-form>
+      </div>
+    </el-card>
+    <el-card class="mt8" shadow="never" :body-style="{ paddingBottom: '0' }">
+      <div>
+        <el-form :inline="true" @submit.stop.prevent>
+          <el-form-item label="列表操作栏" style="width: 100%;"></el-form-item>
+          <el-form-item label="">
+            <el-row :gutter="100">
+              <el-col :span="100" v-for="(v, k) in state.tableBtn" :key="k">
+                <span style="margin-right: 10px;">{{ v.name }}</span>
+                <el-switch v-model="v.value" @change="change(k)"></el-switch>
+              </el-col>
+            </el-row>
+          </el-form-item>
+        </el-form>
+      </div>
+      <div>
+        <el-form :inline="true" @submit.stop.prevent>
+          <el-form-item label="列表元素配置" style="width: 100%;"></el-form-item>
+          <el-form-item label="">
+            <el-row :gutter="100">
+              <el-col :span="100" v-for="(v, k) in state.tableVal" :key="k">
+                <span style="margin-right: 10px;">{{ v.description }}</span>
+                <el-switch v-model="v.value" @change="change(k)"></el-switch>
+              </el-col>
+            </el-row>
+          </el-form-item>
+        </el-form>
+      </div>
+    </el-card>
+    <div style="display: flex;justify-content: center;align-items: center;">
+      <el-button style="margin-top: 20px;width: 264px;height: 42px;" type="primary" @click="onsubmit()">生成页面</el-button>
+    </div>
+  </div>
+</template>
+
+<script lang="ts" setup name="admin/code">
+import { ref,reactive, onMounted, onBeforeMount } from 'vue'
+import eventBus from '/@/utils/mitt'
+import { ElMessage } from 'element-plus'
+
+const state = reactive({
+  loading: false,
+  orgFormTitle: '',
+  filter: {
+    name: 'http://dev.hsfuel.com:8070/app/swagger/app/swagger.json',
+    // name: 'http://192.168.0.203:8003/app/swagger/app/swagger.json',
+    api:''
+  },
+  api:[],
+  selectBtn:[{value:false,name:'查询',method:'onQuery'},
+    {value:false,name:'添加',method:'onAdd'},
+    {value:false,name:'批量删除',method:'ondelete'},
+    {value:false,name:'重置',method:'onReset'},
+    {value:false,name:'上传',method:'onUpload'},
+    {value:false,name:'导出',method:'onExport'},
+    {value:false,name:'批量导入',method:'onBatImport'},
+    {value:false,name:'批量导出',method:'onBatExport'},
+    {value:false,name:'批量审核',method:'onBatReview'}],
+  selectVal:[],
+  tableBtn:[{value:false,name:'编辑',method:'onDateUpdate'},
+    {value:false,name:'详情',method:'onDataDetail'},
+    {value:false,name:'删除',method:'onDataDelete'}],
+  tableVal:[],
+  isPage:false
+})
+const dataJson=ref('')
+onMounted(() => {
+  onQuery()
+  eventBus.off('refreshOrg')
+  eventBus.on('refreshOrg', () => {
+    onQuery()
+  })
+})
+
+onBeforeMount(() => {
+  eventBus.off('refreshOrg')
+})
+const change=(k)=>{
+  // console.log(k)
+  // console.log(state.selectVal[k].value,state.selectVal[k].description)
+}
+//解析页面接口数据
+const onQuery = async () => {
+  fetch(state.filter.name)
+    .then(response=>response.json())
+    .then(swaggerJson=>{
+      // console.log(swaggerJson)
+      dataJson.value=swaggerJson
+      const {paths} =dataJson.value
+      // console.log(paths)
+      for(const path in paths){
+        if('get' in paths[path]){
+          let api:any=path
+          let summary:any=paths[path].get.summary?paths[path].get.summary:''
+          let methods:any='GET'
+          let isQuery:any=false
+          let isBody:any=false
+          if('parameters' in paths[path].get){
+            isQuery=true
+          }
+          if('requestBody' in paths[path].get){
+            isBody=true
+          }
+          state.api.push({api:api,summary:summary,methods:methods,isQuery:isQuery,isBody:isBody})
+          //console.log(path)
+          //console.log(paths[path].get.responses['200'].content['application/json'].schema['$ref'])
+        }
+        if('post' in paths[path]){
+          let summary:any=paths[path].post.summary?paths[path].post.summary:''
+          // if(summary===''||summary.includes('查询')||summary.includes('获取')||summary.includes('管理')||summary.includes('表')||summary.includes('')){
+            let api:any=path
+            let methods:any='POST'
+            let isQuery:any=false
+            let isBody:any=false
+            if('parameters' in paths[path].post){
+              isQuery=true
+            }
+            if('requestBody' in paths[path].post){
+              isBody=true
+            }
+            state.api.push({api:api,summary:summary,methods:methods,isQuery:isQuery,isBody:isBody})
+            //console.log(paths[path].post.responses['200'].content['application/json'].schema['$ref'])
+            //console.log(paths[path].post.requestBody)
+          }
+          //console.log(path)
+          //console.log(paths[path])
+        }
+      }
+      //console.log(state.api)
+    )
+    .catch(error=>{
+      console.log('Error fetch Swagger Json :',error)
+    })
+}
+//解析查询页面查询条件及列表元素
+const onChange=(api)=>{
+  state.selectVal=[]
+  state.tableVal=[]
+  state.selectBtn=state.selectBtn.map(item=>{
+    item.value=false
+    return item
+  })
+  state.tableBtn=state.tableBtn.map(item=>{
+    item.value=false
+    return item
+  })
+  let data=dataJson.value.paths[api]
+  const tableData=dataJson.value.components.schemas
+  //console.log(data)
+  if('get' in data){
+    data=data.get
+  }else{
+    data=data.post
+    //console.log(data)
+  }
+  if('parameters' in data){
+    const parameters=data['parameters']
+    //console.log(parameters)
+    for(const val in parameters){
+      if(!parameters[val].name.includes('Page')&&!parameters[val].name.includes('DynamicFilter')){
+        let value:any=false
+        let name:any=parameters[val].name
+        let description:any=(parameters[val].description&&!parameters[val].description.includes(1)&&!(parameters[val].description===''))?parameters[val].description:parameters[val].name
+        let type:any=parameters[val].schema.type
+        let isDate:any=parameters[val].schema.format==='date-time'?true:false
+        if(parameters[val].name.includes('.')){
+          let s=parameters[val].name.split('.')
+          let p=s[1].trim()
+          name=p
+          description=(parameters[val].description&&!parameters[val].description.includes(1)&&!(parameters[val].description===''))?parameters[val].description:p
+        }
+        state.selectVal.push({value:value,name:name,description:description,type:type,isDate:isDate})
+      }
+    }
+  }
+  if('requestBody' in data){
+    const requestBody=data['requestBody']['content']['application/json'].schema['$ref']
+    let s=requestBody.split('/')
+    let p=s[3].trim()
+    let properties=tableData[p]['properties']
+    if('dynamicFilter' in properties){
+      properties=properties.filter['$ref']
+      s=properties.split('/')
+      p=s[3].trim()
+      properties=tableData[p]['properties']
+    }
+    //console.log(properties)
+    for(const val in properties){
+      let value:any=false
+      let name:any=val
+      let description:any=(properties[val].description&&!properties[val].description.includes(1)&&!(properties[val].description===''))?properties[val].description:val
+      let type:any=properties[val].type
+      let isDate:any=false
+      if(properties[val].format==='date-time'||val.includes('Time')||val.includes('Date')){
+        isDate=true
+      }
+      //console.log(value,name,description,type,isDate)
+      state.selectVal.push({value:value,name:name,description:description,type:type,isDate:isDate})
+    }
+  }
+  let form=data.responses['200'].content['application/json'].schema['$ref']
+  let f=form.split('/')
+  let r=f[3].trim()
+  let formData=tableData[r].properties.data
+  let dataName:any=r
+  let list:any=''
+  if(!('type' in formData)||formData.type==='array'){
+    if(!('type' in formData)||'$ref' in formData.items){
+      if(!('type' in formData)){
+        formData=formData['$ref']
+      }else{
+        formData=formData.items['$ref']
+      }
+      f=formData.split('/')
+      r=f[3].trim()
+      list=r
+      formData=tableData[r]['properties']
+      let isList:any=false
+      let isArray:any=true
+      if('total' in formData){
+        formData=formData.list.items['$ref']
+        f=formData.split('/')
+        r=f[3].trim()
+        formData=tableData[r]['properties']
+        isList=true
+        state.isPage=true
+      }
+      for(const val in formData){
+        let value:any=false
+        let name:any=val
+        let description:any=(formData[val].description&&!formData[val].description.includes(1)&&!(formData[val].description===''))?formData[val].description:val
+        let type:any=formData[val].type
+        //console.log(value,name,description,type)
+        state.tableVal.push({value:value,name:name,description:description,type:type,belong:r,isList:isList,isArray:isArray,dataName:dataName,list:list})
+      }
+    }else{
+      let value:any=false
+      let isList:any=false
+      let isArray:any=true
+      let name:any=r
+      let description:any=(formData.description&&!formData.description.includes(1)&&!(formData.description===''))?formData.description:r
+      let type:any=formData.type
+      //console.log(value,name,description,type)
+      state.tableVal.push({value:value,name:name,description:description,type:type,belong:r,isList:isList,isArray:isArray,dataName:dataName,list:list})
+    }
+  }else{
+    let value:any=false
+    let name:any=r
+    let isList:any=false
+    let isArray:any=false
+    let description:any=(formData.description&&!formData.description.includes(1)&&!(formData.description===''))?formData.description:r
+    let type:any=formData.type
+    //console.log(value,name,description,type)
+    state.tableVal.push({value:value,name:name,description:description,type:type,belong:r,isList:isList,isArray:isArray,dataName:dataName,list:list})
+  }
+}
+//生成查询页面主要代码文件
+const onsubmit=()=>{
+  let api=''
+  if(state.filter.api===''){
+    ElMessage.error('请选择查询页面接口来源')
+  }else{
+    api=state.api.filter(item=>item.api===state.filter.api)
+  }
+  let selBtn=state.selectBtn.filter(item=>item.value===true)
+  let selVal=state.selectVal.filter(item=>item.value===true)
+  let tabBtn=state.tableBtn.filter(item=>item.value===true)
+  let tabVal=state.tableVal.filter(item=>item.value===true)
+  //console.log(tabVal)
+  let apiCode=`import { AxiosResponse } from 'axios'
+  import { ContentType, HttpClient, RequestParams } from '/@/api/admin/http-client'
+  export class Api<SecurityDataType = unknown> extends HttpClient<SecurityDataType> {
+    /**
+   * No description
+   *
+   * @tags
+   * @name GetList
+   * @summary 查询列表
+   * @request ${api[0].methods}:'${api[0].api}'
+   * @secure
+   */\n`
+  if(api[0].methods==='GET'){
+    apiCode=apiCode+`getList = (query:any ,params: RequestParams = {}) : any  =>
+      this.request<AxiosResponse,any>({
+        path:'${api[0].api}',
+        method: 'GET',
+        query:query,`
+  }else{
+    if(api[0].isQuery===true&&api[0].isBody===true){
+      apiCode=apiCode+`getList = (data:any ,query:any ,params: RequestParams = {}) : any  =>
+      this.request<AxiosResponse,any>({
+        path:'${api[0].api}',
+        method: 'POST',
+        body:data,
+        query:query,
+        type: ContentType.Json,`
+    }else if(api[0].isQuery===false&&api[0].isBody===true){
+      apiCode=apiCode+`getList = (data:any ,params: RequestParams = {}) : any  =>
+      this.request<AxiosResponse,any>({
+        path:'${api[0].api}',
+        method: 'POST',
+        body:data,
+        type: ContentType.Json,`
+    }else{
+      apiCode=apiCode+`getList = (query:any ,params: RequestParams = {}) : any  =>
+      this.request<AxiosResponse,any>({
+        path:'${api[0].api}',
+        method: 'POST',
+        query:query,
+        type: ContentType.Json,`
+    }
+  }
+  apiCode=apiCode+`
+        secure: true,
+        format: 'json',
+        ...params
+      })
+    }`
+  //console.log(apiCode)
+  let dataCode=`/** 查询信息输出 */
+  export interface ${state.tableVal[0].dataName}{
+  /** 是否成功标记 */
+  success?: boolean
+  /** 编码 */
+  code?: string | null
+  /** 消息 */
+  msg?: string | null
+  /** 数据 */\n`
+  if(state.tableVal[0].isArray===false&&state.tableVal[0].isList===false){
+    dataCode=dataCode+`  data?:${state.tableVal[0].type} | null\n}`
+    //console.log(dataCode)
+  }else if(state.tableVal[0].isArray===true&&state.tableVal[0].isList===false){
+    if(state.tableVal[0].list===''){
+      dataCode=dataCode+` data?:${state.tableVal[0].list}[] | null\n}`
+    }else{
+      dataCode=dataCode+` data?:${state.tableVal[0].list}[] | null\n}
+      export interface ${state.tableVal[0].list}{\n`
+      for(let i=0;i<state.tableVal.length;i++){
+        dataCode=dataCode+`   /** ${state.tableVal[i].description} */
+        ${state.tableVal[i].name}?: ${state.tableVal[i].type}\n`
+      }
+      dataCode=dataCode+`\n}`
+    }
+    //console.log(dataCode)
+  }else{
+    dataCode=dataCode+` data?:${state.tableVal[0].list}[] | null\n}
+    export interface ${state.tableVal[0].list}{
+      /**
+      * 数据总数
+      * @format int64
+      */
+      total?: number
+      /** 数据 */
+      list?: ${state.tableVal[0].belong}[] | null
+    }
+    export interface ${state.tableVal[0].belong}{\n`
+    for(let i=0;i<state.tableVal.length;i++){
+      dataCode=dataCode+`   /** ${state.tableVal[i].description} */
+      ${state.tableVal[i].name}?: ${state.tableVal[i].type}\n`
+    }
+    dataCode=dataCode+`\n}`
+    //console.log(dataCode)
+  }
+  if(state.isPage===true){
+    dataCode=dataCode+`\nexport interface pageInput {
+      /**当前页数 */
+      CurrentPage: number | any
+      /**展示页数 */
+      PageSize: number | any
+    }`
+  }
+  let selection=false
+  let indexCode=`\n<template>
+  <div class="layout-pd">
+    <el-row>`
+  if(selBtn.length>0||selVal.length>0){
+    indexCode=indexCode+`\n<!--操作-->
+      <el-col :xs="24" >
+        <el-card class="mt8"  shadow="hover" >`
+    if(selVal.length>0){
+      indexCode=indexCode+`\n<el-form :model="state.filter" :inline="true" @submit.stop.prevent style="margin-bottom: -3vh;">
+            <el-form-item prop="name" style="width: 100%">`
+      for(let i=0;i<selVal.length;i++){
+        if(selVal[i].type==='interger'){
+          indexCode=indexCode+`\n<el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6" class="mb20">
+                <el-form-item label="${selVal[i].description}">
+                  <el-input-number v-model="state.filter.${selVal[i].name}" />
+                </el-form-item>
+              </el-col>`
+        }else if(selVal[i].isDate===true){
+          indexCode=indexCode+`\n<el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6" class="mb20">
+            <el-form-item label="选择时间">
+                  <el-date-picker
+                    v-model="state.filter.${selVal[i].name}"
+                    type="datetimerange"
+                    value-format="YYYY-MM-DD HH:mm:ss"
+                    range-separator="To"
+                    start-placeholder="开始日期"
+                    end-placeholder="结束日期"
+                  />
+                </el-form-item>
+              </el-col>`
+        }else{
+          indexCode=indexCode+`\n<el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6" class="mb20">
+                <el-form-item label="${selVal[i].description}">
+                  <el-input v-model="state.filter.${selVal[i].name}" placeholder="单行输入" clearable></el-input>
+                </el-form-item>
+              </el-col>`
+        }
+      }
+      indexCode=indexCode+`\n</el-form-item>
+          </el-form>
+          
+          <hr>
+
+          `
+    }
+if(selBtn.length > 0) {
+  const iconMap = [
+    { keyword: '批量导入', icon: 'ele-UploadFilled' },
+    { keyword: '审核', icon: 'ele-Tickets' },
+    { keyword: '导出', icon: 'ele-Document' },
+    { keyword: '查询', icon: 'ele-Search' },
+    { keyword: '添加', icon: 'ele-Plus' },
+    { keyword: '重置', icon: 'ele-RefreshRight' },
+    { keyword: '上传', icon: 'ele-Upload' },
+    { keyword: '删除', icon: 'ele-Delete' },
+  ];
+  
+  indexCode += `\n<el-row justify="space-between" class="submit-button" style="margin-bottom: -9px;">`;
+  
+  selBtn.forEach(btn => {
+    const match = iconMap.find(item => btn.name.includes(item.keyword));
+    const icon = match?.icon || '';
+    
+    if (match) selection = true;
+    
+    indexCode += `\n<el-button type="primary" icon="${icon}" @click="${btn.method}"> ${btn.name} </el-button>`;
+  });
+  
+  indexCode += `\n</el-row>`;
+}
+    indexCode=indexCode+`\n</el-card>
+      </el-col>`
+  }
+  if(tabVal.length>0){
+    indexCode=indexCode+`\n<!--表格-->
+      <el-col  :xs="24" >
+        <el-card style="height: 70vh" class="my-fill mt8" shadow="hover">`
+    if(selection){
+      indexCode=indexCode+`\n<el-table-column type="selection" width="50"></el-table-column>`
+    }
+    indexCode=indexCode+`\n<el-table v-loading="state.loading" stripe :data="state.tableModel" row-key="id" style="width: 100%">
+        <el-table-column v-for="column in state.dynamicColumns" :key="column.prop" :prop="column.prop" :label="column.label"  >
+        </el-table-column>`
+    if(tabBtn.length>0){
+      indexCode=indexCode+` \n<el-table-column label="操作"  fixed="right" header-align="center" align="center" class="right-operation" width="140">
+        <template #default="{ row }" >`
+      for(let i=0;i<tabBtn.length;i++){
+        indexCode=indexCode+`\n<el-link
+                  class="my-el-link mr12 ml12"
+                  type="primary"
+                  icon="ele-Delete"
+                  @click="${tabBtn[i].method}(row)"
+                  :underline="false"
+                  target="_blank"
+                >${tabBtn[i].name}</el-link>`
+      }
+      indexCode=indexCode+`\n</template>
+            </el-table-column>`
+    }
+    indexCode=indexCode+`\n</el-table>`
+    if(state.isPage){
+      indexCode=indexCode+`\n<div class="my-flex my-flex-end" style="margin-top: 20px">
+            <el-pagination
+              v-model:currentPage="pageState.pageInput.currentPage"
+              v-model:page-size="pageState.pageInput.pageSize"
+              :total="state.total"
+              :page-sizes="[10, 15, 20, 50, 100]"
+              small
+              background
+              @size-change="onSizeChange"
+              @current-change="onCurrentChange"
+              layout="total, sizes, prev, pager, next, jumper"
+            />
+          </div>`
+    }
+    indexCode=indexCode+`\n</el-card>
+      </el-col>`
+  }
+  indexCode=indexCode+`\n</el-row>
+    </div>
+  </template>
+  <script setup lang="ts">
+  import {onBeforeMount, onMounted, reactive, ref, watch} from "vue";
+  import eventBus from "/@/utils/mitt";
+  import {Api} from "/@/api/code/api";
+  import { useDynamicPageSize } from "/@/composables/useDynamicPageSize";
+
+  // 使用组合式函数获取分页状态
+const pageState = useDynamicPageSize(10, 15);`
+
+  if(state.isPage&&tabVal.length>0){
+    indexCode=indexCode+`\nimport { pageInput,${tabVal[0].belong} } from "/@/api/code/dto";`
+  }else if(tabVal.length>0){
+    indexCode=indexCode+`\nimport { ${tabVal[0].belong} } from "/@/api/code/dto";`
+  }
+  indexCode=indexCode+`\n/**数据对象*/
+  const state = reactive({
+    /**加载显示 */
+    loading: false,
+    /**条件查询模块 */
+      filter: {`
+    if(selVal.length>0){
+      for(let i=0;i<selVal.length;i++){
+        indexCode=indexCode+`\n/**${selVal[i].description} */
+        ${selVal[i].name}: "",`
+      }
+    }
+  indexCode=indexCode+`},
+  /**表格信息 */`
+  if(tabVal.length>0){
+    indexCode=indexCode+`\ntableModel: [] as ${tabVal[0].belong},
+    /**动态表头 */
+    dynamicColumns: [`
+    for(let i=0;i<tabVal.length;i++){
+      indexCode=indexCode+`\n{ prop: '${tabVal[i].name}', label: '${tabVal[i].description}' },`
+    }
+    indexCode =indexCode+`],`
+  }else{
+    indexCode=indexCode+`\ntableModel: [],
+    /**动态表头 */
+    dynamicColumns: [],`
+  }
+  if(state.isPage){
+    indexCode=indexCode+`\n/**分页标识 */
+    pageInput:{
+      CurrentPage: 1,
+      PageSize: 10,
+    } as pageInput,
+    /**分页总数 */
+    total: 0,`
+  }
+  indexCode=indexCode+`\n})
+  onMounted(() => {
+    // 初始化分页大小
+  Data.pageInput.pageSize = pageState.pageInput.pageSize; 
+    init()
+    eventBus.off('refreshView')
+    eventBus.on('refreshView', async () => {
+      await init()
+    })
+    console.log()
+  })
+  onBeforeMount(() => {
+    eventBus.off('refreshView')
+  })
+  /**
+  * 监听变换
+  */
+  watch(() => {})`
+  let isSel=false
+  if(selBtn.length>0){
+    for(let i=0;i<selBtn.length;i++){
+      if(selBtn[i].name==='查询'){
+        isSel=true
+        indexCode=indexCode+`\n/**条件查询 */
+          const onQuery = () => {
+          init()
+        }
+        /**初始化 */
+        const init = async () => {
+          state.loading = true`
+          if(state.isPage){
+            indexCode=indexCode+`\nconst res:any = await new Api().getList({...state.pageInput, Filter:state.filter})
+            state.total = res?.data?.total ?? 0`
+          }else{
+            indexCode=indexCode+`\nconst res:any = await new Api().getList({...state.filter})`
+          }
+          indexCode=indexCode+`\nstate.tableModel = res?.data?.list ?? []
+          state.loading = false
+        }`
+      }else{
+        indexCode=indexCode+`\n/**${selBtn[i].name} */
+        const ${selBtn[i].method}=()=>{}`
+      }
+    }
+  }
+  if(!isSel){
+    indexCode=indexCode+`\n/**初始化 */
+      const init = async () => {
+        state.loading = true
+        state.loading = false
+      }`
+  }
+  if(tabBtn.length>0){
+    for(let i=0;i<tabBtn.length;i++){
+      indexCode=indexCode+`\n/**${tabBtn[i].name} */
+      const ${tabBtn[i].method}=(row)=>{}`
+    }
+  }
+  indexCode=indexCode+`\n
+  /**
+* 页条变化
+* @param val
+*/
+const onSizeChange = (val: number) => {
+  Data.pageInput.pageSize = val
+  //需按照页面对象修改Data
+  init()
+}
+
+/**
+ * 页数 变化
+ * @param val
+ */
+const onCurrentChange = (val: number) => {
+  Data.pageInput.currentPage = val
+  //需按照页面对象修改Data
+  init()
+}
+  </`+`script>`+`\n<style scoped lang="scss">
+  .el-input,
+.el-select {
+  width: 240px;
+}
+
+/* 输入框标签固定四个字符宽度 */
+::v-deep .el-form-item__label {
+  // 字体大小14,4个字符,12px右间距
+  width: 14*4px+12px;
+  justify-content: start;
+}
+
+/* 数据表头 设置灰色样式 */
+::v-deep .el-table th.el-table__cell {
+  background-color: #F6F6F6;
+}
+  </style>`
+  //console.log(indexCode)
+  getCodeFile('api.ts',apiCode)
+  getCodeFile('dto.ts',dataCode)
+  getCodeFile('index.vue',indexCode)
+}
+const getCodeFile=(fileName,code) =>{
+  const blob = new Blob([code], { type: 'text/plain' });
+  const url = URL.createObjectURL(blob);
+  // 创建一个a标签并设置href为新文件的URL
+  const downloadLink = document.createElement('a');
+  downloadLink.href = url;
+  downloadLink.download = fileName; // 设置下载文件名
+  // 触发下载
+  document.body.appendChild(downloadLink);
+  downloadLink.click();
+  // 清理
+  document.body.removeChild(downloadLink);
+  URL.revokeObjectURL(url);
+}
+</script>
+
+<style scoped lang="scss">
+.layout {
+  position: absolute;
+  left: 0;
+  top: 0;
+  overflow: hidden;
+  padding: 0px 8px 8px 8px;
+  display: flex;
+  flex-direction: column;
+}
+</style>

+ 55 - 0
admin.ui.plus-master/src/api/admin/AlarmService/alarmLevel.ts

@@ -0,0 +1,55 @@
+import { AxiosResponse } from 'axios'
+  import { ContentType, HttpClient, RequestParams } from '/@/api/admin/http-client'
+  export class Api<SecurityDataType = unknown> extends HttpClient<SecurityDataType> {
+updateAlarmLevel(formData: { alarmLevelName?: string | undefined; level?: integer; conditionsJson?: string | undefined; isActive?: boolean | undefined; activationTime?: string | undefined; deactivationTime?: string | undefined; remark?: string | undefined }): any {
+  throw new Error("Method not implemented.")
+}
+    /**
+   * No description
+   *
+   * @tags
+   * @name GetList
+   * @summary 查询列表
+   * @request POST:'/api/app/push/get-alarm-level-list'
+   * @secure
+   */
+getList = (data:any ,params: RequestParams = {}) : any  =>
+      this.request<AxiosResponse,any>({
+        path:'/api/app/push/get-alarm-level-list',
+        method: 'POST',
+        body:data,
+        type: ContentType.Json,
+        secure: true,
+        format: 'json',
+        ...params
+      })
+
+// 新增/修改报警等级
+
+addAlarmLevel = (data:any ,params: RequestParams = {}) : any  =>
+      this.request<AxiosResponse,any>({
+        path:'/api/app/push/upload-alarm-level',   
+        method: 'POST',
+        body:data,
+        type: ContentType.Json,
+        secure: true,
+        format: 'json',
+        ...params
+      })
+
+// 删除报警等级
+
+deleteAlarmLevel = (data:any ,params: RequestParams = {}) : any  =>
+      this.request<AxiosResponse,any>({
+        path:'/api/app/push/delete-alarm-level',   
+        method: 'POST',
+        body:data,
+        type: ContentType.Json,
+        secure: true,
+        format: 'json',
+        ...params
+      })
+
+
+    }
+

+ 54 - 0
admin.ui.plus-master/src/api/admin/AlarmService/alarmLevelDto.ts

@@ -0,0 +1,54 @@
+/** 查询信息输出 */
+  export interface ResultOutputPageOutputAlarmLevelDto{
+  /** 是否成功标记 */
+  success?: boolean
+  /** 编码 */
+  code?: string | null
+  /** 消息 */
+  msg?: string | null
+  /** 数据 */
+ data?:PageOutputAlarmLevelDto[] | null
+}
+    export interface PageOutputAlarmLevelDto{
+      /**
+      * 数据总数
+      * @format int64
+      */
+      total?: number
+      /** 数据 */
+      list?: AlarmLevelDto[] | null
+    }
+    export interface AlarmLevelDto{
+      id?:integer
+   /** 报警等级名称 */
+      alarmLevelName?: string
+   /** 报警等级 */
+      level?: integer
+   /** 规则条件 */
+      conditionsJson?: string
+   /** 是否启用 */
+      isActive?: boolean
+   /** 启用时间 */
+      activationTime?: string
+   /** 停用时间 */
+      deactivationTime?: string
+   /** 备注 */
+      remark?: string
+      alarmLevel?:string | null
+}
+export interface pageInput {
+      /**当前页数 */
+      CurrentPage: number | any
+      /**展示页数 */
+      PageSize: number | any
+    }
+
+// 定义字典项类型
+export interface DictItem {
+  id: number;
+  name: string;
+  code: string;
+  value: string;
+  enabled: boolean;
+  sort: number;
+}

+ 1 - 0
admin.ui.plus-master/src/api/admin/AlarmService/alarmRulesDto.ts

@@ -38,6 +38,7 @@ export interface alarmRluesFilterModel {
   condition?:string | null;
   condition2?:string | null;
   cacheFilter?: Partial<alarmRluesFilterModel>;
+  keyWord?:string | null; 
 }
 
 /**

+ 30 - 3
admin.ui.plus-master/src/api/admin/productionManagement/slelist.ts

@@ -1,6 +1,7 @@
 import { AxiosResponse } from 'axios'
   import { ContentType, HttpClient, RequestParams } from '/@/api/admin/http-client'
-import { ProjectGetPageDto } from './slelistDto'
+import { HistoricalVersionRecordDto, ProjectGetPageDto } from './slelistDto'
+import { log } from 'console'
   export class Api<SecurityDataType = unknown> extends HttpClient<SecurityDataType> {
     /**
    * No description
@@ -48,6 +49,32 @@ getList = (data:any ,params: RequestParams = {}) : any  =>
       ...params
     })
   }
-  
-    }
 
+
+  /**
+   * 查询软件历史版本记录
+   *
+   * @tags 软件管理
+   * @name GetHistoricalVersionRecord
+   * @summary 通过ID查询历史版本
+   * @request POST:/api/app/software/get-historical-version-record
+   * @param id 软件包ID(可选参数)
+   * @secure
+   */
+  getHistory = (id: number | null, params: RequestParams = {}) : Promise<AxiosResponse<HistoricalVersionRecordDto>> => {
+    const requestData = id !== null ? { id } : {};
+    
+    return this.request({
+      path: '/api/app/software/get-historical-version-record',
+      method: 'POST',
+      query:requestData,
+      secure: true,
+      format: 'json',
+      ...params
+    });
+    
+  }
+}
+
+
+    

+ 40 - 1
admin.ui.plus-master/src/api/admin/productionManagement/slelistDto.ts

@@ -24,6 +24,7 @@ export interface ResultOutputPageOutputProjectGetPageDto{
       projectCode?: string
       projectDescription?: string
       projectLaunchDate?: string
+      isUpdate?:boolean
  
  }
  export interface pageInput {
@@ -31,4 +32,42 @@ export interface ResultOutputPageOutputProjectGetPageDto{
        CurrentPage: number | any
        /**展示页数 */
        PageSize: number | any
-     }
+     }
+
+// src/api/admin/deviceAuthorization/dto/HistoricalVersionRecordDto.ts
+export interface HistoricalVersionRecordDto {
+  guid:number;//项目guid
+  projectName: string; // 项目名称
+  projectCode: string; // 项目编码
+  projectDescription: string; // 项目介绍
+  projectLaunchDate: string; // 项目上线时间
+  createdTime: string; // 项目上线时间
+  equipmentType: string; // 设备类型
+  softwareType: string; // 软件类型
+  softwareName: string; // 软件名称
+  version: string; // 软件版本
+  explain: string; // 软件说明用途
+  remark: string; // 备注
+  downNum: number; // 下载次数
+  numberOfDownloads: number;
+  downloadUrl: string; // 文件地址
+  fileName: string; // 文件名称
+  state: number; // 状态:0待发布,1发布,2失效
+  operatorTime: string; // 操作时间
+  pubDate: string; // 发布时间
+  softVersions: SoftVersion[]; // 软件版本数组
+}
+
+// 软件版本子DTO
+export interface SoftVersion {
+  version: string; // 软件版本
+  explain: string; // 软件说明用途
+}
+
+// 接口响应通用DTO
+export interface ResultOutputHistoricalVersionRecordDto {
+  success: boolean;
+  code: string;
+  msg: string;
+  data: HistoricalVersionRecordDto;
+}

+ 1 - 1
admin.ui.plus-master/src/api/admin/reportManagement/listOfOilEngines/listOfOilEnginesApi.ts

@@ -123,7 +123,7 @@ export class ListOfOilEnginesApi <SecurityDataType = unknown> extends HttpClient
     };
 
     // const fileUrl = import.meta.env.VITE_API_URL + '/api/app/fuel-dispenser/export-excel';
-    const fileUrl = "http://192.168.0.202:8003" + '/api/app/fuel-dispenser/export-excel';
+    const fileUrl = "http://dev.hsfuel.com:8070" + '/api/app/fuel-dispenser/export-excel';
 
     fetch(fileUrl, requestOptions)
       .then(response => response.blob())

+ 325 - 0
admin.ui.plus-master/src/views/admin/authorize/softwarePackageManagement/components/search-history.vue

@@ -0,0 +1,325 @@
+<template>
+  <div class="admin-authorize-edit-info">
+    <el-dialog :title="formData.titleText" v-model="formData.isShowDialog" draggable width="769px" @open="handleDialogOpen">
+      <el-form :model="formData.editData" :rules="rules" ref="formRef" v-loading="formData.loading" size="default" label-width="120px">
+        <el-row :gutter="35">
+          <!-- 项目基本信息 -->
+          <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
+            <el-form-item label="项目名称:" prop="projectName">
+              <span>{{formData.editData.projectName || '暂无数据'}}</span>
+            </el-form-item>
+          </el-col>
+          <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
+            <el-form-item label="项目编码:" prop="projectCode">
+              <span>{{formData.editData.projectCode || '暂无数据'}}</span>
+            </el-form-item>
+          </el-col>
+          <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
+            <el-form-item label="项目介绍:" prop="projectDescription">
+              <span>{{formData.editData.projectDescription || '暂无数据'}}</span>
+            </el-form-item>
+          </el-col>
+          <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
+            <el-form-item label="项目版本:" prop="version">
+              <span>{{formData.editData.version || '暂无数据'}}</span>
+            </el-form-item>
+          </el-col>
+          <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
+            <el-form-item label="项目上线时间:" prop="projectLaunchDate">
+              <span>{{formData.editData.createdTime || '暂无数据'}}</span>
+            </el-form-item>
+          </el-col>
+          
+          <!-- 软件相关信息 -->
+          <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
+            <el-form-item label="设备类型:" prop="equipmentType">
+              <span>{{formData.editData.equipmentType || '暂无数据'}}</span>
+            </el-form-item>
+          </el-col>
+          <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
+            <el-form-item label="软件类型:" prop="softwareType">
+              <span>{{formData.editData.softwareType || '暂无数据'}}</span>
+            </el-form-item>
+          </el-col>
+          <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
+            <el-form-item label="软件包名称:" prop="softwareName">
+              <span>{{formData.editData.softwareName || '暂无数据'}}</span>
+            </el-form-item>
+          </el-col>
+          <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
+            <el-form-item label="软件说明:" prop="explain">
+              <span>{{formData.editData.explain || '暂无数据'}}</span>
+            </el-form-item>
+          </el-col>
+          
+          <!-- 统计信息 -->
+          <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
+            <el-form-item label="下载次数:" prop="downNum">
+              <span>{{formData.editData.numberOfDownloads || 0}}</span>
+            </el-form-item>
+          </el-col>
+          <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
+            <el-form-item label="状态:" prop="state">
+              <span>{{getStateText(formData.editData.state) || '暂无数据'}}</span>
+            </el-form-item>
+          </el-col>
+          <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
+            <el-form-item label="发布时间:" prop="pubDate">
+              <span>{{formatDate(formData.editData.pubDate) || '暂无数据'}}</span>
+            </el-form-item>
+          </el-col>
+          
+          <!-- 历史版本时间线 -->
+          <el-col :xs="24" class="mb20">
+            <el-form-item label="历史版本记录:">
+              <div v-if="formData.loading">
+                <el-skeleton :rows="5" animated></el-skeleton>
+              </div>
+              <div v-else-if="formData.editData.softVersions.length === 0">
+                <el-empty description="暂无历史版本记录" />
+              </div>
+              <el-timeline v-else style="max-width: 100%; margin-left: 0;">
+                <el-timeline-item
+                  v-for="(version, index) in formData.editData.softVersions"
+                  :key="index"
+                >
+                    <el-card>
+                      <h4> {{version.version}}</h4>
+                    <p>{{version.explain || '无更新说明'}}</p>
+                  </el-card>
+                </el-timeline-item>
+              </el-timeline>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+      <template #footer>
+        <span class="dialog-footer">
+          <el-button @click="onCancel" icon="el-icon-close" size="default">取消</el-button>
+          <el-button type="primary" :icon="formData.editIcon" @click="handleSubmit" size="default">
+            {{formData.buttonText}}
+          </el-button>
+        </span>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script setup lang="ts">
+import { defineAsyncComponent, onMounted, reactive, ref, watch } from "vue";
+import { ElMessage, ElSkeleton, ElEmpty } from "element-plus";
+import { FormRules } from "element-plus";
+import eventBus from "/@/utils/mitt";
+import { HistoricalVersionRecordDto } from "/@/api/admin/productionManagement/slelistDto";
+import { Api } from "/@/api/admin/productionManagement/slelist";
+
+const MyUploadFile = defineAsyncComponent(() => import('/@/components/my-upload-file/index.vue'));
+
+/** 表单操作类型 */
+enum FormAction {
+  VIEW = '查看',
+  UPDATE = '更新',
+  ADD = '添加'
+}
+
+/**数据对象 */
+const formData = reactive({
+  loading: false,
+  action: FormAction.VIEW,
+  titleText: '查看历史版本',
+  editIcon: 'el-icon-history',
+  buttonText: '关闭',
+  isShowDialog: false,
+  softwarePackageId: null, // 软件包ID(数值类型)
+  editData: {
+    guid: 0, // 接口返回的ID(数值类型)
+    projectName: '',
+    projectCode: '',
+    projectDescription: '',
+    projectLaunchDate: '',
+    equipmentType: '',
+    softwareType: '',
+    softwareName: '',
+    version: '',
+    explain: '',
+    remark: '',
+    downNum: 0,
+    downloadUrl: '',
+    fileName: '',
+    state: 0,
+    operatorTime: '',
+    pubDate: '',
+    softVersions: []
+  } as HistoricalVersionRecordDto,
+  fileValue: null
+});
+
+/**有效版本号选择校验*/
+const validateVersion = (rule: any, value: any, callback: any) => {
+  const versionPattern: RegExp = /^\d+\.\d+\.\d+$/;
+  if (!versionPattern.test(value)) {
+    callback(new Error('输入的版本号格式错误,应为X.X.X格式'));
+  } else {
+    callback();
+  }
+};
+
+/**表单校验规则*/
+const rules = reactive<FormRules>({
+  softwareType: [{ required: true, message: '请选择软件类型', trigger: 'blur' }],
+  equipmentType: [{ required: true, message: '请选择设备类型', trigger: 'blur' }],
+  softwareName: [{ required: true, message: '请输入软件包名', trigger: 'blur' }],
+  version: [
+    { required: true, message: '请输入版本号', trigger: 'blur' },
+    { validator: validateVersion, trigger: 'blur' }
+  ]
+});
+
+/** 表单引用 */
+const formRef = ref();
+
+/** 打开对话框并加载数据 */
+const openDialog = (softwareId: number, action: FormAction = FormAction.VIEW) => {
+  formData.action = action;
+  formData.editData.guid = softwareId;
+  
+  // 根据操作类型设置界面显示
+  if (action === FormAction.VIEW) {
+    formData.titleText = '查看历史版本';
+    formData.buttonText = '关闭';
+    formData.editIcon = 'el-icon-close';
+  } else if (action === FormAction.UPDATE) {
+    formData.titleText = '更新软件包';
+    formData.buttonText = '更新';
+    formData.editIcon = 'el-icon-refresh-right';
+  } else {
+    formData.titleText = '添加软件包';
+    formData.buttonText = '添加';
+    formData.editIcon = 'el-icon-plus';
+  }
+  
+  formData.isShowDialog = true;
+  fetchHistoricalVersion(); // 立即加载数据
+};
+
+/** 对话框打开时触发 */
+const handleDialogOpen = () => {
+  if (formData.softwarePackageId && formData.action === FormAction.VIEW) {
+    fetchHistoricalVersion();
+  }
+};
+
+/** 取消操作 */
+const onCancel = () => {
+  formData.editData = {
+    guid: 0,
+    projectName: '',
+    projectCode: '',
+    projectDescription: '',
+    projectLaunchDate: '',
+    equipmentType: '',
+    softwareType: '',
+    softwareName: '',
+    version: '',
+    explain: '',
+    remark: '',
+    downNum: 0,
+    downloadUrl: '',
+    fileName: '',
+    state: 0,
+    operatorTime: '',
+    pubDate: '',
+    softVersions: []
+  } as HistoricalVersionRecordDto;
+  formData.isShowDialog = false;
+};
+
+/***监听软件包ID变化,重新加载数据 */
+watch(() => formData.softwarePackageId, (newId) => {
+  if (newId && formData.action === FormAction.VIEW) {
+    fetchHistoricalVersion();
+  }
+});
+
+/** 文件上传处理 */
+const onUpload = (val) => {
+  formData.editData.downloadUrl = val.fileUrl;
+  formData.editData.fileName = val.fileName;
+};
+
+/** 获取历史版本数据 */
+const fetchHistoricalVersion = async () => {
+  if (formData.editData.guid === null || formData.editData.guid === undefined) {
+    ElMessage.warning('未获取到软件包ID');
+    return;
+  }
+
+  formData.loading = true;
+  try {
+    const api = new Api();
+    // 传递formData.softwarePackageId作为ID参数
+    console.log(formData.editData.guid)
+    const res = await api.getHistory(formData.editData.guid);
+    
+    if (res.success) {
+      formData.editData = res.data;
+    } else {
+      ElMessage.error(res.msg || '获取历史版本失败');
+    }
+  } catch (error: any) {
+    console.error('获取历史版本数据失败', error);
+    ElMessage.error(error.message || '获取历史版本失败');
+  } finally {
+    formData.loading = false;
+  }
+};
+
+/** 状态码转文本 */
+const getStateText = (state: number): string => {
+  const stateMap = {
+    0: '待发布',
+    1: '已发布',
+    2: '已失效'
+  };
+  return stateMap[state] || '未知状态';
+};
+
+/** 日期格式化 */
+const formatDate = (dateStr: string): string => {
+  if (!dateStr) return '-';
+  try {
+    const date = new Date(dateStr);
+    return date.toLocaleString();
+  } catch (error) {
+    return dateStr;
+  }
+};
+
+/** 提交处理 */
+const handleSubmit = () => {
+  if (formData.action === FormAction.UPDATE || formData.action === FormAction.ADD) {
+    formRef.value?.validate((valid: boolean) => {
+      if (valid) {
+        ElMessage.success(`${formData.buttonText}成功`);
+        formData.isShowDialog = false;
+      }
+    });
+  } else {
+    formData.isShowDialog = false;
+  }
+};
+
+defineExpose({
+  openDialog,
+  fetchHistoricalVersion
+});
+</script>
+
+<style scoped lang="scss">
+:deep(.el-form-item__label) {
+  width: 120px !important;
+  text-align: right;
+  justify-content: flex-end;
+  padding-right: 12px;
+}
+</style>

+ 16 - 6
admin.ui.plus-master/src/views/admin/authorize/softwarePackageManagement/index.vue

@@ -59,10 +59,7 @@
           </el-form>
 
           <hr>
-<div v-if="softwareData.Filter.projectCode">
-  当前筛选项编码: {{ softwareData.Filter.projectCode }}
-  当前筛选项名称: {{ softwareData.Filter.projectName }}
-</div>
+
           <!-- 按钮  -->
           <el-row justify="space-between" class="submit-button">
             <el-row>
@@ -70,7 +67,7 @@
               <el-button type="primary" icon="ele-RefreshRight" @click="onReset"> 重置 </el-button>
             </el-row>
             <el-row>
-              <el-button type="primary" icon="ele-CirclePlus" @click="onAdd"> 上传软件包 </el-button>
+              <el-button type="primary" icon="ele-Plus" @click="onAdd"> 上传软件包 </el-button>
             </el-row>
           </el-row>
         </el-card>
@@ -98,7 +95,7 @@
               </template>
             </el-table-column>
             <el-table-column label="操作" fixed="right" header-align="center" align="center" class="right-operation"
-              width="140">
+              width="160">
 
               <template #default="{ row }">
                 <el-link class="my-el-link mr12 ml12" v-if="row.state === 0" type="primary" icon="ele-Upload"
@@ -111,6 +108,8 @@
                   @click="onFailure(row)" :underline="false" target="_blank">失效</el-link>
                 <el-link class="my-el-link mr12 ml12" v-if="row.state !== 0" type="primary" icon="ele-Tickets"
                   @click="onDownloadRecord(row.guid)" :underline="false" target="_blank">下载记录</el-link>
+                <el-link class="my-el-link mr12 ml12"  type="primary" icon="ele-Search"
+                  @click="searchHistory(row)" :underline="false" target="_blank">查看历史版本</el-link>
               </template>
             </el-table-column>
           </el-table>
@@ -127,6 +126,7 @@
       </el-col>
     </el-row>
     <EditDialog ref="editDialogRef" />
+    <SearchHistory ref="SearchHistoryRef" />
     <DownloadDialog ref="downloadDialogRef" />
   </div>
 </template>
@@ -155,10 +155,15 @@ const pageState = useDynamicPageSize(10, 15);
 
 /**引入组件*/
 const EditDialog = defineAsyncComponent(() => import('./components/form-edit.vue'))
+const SearchHistory = defineAsyncComponent(() => import('./components/search-history.vue'))
+
 const DownloadDialog = defineAsyncComponent(() => import('./components/table-download.vue'))
 // import {pageInput} from "/@/api/admin/shareDto/shareDto";
 const editDialogRef = ref()
 const downloadDialogRef = ref()
+const SearchHistoryRef = ref()
+
+
 
 
 /**获取全局缓存*/
@@ -331,6 +336,11 @@ const editTableData = (row) => {
   editDialogRef.value.openDialog(row)
 }
 
+/**历史版本弹窗 */
+const searchHistory = (row) => {
+  SearchHistoryRef.value.openDialog(row.guid)
+}
+
 /**发布*/
 const onRelease = (row) => {
   //downloadUrl

+ 1 - 1
admin.ui.plus-master/src/views/admin/dict/dict-type.vue

@@ -60,8 +60,8 @@
 <script lang="ts" setup name="'admin/dictType'">
 import { ref, reactive, onMounted, getCurrentInstance, onBeforeMount, nextTick, defineAsyncComponent } from 'vue'
 import { DictTypeGetPageOutput, PageInputDictTypeGetPageDto } from '/@/api/admin/data-contracts'
-import { DictTypeApi } from '/@/api/admin/DictType'
 import eventBus from '/@/utils/mitt'
+import { DictTypeApi } from '/@/api/admin/DictType'
 
 // 引入组件
 const DictTypeForm = defineAsyncComponent(() => import('./components/dict-type-form.vue'))

+ 0 - 1
admin.ui.plus-master/src/views/admin/statement/alarmManagement/index.vue

@@ -90,7 +90,6 @@
                     {{ row.alarmDescription }}
                   </span>
                 </el-tooltip>
-
               </template>
               <template v-else-if="column.prop === 'gasStation'">      
                 <el-tooltip placement="top" effect="light" :content="row.gasStation">

+ 469 - 0
admin.ui.plus-master/src/views/admin/yujing/alarmRules/Level.vue

@@ -0,0 +1,469 @@
+
+<template>
+  <div class="layout-pd">
+    <el-row>
+<!--操作-->
+      <el-col :xs="24" >
+        <el-card class="mt8"  shadow="hover" >
+<el-form :model="state.filter" :inline="true" @submit.stop.prevent style="margin-bottom: -3vh;">
+            <el-form-item prop="name" style="width: 100%">
+<el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6" class="mb20">
+                <el-form-item label="报警名称">
+                  <el-input v-model="state.filter.alarmLevelName" placeholder="请输入报警名称" clearable></el-input>
+                </el-form-item>
+              </el-col>
+<!-- <el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6" class="mb20">
+                <el-form-item label="规则条件">
+                  <el-input v-model="state.filter.conditionsJson" placeholder="请输入规则条件" clearable></el-input>
+                </el-form-item>
+              </el-col> -->
+              <el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6" class="mb20">
+                <el-form-item label="是否启用">
+                  <el-select v-model="state.filter.isActive" placeholder="请选择启用状态" clearable>
+                    <el-option label="启用" :value="true"></el-option>
+                    <el-option label="停用" :value="false"></el-option>
+                  </el-select>
+                </el-form-item>
+              </el-col>
+                <el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6" class="mb20">
+                <el-form-item label="报警等级">
+<!-- 在报警等级下拉框组件中 -->
+<el-select 
+  v-model="state.filter.level" 
+  placeholder="请选择报警等级" 
+  clearable>
+  <el-option 
+    v-for="item in state.alarmLevelDict" 
+    :key="item.id" 
+    :label="`${item.name}(${item.value})`" 
+    :value="item.value"
+  >
+</el-option>
+</el-select>
+                </el-form-item>
+              </el-col>
+
+</el-form-item>
+          </el-form>
+
+          <hr>
+
+          <el-row class="submit-button">
+<el-button  type="primary" icon="ele-Search" @click="onQuery"> 查询 </el-button>
+<el-button  type="primary" icon="ele-Plus" @click="openDialog(undefined)"> 添加 </el-button>
+            </el-row>
+</el-card>
+      </el-col>
+<!--表格-->
+      <el-col  :xs="24" >
+        <el-card style="height: 70vh" class="my-fill mt8" shadow="hover">
+<el-table v-loading="state.loading" stripe :data="state.tableModel" row-key="id" style="width: 100%">
+        <el-table-column v-for="column in state.dynamicColumns" :key="column.prop" :prop="column.prop" :label="column.label"  >
+        </el-table-column> 
+<el-table-column label="操作"  fixed="right" header-align="center" align="center" class="right-operation" width="140">
+        <template #default="{ row }" >
+<el-link
+                  class="my-el-link mr12 ml12"
+                  type="primary"
+                  icon="ele-EditPen"
+                  @click="onDateUpdate(row)"
+                  :underline="false"
+                  target="_blank"
+                >编辑</el-link>
+                <el-link
+                  class="my-el-link mr12 ml12"
+                  type="danger"
+                  icon="ele-Delete"
+                  @click="() => handleDelete(row.id)"
+                  :underline="false"
+                  target="_blank"
+                >删除</el-link>
+</template>
+            </el-table-column>
+</el-table>
+<div class="my-flex my-flex-end" style="margin-top: 20px">
+            <el-pagination
+              v-model:currentPage="state.pageInput.CurrentPage"
+              v-model:page-size="state.pageInput.PageSize"
+              :total="state.total"
+              :page-sizes="[10, 15, 20, 50, 100]"
+              small
+              background
+              @size-change="onSizeChange"
+              @current-change="onCurrentChange"
+              layout="total, sizes, prev, pager, next, jumper"
+            />
+          </div>
+</el-card>
+      </el-col>
+</el-row>
+
+ <!-- 报警等级添加/修改弹窗 -->
+    <el-dialog
+      v-model="dialogVisible"
+      :title="isEdit ? '修改报警等级' : '添加报警等级'"
+      width="500px"
+      :before-close="handleDialogClose"
+    >
+      <el-form
+        ref="formRef"
+        :model="formData"
+        :rules="rules"
+        label-width="100px"
+      >
+        <el-form-item label="报警等级名称" prop="alarmLevelName">
+          <el-input v-model="formData.alarmLevelName" placeholder="请输入报警等级名称"></el-input>
+        </el-form-item>
+<!-- 弹窗中的报警等级下拉框 -->
+<el-form-item label="报警等级" prop="level">
+  <el-select v-model="formData.level" placeholder="请选择报警等级" clearable>
+    <el-option 
+      v-for="item in state.alarmLevelDict" 
+      :key="item.id" 
+      :label="item.name" 
+      :value="item.value"
+    ></el-option>
+  </el-select>
+</el-form-item>
+        <el-form-item label="规则条件" prop="conditionsJson">
+          <el-input v-model="formData.conditionsJson" type="textarea" :rows="4" placeholder="请输入规则条件"></el-input>
+        </el-form-item>
+        <el-form-item label="是否启用" prop="isActive">
+          <el-select v-model="formData.isActive" placeholder="请选择启用状态">
+            <el-option label="启用" :value="true"></el-option>
+            <el-option label="停用" :value="false"></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="启用时间" prop="activationTime">
+          <el-date-picker
+            v-model="formData.activationTime"
+            type="datetime"
+            placeholder="请选择启用时间"
+            format="YYYY-MM-DD HH:mm:ss"
+            value-format="YYYY-MM-DD HH:mm:ss"
+          ></el-date-picker>
+        </el-form-item>
+        <el-form-item label="停用时间" prop="deactivationTime">
+          <el-date-picker
+            v-model="formData.deactivationTime"
+            type="datetime"
+            placeholder="请选择停用时间"
+            format="YYYY-MM-DD HH:mm:ss"
+            value-format="YYYY-MM-DD HH:mm:ss"
+          ></el-date-picker>
+        </el-form-item>
+        <el-form-item label="备注" prop="remark">
+          <el-input v-model="formData.remark" type="textarea" :rows="3" placeholder="请输入备注信息"></el-input>
+        </el-form-item>
+      </el-form>
+      <template #footer>
+        <span class="dialog-footer">
+          <el-button @click="handleDialogClose">取消</el-button>
+          <el-button type="primary" @click="handleSubmit">确定</el-button>
+        </span>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+  <script setup lang="ts">
+  import {onBeforeMount, onMounted, reactive, ref, watch} from "vue";
+  import eventBus from "/@/utils/mitt";
+  import {Api} from "/@/api/admin/AlarmService/alarmLevel";
+import { AlarmLevelDto } from "/@/api/admin/AlarmService/alarmLevelDto";
+import type { pageInput, ResultOutputPageOutputAlarmLevelDto } from "/@/api/admin/AlarmService/alarmLevelDto";
+import { DictApi } from "/@/api/admin/Dict";
+
+
+import { useDynamicPageSize } from "/@/composables/useDynamicPageSize";
+import { ElMessage } from "element-plus";
+import { PageInputDictGetPageDto, ResultOutputPageOutputDictGetPageOutput } from "/@/api/admin/data-contracts";
+
+interface DictItem {
+  id: number;
+  name: string;
+  code: string;
+  value: string;
+  enabled: boolean;
+  sort: number;
+}
+
+// 使用组合式函数获取分页状态
+const pageState = useDynamicPageSize(10, 15);
+
+const formRef = ref<{ validate: (callback: (isValid: boolean) => void) => void } | null>(null);
+// 弹窗状态
+const dialogVisible = ref(false);
+const isEdit = ref(false); // 是否为编辑模式
+const currentRowId = ref<number | undefined>(undefined); // 当前操作的记录ID
+
+/**数据对象*/
+  const state = reactive({
+    /**加载显示 */
+    loading: false,
+    /**条件查询模块 */
+      filter: {
+/**报警等级名称 */
+        alarmLevelName: "",
+/**规则条件 */
+        conditionsJson: "",
+/**是否启用 */
+        isActive: undefined,
+      level:undefined
+      },
+  /**表格信息 */
+tableModel: [] as AlarmLevelDto[],
+
+  alarmLevelDict: [] as DictItem[], // 报警等级字典数据
+    /**动态表头 */
+    dynamicColumns: [
+{ prop: 'alarmLevelName', label: '报警等级名称' },
+{ prop: 'level', label: '报警等级' },
+{ prop: 'conditionsJson', label: '规则条件' },
+{ prop: 'isActive', label: '是否启用' },
+{ prop: 'activationTime', label: '启用时间' },
+{ prop: 'deactivationTime', label: '停用时间' },
+{ prop: 'remark', label: '备注' },],
+/**分页标识 */
+    pageInput:{
+      CurrentPage: 1,
+      PageSize: 10,
+    } as pageInput,
+    /**分页总数 */
+    total: 0,
+})
+
+// 表单数据
+const formData = reactive<AlarmLevelDto>({
+  alarmLevelName: "",
+  level: undefined,
+  conditionsJson: "",
+  isActive: undefined,
+  activationTime: "",
+  deactivationTime: "",
+  remark: "",
+});
+
+// 表单验证规则
+const rules = {
+  alarmLevelName: [{ required: true, message: "请输入报警等级名称", trigger: "blur" }],
+  level: [{ required: true, message: "请输入报警等级", trigger: "blur" }],
+  conditionsJson: [{ required: true, message: "请输入规则条件", trigger: "blur" }],
+  isActive: [{ required: true, message: "请选择启用状态", trigger: "change" }],
+};
+
+
+onMounted(() => {
+  // 初始化分页大小
+  state.pageInput.PageSize = pageState.pageInput.pageSize;
+  init();
+  
+  // 初始化时获取报警等级字典数据
+  fetchAlarmLevelDict();
+  
+  eventBus.off('refreshView');
+  eventBus.on('refreshView', async () => {
+    await init();
+  });
+  console.log();
+});
+
+// 获取报警等级字典数据的函数
+const fetchAlarmLevelDict = async () => {
+  try {
+    state.loading = true;
+    // 构造字典查询参数,包含dictTypeId
+    const data: PageInputDictGetPageDto = {
+      CurrentPage: 1,
+      PageSize: 100,
+      Filter: {
+        dictTypeId: 685895581360197, 
+        name: "" // 可选的名称筛选
+      }
+    };
+    
+    // 调用字典接口
+    const res: ResultOutputPageOutputDictGetPageOutput = 
+      await new DictApi().getPage(data);
+    
+    // 处理返回数据
+    if (res.success && res.data) {
+      state.alarmLevelDict = res.data.list || [];
+      console.log("报警等级字典数据获取成功", state.alarmLevelDict);
+    } else {
+      console.error("获取报警等级字典数据失败", res.msg);
+    }
+  } catch (error) {
+    console.error("获取报警等级字典数据异常", error);
+  } finally {
+    state.loading = false;
+  }
+};
+  /**
+  * 监听变换
+  */
+  watch(() => {})
+/**条件查询 */
+          const onQuery = () => {
+          init()
+        }
+
+        /**初始化 */
+        const init = async () => {
+          state.loading = true
+          const res: any = await new Api().getList({ ...state.pageInput, Filter: state.filter })
+          state.tableModel = res?.data?.list ?? []
+          state.total = res?.data?.total ?? 0
+          state.loading = false
+        }
+
+/** 打开添加/编辑弹窗 */
+const openDialog = (row: AlarmLevelDto | undefined) => {
+  // 重置表单
+  resetForm();
+  
+  if (row) {
+    // 编辑模式
+    isEdit.value = true;
+    currentRowId.value = row.id;
+    
+    // 填充表单数据
+    formData.alarmLevelName = row.alarmLevelName || "";
+    formData.level = row.level || 0;
+    formData.conditionsJson = row.conditionsJson || "";
+    formData.isActive = row.isActive || undefined;
+    formData.activationTime = row.activationTime || "";
+    formData.deactivationTime = row.deactivationTime || "";
+    formData.remark = row.remark || "";
+  } else {
+    // 添加模式
+    isEdit.value = false;
+    currentRowId.value = undefined;
+  }
+  
+  // 显示弹窗
+  dialogVisible.value = true;
+};
+
+/** 重置表单 */
+const resetForm = () => {
+  formData.alarmLevelName = "";
+  formData.level = 0;
+  formData.conditionsJson = "";
+  formData.isActive = undefined;
+  formData.activationTime = "";
+  formData.deactivationTime = "";
+  formData.remark = "";
+  
+  if (formRef.value) {
+    formRef.value.validate(() => {});
+  }
+};
+
+/** 关闭弹窗 */
+const handleDialogClose = () => {
+  dialogVisible.value = false;
+};
+
+/** 提交表单 */
+const handleSubmit = () => {
+  if (!formRef.value) return;
+  
+  formRef.value.validate(async (isValid) => {
+    if (isValid) {
+      try {
+        let res: any;
+        
+        if (isEdit.value && currentRowId.value) {
+          // 编辑请求 - 使用update接口而不是add接口
+          formData.id = currentRowId.value;
+          res = await new Api().addAlarmLevel(formData);
+          ElMessage.success('修改成功');
+        } else {
+          // 添加请求
+          res = await new Api().addAlarmLevel(formData);
+          ElMessage.success('添加成功');
+        }
+        
+        // 关闭弹窗
+        dialogVisible.value = false;
+        
+        // 刷新列表
+        await init();
+        
+        // 触发刷新事件
+        eventBus.emit('refreshView');
+      } catch (error: any) {
+        console.error('操作失败:', error.message || error);
+        ElMessage.error('操作失败');
+      }
+    } else {
+      console.log('表单验证失败');
+      return false;
+    }
+  });
+};
+
+/** 编辑 */
+const onDateUpdate = (row: AlarmLevelDto) => {
+  openDialog(row);
+};
+
+const handleDelete = async (id: number) => {
+  try {
+    // 显示加载状态
+    state.loading = true;
+    
+    // 调用删除API
+    await new Api().deleteAlarmLevel({ id });
+    
+    // 显示成功消息
+    ElMessage.success('删除成功');
+    
+    // 刷新列表
+    await init();
+    
+    // 触发刷新事件
+    eventBus.emit('refreshView');
+  } catch (error: any) {
+    console.error('删除失败:', error.message || error);
+    ElMessage.error('删除失败');
+  } finally {
+    // 隐藏加载状态
+    state.loading = false;
+  }
+};
+/** 页条大小变化 */
+const onSizeChange = (val: number) => {
+  state.pageInput.PageSize = val;
+  init();
+};
+
+/** 页码变化 */
+const onCurrentChange = (val: number) => {
+  state.pageInput.CurrentPage = val;
+  init();
+};
+</script>
+
+<style scoped lang="scss">
+.el-input,
+.el-select {
+  width: 240px;
+}
+
+/* 输入框标签固定四个字符宽度 */
+::v-deep .el-form-item__label {
+  // 字体大小14,4个字符,12px右间距
+  width: 14*4px+12px;
+  justify-content: start;
+}
+
+/* 数据表头 设置灰色样式 */
+::v-deep .el-table th.el-table__cell {
+  background-color: #F6F6F6;
+}
+
+.el-link {
+  padding: 5px;
+}
+  </style>

+ 16 - 7
admin.ui.plus-master/src/views/admin/yujing/alarmRules/components/add-alarmRules.vue

@@ -16,7 +16,7 @@
           </el-form-item>
         </el-form>
       </div>
-      <!-- <div style="width: 100%;display: flex;justify-content: center;align-items: center;">
+      <div style="width: 100%;display: flex;justify-content: center;align-items: center;">
         <el-form :inline="true" @submit.stop.prevent>
           <el-form-item label="标签:" style="width: 100%;" prop="labelId">
             <el-select v-model="Data.Filter.labelId" placeholder="请选择标签">
@@ -24,7 +24,7 @@
             </el-select>
           </el-form-item>
         </el-form>
-      </div> -->
+      </div>
       <div style="width: 100%;display: flex;justify-content: center;align-items: center;">
         <el-form :inline="true" @submit.stop.prevent>
           <el-form-item label="推送用户:" style="width: 100%;" prop="pushUserid">
@@ -84,10 +84,17 @@
           </el-form-item>
         </el-form>
       </div>
+      <div style="width: 100%;display: flex;justify-content: center;align-items: center;">
+        <el-form :inline="true" @submit.stop.prevent>
+          <el-form-item label="正则匹配:" style="width: 100%;">
+            <el-input type="textarea" rows="2" v-model="Data.Filter.regular" style="width: 100%;" placeholder="请输入" />
+          </el-form-item>
+        </el-form>
+      </div>
       <div style="width: 100%;display: flex;justify-content: center;align-items: center;">
         <el-form :inline="true" @submit.stop.prevent>
           <el-form-item label="关键字匹配:" style="width: 100%;">
-            <el-input type="textarea" rows="5" v-model="Data.Filter.regular" style="width: 100%;" placeholder="请输入" />
+            <el-input type="textarea" rows="5" v-model="Data.Filter.keyWord" style="width: 100%;" placeholder="如有多个关键字,请用英文“,”分割" />
           </el-form-item>
         </el-form>
       </div>
@@ -319,6 +326,7 @@ const Data = reactive({
     pushMethod: '',
     pushTemplateMappingID: [],
     regular: '',
+    keyWord:"",
     isExclusive: false,
     isExclusiveMaintenance: false,
     taskPriority: 1,
@@ -655,8 +663,7 @@ const submitForm = async () => {
 const openDialog = (row: alarmRluesFilterModel) => {
   console.log(row)
   if(row){
-    console.log(Data.Filter)
-    const { triggerMethod, maintenanceTriggerMethod, ruleName, roleMappingId, labelId,pushUserid,condition,condition2,isExclusive,isExclusiveMaintenance,regular,...rest } = Data.Filter;
+    const { triggerMethod, maintenanceTriggerMethod, ruleName, roleMappingId, labelId,pushUserid,condition,condition2,isExclusive,isExclusiveMaintenance,regular,keyWord,...rest } = Data.Filter;
     Data.Filter = { ...rest, ...row };
     Data.Filter.triggerMethod = triggerMethod || Data.Filter.triggerMethod;
     Data.Filter.maintenanceTriggerMethod = maintenanceTriggerMethod || Data.Filter.maintenanceTriggerMethod;
@@ -667,8 +674,7 @@ const openDialog = (row: alarmRluesFilterModel) => {
     Data.Filter.ruleName = ruleName || Data.Filter.ruleName;
     Data.Filter.pushUserid = pushUserid || Data.Filter.pushUserid;
     Data.Filter.regular = regular || Data.Filter.regular;
-
-
+    Data.Filter.keyWord = keyWord || Data.Filter.keyWord;
 
     Data.Filter.isExclusive = Boolean(row.isExclusive);
     Data.Filter.isExclusiveMaintenance = Boolean(row.isExclusiveMaintenance);
@@ -741,6 +747,7 @@ const openDialog = (row: alarmRluesFilterModel) => {
       pushMethod: '',
       pushTemplateMappingID: [],
       regular: '',
+      keyWord:'',
       isExclusive: false,
       isExclusiveMaintenance: false,
       taskPriority: 1,
@@ -766,6 +773,8 @@ const openDialog = (row: alarmRluesFilterModel) => {
   }
 
   Data.isShowDialog = true;
+  
+    console.log("打开弹窗的数据:" ,Data.Filter)
 };
 
 defineExpose({

+ 13 - 4
admin.ui.plus-master/src/views/admin/yujing/alarmRules/index.vue

@@ -70,10 +70,19 @@
             </el-table-column>
 
           </el-table>
+          
           <div class="my-flex my-flex-end" style="margin-top: 20px">
-            <el-pagination v-model:currentPage="Data.pageInput.currentPage" v-model:page-size="Data.pageInput.pageSize"
-              :total="Data.total" :page-sizes="[5, 10, 15, 20, 50, 100]" small background @size-change="onSizeChange"
-              @current-change="onCurrentChange" layout="total, sizes, prev, pager, next, jumper" />
+            <el-pagination 
+            v-model:currentPage="Data.pageInput.currentPage" 
+            v-model:page-size="Data.pageInput.pageSize"
+            :total="Data.total" 
+            :page-sizes="[5, 10, 15, 20, 50, 100]" 
+            small 
+            background 
+            @size-change="onSizeChange"
+            @current-change="onCurrentChange" 
+            layout="total, sizes, prev, pager, next, jumper" 
+            />
           </div>
         </el-card>
       </el-col>
@@ -121,7 +130,7 @@ const Data = reactive({
     // { prop: 'userName', label: '用户' },
     { prop: 'pushMethod', label: '推送方式' },
     // { prop: 'triggerMethod', label: '触发方式' },
-    { prop: 'regular', label: '关键字匹配' },
+    { prop: 'keyWord', label: '关键字匹配' },
     { prop: 'taskPriority', label: '优先级' },
     // { prop: 'isExclusive', label: '是否互斥' },
     // { prop: 'stationName', label: '推送方式' },

+ 22 - 84
admin.ui.plus-master/src/views/example/codeGeneration/index.vue

@@ -29,7 +29,7 @@
           <el-form-item label="查询按钮" style="width: 100%;"></el-form-item>
           <el-form-item label="">
             <el-row :gutter="70">
-              <el-col :xs="6" :sm="6" :md="6" :lg="6" :xl="4" v-for="(v, k) in state.selectBtn" :key="k">
+              <el-col :xs="6" :sm="4" :md="4" :lg="4" :xl="4" v-for="(v, k) in state.selectBtn" :key="k">
                 <span style="margin-right: 10px;">{{ v.name }}</span>
                 <el-switch v-model="v.value" @change="change(k)"></el-switch>
               </el-col>
@@ -320,7 +320,7 @@ const onsubmit=()=>{
   let tabVal=state.tableVal.filter(item=>item.value===true)
   //console.log(tabVal)
   let apiCode=`import { AxiosResponse } from 'axios'
-  import { ContentType, HttpClient, RequestParams } from '/@/api/admin/http-client'
+  import { ContentType, HttpClient, RequestParams } from './http-client'
   export class Api<SecurityDataType = unknown> extends HttpClient<SecurityDataType> {
     /**
    * No description
@@ -430,17 +430,17 @@ const onsubmit=()=>{
       <el-col :xs="24" >
         <el-card class="mt8"  shadow="hover" >`
     if(selVal.length>0){
-      indexCode=indexCode+`\n<el-form :model="state.filter" :inline="true" @submit.stop.prevent style="margin-bottom: -3vh;">
+      indexCode=indexCode+`\n<el-form :model="state.filter" :inline="true" @submit.stop.prevent>
             <el-form-item prop="name" style="width: 100%">`
       for(let i=0;i<selVal.length;i++){
         if(selVal[i].type==='interger'){
-          indexCode=indexCode+`\n<el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6" class="mb20">
+          indexCode=indexCode+`\n<el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="4" class="mb20">
                 <el-form-item label="${selVal[i].description}">
                   <el-input-number v-model="state.filter.${selVal[i].name}" />
                 </el-form-item>
               </el-col>`
         }else if(selVal[i].isDate===true){
-          indexCode=indexCode+`\n<el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6" class="mb20">
+          indexCode=indexCode+`\n<el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="4" class="mb20">
             <el-form-item label="选择时间">
                   <el-date-picker
                     v-model="state.filter.${selVal[i].name}"
@@ -453,7 +453,7 @@ const onsubmit=()=>{
                 </el-form-item>
               </el-col>`
         }else{
-          indexCode=indexCode+`\n<el-col :xs="24" :sm="12" :md="8" :lg="8" :xl="6" class="mb20">
+          indexCode=indexCode+`\n<el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="4" class="mb20">
                 <el-form-item label="${selVal[i].description}">
                   <el-input v-model="state.filter.${selVal[i].name}" placeholder="单行输入" clearable></el-input>
                 </el-form-item>
@@ -461,37 +461,18 @@ const onsubmit=()=>{
         }
       }
       indexCode=indexCode+`\n</el-form-item>
-          </el-form>
-          
-          <hr>
-
-          `
+          </el-form>`
+    }
+    if(selBtn.length>0){
+      indexCode=indexCode+`\n<div class="my-flex my-flex-start" >`
+      for(let i=0;i<selBtn.length;i++){
+        if(selBtn[i].name.includes('批量')){
+          selection=true
+        }
+        indexCode=indexCode+`\n<el-button  type="primary" icon="ele-CirclePlus" @click="${selBtn[i].method}"> ${selBtn[i].name} </el-button>`
+      }
+      indexCode=indexCode+`\n</div>`
     }
-if(selBtn.length > 0) {
-  const iconMap = [
-    { keyword: '批量导入', icon: 'ele-UploadFilled' },
-    { keyword: '审核', icon: 'ele-Tickets' },
-    { keyword: '导出', icon: 'ele-Document' },
-    { keyword: '查询', icon: 'ele-Search' },
-    { keyword: '添加', icon: 'ele-Plus' },
-    { keyword: '重置', icon: 'ele-RefreshRight' },
-    { keyword: '上传', icon: 'ele-Upload' },
-    { keyword: '删除', icon: 'ele-Delete' },
-  ];
-  
-  indexCode += `\n<el-row justify="space-between" class="submit-button" style="margin-bottom: -9px;">`;
-  
-  selBtn.forEach(btn => {
-    const match = iconMap.find(item => btn.name.includes(item.keyword));
-    const icon = match?.icon || '';
-    
-    if (match) selection = true;
-    
-    indexCode += `\n<el-button type="primary" icon="${icon}" @click="${btn.method}"> ${btn.name} </el-button>`;
-  });
-  
-  indexCode += `\n</el-row>`;
-}
     indexCode=indexCode+`\n</el-card>
       </el-col>`
   }
@@ -512,7 +493,7 @@ if(selBtn.length > 0) {
         indexCode=indexCode+`\n<el-link
                   class="my-el-link mr12 ml12"
                   type="primary"
-                  icon="ele-Delete"
+                  icon="ele-Upload"
                   @click="${tabBtn[i].method}(row)"
                   :underline="false"
                   target="_blank"
@@ -525,8 +506,8 @@ if(selBtn.length > 0) {
     if(state.isPage){
       indexCode=indexCode+`\n<div class="my-flex my-flex-end" style="margin-top: 20px">
             <el-pagination
-              v-model:currentPage="pageState.pageInput.currentPage"
-              v-model:page-size="pageState.pageInput.pageSize"
+              v-model:currentPage="state.pageInput.CurrentPage"
+              v-model:page-size="state.pageInput.PageSize"
               :total="state.total"
               :page-sizes="[10, 15, 20, 50, 100]"
               small
@@ -546,12 +527,7 @@ if(selBtn.length > 0) {
   <script setup lang="ts">
   import {onBeforeMount, onMounted, reactive, ref, watch} from "vue";
   import eventBus from "/@/utils/mitt";
-  import {Api} from "/@/api/code/api";
-  import { useDynamicPageSize } from "/@/composables/useDynamicPageSize";
-
-  // 使用组合式函数获取分页状态
-const pageState = useDynamicPageSize(10, 15);`
-
+  import {Api} from "/@/api/code/api";`
   if(state.isPage&&tabVal.length>0){
     indexCode=indexCode+`\nimport { pageInput,${tabVal[0].belong} } from "/@/api/code/dto";`
   }else if(tabVal.length>0){
@@ -595,8 +571,6 @@ const pageState = useDynamicPageSize(10, 15);`
   }
   indexCode=indexCode+`\n})
   onMounted(() => {
-    // 初始化分页大小
-  Data.pageInput.pageSize = pageState.pageInput.pageSize; 
     init()
     eventBus.off('refreshView')
     eventBus.on('refreshView', async () => {
@@ -651,43 +625,7 @@ const pageState = useDynamicPageSize(10, 15);`
       const ${tabBtn[i].method}=(row)=>{}`
     }
   }
-  indexCode=indexCode+`\n
-  /**
-* 页条变化
-* @param val
-*/
-const onSizeChange = (val: number) => {
-  Data.pageInput.pageSize = val
-  //需按照页面对象修改Data
-  init()
-}
-
-/**
- * 页数 变化
- * @param val
- */
-const onCurrentChange = (val: number) => {
-  Data.pageInput.currentPage = val
-  //需按照页面对象修改Data
-  init()
-}
-  </`+`script>`+`\n<style scoped lang="scss">
-  .el-input,
-.el-select {
-  width: 240px;
-}
-
-/* 输入框标签固定四个字符宽度 */
-::v-deep .el-form-item__label {
-  // 字体大小14,4个字符,12px右间距
-  width: 14*4px+12px;
-  justify-content: start;
-}
-
-/* 数据表头 设置灰色样式 */
-::v-deep .el-table th.el-table__cell {
-  background-color: #F6F6F6;
-}
+  indexCode=indexCode+`\n</`+`script>`+`\n<style scoped lang="scss">
   </style>`
   //console.log(indexCode)
   getCodeFile('api.ts',apiCode)