workingStep.vue 45 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418
  1. <template>
  2. <el-dialog
  3. :title="title"
  4. :visible.sync="visible"
  5. :before-close="handleClose"
  6. :close-on-click-modal="false"
  7. :close-on-press-escape="false"
  8. append-to-body
  9. width="85%"
  10. >
  11. <el-card shadow="never">
  12. <header-title title="工步信息"></header-title>
  13. <el-form label-width="100px" ref="form" :model="rowData">
  14. <el-row>
  15. <el-col :span="8" label-width="100px">
  16. <el-form-item label="工步类型" prop="type">
  17. <template>
  18. <el-select
  19. style="width: 100%"
  20. disabled
  21. v-model="rowData.type"
  22. placeholder="请选择"
  23. >
  24. <el-option
  25. v-for="item in typeList"
  26. :label="item.label"
  27. :value="item.value"
  28. :key="item.value"
  29. >
  30. </el-option>
  31. </el-select>
  32. </template>
  33. </el-form-item>
  34. </el-col>
  35. <el-col :span="8" label-width="100px">
  36. <el-form-item label="编码" prop="code">
  37. <el-input
  38. disabled
  39. placeholder="工步编码"
  40. v-model="rowData.code"
  41. ></el-input>
  42. </el-form-item>
  43. </el-col>
  44. <el-col :span="8" label-width="100px">
  45. <el-form-item label="名称" prop="name">
  46. <el-input
  47. disabled
  48. placeholder="工步名称"
  49. v-model="rowData.name"
  50. ></el-input>
  51. </el-form-item>
  52. </el-col>
  53. </el-row>
  54. <el-row>
  55. <el-col :span="8" label-width="100px">
  56. <el-form-item label="状态" prop="status">
  57. <el-select
  58. style="width: 100%"
  59. disabled
  60. v-model="rowData.status"
  61. placeholder="请选择"
  62. >
  63. <el-option
  64. v-for="item in statusList"
  65. :label="item.label"
  66. :value="item.value"
  67. :key="item.value"
  68. >
  69. </el-option>
  70. </el-select>
  71. </el-form-item>
  72. </el-col>
  73. </el-row>
  74. </el-form>
  75. <el-tabs
  76. v-model="activeName"
  77. class="tab-box"
  78. type="border-card"
  79. @tab-click="tabsChange"
  80. >
  81. <el-tab-pane label="工艺参数" name="工艺参数">
  82. <ele-pro-table
  83. ref="table"
  84. :datasource="datasource"
  85. :immediate="true"
  86. :need-page="false"
  87. :columns="columns"
  88. >
  89. <!-- 表头工具栏 -->
  90. <template v-if="!isView" v-slot:toolbar>
  91. <el-button
  92. size="small"
  93. icon="el-icon-plus"
  94. class="ele-btn-icon"
  95. type="primary"
  96. @click.native="openParam('工艺')"
  97. >添加参数</el-button
  98. >
  99. </template>
  100. <template v-slot:sort="{ row }">
  101. <div v-if="isView">{{ row.sort }}</div>
  102. <el-input v-else v-model="row.sort"></el-input>
  103. </template>
  104. <!-- 默认值 -->
  105. <template v-slot:defaultValue="{ row }">
  106. <div v-if="isView">
  107. {{ row.defaultValue }}
  108. </div>
  109. <div v-else>
  110. <el-input
  111. v-if="
  112. row.textType == 1 ||
  113. row.textType == 4 ||
  114. row.textType == 3 ||
  115. row.textType == 5
  116. "
  117. v-model="row.defaultValue"
  118. placeholder="请输入"
  119. ></el-input>
  120. <el-select
  121. v-if="row.textType == 2"
  122. v-model="row.defaultValue"
  123. placeholder="请选择"
  124. >
  125. <el-option label="TRUE" :value="'TRUE'" />
  126. <el-option label="FALSE" :value="'FALSE'" />
  127. </el-select>
  128. </div>
  129. </template>
  130. <!-- 上限 -->
  131. <template v-slot:maxValue="{ row }">
  132. <div v-if="isView">
  133. {{ row.maxValue }}
  134. </div>
  135. <div v-else>
  136. <el-input
  137. v-if="row.textType == 3"
  138. v-model="row.maxValue"
  139. placeholder="请输入"
  140. ></el-input>
  141. </div>
  142. </template>
  143. <!-- 下限 -->
  144. <template v-slot:minValue="{ row }">
  145. <div v-if="isView">
  146. {{ row.minValue }}
  147. </div>
  148. <div v-else>
  149. <el-input
  150. v-if="row.textType == 3"
  151. v-model="row.minValue"
  152. placeholder="请输入"
  153. ></el-input>
  154. </div>
  155. </template>
  156. <!-- 单位 -->
  157. <template v-slot:unitName="{ row }">
  158. <div v-if="isView">
  159. {{ row.unitName }}
  160. </div>
  161. <div v-else>
  162. <DictSelection
  163. v-if="row.textType != 2 && row.textType != 5"
  164. dictName="工艺参数单位"
  165. clearable
  166. filterable
  167. v-model="row.unitName"
  168. >
  169. </DictSelection>
  170. <span v-if="row.textType == 5"> h(小时)</span>
  171. </div>
  172. </template>
  173. <!-- 操作列 -->
  174. <template v-slot:action="{ row }">
  175. <el-popconfirm
  176. class="ele-action"
  177. title="确定要删除当前参数吗?"
  178. @confirm="remove(row, '工艺')"
  179. >
  180. <template v-slot:reference>
  181. <el-link
  182. type="danger"
  183. :underline="false"
  184. icon="el-icon-delete"
  185. >
  186. 删除
  187. </el-link>
  188. </template>
  189. </el-popconfirm>
  190. </template>
  191. </ele-pro-table>
  192. </el-tab-pane>
  193. <el-tab-pane label="质检参数" name="质检参数">
  194. <ele-pro-table
  195. ref="qualityTable"
  196. :datasource="datasource"
  197. :immediate="true"
  198. :need-page="false"
  199. :columns="columns"
  200. >
  201. <!-- 表头工具栏 -->
  202. <template v-if="!isView" v-slot:toolbar>
  203. <el-button
  204. size="small"
  205. icon="el-icon-plus"
  206. class="ele-btn-icon"
  207. type="primary"
  208. @click.native="openParam('质检')"
  209. >添加参数</el-button
  210. >
  211. </template>
  212. <template v-slot:sort="{ row }">
  213. <div v-if="isView">{{ row.sort }}</div>
  214. <el-input v-else v-model="row.sort"></el-input>
  215. </template>
  216. <!-- 默认值 -->
  217. <template v-slot:defaultValue="{ row }">
  218. <div v-if="isView">
  219. {{ row.defaultValue }}
  220. </div>
  221. <div v-else>
  222. <el-input
  223. v-if="
  224. row.textType == 1 ||
  225. row.textType == 4 ||
  226. row.textType == 3 ||
  227. row.textType == 5
  228. "
  229. v-model="row.defaultValue"
  230. placeholder="请输入"
  231. ></el-input>
  232. <el-select
  233. v-if="row.textType == 2"
  234. v-model="row.defaultValue"
  235. placeholder="请选择"
  236. >
  237. <el-option label="TRUE" :value="'TRUE'" />
  238. <el-option label="FALSE" :value="'FALSE'" />
  239. </el-select>
  240. </div>
  241. </template>
  242. <!-- 上限 -->
  243. <template v-slot:maxValue="{ row }">
  244. <div v-if="isView">
  245. {{ row.maxValue }}
  246. </div>
  247. <div v-else>
  248. <el-input
  249. v-if="row.textType == 3"
  250. v-model="row.maxValue"
  251. placeholder="请输入"
  252. ></el-input>
  253. </div>
  254. </template>
  255. <!-- 下限 -->
  256. <template v-slot:minValue="{ row }">
  257. <div v-if="isView">
  258. {{ row.minValue }}
  259. </div>
  260. <div v-else>
  261. <el-input
  262. v-if="row.textType == 3"
  263. v-model="row.minValue"
  264. placeholder="请输入"
  265. ></el-input>
  266. </div>
  267. </template>
  268. <!-- 单位 -->
  269. <template v-slot:unitName="{ row }">
  270. <div v-if="isView">
  271. {{ row.unitName }}
  272. </div>
  273. <div v-else>
  274. <DictSelection
  275. v-if="row.textType != 2 && row.textType != 5"
  276. dictName="工艺参数单位"
  277. clearable
  278. filterable
  279. v-model="row.unitName"
  280. >
  281. </DictSelection>
  282. <span v-if="row.textType == 5"> h(小时)</span>
  283. </div>
  284. </template>
  285. <!-- 操作列 -->
  286. <template v-slot:action="{ row }">
  287. <el-popconfirm
  288. class="ele-action"
  289. title="确定要删除当前参数吗?"
  290. @confirm="remove(row, '工艺')"
  291. >
  292. <template v-slot:reference>
  293. <el-link
  294. type="danger"
  295. :underline="false"
  296. icon="el-icon-delete"
  297. >
  298. 删除
  299. </el-link>
  300. </template>
  301. </el-popconfirm>
  302. </template>
  303. </ele-pro-table>
  304. </el-tab-pane>
  305. <el-tab-pane label="生产节拍" name="生产节拍">
  306. <el-form label-width="100px" ref="form" :model="beatParam">
  307. <el-row>
  308. <el-col :span="16" label-width="100px">
  309. <el-form-item label="节拍生产数量" prop="beatNum">
  310. <el-input
  311. v-if="!isView"
  312. placeholder=""
  313. v-model="beatParam.beatNum"
  314. ></el-input>
  315. <div v-else>{{ beatParam.beatNum }}</div>
  316. </el-form-item>
  317. </el-col>
  318. <el-col :span="8" label-width="100px">
  319. <el-form-item label="单位" prop="beatUnit">
  320. <el-select
  321. v-if="!isView"
  322. v-model="beatParam.beatUnit"
  323. filterable
  324. class="ele-block"
  325. >
  326. <el-option
  327. v-for="item in dictList"
  328. :key="item.value"
  329. :value="item.value"
  330. :label="item.label"
  331. ></el-option>
  332. </el-select>
  333. <div v-else>{{ beatParam.beatUnit }}</div>
  334. </el-form-item>
  335. </el-col>
  336. </el-row>
  337. <el-row>
  338. <el-col :span="16" label-width="100px">
  339. <el-form-item label="对应物料数量" prop="materielNum">
  340. <el-input
  341. v-if="!isView"
  342. placeholder=""
  343. v-model="beatParam.materielNum"
  344. ></el-input>
  345. <div v-else>{{ beatParam.materielNum }}</div>
  346. </el-form-item>
  347. </el-col>
  348. <el-col :span="8" label-width="100px">
  349. <el-form-item label="单位" prop="materielUnit">
  350. <el-select
  351. v-if="!isView"
  352. v-model="beatParam.materielUnit"
  353. filterable
  354. class="ele-block"
  355. >
  356. <el-option
  357. v-for="item in dictList"
  358. :key="item.value"
  359. :value="item.value"
  360. :label="item.label"
  361. ></el-option>
  362. </el-select>
  363. <div v-else>{{ beatParam.materielUnit }}</div>
  364. </el-form-item>
  365. </el-col>
  366. </el-row>
  367. <el-row>
  368. <el-col :span="16" label-width="100px">
  369. <el-form-item label="节拍时间" prop="beatTime">
  370. <el-input
  371. v-if="!isView"
  372. placeholder=""
  373. v-model="beatParam.beatTime"
  374. ></el-input>
  375. <div v-else>{{ beatParam.beatTime }}</div>
  376. </el-form-item>
  377. </el-col>
  378. <el-col :span="8" label-width="100px">
  379. <el-form-item label="单位" prop="beatTimeUnit">
  380. <el-select
  381. v-if="!isView"
  382. v-model="beatParam.beatTimeUnit"
  383. filterable
  384. class="ele-block"
  385. >
  386. <el-option
  387. v-for="item in dictList"
  388. :key="item.value"
  389. :value="item.value"
  390. :label="item.label"
  391. ></el-option>
  392. </el-select>
  393. <div v-else>{{ beatParam.beatTimeUnit }}</div>
  394. </el-form-item>
  395. </el-col>
  396. </el-row>
  397. <el-row>
  398. <el-col :span="16" label-width="100px">
  399. <el-form-item label="节拍准备时长" prop="name">
  400. <el-input
  401. v-if="!isView"
  402. placeholder=""
  403. v-model="beatParam.beatPrepareTime"
  404. ></el-input>
  405. <div v-else>{{ beatParam.beatPrepareTime }}</div>
  406. </el-form-item>
  407. </el-col>
  408. <el-col :span="8" label-width="100px">
  409. <el-form-item label="单位" prop="name">
  410. <el-select
  411. v-if="!isView"
  412. v-model="beatParam.beatPrepareUnit"
  413. filterable
  414. class="ele-block"
  415. >
  416. <el-option
  417. v-for="item in dictList"
  418. :key="item.value"
  419. :value="item.value"
  420. :label="item.label"
  421. ></el-option>
  422. </el-select>
  423. <div v-else>{{ beatParam.beatPrepareUnit }}</div>
  424. </el-form-item>
  425. </el-col>
  426. </el-row>
  427. <el-row>
  428. <el-col :span="16" label-width="100px">
  429. <el-form-item label="节拍休息时长" prop="name">
  430. <el-input
  431. v-if="!isView"
  432. placeholder=""
  433. v-model="beatParam.beatRestTime"
  434. ></el-input>
  435. <div v-else>{{ beatParam.beatRestTime }}</div>
  436. </el-form-item>
  437. </el-col>
  438. <el-col :span="8" label-width="100px">
  439. <el-form-item label="单位" prop="beatRestUnit">
  440. <el-select
  441. v-if="!isView"
  442. v-model="beatParam.beatRestUnit"
  443. filterable
  444. class="ele-block"
  445. >
  446. <el-option
  447. v-for="item in dictList"
  448. :key="item.value"
  449. :value="item.value"
  450. :label="item.label"
  451. ></el-option>
  452. </el-select>
  453. <div v-else>{{ beatParam.beatRestUnit }}</div>
  454. </el-form-item>
  455. </el-col>
  456. </el-row>
  457. <el-row>
  458. <el-col :span="24" label-width="100px">
  459. <el-form-item label="备注" prop="remark">
  460. <el-input
  461. v-if="!isView"
  462. placeholder=""
  463. v-model="beatParam.remark"
  464. type="textarea"
  465. :rows="4"
  466. ></el-input>
  467. <div v-else>{{ beatParam.remark }}</div>
  468. </el-form-item>
  469. </el-col>
  470. </el-row>
  471. <el-row>
  472. <el-col :span="8" label-width="100px">
  473. <el-form-item label="添加人" prop="name">
  474. <el-input
  475. v-if="!isView"
  476. placeholder=""
  477. disabled
  478. v-model="beatParam.createName"
  479. ></el-input>
  480. <div v-else>{{ beatParam.createName }}</div>
  481. </el-form-item>
  482. </el-col>
  483. <el-col :span="8" label-width="100px">
  484. <el-form-item label="添加时间" prop="name">
  485. <el-input
  486. v-if="!isView"
  487. placeholder=""
  488. disabled
  489. v-model="beatParam.createTime"
  490. ></el-input>
  491. <div v-else>{{ beatParam.createTime }}</div>
  492. </el-form-item>
  493. </el-col>
  494. </el-row>
  495. <el-row>
  496. <el-col :span="8" label-width="100px">
  497. <el-form-item label="修改人" prop="name">
  498. <el-input
  499. v-if="!isView"
  500. placeholder=""
  501. disabled
  502. v-model="beatParam.updateName"
  503. ></el-input>
  504. <div v-else>{{ beatParam.updateName }}</div>
  505. </el-form-item>
  506. </el-col>
  507. <el-col :span="8" label-width="100px">
  508. <el-form-item label="最后修改时间" prop="name">
  509. <el-input
  510. v-if="!isView"
  511. placeholder=""
  512. disabled
  513. v-model="beatParam.updateTime"
  514. ></el-input>
  515. <div v-else>{{ beatParam.updateTime }}</div>
  516. </el-form-item>
  517. </el-col>
  518. </el-row>
  519. </el-form>
  520. </el-tab-pane>
  521. <el-tab-pane label="标准工时" name="标准工时">
  522. <el-form label-width="100px" ref="form" :model="standardParam">
  523. <el-row>
  524. <el-col :span="16" label-width="100px">
  525. <el-form-item label="标准时长" prop="type">
  526. <el-input
  527. v-if="!isView"
  528. placeholder="标准时长"
  529. v-model="standardParam.time"
  530. ></el-input>
  531. <div v-else>{{ standardParam.time }}</div>
  532. </el-form-item>
  533. </el-col>
  534. <el-col :span="8" label-width="100px">
  535. <el-form-item label="单位" prop="type">
  536. <el-select
  537. v-if="!isView"
  538. v-model="standardParam.unit"
  539. filterable
  540. class="ele-block"
  541. >
  542. <el-option
  543. v-for="item in dictList"
  544. :key="item.value"
  545. :value="item.value"
  546. :label="item.label"
  547. ></el-option>
  548. </el-select>
  549. <div v-else>{{ standardParam.unit }}</div>
  550. </el-form-item>
  551. </el-col>
  552. </el-row>
  553. <el-row>
  554. <el-col :span="24" label-width="100px">
  555. <el-form-item label="备注" prop="remark">
  556. <el-input
  557. v-if="!isView"
  558. placeholder=""
  559. v-model="standardParam.remark"
  560. type="textarea"
  561. :rows="4"
  562. ></el-input>
  563. <div v-else>{{ standardParam.remark }}</div>
  564. </el-form-item>
  565. </el-col>
  566. </el-row>
  567. </el-form>
  568. </el-tab-pane>
  569. <el-tab-pane label="材料定额" name="材料定额">
  570. <ele-pro-table
  571. ref="materialTable"
  572. :columns="columns1"
  573. :datasource="datasource"
  574. :need-page="false"
  575. :immediate="true"
  576. >
  577. <!-- 表头工具栏 -->
  578. <template v-slot:toolbar>
  579. <el-button type="primary" v-if="!isView" @click="add">添加</el-button>
  580. <div class="toolbar_box">
  581. <div
  582. ><span>基本数量</span>
  583. <el-input placeholder="请输入" v-model.number="baseCount">
  584. </el-input>
  585. <DictSelection dictName="计量单位" v-model="baseCountUnit"
  586. /></div>
  587. </div>
  588. </template>
  589. <template v-slot:action="{ row, $index }">
  590. <el-link type="primary" @click="handleDel(row, $index)"
  591. >删除</el-link
  592. >
  593. </template>
  594. <template v-slot:subCode="{ row }">
  595. <div v-if="isView">{{ row.subCode }}</div>
  596. <el-input
  597. v-else
  598. v-model="row.subCode"
  599. placeholder="请输入"
  600. ></el-input>
  601. </template>
  602. <template v-slot:isReworkBom="{ row }">
  603. <div v-if="isView">{{ isReworkBom[row.isReworkBom] }}</div>
  604. <div v-else>
  605. <el-select v-model="row.isReworkBom">
  606. <el-option
  607. v-for="item in isReworkBomList"
  608. :key="item.value"
  609. :label="item.label"
  610. :value="item.value"
  611. >
  612. </el-option>
  613. </el-select>
  614. </div>
  615. </template>
  616. <template v-slot:unit="{ row }">
  617. <div v-if="isView">{{ row.unit }}</div>
  618. <div v-else>
  619. <DictSelection
  620. dictName="计量单位"
  621. v-model="row.unit"
  622. ></DictSelection>
  623. </div>
  624. </template>
  625. <template v-slot:count="{ row }">
  626. <div v-if="isView">{{ row.count }}</div>
  627. <el-input
  628. v-else
  629. v-model="row.count"
  630. placeholder="请输入"
  631. @input="
  632. (value) =>
  633. (row.count = value.replace(
  634. /^(-)*(\d+)\.(\d\d\d\d\d\d).*$/,
  635. '$1$2.$3'
  636. ))
  637. "
  638. ></el-input>
  639. </template>
  640. <template v-slot:categoryName="{ row, $index }">
  641. <div v-if="isView">{{ row.categoryName }}</div>
  642. <div v-else
  643. ><el-input
  644. :value="row.categoryName"
  645. placeholder="请选择"
  646. @click.native="categorySelect(row, $index)"
  647. ></el-input
  648. ></div>
  649. </template>
  650. <template v-slot:bomArtFiles="{ row }">
  651. <div v-if="isView">附件</div>
  652. <div v-else
  653. ><div class="downLoad">
  654. <fileUpload
  655. v-model="filedList"
  656. :show-file-list="false"
  657. module="main"
  658. @input="uploadedSuccess($event, row)"
  659. :showLib="false"
  660. :limit="1"
  661. />
  662. <div v-if="row.bomArtFiles">
  663. <el-button
  664. style="margin-left: 10px"
  665. size="mini"
  666. type="primary"
  667. @click="downloadFile(row.bomArtFiles)"
  668. >下载</el-button
  669. >
  670. </div></div
  671. >
  672. </div>
  673. </template>
  674. <template v-slot:remark="{ row }">
  675. <div v-if="isView">{{ row.remark }}</div>
  676. <el-input
  677. v-else
  678. v-model="row.remark"
  679. placeholder="请输入"
  680. ></el-input>
  681. </template>
  682. </ele-pro-table>
  683. </el-tab-pane>
  684. <el-tab-pane label="制造资源" name="制造资源">
  685. <ele-pro-table
  686. ref="resourceTable"
  687. :columns="columns1"
  688. :datasource="datasource"
  689. :need-page="false"
  690. :immediate="true"
  691. >
  692. <!-- 表头工具栏 -->
  693. <template v-if="!isView" v-slot:toolbar>
  694. <el-button type="primary" @click="add">添加</el-button>
  695. </template>
  696. <template v-slot:action="{ row, $index }">
  697. <el-link type="primary" @click="handleDel(row, $index)"
  698. >删除</el-link
  699. >
  700. </template>
  701. <template v-slot:subCode="{ row }">
  702. <div v-if="isView">{{ row.subCode }}</div>
  703. <el-input
  704. v-else
  705. v-model="row.subCode"
  706. placeholder="请输入"
  707. ></el-input>
  708. </template>
  709. <template v-slot:isReworkBom="{ row }">
  710. <div v-if="isView">{{ isReworkBom[row.isReworkBom] }}</div>
  711. <div v-else>
  712. <el-select v-model="row.isReworkBom">
  713. <el-option
  714. v-for="item in isReworkBomList"
  715. :key="item.value"
  716. :label="item.label"
  717. :value="item.value"
  718. >
  719. </el-option>
  720. </el-select>
  721. </div>
  722. </template>
  723. <template v-slot:unit="{ row }">
  724. <div v-if="isView">{{ row.unit }}</div>
  725. <div v-else>
  726. <DictSelection
  727. dictName="计量单位"
  728. v-model="row.unit"
  729. ></DictSelection>
  730. </div>
  731. </template>
  732. <template v-slot:count="{ row }">
  733. <div v-if="isView">{{ row.count }}</div>
  734. <el-input
  735. v-else
  736. v-model="row.count"
  737. placeholder="请输入"
  738. @input="
  739. (value) =>
  740. (row.count = value.replace(
  741. /^(-)*(\d+)\.(\d\d\d\d\d\d).*$/,
  742. '$1$2.$3'
  743. ))
  744. "
  745. ></el-input>
  746. </template>
  747. <template v-slot:categoryName="{ row, $index }">
  748. <div v-if="isView">{{ row.categoryName }}</div>
  749. <div v-else
  750. ><el-input
  751. :value="row.categoryName"
  752. placeholder="请选择"
  753. @click.native="categorySelect(row, $index)"
  754. ></el-input
  755. ></div>
  756. </template>
  757. <template v-slot:bomArtFiles="{ row }">
  758. <div v-if="isView">附件</div>
  759. <div v-else
  760. ><div class="downLoad">
  761. <fileUpload
  762. v-model="filedList"
  763. :show-file-list="false"
  764. module="main"
  765. @input="uploadedSuccess($event, row)"
  766. :showLib="false"
  767. :limit="1"
  768. />
  769. <div v-if="row.bomArtFiles">
  770. <el-button
  771. style="margin-left: 10px"
  772. size="mini"
  773. type="primary"
  774. @click="downloadFile(row.bomArtFiles)"
  775. >下载</el-button
  776. >
  777. </div></div
  778. >
  779. </div>
  780. </template>
  781. <template v-slot:remark="{ row }">
  782. <div v-if="isView">{{ row.remark }}</div>
  783. <el-input
  784. v-else
  785. v-model="row.remark"
  786. placeholder="请输入"
  787. ></el-input>
  788. </template>
  789. </ele-pro-table>
  790. </el-tab-pane>
  791. <el-tab-pane label="替代料" name="替代料">
  792. <ele-pro-table
  793. ref="replaceMaterialTable"
  794. :columns="columns1"
  795. :datasource="datasource"
  796. :need-page="false"
  797. :immediate="true"
  798. >
  799. <!-- 表头工具栏 -->
  800. <template v-slot:toolbar>
  801. <el-button type="primary" v-if="!isView" @click="add">添加</el-button>
  802. <div class="toolbar_box">
  803. <div
  804. ><span>基本数量</span>
  805. <el-input placeholder="请输入" v-model.number="baseCount2">
  806. </el-input>
  807. <DictSelection dictName="计量单位" v-model="baseCountUnit2"
  808. /></div>
  809. </div>
  810. </template>
  811. <template v-slot:action="{ row, $index }">
  812. <el-link type="primary" @click="handleDel(row, $index)"
  813. >删除</el-link
  814. >
  815. </template>
  816. <template v-slot:subCode="{ row }">
  817. <div v-if="isView">{{ row.subCode }}</div>
  818. <el-input
  819. v-else
  820. v-model="row.subCode"
  821. placeholder="请输入"
  822. ></el-input>
  823. </template>
  824. <template v-slot:isReworkBom="{ row }">
  825. <div v-if="isView">{{ isReworkBom[row.isReworkBom] }}</div>
  826. <div v-else>
  827. <el-select v-model="row.isReworkBom">
  828. <el-option
  829. v-for="item in isReworkBomList"
  830. :key="item.value"
  831. :label="item.label"
  832. :value="item.value"
  833. >
  834. </el-option>
  835. </el-select>
  836. </div>
  837. </template>
  838. <template v-slot:unit="{ row }">
  839. <div v-if="isView">{{ row.unit }}</div>
  840. <div v-else>
  841. <DictSelection
  842. dictName="计量单位"
  843. v-model="row.unit"
  844. ></DictSelection>
  845. </div>
  846. </template>
  847. <template v-slot:count="{ row }">
  848. <div v-if="isView">{{ row.count }}</div>
  849. <el-input
  850. v-else
  851. v-model="row.count"
  852. placeholder="请输入"
  853. @input="
  854. (value) =>
  855. (row.count = value.replace(
  856. /^(-)*(\d+)\.(\d\d\d\d\d\d).*$/,
  857. '$1$2.$3'
  858. ))
  859. "
  860. ></el-input>
  861. </template>
  862. <template v-slot:categoryName="{ row, $index }">
  863. <div v-if="isView">{{ row.categoryName }}</div>
  864. <div v-else
  865. ><el-input
  866. :value="row.categoryName"
  867. placeholder="请选择"
  868. @click.native="categorySelect(row, $index)"
  869. ></el-input
  870. ></div>
  871. </template>
  872. <template v-slot:bomArtFiles="{ row }">
  873. <div v-if="isView">附件</div>
  874. <div v-else
  875. ><div class="downLoad">
  876. <fileUpload
  877. v-model="filedList"
  878. :show-file-list="false"
  879. module="main"
  880. @input="uploadedSuccess($event, row)"
  881. :showLib="false"
  882. :limit="1"
  883. />
  884. <div v-if="row.bomArtFiles">
  885. <el-button
  886. style="margin-left: 10px"
  887. size="mini"
  888. type="primary"
  889. @click="downloadFile(row.bomArtFiles)"
  890. >下载</el-button
  891. >
  892. </div></div
  893. >
  894. </div>
  895. </template>
  896. <template v-slot:remark="{ row }">
  897. <div v-if="isView">{{ row.remark }}</div>
  898. <el-input
  899. v-else
  900. v-model="row.remark"
  901. placeholder="请输入"
  902. ></el-input>
  903. </template>
  904. </ele-pro-table>
  905. </el-tab-pane>
  906. <el-tab-pane label="资质"> </el-tab-pane>
  907. <el-tab-pane label="工艺文件"> </el-tab-pane>
  908. </el-tabs>
  909. </el-card>
  910. <!-- 选择工艺参数 -->
  911. <ParamModal ref="paramRefs" @chooseModal="chooseModal"></ParamModal>
  912. <ProductModal ref="productRefs" @changeProduct="determineChoose" />
  913. <div class="btns">
  914. <el-button type="primary" size="small" @click="save">{{
  915. isView ? '确定' : '保存'
  916. }}</el-button>
  917. <el-button size="small" @click="handleClose">关闭</el-button>
  918. </div>
  919. </el-dialog>
  920. </template>
  921. <script>
  922. import * as dayjs from 'dayjs';
  923. import { getFile } from '@/api/system/file';
  924. import fileUpload from '@/components/upload/fileUpload';
  925. import { workingStepUpdate, getStepDetailById } from '@/api/material/BOM';
  926. import { getByCode } from '@/api/system/dictionary-data';
  927. import ParamModal from '@/views/technology/productParam/components/ParamModal.vue';
  928. import ProductModal from '@/components/select/bom/ProductModal.vue';
  929. import userSearch from './user-search.vue';
  930. export default {
  931. components: {
  932. userSearch,
  933. ParamModal,
  934. fileUpload,
  935. ProductModal
  936. },
  937. data() {
  938. return {
  939. baseCount: '',
  940. baseCountUnit: '',
  941. baseCount2: '',
  942. baseCountUnit2: '',
  943. isView: false,
  944. filedList: [],
  945. activeName: '工艺参数',
  946. attributeData: {},
  947. visible: false,
  948. title: '配置',
  949. form: {},
  950. isReworkBom: ['否', '是'],
  951. isReworkBomList: [
  952. { label: '否', value: 0 },
  953. { label: '是', value: 1 }
  954. ],
  955. dictList: [], //单位下拉
  956. // 表格列配置
  957. columns1: [],
  958. statusList: [
  959. {
  960. value: '0',
  961. label: '生效'
  962. },
  963. {
  964. value: '1',
  965. label: '失效'
  966. }
  967. ],
  968. typeList: [
  969. {
  970. value: '1',
  971. label: '普通工步'
  972. },
  973. {
  974. value: '2',
  975. label: '抽样质检工步'
  976. },
  977. {
  978. value: '3',
  979. label: '普通质检工步'
  980. },
  981. {
  982. value: '4',
  983. label: '包装工步'
  984. },
  985. {
  986. value: '5',
  987. label: '入库工步'
  988. },
  989. {
  990. value: '6',
  991. label: '一工一检(常规质检)'
  992. }
  993. ],
  994. defaultColumns1: [
  995. {
  996. type: 'index',
  997. width: 55,
  998. align: 'center'
  999. },
  1000. {
  1001. label: '子项编号',
  1002. prop: 'subCode',
  1003. slot: 'subCode',
  1004. action: 'subCode'
  1005. },
  1006. {
  1007. label: '物料名称',
  1008. prop: 'categoryName',
  1009. slot: 'categoryName',
  1010. action: 'categoryName'
  1011. },
  1012. {
  1013. label: '是否回收料',
  1014. prop: 'isReworkBom',
  1015. slot: 'isReworkBom',
  1016. action: 'isReworkBom'
  1017. },
  1018. {
  1019. label: '编码',
  1020. prop: 'categoryCode'
  1021. },
  1022. {
  1023. label: '牌号',
  1024. prop: 'brandNum'
  1025. },
  1026. {
  1027. label: '型号',
  1028. prop: 'modelType'
  1029. },
  1030. {
  1031. label: '数量',
  1032. slot: 'count',
  1033. action: 'count'
  1034. },
  1035. {
  1036. label: '单位',
  1037. slot: 'unit',
  1038. action: 'unit'
  1039. },
  1040. {
  1041. label: '附件',
  1042. slot: 'bomArtFiles',
  1043. action: 'bomArtFiles',
  1044. minWidth: 150
  1045. },
  1046. {
  1047. label: '备注',
  1048. slot: 'remark',
  1049. action: 'remark'
  1050. }
  1051. ],
  1052. columns: [],
  1053. // 表格列配置
  1054. defaultColumns: [
  1055. {
  1056. prop: 'sort',
  1057. slot: 'sort',
  1058. label: '排序',
  1059. minWidth: 60
  1060. },
  1061. {
  1062. prop: 'code',
  1063. label: '参数编码',
  1064. showOverflowTooltip: true,
  1065. align: 'center',
  1066. minWidth: 110
  1067. },
  1068. {
  1069. prop: 'name',
  1070. label: '参数名称',
  1071. showOverflowTooltip: true,
  1072. align: 'center',
  1073. minWidth: 110
  1074. },
  1075. {
  1076. align: 'center',
  1077. prop: 'description',
  1078. label: '文本描述',
  1079. showOverflowTooltip: true,
  1080. minWidth: 110
  1081. },
  1082. {
  1083. prop: 'maxValue',
  1084. slot: 'maxValue',
  1085. label: '参数上限',
  1086. align: 'center'
  1087. },
  1088. {
  1089. prop: 'minValue',
  1090. slot: 'minValue',
  1091. label: '参数下限',
  1092. align: 'center'
  1093. },
  1094. {
  1095. prop: 'defaultValue',
  1096. slot: 'defaultValue',
  1097. label: '默认值',
  1098. align: 'center'
  1099. }
  1100. ],
  1101. // 表格选中数据
  1102. selection: [],
  1103. rowData: {},
  1104. treeData: {},
  1105. currentIndex: 0,
  1106. tableData: {},
  1107. beatParam: {},
  1108. standardParam: {}
  1109. };
  1110. },
  1111. watch: {},
  1112. created() {
  1113. this.getDictList('time_unit');
  1114. },
  1115. methods: {
  1116. determineChoose(title, row, idx) {
  1117. let type = '';
  1118. if (this.activeName === '材料定额') {
  1119. type = 'materialsParam';
  1120. } else if (this.activeName === '制造资源') {
  1121. type = 'resourceParam';
  1122. } else if (this.activeName === '替代料') {
  1123. type = 'replaceParam';
  1124. }
  1125. if (title == '选择物料') {
  1126. this.$set(this.rowData[type][idx], 'categoryName', row.name);
  1127. this.$set(this.rowData[type][idx], 'categoryId', row.id);
  1128. this.$set(this.rowData[type][idx], 'categoryCode', row.code);
  1129. this.$set(this.rowData[type][idx], 'unit', row.measuringUnit);
  1130. this.$set(this.rowData[type][idx], 'weightUnit', row.weightUnit);
  1131. this.$set(this.rowData[type][idx], 'brandNum', row.brandNum);
  1132. this.$set(this.rowData[type][idx], 'modelType', row.modelType);
  1133. }
  1134. },
  1135. uploadedSuccess(data, row) {
  1136. row.bomArtFiles = data[0].storePath;
  1137. this.filedList = [];
  1138. },
  1139. downloadFile(url) {
  1140. getFile({ objectName: url }, '附件');
  1141. },
  1142. categorySelect(row, idx) {
  1143. this.$refs.productRefs.open(row, '选择物料', '1', idx);
  1144. },
  1145. handleDel(row, index) {
  1146. let type = '';
  1147. if (this.activeName === '材料定额') {
  1148. type = 'materialsParam';
  1149. } else if (this.activeName === '制造资源') {
  1150. type = 'resourceParam';
  1151. } else if (this.activeName === '替代料') {
  1152. type = 'replaceParam';
  1153. }
  1154. this.rowData[type].splice(index, 1);
  1155. },
  1156. add() {
  1157. let subCode = '0010';
  1158. let type = '';
  1159. if (this.activeName === '材料定额') {
  1160. type = 'materialsParam';
  1161. } else if (this.activeName === '制造资源') {
  1162. type = 'resourceParam';
  1163. } else if (this.activeName === '替代料') {
  1164. type = 'replaceParam';
  1165. }
  1166. if (this.rowData[type].length) {
  1167. let max =
  1168. Math.max(...this.rowData[type].map((i) => i.subCode)) + 10 + '';
  1169. if (max.length < 4) {
  1170. max = new Array(4 - max.length).fill('0').join('') + max;
  1171. }
  1172. subCode = max.substring(0, max.length - 1) + '0';
  1173. }
  1174. this.rowData[type].push({
  1175. subCode,
  1176. categoryId: '',
  1177. categoryName: '',
  1178. isReworkBom: 0,
  1179. brandNum: '',
  1180. count: '',
  1181. modelType: '',
  1182. unit: ''
  1183. });
  1184. },
  1185. /* 表格数据源 */
  1186. async datasource() {
  1187. return [];
  1188. },
  1189. tabsChange() {
  1190. console.log(this.activeName);
  1191. if (this.activeName === '工艺参数') {
  1192. this.$refs.table.setData(this.rowData.technologyParam || []);
  1193. } else if (this.activeName === '质检参数') {
  1194. this.$refs.qualityTable.setData(this.rowData.inspectionParam || []);
  1195. } else if (this.activeName === '生产节拍') {
  1196. this.beatParam = this.rowData.beatParam || {};
  1197. } else if (this.activeName === '标准工时') {
  1198. this.standardParam = this.rowData.standardParam || {};
  1199. } else if (this.activeName === '材料定额') {
  1200. this.$refs.materialTable.setData(this.rowData.materialsParam || []);
  1201. } else if (this.activeName === '制造资源') {
  1202. this.$refs.resourceTable.setData(this.rowData.resourceParam || []);
  1203. } else if (this.activeName === '替代料') {
  1204. this.$refs.replaceMaterialTable.setData(
  1205. this.rowData.replaceParam || []
  1206. );
  1207. }
  1208. },
  1209. openParam(type) {
  1210. let tableData = [];
  1211. if (type === '工艺') {
  1212. tableData = this.$refs.table.getData();
  1213. } else {
  1214. tableData = this.$refs.qualityTable.getData();
  1215. }
  1216. this.$refs.paramRefs.open(tableData);
  1217. },
  1218. chooseModal(data) {
  1219. let dom = null;
  1220. if (this.activeName === '工艺参数') {
  1221. dom = this.$refs.table;
  1222. } else if (this.activeName === '质检参数') {
  1223. dom = this.$refs.qualityTable;
  1224. }
  1225. dom.setData([...data, ...dom.getData()]);
  1226. this.$set(
  1227. this.rowData,
  1228. this.activeName === '工艺参数'
  1229. ? 'technologyParam'
  1230. : 'inspectionParam',
  1231. dom.getData()
  1232. );
  1233. },
  1234. remove(row, type) {
  1235. let dom = null;
  1236. if (type === '工艺') {
  1237. dom = this.$refs.table;
  1238. } else {
  1239. dom = this.$refs.qualityTable;
  1240. }
  1241. const data = dom.getData();
  1242. if (row.id) {
  1243. dom.setData(data.filter((d) => d.id !== row.id));
  1244. } else {
  1245. dom.setData(data.filter((d) => d.paramId !== row.paramId));
  1246. }
  1247. this.$set(
  1248. this.rowData,
  1249. type === '工艺' ? 'technologyParam' : 'inspectionParam',
  1250. dom.getData()
  1251. );
  1252. },
  1253. open(rowData, treeData, isView) {
  1254. this.columns = [];
  1255. this.columns1 = [];
  1256. this.isView = isView;
  1257. if (!this.isView) {
  1258. this.columns = this.defaultColumns.concat({
  1259. columnKey: 'action',
  1260. label: '操作',
  1261. align: 'center',
  1262. resizable: false,
  1263. slot: 'action',
  1264. showOverflowTooltip: true
  1265. });
  1266. this.columns1 = this.defaultColumns1.concat({
  1267. action: 'action',
  1268. slot: 'action',
  1269. label: '操作'
  1270. });
  1271. } else {
  1272. this.columns = this.defaultColumns;
  1273. this.columns1 = this.defaultColumns1;
  1274. }
  1275. getStepDetailById(rowData.id).then((data) => {
  1276. console.log(data);
  1277. this.rowData = data;
  1278. this.treeData = JSON.parse(JSON.stringify(treeData));
  1279. this.activeName = '工艺参数';
  1280. this.baseCount = rowData.baseCount;
  1281. this.baseCountUnit = rowData.baseCountUnit;
  1282. this.baseCount2 = rowData.baseCount2;
  1283. this.baseCountUnit2 = rowData.baseCountUnit2;
  1284. this.visible = true;
  1285. setTimeout(() => {
  1286. // 工艺参数
  1287. this.$refs.table.setData(this.rowData.technologyParam);
  1288. }, 500);
  1289. });
  1290. },
  1291. handleClose() {
  1292. this.visible = false;
  1293. this.$refs.table.setSelectedRows([]);
  1294. this.selection = [];
  1295. },
  1296. save() {
  1297. if (this.isView) {
  1298. this.handleClose();
  1299. } else {
  1300. // 保存生产节拍
  1301. let userInfo = JSON.parse(localStorage.getItem('info'));
  1302. this.beatParam.createName = userInfo.name;
  1303. this.beatParam.createTime = dayjs(new Date()).format(
  1304. 'YYYY-MM-DD HH:mm:ss'
  1305. );
  1306. this.beatParam.updateName = userInfo.name;
  1307. this.beatParam.updateTime = dayjs(new Date()).format(
  1308. 'YYYY-MM-DD HH:mm:ss'
  1309. );
  1310. this.rowData.beatParam = this.beatParam;
  1311. // 保存标准工时
  1312. this.rowData.standardParam = this.standardParam;
  1313. workingStepUpdate(this.rowData).then(() => {
  1314. this.$message.success('保存成功');
  1315. this.$emit('chooseProcess');
  1316. this.handleClose();
  1317. });
  1318. }
  1319. },
  1320. async getDictList(code) {
  1321. let { data: res } = await getByCode(code);
  1322. this.dictList = res.map((item) => {
  1323. let values = Object.keys(item);
  1324. return {
  1325. value: Number(values[0]),
  1326. label: item[values[0]]
  1327. };
  1328. });
  1329. },
  1330. }
  1331. };
  1332. </script>
  1333. <style lang="scss" scoped>
  1334. .btns {
  1335. text-align: center;
  1336. padding: 10px 0;
  1337. }
  1338. .downLoad {
  1339. display: flex;
  1340. }
  1341. .toolbar_box {
  1342. float: right;
  1343. margin-right: 10px;
  1344. > div {
  1345. display: flex;
  1346. align-items: center;
  1347. justify-content: center;
  1348. > span {
  1349. width: 150px;
  1350. }
  1351. > div {
  1352. margin-left: 10px;
  1353. }
  1354. }
  1355. }
  1356. </style>