Ver Fonte

Merge branch 'develop' of http://dev.hsfuel.com:3000/adminTk/Web into feature/报警规则、报警发送、报警列表优化配置

# Conflicts:
#	admin.ui.plus-master/src/api/admin/productionManagement/slelist.ts
#	admin.ui.plus-master/src/api/admin/productionManagement/slelistDto.ts
huang, kai (Contractor) há 1 mês atrás
pai
commit
a683f518af

+ 10 - 0
admin.ui.plus-master/src/api/admin/productionManagement/QRBookDto.ts

@@ -11,6 +11,8 @@ export interface QRBookFilter {
     Author?: string
     /** 说明书文件名 */
     FileName?: string
+    /** 归属项目名称 */
+    ProjectName?:string
     /** 开始查询时间 */
     StartTime?: string | null
     /** 结束查询时间 */
@@ -60,6 +62,14 @@ export interface QRBookTableInfo {
     uploadTime:string
     /**修改时间 */
     updateTime:string
+    /** 下载链接 */
+    downloadLink:string
+    /** 所属项目id */
+    projectId:number
+    /** 所属项目名称 */
+    projectName:string
+    /** 所属项目编码 */
+    projectCode:string
 }
 
 /**

+ 11 - 1
admin.ui.plus-master/src/api/admin/productionManagement/slelist.ts

@@ -22,7 +22,8 @@ getList = (data:any ,params: RequestParams = {}) : any  =>
         format: 'json',
         ...params
       })
-        /**
+
+  /**
    * 上传/添加项目
    */
   uploadProject = (data: ProjectGetPageDto, params: RequestParams = {}) => {
@@ -50,6 +51,15 @@ getList = (data:any ,params: RequestParams = {}) : any  =>
     })
   }
 
+  /** 获取所有项目的主键,项目名称,项目编码 */
+  getProjectMainInfo = () => {
+    return this.request({
+      path:'/api/app/project/get-main-info',
+      method:'get',
+    })
+  }
+
+
 
   /**
    * 查询软件历史版本记录

+ 36 - 12
admin.ui.plus-master/src/views/admin/product/qrBook/components/qrbook-edit.vue

@@ -23,19 +23,26 @@
               </el-form-item>
             </el-col>
             <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
-            <el-form-item label="状态" prop="status">
-              <el-select  v-model="formData.editData.status" placeholder="请设置文件状态" >
-                <el-option v-for="(value, key) in statusType" :key="key" :label="value[1].name"  :value="Number(value[1].value)" />
-              </el-select>
-            </el-form-item>
-          </el-col>
+              <el-form-item label="状态" prop="status">
+                <el-select  v-model="formData.editData.status" placeholder="请设置文件状态" >
+                  <el-option v-for="(value, key) in statusType" :key="key" :label="value[1].name"  :value="Number(value[1].value)" />
+                </el-select>
+              </el-form-item>
+            </el-col>
+            <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
+              <el-form-item label="归属项目" prop="projectId">
+                <el-select  v-model="formData.editData.projectId" filterable placeholder="请选择归属项目">
+                  <el-option v-for="(value) in formData.projectInfo" :key="value.id" :label="value.projectName" :value="value.id" />
+                </el-select>
+              </el-form-item>
+            </el-col>
             <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
               <el-form-item label="备注" prop="remark">
                 <el-input v-model="formData.editData.remark" placeholder="请输入备注" rows="6" clearable type="textarea"></el-input>
               </el-form-item>
             </el-col>
           </el-row>
-          <QRBookUpload v-model="formData.fileValue" ref="uploadFileRef" :file="{fileName:formData.editData.fileName}" @onUpload="onUpload"/>
+          <QRBookUpload v-model="formData.fileValue" ref="uploadFileRef" :file="{fileName:formData.editData.fileName,guid:formData.editData.guid}" @onUpload="onUpload"/>
         </el-form>
         <template #footer>
           <span class="dialog-footer">
@@ -48,7 +55,7 @@
   </template>
   
   <script setup lang="ts">
-  import {defineAsyncComponent, reactive, ref, watch, inject, computed} from "vue";
+  import {defineAsyncComponent, reactive, ref, watch, inject, computed, onMounted} from "vue";
   import {FormRules} from "element-plus";
   import { useUserInfo } from "/@/stores/userInfo"; // 引入新的 Store
   import {useGlobalCacheStore} from "/@/stores/globalCacheStore";
@@ -56,7 +63,9 @@
   import { QRBookApi } from "/@/api/admin/productionManagement/qrBookApi";
   import eventBus from "/@/utils/mitt";
   import {}from"@\views\admin\personal\index.vue"
-import { log } from "console";
+  import { log } from "console";
+import { Api } from "/@/api/admin/productionManagement/slelist";
+import { ProjectMainInfo } from "/@/api/admin/productionManagement/slelistDto";
   
   /** 引入组件 */
   const QRBookUpload = defineAsyncComponent(() => import('./qrbook-upload.vue'))
@@ -75,11 +84,9 @@ import { log } from "console";
     console.log('上传人昵称已更新:', newValue);
   });
 
-
 // 打印日志进行调试
 console.log('injectedNickName:', injectedNickName.value);
 
-
   /**数据对象 */
   const formData = reactive({
     loading: false,
@@ -88,13 +95,19 @@ console.log('injectedNickName:', injectedNickName.value);
     buttonText:'',
     isShowDialog: false,
     editData:{} as QRBookTableInfo,
-    fileValue: null
+    fileValue: null,
+    projectInfo:[] as ProjectMainInfo[],
   })
 
   /**表单校验*/
   const rules = reactive<FormRules>({
     fileName: [
       { required: true, message: '请输入文件名', trigger: 'blur' },
+    ],
+    projectId:[
+      { 
+        required: true, message: '请选择归属项目', trigger: ['blur', 'change'],
+      },
     ]
   })
   
@@ -105,6 +118,7 @@ console.log('injectedNickName:', injectedNickName.value);
   
   const openDialog = (val) => {
     formData.isShowDialog = true
+    getProject()
     if(val){
       formData.editData = JSON.parse(JSON.stringify(val))
       formData.titleText = '更新说明书'
@@ -124,6 +138,13 @@ console.log('injectedNickName:', injectedNickName.value);
     formData.isShowDialog = false
   }
   
+  const getProject = async () => {
+    const projectInfo = await new Api().getProjectMainInfo()
+    formData.projectInfo = projectInfo.data
+    console.log(formData.projectInfo)
+
+  }
+
   /***监听弹窗关   闭表单验证*/
   watch(() => formData.isShowDialog,(newVal) => {
     if(newVal) formRef.value?.resetFields()
@@ -143,6 +164,9 @@ console.log('injectedNickName:', injectedNickName.value);
     
       formData.loading = true
       formData.editData.author = injectedNickName.value
+      const project = formData.projectInfo.filter(item => item.id === formData.editData.projectId)
+      formData.editData.projectName = project[0].projectName ?? ""
+      formData.editData.projectCode = project[0].projectCode ?? ""
       let request = JSON.parse(JSON.stringify(formData.editData)) 
       let res = await new QRBookApi().uploadFile(request as QRBookFileInfoRequset)
       if(res?.data?.value) eventBus.emit('refreshView')

+ 86 - 80
admin.ui.plus-master/src/views/admin/product/qrBook/components/qrbook-upload.vue

@@ -1,81 +1,87 @@
-<template>
-    <el-upload
-      class="upload-demo"
-      v-model:file-list="fileList"
-      drag
-      :headers="{ Authorization:  'Bearer ' + useUserInfoStores.getToken()}"
-      :action='baseUrl+"/api/app/qr-book/upload-file"'
-      :on-success="handleAvatarSuccess"
-      :before-upload="beforeAvatarUpload"
-    >
-      <el-icon class="el-icon--upload"><upload-filled /></el-icon>
-      <div class="el-upload__text">
-        将文件拖到此处/<em>点击上传</em>
-      </div>
-      <template #tip>
-        <div class="el-upload__tip">
-          说明书上传
-        </div>
-      </template>
-    </el-upload>
-  </template>
-  
-  <script setup lang="ts">
-  import { UploadFilled} from "@element-plus/icons-vue";
-  import { useUserInfo } from '/@/stores/userInfo'
-  import {ElMessage, UploadProps, UploadUserFile} from "element-plus";
-  import { onMounted, ref, watch } from "vue";
-  
-  const useUserInfoStores = useUserInfo()
-  
-  const emits = defineEmits(['onUpload'])
-
-  const fileList = ref<UploadUserFile[]>([])
-
-  const baseUrl = import.meta.env.VITE_API_URL
-  
-  //接受父组件的传值
-  const props = defineProps({
-    file:{} as any
-  })
-  const file = ref(props.file)
-
-  // watch(() => props.file.fileUrl, (val)=> {
-  //   file.value.fileUrl = val
-  //   if(file.value.fileUrl) {
-  //     fileList.value = [{name:file.value.fileName,url:file.value.fileUrl} as UploadUserFile]
-  //   }else{
-  //     fileList.value = []
-  //   }
-  // })
-  watch(() => props.file.fileName, (val)=> {
-    file.value.fileName = val
-    if(val) fileList.value = [{name:val}]
-  })
-  
-  const handleAvatarSuccess: UploadProps['onSuccess'] = (
-    response,
-  ) => {
-    const res = response?.data
-    fileList.value = [{name:res.fileName+res.extension}]
-    file.value.guid = res.guid
-    file.value.fileName = res.fileName,
-    file.value.extension = res.extension
-    emits('onUpload',file.value)
-  }
-  
-  const beforeAvatarUpload: UploadProps['beforeUpload'] = (rawFile) => {
-
-    if (rawFile.size / 1024 / 1024 > 100) {
-      ElMessage.error('文件超过100MB!')
-
-      return false
-    }
-    return true
-  }
-  
-  onMounted(()=>{
-    if(file.value.fileName) fileList.value = [{name:file.value.fileName} as UploadUserFile]
-  })
-  </script>
+<template>
+    <el-upload
+      class="upload-demo"
+      v-model:file-list="fileList"
+      drag
+      :headers="{ Authorization:  'Bearer ' + useUserInfoStores.getToken()}"
+      :action='baseUrl+"/api/app/qr-book/upload-file"'
+      :data="{guidStr:file.guid === undefined ? '' : file.guid}"
+      :on-success="handleAvatarSuccess"
+      :before-upload="beforeAvatarUpload"
+    >
+      <el-icon class="el-icon--upload"><upload-filled /></el-icon>
+      <div class="el-upload__text">
+        将文件拖到此处/<em>点击上传</em>
+      </div>
+      <template #tip>
+        <div class="el-upload__tip">
+          说明书上传
+        </div>
+      </template>
+    </el-upload>
+  </template>
+  
+  <script setup lang="ts">
+  import { UploadFilled} from "@element-plus/icons-vue";
+  import { useUserInfo } from '/@/stores/userInfo'
+  import {ElMessage, UploadProps, UploadUserFile} from "element-plus";
+  import { onMounted, ref, watch } from "vue";
+import { fi } from "element-plus/es/locale";
+  
+  const useUserInfoStores = useUserInfo()
+  
+  const emits = defineEmits(['onUpload'])
+
+  const fileList = ref<UploadUserFile[]>([])
+
+  const baseUrl = import.meta.env.VITE_API_URL
+  
+  //接受父组件的传值
+  const props = defineProps({
+    file:{} as any
+  })
+  const file = ref(props.file)
+
+  // watch(() => props.file.fileUrl, (val)=> {
+  //   file.value.fileUrl = val
+  //   if(file.value.fileUrl) {
+  //     fileList.value = [{name:file.value.fileName,url:file.value.fileUrl} as UploadUserFile]
+  //   }else{
+  //     fileList.value = []
+  //   }
+  // })
+  watch(() => props.file, (val)=> {
+    file.value.fileName = val.fileName
+    file.value.guid = val.guid
+    if(val) fileList.value = [{name:val.fileName}]
+  })
+  
+  const handleAvatarSuccess: UploadProps['onSuccess'] = (
+    response,
+  ) => {
+    const res = response?.data
+    fileList.value = [{name:res.fileName+res.extension}]
+    file.value.guid = res.guid
+    file.value.fileName = res.fileName,
+    file.value.extension = res.extension
+    emits('onUpload',file.value)
+  }
+  
+  const beforeAvatarUpload: UploadProps['beforeUpload'] = (rawFile) => {
+
+    console.log(file.value)
+    if (rawFile.size / 1024 / 1024 > 100) {
+      ElMessage.error('文件超过100MB!')
+
+      return false
+    }
+    return true
+  }
+  
+  onMounted(()=>{
+    console.log(file.value)
+    if(file.value.fileName) fileList.value = [{name:file.value.fileName} as UploadUserFile]
+    // if(!file.value.guid)
+  })
+  </script>
   

+ 44 - 0
admin.ui.plus-master/src/views/admin/product/qrBook/components/qrbox.vue

@@ -0,0 +1,44 @@
+<template>
+    <div ref="qrcodeElement">
+    </div>
+</template>
+
+<script setup lang="ts">
+import { onMounted, ref } from 'vue';
+import QRCode from 'qrcodejs2-fixes';
+import { text } from 'stream/consumers';
+import { nextTick } from 'process';
+
+const props = withDefaults(defineProps<{
+    link:string,
+    size:number
+}>(),{
+    link:"",
+    size:40
+})
+
+const qrcodeElement = ref<HTMLElement | null>(null)
+
+const createQRCode = () => {
+    if(!qrcodeElement.value || !props.link) return
+
+    qrcodeElement.value.innerHTML = ''
+
+    new QRCode(qrcodeElement.value,{
+        text:props.link,
+        width:props.size,
+        height:props.size,
+        colorDark:'#000000',
+        colorLight:'#FFFFFF'
+    })
+}
+
+onMounted(() => {
+    nextTick(()=>{
+        createQRCode()
+    })
+})
+</script>
+
+<style scoped>
+</style>

+ 15 - 1
admin.ui.plus-master/src/views/admin/product/qrBook/index.vue

@@ -20,6 +20,13 @@
                                 </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="qrBookData.Filter.ProjectName" 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  placeholder="请选择上传状态">
@@ -74,6 +81,8 @@
                                 <StatusBox 
                                     v-if="column.prop === 'status'" 
                                     :status="getStatusInfo(row[column.prop]).name"  />
+                                <QRBox v-else-if="column.prop === 'downloadLink'" ref="qrBoxRef" :link="row[column.prop]" :size="80" />
+                                
                                 <!-- 其他列保持原有逻辑 -->
                                 <span 
                                     v-else 
@@ -121,10 +130,11 @@ import { useGlobalCacheStore } from "/@/stores/globalCacheStore";
 import StatusBox from "/@/components/StatusBox.vue";
 
 
-
 /**引入组件*/
 const FileEditDialog = defineAsyncComponent(() => import('./components/qrbook-edit.vue'))
 const fileEditRef = ref()
+const QRBox = defineAsyncComponent(() => import('./components/qrbox.vue'))
+const qrBoxRef = ref()
 
 /** 获取全局缓存 */
 const globalCacheStore = useGlobalCacheStore()
@@ -141,6 +151,7 @@ const qrBookData = reactive({
     Filter: {
         Author: "",
         FileName: "",
+        ProjectName:"",
         status:'',
         StartTime: null,
         EndTime: null
@@ -150,10 +161,12 @@ const qrBookData = reactive({
     // 表头
     dynamicColumns: [
         { prop: 'fileName', label: '说明书文件名' },
+        { prop: 'projectName', label: '归属项目' },
         { prop: 'author', label: '上传人' },
         { prop: 'status', label: '状态' },
         { prop: 'uploadTime', label: '上传时间' },
         { prop: 'updateTime', label: '修改时间' },
+        { prop: 'downloadLink', label: '二维码' },
         { prop: 'remark', label: '备注' }
     ],
     /**分页标识 */
@@ -174,6 +187,7 @@ const getData = async () => {
         ...qrBookData.PageInput,
         "Filter.Author": qrBookData.Filter.Author,
         "Filter.FileName": qrBookData.Filter.FileName,
+        "Filter.ProjectName": qrBookData.Filter.ProjectName,
         "Filter.StartTime": qrBookData.Filter.StartTime,
         "Filter.EndTime": qrBookData.Filter.EndTime
     })