quality.vue 47 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464
  1. <template>
  2. <div class="ele-body">
  3. <el-card shadow="never">
  4. <div>
  5. <div class="content-detail">
  6. <header-title title="基本信息" size="16px"></header-title>
  7. <div class="mt20">
  8. <el-form label-width="120px">
  9. <el-col :span="8">
  10. <el-form-item label="入库单:">
  11. <span>{{ infoData.bizNo }}</span>
  12. </el-form-item>
  13. </el-col>
  14. <el-col :span="8">
  15. <el-form-item label="入库物品类型:">
  16. <span>{{ handleAssetType(extInfo.assetType) }}</span>
  17. </el-form-item>
  18. </el-col>
  19. <el-col :span="8">
  20. <el-form-item label="入库场景:">
  21. <span>{{ getSceneState(infoData.bizType) }}</span>
  22. </el-form-item>
  23. </el-col>
  24. <el-col :span="8">
  25. <el-form-item label="关联订单:">
  26. <span>{{ extInfo.documentSource }}</span>
  27. </el-form-item>
  28. </el-col>
  29. <el-col :span="8">
  30. <el-form-item label="权属部门:">
  31. <span>{{ extInfo.deptName }}</span>
  32. </el-form-item>
  33. </el-col>
  34. <el-col :span="8">
  35. <el-form-item label="入库登记人:">
  36. <span>{{ extInfo.createUserName }}</span>
  37. </el-form-item>
  38. </el-col>
  39. <el-col :span="8">
  40. <el-form-item label="入库时间:">
  41. <span>{{ infoData.createTime }}</span>
  42. </el-form-item>
  43. </el-col>
  44. <el-col :span="8">
  45. <el-form-item label="状态:">
  46. <span>{{ stepsTitle }}</span>
  47. </el-form-item>
  48. </el-col>
  49. <el-col :span="8">
  50. <el-form-item label="审核人:">
  51. <span>{{ infoData.verifyName }}</span>
  52. </el-form-item>
  53. </el-col>
  54. <el-col :span="8" v-if="infoData.bizType == 2">
  55. <el-form-item label="客户:">
  56. <span>{{ infoData.clientName }}</span>
  57. </el-form-item>
  58. </el-col>
  59. <el-col :span="8" v-if="infoData.bizType == 2">
  60. <el-form-item label="供应商:">
  61. <span>{{ extInfo.supplierName }}</span>
  62. </el-form-item>
  63. </el-col>
  64. <el-col :span="8">
  65. <el-form-item label="送货人:">
  66. <span>{{ infoData.fromUser }}</span>
  67. </el-form-item>
  68. </el-col>
  69. <el-col :span="8">
  70. <el-form-item label="送货人联系方式:">
  71. <span>{{ extInfo.deliveryPhone }}</span>
  72. </el-form-item>
  73. </el-col>
  74. <el-col :span="8">
  75. <el-form-item label="附件:">
  76. <el-link
  77. type="primary"
  78. v-for="item in infoData.qualityFile"
  79. @click="download(item)"
  80. :key="item.name"
  81. >{{ item.name }}</el-link
  82. >
  83. </el-form-item>
  84. </el-col>
  85. <el-col :span="24">
  86. <el-form-item label="备注:">
  87. <span>{{ infoData.remark }}</span>
  88. </el-form-item>
  89. </el-col>
  90. </el-form>
  91. </div>
  92. </div>
  93. <div class="content-detail mt20">
  94. <header-title title="产品信息" size="16px"></header-title>
  95. <el-table
  96. ref="productListTable"
  97. :data="productList"
  98. tooltip-effect="dark"
  99. :max-height="300"
  100. :header-cell-style="rowClass"
  101. border
  102. >
  103. <el-table-column label="序号" type="index" width="50">
  104. </el-table-column>
  105. <el-table-column
  106. label="编码"
  107. prop="categoryCode"
  108. align="center"
  109. :show-overflow-tooltip="true"
  110. ></el-table-column>
  111. <el-table-column
  112. label="名称"
  113. align="center"
  114. prop="categoryName"
  115. :show-overflow-tooltip="true"
  116. ></el-table-column>
  117. <el-table-column
  118. v-if="clientEnvironmentId == 4"
  119. label="级别"
  120. prop="level"
  121. align="center"
  122. >
  123. </el-table-column>
  124. <el-table-column
  125. label="型号"
  126. align="center"
  127. prop="categoryModel"
  128. :show-overflow-tooltip="true"
  129. ></el-table-column>
  130. <el-table-column
  131. label="规格"
  132. align="center"
  133. prop="specification"
  134. :show-overflow-tooltip="true"
  135. ></el-table-column>
  136. <el-table-column
  137. label="牌号"
  138. align="center"
  139. prop="brandNum"
  140. :show-overflow-tooltip="true"
  141. ></el-table-column>
  142. <el-table-column
  143. v-for="(item, index) in newColumns"
  144. :label="item.label"
  145. :align="item.align"
  146. :prop="item.prop"
  147. :show-overflow-tooltip="item.showOverflowTooltip"
  148. ></el-table-column>
  149. <el-table-column
  150. label="批次号"
  151. prop="batchNo"
  152. align="center"
  153. :show-overflow-tooltip="true"
  154. >
  155. </el-table-column>
  156. <!-- <el-table-column
  157. label="最小包装单元"
  158. align="center"
  159. width="120"
  160. prop="minPackingQuantity"
  161. >
  162. <template slot-scope="{ row, $index }">
  163. {{ row.minPackingQuantity }} {{ row.measureUnit }} /{{
  164. row.packingUnit
  165. }}
  166. </template>
  167. </el-table-column> -->
  168. <el-table-column
  169. label="包装数量"
  170. v-if="clientEnvironmentId == 3"
  171. prop="packingQuantity"
  172. align="center"
  173. >
  174. <template slot-scope="{ row, $index }">
  175. {{ row.packingQuantity }} {{ row.packingUnit }}
  176. </template>
  177. </el-table-column>
  178. <el-table-column
  179. v-else
  180. label="包装数量"
  181. prop="packingQuantity"
  182. width="80"
  183. ></el-table-column>
  184. <el-table-column
  185. v-if="clientEnvironmentId == 3"
  186. label="最小包装单元"
  187. align="center"
  188. width="120"
  189. prop="minPackingQuantity"
  190. >
  191. <template slot-scope="{ row, $index }">
  192. {{ row.minPackingQuantity }} {{ row.measureUnit }} /{{
  193. row.packingUnit
  194. }}
  195. </template>
  196. </el-table-column>
  197. <el-table-column
  198. v-else
  199. label="包装单位"
  200. prop="packingUnit"
  201. ></el-table-column>
  202. <el-table-column
  203. label="计量数量"
  204. prop="measureQuantity"
  205. :show-overflow-tooltip="true"
  206. ></el-table-column>
  207. <el-table-column
  208. label="计量单位"
  209. prop="measureUnit"
  210. ></el-table-column>
  211. <el-table-column
  212. label="重量"
  213. prop="weight"
  214. align="center"
  215. :show-overflow-tooltip="true"
  216. >
  217. </el-table-column>
  218. <el-table-column
  219. label="重量单位"
  220. prop="weightUnit"
  221. align="center"
  222. :show-overflow-tooltip="true"
  223. >
  224. </el-table-column>
  225. <el-table-column label="单价" prop="price" align="center">
  226. <template slot-scope="{ row }">
  227. <template>
  228. {{ row.price ? row.price : '-' + '元' }}/{{ row.measureUnit }}
  229. </template>
  230. </template>
  231. </el-table-column>
  232. <el-table-column
  233. label="金额"
  234. align="center"
  235. prop="contentImage"
  236. :show-overflow-tooltip="true"
  237. >
  238. <template slot-scope="{ row, $index }">
  239. {{ row.totalMoney ? row.totalMoney : 0 }}
  240. </template>
  241. </el-table-column>
  242. <el-table-column
  243. v-if="clientEnvironmentId == 4"
  244. label="采购原因"
  245. align="center"
  246. prop="purpose"
  247. :show-overflow-tooltip="true"
  248. ></el-table-column>
  249. <el-table-column
  250. label="供应商"
  251. prop="supplierName"
  252. :show-overflow-tooltip="true"
  253. >
  254. </el-table-column>
  255. <el-table-column
  256. label="仓库"
  257. prop="warehouseName"
  258. :show-overflow-tooltip="true"
  259. >
  260. </el-table-column>
  261. </el-table>
  262. </div>
  263. <div class="mt20">
  264. <header-title :title="`包装明细`" size="16px"></header-title>
  265. <el-table
  266. ref="showPackingListTable"
  267. :data="showPackingList"
  268. tooltip-effect="dark"
  269. :max-height="300"
  270. :row-class-name="tableRowClassName"
  271. :header-cell-style="rowClass"
  272. border
  273. v-el-table-infinite-scroll="pickingHandleScroll"
  274. >
  275. <el-table-column label="序号" type="index" width="50">
  276. </el-table-column>
  277. <el-table-column
  278. label="编码"
  279. prop="categoryCode"
  280. :show-overflow-tooltip="true"
  281. ></el-table-column>
  282. <el-table-column
  283. label="名称"
  284. prop="categoryName"
  285. :show-overflow-tooltip="true"
  286. ></el-table-column>
  287. <el-table-column
  288. label="批次号"
  289. prop="batchNo"
  290. :show-overflow-tooltip="true"
  291. ></el-table-column>
  292. <el-table-column
  293. label="发货条码"
  294. prop="barcodes"
  295. :show-overflow-tooltip="true"
  296. ></el-table-column>
  297. <el-table-column
  298. label="包装编码"
  299. prop="packageNo"
  300. :show-overflow-tooltip="true"
  301. ></el-table-column>
  302. <el-table-column
  303. label="包装数量"
  304. prop="packingQuantity"
  305. :show-overflow-tooltip="true"
  306. ></el-table-column>
  307. <el-table-column
  308. label="包装单位"
  309. prop="packingUnit"
  310. :show-overflow-tooltip="true"
  311. ></el-table-column>
  312. <el-table-column
  313. label="计量数量"
  314. prop="measureQuantity"
  315. :show-overflow-tooltip="true"
  316. ></el-table-column>
  317. <el-table-column
  318. label="计量单位"
  319. prop="measureUnit"
  320. :show-overflow-tooltip="true"
  321. ></el-table-column>
  322. <el-table-column
  323. label="物料代号"
  324. width="200"
  325. prop="materielDesignation"
  326. :show-overflow-tooltip="true"
  327. >
  328. <template slot-scope="{ row, $index }">
  329. <el-input
  330. v-if="qualityInspectionItems.includes('materielDesignation')"
  331. :ref="'packing_materielDesignation' + $index"
  332. @keyup.native="
  333. moveFocus(
  334. $event,
  335. $index,
  336. 'packing_materielDesignation',
  337. '包装',
  338. row
  339. )
  340. "
  341. v-model="row.materielDesignation"
  342. ></el-input>
  343. <span v-else>{{ row.materielDesignation }}</span>
  344. </template>
  345. </el-table-column>
  346. <el-table-column
  347. label="客户代号"
  348. prop="clientCode"
  349. width="200"
  350. :show-overflow-tooltip="true"
  351. >
  352. <template slot-scope="{ row, $index }">
  353. <el-input
  354. v-if="qualityInspectionItems.includes('clientCode')"
  355. :ref="'packing_clientCode' + $index"
  356. @keyup.native="
  357. moveFocus($event, $index, 'packing_clientCode', '包装', row)
  358. "
  359. v-model="row.clientCode"
  360. ></el-input>
  361. <span v-else>{{ row.clientCode }}</span>
  362. </template>
  363. </el-table-column>
  364. <el-table-column
  365. label="刻码"
  366. prop="engrave"
  367. width="200"
  368. :show-overflow-tooltip="true"
  369. >
  370. <template slot-scope="{ row, $index }">
  371. <el-input
  372. v-if="qualityInspectionItems.includes('engrave')"
  373. :ref="'packing_engrave' + $index"
  374. @keyup.native="
  375. moveFocus($event, $index, 'packing_engrave', '包装', row)
  376. "
  377. v-model="row.engrave"
  378. ></el-input>
  379. <span v-else>{{ row.engrave }}</span>
  380. </template>
  381. </el-table-column>
  382. <el-table-column label="重量" prop="weight" width="100">
  383. <template slot-scope="{ row, $index }">
  384. <el-input
  385. v-if="
  386. row.measureUnit != row.weightUnit &&
  387. qualityInspectionItems.includes('weight')
  388. "
  389. :ref="'packing_weight' + $index"
  390. @keyup.native="
  391. moveFocus($event, $index, 'packing_weight', '包装', row)
  392. "
  393. v-model.number="row.weight"
  394. @input="weightInput($event, row, '包装')"
  395. ></el-input>
  396. <span v-else>{{ row.weight }}</span>
  397. </template>
  398. </el-table-column>
  399. <el-table-column
  400. label="重量单位"
  401. prop="weightUnit"
  402. :show-overflow-tooltip="true"
  403. >
  404. </el-table-column>
  405. <el-table-column label="质检结果" prop="result" width="120">
  406. <template slot-scope="{ row }">
  407. <el-select
  408. v-if="qualityInspectionItems.includes('result')"
  409. @change="changeWrapStatus($event, row, '包装')"
  410. v-model="row.result"
  411. placeholder="请选择"
  412. >
  413. <el-option
  414. v-for="item in qualityResultsOptions"
  415. :label="item.label"
  416. :value="item.value"
  417. :key="item.value"
  418. >
  419. </el-option>
  420. </el-select>
  421. <span v-else>{{ qualityResults[row.result] }}</span>
  422. </template>
  423. </el-table-column>
  424. <el-table-column
  425. label="质检状态"
  426. prop="status"
  427. :show-overflow-tooltip="true"
  428. >
  429. <template slot-scope="{ row }">
  430. <span>{{ qualityStatus[row.status] }}</span>
  431. </template>
  432. </el-table-column>
  433. <el-table-column
  434. label="生产日期"
  435. prop="productionDate"
  436. :show-overflow-tooltip="true"
  437. >
  438. </el-table-column>
  439. <el-table-column
  440. label="采购日期"
  441. prop="purchaseDate"
  442. :show-overflow-tooltip="true"
  443. >
  444. </el-table-column>
  445. </el-table>
  446. </div>
  447. <div class="mt20">
  448. <header-title :title="`物料明细`" size="16px"> </header-title>
  449. <el-table
  450. ref="multipleTable"
  451. :data="showMaterialList"
  452. tooltip-effect="dark"
  453. :max-height="300"
  454. :row-class-name="tableRowClassName"
  455. :header-cell-style="rowClass"
  456. border
  457. style="width: 100%"
  458. stripe
  459. height="300px"
  460. v-el-table-infinite-scroll="materielHandleScroll"
  461. >
  462. <el-table-column label="序号" type="index" width="50">
  463. </el-table-column>
  464. <el-table-column
  465. label="编码"
  466. prop="categoryCode"
  467. :show-overflow-tooltip="true"
  468. ></el-table-column>
  469. <el-table-column
  470. label="名称"
  471. prop="categoryName"
  472. :show-overflow-tooltip="true"
  473. ></el-table-column>
  474. <el-table-column label="批次号" prop="batchNo"></el-table-column>
  475. <el-table-column
  476. label="物料编码"
  477. prop="materialCode"
  478. :show-overflow-tooltip="true"
  479. ></el-table-column>
  480. <el-table-column
  481. label="发货条码"
  482. prop="barcodes"
  483. :show-overflow-tooltip="true"
  484. ></el-table-column>
  485. <el-table-column
  486. label="计量数量"
  487. prop="measureQuantity"
  488. ></el-table-column>
  489. <el-table-column
  490. label="计量单位"
  491. prop="measureUnit"
  492. ></el-table-column>
  493. <el-table-column
  494. label="物料代号"
  495. prop="materielDesignation"
  496. width="200"
  497. >
  498. <template slot-scope="{ row, $index }">
  499. <el-input
  500. v-if="qualityInspectionItems.includes('materielDesignation')"
  501. :ref="'material_materielDesignation' + $index"
  502. @keyup.native="
  503. moveFocus(
  504. $event,
  505. $index,
  506. 'material_materielDesignation',
  507. '物料',
  508. row
  509. )
  510. "
  511. v-model="row.materielDesignation"
  512. ></el-input>
  513. <span v-else>{{ row.materielDesignation }}</span>
  514. </template>
  515. </el-table-column>
  516. <el-table-column label="客户代号" prop="clientCode" width="200">
  517. <template slot-scope="{ row, $index }">
  518. <el-input
  519. v-if="qualityInspectionItems.includes('clientCode')"
  520. :ref="'material_clientCode' + $index"
  521. @keyup.native="
  522. moveFocus(
  523. $event,
  524. $index,
  525. 'material_clientCode',
  526. '物料',
  527. row
  528. )
  529. "
  530. v-model="row.clientCode"
  531. ></el-input>
  532. <span v-else>{{ row.clientCode }}</span>
  533. </template>
  534. </el-table-column>
  535. <el-table-column label="刻码" prop="engrave" width="200">
  536. <template slot-scope="{ row, $index }">
  537. <el-input
  538. v-if="qualityInspectionItems.includes('engrave')"
  539. :ref="'material_engrave' + $index"
  540. @keyup.native="
  541. moveFocus($event, $index, 'material_engrave', '物料', row)
  542. "
  543. v-model="row.engrave"
  544. ></el-input>
  545. <span v-else>{{ row.engrave }}</span>
  546. </template>
  547. </el-table-column>
  548. <el-table-column label="重量" prop="weight" width="100">
  549. <template slot-scope="{ row, $index }">
  550. <el-input
  551. v-if="
  552. row.measureUnit != row.weightUnit &&
  553. qualityInspectionItems.includes('weight')
  554. "
  555. :ref="'material_weight' + $index"
  556. @keyup.native="
  557. moveFocus($event, $index, 'material_weight', '物料', row)
  558. "
  559. v-model.number="row.weight"
  560. @input="weightInput($event, row, '物料')"
  561. ></el-input>
  562. <span v-else>{{ row.weight }}</span>
  563. </template>
  564. </el-table-column>
  565. <el-table-column label="重量单位" prop="weightUnit">
  566. </el-table-column>
  567. <el-table-column label="质检结果" prop="result" width="120">
  568. <template slot-scope="{ row }">
  569. <el-select
  570. v-if="qualityInspectionItems.includes('result')"
  571. @change="changeWrapStatus($event, row, '物料')"
  572. v-model="row.result"
  573. placeholder="请选择"
  574. >
  575. <el-option
  576. v-for="item in qualityResultsOptions"
  577. :label="item.label"
  578. :value="item.value"
  579. :key="item.value"
  580. >
  581. </el-option>
  582. </el-select>
  583. <span v-else>{{ qualityResults[row.result] }}</span>
  584. </template>
  585. </el-table-column>
  586. <el-table-column label="质检状态" prop="status" width="120">
  587. <template slot-scope="{ row }">
  588. <span>{{ qualityStatus[row.status] }}</span>
  589. </template>
  590. </el-table-column>
  591. </el-table>
  592. </div>
  593. </div>
  594. <div class="submit">
  595. <el-button type="primary" @click="getStatus">保存</el-button>
  596. </div>
  597. </el-card>
  598. </div>
  599. </template>
  600. <script>
  601. import elTableInfiniteScroll from 'el-table-infinite-scroll';
  602. import { getFile } from '@/api/system/file/index.js';
  603. import storageApi from '@/api/warehouseManagement';
  604. import { allCategoryLevel } from '@/api/classifyManage';
  605. import {
  606. useDictLabel,
  607. sceneState,
  608. qualityResultsOptions,
  609. qualityResults,
  610. qualityStatus
  611. } from '@/utils/dict/index';
  612. import { mapGetters, mapActions } from 'vuex';
  613. import { deepClone } from '@/utils';
  614. export default {
  615. directives: {
  616. 'el-table-infinite-scroll': elTableInfiniteScroll
  617. },
  618. props: {
  619. businessId: {
  620. type: String,
  621. default: ''
  622. },
  623. qualityInspectionItems: {
  624. type: Array,
  625. default: () => {
  626. return [
  627. 'materielDesignation',
  628. 'clientCode',
  629. 'engrave',
  630. 'weight',
  631. 'result'
  632. ];
  633. }
  634. }
  635. },
  636. data() {
  637. return {
  638. newColumns: [], // 动态表头
  639. qualityFile: [], // 回执附件
  640. qualityResultsOptions, // 质检结果选项
  641. qualityStatus, // 质检状态 0未检 1已检
  642. qualityResults, // 质检结果 0无 1合格 2不合格
  643. productList: [], // 产品列表
  644. showPackingList: [], // 展示的包装列表
  645. packingList: [], // 包装列表
  646. showMaterialList: [], // 展示物料列表
  647. materialList: [], // 物料列表
  648. extInfo: {}, // 扩展信息
  649. pageSize: 20,
  650. pickingPageNum: 1,
  651. materielPageNum: 1,
  652. codeList: [],
  653. infoData: {},
  654. stepsTitle: '已完成',
  655. stepsStatus: 'success',
  656. active: 0
  657. };
  658. },
  659. watch: {
  660. 'infoData.verifyStatus': {
  661. immediate: true,
  662. handler(val) {
  663. if (val == 0) {
  664. this.active = 1;
  665. this.stepsTitle = '未审核';
  666. this.stepsStatus = 'wait';
  667. } else if (val == 1) {
  668. this.active = 2;
  669. this.stepsTitle = '审核中';
  670. this.stepsStatus = 'process';
  671. } else if (val == 2) {
  672. this.active = 2;
  673. this.stepsTitle = '审核通过';
  674. this.stepsStatus = 'success';
  675. } else if (val == 3) {
  676. this.active = 2;
  677. this.stepsTitle = '驳回';
  678. this.stepsStatus = 'error';
  679. }
  680. }
  681. }
  682. },
  683. computed: {
  684. ...mapGetters(['getDictValue']),
  685. clientEnvironmentId() {
  686. return this.$store.state.user.info.clientEnvironmentId;
  687. }
  688. },
  689. watch: {
  690. packingList: {
  691. handler(newVal) {
  692. console.log('包装列表', newVal);
  693. console.log('当前包装列表加载页数', this.pickingPageNum);
  694. this.showPackingList = newVal.slice(
  695. 0,
  696. this.pageSize * (this.pickingPageNum > 0 ? this.pickingPageNum : 1)
  697. );
  698. },
  699. deep: true
  700. },
  701. materialList: {
  702. handler(newVal) {
  703. console.log('物料列表', newVal);
  704. console.log('当前物料列表加载页数', this.materielPageNum);
  705. this.showMaterialList = newVal.slice(
  706. 0,
  707. this.pageSize *
  708. (this.materielPageNum > 0 ? this.materielPageNum : 1)
  709. );
  710. },
  711. deep: true
  712. }
  713. },
  714. created() {
  715. this.getFieldModel();
  716. this.requestDict('类型用途');
  717. this.getAllCategoryType();
  718. console.log('this.$route.query.id--', this.$route.query.id);
  719. this._getInfo(this.$route.query.id);
  720. console.log(
  721. 'qualityInspectionItems-----------',
  722. this.qualityInspectionItems
  723. );
  724. },
  725. methods: {
  726. // 获取动态表头
  727. getFieldModel() {
  728. storageApi.fieldModel({ fieldModel: 't_main_category' }).then((res) => {
  729. let newRes = res.map((m) => {
  730. return {
  731. prop: 'extField.' + m.prop,
  732. label: m.label,
  733. align: 'center',
  734. showOverflowTooltip: true
  735. };
  736. });
  737. this.newColumns = [...newRes];
  738. });
  739. },
  740. pickingHandleScroll() {
  741. console.log('---------pickingHandleScroll------------');
  742. if (this.showPackingList.length < this.packingList.length) {
  743. if (this.packingList.length > this.pageSize) {
  744. this.pickingPageNum += 1;
  745. }
  746. this.pickingFetchData();
  747. }
  748. },
  749. pickingFetchData() {
  750. const start = (this.pickingPageNum - 1) * this.pageSize;
  751. const end = start + this.pageSize;
  752. this.showPackingList = this.showPackingList.concat(
  753. this.packingList.slice(start, end)
  754. );
  755. },
  756. materielHandleScroll() {
  757. console.log('---------materielHandleScroll------------');
  758. if (this.showMaterialList.length < this.materialList.length) {
  759. if (this.materialList.length > this.pageSize) {
  760. this.materielPageNum += 1;
  761. }
  762. this.materielFetchData();
  763. }
  764. },
  765. materielFetchData() {
  766. const start = (this.materielPageNum - 1) * this.pageSize;
  767. const end = start + this.pageSize;
  768. this.showMaterialList = this.showMaterialList.concat(
  769. this.materialList.slice(start, end)
  770. );
  771. console.log(this.showMaterialList);
  772. },
  773. ...mapActions('dict', ['requestDict']),
  774. getSceneState: useDictLabel(sceneState),
  775. handleAssetType(r) {
  776. const code = this.codeList.find((item) => item.dictCode == r);
  777. return code?.dictValue;
  778. },
  779. tableRowClassName({ row, rowIndex }) {
  780. console.log(row);
  781. if (row.result == 2) {
  782. return 'warning-row';
  783. } else {
  784. return '';
  785. }
  786. },
  787. rowClass({ row, column, rowIndex, columnIndex }) {
  788. if (rowIndex === 1) {
  789. return {
  790. display: 'none',
  791. background: '#EEEEEE'
  792. };
  793. }
  794. return { background: '#0000' };
  795. },
  796. async getAllCategoryType() {
  797. const { data } = await allCategoryLevel();
  798. this.codeList = data.map((item) => {
  799. return { dictCode: item.id, dictValue: item.name };
  800. });
  801. },
  802. //获取质检状态(全部已检)
  803. async getStatus() {
  804. let packingAllChecked = true;
  805. let materialAllChecked = true;
  806. if (this.packingList?.length > 0) {
  807. packingAllChecked = this.packingList.every(
  808. (item) => item.status == 2
  809. );
  810. }
  811. if (this.materialList?.length > 0) {
  812. materialAllChecked = this.materialList.every(
  813. (item) => item.status == 2
  814. );
  815. }
  816. if (packingAllChecked && materialAllChecked) {
  817. // 处理包装数据
  818. this.packingList = this.packingList.map((packingItem) => {
  819. return {
  820. ...packingItem,
  821. materialDetailList: this.materialList.filter(
  822. (item) => item.parentIndex === packingItem.index
  823. )
  824. };
  825. });
  826. // 处理产品数据
  827. this.productList = this.productList.map((productItem) => {
  828. return {
  829. ...productItem,
  830. outInDetailRecordRequestList: this.packingList.filter(
  831. (item) => item.parentIndex === productItem.index
  832. )
  833. };
  834. });
  835. this.infoData.outInDetailList = this.productList;
  836. let obj = deepClone(this.infoData);
  837. // 处理仓库id
  838. let warehouseId = [];
  839. let warehouseName = [];
  840. let warehouseIds = this.productList
  841. .map((item) => item.warehouseId)
  842. .flat();
  843. let warehouseNames = this.productList
  844. .map((item) => item.warehouseName)
  845. .flat();
  846. warehouseIds.forEach((item, index) => {
  847. if (!warehouseId.includes(item)) {
  848. warehouseId.push(item);
  849. warehouseName.push(warehouseNames[index]);
  850. }
  851. });
  852. obj.warehouseIds = warehouseId;
  853. obj.warehouseNames = warehouseName;
  854. console.log(obj);
  855. try {
  856. await storageApi.qualityInspection(obj);
  857. this.$router.push({
  858. path: '/warehouseManagement/stockManagement'
  859. });
  860. } catch (error) {
  861. this.$message.error('质检失败');
  862. return false;
  863. }
  864. } else {
  865. this.$message.error('请先完成包装和物料质检');
  866. }
  867. },
  868. // 选择质检结果改变质检状态
  869. changeWrapStatus(resultValue, row, type) {
  870. console.log(resultValue);
  871. switch (resultValue) {
  872. case 0:
  873. // 清空质检状态
  874. row.status = 0;
  875. break;
  876. default:
  877. // 默认已检质检状态
  878. row.status = 2;
  879. break;
  880. }
  881. if (type === '包装') {
  882. this.packingResultCahnge(resultValue, row);
  883. } else {
  884. this.materialResultCahnge(resultValue, row);
  885. }
  886. },
  887. // 包装质检结果修改
  888. packingResultCahnge(value, row) {
  889. // 修改物料质检结果( 1合格 2不合格)
  890. this.materialList.map((item, index) => {
  891. if (item.parentIndex === row.index) {
  892. this.$set(this.materialList[index], 'result', value);
  893. this.$set(this.materialList[index], 'status', 2);
  894. }
  895. });
  896. },
  897. // 物料质量结果修改
  898. materialResultCahnge(value, row) {
  899. // 修改包装质检结果
  900. let filterMaterialList = this.materialList.filter((item) => {
  901. return item.parentIndex == row.parentIndex;
  902. });
  903. let packingIndex = this.packingList.findIndex((item) => {
  904. return item.index == row.parentIndex;
  905. });
  906. let boolen = filterMaterialList.every((item) => {
  907. return item.result == 1;
  908. });
  909. this.$set(this.packingList[packingIndex], 'result', boolen ? 1 : 2);
  910. this.$set(this.packingList[packingIndex], 'status', 2);
  911. },
  912. // 重量限制
  913. weightInput(value, row, type) {
  914. const newValue = value.replace(/[^\d.]/g, ''); // 保留数字和小数点
  915. const decimalCount = (newValue.match(/\./g) || []).length; // 计算小数点的个数
  916. if (row.weight < 0) {
  917. row.weight = 0;
  918. } else if (row.weight > 9999) {
  919. row.weight = 9999;
  920. } else {
  921. if (decimalCount > 1) {
  922. // 如果小数点个数大于1,移除多余的小数点
  923. const lastIndex = newValue.lastIndexOf('.');
  924. row.weight =
  925. newValue.slice(0, lastIndex) + newValue.slice(lastIndex + 1);
  926. } else if (decimalCount === 1) {
  927. // 如果小数点个数等于1,允许小数点的输入
  928. row.weight = newValue;
  929. } else {
  930. row.weight = newValue === '' ? 0 : parseFloat(newValue); // 如果输入为空,则设为0
  931. }
  932. }
  933. if (type === '包装') {
  934. this.packingWeightCahnge(value, row);
  935. } else {
  936. this.materialWeightCahnge(row);
  937. }
  938. },
  939. // 包装重量修改
  940. packingWeightCahnge(value, row) {
  941. // 修改物品重量
  942. let filterPackingList = this.packingList.filter((item) => {
  943. return item.parentIndex === row.parentIndex;
  944. });
  945. let productIndex = this.productList.findIndex((item) => {
  946. return item.index === row.parentIndex;
  947. });
  948. let totalWeight = filterPackingList.reduce(
  949. (accumulator, currentValue) => {
  950. return this.$math.format(+accumulator + +currentValue.weight, 14);
  951. },
  952. 0
  953. );
  954. this.$set(this.productList[productIndex], 'weight', totalWeight);
  955. // 修改拆分物料
  956. this.materialList.map((item, index) => {
  957. if (item.parentIndex === row.index) {
  958. console.log(value / row.measureQuantity);
  959. this.$set(
  960. this.materialList[index],
  961. 'weight',
  962. this.$math.format(value / row.measureQuantity, 14) >= 0
  963. ? this.$math.format(value / row.measureQuantity, 14)
  964. : 0
  965. );
  966. }
  967. });
  968. },
  969. // 物料重量修改
  970. materialWeightCahnge(row) {
  971. // 修改包装重量
  972. let filterMaterialList = this.materialList.filter((item) => {
  973. return item.parentIndex === row.parentIndex;
  974. });
  975. let packingIndex = this.packingList.findIndex((item) => {
  976. return item.index === row.parentIndex;
  977. });
  978. let totalMaterialWeight = filterMaterialList.reduce(
  979. (accumulator, currentValue) => {
  980. return this.$math.format(+accumulator + +currentValue.weight, 14);
  981. },
  982. 0
  983. );
  984. this.$set(
  985. this.packingList[packingIndex],
  986. 'weight',
  987. totalMaterialWeight
  988. );
  989. // 修改物品重量
  990. let filterPackingList = this.packingList.filter((item) => {
  991. return (
  992. item.parentIndex === this.packingList[packingIndex].parentIndex
  993. );
  994. });
  995. let productIndex = this.productList.findIndex((item) => {
  996. return item.index === this.packingList[packingIndex].parentIndex;
  997. });
  998. let totalWeight = filterPackingList.reduce(
  999. (accumulator, currentValue) => {
  1000. return this.$math.format(+accumulator + +currentValue.weight, 14);
  1001. },
  1002. 0
  1003. );
  1004. this.$set(this.productList[productIndex], 'weight', totalWeight);
  1005. },
  1006. async _getInfo(id) {
  1007. if (!id) return;
  1008. const res = await storageApi.getInboundDetailsById(id);
  1009. console.log('===', res);
  1010. this.infoData = res;
  1011. this.extInfo = res.extInfo;
  1012. this.productList = res.outInDetailList.map(
  1013. (productItem, productIndex) => {
  1014. return {
  1015. ...productItem,
  1016. index: this.productList.length + productIndex,
  1017. outInDetailRecordRequestList:
  1018. productItem.outInDetailRecordRequestList.map(
  1019. (packingItem, packingIndex) => {
  1020. return {
  1021. ...packingItem,
  1022. index:
  1023. this.productList.length +
  1024. productIndex +
  1025. '-' +
  1026. packingIndex, // 包装索引
  1027. parentIndex: this.productList.length + productIndex, // 物品索引
  1028. categoryName: productItem.categoryName,
  1029. categoryCode: productItem.categoryCode,
  1030. materialDetailList: packingItem.materialDetailList.map(
  1031. (materialItem, materialIndex) => {
  1032. return {
  1033. ...materialItem,
  1034. index:
  1035. this.productList.length +
  1036. productIndex +
  1037. '-' +
  1038. packingIndex +
  1039. '——' +
  1040. materialIndex, // 包装索引
  1041. parentIndex:
  1042. this.productList.length +
  1043. productIndex +
  1044. '-' +
  1045. packingIndex, // 物品索引
  1046. categoryName: productItem.categoryName,
  1047. categoryCode: productItem.categoryCode
  1048. };
  1049. }
  1050. )
  1051. };
  1052. }
  1053. )
  1054. };
  1055. }
  1056. );
  1057. // 获取包装维度数据
  1058. const arr = [];
  1059. for (const key in this.productList) {
  1060. for (const k in this.productList[key].outInDetailRecordRequestList) {
  1061. arr.push({
  1062. ...this.productList[key].outInDetailRecordRequestList[k]
  1063. });
  1064. }
  1065. }
  1066. this.packingList = arr;
  1067. // 获取物料维度数据
  1068. let iArr = [];
  1069. arr.forEach((item) => {
  1070. item.materialDetailList.forEach((ele) => {
  1071. iArr.push({ ...ele });
  1072. });
  1073. });
  1074. this.materialList = iArr;
  1075. console.log(this.packingList);
  1076. console.log(this.materialList);
  1077. // this.pickingFetchData();
  1078. // this.materielFetchData();
  1079. },
  1080. download(row) {
  1081. if (row.storePath) {
  1082. getFile({ objectName: row.storePath }, row.name);
  1083. }
  1084. },
  1085. // 键盘移动
  1086. moveFocus(event, index, key, type, row) {
  1087. let keyfield = [];
  1088. let listLength = 0;
  1089. switch (type) {
  1090. case '包装':
  1091. listLength = this.showPackingList.length;
  1092. if (row.measureUnit != row.weightUnit) {
  1093. keyfield = [
  1094. 'packing_materielDesignation',
  1095. 'packing_clientCode',
  1096. 'packing_engrave',
  1097. 'packing_weight'
  1098. ];
  1099. } else {
  1100. keyfield = [
  1101. 'packing_materielDesignation',
  1102. 'packing_clientCode',
  1103. 'packing_engrave'
  1104. ];
  1105. }
  1106. break;
  1107. case '物料':
  1108. listLength = this.showMaterialList.length;
  1109. if (row.measureUnit != row.weightUnit) {
  1110. keyfield = [
  1111. 'material_materielDesignation',
  1112. 'material_clientCode',
  1113. 'material_engrave',
  1114. 'material_weight'
  1115. ];
  1116. } else {
  1117. keyfield = [
  1118. 'material_materielDesignation',
  1119. 'material_clientCode',
  1120. 'material_engrave'
  1121. ];
  1122. }
  1123. break;
  1124. }
  1125. if (event.keyCode === 13) {
  1126. // 回车
  1127. if (
  1128. index === listLength - 1 &&
  1129. key === keyfield[keyfield.length - 1]
  1130. ) {
  1131. // 最后一行最后一个
  1132. return;
  1133. }
  1134. this.$refs[key + index].blur();
  1135. if (key === keyfield[keyfield.length - 1]) {
  1136. // 当前行最后一个,跳转下一行第一个
  1137. if (this.$refs[keyfield[0] + (index + 1)].value == 0) {
  1138. this.$refs[keyfield[0] + (index + 1)].value = '';
  1139. }
  1140. this.$refs[keyfield[0] + (index + 1)].focus();
  1141. } else {
  1142. // 跳转下一个
  1143. const nextkeyindex = keyfield.findIndex((k) => k === key) + 1;
  1144. this.$nextTick(() => {
  1145. if (this.$refs[keyfield[nextkeyindex] + index].value == 0) {
  1146. this.$refs[keyfield[nextkeyindex] + index].value = '';
  1147. }
  1148. this.$refs[keyfield[nextkeyindex] + index].focus();
  1149. });
  1150. }
  1151. }
  1152. // 向上 =38
  1153. if (event.keyCode === 38) {
  1154. console.log('向上');
  1155. if (index === 0) {
  1156. // 第一行
  1157. console.log('第一行无法向上');
  1158. return;
  1159. }
  1160. this.$refs[key + index].blur();
  1161. this.$nextTick(() => {
  1162. if (this.$refs[key + (index - 1)].value == 0) {
  1163. this.$refs[key + (index - 1)].value = '';
  1164. }
  1165. this.$refs[key + (index - 1)].focus();
  1166. });
  1167. }
  1168. // 下 = 40
  1169. if (event.keyCode === 40) {
  1170. console.log('向下');
  1171. if (index === listLength - 1) {
  1172. // 最后一行
  1173. console.log('最后一行无法向下');
  1174. return;
  1175. }
  1176. this.$refs[key + index].blur();
  1177. this.$nextTick(() => {
  1178. if (this.$refs[key + (index + 1)].value == 0) {
  1179. this.$refs[key + (index + 1)].value = '';
  1180. }
  1181. this.$refs[key + (index + 1)].focus();
  1182. });
  1183. }
  1184. // 左 = 37
  1185. if (event.keyCode === 37) {
  1186. console.log('向左');
  1187. if (index === 0 && key === keyfield[0]) {
  1188. // 第一行第一个
  1189. console.log('第一行第一个无法向左');
  1190. return;
  1191. }
  1192. this.$refs[key + index].blur();
  1193. if (key === keyfield[0]) {
  1194. if (
  1195. this.$refs[keyfield[keyfield.length - 1] + (index - 1)].value == 0
  1196. ) {
  1197. this.$refs[keyfield[keyfield.length - 1] + (index - 1)].value =
  1198. '';
  1199. }
  1200. // 当前行第一个,跳转上一行最后一个
  1201. this.$refs[keyfield[keyfield.length - 1] + (index - 1)].focus();
  1202. } else {
  1203. // 跳转上一个
  1204. const prevkeyindex = keyfield.findIndex((k) => k === key) - 1;
  1205. this.$nextTick(() => {
  1206. if (this.$refs[keyfield[prevkeyindex] + index].value == 0) {
  1207. this.$refs[keyfield[prevkeyindex] + index].value = '';
  1208. }
  1209. this.$refs[keyfield[prevkeyindex] + index].focus();
  1210. });
  1211. }
  1212. }
  1213. // 右 = 39
  1214. if (event.keyCode === 39) {
  1215. console.log('向右');
  1216. if (
  1217. index === listLength - 1 &&
  1218. key === keyfield[keyfield.length - 1]
  1219. ) {
  1220. // 最后一行最后一个
  1221. console.log('最后一行最后一个无法向左');
  1222. return;
  1223. }
  1224. console.log(this.$refs);
  1225. this.$refs[key + index].blur();
  1226. if (key === keyfield[keyfield.length - 1]) {
  1227. // 当前行最后一个,跳转下一行第一个
  1228. if (this.$refs[keyfield[0] + (index + 1)].value == 0) {
  1229. this.$refs[keyfield[0] + (index + 1)].value = '';
  1230. }
  1231. this.$refs[keyfield[0] + (index + 1)].focus();
  1232. } else {
  1233. // 跳转下一个
  1234. const nextkeyindex = keyfield.findIndex((k) => k === key) + 1;
  1235. this.$nextTick(() => {
  1236. if (this.$refs[keyfield[nextkeyindex] + index].value == 0) {
  1237. this.$refs[keyfield[nextkeyindex] + index].value = '';
  1238. }
  1239. this.$refs[keyfield[nextkeyindex] + index].focus();
  1240. });
  1241. }
  1242. }
  1243. }
  1244. }
  1245. };
  1246. </script>
  1247. <style lang="scss" scoped>
  1248. .submit {
  1249. display: flex;
  1250. align-items: center;
  1251. justify-content: center;
  1252. padding: 20px;
  1253. box-sizing: border-box;
  1254. }
  1255. ::v-deep .warning-row {
  1256. color: red;
  1257. }
  1258. ::v-deep .page-title {
  1259. border-bottom: none;
  1260. }
  1261. ::v-deep .page-title-div {
  1262. width: 100%;
  1263. }
  1264. .stepsStatus {
  1265. width: 40%;
  1266. margin: 0 auto;
  1267. }
  1268. .el-form-item {
  1269. margin-bottom: 10px;
  1270. }
  1271. .p20 {
  1272. padding: 20px;
  1273. }
  1274. .flex {
  1275. display: flex;
  1276. }
  1277. .title {
  1278. justify-content: space-between;
  1279. border-bottom: 1px solid #ccc;
  1280. padding-bottom: 5px;
  1281. span {
  1282. font-size: 16px;
  1283. }
  1284. .col {
  1285. padding-left: 40px;
  1286. font-size: 14px;
  1287. color: #aaaaaa;
  1288. }
  1289. }
  1290. .degree {
  1291. margin-right: 10px;
  1292. padding: 0px 15px;
  1293. color: #fff;
  1294. font-size: 13px;
  1295. line-height: 23px;
  1296. border-radius: 23px;
  1297. display: flex;
  1298. align-items: center;
  1299. justify-content: space-between;
  1300. span {
  1301. width: 5px;
  1302. height: 5px;
  1303. border-radius: 100%;
  1304. margin-right: 6px;
  1305. background-color: #fff;
  1306. }
  1307. }
  1308. .red {
  1309. background-color: rgb(163, 0, 20);
  1310. }
  1311. .blue {
  1312. background-color: #1989fa;
  1313. }
  1314. .createdInfo {
  1315. justify-content: space-around;
  1316. margin-top: 10px;
  1317. font-size: 14px;
  1318. .col {
  1319. color: #6e6e6e;
  1320. padding-right: 10px;
  1321. }
  1322. }
  1323. .mt40 {
  1324. margin-top: 40px;
  1325. }
  1326. .custSteps {
  1327. margin-top: 20px;
  1328. margin-left: 70px;
  1329. .box {
  1330. width: 158px;
  1331. border: 1px solid #ccc;
  1332. padding: 10px;
  1333. flex-direction: row;
  1334. flex-wrap: wrap;
  1335. // justify-content: space-between;
  1336. font-size: 12px;
  1337. color: #9e9e9e;
  1338. .x {
  1339. width: 20px;
  1340. height: 15px;
  1341. margin-right: 5px;
  1342. }
  1343. .q {
  1344. background-color: #d0e4d5;
  1345. }
  1346. .b {
  1347. background-color: #1989fa;
  1348. }
  1349. .g {
  1350. background-color: #157a2c;
  1351. }
  1352. .r {
  1353. background-color: #a30014;
  1354. }
  1355. .a {
  1356. align-items: center;
  1357. margin-bottom: 10px;
  1358. }
  1359. .mr10 {
  1360. margin-right: 10px;
  1361. }
  1362. .mb0 {
  1363. margin-bottom: 0;
  1364. }
  1365. }
  1366. .stepsInfo {
  1367. // flex: 1;
  1368. width: 483px;
  1369. }
  1370. }
  1371. .mt20 {
  1372. margin-top: 20px;
  1373. }
  1374. .content-detail {
  1375. overflow: hidden;
  1376. }
  1377. .executor {
  1378. font-size: 14px;
  1379. .col {
  1380. color: #6e6e6e;
  1381. padding-right: 10px;
  1382. }
  1383. }
  1384. .result {
  1385. justify-content: space-around;
  1386. }
  1387. .mr20 {
  1388. margin-right: 20px;
  1389. }
  1390. .details {
  1391. font-size: 14px;
  1392. margin-bottom: 10px;
  1393. }
  1394. .customSteps {
  1395. margin-top: 40px;
  1396. font-size: 14px;
  1397. margin-left: 80px;
  1398. .time {
  1399. font-size: 12px;
  1400. color: #6e6e6e;
  1401. margin-right: 20px;
  1402. position: relative;
  1403. &::after {
  1404. content: '';
  1405. width: 1px;
  1406. height: 100%;
  1407. background-color: #157a2c;
  1408. position: absolute;
  1409. right: -26px;
  1410. }
  1411. }
  1412. .flex:last-child {
  1413. .time {
  1414. &::after {
  1415. display: none;
  1416. }
  1417. }
  1418. }
  1419. .round {
  1420. margin-right: 20px;
  1421. width: 10px;
  1422. height: 10px;
  1423. border-radius: 100%;
  1424. background-color: #157a2c;
  1425. position: relative;
  1426. span {
  1427. position: absolute;
  1428. top: 50%;
  1429. left: 50%;
  1430. width: 4px;
  1431. height: 4px;
  1432. background-color: #fff;
  1433. border-radius: 100%;
  1434. transform: translate(-2px, -2px);
  1435. }
  1436. }
  1437. .text {
  1438. .info {
  1439. margin-top: 10px;
  1440. width: 955px;
  1441. background-color: #f0f3f3;
  1442. overflow: hidden;
  1443. padding: 10px;
  1444. margin-bottom: 10px;
  1445. }
  1446. }
  1447. }
  1448. .switch_left li {
  1449. border-right: 1px solid rgba(222, 222, 222, 1);
  1450. border-left: 1px solid rgba(222, 222, 222, 1);
  1451. }
  1452. </style>