inspectionProjectReport.vue 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991
  1. <!-- 用户编辑弹窗 -->
  2. <template>
  3. <ele-modal
  4. :title="title + (type == 'detail' ? '详情' : '报工')"
  5. :visible.sync="visible"
  6. :before-close="handleClose"
  7. :close-on-click-modal="false"
  8. :close-on-press-escape="false"
  9. append-to-body
  10. width="80%"
  11. resizable
  12. :maxable="true"
  13. >
  14. <ele-pro-table
  15. :needPage="false"
  16. :columns="workColumns"
  17. :datasource="[form]"
  18. >
  19. <template v-slot:toolbar>
  20. 样品总数:{{ form.workSampleCount }}{{ form.measureUnit }}
  21. </template>
  22. <template v-slot:craftFiles="{ row }">
  23. <el-link type="primary" :underline="false" @click="craftFiles(row)"
  24. >工艺文件</el-link
  25. >
  26. </template>
  27. <template v-slot:isRequired="{ column }">
  28. <span class="is-required">{{ column.label }}</span>
  29. </template>
  30. <template v-slot:qualityType="{ row }">
  31. {{ getDictValue('质检计划类型', row.qualityType) }}
  32. </template>
  33. <template v-slot:qualityMode="{ row }">
  34. {{ getDictValue('取样类型', row.qualityMode) }}
  35. </template>
  36. <template v-slot:hours="{ row }">
  37. <el-input
  38. v-model="row.hours"
  39. placeholder="请输入"
  40. type="number"
  41. :disabled="type == 'detail'"
  42. >
  43. </el-input>
  44. </template>
  45. <template v-slot:accessory="{ row }">
  46. <fileMain v-model="row.accessory" type="view"></fileMain>
  47. </template>
  48. <template v-slot:sampleQuantity="{ row }">
  49. <el-input
  50. v-model="row.sampleQuantity"
  51. placeholder="请输入"
  52. type="number"
  53. @input="formSampleQuantityChange"
  54. :disabled="type == 'detail'"
  55. >
  56. <template slot="append">{{ form.measureUnit }}</template>
  57. </el-input>
  58. </template>
  59. <template v-slot:sampleNoQualifiedNumber="{ row }">
  60. <el-input
  61. v-model="row.sampleNoQualifiedNumber"
  62. @input="formSampleNoQualifiedNumberChange"
  63. placeholder="请输入"
  64. type="number"
  65. :disabled="type == 'detail'"
  66. >
  67. <template slot="append">{{ form.measureUnit }}</template>
  68. </el-input>
  69. </template>
  70. </ele-pro-table>
  71. <ele-pro-table
  72. :needPage="false"
  73. :columns="tableColumns"
  74. :datasource="tableData"
  75. >
  76. <template v-slot:toolbar>
  77. <div
  78. style="
  79. display: flex;
  80. justify-content: space-between;
  81. align-items: center;
  82. "
  83. >
  84. <span>
  85. 当前检测剩余样品数:{{ form.sampleQuantity
  86. }}{{ form.measureUnit }}</span
  87. >
  88. <el-button
  89. type="primary"
  90. v-if="type != 'detail'"
  91. @click="handleOneKeyQualified"
  92. style="margin-right: 10px"
  93. >
  94. 一键合格
  95. </el-button>
  96. </div>
  97. </template>
  98. <template v-slot:qualityStandardType="{ row }">
  99. {{ getDictValue('质检标准类型', row.qualityStandardType) }}
  100. </template>
  101. <template v-slot:executionMethod="{ row }">
  102. <el-select
  103. v-model="row.executionMethod"
  104. style="width: 100%"
  105. :disabled="type == 'detail' || !!row.experimentCode"
  106. >
  107. <el-option :value="1" label="常规检验"></el-option>
  108. <el-option :value="2" label="实验"></el-option>
  109. </el-select>
  110. </template>
  111. <template v-slot:useTools="{ row }">
  112. <toolButtom v-model="row.useTools" :type="type" :sList="row.toolList" />
  113. </template>
  114. <template v-slot:qualityResultContent="{ row }">
  115. <el-input
  116. v-model="row.qualityResultContent"
  117. placeholder="请输入内容"
  118. :disabled="type == 'detail'"
  119. @input="handleInput(row, row.qualityResultContent)"
  120. >
  121. <template slot="append" v-if="row.unitName">
  122. {{ row.unitName }}
  123. </template>
  124. </el-input>
  125. </template>
  126. <template v-slot:sampleQuantity="{ row, $index }">
  127. <el-input
  128. v-model="row.sampleQuantity"
  129. placeholder="请输入"
  130. :disabled="type == 'detail'"
  131. type="number"
  132. @input="inputValue('sampleQuantity', row, $index)"
  133. >
  134. <template slot="append">{{ form.measureUnit }}</template>
  135. </el-input>
  136. </template>
  137. <template v-slot:qualifiedQuantity="{ row, $index }">
  138. <el-input
  139. v-model="row.qualifiedQuantity"
  140. placeholder="请输入"
  141. :disabled="type == 'detail'"
  142. type="number"
  143. @input="inputValue('qualifiedQuantity', row, $index)"
  144. >
  145. <template slot="append">{{ form.measureUnit }}</template>
  146. </el-input>
  147. </template>
  148. <template v-slot:noQualifiedQuantity="{ row, $index }">
  149. <el-input
  150. v-model="row.noQualifiedQuantity"
  151. placeholder="请输入"
  152. :disabled="type == 'detail'"
  153. type="number"
  154. @input="inputValue('noQualifiedQuantity', row, $index)"
  155. >
  156. <template slot="append">{{ form.measureUnit }}</template>
  157. </el-input>
  158. </template>
  159. <template v-slot:lossNumber="{ row, $index }">
  160. <el-input
  161. v-model="row.lossNumber"
  162. placeholder="请输入"
  163. :disabled="type == 'detail'"
  164. type="number"
  165. @input="inputValue('lossNumber', row, $index)"
  166. @click.native="curretNum = row.lossNumber"
  167. >
  168. <template slot="append">{{ form.measureUnit }}</template>
  169. </el-input>
  170. </template>
  171. <template v-slot:lossNumberUnqualified="{ row, $index }">
  172. <el-input
  173. v-model="row.lossNumberUnqualified"
  174. placeholder="请输入"
  175. :disabled="type == 'detail'"
  176. type="number"
  177. @input="inputValue('lossNumberUnqualified', row, $index)"
  178. @click.native="curretNum = row.lossNumberUnqualified"
  179. >
  180. <template slot="append">{{ form.measureUnit }}</template>
  181. </el-input>
  182. </template>
  183. <template v-slot:retainedSampleQuantity="{ row, $index }">
  184. <el-input
  185. v-model="row.retainedSampleQuantity"
  186. placeholder="请输入"
  187. :disabled="type == 'detail'"
  188. type="number"
  189. @input="inputValue('retainedSampleQuantity', row, $index)"
  190. @click.native="curretNum = row.retainedSampleQuantity"
  191. >
  192. <template slot="append">{{ form.measureUnit }}</template>
  193. </el-input>
  194. </template>
  195. <template v-slot:retainedSampleUnqualified="{ row, $index }">
  196. <el-input
  197. v-model="row.retainedSampleUnqualified"
  198. placeholder="请输入"
  199. :disabled="type == 'detail'"
  200. type="number"
  201. @input="inputValue('retainedSampleUnqualified', row, $index)"
  202. @click.native="curretNum = row.retainedSampleUnqualified"
  203. >
  204. <template slot="append">{{ form.measureUnit }}</template>
  205. </el-input>
  206. </template>
  207. <template v-slot:qualityResults="{ row, $index }">
  208. <el-select
  209. v-model="row.qualityResults"
  210. placeholder="请选择"
  211. style="width: 100%"
  212. :disabled="type == 'detail'"
  213. >
  214. <el-option
  215. v-for="item in qualityResultsList"
  216. :key="item.value"
  217. :label="item.label"
  218. :value="item.value"
  219. >
  220. </el-option>
  221. </el-select>
  222. </template>
  223. <template v-slot:inspectImage="{ row, $index }">
  224. <fileMain
  225. v-model="row.inspectImage"
  226. :type="type == 'detail' ? 'view' : 'add'"
  227. ></fileMain>
  228. </template>
  229. <template v-slot:imgUrl="{ row, $index }">
  230. <fileMain v-model="row.imgUrl" type="view"></fileMain>
  231. </template>
  232. <template v-slot:defaultValue="{ row }">
  233. <div style="display: flex; justify-content: center; color: #409eff">
  234. <span v-if="row.textType != 8">{{ row.symbol }}</span>
  235. <span v-if="row.textType == 3">
  236. {{ row.minValue }}-{{ row.maxValue }}
  237. </span>
  238. <span v-else-if="row.textType == 8">
  239. 标准值:{{ row.defaultValue }}{{ row.unitName || '' }} 下限:{{
  240. row.minValue || 0
  241. }}{{ row.unitName || '' }} 上限:{{ row.maxValue || 0
  242. }}{{ row.unitName || '' }}
  243. </span>
  244. <span v-else>
  245. <span>{{ row.defaultValue }}</span>
  246. </span>
  247. <span v-if="row.textType != 8">
  248. {{ row.unitName }}
  249. </span>
  250. </div>
  251. </template>
  252. <template v-slot:inspectionName="{ row }">
  253. <span style="color: #409eff">{{ row.inspectionName }}</span>
  254. </template>
  255. <template v-slot:isRequired="{ column }">
  256. <span class="is-required">{{ column.label }}</span>
  257. </template>
  258. <template v-slot:action="{ row }">
  259. <el-link
  260. type="primary"
  261. :underline="false"
  262. @click="experimentReport(row, 'report')"
  263. v-if="row.executionMethod == 2"
  264. >
  265. 实验
  266. </el-link>
  267. </template>
  268. </ele-pro-table>
  269. <template v-slot:footer>
  270. <el-button @click="handleClose">取消</el-button>
  271. <el-button type="primary" @click="handleConfirm" v-if="type != 'detail'">
  272. 确认
  273. </el-button>
  274. </template>
  275. <experimentReport
  276. ref="experimentReport"
  277. @done="experimentReportDone"
  278. :pageName="pageName"
  279. ></experimentReport>
  280. <wokePopup ref="wokePopupRef"></wokePopup>
  281. </ele-modal>
  282. </template>
  283. <script>
  284. import dictMixins from '@/mixins/dictMixins';
  285. import detailMixins from '../mixins/detailMixins';
  286. import toolButtom from './toolButtom.vue';
  287. import experimentReport from './experimentReport.vue';
  288. import { handleInput } from './unit.js';
  289. import {
  290. exeTaskReportWork,
  291. exeEntrustReportWork
  292. } from '@/api/inspectionProjectTask';
  293. import wokePopup from '@/components/workList/wokePopup.vue';
  294. import { parameterGetByCode } from '@/api/main/index';
  295. import { craftFiles, mesCraftFiles } from '@/api/inspectionWork';
  296. export default {
  297. mixins: [dictMixins, detailMixins],
  298. components: { toolButtom, experimentReport, wokePopup },
  299. data() {
  300. return {
  301. handleInput,
  302. type: 'report',
  303. title: '检测项工单',
  304. visible: false,
  305. form: {},
  306. tableData: [],
  307. rowIndex: [],
  308. curretNum: 0,
  309. qms_qualityResultContent: 1,
  310. workColumns: [
  311. {
  312. minWidth: 150,
  313. prop: 'code',
  314. align: 'center',
  315. label: '检测项工单号',
  316. showOverflowTooltip: true
  317. },
  318. {
  319. minWidth: 150,
  320. prop: 'qualityWorkOrderCode',
  321. align: 'center',
  322. label: '检测工单编码',
  323. showOverflowTooltip: true
  324. },
  325. {
  326. minWidth: 150,
  327. prop: 'qualityWorkOrderName',
  328. align: 'center',
  329. label: '检测工单名称',
  330. showOverflowTooltip: true
  331. },
  332. {
  333. minWidth: 150,
  334. prop: 'qualityWorkOrderCode',
  335. align: 'center',
  336. label: '来源单号',
  337. showOverflowTooltip: true
  338. },
  339. {
  340. minWidth: 100,
  341. prop: 'qualityType',
  342. slot: 'qualityType',
  343. align: 'center',
  344. label: '类型',
  345. showOverflowTooltip: true
  346. },
  347. {
  348. minWidth: 100,
  349. slot: 'qualityMode',
  350. prop: 'qualityMode',
  351. align: 'center',
  352. label: '检测方式',
  353. showOverflowTooltip: true
  354. },
  355. {
  356. minWidth: 120,
  357. prop: 'productCode',
  358. align: 'center',
  359. label: '编码',
  360. showOverflowTooltip: true
  361. },
  362. {
  363. minWidth: 120,
  364. prop: 'productName',
  365. align: 'center',
  366. label: '名称',
  367. showOverflowTooltip: true
  368. },
  369. {
  370. minWidth: 100,
  371. prop: 'batchNo',
  372. align: 'center',
  373. label: '批次号',
  374. showOverflowTooltip: true
  375. },
  376. {
  377. minWidth: 120,
  378. prop: 'specification',
  379. align: 'center',
  380. label: '规格',
  381. showOverflowTooltip: true
  382. },
  383. {
  384. minWidth: 100,
  385. prop: 'brandNo',
  386. align: 'center',
  387. label: '牌号',
  388. showOverflowTooltip: true
  389. },
  390. {
  391. minWidth: 120,
  392. prop: 'produceTaskName',
  393. align: 'center',
  394. label: '工序名称',
  395. showOverflowTooltip: true
  396. },
  397. {
  398. minWidth: 120,
  399. prop: 'total',
  400. align: 'center',
  401. label: '总数量',
  402. formatter: (row) => {
  403. if (row.total) {
  404. return row.total + this.form.measureUnit || '';
  405. }
  406. },
  407. showOverflowTooltip: true
  408. },
  409. {
  410. minWidth: 180,
  411. prop: 'sampleQuantity',
  412. headerSlot: 'isRequired',
  413. slot: 'sampleQuantity',
  414. align: 'center',
  415. label: '样品数',
  416. showOverflowTooltip: true
  417. },
  418. {
  419. minWidth: 180,
  420. prop: 'sampleNoQualifiedNumber',
  421. slot: 'sampleNoQualifiedNumber',
  422. align: 'center',
  423. label: '样品不合格数',
  424. showOverflowTooltip: true
  425. },
  426. {
  427. minWidth: 140,
  428. prop: 'sampleQualifiedNumber',
  429. headerSlot: 'isRequired',
  430. slot: 'sampleQualifiedNumber',
  431. align: 'center',
  432. formatter: (row) => {
  433. if (row.sampleQualifiedNumber) {
  434. return (
  435. row.sampleQualifiedNumber + (this.form.measureUnit || '')
  436. );
  437. }
  438. },
  439. label: '样品合格数',
  440. showOverflowTooltip: true
  441. },
  442. {
  443. minWidth: 140,
  444. prop: 'lossNumber',
  445. slot: 'lossNumber',
  446. align: 'center',
  447. formatter: (row) => {
  448. if (row.lossNumber) {
  449. return row.lossNumber + (this.form.measureUnit || '');
  450. }
  451. },
  452. label: '损耗数(合格品)',
  453. showOverflowTooltip: true
  454. },
  455. {
  456. minWidth: 140,
  457. prop: 'lossNumberUnqualified',
  458. slot: 'lossNumberUnqualified',
  459. align: 'center',
  460. formatter: (row) => {
  461. if (row.lossNumberUnqualified) {
  462. return (
  463. row.lossNumberUnqualified + (this.form.measureUnit || '')
  464. );
  465. }
  466. },
  467. label: '损耗数(不合格品)',
  468. showOverflowTooltip: true
  469. },
  470. {
  471. minWidth: 140,
  472. prop: 'retainedSampleQuantity',
  473. slot: 'retainedSampleQuantity',
  474. align: 'center',
  475. formatter: (row) => {
  476. if (row.retainedSampleQuantity) {
  477. return (
  478. row.retainedSampleQuantity + (this.form.measureUnit || '')
  479. );
  480. }
  481. },
  482. label: '留样数(合格品)',
  483. showOverflowTooltip: true
  484. },
  485. {
  486. minWidth: 140,
  487. prop: 'retainedSampleUnqualified',
  488. slot: 'retainedSampleUnqualified',
  489. align: 'center',
  490. formatter: (row) => {
  491. if (row.retainedSampleUnqualified) {
  492. return (
  493. row.retainedSampleUnqualified + (this.form.measureUnit || '')
  494. );
  495. }
  496. },
  497. label: '留样数(不合格品)',
  498. showOverflowTooltip: true
  499. },
  500. {
  501. minWidth: 120,
  502. prop: 'hours',
  503. slot: 'hours',
  504. align: 'center',
  505. label: '工时',
  506. showOverflowTooltip: true
  507. },
  508. {
  509. minWidth: 120,
  510. prop: 'accessory',
  511. slot: 'accessory',
  512. align: 'center',
  513. label: '附件',
  514. showOverflowTooltip: true
  515. },
  516. {
  517. minWidth: 120,
  518. prop: 'qualityNames',
  519. slot: 'qualityNames',
  520. align: 'center',
  521. label: '检测人',
  522. showOverflowTooltip: true
  523. },
  524. {
  525. minWidth: 120,
  526. prop: 'qualityTimeEnd',
  527. slot: 'qualityTimeEnd',
  528. align: 'center',
  529. label: '检测时间',
  530. showOverflowTooltip: true
  531. },
  532. {
  533. minWidth: 120,
  534. prop: 'craftFiles',
  535. slot: 'craftFiles',
  536. align: 'center',
  537. label: '工艺文件',
  538. fixed: 'right',
  539. showOverflowTooltip: true
  540. }
  541. ],
  542. qualityResultsList: [
  543. {
  544. value: 1,
  545. label: '合格'
  546. },
  547. {
  548. value: 2,
  549. label: '不合格'
  550. },
  551. {
  552. value: 3,
  553. label: '让步接收'
  554. }
  555. ],
  556. sList: [], //质检工具筛选
  557. pageName: ''
  558. };
  559. },
  560. computed: {
  561. tableColumns() {
  562. return [
  563. {
  564. width: 45,
  565. type: 'index',
  566. columnKey: 'index',
  567. align: 'center',
  568. fixed: 'left'
  569. },
  570. {
  571. minWidth: 150,
  572. prop: 'qualitySchemeTemplateCode',
  573. align: 'center',
  574. label: '检测方案编码',
  575. showOverflowTooltip: true
  576. },
  577. {
  578. minWidth: 120,
  579. prop: 'qualitySchemeTemplateName',
  580. align: 'center',
  581. label: '检测方案名称',
  582. showOverflowTooltip: true
  583. },
  584. {
  585. minWidth: 100,
  586. prop: 'categoryLevelClassName',
  587. align: 'center',
  588. label: '检测类型',
  589. showOverflowTooltip: true
  590. },
  591. {
  592. minWidth: 130,
  593. prop: 'inspectionCode',
  594. align: 'center',
  595. label: '检测项编码',
  596. showOverflowTooltip: true
  597. },
  598. {
  599. minWidth: 120,
  600. prop: 'inspectionName',
  601. slot: 'inspectionName',
  602. align: 'center',
  603. label: '检测项名称',
  604. showOverflowTooltip: true
  605. },
  606. {
  607. minWidth: 100,
  608. prop: 'qualityStandardType',
  609. slot: 'qualityStandardType',
  610. align: 'center',
  611. label: '执行标准',
  612. showOverflowTooltip: true
  613. },
  614. {
  615. minWidth: 320,
  616. slot: 'defaultValue',
  617. prop: 'defaultValue',
  618. align: 'center',
  619. label: '工艺参数',
  620. showOverflowTooltip: true
  621. },
  622. {
  623. minWidth: 130,
  624. prop: 'executionMethod',
  625. slot: 'executionMethod',
  626. align: 'center',
  627. label: '执行方法',
  628. showOverflowTooltip: true
  629. },
  630. {
  631. minWidth: 100,
  632. prop: 'useTools',
  633. slot: 'useTools',
  634. align: 'center',
  635. label: '检测工具',
  636. showOverflowTooltip: true
  637. },
  638. {
  639. minWidth: 200,
  640. prop: 'qualityResultContent',
  641. align: 'center',
  642. slot: 'qualityResultContent',
  643. headerSlot: this.qms_qualityResultContent == 1 ? 'isRequired' : '',
  644. label: '检测内容',
  645. showOverflowTooltip: true
  646. },
  647. {
  648. minWidth: 180,
  649. prop: 'sampleQuantity',
  650. slot: 'sampleQuantity',
  651. headerSlot: 'isRequired',
  652. align: 'center',
  653. label: '样品数',
  654. showOverflowTooltip: true
  655. },
  656. {
  657. minWidth: 180,
  658. prop: 'qualifiedQuantity',
  659. align: 'center',
  660. slot: 'qualifiedQuantity',
  661. label: '合格数',
  662. showOverflowTooltip: true
  663. },
  664. {
  665. minWidth: 180,
  666. prop: 'noQualifiedQuantity',
  667. slot: 'noQualifiedQuantity',
  668. align: 'center',
  669. label: '不合格数',
  670. showOverflowTooltip: true
  671. },
  672. {
  673. minWidth: 180,
  674. prop: 'lossNumber',
  675. slot: 'lossNumber',
  676. align: 'center',
  677. label: '损耗数(合格品)',
  678. showOverflowTooltip: true
  679. },
  680. {
  681. minWidth: 180,
  682. prop: 'lossNumberUnqualified',
  683. slot: 'lossNumberUnqualified',
  684. align: 'center',
  685. label: '损耗数(不合格品)',
  686. showOverflowTooltip: true
  687. },
  688. {
  689. minWidth: 180,
  690. prop: 'retainedSampleQuantity',
  691. slot: 'retainedSampleQuantity',
  692. align: 'center',
  693. label: '留样数(合格品)',
  694. showOverflowTooltip: true
  695. },
  696. {
  697. minWidth: 180,
  698. prop: 'retainedSampleUnqualified',
  699. slot: 'retainedSampleUnqualified',
  700. align: 'center',
  701. label: '留样数(不合格品)',
  702. showOverflowTooltip: true
  703. },
  704. {
  705. minWidth: 130,
  706. prop: 'qualityResults',
  707. slot: 'qualityResults',
  708. align: 'center',
  709. label: '检测结果',
  710. showOverflowTooltip: true,
  711. fixed: 'right'
  712. },
  713. {
  714. minWidth: 150,
  715. prop: 'experimentCode',
  716. align: 'center',
  717. label: '实验编号',
  718. showOverflowTooltip: true
  719. },
  720. {
  721. minWidth: 120,
  722. prop: 'inspectImage',
  723. slot: 'inspectImage',
  724. align: 'center',
  725. label: '检验图片',
  726. showOverflowTooltip: true
  727. },
  728. {
  729. minWidth: 100,
  730. prop: 'imgUrl',
  731. slot: 'imgUrl',
  732. align: 'center',
  733. label: '附件',
  734. showOverflowTooltip: true
  735. },
  736. {
  737. columnKey: 'action',
  738. label: '操作',
  739. width: 120,
  740. align: 'center',
  741. resizable: false,
  742. slot: 'action',
  743. showOverflowTooltip: true,
  744. fixed: 'right'
  745. }
  746. ];
  747. },
  748. getSampleQuantityCount() {
  749. return this.form.sampleQuantity;
  750. }
  751. },
  752. created() {
  753. this.requestDict('质检计划类型');
  754. this.requestDict('取样类型');
  755. this.requestDict('质检标准类型');
  756. parameterGetByCode({
  757. code: 'qms_qualityResultContent'
  758. }).then((res) => {
  759. this.qms_qualityResultContent = res?.value;
  760. });
  761. },
  762. methods: {
  763. async craftFiles(row) {
  764. const res = await parameterGetByCode({
  765. code: 'mes_craft_file_by_category_code'
  766. });
  767. const byCategory = res?.value === '1';
  768. if (byCategory) {
  769. this.$refs.wokePopupRef.openTwo(row);
  770. } else {
  771. const data = row.qualityWorkOrderId
  772. ? await craftFiles(row.qualityWorkOrderId)
  773. : await mesCraftFiles({
  774. taskId: row.produceTaskId,
  775. workOrderId: row.mesWorkOrderId,
  776. productCode: row.productCode
  777. });
  778. this.$refs.wokePopupRef.open(data.map((item) => item.id));
  779. }
  780. },
  781. experimentReport(row, type) {
  782. console.log(this.getSampleQuantityCount, 'this.form');
  783. this.$refs.experimentReport.open(
  784. {
  785. ...row,
  786. batchNo: this.form.batchNo,
  787. qualityWorkOrderId: this.form.qualityWorkOrderId,
  788. getSampleQuantityCount: this.form.sampleQuantity
  789. },
  790. type
  791. );
  792. },
  793. experimentReportDone(data) {
  794. console.log(data);
  795. let index = this.tableData.findIndex((item) => item.id == data.id);
  796. this.$set(this.tableData, index, data);
  797. console.log(this.tableData);
  798. // this.initData();
  799. },
  800. async open({ workData, row, list }, type, pageName) {
  801. this.tableData = [];
  802. this.pageName = pageName;
  803. this.type = type;
  804. if (pageName == 'inspectionProjectTask') {
  805. this.title = '检测项任务单';
  806. }
  807. if (pageName == 'inspectionProjectRequest') {
  808. this.title = '检测项受托单';
  809. }
  810. if (type == 'report') {
  811. let data = { ...row, ...workData };
  812. console.log(data, workData);
  813. data.sampleQuantity = row.sampleQuantity || data.workSampleCount;
  814. data.sampleNoQualifiedNumber = row.sampleNoQualifiedNumber || 0;
  815. data.sampleQualifiedNumber =
  816. row.sampleQualifiedNumber ||
  817. data.sampleQuantity - data.sampleNoQualifiedNumber ||
  818. 0;
  819. this.$set(this, 'form', JSON.parse(JSON.stringify(data)));
  820. console.log(this.form, 'this.form');
  821. this.tableData = JSON.parse(JSON.stringify(list));
  822. this.tableData.forEach((item, index) => {
  823. if (item.experimentCode) {
  824. this.$set(this.tableData[index], 'executionMethod', 2);
  825. }
  826. this.$set(
  827. this.tableData[index],
  828. 'executionMethod',
  829. item.executionMethod || 1
  830. );
  831. });
  832. // if (row.sampleQuantity) {
  833. // this.form.remainingSampleCount =
  834. // Number(row.sampleQuantity) +
  835. // Number(this.form.remainingSampleCount);
  836. // }
  837. } else {
  838. this.$set(this, 'form', JSON.parse(JSON.stringify(workData)));
  839. this.$set(
  840. this.form,
  841. 'sampleNoQualifiedNumber',
  842. this.form.sampleNoQualifiedNumber || 0
  843. );
  844. this.$set(
  845. this.form,
  846. 'sampleQualifiedNumber',
  847. this.form.sampleQualifiedNumber ||
  848. this.form.sampleQuantity - this.form.sampleNoQualifiedNumber ||
  849. 0
  850. );
  851. this.tableData = JSON.parse(JSON.stringify(list));
  852. // if (this.form.qualityWorkOrderId) {
  853. // this.form.remainingSampleCount =
  854. // this.form.sampleQuantity + this.form.remainingSampleCount;
  855. // }
  856. }
  857. this.visible = true;
  858. },
  859. handleOneKeyQualified() {
  860. this.tableData.forEach((item, index) => {
  861. this.$set(this.tableData[index], 'qualityResults', 1);
  862. });
  863. },
  864. formSampleQuantityChange() {
  865. if (this.form.sampleQuantity < 0) {
  866. this.form.sampleQuantity = 0;
  867. }
  868. if (this.form.sampleQuantity > this.form.workSampleCount) {
  869. this.form.sampleQuantity = this.form.workSampleCount;
  870. }
  871. if (
  872. this.form.sampleQuantity <
  873. Math.max(...this.tableData.map((item) => item.sampleQuantity))
  874. ) {
  875. this.tableData.forEach((item, index) => {
  876. this.resetData(item, index, [
  877. 'qualifiedQuantity',
  878. 'noQualifiedQuantity',
  879. 'sampleQuantity'
  880. ]);
  881. });
  882. }
  883. this.form.sampleQualifiedNumber = this.form.sampleQuantity;
  884. this.form.sampleNoQualifiedNumber = 0;
  885. },
  886. formSampleNoQualifiedNumberChange() {
  887. if (+this.form.sampleNoQualifiedNumber < 0) {
  888. this.form.sampleNoQualifiedNumber = 0;
  889. }
  890. if (+this.form.sampleNoQualifiedNumber > this.form.sampleQuantity) {
  891. this.form.sampleNoQualifiedNumber = this.form.sampleQuantity;
  892. }
  893. this.form.sampleQualifiedNumber =
  894. this.form.sampleQuantity - this.form.sampleNoQualifiedNumber;
  895. },
  896. handleClose() {
  897. this.visible = false;
  898. if (this.$refs.wokePopupRef) {
  899. this.$refs.wokePopupRef.visible = false;
  900. }
  901. },
  902. handleConfirm() {
  903. let isHandleConfirm = false;
  904. if (!this.form.sampleQuantity) {
  905. return this.$message.error('样品数不能为空!');
  906. }
  907. this.tableData.forEach((item, index) => {
  908. item.status = 1;
  909. if (!item.qualityResultContent) {
  910. isHandleConfirm = true;
  911. }
  912. });
  913. if (!this.pageName) {
  914. this.$emit('success', { data: this.form, tableData: this.tableData });
  915. this.visible = false;
  916. } else {
  917. if (isHandleConfirm && this.qms_qualityResultContent == 1) {
  918. return this.$message.error('检测内容不能为空!');
  919. }
  920. let api =
  921. this.pageName == 'inspectionProjectTask'
  922. ? exeTaskReportWork
  923. : exeEntrustReportWork;
  924. api({
  925. ...this.form,
  926. templateList: this.tableData
  927. }).then((res) => {
  928. this.$message.success('操作成功');
  929. this.$emit('reload');
  930. this.visible = false;
  931. });
  932. }
  933. },
  934. inputValue(type, item, index) {
  935. if (item[type] < 0) {
  936. item[type] = 0;
  937. }
  938. //样品数
  939. if (type == 'sampleQuantity') {
  940. this.isSampleQuantity(item, index);
  941. }
  942. //样品合格数、不合格数
  943. if (type == 'qualifiedQuantity' || type == 'noQualifiedQuantity') {
  944. this.isQualifiedQuantity(item, index, type);
  945. if (type == 'noQualifiedQuantity' && item[type] > 0) {
  946. this.$set(this.tableData[index], 'qualityResults', 2);
  947. }
  948. }
  949. //损耗数
  950. if (type == 'lossNumber' || type == 'lossNumberUnqualified') {
  951. this.setNumber(item, index, type, '损耗', 'lossNumber');
  952. }
  953. //留样数
  954. if (
  955. type == 'retainedSampleQuantity' ||
  956. type == 'retainedSampleUnqualified'
  957. ) {
  958. this.setNumber(item, index, type, '留样', 'retainedSampleQuantity');
  959. }
  960. }
  961. }
  962. };
  963. </script>
  964. <style scoped lang="scss">
  965. ::v-deep .warn {
  966. color: red;
  967. .el-input__inner {
  968. color: red;
  969. }
  970. }
  971. </style>