BaseForm.vue 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652
  1. <template>
  2. <a-modal
  3. :title="modalTitle"
  4. :width="1200"
  5. :visible="visible"
  6. :confirmLoading="confirmLoading"
  7. class="ant-modal2"
  8. @cancel="handleCancel"
  9. >
  10. <a-row :gutter="48" slot="footer">
  11. <a-col :md="48" :sm="48">
  12. <span class="table-page-search-submitButtons" style="float: right">
  13. <a-button style="margin-right: 8px" type="default" @click="handleCancel()">返回</a-button>
  14. <a-button :loading="confirmLoading" type="primary" @click="save()">保存</a-button>
  15. </span>
  16. </a-col>
  17. </a-row>
  18. <a-form :form="form">
  19. <a-form-item v-show="false">
  20. <a-input v-decorator="['id']" type="hidden"/>
  21. <a-input v-decorator="['sbId']" type="hidden"/>
  22. <a-input v-decorator="['warnFirstColor']" type="hidden"/>
  23. <a-input v-decorator="['warnSecondColor']" type="hidden"/>
  24. <a-input v-decorator="['warnThirdColor']" type="hidden"/>
  25. <a-input v-decorator="['warnFourColor']" type="hidden"/>
  26. </a-form-item>
  27. <row-list :col="2">
  28. <row-item>
  29. <a-form-item
  30. label="车间位置"
  31. :labelCol="BaseTool.Constant.labelCol"
  32. :wrapperCol="BaseTool.Constant.wrapperCol"
  33. >
  34. <a-tree-select
  35. style="width: 100%"
  36. :dropdownStyle="{ maxHeight: '400px', overflow: 'auto' }"
  37. :treeData="treeData"
  38. :treeNodeFilterProp="'title'"
  39. :showSearch="true"
  40. v-decorator="['line', {rules: [{required: false, message: '车间位置不能为空'}]}]"
  41. placeholder="请选择"
  42. >
  43. </a-tree-select>
  44. </a-form-item>
  45. </row-item>
  46. <row-item>
  47. <a-form-item
  48. label="点位名称"
  49. :labelCol="BaseTool.Constant.labelCol"
  50. :wrapperCol="BaseTool.Constant.wrapperCol"
  51. >
  52. <a-input
  53. v-decorator="['sbName', {rules: [{required: true, message: '点位名称不能为空'}]}]" />
  54. </a-form-item>
  55. </row-item>
  56. <row-item>
  57. <a-form-item
  58. label="点位"
  59. :labelCol="BaseTool.Constant.labelCol"
  60. :wrapperCol="BaseTool.Constant.wrapperCol"
  61. :help="isExisting?'该点位已存在':''"
  62. >
  63. <a-input
  64. @blur="checkPoint"
  65. v-decorator="['description', {rules: [{required: true, message: '描述不能为空'}]}]"/>
  66. </a-form-item>
  67. </row-item>
  68. <row-item>
  69. <a-form-item
  70. label="OPC实际点位"
  71. :labelCol="BaseTool.Constant.labelCol"
  72. :wrapperCol="BaseTool.Constant.wrapperCol"
  73. >
  74. <a-input
  75. disabled
  76. style="width: 60%"
  77. v-decorator="['positionNum', {rules: [{required: false, message: '点位不能为空'}]}]"/>
  78. <a-button type="primary" style="width: 20%" @click="handleAddGroup">采集</a-button>
  79. <a-button type="default" style="width: 20%" @click="handleDelGroup">终止</a-button>
  80. </a-form-item>
  81. </row-item>
  82. <row-item>
  83. <a-form-item
  84. label="类型"
  85. :labelCol="BaseTool.Constant.labelCol"
  86. :wrapperCol="BaseTool.Constant.wrapperCol"
  87. >
  88. <a-select v-decorator="['type', {initialValue:1, rules: [{required: true, message: '类型不能为空'}]}]" placeholder="请选择" @change="changeType">
  89. <a-select-option
  90. v-for="(label,value) in map"
  91. :key="value"
  92. :label="label"
  93. :value="parseInt(value)">{{ label }}
  94. </a-select-option>
  95. </a-select>
  96. </a-form-item>
  97. </row-item>
  98. <row-item>
  99. <a-form-item
  100. label="是否模拟量"
  101. :labelCol="BaseTool.Constant.labelCol"
  102. :wrapperCol="BaseTool.Constant.wrapperCol"
  103. >
  104. <a-select v-decorator="['avFlag', {initialValue:1, rules: [{required: true, message: '是否模拟量不能为空'}]}]" placeholder="请选择">
  105. <a-select-option
  106. v-for="(label,value) in yesNoMap"
  107. :key="value"
  108. :label="label"
  109. :value="parseInt(value)">{{ label }}
  110. </a-select-option>
  111. </a-select>
  112. </a-form-item>
  113. </row-item>
  114. <row-item>
  115. <a-form-item
  116. label="opc服务器上是否已经创建"
  117. :labelCol="BaseTool.Constant.labelCol"
  118. :wrapperCol="BaseTool.Constant.wrapperCol"
  119. >
  120. <a-select v-decorator="['createdFlag', {initialValue:1, rules: [{required: true, message: 'opc服务器上是否已经创建不能为空'}]}]" placeholder="请选择">
  121. <a-select-option
  122. v-for="(label,value) in yesNoMap"
  123. :key="value"
  124. :label="label"
  125. :value="parseInt(value)">{{ label }}
  126. </a-select-option>
  127. </a-select>
  128. </a-form-item>
  129. </row-item>
  130. <row-item>
  131. <a-form-item
  132. label="opc页面是否已经配置位置"
  133. :labelCol="BaseTool.Constant.labelCol"
  134. :wrapperCol="BaseTool.Constant.wrapperCol"
  135. >
  136. <a-select v-decorator="['positionFlag', {initialValue:1, rules: [{required: true, message: 'opc页面是否已经配置位置不能为空'}]}]" placeholder="请选择">
  137. <a-select-option
  138. v-for="(label,value) in yesNoMap"
  139. :key="value"
  140. :label="label"
  141. :value="parseInt(value)">{{ label }}
  142. </a-select-option>
  143. </a-select>
  144. </a-form-item>
  145. </row-item>
  146. <row-item>
  147. <a-form-item
  148. label="是否重要点位"
  149. :labelCol="BaseTool.Constant.labelCol"
  150. :wrapperCol="BaseTool.Constant.wrapperCol"
  151. >
  152. <a-select v-decorator="['portFlag', {initialValue:0, rules: [{required: true, message: '是否重要点位不能为空'}]}]" placeholder="请选择">
  153. <a-select-option
  154. v-for="(label,value) in yesNoMap"
  155. :key="value"
  156. :label="label"
  157. :value="parseInt(value)">{{ label }}
  158. </a-select-option>
  159. </a-select>
  160. </a-form-item>
  161. </row-item>
  162. <row-item>
  163. <a-form-item
  164. label="x轴位置"
  165. :labelCol="BaseTool.Constant.labelCol"
  166. :wrapperCol="BaseTool.Constant.wrapperCol"
  167. >
  168. <a-input
  169. v-decorator="['xposition', {initialValue:50, rules: [{required: true, message: 'x轴位置不能为空'}]}]"/>
  170. </a-form-item>
  171. </row-item>
  172. <row-item>
  173. <a-form-item
  174. label="y轴位置"
  175. :labelCol="BaseTool.Constant.labelCol"
  176. :wrapperCol="BaseTool.Constant.wrapperCol"
  177. >
  178. <a-input
  179. v-decorator="['yposition', {initialValue:50, rules: [{required: true, message: 'y轴位置不能为空'}]}]"/>
  180. </a-form-item>
  181. </row-item>
  182. <row-item>
  183. <a-form-item
  184. label="位置宽度"
  185. :labelCol="BaseTool.Constant.labelCol"
  186. :wrapperCol="BaseTool.Constant.wrapperCol"
  187. >
  188. <a-input
  189. v-decorator="['width', {initialValue:60, rules: [{required: true, message: '位置宽度不能为空'}]}]"/>
  190. </a-form-item>
  191. </row-item>
  192. <row-item>
  193. <a-form-item
  194. label="位置高度"
  195. :labelCol="BaseTool.Constant.labelCol"
  196. :wrapperCol="BaseTool.Constant.wrapperCol"
  197. >
  198. <a-input
  199. v-decorator="['height', {initialValue:20, rules: [{ required: true, message: '位置高度不能为空'}]}]"/>
  200. </a-form-item>
  201. </row-item>
  202. <!-- <row-item>
  203. <a-form-item
  204. label="实时数值"
  205. :labelCol="BaseTool.Constant.labelCol"
  206. :wrapperCol="BaseTool.Constant.wrapperCol"
  207. >
  208. <a-input
  209. v-decorator="['result', {rules: [{required: false, message: '实时数值不能为空'}]}]"/>
  210. </a-form-item>
  211. </row-item>-->
  212. <row-item v-if="type!==1">
  213. <a-form-item
  214. label="图片x轴位置"
  215. :labelCol="BaseTool.Constant.labelCol"
  216. :wrapperCol="BaseTool.Constant.wrapperCol"
  217. >
  218. <a-input
  219. v-decorator="['imgXPosition', {initialValue:50, rules: [{required: true, message: '图片x轴位置不能为空'}]}]"/>
  220. </a-form-item>
  221. </row-item>
  222. <row-item v-if="type!==1">
  223. <a-form-item
  224. label="图片y轴位置"
  225. :labelCol="BaseTool.Constant.labelCol"
  226. :wrapperCol="BaseTool.Constant.wrapperCol"
  227. >
  228. <a-input
  229. v-decorator="['imgYPosition', {initialValue:100, rules: [{required: true, message: '图片y轴位置不能为空'}]}]"/>
  230. </a-form-item>
  231. </row-item>
  232. <row-item>
  233. <a-form-item
  234. label="最低阈值"
  235. :labelCol="BaseTool.Constant.labelCol"
  236. :wrapperCol="BaseTool.Constant.wrapperCol"
  237. >
  238. <a-input-number
  239. style="width: 73%"
  240. :min="0.01"
  241. :formatter="BaseTool.Amount.formatter"
  242. :parser="BaseTool.Amount.parser"
  243. v-decorator="['warnFirst', {rules: [{required: false, message: '最低阈值不能为空'}]}]"/>
  244. <a-tag style="line-height:30px;margin-left: 10px;" :color="colors.warnFirstColor" @click="handleSelectColor('warnFirstColor')">
  245. 选择颜色
  246. </a-tag>
  247. </a-form-item>
  248. </row-item>
  249. <row-item>
  250. <a-form-item
  251. label="低阈值"
  252. :labelCol="BaseTool.Constant.labelCol"
  253. :wrapperCol="BaseTool.Constant.wrapperCol"
  254. >
  255. <a-input-number
  256. style="width: 73%"
  257. :min="0.01"
  258. :formatter="BaseTool.Amount.formatter"
  259. :parser="BaseTool.Amount.parser"
  260. v-decorator="['warnSecond', {rules: [{required: false, message: '低阈值不能为空'}]}]"/>
  261. <a-tag style="line-height:30px;margin-left: 10px;" :color="colors.warnSecondColor" @click="handleSelectColor('warnSecondColor')">
  262. 选择颜色
  263. </a-tag>
  264. </a-form-item>
  265. </row-item>
  266. <row-item>
  267. <a-form-item
  268. label="高阈值"
  269. :labelCol="BaseTool.Constant.labelCol"
  270. :wrapperCol="BaseTool.Constant.wrapperCol"
  271. >
  272. <a-input-number
  273. style="width: 73%"
  274. :min="0.01"
  275. :formatter="BaseTool.Amount.formatter"
  276. :parser="BaseTool.Amount.parser"
  277. v-decorator="['warnThird', {rules: [{required: false, message: '高阈值不能为空'}]}]"/>
  278. <a-tag style="line-height:30px;margin-left: 10px;" :color="colors.warnThirdColor" @click="handleSelectColor('warnThirdColor')">
  279. 选择颜色
  280. </a-tag>
  281. </a-form-item>
  282. </row-item>
  283. <row-item>
  284. <a-form-item
  285. label="最高阈值"
  286. :labelCol="BaseTool.Constant.labelCol"
  287. :wrapperCol="BaseTool.Constant.wrapperCol"
  288. >
  289. <a-input-number
  290. style="width: 73%"
  291. :min="0.01"
  292. :formatter="BaseTool.Amount.formatter"
  293. :parser="BaseTool.Amount.parser"
  294. v-decorator="['warnFour', {rules: [{required: false, message: '最高阈值不能为空'}]}]"/>
  295. <a-tag style="line-height:30px;margin-left: 10px;" :color="colors.warnFourColor" @click="handleSelectColor('warnFourColor')">
  296. 选择颜色
  297. </a-tag>
  298. </a-form-item>
  299. </row-item>
  300. <row-item>
  301. <a-form-item
  302. label="量程上限"
  303. :labelCol="BaseTool.Constant.labelCol"
  304. :wrapperCol="BaseTool.Constant.wrapperCol"
  305. >
  306. <a-input-number
  307. style="width: 100%"
  308. :min="0"
  309. :formatter="BaseTool.Amount.formatter"
  310. :parser="BaseTool.Amount.parser"
  311. v-decorator="['high', {initialValue:100,rules: [{required: false, message: '量程上限不能为空'}]}]"/>
  312. </a-form-item>
  313. </row-item>
  314. <row-item>
  315. <a-form-item
  316. label="量程下限"
  317. :labelCol="BaseTool.Constant.labelCol"
  318. :wrapperCol="BaseTool.Constant.wrapperCol"
  319. >
  320. <a-input-number
  321. style="width: 100%"
  322. :min="0"
  323. :formatter="BaseTool.Amount.formatter"
  324. :parser="BaseTool.Amount.parser"
  325. v-decorator="['low', {initialValue:0,rules: [{required: false, message: '量程下限不能为空'}]}]"/>
  326. </a-form-item>
  327. </row-item>
  328. <row-item>
  329. <a-form-item
  330. label="系数"
  331. :labelCol="BaseTool.Constant.labelCol"
  332. :wrapperCol="BaseTool.Constant.wrapperCol"
  333. >
  334. <a-input-number
  335. style="width: 100%"
  336. :min="0"
  337. :formatter="BaseTool.Amount.formatter"
  338. :parser="BaseTool.Amount.parser"
  339. v-decorator="['ratio', {rules: [{required: false, message: '系数不能为空'}]}]"/>
  340. </a-form-item>
  341. </row-item>
  342. <row-item>
  343. <a-form-item
  344. label="单位"
  345. :labelCol="BaseTool.Constant.labelCol"
  346. :wrapperCol="BaseTool.Constant.wrapperCol"
  347. >
  348. <a-input
  349. v-decorator="['unit', {initialValue:'kPaT',rules: [{required: true, message: '单位不能为空'}]}]"/>
  350. </a-form-item>
  351. </row-item>
  352. <row-item>
  353. <a-form-item
  354. label="备注"
  355. :labelCol="BaseTool.Constant.labelCol"
  356. :wrapperCol="BaseTool.Constant.wrapperCol"
  357. >
  358. <a-input
  359. v-decorator="['remark', {rules: [{required: false, message: '备注不能为空'}]}]"/>
  360. </a-form-item>
  361. </row-item>
  362. </row-list>
  363. </a-form>
  364. <sb-info-select-modal ref="sbInfoSelectModal" @selected="handleSbSelectd"/>
  365. <ColorModal ref="colorModal" @selected="handleColor"/>
  366. </a-modal>
  367. </template>
  368. <script>
  369. import pick from 'lodash.pick'
  370. import {
  371. addRemoteOpc,
  372. addRemoteOpcGroup,
  373. delRemoteOpcGroup,
  374. updateRemoteOpc,
  375. fetchRemoteOpcByPositionNumAndLine,
  376. fetchRemoteOpc
  377. } from '@/api/remote/opc'
  378. import SbInfoSelectModal from '@/views/sb/info/modules/SbInfoSelectModal'
  379. import { getSbPositionTree } from '@/api/sb/position'
  380. import ColorModal from './ColorModal'
  381. export default {
  382. name: 'BaseRemoteOpc',
  383. components: {
  384. SbInfoSelectModal,
  385. ColorModal
  386. },
  387. data () {
  388. return {
  389. confirmLoading: false,
  390. modalTitle: null,
  391. map: {},
  392. treeData: [],
  393. yesNoMap: {},
  394. form: this.$form.createForm(this),
  395. visible: false,
  396. type: 1,
  397. isExisting: false,
  398. position: {},
  399. color: '',
  400. colors: {
  401. warnFourColor: '#B71C1C',
  402. warnThirdColor: '#F57F17',
  403. warnSecondColor: '#F57F17',
  404. warnFirstColor: '#B71C1C'
  405. }
  406. }
  407. },
  408. props: {},
  409. created () {
  410. // 下拉框map
  411. this.map = this.DictCache.getLabelByValueMapByType(this.DictCache.TYPE.REMOTE_OPC)
  412. this.yesNoMap = this.DictCache.getLabelByValueMapByType(this.DictCache.TYPE.YES_NO)
  413. getSbPositionTree({ opcFlag: 1 }).then(res => {
  414. this.treeData = res.data
  415. })
  416. },
  417. methods: {
  418. base (record, position) {
  419. this.visible = true
  420. const { form: { setFieldsValue } } = this
  421. this.position = position
  422. // 如果是空标识添加
  423. if (this.BaseTool.Object.isBlank(record.id)) {
  424. this.modalTitle = '添加'
  425. this.$nextTick(() => {
  426. setFieldsValue(Object.assign(pick(record, [
  427. 'line'
  428. ]),
  429. pick(position, [
  430. 'xposition',
  431. 'yposition',
  432. 'imgXPosition',
  433. 'imgYPosition'
  434. ])
  435. ))
  436. })
  437. return
  438. }
  439. this.modalTitle = '编辑'
  440. this.type = record.type
  441. // 日期处理
  442. this.$nextTick(() => {
  443. setFieldsValue(Object.assign(pick(record, [
  444. 'id',
  445. 'sbId',
  446. 'sbName',
  447. 'positionNum',
  448. 'type',
  449. 'line',
  450. 'description',
  451. 'result',
  452. 'ratio',
  453. 'low',
  454. 'high',
  455. 'warnFirst',
  456. 'warnSecond',
  457. 'warnThird',
  458. 'warnFour',
  459. 'warnFirstColor',
  460. 'warnSecondColor',
  461. 'warnThirdColor',
  462. 'warnFourColor',
  463. 'xposition',
  464. 'yposition',
  465. 'imgXPosition',
  466. 'imgYPosition',
  467. 'width',
  468. 'height',
  469. 'unit',
  470. 'avFlag',
  471. 'portFlag',
  472. 'createdFlag',
  473. 'positionFlag',
  474. 'remark'
  475. ])))
  476. })
  477. },
  478. handleAddGroup () {
  479. const { form: { getFieldValue } } = this
  480. const id = getFieldValue('id')
  481. if (id == null || id === '') {
  482. this.$message.error('请先保存点位信息')
  483. return
  484. }
  485. fetchRemoteOpc({ id: id }).then(res => {
  486. if (res.data.positionNum == null || res.data.positionNum === '') {
  487. this.$message.error('请设置点位')
  488. return
  489. }
  490. addRemoteOpcGroup(res.data.positionNum)
  491. .then((res) => {
  492. this.$message.info(res.data)
  493. }).catch(() => {
  494. this.confirmLoading = false
  495. })
  496. })
  497. },
  498. handleDelGroup () {
  499. const { form: { getFieldValue } } = this
  500. const id = getFieldValue('id')
  501. if (id == null || id === '') {
  502. this.$message.error('请先保存点位信息')
  503. return
  504. }
  505. fetchRemoteOpc({ id: id }).then(res => {
  506. if (res.data.positionNum == null || res.data.positionNum === '') {
  507. this.$message.error('请设置点位')
  508. return
  509. }
  510. delRemoteOpcGroup(res.data.positionNum)
  511. .then((res) => {
  512. this.$message.info(res.data)
  513. }).catch(() => {
  514. this.confirmLoading = false
  515. })
  516. })
  517. },
  518. save () {
  519. const { form: { validateFieldsAndScroll } } = this
  520. this.confirmLoading = true
  521. validateFieldsAndScroll((errors, values) => {
  522. if (errors) {
  523. this.confirmLoading = false
  524. return
  525. }
  526. // 日期处理
  527. const params = {
  528. ...values,
  529. ...this.colors
  530. }
  531. if (this.BaseTool.String.isBlank(params.id)) {
  532. addRemoteOpc(params)
  533. .then(() => {
  534. this.handleCancel(params)
  535. }).catch(() => {
  536. this.confirmLoading = false
  537. })
  538. } else {
  539. console.log('..........................')
  540. updateRemoteOpc(params)
  541. .then(() => {
  542. this.handleCancel(params)
  543. }).catch(() => {
  544. this.confirmLoading = false
  545. })
  546. }
  547. })
  548. },
  549. handleSbSelect () {
  550. this.$refs.sbInfoSelectModal.base()
  551. },
  552. changeType (val) {
  553. this.type = val
  554. },
  555. handleSbSelectd (keys, rows) {
  556. const [ key ] = keys
  557. const [ row ] = rows
  558. const { form: { setFieldsValue } } = this
  559. this.sbId = key
  560. // 日期处理
  561. console.log(keys, rows)
  562. this.$nextTick(() => {
  563. setFieldsValue(Object.assign({
  564. 'sbId': key,
  565. 'sbName': row.name
  566. }))
  567. })
  568. },
  569. handleCancel (values) {
  570. this.visible = false
  571. this.confirmLoading = false
  572. this.isExisting = false
  573. this.form.resetFields()
  574. if (this.BaseTool.Object.isNotBlank(values)) {
  575. this.$emit('ok', values)
  576. } else {
  577. this.$emit('ok')
  578. }
  579. },
  580. handleSelectColor (type) {
  581. this.color = type
  582. this.$refs.colorModal.base(this.colors[this.color])
  583. },
  584. handleColor (value) {
  585. console.log(value)
  586. this.colors[this.color] = value
  587. },
  588. checkPoint (e) {
  589. const { form: { setFieldsValue, getFieldValue } } = this
  590. fetchRemoteOpcByPositionNumAndLine({
  591. positionNum: e.target.value,
  592. line: getFieldValue('line')
  593. }).then(res => {
  594. if (res.data === null) {
  595. this.isExisting = false
  596. this.modalTitle = '添加'
  597. // this.form.resetFields()
  598. return
  599. }
  600. this.modalTitle = '编辑'
  601. // 日期处理
  602. this.isExisting = true
  603. this.$nextTick(() => {
  604. setFieldsValue(Object.assign(pick(res.data, [
  605. 'id',
  606. 'sbId',
  607. 'sbName',
  608. 'positionNum',
  609. 'type',
  610. 'line',
  611. 'description',
  612. 'result',
  613. 'ratio',
  614. 'low',
  615. 'high',
  616. 'width',
  617. 'height',
  618. 'unit',
  619. 'avFlag',
  620. 'portFlag',
  621. 'createdFlag',
  622. 'positionFlag',
  623. 'remark'
  624. ])))
  625. })
  626. })
  627. }
  628. }
  629. }
  630. </script>