inspectionProjectReportView.vue 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760
  1. <!-- 用户编辑弹窗 -->
  2. <template>
  3. <div>
  4. <ele-pro-table
  5. :needPage="false"
  6. :columns="workColumns"
  7. :datasource="[form]"
  8. >
  9. <template v-slot:craftFiles="{ row }">
  10. <el-link type="primary" :underline="false" @click="craftFiles(row)"
  11. >工艺文件</el-link
  12. >
  13. </template>
  14. <template v-slot:isRequired="{ column }">
  15. <span class="is-required">{{ column.label }}</span>
  16. </template>
  17. <template v-slot:qualityType="{ row }">
  18. {{ getDictValue('质检计划类型', row.qualityType) }}
  19. </template>
  20. <template v-slot:qualityMode="{ row }">
  21. {{ getDictValue('取样类型', row.qualityMode) }}
  22. </template>
  23. <template v-slot:hours="{ row }">
  24. <el-input
  25. v-model="row.hours"
  26. placeholder="请输入"
  27. type="number"
  28. disabled
  29. >
  30. </el-input>
  31. </template>
  32. <template v-slot:accessory="{ row }">
  33. <fileMain v-model="row.accessory" type="view"></fileMain>
  34. </template>
  35. <template v-slot:sampleQuantity="{ row }">
  36. <el-input
  37. v-model="row.sampleQuantity"
  38. placeholder="请输入"
  39. type="number"
  40. disabled
  41. >
  42. <template slot="append">{{ form.measureUnit }}</template>
  43. </el-input>
  44. </template>
  45. <template v-slot:sampleNoQualifiedNumber="{ row }">
  46. <el-input
  47. v-model="row.sampleNoQualifiedNumber"
  48. placeholder="请输入"
  49. type="number"
  50. disabled
  51. >
  52. <template slot="append">{{ form.measureUnit }}</template>
  53. </el-input>
  54. </template>
  55. </ele-pro-table>
  56. <ele-pro-table
  57. :needPage="false"
  58. :columns="tableColumns"
  59. :datasource="tableData"
  60. >
  61. <template v-slot:qualityStandardType="{ row }">
  62. {{ getDictValue('质检标准类型', row.qualityStandardType) }}
  63. </template>
  64. <template v-slot:executionMethod="{ row }">
  65. <el-select v-model="row.executionMethod" style="width: 100%" disabled>
  66. <el-option :value="1" label="常规检验"></el-option>
  67. <el-option :value="2" label="实验"></el-option>
  68. </el-select>
  69. </template>
  70. <template v-slot:useTools="{ row }">
  71. <toolButtom v-model="row.useTools" :type="type" :sList="row.toolList" />
  72. </template>
  73. <template v-slot:qualityResultContent="{ row }">
  74. <el-input
  75. v-model="row.qualityResultContent"
  76. placeholder="请输入内容"
  77. disabled
  78. >
  79. <template slot="append" v-if="row.unitName">
  80. {{ row.unitName }}
  81. </template>
  82. </el-input>
  83. </template>
  84. <template v-slot:sampleQuantity="{ row, $index }">
  85. <el-input
  86. v-model="row.sampleQuantity"
  87. placeholder="请输入"
  88. disabled
  89. type="number"
  90. >
  91. <template slot="append">{{ form.measureUnit }}</template>
  92. </el-input>
  93. </template>
  94. <template v-slot:qualifiedQuantity="{ row, $index }">
  95. <el-input
  96. v-model="row.qualifiedQuantity"
  97. placeholder="请输入"
  98. disabled
  99. type="number"
  100. >
  101. <template slot="append">{{ form.measureUnit }}</template>
  102. </el-input>
  103. </template>
  104. <template v-slot:noQualifiedQuantity="{ row, $index }">
  105. <el-input
  106. v-model="row.noQualifiedQuantity"
  107. placeholder="请输入"
  108. disabled
  109. type="number"
  110. >
  111. <template slot="append">{{ form.measureUnit }}</template>
  112. </el-input>
  113. </template>
  114. <template v-slot:lossNumber="{ row, $index }">
  115. <el-input
  116. v-model="row.lossNumber"
  117. placeholder="请输入"
  118. disabled
  119. type="number"
  120. >
  121. <template slot="append">{{ form.measureUnit }}</template>
  122. </el-input>
  123. </template>
  124. <template v-slot:lossNumberUnqualified="{ row, $index }">
  125. <el-input
  126. v-model="row.lossNumberUnqualified"
  127. placeholder="请输入"
  128. disabled
  129. type="number"
  130. >
  131. <template slot="append">{{ form.measureUnit }}</template>
  132. </el-input>
  133. </template>
  134. <template v-slot:retainedSampleQuantity="{ row, $index }">
  135. <el-input
  136. v-model="row.retainedSampleQuantity"
  137. placeholder="请输入"
  138. disabled
  139. type="number"
  140. >
  141. <template slot="append">{{ form.measureUnit }}</template>
  142. </el-input>
  143. </template>
  144. <template v-slot:retainedSampleUnqualified="{ row, $index }">
  145. <el-input
  146. v-model="row.retainedSampleUnqualified"
  147. placeholder="请输入"
  148. disabled
  149. type="number"
  150. >
  151. <template slot="append">{{ form.measureUnit }}</template>
  152. </el-input>
  153. </template>
  154. <template v-slot:qualityResults="{ row, $index }">
  155. <el-select
  156. v-model="row.qualityResults"
  157. placeholder="请选择"
  158. style="width: 100%"
  159. disabled
  160. >
  161. <el-option
  162. v-for="item in qualityResultsList"
  163. :key="item.value"
  164. :label="item.label"
  165. :value="item.value"
  166. >
  167. </el-option>
  168. </el-select>
  169. </template>
  170. <template v-slot:inspectImage="{ row, $index }">
  171. <fileMain v-model="row.inspectImage" type="view"></fileMain>
  172. </template>
  173. <template v-slot:imgUrl="{ row, $index }">
  174. <fileMain v-model="row.imgUrl" type="view"></fileMain>
  175. </template>
  176. <template v-slot:defaultValue="{ row }">
  177. <div style="display: flex; justify-content: center; color: #409eff">
  178. <span v-if="row.textType != 8">{{ row.symbol }}</span>
  179. <span v-if="row.textType == 3">
  180. {{ row.minValue }}-{{ row.maxValue }}
  181. </span>
  182. <span v-else-if="row.textType == 8">
  183. 标准值:{{ row.defaultValue }}{{ row.unitName || '' }} 下限:{{
  184. row.minValue || 0
  185. }}{{ row.unitName || '' }} 上限:{{ row.maxValue || 0
  186. }}{{ row.unitName || '' }}
  187. </span>
  188. <span v-else>
  189. <span>{{ row.defaultValue }}</span>
  190. </span>
  191. <span v-if="row.textType != 8">
  192. {{ row.unitName }}
  193. </span>
  194. </div>
  195. </template>
  196. <template v-slot:inspectionName="{ row }">
  197. <span style="color: #409eff">{{ row.inspectionName }}</span>
  198. </template>
  199. <template v-slot:isRequired="{ column }">
  200. <span class="is-required">{{ column.label }}</span>
  201. </template>
  202. <template v-slot:action="{ row }">
  203. <el-link
  204. type="primary"
  205. :underline="false"
  206. @click="experimentReport(row, 'view')"
  207. v-if="row.executionMethod == 2"
  208. >
  209. 实验
  210. </el-link>
  211. </template>
  212. </ele-pro-table>
  213. <experimentReport
  214. ref="experimentReport"
  215. @done="experimentReportDone"
  216. :pageName="pageName"
  217. ></experimentReport>
  218. <wokePopup ref="wokePopupRef"></wokePopup>
  219. </div>
  220. </template>
  221. <script>
  222. import dictMixins from '@/mixins/dictMixins';
  223. import detailMixins from '../mixins/detailMixins';
  224. import toolButtom from './toolButtom.vue';
  225. import experimentReport from './experimentReport.vue';
  226. import wokePopup from '@/components/workList/wokePopup.vue';
  227. import { parameterGetByCode } from '@/api/main/index';
  228. import { craftFiles, mesCraftFiles } from '@/api/inspectionWork';
  229. export default {
  230. mixins: [dictMixins, detailMixins],
  231. components: { toolButtom, experimentReport, wokePopup },
  232. data() {
  233. return {
  234. form: {},
  235. tableData: [],
  236. rowIndex: [],
  237. curretNum: 0,
  238. qms_qualityResultContent: 1,
  239. workColumns: [
  240. {
  241. minWidth: 150,
  242. prop: 'code',
  243. align: 'center',
  244. label: '检测项工单号',
  245. showOverflowTooltip: true
  246. },
  247. {
  248. minWidth: 150,
  249. prop: 'code',
  250. align: 'center',
  251. label: '检测工单编码',
  252. showOverflowTooltip: true
  253. },
  254. {
  255. minWidth: 150,
  256. prop: 'name',
  257. align: 'center',
  258. label: '检测工单名称',
  259. showOverflowTooltip: true
  260. },
  261. {
  262. minWidth: 100,
  263. prop: 'qualityType',
  264. slot: 'qualityType',
  265. align: 'center',
  266. label: '类型',
  267. showOverflowTooltip: true
  268. },
  269. {
  270. minWidth: 100,
  271. slot: 'qualityMode',
  272. prop: 'qualityMode',
  273. align: 'center',
  274. label: '检测方式',
  275. showOverflowTooltip: true
  276. },
  277. {
  278. minWidth: 120,
  279. prop: 'productCode',
  280. align: 'center',
  281. label: '编码',
  282. showOverflowTooltip: true
  283. },
  284. {
  285. minWidth: 120,
  286. prop: 'productName',
  287. align: 'center',
  288. label: '名称',
  289. showOverflowTooltip: true
  290. },
  291. {
  292. minWidth: 100,
  293. prop: 'batchNo',
  294. align: 'center',
  295. label: '批次号',
  296. showOverflowTooltip: true
  297. },
  298. {
  299. minWidth: 120,
  300. prop: 'specification',
  301. align: 'center',
  302. label: '规格',
  303. showOverflowTooltip: true
  304. },
  305. {
  306. minWidth: 100,
  307. prop: 'brandNo',
  308. align: 'center',
  309. label: '牌号',
  310. showOverflowTooltip: true
  311. },
  312. {
  313. minWidth: 120,
  314. prop: 'produceTaskName',
  315. align: 'center',
  316. label: '工序名称',
  317. showOverflowTooltip: true
  318. },
  319. {
  320. minWidth: 120,
  321. prop: 'total',
  322. align: 'center',
  323. label: '总数量',
  324. formatter: (row) => {
  325. if (row.total) {
  326. return row.total + this.form.measureUnit || '';
  327. }
  328. },
  329. showOverflowTooltip: true
  330. },
  331. {
  332. minWidth: 180,
  333. prop: 'sampleQuantity',
  334. headerSlot: 'isRequired',
  335. slot: 'sampleQuantity',
  336. align: 'center',
  337. label: '样品数',
  338. showOverflowTooltip: true
  339. },
  340. {
  341. minWidth: 180,
  342. prop: 'sampleNoQualifiedNumber',
  343. slot: 'sampleNoQualifiedNumber',
  344. align: 'center',
  345. label: '样品不合格数',
  346. showOverflowTooltip: true
  347. },
  348. {
  349. minWidth: 140,
  350. prop: 'sampleQualifiedNumber',
  351. headerSlot: 'isRequired',
  352. slot: 'sampleQualifiedNumber',
  353. align: 'center',
  354. formatter: (row) => {
  355. if (row.sampleQualifiedNumber) {
  356. return (
  357. row.sampleQualifiedNumber + (this.form.measureUnit || '')
  358. );
  359. }
  360. },
  361. label: '样品合格数',
  362. showOverflowTooltip: true
  363. },
  364. {
  365. minWidth: 140,
  366. prop: 'lossNumber',
  367. slot: 'lossNumber',
  368. align: 'center',
  369. formatter: (row) => {
  370. if (row.lossNumber) {
  371. return row.lossNumber + (this.form.measureUnit || '');
  372. }
  373. },
  374. label: '损耗数(合格品)',
  375. showOverflowTooltip: true
  376. },
  377. {
  378. minWidth: 140,
  379. prop: 'lossNumberUnqualified',
  380. slot: 'lossNumberUnqualified',
  381. align: 'center',
  382. formatter: (row) => {
  383. if (row.lossNumberUnqualified) {
  384. return (
  385. row.lossNumberUnqualified + (this.form.measureUnit || '')
  386. );
  387. }
  388. },
  389. label: '损耗数(不合格品)',
  390. showOverflowTooltip: true
  391. },
  392. {
  393. minWidth: 140,
  394. prop: 'retainedSampleQuantity',
  395. slot: 'retainedSampleQuantity',
  396. align: 'center',
  397. formatter: (row) => {
  398. if (row.retainedSampleQuantity) {
  399. return (
  400. row.retainedSampleQuantity + (this.form.measureUnit || '')
  401. );
  402. }
  403. },
  404. label: '留样数(合格品)',
  405. showOverflowTooltip: true
  406. },
  407. {
  408. minWidth: 140,
  409. prop: 'retainedSampleUnqualified',
  410. slot: 'retainedSampleUnqualified',
  411. align: 'center',
  412. formatter: (row) => {
  413. if (row.retainedSampleUnqualified) {
  414. return (
  415. row.retainedSampleUnqualified + (this.form.measureUnit || '')
  416. );
  417. }
  418. },
  419. label: '留样数(不合格品)',
  420. showOverflowTooltip: true
  421. },
  422. {
  423. minWidth: 120,
  424. prop: 'hours',
  425. slot: 'hours',
  426. align: 'center',
  427. label: '工时',
  428. showOverflowTooltip: true
  429. },
  430. {
  431. minWidth: 120,
  432. prop: 'accessory',
  433. slot: 'accessory',
  434. align: 'center',
  435. label: '附件',
  436. showOverflowTooltip: true
  437. },
  438. {
  439. minWidth: 120,
  440. prop: 'qualityNames',
  441. slot: 'qualityNames',
  442. align: 'center',
  443. label: '检测人',
  444. showOverflowTooltip: true
  445. },
  446. {
  447. minWidth: 120,
  448. prop: 'qualityTimeEnd',
  449. slot: 'qualityTimeEnd',
  450. align: 'center',
  451. label: '检测时间',
  452. showOverflowTooltip: true
  453. },
  454. {
  455. minWidth: 120,
  456. prop: 'craftFiles',
  457. slot: 'craftFiles',
  458. align: 'center',
  459. label: '工艺文件',
  460. fixed: 'right',
  461. showOverflowTooltip: true
  462. }
  463. ],
  464. qualityResultsList: [
  465. {
  466. value: 1,
  467. label: '合格'
  468. },
  469. {
  470. value: 2,
  471. label: '不合格'
  472. },
  473. {
  474. value: 3,
  475. label: '让步接收'
  476. }
  477. ],
  478. sList: [] //质检工具筛选
  479. };
  480. },
  481. computed: {
  482. tableColumns() {
  483. return [
  484. {
  485. width: 45,
  486. type: 'index',
  487. columnKey: 'index',
  488. align: 'center',
  489. fixed: 'left'
  490. },
  491. {
  492. minWidth: 150,
  493. prop: 'qualitySchemeTemplateCode',
  494. align: 'center',
  495. label: '检测方案编码',
  496. showOverflowTooltip: true
  497. },
  498. {
  499. minWidth: 120,
  500. prop: 'qualitySchemeTemplateName',
  501. align: 'center',
  502. label: '检测方案名称',
  503. showOverflowTooltip: true
  504. },
  505. {
  506. minWidth: 100,
  507. prop: 'categoryLevelClassName',
  508. align: 'center',
  509. label: '检测类型',
  510. showOverflowTooltip: true
  511. },
  512. {
  513. minWidth: 130,
  514. prop: 'inspectionCode',
  515. align: 'center',
  516. label: '检测项编码',
  517. showOverflowTooltip: true
  518. },
  519. {
  520. minWidth: 120,
  521. prop: 'inspectionName',
  522. slot: 'inspectionName',
  523. align: 'center',
  524. label: '检测项名称',
  525. showOverflowTooltip: true
  526. },
  527. {
  528. minWidth: 100,
  529. prop: 'qualityStandardType',
  530. slot: 'qualityStandardType',
  531. align: 'center',
  532. label: '执行标准',
  533. showOverflowTooltip: true
  534. },
  535. {
  536. minWidth: 320,
  537. slot: 'defaultValue',
  538. prop: 'defaultValue',
  539. align: 'center',
  540. label: '工艺参数',
  541. showOverflowTooltip: true
  542. },
  543. {
  544. minWidth: 130,
  545. prop: 'executionMethod',
  546. slot: 'executionMethod',
  547. align: 'center',
  548. label: '执行方法',
  549. showOverflowTooltip: true
  550. },
  551. {
  552. minWidth: 100,
  553. prop: 'useTools',
  554. slot: 'useTools',
  555. align: 'center',
  556. label: '检测工具',
  557. showOverflowTooltip: true
  558. },
  559. {
  560. minWidth: 200,
  561. prop: 'qualityResultContent',
  562. align: 'center',
  563. slot: 'qualityResultContent',
  564. headerSlot: this.qms_qualityResultContent == 1 ? 'isRequired' : '',
  565. label: '检测内容',
  566. showOverflowTooltip: true
  567. },
  568. {
  569. minWidth: 180,
  570. prop: 'sampleQuantity',
  571. slot: 'sampleQuantity',
  572. headerSlot: 'isRequired',
  573. align: 'center',
  574. label: '样品数',
  575. showOverflowTooltip: true
  576. },
  577. {
  578. minWidth: 180,
  579. prop: 'qualifiedQuantity',
  580. align: 'center',
  581. slot: 'qualifiedQuantity',
  582. label: '合格数',
  583. showOverflowTooltip: true
  584. },
  585. {
  586. minWidth: 180,
  587. prop: 'noQualifiedQuantity',
  588. slot: 'noQualifiedQuantity',
  589. align: 'center',
  590. label: '不合格数',
  591. showOverflowTooltip: true
  592. },
  593. {
  594. minWidth: 180,
  595. prop: 'lossNumber',
  596. slot: 'lossNumber',
  597. align: 'center',
  598. label: '损耗数(合格品)',
  599. showOverflowTooltip: true
  600. },
  601. {
  602. minWidth: 180,
  603. prop: 'lossNumberUnqualified',
  604. slot: 'lossNumberUnqualified',
  605. align: 'center',
  606. label: '损耗数(不合格品)',
  607. showOverflowTooltip: true
  608. },
  609. {
  610. minWidth: 180,
  611. prop: 'retainedSampleQuantity',
  612. slot: 'retainedSampleQuantity',
  613. align: 'center',
  614. label: '留样数(合格品)',
  615. showOverflowTooltip: true
  616. },
  617. {
  618. minWidth: 180,
  619. prop: 'retainedSampleUnqualified',
  620. slot: 'retainedSampleUnqualified',
  621. align: 'center',
  622. label: '留样数(不合格品)',
  623. showOverflowTooltip: true
  624. },
  625. {
  626. minWidth: 130,
  627. prop: 'qualityResults',
  628. slot: 'qualityResults',
  629. align: 'center',
  630. label: '检测结果',
  631. showOverflowTooltip: true,
  632. fixed: 'right'
  633. },
  634. {
  635. minWidth: 150,
  636. prop: 'experimentCode',
  637. align: 'center',
  638. label: '实验编号',
  639. showOverflowTooltip: true
  640. },
  641. {
  642. minWidth: 120,
  643. prop: 'inspectImage',
  644. slot: 'inspectImage',
  645. align: 'center',
  646. label: '检验图片',
  647. showOverflowTooltip: true
  648. },
  649. {
  650. minWidth: 100,
  651. prop: 'imgUrl',
  652. slot: 'imgUrl',
  653. align: 'center',
  654. label: '附件',
  655. showOverflowTooltip: true
  656. },
  657. {
  658. columnKey: 'action',
  659. label: '操作',
  660. width: 120,
  661. align: 'center',
  662. resizable: false,
  663. slot: 'action',
  664. showOverflowTooltip: true,
  665. fixed: 'right'
  666. }
  667. ];
  668. },
  669. getSampleQuantityCount() {
  670. return this.form.sampleQuantity;
  671. }
  672. },
  673. created() {
  674. this.requestDict('质检计划类型');
  675. this.requestDict('取样类型');
  676. this.requestDict('质检标准类型');
  677. parameterGetByCode({
  678. code: 'qms_qualityResultContent'
  679. }).then((res) => {
  680. this.qms_qualityResultContent = res?.value;
  681. });
  682. },
  683. methods: {
  684. async craftFiles(row) {
  685. const res = await parameterGetByCode({
  686. code: 'mes_craft_file_by_category_code'
  687. });
  688. const byCategory = res?.value === '1';
  689. if (byCategory) {
  690. this.$refs.wokePopupRef.openTwo(row);
  691. } else {
  692. const data = row.qualityWorkOrderId
  693. ? await craftFiles(row.qualityWorkOrderId)
  694. : await mesCraftFiles({
  695. taskId: row.produceTaskId,
  696. workOrderId: row.mesWorkOrderId,
  697. productCode: row.productCode
  698. });
  699. this.$refs.wokePopupRef.open(data.map((item) => item.id));
  700. }
  701. },
  702. experimentReport(row, type) {
  703. this.$refs.experimentReport.open(
  704. {
  705. ...row,
  706. batchNo: this.form.batchNo,
  707. qualityWorkOrderId: this.form.qualityWorkOrderId,
  708. getSampleQuantityCount: this.form.sampleQuantity
  709. },
  710. type
  711. );
  712. },
  713. async init({ workData, list }) {
  714. this.tableData = [];
  715. this.$set(this, 'form', JSON.parse(JSON.stringify(workData)));
  716. this.$set(
  717. this.form,
  718. 'sampleNoQualifiedNumber',
  719. this.form.sampleNoQualifiedNumber || 0
  720. );
  721. this.$set(
  722. this.form,
  723. 'sampleQualifiedNumber',
  724. this.form.sampleQualifiedNumber ||
  725. this.form.sampleQuantity - this.form.sampleNoQualifiedNumber ||
  726. 0
  727. );
  728. this.tableData = JSON.parse(JSON.stringify(list));
  729. }
  730. }
  731. };
  732. </script>
  733. <style scoped lang="scss">
  734. ::v-deep .warn {
  735. color: red;
  736. .el-input__inner {
  737. color: red;
  738. }
  739. }
  740. </style>