plm前端
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1363 lines
44 KiB

1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
10 months ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
9 months ago
1 year ago
9 months ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
10 months ago
1 year ago
9 months ago
1 year ago
9 months ago
1 year ago
10 months ago
9 months ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
9 months ago
1 year ago
9 months ago
1 year ago
1 year ago
10 months ago
9 months ago
6 months ago
6 months ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
10 months ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
6 months ago
9 months ago
9 months ago
1 year ago
1 year ago
1 year ago
1 year ago
9 months ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
9 months ago
1 year ago
10 months ago
1 year ago
9 months ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
9 months ago
1 year ago
1 year ago
1 year ago
  1. <script>
  2. import {
  3. againQuoteDetail,
  4. deleteQuoteDetail,
  5. queryQuoteDetail,
  6. saveQuoteDetail,
  7. updateQuoteDetail
  8. } from "../../../../api/quote/quoteDetail";
  9. import {getProjectPartList} from "../../../../api/project/project";
  10. import QuoteDetailCost from "./primary/quoteDetailCost.vue";
  11. import QuoteDetailTool from "./primary/quoteDetailTool.vue";
  12. import QuoteDetailBom from "./primary/quoteDetailBom.vue";
  13. import QuoteDetailRouting from "./primary/quoteDetailRouting.vue";
  14. import QuoteDetailOtherCost from "./primary/quoteDetailOtherCost.vue";
  15. import DictDataSelect from "../../sys/dict-data-select.vue";
  16. import QuoteDetailTest from "./primary/quoteDetailTest.vue";
  17. import QuoteDetailOther from "./primary/quoteDetailOther.vue";
  18. export default {
  19. name: "quoteDetail",
  20. components: {
  21. QuoteDetailOther,
  22. QuoteDetailTest,
  23. DictDataSelect,
  24. QuoteDetailOtherCost,
  25. QuoteDetailRouting,
  26. QuoteDetailBom,
  27. QuoteDetailTool,
  28. QuoteDetailCost,
  29. },
  30. props:{
  31. quote:{
  32. type:Object,
  33. required:true
  34. },
  35. height:{
  36. type:[Number,String],
  37. default:300
  38. },
  39. authFlag:{
  40. type:Boolean,
  41. default:false
  42. },
  43. quoteGroupDetail:{
  44. type:Object,
  45. },
  46. saveAuth:{
  47. type:Boolean,
  48. default:true
  49. },
  50. isExport:{
  51. type:Boolean,
  52. default:false
  53. },
  54. },
  55. data(){
  56. return{
  57. quoteDetail:{
  58. id:null,
  59. partNo:'',
  60. partDesc:'',
  61. projectNo:'',
  62. projectDesc:'',
  63. buNo: '*',
  64. qty:null,
  65. quoteCount:1,
  66. partCost:0,
  67. adjustPartCost:0,
  68. labourCost:0,
  69. adjustLabourCost:0,
  70. fabricateCost:0,
  71. adjustFabricateCost:0,
  72. toolCost:0,
  73. adjustToolCost:0,
  74. machineCost:0,
  75. adjustMachineCost:0,
  76. otherCost:0,
  77. manageCost:0,
  78. totalCost:0,
  79. profitRate:0,
  80. profitAmount:0,
  81. totalPrice:0,
  82. unitPrice:0,
  83. taxRate:13,
  84. taxTotalPrice:0,
  85. taxUnitPrice:0,
  86. quoteTotalCost:0,
  87. quoteProfitRate:0,
  88. quoteProfitAmount:0,
  89. quoteTotalPrice:0,
  90. quoteUnitPrice:0,
  91. quoteTaxRate:0,
  92. quoteTaxTotalPrice:0,
  93. quoteTaxUnitPrice:0,
  94. currency1:undefined,
  95. currency2:undefined,
  96. exchangeRate1:undefined,
  97. exchangeRate2:undefined,
  98. currencyTotalCost1:0,
  99. currencyTotalCost2:0,
  100. quoteCurrencyTotalCost1:0,
  101. quoteCurrencyTotalCost2:0,
  102. // moq:'Standard 250K',
  103. moq:'',
  104. calculatedItems:'工具,测试,其他,包装,运输',
  105. testCost:0,
  106. adjustTestCost:0,
  107. elseCost:0,
  108. adjustElseCost:0,
  109. remark:'',
  110. },
  111. saveQuoteDetail:{
  112. },
  113. dataList:[],
  114. saveLoading:false,
  115. queryLoading:false,
  116. saveVisible:false,
  117. saveQuoteDetailRules:{
  118. partNo: [{required: true, message: '请输入物料编码', trigger: ['blur','change']}],
  119. partDesc: [{required: true, message: '请输入物料名称', trigger: ['blur','change']}],
  120. qty: [{required: true, message: '请输入数量', trigger: ['blur','change']}],
  121. currency1: [{required: true, message: '请选择币种', trigger: ['blur','change']}],
  122. },
  123. columns: [
  124. {
  125. userId: this.$store.state.user.name,
  126. functionId: 5011,
  127. serialNumber: '5011Table2PartNo',
  128. tableId: '5011Table2',
  129. tableName: '报价详情信息表',
  130. columnProp: 'plmPartNo',
  131. headerAlign: 'center',
  132. align: 'left',
  133. columnLabel: 'PLM物料编码',
  134. columnHidden: false,
  135. columnImage: false,
  136. columnSortable: false,
  137. sortLv: 0,
  138. status: true,
  139. fixed: '',
  140. columnWidth: 120
  141. },
  142. {
  143. userId: this.$store.state.user.name,
  144. functionId: 5011,
  145. serialNumber: '5011Table2PartNo',
  146. tableId: '5011Table2',
  147. tableName: '报价详情信息表',
  148. columnProp: 'ifsPartNo',
  149. headerAlign: 'center',
  150. align: 'left',
  151. columnLabel: 'IFS物料编码',
  152. columnHidden: false,
  153. columnImage: false,
  154. columnSortable: false,
  155. sortLv: 0,
  156. status: true,
  157. fixed: '',
  158. columnWidth: 120
  159. },
  160. {
  161. userId: this.$store.state.user.name,
  162. functionId: 5011,
  163. serialNumber: '5011Table2PartDesc',
  164. tableId: '5011Table2',
  165. tableName: '报价详情信息表',
  166. columnProp: 'partDesc',
  167. headerAlign: 'center',
  168. align: 'left',
  169. columnLabel: '物料名称',
  170. columnHidden: false,
  171. columnImage: false,
  172. columnSortable: false,
  173. sortLv: 0,
  174. status: true,
  175. fixed: '',
  176. columnWidth: 240
  177. },
  178. {
  179. userId: this.$store.state.user.name,
  180. functionId: 5011,
  181. serialNumber: '5011Table2Qty',
  182. tableId: '5011Table2',
  183. tableName: '报价详情信息表',
  184. columnProp: 'qty',
  185. headerAlign: 'center',
  186. align: 'right',
  187. columnLabel: 'MOQ',
  188. columnHidden: false,
  189. columnImage: false,
  190. columnSortable: false,
  191. sortLv: 0,
  192. status: true,
  193. fixed: '',
  194. columnWidth: 100
  195. },
  196. {
  197. userId: this.$store.state.user.name,
  198. functionId: 5011,
  199. serialNumber: '5011Table2AdjustPartCost',
  200. tableId: '5011Table2',
  201. tableName: '报价详情信息表',
  202. columnProp: 'adjustPartCost',
  203. headerAlign: 'center',
  204. align: 'right',
  205. columnLabel: '材料成本',
  206. columnHidden: false,
  207. columnImage: false,
  208. columnSortable: false,
  209. sortLv: 0,
  210. status: true,
  211. fixed: '',
  212. columnWidth: 130
  213. },
  214. {
  215. userId: this.$store.state.user.name,
  216. functionId: 5011,
  217. serialNumber: '5011Table2AdjustLabourCost',
  218. tableId: '5011Table2',
  219. tableName: '报价详情信息表',
  220. columnProp: 'adjustLabourCost',
  221. headerAlign: 'center',
  222. align: 'right',
  223. columnLabel: '人工成本',
  224. columnHidden: false,
  225. columnImage: false,
  226. columnSortable: false,
  227. sortLv: 0,
  228. status: true,
  229. fixed: '',
  230. columnWidth: 120
  231. },
  232. {
  233. userId: this.$store.state.user.name,
  234. functionId: 5011,
  235. serialNumber: '5011Table2AdjustMachineCost',
  236. tableId: '5011Table2',
  237. tableName: '报价详情信息表',
  238. columnProp: 'adjustMachineCost',
  239. headerAlign: 'center',
  240. align: 'right',
  241. columnLabel: '机器成本',
  242. columnHidden: false,
  243. columnImage: false,
  244. columnSortable: false,
  245. sortLv: 0,
  246. status: true,
  247. fixed: '',
  248. columnWidth: 120
  249. },
  250. {
  251. userId: this.$store.state.user.name,
  252. functionId: 5011,
  253. serialNumber: '5011Table2AdjustToolCost',
  254. tableId: '5011Table2',
  255. tableName: '报价详情信息表',
  256. columnProp: 'adjustToolCost',
  257. headerAlign: 'center',
  258. align: 'right',
  259. columnLabel: '工具成本',
  260. columnHidden: false,
  261. columnImage: false,
  262. columnSortable: false,
  263. sortLv: 0,
  264. status: true,
  265. fixed: '',
  266. columnWidth: 120
  267. },
  268. {
  269. userId: this.$store.state.user.name,
  270. functionId: 5011,
  271. serialNumber: '5011Table2AdjustTestCost',
  272. tableId: '5011Table2',
  273. tableName: '报价详情信息表',
  274. columnProp: 'adjustTestCost',
  275. headerAlign: 'center',
  276. align: 'right',
  277. columnLabel: '测试成本',
  278. columnHidden: false,
  279. columnImage: false,
  280. columnSortable: false,
  281. sortLv: 0,
  282. status: true,
  283. fixed: '',
  284. columnWidth: 120
  285. },
  286. {
  287. userId: this.$store.state.user.name,
  288. functionId: 5011,
  289. serialNumber: '5011Table2PackCost',
  290. tableId: '5011Table2',
  291. tableName: '报价详情信息表',
  292. columnProp: 'packCost',
  293. headerAlign: 'center',
  294. align: 'right',
  295. columnLabel: '包装成本',
  296. columnHidden: false,
  297. columnImage: false,
  298. columnSortable: false,
  299. sortLv: 0,
  300. status: true,
  301. fixed: '',
  302. columnWidth: 120
  303. },
  304. {
  305. userId: this.$store.state.user.name,
  306. functionId: 5011,
  307. serialNumber: '5011Table2ShippingCost',
  308. tableId: '5011Table2',
  309. tableName: '报价详情信息表',
  310. columnProp: 'shippingCost',
  311. headerAlign: 'center',
  312. align: 'right',
  313. columnLabel: '运输成本',
  314. columnHidden: false,
  315. columnImage: false,
  316. columnSortable: false,
  317. sortLv: 0,
  318. status: true,
  319. fixed: '',
  320. columnWidth: 120
  321. },
  322. {
  323. userId: this.$store.state.user.name,
  324. functionId: 5011,
  325. serialNumber: '5011Table2AdjustElseCost',
  326. tableId: '5011Table2',
  327. tableName: '报价详情信息表',
  328. columnProp: 'adjustElseCost',
  329. headerAlign: 'center',
  330. align: 'right',
  331. columnLabel: '其他成本',
  332. columnHidden: false,
  333. columnImage: false,
  334. columnSortable: false,
  335. sortLv: 0,
  336. status: true,
  337. fixed: '',
  338. columnWidth: 120
  339. },
  340. {
  341. userId: this.$store.state.user.name,
  342. functionId: 5011,
  343. serialNumber: '5011Table2TotalCost',
  344. tableId: '5011Table2',
  345. tableName: '报价详情信息表',
  346. columnProp: 'totalCost',
  347. headerAlign: 'center',
  348. align: 'right',
  349. columnLabel: '总成本',
  350. columnHidden: false,
  351. columnImage: false,
  352. columnSortable: false,
  353. sortLv: 0,
  354. status: true,
  355. fixed: '',
  356. columnWidth: 80
  357. },
  358. {
  359. userId: this.$store.state.user.name,
  360. functionId: 5011,
  361. serialNumber: '5011Table2QuoteProfitRate',
  362. tableId: '5011Table2',
  363. tableName: '报价详情信息表',
  364. columnProp: 'quoteProfitRate',
  365. headerAlign: 'center',
  366. align: 'right',
  367. columnLabel: 'VA%',
  368. columnHidden: false,
  369. columnImage: false,
  370. columnSortable: false,
  371. sortLv: 0,
  372. status: true,
  373. fixed: '',
  374. columnWidth: 80
  375. },
  376. {
  377. userId: this.$store.state.user.name,
  378. functionId: 5011,
  379. serialNumber: '5011Table2QuoteProfitAmount',
  380. tableId: '5011Table2',
  381. tableName: '报价详情信息表',
  382. columnProp: 'quoteProfitAmount',
  383. headerAlign: 'center',
  384. align: 'right',
  385. columnLabel: 'Contribution%',
  386. columnHidden: false,
  387. columnImage: false,
  388. columnSortable: false,
  389. sortLv: 0,
  390. status: true,
  391. fixed: '',
  392. columnWidth: 100
  393. },
  394. {
  395. userId: this.$store.state.user.name,
  396. functionId: 5011,
  397. serialNumber: '5011Table2QuoteTaxRate',
  398. tableId: '5011Table2',
  399. tableName: '报价详情信息表',
  400. columnProp: 'quoteTaxRate',
  401. headerAlign: 'center',
  402. align: 'right',
  403. columnLabel: 'Margin%',
  404. columnHidden: false,
  405. columnImage: false,
  406. columnSortable: false,
  407. sortLv: 0,
  408. status: true,
  409. fixed: '',
  410. columnWidth: 80
  411. },
  412. {
  413. userId: this.$store.state.user.name,
  414. functionId: 5011,
  415. serialNumber: '5011Table2QuoteTaxTotalPrice',
  416. tableId: '5011Table2',
  417. tableName: '报价详情信息表',
  418. columnProp: 'quoteTaxTotalPrice',
  419. headerAlign: 'center',
  420. align: 'right',
  421. columnLabel: 'Price ¥(ex VAT)',
  422. columnHidden: false,
  423. columnImage: false,
  424. columnSortable: false,
  425. sortLv: 0,
  426. status: true,
  427. fixed: '',
  428. columnWidth: 100
  429. },
  430. {
  431. userId: this.$store.state.user.name,
  432. functionId: 5011,
  433. serialNumber: '5011Table2Qty',
  434. tableId: '5011Table2',
  435. tableName: '报价详情信息表',
  436. columnProp: 'unitPrice',
  437. headerAlign: 'center',
  438. align: 'right',
  439. columnLabel: '未税单价',
  440. columnHidden: false,
  441. columnImage: false,
  442. columnSortable: false,
  443. sortLv: 0,
  444. status: true,
  445. fixed: '',
  446. columnWidth: 100
  447. },
  448. {
  449. userId: this.$store.state.user.name,
  450. functionId: 5011,
  451. serialNumber: '5011Table2Qty',
  452. tableId: '5011Table2',
  453. tableName: '报价详情信息表',
  454. columnProp: 'taxRate',
  455. headerAlign: 'center',
  456. align: 'right',
  457. columnLabel: '税率',
  458. columnHidden: false,
  459. columnImage: false,
  460. columnSortable: false,
  461. sortLv: 0,
  462. status: true,
  463. fixed: '',
  464. columnWidth: 100
  465. },
  466. {
  467. userId: this.$store.state.user.name,
  468. functionId: 5011,
  469. serialNumber: '5011Table2Qty',
  470. tableId: '5011Table2',
  471. tableName: '报价详情信息表',
  472. columnProp: 'exchangeRate1',
  473. headerAlign: 'center',
  474. align: 'right',
  475. columnLabel: '其他税率',
  476. columnHidden: false,
  477. columnImage: false,
  478. columnSortable: false,
  479. sortLv: 0,
  480. status: true,
  481. fixed: '',
  482. columnWidth: 100
  483. },
  484. {
  485. userId: this.$store.state.user.name,
  486. functionId: 5011,
  487. serialNumber: '5011Table2Qty',
  488. tableId: '5011Table2',
  489. tableName: '报价详情信息表',
  490. columnProp: 'taxUnitPrice',
  491. headerAlign: 'center',
  492. align: 'right',
  493. columnLabel: '含税单价(CNY)',
  494. columnHidden: false,
  495. columnImage: false,
  496. columnSortable: false,
  497. sortLv: 0,
  498. status: true,
  499. fixed: '',
  500. columnWidth: 100
  501. },
  502. {
  503. userId: this.$store.state.user.name,
  504. functionId: 5011,
  505. serialNumber: '5011Table2Qty',
  506. tableId: '5011Table2',
  507. tableName: '报价详情信息表',
  508. columnProp: 'currencyDesc2',
  509. headerAlign: 'center',
  510. align: 'right',
  511. columnLabel: '币种',
  512. columnHidden: false,
  513. columnImage: false,
  514. columnSortable: false,
  515. sortLv: 0,
  516. status: true,
  517. fixed: '',
  518. columnWidth: 100
  519. },
  520. {
  521. userId: this.$store.state.user.name,
  522. functionId: 5011,
  523. serialNumber: '5011Table2Qty',
  524. tableId: '5011Table2',
  525. tableName: '报价详情信息表',
  526. columnProp: 'exchangeRate2',
  527. headerAlign: 'center',
  528. align: 'right',
  529. columnLabel: '汇率',
  530. columnHidden: false,
  531. columnImage: false,
  532. columnSortable: false,
  533. sortLv: 0,
  534. status: true,
  535. fixed: '',
  536. columnWidth: 100
  537. },
  538. {
  539. userId: this.$store.state.user.name,
  540. functionId: 5011,
  541. serialNumber: '5011Table2Qty',
  542. tableId: '5011Table2',
  543. tableName: '报价详情信息表',
  544. columnProp: 'currencyTotalCost2',
  545. headerAlign: 'center',
  546. align: 'right',
  547. columnLabel: '含税单价',
  548. columnHidden: false,
  549. columnImage: false,
  550. columnSortable: false,
  551. sortLv: 0,
  552. status: true,
  553. fixed: '',
  554. columnWidth: 100
  555. },
  556. {
  557. userId: this.$store.state.user.name,
  558. functionId: 5011,
  559. serialNumber: '5011Table2Qty',
  560. tableId: '5011Table2',
  561. tableName: '报价详情信息表',
  562. columnProp: 'unitPrice',
  563. headerAlign: 'center',
  564. align: 'right',
  565. columnLabel: '未税单价(CNY)',
  566. columnHidden: false,
  567. columnImage: false,
  568. columnSortable: false,
  569. sortLv: 0,
  570. status: true,
  571. fixed: '',
  572. columnWidth: 100
  573. },
  574. {
  575. userId: this.$store.state.user.name,
  576. functionId: 5011,
  577. serialNumber: '5011Table2Qty',
  578. tableId: '5011Table2',
  579. tableName: '报价详情信息表',
  580. columnProp: 'unitPriceRate',
  581. headerAlign: 'center',
  582. align: 'right',
  583. columnLabel: '未税单价',
  584. columnHidden: false,
  585. columnImage: false,
  586. columnSortable: false,
  587. sortLv: 0,
  588. status: true,
  589. fixed: '',
  590. columnWidth: 100
  591. },
  592. {
  593. userId: this.$store.state.user.name,
  594. functionId: 5011,
  595. serialNumber: '5011Table2Remark',
  596. tableId: '5011Table2',
  597. tableName: '报价详情信息表',
  598. columnProp: 'remark',
  599. headerAlign: 'center',
  600. align: 'left',
  601. columnLabel: '备注',
  602. columnHidden: false,
  603. columnImage: false,
  604. columnSortable: false,
  605. sortLv: 0,
  606. status: true,
  607. fixed: '',
  608. columnWidth: 120
  609. },
  610. ],
  611. partVisible:false,
  612. activeName:'bom',
  613. projectPart:{
  614. },
  615. projectPartList:[],
  616. pageNo:1,
  617. pageSize:20,
  618. pageTotal:0,
  619. partQueryLoading:false,
  620. projectPartColumns:[
  621. {
  622. userId: this.$store.state.user.name,
  623. functionId: 5011,
  624. serialNumber: '5011Table3TestPartNo',
  625. tableId: '5011Table3',
  626. tableName: '项目物料表',
  627. columnProp: 'testPartNo',
  628. headerAlign: 'center',
  629. align: 'left',
  630. columnLabel: '物料编码',
  631. columnHidden: false,
  632. columnImage: false,
  633. columnSortable: false,
  634. sortLv: 0,
  635. status: true,
  636. fixed: '',
  637. columnWidth: 150
  638. },
  639. {
  640. userId: this.$store.state.user.name,
  641. functionId: 5011,
  642. serialNumber: '5011Table3PartDesc',
  643. tableId: '5011Table3',
  644. tableName: '项目物料表',
  645. columnProp: 'partDesc',
  646. headerAlign: 'center',
  647. align: 'left',
  648. columnLabel: '物料名称',
  649. columnHidden: false,
  650. columnImage: false,
  651. columnSortable: false,
  652. sortLv: 0,
  653. status: true,
  654. fixed: '',
  655. columnWidth: 160
  656. },
  657. {
  658. userId: this.$store.state.user.name,
  659. functionId: 5011,
  660. serialNumber: '5011Table3FinalPartNo',
  661. tableId: '5011Table3',
  662. tableName: '项目物料表',
  663. columnProp: 'finalPartNo',
  664. headerAlign: 'center',
  665. align: 'left',
  666. columnLabel: 'IFS物料编码',
  667. columnHidden: false,
  668. columnImage: false,
  669. columnSortable: false,
  670. sortLv: 0,
  671. status: true,
  672. fixed: '',
  673. columnWidth: 150
  674. },
  675. {
  676. userId: this.$store.state.user.name,
  677. functionId: 5011,
  678. serialNumber: '5011Table3CustomerPartNo',
  679. tableId: '5011Table3',
  680. tableName: '项目物料表',
  681. columnProp: 'customerPartNo',
  682. headerAlign: 'center',
  683. align: 'left',
  684. columnLabel: '客户物料编码',
  685. columnHidden: false,
  686. columnImage: false,
  687. columnSortable: false,
  688. sortLv: 0,
  689. status: true,
  690. fixed: '',
  691. columnWidth: 150
  692. },
  693. {
  694. userId: this.$store.state.user.name,
  695. functionId: 5011,
  696. serialNumber: '5011Table3Type',
  697. tableId: '5011Table3',
  698. tableName: '项目物料表',
  699. columnProp: 'type',
  700. headerAlign: 'center',
  701. align: 'left',
  702. columnLabel: '制造类型',
  703. columnHidden: false,
  704. columnImage: false,
  705. columnSortable: false,
  706. sortLv: 0,
  707. status: true,
  708. fixed: '',
  709. columnWidth: 120
  710. },
  711. {
  712. userId: this.$store.state.user.name,
  713. functionId: 5011,
  714. serialNumber: '5011Table3UmId',
  715. tableId: '5011Table3',
  716. tableName: '项目物料表',
  717. columnProp: 'umId',
  718. headerAlign: 'center',
  719. align: 'left',
  720. columnLabel: '单位',
  721. columnHidden: false,
  722. columnImage: false,
  723. columnSortable: false,
  724. sortLv: 0,
  725. status: true,
  726. fixed: '',
  727. columnWidth: 100
  728. },
  729. ],
  730. exportData:[],
  731. exportName: '报价条目明细'+this.dayjs().format('YYYYMMDDHHmmss'),
  732. exportHeader: ["报价条目明细"],
  733. exportFooter: [],
  734. againVisible:false,
  735. againRow:{},
  736. }
  737. },
  738. methods:{
  739. handleSaveQuoteDetail(row){
  740. this.$nextTick(()=>{
  741. if (this.$refs.handleSaveQuoteDetailClick){
  742. this.$refs.saveQuoteDetailForm.clearValidate();
  743. }
  744. })
  745. if (row){
  746. this.saveQuoteDetail = {
  747. ...row
  748. }
  749. }else {
  750. this.saveQuoteDetail = {
  751. ...this.quoteDetail,
  752. createBy:this.$store.state.user.name,
  753. status:'草稿',
  754. active:'Y',
  755. qty:1,
  756. isDetail:false,
  757. }
  758. if (this.quoteGroupDetail){
  759. this.saveQuoteDetail.partNo = this.quoteGroupDetail.partNo
  760. this.saveQuoteDetail.partDesc = this.quoteGroupDetail.partDesc
  761. }
  762. this.$nextTick(()=>{
  763. this.saveQuoteDetail.projectNo = this.quote.projectNo
  764. })
  765. }
  766. this.activeName = 'bom';
  767. this.saveVisible = true;
  768. },
  769. handleDetail(row){
  770. this.saveQuoteDetail = {
  771. ...row
  772. }
  773. this.activeName = 'bom';
  774. this.saveVisible = true;
  775. },
  776. handleDeleteQuoteDetail(row){
  777. this.$alert('确认删除该条报价明细吗?', '提示', {
  778. confirmButtonText: '确定',
  779. cancelButtonText: '取消',
  780. type: 'warning'
  781. }).then(() => {
  782. let params = {
  783. id: row.id,
  784. }
  785. deleteQuoteDetail(params).then(({data}) => {
  786. if (data && data.code === 0) {
  787. this.$message.success(data.msg);
  788. this.handleQueryQuoteDetail();
  789. } else {
  790. this.$message.warning(data.msg);
  791. }
  792. }).catch((error) => {
  793. this.$message.error(error);
  794. })
  795. }).catch(() => {
  796. })
  797. },
  798. handlePartNoBlur(){
  799. let params = {
  800. site:this.$store.state.user.site,
  801. testPartNo:this.saveQuoteDetail.partNo,
  802. projectId: this.quote.projectNo,
  803. no:1,
  804. size:20,
  805. }
  806. getProjectPartList(params).then(({data})=>{
  807. if (data && data.code === 0){
  808. if (data.rows && data.rows.length === 1){
  809. this.dblClickProjectPartTable(data.rows[0])
  810. }else {
  811. this.saveQuoteDetail.partDesc = ''
  812. }
  813. }
  814. })
  815. },
  816. handleQueryQuoteDetail(){
  817. let params = {
  818. quoteId: this.quote.id,
  819. }
  820. if (this.quoteGroupDetail){
  821. params.quoteGroupDetailId=this.quoteGroupDetail.id;
  822. }
  823. this.queryLoading = true;
  824. queryQuoteDetail(params).then(({data})=>{
  825. if (data && data.code === 0){
  826. this.dataList = data.rows
  827. }else {
  828. this.$message.warning(data.msg);
  829. }
  830. this.queryLoading = false;
  831. }).catch((error)=>{
  832. this.$message.error(error);
  833. this.queryLoading = false;
  834. })
  835. },
  836. handleSaveQuoteDetailClick(){
  837. this.$refs.saveQuoteDetailForm.validate((valid,obj) => {
  838. if (valid){
  839. if (this.saveQuoteDetail.id){
  840. this.handleUpdate();
  841. }else {
  842. this.handleSave();
  843. }
  844. }else {
  845. let i = 1;
  846. for (let key in obj) {
  847. this.$message.error(obj[key][0].message);
  848. if (i === 1){
  849. return
  850. }
  851. i++;
  852. }
  853. }
  854. })
  855. },
  856. handleSave(){
  857. let params = {
  858. ...this.saveQuoteDetail,
  859. quoteId: this.quote.id,
  860. quoteNo:this.quote.quoteNo,
  861. site:this.quote.site,
  862. buNo:this.quote.buNo,
  863. versionNo:this.quote.versionNo,
  864. createBy:this.saveQuoteDetail.createBy,
  865. active:'Y',
  866. status:'草稿',
  867. internalInquiryNo:this.quote.insideInquiryNo,
  868. }
  869. if (this.quoteGroupDetail){
  870. params.quoteGroupDetailId=this.quoteGroupDetail.id;
  871. }
  872. this.saveLoading = true;
  873. saveQuoteDetail(params).then(({data})=>{
  874. if (data && data.code === 0){
  875. this.$message.success(data.msg);
  876. this.handleQueryQuoteDetail();
  877. if (this.saveQuoteDetail.isDetail){
  878. this.saveQuoteDetail = {
  879. ...data.row,
  880. }
  881. }else {
  882. this.saveVisible = false;
  883. }
  884. }else {
  885. this.$message.warning(data.msg);
  886. }
  887. this.saveLoading = false
  888. }).catch((error)=>{
  889. this.$message.error(error);
  890. this.saveLoading = false
  891. })
  892. },
  893. handleUpdate(){
  894. let params = {
  895. ...this.saveQuoteDetail,
  896. updateBy:this.$store.state.user.name,
  897. }
  898. updateQuoteDetail(params).then(({data})=>{
  899. if (data && data.code === 0){
  900. this.$message.success(data.msg);
  901. this.handleQueryQuoteDetail();
  902. this.saveVisible = false;
  903. }else {
  904. this.$message.warning(data.msg);
  905. }
  906. }).catch((error)=>{
  907. this.$message.error(error);
  908. })
  909. },
  910. handleClickTab(tab){
  911. if (this.activeName === 'routing'){
  912. this.$refs.routing.handleQueryQuoteDetailBomTree()
  913. }else if (this.activeName === 'tool'){
  914. this.$refs.tool.handleQueryQuoteDetailTool();
  915. }
  916. },
  917. handleAgainQuoteDetail(row){
  918. this.againRow = row;
  919. this.againVisible = true;
  920. },
  921. againQuoteDetail(){
  922. this.$refs.againForm.validate((valid,obj) => {
  923. if (valid){
  924. this.queryLoading = true;
  925. this.saveLoading = true;
  926. againQuoteDetail(this.againRow).then(({data})=>{
  927. if (data && data.code === 0){
  928. this.againVisible = false
  929. this.handleQueryQuoteDetail();
  930. this.$message.success(data.msg);
  931. }else {
  932. this.$message.warning(data.msg);
  933. }
  934. this.queryLoading = false;
  935. this.saveLoading = false;
  936. }).catch((error)=>{
  937. this.$message.error(error);
  938. this.queryLoading = false;
  939. this.saveLoading = false;
  940. })
  941. }else {
  942. let i = 1;
  943. for (let key in obj) {
  944. this.$message.error(obj[key][0].message);
  945. if (i === 1){
  946. return
  947. }
  948. i++;
  949. }
  950. }
  951. })
  952. },
  953. handleQueryPartList(){
  954. this.projectPart = {
  955. testPartNo:this.saveQuoteDetail.partNo,
  956. partDesc:'',
  957. finalPartNo:'',
  958. customerPartNo:'',
  959. site:this.$store.state.user.site,
  960. }
  961. this.partVisible = true;
  962. this.getProjectPartList();
  963. },
  964. getProjectPartList(){
  965. let params = {
  966. ...this.projectPart,
  967. no:this.pageNo,
  968. size:this.pageSize,
  969. }
  970. params.projectId = this.quote.projectNo
  971. this.partQueryLoading = true;
  972. getProjectPartList(params).then(({data})=>{
  973. if (data && data.code === 0){
  974. this.projectPartList = data.rows;
  975. this.pageTotal = data.total;
  976. }
  977. this.partQueryLoading = false;
  978. }).catch((error)=>{
  979. this.partQueryLoading = false;
  980. })
  981. },
  982. handleSizeChange(val){
  983. this.pageSize = val;
  984. this.getProjectPartList();
  985. },
  986. handleCurrentChange(val){
  987. this.pageNo = val;
  988. this.getProjectPartList();
  989. },
  990. dblClickProjectPartTable(row){
  991. this.saveQuoteDetail.partNo = row.testPartNo;
  992. this.saveQuoteDetail.partDesc = row.partDesc;
  993. this.partVisible = false;
  994. },
  995. handleClose(){
  996. this.$emit('close');
  997. this.saveVisible = false;
  998. },
  999. fields() {
  1000. let json = "{"
  1001. this.columns.forEach((item, index) => {
  1002. if (index === this.columns.length - 1) {
  1003. json += "\"" + item.columnLabel + "\"" + ":" + "\"" + item.columnProp + "\""
  1004. } else {
  1005. json += "\"" + item.columnLabel + "\"" + ":" + "\"" + item.columnProp + "\"" + ","
  1006. }
  1007. })
  1008. json += "}"
  1009. return eval("(" + json + ")")
  1010. },
  1011. createExportData() {
  1012. return this.dataList;
  1013. },
  1014. toPartMenu (partNo) {
  1015. if (this.$router.resolve(`/part-partInformation`).resolved.name === '404') {
  1016. this.$alert('权限不足,访问失败', '警告', {confirmButtonText: '确定',})
  1017. } else {
  1018. this.$router.push({name:`part-partInformation`,params:{partNo:partNo},})
  1019. }
  1020. },
  1021. formatDecimal(value) {
  1022. const num = parseFloat(value);
  1023. return !isNaN(num) ? num.toFixed(4) : value;
  1024. },
  1025. handleSetDefaultQuoteRow(row) {
  1026. if (!this.isAuth('5011:group:current')) {
  1027. return;
  1028. }
  1029. const oldVal = this.quoteGroupDetail.currentQuoteDetailItemNo;
  1030. this.quoteGroupDetail.currentQuoteDetailItemNo = row.itemNo;
  1031. // 直接触发emit事件
  1032. this.$emit('currentQuoteDetailItemNo', oldVal);
  1033. }
  1034. },
  1035. watch:{
  1036. quote(newVal,oldVal){
  1037. if (newVal.id){
  1038. this.quoteDetail.profitRate = this.quote.markup
  1039. this.quoteDetail.quoteProfitRate = this.quote.markup
  1040. this.handleQueryQuoteDetail();
  1041. }else {
  1042. this.dataList = [];
  1043. }
  1044. },
  1045. "saveQuoteDetail.partNo"(newVal,oldVal){
  1046. if (newVal){
  1047. this.saveQuoteDetail.partNo = newVal.toUpperCase();
  1048. }
  1049. },
  1050. partVisible(newVal,oldVal){
  1051. if (newVal === false){
  1052. this.partQueryLoading = false
  1053. this.pageNo = 1;
  1054. this.projectPartList = [];
  1055. }
  1056. },
  1057. quoteGroupDetail(newVal,oldVal){
  1058. if (newVal){
  1059. this.quoteDetail.profitRate = this.quote.markup
  1060. this.quoteDetail.quoteProfitRate = this.quote.markup
  1061. this.handleQueryQuoteDetail();
  1062. }
  1063. },
  1064. // 'quoteGroupDetail.currentQuoteDetailItemNo'(newVal,oldVal){
  1065. // // console.log(this.quoteGroupDetail)
  1066. // // emit事件触发修改
  1067. // if (this.quoteGroupDetail && this.quoteGroupDetail.currentQuoteDetailItemNo){
  1068. // this.$emit('currentQuoteDetailItemNo',oldVal);
  1069. // }
  1070. // }
  1071. },
  1072. created() {
  1073. this.quoteDetail.profitRate = this.quote.markup
  1074. this.quoteDetail.quoteProfitRate = this.quote.markup
  1075. this.handleQueryQuoteDetail();
  1076. }
  1077. }
  1078. </script>
  1079. <template>
  1080. <div>
  1081. <template v-if="saveAuth">
  1082. <el-button type="primary" v-if="!authFlag" :disabled="quote.status === '下达' || !quote.status" @click="handleSaveQuoteDetail(null)">新增</el-button>
  1083. </template>
  1084. <template v-if="isExport">
  1085. <download-excel
  1086. :fields="fields()"
  1087. :data="exportData"
  1088. type="xls"
  1089. :name="exportName"
  1090. :header="exportHeader"
  1091. :footer="exportFooter"
  1092. :fetch="createExportData"
  1093. worksheet="导出信息"
  1094. class="el-button el-button--primary el-button--medium">
  1095. {{ '导出' }}
  1096. </download-excel>
  1097. </template>
  1098. <el-table v-loading="queryLoading" border :data="dataList" style="width: 100%;margin-top: 5px" :height="height">
  1099. <el-table-column width="80" align="center" label="默认报价行" v-if="quoteGroupDetail && quoteGroupDetail.status === '草稿'">
  1100. <template slot-scope="{row}">
  1101. <div @click="handleSetDefaultQuoteRow(row)" style="cursor: pointer;">
  1102. <el-radio
  1103. class="radio"
  1104. :label="row.itemNo"
  1105. :disabled="!isAuth('5011:group:current')"
  1106. v-model="quoteGroupDetail.currentQuoteDetailItemNo"
  1107. @click.native.stop.prevent
  1108. ></el-radio>
  1109. </div>
  1110. </template>
  1111. </el-table-column>
  1112. <el-table-column type="index" width="55" align="center" label="序号"></el-table-column>
  1113. <el-table-column
  1114. v-for="(item,index) in columns" :key="index"
  1115. :sortable="item.columnSortable"
  1116. :prop="item.columnProp"
  1117. :header-align="item.headerAlign"
  1118. :show-overflow-tooltip="item.showOverflowTooltip"
  1119. :align="item.align"
  1120. :fixed="item.fixed === ''?false:item.fixed"
  1121. :min-width="item.columnWidth"
  1122. :label="item.columnLabel">
  1123. <template slot-scope="scope">
  1124. <template v-if="item.columnProp === 'unitPriceRate'">
  1125. {{ formatDecimal(scope.row.unitPriceRate) }}
  1126. </template>
  1127. <template v-else-if="!quoteGroupDetail && item.columnProp === 'plmPartNo'">
  1128. <el-link style="cursor:pointer;" v-if="!item.columnHidden" @click="toPartMenu(scope.row.plmPartNo)"> {{ scope.row[item.columnProp] }}</el-link>
  1129. <span v-if="item.columnImage"><img :src="scope.row[item.columnProp]" style="width: 100px; height: 80px"/></span>
  1130. </template>
  1131. <template v-else>
  1132. <span v-if="!item.columnHidden">{{ scope.row[item.columnProp] }}</span>
  1133. <span v-if="item.columnImage"><img :src="scope.row[item.columnProp]"
  1134. style="width: 100px; height: 80px"/></span>
  1135. </template>
  1136. </template>
  1137. </el-table-column>
  1138. <el-table-column label="操作" v-if="!authFlag" fixed="right" align="center" width="160">
  1139. <template slot-scope="{row,$index}">
  1140. <template v-if="isAuth('5011:detail:update')">
  1141. <a type="text" v-if="row.status === '草稿'" @click="handleSaveQuoteDetail(row)">编辑</a>
  1142. </template>
  1143. <template v-if="isAuth('5011:detail:remove')">
  1144. <a type="text" v-if="row.status === '草稿'" @click="handleDeleteQuoteDetail(row)">删除</a>
  1145. </template>
  1146. <template v-if="isAuth('5011:detail:again')">
  1147. <!-- <a type="text" v-if="row.status !== '下达'" @click="againQuoteDetail(row)">复制明细</a>-->
  1148. <a type="text" v-if="row.status !== '下达'" @click="handleAgainQuoteDetail(row)">复制明细</a>
  1149. </template>
  1150. <template v-if="isAuth('5011:detail:detail')">
  1151. <a type="text" v-if="row.status === '下达'" @click="handleDetail(row)">详情</a>
  1152. </template>
  1153. </template>
  1154. </el-table-column>
  1155. </el-table>
  1156. <el-dialog :title="`报价明细`" top="10vh" v-drag :visible.sync="saveVisible" append-to-body :width="`${saveQuoteDetail.id?1200:600}px`" :close-on-click-modal="false">
  1157. <el-form :model="saveQuoteDetail" ref="saveQuoteDetailForm" :rules="saveQuoteDetailRules" label-position="top" v-if="!saveQuoteDetail.id">
  1158. <el-row :gutter="20">
  1159. <el-col :span="8">
  1160. <el-form-item label="物料编码" prop="partNo" :show-message="false">
  1161. <span slot="label" v-if="!quoteGroupDetail">
  1162. <a @click="handleQueryPartList">物料编码</a>
  1163. </span>
  1164. <el-input v-model="saveQuoteDetail.partNo" :disabled="quoteGroupDetail" @change="handlePartNoBlur"></el-input>
  1165. </el-form-item>
  1166. </el-col>
  1167. <el-col :span="16">
  1168. <el-form-item label="物料名称" prop="partDesc" :show-message="false">
  1169. <el-input v-model="saveQuoteDetail.partDesc" disabled></el-input>
  1170. </el-form-item>
  1171. </el-col>
  1172. <el-col :span="8">
  1173. <el-form-item label="MOQ" prop="qty" :show-message="false">
  1174. <el-input-number style="width: 100%;" v-model="saveQuoteDetail.qty" :min="1" :step="0" :precision="0" :controls="false"></el-input-number>
  1175. </el-form-item>
  1176. </el-col>
  1177. <el-col :span="8">
  1178. <el-form-item label="币种" prop="currency1" :show-message="false">
  1179. <dict-data-select style="width: 100%" v-if="saveVisible" dict-type="plm_customer_information_customer_customer_currency" v-model="saveQuoteDetail.currency1"></dict-data-select>
  1180. </el-form-item>
  1181. </el-col>
  1182. </el-row>
  1183. <el-row :gutter="20">
  1184. <el-col :span="8">
  1185. <el-form-item label="" :show-message="false">
  1186. <el-checkbox v-model="saveQuoteDetail.isDetail">保存进入报价页面</el-checkbox>
  1187. </el-form-item>
  1188. </el-col>
  1189. <el-col :span="24">
  1190. <el-form-item label="备注" class="auto" :show-message="false">
  1191. <el-input type="textarea" v-model="saveQuoteDetail.remark" :autosize="{minRows: 3, maxRows: 3}"></el-input>
  1192. </el-form-item>
  1193. </el-col>
  1194. </el-row>
  1195. </el-form>
  1196. <el-form v-else :model="saveQuoteDetail" ref="saveQuoteDetailForm" :rules="saveQuoteDetailRules" label-position="top">
  1197. <el-row :gutter="20">
  1198. <el-col :span="4">
  1199. <el-form-item label="物料编码" prop="partNo" :show-message="false">
  1200. <el-input v-model="saveQuoteDetail.partNo" disabled></el-input>
  1201. </el-form-item>
  1202. </el-col>
  1203. <el-col :span="6">
  1204. <el-form-item label="物料名称" prop="partDesc" :show-message="false">
  1205. <el-input v-model="saveQuoteDetail.partDesc" disabled></el-input>
  1206. </el-form-item>
  1207. </el-col>
  1208. <el-col :span="3">
  1209. <el-form-item label="MOQ" prop="qty" :show-message="false">
  1210. <el-input-number v-model="saveQuoteDetail.qty" style="width: 100%;" :controls="false" :disabled="saveQuoteDetail.status === '下达'"></el-input-number>
  1211. </el-form-item>
  1212. </el-col>
  1213. <el-col :span="3">
  1214. <el-form-item label="币种" prop="currency1" :show-message="false">
  1215. <dict-data-select :disabled="saveQuoteDetail.status === '下达'" style="width: 100%" dict-type="plm_customer_information_customer_customer_currency" v-model="saveQuoteDetail.currency1"></dict-data-select>
  1216. </el-form-item>
  1217. </el-col>
  1218. </el-row>
  1219. <el-row :gutter="20">
  1220. <el-col :span="16">
  1221. <el-form-item label="备注" class="auto" :show-message="false">
  1222. <el-input type="textarea" resize="none" :autosize="{minRows: 3, maxRows: 3}" v-model="saveQuoteDetail.remark" :disabled="saveQuoteDetail.status === '下达'"></el-input>
  1223. </el-form-item>
  1224. </el-col>
  1225. </el-row>
  1226. </el-form>
  1227. <el-tabs v-model="activeName" v-if="saveQuoteDetail.id" @tab-click="handleClickTab">
  1228. <el-tab-pane label="材料" name="bom">
  1229. <quote-detail-bom v-if="saveVisible" @close="handleClose" v-model:quoteDetail="saveQuoteDetail"></quote-detail-bom>
  1230. </el-tab-pane>
  1231. <el-tab-pane label="工艺" name="routing">
  1232. <quote-detail-routing ref="routing" v-if="saveVisible" @close="handleClose" v-model:quoteDetail="saveQuoteDetail"></quote-detail-routing>
  1233. </el-tab-pane>
  1234. <el-tab-pane label="工具" name="tool">
  1235. <quote-detail-tool ref="tool" v-if="saveVisible" v-model:quoteDetail="saveQuoteDetail"></quote-detail-tool>
  1236. </el-tab-pane>
  1237. <el-tab-pane label="测试" name="test">
  1238. <quote-detail-test v-if="saveVisible" v-model:quoteDetail="saveQuoteDetail"></quote-detail-test>
  1239. </el-tab-pane>
  1240. <el-tab-pane label="包装&运输" name="otherCost">
  1241. <quote-detail-other-cost v-if="saveVisible" v-model:quoteDetail="saveQuoteDetail"></quote-detail-other-cost>
  1242. </el-tab-pane>
  1243. <el-tab-pane label="其他" name="other">
  1244. <quote-detail-other v-if="saveVisible" v-model:quoteDetail="saveQuoteDetail"></quote-detail-other>
  1245. </el-tab-pane>
  1246. <el-tab-pane label="成本&价格" name="cost">
  1247. <quote-detail-cost v-if="saveVisible" ref="cost" v-model:quoteDetail="saveQuoteDetail"></quote-detail-cost>
  1248. </el-tab-pane>
  1249. </el-tabs>
  1250. <div slot="footer" class="dialog-footer">
  1251. <el-button type="primary" v-if="saveQuoteDetail.status === '草稿'" :loading="saveLoading" @click="handleSaveQuoteDetailClick"> </el-button>
  1252. <el-button @click="saveVisible = false"> </el-button>
  1253. </div>
  1254. </el-dialog>
  1255. <el-dialog v-drag title="物料信息" append-to-body :close-on-click-modal="false" :visible.sync="partVisible">
  1256. <!--搜索条件-->
  1257. <el-form :model="projectPart" ref="projectPartDataForm" :inline="true" label-position="top">
  1258. <el-form-item label="物料编码" prop="testPartNo">
  1259. <el-input v-model="projectPart.testPartNo" clearable/>
  1260. </el-form-item>
  1261. <el-form-item label="物料名称" prop="partDesc">
  1262. <el-input v-model="projectPart.partDesc" clearable/>
  1263. </el-form-item>
  1264. <el-form-item label="IFS物料编码" prop="finalPartNo">
  1265. <el-input v-model="projectPart.finalPartNo" clearable/>
  1266. </el-form-item>
  1267. <el-form-item label="客户物料编码" prop="customerPartNo">
  1268. <el-input v-model="projectPart.customerPartNo" clearable/>
  1269. </el-form-item>
  1270. <el-form-item label=" ">
  1271. <el-button @click="getProjectPartList" type="primary"> </el-button>
  1272. </el-form-item>
  1273. </el-form>
  1274. <el-table height="300px" v-loading="partQueryLoading" stripe border @row-dblclick="dblClickProjectPartTable" :data="projectPartList" ref="projectPartDataTable" :style="{marginTop:'10px'}">
  1275. <el-table-column
  1276. v-for="(item,index) in projectPartColumns" :key="index"
  1277. :sortable="item.columnSortable"
  1278. :prop="item.columnProp"
  1279. :header-align="item.headerAlign"
  1280. :show-overflow-tooltip="item.showOverflowTooltip"
  1281. :align="item.align"
  1282. :fixed="item.fixed===''?false:item.fixed"
  1283. :min-width="item.columnWidth"
  1284. :label="item.columnLabel">
  1285. <template slot-scope="scope">
  1286. <span v-if="!item.columnHidden">{{scope.row[item.columnProp]}}</span>
  1287. <span v-if="item.columnImage"><img :src="scope.row[item.columnProp]" style="width: 100px; height: 80px"/></span>
  1288. </template>
  1289. </el-table-column>
  1290. </el-table>
  1291. <el-pagination style="margin-top: 0"
  1292. @size-change="handleSizeChange"
  1293. @current-change="handleCurrentChange"
  1294. :current-page="pageNo"
  1295. :page-sizes="[20, 50, 100, 200, 500]"
  1296. :page-size="pageSize"
  1297. :total="pageTotal"
  1298. layout="total,sizes, prev, pager, next, jumper">
  1299. </el-pagination>
  1300. </el-dialog>
  1301. <el-dialog title="复制明细" v-drag append-to-body :close-on-click-modal="false" :visible.sync="againVisible" width="400px">
  1302. <el-form :model="againRow" label-position="top" ref="againForm" :rules="saveQuoteDetailRules">
  1303. <el-row :gutter="10">
  1304. <el-col :span="8">
  1305. <el-form-item label="物料编码" prop="partNo" :show-message="false">
  1306. <el-input v-model="againRow.partNo" disabled @change="handlePartNoBlur"></el-input>
  1307. </el-form-item>
  1308. </el-col>
  1309. <el-col :span="16">
  1310. <el-form-item label="物料名称" prop="partDesc" :show-message="false">
  1311. <el-input v-model="againRow.partDesc" disabled></el-input>
  1312. </el-form-item>
  1313. </el-col>
  1314. <el-col :span="8">
  1315. <el-form-item label="MOQ" prop="qty" :show-message="false">
  1316. <el-input-number style="width: 100%;" v-model="againRow.qty" :min="1" :step="0" :precision="0" :controls="false"></el-input-number>
  1317. </el-form-item>
  1318. </el-col>
  1319. <el-col :span="8">
  1320. <el-form-item label="币种" prop="currency1" :show-message="false">
  1321. <dict-data-select style="width: 100%" dict-type="plm_customer_information_customer_customer_currency" v-model="againRow.currency1"></dict-data-select>
  1322. </el-form-item>
  1323. </el-col>
  1324. </el-row>
  1325. </el-form>
  1326. <div slot="footer" class="dialog-footer">
  1327. <el-button type="primary" :loading="saveLoading" @click="againQuoteDetail"> </el-button>
  1328. <el-button @click="againVisible = false"> </el-button>
  1329. </div>
  1330. </el-dialog>
  1331. <!-- <part-table v-if="saveVisible" v-model="partVisible" :is-page="true" :part-no="saveQuoteDetail.partNo" @dblclick="handleDblClick"></part-table>-->
  1332. <!-- <project-part-table v-if="saveVisible" v-model="partVisible" :project-no="saveQuoteDetail.projectNo" :part-no="saveQuoteDetail.partNo" @dblclick="handleDblClick"></project-part-table>-->
  1333. </div>
  1334. </template>
  1335. <style scoped>
  1336. .el-table /deep/ .cell{
  1337. height: auto;
  1338. line-height: 1.5;
  1339. }
  1340. .auto /deep/ .el-form-item__content{
  1341. height: auto;
  1342. line-height: 1.5;
  1343. }
  1344. .radio /deep/ .el-radio__label{
  1345. display: none;
  1346. }
  1347. </style>