smoothEdbDialog.vue 32 KB

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