operationDialog.vue 21 KB

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