AddAbility.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289
  1. <template>
  2. <div>
  3. <el-dialog v-model="dialogVisible" :title="titles" width="30%" @close="handleClose" :close-on-click-modal="false">
  4. <el-form ref="ruleFormRef" :model="abilityFrom" :rules="rules" label-width="180px">
  5. <el-form-item label="设计功能名称" prop="setAbName">
  6. <el-select :disabled="numState == 1" @change="abNameChange" style="width: 350px;"
  7. v-model="abilityFrom.setAbName" filterable allow-create default-first-option
  8. :reserve-keyword="false" placeholder="选择或输入">
  9. <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item" />
  10. </el-select>
  11. <p style="color: #2C5BE5;font-size: 16px;">新功能可直接输入但不能重复;已有功能可选择</p>
  12. </el-form-item>
  13. <el-form-item label="设计端子名称" prop="setSon">
  14. <el-input style="width: 350px;" v-model="abilityFrom.setSon"></el-input>
  15. </el-form-item>
  16. <el-form-item label="端子描述关键词" prop="setMemo">
  17. <el-input style="width: 350px;" v-model="abilityFrom.setMemo"></el-input>
  18. <p style="color: #2C5BE5;font-size: 16px;">关键词之间“|”表示或者,“&”表示并且</p>
  19. </el-form-item>
  20. <el-form-item label="端子信号类型" prop="sg">
  21. <el-select @change="sgChange" style="width: 350px;" v-model="abilityFrom.sg" allow-create
  22. default-first-option :reserve-keyword="false" placeholder="请选择信号类型">
  23. <el-option key="SV" label="SV" value="SV" />
  24. <el-option key="GOOSE" label="GOOSE" value="GOOSE" />
  25. </el-select>
  26. <p style="color: #2C5BE5;font-size: 16px;">仅支持SV或GOOSE</p>
  27. </el-form-item>
  28. <el-form-item label="端子信号输入输出方向" prop="io">
  29. <el-select @change="ioChange" style="width: 350px;" v-model="abilityFrom.io" allow-create
  30. default-first-option :reserve-keyword="false" placeholder="请选择输入或输出">
  31. <el-option key="接收" label="接收" value="接收" />
  32. <el-option key="输出" label="输出" value="输出" />
  33. </el-select>
  34. <p style="color: #2C5BE5;font-size: 16px;">仅支持中文的'接收'或'输出'</p>
  35. </el-form-item>
  36. </el-form>
  37. <template #footer>
  38. <span class="dialog-footer">
  39. <el-button @click="cancels">取消</el-button>
  40. <el-button type="primary" @click="sureClick">确定</el-button>
  41. </span>
  42. </template>
  43. </el-dialog>
  44. </div>
  45. </template>
  46. <script>
  47. import { ref, onMounted, watch, toRefs, reactive } from 'vue'
  48. import flow from '@/api/flow/flow'
  49. import { ElMessage } from 'element-plus'
  50. export default {
  51. props: {
  52. addModal: {
  53. type: Boolean,
  54. required: true,
  55. },
  56. tableData: {
  57. type: Array,
  58. required: true
  59. },
  60. modelIds: {
  61. type: String,
  62. required: true
  63. },//模型id
  64. iedTypes: {
  65. type: String,
  66. required: true
  67. },//iedtype
  68. copyReload: {
  69. type: Function,
  70. required: true
  71. },//刷新父组件属性方法
  72. editOrAdd: {
  73. type: Number,
  74. required: true,
  75. },//编辑或新增
  76. editRow: {
  77. type: Object,
  78. required: true
  79. },//表格整行数据结构id就为fcda_id
  80. },
  81. setup(props, { emit }) {
  82. let dialogVisible = ref(false)//模态框开关
  83. let abilityFrom = ref({
  84. setAbName: "",//设计功能名称
  85. setSon: "",//设计端子名称
  86. setMemo: "",//端子描述关键词
  87. sg: "",//sv还是goose
  88. io: ""//输入还是输出
  89. })
  90. let options = ref([])//多选选项
  91. let fatherToSon = ref([])//AbilityModal.vue传过来的表格数据,制作为选项
  92. let needModel = ref('')//需要的模型id
  93. let needIedType = ref('')//需要的iedtype
  94. let ruleFormRef = ref(null)//表单的ref,用于触发验证
  95. const rules = reactive({
  96. setAbName: [
  97. { required: true, message: '请选择设计功能名称', trigger: 'change' },
  98. ],
  99. setSon: [
  100. { required: true, message: '请输入设计端子名称', trigger: 'blur' },
  101. ],
  102. setMemo: [
  103. { required: true, message: '请输入端子描述关键词', trigger: 'blur' },
  104. ],
  105. sg: [
  106. { required: true, message: '请选择端子信号类型', trigger: 'change' },
  107. ],
  108. io: [
  109. { required: true, message: '请选择端子输入输出方向', trigger: 'change' },
  110. ]
  111. })//表单验证
  112. let numState = ref(0)//0为新增,1为修改
  113. let needEditRow = ref({})//需要修改的整个对象属性
  114. let newAddId = ref("")//新增的id
  115. let titles = ref("新增装置功能")
  116. // 监听props.tabledata变化赋值
  117. watch(() => props.tableData, (newVal) => {
  118. fatherToSon.value = newVal
  119. })
  120. // 监听props.modelids变化并赋值
  121. watch(() => props.modelIds, (newVal) => {
  122. needModel.value = newVal
  123. }, { immediate: true })
  124. // 监听props.iedtypes变化并赋值
  125. watch(() => props.iedTypes, (newVal) => {
  126. needIedType.value = newVal
  127. })
  128. // 监听props.editrow变化并赋值
  129. watch(() => props.editRow, (newVal) => {
  130. needEditRow.value = newVal
  131. })
  132. watch(() => props.editOrAdd, (newVal) => {
  133. numState.value = newVal
  134. })
  135. // 初始化组件
  136. function reload() {
  137. dialogVisible.value = props.addModal//模态框状态
  138. fatherToSon.value = props.tableData//表格数据,制作为下拉菜单
  139. needModel.value = props.modelIds//模型id
  140. needIedType.value = props.iedTypes//iedtype
  141. numState.value = props.editOrAdd//判断修改还是新增,0新增,1修改
  142. needEditRow.value = props.editRow//赋值给本组件需要修改对象
  143. flow.getByModelAndIed({//给下拉菜单赋值
  144. model_id: needModel.value - 0,
  145. ied_type: needIedType.value
  146. }).then(res => {
  147. if (res.data !== null && res.data.length > 0) {
  148. options.value = res.data.map((item, index) => {
  149. return {
  150. label: item.func_name,
  151. id: item.id,
  152. value: item.func_name
  153. }
  154. })
  155. } else {
  156. options.value = []
  157. }
  158. })
  159. if (numState.value == 1) {
  160. titles.value = '编辑装置功能'
  161. abilityFrom.value.setAbName = needEditRow.value.func_name
  162. abilityFrom.value.setMemo = needEditRow.value.fcda_match_exp
  163. abilityFrom.value.setSon = needEditRow.value.fcda_name
  164. abilityFrom.value.sg = needEditRow.value.svorgoose
  165. abilityFrom.value.io = needEditRow.value.inorout
  166. }
  167. }
  168. // 关闭模态框
  169. function closeModal() {
  170. dialogVisible.value = false
  171. emit("addAback", dialogVisible.value)
  172. }
  173. // 确认关闭模态框
  174. function sureClose() {
  175. if (numState.value == 0) {
  176. flow.saveModelAndIed({
  177. model_id: needModel.value - 0,//模型id
  178. ied_type: needIedType.value,//装置类型
  179. func_id: newAddId?.value,
  180. func_name: abilityFrom.value?.setAbName,
  181. fcda_name: abilityFrom.value.setSon,
  182. fcda_match_exp: abilityFrom.value.setMemo,
  183. sv_or_goose: abilityFrom.value.sg,//sv还是goose
  184. in_or_out: abilityFrom.value.io//输入还是输出
  185. }).then(res => {
  186. if (res.code == 0) {
  187. dialogVisible.value = false
  188. emit("addAback", dialogVisible.value)
  189. ElMessage({
  190. type: "success",
  191. message: "添加成功",
  192. duration: 2000
  193. })
  194. props.copyReload()
  195. } else {
  196. ElMessage({
  197. message: res.msg,
  198. type: "error"
  199. })
  200. }
  201. })
  202. } else {
  203. flow.saveModelAndIed({
  204. model_id: needModel.value - 0,
  205. ied_type: needIedType.value,
  206. func_name: abilityFrom.value.setAbName,
  207. fcda_name: abilityFrom.value.setSon,
  208. fcda_match_exp: abilityFrom.value.setMemo,
  209. func_id: needEditRow.value.func_id - 0,
  210. fcda_id: needEditRow.value.id - 0,
  211. sv_or_goose: abilityFrom.value.sg,
  212. in_or_out: abilityFrom.value.io
  213. }).then(res => {
  214. if (res.code == 0) {
  215. dialogVisible.value = false
  216. emit("addAback", dialogVisible.value)
  217. ElMessage({
  218. type: "success",
  219. message: "修改成功",
  220. duration: 2000
  221. })
  222. props.copyReload()
  223. } else {
  224. ElMessage({
  225. message: res.msg,
  226. type: "error"
  227. })
  228. }
  229. })
  230. }
  231. }
  232. // 设计功能名称change事件
  233. function abNameChange(e) {
  234. if (e.label) {
  235. abilityFrom.value.setAbName = e.label
  236. newAddId.value = e.id
  237. } else {
  238. abilityFrom.value.setAbName = e
  239. console.log(e, 'id');
  240. }
  241. }
  242. //选择sv还是goose的change事件
  243. function sgChange(e) {
  244. // 将选择的数据赋值给表单内sg
  245. abilityFrom.value.sg = e
  246. }
  247. //选择输入还是输出的change事件
  248. function ioChange(e) {
  249. // 将选择的数据赋值给表单内io
  250. abilityFrom.value.io = e
  251. }
  252. onMounted(() => {
  253. reload()
  254. // setTimeout(() => {
  255. // reload()
  256. // }, 1500);
  257. })
  258. return {
  259. dialogVisible,//模态框开关
  260. reload,//初始化组件
  261. handleClose: closeModal,//关闭模态框
  262. cancels: closeModal,//关闭模态框
  263. sureClick: sureClose,// 确认关闭模态框
  264. abilityFrom,//表单项value
  265. options,//多选选项
  266. rules,//表单验证
  267. abNameChange,//设计功能名称change事件
  268. needModel,//需要的模型id
  269. needIedType,//需要的iedtype
  270. numState,//0为新增,1为修改
  271. needEditRow,//需要的整个对象属性
  272. newAddId,//新增的id
  273. titles,//模态框title
  274. sgChange,//选择sv还是goose的change事件
  275. ioChange,//选择输入还是输出的change事件,
  276. ruleFormRef,//表单的ref,用于触发验证
  277. }
  278. }
  279. }
  280. </script>
  281. <style scoped>
  282. p {
  283. margin: 0;
  284. padding: 0;
  285. }
  286. </style>