node-add.vue 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641
  1. <template>
  2. <div>
  3. <el-form
  4. :model="form"
  5. ref="form"
  6. :rules="rules"
  7. label-width="80px"
  8. v-if="node.type !== 't-check'"
  9. >
  10. <el-form-item label="节点名称" prop="nodeName">
  11. <el-input
  12. v-model="form.nodeName"
  13. placeholder="请输入节点名称"
  14. :disabled="disabled || selectOperator"
  15. ></el-input>
  16. </el-form-item>
  17. <el-form-item
  18. label="工种类型"
  19. prop="workTypeId"
  20. v-if="node.type !== 'end'"
  21. >
  22. <el-select
  23. v-model="form.workTypeId"
  24. placeholder="请选择"
  25. style="width: 100%"
  26. :disabled="disabled || selectOperator"
  27. @change="onChage"
  28. >
  29. <el-option
  30. v-for="item in workTypeOptions"
  31. :key="item.typeId"
  32. :label="item.name"
  33. :value="item.typeId"
  34. ></el-option>
  35. </el-select>
  36. </el-form-item>
  37. <el-form-item label="工时单价">
  38. <el-input
  39. v-model="form.quotedPrice"
  40. placeholder="工时单价"
  41. :disabled="disabled"
  42. ></el-input>
  43. </el-form-item>
  44. <el-form-item label="备注" prop="notes">
  45. <el-input
  46. v-model="form.notes"
  47. :disabled="disabled || selectOperator"
  48. ></el-input>
  49. </el-form-item>
  50. <el-form-item label="工序要求" prop="require" v-if="node.type !== 'end'">
  51. <el-input
  52. v-model="form.require"
  53. :disabled="disabled || selectOperator"
  54. ></el-input>
  55. </el-form-item>
  56. <el-form-item label="工序说明" prop="explain" v-if="node.type !== 'end'">
  57. <el-input
  58. v-model="form.explain"
  59. :disabled="disabled || selectOperator"
  60. ></el-input>
  61. </el-form-item>
  62. <el-form-item label="工序特性" prop="process" v-if="node.type !== 'end'">
  63. <el-input
  64. v-model="form.process"
  65. :disabled="disabled || selectOperator"
  66. ></el-input>
  67. </el-form-item>
  68. <el-form-item
  69. label="所需工时"
  70. prop="preTaskTime"
  71. v-if="node.type !== 'end'"
  72. >
  73. <el-input
  74. v-model="form.preTaskTime"
  75. :disabled="disabled || selectOperator"
  76. oninput="value=value.replace(/[^0-9.]/g,'')"
  77. >
  78. <i slot="suffix" style="font-style: normal; margin-right: 10px">h</i>
  79. </el-input>
  80. </el-form-item>
  81. <el-form-item label="操作人" v-if="form.operatorName && !selectOperator">
  82. <el-input
  83. :disabled="disabled && selectOperator"
  84. v-model="form.operatorName"
  85. ></el-input>
  86. </el-form-item>
  87. <el-form-item
  88. label="操作人"
  89. prop="operatorId"
  90. v-if="selectOperator && node.type !== 'end'"
  91. >
  92. <el-select
  93. v-model="form.operatorId"
  94. :disabled="disabled && selectOperator"
  95. multiple
  96. placeholder="请选择"
  97. style="width: 100%"
  98. >
  99. <el-option
  100. v-for="item in operatorIdOptions"
  101. :key="item.userId"
  102. :label="item.name"
  103. :value="item.userId"
  104. ></el-option>
  105. </el-select>
  106. </el-form-item>
  107. <el-form-item v-if="node.type !== 'end' && !disabled && !selectOperator">
  108. <upload-component
  109. :title="'附件'"
  110. :accept="'*'"
  111. :file-obj-list="fileList"
  112. @uploadSuccess="uploadSuccess"
  113. />
  114. </el-form-item>
  115. <el-form-item v-else>
  116. <upload-component
  117. :display="true"
  118. :title="'附件'"
  119. :accept="'*'"
  120. :file-obj-list="fileList"
  121. @uploadSuccess="uploadSuccess"
  122. />
  123. </el-form-item>
  124. </el-form>
  125. <!-- 节点是总检时显示下面内容 -->
  126. <el-form
  127. :model="form"
  128. ref="form"
  129. :rules="rules"
  130. label-width="80px"
  131. v-if="node.type == 't-check'"
  132. >
  133. <el-row>
  134. <el-col :span="8">
  135. <el-form-item label="节点名称" prop="nodeName">
  136. <el-input
  137. v-model="form.nodeName"
  138. placeholder="请输入节点名称"
  139. :disabled="disabled || selectOperator"
  140. ></el-input>
  141. </el-form-item>
  142. </el-col>
  143. <el-col :span="8">
  144. <el-form-item
  145. label="工种类型"
  146. prop="workTypeId"
  147. v-if="node.type !== 'end'"
  148. >
  149. <el-select
  150. v-model="form.workTypeId"
  151. placeholder="请选择"
  152. style="width: 100%"
  153. :disabled="disabled || selectOperator"
  154. @change="onChage"
  155. >
  156. <el-option
  157. v-for="item in workTypeOptions"
  158. :key="item.typeId"
  159. :label="item.name"
  160. :value="item.typeId"
  161. ></el-option>
  162. </el-select>
  163. </el-form-item>
  164. </el-col>
  165. <el-col :span="8">
  166. <el-form-item label="工时单价">
  167. <el-input
  168. v-model="form.quotedPrice"
  169. placeholder="工时单价"
  170. disabled
  171. ></el-input>
  172. </el-form-item>
  173. </el-col>
  174. </el-row>
  175. <el-row>
  176. <el-col :span="8">
  177. <el-form-item
  178. label="工序要求"
  179. prop="require"
  180. v-if="node.type !== 'end'"
  181. >
  182. <el-input
  183. v-model="form.require"
  184. :disabled="disabled || selectOperator"
  185. ></el-input>
  186. </el-form-item>
  187. </el-col>
  188. <el-col :span="8">
  189. <el-form-item
  190. label="工序说明"
  191. prop="explain"
  192. v-if="node.type !== 'end'"
  193. >
  194. <el-input
  195. v-model="form.explain"
  196. :disabled="disabled || selectOperator"
  197. ></el-input>
  198. </el-form-item>
  199. </el-col>
  200. <el-col :span="8">
  201. <el-form-item
  202. label="所需工时"
  203. prop="preTaskTime"
  204. v-if="node.type !== 'end'"
  205. >
  206. <el-input
  207. v-model="form.preTaskTime"
  208. :disabled="disabled || selectOperator"
  209. oninput="value=value.replace(/[^0-9.]/g,'')"
  210. >
  211. <i slot="suffix" style="font-style: normal; margin-right: 10px"
  212. >h</i
  213. >
  214. </el-input>
  215. </el-form-item>
  216. </el-col>
  217. </el-row>
  218. <el-row>
  219. <el-col :span="8">
  220. <el-form-item
  221. label="操作人"
  222. v-if="disabled"
  223. >
  224. <el-input
  225. :disabled="disabled"
  226. v-model="form.operatorName"
  227. ></el-input>
  228. </el-form-item>
  229. <el-form-item
  230. label="操作人"
  231. prop="operatorId"
  232. v-if="!disabled && selectOperator && node.type !== 'end'"
  233. >
  234. <el-select
  235. v-model="form.operatorId"
  236. :disabled="disabled && selectOperator"
  237. multiple
  238. placeholder="请选择"
  239. style="width: 100%"
  240. >
  241. <el-option
  242. v-for="item in operatorIdOptions"
  243. :key="item.userId"
  244. :label="item.name"
  245. :value="item.userId"
  246. ></el-option>
  247. </el-select>
  248. </el-form-item>
  249. </el-col>
  250. </el-row>
  251. <el-row>
  252. <el-col :span="24">
  253. <el-form-item label="备注" prop="notes">
  254. <el-input
  255. type="textarea"
  256. v-model="form.notes"
  257. :disabled="disabled || selectOperator"
  258. ></el-input>
  259. </el-form-item>
  260. </el-col>
  261. </el-row>
  262. <el-row>
  263. <el-col :span="24">
  264. <div>检验项目</div>
  265. </el-col>
  266. </el-row>
  267. <!-- <el-row>
  268. <el-col :span="24">
  269. <el-form-item label="检验方法">
  270. <div>
  271. 1.游标卡尺,2.千分尺,3.高度尺,4.百分表,5.R规,6.环规、塞规,7.游标角度尺,8.三坐标,9.模具,10.样板,11.夹具,12.目测,13.组合测量,14.精密测量,15.敲击,16.测厚仪,17.其他
  272. </div>
  273. </el-form-item>
  274. </el-col>
  275. </el-row> -->
  276. <el-row>
  277. <el-table :data="form.prodProductionRequireList" style="width: 100%">
  278. <el-table-column prop="pageNo" label="页次/图区">
  279. <template slot-scope="scope">
  280. <el-form-item
  281. :prop="'prodProductionRequireList.' + scope.$index + '.pageNo'"
  282. :rules="rules.pageNo"
  283. label-width="0px"
  284. >
  285. <el-input
  286. v-model="scope.row.pageNo"
  287. :disabled="disabled || selectOperator"
  288. ></el-input>
  289. </el-form-item>
  290. </template>
  291. </el-table-column>
  292. <el-table-column prop="inspectionParam" label="检查参数">
  293. <template slot-scope="scope">
  294. <el-form-item
  295. :prop="
  296. 'prodProductionRequireList.' +
  297. scope.$index +
  298. '.inspectionParam'
  299. "
  300. :rules="rules.inspectionParam"
  301. label-width="0px"
  302. >
  303. <el-input
  304. v-model="scope.row.inspectionParam"
  305. :disabled="disabled || selectOperator"
  306. @blur="inspectionParamBlur($event, scope.$index)"
  307. ></el-input>
  308. </el-form-item>
  309. </template>
  310. </el-table-column>
  311. <el-table-column prop="inspectionMethod" label="检验方法">
  312. <template slot-scope="scope">
  313. <el-form-item
  314. :prop="
  315. 'prodProductionRequireList.' +
  316. scope.$index +
  317. '.inspectionMethod'
  318. "
  319. :rules="rules.inspectionMethod"
  320. label-width="0px"
  321. >
  322. <el-select
  323. v-model="scope.row.inspectionMethod"
  324. placeholder="请选择"
  325. style="width: 100%"
  326. :disabled="disabled || selectOperator"
  327. >
  328. <el-option
  329. v-for="item in inspectionMethodOptions"
  330. :key="item.value"
  331. :label="item.name"
  332. :value="item.value"
  333. ></el-option>
  334. </el-select>
  335. </el-form-item>
  336. </template>
  337. </el-table-column>
  338. <el-table-column prop="allowValues" label="允许值">
  339. <template slot-scope="scope">
  340. <el-form-item
  341. :prop="
  342. 'prodProductionRequireList.' + scope.$index + '.allowValues'
  343. "
  344. :rules="rules.allowValues"
  345. label-width="0px"
  346. >
  347. <el-input
  348. v-model="scope.row.allowValues"
  349. :disabled="disabled || selectOperator"
  350. ></el-input>
  351. </el-form-item>
  352. </template>
  353. </el-table-column>
  354. <el-table-column prop="measureRecord1" label="实测记录1">
  355. <template slot-scope="scope">
  356. <div style="margin-bottom:22px;">{{scope.row.measureRecord1}}</div>
  357. </template>
  358. </el-table-column>
  359. <el-table-column prop="measureRecord2" label="实测纪录2">
  360. <template slot-scope="scope">
  361. <div style="margin-bottom:22px;">{{scope.row.measureRecord2}}</div>
  362. </template>
  363. </el-table-column>
  364. <el-table-column label="操作" width="140px" v-if="!disabled">
  365. <template slot-scope="scope">
  366. <el-button
  367. type="primary"
  368. icon="el-icon-circle-plus"
  369. circle
  370. @click="addRow"
  371. ></el-button>
  372. <el-button
  373. type="danger"
  374. icon="el-icon-delete"
  375. circle
  376. @click="removeRow(scope.$index)"
  377. v-if="scope.$index > 0"
  378. ></el-button>
  379. </template>
  380. </el-table-column>
  381. </el-table>
  382. </el-row>
  383. <el-form-item v-if="!disabled && !selectOperator">
  384. <upload-component
  385. :title="'附件'"
  386. :accept="'*'"
  387. :file-obj-list="fileList"
  388. @uploadSuccess="uploadSuccess"
  389. />
  390. </el-form-item>
  391. <el-form-item v-else>
  392. <upload-component
  393. :display="true"
  394. :title="'附件'"
  395. :accept="'*'"
  396. :file-obj-list="fileList"
  397. @uploadSuccess="uploadSuccess"
  398. />
  399. </el-form-item>
  400. </el-form>
  401. </div>
  402. </template>
  403. <script>
  404. import { getWorkType } from '@/api/crafts'
  405. import { workTypeMasterList } from '@/api/worktype'
  406. import UploadComponent from '@/views/modules/common/upload-component'
  407. export default {
  408. name: 'nodeAdd',
  409. components: { UploadComponent },
  410. props: {
  411. data: {
  412. type: Object,
  413. default: () => {}
  414. },
  415. disabled: {
  416. type: Boolean,
  417. default: false
  418. },
  419. // 是否选择操作人,当选择操作人时,其他字段不可编辑
  420. selectOperator: {
  421. type: Boolean,
  422. default: false
  423. },
  424. isEdit: {
  425. type: Boolean,
  426. default: false
  427. }
  428. },
  429. data () {
  430. return {
  431. // 工种列表
  432. workTypeOptions: [],
  433. // 操作人列表
  434. operatorIdOptions: [],
  435. node: {},
  436. form: {
  437. nodeName: '',
  438. workTypeId: '',
  439. operatorId: [],
  440. prodProductionRequireList: [{allowValues: ''}]
  441. },
  442. fileList: [],
  443. inspectionMethodOptions: [
  444. { value: '1', name: '游标卡尺' },
  445. { value: '2', name: '千分尺' },
  446. { value: '3', name: '高度尺' },
  447. { value: '4', name: '百分表' },
  448. { value: '5', name: 'R规' },
  449. { value: '6', name: '环规、塞规' },
  450. { value: '7', name: '游标角度尺' },
  451. { value: '8', name: '三坐标' },
  452. { value: '9', name: '模具' },
  453. { value: '10', name: '样板' },
  454. { value: '11', name: '夹具' },
  455. { value: '12', name: '目测' },
  456. { value: '13', name: '组合测量' },
  457. { value: '14', name: '精密测量' },
  458. { value: '15', name: '敲击' },
  459. { value: '16', name: '测厚仪' },
  460. { value: '17', name: '其他' }
  461. ],
  462. rules: {
  463. nodeName: [
  464. { required: true, message: '请输入节点名称', trigger: 'blur' }
  465. ],
  466. workTypeId: [
  467. { required: true, message: '请选择工种', trigger: 'blur' }
  468. ],
  469. operatorId: [
  470. { required: true, message: '请选择操作人', trigger: 'blur' }
  471. ],
  472. preTaskTime: [
  473. { required: true, message: '请输入所需工时', trigger: 'blur' }
  474. ],
  475. pageNo: [{ required: true, message: '请输入', trigger: 'blur' }],
  476. inspectionParam: [
  477. { required: true, message: '请输入', trigger: 'blur' }
  478. ],
  479. inspectionMethod: [
  480. { required: true, message: '请选择', trigger: 'blur' }
  481. ],
  482. allowValues: [{ required: true, message: '请输入', trigger: 'blur' }]
  483. }
  484. }
  485. },
  486. watch: {
  487. data (val) {
  488. this.node = val
  489. this.form = {
  490. ...this.form,
  491. ...this.node
  492. }
  493. if (this.node.operatorId) {
  494. this.form.operatorId = this.node.operatorId.split(',')
  495. }
  496. // 附件
  497. if (this.node.attachList) {
  498. this.$nextTick(() => {
  499. this.fileList = []
  500. this.node.attachList.forEach((item) => {
  501. this.fileList.push({
  502. name: item.fileName,
  503. url: item.url,
  504. id: item.url
  505. })
  506. })
  507. })
  508. }
  509. },
  510. disabled (val) {
  511. this.disabled = val
  512. },
  513. isEdit (val) {
  514. this.isEdit = val
  515. }
  516. },
  517. activated () {},
  518. created () {
  519. this.getWorkTypeOptions()
  520. },
  521. computed: {},
  522. mounted () {
  523. this.node = this.data
  524. this.form = {
  525. ...this.form,
  526. ...this.node
  527. }
  528. if (this.node.operatorId) {
  529. this.form.operatorId = this.node.operatorId.split(',')
  530. }
  531. // 附件
  532. if (this.node.attachList) {
  533. this.fileList = []
  534. this.node.attachList.forEach((item) => {
  535. this.fileList.push({
  536. name: item.fileName,
  537. url: item.url,
  538. id: item.url
  539. })
  540. })
  541. }
  542. this.getOperatorList()
  543. },
  544. methods: {
  545. getWorkTypeOptions () {
  546. this.workTypeOptions = []
  547. getWorkType().then(({ data }) => {
  548. if (data && data.code === '200') {
  549. this.workTypeOptions = data.data
  550. }
  551. })
  552. },
  553. onChage (val) {
  554. this.workTypeOptions.forEach((v) => {
  555. if (v.typeId === val) {
  556. this.form.quotedPrice = Number(v.quotedPrice || 0).toFixed(2)
  557. }
  558. })
  559. },
  560. // 按工种ID查询操作人列表
  561. getOperatorList () {
  562. if (this.node.workTypeId) {
  563. workTypeMasterList(this.node.workTypeId).then(({ data }) => {
  564. if (data && data.code === '200') {
  565. this.operatorIdOptions = []
  566. data.data.forEach((item) => {
  567. this.operatorIdOptions.push(item)
  568. })
  569. }
  570. })
  571. }
  572. },
  573. uploadSuccess (fileList) {
  574. this.fileList = fileList
  575. },
  576. // 校验表单
  577. validateFormData () {
  578. return new Promise((resolve, reject) => {
  579. this.$refs['form'].validate((valid) => {
  580. if (!valid) {
  581. // eslint-disable-next-line prefer-promise-reject-errors
  582. reject()
  583. return
  584. }
  585. resolve()
  586. })
  587. })
  588. },
  589. // 获取表单数据
  590. formData () {
  591. const form = { ...this.form, operatorName: '' }
  592. if (this.form.operatorId != null) {
  593. form.operatorId = this.form.operatorId.toString()
  594. this.form.operatorId.forEach((id) => {
  595. let op = this.operatorIdOptions.find((t) => t.userId === id)
  596. if (op.name != null) {
  597. form.operatorName += op.name + ' '
  598. }
  599. })
  600. }
  601. // 填充附件
  602. let fList = this.fileList
  603. if (fList.length > 0) {
  604. form.attachList = []
  605. for (let i = 0; i < fList.length; i++) {
  606. form.attachList.push({
  607. fileName: fList[i].name,
  608. url: fList[i].url
  609. })
  610. }
  611. }
  612. return form
  613. },
  614. addRow () {
  615. this.form.prodProductionRequireList.push({allowValues: ''})
  616. },
  617. removeRow (index) {
  618. this.form.prodProductionRequireList.splice(index, 1)
  619. },
  620. inspectionParamBlur (event, index) {
  621. console.log(event)
  622. console.log(event.target.value)
  623. this.$http({
  624. url: this.$http.adornUrl(`/biz-service/technology/infoArgument/${event.target.value}`),
  625. method: 'get'
  626. }).then(({ data }) => {
  627. console.log(data)
  628. this.form.prodProductionRequireList[index].allowValues = data
  629. console.log(this.form.prodProductionRequireList)
  630. })
  631. }
  632. }
  633. }
  634. </script>
  635. <style scoped></style>