Ver Fonte

Merge remote-tracking branch 'origin/master'

# Conflicts:
#	dist/assets/Htabs-6a2259c7.js
#	dist/assets/base-29f10e2c.js
#	dist/assets/index-193a7542.js
#	dist/assets/index-1b2cecc0.js
#	dist/assets/index-25b30c7b.js
#	dist/assets/index-266922e0.js
#	dist/assets/index-29e48cdb.js
#	dist/assets/index-2c4585ff.js
#	dist/assets/index-319082d6.js
#	dist/assets/index-4005abd0.js
#	dist/assets/index-481a32f3.js
#	dist/assets/index-4de2d18f.js
#	dist/assets/index-5dd52eb3.js
#	dist/assets/index-5de8efc3.js
#	dist/assets/index-83778c1f.js
#	dist/assets/index-91897496.js
#	dist/assets/index-946405fd.js
#	dist/assets/index-951ef38d.js
#	dist/assets/index-992c0be5.js
#	dist/assets/index-c6d31b44.js
#	dist/assets/index-c833cf41.js
#	dist/assets/index-e633ab9a.js
#	dist/assets/login-9a355dea.js
#	dist/dist.zip
#	dist/index.html
#	dist/manage/assets/Htabs-5dc26c5e.js
#	dist/manage/assets/base-e06a1159.js
#	dist/manage/assets/index-059d71e8.js
#	dist/manage/assets/index-0911382d.js
#	dist/manage/assets/index-0dfdd2b3.js
#	dist/manage/assets/index-131f8cfa.js
#	dist/manage/assets/index-269a2be0.js
#	dist/manage/assets/index-3a75d362.js
#	dist/manage/assets/index-51fca666.js
#	dist/manage/assets/index-5938b5c4.js
#	dist/manage/assets/index-5c5ad8d8.js
#	dist/manage/assets/index-7b64120e.js
#	dist/manage/assets/index-7e3e1f71.js
#	dist/manage/assets/index-7fa624ae.js
#	dist/manage/assets/index-84c1e8d2.js
#	dist/manage/assets/index-8766b919.js
#	dist/manage/assets/index-96c53130.js
#	dist/manage/assets/index-a308502f.js
#	dist/manage/assets/index-b98d05c8.js
#	dist/manage/assets/index-bbfc1c08.js
#	dist/manage/assets/index-c542caa5.js
#	dist/manage/assets/index-e88660a2.js
#	dist/manage/assets/index-fd978cd1.js
#	dist/manage/assets/login-9c7cee10.js
#	dist/manage/index.html
qymljy há 2 anos atrás
pai
commit
1f21f009c6
81 ficheiros alterados com 1570 adições e 12 exclusões
  1. 1 0
      dist/assets/Htabs-6a2259c7.js
  2. 0 0
      dist/assets/index-193a7542.js
  3. 0 0
      dist/assets/index-1b2cecc0.js
  4. 0 0
      dist/assets/index-25b30c7b.js
  5. 0 0
      dist/assets/index-266922e0.js
  6. 0 0
      dist/assets/index-29e48cdb.js
  7. 0 0
      dist/assets/index-2acbad22.js
  8. 0 0
      dist/assets/index-2c4585ff.js
  9. 1 0
      dist/assets/index-319082d6.js
  10. 0 0
      dist/assets/index-4005abd0.js
  11. 0 0
      dist/assets/index-481a32f3.js
  12. 0 0
      dist/assets/index-49d33020.js
  13. 0 0
      dist/assets/index-4de2d18f.js
  14. 1 0
      dist/assets/index-5dd52eb3.js
  15. 1 0
      dist/assets/index-5de8efc3.js
  16. 1 0
      dist/assets/index-79a5a254.css
  17. 0 0
      dist/assets/index-83778c1f.js
  18. 0 0
      dist/assets/index-8c12f446.js
  19. 0 0
      dist/assets/index-91897496.js
  20. 0 0
      dist/assets/index-946405fd.js
  21. 0 0
      dist/assets/index-951ef38d.js
  22. 0 0
      dist/assets/index-992c0be5.js
  23. 0 0
      dist/assets/index-c6d31b44.js
  24. 1 0
      dist/assets/index-c833cf41.js
  25. 0 0
      dist/assets/index-c92a1603.js
  26. 0 0
      dist/assets/index-e633ab9a.js
  27. 0 0
      dist/assets/index-ed9b157d.js
  28. 8 0
      dist/assets/login-9a355dea.js
  29. BIN
      dist/dist.zip
  30. 17 0
      dist/index.html
  31. 1 0
      dist/manage/assets/Htabs-5dc26c5e.js
  32. 0 0
      dist/manage/assets/base-e06a1159.js
  33. 0 0
      dist/manage/assets/index-059d71e8.js
  34. 0 0
      dist/manage/assets/index-0911382d.js
  35. 0 0
      dist/manage/assets/index-0dfdd2b3.js
  36. 0 0
      dist/manage/assets/index-131f8cfa.js
  37. 1 0
      dist/manage/assets/index-269a2be0.js
  38. 1 0
      dist/manage/assets/index-3a75d362.js
  39. 0 0
      dist/manage/assets/index-3a790dd7.js
  40. 0 0
      dist/manage/assets/index-51fca666.js
  41. 1 0
      dist/manage/assets/index-5938b5c4.js
  42. 0 0
      dist/manage/assets/index-5c5ad8d8.js
  43. 0 0
      dist/manage/assets/index-6ef669a7.js
  44. 0 0
      dist/manage/assets/index-7b64120e.js
  45. 0 0
      dist/manage/assets/index-7e3e1f71.js
  46. 0 0
      dist/manage/assets/index-7fa624ae.js
  47. 0 0
      dist/manage/assets/index-84c1e8d2.js
  48. 0 0
      dist/manage/assets/index-8766b919.js
  49. 0 0
      dist/manage/assets/index-96c53130.js
  50. 0 0
      dist/manage/assets/index-98d67121.js
  51. 0 0
      dist/manage/assets/index-a308502f.js
  52. 0 0
      dist/manage/assets/index-aaaabacf.js
  53. 0 0
      dist/manage/assets/index-b98d05c8.js
  54. 0 0
      dist/manage/assets/index-bbfc1c08.js
  55. 1 0
      dist/manage/assets/index-be38b662.css
  56. 1 0
      dist/manage/assets/index-c4eefd2e.js
  57. 0 0
      dist/manage/assets/index-c542caa5.js
  58. 0 0
      dist/manage/assets/index-e88660a2.js
  59. 0 0
      dist/manage/assets/index-f023eca5.js
  60. 1 0
      dist/manage/assets/index-f0422f3e.js
  61. 0 0
      dist/manage/assets/index-fd978cd1.js
  62. 8 0
      dist/manage/assets/login-9c7cee10.js
  63. 17 0
      dist/manage/index.html
  64. 23 2
      src/operation/moduleNormal/equipmentMag/detail/index.vue
  65. 98 0
      src/operation/moduleNormal/equipmentMag/detail/modules/attributeTab/index.vue
  66. 204 0
      src/operation/moduleNormal/equipmentMag/detail/modules/attributeTab/modules/Add.vue
  67. 201 0
      src/operation/moduleNormal/equipmentMag/detail/modules/attributeTab/modules/Edit.vue
  68. 134 0
      src/operation/moduleNormal/equipmentMag/detail/modules/eventTab/index.vue
  69. 170 0
      src/operation/moduleNormal/equipmentMag/detail/modules/eventTab/modules/Add.vue
  70. 171 0
      src/operation/moduleNormal/equipmentMag/detail/modules/eventTab/modules/Edit.vue
  71. 99 0
      src/operation/moduleNormal/equipmentMag/detail/modules/serveTable/index.vue
  72. 196 0
      src/operation/moduleNormal/equipmentMag/detail/modules/serveTable/modules/Add.vue
  73. 198 0
      src/operation/moduleNormal/equipmentMag/detail/modules/serveTable/modules/Edit.vue
  74. 1 1
      src/operation/moduleNormal/productCategory/index.vue
  75. 0 1
      src/operation/moduleNormal/productManage/detail/index.vue
  76. 3 1
      src/operation/moduleNormal/productManage/detail/modules/attributeTab/modules/Add.vue
  77. 3 1
      src/operation/moduleNormal/productManage/detail/modules/attributeTab/modules/Edit.vue
  78. 2 2
      src/operation/moduleNormal/productManage/detail/modules/serveTable/modules/Add.vue
  79. 2 2
      src/operation/moduleNormal/productManage/detail/modules/serveTable/modules/Edit.vue
  80. 1 1
      src/operation/moduleNormal/productManage/modules/selectSiteProduct.vue
  81. 1 1
      src/template/normalTable/index.vue

+ 1 - 0
dist/assets/Htabs-6a2259c7.js

@@ -0,0 +1 @@
+import{d as i,r}from"./index-83778c1f.js";const u=i("routeTabs",{state:()=>({historyRoutes:[]}),getters:{},actions:{saveRoute(e){this.historyRoutes.some(o=>o.name==e.meta.name)||this.historyRoutes.push(e)},delRoute(e,s){if(r.options.routes[1].children.forEach(t=>{t.name==e&&(t.meta.keepAlive=!1,t.meta.name=t.name)}),this.historyRoutes=this.historyRoutes.filter(t=>{if(t.meta.name!==e)return t}),e===s&&(console.log(this.historyRoutes),this.historyRoutes[0]))return r.replace({name:this.historyRoutes[0].meta.name})}}});export{u};

Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
dist/assets/index-193a7542.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
dist/assets/index-1b2cecc0.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
dist/assets/index-25b30c7b.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
dist/assets/index-266922e0.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
dist/assets/index-29e48cdb.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
dist/assets/index-2acbad22.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
dist/assets/index-2c4585ff.js


+ 1 - 0
dist/assets/index-319082d6.js

@@ -0,0 +1 @@
+import{M as o,A as c,e as l}from"./index-83778c1f.js";import{U as m,V as d,a3 as u,X as p,G as y,a4 as g,u as f}from"./vue-9b2e4ac7.js";const k={__name:"index",props:{type:String,btnName:String,message:String,idName:String,keyName:String,id:[String,Number],paramData:{type:Array,default(){return[]}},size:String,disabled:{type:Boolean,default(){return!1}}},emits:["onSuccess"],setup(e,{emit:i}){const t=e;let r=()=>{o.confirm({title:t.message||"确定操作当前数据吗?",async onOk(){let a={content:{}};a.id=t.idName,a.content[t.keyName]=t.id,t.paramData.forEach(n=>{a.content[n.key]=n.value});let s=await c.requested(a);l.message(s,"操作成功",()=>{i("onSuccess")})},onCancel(){}})};return(a,s)=>{const n=m("a-button");return d(),u(n,{type:e.type?e.type:"primary",onClick:f(r),size:e.size||"small",disabled:e.disabled},{default:p(()=>[y(g(e.btnName),1)]),_:1},8,["type","onClick","size","disabled"])}}};export{k as _};

Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
dist/assets/index-4005abd0.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
dist/assets/index-481a32f3.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
dist/assets/index-49d33020.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
dist/assets/index-4de2d18f.js


+ 1 - 0
dist/assets/index-5dd52eb3.js

@@ -0,0 +1 @@
+import{l as n}from"./index-2c4585ff.js";import{a as e,o as s,V as p,W as i,j as c,X as l,u as a}from"./vue-9b2e4ac7.js";import"./vue-router-d1c3bcbb.js";/* empty css                                                              */import"./index-83778c1f.js";import"./base-29f10e2c.js";import"./_plugin-vue_export-helper-c27b6911.js";const g={__name:"index",setup(m){const t=e();let r=e([{label:"范围",key:"isnext",type:"select",dataSource:[{remarks:"今年",value:"0"},{remarks:"明年",value:"1"}]},{label:"时间范围",key:"dateRange",type:"datepickerRange",objKeys:["begindate","enddate"]}]),o=e({content:{pageNumber:1,pageSize:20,isnext:0,where:{condition:""}},id:20221215165504});return s(()=>{}),(u,d)=>(p(),i("div",null,[c(n,{ref_key:"list",ref:t,keyRouteName:"accountno",param:a(o),tableName:"vacationTable",searchType:a(r)},{operation:l(()=>[]),_:1},8,["param","searchType"])]))}};export{g as default};

+ 1 - 0
dist/assets/index-5de8efc3.js

@@ -0,0 +1 @@
+import{n as k}from"./index-e633ab9a.js";import{m as v}from"./index-83778c1f.js";import{a as r,U as D,V as m,W as c,j as d,X as u,ab as R,R as f,F as p,G as _,a4 as x,u as l,H as y}from"./vue-9b2e4ac7.js";const B={__name:"index",props:{title:String,wdith:String},emits:["selectRowData","close"],setup(o,{expose:b,emit:n}){let s=r(),e=r(!1),g=()=>{if(!s.value.tableRecord.length)return v.warning("请选择数据");e.value=!1,n("selectRowData",s.value.tableRecord)},w=()=>{n("close")};return b({modeVisible:e}),(a,i)=>{const h=D("a-modal");return m(),c(p,null,[d(h,{visible:l(e),"onUpdate:visible":i[0]||(i[0]=t=>y(e)?e.value=t:e=t),class:"custom-class",title:o.title||"标题",placement:"right",width:o.wdith||"1000px",closable:!1,onClose:l(w),onOk:l(g)},{default:u(()=>[d(k,R(a.$attrs,{ref_key:"list",ref:s,size:"small",onListData:a.listData}),{tb_cell:u(({data:t})=>[t.column.dataIndex==="operation"?f(a.$slots,"handleBtn",{key:0}):(m(),c(p,{key:1},[_(x(t.record[t.column.dataIndex]),1)],64))]),_:3},16,["onListData"])]),_:3},8,["visible","title","width","onClose","onOk"]),f(a.$slots,"slot1")],64)}}};export{B as _};

+ 1 - 0
dist/assets/index-79a5a254.css

@@ -0,0 +1 @@
+.mainAreaPanel[data-v-9fa5ccaa]{flex:1 1 230px;width:230px;margin:10px 10px 0 0;padding:10px;background:#fff}.listPanel[data-v-9fa5ccaa]{flex:1 1 auto;width:calc(100% - 280px)}

Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
dist/assets/index-83778c1f.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
dist/assets/index-8c12f446.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
dist/assets/index-91897496.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
dist/assets/index-946405fd.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
dist/assets/index-951ef38d.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
dist/assets/index-992c0be5.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
dist/assets/index-c6d31b44.js


+ 1 - 0
dist/assets/index-c833cf41.js

@@ -0,0 +1 @@
+import{l as d}from"./index-2c4585ff.js";import{A as m}from"./index-83778c1f.js";import{u}from"./vue-router-d1c3bcbb.js";import{_ as f}from"./_plugin-vue_export-helper-c27b6911.js";import{a as s,U as x,V as r,W as y,j as b,X as n,u as i,G as g,a3 as h,$ as k,a4 as w,a6 as B}from"./vue-9b2e4ac7.js";/* empty css                                                              */import"./base-29f10e2c.js";const N={class:"y-container"},v=["onClick"],A={__name:"index",setup(S){u();let c=s([]);s([]);let p=s({content:{pageNumber:1,pageSize:20,systemappid:JSON.parse(sessionStorage.getItem("app")).systemappid},id:20221213094401});const l=()=>{let t=window.location.href,e=t.indexOf("/"),a=0;for(;e!=-1;)if(a++,e=t.indexOf("/",e+1),a++==3)return t.slice(0,e)},_=async t=>{console.log("http://60.204.153.188/");let e=await m.requested({id:20221213094501,content:{sys_reportid:t.sys_reportid,dataid:0}});window.open(l()+e.data)};return(t,e)=>{const a=x("a-button");return r(),y("div",N,[b(d,{columns:i(c),param:i(p),tableName:"reportcenterTable"},{operation:n(()=>[g(" 报表中心 ")]),tb_cell:n(({data:o})=>[o.column.dataIndex=="name"?(r(),h(a,{key:0,type:"link"},{default:n(()=>[k("span",{class:"btn-link",onClick:C=>_(o.record)},w(o.record.name),9,v)]),_:2},1024)):B("",!0)]),_:1},8,["columns","param"])])}}},U=f(A,[["__scopeId","data-v-103da97b"]]);export{U as default};

Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
dist/assets/index-c92a1603.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
dist/assets/index-e633ab9a.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
dist/assets/index-ed9b157d.js


Diff do ficheiro suprimidas por serem muito extensas
+ 8 - 0
dist/assets/login-9a355dea.js


BIN
dist/dist.zip


+ 17 - 0
dist/index.html

@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="UTF-8" />
+    <link rel="icon" type="image/svg+xml" href="./vite.svg" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+    <title>班尼戈水务管理</title>
+    <script type="module" crossorigin src="./assets/index-83778c1f.js"></script>
+    <link rel="modulepreload" crossorigin href="./assets/vue-9b2e4ac7.js">
+    <link rel="modulepreload" crossorigin href="./assets/vue-router-d1c3bcbb.js">
+    <link rel="stylesheet" href="./assets/index-264534dd.css">
+  </head>
+  <body>
+    <div id="app"></div>
+    
+  </body>
+</html>

+ 1 - 0
dist/manage/assets/Htabs-5dc26c5e.js

@@ -0,0 +1 @@
+import{d as i,r}from"./index-e88660a2.js";const u=i("routeTabs",{state:()=>({historyRoutes:[]}),getters:{},actions:{saveRoute(e){this.historyRoutes.some(o=>o.name==e.meta.name)||this.historyRoutes.push(e)},delRoute(e,s){if(r.options.routes[1].children.forEach(t=>{t.name==e&&(t.meta.keepAlive=!1,t.meta.name=t.name)}),this.historyRoutes=this.historyRoutes.filter(t=>{if(t.meta.name!==e)return t}),e===s&&(console.log(this.historyRoutes),this.historyRoutes[0]))return r.replace({name:this.historyRoutes[0].meta.name})}}});export{u};

Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
dist/manage/assets/base-e06a1159.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
dist/manage/assets/index-059d71e8.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
dist/manage/assets/index-0911382d.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
dist/manage/assets/index-0dfdd2b3.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
dist/manage/assets/index-131f8cfa.js


+ 1 - 0
dist/manage/assets/index-269a2be0.js

@@ -0,0 +1 @@
+import{l as n}from"./index-b98d05c8.js";import{a as e,o as s,V as p,W as i,j as c,X as l,u as a}from"./vue-9b2e4ac7.js";import"./vue-router-d1c3bcbb.js";import"./index-e88660a2.js";import"./base-e06a1159.js";import"./_plugin-vue_export-helper-c27b6911.js";const g={__name:"index",setup(m){const t=e();let r=e([{label:"范围",key:"isnext",type:"select",dataSource:[{remarks:"今年",value:"0"},{remarks:"明年",value:"1"}]},{label:"时间范围",key:"dateRange",type:"datepickerRange",objKeys:["begindate","enddate"]}]),o=e({content:{pageNumber:1,pageSize:20,where:{condition:""}},id:20221215165504});return s(()=>{}),(u,d)=>(p(),i("div",null,[c(n,{ref_key:"list",ref:t,keyRouteName:"accountno",param:a(o),tableName:"vacationTable",searchType:a(r)},{operation:l(()=>[]),_:1},8,["param","searchType"])]))}};export{g as default};

+ 1 - 0
dist/manage/assets/index-3a75d362.js

@@ -0,0 +1 @@
+import{n as k}from"./index-96c53130.js";import{m as v}from"./index-e88660a2.js";import{a as r,U as D,V as m,W as c,j as d,X as u,ab as R,R as f,F as p,G as _,a4 as x,u as l,H as y}from"./vue-9b2e4ac7.js";const B={__name:"index",props:{title:String,wdith:String},emits:["selectRowData","close"],setup(o,{expose:b,emit:n}){let s=r(),e=r(!1),g=()=>{if(!s.value.tableRecord.length)return v.warning("请选择数据");e.value=!1,n("selectRowData",s.value.tableRecord)},w=()=>{n("close")};return b({modeVisible:e}),(a,i)=>{const h=D("a-modal");return m(),c(p,null,[d(h,{visible:l(e),"onUpdate:visible":i[0]||(i[0]=t=>y(e)?e.value=t:e=t),class:"custom-class",title:o.title||"标题",placement:"right",width:o.wdith||"1000px",closable:!1,onClose:l(w),onOk:l(g)},{default:u(()=>[d(k,R(a.$attrs,{ref_key:"list",ref:s,size:"small",onListData:a.listData}),{tb_cell:u(({data:t})=>[t.column.dataIndex==="operation"?f(a.$slots,"handleBtn",{key:0}):(m(),c(p,{key:1},[_(x(t.record[t.column.dataIndex]),1)],64))]),_:3},16,["onListData"])]),_:3},8,["visible","title","width","onClose","onOk"]),f(a.$slots,"slot1")],64)}}};export{B as _};

Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
dist/manage/assets/index-3a790dd7.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
dist/manage/assets/index-51fca666.js


+ 1 - 0
dist/manage/assets/index-5938b5c4.js

@@ -0,0 +1 @@
+import{l as d}from"./index-b98d05c8.js";import{A as m}from"./index-e88660a2.js";import{u}from"./vue-router-d1c3bcbb.js";import{_ as f}from"./_plugin-vue_export-helper-c27b6911.js";import{a as s,U as x,V as r,W as y,j as g,X as n,u as c,G as h,a3 as k,$ as b,a4 as w,a6 as B}from"./vue-9b2e4ac7.js";import"./base-e06a1159.js";const N={class:"y-container"},v=["onClick"],A={__name:"index",setup(S){u();let i=s([]);s([]);let p=s({content:{pageNumber:1,pageSize:20,systemappid:JSON.parse(sessionStorage.getItem("app")).systemappid},id:20221213094401});const l=()=>{let t=window.location.href,e=t.indexOf("/"),a=0;for(;e!=-1;)if(a++,e=t.indexOf("/",e+1),a++==3)return t.slice(0,e)},_=async t=>{console.log("http://60.204.153.188/");let e=await m.requested({id:20221213094501,content:{sys_reportid:t.sys_reportid,dataid:0}});window.open(l()+e.data)};return(t,e)=>{const a=x("a-button");return r(),y("div",N,[g(d,{columns:c(i),param:c(p),tableName:"reportcenterTable"},{operation:n(()=>[h(" 报表中心 ")]),tb_cell:n(({data:o})=>[o.column.dataIndex=="name"?(r(),k(a,{key:0,type:"link"},{default:n(()=>[b("span",{class:"btn-link",onClick:C=>_(o.record)},w(o.record.name),9,v)]),_:2},1024)):B("",!0)]),_:1},8,["columns","param"])])}}},P=f(A,[["__scopeId","data-v-caca61d5"]]);export{P as default};

Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
dist/manage/assets/index-5c5ad8d8.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
dist/manage/assets/index-6ef669a7.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
dist/manage/assets/index-7b64120e.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
dist/manage/assets/index-7e3e1f71.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
dist/manage/assets/index-7fa624ae.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
dist/manage/assets/index-84c1e8d2.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
dist/manage/assets/index-8766b919.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
dist/manage/assets/index-96c53130.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
dist/manage/assets/index-98d67121.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
dist/manage/assets/index-a308502f.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
dist/manage/assets/index-aaaabacf.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
dist/manage/assets/index-b98d05c8.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
dist/manage/assets/index-bbfc1c08.js


+ 1 - 0
dist/manage/assets/index-be38b662.css

@@ -0,0 +1 @@
+.mainAreaPanel[data-v-3e573d94]{flex:1 1 230px;width:230px;margin:10px 10px 0 0;padding:10px;background:#fff}.listPanel[data-v-3e573d94]{flex:1 1 auto;width:calc(100% - 280px)}

+ 1 - 0
dist/manage/assets/index-c4eefd2e.js

@@ -0,0 +1 @@
+import{U as s,V as e,a3 as t,X as n,W as c,F as i,a2 as _,$ as d,a7 as m,a4 as u}from"./vue-9b2e4ac7.js";const g={__name:"index",props:["data"],setup(o){const l=o;return(x,y)=>{const r=s("a-descriptions-item"),p=s("a-descriptions");return e(),t(p,{column:6,labelStyle:{color:"#666",width:"150px"},contentStyle:{marginRight:"20px",marginBottom:"5px"},size:"small",bordered:""},{default:n(()=>[(e(!0),c(i,null,_(l.data,a=>(e(),t(r,{span:a.span?a.span:1,key:a.index,label:a.label},{default:n(()=>[d("span",{style:m(a.style?a.style():"")},u(a.value),5)]),_:2},1032,["span","label"]))),128))]),_:1})}}};export{g as _};

Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
dist/manage/assets/index-c542caa5.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
dist/manage/assets/index-e88660a2.js


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
dist/manage/assets/index-f023eca5.js


+ 1 - 0
dist/manage/assets/index-f0422f3e.js

@@ -0,0 +1 @@
+import{_ as e}from"./_plugin-vue_export-helper-c27b6911.js";import{V as r,W as c}from"./vue-9b2e4ac7.js";const o={};function t(n,s){return r(),c("div")}const f=e(o,[["render",t]]);export{f as default};

Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
dist/manage/assets/index-fd978cd1.js


Diff do ficheiro suprimidas por serem muito extensas
+ 8 - 0
dist/manage/assets/login-9c7cee10.js


+ 17 - 0
dist/manage/index.html

@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="UTF-8" />
+    <link rel="icon" type="image/svg+xml" href="./vite.svg" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+    <title>班尼戈水务管理</title>
+    <script type="module" crossorigin src="./assets/index-e88660a2.js"></script>
+    <link rel="modulepreload" crossorigin href="./assets/vue-9b2e4ac7.js">
+    <link rel="modulepreload" crossorigin href="./assets/vue-router-d1c3bcbb.js">
+    <link rel="stylesheet" href="./assets/index-83d7b18d.css">
+  </head>
+  <body>
+    <div id="app"></div>
+    
+  </body>
+</html>

+ 23 - 2
src/operation/moduleNormal/equipmentMag/detail/index.vue

@@ -30,7 +30,24 @@
         <defaultInfo :data="systemInfoData"></defaultInfo>
       </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" ref="attributeTab" v-if="currentInfoModel == 'attribute'">
+          <template #add>
+            <AddAttrite :disabled="!utils.hasPermission('modelTab')" :data="userData" @onSuccess="$refs.attributeTab.$refs.list.listData()"></AddAttrite>
+          </template>
+        </AttributeTab>
+
+        <serveTable :data="userData" ref="serveTab" v-else-if="currentInfoModel == 'server'">
+          <template #add>
+            <AddServe :disabled="!utils.hasPermission('modelTab')" :data="userData" @onSuccess="serveSuccess"></AddServe>
+          </template>
+        </serveTable>
+
+        <eventTab :data="userData" v-else></eventTab>
       </template>
     </detail-template>
   </div>
@@ -45,7 +62,11 @@ import detailTemplate from '@/components/detailTemplate/index.vue'
 import defaultInfo from '@/template/defaultInfo/index.vue'
 import customBtn from '@/components/customHandleBtn/index.vue'
 import Edit from '../modules/Edit.vue'
-
+import AddAttrite from './modules/attributeTab/modules/Add.vue'
+import AddServe from './modules/serveTable/modules/Add.vue'
+import AttributeTab from './modules/attributeTab/index.vue'
+import serveTable from './modules/serveTable/index.vue'
+import eventTab from './modules/eventTab/index.vue'
 
 import { message, Modal } from 'ant-design-vue'
 import { ExclamationCircleOutlined } from '@ant-design/icons-vue'

+ 98 - 0
src/operation/moduleNormal/equipmentMag/detail/modules/attributeTab/index.vue

@@ -0,0 +1,98 @@
+<template>
+  <normalTable rowKey="w_dataparamid" ref="list" size="small" :param="param" :columns="utils.TBLayout('dataparamTable')">
+    <template #tb_cell="{data}">
+      <div v-if="data.column.dataIndex == 'operation'">
+        <Edit :data="data.record" @onSuccess="$refs.list.listData()" :disabled="!utils.hasPermission('modelTab')"></Edit>
+        <customBtn
+          btnName="删 除"
+          idName="20230613091502"
+          keyName="w_dataparamid"
+          :id="data.record.w_dataparamid"
+          type="link"
+          message="确定删除当前产品属性吗?"
+          @onSuccess="$refs.list.listData()"
+          :disabled="!utils.hasPermission('modelTab')"
+        />
+      </div>
+      <div v-else>
+        {{ data.record[data.column.dataIndex] }}
+      </div>
+    </template>
+    <template #operation>
+      <div style="display:flex;margin-bottom:16px">
+        <slot name="add"></slot>
+        <div style="margin-right:16px">
+          <span>数据类型:</span>
+          <a-select
+            ref="select"
+            v-model:value="param.content.where.datatype"
+            placeholder="选择数据类型"
+            style="width: 200px"
+            @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 style="margin-right:16px">
+          <span>读写类型:</span>
+          <a-select
+            ref="select"
+            v-model:value="param.content.where.rwtype"
+            placeholder="选择读写类型"
+            style="width: 200px"
+            @change="$refs.list.listData()"
+            allowClear
+          >
+            <a-select-option value="0">0</a-select-option>
+            <a-select-option value="1">1</a-select-option>
+            <a-select-option value="2">2</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 customBtn from '@/components/customHandleBtn/index.vue'
+import Edit from './modules/Edit.vue'
+import { useBaseStore } from '@/stores/modules/base'
+import {ref, defineProps, defineEmits, onMounted} from 'vue'
+import { useRouter } from 'vue-router'
+import Api from '@/api/api'
+import utils from '@/utils/utils'
+
+let base = useBaseStore()
+let router = useRouter()
+let emit = defineEmits([])
+let props = defineProps(['data'])
+let param = ref({
+  "id": 20230613091602,
+  "content": {
+    "ownertable": "w_device",
+    "ownerid": router.currentRoute.value.query.id,
+    "pageNumber": 1,
+    "pageSize": 20,
+    "where": {
+        "condition": "",
+        "datatype": undefined,
+        "rwtype": undefined
+    }
+  },
+})
+let searchType = ref([{label:'搜索',key:'condition',type:'input'}])
+let typeList = ref([])
+
+onMounted(async () => {
+  let res = await base.optiontypeselect('datatype')
+  typeList.value = res.data
+  console.log(typeList.value);
+})
+</script>
+
+<style scoped>
+
+</style>

+ 204 - 0
src/operation/moduleNormal/equipmentMag/detail/modules/attributeTab/modules/Add.vue

@@ -0,0 +1,204 @@
+<template>
+  <a-button type="primary" @click="addBtn" style="margin-right:16px" :disabled="disabled">新建</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="devicename" :rules="[{ required: true, message: '请选择产品' }]">
+            <a-input readonly v-model:value="form.devicename" placeholder="请输入名称"></a-input>
+          </a-form-item>
+        </a-col> -->
+        <a-col :span="12">
+          <a-form-item  label="标识" name="param" :rules="[{ required: true, message: '请输入标识' }]">
+            <a-input v-model:value="form.param" 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"
+              placeholder="选择数据类型"
+            >
+              <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="rwtype" :rules="[{ required: true, message: '请选择读写类型' }]">
+            <a-select
+              v-model:value="form.rwtype"
+              placeholder="请选择读写类型"
+            >
+              <a-select-option value="0">0</a-select-option>
+              <a-select-option value="1">1</a-select-option>
+              <a-select-option value="2">2</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"
+              placeholder="请选择单位"
+
+            >
+              <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="length" :rules="[{ required: true, message: '请输入长度' }]">
+            <a-input v-model:value.number="form.length" placeholder="请输入长度"></a-input>
+          </a-form-item>
+        </a-col>
+        <a-col :span="12">
+          <a-form-item  label="小数位数" name="num_scale" :rules="[{ required: true, message: '请输入小数位数' }]">
+            <a-input v-model:value.number="form.num_scale" placeholder="请输入长度"></a-input>
+          </a-form-item>
+        </a-col><a-col :span="12">
+          <a-form-item  label="步长" name="num_step" :rules="[{ required: true, message: '请输入步长' }]">
+            <a-input v-model:value.number="form.num_step" placeholder="请输入步长"></a-input>
+          </a-form-item>
+        </a-col><a-col :span="12">
+          <a-form-item  label="最大值" name="num_maxvalue" :rules="[{ required: true, message: '请输入最大值' }]">
+            <a-input v-model:value.number="form.num_maxvalue" placeholder="请输入最大值"></a-input>
+          </a-form-item>
+        </a-col>
+        <a-col :span="12">
+          <a-form-item  label="最小值" name="num_minvalue" :rules="[{ required: true, message: '最小值' }]">
+            <a-input v-model:value.number="form.num_minvalue" placeholder="请输入最小值"></a-input>
+          </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'
+import { useRouter } from 'vue-router'
+
+let router = useRouter()
+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_dataparamid": 0,
+  "ownertable": "w_device",
+  "ownerid": "",
+  "param": "",
+  "paramname": "",
+  "datatype": undefined,
+  "unit": undefined,
+  "length": '',
+  "remarks": "",
+  "rwtype": undefined, //0 读 1写 2 上报
+  "num_scale": '', //小数位数
+  "num_step": "", //步长
+  "num_maxvalue": "", //最大值
+  "num_minvalue": "", //最小值
+  "optiontypeid": undefined,
+  "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 = router.currentRoute.value.query.id
+}
+let onSubmit = async () => {
+  let isCheck = await formRef.value.validateFields()
+  if (!isCheck) return
+  let res = await Api.requested({
+    id:20230612161402,
+    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>

+ 201 - 0
src/operation/moduleNormal/equipmentMag/detail/modules/attributeTab/modules/Edit.vue

@@ -0,0 +1,201 @@
+<template>
+  <a-button type="link" @click="editBtn">编辑</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="devicename" :rules="[{ required: true, message: '请选择设备' }]">
+            <a-input readonly v-model:value="form.devicename" placeholder="请输入名称"></a-input>
+          </a-form-item>
+        </a-col> -->
+        <a-col :span="12">
+          <a-form-item  label="标识" name="param" :rules="[{ required: true, message: '请输入标识' }]">
+            <a-input :disabled="true" v-model:value="form.param" 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="rwtype" :rules="[{ required: true, message: '请选择读写类型' }]">
+            <a-select
+              v-model:value="form.rwtype"
+            >
+              <a-select-option value="0">0</a-select-option>
+              <a-select-option value="1">1</a-select-option>
+              <a-select-option value="2">2</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="length" :rules="[{ required: true, message: '请输入长度' }]">
+            <a-input v-model:value.number="form.length" placeholder="请输入长度"></a-input>
+          </a-form-item>
+        </a-col>
+        <a-col :span="12">
+          <a-form-item  label="小数位数" name="num_scale" :rules="[{ required: true, message: '请输入小数位数' }]">
+            <a-input v-model:value.number="form.num_scale" placeholder="请输入长度"></a-input>
+          </a-form-item>
+        </a-col><a-col :span="12">
+          <a-form-item  label="步长" name="num_step" :rules="[{ required: true, message: '请输入步长' }]">
+            <a-input v-model:value.number="form.num_step" placeholder="请输入步长"></a-input>
+          </a-form-item>
+        </a-col><a-col :span="12">
+          <a-form-item  label="最大值" name="num_maxvalue" :rules="[{ required: true, message: '请输入最大值' }]">
+            <a-input v-model:value.number="form.num_maxvalue" placeholder="请输入最大值"></a-input>
+          </a-form-item>
+        </a-col>
+        <a-col :span="12">
+          <a-form-item  label="最小值" name="num_minvalue" :rules="[{ required: true, message: '最小值' }]">
+            <a-input v-model:value.number="form.num_minvalue" placeholder="请输入最小值"></a-input>
+          </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'
+import { useRouter } from 'vue-router'
+
+let router = useRouter()
+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_device",
+  "ownerid": "",
+  "param": "",
+  "paramname": "",
+  "datatype": "",
+  "unit": "",
+  "length": '',
+  "remarks": "",
+  "rwtype": 0, //0 读 1写 2 上报
+  "num_scale": '', //小数位数
+  "num_step": "", //步长
+  "num_maxvalue": "", //最大值
+  "num_minvalue": "", //最小值
+  "optiontypeid": '',
+  "prodname":''
+})
+let formRef = ref()
+let typeList = ref([])
+let optionList = ref([])
+let unitList = ref([])
+
+let editBtn = () => {
+  visible.value = true
+  form.value = Object.assign({},form.value,props.data)
+  form.value.ownerid = router.currentRoute.value.query.id
+  console.log(props.data);
+}
+let onSubmit = async () => {
+  let isCheck = await formRef.value.validateFields()
+  if (!isCheck) return
+  let res = await Api.requested({
+    id:20230612161402,
+    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>

+ 134 - 0
src/operation/moduleNormal/equipmentMag/detail/modules/eventTab/index.vue

@@ -0,0 +1,134 @@
+<template>
+  <normalTable rowKey="w_eventid" ref="list" size="small" :param="param" :columns="utils.TBLayout('eventTable')">
+    <template #tb_cell="{data}">
+      <div v-if="data.column.dataIndex == 'operation'">
+        <Edit :data="data.record" @onSuccess="$refs.list.listData()" :disabled="!utils.hasPermission('modelTab')"></Edit>
+        <customBtn
+          btnName="删 除"
+          idName="20230614143702"
+          keyName="w_eventid"
+          :id="data.record.w_eventid"
+          type="link"
+          message="确定删除当前产品事件吗?"
+          @onSuccess="$refs.list.listData()"
+          :disabled="!utils.hasPermission('modelTab')"
+        />
+      </div>
+      <div v-else-if="data.column.dataIndex == 'level'">
+        {{ calcValue(levelList,data.record,'level') }}
+      </div>
+      <div v-else-if="data.column.dataIndex == 'buildtype'">
+        {{ calcValue(typeList,data.record,'buildtype') }}
+      </div>
+      <div v-else-if="data.column.dataIndex == 'w_dataparamids'">
+        <a-tag color="blue" v-for="item in data.record.dataparam" :key="item.w_functionid">{{ item.paramname }}</a-tag>
+      </div>
+      <div v-else>
+        {{ data.record[data.column.dataIndex] }}
+      </div>
+    </template>
+    <template #operation>
+      <div style="display:flex;margin-bottom:16px">
+        <Add :data="data" :disabled="!utils.hasPermission('modelTab')" @onSuccess="$refs.list.listData()"></Add>
+        <div style="margin-right:16px">
+          <span>级别:</span>
+          <a-select
+            ref="select"
+            v-model:value="param.content.where.level"
+            placeholder="选择级别"
+            style="width: 200px"
+            @change="$refs.list.listData()"
+            allowClear
+          >
+            <a-select-option :value="item.value" v-for="item in levelList">{{ item.remarks }}</a-select-option>
+          </a-select>
+        </div>
+        <div style="margin-right:16px">
+          <span>发生类型:</span>
+          <a-select
+            ref="select"
+            v-model:value="param.content.where.buildtype"
+            placeholder="选择发生类别"
+            style="width: 200px"
+            @change="$refs.list.listData()"
+            allowClear
+          >
+            <a-select-option :value="item.value" v-for="item in typeList">{{ item.remarks }}</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 customBtn from '@/components/customHandleBtn/index.vue'
+import Edit from './modules/Edit.vue'
+import Add from './modules/Add.vue'
+import { useBaseStore } from '@/stores/modules/base'
+import {ref, defineProps, defineEmits, onMounted, provide, computed} from 'vue'
+import { useRouter } from 'vue-router'
+import Api from '@/api/api'
+import utils from '@/utils/utils'
+import { log } from 'mathjs'
+
+let base = useBaseStore()
+let router = useRouter()
+let emit = defineEmits([])
+let props = defineProps(['data'])
+let param = ref({
+  "id": 20230614143602,
+  "content": {
+    "ownertable": "w_device",
+    "ownerid": router.currentRoute.value.query.id,
+    "pageNumber": 1,
+    "pageSize": 20,
+    "where": {
+        "condition": "",
+        "level": undefined,
+        "buildtype": undefined
+    }
+  },
+})
+let searchType = ref([
+  {label:'搜索',key:'condition',type:'input'},
+  {label:'调用方式',key:'isasyn',type:'select',dataSource:[
+    {remarks:'同步',value:'同步'},
+    {remarks:'异步',value:'异步'},
+  ]},
+])
+let levelList = ref([])
+let typeList = ref([])
+let symbolList = ref([])
+
+provide('levelList',levelList)
+provide('typeList',typeList)
+provide('symbolList',symbolList)
+
+let calcValue = computed(() => {
+  return (arr,value,key) => {
+    return arr.filter(item => item.value == value[key])[0] ? arr.filter(item => item.value == value[key])[0].remarks : ''
+  }
+})
+
+
+onMounted(async () => {
+  let res = await base.optiontypeselect('eventlevel')
+  levelList.value = res.data
+  let res2 = await base.optiontypeselect('eventbuildtype')
+  typeList.value = res2.data
+  let res3 = await base.optiontypeselect('eventsymbol')
+  symbolList.value = res3.data
+  console.log(levelList.value);
+})
+
+defineExpose({
+  param
+})
+</script>
+
+<style scoped>
+
+</style>

+ 170 - 0
src/operation/moduleNormal/equipmentMag/detail/modules/eventTab/modules/Add.vue

@@ -0,0 +1,170 @@
+<template>
+  <a-button type="primary" @click="addBtn" style="margin-right:16px" :disabled="disabled">新建</a-button>
+  <a-drawer
+    v-model:visible="visible"
+    class="custom-class"
+    title="新建产品事件"
+    placement="right"
+    width="600px"
+    :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="devicename" :rules="[{ required: true, message: '请输入' }]">
+            <a-input readonly v-model:value="form.devicename" placeholder="请输入"></a-input>
+          </a-form-item>
+        </a-col> -->
+        <a-col :span="24">
+          <a-form-item  label="标识" name="event" :rules="[{ required: true, message: '请输入标识' }]">
+            <a-input v-model:value="form.event" placeholder="请输入标识"></a-input>
+          </a-form-item>
+        </a-col>
+        <a-col :span="24">
+          <a-form-item  label="事件名称" name="eventname" :rules="[{ required: true, message: '请输入事件名称' }]">
+            <a-input v-model:value="form.eventname" placeholder="请输入事件名称"></a-input>
+          </a-form-item>
+        </a-col>
+        <a-col :span="24">
+          <a-form-item  label="发生类型" name="buildtype" :rules="[{ required: true, message: '请选择发生类型' }]">
+            <a-radio-group v-model:value="form.buildtype">
+              <a-radio :value="item.value" v-for="item in typeList">{{ item.remarks }}</a-radio>
+            </a-radio-group>
+          </a-form-item>
+        </a-col>
+        <a-col :span="24">
+          <a-form-item  label="级别" name="level" :rules="[{ required: true, message: '请选择级别' }]">
+            <a-select v-model:value="form.level">
+              <a-select-option v-for="item in levelList" :value="+item.value">{{ item.remarks }}</a-select-option>
+            </a-select>
+          </a-form-item>
+        </a-col>
+        <a-col :span="24">
+          <a-form-item  label="选择属性" name="paramname" :rules="[{ required: true, message: '请选择属性' }]">
+            <SelectModel 
+              :filterMultiple="true"
+              ref="Param" 
+              @selectRowData="selectDataInfo" 
+              rowKey="w_dataparamid" 
+              :param="dataParam" 
+              :columns="utils.TBLayout('dataparamTable')" title="选择产品属性"
+            >
+              <template v-slot:slot1>
+                <a-input-search
+                  v-model:value="form.paramname"
+                  enter-button="添加"
+                  readonly
+                  @search="$refs.Param.modeVisible=true"
+                />
+              </template>
+            </SelectModel>
+          </a-form-item>
+        </a-col>
+        <a-col :span="12" v-if="form.buildtype == '0'">
+          <a-form-item  label="事件判断符" name="symbol" :rules="[{ required: true, message: '请选择事件判断符' }]">
+            <a-select v-model:value="form.symbol" placeholder="请选择判断符">
+              <a-select-option v-for="item in symbolList" :value="item.value">{{ item.value }}</a-select-option>
+            </a-select>
+          </a-form-item>
+        </a-col>
+        <a-col :span="12" v-if="form.buildtype == '0'">
+          <a-form-item  label="值" name="symbol" :rules="[{ required: true, message: '请选择事件值' }]">
+            <a-input v-model:value.number="form.eventvalue" placeholder="请输入值"></a-input>
+          </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, nextTick, inject} 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 { useRouter } from 'vue-router'
+
+let router = useRouter()
+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 levelList = inject('levelList')
+let typeList = inject('typeList')
+let symbolList = inject('symbolList')
+
+let form = ref({
+  "w_eventid": 0,
+  "ownertable": "w_device",
+  "ownerid": "",
+  "event": "",
+  "eventname": "",
+  "level": undefined, //自定义选项
+  "w_dataparamid": undefined,
+  "buildtype": '0', //自定义选项
+  "symbol": undefined, //自定义选项
+  "eventvalue": "",
+  "paramname":''
+})
+let dataParam = ref({
+  "id": 20230613091602,
+  "content": {
+    "ownertable": "w_device",
+    "ownerid": router.currentRoute.value.query.id,
+    "pageNumber": 1,
+    "pageSize": 20,
+    "where": {
+        "condition": "",
+        "datatype": "",
+        "rwtype": ""
+    }
+  },
+})
+let formRef = ref()
+let inputRef = ref()
+let Param = ref()
+
+let addBtn = () => {
+  visible.value = true
+  form.value = Object.assign({},form.value,props.data)
+  form.value.ownerid = router.currentRoute.value.query.id
+}
+let onSubmit = async () => {
+  let isCheck = await formRef.value.validateFields()
+  if (!isCheck) return
+  if (form.value.buildtype == 1) {
+    form.value.symbol = ''
+    form.value.eventvalue = ''
+  }
+  let res = await Api.requested({
+    id:20230614143502,
+    content: form.value
+  })
+  utils.message(res,'新建成功',() => {
+    visible.value = false
+    emit('onSuccess')
+    formRef.value.resetFields()
+  })
+}
+
+let selectDataInfo = (data) => {
+  console.log(data);
+  form.value.w_dataparamid = data[data.length - 1].w_dataparamid
+  form.value.paramname = data[data.length - 1].paramname
+  Param.value.modeVisible = false
+}
+</script>
+
+<style scoped>
+
+</style>

+ 171 - 0
src/operation/moduleNormal/equipmentMag/detail/modules/eventTab/modules/Edit.vue

@@ -0,0 +1,171 @@
+<template>
+  <a-button type="link" @click="editBtn" style="margin-right:16px" :disabled="disabled">编辑</a-button>
+  <a-drawer
+    v-model:visible="visible"
+    class="custom-class"
+    title="编辑产品事件"
+    placement="right"
+    width="600px"
+    :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="devicename" :rules="[{ required: true, message: '请输入' }]">
+            <a-input readonly v-model:value="form.devicename" placeholder="请输入"></a-input>
+          </a-form-item>
+        </a-col> -->
+        <a-col :span="24">
+          <a-form-item  label="标识" name="event" :rules="[{ required: true, message: '请输入标识' }]">
+            <a-input v-model:value="form.event" placeholder="请输入标识"></a-input>
+          </a-form-item>
+        </a-col>
+        <a-col :span="24">
+          <a-form-item  label="事件名称" name="eventname" :rules="[{ required: true, message: '请输入事件名称' }]">
+            <a-input v-model:value="form.eventname" placeholder="请输入事件名称"></a-input>
+          </a-form-item>
+        </a-col>
+        <a-col :span="24">
+          <a-form-item  label="发生类型" name="buildtype" :rules="[{ required: true, message: '请选择发生类型' }]">
+            <a-radio-group v-model:value="form.buildtype">
+              <a-radio :value="+item.value" v-for="item in typeList">{{ item.remarks }}</a-radio>
+            </a-radio-group>
+          </a-form-item>
+        </a-col>
+        <a-col :span="24">
+          <a-form-item  label="级别" name="level" :rules="[{ required: true, message: '请选择级别' }]">
+            <a-select v-model:value="form.level">
+              <a-select-option v-for="item in levelList" :value="+item.value">{{ item.remarks }}</a-select-option>
+            </a-select>
+          </a-form-item>
+        </a-col>
+        <a-col :span="24">
+          <a-form-item  label="选择属性" name="paramname" :rules="[{ required: true, message: '请选择属性' }]">
+            <SelectModel 
+              :filterMultiple="true"
+              ref="Param" 
+              @selectRowData="selectDataInfo" 
+              rowKey="w_dataparamid" 
+              :param="dataParam" 
+              :columns="utils.TBLayout('dataparamTable')" title="选择产品属性"
+            >
+              <template v-slot:slot1>
+                <a-input-search
+                  v-model:value="form.paramname"
+                  enter-button="添加"
+                  readonly
+                  @search="$refs.Param.modeVisible=true"
+                />
+              </template>
+            </SelectModel>
+          </a-form-item>
+        </a-col>
+        <a-col :span="12" v-if="form.buildtype == '0'">
+          <a-form-item  label="事件判断符" name="symbol" :rules="[{ required: true, message: '请选择事件判断符' }]">
+            <a-select v-model:value="form.symbol" placeholder="请选择判断符">
+              <a-select-option v-for="item in symbolList" :value="item.value">{{ item.value }}</a-select-option>
+            </a-select>
+          </a-form-item>
+        </a-col>
+        <a-col :span="12" v-if="form.buildtype == '0'">
+          <a-form-item  label="值" name="symbol" :rules="[{ required: true, message: '请选择事件值' }]">
+            <a-input v-model:value.number="form.eventvalue" placeholder="请输入值"></a-input>
+          </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, nextTick, inject} 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 { useRouter } from 'vue-router'
+
+let router = useRouter()
+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 levelList = inject('levelList')
+let typeList = inject('typeList')
+let symbolList = inject('symbolList')
+
+let form = ref({
+  "w_eventid": 0,
+  "ownertable": "w_device",
+  "ownerid": "",
+  "event": "",
+  "eventname": "",
+  "level": undefined, //自定义选项
+  "w_dataparamid": undefined,
+  "buildtype": '0', //自定义选项
+  "symbol": undefined, //自定义选项
+  "eventvalue": "",
+  "paramname":''
+})
+let dataParam = ref({
+  "id": 20230613091602,
+  "content": {
+    "ownertable": "w_device",
+    "ownerid": router.currentRoute.value.query.id,
+    "pageNumber": 1,
+    "pageSize": 20,
+    "where": {
+        "condition": "",
+        "datatype": "",
+        "rwtype": ""
+    }
+  },
+})
+let formRef = ref()
+let inputRef = ref()
+let Param = ref()
+
+let editBtn = () => {
+  visible.value = true
+  form.value = Object.assign({},form.value,props.data)
+  form.value.ownerid = router.currentRoute.value.query.id
+  console.log(props.data);
+}
+let onSubmit = async () => {
+  let isCheck = await formRef.value.validateFields()
+  if (!isCheck) return
+  if (form.value.buildtype == 1) {
+    form.value.symbol = ''
+    form.value.eventvalue = ''
+  }
+  let res = await Api.requested({
+    id:20230614143502,
+    content: form.value
+  })
+  utils.message(res,'新建成功',() => {
+    visible.value = false
+    emit('onSuccess')
+    formRef.value.resetFields()
+  })
+}
+
+let selectDataInfo = (data) => {
+  console.log(data);
+  form.value.w_dataparamid = data[data.length - 1].w_dataparamid
+  form.value.paramname = data[data.length - 1].paramname
+  Param.value.modeVisible = false
+}
+</script>
+
+<style scoped>
+
+</style>

+ 99 - 0
src/operation/moduleNormal/equipmentMag/detail/modules/serveTable/index.vue

@@ -0,0 +1,99 @@
+<template>
+  <normalTable rowKey="w_functionid" ref="list" size="small" :param="param" :columns="utils.TBLayout('serveTable')">
+    <template #tb_cell="{data}">
+      <div v-if="data.column.dataIndex == 'operation'">
+        <Edit :data="data.record" @onSuccess="$refs.list.listData()" :disabled="!utils.hasPermission('modelTab')"></Edit>
+        <customBtn
+          btnName="删 除"
+          idName="20230613162902"
+          keyName="w_functionid"
+          :id="data.record.w_functionid"
+          type="link"
+          message="确定删除当前产品功能吗?"
+          @onSuccess="$refs.list.listData()"
+          :disabled="!utils.hasPermission('modelTab')"
+        />
+      </div>
+      <div v-else-if="data.column.dataIndex == 'isasyn'">
+        {{ data.record.isasyn ? '同步' : '异步' }}
+      </div>
+      <div v-else-if="data.column.dataIndex == 'w_dataparamids'">
+        <a-tag color="blue" v-for="item in data.record.dataparam" :key="item.w_functionid">{{ item.paramname }}</a-tag>
+      </div>
+      <div v-else>
+        {{ data.record[data.column.dataIndex] }}
+      </div>
+    </template>
+    <template #operation>
+      <div style="display:flex;margin-bottom:16px">
+        <slot name="add"></slot>
+        <div style="margin-right:16px">
+          <span>调用方式:</span>
+          <a-select
+            ref="select"
+            v-model:value="param.content.where.isasyn"
+            placeholder="选择调用方式"
+            style="width: 200px"
+            @change="$refs.list.listData()"
+            allowClear
+          >
+            <a-select-option value="0">同步</a-select-option>
+            <a-select-option value="1">异步</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 customBtn from '@/components/customHandleBtn/index.vue'
+import Edit from './modules/Edit.vue'
+import { useBaseStore } from '@/stores/modules/base'
+import {ref, defineProps, defineEmits, onMounted} from 'vue'
+import { useRouter } from 'vue-router'
+import Api from '@/api/api'
+import utils from '@/utils/utils'
+
+let base = useBaseStore()
+let router = useRouter()
+let emit = defineEmits([])
+let props = defineProps(['data'])
+let param = ref({
+  "id": 20230613162702,
+  "content": {
+    "ownertable": "w_device",
+    "ownerid": router.currentRoute.value.query.id,
+    "pageNumber": 1,
+    "pageSize": 20,
+    "where": {
+        "condition": "",
+        "isasyn": undefined
+    }
+  },
+})
+let searchType = ref([
+  {label:'搜索',key:'condition',type:'input'},
+  {label:'调用方式',key:'isasyn',type:'select',dataSource:[
+    {remarks:'同步',value:'同步'},
+    {remarks:'异步',value:'异步'},
+  ]},
+])
+let typeList = ref([])
+
+onMounted(async () => {
+  let res = await base.optiontypeselect('datatype')
+  typeList.value = res.data
+  console.log(typeList.value);
+})
+
+defineExpose({
+  param
+})
+</script>
+
+<style scoped>
+
+</style>

+ 196 - 0
src/operation/moduleNormal/equipmentMag/detail/modules/serveTable/modules/Add.vue

@@ -0,0 +1,196 @@
+<template>
+  <a-button type="primary" @click="addBtn" style="margin-right:16px" :disabled="disabled">新建</a-button>
+  <a-drawer
+    v-model:visible="visible"
+    class="custom-class"
+    title="新建产品功能"
+    placement="right"
+    width="600px"
+    :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="devicename" :rules="[{ required: true, message: '请输入' }]">
+            <a-input readonly v-model:value="form.devicename" placeholder="请输入"></a-input>
+          </a-form-item>
+        </a-col> -->
+        <a-col :span="24">
+          <a-form-item  label="标识" name="func" :rules="[{ required: true, message: '请输入标识' }]">
+            <a-input v-model:value="form.func" placeholder="请输入标识"></a-input>
+          </a-form-item>
+        </a-col>
+        <a-col :span="24">
+          <a-form-item  label="功能名称" name="funcname" :rules="[{ required: true, message: '请输入功能名称' }]">
+            <a-input v-model:value="form.funcname" placeholder="请输入功能名称"></a-input>
+          </a-form-item>
+        </a-col>
+        <a-col :span="24">
+          <a-form-item  label="调用方式" name="isasyn" :rules="[{ required: true, message: '请选择调用方式' }]">
+            <a-radio-group v-model:value="form.isasyn">
+              <a-radio :value="1">同步</a-radio>
+              <a-radio :value="0">异步</a-radio>
+            </a-radio-group>
+          </a-form-item>
+        </a-col>
+        <a-col :span="24">
+          <a-form-item  label="选择属性" name="w_dataparamids" :rules="[{ required: true, message: '请选择属性' }]">
+            <SelectModel 
+              ref="Param" 
+              @selectRowData="selectDataInfo" 
+              rowKey="w_dataparamid" 
+              :param="dataParam" 
+              :columns="utils.TBLayout('dataparamTable')" title="选择产品属性"
+            >
+              <template v-slot:slot1>
+                <template v-for="(tag, index) in state.tags" :key="tag">
+                  <a-tooltip :title="tag">
+                    <a-tag :closable="true" @close="handleCloseParam(tag)">
+                      {{ tag }}
+                    </a-tag>
+                  </a-tooltip>
+                </template>
+                <a-input
+                  v-if="state.inputVisible"
+                  ref="inputRef"
+                  v-model:value="form.w_dataparamids"
+                  type="text"
+                  size="small"
+                  :style="{ width: '78px' }"
+                  @blur="handleInputConfirm"
+                  @keyup.enter="handleInputConfirm"
+                />
+                <a-tag v-else style="background: #fff; border-style: dashed" @click="showInput">
+                  <plus-outlined />
+                  添 加 +
+                </a-tag>
+              </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, onMounted, nextTick} 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 { useRouter } from 'vue-router'
+
+let router = useRouter()
+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_functionid": 0,
+  "ownertable": "w_device",
+  "ownerid": "",
+  "func": "",
+  "funcname": "",
+  "isasyn": 0,
+  "w_dataparamids": [],
+  "remarks":""
+})
+let dataParam = ref({
+  "id": 20230613091602,
+  "content": {
+    "ownertable": "w_device",
+    "ownerid": router.currentRoute.value.query.id,
+    "pageNumber": 1,
+    "pageSize": 20,
+    "where": {
+        "condition": "",
+        "datatype": "",
+        "rwtype": ""
+    }
+  },
+})
+let state = ref({
+  tags: [],
+  inputVisible: false,
+  inputValue: '',
+})
+let formRef = ref()
+let inputRef = ref()
+let Param = ref()
+
+let addBtn = () => {
+  visible.value = true
+  form.value = Object.assign({},form.value,props.data)
+  form.value.ownerid = router.currentRoute.value.query.id
+}
+let onSubmit = async () => {
+  form.value.w_dataparamids = form.value.w_dataparamids.map(item => item.w_dataparamid)
+  let isCheck = await formRef.value.validateFields()
+  if (!isCheck) return
+  let res = await Api.requested({
+    id:20230613152502,
+    content: form.value
+  })
+  utils.message(res,'新建成功',() => {
+    visible.value = false
+    emit('onSuccess')
+    formRef.value.resetFields()
+    state.value = {
+      tags: [],
+      inputVisible: false,
+      inputValue: '',
+    }
+  })
+}
+let showInput = () => {
+  state.value.inputVisible = true;
+  Param.value.modeVisible = true
+  nextTick(() => {
+    inputRef.value.focus();
+  });
+}
+
+let handleCloseParam = (removedTag) => {
+  const tags = state.value.tags.filter(tag => tag !== removedTag);
+  state.value.tags = tags;
+  form.value.w_dataparamids.splice(form.value.w_dataparamids.indexOf(form.value.w_dataparamids.filter(item => item.paramname == removedTag)[0]),1)
+}
+
+let handleInputConfirm = () => {
+  const inputValue = state.value.inputValue;
+  let tags = state.value.tags;
+  if (inputValue && tags.indexOf(inputValue) === -1) {
+    tags = [...tags, inputValue];
+  }
+  Object.assign(state.value, {
+    tags,
+    inputVisible: false,
+    inputValue: '',
+  });
+}
+
+let selectDataInfo = (data) => {
+  form.value.w_dataparamids = data
+  state.value.tags = data.map(item => item.paramname)
+  Param.value.modeVisible = false
+  console.log(state.value.tags);
+}
+</script>
+
+<style scoped>
+
+</style>

+ 198 - 0
src/operation/moduleNormal/equipmentMag/detail/modules/serveTable/modules/Edit.vue

@@ -0,0 +1,198 @@
+<template>
+  <a-button type="link" @click="editBtn" style="margin-right:16px" :disabled="disabled">编辑</a-button>
+  <a-drawer
+    v-model:visible="visible"
+    class="custom-class"
+    title="编辑产品功能"
+    placement="right"
+    width="600px"
+    :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="devicename" :rules="[{ required: true, message: '请输入' }]">
+            <a-input readonly v-model:value="form.devicename" placeholder="请输入"></a-input>
+          </a-form-item>
+        </a-col> -->
+        <a-col :span="24">
+          <a-form-item  label="标识" name="func" :rules="[{ required: true, message: '请输入标识' }]">
+            <a-input :disabled="true" v-model:value="form.func" placeholder="请输入标识"></a-input>
+          </a-form-item>
+        </a-col>
+        <a-col :span="24">
+          <a-form-item  label="功能名称" name="funcname" :rules="[{ required: true, message: '请输入功能名称' }]">
+            <a-input v-model:value="form.funcname" placeholder="请输入功能名称"></a-input>
+          </a-form-item>
+        </a-col>
+        <a-col :span="24">
+          <a-form-item  label="调用方式" name="isasyn" :rules="[{ required: true, message: '请选择调用方式' }]">
+            <a-radio-group v-model:value="form.isasyn">
+              <a-radio :value="1">同步</a-radio>
+              <a-radio :value="0">异步</a-radio>
+            </a-radio-group>
+          </a-form-item>
+        </a-col>
+        <a-col :span="24">
+          <a-form-item  label="选择属性" name="w_dataparamids" :rules="[{ required: true, message: '请选择属性' }]">
+            <SelectModel 
+              ref="Param" 
+              @selectRowData="selectDataInfo" 
+              rowKey="w_dataparamid" 
+              :param="dataParam" 
+              :columns="utils.TBLayout('dataparamTable')" title="选择产品属性"
+            >
+              <template v-slot:slot1>
+                <template v-for="(tag, index) in state.tags" :key="tag">
+                  <a-tooltip :title="tag">
+                    <a-tag :closable="true" @close="handleCloseParam(tag)">
+                      {{ tag }}
+                    </a-tag>
+                  </a-tooltip>
+                </template>
+                <a-input
+                  v-if="state.inputVisible"
+                  ref="inputRef"
+                  v-model:value="form.w_dataparamids"
+                  type="text"
+                  size="small"
+                  :style="{ width: '78px' }"
+                  @blur="handleInputConfirm"
+                  @keyup.enter="handleInputConfirm"
+                />
+                <a-tag v-else style="background: #fff; border-style: dashed" @click="showInput">
+                  <plus-outlined />
+                  添 加 +
+                </a-tag>
+              </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, onMounted, nextTick} 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 { useRouter } from 'vue-router'
+
+let router = useRouter()
+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_functionid": 0,
+  "ownertable": "w_device",
+  "ownerid": "",
+  "func": "",
+  "funcname": "",
+  "isasyn": 0,
+  "w_dataparamids": [],
+  "remarks":""
+})
+let dataParam = ref({
+  "id": 20230613091602,
+  "content": {
+    "ownertable": "w_device",
+    "ownerid": router.currentRoute.value.query.id,
+    "pageNumber": 1,
+    "pageSize": 20,
+    "where": {
+        "condition": "",
+        "datatype": "",
+        "rwtype": ""
+    }
+  },
+})
+let state = ref({
+  tags: [],
+  inputVisible: false,
+  inputValue: '',
+})
+let formRef = ref()
+let inputRef = ref()
+let Param = ref()
+
+let editBtn = () => {
+  visible.value = true
+  form.value = Object.assign({},form.value,props.data)
+  form.value.ownerid = router.currentRoute.value.query.id
+  state.value.tags = props.data.dataparam.map(item => item.paramname)
+  form.value.w_dataparamids = props.data.dataparam
+}
+let onSubmit = async () => {
+  form.value.w_dataparamids = form.value.w_dataparamids.map(item => item.w_dataparamid)
+  let isCheck = await formRef.value.validateFields()
+  if (!isCheck) return
+  let res = await Api.requested({
+    id:20230613152502,
+    content: form.value
+  })
+  utils.message(res,'新建成功',() => {
+    visible.value = false
+    emit('onSuccess')
+    formRef.value.resetFields()
+    state.value = {
+      tags: [],
+      inputVisible: false,
+      inputValue: '',
+    }
+  })
+}
+let showInput = () => {
+  state.value.inputVisible = true;
+  Param.value.modeVisible = true
+  nextTick(() => {
+    inputRef.value.focus();
+  });
+}
+
+let handleCloseParam = (removedTag) => {
+  const tags = state.value.tags.filter(tag => tag !== removedTag);
+  state.value.tags = tags;
+  form.value.w_dataparamids.splice(form.value.w_dataparamids.indexOf(form.value.w_dataparamids.filter(item => item.paramname == removedTag)[0]),1)
+}
+
+let handleInputConfirm = () => {
+  const inputValue = state.value.inputValue;
+  let tags = state.value.tags;
+  if (inputValue && tags.indexOf(inputValue) === -1) {
+    tags = [...tags, inputValue];
+  }
+  Object.assign(state.value, {
+    tags,
+    inputVisible: false,
+    inputValue: '',
+  });
+}
+
+let selectDataInfo = (data) => {
+  form.value.w_dataparamids = data
+  state.value.tags = data.map(item => item.paramname)
+  Param.value.modeVisible = false
+  console.log(state.value.tags);
+}
+</script>
+
+<style scoped>
+
+</style>

+ 1 - 1
src/operation/moduleNormal/productCategory/index.vue

@@ -35,7 +35,7 @@ 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 searchType = ref([{label:'搜索',key:'condition',type:'input'}])
 let param = ref({
     "id": 20230609105302,
     "content": {},

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

@@ -6,7 +6,6 @@
       :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]) && !utils.hasPermission('update')" :data="userData" @onSuccess="mianData"></Edit>

+ 3 - 1
src/operation/moduleNormal/productManage/detail/modules/attributeTab/modules/Add.vue

@@ -132,7 +132,9 @@ import {ref, defineProps, defineEmits, onMounted} from 'vue'
 import Api from '@/api/api'
 import utils from '@/utils/utils'
 import { useBaseStore } from '@/stores/modules/base'
+import { useRouter } from 'vue-router'
 
+let router = useRouter()
 let base = useBaseStore()
 let emit = defineEmits(['onSuccess'])
 let props = defineProps(['data','disabled'])
@@ -164,7 +166,7 @@ let unitList = ref([])
 let addBtn = () => {
   visible.value = true
   form.value = Object.assign({},form.value,props.data)
-  form.value.ownerid = props.data.w_productid
+  form.value.ownerid = router.currentRoute.value.query.id
 }
 let onSubmit = async () => {
   let isCheck = await formRef.value.validateFields()

+ 3 - 1
src/operation/moduleNormal/productManage/detail/modules/attributeTab/modules/Edit.vue

@@ -128,7 +128,9 @@ import {ref, defineProps, defineEmits, onMounted} from 'vue'
 import Api from '@/api/api'
 import utils from '@/utils/utils'
 import { useBaseStore } from '@/stores/modules/base'
+import { useRouter } from 'vue-router'
 
+let router = useRouter()
 let base = useBaseStore()
 let emit = defineEmits(['onSuccess'])
 let props = defineProps(['data'])
@@ -160,7 +162,7 @@ let unitList = ref([])
 let editBtn = () => {
   visible.value = true
   form.value = Object.assign({},form.value,props.data)
-  form.value.ownerid = props.data.w_productid
+  form.value.ownerid = router.currentRoute.value.query.id
   console.log(props.data);
 }
 let onSubmit = async () => {

+ 2 - 2
src/operation/moduleNormal/productManage/detail/modules/serveTable/modules/Add.vue

@@ -29,8 +29,8 @@
         <a-col :span="24">
           <a-form-item  label="调用方式" name="isasyn" :rules="[{ required: true, message: '请选择调用方式' }]">
             <a-radio-group v-model:value="form.isasyn">
-              <a-radio :value="0">同步</a-radio>
-              <a-radio :value="1">异步</a-radio>
+              <a-radio :value="1">同步</a-radio>
+              <a-radio :value="0">异步</a-radio>
             </a-radio-group>
           </a-form-item>
         </a-col>

+ 2 - 2
src/operation/moduleNormal/productManage/detail/modules/serveTable/modules/Edit.vue

@@ -29,8 +29,8 @@
         <a-col :span="24">
           <a-form-item  label="调用方式" name="isasyn" :rules="[{ required: true, message: '请选择调用方式' }]">
             <a-radio-group v-model:value="form.isasyn">
-              <a-radio :value="0">同步</a-radio>
-              <a-radio :value="1">异步</a-radio>
+              <a-radio :value="1">同步</a-radio>
+              <a-radio :value="0">异步</a-radio>
             </a-radio-group>
           </a-form-item>
         </a-col>

+ 1 - 1
src/operation/moduleNormal/productManage/modules/selectSiteProduct.vue

@@ -61,7 +61,7 @@
     </normalTable>
     <template #extra>
       <a-space>
-        <a-button @click="visible=false">关闭</a-button>
+        <a-button @click="modeVisible=false">关闭</a-button>
       </a-space>
     </template>
   </a-drawer>

+ 1 - 1
src/template/normalTable/index.vue

@@ -75,7 +75,7 @@
   }
   const onSelect = async (record, selected, selectedRows, nativeEvent)=>{
     if (!selected) {
-      tableRecord.value = tableRecord.value.filter(e=>e.itemid !== record.itemid)
+      tableRecord.value = tableRecord.value.filter(e=>e[props.rowKey] !== record[props.rowKey])
     } else {
       tableRecord.value.push(record)
     }

Alguns ficheiros não foram mostrados porque muitos ficheiros mudaram neste diff