node-edit.vue 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294
  1. <template>
  2. <div>
  3. <el-form :model="form" ref="form" :rules="rules" label-width="80px">
  4. <el-form-item label="节点名称" prop="nodeName">
  5. <el-input
  6. v-model="form.nodeName"
  7. placeholder="请输入节点名称"
  8. :disabled="disabled || selectOperator"
  9. ></el-input>
  10. </el-form-item>
  11. <el-form-item
  12. label="工种类型"
  13. prop="workTypeId"
  14. v-if="node.type !== 'end'"
  15. >
  16. <el-select
  17. v-model="form.workTypeId"
  18. placeholder="请选择"
  19. style="width: 100%"
  20. :disabled="disabled || selectOperator"
  21. @change="onChage"
  22. >
  23. <el-option
  24. v-for="item in workTypeOptions"
  25. :key="item.typeId"
  26. :label="item.name"
  27. :value="item.typeId"
  28. ></el-option>
  29. </el-select>
  30. </el-form-item>
  31. <el-form-item label="工时单价">
  32. <el-input
  33. v-model="form.quotedPrice"
  34. placeholder="工时单价"
  35. disabled
  36. ></el-input>
  37. </el-form-item>
  38. <el-form-item label="备注" prop="notes">
  39. <el-input
  40. v-model="form.notes"
  41. :disabled="disabled || selectOperator"
  42. ></el-input>
  43. </el-form-item>
  44. <el-form-item label="工序要求" prop="require" v-if="node.type !== 'end'">
  45. <el-input
  46. v-model="form.require"
  47. :disabled="disabled || selectOperator"
  48. ></el-input>
  49. </el-form-item>
  50. <el-form-item label="工序说明" prop="explain" v-if="node.type !== 'end'">
  51. <el-input
  52. v-model="form.explain"
  53. :disabled="disabled || selectOperator"
  54. ></el-input>
  55. </el-form-item>
  56. <el-form-item label="所需工时" prop="preTaskTime" v-if="node.type !== 'end'">
  57. <el-input
  58. v-model="form.preTaskTime"
  59. :disabled="disabled || selectOperator"
  60. oninput="value=value.replace(/[^0-9.]/g,'')"
  61. >
  62. <i slot="suffix" style="font-style:normal;margin-right: 10px;">h</i>
  63. </el-input>
  64. </el-form-item>
  65. <el-form-item label="操作人" v-if="form.operatorName && !selectOperator">
  66. <el-input
  67. :disabled="disabled && selectOperator"
  68. v-model="form.operatorName"
  69. ></el-input>
  70. </el-form-item>
  71. <el-form-item
  72. label="操作人"
  73. prop="operatorId"
  74. v-if="selectOperator && node.type !== 'end'"
  75. >
  76. <el-select
  77. v-model="form.operatorId"
  78. :disabled="disabled && selectOperator"
  79. multiple
  80. placeholder="请选择"
  81. style="width: 100%"
  82. >
  83. <el-option
  84. v-for="item in operatorIdOptions"
  85. :key="item.userId"
  86. :label="item.name"
  87. :value="item.userId"
  88. ></el-option>
  89. </el-select>
  90. </el-form-item>
  91. <el-form-item v-if="node.type !== 'end' && !disabled && !selectOperator">
  92. <upload-component
  93. :title="'附件'"
  94. :accept="'*'"
  95. :file-obj-list="fileList"
  96. @uploadSuccess="uploadSuccess"
  97. />
  98. </el-form-item>
  99. <el-form-item v-else>
  100. <upload-component
  101. :display="true"
  102. :title="'附件'"
  103. :accept="'*'"
  104. :file-obj-list="fileList"
  105. @uploadSuccess="uploadSuccess"
  106. />
  107. </el-form-item>
  108. </el-form>
  109. </div>
  110. </template>
  111. <script>
  112. import { getWorkType } from '@/api/crafts'
  113. import { workTypeMasterList } from '@/api/worktype'
  114. import UploadComponent from '@/views/modules/common/upload-component'
  115. export default {
  116. name: 'nodeEdit',
  117. components: { UploadComponent },
  118. props: {
  119. data: {
  120. type: Object,
  121. default: () => {}
  122. },
  123. disabled: {
  124. type: Boolean,
  125. default: false
  126. },
  127. // 是否选择操作人,当选择操作人时,其他字段不可编辑
  128. selectOperator: {
  129. type: Boolean,
  130. default: false
  131. }
  132. },
  133. data () {
  134. return {
  135. // 工种列表
  136. workTypeOptions: [],
  137. // 操作人列表
  138. operatorIdOptions: [],
  139. node: {},
  140. form: {
  141. nodeName: '',
  142. workTypeId: '',
  143. operatorId: []
  144. },
  145. fileList: [],
  146. rules: {
  147. nodeName: [
  148. { required: true, message: '请输入节点名称', trigger: 'blur' }
  149. ],
  150. workTypeId: [
  151. { required: true, message: '请选择工种', trigger: 'blur' }
  152. ],
  153. operatorId: [
  154. { required: true, message: '请选择操作人', trigger: 'blur' }
  155. ],
  156. preTaskTime: [
  157. { required: true, message: '请输入所需工时', trigger: 'blur' }
  158. ]
  159. }
  160. }
  161. },
  162. watch: {
  163. data (val) {
  164. this.node = val
  165. this.form = {
  166. ...this.form,
  167. ...this.node
  168. }
  169. if (this.node.operatorId) {
  170. this.form.operatorId = this.node.operatorId.split(',')
  171. }
  172. // 附件
  173. if (this.node.attachList) {
  174. this.$nextTick(() => {
  175. this.fileList = []
  176. this.node.attachList.forEach(item => {
  177. this.fileList.push({
  178. name: item.fileName,
  179. url: item.url,
  180. id: item.url
  181. })
  182. })
  183. })
  184. }
  185. },
  186. disabled (val) {
  187. this.disabled = val
  188. }
  189. },
  190. activated () {},
  191. created () {
  192. this.getWorkTypeOptions()
  193. },
  194. computed: {},
  195. mounted () {
  196. this.node = this.data
  197. this.form = {
  198. ...this.form,
  199. ...this.node
  200. }
  201. if (this.node.operatorId) {
  202. this.form.operatorId = this.node.operatorId.split(',')
  203. }
  204. // 附件
  205. if (this.node.attachList) {
  206. this.fileList = []
  207. this.node.attachList.forEach(item => {
  208. this.fileList.push({
  209. name: item.fileName,
  210. url: item.url,
  211. id: item.url
  212. })
  213. })
  214. }
  215. this.getOperatorList()
  216. },
  217. methods: {
  218. getWorkTypeOptions () {
  219. this.workTypeOptions = []
  220. getWorkType().then(({ data }) => {
  221. if (data && data.code === '200') {
  222. this.workTypeOptions = data.data
  223. }
  224. })
  225. },
  226. onChage (val) {
  227. this.workTypeOptions.forEach(v => {
  228. if (v.typeId === val) {
  229. this.form.quotedPrice = Number(v.quotedPrice || 0).toFixed(2)
  230. }
  231. })
  232. },
  233. // 按工种ID查询操作人列表
  234. getOperatorList () {
  235. if (this.node.workTypeId) {
  236. workTypeMasterList(this.node.workTypeId).then(({ data }) => {
  237. if (data && data.code === '200') {
  238. this.operatorIdOptions = []
  239. data.data.forEach(item => {
  240. this.operatorIdOptions.push(item)
  241. })
  242. }
  243. })
  244. }
  245. },
  246. uploadSuccess (fileList) {
  247. this.fileList = fileList
  248. },
  249. // 校验表单
  250. validateFormData () {
  251. return new Promise((resolve, reject) => {
  252. this.$refs['form'].validate(valid => {
  253. if (!valid) {
  254. // eslint-disable-next-line prefer-promise-reject-errors
  255. reject()
  256. return
  257. }
  258. resolve()
  259. })
  260. })
  261. },
  262. // 获取表单数据
  263. formData () {
  264. const form = { ...this.form, operatorName: '' }
  265. if (this.form.operatorId != null) {
  266. form.operatorId = this.form.operatorId.toString()
  267. this.form.operatorId.forEach(id => {
  268. let op = this.operatorIdOptions.find(t => t.userId === id)
  269. if (op.name != null) {
  270. form.operatorName += op.name + ' '
  271. }
  272. })
  273. }
  274. // 填充附件
  275. let fList = this.fileList
  276. if (fList.length > 0) {
  277. form.attachList = []
  278. for (let i = 0; i < fList.length; i++) {
  279. form.attachList.push({
  280. fileName: fList[i].name,
  281. url: fList[i].url
  282. })
  283. }
  284. }
  285. return form
  286. }
  287. }
  288. }
  289. </script>
  290. <style scoped></style>