quoted-price.vue 38 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166
  1. <!-- 初始报价、精准报价 -->
  2. <template>
  3. <div>
  4. <div class="my-title">{{ title }}</div>
  5. <el-form
  6. :model="dataForm"
  7. :rules="dataRule"
  8. ref="dataForm"
  9. label-width="160px"
  10. >
  11. <el-row>
  12. <el-col :span="8">
  13. <el-form-item label="沟通信息" prop="coId">
  14. <el-select
  15. v-model="dataForm.coId"
  16. placeholder="请选择"
  17. style="width: 100%"
  18. disabled
  19. >
  20. <el-option
  21. v-for="item in coOption"
  22. :key="item.coId"
  23. :label="item.coCode + ' (' + item.customerName + ')'"
  24. :value="item.coId"
  25. >
  26. </el-option>
  27. </el-select>
  28. </el-form-item>
  29. </el-col>
  30. <el-col :span="8">
  31. <el-form-item label="项目名称" prop="projectName">
  32. <el-input
  33. v-model="dataForm.projectName"
  34. placeholder="项目名称"
  35. disabled
  36. ></el-input>
  37. </el-form-item>
  38. </el-col>
  39. <el-col :span="8">
  40. <el-form-item label="项目类别" prop="type">
  41. <el-select
  42. v-model="dataForm.type"
  43. placeholder="请选择"
  44. style="width: 100%"
  45. disabled
  46. >
  47. <el-option
  48. v-for="item in productTypeOption"
  49. :key="item.value"
  50. :label="item.label"
  51. :value="item.value"
  52. >
  53. </el-option>
  54. </el-select>
  55. </el-form-item>
  56. </el-col>
  57. </el-row>
  58. <el-row>
  59. <el-col :span="16">
  60. <el-form-item label="备注">
  61. <el-input
  62. v-model="dataForm.remark"
  63. type="textarea"
  64. placeholder="请输入备注"
  65. ></el-input>
  66. </el-form-item>
  67. </el-col>
  68. </el-row>
  69. <el-row>
  70. <el-col :span="8">
  71. <el-form-item label="关联BOM物料清单" prop="productId">
  72. <el-select
  73. v-model="dataForm.productId"
  74. remote
  75. filterable
  76. clearable
  77. :remote-method="productIdQueryHandle"
  78. :loading="productSearchLoading"
  79. @change="productIdChangeHandle"
  80. placeholder="请选择"
  81. style="width: 100%"
  82. disabled
  83. >
  84. <el-option
  85. v-for="item in productIdOption"
  86. :key="item.value"
  87. :label="item.label"
  88. :value="item.value"
  89. >
  90. </el-option>
  91. </el-select>
  92. </el-form-item>
  93. </el-col>
  94. </el-row>
  95. <div>
  96. <div class="title">BOM物料明细报价</div>
  97. <el-row class = "price_row">
  98. <el-table
  99. :data="dataForm.quotedPriceProductList"
  100. border
  101. style="width: 100%"
  102. >
  103. <el-table-column
  104. label="序号"
  105. type="index"
  106. width="50"
  107. align="center"
  108. fixed="left"
  109. >
  110. </el-table-column>
  111. <el-table-column
  112. prop="productName"
  113. header-align="center"
  114. align="center"
  115. :show-tooltip-when-overflow="true"
  116. min-width="200px"
  117. label="物料名称"
  118. fixed="left"
  119. >
  120. </el-table-column>
  121. <!-- 精准报价 -->
  122. <template v-if="type === 'second' || type === 'restart'">
  123. <el-table-column
  124. prop=""
  125. header-align="center"
  126. align="center"
  127. min-width="140px"
  128. label="精准原材料费"
  129. >
  130. <template slot-scope="scope">
  131. <el-input-number
  132. size="mini"
  133. :precision="2"
  134. :controls="false"
  135. placeholder="请输入"
  136. v-model="scope.row.precisionMaterialPrice"
  137. @change="inputNumChangeHandleSecond"
  138. ></el-input-number>
  139. </template>
  140. </el-table-column>
  141. <el-table-column
  142. prop=""
  143. header-align="center"
  144. align="center"
  145. min-width="140px"
  146. label="精准生产加工费"
  147. >
  148. <template slot-scope="scope">
  149. <el-input-number
  150. size="mini"
  151. :precision="2"
  152. :controls="false"
  153. placeholder="请输入"
  154. v-model="scope.row.precisionProcessPrice"
  155. @change="inputNumChangeHandleSecond"
  156. ></el-input-number>
  157. </template>
  158. </el-table-column>
  159. <el-table-column
  160. prop=""
  161. header-align="center"
  162. align="center"
  163. min-width="140px"
  164. label="精准热表处理费"
  165. >
  166. <template slot-scope="scope">
  167. <el-input-number
  168. size="mini"
  169. :precision="2"
  170. :controls="false"
  171. placeholder="请输入"
  172. v-model="scope.row.precisionHandlePrice"
  173. @change="inputNumChangeHandleSecond"
  174. ></el-input-number>
  175. </template>
  176. </el-table-column>
  177. <el-table-column
  178. prop=""
  179. header-align="center"
  180. align="center"
  181. min-width="140px"
  182. label="精准检测费"
  183. >
  184. <template slot-scope="scope">
  185. <el-input-number
  186. size="mini"
  187. :precision="2"
  188. :controls="false"
  189. placeholder="请输入"
  190. v-model="scope.row.precisionDetectionPrice"
  191. @change="inputNumChangeHandleSecond"
  192. ></el-input-number>
  193. </template>
  194. </el-table-column>
  195. <el-table-column
  196. prop=""
  197. header-align="center"
  198. align="center"
  199. min-width="140px"
  200. label="精确复验费"
  201. >
  202. <template slot-scope="scope">
  203. <el-input-number
  204. size="mini"
  205. :precision="2"
  206. :controls="false"
  207. placeholder="请输入"
  208. v-model="scope.row.precisionReviewPrice"
  209. @change="inputNumChangeHandleSecond"
  210. ></el-input-number>
  211. </template>
  212. </el-table-column>
  213. <el-table-column
  214. prop=""
  215. header-align="center"
  216. align="center"
  217. min-width="140px"
  218. label="精准单价费"
  219. >
  220. <template slot-scope="scope">
  221. <el-input-number
  222. size="mini"
  223. :precision="2"
  224. :controls="false"
  225. placeholder="请输入"
  226. v-model="scope.row.precisionUnitPrice"
  227. @change="inputNumChangeHandleSecond"
  228. ></el-input-number>
  229. </template>
  230. </el-table-column>
  231. <el-table-column
  232. prop=""
  233. header-align="center"
  234. align="center"
  235. min-width="140px"
  236. label="精确其他费"
  237. >
  238. <template slot-scope="scope">
  239. <el-input-number
  240. size="mini"
  241. :precision="2"
  242. :controls="false"
  243. placeholder="请输入"
  244. v-model="scope.row.precisionElsePrice"
  245. @change="inputNumChangeHandleSecond"
  246. ></el-input-number>
  247. </template>
  248. </el-table-column>
  249. </template>
  250. <!-- 初次报价 -->
  251. <template>
  252. <el-table-column
  253. prop=""
  254. header-align="center"
  255. align="center"
  256. min-width="140px"
  257. label="原材料费"
  258. >
  259. <template slot-scope="scope">
  260. <el-input-number
  261. :disabled="type === 'second'"
  262. size="mini"
  263. :precision="2"
  264. :controls="false"
  265. placeholder="请输入"
  266. v-model="scope.row.materialPrice"
  267. @change="inputNumChangeHandle"
  268. ></el-input-number>
  269. </template>
  270. </el-table-column>
  271. <el-table-column
  272. prop=""
  273. header-align="center"
  274. align="center"
  275. min-width="140px"
  276. label="生产加工费"
  277. >
  278. <template slot-scope="scope">
  279. <el-input-number
  280. :disabled="type === 'second'"
  281. size="mini"
  282. :precision="2"
  283. :controls="false"
  284. placeholder="请输入"
  285. v-model="scope.row.processPrice"
  286. @change="inputNumChangeHandle"
  287. ></el-input-number>
  288. </template>
  289. </el-table-column>
  290. <el-table-column
  291. prop=""
  292. header-align="center"
  293. align="center"
  294. min-width="140px"
  295. label="热表处理费"
  296. >
  297. <template slot-scope="scope">
  298. <el-input-number
  299. :disabled="type === 'second'"
  300. size="mini"
  301. :precision="2"
  302. :controls="false"
  303. placeholder="请输入"
  304. v-model="scope.row.handlePrice"
  305. @change="inputNumChangeHandle"
  306. ></el-input-number>
  307. </template>
  308. </el-table-column>
  309. <el-table-column
  310. prop=""
  311. header-align="center"
  312. align="center"
  313. min-width="140px"
  314. label="检测费"
  315. >
  316. <template slot-scope="scope">
  317. <el-input-number
  318. :disabled="type === 'second'"
  319. size="mini"
  320. :precision="2"
  321. :controls="false"
  322. placeholder="请输入"
  323. v-model="scope.row.detectionPrice"
  324. @change="inputNumChangeHandle"
  325. ></el-input-number>
  326. </template>
  327. </el-table-column>
  328. <el-table-column
  329. prop=""
  330. header-align="center"
  331. align="center"
  332. min-width="140px"
  333. label="复验费"
  334. >
  335. <template slot-scope="scope">
  336. <el-input-number
  337. :disabled="type === 'second'"
  338. size="mini"
  339. :precision="2"
  340. :controls="false"
  341. placeholder="请输入"
  342. v-model="scope.row.reviewPrice"
  343. @change="inputNumChangeHandle"
  344. ></el-input-number>
  345. </template>
  346. </el-table-column>
  347. <el-table-column
  348. prop=""
  349. header-align="center"
  350. align="center"
  351. min-width="140px"
  352. label="单价费"
  353. >
  354. <template slot-scope="scope">
  355. <el-input-number
  356. :disabled="type === 'second'"
  357. size="mini"
  358. :precision="2"
  359. :controls="false"
  360. placeholder="请输入"
  361. v-model="scope.row.unitPrice"
  362. @change="inputNumChangeHandle"
  363. ></el-input-number>
  364. </template>
  365. </el-table-column>
  366. <el-table-column
  367. prop=""
  368. header-align="center"
  369. align="center"
  370. min-width="140px"
  371. label="其他费"
  372. >
  373. <template slot-scope="scope">
  374. <el-input-number
  375. :disabled="type === 'second'"
  376. size="mini"
  377. :precision="2"
  378. :controls="false"
  379. placeholder="请输入"
  380. v-model="scope.row.elsePrice"
  381. @change="inputNumChangeHandle"
  382. ></el-input-number>
  383. </template>
  384. </el-table-column>
  385. </template>
  386. <el-table-column
  387. prop="productSpec"
  388. header-align="center"
  389. align="center"
  390. :show-tooltip-when-overflow="true"
  391. label="物料规格"
  392. >
  393. </el-table-column>
  394. <el-table-column
  395. prop="mapNumber"
  396. header-align="center"
  397. align="center"
  398. :show-tooltip-when-overflow="true"
  399. label="主图号"
  400. >
  401. </el-table-column>
  402. <el-table-column
  403. prop="materials"
  404. header-align="center"
  405. align="center"
  406. :show-tooltip-when-overflow="true"
  407. label="材料"
  408. >
  409. </el-table-column>
  410. <el-table-column
  411. prop="cnt"
  412. header-align="center"
  413. align="center"
  414. :show-tooltip-when-overflow="true"
  415. label="单套数量"
  416. >
  417. </el-table-column>
  418. <el-table-column
  419. prop="unit"
  420. header-align="center"
  421. align="center"
  422. :show-tooltip-when-overflow="true"
  423. label="单位"
  424. >
  425. </el-table-column>
  426. <el-table-column
  427. prop="size"
  428. header-align="center"
  429. align="center"
  430. :show-tooltip-when-overflow="true"
  431. label="物料尺寸"
  432. >
  433. </el-table-column>
  434. <el-table-column
  435. prop="developedSize"
  436. header-align="center"
  437. align="center"
  438. :show-tooltip-when-overflow="true"
  439. label="展开尺寸"
  440. >
  441. </el-table-column>
  442. <el-table-column
  443. prop="surfaceTreatment"
  444. header-align="center"
  445. align="center"
  446. :show-tooltip-when-overflow="true"
  447. label="表面处理"
  448. >
  449. </el-table-column>
  450. <el-table-column
  451. prop="notes"
  452. header-align="center"
  453. align="center"
  454. :show-tooltip-when-overflow="true"
  455. label="备注"
  456. >
  457. </el-table-column>
  458. </el-table>
  459. </el-row>
  460. <div>
  461. <div class="title">初次报价</div>
  462. <div class="template_price">
  463. <el-row>
  464. <el-col :span="6">
  465. <el-form-item label="模具费" label-width="100px">
  466. <el-input-number
  467. v-model="dataForm.mouldPrice"
  468. @change="inputNumChangeHandle"
  469. :precision="2"
  470. :controls="false"
  471. placeholder="请输入"
  472. :disabled="type === 'second'"
  473. ></el-input-number>
  474. </el-form-item>
  475. </el-col>
  476. <el-col :span="6">
  477. <el-form-item label="管理费(%)" label-width="100px">
  478. <el-input-number
  479. v-model="dataForm.managePrice"
  480. @change="inputNumChangeHandle"
  481. :precision="0"
  482. :controls="false"
  483. placeholder="请输入"
  484. :disabled="type === 'second'"
  485. ></el-input-number>
  486. </el-form-item>
  487. </el-col>
  488. <el-col :span="6">
  489. <el-form-item label="税率(%)" label-width="100px">
  490. <el-input-number
  491. v-model="dataForm.ratePrice"
  492. @change="inputNumChangeHandle"
  493. :precision="0"
  494. :controls="false"
  495. :disabled="type === 'second'"
  496. ></el-input-number>
  497. </el-form-item>
  498. </el-col>
  499. <el-col :span="6">
  500. <el-form-item label="小计" label-width="100px">
  501. <el-input-number
  502. v-model="dataForm.materialCost"
  503. disabled
  504. :precision="2"
  505. :controls="false"
  506. ></el-input-number>
  507. </el-form-item>
  508. </el-col>
  509. <el-col :span="6" :offset="18">
  510. <el-form-item label="合计" label-width="100px">
  511. <el-input-number
  512. v-model="dataForm.totalPrice"
  513. disabled
  514. :precision="2"
  515. :controls="false"
  516. ></el-input-number>
  517. </el-form-item>
  518. </el-col>
  519. </el-row>
  520. </div>
  521. </div>
  522. <div v-if="type === 'second' || type === 'restart'">
  523. <div class="title">精准报价</div>
  524. <div class="template_price">
  525. <el-row>
  526. <el-col :span="6">
  527. <el-form-item label="模具费" label-width="100px">
  528. <el-input-number
  529. v-model="dataForm.precisionMouldPrice"
  530. @change="inputNumChangeHandleSecond"
  531. :precision="2"
  532. :controls="false"
  533. placeholder="请输入"
  534. ></el-input-number>
  535. </el-form-item>
  536. </el-col>
  537. <el-col :span="6">
  538. <el-form-item label="管理费(%)" label-width="100px">
  539. <el-input-number
  540. v-model="dataForm.precisionManagePrice"
  541. @change="inputNumChangeHandleSecond"
  542. :precision="0"
  543. :controls="false"
  544. placeholder="请输入"
  545. ></el-input-number>
  546. </el-form-item>
  547. </el-col>
  548. <el-col :span="6">
  549. <el-form-item label="税率(%)" label-width="100px">
  550. <el-input-number
  551. v-model="dataForm.precisionRatePrice"
  552. @change="inputNumChangeHandleSecond"
  553. :precision="0"
  554. :controls="false"
  555. ></el-input-number>
  556. </el-form-item>
  557. </el-col>
  558. <el-col :span="6">
  559. <el-form-item label="小计" label-width="100px">
  560. <el-input-number
  561. v-model="dataForm.materialCostSecond"
  562. disabled
  563. :precision="2"
  564. :controls="false"
  565. ></el-input-number>
  566. </el-form-item>
  567. </el-col>
  568. <el-col :span="6" :offset="18">
  569. <el-form-item label="合计" label-width="100px">
  570. <el-input-number
  571. v-model="dataForm.totalPriceSecond"
  572. disabled
  573. :precision="2"
  574. :controls="false"
  575. ></el-input-number>
  576. </el-form-item>
  577. </el-col>
  578. </el-row>
  579. </div>
  580. </div>
  581. </div>
  582. <div>
  583. <div class="title"><span style="color: red">* </span>任务工单派发</div>
  584. <el-row>
  585. <el-table :data="dataForm.workInfoList" border style="width: 100%">
  586. <el-table-column
  587. label="序号"
  588. type="index"
  589. width="50"
  590. align="center"
  591. >
  592. </el-table-column>
  593. <el-table-column
  594. prop="taskType"
  595. header-align="center"
  596. align="center"
  597. min-width="100"
  598. width="120"
  599. label="工单类型"
  600. >
  601. <template slot-scope="scope">
  602. <span>{{
  603. taskTypeOption.findIndex(
  604. (t) => t.value == scope.row.taskType
  605. ) > -1
  606. ? taskTypeOption.find((t) => t.value == scope.row.taskType)
  607. .label
  608. : ""
  609. }}</span>
  610. </template>
  611. </el-table-column>
  612. <el-table-column
  613. prop="taskName"
  614. header-align="center"
  615. align="center"
  616. :show-tooltip-when-overflow="true"
  617. label="工单名称"
  618. >
  619. </el-table-column>
  620. <el-table-column
  621. prop="ranks"
  622. header-align="center"
  623. align="center"
  624. width="120"
  625. label="级别"
  626. >
  627. <template slot-scope="scope">
  628. <span>{{
  629. rankTypeOption.findIndex((t) => t.value == scope.row.ranks) >
  630. -1
  631. ? rankTypeOption.find((t) => t.value == scope.row.ranks)
  632. .label
  633. : ""
  634. }}</span>
  635. </template>
  636. </el-table-column>
  637. <el-table-column
  638. prop="content"
  639. header-align="center"
  640. align="center"
  641. min-width="100"
  642. label="工单内容"
  643. :show-tooltip-when-overflow="true"
  644. >
  645. </el-table-column>
  646. <el-table-column
  647. prop="receiver"
  648. header-align="center"
  649. align="center"
  650. width="150"
  651. label="任务接收人"
  652. >
  653. <template slot-scope="scope">
  654. <span>{{ scope.row.receiverName }}</span>
  655. </template>
  656. </el-table-column>
  657. <el-table-column
  658. prop="attachListVo"
  659. header-align="center"
  660. align="center"
  661. width="150"
  662. label="任务附件"
  663. >
  664. <template slot-scope="scope">
  665. <el-button
  666. :disabled="
  667. !scope.row.attachList || scope.row.attachList.length === 0
  668. "
  669. type="text"
  670. size="small"
  671. @click="attachDetails(scope.row.attachList)"
  672. >查看</el-button
  673. >
  674. </template>
  675. </el-table-column>
  676. <el-table-column
  677. prop="notes"
  678. header-align="center"
  679. align="center"
  680. :show-tooltip-when-overflow="true"
  681. label="备注"
  682. >
  683. </el-table-column>
  684. </el-table>
  685. </el-row>
  686. </div>
  687. </el-form>
  688. <span slot="footer" class="dialog-footer">
  689. <el-button @click="onChose">取消</el-button>
  690. <el-button type="primary" @click="dataFormSubmit()" v-reClick>确定</el-button>
  691. </span>
  692. <attach-detail-dialog ref="attachDetail" @onChose="onChose" />
  693. </div>
  694. </template>
  695. <script>
  696. import { getCoCode } from '@/api/cus'
  697. import { getProductList, getProductAllDetail } from '@/api/product'
  698. import { getDetail } from '@/api/quoted'
  699. import {
  700. productTypeOption,
  701. taskTypeOption,
  702. rankTypeOption
  703. } from '@/utils/enums'
  704. import AttachDetailDialog from '../common/attach-detail-dialog'
  705. export default {
  706. name: 'quoted-add-or-update',
  707. components: { AttachDetailDialog },
  708. props: {},
  709. data () {
  710. return {
  711. id: 0,
  712. type: '',
  713. title: '',
  714. coOption: [], // 沟通编码下拉数据
  715. productTypeOption: productTypeOption,
  716. taskTypeOption: taskTypeOption,
  717. rankTypeOption: rankTypeOption,
  718. productIdOption: [], // 物料下拉数据
  719. productId: '', // 当前选择的物料Id
  720. productList: [], // 物料table
  721. productSearchLoading: false,
  722. dataForm: {
  723. materialCost: 0,
  724. materialCostSecond: 0,
  725. totalPrice: 0,
  726. totalPriceSecond: 0,
  727. quotedPriceProductList: [], // 报价物料清单
  728. workInfoList: []
  729. },
  730. dataRule: {
  731. coId: [
  732. { required: true, message: '请选择沟通信息', trigger: 'change' }
  733. ],
  734. projectName: [
  735. { required: true, message: '请输入项目名称', trigger: 'blur' }
  736. ],
  737. type: [
  738. { required: true, message: '请选择项目类别', trigger: 'change' }
  739. ],
  740. productId: [
  741. {
  742. required: true,
  743. message: '请选择关联的物料清单',
  744. trigger: 'change'
  745. }
  746. ]
  747. }
  748. }
  749. },
  750. watch: {},
  751. computed: {},
  752. created () {},
  753. mounted () {},
  754. activated () {},
  755. methods: {
  756. async init (id, type) {
  757. this.id = id || 0
  758. this.type = type
  759. this.setTitle(type)
  760. await this.getCoCode()
  761. await this.getProductList()
  762. if (this.id) {
  763. this.getDetail(this.id)
  764. }
  765. },
  766. onChose () {
  767. this.$emit('onChose')
  768. },
  769. setTitle (type) {
  770. if (type === 'first') {
  771. this.title = '初次报价'
  772. } else if (type === 'second') {
  773. this.title = '精准报价'
  774. } else if (type === 'restart') {
  775. this.title = '重新报价'
  776. }
  777. },
  778. getDetail (priceId) {
  779. getDetail(priceId).then(({ data }) => {
  780. if (data && data.code === '200') {
  781. this.dataForm = {...data.data}
  782. if (this.dataForm.managePrice) {
  783. this.dataForm.managePrice = this.dataForm.managePrice * 100
  784. }
  785. if (this.dataForm.ratePrice) {
  786. this.dataForm.ratePrice = this.dataForm.ratePrice * 100
  787. }
  788. if (this.dataForm.precisionManagePrice) {
  789. this.dataForm.precisionManagePrice = this.dataForm.precisionManagePrice * 100
  790. }
  791. if (this.dataForm.precisionRatePrice) {
  792. this.dataForm.precisionRatePrice = this.dataForm.precisionRatePrice * 100
  793. }
  794. if (this.dataForm.productId) {
  795. this.productIdChangeHandle(this.dataForm.productId)
  796. }
  797. }
  798. })
  799. },
  800. getCoCode () {
  801. getCoCode().then(({ data }) => {
  802. if (data && data.code === '200') {
  803. this.coOption = data.data
  804. }
  805. })
  806. },
  807. async getProductList (productName) {
  808. let params = {
  809. current: 1,
  810. size: 20,
  811. productName: productName
  812. }
  813. await getProductList(params).then(({ data }) => {
  814. if (data && data.code === '200') {
  815. this.productIdOption = []
  816. data.data.records.forEach((item) => {
  817. this.productIdOption.push({
  818. label: item.productName,
  819. value: item.productId
  820. })
  821. })
  822. }
  823. })
  824. },
  825. async productIdQueryHandle (queryVal) {
  826. this.productSearchLoading = true
  827. await this.getProductList(queryVal)
  828. this.productSearchLoading = false
  829. },
  830. productIdChangeHandle (val) {
  831. if (val) {
  832. getProductAllDetail(val).then(({ data }) => {
  833. if (data && data.code === '200') {
  834. this.productList = data.data
  835. if (
  836. this.dataForm.quotedPriceProductList == null ||
  837. this.dataForm.quotedPriceProductList.length === 0
  838. ) {
  839. this.productList.forEach((item) => {
  840. this.dataForm.quotedPriceProductList.push({
  841. productId: item.productId
  842. })
  843. item.id = this.dataForm.quotedPriceProductList.find(
  844. (t) => t.productId === item.productId
  845. ).id
  846. })
  847. } else {
  848. this.dataForm.quotedPriceProductList.forEach((item) => {
  849. let tempItem = this.productList.find(
  850. (t) => t.productId === item.productId
  851. )
  852. if (tempItem) {
  853. item.productName = tempItem.productName
  854. item.productSpec = tempItem.productSpec
  855. item.mapNumber = tempItem.mapNumber
  856. item.materials = tempItem.materials
  857. item.cnt = tempItem.cnt
  858. item.unit = tempItem.unit
  859. item.size = tempItem.size
  860. item.developedSize = tempItem.developedSize
  861. item.surfaceTreatment = tempItem.surfaceTreatment
  862. item.notes = tempItem.notes
  863. }
  864. })
  865. }
  866. // 触发自动计算
  867. this.inputNumChangeHandle()
  868. this.inputNumChangeHandleSecond()
  869. }
  870. })
  871. } else {
  872. this.productList = []
  873. }
  874. },
  875. removeWorkInfoItem (index) {
  876. this.dataForm.workInfoList.splice(index, 1)
  877. },
  878. addWorderItem (item) {
  879. if (!item.recordId) {
  880. item.recordId = Math.round(Math.random() * 1000000)
  881. }
  882. if (
  883. this.dataForm.workInfoList.findIndex(
  884. (item1) => item1.recordId === item.recordId
  885. ) === -1
  886. ) {
  887. this.dataForm.workInfoList.push({
  888. ...item
  889. })
  890. }
  891. },
  892. attachDetails (attachList) {
  893. this.$refs.attachDetail.init(attachList)
  894. },
  895. inputNumChangeHandle (currentValue, oldValue) {
  896. // 计算报价小计
  897. let tempMaterialCost = 0
  898. this.dataForm.quotedPriceProductList.forEach((item) => {
  899. if (item.handlePrice) {
  900. tempMaterialCost += item.handlePrice
  901. }
  902. if (item.materialPrice) {
  903. tempMaterialCost += item.materialPrice
  904. }
  905. if (item.processPrice) {
  906. tempMaterialCost += item.processPrice
  907. }
  908. if (item.detectionPrice) {
  909. tempMaterialCost += item.detectionPrice
  910. }
  911. if (item.reviewPrice) {
  912. tempMaterialCost += item.reviewPrice
  913. }
  914. if (item.unitPrice) {
  915. tempMaterialCost += item.unitPrice
  916. }
  917. if (item.elsePrice) {
  918. tempMaterialCost += item.elsePrice
  919. }
  920. })
  921. this.dataForm.materialCost = tempMaterialCost
  922. // 计算总价
  923. this.dataForm.totalPrice =
  924. (tempMaterialCost + this.dataForm.mouldPrice) *
  925. (1 + this.dataForm.managePrice / 100) *
  926. (1 + this.dataForm.ratePrice / 100)
  927. },
  928. inputNumChangeHandleSecond (currentValue, oldValue) {
  929. // 计算报价小计
  930. let tempMaterialCost = 0
  931. this.dataForm.quotedPriceProductList.forEach((item) => {
  932. if (item.precisionHandlePrice) {
  933. tempMaterialCost += item.precisionHandlePrice
  934. }
  935. if (item.precisionMaterialPrice) {
  936. tempMaterialCost += item.precisionMaterialPrice
  937. }
  938. if (item.precisionProcessPrice) {
  939. tempMaterialCost += item.precisionProcessPrice
  940. }
  941. if (item.precisionDetectionPrice) {
  942. tempMaterialCost += item.precisionDetectionPrice
  943. }
  944. if (item.precisionReviewPrice) {
  945. tempMaterialCost += item.precisionReviewPrice
  946. }
  947. if (item.precisionUnitPrice) {
  948. tempMaterialCost += item.precisionUnitPrice
  949. }
  950. if (item.precisionElsePrice) {
  951. tempMaterialCost += item.precisionElsePrice
  952. }
  953. })
  954. this.dataForm.materialCostSecond = tempMaterialCost
  955. // 计算总价
  956. if (!this.dataForm.precisionMouldPrice) {
  957. this.dataForm.precisionMouldPrice = 0
  958. }
  959. if (!this.dataForm.precisionManagePrice) {
  960. this.dataForm.precisionManagePrice = 0
  961. }
  962. if (!this.dataForm.precisionRatePrice) {
  963. this.dataForm.precisionRatePrice = 0
  964. }
  965. this.dataForm.totalPriceSecond =
  966. (tempMaterialCost + this.dataForm.precisionMouldPrice) *
  967. (1 + this.dataForm.precisionManagePrice / 100) *
  968. (1 + this.dataForm.precisionRatePrice / 100)
  969. },
  970. dataFormSubmit () {
  971. if (this.type === 'first') {
  972. this.first()
  973. } else if (this.type === 'second') {
  974. this.second()
  975. } else if (this.type === 'restart') {
  976. this.restart()
  977. }
  978. },
  979. // 初次报价
  980. first () {
  981. this.$refs['dataForm'].validate((valid) => {
  982. if (valid) {
  983. let param = {
  984. priceId: this.dataForm.priceId,
  985. remark: this.dataForm.remark,
  986. managePrice: this.dataForm.managePrice / 100,
  987. mouldPrice: this.dataForm.mouldPrice,
  988. ratePrice: this.dataForm.ratePrice / 100,
  989. materialCost: this.dataForm.materialCost,
  990. totalPrice: this.dataForm.totalPrice,
  991. quotedPriceProductFirstParamsList:
  992. this.dataForm.quotedPriceProductList.map((item) => {
  993. let temp = {
  994. id: item.id,
  995. priceId: this.id,
  996. productId: item.productId,
  997. materialPrice: item.materialPrice,
  998. processPrice: item.processPrice,
  999. handlePrice: item.handlePrice
  1000. }
  1001. return temp
  1002. })
  1003. }
  1004. this.$http({
  1005. url: this.$http.adornUrl(`/biz-service/quoted/updateFirst`),
  1006. method: 'post',
  1007. data: this.$http.adornData({ ...param, orgId: this.orgId })
  1008. }).then(({ data }) => {
  1009. if (data && data.code === '200') {
  1010. this.$message({
  1011. message: '操作成功',
  1012. type: 'success',
  1013. duration: 1500,
  1014. onClose: () => {
  1015. this.onChose()
  1016. this.$emit('refreshDataList')
  1017. }
  1018. })
  1019. } else {
  1020. this.$message.error(data.msg)
  1021. }
  1022. })
  1023. }
  1024. })
  1025. },
  1026. // 精准报价
  1027. second () {
  1028. this.$refs['dataForm'].validate((valid) => {
  1029. if (valid) {
  1030. let param = {
  1031. priceId: this.dataForm.priceId,
  1032. remark: this.dataForm.remark,
  1033. managePrice: this.dataForm.precisionManagePrice / 100,
  1034. mouldPrice: this.dataForm.precisionMouldPrice,
  1035. ratePrice: this.dataForm.precisionRatePrice / 100,
  1036. materialCost: this.dataForm.materialCostSecond,
  1037. totalPrice: this.dataForm.totalPriceSecond,
  1038. quotedPriceProductFirstParamsList:
  1039. this.dataForm.quotedPriceProductList.map((item) => {
  1040. let temp = {
  1041. id: item.id,
  1042. priceId: this.id,
  1043. productId: item.productId,
  1044. materialPrice: item.precisionMaterialPrice,
  1045. processPrice: item.precisionProcessPrice,
  1046. handlePrice: item.precisionHandlePrice
  1047. }
  1048. return temp
  1049. })
  1050. }
  1051. this.$http({
  1052. url: this.$http.adornUrl(`/biz-service/quoted/updateTwo`),
  1053. method: 'post',
  1054. data: this.$http.adornData({ ...param, orgId: this.orgId })
  1055. }).then(({ data }) => {
  1056. if (data && data.code === '200') {
  1057. this.$message({
  1058. message: '操作成功',
  1059. type: 'success',
  1060. duration: 1500,
  1061. onClose: () => {
  1062. this.onChose()
  1063. this.$emit('refreshDataList')
  1064. }
  1065. })
  1066. } else {
  1067. this.$message.error(data.msg)
  1068. }
  1069. })
  1070. }
  1071. })
  1072. },
  1073. // 重新报价
  1074. restart () {
  1075. this.$refs['dataForm'].validate((valid) => {
  1076. if (valid) {
  1077. let param = {
  1078. priceId: this.dataForm.priceId,
  1079. remark: this.dataForm.remark,
  1080. managePrice: this.dataForm.managePrice / 100,
  1081. mouldPrice: this.dataForm.mouldPrice,
  1082. ratePrice: this.dataForm.ratePrice / 100,
  1083. materialCost: this.dataForm.materialCost,
  1084. totalPrice: this.dataForm.totalPrice,
  1085. precisionManagePrice: this.dataForm.precisionManagePrice / 100,
  1086. precisionMouldPrice: this.dataForm.precisionMouldPrice,
  1087. precisionRatePrice: this.dataForm.precisionRatePrice / 100,
  1088. precisionMaterialCost: this.dataForm.materialCostSecond,
  1089. precisionTotalPrice: this.dataForm.totalPriceSecond,
  1090. quotedPriceProductRestartParamsList:
  1091. this.dataForm.quotedPriceProductList.map((item) => {
  1092. let temp = {
  1093. id: item.id,
  1094. priceId: this.id,
  1095. productId: item.productId,
  1096. materialPrice: item.materialPrice,
  1097. processPrice: item.processPrice,
  1098. handlePrice: item.handlePrice,
  1099. precisionMaterialPrice: item.precisionMaterialPrice,
  1100. precisionProcessPrice: item.precisionProcessPrice,
  1101. precisionHandlePrice: item.precisionHandlePrice
  1102. }
  1103. return temp
  1104. })
  1105. }
  1106. this.$http({
  1107. url: this.$http.adornUrl(`/biz-service/quoted/updateRestart`),
  1108. method: 'post',
  1109. data: this.$http.adornData({ ...param, orgId: this.orgId })
  1110. }).then(({ data }) => {
  1111. if (data && data.code === '200') {
  1112. this.$message({
  1113. message: '操作成功',
  1114. type: 'success',
  1115. duration: 1500,
  1116. onClose: () => {
  1117. this.onChose()
  1118. this.$emit('refreshDataList')
  1119. }
  1120. })
  1121. } else {
  1122. this.$message.error(data.msg)
  1123. }
  1124. })
  1125. }
  1126. })
  1127. }
  1128. }
  1129. }
  1130. </script>
  1131. <style lang="scss" scoped>
  1132. .title {
  1133. padding: 10px 0;
  1134. }
  1135. /deep/ .my_input > .el-input__inner {
  1136. text-align: center;
  1137. }
  1138. /deep/ .price_row .el-input-number--mini {
  1139. width: 100px;
  1140. }
  1141. .template_price {
  1142. padding: 10px 0 0 0;
  1143. border: 1px solid #ebeef5;
  1144. }
  1145. </style>