editNode.vue 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372
  1. <template>
  2. <div class="system-edit-dic-container">
  3. <el-dialog :title="(ruleForm.nodeId !== 0 ? '修改' : '添加') + '数据节点'" v-model="isShowDialog" width="769px">
  4. <el-form :model="ruleForm" ref="formRef" :rules="rules" size="default" label-width="110px">
  5. <el-form-item label="数据节点标识" prop="key">
  6. <el-input v-model="ruleForm.key" placeholder="请输入数据节点名称" :disabled="ruleForm.nodeId"/>
  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="isPk">
  12. <el-radio-group v-model="ruleForm.isPk">
  13. <el-radio :label="0">否</el-radio>
  14. <el-radio :label="1">是</el-radio>
  15. </el-radio-group>
  16. </el-form-item>
  17. <el-form-item label="数据类型" prop="dataType">
  18. <el-select v-model="ruleForm.dataType" filterable placeholder="请选择数据类型">
  19. <el-option v-for="item in tabData" :key="item.value" :label="item.label" :value="item.value" />
  20. </el-select>
  21. </el-form-item>
  22. <el-form-item label="取值项" prop="value" v-if="detail.from==1">
  23. <el-input v-model="ruleForm.value" placeholder="请输入取值项" class="w-35" /><el-button type="success" @click="onTest">选择值</el-button>
  24. </el-form-item>
  25. <el-form-item label="取值项" prop="value" v-if="detail.from==4">
  26. <el-select v-model="ruleForm.value" filterable placeholder="请选择数取值项" @change="getNodeList">
  27. <el-option v-for="item in propertyData" :key="item.key" :label="item.name" :value="item.key">
  28. <span style="float: left">{{ item.key }}</span>
  29. <span style="float: right; font-size: 13px">{{ item.name }}</span>
  30. </el-option>
  31. </el-select>
  32. </el-form-item>
  33. <el-divider content-position="left">规则表达式</el-divider>
  34. <div v-for="(item, index) in rule" :key="index">
  35. <el-form-item label="正则表达式">
  36. <el-input v-model="item.expression" placeholder="请输入规则表达式" />
  37. </el-form-item>
  38. <el-form-item label="替换内容">
  39. <el-input v-model="item.replace" placeholder="请输入替换内容" class="w-35" />
  40. <!-- <el-input v-model="rule[index].params.name" placeholder="请输入键值" class="w-35" />
  41. <el-input v-model="rule[index].params.value" placeholder="请输入值" class="w-35" /> -->
  42. <div class="conicon">
  43. <el-icon @click="delRule(index)" v-if="index > 0"><Delete /></el-icon>
  44. </div>
  45. </el-form-item>
  46. </div>
  47. <div style="padding: 10px">
  48. <el-button type="primary" class="addbutton" @click="addRule">增加</el-button>
  49. </div>
  50. </el-form>
  51. <template #footer>
  52. <span class="dialog-footer">
  53. <el-button @click="onCancel" size="default">取 消</el-button>
  54. <el-button type="primary" @click="onSubmit" size="default">{{ ruleForm.nodeId !== 0 ? '修 改' : '添 加' }}</el-button>
  55. </span>
  56. </template>
  57. </el-dialog>
  58. <el-dialog
  59. v-model="dialogVisible"
  60. title="点击蓝色key值进行选择"
  61. width="30%"
  62. >
  63. <JsonViewer :value="jsonData" boxed sort theme="jv-dark" @click="onKeyclick" />
  64. <template #footer>
  65. <span class="dialog-footer">
  66. <el-button @click="dialogVisible = false">关闭</el-button>
  67. </span>
  68. </template>
  69. </el-dialog>
  70. </div>
  71. </template>
  72. <script lang="ts">
  73. import { reactive, toRefs, defineComponent, ref, unref } from 'vue';
  74. import api from '/@/api/datahub';
  75. import "vue3-json-viewer/dist/index.css";
  76. import { ElMessage } from 'element-plus';
  77. import { Delete, Minus, Right } from '@element-plus/icons-vue';
  78. interface RuleFormState {
  79. nodeId: number;
  80. name: string;
  81. from: number;
  82. isPk: number;
  83. key: string;
  84. dataType: string;
  85. value: string;
  86. description: string;
  87. status: number;
  88. }
  89. interface DicState {
  90. isShowDialog: boolean;
  91. ruleForm: RuleFormState;
  92. rules: {};
  93. }
  94. export default defineComponent({
  95. name: 'Edit',
  96. components: { Delete, Minus, Right },
  97. setup(prop, { emit }) {
  98. const editDicRef = ref();
  99. const formRef = ref<HTMLElement | null>(null);
  100. const state = reactive<DicState>({
  101. isShowDialog: false,
  102. dialogVisible:false,
  103. jsonData:'',
  104. propertyData:[],
  105. config: {},
  106. detail:{},
  107. tabData: [
  108. {
  109. label: 'int',
  110. value: 'int',
  111. },
  112. {
  113. label: 'long',
  114. value: 'long',
  115. },
  116. {
  117. label: 'float',
  118. value: 'float',
  119. },
  120. {
  121. label: 'double',
  122. value: 'double',
  123. },
  124. {
  125. label: 'string',
  126. value: 'string',
  127. },
  128. {
  129. label: 'boolean',
  130. value: 'boolean',
  131. },
  132. {
  133. label: 'date',
  134. value: 'date',
  135. },
  136. ],
  137. ruledata: [
  138. {
  139. expression: '',
  140. replace: '',
  141. // params: {
  142. // name: '',
  143. // value: '',
  144. // },
  145. },
  146. ],
  147. rule: [
  148. {
  149. expression: '',
  150. replace: '',
  151. // params: {
  152. // name: '',
  153. // value: '',
  154. // },
  155. },
  156. ],
  157. ruleForm: {
  158. nodeId: 0,
  159. isPk: 0,
  160. name: '',
  161. key: '',
  162. dataType: '',
  163. value: '',
  164. rule: [],
  165. description: '',
  166. },
  167. rules: {
  168. key: [{ required: true, message: '数据节点标识不能为空', trigger: 'blur' }],
  169. name: [{ required: true, message: '数据节点名称不能为空', trigger: 'blur' }],
  170. isPk: [{ required: true, message: '请选择是否主键', trigger: 'blur' }],
  171. dataType: [{ required: true, message: '数据节点类型不能为空', trigger: 'blur' }],
  172. value: [{ required: true, message: '数据节点取值项不能为空', trigger: 'blur' }],
  173. },
  174. });
  175. const onTest=()=>{
  176. if(state.detail.from==1){
  177. api.common.api(state.detail.sourceId).then((res: any) => {
  178. state.jsonData=JSON.parse(res.data);
  179. state.dialogVisible=true
  180. console.log(res);
  181. })
  182. }else if(state.detail.from==4){
  183. api.common.devapi(state.detail.sourceId).then((res: any) => {
  184. state.jsonData=JSON.parse(res.data);
  185. state.dialogVisible=true
  186. console.log(res);
  187. })
  188. }
  189. };
  190. const delRule = (index) => {
  191. state.rule.splice(index, 1);
  192. };
  193. const addRule = () => {
  194. state.rule.push({
  195. expression: '',
  196. replace: '',
  197. // params: {
  198. // name: '',
  199. // value: '',
  200. // },
  201. });
  202. };
  203. // 打开弹窗
  204. const openDialog = (row: RuleFormState | null) => {
  205. resetForm();
  206. if (row?.nodeId) {
  207. state.ruleForm = row;
  208. var data = JSON.parse(row.rule);
  209. console.log(data);
  210. data.forEach((item, index) => {
  211. state.rule[index].expression = item.expression;
  212. state.rule[index].replace = item.replace;
  213. // state.rule[index].params.name = Object.keys(item.params);
  214. // state.rule[index].params.value = item.params[Object.keys(item.params)];
  215. });
  216. }
  217. api.common.detail(row.sourceId).then((res: any) => {
  218. state.detail = res.data;
  219. if(res.data.from==4){
  220. //propertyData
  221. api.node.getpropertyList({key:res.data.deviceConfig.productKey}).then((re: any) => {
  222. state.propertyData=re
  223. });
  224. }
  225. });
  226. state.ruleForm = row;
  227. state.isShowDialog = true;
  228. };
  229. const resetForm = () => {
  230. state.ruleForm = {
  231. nodeId: 0,
  232. name: '',
  233. isPk: 0,
  234. from: 1,
  235. key: '',
  236. rule: [],
  237. description: '',
  238. };
  239. };
  240. // 关闭弹窗
  241. const closeDialog = () => {
  242. state.isShowDialog = false;
  243. };
  244. // 取消
  245. const onCancel = () => {
  246. closeDialog();
  247. };
  248. // 新增
  249. const onSubmit = () => {
  250. const formWrap = unref(formRef) as any;
  251. if (!formWrap) return;
  252. formWrap.validate((valid: boolean) => {
  253. if (valid) {
  254. //修改rule数据
  255. // state.rule.forEach((item, index) => {
  256. // item.params[item.params.name] = item.params.value;
  257. // delete item.params.name;
  258. // delete item.params.value;
  259. // });
  260. state.ruleForm.rule = state.rule;
  261. if (state.ruleForm.nodeId !== 0) {
  262. //修改
  263. api.node.edit(state.ruleForm).then(() => {
  264. ElMessage.success('数据节点类型修改成功');
  265. closeDialog(); // 关闭弹窗
  266. emit('typeList');
  267. });
  268. } else {
  269. //添加
  270. api.node.add(state.ruleForm).then(() => {
  271. ElMessage.success('数据节点类型添加成功');
  272. closeDialog(); // 关闭弹窗
  273. emit('typeList');
  274. });
  275. }
  276. }
  277. });
  278. };
  279. const onKeyclick=(e)=>{
  280. if(e.target.innerText && e.target.className=='jv-key'){
  281. let str = e.target.innerText;
  282. str = str.substr(0, str.length - 1);
  283. state.ruleForm.value=str;
  284. state.dialogVisible = false;
  285. }
  286. };
  287. return {
  288. onKeyclick,
  289. addRule,
  290. onTest,
  291. delRule,
  292. openDialog,
  293. closeDialog,
  294. onCancel,
  295. onSubmit,
  296. formRef,
  297. ...toRefs(state),
  298. };
  299. },
  300. });
  301. </script>
  302. <style>
  303. .el-input__wrapper {
  304. width: 98%;
  305. }
  306. .box-content {
  307. border: 1px solid #e8e8e8;
  308. margin: 10px;
  309. padding: 10px;
  310. }
  311. .content-f {
  312. display: flex;
  313. margin-bottom: 10px;
  314. }
  315. .content-f .el-input__wrapper {
  316. margin-right: 5px;
  317. }
  318. .addbutton {
  319. width: 100%;
  320. margin-top: 10px;
  321. }
  322. .conicon {
  323. width: 55px;
  324. height: 25px;
  325. font-size: 28px;
  326. line-height: 28px;
  327. cursor: pointer;
  328. }
  329. .jv-key{
  330. cursor: pointer;
  331. color: #0034f1;
  332. }
  333. </style>