index.vue 73 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812
  1. <template>
  2. <div class="tenant">
  3. <byTable
  4. :source="sourceList.data"
  5. :pagination="sourceList.pagination"
  6. :config="config"
  7. :loading="loading"
  8. :selectConfig="selectConfig"
  9. highlight-current-row
  10. @get-list="getList">
  11. <template #amount="{ item }">
  12. <div>
  13. <span style="padding-right: 4px">{{ item.currency }}</span>
  14. <span>{{ moneyFormat(item.amount, 2) }}</span>
  15. </div>
  16. </template>
  17. </byTable>
  18. <el-dialog title="质检" v-if="openInspection" v-model="openInspection" width="90%">
  19. <byForm :formConfig="formConfig" :formOption="formOption" v-model="formData.data" :rules="rules" ref="submit">
  20. <template #steps>
  21. <div style="width: 100%">
  22. <div class="steps-aaa">
  23. <el-steps :space="200" align-center style="width: 2200px">
  24. <el-step
  25. v-for="(item, index) in steps"
  26. :key="index"
  27. :title="item.label"
  28. style="cursor: pointer"
  29. :status="getStepStatus(item)"
  30. @click="clickSteps(item.value)" />
  31. </el-steps>
  32. </div>
  33. <div v-if="selectSteps === 1" style="width: 100%">
  34. <el-row>
  35. <el-col :span="12">
  36. <el-form-item label="Supplier" prop="supplyName" style="margin-top: 20px">
  37. <el-input v-model="formData.data.supplyName" disabled />
  38. </el-form-item>
  39. <el-form-item label="Product Name" prop="productName" style="margin-top: 20px">
  40. <el-input v-model="formData.data.productName" disabled />
  41. </el-form-item>
  42. </el-col>
  43. </el-row>
  44. <el-row>
  45. <el-col :span="6">
  46. <el-form-item label="P.O. NO." prop="code" style="margin-top: 20px">
  47. <el-input v-model="formData.data.code" />
  48. </el-form-item>
  49. <el-form-item label="Inspection Date" prop="inspectionDate" style="margin-top: 20px">
  50. <el-date-picker v-model="formData.data.inspectionDate" type="datetime" value-format="YYYY-MM-DD HH:mm:ss" />
  51. </el-form-item>
  52. </el-col>
  53. </el-row>
  54. <el-row>
  55. <el-col :span="12">
  56. <el-form-item label="Reference Sample" prop="referenceSample" style="margin-top: 20px">
  57. <el-radio-group v-model="formData.data.referenceSample" class="ml-4">
  58. <el-radio label="0">No Reference Sample On-site</el-radio>
  59. <el-radio label="1">Product Specification</el-radio>
  60. </el-radio-group>
  61. </el-form-item>
  62. <el-form-item label="Order Quantity" prop="orderQuantity" style="margin-top: 20px">
  63. <el-input-number v-model="formData.data.orderQuantity" :precision="0" :controls="false" :min="0" />
  64. </el-form-item>
  65. <el-form-item label="Inspection Location" prop="inspectionLocation" style="margin-top: 20px">
  66. <el-input v-model="formData.data.inspectionLocation" :rows="4" type="textarea" />
  67. </el-form-item>
  68. </el-col>
  69. </el-row>
  70. </div>
  71. <div v-else-if="selectSteps === 2" style="width: 100%">
  72. <div style="margin-top: 20px; font-weight: 700">INSPECTION SUMMARY</div>
  73. <div>
  74. <el-button type="primary" @click="clickAdd()" plain>添加行</el-button>
  75. <el-table :data="formData.data.inspectionSummaryList" style="width: 100%; margin-top: 16px">
  76. <el-table-column>
  77. <template #default="{ row, $index }">
  78. <div style="width: 100%">
  79. <el-form-item :prop="'inspectionSummaryList.' + $index + '.summaryLabel'" :rules="rules.summaryLabel" :inline-message="true">
  80. <el-input v-model="row.summaryLabel" />
  81. </el-form-item>
  82. </div>
  83. </template>
  84. </el-table-column>
  85. <el-table-column>
  86. <template #default="{ row, $index }">
  87. <div style="width: 100%">
  88. <el-form-item :prop="'inspectionSummaryList.' + $index + '.summaryValue'" :rules="rules.summaryValue" :inline-message="true">
  89. <el-radio-group v-model="row.summaryValue" class="ml-4">
  90. <el-radio v-for="(item, index) in summaryType" :key="index" :label="item.label"></el-radio>
  91. </el-radio-group>
  92. </el-form-item>
  93. </div>
  94. </template>
  95. </el-table-column>
  96. <el-table-column label="操作" width="60" align="center" fixed="right">
  97. <template #default="{ $index }">
  98. <el-button type="primary" link @click="handleDelete($index)">删除</el-button>
  99. </template>
  100. </el-table-column>
  101. </el-table>
  102. </div>
  103. <div style="margin-top: 20px; font-weight: 700">AQL Result</div>
  104. <el-row>
  105. <el-col :span="12">
  106. <el-form-item label="Summary" prop="summary" style="margin-top: 20px">
  107. <el-input v-model="formData.data.summary" :rows="4" type="textarea" />
  108. </el-form-item>
  109. </el-col>
  110. </el-row>
  111. <el-table :data="formData.data.ehsdQualityAqlList" style="width: 100%; margin-top: 16px">
  112. <el-table-column label="AQL Level" prop="aqlLevel" />
  113. <el-table-column label="Sample Size" width="160">
  114. <template #default="{ row, $index }">
  115. <div style="width: 100%">
  116. <el-form-item :prop="'ehsdQualityAqlList.' + $index + '.sampleSize'" :rules="rules.sampleSize" :inline-message="true">
  117. <el-input-number v-model="row.sampleSize" :precision="2" :controls="false" :min="0" />
  118. </el-form-item>
  119. </div>
  120. </template>
  121. </el-table-column>
  122. <el-table-column label="Acceptance" width="160">
  123. <template #default="{ row, $index }">
  124. <div style="width: 100%">
  125. <el-form-item :prop="'ehsdQualityAqlList.' + $index + '.acceptance'" :rules="rules.acceptance" :inline-message="true">
  126. <el-input v-model="row.acceptance" />
  127. </el-form-item>
  128. </div>
  129. </template>
  130. </el-table-column>
  131. <el-table-column label="Finding" width="160">
  132. <template #default="{ row, $index }">
  133. <div style="width: 100%">
  134. <el-form-item :prop="'ehsdQualityAqlList.' + $index + '.finding'" :rules="rules.finding" :inline-message="true">
  135. <el-input v-model="row.finding" />
  136. </el-form-item>
  137. </div>
  138. </template>
  139. </el-table-column>
  140. <el-table-column label="Result" width="160">
  141. <template #default="{ row, $index }">
  142. <div style="width: 100%">
  143. <el-form-item :prop="'ehsdQualityAqlList.' + $index + '.result'" :rules="rules.result" :inline-message="true">
  144. <el-input v-model="row.result" />
  145. </el-form-item>
  146. </div>
  147. </template>
  148. </el-table-column>
  149. <el-table-column label="AQL Result" width="160">
  150. <template #default="{ row, $index }">
  151. <div style="width: 100%">
  152. <el-form-item :prop="'ehsdQualityAqlList.' + $index + '.aqlResult'" :rules="rules.aqlResult" :inline-message="true">
  153. <el-select v-model="row.aqlResult" @change="changeAqlResult">
  154. <el-option v-for="item in aqlResult" :key="item.value" :label="item.label" :value="item.value" />
  155. </el-select>
  156. </el-form-item>
  157. </div>
  158. </template>
  159. </el-table-column>
  160. </el-table>
  161. <el-row>
  162. <el-col :span="12">
  163. <el-form-item label="Result" prop="summaryResult" style="margin-top: 20px">
  164. <span style="color: red" v-if="formData.data.summaryResult === 1">Failed</span>
  165. <span style="color: #03d503" v-else-if="formData.data.summaryResult === 0">Passed</span>
  166. </el-form-item>
  167. <el-form-item label="Description" prop="summaryDescription" style="margin-top: 20px">
  168. <el-input v-model="formData.data.summaryDescription" :rows="4" type="textarea" />
  169. </el-form-item>
  170. </el-col>
  171. </el-row>
  172. </div>
  173. <div v-else-if="selectSteps === 3" style="width: 100%">
  174. <div style="margin-top: 20px">Problem Remarks</div>
  175. <div>
  176. <el-button type="primary" @click="clickProblemAdd()" plain>添加行</el-button>
  177. <el-table :data="formData.data.ehsdQualityProblemList" style="width: 100%; margin-top: 16px">
  178. <el-table-column label="#" width="50">
  179. <template #default="{ row, $index }">
  180. <div style="width: 100%">
  181. {{ $index + 1 }}
  182. </div>
  183. </template>
  184. </el-table-column>
  185. <el-table-column>
  186. <template #default="{ row, $index }">
  187. <div style="width: 100%">
  188. <el-form-item :prop="'ehsdQualityProblemList.' + $index + '.remark'" :rules="rules.remark" :inline-message="true">
  189. <el-input v-model="row.remark" :rows="4" type="textarea" />
  190. </el-form-item>
  191. </div>
  192. </template>
  193. </el-table-column>
  194. <el-table-column label="操作" width="60" align="center" fixed="right">
  195. <template #default="{ $index }">
  196. <el-button type="primary" link @click="handleProblemDelete($index)">删除</el-button>
  197. </template>
  198. </el-table-column>
  199. </el-table>
  200. </div>
  201. <el-form-item label="Sample Collection Record" style="margin-top: 20px">
  202. <el-upload
  203. v-model:fileList="fileListOne"
  204. action="https://winfaster.obs.cn-south-1.myhuaweicloud.com"
  205. :data="uploadDataOne"
  206. multiple
  207. list-type="picture-card"
  208. :before-upload="uploadFileOne"
  209. accept=".gif, .jpeg, .jpg, .png">
  210. <el-icon><Plus /></el-icon>
  211. <template #file="{ file }">
  212. <div>
  213. <div>
  214. <img class="el-upload-list__item-thumbnail" :src="file.url" alt="" style="cursor: pointer" />
  215. <span class="el-upload-list__item-actions">
  216. <span class="el-upload-list__item-preview" @click="onPreviewFile(file)">
  217. <el-icon><zoom-in /></el-icon>
  218. </span>
  219. <span class="el-upload-list__item-delete" @click="onRemoveOne(file)">
  220. <el-icon><Delete /></el-icon>
  221. </span>
  222. </span>
  223. <el-button type="primary" @click="clickFileRemark(file, 1)" text>Remark</el-button>
  224. </div>
  225. </div>
  226. </template>
  227. </el-upload>
  228. </el-form-item>
  229. </div>
  230. <div v-else-if="selectSteps === 4" style="width: 100%"></div>
  231. <div v-else-if="selectSteps === 5" style="width: 100%">
  232. <div style="margin-top: 20px">Quantity</div>
  233. <div>
  234. <el-table :data="formData.data.ehsdQualityProductList" style="width: 100%; margin-top: 16px">
  235. <el-table-column>
  236. <el-table-column label="P.I." prop="contractCode" width="140" />
  237. <el-table-column label="item" prop="item" min-width="160" />
  238. <el-table-column label="Order Qty" width="150">
  239. <template #default="{ row, $index }">
  240. <div style="width: 100%">
  241. <el-form-item :prop="'ehsdQualityProductList.' + $index + '.orderQty'" :rules="rules.orderQty" :inline-message="true">
  242. <el-input-number v-model="row.orderQty" :precision="0" :controls="false" :min="0" />
  243. </el-form-item>
  244. </div>
  245. </template>
  246. </el-table-column>
  247. <el-table-column label="Qty/Carton" width="150">
  248. <template #default="{ row, $index }">
  249. <div style="width: 100%">
  250. <el-form-item :prop="'ehsdQualityProductList.' + $index + '.cartonQty'" :rules="rules.cartonQty" :inline-message="true">
  251. <el-input-number v-model="row.cartonQty" :precision="0" :controls="false" :min="0" />
  252. </el-form-item>
  253. </div>
  254. </template>
  255. </el-table-column>
  256. <el-table-column label="Order Cartons" width="150">
  257. <template #default="{ row, $index }">
  258. <div style="width: 100%">
  259. <el-form-item :prop="'ehsdQualityProductList.' + $index + '.orderCartons'" :rules="rules.orderCartons" :inline-message="true">
  260. <el-input-number v-model="row.orderCartons" :precision="0" :controls="false" :min="0" />
  261. </el-form-item>
  262. </div>
  263. </template>
  264. </el-table-column>
  265. </el-table-column>
  266. <el-table-column label="Quantity Breakdown">
  267. <el-table-column label="Packed" width="150">
  268. <template #default="{ row, $index }">
  269. <div style="width: 100%">
  270. <el-form-item :prop="'ehsdQualityProductList.' + $index + '.packed'" :rules="rules.packed" :inline-message="true">
  271. <el-input-number v-model="row.packed" :precision="0" :controls="false" :min="0" />
  272. </el-form-item>
  273. </div>
  274. </template>
  275. </el-table-column>
  276. <el-table-column label="Unpacked" width="150">
  277. <template #default="{ row, $index }">
  278. <div style="width: 100%">
  279. <el-form-item :prop="'ehsdQualityProductList.' + $index + '.unpacked'" :rules="rules.unpacked" :inline-message="true">
  280. <el-input-number v-model="row.unpacked" :precision="0" :controls="false" :min="0" />
  281. </el-form-item>
  282. </div>
  283. </template>
  284. </el-table-column>
  285. <el-table-column label="Unfinished" width="150">
  286. <template #default="{ row, $index }">
  287. <div style="width: 100%">
  288. <el-form-item :prop="'ehsdQualityProductList.' + $index + '.unfinished'" :rules="rules.unfinished" :inline-message="true">
  289. <el-input-number v-model="row.unfinished" :precision="0" :controls="false" :min="0" />
  290. </el-form-item>
  291. </div>
  292. </template>
  293. </el-table-column>
  294. </el-table-column>
  295. <el-table-column label="Sample Size">
  296. <el-table-column label="Packed" width="150">
  297. <template #default="{ row, $index }">
  298. <div style="width: 100%">
  299. <el-form-item :prop="'ehsdQualityProductList.' + $index + '.samplePacked'" :rules="rules.samplePacked" :inline-message="true">
  300. <el-input-number v-model="row.samplePacked" :precision="0" :controls="false" :min="0" />
  301. </el-form-item>
  302. </div>
  303. </template>
  304. </el-table-column>
  305. <el-table-column label="Unpacked" width="150">
  306. <template #default="{ row, $index }">
  307. <div style="width: 100%">
  308. <el-form-item :prop="'ehsdQualityProductList.' + $index + '.sampleUnpacked'" :rules="rules.sampleUnpacked" :inline-message="true">
  309. <el-input-number v-model="row.sampleUnpacked" :precision="0" :controls="false" :min="0" />
  310. </el-form-item>
  311. </div>
  312. </template>
  313. </el-table-column>
  314. </el-table-column>
  315. </el-table>
  316. </div>
  317. <div style="margin-top: 20px">Selected Cartons</div>
  318. <div>
  319. <el-button type="primary" @click="clickCartonsAdd()" plain>添加列</el-button>
  320. <el-table :data="formData.data.ehsdQualityCartonsList" style="width: 100%; margin-top: 16px" :row-class-name="changeClass">
  321. <el-table-column label="item" prop="item" min-width="160" />
  322. <template v-for="(item, index) in formData.data.ehsdQualityCartonsList" :key="index">
  323. <el-table-column label="Carton Number" width="160">
  324. <template #default="{ row, $index }">
  325. <div style="width: 100%">
  326. <el-form-item :prop="'ehsdQualityCartonsList.' + index + '.cartonNumber'" :rules="rules.cartonNumber" :inline-message="true">
  327. <el-input-number v-model="item.cartonNumber" :precision="0" :controls="false" :min="0" />
  328. </el-form-item>
  329. </div>
  330. </template>
  331. </el-table-column>
  332. </template>
  333. <el-table-column label="Total" prop="item" width="140" fixed="right">
  334. <template #default="{ row, $index }">
  335. <div style="width: 100%">{{ formData.data.ehsdQualityCartonsList.length }} CTN</div>
  336. </template>
  337. </el-table-column>
  338. </el-table>
  339. </div>
  340. </div>
  341. <div v-else-if="selectSteps === 6" style="width: 100%">
  342. <div style="margin-top: 20px">Workmanship Defectives / Function Inspection Findings</div>
  343. <div>
  344. <el-button type="primary" @click="clickWorkShipAdd()" plain>添加行</el-button>
  345. <el-table :data="formData.data.ehsdQualityWorkshipList" style="width: 100%; margin-top: 16px" show-summary :summary-method="getSummaries">
  346. <el-table-column label="#" width="50">
  347. <template #default="{ row, $index }">
  348. <div style="width: 100%">
  349. {{ $index + 1 }}
  350. </div>
  351. </template>
  352. </el-table-column>
  353. <el-table-column label="Description">
  354. <template #default="{ row, $index }">
  355. <div style="width: 100%">
  356. <el-form-item :prop="'ehsdQualityWorkshipList.' + $index + '.description'" :rules="rules.description" :inline-message="true">
  357. <el-input v-model="row.description" />
  358. </el-form-item>
  359. </div>
  360. </template>
  361. </el-table-column>
  362. <el-table-column label="Critical" width="160">
  363. <template #default="{ row, $index }">
  364. <div style="width: 100%">
  365. <el-form-item :prop="'ehsdQualityWorkshipList.' + $index + '.critical'" :rules="rules.critical" :inline-message="true">
  366. <el-input-number v-model="row.critical" :precision="0" :controls="false" :min="0" />
  367. </el-form-item>
  368. </div>
  369. </template>
  370. </el-table-column>
  371. <el-table-column label="Major" width="160">
  372. <template #default="{ row, $index }">
  373. <div style="width: 100%">
  374. <el-form-item :prop="'ehsdQualityWorkshipList.' + $index + '.major'" :rules="rules.major" :inline-message="true">
  375. <el-input-number v-model="row.major" :precision="0" :controls="false" :min="0" />
  376. </el-form-item>
  377. </div>
  378. </template>
  379. </el-table-column>
  380. <el-table-column label="Minor" width="160">
  381. <template #default="{ row, $index }">
  382. <div style="width: 100%">
  383. <el-form-item :prop="'ehsdQualityWorkshipList.' + $index + '.minor'" :rules="rules.minor" :inline-message="true">
  384. <el-input-number v-model="row.minor" :precision="0" :controls="false" :min="0" />
  385. </el-form-item>
  386. </div>
  387. </template>
  388. </el-table-column>
  389. <el-table-column label="操作" width="60" align="center" fixed="right">
  390. <template #default="{ $index }">
  391. <el-button type="primary" link @click="handleWorkShipDelete($index)">删除</el-button>
  392. </template>
  393. </el-table-column>
  394. </el-table>
  395. </div>
  396. <el-form-item label="Defect photos of Items" style="margin-top: 20px">
  397. <el-upload
  398. v-model:fileList="fileListTwo"
  399. action="https://winfaster.obs.cn-south-1.myhuaweicloud.com"
  400. :data="uploadDataTwo"
  401. multiple
  402. list-type="picture-card"
  403. :before-upload="uploadFileTwo"
  404. accept=".gif, .jpeg, .jpg, .png">
  405. <el-icon><Plus /></el-icon>
  406. <template #file="{ file }">
  407. <div>
  408. <div>
  409. <img class="el-upload-list__item-thumbnail" :src="file.url" alt="" style="cursor: pointer" />
  410. <span class="el-upload-list__item-actions">
  411. <span class="el-upload-list__item-preview" @click="onPreviewFile(file)">
  412. <el-icon><zoom-in /></el-icon>
  413. </span>
  414. <span class="el-upload-list__item-delete" @click="onRemoveTwo(file)">
  415. <el-icon><Delete /></el-icon>
  416. </span>
  417. </span>
  418. <el-button type="primary" @click="clickFileRemark(file, 2)" text>Remark</el-button>
  419. </div>
  420. </div>
  421. </template>
  422. </el-upload>
  423. </el-form-item>
  424. </div>
  425. <div v-else-if="selectSteps === 7" style="width: 100%">
  426. <div style="margin-top: 20px">ON-SITE TESTS</div>
  427. <div>
  428. <el-button type="primary" @click="clickSiteTestAdd()" plain>添加行</el-button>
  429. <el-table :data="formData.data.ehsdQualitySiteTestList" style="width: 100%; margin-top: 16px">
  430. <el-table-column label="#" width="50">
  431. <template #default="{ row, $index }">
  432. <div style="width: 100%">
  433. {{ $index + 1 }}
  434. </div>
  435. </template>
  436. </el-table-column>
  437. <el-table-column label="Description" min-width="160">
  438. <template #default="{ row, $index }">
  439. <div style="width: 100%">
  440. <el-form-item :prop="'ehsdQualitySiteTestList.' + $index + '.description'" :rules="rules.description" :inline-message="true">
  441. <el-input v-model="row.description" :rows="4" type="textarea" />
  442. </el-form-item>
  443. </div>
  444. </template>
  445. </el-table-column>
  446. <el-table-column label="Sample Size" width="160">
  447. <template #default="{ row, $index }">
  448. <div style="width: 100%">
  449. <el-form-item :prop="'ehsdQualitySiteTestList.' + $index + '.sampleSize'" :rules="rules.sampleSize" :inline-message="true">
  450. <el-input-number v-model="row.sampleSize" :precision="2" :controls="false" :min="0" />
  451. </el-form-item>
  452. </div>
  453. </template>
  454. </el-table-column>
  455. <el-table-column label="Passed" width="160">
  456. <template #default="{ row, $index }">
  457. <div style="width: 100%">
  458. <el-form-item :prop="'ehsdQualitySiteTestList.' + $index + '.passed'" :rules="rules.passed" :inline-message="true">
  459. <el-input v-model="row.passed" />
  460. </el-form-item>
  461. </div>
  462. </template>
  463. </el-table-column>
  464. <el-table-column label="Failed" width="160">
  465. <template #default="{ row, $index }">
  466. <div style="width: 100%">
  467. <el-form-item :prop="'ehsdQualitySiteTestList.' + $index + '.failed'" :rules="rules.failed" :inline-message="true">
  468. <el-input v-model="row.failed" />
  469. </el-form-item>
  470. </div>
  471. </template>
  472. </el-table-column>
  473. <el-table-column label="Result / Reading" width="160">
  474. <template #default="{ row, $index }">
  475. <div style="width: 100%">
  476. <el-form-item :prop="'ehsdQualitySiteTestList.' + $index + '.result'" :rules="rules.result" :inline-message="true">
  477. <el-select v-model="row.result" @change="changeSiteTestResult">
  478. <el-option v-for="item in aqlResult" :key="item.value" :label="item.label" :value="item.value" />
  479. </el-select>
  480. </el-form-item>
  481. </div>
  482. </template>
  483. </el-table-column>
  484. </el-table>
  485. </div>
  486. <el-row>
  487. <el-col :span="12">
  488. <el-form-item label="Result" prop="siteTestResult" style="margin-top: 20px">
  489. <span style="color: red" v-if="formData.data.siteTestResult === 1">Failed</span>
  490. <span style="color: #03d503" v-else-if="formData.data.siteTestResult === 0">Passed</span>
  491. </el-form-item>
  492. <el-form-item label="Remark" prop="siteTestRemark" style="margin-top: 20px">
  493. <el-input v-model="formData.data.siteTestRemark" :rows="4" type="textarea" />
  494. </el-form-item>
  495. </el-col>
  496. </el-row>
  497. <el-form-item label="Photos" style="margin-top: 20px">
  498. <el-upload
  499. v-model:fileList="fileListThree"
  500. action="https://winfaster.obs.cn-south-1.myhuaweicloud.com"
  501. :data="uploadDataThree"
  502. multiple
  503. list-type="picture-card"
  504. :before-upload="uploadFileThree"
  505. accept=".gif, .jpeg, .jpg, .png">
  506. <el-icon><Plus /></el-icon>
  507. <template #file="{ file }">
  508. <div>
  509. <div>
  510. <img class="el-upload-list__item-thumbnail" :src="file.url" alt="" style="cursor: pointer" />
  511. <span class="el-upload-list__item-actions">
  512. <span class="el-upload-list__item-preview" @click="onPreviewFile(file)">
  513. <el-icon><zoom-in /></el-icon>
  514. </span>
  515. <span class="el-upload-list__item-delete" @click="onRemoveThree(file)">
  516. <el-icon><Delete /></el-icon>
  517. </span>
  518. </span>
  519. <el-button type="primary" @click="clickFileRemark(file, 3)" text>Remark</el-button>
  520. </div>
  521. </div>
  522. </template>
  523. </el-upload>
  524. </el-form-item>
  525. </div>
  526. <div v-else-if="selectSteps === 8" style="width: 100%">
  527. <div style="margin-top: 20px">PRODUCT SPECIFICATION</div>
  528. <div>
  529. <el-table :data="formData.data.ehsdQualityProductColorList" style="width: 100%; margin-top: 16px">
  530. <el-table-column min-width="180">
  531. <template #default="{ row, $index }">
  532. <div style="width: 100%">
  533. <span v-if="$index === 0">L * W * H (cm)</span>
  534. <span v-else-if="$index === 1">Net Weight (g)</span>
  535. </div>
  536. </template>
  537. </el-table-column>
  538. <el-table-column label="Client Spec." prop="productModel" width="180" />
  539. <el-table-column label="Ref. Sample" width="180">
  540. <template #default="{ row, $index }">
  541. <div style="width: 100%">
  542. <el-form-item :prop="'ehsdQualityProductColorList.' + $index + '.refSample'" :rules="rules.refSample" :inline-message="true">
  543. <el-input v-model="row.refSample" />
  544. </el-form-item>
  545. </div>
  546. </template>
  547. </el-table-column>
  548. <el-table-column label="1# Sample" width="180">
  549. <template #default="{ row, $index }">
  550. <div style="width: 100%">
  551. <el-form-item :prop="'ehsdQualityProductColorList.' + $index + '.refSampleOne'" :rules="rules.refSampleOne" :inline-message="true">
  552. <el-input v-model="row.refSampleOne" />
  553. </el-form-item>
  554. </div>
  555. </template>
  556. </el-table-column>
  557. <el-table-column label="2# Sample" width="180">
  558. <template #default="{ row, $index }">
  559. <div style="width: 100%">
  560. <el-form-item :prop="'ehsdQualityProductColorList.' + $index + '.refSampleTwo'" :rules="rules.refSampleTwo" :inline-message="true">
  561. <el-input v-model="row.refSampleTwo" />
  562. </el-form-item>
  563. </div>
  564. </template>
  565. </el-table-column>
  566. <el-table-column label="3# Sample" width="180">
  567. <template #default="{ row, $index }">
  568. <div style="width: 100%">
  569. <el-form-item :prop="'ehsdQualityProductColorList.' + $index + '.refSampleThree'" :rules="rules.refSampleThree" :inline-message="true">
  570. <el-input v-model="row.refSampleThree" />
  571. </el-form-item>
  572. </div>
  573. </template>
  574. </el-table-column>
  575. </el-table>
  576. </div>
  577. <el-row>
  578. <el-col :span="12">
  579. <el-form-item label="Result" prop="productSpecificationResult" style="margin-top: 20px">
  580. <el-select v-model="formData.data.productSpecificationResult">
  581. <el-option v-for="item in aqlResult" :key="item.value" :label="item.label" :value="item.value" />
  582. </el-select>
  583. </el-form-item>
  584. <el-form-item label="Remark" prop="productSpecificationRemark" style="margin-top: 20px">
  585. <el-input v-model="formData.data.productSpecificationRemark" :rows="4" type="textarea" />
  586. </el-form-item>
  587. </el-col>
  588. </el-row>
  589. </div>
  590. <div v-else-if="selectSteps === 9" style="width: 100%">
  591. <div style="margin-top: 20px">Package Details</div>
  592. <div>
  593. <el-table :data="formData.data.ehsdQualityPackList" style="width: 100%; margin-top: 16px">
  594. <el-table-column>
  595. <el-table-column label="Item No." prop="itemNo" min-width="180" />
  596. </el-table-column>
  597. <el-table-column label="Qty/Carton">
  598. <el-table-column label="Marking/Spec." width="160">
  599. <template #default="{ row, $index }">
  600. <div style="width: 100%">
  601. <el-form-item :prop="'ehsdQualityPackList.' + $index + '.cartonSpec'" :rules="rules.cartonSpec" :inline-message="true">
  602. <el-input v-model="row.cartonSpec" />
  603. </el-form-item>
  604. </div>
  605. </template>
  606. </el-table-column>
  607. <el-table-column label="Actual" width="180">
  608. <template #default="{ row, $index }">
  609. <div style="width: 100%">
  610. <el-form-item :prop="'ehsdQualityPackList.' + $index + '.cartonActual'" :rules="rules.cartonActual" :inline-message="true">
  611. <el-input v-model="row.cartonActual" />
  612. </el-form-item>
  613. </div>
  614. </template>
  615. </el-table-column>
  616. </el-table-column>
  617. <el-table-column label="Carton Size (L x W x H, cm)">
  618. <el-table-column label="Marking/Spec." width="160">
  619. <template #default="{ row, $index }">
  620. <div style="width: 100%">
  621. <el-form-item :prop="'ehsdQualityPackList.' + $index + '.cartonSizeSpec'" :rules="rules.cartonSizeSpec" :inline-message="true">
  622. <el-input v-model="row.cartonSizeSpec" />
  623. </el-form-item>
  624. </div>
  625. </template>
  626. </el-table-column>
  627. <el-table-column label="Actual" width="180">
  628. <template #default="{ row, $index }">
  629. <div style="width: 100%">
  630. <el-form-item :prop="'ehsdQualityPackList.' + $index + '.cartonSizeActual'" :rules="rules.cartonSizeActual" :inline-message="true">
  631. <el-input v-model="row.cartonSizeActual" />
  632. </el-form-item>
  633. </div>
  634. </template>
  635. </el-table-column>
  636. </el-table-column>
  637. <el-table-column label="Gross Weight (kgs)">
  638. <el-table-column label="Marking/Spec." width="160">
  639. <template #default="{ row, $index }">
  640. <div style="width: 100%">
  641. <el-form-item :prop="'ehsdQualityPackList.' + $index + '.grossWeightSpec'" :rules="rules.grossWeightSpec" :inline-message="true">
  642. <el-input v-model="row.grossWeightSpec" />
  643. </el-form-item>
  644. </div>
  645. </template>
  646. </el-table-column>
  647. <el-table-column label="Actual" width="180">
  648. <template #default="{ row, $index }">
  649. <div style="width: 100%">
  650. <el-form-item :prop="'ehsdQualityPackList.' + $index + '.grossWeightActual'" :rules="rules.grossWeightActual" :inline-message="true">
  651. <el-input v-model="row.grossWeightActual" />
  652. </el-form-item>
  653. </div>
  654. </template>
  655. </el-table-column>
  656. </el-table-column>
  657. <el-table-column label="Qty / Inner box">
  658. <el-table-column label="Marking/Spec." width="160">
  659. <template #default="{ row, $index }">
  660. <div style="width: 100%">
  661. <el-form-item :prop="'ehsdQualityPackList.' + $index + '.innerBoxSpec'" :rules="rules.innerBoxSpec" :inline-message="true">
  662. <el-input v-model="row.innerBoxSpec" />
  663. </el-form-item>
  664. </div>
  665. </template>
  666. </el-table-column>
  667. <el-table-column label="Actual" width="180">
  668. <template #default="{ row, $index }">
  669. <div style="width: 100%">
  670. <el-form-item :prop="'ehsdQualityPackList.' + $index + '.innerBoxActual'" :rules="rules.innerBoxActual" :inline-message="true">
  671. <el-input v-model="row.innerBoxActual" />
  672. </el-form-item>
  673. </div>
  674. </template>
  675. </el-table-column>
  676. </el-table-column>
  677. </el-table>
  678. </div>
  679. </div>
  680. <div v-else-if="selectSteps === 10" style="width: 100%">
  681. <div style="margin-top: 20px">MARKING & LABELING</div>
  682. <el-form-item label="Marking type" prop="markingType" style="margin-top: 20px">
  683. <el-select v-model="formData.data.markingType">
  684. <el-option v-for="item in markingType" :key="item.value" :label="item.label" :value="item.value" />
  685. </el-select>
  686. </el-form-item>
  687. <div style="margin-top: 20px">Detail</div>
  688. <div>
  689. <el-button type="primary" @click="clickMarkingAdd()" plain>添加行</el-button>
  690. <el-table :data="formData.data.markingDetailList" style="width: 100%; margin-top: 16px">
  691. <el-table-column label="Name" min-width="300">
  692. <template #default="{ row, $index }">
  693. <div style="width: 100%">
  694. <el-form-item :prop="'markingDetailList.' + $index + '.name'" :rules="rules.name" :inline-message="true">
  695. <el-input v-model="row.name" :rows="4" type="textarea" />
  696. </el-form-item>
  697. </div>
  698. </template>
  699. </el-table-column>
  700. <el-table-column label="Result" width="160">
  701. <template #default="{ row, $index }">
  702. <div style="width: 100%">
  703. <el-form-item :prop="'markingDetailList.' + $index + '.result'" :rules="rules.result" :inline-message="true">
  704. <el-select v-model="row.result">
  705. <el-option v-for="item in aqlResult" :key="item.value" :label="item.label" :value="item.value" />
  706. </el-select>
  707. </el-form-item>
  708. </div>
  709. </template>
  710. </el-table-column>
  711. </el-table>
  712. </div>
  713. <div style="margin-top: 20px">Shipping Marks</div>
  714. <div>
  715. <el-table :data="formData.data.shippingMarksList" style="width: 100%; margin-top: 16px">
  716. <el-table-column label="Name" prop="name" min-width="300" />
  717. <el-table-column label="Result" width="160">
  718. <template #default="{ row, $index }">
  719. <div style="width: 100%">
  720. <el-form-item :prop="'shippingMarksList.' + $index + '.result'" :rules="rules.result" :inline-message="true">
  721. <el-select v-model="row.result">
  722. <el-option v-for="item in aqlResult" :key="item.value" :label="item.label" :value="item.value" />
  723. </el-select>
  724. </el-form-item>
  725. </div>
  726. </template>
  727. </el-table-column>
  728. </el-table>
  729. </div>
  730. <el-row>
  731. <el-col :span="12">
  732. <el-form-item label="Result" prop="markingResult" style="margin-top: 20px">
  733. <el-select v-model="formData.data.markingResult">
  734. <el-option v-for="item in aqlResult" :key="item.value" :label="item.label" :value="item.value" />
  735. </el-select>
  736. </el-form-item>
  737. </el-col>
  738. </el-row>
  739. </div>
  740. <div v-else-if="selectSteps === 11" style="width: 100%">
  741. <div style="margin-top: 20px">SUPPORT DOCUMENTATION</div>
  742. <el-form-item label="Video" required>
  743. <el-upload
  744. class="avatar-uploader"
  745. action="https://winfaster.obs.cn-south-1.myhuaweicloud.com"
  746. :data="uploadDataFour"
  747. :show-file-list="false"
  748. :on-success="onSuccess"
  749. :before-upload="uploadFileFour"
  750. accept=".mp4">
  751. <video
  752. v-if="formData.data.supportDocumentationFileList && formData.data.supportDocumentationFileList.length > 0"
  753. :src="formData.data.supportDocumentationFileList[0].fileUrl"
  754. style="width: 300px; height: 300px"
  755. controls></video>
  756. <el-icon v-else class="avatar-uploader-icon"><Plus /></el-icon>
  757. </el-upload>
  758. </el-form-item>
  759. </div>
  760. </div>
  761. </template>
  762. </byForm>
  763. <template #footer>
  764. <div v-if="selectSteps">
  765. <el-button @click="openInspection = false" size="large">取 消</el-button>
  766. <el-button @click="submitFollow(false)" size="large" plain>暂 存</el-button>
  767. <el-button type="primary" @click="submitFollow(true)" size="large">确 定</el-button>
  768. </div>
  769. </template>
  770. </el-dialog>
  771. <el-dialog title="Remark" v-if="openRemark" v-model="openRemark" width="40%">
  772. <byForm :formConfig="formRemarkConfig" :formOption="formOption" v-model="formRemarkData.data" :rules="rulesRemark" ref="submitRemark">
  773. <template #remark>
  774. <div style="width: 100%">
  775. <el-form-item label="Remark" prop="remark" style="margin-top: 20px">
  776. <el-input v-model="formRemarkData.data.remark" :rows="4" type="textarea" />
  777. </el-form-item>
  778. </div>
  779. </template>
  780. </byForm>
  781. <template #footer>
  782. <el-button @click="openRemark = false" size="large">取 消</el-button>
  783. <el-button type="primary" @click="submitFileRemark" size="large">确 定</el-button>
  784. </template>
  785. </el-dialog>
  786. </div>
  787. </template>
  788. <script setup>
  789. import byTable from "@/components/byTable/index";
  790. import byForm from "@/components/byForm/index";
  791. import { ElMessage, ElMessageBox } from "element-plus";
  792. const { proxy } = getCurrentInstance();
  793. const qualityStatus = ref([
  794. {
  795. label: "未质检",
  796. value: null,
  797. },
  798. {
  799. label: "质检中",
  800. value: 0,
  801. },
  802. {
  803. label: "已质检",
  804. value: 10,
  805. },
  806. ]);
  807. const orderType = ref([
  808. {
  809. label: "样品单",
  810. value: "样品单",
  811. },
  812. {
  813. label: "外销合同",
  814. value: "外销合同",
  815. },
  816. ]);
  817. // const orderType = ref([
  818. // {
  819. // label: "样品单",
  820. // value: "样品单",
  821. // },
  822. // {
  823. // label: "外销合同",
  824. // value: "外销合同",
  825. // },
  826. // ]);
  827. const sourceList = ref({
  828. data: [],
  829. pagination: {
  830. total: 0,
  831. pageNum: 1,
  832. pageSize: 10,
  833. keyword: "",
  834. qualityStatus: "",
  835. orderType: "",
  836. summary: "",
  837. },
  838. });
  839. const loading = ref(false);
  840. const selectConfig = computed(() => {
  841. return [
  842. {
  843. label: "质检状态",
  844. prop: "qualityStatus",
  845. data: qualityStatus.value,
  846. },
  847. {
  848. label: "订单类型",
  849. prop: "orderType",
  850. data: orderType.value,
  851. },
  852. {
  853. label: "结论",
  854. prop: "summary",
  855. data: [],
  856. },
  857. ];
  858. });
  859. const config = computed(() => {
  860. return [
  861. {
  862. attrs: {
  863. label: "订单类型",
  864. prop: "orderType",
  865. width: 140,
  866. },
  867. },
  868. {
  869. attrs: {
  870. label: "订单号",
  871. prop: "contractCode",
  872. width: 180,
  873. },
  874. },
  875. {
  876. attrs: {
  877. label: "客户名称",
  878. prop: "customerName",
  879. "min-width": 180,
  880. },
  881. },
  882. {
  883. attrs: {
  884. label: "产品名称",
  885. prop: "productName",
  886. "min-width": 180,
  887. },
  888. },
  889. {
  890. attrs: {
  891. label: "尺寸",
  892. prop: "productModel",
  893. width: 160,
  894. },
  895. },
  896. {
  897. attrs: {
  898. label: "数量",
  899. prop: "expendQuantity",
  900. width: 140,
  901. },
  902. },
  903. {
  904. attrs: {
  905. label: "质检状态",
  906. prop: "qualityStatus",
  907. width: 140,
  908. },
  909. render(type) {
  910. if (!type) {
  911. if (type === 0) {
  912. return "质检中";
  913. }
  914. return "未质检";
  915. }
  916. return "已质检";
  917. },
  918. },
  919. {
  920. attrs: {
  921. label: "验货人",
  922. prop: "qualityUserName",
  923. width: 140,
  924. },
  925. },
  926. {
  927. attrs: {
  928. label: "质检时间",
  929. prop: "qualityTime",
  930. width: 160,
  931. },
  932. },
  933. {
  934. attrs: {
  935. label: "操作",
  936. width: 100,
  937. align: "center",
  938. fixed: "right",
  939. },
  940. renderHTML(row) {
  941. return [
  942. !row.qualityStatus && row.qualityStatus !== 0
  943. ? {
  944. attrs: {
  945. label: "质检",
  946. type: "primary",
  947. text: true,
  948. },
  949. el: "button",
  950. click() {
  951. clickInspection(row);
  952. },
  953. }
  954. : {},
  955. row.qualityStatus === 0
  956. ? {
  957. attrs: {
  958. label: "继续质检",
  959. type: "primary",
  960. text: true,
  961. },
  962. el: "button",
  963. click() {
  964. clickInspectionTwo(row);
  965. },
  966. }
  967. : {},
  968. ];
  969. },
  970. },
  971. ];
  972. });
  973. const getList = async (req) => {
  974. sourceList.value.pagination = { ...sourceList.value.pagination, ...req };
  975. loading.value = true;
  976. proxy.post("/stay/quality/page", sourceList.value.pagination).then((res) => {
  977. sourceList.value.data = res.rows;
  978. sourceList.value.pagination.total = res.total;
  979. setTimeout(() => {
  980. loading.value = false;
  981. }, 200);
  982. });
  983. };
  984. getList();
  985. const openInspection = ref(false);
  986. const steps = ref([
  987. { value: 1, label: "GENERAL INFORMATION" },
  988. { value: 2, label: "INSPECTION SUMMARY" },
  989. { value: 3, label: "REMARKS" },
  990. { value: 4, label: "CONCLUSION" },
  991. { value: 5, label: "QUANTITY" },
  992. { value: 6, label: "WORKMANSHIP" },
  993. { value: 7, label: "ON-SITE TESTS" },
  994. { value: 8, label: "PRODUCT SPECIFICATION" },
  995. { value: 9, label: "PACKING" },
  996. { value: 10, label: "MARKING & LABELING" },
  997. { value: 11, label: "SUPPORT DOCUMENTATION" },
  998. ]);
  999. const summaryType = ref([
  1000. { value: "Passed", label: "Passed" },
  1001. { value: "Failed", label: "Failed" },
  1002. { value: "Pending", label: "Pending" },
  1003. { value: "Actual Finding", label: "Actual Finding" },
  1004. ]);
  1005. const formOption = reactive({
  1006. inline: true,
  1007. labelWidth: 100,
  1008. itemWidth: 100,
  1009. rules: [],
  1010. });
  1011. const formConfig = computed(() => {
  1012. return [
  1013. {
  1014. type: "slot",
  1015. slotName: "steps",
  1016. },
  1017. ];
  1018. });
  1019. const rules = ref({
  1020. code: [{ required: true, message: "请输入", trigger: "blur" }],
  1021. inspectionDate: [{ required: true, message: "请输入", trigger: "change" }],
  1022. referenceSample: [{ required: true, message: "请选择", trigger: "change" }],
  1023. orderQuantity: [{ required: true, message: "请输入", trigger: "blur" }],
  1024. inspectionLocation: [{ required: true, message: "请输入", trigger: "blur" }],
  1025. summaryLabel: [{ required: true, message: "请输入", trigger: "blur" }],
  1026. summaryValue: [{ required: true, message: "请选择", trigger: "change" }],
  1027. summary: [{ required: true, message: "请输入", trigger: "blur" }],
  1028. sampleSize: [{ required: true, message: "请输入", trigger: "blur" }],
  1029. acceptance: [{ required: true, message: "请输入", trigger: "blur" }],
  1030. finding: [{ required: true, message: "请输入", trigger: "blur" }],
  1031. result: [{ required: true, message: "请输入", trigger: "blur" }],
  1032. aqlResult: [{ required: true, message: "请选择", trigger: "change" }],
  1033. summaryResult: [{ required: true, message: "请选择", trigger: "change" }],
  1034. summaryDescription: [{ required: true, message: "请输入", trigger: "blur" }],
  1035. remark: [{ required: true, message: "请输入", trigger: "blur" }],
  1036. orderQty: [{ required: true, message: "请输入", trigger: "blur" }],
  1037. cartonQty: [{ required: true, message: "请输入", trigger: "blur" }],
  1038. orderCartons: [{ required: true, message: "请输入", trigger: "blur" }],
  1039. packed: [{ required: true, message: "请输入", trigger: "blur" }],
  1040. unpacked: [{ required: true, message: "请输入", trigger: "blur" }],
  1041. unfinished: [{ required: true, message: "请输入", trigger: "blur" }],
  1042. samplePacked: [{ required: true, message: "请输入", trigger: "blur" }],
  1043. sampleUnpacked: [{ required: true, message: "请输入", trigger: "blur" }],
  1044. description: [{ required: true, message: "请输入", trigger: "blur" }],
  1045. critical: [{ required: true, message: "请输入", trigger: "blur" }],
  1046. major: [{ required: true, message: "请输入", trigger: "blur" }],
  1047. minor: [{ required: true, message: "请输入", trigger: "blur" }],
  1048. siteTestResult: [{ required: true, message: "请输入", trigger: "blur" }],
  1049. siteTestRemark: [{ required: true, message: "请输入", trigger: "blur" }],
  1050. passed: [{ required: true, message: "请输入", trigger: "blur" }],
  1051. failed: [{ required: true, message: "请输入", trigger: "blur" }],
  1052. productSpecificationResult: [{ required: true, message: "请选择", trigger: "change" }],
  1053. productSpecificationRemark: [{ required: true, message: "请输入", trigger: "blur" }],
  1054. cartonSpec: [{ required: true, message: "请输入", trigger: "blur" }],
  1055. cartonActual: [{ required: true, message: "请输入", trigger: "blur" }],
  1056. cartonSizeSpec: [{ required: true, message: "请输入", trigger: "blur" }],
  1057. cartonSizeActual: [{ required: true, message: "请输入", trigger: "blur" }],
  1058. grossWeightSpec: [{ required: true, message: "请输入", trigger: "blur" }],
  1059. grossWeightActual: [{ required: true, message: "请输入", trigger: "blur" }],
  1060. innerBoxSpec: [{ required: true, message: "请输入", trigger: "blur" }],
  1061. innerBoxActual: [{ required: true, message: "请输入", trigger: "blur" }],
  1062. markingType: [{ required: true, message: "请选择", trigger: "change" }],
  1063. name: [{ required: true, message: "请输入", trigger: "blur" }],
  1064. markingResult: [{ required: true, message: "请选择", trigger: "change" }],
  1065. });
  1066. const submit = ref(null);
  1067. const formData = reactive({
  1068. data: {},
  1069. });
  1070. const selectSteps = ref("");
  1071. const aqlResult = ref([
  1072. {
  1073. label: "Failed",
  1074. value: 1,
  1075. },
  1076. {
  1077. label: "Passed",
  1078. value: 0,
  1079. },
  1080. ]);
  1081. const markingType = ref([
  1082. {
  1083. label: "Barcode",
  1084. value: 0,
  1085. },
  1086. {
  1087. label: "Labeling",
  1088. value: 1,
  1089. },
  1090. {
  1091. label: "Printing",
  1092. value: 2,
  1093. },
  1094. ]);
  1095. const clickInspection = (row) => {
  1096. fileListOne.value = [];
  1097. fileListTwo.value = [];
  1098. fileListThree.value = [];
  1099. selectSteps.value = "";
  1100. let orderType = 0;
  1101. if (row.orderType === "外销合同") {
  1102. orderType = 1;
  1103. } else {
  1104. orderType = 2;
  1105. }
  1106. formData.data = {
  1107. businessType: orderType,
  1108. businessId: row.id,
  1109. supplyId: row.supplyId,
  1110. supplyName: row.supplyName,
  1111. productId: row.productId,
  1112. productName: row.productName,
  1113. status: 0,
  1114. summaryResult: 1,
  1115. siteTestResult: 1,
  1116. orderQuantity: undefined,
  1117. ehsdQualityAqlList: [
  1118. {
  1119. aqlLevel: "Critical: Not Allowed",
  1120. sampleSize: undefined,
  1121. acceptance: "",
  1122. finding: "",
  1123. result: "",
  1124. aqlResult: "",
  1125. },
  1126. {
  1127. aqlLevel: "Major: 1.0",
  1128. sampleSize: undefined,
  1129. acceptance: "",
  1130. finding: "",
  1131. result: "",
  1132. aqlResult: "",
  1133. },
  1134. {
  1135. aqlLevel: "Major: 1.5",
  1136. sampleSize: undefined,
  1137. acceptance: "",
  1138. finding: "",
  1139. result: "",
  1140. aqlResult: "",
  1141. },
  1142. ],
  1143. ehsdQualityProblemList: [],
  1144. ehsdQualityProductList: [
  1145. {
  1146. contractCode: row.contractCode,
  1147. item: row.productName,
  1148. orderQty: undefined,
  1149. cartonQty: undefined,
  1150. orderCartons: undefined,
  1151. packed: undefined,
  1152. unpacked: undefined,
  1153. unfinished: undefined,
  1154. samplePacked: undefined,
  1155. sampleUnpacked: undefined,
  1156. remark: "",
  1157. },
  1158. ],
  1159. ehsdQualityCartonsList: [
  1160. {
  1161. item: row.productName,
  1162. cartonNumber: undefined,
  1163. total: 1,
  1164. },
  1165. ],
  1166. ehsdQualityProductColorList: [
  1167. {
  1168. productId: row.productId,
  1169. productModel: row.productSpec,
  1170. refSample: "",
  1171. refSampleOne: "",
  1172. refSampleTwo: "",
  1173. refSampleThree: "",
  1174. remark: "",
  1175. },
  1176. {
  1177. productId: row.productId,
  1178. productModel: row.netWeight,
  1179. refSample: "",
  1180. refSampleOne: "",
  1181. refSampleTwo: "",
  1182. refSampleThree: "",
  1183. remark: "",
  1184. },
  1185. ],
  1186. ehsdQualityPackList: [
  1187. {
  1188. itemNo: row.productName,
  1189. cartonSpec: undefined,
  1190. cartonActual: undefined,
  1191. cartonSizeSpec: undefined,
  1192. cartonSizeActual: undefined,
  1193. grossWeightSpec: undefined,
  1194. grossWeightActual: undefined,
  1195. innerBoxSpec: undefined,
  1196. innerBoxActual: undefined,
  1197. remark: "",
  1198. },
  1199. ],
  1200. markingDetailList: [],
  1201. shippingMarksList: [
  1202. {
  1203. name: "Shipping Marks (on 2 sides)",
  1204. result: "",
  1205. },
  1206. {
  1207. name: "Side Marks (no marks)",
  1208. result: "",
  1209. },
  1210. ],
  1211. ehsdQualityWorkshipList: [],
  1212. sampleCollectionRecordFileList: [],
  1213. workshipPhotoFileList: [],
  1214. defectPhotosOfItemsFileList: [],
  1215. supportDocumentationFileList: [],
  1216. };
  1217. openInspection.value = true;
  1218. };
  1219. const clickInspectionTwo = (row) => {
  1220. fileListOne.value = [];
  1221. fileListTwo.value = [];
  1222. fileListThree.value = [];
  1223. openInspection.value = true;
  1224. proxy.post("/ehsdQuality/detail", { id: row.id }).then((res) => {
  1225. formData.data = res;
  1226. proxy.post("/fileInfo/getList", { businessIdList: [res.id], fileType: 10 }).then((fileObj) => {
  1227. formData.data.sampleCollectionRecordFileList = fileObj[res.id] || [];
  1228. if (formData.data.sampleCollectionRecordFileList && formData.data.sampleCollectionRecordFileList.length > 0) {
  1229. fileListOne.value = formData.data.sampleCollectionRecordFileList.map((item) => {
  1230. return {
  1231. raw: item,
  1232. name: item.fileName,
  1233. url: item.fileUrl,
  1234. };
  1235. });
  1236. }
  1237. });
  1238. proxy.post("/fileInfo/getList", { businessIdList: [res.id], fileType: 20 }).then((fileObj) => {
  1239. formData.data.workshipPhotoFileList = fileObj[res.id] || [];
  1240. if (formData.data.workshipPhotoFileList && formData.data.workshipPhotoFileList.length > 0) {
  1241. fileListTwo.value = formData.data.workshipPhotoFileList.map((item) => {
  1242. return {
  1243. raw: item,
  1244. name: item.fileName,
  1245. url: item.fileUrl,
  1246. };
  1247. });
  1248. }
  1249. });
  1250. proxy.post("/fileInfo/getList", { businessIdList: [res.id], fileType: 30 }).then((fileObj) => {
  1251. formData.data.defectPhotosOfItemsFileList = fileObj[res.id] || [];
  1252. if (formData.data.defectPhotosOfItemsFileList && formData.data.defectPhotosOfItemsFileList.length > 0) {
  1253. fileListThree.value = formData.data.defectPhotosOfItemsFileList.map((item) => {
  1254. return {
  1255. raw: item,
  1256. name: item.fileName,
  1257. url: item.fileUrl,
  1258. };
  1259. });
  1260. }
  1261. });
  1262. proxy.post("/fileInfo/getList", { businessIdList: [res.id], fileType: 40 }).then((fileObj) => {
  1263. formData.data.supportDocumentationFileList = fileObj[res.id] || [];
  1264. });
  1265. });
  1266. };
  1267. const clickSteps = (val) => {
  1268. if (formData.data.step) {
  1269. let step = formData.data.step.split(",");
  1270. if (!step.includes(val + "")) {
  1271. selectSteps.value = val;
  1272. }
  1273. } else {
  1274. selectSteps.value = val;
  1275. }
  1276. };
  1277. const getStepStatus = (item) => {
  1278. if (formData.data.step) {
  1279. let step = formData.data.step.split(",");
  1280. if (step.includes(item.value + "")) {
  1281. return "wait";
  1282. }
  1283. }
  1284. if (selectSteps.value === item.value) {
  1285. return "success";
  1286. }
  1287. return "process";
  1288. };
  1289. const submitFollow = (status) => {
  1290. if (status) {
  1291. submit.value.handleSubmit(() => {
  1292. if (formData.data.step) {
  1293. formData.data.step = formData.data.step + "," + selectSteps.value;
  1294. } else {
  1295. formData.data.step = selectSteps.value + "";
  1296. }
  1297. if (selectSteps.value === 2) {
  1298. formData.data.inspectionSummary = JSON.stringify(formData.data.inspectionSummaryList);
  1299. } else if (selectSteps.value === 3) {
  1300. if (fileListOne.value && fileListOne.value.length > 0) {
  1301. formData.data.sampleCollectionRecordFileList = fileListOne.value.map((item) => {
  1302. return {
  1303. id: item.raw.id,
  1304. fileName: item.raw.fileName,
  1305. fileUrl: item.raw.fileUrl,
  1306. remark: item.raw.remark,
  1307. };
  1308. });
  1309. } else {
  1310. formData.data.sampleCollectionRecordFileList = [];
  1311. }
  1312. } else if (selectSteps.value === 5) {
  1313. formData.data.ehsdQualityCartonsList = formData.data.ehsdQualityCartonsList.map((item) => {
  1314. return {
  1315. ...item,
  1316. total: formData.data.ehsdQualityCartonsList.length,
  1317. };
  1318. });
  1319. } else if (selectSteps.value === 6) {
  1320. if (fileListTwo.value && fileListTwo.value.length > 0) {
  1321. formData.data.workshipPhotoFileList = fileListTwo.value.map((item) => {
  1322. return {
  1323. id: item.raw.id,
  1324. fileName: item.raw.fileName,
  1325. fileUrl: item.raw.fileUrl,
  1326. remark: item.raw.remark,
  1327. };
  1328. });
  1329. } else {
  1330. formData.data.workshipPhotoFileList = [];
  1331. }
  1332. } else if (selectSteps.value === 7) {
  1333. if (fileListThree.value && fileListThree.value.length > 0) {
  1334. formData.data.defectPhotosOfItemsFileList = fileListThree.value.map((item) => {
  1335. return {
  1336. id: item.raw.id,
  1337. fileName: item.raw.fileName,
  1338. fileUrl: item.raw.fileUrl,
  1339. remark: item.raw.remark,
  1340. };
  1341. });
  1342. } else {
  1343. formData.data.defectPhotosOfItemsFileList = [];
  1344. }
  1345. } else if (selectSteps.value === 10) {
  1346. formData.data.shippingMarks = JSON.stringify(formData.data.shippingMarksList);
  1347. } else if (selectSteps.value === 11) {
  1348. if (!(formData.data.supportDocumentationFileList && formData.data.supportDocumentationFileList.length > 0)) {
  1349. return ElMessage("请上传视频");
  1350. }
  1351. }
  1352. proxy.post("/ehsdQuality/submit", formData.data).then(() => {
  1353. ElMessage({
  1354. message: "保存成功",
  1355. type: "success",
  1356. });
  1357. getList();
  1358. fileListOne.value = [];
  1359. fileListTwo.value = [];
  1360. fileListThree.value = [];
  1361. selectSteps.value = "";
  1362. proxy.post("/ehsdQuality/detail", { id: formData.data.businessId }).then((res) => {
  1363. formData.data = res;
  1364. proxy.post("/fileInfo/getList", { businessIdList: [res.id], fileType: 10 }).then((fileObj) => {
  1365. formData.data.sampleCollectionRecordFileList = fileObj[res.id] || [];
  1366. if (formData.data.sampleCollectionRecordFileList && formData.data.sampleCollectionRecordFileList.length > 0) {
  1367. fileListOne.value = formData.data.sampleCollectionRecordFileList.map((item) => {
  1368. return {
  1369. raw: item,
  1370. name: item.fileName,
  1371. url: item.fileUrl,
  1372. };
  1373. });
  1374. }
  1375. });
  1376. proxy.post("/fileInfo/getList", { businessIdList: [res.id], fileType: 20 }).then((fileObj) => {
  1377. formData.data.workshipPhotoFileList = fileObj[res.id] || [];
  1378. if (formData.data.workshipPhotoFileList && formData.data.workshipPhotoFileList.length > 0) {
  1379. fileListTwo.value = formData.data.workshipPhotoFileList.map((item) => {
  1380. return {
  1381. raw: item,
  1382. name: item.fileName,
  1383. url: item.fileUrl,
  1384. };
  1385. });
  1386. }
  1387. });
  1388. proxy.post("/fileInfo/getList", { businessIdList: [res.id], fileType: 30 }).then((fileObj) => {
  1389. formData.data.defectPhotosOfItemsFileList = fileObj[res.id] || [];
  1390. if (formData.data.defectPhotosOfItemsFileList && formData.data.defectPhotosOfItemsFileList.length > 0) {
  1391. fileListThree.value = formData.data.defectPhotosOfItemsFileList.map((item) => {
  1392. return {
  1393. raw: item,
  1394. name: item.fileName,
  1395. url: item.fileUrl,
  1396. };
  1397. });
  1398. }
  1399. });
  1400. proxy.post("/fileInfo/getList", { businessIdList: [res.id], fileType: 40 }).then((fileObj) => {
  1401. formData.data.supportDocumentationFileList = fileObj[res.id] || [];
  1402. });
  1403. });
  1404. });
  1405. });
  1406. } else {
  1407. if (selectSteps.value === 2) {
  1408. formData.data.inspectionSummary = JSON.stringify(formData.data.inspectionSummaryList);
  1409. } else if (selectSteps.value === 3) {
  1410. if (fileListOne.value && fileListOne.value.length > 0) {
  1411. formData.data.sampleCollectionRecordFileList = fileListOne.value.map((item) => {
  1412. return {
  1413. id: item.raw.id,
  1414. fileName: item.raw.fileName,
  1415. fileUrl: item.raw.fileUrl,
  1416. remark: item.raw.remark,
  1417. };
  1418. });
  1419. } else {
  1420. formData.data.sampleCollectionRecordFileList = [];
  1421. }
  1422. } else if (selectSteps.value === 5) {
  1423. formData.data.ehsdQualityCartonsList = formData.data.ehsdQualityCartonsList.map((item) => {
  1424. return {
  1425. ...item,
  1426. total: formData.data.ehsdQualityCartonsList.length,
  1427. };
  1428. });
  1429. } else if (selectSteps.value === 6) {
  1430. if (fileListTwo.value && fileListTwo.value.length > 0) {
  1431. formData.data.workshipPhotoFileList = fileListTwo.value.map((item) => {
  1432. return {
  1433. id: item.raw.id,
  1434. fileName: item.raw.fileName,
  1435. fileUrl: item.raw.fileUrl,
  1436. remark: item.raw.remark,
  1437. };
  1438. });
  1439. } else {
  1440. formData.data.workshipPhotoFileList = [];
  1441. }
  1442. } else if (selectSteps.value === 7) {
  1443. if (fileListThree.value && fileListThree.value.length > 0) {
  1444. formData.data.defectPhotosOfItemsFileList = fileListThree.value.map((item) => {
  1445. return {
  1446. id: item.raw.id,
  1447. fileName: item.raw.fileName,
  1448. fileUrl: item.raw.fileUrl,
  1449. remark: item.raw.remark,
  1450. };
  1451. });
  1452. } else {
  1453. formData.data.defectPhotosOfItemsFileList = [];
  1454. }
  1455. } else if (selectSteps.value === 10) {
  1456. formData.data.shippingMarks = JSON.stringify(formData.data.shippingMarksList);
  1457. }
  1458. proxy.post("/ehsdQuality/submit", formData.data).then(() => {
  1459. ElMessage({
  1460. message: "暂存成功",
  1461. type: "success",
  1462. });
  1463. });
  1464. }
  1465. };
  1466. const clickAdd = () => {
  1467. if (formData.data.inspectionSummaryList && formData.data.inspectionSummaryList.length > 0) {
  1468. formData.data.inspectionSummaryList.push({
  1469. summaryLabel: "",
  1470. summaryValue: "Passed",
  1471. });
  1472. } else {
  1473. formData.data.inspectionSummaryList = [
  1474. {
  1475. summaryLabel: "",
  1476. summaryValue: "Passed",
  1477. },
  1478. ];
  1479. }
  1480. };
  1481. const handleDelete = (index) => {
  1482. formData.data.inspectionSummaryList.splice(index, 1);
  1483. };
  1484. const changeAqlResult = () => {
  1485. let data = formData.data.ehsdQualityAqlList.filter((item) => item.aqlResult === 0);
  1486. if (data && data.length === 3) {
  1487. formData.data.summaryResult = 0;
  1488. } else {
  1489. formData.data.summaryResult = 1;
  1490. }
  1491. };
  1492. const clickProblemAdd = () => {
  1493. if (formData.data.ehsdQualityProblemList && formData.data.ehsdQualityProblemList.length > 0) {
  1494. formData.data.ehsdQualityProblemList.push({
  1495. remark: "",
  1496. });
  1497. } else {
  1498. formData.data.ehsdQualityProblemList = [
  1499. {
  1500. remark: "",
  1501. },
  1502. ];
  1503. }
  1504. };
  1505. const handleProblemDelete = (index) => {
  1506. formData.data.ehsdQualityProblemList.splice(index, 1);
  1507. };
  1508. const onPreviewFile = (file) => {
  1509. window.open(file.raw.fileUrl, "_blank");
  1510. };
  1511. const fileListOne = ref([]);
  1512. const uploadDataOne = ref({});
  1513. const uploadFileOne = async (file) => {
  1514. const res = await proxy.post("/fileInfo/getSing", { fileName: file.name });
  1515. uploadDataOne.value = res.uploadBody;
  1516. file.id = res.id;
  1517. file.fileName = res.fileName;
  1518. file.fileUrl = res.fileUrl;
  1519. file.uploadState = true;
  1520. return true;
  1521. };
  1522. const onRemoveOne = (file) => {
  1523. fileListOne.value = fileListOne.value.filter((item) => item.raw.fileUrl !== file.raw.fileUrl);
  1524. };
  1525. const fileListTwo = ref([]);
  1526. const uploadDataTwo = ref({});
  1527. const uploadFileTwo = async (file) => {
  1528. const res = await proxy.post("/fileInfo/getSing", { fileName: file.name });
  1529. uploadDataTwo.value = res.uploadBody;
  1530. file.id = res.id;
  1531. file.fileName = res.fileName;
  1532. file.fileUrl = res.fileUrl;
  1533. file.uploadState = true;
  1534. return true;
  1535. };
  1536. const onRemoveTwo = (file) => {
  1537. fileListTwo.value = fileListTwo.value.filter((item) => item.raw.fileUrl !== file.raw.fileUrl);
  1538. };
  1539. const fileListThree = ref([]);
  1540. const uploadDataThree = ref({});
  1541. const uploadFileThree = async (file) => {
  1542. const res = await proxy.post("/fileInfo/getSing", { fileName: file.name });
  1543. uploadDataThree.value = res.uploadBody;
  1544. file.id = res.id;
  1545. file.fileName = res.fileName;
  1546. file.fileUrl = res.fileUrl;
  1547. file.uploadState = true;
  1548. return true;
  1549. };
  1550. const onRemoveThree = (file) => {
  1551. fileListThree.value = fileListThree.value.filter((item) => item.raw.fileUrl !== file.raw.fileUrl);
  1552. };
  1553. const uploadDataFour = ref({});
  1554. const uploadFileFour = async (file) => {
  1555. const res = await proxy.post("/fileInfo/getSing", { fileName: file.name });
  1556. uploadDataFour.value = res.uploadBody;
  1557. file.id = res.id;
  1558. file.fileName = res.fileName;
  1559. file.fileUrl = res.fileUrl;
  1560. file.uploadState = true;
  1561. return true;
  1562. };
  1563. const onSuccess = (response, uploadFile) => {
  1564. formData.data.supportDocumentationFileList = [
  1565. {
  1566. id: uploadFile.raw.id,
  1567. fileName: uploadFile.raw.fileName,
  1568. fileUrl: uploadFile.raw.fileUrl,
  1569. },
  1570. ];
  1571. };
  1572. const remarkIndex = ref("");
  1573. const remarkFileUrl = ref("");
  1574. const openRemark = ref(false);
  1575. const submitRemark = ref(null);
  1576. const formRemarkData = reactive({
  1577. data: {
  1578. remark: "",
  1579. },
  1580. });
  1581. const formRemarkConfig = computed(() => {
  1582. return [
  1583. {
  1584. type: "slot",
  1585. slotName: "remark",
  1586. },
  1587. ];
  1588. });
  1589. const rulesRemark = ref({
  1590. remark: [{ required: true, message: "请输入", trigger: "blur" }],
  1591. });
  1592. const clickFileRemark = (file, index) => {
  1593. remarkIndex.value = index;
  1594. remarkFileUrl.value = file.raw.fileUrl;
  1595. formRemarkData.data.remark = file.raw.remark;
  1596. openRemark.value = true;
  1597. };
  1598. const submitFileRemark = () => {
  1599. submitRemark.value.handleSubmit(() => {
  1600. if (remarkIndex.value === 1) {
  1601. fileListOne.value = fileListOne.value.map((item) => {
  1602. if (item.raw.fileUrl === remarkFileUrl.value) {
  1603. item.raw.remark = formRemarkData.data.remark;
  1604. }
  1605. return {
  1606. ...item,
  1607. };
  1608. });
  1609. } else if (remarkIndex.value === 2) {
  1610. fileListTwo.value = fileListTwo.value.map((item) => {
  1611. if (item.raw.fileUrl === remarkFileUrl.value) {
  1612. item.raw.remark = formRemarkData.data.remark;
  1613. }
  1614. return {
  1615. ...item,
  1616. };
  1617. });
  1618. } else if (remarkIndex.value === 3) {
  1619. fileListThree.value = fileListThree.value.map((item) => {
  1620. if (item.raw.fileUrl === remarkFileUrl.value) {
  1621. item.raw.remark = formRemarkData.data.remark;
  1622. }
  1623. return {
  1624. ...item,
  1625. };
  1626. });
  1627. }
  1628. openRemark.value = false;
  1629. });
  1630. };
  1631. const clickCartonsAdd = () => {
  1632. formData.data.ehsdQualityCartonsList.push({
  1633. item: formData.data.ehsdQualityCartonsList[0].item,
  1634. cartonNumber: undefined,
  1635. total: 1,
  1636. });
  1637. };
  1638. const changeClass = ({ row, rowIndex }) => {
  1639. if (rowIndex !== 0) {
  1640. return "hideClass";
  1641. }
  1642. };
  1643. const clickWorkShipAdd = () => {
  1644. if (formData.data.ehsdQualityWorkshipList && formData.data.ehsdQualityWorkshipList.length > 0) {
  1645. formData.data.ehsdQualityWorkshipList.push({
  1646. description: "",
  1647. remark: "",
  1648. critical: undefined,
  1649. major: undefined,
  1650. minor: undefined,
  1651. });
  1652. } else {
  1653. formData.data.ehsdQualityWorkshipList = [
  1654. {
  1655. description: "",
  1656. remark: "",
  1657. critical: undefined,
  1658. major: undefined,
  1659. minor: undefined,
  1660. },
  1661. ];
  1662. }
  1663. };
  1664. const handleWorkShipDelete = (index) => {
  1665. formData.data.ehsdQualityWorkshipList.splice(index, 1);
  1666. };
  1667. const getSummaries = (param) => {
  1668. const { columns, data } = param;
  1669. const sums = [];
  1670. columns.forEach((column, index) => {
  1671. if (index === 0) {
  1672. sums[index] = " ";
  1673. return;
  1674. } else if (index === 1) {
  1675. sums[index] = "Finding";
  1676. return;
  1677. } else if (index === 2) {
  1678. let num = 0;
  1679. data.map((item) => {
  1680. if (item.critical) {
  1681. num = num + Number(item.critical);
  1682. }
  1683. });
  1684. sums[index] = num;
  1685. return;
  1686. } else if (index === 3) {
  1687. let num = 0;
  1688. data.map((item) => {
  1689. if (item.major) {
  1690. num = num + Number(item.major);
  1691. }
  1692. });
  1693. sums[index] = num;
  1694. return;
  1695. } else if (index === 4) {
  1696. let num = 0;
  1697. data.map((item) => {
  1698. if (item.minor) {
  1699. num = num + Number(item.minor);
  1700. }
  1701. });
  1702. sums[index] = num;
  1703. return;
  1704. }
  1705. });
  1706. return sums;
  1707. };
  1708. const clickSiteTestAdd = () => {
  1709. if (formData.data.ehsdQualitySiteTestList && formData.data.ehsdQualitySiteTestList.length > 0) {
  1710. formData.data.ehsdQualitySiteTestList.push({
  1711. description: "",
  1712. sampleSize: undefined,
  1713. passed: "",
  1714. failed: "",
  1715. remark: "",
  1716. result: "",
  1717. });
  1718. } else {
  1719. formData.data.ehsdQualitySiteTestList = [
  1720. {
  1721. description: "",
  1722. sampleSize: undefined,
  1723. passed: "",
  1724. failed: "",
  1725. remark: "",
  1726. result: "",
  1727. },
  1728. ];
  1729. }
  1730. };
  1731. const changeSiteTestResult = () => {
  1732. let data = formData.data.ehsdQualitySiteTestList.filter((item) => item.result === 0);
  1733. if (data && data.length === formData.data.ehsdQualitySiteTestList.length) {
  1734. formData.data.siteTestResult = 0;
  1735. } else {
  1736. formData.data.siteTestResult = 1;
  1737. }
  1738. };
  1739. const clickMarkingAdd = () => {
  1740. if (formData.data.markingDetailList && formData.data.markingDetailList.length > 0) {
  1741. formData.data.markingDetailList.push({
  1742. name: "",
  1743. result: "",
  1744. });
  1745. } else {
  1746. formData.data.markingDetailList = [
  1747. {
  1748. name: "",
  1749. result: "",
  1750. },
  1751. ];
  1752. }
  1753. };
  1754. </script>
  1755. <style lang="scss" scoped>
  1756. .tenant {
  1757. padding: 20px;
  1758. }
  1759. ::v-deep(.el-input-number .el-input__inner) {
  1760. text-align: left;
  1761. }
  1762. ::v-deep(.el-upload-list--picture-card .el-upload-list__item) {
  1763. border: 0 !important;
  1764. }
  1765. ::v-deep(.el-upload-list--picture-card .el-upload-list__item-thumbnail) {
  1766. width: 110px !important;
  1767. height: 110px !important;
  1768. }
  1769. ::v-deep(.el-upload-list--picture-card .el-upload-list__item-actions) {
  1770. width: 110px !important;
  1771. height: 110px !important;
  1772. }
  1773. .steps-aaa {
  1774. overflow-x: auto;
  1775. overflow-y: hidden;
  1776. width: 100%;
  1777. padding: 0 10px;
  1778. }
  1779. ::v-deep(.hideClass) {
  1780. display: none;
  1781. }
  1782. .avatar-uploader .avatar {
  1783. width: 148px;
  1784. height: 148px;
  1785. display: block;
  1786. background-color: black;
  1787. }
  1788. .avatar-uploader .el-upload {
  1789. border: 1px dashed var(--el-border-color);
  1790. border-radius: 6px;
  1791. cursor: pointer;
  1792. position: relative;
  1793. overflow: hidden;
  1794. transition: var(--el-transition-duration-fast);
  1795. }
  1796. .avatar-uploader .el-upload:hover {
  1797. border-color: var(--el-color-primary);
  1798. }
  1799. .el-icon.avatar-uploader-icon {
  1800. font-size: 28px;
  1801. color: #8c939d;
  1802. width: 148px;
  1803. height: 148px;
  1804. text-align: center;
  1805. border: 1px dashed var(--el-border-color);
  1806. }
  1807. </style>