smoothEdbDialog.vue 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780
  1. <template>
  2. <!-- 指数修匀计算弹窗 -->
  3. <el-dialog
  4. :visible.sync="isOpenSmooth"
  5. :close-on-click-modal="false"
  6. :modal-append-to-body="false"
  7. @close="cancelHandle"
  8. center
  9. width="1200px"
  10. top="3vh"
  11. v-dialogDrag
  12. class="smooth-edb-dialog"
  13. >
  14. <div slot="title" style="display: flex; align-items: center">
  15. <img
  16. :src="$icons.computed"
  17. style="color: #fff; width: 16px; height: 16px; margin-right: 5px"
  18. />
  19. <span style="font-size: 16px">指数修匀</span>
  20. </div>
  21. <div class="smooth-edb-dialog-wrap">
  22. <!-- 常规计算 -->
  23. <div class="normal-wrap" v-if="computedSource===1">
  24. <div class="min-top">
  25. <label >选择指标:</label>
  26. <el-select
  27. v-model="select_target"
  28. v-loadMore="searchLoad"
  29. :filterable="!select_target"
  30. clearable
  31. placeholder="请输入指标名称"
  32. style="width: 85%"
  33. remote
  34. :remote-method="getTarget"
  35. @click.native="inputFocusHandle"
  36. @change="chooseTarget"
  37. @blur="search_have_more = false"
  38. :disabled="operationForm.view"
  39. >
  40. <i slot="prefix" class="el-input__icon el-icon-search"></i>
  41. <el-option
  42. v-for="item in searchOptions"
  43. :key="item.EdbInfoId"
  44. :label="$parent.currentLang==='en'?(item.EdbNameEn||item.EdbName):item.EdbName"
  45. :value="item.EdbInfoId"
  46. >
  47. </el-option>
  48. </el-select>
  49. <i class="el-icon-tickets" style="color:#409EFF;font-size:18px" @click="handleSelectBtnClick" v-if="select_target"/>
  50. </div>
  51. <div class="middle">
  52. <label>已选指标:</label>
  53. <el-table
  54. :data="tableData"
  55. style="box-shadow: 0px 3px 6px rgba(155, 170, 219, 0.2);margin-top:10px;"
  56. border>
  57. <el-table-column
  58. v-for="item in tableColums"
  59. :key="item.label"
  60. :label="item.label"
  61. :width="item.widthsty"
  62. :min-width="item.minwidthsty"
  63. align="center"
  64. >
  65. <template slot-scope="scope">
  66. <span>{{ scope.row[item.key] }}</span>
  67. </template>
  68. </el-table-column>
  69. <el-table-column
  70. width="110"
  71. align="center"
  72. label="操作"
  73. v-if="!operationForm.view"
  74. >
  75. <template slot-scope="scope">
  76. <span class="deletesty" @click="delTarget">删除</span>
  77. </template>
  78. </el-table-column>
  79. <div slot="empty" style="padding:20px 0 30px;">
  80. <tableNoData text="暂无指标" size="mini"/>
  81. </div>
  82. </el-table>
  83. <ul
  84. class="data-ul"
  85. ref="dataUl"
  86. @scroll="scrollHandle"
  87. v-if="dataList.length">
  88. <li
  89. class="value-item"
  90. v-for="(item, index) in dataList"
  91. :key="item.EdbDataId"
  92. >
  93. <span class="value-label">
  94. <i class="new-tag" v-if="index === 0"></i>
  95. {{item.DataTime}}
  96. </span>
  97. <span class="value-label" style="min-width:200px;text-align:center;">{{item.Value}}</span>
  98. </li>
  99. </ul>
  100. <div class="form-cont">
  101. <el-form
  102. ref="form"
  103. label-position="right"
  104. inline
  105. label-width="80px"
  106. :model="formData"
  107. :rules="formRules"
  108. :disabled="operationForm.view"
  109. >
  110. <el-form-item label="指标名称" prop="targetName">
  111. <el-input
  112. v-model="formData.targetName"
  113. style="width: 340px"
  114. placeholder="请输入指标名称"
  115. />
  116. </el-form-item>
  117. <el-form-item label="单位" prop="unit">
  118. <selectUnit
  119. v-model="formData.unit"
  120. style="width: 340px"
  121. />
  122. </el-form-item>
  123. <el-form-item label="指标目录" prop="menu">
  124. <el-cascader v-if="isOpenSmooth"
  125. v-model="formData.menu"
  126. :options="catalogArr"
  127. :props="levelProps"
  128. clearable
  129. placeholder="请选择指标目录"
  130. />
  131. </el-form-item>
  132. <el-form-item label="频度" prop="frequency">
  133. <el-select
  134. v-model="formData.frequency"
  135. placeholder="请选择频度"
  136. style="width: 340px"
  137. clearable
  138. >
  139. <el-option
  140. v-for="item in frequencyArr"
  141. :key="item"
  142. :label="item"
  143. :value="item"
  144. >
  145. </el-option>
  146. </el-select>
  147. </el-form-item>
  148. <el-form-item label="alpha值" prop="alphaValue">
  149. <el-input
  150. v-model.trim="formData.alphaValue"
  151. style="width: 340px"
  152. placeholder="请输入alpha值"
  153. />
  154. </el-form-item>
  155. </el-form>
  156. </div>
  157. </div>
  158. </div>
  159. <!-- 批量计算 -->
  160. <div class="batch-wrap" v-else>
  161. <ul class="target-ul">
  162. <li class="target-li" v-for="(list, index) in targetList" :key="index">
  163. <span class="li-tag">{{ list.tag }}</span>
  164. <el-select v-model="list.target" v-loadMore="searchLoad" :filterable="!list.target" clearable
  165. placeholder="请输入指标名称" style="width: 400px" @change="(val)=>{chooseTargetList(val,index)}"
  166. @clear="clearHandle(index)" remote :remote-method="getTarget"
  167. @click.native="inputFocusHandle">
  168. <i slot="prefix" class="el-input__icon el-icon-search"></i>
  169. <el-option v-for="item in searchOptions" :key="item.EdbInfoId"
  170. :label="$parent.currentLang==='en'?(item.EdbNameEn||item.EdbName):item.EdbName"
  171. :value="item.EdbInfoId">
  172. </el-option>
  173. </el-select>
  174. <i class="el-icon-tickets" style="color:#409EFF;font-size:18px"
  175. @click="$emit('lookHistory',list.target)" v-if="list.target" />
  176. <i class="el-icon-error del-tag" v-if="index > 1" @click="delTargetList(index)" />
  177. <span class="target-date" v-if="list.start_date">{{
  178. `${list.start_date}至${list.end_date}`
  179. }}</span>
  180. </li>
  181. </ul>
  182. <span class="add-icon" @click="addTargetHandle">
  183. <i class="el-icon-circle-plus-outline" style="color: #5882ef; font-size: 16px" />
  184. 添加更多指标
  185. </span>
  186. <ul class="form-ul">
  187. <li class="form-li" v-for="(list, index) in targetList" :key="index">
  188. <span class="li-tag">{{ list.tag }}</span>
  189. <el-form :ref="`list_form_${index}`"
  190. label-position="right"
  191. inline
  192. label-width="0px"
  193. :model="targetList[index]"
  194. :rules="formRules"
  195. >
  196. <el-form-item prop="targetName">
  197. <el-input
  198. v-model="targetList[index].targetName"
  199. style="width: 240px"
  200. placeholder="请输入指标名称"
  201. />
  202. </el-form-item>
  203. <el-form-item prop="menu">
  204. <el-cascader v-if="isOpenSmooth"
  205. v-model="targetList[index].menu"
  206. :options="catalogArr"
  207. :props="levelProps"
  208. style="width: 200px"
  209. clearable
  210. placeholder="请选择指标目录"
  211. />
  212. </el-form-item>
  213. <el-form-item prop="unit">
  214. <selectUnit
  215. v-model="targetList[index].unit"
  216. style="width: 160px"
  217. />
  218. </el-form-item>
  219. <el-form-item prop="alphaValue">
  220. <el-input
  221. v-model.trim="targetList[index].alphaValue"
  222. style="width: 180px"
  223. placeholder="请输入alpha值"
  224. />
  225. </el-form-item>
  226. <el-form-item prop="frequency">
  227. <el-select
  228. v-model="targetList[index].frequency"
  229. placeholder="请选择频度"
  230. style="width: 180px"
  231. clearable
  232. >
  233. <el-option
  234. v-for="item in frequencyArr"
  235. :key="item"
  236. :label="item"
  237. :value="item"
  238. >
  239. </el-option>
  240. </el-select>
  241. </el-form-item>
  242. </el-form>
  243. </li>
  244. </ul>
  245. </div>
  246. <div class="dia-bot" v-if="!operationForm.view">
  247. <el-button
  248. type="primary"
  249. style="margin-right: 20px"
  250. @click="saveBtnClick"
  251. :loading="loading"
  252. >指数修匀计算</el-button
  253. >
  254. <el-button type="primary" plain @click="cancelHandle(operationForm.edb_id?'':'cancel')">取消</el-button>
  255. </div>
  256. <el-popover
  257. placement="top-start"
  258. width="500"
  259. trigger="click">
  260. <p style="padding:30px;line-height:25px;" v-html="$parent.tips.get('alpha')"/>
  261. <span slot="reference" class="tip-label">公式说明</span>
  262. </el-popover>
  263. </div>
  264. </el-dialog>
  265. </template>
  266. <script>
  267. import { dataBaseInterface } from '@/api/api.js';
  268. import * as preDictEdbInterface from '@/api/modules/predictEdbApi.js';
  269. import { formRules } from './util';
  270. const tag_arr = [];
  271. for(let i=0;i<26;i++) tag_arr.push(String.fromCharCode(65+i));
  272. export default {
  273. props:{
  274. isOpenSmooth:{
  275. type:Boolean,
  276. default:false
  277. },
  278. computedSource:{ //常规 or 批量
  279. type:Number,
  280. default:1
  281. },
  282. operationForm:{
  283. type:Object,
  284. default:()=>{return{
  285. edb_id:'',
  286. oldedb_id:''
  287. }}
  288. },
  289. isPredict:{ //是不是预测指标
  290. type:Boolean,
  291. default:false,
  292. }
  293. },
  294. data() {
  295. return {
  296. /* 常规 */
  297. formData:{
  298. targetName:'',
  299. unit:'',
  300. menu:'',
  301. frequency:'',
  302. alphaValue:''
  303. },
  304. formRules,
  305. frequencyArr: ['日度', '周度','旬度', '月度', '季度', '年度'],
  306. catalogArr:[],
  307. levelProps: {
  308. label: 'ClassifyName',
  309. value: 'ClassifyId',
  310. children: 'Children',
  311. emitPath: false,
  312. },
  313. select_target:'',
  314. search_page:1,
  315. search_have_more:false,
  316. searchOptions:[],
  317. current_search:'',
  318. tableData:[],
  319. page_no:1,
  320. haveMore:false,
  321. tableColums:[
  322. {
  323. label: '指标ID',
  324. key: 'EdbCode',
  325. },
  326. {
  327. label: '指标名称',
  328. key: 'EdbName',
  329. },
  330. {
  331. label: '频度',
  332. key: 'Frequency',
  333. },
  334. {
  335. label: '单位',
  336. key: 'Unit',
  337. },
  338. {
  339. label: '起始时间',
  340. key: 'StartDate',
  341. minwidthsty: '100px'
  342. },
  343. {
  344. label: '更新时间',
  345. key: 'ModifyTime',
  346. minwidthsty: '110px'
  347. },
  348. {
  349. label: '来源',
  350. key: 'SourceName',
  351. },
  352. ],
  353. dataList:[],
  354. /* 批量 */
  355. targetList:[/* {
  356. tag:'A',
  357. target:123456 //edbid
  358. ...formData
  359. } */],
  360. formDataList:[],
  361. loading:false,
  362. };
  363. },
  364. watch:{
  365. isOpenSmooth(newVal){
  366. if(newVal){
  367. this.getMenu()
  368. if(this.operationForm.edb_id){
  369. this.select_target = this.operationForm.oldedb_id
  370. this.getDataList()
  371. this.setDefaultOption(this.operationForm,'edit')
  372. //回显时的默认options
  373. this.searchOptions = [
  374. {
  375. EdbInfoId: this.operationForm.oldedb_id,
  376. EdbName: this.operationForm.oldEdb_name,
  377. }
  378. ]
  379. }
  380. if(this.computedSource===2){
  381. this.addTargetHandle()
  382. this.addTargetHandle()
  383. }
  384. }
  385. }
  386. },
  387. methods: {
  388. init(){
  389. this.$refs.form&&(this.$refs.form.resetFields());
  390. Object.assign(this.$data, this.$options.data());
  391. },
  392. searchLoad() {
  393. if(!this.search_have_more) return;
  394. this.searchApi(this.current_search,++this.search_page)
  395. },
  396. async searchApi(query,page=1){
  397. const params = {
  398. KeyWord:query,
  399. CurrentIndex: page,
  400. }
  401. const res = this.isPredict
  402. ? await preDictEdbInterface.edbSearch(params)
  403. : await dataBaseInterface.targetSearchByPage(params)
  404. if(res.Ret !== 200) return
  405. const { List,Paging } = res.Data;
  406. this.search_have_more = page < Paging.Pages;
  407. let arr = page === 1 ? List : this.searchOptions.concat(List);
  408. this.searchOptions = arr;
  409. },
  410. /* 指标列表 */
  411. getTarget(query) {
  412. this.search_page = 1;
  413. this.current_search = query;
  414. this.searchApi(this.current_search);
  415. },
  416. /* 聚焦获取当前检索 */
  417. inputFocusHandle(e) {
  418. this.search_page = 1;
  419. this.current_search = e.target.value;
  420. this.searchApi(this.current_search);
  421. },
  422. /* 获取目录结构 */
  423. async getMenu() {
  424. const res = this.isPredict
  425. ? await preDictEdbInterface.classifyListV2()
  426. : await dataBaseInterface.menuListV3()
  427. if(res.Ret!==200) return
  428. this.catalogArr = res.Data.AllNodes || [];
  429. },
  430. /* 选择指标 */
  431. chooseTarget(val) {
  432. if(val) {
  433. let obj = this.searchOptions.find(item => item.EdbInfoId === val);
  434. //同步指标信息
  435. this.setDefaultOption(obj);
  436. this.page_no = 1;
  437. this.dataList.length ? this.$refs.dataUl.scrollTop = 0 : null;
  438. this.getDataList()
  439. }else {
  440. this.tableData = [];
  441. this.dataList = [];
  442. }
  443. },
  444. chooseTargetList(val,index){
  445. if(val){
  446. const obj = this.searchOptions.find(item => item.EdbInfoId === val);
  447. this.targetList[index].targetName = `${obj.EdbName}指数修匀`
  448. this.targetList[index].unit = obj.Unit
  449. this.targetList[index].frequency = obj.Frequency
  450. this.targetList[index].menu = obj.ClassifyId||''
  451. this.targetList[index].alphaValue =obj.Formula||''
  452. }
  453. },
  454. setDefaultOption(obj,type){
  455. this.formData = {
  456. targetName:`${obj.EdbName}${type==='edit'?'':'指数修匀'}`,
  457. unit:obj.Unit,
  458. frequency:obj.Frequency,
  459. menu:obj.ClassifyId||'',
  460. alphaValue:obj.Formula||''
  461. }
  462. },
  463. async getDataList(){
  464. const params = {
  465. PageSize: 10,
  466. CurrentIndex: this.page_no,
  467. EdbInfoId: this.select_target,
  468. }
  469. const res = this.isPredict
  470. ? await preDictEdbInterface.edbDataInfo(params)
  471. : await dataBaseInterface.targetList(params)
  472. if(res.Ret!==200) return
  473. if(res.Data){
  474. res.Data.Item.ModifyTime = res.Data.Item.ModifyTime.substr(0,10);
  475. this.tableData = [res.Data.Item] || [];
  476. this.haveMore = this.page_no < res.Data.Paging.Pages ? true : false;
  477. this.dataList = this.page_no === 1 ? (res.Data.Item.DataList || []) : this.dataList.concat(res.Data.Item.DataList);
  478. }else{
  479. this.tableData = [];
  480. this.dataList = [];
  481. }
  482. },
  483. handleSelectBtnClick(){
  484. //计算指标打开弹窗,基础指标打开新页面
  485. if(this.tableData[0].EdbType===2){
  486. this.$emit('lookHistory',this.select_target)
  487. }else{
  488. const {ClassifyId,UniqueCode,EdbInfoId} = this.tableData[0]
  489. let {href} = this.$router.resolve({path:`/database`,query:{code:UniqueCode,id:EdbInfoId,classifyId:ClassifyId}});
  490. window.open(href,'_blank');
  491. }
  492. },
  493. scrollHandle(e){
  494. const dom = e.target
  495. let scrollTop = dom.scrollTop; //滑入屏幕上方的高度
  496. let windowHeitht = dom.clientHeight; //页面的高度
  497. let scrollHeight = dom.scrollHeight; //整个div的高度
  498. let total = scrollTop + windowHeitht
  499. if(total >= scrollHeight && this.haveMore){
  500. this.page_no ++;
  501. this.getDataList();
  502. }
  503. },
  504. /* 删除已选指标 */
  505. delTarget() {
  506. this.tableData = [];
  507. this.dataList = [];
  508. this.select_target = '';
  509. this.page_no = 1;
  510. },
  511. delTargetList(index){
  512. this.targetList.splice(index, 1);
  513. },
  514. clearHandle(index){
  515. const item = {...{tag:tag_arr[index],target:''},..._.cloneDeep(this.formData)}
  516. this.targetList.splice(index,1,item)
  517. },
  518. addTargetHandle(){
  519. if(this.targetList.length >= 26){
  520. this.$message.warning('添加指标个数已达上限')
  521. return
  522. }
  523. let tag = 'A'
  524. let index = -1
  525. if(this.targetList.length>=1){
  526. tag = this.targetList[this.targetList.length-1].tag;
  527. index = tag_arr.findIndex(item => item === tag);
  528. }
  529. const item = {...{tag:tag_arr[index+1],target:''},..._.cloneDeep(this.formData)}
  530. this.targetList.push(item)
  531. },
  532. saveBtnClick(){
  533. this.computedSource===1?this.saveHandle():this.saveListHandle()
  534. },
  535. //常规编辑/保存指标
  536. async saveHandle(){
  537. if(!this.select_target){
  538. this.$message.warning('指标不能为空')
  539. return
  540. }
  541. await this.$refs.form.validate();
  542. this.loading = true;
  543. const {targetName,unit,menu,frequency,alphaValue} = this.formData
  544. let params = {
  545. Source:this.$route.path==='/database'?72:73,
  546. EdbName:targetName,
  547. Unit:unit,
  548. ClassifyId:menu,
  549. Frequency:frequency,
  550. Formula:alphaValue,
  551. FromEdbInfoId:this.select_target
  552. }
  553. let res = null
  554. if(this.isPredict){
  555. let edit_params = { ...params,EdbInfoId: this.operationForm.edb_id }
  556. res = await preDictEdbInterface.operateEdbSave(this.operationForm.edb_id ? edit_params : params)
  557. }else{
  558. res = this.operationForm.edb_id
  559. ? await dataBaseInterface.calculateTargetEdit({ ...params,EdbInfoId: this.operationForm.edb_id })
  560. : await dataBaseInterface.calculateTargetSave(params)
  561. }
  562. if(res.Ret!==200) return
  563. this.$message.success(res.Msg)
  564. this.operationForm.edb_id
  565. ? this.$emit('addCallBack','edit')
  566. : this.$emit('addCallBack','add',{ code:res.Data.UniqueCode,id:res.Data.EdbInfoId,classifyId:params.ClassifyId });
  567. this.init();
  568. this.loading = false;
  569. },
  570. //批量添加指标
  571. async saveListHandle(){
  572. //只添加选择了指标的
  573. const targetCheck = this.targetList.filter(item=>item.target)
  574. /* if(targetCheck.length!==this.targetList.length){
  575. this.$message.warning('请选择指标')
  576. return
  577. } */
  578. //只验证选择了指标的form-rules
  579. for(let i = 0;i<targetCheck.length;i++){
  580. const index = tag_arr.findIndex(item=>item===targetCheck[i].tag)
  581. await this.$refs[`list_form_${index}`][0].validate();
  582. }
  583. this.loading = true
  584. const params = targetCheck.map(item=>{
  585. return {
  586. CalculateId: item.tag,
  587. CalculateInfo: {
  588. ClassifyId: item.menu,
  589. EdbName: item.targetName,
  590. Formula: item.alphaValue,
  591. Frequency:item.frequency,
  592. FromEdbInfoId: item.target,
  593. Source:this.$route.path==='/database'?72:73,
  594. Unit: item.unit
  595. }
  596. }
  597. })
  598. const res = this.$route.path==='/database'
  599. ? await dataBaseInterface.batchCalculateTargetAdd(params)
  600. : await preDictEdbInterface.batchCalculateTargetAdd(params)
  601. if(res.Ret !== 200) return
  602. const { Fail,Success } = res.Data;
  603. if(Fail.length) {
  604. let message = '';
  605. Fail.forEach(item => {
  606. message+=`${item.CalculateId}:${item.Msg}</br>`
  607. })
  608. this.$message({
  609. dangerouslyUseHTMLString: true,
  610. message,
  611. type: 'error'
  612. })
  613. this.dealFailHandle(Fail)
  614. }else {
  615. this.$message.success('添加成功');
  616. this.init();
  617. this.$emit('addCallBack','add',{ code:Success[0].UniqueCode,id:Success[0].EdbInfoId,classifyId:Success[0].ClassifyId});
  618. this.loading = false;
  619. }
  620. },
  621. dealFailHandle(arr){
  622. //从targetList中剔除成功的指标,重新赋予剩下的指标tag
  623. const failTagArr = arr.map(_ =>_.CalculateId);
  624. this.targetList = this.targetList.filter(_ => failTagArr.includes(_.tag));
  625. this.targetList.forEach((item,index)=>{
  626. item.tag = tag_arr[index]
  627. })
  628. this.loading = false;
  629. },
  630. cancelHandle(type) {
  631. this.init();
  632. this.$emit('cancel');
  633. type==='cancel' && this.$emit('openPrev');
  634. },
  635. },
  636. };
  637. </script>
  638. <style lang="scss">
  639. .smooth-edb-dialog{
  640. .el-dialog__body{
  641. padding: 25px 25px 30px !important;
  642. padding-bottom: 5px !important;
  643. }
  644. }
  645. .smooth-edb-dialog-wrap{
  646. .el-cascader .el-input {
  647. width: 340px;
  648. }
  649. .min-top {
  650. padding: 20px 30px;
  651. border: 1px solid #ECECEC;
  652. box-shadow: 0px 3px 6px rgba(0, 0, 0, 0.05);
  653. border-radius:4px;
  654. }
  655. .middle {
  656. margin-top: 20px;
  657. .data-ul {
  658. margin-top: 5px;
  659. border-bottom: 1px solid #dcdfe6;
  660. max-height: 140px;
  661. overflow-y: auto;
  662. .value-item {
  663. padding: 14px 0;
  664. border: 1px solid #dcdfe6;
  665. border-bottom: none;
  666. display: flex;
  667. justify-content: space-around;
  668. .value-label {
  669. position: relative;
  670. color: #666;
  671. }
  672. .new-tag {
  673. width: 6px;
  674. height: 6px;
  675. display: inline-block;
  676. position: absolute;
  677. left: -12px;
  678. top: 50%;
  679. transform: translateY(-50%);
  680. border-radius: 50%;
  681. background: #f00;
  682. }
  683. }
  684. }
  685. .form-cont {
  686. padding-top: 30px;
  687. margin-top: 30px;
  688. border-top: 1px dashed #AAB4CC;
  689. input::-webkit-outer-spin-button,
  690. input::-webkit-inner-spin-button {
  691. -webkit-appearance: none;
  692. }
  693. input[type="number"]{
  694. -moz-appearance: textfield;
  695. }
  696. }
  697. }
  698. .dia-bot {
  699. padding: 20px 0 30px;
  700. display: flex;
  701. justify-content: center;
  702. }
  703. .tip-label {
  704. position: absolute;
  705. bottom: 30px;
  706. right: 30px;
  707. color: #409EFF;
  708. cursor: pointer;
  709. }
  710. .batch-wrap{
  711. padding:0 40px;
  712. .target-ul {
  713. display: flex;
  714. flex-wrap: wrap;
  715. justify-content: space-between;
  716. .target-li {
  717. position: relative;
  718. margin-bottom: 30px;
  719. .li-tag {
  720. font-size: 16px;
  721. margin-right: 8px;
  722. }
  723. .del-tag {
  724. position: absolute;
  725. right: -30px;
  726. top: 12px;
  727. font-size: 16px;
  728. cursor: pointer;
  729. }
  730. .target-date {
  731. color: #5882ef;
  732. position: absolute;
  733. bottom: -25px;
  734. left: 24px;
  735. }
  736. }
  737. }
  738. .add-icon {
  739. font-size: 16px;
  740. color: #5882ef;
  741. cursor: pointer;
  742. }
  743. .form-ul {
  744. padding-top: 20px;
  745. margin-top: 20px;
  746. border-top: 1px dashed #AAB4CC;
  747. .form-li {
  748. display: flex;
  749. align-items: center;
  750. margin-bottom: 15px;
  751. .el-cascader>.el-input{
  752. width:100%;
  753. }
  754. .el-form-item{
  755. margin-bottom: 0;
  756. }
  757. .li-tag{
  758. margin-right: 20px;
  759. }
  760. }
  761. }
  762. }
  763. }
  764. </style>