inspection_report5.vue 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407
  1. <template>
  2. <div id="printSection" style="padding: 20px; background-color: white">
  3. <h2 style="text-align: center; font-size: 24px; margin-bottom: 10px">{{
  4. basicInfoData.groupName || '湖南特瑞精密医疗器器械有限公司'
  5. }}</h2>
  6. <h1
  7. style="
  8. text-align: center;
  9. font-size: 24px;
  10. margin-bottom: 20px;
  11. font-weight: bold;
  12. "
  13. >来料/半成品检验报告单</h1
  14. >
  15. <!-- 编号和报告单号 -->
  16. <div style="margin-bottom: 5px">
  17. <el-row style="display: flex">
  18. <el-col :span="12" style="width: 50%">
  19. <div style="display: flex; align-items: center">
  20. <span style="font-weight: bold; margin-right: 10px">报告编号:</span>
  21. <span style="flex: 1">{{ basicInfoData.code }}</span>
  22. </div>
  23. </el-col>
  24. <el-col :span="12" style="width: 50%">
  25. <div
  26. style="
  27. display: flex;
  28. align-items: center;
  29. justify-content: flex-end;
  30. "
  31. >
  32. <span style="font-weight: bold; margin-right: 10px">表单编号:</span>
  33. <span>
  34. {{ basicInfoData.reportNumber }}
  35. </span>
  36. <!-- <span v-else>
  37. <el-input
  38. v-model="basicInfoData.reportNumber"
  39. placeholder="请输入报告编号"
  40. ></el-input>
  41. </span> -->
  42. <span style="font-weight: bold; margin-left: 3px">
  43. <span> 版本:</span>
  44. <span>
  45. {{ basicInfoData.version }}
  46. </span>
  47. <!-- <span v-else>
  48. <el-input
  49. style="width: 120px"
  50. v-model="basicInfoData.version"
  51. placeholder="请输入版本"
  52. ></el-input>
  53. </span> -->
  54. </span>
  55. </div>
  56. </el-col>
  57. </el-row>
  58. </div>
  59. <!-- 基本信息表格 -->
  60. <table
  61. class="basic-info-table"
  62. style="width: 100%; border-collapse: collapse; border: 1px solid #ccc"
  63. >
  64. <tbody>
  65. <tr>
  66. <td style="width: 90px; border: 1px solid #ccc; padding: 8px"
  67. >品 名</td
  68. >
  69. <td style="border: 1px solid #ccc; padding: 8px">{{
  70. basicInfoData.productName
  71. }}</td>
  72. <td style="width: 90px; border: 1px solid #ccc; padding: 8px"
  73. >规格型号</td
  74. >
  75. <td style="border: 1px solid #ccc; padding: 8px"
  76. >{{ basicInfoData.specification }}/{{ basicInfoData.modelType }}</td
  77. >
  78. </tr>
  79. <tr>
  80. <td style="border: 1px solid #ccc; padding: 8px">来料/半成品批号</td>
  81. <td style="border: 1px solid #ccc; padding: 8px">{{
  82. basicInfoData.batchNo
  83. }}</td>
  84. <td style="border: 1px solid #ccc; padding: 8px">数量</td>
  85. <td style="border: 1px solid #ccc; padding: 8px"
  86. >{{ basicInfoData.total }}{{ basicInfoData.sampleMeasureUnit }}</td
  87. >
  88. </tr>
  89. <tr>
  90. <td style="border: 1px solid #ccc; padding: 8px">供应商名称</td>
  91. <td style="border: 1px solid #ccc; padding: 8px">{{
  92. basicInfoData.supplierName
  93. }}</td>
  94. <td style="border: 1px solid #ccc; padding: 8px">抽检数量</td>
  95. <td style="border: 1px solid #ccc; padding: 8px"
  96. >{{ basicInfoData.sampleQuantity
  97. }}{{ basicInfoData.sampleMeasureUnit }}</td
  98. >
  99. </tr>
  100. <tr>
  101. <td style="border: 1px solid #ccc; padding: 8px">检验日期</td>
  102. <td style="border: 1px solid #ccc; padding: 8px">
  103. <div v-if="!isView">
  104. <el-date-picker
  105. v-model="basicInfoData.pleaseVerifyDate"
  106. type="date"
  107. value-format="yyyy-MM-dd"
  108. placeholder="选择日期"
  109. />
  110. </div>
  111. <div v-else>{{ basicInfoData.manufactureTime }}</div></td
  112. >
  113. <td style="border: 1px solid #ccc; padding: 8px">报告日期</td>
  114. <td style="border: 1px solid #ccc; padding: 8px">
  115. <div v-if="!isView">
  116. <el-date-picker
  117. v-model="basicInfoData.reportDate"
  118. type="date"
  119. value-format="yyyy-MM-dd"
  120. placeholder="选择日期"
  121. />
  122. </div>
  123. <div v-else>{{ basicInfoData.reportDate }}</div>
  124. </td>
  125. </tr>
  126. <tr>
  127. <td style="border: 1px solid #ccc; padding: 8px">检验依据</td>
  128. <td style="border: 1px solid #ccc; padding: 8px" colspan="3">
  129. <div v-if="!isView">
  130. <el-input
  131. v-model="basicInfoData.inspectionBasis"
  132. placeholder="请输入检验依据"
  133. ></el-input>
  134. </div>
  135. <div v-else>{{ basicInfoData.inspectionBasis }}</div>
  136. </td>
  137. </tr>
  138. </tbody>
  139. </table>
  140. <!-- 检验项目表格 -->
  141. <table
  142. class="inspection-items-table"
  143. style="
  144. width: 100%;
  145. border-collapse: collapse;
  146. border: 1px solid #ccc;
  147. margin-bottom: 20px;
  148. "
  149. >
  150. <thead>
  151. <tr>
  152. <th style="width: 100px; border: 1px solid #ccc; padding: 8px"
  153. >检验项目</th
  154. >
  155. <th style="border: 1px solid #ccc; padding: 8px">标准规定</th>
  156. <th style="border: 1px solid #ccc; padding: 8px">检验工具及编号</th>
  157. <th style="border: 1px solid #ccc; padding: 8px; width: 90px"
  158. >检测内容</th
  159. >
  160. <th style="width: 80px; border: 1px solid #ccc; padding: 8px"
  161. >检验结果</th
  162. >
  163. <th style="width: 100px; border: 1px solid #ccc; padding: 8px"
  164. >备注</th
  165. >
  166. </tr>
  167. </thead>
  168. <tbody>
  169. <tr v-for="(item, index) in inspectionItems" :key="index">
  170. <td style="border: 1px solid #ccc; padding: 8px; min-height: 37px">{{
  171. item.item
  172. }}</td>
  173. <td style="border: 1px solid #ccc; padding: 8px">{{
  174. item.standardRegulations
  175. }}</td>
  176. <td style="border: 1px solid #ccc; padding: 8px">{{
  177. item.toolList?.map((item) => item.name + ' ' + item.code).join(',')
  178. }}</td>
  179. <td style="border: 1px solid #ccc; padding: 8px">{{
  180. item.qualityResultContent
  181. }}</td>
  182. <td style="border: 1px solid #ccc; padding: 8px">{{
  183. item.results
  184. }}</td>
  185. <td style="border: 1px solid #ccc; padding: 8px">
  186. <div v-if="!isView">
  187. <el-input v-model="item.remark" placeholder="请输入"></el-input>
  188. </div>
  189. <div v-else>{{ item.remark }}</div>
  190. </td>
  191. </tr>
  192. <tr>
  193. <td style="width: 120px; border: 1px solid #ccc; padding: 8px"
  194. >结论</td
  195. >
  196. <td style="border: 1px solid #ccc; padding: 8px" :colspan="4">
  197. <div style="display: flex; align-items: center">
  198. <div v-if="!isView">
  199. <el-checkbox
  200. label="符合规定"
  201. :true-label="'符合'"
  202. v-model="basicInfoData.qualityResultsStr"
  203. :false-label="'不符合'"
  204. ></el-checkbox>
  205. <el-checkbox
  206. label="不符合规定:"
  207. :true-label="'不符合'"
  208. v-model="basicInfoData.qualityResultsStr"
  209. :false-label="'符合'"
  210. ></el-checkbox>
  211. </div>
  212. <div v-else style="display: flex; align-items: center">
  213. <span
  214. style="
  215. position: relative;
  216. display: inline-block;
  217. width: 14px;
  218. height: 14px;
  219. box-sizing: border-box;
  220. border: 1px solid #000;
  221. margin-right: 4px;
  222. "
  223. >
  224. <span
  225. v-if="basicInfoData.qualityResultsStr === '符合'"
  226. style="
  227. position: absolute;
  228. left: 3px;
  229. top: 1px;
  230. width: 4px;
  231. height: 8px;
  232. border: solid #000;
  233. border-width: 0 2px 2px 0;
  234. transform: rotate(45deg);
  235. "
  236. ></span>
  237. </span>
  238. <span style="margin-right: 12px">符合规定</span>
  239. <span
  240. style="
  241. position: relative;
  242. display: inline-block;
  243. width: 14px;
  244. height: 14px;
  245. box-sizing: border-box;
  246. border: 1px solid #000;
  247. margin-right: 4px;
  248. "
  249. >
  250. <span
  251. v-if="basicInfoData.qualityResultsStr === '不符合'"
  252. style="
  253. position: absolute;
  254. left: 3px;
  255. top: 1px;
  256. width: 4px;
  257. height: 8px;
  258. border: solid #000;
  259. border-width: 0 2px 2px 0;
  260. transform: rotate(45deg);
  261. "
  262. ></span>
  263. </span>
  264. <span>不符合规定:</span>
  265. </div>
  266. <el-input
  267. style="flex: 1"
  268. v-if="!isView"
  269. v-model="basicInfoData.qualityResultsStrRemark"
  270. placeholder="请输入"
  271. ></el-input>
  272. <div v-else>{{ basicInfoData.qualityResultsStrRemark }}</div></div
  273. >
  274. </td>
  275. </tr>
  276. </tbody>
  277. </table>
  278. <!-- 签名区域 -->
  279. <div style="margin-top: 20px">
  280. <el-row :gutter="20" style="display: flex; align-items: center">
  281. <el-col :span="8">
  282. <div style="display: flex; align-items: center; margin-bottom: 10px">
  283. <span style="font-weight: bold; min-width: 100px"
  284. >检验人/日期:</span
  285. >
  286. <span style="flex: 1">
  287. <div v-if="!isView" style="display: flex; align-items: center">
  288. <el-input
  289. v-model="basicInfoData.inspector"
  290. placeholder="请输入检验人"
  291. style="width: 120px"
  292. ></el-input>
  293. <el-date-picker
  294. v-model="basicInfoData.inspectionTime"
  295. type="date"
  296. value-format="yyyy-MM-dd"
  297. placeholder="选择日期"
  298. style="width: 140px"
  299. />
  300. </div>
  301. <div v-else
  302. >{{ basicInfoData.inspector || '' }} /
  303. {{ basicInfoData.inspectionTime || '' }}</div
  304. >
  305. </span>
  306. </div>
  307. </el-col>
  308. <el-col :span="8">
  309. <div style="display: flex; align-items: center; margin-bottom: 10px">
  310. <span style="font-weight: bold; min-width: 100px"
  311. >复核人/日期:</span
  312. >
  313. <span style="flex: 1">
  314. <div v-if="!isView" style="display: flex; align-items: center">
  315. <el-input
  316. v-model="basicInfoData.reviewer"
  317. placeholder="请输入复核人"
  318. style="width: 120px"
  319. ></el-input>
  320. <el-date-picker
  321. v-model="basicInfoData.reviewTime"
  322. type="date"
  323. value-format="yyyy-MM-dd"
  324. placeholder="选择日期"
  325. style="width: 140px"
  326. />
  327. </div>
  328. <div v-else
  329. >{{ basicInfoData.reviewer || '' }} /
  330. {{ basicInfoData.reviewTime || '' }}</div
  331. >
  332. </span>
  333. </div>
  334. </el-col>
  335. <el-col :span="8">
  336. <div style="display: flex; align-items: center; margin-bottom: 10px">
  337. <span style="font-weight: bold; min-width: 100px"
  338. >批准人/日期:</span
  339. >
  340. <span style="flex: 1">
  341. <div v-if="!isView" style="display: flex; align-items: center">
  342. <el-input
  343. v-model="basicInfoData.checker"
  344. placeholder="请输入批准人"
  345. style="width: 120px"
  346. ></el-input>
  347. <el-date-picker
  348. v-model="basicInfoData.approvedDate"
  349. type="date"
  350. value-format="yyyy-MM-dd"
  351. placeholder="选择日期"
  352. style="width: 140px"
  353. />
  354. </div>
  355. <div v-else
  356. >{{ basicInfoData.checker || '' }} /
  357. {{ basicInfoData.approvedDate || '' }}</div
  358. >
  359. </span>
  360. </div>
  361. </el-col>
  362. </el-row>
  363. </div>
  364. </div>
  365. </template>
  366. <script>
  367. export default {
  368. name: 'QualityReport',
  369. props: {
  370. isView: {
  371. type: Boolean,
  372. default: false
  373. }
  374. },
  375. data() {
  376. return {
  377. // 基本信息数据
  378. basicInfoData: {},
  379. // 检验项目
  380. inspectionItems: []
  381. };
  382. },
  383. methods: {
  384. /* 打开质检报告 */
  385. async init(basicInfoData, inspectionItems) {
  386. this.$set(this, 'basicInfoData', basicInfoData);
  387. this.$set(this, 'inspectionItems', inspectionItems);
  388. },
  389. /* 保存编辑 */
  390. getValue() {
  391. return this.basicInfoData;
  392. }
  393. }
  394. };
  395. </script>