editEvent copy.vue 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558
  1. <template>
  2. <div class="system-edit-dic-container">
  3. <el-dialog :title="(ruleForm.id !== 0 ? '修改' : '添加') + '事件定义'" v-model="isShowDialog" width="769px">
  4. <el-form :model="ruleForm" ref="formRef" :rules="rules" size="default" label-width="120px">
  5. <el-form-item label="事件定义标识" prop="key">
  6. <el-input v-model="ruleForm.key" placeholder="请输入事件定义标识" :disabled="ruleForm.id !== 0 ? true : false" />
  7. </el-form-item>
  8. <el-form-item label="事件定义名称" prop="name">
  9. <el-input v-model="ruleForm.name" placeholder="请输入事件定义名称" />
  10. </el-form-item>
  11. <el-form-item label="事件级别" prop="level">
  12. <el-radio-group v-model="ruleForm.level">
  13. <el-radio :label="0">普通</el-radio>
  14. <el-radio :label="1">警告</el-radio>
  15. <el-radio :label="2">紧急</el-radio>
  16. </el-radio-group>
  17. </el-form-item>
  18. <el-form-item label="输出参数" prop="maxLength">
  19. <div v-for="(item, index) in inputsdata" :key="index" class="jslist">
  20. <div class="jsonlist">
  21. <div>参数名称:</div>
  22. <div style="width: 60%">{{ item.name }}</div>
  23. <div class="jsonoption">
  24. <!-- <el-link type="primary">编辑</el-link> -->
  25. <el-link type="primary" @click="deljson(index, 'fun')">删除</el-link>
  26. </div>
  27. </div>
  28. </div>
  29. <div style="display: block; width: 100%">
  30. <div class="input-options" @click="addJson('fun')">
  31. <el-icon>
  32. <Plus />
  33. </el-icon>
  34. <div>添加参数</div>
  35. </div>
  36. </div>
  37. </el-form-item>
  38. <el-form-item label="输出参数" prop="type">
  39. <el-select v-model="valueType.type" placeholder="请选择数据类型" @change="seletChange">
  40. <el-option-group v-for="group in typeData" :key="group.label" :label="group.label">
  41. <el-option v-for="item in group.options" :key="item.type" :label="item.title" :value="item.type" />
  42. </el-option-group>
  43. </el-select>
  44. </el-form-item>
  45. <!--根据数据类型输出不同表单-->
  46. <el-form-item label="精度" prop="decimals" v-if="type == 'float' || type == 'double'">
  47. <el-input v-model="valueType.decimals" placeholder="请输入精度" />
  48. </el-form-item>
  49. <el-form-item label="单位" prop="unit" v-if="type == 'int' || type == 'long' || type == 'float' || type == 'double'">
  50. <el-input v-model="valueType.unit" placeholder="请输入单位" />
  51. </el-form-item>
  52. <el-form-item label="最大长度" prop="maxLength" v-if="type == 'string'">
  53. <el-input v-model="valueType.maxLength" placeholder="请输入最大长度" />
  54. </el-form-item>
  55. <el-form-item label="时间格式" prop="maxLength" v-if="type == 'date'">
  56. <el-input v-model="valueType.maxLength" placeholder="请输入时间格式" />
  57. </el-form-item>
  58. <el-form-item label="布尔值" prop="trueText" v-if="type == 'boolean'">
  59. <div class="input-box">
  60. <el-input v-model="valueType.trueText" placeholder="请输入布尔值" value="是" /><span style="margin: 0px 10px">~</span>
  61. <el-input v-model="valueType.trueValue" placeholder="请输入布尔值" value="true" />
  62. </div>
  63. <div class="input-box">
  64. <el-input v-model="valueType.falseText" placeholder="请输入布尔值" value="否" /> <span style="margin: 0px 10px">~</span>
  65. <el-input v-model="valueType.falseValue" placeholder="请输入布尔值" value="false" />
  66. </div>
  67. </el-form-item>
  68. <el-form-item label="枚举项" prop="maxLength" v-if="type == 'enum'">
  69. <div class="input-box" v-for="(item, index) in enumdata" :key="index">
  70. <el-input v-model="item.text" placeholder="请输入枚举文本" /><span style="margin: 0px 10px"><el-icon>
  71. <Right />
  72. </el-icon></span>
  73. <el-input v-model="item.value" placeholder="请输入枚举值" />
  74. <div class="input-option">
  75. <el-icon @click="addEnum" v-if="index == 0">
  76. <Plus />
  77. </el-icon>
  78. <el-icon @click="delEnum(index)" v-if="index != 0">
  79. <Minus />
  80. </el-icon>
  81. </div>
  82. </div>
  83. </el-form-item>
  84. <el-form-item label="JSON对象" prop="maxLength" v-if="type == 'object'">
  85. <div v-for="(item, index) in jsondata" :key="index" class="jslist">
  86. <div class="jsonlist">
  87. <div>参数名称:</div>
  88. <div style="width: 60%">{{ item.name }}</div>
  89. <div class="jsonoption">
  90. <!-- <el-link type="primary">编辑</el-link> -->
  91. <el-link type="primary" @click="deljson(index)">删除</el-link>
  92. </div>
  93. </div>
  94. </div>
  95. <div style="display: block; width: 100%">
  96. <div class="input-options" @click="addJson">
  97. <el-icon>
  98. <Plus />
  99. </el-icon>
  100. <div>添加参数</div>
  101. </div>
  102. </div>
  103. </el-form-item>
  104. <div v-if="type == 'array'">
  105. <el-form-item label="元素类型" prop="types">
  106. <el-select v-model="elementType.type" placeholder="请选择元素类型" @change="seletChanges">
  107. <el-option-group v-for="group in typeData" :key="group.label" :label="group.label">
  108. <el-option v-for="item in group.options" :key="item.type" :label="item.title" :value="item.type" :disabled="item.type == 'array'" />
  109. </el-option-group>
  110. </el-select>
  111. </el-form-item>
  112. <el-form-item label="精度" prop="decimals" v-if="types == 'float' || types == 'double'">
  113. <el-input v-model="elementType.decimals" placeholder="请输入精度" />
  114. </el-form-item>
  115. <el-form-item label="单位" prop="unit" v-if="types == 'int' || types == 'long' || types == 'float' || types == 'double'">
  116. <el-input v-model="elementType.unit" placeholder="请输入单位" />
  117. </el-form-item>
  118. <el-form-item label="最大长度" prop="maxLength" v-if="types == 'string'">
  119. <el-input v-model="elementType.maxLength" placeholder="请输入最大长度" />
  120. </el-form-item>
  121. <el-form-item label="时间格式" prop="maxLength" v-if="types == 'date'">
  122. <el-input v-model="elementType.maxLength" placeholder="请输入时间格式" />
  123. </el-form-item>
  124. <el-form-item label="布尔值" prop="maxLength" v-if="types == 'boolean'">
  125. <div class="input-box">
  126. <el-input v-model="elementType.trueText" placeholder="请输入布尔值" value="是" /><span style="margin: 0px 10px">~</span>
  127. <el-input v-model="elementType.trueValue" placeholder="请输入布尔值" value="true" />
  128. </div>
  129. <div class="input-box">
  130. <el-input v-model="elementType.falseText" placeholder="请输入布尔值" value="否" /> <span style="margin: 0px 10px">~</span>
  131. <el-input v-model="elementType.falseValue" placeholder="请输入布尔值" value="false" />
  132. </div>
  133. </el-form-item>
  134. <el-form-item label="枚举项" prop="maxLength" v-if="types == 'enum'">
  135. <div class="input-box" v-for="(item, index) in enumdata" :key="index">
  136. <el-input v-model="item.text" placeholder="请输入枚举值" /><span style="margin: 0px 10px"><el-icon>
  137. <Right />
  138. </el-icon></span>
  139. <el-input v-model="item.value" placeholder="请输入枚举文本" />
  140. <div class="input-option">
  141. <el-icon @click="addEnum" v-if="index == 0">
  142. <Plus />
  143. </el-icon>
  144. <el-icon @click="delEnum(index)" v-if="index != 0">
  145. <Minus />
  146. </el-icon>
  147. </div>
  148. </div>
  149. </el-form-item>
  150. </div>
  151. <el-form-item label="JSON对象" prop="maxLength" v-if="types == 'object'">
  152. <div v-for="(item, index) in jsondata" :key="index" class="jslist">
  153. <div class="jsonlist">
  154. <div>参数名称:</div>
  155. <div style="width: 60%">{{ item.data.name }}</div>
  156. <div class="jsonoption">
  157. <el-link type="primary">编辑</el-link>
  158. <el-link type="primary">删除</el-link>
  159. </div>
  160. </div>
  161. </div>
  162. <div style="display: block; width: 100%">
  163. <div class="input-options" @click="addJson">
  164. <el-icon>
  165. <Plus />
  166. </el-icon>
  167. <div>添加参数</div>
  168. </div>
  169. </div>
  170. </el-form-item>
  171. <!--根据数据类型输出不同表单-->
  172. <el-form-item label="事件定义描述 " prop="desc">
  173. <el-input v-model="ruleForm.desc" type="textarea" placeholder="请输入事件定义描述"></el-input>
  174. </el-form-item>
  175. </el-form>
  176. <template #footer>
  177. <span class="dialog-footer">
  178. <el-button @click="onCancel" size="default">取 消</el-button>
  179. <el-button type="primary" @click="onSubmit" size="default">{{ ruleForm.id !== 0 ? '修 改' : '添 加' }}</el-button>
  180. </span>
  181. </template>
  182. </el-dialog>
  183. <EditOption ref="editOptionRef" @typeList="getOptionData" />
  184. </div>
  185. </template>
  186. <script lang="ts">
  187. import { reactive, toRefs, defineComponent, ref, unref } from 'vue';
  188. import api from '/@/api/device';
  189. import uploadVue from '/@/components/upload/index.vue';
  190. import { Plus, Minus, Right } from '@element-plus/icons-vue';
  191. import EditOption from './editOption.vue';
  192. import { ElMessage, UploadProps } from 'element-plus';
  193. interface RuleFormState {
  194. id: number;
  195. productId: number;
  196. key: string;
  197. level: number;
  198. name: string;
  199. dictType: string;
  200. valueType: Object;
  201. status: number;
  202. desc: string;
  203. }
  204. interface DicState {
  205. isShowDialog: boolean;
  206. ruleForm: RuleFormState;
  207. typeData: RuleFormState[];
  208. rules: {};
  209. }
  210. export default defineComponent({
  211. name: 'deviceEditPro',
  212. components: { Plus, Minus, Right, EditOption },
  213. setup(prop, { emit }) {
  214. const formRef = ref<HTMLElement | null>(null);
  215. const editOptionRef = ref();
  216. const state = reactive<DicState>({
  217. isShowDialog: false,
  218. typeData: [], //
  219. type: '',
  220. types: '',
  221. productId: 0,
  222. valueType: {
  223. type: '',
  224. maxLength: '',
  225. trueText: '是',
  226. trueValue: 'true',
  227. falseText: '否',
  228. falseValue: 'false',
  229. },
  230. elementType: {
  231. type: '',
  232. maxLength: '',
  233. },
  234. enumdata: [
  235. {
  236. text: '',
  237. value: '',
  238. },
  239. ],
  240. jsondata: [],
  241. inputsdata: [],
  242. ruleForm: {
  243. id: 0,
  244. productId: 0,
  245. level: 0,
  246. name: '',
  247. key: '',
  248. status: 1,
  249. valueType: {
  250. type: '',
  251. maxLength: '',
  252. },
  253. desc: '',
  254. },
  255. rules: {
  256. name: [{ required: true, message: '事件定义名称不能为空', trigger: 'blur' }],
  257. key: [{ required: true, message: '事件定义标识不能为空', trigger: 'blur' }],
  258. level: [{ required: true, message: '请选择事件级别', trigger: 'blur' }],
  259. type: [{ required: true, message: '请选择数据类型', trigger: 'blur' }],
  260. },
  261. });
  262. // 打开弹窗
  263. const openDialog = (row: RuleFormState | null, productId: number | null) => {
  264. resetForm();
  265. api.product.getDataType({ status: -1 }).then((res: any) => {
  266. const datat = Object.values(res.dataType);
  267. datat.forEach((item, index) => {
  268. if (index == 0) {
  269. datat[index]['label'] = '基础类型';
  270. datat[index]['options'] = item;
  271. } else {
  272. datat[index]['label'] = '扩展类型';
  273. datat[index]['options'] = item;
  274. }
  275. });
  276. console.log(row);
  277. console.log(productId);
  278. state.typeData = datat || [];
  279. });
  280. state.ruleForm = row;
  281. if (row.valueType) {
  282. state.ruleForm = row;
  283. state.productId = productId;
  284. state.valueType = row.valueType;
  285. state.ruleForm.valueType.type = row.valueType.type;
  286. state.ruleForm.type = row.valueType.type;
  287. state.type = row.valueType.type;
  288. state.ruleForm.accessMode = row.accessMode;
  289. if (row.valueType.elementType) {
  290. state.elementType = row.valueType.elementType;
  291. state.types = row.valueType.elementType.type;
  292. }
  293. if (row.type == 'enum') {
  294. state.enumdata = row.valueType.elements;
  295. }
  296. if (row.type == 'object') {
  297. state.jsondata = row.valueType.properties;
  298. }
  299. if (row.type == 'array' && state.types == 'enum') {
  300. state.enumdata = row.valueType.elementType.elements;
  301. }
  302. if (row.type == 'array' && state.types == 'object') {
  303. state.jsondata = row.valueType.elementType.properties;
  304. }
  305. }
  306. state.isShowDialog = true;
  307. };
  308. const resetForm = () => {
  309. state.ruleForm = {
  310. name: '',
  311. key: '',
  312. accessMode: '0',
  313. status: 1,
  314. valueType: {
  315. type: '',
  316. maxLength: '',
  317. },
  318. desc: '',
  319. };
  320. state.type = '';
  321. state.types = '';
  322. state.valueType = {};
  323. state.elementType = {};
  324. state.jsondata = [];
  325. state.enumdata = [
  326. {
  327. text: '',
  328. value: '',
  329. },
  330. ];
  331. };
  332. const seletChange = (val) => {
  333. state.type = val;
  334. state.ruleForm.type = val;
  335. console.log(val);
  336. };
  337. const seletChanges = (val) => {
  338. console.log(val);
  339. state.types = val;
  340. console.log(val);
  341. };
  342. const addEnum = () => {
  343. state.enumdata.push({
  344. text: '',
  345. value: '',
  346. });
  347. };
  348. const delEnum = (index) => {
  349. state.enumdata.splice(index, 1);
  350. };
  351. const deljson = (index) => {
  352. state.jsondata.splice(index, 1);
  353. };
  354. const addJson = () => {
  355. editOptionRef.value.openDialog({ product_id: 0, id: 0 });
  356. };
  357. const getOptionData = (data) => {
  358. state.jsondata.push(data);
  359. console.log(state.jsondata);
  360. };
  361. // 关闭弹窗
  362. const closeDialog = () => {
  363. state.isShowDialog = false;
  364. };
  365. // 取消
  366. const onCancel = () => {
  367. closeDialog();
  368. };
  369. // 新增
  370. const onSubmit = () => {
  371. const formWrap = unref(formRef) as any;
  372. if (!formWrap) return;
  373. formWrap.validate((valid: boolean) => {
  374. if (valid) {
  375. if (state.ruleForm.id !== 0) {
  376. //修改
  377. if (state.type == 'enum') {
  378. state.valueType.elements = state.enumdata;
  379. }
  380. if (state.type == 'object') {
  381. state.valueType.properties = state.jsondata;
  382. }
  383. if (state.type == 'array') {
  384. state.valueType.elementType = state.elementType;
  385. //如果是选中数组,并选择了枚举
  386. if (state.types == 'enum') {
  387. state.valueType.elementType = {
  388. elements: state.enumdata,
  389. type: 'enum',
  390. };
  391. }
  392. //如果是选中数组,并选择了object
  393. if (state.types == 'object') {
  394. state.valueType.elementType = {
  395. properties: state.jsondata,
  396. type: 'object',
  397. };
  398. }
  399. }
  400. console.log(state.valueType);
  401. state.ruleForm.valueType = state.valueType;
  402. state.ruleForm.productId = state.productId;
  403. api.model.eventedit(state.ruleForm).then(() => {
  404. ElMessage.success('事件定义类型修改成功');
  405. closeDialog(); // 关闭弹窗
  406. emit('typeList');
  407. });
  408. } else {
  409. //添加
  410. if (state.type == 'enum') {
  411. state.valueType.elements = state.enumdata;
  412. }
  413. if (state.type == 'object') {
  414. state.valueType.properties = state.jsondata;
  415. }
  416. if (state.type == 'array') {
  417. state.valueType.elementType = state.elementType;
  418. //如果是选中数组,并选择了枚举
  419. if (state.types == 'enum') {
  420. state.valueType.elementType = {
  421. elements: state.enumdata,
  422. type: 'enum',
  423. };
  424. }
  425. //如果是选中数组,并选择了object
  426. if (state.types == 'object') {
  427. state.valueType.elementType = {
  428. properties: state.jsondata,
  429. type: 'object',
  430. };
  431. }
  432. }
  433. state.ruleForm.valueType = state.valueType;
  434. api.model.eventadd(state.ruleForm).then(() => {
  435. ElMessage.success('事件定义类型添加成功');
  436. closeDialog(); // 关闭弹窗
  437. emit('typeList');
  438. });
  439. }
  440. }
  441. });
  442. };
  443. return {
  444. editOptionRef,
  445. getOptionData,
  446. openDialog,
  447. deljson,
  448. addEnum,
  449. delEnum,
  450. addJson,
  451. seletChange,
  452. seletChanges,
  453. closeDialog,
  454. onCancel,
  455. onSubmit,
  456. formRef,
  457. ...toRefs(state),
  458. };
  459. },
  460. });
  461. </script>
  462. <style>
  463. .input-box {
  464. display: flex;
  465. flex-direction: row;
  466. justify-content: space-between;
  467. margin-top: 10px;
  468. }
  469. .input-option {
  470. line-height: 30px;
  471. padding-top: 5px;
  472. width: 140px;
  473. }
  474. .input-option i {
  475. margin: 0px 5px;
  476. border: 1px solid #c3c3c3;
  477. font-size: 16px;
  478. }
  479. .input-options {
  480. display: flex;
  481. align-items: center;
  482. color: #409eff;
  483. cursor: pointer;
  484. }
  485. .jslist {
  486. width: 100%;
  487. border: 1px solid #e8e8e8;
  488. padding: 10px;
  489. margin-bottom: 10px;
  490. }
  491. .jsonlist {
  492. display: flex;
  493. flex-direction: row;
  494. justify-content: space-between;
  495. }
  496. .jsonoption {}
  497. .jsonoption a {
  498. margin: 0px 10px;
  499. }</style>