actionItem.vue 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. <template>
  2. <div class="type-item">
  3. <div v-for="(item, index) in actionList" :key="index" class="item " :class="index > 0 ? 'biankang' : ''">
  4. <div class="conicon" style="width: 100%; text-align: right; position: relative; right: -8px; top: -8px; color: red"
  5. v-if="index > 0">
  6. <el-icon @click="delAction(index)">
  7. <CircleClose />
  8. </el-icon>
  9. </div>
  10. <div class="title flex">
  11. <div class="icon"></div>串行动作
  12. </div>
  13. <div class="product flex flex-warp">
  14. <ActionSerialItem :index="index" :serial="item.serial" :sourceData="sourceData" @saveData="saveData" @delData="delData"></ActionSerialItem>
  15. </div>
  16. <div class="title flex">
  17. <div class="icon"></div>并行动作
  18. </div>
  19. <div class="product flex flex-warp">
  20. <ActionParallelItem :index="index" :parallel="item.parallel" :sourceData="sourceData" @saveData="saveData" @delData="delData"></ActionParallelItem>
  21. </div>
  22. </div>
  23. <div>
  24. <div class="edit">
  25. <el-button type="primary" :icon="DocumentAdd" @click="addAction()">新增场景动作</el-button>
  26. </div>
  27. </div>
  28. </div>
  29. </template>
  30. <script lang="ts" setup>
  31. import { PropType, ref } from 'vue'
  32. import { DocumentAdd, CircleClose } from '@element-plus/icons-vue';
  33. import ActionSerialItem from './actionSerialItem.vue';
  34. import ActionParallelItem from './actionParallelItem.vue';
  35. import api from '/@/api/scene';
  36. //初始化数据
  37. const actionList_temp=ref([{
  38. serial:[{}],
  39. parallel:[{}],
  40. }]);
  41. const actionList=ref([{
  42. serial:[{}],
  43. parallel:[{}],
  44. }]);
  45. const originalSceneList = ref([{
  46. id: 0
  47. }]);
  48. interface testIValueType {
  49. id: string;
  50. key: string;
  51. name?: string;
  52. }
  53. const props = defineProps({
  54. sourceData: {
  55. type: Array as PropType<testIValueType[]>,
  56. default: () => []
  57. },
  58. scene_id:{
  59. type:String,
  60. default: () => ''
  61. }
  62. })
  63. const getOneDetail = () => {
  64. api.manage.getOneDetail({ "sceneId": props.scene_id, 'group': 'action' }).then((res: any) => {
  65. if (!res) {
  66. addActionDetail();
  67. // getOneDetail();
  68. }
  69. originalSceneList.value = res;
  70. const combinedArray = res.map(scene => {
  71. const parsedBodyJson = JSON.parse(scene.bodyjson);
  72. if (Array.isArray(parsedBodyJson)) {
  73. const serial = parsedBodyJson.map(item => item.serial).flat();
  74. const parallel = parsedBodyJson.map(item => item.parallel).flat();
  75. return {
  76. serial,
  77. parallel
  78. };
  79. } else {
  80. return {
  81. serial: [parsedBodyJson.serial].flat(),
  82. parallel: [parsedBodyJson.parallel].flat()
  83. };
  84. }
  85. });
  86. actionList.value=combinedArray;
  87. })
  88. };
  89. getOneDetail();
  90. //新增一条场景动作
  91. const addActionDetail = () => {
  92. let data = {
  93. sceneId: props.scene_id,
  94. group: 'action',
  95. bodyjson: actionList_temp.value,
  96. }
  97. api.manage.addDetail(data).then((res: any) => {
  98. getOneDetail();
  99. });
  100. }
  101. //删除一条场景
  102. const delData = (index: number) => {
  103. let ids =originalSceneList.value[index].id;
  104. api.manage.delDetail(ids).then((res: any) => {
  105. // getOneDetail();
  106. });
  107. }
  108. //修改一条场景
  109. const saveData = (data: any) => {
  110. let ids = originalSceneList.value[data.index].id;
  111. api.manage.editDetail({ id: ids, bodyjson:actionList.value[data.index] }).then((res: any) => {
  112. getOneDetail();
  113. });
  114. }
  115. const addAction = () => {
  116. actionList.value.push({
  117. 'serial':[],
  118. 'parallel':[],
  119. });
  120. addActionDetail();
  121. };
  122. const delAction = (index: number) => {
  123. actionList.value.splice(index, 1);
  124. delData(index);
  125. }
  126. </script>
  127. <style scoped lang="scss">
  128. .type-item {
  129. margin-top: 15px;
  130. .edit {
  131. margin-top: 15px;
  132. margin-left: 10px;
  133. color: #2041d4;
  134. }
  135. .conicon {
  136. width: 55px;
  137. height: 25px;
  138. font-size: 28px;
  139. line-height: 28px;
  140. cursor: pointer;
  141. }
  142. .item {
  143. padding: 10px;
  144. }
  145. .biankang {
  146. margin-top: 10px;
  147. border: 1px solid #cfcfcf;;
  148. border-radius: 2px;
  149. }
  150. .title {
  151. height: 40px;
  152. .icon {
  153. margin-left: 2px;
  154. margin-right: 10px;
  155. width: 5px;
  156. height: 20px;
  157. background-color: #315efb;
  158. }
  159. }
  160. .product {
  161. .el-form-item {
  162. margin-left: 30px;
  163. margin-bottom: 10px;
  164. margin-top: 10px;
  165. }
  166. }
  167. }
  168. </style>