detail.vue 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. <template>
  2. <el-card class="system-dic-container" style="position: relative;">
  3. <div class="content">
  4. <div class="flex cont_box">
  5. <div class="font26">场景名称:{{detail.name}}</div>
  6. <div class="pro-status"><span :class="detail.status == 1 ? 'on' : 'off'"></span>{{ detail.status == 1
  7. ? '启用' : '未启用' }}</div>
  8. </div>
  9. <div class="flex">
  10. <div class="desc">场景描述:{{detail.description}}</div>
  11. <div class="edit" @click="addOrEdit(detail)"><el-link type="primary"> <el-icon>
  12. <EditPen color="#409eff" />
  13. </el-icon>修改</el-link></div>
  14. </div>
  15. </div>
  16. </el-card>
  17. <el-card style=" margin-top: 15px;" >
  18. <div class="font20">场景定义</div>
  19. <SceneItem v-if="showstatus" :sceneList="sceneList" :sceneType="detail.sceneType" @addScenesDetail="addScenesDetail" @delScenesDetail="delScenesDetail" @editScenesDetail="editScenesDetail"></SceneItem>
  20. </el-card>
  21. <el-card style=" margin-top: 15px;" >
  22. <div class="font20">场景动作</div>
  23. <ActionItem :actionList="actionList"></ActionItem>
  24. </el-card>
  25. <EditForm ref="editFormRef" @getList="getDetail()"></EditForm>
  26. </template>
  27. <script lang="ts">
  28. import { toRefs, reactive, onMounted, ref, defineComponent } from 'vue';
  29. import { ElMessage } from 'element-plus';
  30. import type { TabsPaneContext } from 'element-plus'
  31. import { useRoute, useRouter } from 'vue-router';
  32. import { EditPen, DocumentAdd } from '@element-plus/icons-vue';
  33. import ActionItem from './component/actionItem.vue';
  34. import SceneItem from './component/sceneItem.vue';
  35. import EditForm from './edit.vue';
  36. import api from '/@/api/scene';
  37. import product from '/@/api/device';
  38. const editFormRef = ref();
  39. //原始
  40. const sceneList = {
  41. 'productKey': '',
  42. 'deviceKey': '',
  43. 'triggerType': '',
  44. 'timer': '',
  45. 'triggerSwitch': false,
  46. 'condition': [[{
  47. 'parameter': '',
  48. 'operator': '',
  49. 'value': ''
  50. }]]
  51. };
  52. const originalSceneList=ref([{}]);
  53. export default defineComponent({
  54. components: { EditPen, EditForm, DocumentAdd, SceneItem,ActionItem },
  55. setup(props, context) {
  56. const route = useRoute();
  57. const router = useRouter();
  58. const state = reactive({
  59. developer_status: 2,
  60. showstatus : false,
  61. detail: {},
  62. sourceData:[],
  63. actionList: [{
  64. 'seriallist':[{
  65. }],
  66. 'parallellist':[{
  67. }]
  68. }],
  69. sceneList: [{
  70. 'productKey': '',
  71. 'deviceKey': '',
  72. 'triggerType': '',
  73. 'timer': '',
  74. 'triggerSwitch': false,
  75. 'condition': [[{
  76. 'parameter': '',
  77. 'operator': '',
  78. 'value': ''
  79. }]]
  80. }],
  81. });
  82. const activeName = ref('first')
  83. const getDetail = () => {
  84. const id = route.params && route.params.id;
  85. api.manage.getDetail({ "id": id }).then((res: any) => {
  86. state.detail = res
  87. })
  88. getOneDetail();
  89. };
  90. const getOneDetail = () => {
  91. const id = route.params && route.params.id;
  92. api.manage.getOneDetail({ "sceneId": id,'group':'definition' }).then((res: any) => {
  93. if(!res){
  94. addScenesDetail('definition');
  95. getOneDetail();
  96. }
  97. originalSceneList.value=res;
  98. const scenes = res.map((scene:any) => {
  99. const parsedBodyJson = JSON.parse(scene.bodyjson);
  100. return {
  101. ...parsedBodyJson
  102. };
  103. });
  104. state.sceneList=scenes;
  105. state.showstatus = true;
  106. })
  107. };
  108. //新增一条场景定义
  109. const addScenesDetail=(type:String)=>{
  110. let data={
  111. sceneId:route.params && route.params.id,
  112. group:type,
  113. bodyjson:sceneList,
  114. }
  115. api.manage.addDetail(data).then((res: any) => {
  116. getOneDetail();
  117. });
  118. }
  119. //删除一条场景
  120. const delScenesDetail=(index)=>{
  121. let ids=originalSceneList.value[index].id;
  122. api.manage.delDetail(ids).then((res: any) => {
  123. // getOneDetail();
  124. });
  125. }
  126. //修改一条场景
  127. const editScenesDetail=(index:number)=>{
  128. let saveData=state.sceneList[index];
  129. let ids=originalSceneList.value[index].id;
  130. api.manage.editDetail({id:ids,bodyjson:saveData}).then((res: any) => {
  131. getOneDetail();
  132. });
  133. }
  134. const addOrEdit = async (row?: any) => {
  135. editFormRef.value.open(row);
  136. };
  137. const freshData = () => {
  138. getDetail()
  139. ElMessage.success('刷新成功');
  140. };
  141. const toEdit = () => {
  142. router.push(`/iotmanager/network/server/edit/${route.params && route.params.id}`)
  143. };
  144. onMounted(() => {
  145. });
  146. const handleClick = (tab: TabsPaneContext, event: Event) => {
  147. // console.log(tab, event)
  148. }
  149. getDetail();
  150. return {
  151. toEdit,
  152. addOrEdit,
  153. delScenesDetail,
  154. addScenesDetail,
  155. editScenesDetail,
  156. editFormRef,
  157. activeName,
  158. freshData,
  159. getDetail,
  160. handleClick,
  161. ...toRefs(props),
  162. ...toRefs(state),
  163. };
  164. },
  165. });
  166. </script>
  167. <style scoped lang="scss">
  168. .desc {
  169. margin-top: 15px;
  170. }
  171. .edit {
  172. line-height: 40px;
  173. margin-top: 15px;
  174. margin-left: 30px;
  175. }
  176. .cont_box .pro-status {
  177. line-height: 40px;
  178. margin-left: 30px;
  179. margin-top: 5px;
  180. .on {
  181. background: #52c41a;
  182. }
  183. .off {
  184. background: #c41a1a;
  185. }
  186. span {
  187. position: relative;
  188. top: -1px;
  189. display: inline-block;
  190. width: 6px;
  191. height: 6px;
  192. vertical-align: middle;
  193. border-radius: 50%;
  194. margin-right: 5px;
  195. }
  196. }
  197. </style>