Ver código fonte

动态模板调整

lipenghui 4 meses atrás
pai
commit
c015f57b5c

+ 1 - 1
src/api/pms/devicetemplate/index.ts

@@ -21,7 +21,7 @@ export interface DeviceTemplateAttrs {
 
 // 根据设备分类id查询设备专有属性模板
 export const getAttrTemplateByDeviceCategoryId = async (params: any): Promise<any> => {
-  return await request.get({ url: '/rq/iot-device-template/list-by-device-category-id', params })
+  return await request.get({ url: '/rq/iot-device-template/list-by-device-category-id?deviceCategoryId='+ params })
 }
 
 // 查询物料组列表

+ 17 - 21
src/views/pms/device/DeviceInfo.vue

@@ -48,12 +48,7 @@
             </el-col>
             <el-col :span="8">
               <el-form-item label="规格型号:" prop="model">
-                <el-select
-                  v-model="formData.model"
-                  :model-value="modelLabel"
-                  placeholder="请输入规格型号"
-                  @click="openModelForm"
-                />
+                {{formData.modelName?formData.modelName:'-'}}
               </el-form-item>
             </el-col>
           </el-row>
@@ -106,12 +101,12 @@
               </el-form-item>
             </el-col>
             <el-col :span="6">
-              <el-form-item label="折旧年限" prop="plYear">
+              <el-form-item label="折旧年限:" prop="plYear">
                 {{ formData.plYear ? formData.plYear : '-' }}
               </el-form-item>
             </el-col>
             <el-col :span="6">
-              <el-form-item label="折旧开始日期" prop="plStartDate">
+              <el-form-item label="折旧开始日期:" prop="plStartDate">
                 {{ formData.plStartDate ? formatDate(formData.plStartDate, 'YYYY-MM-DD') : '-' }}
               </el-form-item>
             </el-col>
@@ -119,25 +114,25 @@
 
           <el-row>
             <el-col :span="6">
-              <el-form-item label="已提折旧月数" prop="plMonthed">
+              <el-form-item label="已提折旧月数:" prop="plMonthed">
                 {{ formData.plMonthed ? formData.plMonthed : '-' }}
               </el-form-item>
             </el-col>
             <el-col :span="6">
-              <el-form-item label="已提折旧金额" prop="plAmounted">
+              <el-form-item label="已提折旧金额:" prop="plAmounted">
                 {{ formData.plAmounted ? formData.plAmounted : '-' }}
               </el-form-item>
             </el-col>
             <el-col :span="6">
-              <el-form-item label="剩余金额" prop="remainAmount">
+              <el-form-item label="剩余金额:" prop="remainAmount">
                 {{ formData.remainAmount ? formData.remainAmount : '-' }}
               </el-form-item>
             </el-col>
           </el-row>
           <el-row>
-            <el-col v-for="field in list" :key="field.id" :span="6">
-              <el-form-item :label="field.label" :prop="field.model" :rules="field.rules">
-                {{ formData[field.prop] }}
+            <el-col v-for="field in list" :key="field.sort" :span="6">
+              <el-form-item :label="field.name" :prop="field.identifier" >
+                {{ field.value }}
               </el-form-item>
             </el-col>
           </el-row>
@@ -194,7 +189,7 @@ const message = useMessage() // 消息弹窗
 const { params } = useRoute() // 查询参数
 const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
 const activeName = ref('info') // Tag 激活的窗口
-const infoRef = ref() // 商品信息 Ref
+const list = ref([])
 const id = params.id as unknown as number
 // SPU 表单数据
 const formData = ref({
@@ -225,20 +220,21 @@ const getDetail = async () => {
     try {
       const res = (await IotDeviceApi.getIotDevice(id)) as IotDeviceVO
       formData.value = res
+      if (res) {
+        debugger
+        if (res.templateJson) {
+          list.value = JSON.parse(res.templateJson)
+        }
+      }
     } finally {
       formLoading.value = false
     }
   }
 }
-/** 关闭按钮 */
-// const close = () => {
-//   delView(unref(currentRoute))
-//   push({ name: 'Suppliers' })
-// }
-
 /** 初始化 */
 onMounted(async () => {
   await getDetail()
+
 })
 </script>
 <style scoped></style>

+ 6 - 66
src/views/pms/device/DeviceUpload.vue

@@ -1,71 +1,8 @@
 <template>
-  <ContentWrap>
-    <div style="display: flex; flex-direction: row; height: 15em; margin-top: 10px">
-      <div style="flex: 1; height: 10em; margin-left: 20px">
-        <img :src="formData.picUrl" style="width: 30em; height: 15em" />
-      </div>
-      <div style="flex: 2.5; height: 15em">
-        <el-form ref="formRef" :disabled="false" :model="formData" label-width="120px">
-          <el-row>
-            <el-col :span="8">
-              <el-form-item label="资产编码:" prop="deviceCode"
-                >{{ formData.deviceCode }}
-              </el-form-item>
-            </el-col>
-            <el-col :span="8">
-              <el-form-item label="设备名称:" prop="deviceName"
-                >{{ formData.deviceName }}
-              </el-form-item>
-            </el-col>
-            <el-col :span="8">
-              <el-form-item label="品牌:" prop="brand">
-                {{ formData.brandName }}
-              </el-form-item>
-            </el-col>
-          </el-row>
-          <el-row>
-            <el-col :span="8">
-              <el-form-item label="所在部门:" prop="orgId">
-                {{ formData.deptName }}
-              </el-form-item>
-            </el-col>
-            <el-col :span="8">
-              <el-form-item label="资产类别:" prop="assetClass">
-                {{ formData.assetClassName }}
-              </el-form-item>
-            </el-col>
-            <el-col :span="8">
-              <el-form-item label="设备状态:" prop="deviceStatus">
-                {{ getDictLabel(DICT_TYPE.PMS_DEVICE_STATUS, formData.deviceStatus) }}
-              </el-form-item>
-            </el-col>
-          </el-row>
-          <el-row>
-            <el-col :span="8">
-              <el-form-item label="资产性质:" prop="assetProperty">
-                {{ getDictLabel(DICT_TYPE.PMS_ASSET_PROPERTY, formData.assetProperty) }}
-              </el-form-item>
-            </el-col>
-            <el-col :span="8">
-              <el-form-item label="规格型号:" prop="model">
-                <el-select
-                  v-model="formData.model"
-                  :model-value="modelLabel"
-                  placeholder="请输入规格型号"
-                  @click="openModelForm"
-                />
-              </el-form-item>
-            </el-col>
-          </el-row>
-        </el-form>
-      </div>
-    </div>
-  </ContentWrap>
-
   <ContentWrap v-loading="formLoading">
     <el-row>
       <el-col :span="4">
-        <FileTree @node-click="handleDeptNodeClick" />
+        <FileTree @node-click="handleFileNodeClick" />
       </el-col>
     </el-row>
   </ContentWrap>
@@ -75,14 +12,13 @@ import { IotDeviceApi, IotDeviceVO } from '@/api/pms/device'
 import { DICT_TYPE, getDictLabel } from '@/utils/dict'
 import FileTree from '@/views/pms/device/FileTree.vue'
 
-defineOptions({ name: 'DeviceDetailInfo' })
+defineOptions({ name: 'DeviceUpload' })
 
 const { t } = useI18n() // 国际化
 const message = useMessage() // 消息弹窗
 const { params } = useRoute() // 查询参数
 const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
 const activeName = ref('info') // Tag 激活的窗口
-const infoRef = ref() // 商品信息 Ref
 const id = params.id as unknown as number
 // SPU 表单数据
 const formData = ref({
@@ -106,6 +42,10 @@ const formData = ref({
   deptName: undefined
 })
 
+const handleFileNodeClick = async (row) => {
+  queryParams.deptId = row.id
+  await getList()
+}
 /** 获得详情 */
 const getDetail = async () => {
   if (id) {

+ 66 - 73
src/views/pms/device/IotDeviceForm.vue

@@ -270,54 +270,57 @@
       </div>
       <div class="qt-expandable-content" :class="{ 'is-expanded': qtIsExpanded }">
         <el-row>
-          <el-col v-for="field in list" :key="field.id" :span="6">
-            <el-form-item :label="field.label" :prop="field.model" :rules="field.rules">
+          <el-col v-for="field in list" :key="field.sort" :span="6">
+            <el-form-item :label="field.name" :prop="field.identifier" :rules="field.rules">
               <!-- 文本输入 -->
               <el-input
-                v-if="field.type === 'input'"
-                v-model="formData[field.prop]"
-                :placeholder="'请输入' + field.label"
+                v-if="field.type === 'text'"
+                v-model="formData[field.identifier]"
+                :placeholder="'请输入' + field.name"
                 :type="field.type || 'text'"
                 clearable
-              >
-                <!--                <template v-if="field.prepend" #prepend>-->
-                <!--                  {{ field.prepend }}-->
-                <!--                </template>-->
-              </el-input>
+                :model-value="field.value"
+              />
 
-              <!-- 下拉选择 -->
-              <!--              <el-select-->
-              <!--                v-else-if="field.type === 'select'"-->
-              <!--                v-model="formData[field.model]"-->
-              <!--                :placeholder="'请输入'+field.label"-->
-              <!--                clearable-->
-              <!--                filterable-->
-              <!--              >-->
-              <!--                <el-option-->
-              <!--                  v-for="item in field.options"-->
-              <!--                  :key="item.value"-->
-              <!--                  :label="item.label"-->
-              <!--                  :value="item.value"-->
-              <!--                />-->
-              <!--              </el-select>-->
+              <el-select
+                v-else-if="field.type === 'select'"
+                v-model="formData[field.identifier]"
+                :placeholder="'请输入'+field.name"
+                clearable
+                filterable
+              >
+                <el-option
+                  v-for="item in field.options"
+                  :key="item.value"
+                  :label="item.label"
+                  :value="item.value"
+                />
+              </el-select>
 
               <!-- 数字输入 -->
-              <el-input-number
-                v-else-if="field.type === 'number'"
-                v-model="formData[field.prop]"
-                :min="field.min || 0"
-                :max="field.max || 100"
-                :step="field.step || 1"
+              <el-input
+                v-else-if="field.type === 'int'"
+                type="number"
+                v-model="formData[field.identifier]"
+                style="width: 150%"
+                :model-value="field.value"
+              />
+              <el-input
+                v-else-if="field.type === 'double'"
+                v-model="formData[field.identifier]"
+                @input="handleInput(formData[field.identifier], field.identifier)"
+                style="width: 150%"
+                :model-value="field.value"
               />
-
               <!-- 日期选择 -->
               <el-date-picker
                 v-else-if="field.type === 'date'"
-                v-model="formData[field.prop]"
+                v-model="formData[field.identifier]"
                 :type="field.type || 'date'"
-                :placeholder="'请输入' + field.label"
+                :placeholder="'请输入' + field.name"
                 value-format="YYYY-MM-DD"
                 style="width: 150%"
+                :model-value="field.value"
               />
             </el-form-item>
           </el-col>
@@ -349,13 +352,14 @@ import * as DeptApi from '@/api/system/dept'
 import * as ProductClassifyApi from '@/api/pms/productclassify'
 import { DICT_TYPE, getStrDictOptions } from '@/utils/dict'
 import { useTagsViewStore } from '@/store/modules/tagsView'
+import {getAttrTemplateByDeviceCategoryId} from "@/api/pms/devicetemplate";
 
 /** 设备台账 表单 */
 defineOptions({ name: 'IotDeviceForm' })
 const baseIsExpanded = ref(true) // 控制表单是否展开的变量
-const zzIsExpanded = ref(false) // 控制表单是否展开的变量
-const cwIsExpanded = ref(false) // 控制表单是否展开的变量
-const qtIsExpanded = ref(false) // 控制表单是否展开的变量
+const zzIsExpanded = ref(true) // 控制表单是否展开的变量
+const cwIsExpanded = ref(true) // 控制表单是否展开的变量
+const qtIsExpanded = ref(true) // 控制表单是否展开的变量
 
 const deptList = ref<Tree[]>([]) // 树形结构
 const productClassifyList = ref<Tree[]>([]) // 树形结构
@@ -417,25 +421,25 @@ const formRules = reactive({
   manDate: [{ required: true, message: '生产日期不能为空', trigger: 'blur' }]
 })
 
-const list = [
-  {
-    id: 1,
-    label: '姓名',
-    prop: 'name',
-    type: 'input',
-    value: null,
-    rules: [{ required: true, message: '姓名不能为空', trigger: 'blur' }]
-  },
-  { id: 2, label: '邮件', prop: 'email', type: 'date' },
-  { id: 3, label: '邮件', prop: 'email', type: 'date' },
-  { id: 4, label: '邮件', prop: 'email', type: 'date' },
-  { id: 5, label: '邮件', prop: 'email', type: 'date' }
-]
+const list = ref([])
 
 const assetclasschange = () => {
   const assetClass = formData.value.assetClass
-  debugger
-  // todo 调用获取动态模板接口
+  getAttrTemplateByDeviceCategoryId(assetClass).then(res => {
+    if (res){
+      if (res.attrs) {
+        res.attrs.forEach((item) => {
+          if (item.requiredFlag) {
+            const rule = {required: true, message: item.name+'不能为空', trigger: 'blur'}
+            item.rules.push(rule)
+          }
+        })
+        list.value = res.attrs
+      }
+    } else {
+      list.value = []
+    }
+  })
 }
 
 const brandChoose = (row) => {
@@ -479,22 +483,6 @@ const allzhankai = () => {
   cwIsExpanded.value = true
   qtIsExpanded.value = true
 }
-/** 打开弹窗 */
-// const open = async (id?: number,isDetail: boolean, type: string) => {
-//   debugger
-//   formType.value = type
-//   resetForm()
-//   // 修改时,设置数据
-//   if (id) {
-//     formLoading.value = true
-//     try {
-//       formData.value = await IotDeviceApi.getIotDevice(id)
-//     } finally {
-//       formLoading.value = false
-//     }
-//   }
-// }
-// defineExpose({ open }) // 提供 open 方法,用于打开弹窗
 
 const handleInput = (value, obj) => {
   // 1. 过滤非法字符(只允许数字和小数点)
@@ -549,10 +537,13 @@ const submitForm = async () => {
   // 提交请求
   formLoading.value = true
   try {
-    list.forEach((item) => {
-      item.value = formData.value[item.prop]
-    })
-    formData.value.templateJson = JSON.stringify(list)
+    if (list.value) {
+      list.value.forEach((item) => {
+        item.value = formData.value[item.identifier]
+      })
+    }
+    formData.value.templateJson = JSON.stringify(list.value)
+    debugger
     const data = formData.value as unknown as IotDeviceVO
     if (formType.value === 'create') {
       await IotDeviceApi.createIotDevice(data)
@@ -591,6 +582,8 @@ onMounted(async () => {
       brandLabel.value = iotDevice.brandName;
       zzLabel.value = iotDevice.zzName;
       supplierLabel.value = iotDevice.supplierName;
+      list.value = JSON.parse(iotDevice.templateJson);
+      debugger
     } finally {
       formLoading.value = false
     }

+ 2 - 1
src/views/pms/device/ModelList.vue

@@ -69,6 +69,7 @@
 
 <script setup lang="ts">
 import * as DictDataApi from '@/api/system/dict/dict.data'
+import * as ModelApi from '@/api/pms/model/index'
 import { DictDataVO } from '@/api/system/dict/dict.data'
 import { DICT_TYPE } from '@/utils/dict'
 import { dateFormatter } from '@/utils/formatTime'
@@ -106,7 +107,7 @@ defineExpose({ open }) // 提供 open 方法,用于打开弹窗
 const getList = async () => {
   loading.value = true
   try {
-    const data = await DictDataApi.getDictDataPage(queryParams)
+    const data = await ModelApi.getModelPage(queryParams)
     list.value = data.list
     total.value = data.total
   } finally {