Browse Source

代码上传

zhangqiOMG 2 years ago
parent
commit
19199aa912
25 changed files with 2075 additions and 21 deletions
  1. 15 15
      node_modules/.vite/deps/_metadata.json
  2. 0 0
      node_modules/.vite/deps/mathjs.js.map
  3. 0 0
      node_modules/.vite/deps/pinia.js.map
  4. 52 0
      src/components/customHandleBtn/index.vue
  5. 1 1
      src/components/layout/modules/menu.vue
  6. 2 1
      src/components/listTemplate/index.vue
  7. 57 0
      src/components/selectModel/index.vue
  8. 76 0
      src/operation/moduleNormal/areaManage/index.vue
  9. 102 0
      src/operation/moduleNormal/areaManage/modules/Add.vue
  10. 109 0
      src/operation/moduleNormal/areaManage/modules/Edit.vue
  11. 46 0
      src/operation/moduleNormal/areaManage/modules/selectArea.vue
  12. 84 0
      src/operation/moduleNormal/productCategory/index.vue
  13. 150 0
      src/operation/moduleNormal/productCategory/modules/Add.vue
  14. 158 0
      src/operation/moduleNormal/productCategory/modules/Edit.vue
  15. 90 0
      src/operation/moduleNormal/productManage/detail/index.vue
  16. 159 0
      src/operation/moduleNormal/productManage/detail/modules/Edit.vue
  17. 65 0
      src/operation/moduleNormal/productManage/detail/modules/attributeTab/index.vue
  18. 160 0
      src/operation/moduleNormal/productManage/detail/modules/attributeTab/modules/Add.vue
  19. 46 0
      src/operation/moduleNormal/productManage/index.vue
  20. 155 0
      src/operation/moduleNormal/productManage/modules/Add.vue
  21. 202 0
      src/operation/moduleNormal/productManage/modules/selectAllData.vue
  22. 285 0
      src/operation/moduleNormal/productManage/modules/selectSiteProduct.vue
  23. 38 2
      src/router/modelNormal.js
  24. 19 0
      src/stores/modules/base.js
  25. 4 2
      src/template/normalTable/index.vue

+ 15 - 15
node_modules/.vite/deps/_metadata.json

@@ -1,83 +1,83 @@
 {
-  "hash": "2eec75de",
-  "browserHash": "1dfef5b4",
+  "hash": "c3e30d73",
+  "browserHash": "5f108a1a",
   "optimized": {
     "@ant-design/icons-vue": {
       "src": "../../@ant-design/icons-vue/es/index.js",
       "file": "@ant-design_icons-vue.js",
-      "fileHash": "0bcad96c",
+      "fileHash": "de3b675f",
       "needsInterop": false
     },
     "ant-design-vue": {
       "src": "../../ant-design-vue/es/index.js",
       "file": "ant-design-vue.js",
-      "fileHash": "fc7a1c63",
+      "fileHash": "1f312b64",
       "needsInterop": false
     },
     "ant-design-vue/es/locale/zh_CN": {
       "src": "../../ant-design-vue/es/locale/zh_CN.js",
       "file": "ant-design-vue_es_locale_zh_CN.js",
-      "fileHash": "2f07cd51",
+      "fileHash": "3841b7a3",
       "needsInterop": false
     },
     "axios": {
       "src": "../../axios/index.js",
       "file": "axios.js",
-      "fileHash": "2ba4f436",
+      "fileHash": "6baac0e0",
       "needsInterop": false
     },
     "dayjs": {
       "src": "../../dayjs/dayjs.min.js",
       "file": "dayjs.js",
-      "fileHash": "c726793a",
+      "fileHash": "4449712b",
       "needsInterop": true
     },
     "dayjs/locale/zh-cn": {
       "src": "../../dayjs/locale/zh-cn.js",
       "file": "dayjs_locale_zh-cn.js",
-      "fileHash": "6559ba3d",
+      "fileHash": "f06d2a86",
       "needsInterop": true
     },
     "js-md5": {
       "src": "../../js-md5/src/md5.js",
       "file": "js-md5.js",
-      "fileHash": "9b76127f",
+      "fileHash": "8e926ac1",
       "needsInterop": true
     },
     "less": {
       "src": "../../less/dist/less.js",
       "file": "less.js",
-      "fileHash": "e6a62967",
+      "fileHash": "46f1c8e2",
       "needsInterop": true
     },
     "mathjs": {
       "src": "../../mathjs/lib/esm/index.js",
       "file": "mathjs.js",
-      "fileHash": "7e41c844",
+      "fileHash": "214db850",
       "needsInterop": false
     },
     "pinia": {
       "src": "../../pinia/dist/pinia.mjs",
       "file": "pinia.js",
-      "fileHash": "3250b3b9",
+      "fileHash": "09276c68",
       "needsInterop": false
     },
     "pinia-plugin-persist": {
       "src": "../../pinia-plugin-persist/dist/pinia-persist.es.js",
       "file": "pinia-plugin-persist.js",
-      "fileHash": "b1cbb1b2",
+      "fileHash": "65b2d741",
       "needsInterop": false
     },
     "vue": {
       "src": "../../vue/dist/vue.runtime.esm-bundler.js",
       "file": "vue.js",
-      "fileHash": "f1c2af1d",
+      "fileHash": "9835f24a",
       "needsInterop": false
     },
     "vue-router": {
       "src": "../../vue-router/dist/vue-router.mjs",
       "file": "vue-router.js",
-      "fileHash": "28156552",
+      "fileHash": "58c2c5f6",
       "needsInterop": false
     }
   },

File diff suppressed because it is too large
+ 0 - 0
node_modules/.vite/deps/mathjs.js.map


File diff suppressed because it is too large
+ 0 - 0
node_modules/.vite/deps/pinia.js.map


+ 52 - 0
src/components/customHandleBtn/index.vue

@@ -0,0 +1,52 @@
+<template>
+  <a-button :type="type ? type :'primary'" @click="onClick" :size="size || 'small'">{{ btnName }}</a-button>
+</template>
+
+<script setup>
+import {ref, defineProps, defineEmits} from 'vue'
+import { ExclamationCircleOutlined } from '@ant-design/icons-vue';
+import Api from '@/api/api'
+import utils from '@/utils/utils'
+import {Modal} from 'ant-design-vue'
+let emit = defineEmits(['onSuccess'])
+let props = defineProps({
+  type: String,
+  btnName: String,
+  message: String,
+  idName: String,
+  keyName: String,
+  id:[String,Number],
+  paramData: {
+    type: Array,
+    default () {
+      return []
+    }
+  },
+  size: String
+})
+
+let onClick = () => {
+  Modal.confirm({
+    title:props.message || '确定操作当前数据吗?',
+    async onOk() {
+      let param = {
+        content: {}
+      }
+      param.id = props.idName
+      param.content[props.keyName] = props.id
+      props.paramData.forEach(item => {
+        param.content[item.key] = item.value
+      })
+      let res = await Api.requested(param)
+      utils.message(res,() => {
+        emit('onSuccess')
+      })
+    },
+    onCancel() {},
+  })
+}
+</script>
+
+<style scoped>
+
+</style>

+ 1 - 1
src/components/layout/modules/menu.vue

@@ -33,7 +33,7 @@ import { useAuthStore } from '@/stores/modules/auth'
 import { storeToRefs } from 'pinia'
 import { useRouter } from "vue-router"
 import less from 'less'
-import { MenuFoldOutlined,MenuUnfoldOutlined} from '@ant-design/icons-vue'
+import { CalendarOutlined} from '@ant-design/icons-vue'
 import {ConfigProvider, Modal } from 'ant-design-vue';
 const router = useRouter()
 const store = useAuthStore()

+ 2 - 1
src/components/listTemplate/index.vue

@@ -70,6 +70,7 @@
     detailPage:Object,
     noAutoQuery:Boolean
   })
+  const emit = defineEmits([])
   const loading = ref(false)
   const columns = ref([])
   const dataSource = ref([])
@@ -105,7 +106,7 @@
   const tableData = async ()=>{
     loading.value = true
     const res = await Api.requested(props.param)
-
+    emit('listData',res)
     dataSource.value = res.data
     total.value = res.total
     sort.value = res.sort

+ 57 - 0
src/components/selectModel/index.vue

@@ -0,0 +1,57 @@
+<template>
+  <a-modal
+    v-model:visible="modeVisible"
+    class="custom-class"
+    :title="title || '标题'"
+    placement="right"
+    :width="wdith || '1000px'"
+    :closable="false"
+    @close="closeFun"
+    @ok="submit">
+    <normalTable v-bind="$attrs" ref="list" size="small" @listData="listData">
+      <template #tb_cell="{data}">
+        <template v-if="data.column.dataIndex === 'operation'">
+          <slot name="handleBtn"></slot>
+        </template>
+        <template v-else>
+          {{ data.record[data.column.dataIndex] }}
+        </template>
+      </template>
+    </normalTable>
+  </a-modal>
+  <slot name="slot1"></slot>
+</template>
+<script setup>
+import normalTable from '@/template/normalTable/index.vue'
+import {ref, defineProps, defineEmits} from 'vue'
+import Api from '@/api/api'
+import utils from '@/utils/utils'
+
+import {message} from 'ant-design-vue' 
+
+let emit = defineEmits(['selectRowData','close'])
+let props = defineProps({
+  title:String,
+  wdith:String
+})
+let list = ref()
+let modeVisible = ref(false)
+
+let submit = () => {
+  if (!list.value.tableRecord.length) return message.warning('请选择数据')
+  modeVisible.value = false
+  emit('selectRowData',list.value.tableRecord)
+}
+
+let closeFun = () => {
+  emit('close')
+}
+
+defineExpose({
+  modeVisible
+})
+</script>
+
+<style scoped>
+
+</style>

+ 76 - 0
src/operation/moduleNormal/areaManage/index.vue

@@ -0,0 +1,76 @@
+<template>
+  <listTemp ref="list" :param="param" :tableName="'areaTable'" :searchType="searchType" @listData="listData">
+    <template #operation>
+      <Add @onSuccess="$refs.list.tableData()"></Add>
+    </template>
+    <template #tb_cell="{data}">
+      <template v-if="data.column.dataIndex === 'operation'">
+        <Edit :data="data.record" @onSuccess="$refs.list.tableData()"></Edit>
+      </template>
+      <template v-if="data.column.dataIndex === 'isused'">
+        <span :style="{color:utils.statusAndColor(data.record.isused ? '启用' : '停用')}">{{ data.record.isused ? '启用' : '停用' }}</span>
+      </template>
+
+    </template>
+  </listTemp>
+</template>
+
+<script setup>
+import listTemp from '@/components/listTemplate/index.vue'
+import Add from './modules/Add.vue'
+import Edit from './modules/Edit.vue'
+import {ref, defineProps, defineEmits, onMounted, toRef, toRefs} from 'vue'
+import Api from '@/api/api'
+import utils from '@/utils/utils'
+let param = ref({id:20230608152602,content:{condition:''}})
+let searchType = ref([
+  {label:'搜索',key:'condition',type:'input'},
+])
+let listData = (res) => {
+  res.data = createDeep(res.data)
+}
+
+let createDeep = (array) => {
+  let arr = []
+  function deepFun (node) {
+    console.log(node,'触发');
+    let elNode = {
+      areaname:node['areaname'],
+      areanum:node['areanum'],
+      changeby:node['changeby'],
+      changeuserid:node['changeuserid'],
+      createby:node['createby'],
+      createdate:node['createdate'],
+      createuserid:node['createuserid'],
+      isused:node['isused'],
+      parentid:node['parentid'],
+      parentname:node['parentname'],
+      rowindex:node['rowindex'],
+      sequence:node['sequence'],
+      siteid:node['siteid'],
+      w_areaid:node['w_areaid'],
+      children:[]
+    }
+    if (node.sub && node.sub.length > 0) {
+      // 如果存在子节点
+      for (var index = 0; index < node.sub.length; index++) {
+      // 遍历子节点, 把每个子节点看做一颗独立的树, 传入递归构造子树, 并把结果放回到新node的children中
+      elNode.children.push(deepFun(node.sub[index]));
+      }
+    }
+    if (!elNode.children.length) delete elNode.children
+    return elNode
+  }
+  array.forEach(item => {
+    console.log(item);
+    arr.push(deepFun(item))
+  })
+  return arr
+}
+
+
+</script>
+
+<style scoped>
+
+</style>

+ 102 - 0
src/operation/moduleNormal/areaManage/modules/Add.vue

@@ -0,0 +1,102 @@
+<template>
+  <a-button type="primary" @click="visible=true">新建</a-button>
+  <a-drawer
+    v-model:visible="visible"
+    class="custom-class"
+    title="新建区域"
+    placement="right"
+    width="500px"
+    :closable="false"
+    @close="visible = false"
+  >
+    <a-form ref="formRef" :model="form" size="small" layout="vertical" mode="multiple">
+      <a-row :gutter="16">
+        <a-col :span="24">
+          <a-form-item  label="区域编码" name="areanum" :rules="[{ required: true, message: '请输入区域编码' }]">
+            <a-input v-model:value="form.areanum" placeholder="请输入区域编码"></a-input>
+          </a-form-item>
+        </a-col>
+        <a-col :span="24">
+          <a-form-item  label="区域名称" name="areaname" :rules="[{ required: true, message: '请输入区域名称' }]">
+            <a-input v-model:value="form.areaname" placeholder="请输入区域名称"></a-input>
+          </a-form-item>
+        </a-col>
+        <a-col :span="24">
+          <a-form-item  label="排序" name="sequence" :rules="[{ required: true, message: '请输入排序' }]">
+            <a-input v-model:value.number="form.sequence" placeholder="请输入排序"></a-input>
+          </a-form-item>
+        </a-col>
+        <a-col :span="24">
+          <a-form-item  label="上级区域" name="parentname">
+            <selectArea ref="Area" @selectRoles="selectAreaFun">
+              <template v-slot:input>
+                <a-input-search
+                  v-model:value="form.parentname"
+                  enter-button="添加"
+                  readonly
+                  @search="$refs.Area.modeVisible=true"
+                />
+              </template>
+            </selectArea>
+          </a-form-item>
+        </a-col>
+        <a-col :span="24">
+          <a-form-item  label="是否启用" name="isused">
+            <a-checkbox v-model:checked="form.isused"></a-checkbox>
+          </a-form-item>
+        </a-col>
+      </a-row>
+    </a-form>
+    <template #extra>
+      <a-space>
+        <a-button @click="visible=false">关闭</a-button>
+        <a-button type="primary" @click="onSubmit">保存</a-button>
+      </a-space>
+    </template>
+  </a-drawer>
+</template>
+
+<script setup>
+import {ref, defineProps, defineEmits} from 'vue'
+import selectArea from './selectArea.vue'
+import Api from '@/api/api'
+import utils from '@/utils/utils'
+let emit = defineEmits(['onSuccess'])
+let props = defineProps({})
+let searchType = ref([{label:'搜索',key:'condition',type:'input'}])
+let visible = ref(false)
+let form = ref({
+  "w_areaid": 0,
+  "areaname": "", //区域名称
+  "areanum": "", //区域编号
+  "parentid": 0, //上级ID
+  "isused": true, //是否启用
+  "sequence": 1, //排序
+  "parentname":''
+})
+let formRef = ref()
+let onSubmit = async () => {
+  let isCheck = await formRef.value.validateFields()
+  if (!isCheck) return
+  form.value.isused = form.value.isused ? 1 : 0
+  let res = await Api.requested({
+    id:20230608152402,
+    content: form.value
+  })
+  utils.message(res,'新建成功',() => {
+    visible.value = false
+    emit('onSuccess')
+    formRef.value.resetFields()
+    console.log(res);
+  })
+}
+
+let selectAreaFun = (data) => {
+  form.value.parentname = data[data.length-1].areaname
+  form.value.parentid = data[data.length-1].w_areaid
+}
+</script>
+
+<style scoped>
+
+</style>

+ 109 - 0
src/operation/moduleNormal/areaManage/modules/Edit.vue

@@ -0,0 +1,109 @@
+<template>
+  <a-button type="link" @click="editBtn" :disabled="utils.hasPermission(update)">编辑</a-button>
+  <a-drawer
+    v-model:visible="visible"
+    class="custom-class"
+    title="编辑区域"
+    placement="right"
+    width="500px"
+    :closable="false"
+    @close="visible = false"
+  >
+    <a-form ref="formRef" :model="form" size="small" layout="vertical" mode="multiple">
+      <a-row :gutter="16">
+        <a-col :span="24">
+          <a-form-item  label="区域编码" name="areanum" :rules="[{ required: true, message: '请输入区域编码' }]">
+            <a-input v-model:value="form.areanum" placeholder="请输入区域编码"></a-input>
+          </a-form-item>
+        </a-col>
+        <a-col :span="24">
+          <a-form-item  label="区域名称" name="areaname" :rules="[{ required: true, message: '请输入区域名称' }]">
+            <a-input v-model:value="form.areaname" placeholder="请输入区域名称"></a-input>
+          </a-form-item>
+        </a-col>
+        <a-col :span="24">
+          <a-form-item  label="排序" name="sequence" :rules="[{ required: true, message: '请输入排序' }]">
+            <a-input v-model:value.number="form.sequence" placeholder="请输入排序"></a-input>
+          </a-form-item>
+        </a-col>
+        <a-col :span="24">
+          <a-form-item  label="上级区域" name="parentname">
+            <selectArea ref="Area" @selectRoles="selectAreaFun">
+              <template v-slot:input>
+                <a-input-search
+                  v-model:value="form.parentname"
+                  enter-button="添加"
+                  readonly
+                  @search="$refs.Area.modeVisible=true"
+                />
+              </template>
+            </selectArea>
+          </a-form-item>
+        </a-col>
+        <a-col :span="24">
+          <a-form-item  label="是否启用" name="isused">
+            <a-checkbox v-model:checked="form.isused"></a-checkbox>
+          </a-form-item>
+        </a-col>
+      </a-row>
+    </a-form>
+    <template #extra>
+      <a-space>
+        <a-button @click="visible=false">关闭</a-button>
+        <a-button type="primary" @click="onSubmit">保存</a-button>
+      </a-space>
+    </template>
+  </a-drawer>
+</template>
+
+<script setup>
+import {ref, defineProps, defineEmits} from 'vue'
+import selectArea from './selectArea.vue'
+import Api from '@/api/api'
+import utils from '@/utils/utils'
+let emit = defineEmits(['onSuccess'])
+let props = defineProps({
+  data:String
+})
+let searchType = ref([{label:'搜索',key:'condition',type:'input'}])
+let visible = ref(false)
+let form = ref({
+  "w_areaid": 0,
+  "areaname": "", //区域名称
+  "areanum": "", //区域编号
+  "parentid": 0, //上级ID
+  "isused": 1, //是否启用
+  "sequence": 1, //排序
+  "parentname":''
+})
+let formRef = ref()
+let editBtn = () => {
+  visible.value = true
+  form.value = Object.assign({},form.value,props.data)
+  console.log(props.data);
+}
+let onSubmit = async () => {
+  let isCheck = await formRef.value.validateFields()
+  if (!isCheck) return
+  form.value.isused = form.value.isused ? 1 : 0
+  let res = await Api.requested({
+    id:20230608152402,
+    content: form.value
+  })
+  utils.message(res,'新建成功',() => {
+    visible.value = false
+    emit('onSuccess')
+    formRef.value.resetFields()
+    console.log(res);
+  })
+}
+
+let selectAreaFun = (data) => {
+  form.value.parentname = data[data.length-1].areaname
+  form.value.parentid = data[data.length-1].w_areaid
+}
+</script>
+
+<style scoped>
+
+</style>

+ 46 - 0
src/operation/moduleNormal/areaManage/modules/selectArea.vue

@@ -0,0 +1,46 @@
+<template>
+  <a-modal
+    v-model:visible="modeVisible"
+    class="custom-class"
+    title="选择角色"
+    placement="right"
+    width="1000px"
+    :closable="false"
+    @close="visible=false"
+    @ok="submit">
+    <normalTable :filterMultiple="true" rowKey="w_areaid" ref="list" size="small" :param="param" :columns="utils.TBLayout('areaTable')" @onSelect="onSelect" @handleList="handleList">
+      <template #tb_cell="{data}">
+        {{ data.record[data.column.dataIndex] }}
+      </template>
+    </normalTable>
+  </a-modal>
+  <slot name="input"></slot>
+</template>
+
+<script setup>
+import {ref, defineProps, defineEmits} from 'vue'
+import utils from '@/utils/utils'
+import normalTable from '@/template/normalTable/index.vue'
+let modeVisible = ref(false)
+let param = ref({id:20230608152602,content:{condition:''}})
+let emit = defineEmits(['selectRoles'])
+let result = ref('')
+let submit = () => {
+  emit('selectRoles',result.value)
+  modeVisible.value = false
+}
+let onSelect = (data) => {
+  console.log(data);
+  result.value = data
+}
+let handleList = (data) => {
+}
+defineExpose({
+  modeVisible,
+})
+
+</script>
+
+<style scoped>
+
+</style>

+ 84 - 0
src/operation/moduleNormal/productCategory/index.vue

@@ -0,0 +1,84 @@
+<template>
+  <listTemp ref="list" :param="param" :tableName="'categoryTable'" :searchType="searchType" @listData="listData">
+    <template #operation>
+      <Add @onSuccess="$refs.list.tableData()"></Add>
+    </template>
+    <template #tb_cell="{data}">
+      <template v-if="data.column.dataIndex === 'operation'">
+        <Edit :data="data.record" @onSuccess="$refs.list.tableData()"></Edit>
+        <customBtn
+          btnName="删 除"
+          idName="20230609105202"
+          keyName="w_prodclassid"
+          :id="data.record.w_prodclassid"
+          type="link"
+          message="确定删除当前产品分类吗?"
+          @onSuccess="$refs.list.tableData()"
+        />
+      </template>
+      <template v-if="data.column.dataIndex === 'isused'">
+          {{ data.record.isused ? '启用' : '停用' }}
+      </template>
+
+    </template>
+  </listTemp>
+</template>
+
+<script setup>
+import listTemp from '@/components/listTemplate/index.vue'
+import normalTable from '@/template/normalTable/index.vue'
+import customBtn from '@/components/customHandleBtn/index.vue'
+import Add from './modules/Add.vue'
+import Edit from './modules/Edit.vue'
+import {ref, defineProps, defineEmits} from 'vue'
+import Api from '@/api/api'
+import utils from '@/utils/utils'
+let emit = defineEmits([])
+let props = defineProps({})
+let searchType = ref([{label:'搜索',key:'condition',type:'input'}])
+let param = ref({
+    "id": 20230609105302,
+    "content": {},
+})
+let listData = (res) => {
+  res.data = createDeep(res.data)
+}
+let createDeep = (array) => {
+  let arr = []
+  function deepFun (node) {
+    console.log(node,'触发');
+    let elNode = {
+      changeby:node['changeby'],
+      changeuserid:node['changeuserid'],
+      createby:node['createby'],
+      createuserid:node['createuserid'],
+      parentid:node['parentid'],
+      prodclassname:node['prodclassname'],
+      prodclassnum:node['prodclassnum'],
+      remarks:node['remarks'],
+      sequence:node['sequence'],
+      w_prodclassid:node['w_prodclassid'],
+      parentname:node['parentname'],
+      children:[]
+    }
+    if (node.sub && node.sub.length > 0) {
+      // 如果存在子节点
+      for (var index = 0; index < node.sub.length; index++) {
+      // 遍历子节点, 把每个子节点看做一颗独立的树, 传入递归构造子树, 并把结果放回到新node的children中
+      elNode.children.push(deepFun(node.sub[index]));
+      }
+    }
+    if (!elNode.children.length) delete elNode.children
+    return elNode
+  }
+  array.forEach(item => {
+    console.log(item);
+    arr.push(deepFun(item))
+  })
+  return arr
+}
+</script>
+
+<style scoped>
+
+</style>

+ 150 - 0
src/operation/moduleNormal/productCategory/modules/Add.vue

@@ -0,0 +1,150 @@
+<template>
+  <a-button type="primary" @click="visible=true">新建</a-button>
+  <a-drawer
+    v-model:visible="visible"
+    class="custom-class"
+    title="新建产品分类"
+    placement="right"
+    width="500px"
+    :closable="false"
+    @close="visible = false"
+  >
+    <a-form ref="formRef" :model="form" size="small" layout="vertical" mode="multiple">
+      <a-row :gutter="16">
+        <a-col :span="24">
+          <a-form-item  label="编码" name="prodclassnum" :rules="[{ required: true, message: '请输入区域编码' }]">
+            <a-input v-model:value="form.prodclassnum" placeholder="请输入产品分类编码"></a-input>
+          </a-form-item>
+        </a-col>
+        <a-col :span="24">
+          <a-form-item  label="分类名称" name="prodclassname" :rules="[{ required: true, message: '请输入分类名称' }]">
+            <a-input v-model:value="form.prodclassname" placeholder="请输入分类名称"></a-input>
+          </a-form-item>
+        </a-col>
+        <a-col :span="24">
+          <a-form-item  label="排序" name="sequence" :rules="[{ required: true, message: '请输入排序' }]">
+            <a-input v-model:value.number="form.sequence" placeholder="请输入排序"></a-input>
+          </a-form-item>
+        </a-col>
+        <a-col :span="24">
+          <a-form-item  label="上级分类" name="parentname">
+            <SelectModel 
+              ref="Class" 
+              @selectRowData="selectClass" 
+              rowKey="w_prodclassid" 
+              :param="classParam" 
+              :filterMultiple="true" 
+              :columns="utils.TBLayout('categoryTable')" title="选择上级产品分类"
+              @handleList="handleList"
+            >
+              <template v-slot:slot1>
+                <a-input-search
+                  v-model:value="form.parentname"
+                  enter-button="添加"
+                  readonly
+                  @search="$refs.Class.modeVisible=true"
+                />
+              </template>
+            </SelectModel>
+          </a-form-item>
+        </a-col>
+        <a-col :span="24">
+          <a-form-item  label="说明" name="remarks">
+            <a-textarea v-model:value="form.remarks" placeholder="请输入说明"></a-textarea>
+          </a-form-item>
+        </a-col>
+      </a-row>
+    </a-form>
+    <template #extra>
+      <a-space>
+        <a-button @click="visible=false">关闭</a-button>
+        <a-button type="primary" @click="onSubmit">保存</a-button>
+      </a-space>
+    </template>
+  </a-drawer>
+</template>
+
+<script setup>
+import {ref, defineProps, defineEmits} from 'vue'
+import SelectModel from '@/components/selectModel/index.vue'
+import Api from '@/api/api'
+import utils from '@/utils/utils'
+let emit = defineEmits(['onSuccess'])
+let props = defineProps({})
+let searchType = ref([{label:'搜索',key:'condition',type:'input'}])
+let visible = ref(false)
+let form = ref({
+  "w_prodclassid": 0,
+  "prodclassname": "", //名称
+  "prodclassnum": "", //编号
+  "parentid": 0, //上级ID
+  "sequence": 1, //排序
+  "remarks": "",
+  "parentname":""
+})
+let classParam = ref({
+  "id": 20230609105302,
+  "content": {},
+})
+let formRef = ref()
+let onSubmit = async () => {
+  let res = await Api.requested({
+    id:20230609105102,
+    content: form.value
+  })
+  utils.message(res,'操作成功',() => {
+    visible.value = false
+    emit('onSuccess')
+    formRef.value.resetFields()
+    console.log(formRef.value);
+  })
+}
+
+let selectClass = (data) => {
+  console.log(data);
+  form.value.parentname = data[data.length-1].prodclassname
+  form.value.parentid = data[data.length-1].w_prodclassid
+}
+
+let handleList = (res) => {
+  console.log(res);
+  res.data = createDeep(res.data)
+}
+let createDeep = (array) => {
+  let arr = []
+  function deepFun (node) {
+    console.log(node,'触发');
+    let elNode = {
+      changeby:node['changeby'],
+      changeuserid:node['changeuserid'],
+      createby:node['createby'],
+      createuserid:node['createuserid'],
+      parentid:node['parentid'],
+      prodclassname:node['prodclassname'],
+      prodclassnum:node['prodclassnum'],
+      remarks:node['remarks'],
+      sequence:node['sequence'],
+      w_prodclassid:node['w_prodclassid'],
+      children:[]
+    }
+    if (node.sub && node.sub.length > 0) {
+      // 如果存在子节点
+      for (var index = 0; index < node.sub.length; index++) {
+      // 遍历子节点, 把每个子节点看做一颗独立的树, 传入递归构造子树, 并把结果放回到新node的children中
+      elNode.children.push(deepFun(node.sub[index]));
+      }
+    }
+    if (!elNode.children.length) delete elNode.children
+    return elNode
+  }
+  array.forEach(item => {
+    console.log(item);
+    arr.push(deepFun(item))
+  })
+  return arr
+}
+</script>
+
+<style scoped>
+
+</style>

+ 158 - 0
src/operation/moduleNormal/productCategory/modules/Edit.vue

@@ -0,0 +1,158 @@
+<template>
+  <a-button type="link" size="small" @click="editBtn">编辑</a-button>
+  <a-drawer
+    v-model:visible="visible"
+    class="custom-class"
+    title="编辑产品分类"
+    placement="right"
+    width="500px"
+    :closable="false"
+    @close="visible = false"
+  >
+    <a-form ref="formRef" :model="form" size="small" layout="vertical" mode="multiple">
+      <a-row :gutter="16">
+        <a-col :span="24">
+          <a-form-item  label="编码" name="prodclassnum" :rules="[{ required: true, message: '请输入区域编码' }]">
+            <a-input v-model:value="form.prodclassnum" placeholder="请输入产品分类编码"></a-input>
+          </a-form-item>
+        </a-col>
+        <a-col :span="24">
+          <a-form-item  label="分类名称" name="prodclassname" :rules="[{ required: true, message: '请输入分类名称' }]">
+            <a-input v-model:value="form.prodclassname" placeholder="请输入分类名称"></a-input>
+          </a-form-item>
+        </a-col>
+        <a-col :span="24">
+          <a-form-item  label="排序" name="sequence" :rules="[{ required: true, message: '请输入排序' }]">
+            <a-input v-model:value.number="form.sequence" placeholder="请输入排序"></a-input>
+          </a-form-item>
+        </a-col>
+        <a-col :span="24">
+          <a-form-item  label="上级分类" name="parentname">
+            <SelectModel 
+              ref="Class" 
+              @selectRowData="selectClass" 
+              rowKey="w_prodclassid" 
+              :param="classParam" 
+              :filterMultiple="true" 
+              :columns="utils.TBLayout('categoryTable')" title="选择上级产品分类"
+              @handleList="handleList"
+            >
+              <template v-slot:slot1>
+                <a-input-search
+                  v-model:value="form.parentname"
+                  enter-button="添加"
+                  readonly
+                  @search="$refs.Class.modeVisible=true"
+                />
+              </template>
+            </SelectModel>
+          </a-form-item>
+        </a-col>
+        <a-col :span="24">
+          <a-form-item  label="说明" name="remarks">
+            <a-textarea v-model:value="form.remarks" placeholder="请输入说明"></a-textarea>
+          </a-form-item>
+        </a-col>
+      </a-row>
+    </a-form>
+    <template #extra>
+      <a-space>
+        <a-button @click="visible=false">关闭</a-button>
+        <a-button type="primary" @click="onSubmit">保存</a-button>
+      </a-space>
+    </template>
+  </a-drawer>
+</template>
+
+<script setup>
+import {ref, defineProps, defineEmits} from 'vue'
+import SelectModel from '@/components/selectModel/index.vue'
+import Api from '@/api/api'
+import utils from '@/utils/utils'
+let emit = defineEmits(['onSuccess'])
+let props = defineProps({
+  data:Object
+})
+let searchType = ref([{label:'搜索',key:'condition',type:'input'}])
+let visible = ref(false)
+let form = ref({
+  "w_prodclassid": 0,
+  "prodclassname": "区域1", //名称
+  "prodclassnum": "001", //编号
+  "parentid": 0, //上级ID
+  "sequence": 1, //排序
+  "remarks": "2",
+  "parentname":""
+})
+let editBtn = () => {
+  console.log(props.data);
+  visible.value = true
+  form.value = Object.assign({},form.value,props.data)
+}
+let classParam = ref({
+  "id": 20230609105302,
+  "content": {},
+})
+let formRef = ref()
+let onSubmit = async () => {
+  let res = await Api.requested({
+    id:20230609105102,
+    content: form.value
+  })
+  utils.message(res,'操作成功',() => {
+    visible.value = false
+    emit('onSuccess')
+    formRef.value.resetFields()
+    console.log(res);
+  })
+}
+
+let selectClass = (data) => {
+  console.log(data);
+  form.value.parentname = data[data.length-1].prodclassname
+  form.value.parentid = data[data.length-1].w_prodclassid
+}
+
+let handleList = (res) => {
+  console.log(res);
+  res.data = createDeep(res.data)
+}
+let createDeep = (array) => {
+  let arr = []
+  function deepFun (node) {
+    console.log(node,'触发');
+    let elNode = {
+      changeby:node['changeby'],
+      changeuserid:node['changeuserid'],
+      createby:node['createby'],
+      createuserid:node['createuserid'],
+      parentid:node['parentid'],
+      prodclassname:node['prodclassname'],
+      prodclassnum:node['prodclassnum'],
+      remarks:node['remarks'],
+      sequence:node['sequence'],
+      w_prodclassid:node['w_prodclassid'],
+      parentname:node['parentname'],
+      children:[]
+    }
+    if (node.sub && node.sub.length > 0) {
+      // 如果存在子节点
+      for (var index = 0; index < node.sub.length; index++) {
+      // 遍历子节点, 把每个子节点看做一颗独立的树, 传入递归构造子树, 并把结果放回到新node的children中
+      elNode.children.push(deepFun(node.sub[index]));
+      }
+    }
+    if (!elNode.children.length) delete elNode.children
+    return elNode
+  }
+  array.forEach(item => {
+    console.log(item);
+    arr.push(deepFun(item))
+  })
+  return arr
+}
+</script>
+
+<style scoped>
+
+</style>

+ 90 - 0
src/operation/moduleNormal/productManage/detail/index.vue

@@ -0,0 +1,90 @@
+<template>
+  <div>
+    <!-- :disable="utils.isDisabled(userData.status,['ACTIVE'])" -->
+    <detail-template 
+      :headData="mainAreaData" 
+      :title="`${userData.prodname}(${userData.prodnum})`" 
+      :tabs="['详情信息','物模型','检查项']" 
+      ownertable="user" 
+      :delParam="{id:'20221031141202',content:{userids:[router.currentRoute.value.query.id]}}" 
+      >
+      <template #operation>
+        <Edit :disabled="utils.isDisabled(userData.isedit,[0])" :data="userData" @onSuccess="mianData"></Edit>
+      </template>
+      <template #tab0>
+      </template>
+      <template #tab1>
+        <a-radio-group v-model:value="currentInfoModel" :style="{ marginBottom: '8px' }" style="margin-bottom:10px">
+          <a-radio-button value="attribute">属性定义</a-radio-button>
+          <a-radio-button value="server">服务定义</a-radio-button>
+          <a-radio-button value="event">事件定义</a-radio-button>
+        </a-radio-group>
+        <AttributeTab :data="userData"></AttributeTab>
+      </template>
+    </detail-template>
+  </div>
+</template>
+
+<script setup>
+import Api from '@/api/api'
+import utils  from '@/utils/utils'
+
+import normalTable from '@/template/normalTable/index.vue'
+import detailTemplate from '@/components/detailTemplate/index.vue'
+import Edit from './modules/Edit.vue'
+import AttributeTab from './modules/attributeTab/index.vue'
+import { message, Modal } from 'ant-design-vue'
+import { ExclamationCircleOutlined } from '@ant-design/icons-vue'
+import { useRouter } from "vue-router";
+import { onMounted,ref,createVNode } from "vue"
+const router = useRouter()
+const mainAreaData = ref([])
+
+let currentInfoModel = ref('attribute')
+const userData = ref({})
+const mianData = async ()=>{
+  const res = await Api.requested({
+    "id":20230612152502,
+    "content": {
+      "w_productid": router.currentRoute.value.query.id
+    }
+  })
+  userData.value = res.data
+  console.log(userData.value);
+  changeDataStructure(res.data)
+
+}
+const changeDataStructure = (data) => {
+  mainAreaData.value = [
+    {
+      label:'产品编码',
+      value:data.prodnum
+    },
+    {
+      label:'产品名称',
+      value:data.prodname
+    },
+    {
+      label:'设备类型',
+      value:data.prodtype
+    },
+    {
+      label:'厂商',
+      value:data.enterprisename
+    },
+    {
+      label:'状态',
+      value:data.isused ? '启用':'停用'
+    },
+    {
+      label:'描述',
+      value:data.remarks
+    },
+  ]
+}
+onMounted (()=>{
+  mianData()
+})
+</script>
+<style>
+</style>

+ 159 - 0
src/operation/moduleNormal/productManage/detail/modules/Edit.vue

@@ -0,0 +1,159 @@
+<template>
+  <a-button type="primary" :disabled="disabled" @click="editBtn">编辑</a-button>
+  <a-drawer
+    v-model:visible="visible"
+    class="custom-class"
+    title="编辑产品"
+    placement="right"
+    width="500px"
+    :closable="false"
+    @close="visible = false"
+  >
+    <a-form ref="formRef" :model="form" size="small" layout="vertical" mode="multiple">
+      <a-row :gutter="16">
+        <a-col :span="24">
+          <a-form-item  label="产品编码" name="prodnum" :rules="[{ required: true, message: '请输入产品编码' }]">
+            <a-input v-model:value="form.prodnum" placeholder="请输入产品编码"></a-input>
+          </a-form-item>
+        </a-col>
+        <a-col :span="24">
+          <a-form-item  label="产品名称" name="prodname" :rules="[{ required: true, message: '请输入产品名称' }]">
+            <a-input v-model:value="form.prodname" placeholder="请输入产品名称"></a-input>
+          </a-form-item>
+        </a-col>
+        <a-col :span="24">
+          <a-form-item  label="设备类型" name="prodtype" :rules="[{ required: true, message: '请选择设备类型' }]">
+            <a-select
+              v-model:value="form.prodtype"
+              
+            >
+              <a-select-option :value="item.value" v-for="(item,index) in typeList" :key="index">{{ item.value }}</a-select-option>
+            </a-select>
+          </a-form-item>
+        </a-col>
+        <a-col :span="24">
+          <a-form-item  label="厂商" name="sys_enterpriseid" :rules="[{required:true,message:'请选择厂商'}]">
+            <a-select
+              v-model:value="form.sys_enterpriseid"
+            >
+              <a-select-option v-for="item in enterpriseList" :key="item.sys_enterpriseid" :value="item.sys_enterpriseid">{{ item.enterprisename }}</a-select-option>
+            </a-select>
+            <!-- <SelectModel 
+              ref="Class" 
+              @selectRowData="selectClass" 
+              rowKey="w_prodclassid" 
+              :param="classParam" 
+              :filterMultiple="true" 
+              :columns="utils.TBLayout('categoryTable')" title="选择厂商"
+              @handleList="handleList"
+            >
+              <template v-slot:slot1>
+                <a-input-search
+                  v-model:value="form.enterprisename"
+                  enter-button="选择"
+                  readonly
+                  @search="$refs.Class.modeVisible=true"
+                />
+              </template>
+            </SelectModel> -->
+          </a-form-item>
+        </a-col>
+        <a-col :span="24">
+          <a-form-item  label="描述" name="remarks">
+            <a-textarea v-model:value="form.remarks" placeholder="请输入描述"></a-textarea>
+          </a-form-item>
+        </a-col>
+        <a-col :span="24">
+          <a-form-item  label="是否启用" name="isused">
+            <a-checkbox v-model:checked="form.isused"></a-checkbox>
+          </a-form-item>
+        </a-col>
+      </a-row>
+    </a-form>
+    <template #extra>
+      <a-space>
+        <a-button @click="visible=false">关闭</a-button>
+        <a-button type="primary" @click="onSubmit">保存</a-button>
+      </a-space>
+    </template>
+  </a-drawer>
+</template>
+
+<script setup>
+import {ref, defineProps, defineEmits, onMounted} from 'vue'
+import SelectModel from '@/components/selectModel/index.vue'
+import Api from '@/api/api'
+import utils from '@/utils/utils'
+import { useBaseStore } from '@/stores/modules/base'
+import { storeToRefs } from 'pinia'
+
+let base = useBaseStore()
+let emit = defineEmits(['onSuccess'])
+let props = defineProps(['data','disabled'])
+let searchType = ref([{label:'搜索',key:'condition',type:'input'}])
+let visible = ref(false)
+let form = ref({
+  "w_productid": 0,
+  "w_prodclassid": 0,
+  "prodnum": "",
+  "prodname": "",
+  "prodtype": "",
+  "sys_enterpriseid": '',
+  "remarks": "",
+  "isused": 0,
+  "enterprisename":''
+})
+let classParam = ref({
+  "id": 20230609105302,
+  "content": {},
+})
+let enterpriseList = ref([])
+let typeList = ref([])
+let formRef = ref()
+let onSubmit = async () => {
+  let isCheck = await formRef.value.validateFields()
+  if (!isCheck) return
+  let res = await Api.requested({
+    id:20230609150202,
+    content: form.value
+  })
+  utils.message(res,'操作成功',() => {
+    visible.value = false
+    emit('onSuccess')
+    formRef.value.resetFields()
+    console.log(res);
+  })
+}
+
+let editBtn = () => {
+  visible.value = true
+  form.value = Object.assign({},form.value,props.data)
+}
+
+let getEnterpriseList = async () => {
+  let res = await Api.requested({
+    "id": 20230612091102,
+    "content": {
+        "pageNumber": 1,
+        "pageSize": 9999999,
+        "where": {
+            "condition": ""
+        }
+    }
+  })
+  enterpriseList.value = res.data
+  console.log(enterpriseList.value)
+}
+
+onMounted(async () => {
+  getEnterpriseList()
+  let res = await base.optiontypeselect('prodtype')
+  typeList.value = res.data
+  console.log(typeList,'分类数据');
+})
+
+</script>
+
+<style scoped>
+
+</style>

+ 65 - 0
src/operation/moduleNormal/productManage/detail/modules/attributeTab/index.vue

@@ -0,0 +1,65 @@
+<template>
+  <normalTable rowKey="w_dataparamid" ref="list" size="small" :param="param" :columns="utils.TBLayout('dataparamTable')">
+    <template #tb_cell="{data}">
+      {{ data.record[data.column.dataIndex] }}
+    </template>
+    <template #operation>
+      <div style="display:flex;margin-bottom:16px">
+        <Add :data="data"></Add>
+        <div style="margin-right:16px">
+          <span>数据类型:</span>
+          <a-select
+            ref="select"
+            v-model:value="param.content.where.datatype"
+            placeholder="选择数据类型"
+            style="width: 200px"
+          >
+            <a-select-option value="jack">Jack</a-select-option>
+          </a-select>
+        </div>
+        <div style="margin-right:16px">
+          <span>读写类型:</span>
+          <a-select
+            ref="select"
+            v-model:value="param.content.where.rwtype"
+            placeholder="选择数据类型"
+            style="width: 200px"
+          >
+            <a-select-option value="jack">Jack</a-select-option>
+          </a-select>
+        </div>
+      </div>
+      
+    </template>
+  </normalTable>
+</template>
+
+<script setup>
+import listTemp from '@/components/listTemplate/index.vue'
+import normalTable from '@/template/normalTable/index.vue'
+import Add from './modules/Add.vue'
+import {ref, defineProps, defineEmits} from 'vue'
+import Api from '@/api/api'
+import utils from '@/utils/utils'
+let emit = defineEmits([])
+let props = defineProps(['data'])
+let param = ref({
+  "id": 20230613091602,
+  "content": {
+    "ownertable": "w_product",
+    "ownerid": 1,
+    "pageNumber": 1,
+    "pageSize": 20,
+    "where": {
+        "condition": "",
+        "datatype": "",
+        "rwtype": ""
+    }
+  },
+})
+let searchType = ref([{label:'搜索',key:'condition',type:'input'}])
+</script>
+
+<style scoped>
+
+</style>

+ 160 - 0
src/operation/moduleNormal/productManage/detail/modules/attributeTab/modules/Add.vue

@@ -0,0 +1,160 @@
+<template>
+  <a-button type="primary" @click="addBtn">新建</a-button>
+  <a-drawer
+    v-model:visible="visible"
+    class="custom-class"
+    title="新建区域"
+    placement="right"
+    width="800px"
+    :closable="false"
+    @close="visible = false"
+  >
+    <a-form ref="formRef" :model="form" size="small" layout="vertical" mode="multiple">
+      <a-row :gutter="16">
+        <a-col :span="12">
+          <a-form-item  label="产品" name="prodname" :rules="[{ required: true, message: '请选择产品' }]">
+            <a-input readonly v-model:value="form.prodname" placeholder="请输入名称"></a-input>
+          </a-form-item>
+        </a-col>
+        <a-col :span="12">
+          <a-form-item  label="标识" name="paramname" :rules="[{ required: true, message: '请输入标识' }]">
+            <a-input v-model:value="form.paramname" placeholder="请输入标识"></a-input>
+          </a-form-item>
+        </a-col>
+        <a-col :span="12">
+          <a-form-item  label="参数名称" name="optionname" :rules="[{ required: true, message: '请输入参数名称' }]">
+            <a-input v-model:value.number="form.optionname" placeholder="请输入参数名称"></a-input>
+          </a-form-item>
+        </a-col>
+        <!-- <a-col :span="12">
+          <a-form-item  label="上级区域" name="parentname">
+            <selectArea ref="Area" @selectRoles="selectAreaFun">
+              <template v-slot:input>
+                <a-input-search
+                  v-model:value="form.parentname"
+                  enter-button="添加"
+                  readonly
+                  @search="$refs.Area.modeVisible=true"
+                />
+              </template>
+            </selectArea>
+          </a-form-item>
+        </a-col> -->
+        <a-col :span="12">
+          <a-form-item  label="数据类型" name="datatype" :rules="[{ required: true, message: '请输入数据类型' }]">
+            <a-select
+              v-model:value="form.datatype"
+            >
+              <a-select-option :value="item.value" v-for="(item,index) in typeList" :key="index">{{ item.value }}</a-select-option>
+            </a-select>
+          </a-form-item>
+        </a-col>
+        <a-col :span="12">
+          <a-form-item  label="单位" name="unit" :rules="[{ required: true, message: '请选择单位' }]">
+            <a-select
+              v-model:value="form.unit"
+            >
+              <a-select-option :value="item.value" v-for="(item,index) in unitList" :key="index">{{ item.value }}</a-select-option>
+            </a-select>
+          </a-form-item>
+        </a-col>
+        <a-col :span="12">
+          <a-form-item  label="系统选项分类" name="optiontypeid" :rules="[{ required: true, message: '请输入系统选项' }]">
+            <a-select
+              v-model:value="form.optiontypeid"
+              placeholder="请选择系统选项分类"
+            >
+              <a-select-option :value="item.optiontypeid" v-for="(item,index) in optionList" :key="index">{{ item.remarks }}</a-select-option>
+            </a-select>
+          </a-form-item>
+        </a-col>
+        <a-col :span="12">
+          <a-form-item  label="描述" name="remarks">
+            <a-textarea v-model:value.number="form.remarks" placeholder="请输入数据类型"></a-textarea>
+          </a-form-item>
+        </a-col>
+      </a-row>
+    </a-form>
+    <template #extra>
+      <a-space>
+        <a-button @click="visible=false">关闭</a-button>
+        <a-button type="primary" @click="onSubmit">保存</a-button>
+      </a-space>
+    </template>
+  </a-drawer>
+</template>
+
+<script setup>
+import {ref, defineProps, defineEmits, onMounted} from 'vue'
+import Api from '@/api/api'
+import utils from '@/utils/utils'
+import { useBaseStore } from '@/stores/modules/base'
+
+let base = useBaseStore()
+let emit = defineEmits(['onSuccess'])
+let props = defineProps(['data'])
+let searchType = ref([{label:'搜索',key:'condition',type:'input'}])
+let visible = ref(false)
+let form = ref({
+  "w_dataparamid": 0,
+  "ownertable": "w_product",
+  "ownerid": "",
+  "param": "bs002",
+  "paramname": "标识名称1",
+  "datatype": "int",
+  "unit": "单位",
+  "length": 101,
+  "remarks": "备注",
+  "rwtype": 0, //0 读 1写 2 上报
+  "num_scale": 3, //小数位数
+  "num_step": "1", //步长
+  "num_maxvalue": "10", //最大值
+  "num_minvalue": "1", //最小值
+  "optiontypeid": 0,
+  "prodname":''
+})
+let formRef = ref()
+let typeList = ref([])
+let optionList = ref([])
+let unitList = ref([])
+
+let addBtn = () => {
+  visible.value = true
+  form.value = Object.assign({},form.value,props.data)
+  form.value.ownerid = props.data.w_productid
+}
+let onSubmit = async () => {
+  let isCheck = await formRef.value.validateFields()
+  if (!isCheck) return
+  form.value.isused = form.value.isused ? 1 : 0
+  let res = await Api.requested({
+    id:20230608152402,
+    content: form.value
+  })
+  utils.message(res,'新建成功',() => {
+    visible.value = false
+    emit('onSuccess')
+    formRef.value.resetFields()
+    console.log(res);
+  })
+}
+
+let selectAreaFun = (data) => {
+  form.value.parentname = data[data.length-1].areaname
+  form.value.parentid = data[data.length-1].w_areaid
+}
+
+onMounted(async () => {
+  let res = await base.optiontypeselect('datatype')
+  typeList.value = res.data
+  let res2 = await base.optiontypeselect('optiontype')
+  optionList.value = res2.data
+  let res3 = await base.optiontypeselect('dataunit')
+  unitList.value = res3.data
+  console.log(optionList.value,'系统选项分类')
+})
+</script>
+
+<style scoped>
+
+</style>

+ 46 - 0
src/operation/moduleNormal/productManage/index.vue

@@ -0,0 +1,46 @@
+<template>
+  <listTemp ref="list" :param="param" :tableName="'productListTable'" keyRouteName="prodname" :searchType="searchType" :detailPage="{name:'productDetail',idname:'w_productid'}">
+    <template #operation>
+      <Add @onSuccess="$refs.list.tableData()"></Add>
+      <selectSiteProduct @onSuccess="$refs.list.tableData()"></selectSiteProduct>
+    </template>
+    <template #tb_cell="{data}">
+      <template v-if="data.column.dataIndex === 'operation'">
+      </template>
+      <template v-if="data.column.dataIndex === 'isused'">
+        <span :style="{color:utils.statusAndColor(data.record.isused ? '启用' : '停用')}">{{ data.record.isused ? '启用' : '停用' }}</span>
+      </template>
+    </template>
+  </listTemp>
+</template>
+
+<script setup>
+import listTemp from '@/components/listTemplate/index.vue'
+import normalTable from '@/template/normalTable/index.vue'
+import customBtn from '@/components/customHandleBtn/index.vue'
+import Add from './modules/Add.vue'
+import selectSiteProduct from './modules/selectSiteProduct.vue'
+import {ref, defineProps, defineEmits} from 'vue'
+import Api from '@/api/api'
+import utils from '@/utils/utils'
+let emit = defineEmits([])
+let props = defineProps({})
+let searchType = ref([{label:'搜索',key:'condition',type:'input'}])
+let param = ref({
+  "id": 20230612103202,
+  "content": {
+      "pageNumber": 1,
+      "pageSize": 20,
+      "where": {
+          "condition": "",
+          "prodtype": "",
+          "enterprisename": "",
+          "isused": "" //0,1
+      }
+  },
+})
+</script>
+
+<style scoped>
+
+</style>

+ 155 - 0
src/operation/moduleNormal/productManage/modules/Add.vue

@@ -0,0 +1,155 @@
+<template>
+  <a-button type="primary" @click="visible=true" style="margin-right:10px">新建</a-button>
+  <a-drawer
+    v-model:visible="visible"
+    class="custom-class"
+    title="新建产品"
+    placement="right"
+    width="500px"
+    :closable="false"
+    @close="visible = false"
+  >
+    <a-form ref="formRef" :model="form" size="small" layout="vertical" mode="multiple">
+      <a-row :gutter="16">
+        <a-col :span="24">
+          <a-form-item  label="产品编码" name="prodnum" :rules="[{ required: true, message: '请输入产品编码' }]">
+            <a-input v-model:value="form.prodnum" placeholder="请输入产品编码"></a-input>
+          </a-form-item>
+        </a-col>
+        <a-col :span="24">
+          <a-form-item  label="产品名称" name="prodname" :rules="[{ required: true, message: '请输入产品名称' }]">
+            <a-input v-model:value="form.prodname" placeholder="请输入产品名称"></a-input>
+          </a-form-item>
+        </a-col>
+        <a-col :span="24">
+          <a-form-item  label="设备类型" name="prodtype" :rules="[{ required: true, message: '请选择设备类型' }]">
+            <a-select
+              v-model:value="form.prodtype"
+              
+            >
+              <a-select-option :value="item.value" v-for="(item,index) in typeList" :key="index">{{ item.value }}</a-select-option>
+            </a-select>
+          </a-form-item>
+        </a-col>
+        <a-col :span="24">
+          <a-form-item  label="厂商" name="sys_enterpriseid" :rules="[{required:true,message:'请选择厂商'}]">
+            <a-select
+              v-model:value="form.sys_enterpriseid"
+            >
+              <a-select-option v-for="item in enterpriseList" :key="item.sys_enterpriseid" :value="item.sys_enterpriseid">{{ item.enterprisename }}</a-select-option>
+            </a-select>
+            <!-- <SelectModel 
+              ref="Class" 
+              @selectRowData="selectClass" 
+              rowKey="w_prodclassid" 
+              :param="classParam" 
+              :filterMultiple="true" 
+              :columns="utils.TBLayout('categoryTable')" title="选择厂商"
+              @handleList="handleList"
+            >
+              <template v-slot:slot1>
+                <a-input-search
+                  v-model:value="form.enterprisename"
+                  enter-button="选择"
+                  readonly
+                  @search="$refs.Class.modeVisible=true"
+                />
+              </template>
+            </SelectModel> -->
+          </a-form-item>
+        </a-col>
+        <a-col :span="24">
+          <a-form-item  label="描述" name="remarks">
+            <a-textarea v-model:value="form.remarks" placeholder="请输入描述"></a-textarea>
+          </a-form-item>
+        </a-col>
+        <a-col :span="24">
+          <a-form-item  label="是否启用" name="isused">
+            <a-checkbox v-model:checked="form.isused"></a-checkbox>
+          </a-form-item>
+        </a-col>
+      </a-row>
+    </a-form>
+    <template #extra>
+      <a-space>
+        <a-button @click="visible=false">关闭</a-button>
+        <a-button type="primary" @click="onSubmit">保存</a-button>
+      </a-space>
+    </template>
+  </a-drawer>
+</template>
+
+<script setup>
+import {ref, defineProps, defineEmits, onMounted} from 'vue'
+import SelectModel from '@/components/selectModel/index.vue'
+import Api from '@/api/api'
+import utils from '@/utils/utils'
+import { useBaseStore } from '@/stores/modules/base'
+import { storeToRefs } from 'pinia'
+
+let base = useBaseStore()
+let emit = defineEmits(['onSuccess'])
+let props = defineProps({})
+let searchType = ref([{label:'搜索',key:'condition',type:'input'}])
+let visible = ref(false)
+let form = ref({
+  "w_productid": 0,
+  "w_prodclassid": 0,
+  "prodnum": "",
+  "prodname": "",
+  "prodtype": "",
+  "sys_enterpriseid": '',
+  "remarks": "",
+  "isused": 0,
+  "enterprisename":''
+})
+let classParam = ref({
+  "id": 20230609105302,
+  "content": {},
+})
+let enterpriseList = ref([])
+let typeList = ref([])
+let formRef = ref()
+let onSubmit = async () => {
+  let isCheck = await formRef.value.validateFields()
+  if (!isCheck) return
+  form.value.isused = form.value.isused ? 1 : 0
+  let res = await Api.requested({
+    id:20230609150202,
+    content: form.value
+  })
+  utils.message(res,'操作成功',() => {
+    visible.value = false
+    emit('onSuccess')
+    formRef.value.resetFields()
+    console.log(res);
+  })
+}
+
+let getEnterpriseList = async () => {
+  let res = await Api.requested({
+    "id": 20230612091102,
+    "content": {
+        "pageNumber": 1,
+        "pageSize": 9999999,
+        "where": {
+            "condition": ""
+        }
+    }
+  })
+  enterpriseList.value = res.data
+  console.log(enterpriseList.value)
+}
+
+onMounted(async () => {
+  getEnterpriseList()
+  let res = await base.optiontypeselect('prodtype')
+  typeList.value = res.data
+  console.log(typeList,'分类数据');
+})
+
+</script>
+
+<style scoped>
+
+</style>

+ 202 - 0
src/operation/moduleNormal/productManage/modules/selectAllData.vue

@@ -0,0 +1,202 @@
+<template>
+  <div>
+    <a-button type="primary" class="inline-16" @click="allProduct" v-if="type=='upload'">一 键 全 选</a-button>
+    <a-button type="primary" class="inline-16" @click="allProduct" v-else>一 键 删 除</a-button>
+    <a-modal
+      v-model:visible="progressVisible"
+      class="custom-class"
+      placement="right"
+      width="500px"
+    >
+      <a-progress v-if="totalPage" :percent="Math.floor(progress / totalPage * 100)"></a-progress>
+    </a-modal>
+  </div>
+</template>
+
+<script setup>
+import listTemp from '@/components/listTemplate/index.vue'
+import normalTable from '@/template/normalTable/index.vue'
+import {ref, defineProps, defineEmits} from 'vue'
+import {Modal} from 'ant-design-vue'
+import Api from '@/api/api'
+import utils from '@/utils/utils'
+let emit = defineEmits(['handlePullApi','handleUploadApi','onSuccess','emitCallBack'])
+let props = defineProps({
+  dataSize: {
+    type:[Number,String],
+    default:() => 200
+  },
+  total: {
+    type:[Number,String],
+    default:() => 0
+  },
+  type: {
+    type:String,
+    default:() => 'upload'
+  },
+  idName: {
+    type: [Number,String]
+  },
+  dataType:{
+    type:[String],
+    default:() => '商品'
+  },
+  disabled:{
+    type:[]
+  },
+  isEmit: {
+    type: Object,
+    default:() => false
+  }
+})
+
+let totalPage = ref(0)
+let progress = ref(0)
+let progressVisible = ref(false)
+let deleteIds = ref([])
+
+let allProduct = () => {
+  if (props.total > props.dataSize) {
+    Modal.confirm({
+      title:'提示',
+      content:`总共有${props.total}个${props.dataType},是否确定${props.type == 'upload' ? '提交' : '删除'}`,
+      async onOk() {
+        /* 打断 */
+        if (props.isEmit) {
+          emit('emitCallBack',() => {
+            progressVisible.value = true
+            props.type == 'upload' ? totalPage.value = Math.ceil(props.total / props.dataSize) * 2 : totalPage.value = Math.ceil(props.total / props.dataSize)
+            let totalPages = Math.ceil(props.total / props.dataSize)
+            for (let index = 1; index <= totalPages; index++) {
+              pullData(index)
+            }
+          })
+        } else {
+          progressVisible.value = true
+          props.type == 'upload' ? totalPage.value = Math.ceil(total.value / props.dataSize) * 2 : totalPage.value = Math.ceil(props.total / props.dataSize)
+          let totalPage = Math.ceil(props.total / props.dataSize)
+          for (let index = 1; index <= totalPage; index++) {
+            pullData(index)
+          }
+        }
+      },
+    })
+  } else {
+    Modal.confirm({
+      title:'提示',
+      content:`总共有${props.total}个${props.dataType},是否确定${props.type == 'upload' ? '提交' : '删除'}`,
+      async onOk() {
+        if (!props.total) return
+        if(props.isEmit) {
+          return emit('emitCallBack',async () => {
+            let pullApi = {}
+            /**
+             * 暴露出去操作 修改拉取请求  
+             * @param pullApi - 拉取数据的请求接口
+            */
+            emit('handlePullApi',pullApi)
+            pullApi.content.pageNumber = 1
+            pullApi.content.pageSize = props.dataSize
+
+            const res = await Api.requested(pullApi)
+
+            if (props.type == 'upload') {
+              let uploadApi = {}
+              /**
+               * 暴露出去操作 修改上传请求
+               * @param1 uploadApi - 上传接口
+               * @param2 res.data - 拉取的上传数据
+               */
+              emit('handleUploadApi',uploadApi,res.data)
+
+              const res2 = await Api.requested(uploadApi)
+              utils.message(res2,'添加成功',() => {
+                emit('onSuccess',res2.data)
+              })
+            } else {
+              deleteIds.value.push(...res.data.map(item => item[props.idName]))
+              deleteOrderProduct(deleteIds.value)
+            }
+          })
+        }
+        let pullApi = {}
+        /**
+         * 暴露出去操作 修改拉取请求  
+         * @param pullApi - 拉取数据的请求接口
+        */
+        emit('handlePullApi',pullApi)
+        pullApi.content.pageNumber = 1
+        pullApi.content.pageSize = props.dataSize
+
+        const res = await Api.requested(pullApi)
+
+        if (props.type == 'upload') {
+          let uploadApi = {}
+          /**
+           * 暴露出去操作 修改上传请求
+           * @param1 uploadApi - 上传接口
+           * @param2 res.data - 拉取的上传数据
+           */
+          emit('handleUploadApi',uploadApi,res.data)
+
+          const res2 = await Api.requested(uploadApi)
+          utils.message(res2,() => {
+            emit('onSuccess',res2.data)
+          })
+        } else {
+          deleteIds.value.push(...res.data.map(item => item[props.idName]))
+          deleteOrderProduct(deleteIds.value)
+        }
+      },
+    })
+  }
+}
+/* 拉取数据 */
+let pullData = async (page) => {
+  let pullApi = {}
+  /**
+   * 暴露出去操作 修改拉取请求  
+   * @param pullApi - 拉取数据的请求接口
+  */
+  emit('handlePullApi',pullApi)
+  pullApi.content.pageNumber = page
+  pullApi.content.pageSize = props.dataSize
+  const res = await Api.requested(pullApi)
+  progress.value++
+  if (props.type == 'upload') {
+    uploadData(res.data)
+    if (progress.value >= totalPage.value) {
+      emit('onSuccess')
+      progressVisible.value = false
+      progress.value = 0
+    }
+  } else {
+    deleteIds.value.push(...res.data.map(item => item[props.idName]))
+    if (progress.value >= totalPage.value) {
+      deleteOrderProduct(deleteIds.value)
+      progressVisible.value = false
+    }
+  }
+}
+/* 添加数据 */
+let uploadData = async (data) => {
+  let uploadApi = {}
+  /**
+   * 暴露出去操作 修改上传请求
+   * @param1 uploadApi - 上传接口
+   * @param2 res.data - 拉取的上传数据
+   */
+  emit('handleUploadApi',uploadApi,data)
+  const res = await Api.requested(uploadApi)
+  progress.value++
+  if (progress.value >= totalPage.value) {
+    emit('onSuccess')
+    progressVisible.value = false
+    progress.value = 0
+  }
+}
+</script>
+
+<style scoped>
+
+</style>

+ 285 - 0
src/operation/moduleNormal/productManage/modules/selectSiteProduct.vue

@@ -0,0 +1,285 @@
+<template>
+  <a-drawer
+    v-model:visible="modeVisible"
+    class="custom-class"
+    title="自产品库添加"
+    placement="right"
+    width="1200px"
+    :closable="false"
+    @close="modeVisible = false"
+  >
+    <div style="margin-bottom:16px;display:flex">
+      <a-button type="primary" @click="handleAdd" style="margin-right:25px" :disabled="handleBtnDisabled">批量添加</a-button>
+      
+      <selectAllData 
+        style="margin-right: 25px"
+        :total="total"
+        @handlePullApi="handlePullApi"
+        @handleUploadApi="handleUploadApi"
+        @onSuccess="emit('onSuccess')"
+        @emitCallBack="emitCallBack"
+        :isEmit="true"
+      ></selectAllData>
+
+      <div style="margin-right: 25px;">
+        <span>搜索:</span>
+        <a-input v-model:value="param.content.where.condition" placeholder="产品编码/名称" style="width:200px"></a-input>
+      </div>
+      <div style="margin-right: 25px;">
+        <span>设备类型:</span>
+        <a-select
+          v-model:value="param.content.where.prodtype"
+          style="width:200px"
+          placeholder="请选择设备类型"
+          @change="$refs.list.listData()"
+          allowClear
+        >
+          <a-select-option :value="item.value" v-for="(item,index) in typeList" :key="index">{{ item.value }}</a-select-option>
+        </a-select>
+      </div>
+      <div>
+        <span>厂商:</span>
+        <a-select
+        style="width:200px"
+          v-model:value="param.content.where.enterprisename"
+          @change="$refs.list.listData()"
+          allowClear
+        >
+          <a-select-option v-for="item in enterpriseList" :key="item.sys_enterpriseid" :value="item.sys_enterpriseid">{{ item.enterprisename }}</a-select-option>
+        </a-select>
+      </div>
+    </div>
+    <normalTable rowKey="w_productid" ref="list" size="small" :param="param" :columns="utils.TBLayout('productListTable')" @onSelect="onSelect" @handleList="handleProduct">
+      <template #tb_cell="{data}">
+        <template v-if="data.column.dataIndex === 'operation'">
+          <a-button type="link" size="small" @click="addProduct(data.record)">添加</a-button>
+        </template>
+        <template v-else>
+          {{ data.record[data.column.dataIndex] }}
+        </template>
+      </template>
+    </normalTable>
+    <template #extra>
+      <a-space>
+        <a-button @click="visible=false">关闭</a-button>
+      </a-space>
+    </template>
+  </a-drawer>
+  <SelectModel 
+    ref="Class" 
+    @selectRowData="selectClass" 
+    rowKey="w_prodclassid" 
+    :param="classParam" 
+    :filterMultiple="true" 
+    :columns="utils.TBLayout('categoryTable')" title="选择产品分类"
+    @handleList="handleList"
+    @close="classClose"
+  >
+  </SelectModel>
+  <a-button type="primary" @click="modeVisible=true">自产品库添加</a-button>
+</template>
+<script setup>
+import normalTable from '@/template/normalTable/index.vue'
+import selectAllData from './selectAllData.vue'
+import SelectModel from '@/components/selectModel/index.vue'
+import { useBaseStore } from '@/stores/modules/base'
+import {ref, defineProps, defineEmits, onMounted, computed} from 'vue'
+import { useRouter } from 'vue-router'
+import Api from '@/api/api'
+import utils from '@/utils/utils'
+
+import {message} from 'ant-design-vue' 
+
+let router = useRouter()
+let base = useBaseStore()
+let emit = defineEmits(['selectRowData','onSuccess'])
+let props = defineProps({
+})
+let param = ref({
+    "id": 20230612101702,
+    "content": {
+      "pageNumber": 1,
+      "pageSize": 20,
+      "where": {
+          "condition": "",
+          "prodtype": "",
+          "enterprisename": ""
+      }
+    },
+})
+let classParam = ref({
+  "id": 20230609105302,
+  "content": {},
+})
+let Class = ref()
+let typeList = ref([])
+let enterpriseList = ref([])
+let list = ref()
+let selectRowData = ref([])
+let selectOneData = ref({})
+let modeVisible = ref(false)
+let cacheFun = ref('')
+let selectClassArr = ref([])
+let total = ref(0)
+
+let addProduct = (data) => {
+  actionClassSelect(data)
+}
+
+let handleAdd = async () => {
+  Class.value.modeVisible = true
+}
+
+let onSelect = (data) => {
+  selectRowData.value = data
+}
+
+let handleBtnDisabled = computed(() => {
+  return selectRowData.value.length > 0 ? false : true
+})
+
+let emitCallBack = (fun) => {
+  cacheFun.value = fun
+  Class.value.modeVisible = true
+}
+
+/* 选中产品分类 */
+let selectClass = async (data) => {
+  let res
+  selectClassArr.value = data
+  if (cacheFun.value) {
+    cacheFun.value()
+    return
+  }
+  if (Object.keys(selectOneData.value).length) {
+    res = await Api.requested({
+      "id": 20230612112302,
+      "content": {
+        "items": [
+            {
+                "w_productid": selectOneData.value.w_productid,
+                "w_prodclassid": data[data.length - 1].w_prodclassid
+            }
+        ]
+      },
+    })
+  } else {
+    let items = selectRowData.value.map(item => {
+      return {
+        "w_productid":item.w_productid,
+        "w_prodclassid":data[data.length - 1].w_prodclassid
+      }
+    })
+
+    res = await Api.requested({
+      "id": 20230612112302,
+      "content": {
+        "items": items
+      },
+    })
+  }
+  utils.message(res,'添加成功',() => {
+    emit('onSuccess')
+    selectOneData.value = []
+  })
+}
+
+let classClose = () => {
+  selectOneData.value = []
+}
+
+/* 激活分类选择窗口 */
+let actionClassSelect = (data) => {
+  Class.value.modeVisible = true
+  selectOneData.value = data
+}
+
+let getEnterpriseList = async () => {
+  let res = await Api.requested({
+    "id": 20230612091102,
+    "content": {
+        "pageNumber": 1,
+        "pageSize": 9999999,
+        "where": {
+            "condition": ""
+        }
+    }
+  })
+  enterpriseList.value = res.data
+  console.log(enterpriseList.value)
+}
+
+/*改变产品分类列表数据结构 sub:[] => children:[] */
+let handleList = (res) => {
+  res.data = createDeep(res.data)
+}
+let handleProduct = (res) => {
+  total.value =res.total
+}
+let createDeep = (array) => {
+  let arr = []
+  function deepFun (node) {
+    console.log(node,'触发');
+    let elNode = {
+      changeby:node['changeby'],
+      changeuserid:node['changeuserid'],
+      createby:node['createby'],
+      createuserid:node['createuserid'],
+      parentid:node['parentid'],
+      prodclassname:node['prodclassname'],
+      prodclassnum:node['prodclassnum'],
+      remarks:node['remarks'],
+      sequence:node['sequence'],
+      w_prodclassid:node['w_prodclassid'],
+      children:[]
+    }
+    if (node.sub && node.sub.length > 0) {
+      // 如果存在子节点
+      for (var index = 0; index < node.sub.length; index++) {
+      // 遍历子节点, 把每个子节点看做一颗独立的树, 传入递归构造子树, 并把结果放回到新node的children中
+      elNode.children.push(deepFun(node.sub[index]));
+      }
+    }
+    if (!elNode.children.length) delete elNode.children
+    return elNode
+  }
+  array.forEach(item => {
+    console.log(item);
+    arr.push(deepFun(item))
+  })
+  return arr
+}
+
+/*拉取数据*/
+let handlePullApi = (pullApi) => {
+  pullApi.content = JSON.parse(JSON.stringify(param.value.content))
+  pullApi.id = param.value.id
+  /*pullApi.content.sa_projectid = this.$route.query.id*/
+}
+/*上传数据*/
+let handleUploadApi = (uploadApi,data) => {
+  uploadApi.id = 20230612112302
+  uploadApi.content = {
+    "items": data.map(e=>{
+      return {
+        "w_productid":e.w_productid,
+        "w_prodclassid":selectClassArr.value[selectClassArr.value.length - 1].w_prodclassid,
+      }
+    })
+  }
+}
+
+onMounted(async () => {
+  getEnterpriseList()
+  let res = await base.optiontypeselect('prodtype')
+  typeList.value = res.data
+})
+
+defineExpose({
+  modeVisible
+})
+</script>
+
+<style scoped>
+
+</style>

+ 38 - 2
src/router/modelNormal.js

@@ -60,7 +60,7 @@ const moduleNormal = [
     component: () => import(/* webpackChunkName: "about" */ '@/operation/moduleNormal/roleManage/detail/index.vue')
   },
   {
-    path: '/vacation',
+    path: '/vacationmag',
     name: 'vacation',
     meta: {
       title: '节假日管理',
@@ -118,8 +118,44 @@ const moduleNormal = [
       keepAlive:false
     },
     component: () => import(/* webpackChunkName: "about" */ '@/operation/moduleNormal/depManage/detail/index.vue')
+  },{
+    path: '/areaManage',
+    name: 'areaManage',
+    meta: {
+      title: '区域管理',
+      name: 'areaManage',
+      keepAlive:false
+    },
+    component: () => import(/* webpackChunkName: "about" */ '@/operation/moduleNormal/areaManage/index.vue')
+  },{
+    path: '/productcategory',
+    name: 'productcategory',
+    meta: {
+      title: '产品分类',
+      name: 'productcategory',
+      keepAlive:false
+    },
+    component: () => import(/* webpackChunkName: "about" */ '@/operation/moduleNormal/productCategory/index.vue')
+  },{
+    path: '/productmag',
+    name: 'bs_productmag',
+    meta: {
+      title: '产品管理',
+      name: 'bs_productmag',
+      keepAlive:false
+    },
+    component: () => import(/* webpackChunkName: "about" */ '@/operation/moduleNormal/productManage/index.vue')
+  },{
+    path: '/productDetail',
+    name: 'productDetail',
+    meta: {
+      title: '产品详情',
+      name: 'bs_productmag',
+      keepAlive:false
+    },
+    component: () => import(/* webpackChunkName: "about" */ '@/operation/moduleNormal/productManage/detail/index.vue')
   },
-
+  
 
 ];
 export default moduleNormal;

+ 19 - 0
src/stores/modules/base.js

@@ -30,6 +30,25 @@ export const useBaseStore = defineStore('base', {
   },
   getters:{},
   actions:{
+    // 系统选项分类查询
+    optiontypeselect (param) {
+      return new Promise(async (reslove,reject)=>{
+        let obj = {
+          "classname": "sysmanage.develop.optiontype.optiontype",
+          "method": "optiontypeselect",
+          "content": {
+            "pageNumber": 1,
+            "pageSize": 1000,
+            "typename": param,
+            "parameter": {
+            },
+          }
+        }
+        const res = await Api.requested(obj)
+
+        reslove(res)
+      })
+    },
     // 查询省市县数据
     async ProvincesData () {
       const res = await Api.requested({

+ 4 - 2
src/template/normalTable/index.vue

@@ -51,7 +51,7 @@
   const data = ref([])
   const selectedRowKeys = ref([])
   const total = ref(0)
-  const emit = defineEmits(['onSelect','listData'])
+  const emit = defineEmits(['onSelect','listData','handleList'])
 
   const onSelectChange =(changableRowKeys, selectedRows)=>{
     selectedRowKeys.value = changableRowKeys;
@@ -67,6 +67,7 @@
     loading.value = true
     props.param.content.tableid = props.tableid
     const res = await Api.requested(props.param)
+    emit('handleList',res)
     data.value = res.data
     total.value = res.total
     loading.value = false
@@ -96,7 +97,8 @@
   })
   defineExpose({
     listData,
-    reloadSelect
+    reloadSelect,
+    tableRecord
   })
 </script>
 <style>

Some files were not shown because too many files changed in this diff