无线电资产管理
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

691 lines
23 KiB

5 months ago
3 weeks ago
5 months ago
3 weeks ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
3 weeks ago
5 months ago
  1. <template>
  2. <div class="app-container row-container">
  3. <!--工具栏-->
  4. <div class="head-container">
  5. <div v-if="crud.props.searchToggle" class="head-search">
  6. <!-- 搜索 -->
  7. <el-input v-model="query.search" size="small" clearable placeholder="输入资产名称/编码搜索" prefix-icon="el-icon-search" style="width: 220px;" class="filter-item" @keyup.enter.native="crud.toQuery" />
  8. <rrOperation />
  9. </div>
  10. <crudOperation :permission="permission">
  11. <template v-slot:right>
  12. <!-- @click="doExport(crud.selections)" :disabled="crud.selections.length === 0" -->
  13. <el-button :loading="crud.downloadLoading" size="mini" @click="showSyncDialog">
  14. <i class="iconfont icon-zidonggengxin" />
  15. 同步
  16. </el-button>
  17. </template>
  18. </crudOperation>
  19. </div>
  20. <div class="container-wrap">
  21. <span class="right-top-line" />
  22. <span class="left-bottom-line" />
  23. <el-table ref="table" v-loading="crud.loading" highlight-current-row style="width: 100%;" height="calc(100vh - 330px)" :data="crud.data" @row-dblclick="handleRowDblClick">
  24. <el-table-column prop="mark" label="资产编号" min-width="150px" :show-overflow-tooltip="true" />
  25. <el-table-column prop="name" label="资产名称" min-width="180px" :show-overflow-tooltip="true" />
  26. <el-table-column prop="capitaltyepname" label="资产类型" width="80px" :show-overflow-tooltip="true" />
  27. <el-table-column prop="startprice" label="价值" width="80px" align="right" :show-overflow-tooltip="true" :formatter="(row) => formatMoney(row.startprice)" />
  28. <el-table-column prop="unitname" label="计量单位" width="80px" align="center" :show-overflow-tooltip="true" />
  29. <el-table-column prop="departmentname" label="使用部门" :show-overflow-tooltip="true" />
  30. <el-table-column prop="resourcename" label="使用人" :show-overflow-tooltip="true" />
  31. <!-- <el-table-column prop="blongsubcompanyname" label="所属单位" min-width="140px" :show-overflow-tooltip="true" /> -->
  32. <el-table-column prop="blongdepartmentname" label="所属部门" min-width="140px" :show-overflow-tooltip="true" />
  33. <el-table-column prop="glrname" label="管理人" :show-overflow-tooltip="true" />
  34. <el-table-column prop="cfdname" label="存放地" min-width="140px" :show-overflow-tooltip="true" />
  35. <!-- <el-table-column prop="rzrq" label="更新时间" width="180px">
  36. <template slot-scope="scope">
  37. <div>{{ scope.row.rzrq | parseTime }}</div>
  38. </template>
  39. </el-table-column> -->
  40. <el-table-column prop="is_whitelist" label="是否白名单" align="center">
  41. <template slot-scope="scope">
  42. <el-tag v-if="scope.row.is_whitelist" type="success">白名单</el-tag>
  43. <span v-else>-</span>
  44. </template>
  45. </el-table-column>
  46. </el-table>
  47. <!--分页组件-->
  48. <pagination v-if="crud.data.length!==0" />
  49. </div>
  50. <!-- 同步对话框 -->
  51. <el-dialog
  52. :visible.sync="syncDialogVisible"
  53. title="资产同步"
  54. width="600px"
  55. append-to-body
  56. :close-on-click-modal="false"
  57. :modal-append-to-body="false"
  58. >
  59. <div v-if="!syncComplete" style="display: flex; justify-content: flex-start; align-items: center;">
  60. <input
  61. ref="fileInput"
  62. type="file"
  63. accept=".xlsx"
  64. style="display: none"
  65. @change="handleFileChange"
  66. >
  67. <el-button size="small" type="primary" @click="triggerFileSelect">上传数据</el-button>
  68. <div v-if="selectedFile" class="file-tip">已选择文件: {{ selectedFile.name }}</div>
  69. <div v-else class="file-tip">请上传.xlsx格式的文件</div>
  70. </div>
  71. <div v-if="syncLoading" class="sync-loading">
  72. <div class="sync-loading-content">
  73. <i class="el-icon-loading sync-loading-icon" />
  74. <div class="sync-status">{{ syncStatusText }}</div>
  75. </div>
  76. </div>
  77. <div v-else-if="syncComplete" class="sync-result">
  78. <i class="el-icon-warning sync-icon" />
  79. <div class="sync-text">
  80. <!-- 已完成同步<p class="sync-new">新增<span>{{ newCount }}</span></p><p class="sync-update">更新<span>{{ updateCount }}</span></p> -->
  81. {{ syncResultText }}
  82. </div>
  83. </div>
  84. <div slot="footer" class="dialog-footer">
  85. <el-button v-if="!syncComplete" :disabled="syncLoading" @click="syncDialogVisible = false">取消</el-button>
  86. <el-button v-if="!syncComplete" type="primary" :disabled="syncLoading" @click="startSync">开始同步</el-button>
  87. </div>
  88. </el-dialog>
  89. <el-dialog class="detailBook" append-to-body :close-on-click-modal="false" :modal-append-to-body="false" :before-close="handleCloseDialog" :visible="detailDialogVisible" title="资产详情">
  90. <span class="dialog-right-top" />
  91. <span class="dialog-left-bottom" />
  92. <div class="setting-dialog">
  93. <div class="detail-tab tab-content">
  94. <!-- <ul class="tab-nav">
  95. <li :class="{'active-tab-nav': tabIndex === 0}" @click="changeDetailTab(0)">基础信息</li>
  96. </ul> -->
  97. <!-- v-if="tabIndex===0" -->
  98. <div class="detail-check">
  99. <div style="flex:1">
  100. <ul class="book-detail" style="max-height: 680px; overflow: auto;">
  101. <li><span>资产编号</span>{{ selectedAsset && selectedAsset.mark }}</li>
  102. <li><span>资产名称</span>{{ selectedAsset && selectedAsset.name }}</li>
  103. <li><span>资产类型</span>{{ selectedAsset && selectedAsset.capitaltyepname || '——' }}</li>
  104. <li><span>规格型号</span>{{ selectedAsset && selectedAsset.capitalspec || '——' }}</li>
  105. <!-- <li><span>设备用途</span>{{ selectedAsset && selectedAsset.sbyt || '——' }}</li> -->
  106. <li><span>价值类型</span>{{ selectedAsset && selectedAsset.jzlx || '——' }}</li>
  107. <li><span>价值</span>{{ selectedAsset ? formatMoney(selectedAsset?.startprice) : '——' }}</li>
  108. <li><span>数量</span>{{ selectedAsset && selectedAsset.capitalnum }}</li>
  109. <li><span>实际数量</span>{{ selectedAsset && selectedAsset.sjsl }}</li>
  110. <li><span>计量单位</span>{{ selectedAsset && selectedAsset.unitname }}</li>
  111. <li><span>使用部门</span>{{ selectedAsset && selectedAsset.departmentname }}</li>
  112. <li><span>使用人</span>{{ selectedAsset && selectedAsset.resourcename }}</li>
  113. <!-- <li><span>所属单位</span>{{ selectedAsset &&selectedAsset.blongsubcompanyname }}</li> -->
  114. <li><span>所属部门</span>{{ selectedAsset && selectedAsset.blongdepartmentname }}</li>
  115. <li><span>管理人</span>{{ selectedAsset && selectedAsset.glrname }}</li>
  116. <li><span>存放地</span>{{ selectedAsset && selectedAsset.cfdname }}</li>
  117. <li><span>供应商</span>{{ selectedAsset && selectedAsset.gys }}</li>
  118. <li><span>项目名称</span>{{ selectedAsset && selectedAsset.xmmc }}</li>
  119. <!-- <li><span>无线电设备用途</span>{{ selectedAsset && selectedAsset.wxdsbyt }}</li> -->
  120. <li><span>领用日期</span>{{ selectedAsset && selectedAsset.deprestartdate | parseTime }}</li>
  121. <!-- <li><span>购置日期</span>{{ selectedAsset &&selectedAsset.gzrq | parseTime }}</li> -->
  122. <li><span>投入使用日期</span>{{ selectedAsset && selectedAsset.trsyrq | parseTime }}</li>
  123. <li><span>入账日期</span>{{ selectedAsset && selectedAsset.rzrq | parseTime }}</li>
  124. <li><span>保修截至日期</span>{{ selectedAsset && selectedAsset.bxjzrq | parseTime }}</li>
  125. <!-- <li v-if="selectedAsset && selectedAsset.rzrq !== null"><span>更新时间</span>{{ selectedAsset &&selectedAsset.rzrq | parseTime }}</li>
  126. <li v-else><span>更新时间</span></li> -->
  127. </ul>
  128. <div v-if="selectedAsset && selectedAsset.is_whitelist" class="book-detail white-detail">
  129. <div class="white-title">
  130. <span class="small-line" />
  131. <p>已加入白名单</p>
  132. <span class="big-line" />
  133. </div>
  134. <ul>
  135. <li class="white-item"><span>加入时间</span>{{ selectedAsset && selectedAsset.whiteCreateTime | parseTime }}</li>
  136. <li class="white-item"><span>操作人</span>{{ selectedAsset && selectedAsset.whiteLastname || '——' }}</li>
  137. <li class="white-item"><span>备注</span>{{ selectedAsset && selectedAsset.whiteRemark || '——' }}</li>
  138. </ul>
  139. </div>
  140. </div>
  141. <!-- <img src="http://192.168.99.72:15000/api/minio/getImg?bucket=2&fileName=2b532fd6792f4dbe91d6a1dbf15e4738.jpg" alt="资产图片"> -->
  142. <!-- <div :class="selectedAsset && selectedAsset.imageUrl ? 'asset-image asset-img' : 'asset-image default-img'">
  143. <img :src="selectedAsset && selectedAsset.imageUrl || require('@/assets/images/system/default-img2.png')" alt="资产图片">
  144. </div> -->
  145. <!-- 资产图片列表竖向滚动 + 删除按钮 -->
  146. <div class="asset-image-wrapper">
  147. <div v-if="assetImageList.length > 0" class="asset-image-scroll">
  148. <div v-for="(item, index) in assetImageList" :key="item.id || index" class="image-item">
  149. <!-- <img :src="item.imgUrl" alt="资产图片" class="preview-img" @click="openPreview(item.imgUrl)" > -->
  150. <el-image
  151. class="preview-img"
  152. :src="item.imgUrl"
  153. fit="contain"
  154. :preview-src-list="assetImageList.map(img => img.imgUrl)"
  155. :preview-initial-index="index"
  156. />
  157. <div class="delete-btn" @click="deleteAssetImage(item.id, index)">
  158. <i class="el-icon-close" />
  159. </div>
  160. </div>
  161. </div>
  162. <div v-else class="default-img">
  163. <img :src="require('@/assets/images/system/default-img2.png')" alt="默认图片">
  164. </div>
  165. </div>
  166. </div>
  167. </div>
  168. </div>
  169. </el-dialog>
  170. </div>
  171. </template>
  172. <script>
  173. import crudAsset, { FetchAssetInfoDetailsByMark, FetchDeleteAssetInfoPhotoById } from '@/api/asset/index'
  174. import CRUD, { presenter, header, crud } from '@crud/crud'
  175. import rrOperation from '@crud/RR.operation'
  176. import crudOperation from '@crud/CRUD.operation'
  177. import pagination from '@crud/Pagination'
  178. import { mapGetters } from 'vuex'
  179. import { upload } from '@/utils/upload'
  180. // http://192.168.99.72:15000/api/asset/initAssetInfo?pageNo=1&pageSize=10
  181. export default {
  182. name: 'Inventory',
  183. components: { pagination, crudOperation, rrOperation },
  184. cruds() {
  185. return CRUD({ title: '资产清单', idField: 'mark', url: 'api/asset/initAssetInfo', crudMethod: { ...crudAsset }, optShow: {
  186. add: false,
  187. edit: false,
  188. del: false,
  189. reset: true,
  190. download: false,
  191. group: false
  192. }})
  193. },
  194. mixins: [presenter(), header(), crud()],
  195. data() {
  196. return {
  197. permission: {
  198. add: [],
  199. edit: [],
  200. del: []
  201. },
  202. syncDialogVisible: false,
  203. syncLoading: false,
  204. syncProgress: 0,
  205. syncStatusText: '',
  206. syncComplete: false,
  207. syncResultText: '',
  208. selectedFile: null,
  209. detailDialogVisible: false,
  210. selectedAsset: null,
  211. newCount: 0,
  212. updateCount: 0,
  213. tabIndex: 0,
  214. assetImageList: []
  215. }
  216. },
  217. computed: {
  218. ...mapGetters([
  219. 'baseApi'
  220. ])
  221. },
  222. created() {
  223. },
  224. mounted() {
  225. },
  226. methods: {
  227. [CRUD.HOOK.beforeRefresh]() {
  228. if (this.crud.query.search) {
  229. this.crud.query.search = this.crud.query.search.trim()
  230. }
  231. // 保存原始参数
  232. this.originalPage = this.crud.page.page
  233. this.originalSize = this.crud.page.size
  234. // 添加pageNo和pageSize参数
  235. this.crud.params.pageNo = this.crud.page.page
  236. this.crud.params.pageSize = this.crud.page.size
  237. // 清空page和size参数
  238. this.crud.params.page = undefined
  239. this.crud.params.size = undefined
  240. },
  241. [CRUD.HOOK.afterRefresh](crud) {
  242. // 恢复原始参数
  243. if (this.originalPage !== undefined) {
  244. this.crud.page.page = this.originalPage
  245. this.crud.page.size = this.originalSize
  246. // 移除pageNo和pageSize参数
  247. delete this.crud.params.pageNo
  248. delete this.crud.params.pageSize
  249. delete this.crud.params.page
  250. delete this.crud.params.size
  251. }
  252. console.log(crud.data)
  253. },
  254. // 新增前
  255. [CRUD.HOOK.beforeToAdd](crud, form) {
  256. },
  257. // 编辑前
  258. [CRUD.HOOK.beforeToEdit](crud, form) {
  259. },
  260. // 提交前做的操作
  261. [CRUD.HOOK.afterValidateCU](crud) {
  262. return true
  263. },
  264. formatMoney(money) {
  265. if (!money && money !== 0) return '——'
  266. return Number(money).toLocaleString('en-US')
  267. },
  268. // 显示同步对话框
  269. showSyncDialog() {
  270. this.syncDialogVisible = true
  271. this.selectedFile = null
  272. this.syncLoading = false
  273. this.syncProgress = 0
  274. this.syncStatusText = ''
  275. this.syncComplete = false
  276. this.syncResultText = ''
  277. // 重置文件输入框
  278. if (this.$refs.fileInput) {
  279. this.$refs.fileInput.value = ''
  280. }
  281. },
  282. // 触发文件选择
  283. triggerFileSelect() {
  284. this.$refs.fileInput.click()
  285. },
  286. // 处理文件选择
  287. handleFileChange(event) {
  288. const file = event.target.files[0]
  289. if (file) {
  290. this.selectedFile = file
  291. }
  292. },
  293. // 开始同步
  294. startSync() {
  295. if (!this.selectedFile) {
  296. this.$message({ message: '请选择要上传的文件', type: 'warning', offset: 8 })
  297. return
  298. }
  299. this.syncLoading = true
  300. this.syncStatusText = '正在同步数据...'
  301. // 构建表单数据
  302. const formData = new FormData()
  303. formData.append('file', this.selectedFile)
  304. // 注意:upload是隐藏了token这块的,如果后续需要,需要在upload.js中放开headers
  305. upload(this.baseApi + '/api/asset/importTextInfo', this.selectedFile).then(res => {
  306. console.log(res)
  307. if (res.data.code === 200) {
  308. this.syncLoading = false
  309. this.syncComplete = true
  310. this.syncResultText = res.data.data
  311. // 刷新表格数据
  312. this.crud.refresh()
  313. } else {
  314. this.$message({ message: res.data.data || '同步失败', type: 'error', offset: 8 })
  315. this.syncLoading = false
  316. }
  317. }).catch(error => {
  318. console.error('同步失败:', error)
  319. this.$message({ message: '同步失败,请重试', type: 'error', offset: 8 })
  320. this.syncLoading = false
  321. })
  322. },
  323. // 格式化进度显示
  324. formatProgress(percentage) {
  325. return `${percentage}%`
  326. },
  327. // 处理行双击事件
  328. handleRowDblClick(row) {
  329. this.tabIndex = 0
  330. this.detailDialogVisible = true
  331. // 清空上一次的图片
  332. this.selectedAsset = {}
  333. this.assetImageList = []
  334. const params = { mark: row.mark }
  335. FetchAssetInfoDetailsByMark(params).then(res => {
  336. this.selectedAsset = {
  337. ...(res || {}),
  338. capitaltyepname: row.capitaltyepname,
  339. resourcename: row.resourcename,
  340. is_whitelist: row.is_whitelist,
  341. whiteCreateTime: row.whiteCreateTime,
  342. whiteLastname: row.whiteLastname,
  343. whiteRemark: row.whiteRemark
  344. }
  345. const photoList = res.assetInfoPhoto || []
  346. this.assetImageList = photoList.map(item => ({
  347. id: item.id,
  348. photoUrl: item.photoUrl,
  349. imgUrl: this.baseApi + '/api/minio/getImg?bucket=2&fileName=' + item.photoUrl
  350. }))
  351. // this.assetImageList = [
  352. // 'https://qiniu.aiyxlib.com/1604467087428',
  353. // 'https://qiniu.aiyxlib.com/1605059837392',
  354. // 'https://qiniu.aiyxlib.com/1605060069983',
  355. // 'https://qiniu.aiyxlib.com/1605060069983',
  356. // 'https://qiniu.aiyxlib.com/1605060269830',
  357. // 'https://qiniu.aiyxlib.com/1606124577077',
  358. // 'https://qiniu.aiyxlib.com/1605060069983'
  359. // ]
  360. console.log(' this.assetImageList', this.assetImageList)
  361. })
  362. },
  363. // 删除资产图片
  364. deleteAssetImage(photoId, index) {
  365. this.$confirm('确定要删除这张图片吗?', '提示', {
  366. confirmButtonText: '确定',
  367. cancelButtonText: '取消',
  368. type: 'warning'
  369. }).then(() => {
  370. console.log('photoId', [photoId])
  371. FetchDeleteAssetInfoPhotoById([photoId]).then(res => {
  372. console.log('res', res)
  373. if (res.data !== null) {
  374. this.assetImageList.splice(index, 1)
  375. this.$message({ message: '删除成功', type: 'success', offset: 8 })
  376. } else {
  377. this.$message({ message: res.message, type: 'error', offset: 8 })
  378. }
  379. }).catch(() => {
  380. this.$message({ message: '删除失败', type: 'error', offset: 8 })
  381. })
  382. }).catch(() => {})
  383. },
  384. changeDetailTab(index) {
  385. this.tabIndex = index
  386. },
  387. handleCloseDialog() {
  388. this.detailDialogVisible = false
  389. this.tabIndex = 0
  390. this.selectedAsset = null
  391. this.assetImageList = [] // 关闭清空图片列表
  392. }
  393. }
  394. }
  395. </script>
  396. <style lang="scss" scoped>
  397. .sync-loading {
  398. display: flex;
  399. justify-content: center;
  400. align-items: center;
  401. min-height: 200px;
  402. }
  403. .sync-loading-content {
  404. text-align: center;
  405. }
  406. .sync-loading-icon {
  407. font-size: 48px;
  408. color: #409EFF;
  409. }
  410. .sync-status {
  411. margin-top: 15px;
  412. text-align: center;
  413. color: #606266;
  414. font-size: 14px;
  415. }
  416. .file-tip {
  417. margin-left: 10px;
  418. font-size: 12px;
  419. color: #606266;
  420. }
  421. .sync-result{
  422. display: flex;
  423. justify-content: center;
  424. align-items: center;
  425. margin-top: 40px;
  426. font-size: 22px;
  427. text-align: center;
  428. .sync-text{
  429. margin-left: 10px;
  430. p{
  431. display: inline-block;
  432. span{
  433. display: inline-block;
  434. padding: 0 4px;
  435. }
  436. }
  437. }
  438. }
  439. ::v-deep .el-dialog__footer{
  440. padding: 0 0 20px 0 !important;
  441. }
  442. .asset-detail-content {
  443. display: flex;
  444. gap: 20px;
  445. }
  446. .asset-info {
  447. flex: 1;
  448. }
  449. // .asset-carousel {
  450. // width: 400px;
  451. // height: 200px;
  452. // ::v-deep .el-carousel__item {
  453. // display: flex;
  454. // align-items: center;
  455. // justify-content: center;
  456. // background: #f5f7fa;
  457. // }
  458. // }
  459. // .carousel-img {
  460. // max-width: 100%;
  461. // max-height: 200px;
  462. // object-fit: contain;
  463. // }
  464. // .asset-image {
  465. // display: flex;
  466. // align-items: center;
  467. // justify-content: center;
  468. // width: 400px;
  469. // height: 200px;
  470. // }
  471. // // .asset-img {
  472. // // // width: 100%;
  473. // // // height: 200px;
  474. // // object-fit: cover;
  475. // // border-radius: 4px;
  476. // // img {
  477. // // display: block;
  478. // // width: 400px;
  479. // // }
  480. // // }
  481. // .default-img{
  482. // width: 200px;
  483. // height: 200px;
  484. // display: flex;
  485. // align-items: center;
  486. // justify-content: center;
  487. // background-color: #f5f7fa;
  488. // border: 4px solid #dcdfe6;
  489. // border-radius: 4px;
  490. // img {
  491. // width: 100%;
  492. // height: 100%;
  493. // object-fit: cover;
  494. // }
  495. // }
  496. // 资产图片列表样式(竖向滚动)
  497. .asset-image-wrapper {
  498. width: 400px;
  499. height: 660px; /* 固定高度 */
  500. overflow: hidden;
  501. }
  502. .asset-image-scroll {
  503. width: 100%;
  504. height: 100%;
  505. overflow-y: auto; /* 竖向滚动条 */
  506. padding-right: 5px;
  507. display: flex;
  508. flex-direction: column;
  509. gap: 10px;
  510. }
  511. .image-item {
  512. position: relative;
  513. width: 100%;
  514. height: 150px;
  515. background: #f5f7fa;
  516. border-radius: 4px;
  517. overflow: hidden;
  518. flex-shrink: 0;
  519. }
  520. .preview-img {
  521. width: 100%;
  522. height: 100%;
  523. object-fit: contain;
  524. background: #fff;
  525. }
  526. // 删除按钮
  527. .delete-btn {
  528. position: absolute;
  529. top: 5px;
  530. right: 5px;
  531. width: 22px;
  532. height: 22px;
  533. background: rgba(0, 0, 0, 0.6);
  534. color: #fff;
  535. border-radius: 50%;
  536. display: flex;
  537. align-items: center;
  538. justify-content: center;
  539. cursor: pointer;
  540. z-index: 10;
  541. transition: 0.2s;
  542. &:hover {
  543. background: #f56c6c;
  544. }
  545. i {
  546. font-size: 14px;
  547. }
  548. }
  549. // 默认图片
  550. .default-img {
  551. width: 100%;
  552. height: 200px;
  553. display: flex;
  554. align-items: center;
  555. justify-content: center;
  556. background-color: #f5f7fa;
  557. border: 2px solid #dcdfe6;
  558. border-radius: 4px;
  559. img {
  560. width: 180px;
  561. height: 180px;
  562. object-fit: cover;
  563. }
  564. }
  565. .detailBook {
  566. ::v-deep .el-dialog {
  567. width: 1000px !important;
  568. .el-dialog__body{
  569. padding: 0 0 30px 0;
  570. ::-webkit-scrollbar{
  571. width: 5px !important;
  572. height: 5px !important;
  573. }
  574. ::-webkit-scrollbar-thumb{
  575. background-color: #f5f7fa !important;
  576. }
  577. }
  578. }
  579. .detail-check{
  580. display: flex;
  581. justify-content: space-between;
  582. align-items: flex-start;
  583. padding: 12px 30px;
  584. background-color: #F6F8FC;
  585. overflow: hidden;
  586. }
  587. .book-detail{
  588. display: flex;
  589. flex-direction: column;
  590. justify-content: flex-start;
  591. li{
  592. line-height: 30px;
  593. span{
  594. display: inline-block;
  595. width: 120px;
  596. text-align: right;
  597. margin-right: 10px;
  598. color: #0C0E1E;
  599. }
  600. i{
  601. font-style: normal;
  602. padding: 0 8px;
  603. }
  604. &.row-li{
  605. width: 100%
  606. }
  607. &.white-item {
  608. color: #606266;
  609. span {
  610. color: #0348F3 !important;
  611. }
  612. }
  613. }
  614. &.white-detail{
  615. border-radius: 4px;
  616. background-color: #EEF5FE;
  617. margin-top: 4px;
  618. & .white-title{
  619. display: flex;
  620. justify-content: flex-start;
  621. align-items: center;
  622. font-size: 12px;
  623. color: #606266;
  624. padding: 6px;
  625. p{
  626. padding: 0 10px;
  627. }
  628. .small-line{
  629. display: inline-block;
  630. width: 40px;
  631. border-bottom: 1px solid #a9aeb8;
  632. }
  633. .big-line{
  634. display: inline-block;
  635. flex: 1;
  636. // height: 1px;
  637. border-bottom: 1px solid #a9aeb8;
  638. // background-color: #a9aeb8;
  639. }
  640. }
  641. }
  642. }
  643. ::v-deep .dialog-footer{
  644. margin-top: 30px;
  645. }
  646. }
  647. // .el-table{
  648. // ::v-deep .el-tag{
  649. // margin: 0 !important;
  650. // &.el-tag--small{
  651. // color: #0348f3 !important;
  652. // background-color: #eef5fe !important;
  653. // border-color: #eef5fe !important;
  654. // }
  655. // &.el-tag--success {
  656. // background-color: #e7faf0 !important;
  657. // border-color: #d0f5e0!important;
  658. // color: #13ce66!important;
  659. // }
  660. // &.el-tag--info {
  661. // background-color: #f4f4f5 !important;
  662. // border-color: #f4f4f5!important;
  663. // color: #909399!important;
  664. // }
  665. // }
  666. // }
  667. </style>