Quellcode durchsuchen

Merge remote-tracking branch 'origin/master'

qymljy vor 2 Jahren
Ursprung
Commit
6a3ccb94db
56 geänderte Dateien mit 966 neuen und 43 gelöschten Zeilen
  1. 1 0
      dist/assets/404-0653601a.css
  2. 1 0
      dist/assets/404-4e04255f.js
  3. BIN
      dist/assets/404-feaffb97.png
  4. 1 0
      dist/assets/Htabs-703e5821.js
  5. 1 0
      dist/assets/_plugin-vue_export-helper-c27b6911.js
  6. 0 0
      dist/assets/base-c39f1b8c.js
  7. BIN
      dist/assets/bg-4325a45f.png
  8. 1 0
      dist/assets/index-069d14d2.css
  9. 0 0
      dist/assets/index-16f386db.js
  10. 0 0
      dist/assets/index-1d5609e3.js
  11. 1 0
      dist/assets/index-32dd36bf.css
  12. 0 0
      dist/assets/index-3a0b123b.js
  13. 1 0
      dist/assets/index-3aa2d873.css
  14. 0 0
      dist/assets/index-44f8fc91.js
  15. 0 0
      dist/assets/index-47737b1f.js
  16. 0 0
      dist/assets/index-4decbaf0.js
  17. 0 0
      dist/assets/index-502fb8e3.js
  18. 1 0
      dist/assets/index-5173189f.js
  19. 1 0
      dist/assets/index-58285ce5.css
  20. 0 0
      dist/assets/index-6261ff6a.js
  21. 0 0
      dist/assets/index-66d2df01.js
  22. 0 0
      dist/assets/index-83404465.js
  23. 0 0
      dist/assets/index-8583f4fa.js
  24. 1 0
      dist/assets/index-89c0df0e.js
  25. 1 0
      dist/assets/index-8d631f6c.css
  26. 0 0
      dist/assets/index-8f1f711c.js
  27. 1 0
      dist/assets/index-914d7a80.css
  28. 0 0
      dist/assets/index-9c227ebf.js
  29. 0 0
      dist/assets/index-ae488f41.js
  30. 0 0
      dist/assets/index-b34a4c3a.js
  31. 0 0
      dist/assets/index-b610b06f.js
  32. 0 0
      dist/assets/index-b7163339.js
  33. 0 0
      dist/assets/index-c1e373d7.css
  34. 1 0
      dist/assets/index-f238ac59.js
  35. 0 0
      dist/assets/index-f9265051.js
  36. 0 0
      dist/assets/index-fcf0b4ea.js
  37. 1 0
      dist/assets/login-98bec718.css
  38. 8 0
      dist/assets/login-d79ce969.js
  39. BIN
      dist/assets/logo@2x-bb108775.png
  40. 0 0
      dist/assets/vue-9b2e4ac7.js
  41. 4 0
      dist/assets/vue-router-d1c3bcbb.js
  42. 17 0
      dist/index.html
  43. 1 0
      dist/vite.svg
  44. 1 1
      src/components/customHandleBtn/index.vue
  45. 67 4
      src/operation/moduleNormal/productManage/detail/index.vue
  46. 43 11
      src/operation/moduleNormal/productManage/detail/modules/attributeTab/index.vue
  47. 59 17
      src/operation/moduleNormal/productManage/detail/modules/attributeTab/modules/Add.vue
  48. 199 0
      src/operation/moduleNormal/productManage/detail/modules/attributeTab/modules/Edit.vue
  49. 98 0
      src/operation/moduleNormal/productManage/detail/modules/serveTable/index.vue
  50. 196 0
      src/operation/moduleNormal/productManage/detail/modules/serveTable/modules/Add.vue
  51. 198 0
      src/operation/moduleNormal/productManage/detail/modules/serveTable/modules/Edit.vue
  52. 47 2
      src/operation/moduleNormal/productManage/index.vue
  53. 7 5
      src/operation/moduleNormal/productManage/modules/selectSiteProduct.vue
  54. 2 2
      src/router/modelNormal.js
  55. 4 0
      src/style.less
  56. 1 1
      src/template/defaultInfo/index.vue

+ 1 - 0
dist/assets/404-0653601a.css

@@ -0,0 +1 @@
+.noPage_container{height:100vh;display:flex;flex-direction:column;align-items:center;justify-content:space-around}.noPage_container img{width:40%}.btn_penal{width:300px;text-align:center;margin:40px auto}.btn_penal .el-button{width:120px}

+ 1 - 0
dist/assets/404-4e04255f.js

@@ -0,0 +1 @@
+import{_ as i}from"./_plugin-vue_export-helper-c27b6911.js";import{U as a,V as p,W as u,$ as r,j as t,X as o,G as _}from"./vue-9b2e4ac7.js";const f=""+new URL("404-feaffb97.png",import.meta.url).href;const d={},m={class:"noPage_container"},v=r("img",{src:f,alt:""},null,-1);function k(n,e){const s=a("a-button"),c=a("a-space");return p(),u("div",null,[r("div",m,[v,t(c,null,{default:o(()=>[t(s,{onClick:e[0]||(e[0]=l=>n.$router.push({path:"/home"})),type:"info"},{default:o(()=>[_("首页")]),_:1}),t(s,{onClick:e[1]||(e[1]=l=>n.$router.back()),type:"info"},{default:o(()=>[_("返回上一页")]),_:1})]),_:1})])])}const g=i(d,[["render",k]]);export{g as default};

BIN
dist/assets/404-feaffb97.png


+ 1 - 0
dist/assets/Htabs-703e5821.js

@@ -0,0 +1 @@
+import{d as i,r}from"./index-8f1f711c.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};

+ 1 - 0
dist/assets/_plugin-vue_export-helper-c27b6911.js

@@ -0,0 +1 @@
+const s=(t,r)=>{const o=t.__vccOpts||t;for(const[c,e]of r)o[c]=e;return o};export{s as _};

Datei-Diff unterdrückt, da er zu groß ist
+ 0 - 0
dist/assets/base-c39f1b8c.js


BIN
dist/assets/bg-4325a45f.png


+ 1 - 0
dist/assets/index-069d14d2.css

@@ -0,0 +1 @@
+.fieldPanel{margin-bottom:10px}#components-form-demo-advanced-search .ant-form{max-width:none}#components-form-demo-advanced-search .search-result-list{margin-top:16px;border:1px dashed #e9e9e9;border-radius:2px;background-color:#fafafa;min-height:200px;text-align:center;padding-top:80px}[data-theme=dark] .ant-advanced-search-form{background:rgba(255,255,255,.04);border:1px solid #434343;padding:24px;border-radius:2px}[data-theme=dark] #components-form-demo-advanced-search .search-result-list{border:1px dashed #434343;background:rgba(255,255,255,.04)}.btn-link[data-v-68f4815e]{text-decoration:underline}.ant-table-striped[data-v-68f4815e] td{font-size:12px}.ant-table-striped[data-v-68f4815e] .table-striped td{background-color:#fafafa}.flex[data-v-68f4815e]{display:flex;justify-content:space-between;align-items:center}.pointer[data-v-68f4815e]{cursor:pointer;flex:1;text-align:right}.ant-dropdown-link[data-v-68f4815e]{color:#333}

Datei-Diff unterdrückt, da er zu groß ist
+ 0 - 0
dist/assets/index-16f386db.js


Datei-Diff unterdrückt, da er zu groß ist
+ 0 - 0
dist/assets/index-1d5609e3.js


+ 1 - 0
dist/assets/index-32dd36bf.css

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

Datei-Diff unterdrückt, da er zu groß ist
+ 0 - 0
dist/assets/index-3a0b123b.js


+ 1 - 0
dist/assets/index-3aa2d873.css

@@ -0,0 +1 @@
+.btn-link[data-v-103da97b]{text-decoration:underline}

Datei-Diff unterdrückt, da er zu groß ist
+ 0 - 0
dist/assets/index-44f8fc91.js


Datei-Diff unterdrückt, da er zu groß ist
+ 0 - 0
dist/assets/index-47737b1f.js


Datei-Diff unterdrückt, da er zu groß ist
+ 0 - 0
dist/assets/index-4decbaf0.js


Datei-Diff unterdrückt, da er zu groß ist
+ 0 - 0
dist/assets/index-502fb8e3.js


+ 1 - 0
dist/assets/index-5173189f.js

@@ -0,0 +1 @@
+import{l as n}from"./index-3a0b123b.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-8f1f711c.js";import"./base-c39f1b8c.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-58285ce5.css

@@ -0,0 +1 @@
+.y-container[data-v-a6dda130]{padding:0 10px 10px}.flex-between[data-v-a6dda130]{display:flex;align-items:center;justify-content:space-between}.flex-align-center[data-v-a6dda130]{display:flex;align-items:center}.mt-10[data-v-a6dda130]{margin-bottom:10px}

Datei-Diff unterdrückt, da er zu groß ist
+ 0 - 0
dist/assets/index-6261ff6a.js


Datei-Diff unterdrückt, da er zu groß ist
+ 0 - 0
dist/assets/index-66d2df01.js


Datei-Diff unterdrückt, da er zu groß ist
+ 0 - 0
dist/assets/index-83404465.js


Datei-Diff unterdrückt, da er zu groß ist
+ 0 - 0
dist/assets/index-8583f4fa.js


+ 1 - 0
dist/assets/index-89c0df0e.js

@@ -0,0 +1 @@
+import{l as d}from"./index-3a0b123b.js";import{A as m}from"./index-8f1f711c.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-c39f1b8c.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};

+ 1 - 0
dist/assets/index-8d631f6c.css

@@ -0,0 +1 @@
+.ant-table-striped[data-v-ef173f70] td{font-size:12px}

Datei-Diff unterdrückt, da er zu groß ist
+ 0 - 0
dist/assets/index-8f1f711c.js


+ 1 - 0
dist/assets/index-914d7a80.css

@@ -0,0 +1 @@
+.sw-header[data-v-f6230b97]{display:flex;align-items:center;justify-content:space-between;height:56px;padding:0 32px 0 16px}.ant-dropdown-link[data-v-f6230b97]{color:#fff}.asides[data-v-0dc6a2d1]{position:relative;width:58px;transition:.1s ease-out all;box-shadow:-2px 0 6px 1px #000b15;z-index:999}.aside-item[data-v-0dc6a2d1]{cursor:pointer;color:#333;margin:10px 0 35px;transition:.1s linear;overflow:hidden}.logo-panel[data-v-0dc6a2d1]{padding:10px;margin-bottom:10px;border-bottom:1px solid #f1f2f3;background:#fff}.logo-panel h4[data-v-0dc6a2d1]{color:#333;margin:0 0 0 10px}.flex[data-v-0dc6a2d1]{display:flex;align-items:center;justify-content:space-between}.menu-icon[data-v-0dc6a2d1]{display:inline-block;height:30px;width:100%;font-size:14px;text-align:center;line-height:30px}.collapsed[data-v-0dc6a2d1]{display:block;padding:0 20px}.onSystem .uncollapsed[data-v-0dc6a2d1]{color:#333}.sw-tabs[data-v-110e5460]{background:#E4E7EB}.site-layout-content{min-height:280px;padding:24px;background:#fff}#components-layout-demo-top .logo{float:left;width:120px;height:31px;margin:16px 24px 16px 0;background:rgba(255,255,255,.3)}.ant-row-rtl #components-layout-demo-top .logo{float:right;margin:16px 0 16px 24px}[data-theme=dark] .site-layout-content{background:#fff}.content-height{flex:1;height:calc(100vh - 56px);overflow-y:scroll}.flex{display:flex}.scale-enter-active,.scale-leave-active{transition:all .5s ease}.scale-enter-from,.scale-leave-to{opacity:0;transform:scale(.9)}

Datei-Diff unterdrückt, da er zu groß ist
+ 0 - 0
dist/assets/index-9c227ebf.js


Datei-Diff unterdrückt, da er zu groß ist
+ 0 - 0
dist/assets/index-ae488f41.js


Datei-Diff unterdrückt, da er zu groß ist
+ 0 - 0
dist/assets/index-b34a4c3a.js


Datei-Diff unterdrückt, da er zu groß ist
+ 0 - 0
dist/assets/index-b610b06f.js


Datei-Diff unterdrückt, da er zu groß ist
+ 0 - 0
dist/assets/index-b7163339.js


Datei-Diff unterdrückt, da er zu groß ist
+ 0 - 0
dist/assets/index-c1e373d7.css


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

@@ -0,0 +1 @@
+import{n as k}from"./index-44f8fc91.js";import{m as v}from"./index-8f1f711c.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 _};

Datei-Diff unterdrückt, da er zu groß ist
+ 0 - 0
dist/assets/index-f9265051.js


Datei-Diff unterdrückt, da er zu groß ist
+ 0 - 0
dist/assets/index-fcf0b4ea.js


+ 1 - 0
dist/assets/login-98bec718.css

@@ -0,0 +1 @@
+.conatiner[data-v-ebf9c0fd]{background:url(./bg-4325a45f.png);background-size:cover}.title[data-v-ebf9c0fd]{height:33px;margin:0 0 30px;color:#202d40;font-size:1.25rem;font-weight:600;animation:showup 3s forwards}.login-wrap[data-v-ebf9c0fd]{overflow:hidden}.login-wrap .top[data-v-ebf9c0fd]{width:100%;background:#f3f4f591}.login-wrap .top[data-v-ebf9c0fd]{height:calc(100vh - 70px);width:100%}.login-wrap svg[data-v-ebf9c0fd]{height:70%}.login-form[data-v-ebf9c0fd]{position:absolute;right:50%;top:50vh;width:500px;margin-right:-250px;margin-top:-244px;padding:30px;background-color:#fff;border-radius:5px;box-shadow:0 0 12px #0000001a;z-index:9999}.input-wrap[data-v-ebf9c0fd]{width:100%}.color-info[data-v-ebf9c0fd]{color:#999;font-weight:300}.introduce[data-v-ebf9c0fd]{position:absolute;left:10%;top:10vh;font-size:20px;color:#fff;text-indent:3rem;line-height:3rem;text-shadow:0 0px 5px #666}.introduce[data-v-ebf9c0fd]{white-space:pre-wrap;overflow:hidden;max-width:700px;animation:typingH-ebf9c0fd 5s forwards;display:inline-block}.introduce[data-v-ebf9c0fd]:after{content:"";display:inline-block;width:5px;height:1.2em;margin-left:5px}@keyframes typingH-ebf9c0fd{0%{height:0px}to{height:300px}}@media (max-width: 1600px){.login-form[data-v-ebf9c0fd]{transform:scale(.8)}.introduce[data-v-ebf9c0fd]{font-size:15px}}

Datei-Diff unterdrückt, da er zu groß ist
+ 8 - 0
dist/assets/login-d79ce969.js


BIN
dist/assets/logo@2x-bb108775.png


Datei-Diff unterdrückt, da er zu groß ist
+ 0 - 0
dist/assets/vue-9b2e4ac7.js


Datei-Diff unterdrückt, da er zu groß ist
+ 4 - 0
dist/assets/vue-router-d1c3bcbb.js


+ 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-8f1f711c.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-c1e373d7.css">
+  </head>
+  <body>
+    <div id="app"></div>
+    
+  </body>
+</html>

+ 1 - 0
dist/vite.svg

@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="31.88" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 257"><defs><linearGradient id="IconifyId1813088fe1fbc01fb466" x1="-.828%" x2="57.636%" y1="7.652%" y2="78.411%"><stop offset="0%" stop-color="#41D1FF"></stop><stop offset="100%" stop-color="#BD34FE"></stop></linearGradient><linearGradient id="IconifyId1813088fe1fbc01fb467" x1="43.376%" x2="50.316%" y1="2.242%" y2="89.03%"><stop offset="0%" stop-color="#FFEA83"></stop><stop offset="8.333%" stop-color="#FFDD35"></stop><stop offset="100%" stop-color="#FFA800"></stop></linearGradient></defs><path fill="url(#IconifyId1813088fe1fbc01fb466)" d="M255.153 37.938L134.897 252.976c-2.483 4.44-8.862 4.466-11.382.048L.875 37.958c-2.746-4.814 1.371-10.646 6.827-9.67l120.385 21.517a6.537 6.537 0 0 0 2.322-.004l117.867-21.483c5.438-.991 9.574 4.796 6.877 9.62Z"></path><path fill="url(#IconifyId1813088fe1fbc01fb467)" d="M185.432.063L96.44 17.501a3.268 3.268 0 0 0-2.634 3.014l-5.474 92.456a3.268 3.268 0 0 0 3.997 3.378l24.777-5.718c2.318-.535 4.413 1.507 3.936 3.838l-7.361 36.047c-.495 2.426 1.782 4.5 4.151 3.78l15.304-4.649c2.372-.72 4.652 1.36 4.15 3.788l-11.698 56.621c-.732 3.542 3.979 5.473 5.943 2.437l1.313-2.028l72.516-144.72c1.215-2.423-.88-5.186-3.54-4.672l-25.505 4.922c-2.396.462-4.435-1.77-3.759-4.114l16.646-57.705c.677-2.35-1.37-4.583-3.769-4.113Z"></path></svg>

+ 1 - 1
src/components/customHandleBtn/index.vue

@@ -38,7 +38,7 @@ let onClick = () => {
         param.content[item.key] = item.value
       })
       let res = await Api.requested(param)
-      utils.message(res,() => {
+      utils.message(res,'操作成功',() => {
         emit('onSuccess')
       })
     },

+ 67 - 4
src/operation/moduleNormal/productManage/detail/index.vue

@@ -10,16 +10,41 @@
       >
       <template #operation>
         <Edit :disabled="utils.isDisabled(userData.isedit,[0])" :data="userData" @onSuccess="mianData"></Edit>
+        <customBtn
+          :btnName="userData.isused ? '禁用' : '启用'"
+          idName="20230609160002"
+          keyName="w_productid"
+          :id="userData.w_productid"
+          type="primary"
+          size="middle"
+          :paramData="[{key:'isused',value:userData.isused ? 0 : 1}]"
+          :message="userData.isused ? '确定禁用当前产品吗?' : '确定启用当起产品吗?'"
+          @onSuccess="mianData"
+        />
       </template>
       <template #tab0>
+        <p class="normal-title">基本信息</p>
+        <defaultInfo :data="defaultInfoData" style="margin-bottom: 16px;"></defaultInfo>
+        <p class="normal-title">系统信息</p>
+        <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="server">功能定义</a-radio-button>
           <a-radio-button value="event">事件定义</a-radio-button>
         </a-radio-group>
-        <AttributeTab :data="userData"></AttributeTab>
+        <AttributeTab :data="userData" ref="attributeTab" v-if="currentInfoModel == 'attribute'">
+          <template #add>
+            <AddAttrite :data="userData" @onSuccess="$refs.attributeTab.$refs.list.listData()"></AddAttrite>
+          </template>
+        </AttributeTab>
+
+        <serveTable :data="userData" ref="serveTab" v-if="currentInfoModel == 'server'">
+          <template #add>
+            <AddServe :data="userData" @onSuccess="serveSuccess"></AddServe>
+          </template>
+        </serveTable>
       </template>
     </detail-template>
   </div>
@@ -31,8 +56,13 @@ import utils  from '@/utils/utils'
 
 import normalTable from '@/template/normalTable/index.vue'
 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 { message, Modal } from 'ant-design-vue'
 import { ExclamationCircleOutlined } from '@ant-design/icons-vue'
 import { useRouter } from "vue-router";
@@ -42,6 +72,10 @@ const mainAreaData = ref([])
 
 let currentInfoModel = ref('attribute')
 const userData = ref({})
+let defaultInfoData = ref([])
+let systemInfoData = ref([])
+let serveTab = ref()
+
 const mianData = async ()=>{
   const res = await Api.requested({
     "id":20230612152502,
@@ -52,7 +86,6 @@ const mianData = async ()=>{
   userData.value = res.data
   console.log(userData.value);
   changeDataStructure(res.data)
-
 }
 const changeDataStructure = (data) => {
   mainAreaData.value = [
@@ -74,13 +107,43 @@ const changeDataStructure = (data) => {
     },
     {
       label:'状态',
-      value:data.isused ? '启用':'停用'
+      value:data.isused ? '启用':'停用',
+      style:() => {
+        let style = {}
+        style.color = utils.statusAndColor(userData.value.isused ? '启用' : '禁用')
+        return style
+      }
     },
     {
       label:'描述',
       value:data.remarks
     },
   ]
+  defaultInfoData.value = [
+    {label:'产品编码',value:userData.value.prodnum},
+    {label:'产品名称',value:userData.value.prodname},
+    {label:'设备类型',value:userData.value.prodtype},
+    {label:'厂商',value:userData.value.enterprisename},
+    {label:'状态',value:userData.value.isused ? '启用' : '禁用',style:() => {
+      let style = {}
+      style.color = utils.statusAndColor(userData.value.isused ? '启用' : '禁用')
+      return style
+    }},
+    {label:'设备数量',value:userData.value.device_count},
+    {label:'描述',value:userData.value.remarks},
+  ]
+  systemInfoData.value = [
+    {label:'创建时间',value:userData.value.createdate},
+    {label:'创建人',value:userData.value.createby},
+    {label:'最近编辑时间',value:userData.value.changedate},
+    {label:'最近编辑人',value:userData.value.changeby},
+    {label:'描述',value:userData.value.remarks},
+  ]
+}
+
+let serveSuccess = () => {
+  serveTab.value.param.content.ownerid = router.currentRoute.value.query.id
+  serveTab.value.$refs.list.listData()
 }
 onMounted (()=>{
   mianData()

+ 43 - 11
src/operation/moduleNormal/productManage/detail/modules/attributeTab/index.vue

@@ -1,11 +1,25 @@
 <template>
   <normalTable rowKey="w_dataparamid" ref="list" size="small" :param="param" :columns="utils.TBLayout('dataparamTable')">
     <template #tb_cell="{data}">
-      {{ data.record[data.column.dataIndex] }}
+      <div v-if="data.column.dataIndex == 'operation'">
+        <Edit :data="data.record"></Edit>
+        <customBtn
+          btnName="删 除"
+          idName="20230613091502"
+          keyName="w_dataparamid"
+          :id="data.record.w_dataparamid"
+          type="link"
+          message="确定删除当前产品属性吗?"
+          @onSuccess="$refs.list.listData()"
+        />
+      </div>
+      <div v-else>
+        {{ data.record[data.column.dataIndex] }}
+      </div>
     </template>
     <template #operation>
       <div style="display:flex;margin-bottom:16px">
-        <Add :data="data"></Add>
+        <slot name="add"></slot>
         <div style="margin-right:16px">
           <span>数据类型:</span>
           <a-select
@@ -13,8 +27,10 @@
             v-model:value="param.content.where.datatype"
             placeholder="选择数据类型"
             style="width: 200px"
+            @change="$refs.list.listData()"
+            allowClear
           >
-            <a-select-option value="jack">Jack</a-select-option>
+            <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">
@@ -22,14 +38,17 @@
           <a-select
             ref="select"
             v-model:value="param.content.where.rwtype"
-            placeholder="选择数据类型"
+            placeholder="选择读写类型"
             style="width: 200px"
+            @change="$refs.list.listData()"
+            allowClear
           >
-            <a-select-option value="jack">Jack</a-select-option>
+            <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>
@@ -37,27 +56,40 @@
 <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 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_product",
-    "ownerid": 1,
+    "ownerid": router.currentRoute.value.query.id,
     "pageNumber": 1,
     "pageSize": 20,
     "where": {
         "condition": "",
-        "datatype": "",
-        "rwtype": ""
+        "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>

+ 59 - 17
src/operation/moduleNormal/productManage/detail/modules/attributeTab/modules/Add.vue

@@ -1,9 +1,9 @@
 <template>
-  <a-button type="primary" @click="addBtn">新建</a-button>
+  <a-button type="primary" @click="addBtn" style="margin-right:16px">新建</a-button>
   <a-drawer
     v-model:visible="visible"
     class="custom-class"
-    title="新建区域"
+    title="新建产品属性"
     placement="right"
     width="800px"
     :closable="false"
@@ -17,7 +17,12 @@
           </a-form-item>
         </a-col>
         <a-col :span="12">
-          <a-form-item  label="标识" name="paramname" :rules="[{ required: true, message: '请输入标识' }]">
+          <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>
@@ -44,15 +49,30 @@
           <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>
@@ -68,6 +88,29 @@
             </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>
@@ -99,18 +142,18 @@ 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,
+  "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()
@@ -126,9 +169,8 @@ let addBtn = () => {
 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,
+    id:20230612161402,
     content: form.value
   })
   utils.message(res,'新建成功',() => {

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

@@ -0,0 +1,199 @@
+<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="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="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'
+
+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": "",
+  "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 = props.data.w_productid
+  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>

+ 98 - 0
src/operation/moduleNormal/productManage/detail/modules/serveTable/index.vue

@@ -0,0 +1,98 @@
+<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()"></Edit>
+        <customBtn
+          btnName="删 除"
+          idName="20230613162902"
+          keyName="w_functionid"
+          :id="data.record.w_functionid"
+          type="link"
+          message="确定删除当前产品功能吗?"
+          @onSuccess="$refs.list.listData()"
+        />
+      </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_product",
+    "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/productManage/detail/modules/serveTable/modules/Add.vue

@@ -0,0 +1,196 @@
+<template>
+  <a-button type="primary" @click="addBtn" style="margin-right:16px">新建</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="prodname" :rules="[{ required: true, message: '请选择产品' }]">
+            <a-input readonly v-model:value="form.prodname" 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="0">同步</a-radio>
+              <a-radio :value="1">异步</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'])
+let searchType = ref([{label:'搜索',key:'condition',type:'input'}])
+let visible = ref(false)
+let form = ref({
+  "w_functionid": 0,
+  "ownertable": "w_product",
+  "ownerid": "",
+  "func": "",
+  "funcname": "",
+  "isasyn": 0,
+  "w_dataparamids": [],
+  "remarks":""
+})
+let dataParam = ref({
+  "id": 20230613091602,
+  "content": {
+    "ownertable": "w_product",
+    "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 = props.data.w_productid
+}
+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/productManage/detail/modules/serveTable/modules/Edit.vue

@@ -0,0 +1,198 @@
+<template>
+  <a-button type="link" @click="editBtn" style="margin-right:16px">编辑</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="prodname" :rules="[{ required: true, message: '请选择产品' }]">
+            <a-input readonly v-model:value="form.prodname" 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="0">同步</a-radio>
+              <a-radio :value="1">异步</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'])
+let searchType = ref([{label:'搜索',key:'condition',type:'input'}])
+let visible = ref(false)
+let form = ref({
+  "w_functionid": 0,
+  "ownertable": "w_product",
+  "ownerid": "",
+  "func": "",
+  "funcname": "",
+  "isasyn": 0,
+  "w_dataparamids": [],
+  "remarks":""
+})
+let dataParam = ref({
+  "id": 20230613091602,
+  "content": {
+    "ownertable": "w_product",
+    "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>

+ 47 - 2
src/operation/moduleNormal/productManage/index.vue

@@ -20,12 +20,25 @@ 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 {ref, defineProps, defineEmits, onMounted} from 'vue'
+import { useBaseStore } from '@/stores/modules/base'
 import Api from '@/api/api'
 import utils from '@/utils/utils'
+
+let base = useBaseStore()
 let emit = defineEmits([])
 let props = defineProps({})
-let searchType = ref([{label:'搜索',key:'condition',type:'input'}])
+let typeList = ref([])
+let enterpriseList = ref([])
+let searchType = ref([
+  {label:'搜索',key:'condition',type:'input'},
+  {label:'设备类型',key:'prodtype',type:'select',dataSource:typeList},
+  {label:'厂商',key:'enterprisename',type:'select',dataSource:enterpriseList},
+  {label:'状态',key:'isused',type:'select',dataSource:[
+    {remarks:'启用',value:1},
+    {remarks:'禁用',value:0},
+  ]},
+])
 let param = ref({
   "id": 20230612103202,
   "content": {
@@ -39,6 +52,38 @@ let param = ref({
       }
   },
 })
+let getEnterpriseList = async () => {
+  let res = await Api.requested({
+    "id": 20230612091102,
+    "content": {
+        "pageNumber": 1,
+        "pageSize": 9999999,
+        "where": {
+            "condition": ""
+        }
+    }
+  })
+  res.data = res.data.map(item => {
+    return {
+      value:item.enterprisename,
+      remarks:item.enterprisename
+    }
+  })
+  enterpriseList.value = res.data
+  console.log(enterpriseList.value)
+}
+
+onMounted(async () => {
+  getEnterpriseList()
+  let res = await base.optiontypeselect('prodtype')
+  res.data = res.data.map(item => {
+    return {
+      value:item.value,
+      remarks:item.value
+    }
+  })
+  typeList.value = res.data
+})
 </script>
 
 <style scoped>

+ 7 - 5
src/operation/moduleNormal/productManage/modules/selectSiteProduct.vue

@@ -23,7 +23,7 @@
 
       <div style="margin-right: 25px;">
         <span>搜索:</span>
-        <a-input v-model:value="param.content.where.condition" placeholder="产品编码/名称" style="width:200px"></a-input>
+        <a-input v-model:value="param.content.where.condition" placeholder="产品编码/名称" style="width:200px" @keydown.enter="$refs.list.listData()" allowClear></a-input>
       </div>
       <div style="margin-right: 25px;">
         <span>设备类型:</span>
@@ -45,11 +45,11 @@
           @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-option v-for="item in enterpriseList" :key="item.sys_enterpriseid" :value="item.enterprisename">{{ 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">
+    <normalTable rowKey="w_productid" ref="list" size="small" :param="param" :columns="utils.TBLayout('productListTable')" @onSelect="onSelectProduct" @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>
@@ -130,8 +130,9 @@ let handleAdd = async () => {
   Class.value.modeVisible = true
 }
 
-let onSelect = (data) => {
-  selectRowData.value = data
+let onSelectProduct = (data) => {
+  selectRowData.value = JSON.parse(JSON.stringify(data))
+  console.log(data,'触发');
 }
 
 let handleBtnDisabled = computed(() => {
@@ -147,6 +148,7 @@ let emitCallBack = (fun) => {
 let selectClass = async (data) => {
   let res
   selectClassArr.value = data
+  /* 一键全选 */
   if (cacheFun.value) {
     cacheFun.value()
     return

+ 2 - 2
src/router/modelNormal.js

@@ -129,10 +129,10 @@ const moduleNormal = [
     component: () => import(/* webpackChunkName: "about" */ '@/operation/moduleNormal/areaManage/index.vue')
   },{
     path: '/productcategory',
-    name: 'productcategory',
+    name: 'bs_productcategory',
     meta: {
       title: '产品分类',
-      name: 'productcategory',
+      name: 'bs_productcategory',
       keepAlive:false
     },
     component: () => import(/* webpackChunkName: "about" */ '@/operation/moduleNormal/productCategory/index.vue')

+ 4 - 0
src/style.less

@@ -122,3 +122,7 @@ button:focus-visible {
   margin-bottom: 10px !important;
   margin-top: 10px !important;
 }
+.normal-title {
+  font-size: 14px;
+  font-weight: bold;
+}

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

@@ -1,6 +1,6 @@
 <template>
   <a-descriptions :column="6" :labelStyle="{color:'#666',width:'150px'}" :contentStyle="{marginRight:'20px',marginBottom:'5px'}"  size="small" bordered>
-    <a-descriptions-item :span="item.span ? item.span : 1"  v-for="item in props.data" :key="item.index" :label="item.label"><span :style="item.style?item.style():''">{{item.value}}</span></a-descriptions-item>
+    <a-descriptions-item :span="item.span ? item.span : 1"  v-for="item in props.data" :key="item.index" :label="item.label"><span :style="item.style?item.style():''">{{item.value || '--'}}</span></a-descriptions-item>
   </a-descriptions>
 </template>
 

Einige Dateien werden nicht angezeigt, da zu viele Dateien in diesem Diff geändert wurden.