operationDialog.vue 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982
  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 fit-screen-dialog"
  8. center
  9. top="5vh"
  10. v-dialogDrag
  11. >
  12. <div slot="title" style="display: flex; align-items: center">
  13. <img
  14. :src="$icons.computed"
  15. style="color: #fff; width: 16px; height: 16px; margin-right: 5px"
  16. />
  17. <span style="font-size: 16px">{{ (operationForm.edb_id ? (operationForm.view ? $t('Dialog.title_prefix_view') : $t('Dialog.title_prefix_edit')) : '') + titleMap.get(type) }}</span>
  18. </div>
  19. <div class="dialog-main">
  20. <!-- 多选source -->
  21. <ul class="label-cont" v-if="!operationForm.view && !operationForm.edb_id">
  22. <li v-for="item in sourceList" :key="item.key" :class="{act: type === item.key}" @click="init();$emit('changeSource',item.key)">{{item.label}}</li>
  23. </ul>
  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 v-if="item.key==='Frequency'">{{ getFrequencyTrans(scope.row.Frequency) }}</span>
  78. <span v-else-if="item.key==='Unit'">{{ getUnitTrans(scope.row.Unit) }}</span>
  79. <span v-else>{{ scope.row[item.key] }}</span>
  80. </template>
  81. </el-table-column>
  82. <el-table-column
  83. width="110"
  84. align="center"
  85. :label="$t('Table.column_operations')"
  86. v-if="!operationForm.view"
  87. >
  88. <template slot-scope="scope">
  89. <span class="deletesty" @click="delTarget"><!-- 删除 -->{{$t('Table.delete_btn')}}</span>
  90. </template>
  91. </el-table-column>
  92. <div slot="empty" style="padding:20px 0 30px;">
  93. <tableNoData :text="$t('Table.no_edb_msg')" size="mini"/>
  94. </div>
  95. </el-table>
  96. <ul
  97. class="data-ul"
  98. ref="dataUl"
  99. @scroll="scrollHandle"
  100. v-if="dataList.length">
  101. <li
  102. class="value-item"
  103. v-for="(item, index) in dataList"
  104. :key="item.EdbDataId"
  105. >
  106. <span class="value-label">
  107. <i class="new-tag" v-if="index === 0"></i>
  108. {{item.DataTime}}
  109. </span>
  110. <span class="value-label" style="min-width:200px;text-align:center;">{{item.Value}}</span>
  111. </li>
  112. </ul>
  113. <div class="form-cont">
  114. <el-form
  115. ref="form"
  116. label-position="right"
  117. inline
  118. label-width="120px"
  119. :model="formData"
  120. :rules="formRules"
  121. :disabled="operationForm.view"
  122. >
  123. <!-- 时间移位选项 -->
  124. <el-form-item :label="$t('EtaBasePage.label_move_way')" style="display: block;" v-if="type === 22" prop="moveVal">
  125. <el-select
  126. v-model="formData.moveType"
  127. style="width: 100px"
  128. placeholder=""
  129. size="mini"
  130. @change="refreshTarget"
  131. >
  132. <el-option
  133. v-for="item in moveTypeOpions"
  134. :key="item.key"
  135. :label="item.label"
  136. :value="item.key"
  137. >
  138. </el-option>
  139. </el-select>
  140. <el-input
  141. style="width: 80px"
  142. type="number"
  143. min="0"
  144. size="mini"
  145. v-model="formData.moveVal"
  146. @change="refreshTarget"
  147. @keyup.native="filterCode(formData)"
  148. ></el-input>
  149. <el-select
  150. v-model="formData.moveUnit"
  151. size="mini"
  152. placeholder=""
  153. style="width: 100px"
  154. @change="refreshTarget"
  155. >
  156. <el-option
  157. v-for="item in fre_options"
  158. :key="item.label"
  159. :label="item.label"
  160. :value="item.value"
  161. >
  162. </el-option>
  163. </el-select>
  164. </el-form-item>
  165. <!-- 指标名称 -->
  166. <el-form-item :label="$t('Edb.Detail.e_name')" prop="targetName">
  167. <el-input
  168. v-model="formData.targetName"
  169. style="width: 340px"
  170. :placeholder="$t('Edb.InputHolderAll.input_name')"
  171. />
  172. </el-form-item>
  173. <!-- 指标单位 -->
  174. <el-form-item :label="$t('Edb.Detail.e_unit')" prop="unit">
  175. <selectUnit
  176. v-model="formData.unit"
  177. style="width: 340px"
  178. :disabled="!operationForm.edb_id&&[6,7,75].includes(type)"
  179. />
  180. </el-form-item>
  181. <!-- 指标目录 -->
  182. <el-form-item :label="$t('Edb.Detail.e_menu')" prop="menu">
  183. <cascader
  184. v-model="formData.menu"
  185. :options="options"
  186. clearable
  187. :placeholder="$t('Edb.InputHolderAll.input_menu')"
  188. :config="{ checkStrictly: true }"
  189. />
  190. </el-form-item>
  191. <!-- 指标频度 -->
  192. <el-form-item :label="$t('Edb.Detail.e_fre')" prop="frequency">
  193. <el-select
  194. v-model="formData.frequency"
  195. :placeholder="$t('Edb.InputHolderAll.input_fre')"
  196. style="width: 340px"
  197. clearable
  198. :disabled="[5,14,61,63].includes(type)||(!operationForm.edb_id&&[6,7,75].includes(type))"
  199. @change="handleFrequencyChange"
  200. >
  201. <el-option
  202. v-for="item in frequencyArr"
  203. :key="item.label"
  204. :label="item.label"
  205. :value="item.value"
  206. >
  207. </el-option>
  208. </el-select>
  209. </el-form-item>
  210. <!-- N数值 -->
  211. <el-form-item :label="$t('EtaBasePage.label_n_val')" prop="n_num" v-if="[8,12,13,35].includes(type)">
  212. <el-input
  213. v-model="formData.n_num"
  214. style="width: 340px"
  215. :placeholder="$t('Edb.InputHolderAll.input_n_val')"
  216. type="number"
  217. @change="NchangeHandle"
  218. />
  219. </el-form-item>
  220. <!-- 超季节性 公历农历-->
  221. <el-form-item :label="$t('EtaBasePage.label_calendar')" prop="calendar_type" v-if="type===35">
  222. <el-select
  223. v-model="formData.calendar_type"
  224. :placeholder="$t('EtaBasePage.label_calendar_placeholder')"
  225. style="width: 340px"
  226. @change="NchangeHandle"
  227. >
  228. <el-option
  229. v-for="item in calendarOptions"
  230. :key="item.key"
  231. :label="item.label"
  232. :value="item.label"
  233. >
  234. </el-option>
  235. </el-select>
  236. </el-form-item>
  237. <!-- 降频 取值类型 -->
  238. <el-form-item :label="$t('EtaBasePage.label_val_type')" prop="value_type" v-if="type===51">
  239. <el-select
  240. v-model="formData.value_type"
  241. placeholder="请选择数据取值类型"
  242. style="width: 340px"
  243. >
  244. <el-option :label="$t('EtaBasePage.val_type_end')" value="期末值"/>
  245. <el-option :label="$t('EtaBasePage.val_type_average')" value="平均值"/>
  246. </el-select>
  247. </el-form-item>
  248. <!-- 最新值处理 -->
  249. <el-form-item :label="$t('Edb.CalculatesAll.latest_processing')" prop="new_value" v-if="type===62">
  250. <el-select v-model="formData.new_value" placeholder="请选择" style="width: 340px">
  251. <el-option :label="$t('EtaBasePage.default_select_text')" value=""></el-option>
  252. <el-option :label="$t('EtaBasePage.mean_imputation_select_text')" :value="'均值填充'" v-if="hasNewValueOpt"></el-option>
  253. </el-select>
  254. </el-form-item>
  255. <el-form-item :label="$t('EtaBasePage.null_val_deal')" prop="emptyType" v-if="type===14">
  256. <el-select
  257. v-model="formData.emptyType"
  258. :placeholder="$t('Edb.InputHolderAll.input_fre')"
  259. style="width: 340px"
  260. >
  261. <el-option :label="$t('EtaBasePage.null_val_deal_2')" :value="0"></el-option>
  262. <el-option :label="$t('EtaBasePage.null_val_deal_3')" :value="3"></el-option>
  263. </el-select>
  264. </el-form-item>
  265. </el-form>
  266. </div>
  267. </div>
  268. </div>
  269. <div class="dia-bot" v-if="!operationForm.view">
  270. <el-button
  271. type="primary"
  272. style="margin-right: 20px"
  273. @click="saveHandle"
  274. :loading="loading"
  275. >{{loading ? $t('Edb.calculate_ing') : operationForm.edb_id ? $t('Dialog.confirm_save_btn') : saveBtnMap.get(type)}}</el-button
  276. >
  277. <el-button type="primary" plain @click="cancelHandle('cancel')"><!-- 取消 -->{{$t('Dialog.cancel_btn')}}</el-button>
  278. </div>
  279. <el-popover
  280. placement="top-start"
  281. width="500"
  282. trigger="click">
  283. <p style="padding:30px;line-height:25px;" v-html="$parent.tips.get(type)"/>
  284. <span slot="reference" class="tip-label"><!-- 公式说明 -->{{$t('Edb.formula_instru')}}</span>
  285. </el-popover>
  286. </el-dialog>
  287. </template>
  288. <script>
  289. import { dataBaseInterface } from '@/api/api.js';
  290. import { formRules} from './util';
  291. import { unitArr,frequencySelectList } from '@/utils/defaultOptions';
  292. export default {
  293. name:'',
  294. props: {
  295. isOperation: {
  296. type: Boolean
  297. },
  298. type: {
  299. type: Number
  300. },
  301. operationForm: {
  302. type: Object,
  303. }
  304. },
  305. computed: {
  306. // 累计值计算时 均值填充判断标识
  307. frequencyChangeFlag(){
  308. return this.tableData[0]?`${this.tableData[0].Frequency}转${this.formData.frequency}`:''
  309. }
  310. },
  311. watch: {
  312. isOperation(newval) {
  313. newval && this.getMenu();
  314. if(newval && this.operationForm.edb_id) {
  315. const backData = _.cloneDeep(this.operationForm);
  316. this.select_target = backData.oldedb_id;
  317. const {
  318. edb_id,
  319. targetName,
  320. unit,
  321. menu,
  322. frequency,
  323. formula,
  324. moveType,
  325. moveUnit,
  326. moveVal,
  327. oldedb_id,
  328. oldEdb_name,
  329. calendar_type,
  330. EmptyType
  331. } = backData;
  332. this.formData = {
  333. edb_id,
  334. targetName,
  335. unit,
  336. menu,
  337. frequency,
  338. n_num: formula,
  339. value_type: this.type === 51 ? formula : '期末值',
  340. moveType,
  341. moveUnit,
  342. moveVal,
  343. calendar_type,
  344. new_value:'',
  345. emptyType:EmptyType,
  346. }
  347. this.getDataList();
  348. if(backData.Extra){
  349. const ExtraObj=JSON.parse(backData.Extra)
  350. this.formData.new_value=ExtraObj.LastValType==1?'均值填充':''
  351. }
  352. //回显时的默认options
  353. this.searchOptions = [
  354. {
  355. EdbInfoId: oldedb_id,
  356. EdbName: oldEdb_name,
  357. }
  358. ]
  359. }
  360. this.sourceList = [5,61].includes(this.type)
  361. ? [{ label: /* '累计值转月值' */this.$t('Edb.CalculatesAll.to_month'),key: 5 },{ label: /* '累计值转季值' */this.$t('Edb.CalculatesAll.to_quarter'),key: 61 }]
  362. : [62,63].includes(this.type)
  363. ? [{ label: /* '累计值' */this.$t('Edb.CalculatesAll.cumulate'),key: 62 },{ label: /* '年初至今累计值' */this.$t('Edb.CalculatesAll.cumulate_oneyear'),key: 63 }]
  364. : []
  365. },
  366. frequencyChangeFlag(n){
  367. const arr=['日度转周度','日度转旬度','周度转旬度']
  368. if(n&&arr.includes(n)){
  369. this.hasNewValueOpt=false
  370. this.formData.new_value=''
  371. }else{
  372. this.hasNewValueOpt=true
  373. }
  374. }
  375. },
  376. computed: {
  377. tableColums(){
  378. return [
  379. {
  380. label: /* '指标ID' */this.$t('Edb.Detail.e_id'),
  381. key: 'EdbCode',
  382. },
  383. {
  384. label: /* '指标名称' */this.$t('Edb.Detail.e_name'),
  385. key: this.$parent.currentLang==='en'?'EdbNameEn':'EdbName',
  386. },
  387. {
  388. label: /* '频度' */ this.$t('Edb.Detail.e_fre'),
  389. key: 'Frequency',
  390. },
  391. {
  392. label: /* '单位' */this.$t('Edb.Detail.e_unit'),
  393. key: this.$parent.currentLang==='en'?'UnitEn':'Unit',
  394. },
  395. {
  396. label: /* '起始时间' */this.$t('Edb.Detail.e_start_time'),
  397. key: 'StartDate',
  398. minwidthsty: '100px'
  399. },
  400. {
  401. label: /* '更新时间' */this.$t('Edb.Detail.e_update_time'),
  402. key: 'ModifyTime',
  403. minwidthsty: '110px'
  404. },
  405. {
  406. label: /* '来源' */this.$t('Edb.Detail.source'),
  407. key: 'SourceName',
  408. },
  409. ]
  410. },
  411. formRules(){
  412. return formRules
  413. },
  414. unitArr() {
  415. return unitArr
  416. },
  417. titleMap(){//标题
  418. return new Map([
  419. [5,this.$t('Edb.CalculatesAll.to_month_quarter')],/* '累计值转月/季值' */
  420. [6,this.$t('Edb.CalculatesAll.on_year')],/* '同比值' */
  421. [7,this.$t('Edb.CalculatesAll.differ')],/* '同差值' */
  422. [8,this.$t('Edb.CalculatesAll.n_move_average')],/* 'N数值移动平均计算' */
  423. [12,this.$t('Edb.CalculatesAll.n_rate')],/* 'N数值环比值' */
  424. [13,this.$t('Edb.CalculatesAll.n_differ')],/* 'N数值环差值' */
  425. [14,this.$t('Edb.CalculatesAll.up_conver')],/* 升频 */
  426. [22,this.$t('Edb.CalculatesAll.time_move')],/* '时间移位' */
  427. [35,this.$t('Edb.CalculatesAll.super_season')],/* '超季节性' */
  428. // [40, this.$t('Edb.CalculatesAll.differ')],/* '数据调整' */
  429. [52,this.$t('Edb.CalculatesAll.annual')],/* '年化' */
  430. [51,this.$t('Edb.CalculatesAll.down_conver')],/* '降频' */
  431. [61,this.$t('Edb.CalculatesAll.to_month_quarter')],/* '累计值转月/季值' */
  432. [62,this.$t('Edb.CalculatesAll.cumulate')],/* '累计值' */
  433. [63,this.$t('Edb.CalculatesAll.cumulate')],/* '累计值' */
  434. [75,this.$t('Edb.CalculatesAll.day_mean')]/* '日均值' */
  435. ])
  436. },
  437. saveBtnMap(){//保存文案
  438. return new Map([
  439. [5,this.$t('Edb.CalculateBtns.to_month')],/* '转月值计算' */
  440. [6,this.$t('Edb.CalculateBtns.on_year')],/* '同比值计算' */
  441. [7,this.$t('Edb.CalculateBtns.differ')],/* '同差值计算' */
  442. [8,this.$t('Edb.CalculateBtns.n_move_average')],/* '移动平均计算' */
  443. [12,this.$t('Edb.CalculateBtns.n_rate')],/* '环比值计算' */
  444. [13,this.$t('Edb.CalculateBtns.n_differ')],/* '环差值计算' */
  445. [14,this.$t('Edb.CalculateBtns.up_conver')],/* '升频计算' */
  446. [22,this.$t('Dialog.confirm_save_btn')],/* '保存' */
  447. [35,this.$t('Edb.CalculateBtns.super_season')],/* '超季节性计算' */
  448. [52,this.$t('Edb.CalculateBtns.annual')],/* '年化计算' */
  449. [51,this.$t('Edb.CalculateBtns.down_conver')],/* '降频计算' */
  450. [61,this.$t('Edb.CalculateBtns.to_quarter')],/* '转季值计算' */
  451. [62,this.$t('Edb.CalculateBtns.cumulate')],/* '累计值计算' */
  452. [63,this.$t('Edb.CalculateBtns.cumulate_oneyear')],/* '年初至今计算' */
  453. [75,this.$t('Edb.CalculateBtns.day_mean')],/* '日均值计算' */
  454. ])
  455. },
  456. frequencyArr(){//频度筛选
  457. return frequencySelectList(['半年度'])
  458. },
  459. fre_options(){//领先频率
  460. return [
  461. {label:this.$t('Edb.FreAll.day_min'),value:'天'},
  462. {label:this.$t('Edb.FreAll.week_min'),value:'周'},
  463. {label:this.$t('Edb.FreAll.month_min'),value:'月'},
  464. {label:this.$t('Edb.FreAll.quarter_min'),value:'季'},
  465. {label:this.$t('Edb.FreAll.year_min'),value:'年'},
  466. ]
  467. },
  468. moveTypeOpions(){
  469. return [
  470. {
  471. label: this.$t('ETableChildren.ahead_lable'),
  472. key: 1
  473. },
  474. {
  475. label: this.$t('ETableChildren.lagging_lable'),
  476. key: 2
  477. },
  478. ]
  479. },
  480. calendarOptions(){
  481. return [
  482. {label: this.$t('Chart.calendar_gre'),key: 1},
  483. {label: this.$t('Chart.calendar_lunar_text'),key: 2},
  484. ]
  485. }
  486. },
  487. data () {
  488. return {
  489. select_target:'',
  490. searchOptions:[],//指标列表
  491. haveMore: true,
  492. dataList:[],
  493. tableData:[],
  494. page_no:1,
  495. formData: {
  496. targetName:'',
  497. unit:'',
  498. menu:'',
  499. frequency:'',
  500. n_num: 1,
  501. moveType: 1,
  502. moveUnit: '天',
  503. moveVal: '',
  504. calendar_type: '公历',
  505. value_type: '期末值',
  506. new_value:'',
  507. emptyType:0,
  508. },
  509. options: [],
  510. levelProps: {
  511. label: 'ClassifyName',
  512. value: 'ClassifyId',
  513. children: 'Children',
  514. checkStrictly: true
  515. },
  516. /* frequencyArr, */
  517. /* fre_options: ['天','周','月','季','年'], */
  518. /* moveTypeOpions: [
  519. {
  520. label: '领先',
  521. key: 1
  522. },
  523. {
  524. label: '滞后',
  525. key: 2
  526. },
  527. ], */
  528. loading:false,
  529. search_have_more: false,
  530. search_page: 1,
  531. current_search: '',
  532. /* calendarOptions: [
  533. {label: '公历',key: 1},
  534. {label: '农历',key: 2},
  535. ], */
  536. sourceList: [],
  537. hasNewValueOpt:true,//最新值处理的选项
  538. };
  539. },
  540. methods: {
  541. /* 指标列表 */
  542. getTarget(query) {
  543. this.search_page = 1;
  544. this.current_search = query;
  545. this.searchApi(this.current_search);
  546. },
  547. /* 聚焦获取当前检索 */
  548. inputFocusHandle(e) {
  549. this.search_page = 1;
  550. this.current_search = e.target.value;
  551. this.searchApi(this.current_search);
  552. },
  553. searchApi(query,page=1) {
  554. const filterMap = {
  555. 5: 2,
  556. 14: 3,
  557. 63: 6
  558. }
  559. dataBaseInterface.targetSearchByPage({
  560. KeyWord:query,
  561. CurrentIndex: page,
  562. FilterSource: filterMap[this.type] ? filterMap[this.type] : 1,
  563. Frequency: this.type===61?'季度': ''
  564. }).then(res => {
  565. if(res.Ret !== 200) return
  566. const { List,Paging } = res.Data;
  567. this.search_have_more = page < Paging.Pages;
  568. let arr = page === 1 ? List : this.searchOptions.concat(List);
  569. this.searchOptions = this.operationForm.edb_id ? arr.filter(item => item.EdbInfoId !== this.operationForm.edb_id) : arr;
  570. })
  571. },
  572. searchLoad() {
  573. if(!this.search_have_more) return;
  574. this.searchApi(this.current_search,++this.search_page)
  575. },
  576. /* 获取目录结构 */
  577. getMenu() {
  578. dataBaseInterface.menuListV3().then((res) => {
  579. if (res.Ret === 200) {
  580. this.filterNodes(res.Data.AllNodes||[]);
  581. this.options = res.Data.AllNodes || [];
  582. }
  583. });
  584. },
  585. // 递归改变第三级目录结构
  586. filterNodes(arr) {
  587. arr.length &&
  588. arr.forEach((item) => {
  589. item.Children.length && this.filterNodes(item.Children);
  590. if (!item.Children.length) {
  591. delete item.Children;
  592. }
  593. });
  594. },
  595. /* 获取指标数据 */
  596. getDataList() {
  597. dataBaseInterface.targetList({
  598. PageSize: 10,
  599. CurrentIndex: this.page_no,
  600. EdbInfoId: this.select_target,
  601. }).then(res => {
  602. if(res.Ret === 200) {
  603. if(res.Data) {
  604. res.Data.Item.ModifyTime = res.Data.Item.ModifyTime.substr(0,10);
  605. this.tableData = [res.Data.Item] || [];
  606. this.haveMore = this.page_no < res.Data.Paging.Pages ? true : false;
  607. //原指标有权限
  608. if(res.Data.Item.HaveOperaAuth) {
  609. this.dataList = this.page_no === 1 ? (res.Data.Item.DataList || []) : this.dataList.concat(res.Data.Item.DataList);
  610. }else {
  611. this.dataList = []
  612. }
  613. }else {
  614. this.tableData = [];
  615. this.dataList = [];
  616. }
  617. }
  618. })
  619. },
  620. /* 滚动加载 */
  621. scrollHandle(e) {
  622. const dom = e.target
  623. let scrollTop = dom.scrollTop; //滑入屏幕上方的高度
  624. let windowHeitht = dom.clientHeight; //页面的高度
  625. let scrollHeight = dom.scrollHeight; //整个div的高度
  626. let total = scrollTop + windowHeitht
  627. if(total >= scrollHeight && this.haveMore){
  628. this.page_no ++;
  629. this.getDataList();
  630. }
  631. },
  632. /* 选择指标 */
  633. chooseTarget(val) {
  634. if(val) {
  635. let obj = this.searchOptions.find(item => item.EdbInfoId === val);
  636. if(obj.Frequency !== '月度' && this.type === 5) {
  637. this.select_target = '';
  638. this.$message.warning(/* '只能选择月度指标' */this.$t('ETableChildren.only_select_msg'))
  639. return;
  640. }
  641. //频度 名称默认同步
  642. this.setDefaultOption(obj);
  643. this.page_no = 1;
  644. this.dataList.length ? this.$refs.dataUl.scrollTop = 0 : null;
  645. this.getDataList()
  646. }else {
  647. this.tableData = [];
  648. this.dataList = [];
  649. }
  650. },
  651. /* 删除已选指标 */
  652. delTarget() {
  653. this.tableData = [];
  654. this.dataList = [];
  655. this.select_target = '';
  656. this.page_no = 1;
  657. },
  658. /* 过滤负数 小数点*/
  659. filterCode(item) {
  660. item.moveVal=item.moveVal.replace(/[^\.\d]/g,'').replace('.','');
  661. },
  662. init() {
  663. this.page_no = 1;
  664. this.select_target = '';
  665. this.searchOptions = [];
  666. this.tableData = [];
  667. this.dataList = [];
  668. this.formData = {
  669. targetName:'',
  670. unit:'',
  671. menu:'',
  672. frequency:'',
  673. n_num: 1,
  674. moveType: 1,
  675. moveUnit: '天',
  676. moveVal: '',
  677. calendar_type: '公历',
  678. value_type: '期末值',
  679. new_value:'',
  680. emptyType:0,
  681. };
  682. this.$refs.form.resetFields();
  683. },
  684. /* 保存 */
  685. async saveHandle() {
  686. if(!this.select_target) this.$message.warning('指标不能为空')
  687. console.log(this.formData)
  688. await this.$refs.form.validate();
  689. this.loading = true;
  690. const valueMap = {
  691. 22: 'moveVal',
  692. 51: 'value_type'
  693. }
  694. let params ={
  695. Source: this.type,
  696. EdbName: this.formData.targetName,
  697. Unit: this.formData.unit,
  698. ClassifyId: Array.isArray(this.formData.menu)?this.formData.menu[this.formData.menu.length - 1]:this.formData.menu,
  699. Frequency: this.formData.frequency,
  700. Formula: valueMap[this.type] ? String(this.formData[valueMap[this.type]]) : String(this.formData.n_num),
  701. FromEdbInfoId: this.select_target,
  702. MoveFrequency: this.formData.moveUnit,
  703. MoveType: this.formData.moveType,
  704. Calendar: this.formData.calendar_type,
  705. Extra:JSON.stringify({
  706. LastValType:this.formData.new_value==='均值填充'?1:0
  707. }),
  708. EmptyType:this.formData.emptyType
  709. }
  710. const res = this.operationForm.edb_id
  711. ? await dataBaseInterface.calculateTargetEdit({ ...params,EdbInfoId: this.operationForm.edb_id })
  712. : await dataBaseInterface.calculateTargetSave(params)
  713. this.loading = false;
  714. if (res.Ret !== 200) return
  715. this.$message.success(res.Msg);
  716. this.operationForm.edb_id
  717. ? this.$emit('addCallBack','edit')
  718. : this.$emit('addCallBack','add',{ code:res.Data.UniqueCode,id:res.Data.EdbInfoId,classifyId:params.ClassifyId });
  719. this.init();
  720. },
  721. /* 关闭弹窗 */
  722. cancelHandle(type) {
  723. this.init()
  724. this.$emit('cancel');
  725. type==='cancel' && !this.operationForm.edb_id && this.$emit('openPrev');
  726. },
  727. // N数值变化,名称也变化
  728. NchangeHandle() {
  729. if(!this.select_target) return;
  730. let obj = this.searchOptions.find(item => item.EdbInfoId === this.select_target);
  731. let edbName = this.$parent.currentLang==='en'?obj.EdbNameEn:obj.EdbName;
  732. const tMap=new Map([
  733. ['日度','D'],
  734. ['周度','W'],
  735. ['旬度','T'],
  736. ['月度','M'],
  737. ['季度','Q'],
  738. ['年度','Y'],
  739. ])
  740. const name_map = {
  741. 8: `${edbName}/${this.formData.n_num}${tMap.get(obj.Frequency)}MA`,
  742. 12: `${edbName}${this.formData.n_num}${obj.Frequency.slice(0,1)}环比`,
  743. 13: `${edbName}${this.formData.n_num}${obj.Frequency.slice(0,1)}环差`,
  744. 35: `${edbName}超季节性/${this.formData.n_num}年${this.formData.calendar_type==='公历'?'':'/'+this.formData.calendar_type}`
  745. }
  746. this.formData.targetName = name_map[this.type] || '';
  747. },
  748. // 频度变化 修改指标名
  749. handleFrequencyChange(){
  750. if(!this.select_target||this.operationForm.edb_id) return;
  751. let obj = this.searchOptions.find(item => item.EdbInfoId === this.select_target);
  752. let edbName = this.$parent.currentLang==='en'?obj.EdbNameEn:obj.EdbName;
  753. const name_map = {
  754. 51: `${edbName}/${this.formData.frequency.substr(0,1)}频`,
  755. 62: `${edbName}累计值/${this.formData.frequency}`,
  756. }
  757. this.formData.targetName=name_map[this.type] || ''
  758. },
  759. // 时间位移-移动方式修改 修改指标名
  760. refreshTarget(){
  761. if(this.type==22){
  762. if(!this.select_target||this.operationForm.edb_id) return;
  763. let obj = this.searchOptions.find(item => item.EdbInfoId === this.select_target);
  764. let edbName = this.$parent.currentLang==='en'?obj.EdbNameEn:obj.EdbName;
  765. this.formData.targetName=`${edbName}${this.moveTypeOpions.filter(item=>item.key===this.formData.moveType)[0].label}${this.formData.moveVal}${this.formData.moveUnit}`
  766. }
  767. },
  768. /* 单位默认同步基础指标
  769. 同比 同差 频度同步 单位无
  770. 转月 平均值 频度单位同步
  771. 同比 同差值:默认名称为指标名称+同比/同差
  772. n数值环比/环差值计算:默认名称为指标名称+N+频度+环比/环差
  773. 转月 平均计算 变频默认指标名称同步
  774. 2023/2/6
  775. N数值移动平均计算:原指标名称/N*MA
  776. 变频:原指标名称/频度+变频
  777. */
  778. setDefaultOption(obj) {
  779. const tMap=new Map([
  780. ['日度','D'],
  781. ['周度','W'],
  782. ['旬度','T'],
  783. ['月度','M'],
  784. ['季度','Q'],
  785. ['年度','Y'],
  786. ])
  787. let edbName = this.$parent.currentLang==='en'?obj.EdbNameEn:obj.EdbName;
  788. let unit = this.$parent.currentLang ==='en'?obj.UnitEn:obj.Unit;
  789. const name_map = {
  790. 5: `${edbName}转月值`,
  791. 8: `${edbName}/${this.formData.n_num}${tMap.get(obj.Frequency)}MA`,
  792. 14: `${edbName}/日频`,
  793. 6: `${edbName}同比`,
  794. 7: `${edbName}同差`,
  795. 12: `${edbName}${this.formData.n_num}${obj.Frequency.slice(0,1)}环比`,
  796. 13: `${edbName}${this.formData.n_num}${obj.Frequency.slice(0,1)}环差`,
  797. 35: `${edbName}超季节性/${this.formData.n_num}年${this.formData.calendar_type==='公历'?'':'/'+this.formData.calendar_type}`,
  798. 52: `${edbName}年化值`,
  799. 51: `${edbName}/${obj.Frequency.substr(0,1)}频`,
  800. 61: `${edbName}转季值`,
  801. 62: `${edbName}累计值/${obj.Frequency}`,
  802. 63: `${edbName}年初至今累计值`,
  803. 75: `${edbName}日均值`,
  804. 22: `${edbName}${this.moveTypeOpions.find(item=>item.key===this.formData.moveType)&&this.moveTypeOpions.find(item=>item.key===this.formData.moveType).label}${this.formData.moveVal}${this.formData.moveUnit}`
  805. }
  806. let frequerncyMap = {
  807. 14: '日度',
  808. 61: '季度',
  809. 62: ''
  810. }
  811. this.formData = {
  812. targetName: name_map[this.type] || '',
  813. frequency: frequerncyMap[this.type] || obj.Frequency,
  814. unit: [5,8,14,7,35,75].includes(this.type) ? unit : '无',
  815. menu: obj.ClassifyId || '',
  816. n_num: 1,
  817. moveType: 1,
  818. moveUnit: '天',
  819. moveVal: '',
  820. calendar_type: this.formData.calendar_type,
  821. value_type: this.formData.value_type,
  822. new_value:'',
  823. emptyType:0
  824. }
  825. },
  826. handleSelectBtnClick(){
  827. //计算指标打开弹窗,基础指标打开新页面
  828. if(this.tableData[0].EdbType===2){
  829. this.$emit('lookHistory',this.select_target)
  830. }else{
  831. const {ClassifyId,UniqueCode,EdbInfoId} = this.tableData[0]
  832. let {href} = this.$router.resolve({path:`/database`,query:{code:UniqueCode,id:EdbInfoId,classifyId:ClassifyId}});
  833. window.open(href,'_blank');
  834. }
  835. },
  836. },
  837. created() {},
  838. mounted() {},
  839. }
  840. </script>
  841. <style lang='scss'>
  842. .operation-dialog {
  843. max-width: 1200px !important;
  844. position: relative;
  845. div::-webkit-scrollbar {
  846. width: 6px !important;
  847. }
  848. .el-input-number .el-input__inner {
  849. padding: 0 34px 0 4px;
  850. }
  851. .el-dialog__body {
  852. max-height: 780px;
  853. overflow: auto;
  854. }
  855. .dialog-main {
  856. .el-cascader .el-input {
  857. width: 340px;
  858. }
  859. .label-cont {
  860. display: flex;
  861. align-items: center;
  862. margin-bottom: 15px;
  863. li {
  864. cursor: pointer;
  865. font-size: 16px;
  866. margin-right: 24px;
  867. &:hover {
  868. color: #409EFF;
  869. }
  870. &.act {
  871. color: #409EFF;
  872. }
  873. }
  874. }
  875. .min-top {
  876. padding: 20px 30px;
  877. border: 1px solid #ECECEC;
  878. box-shadow: 0px 3px 6px rgba(0, 0, 0, 0.05);
  879. border-radius:4px;
  880. }
  881. .middle {
  882. margin-top: 20px;
  883. .data-ul {
  884. margin-top: 5px;
  885. border-bottom: 1px solid #dcdfe6;
  886. max-height: 140px;
  887. overflow-y: auto;
  888. .value-item {
  889. /* width: 100%; */
  890. padding: 14px 0;
  891. border: 1px solid #dcdfe6;
  892. border-bottom: none;
  893. display: flex;
  894. justify-content: space-around;
  895. .value-label {
  896. position: relative;
  897. color: #666;
  898. }
  899. .new-tag {
  900. width: 6px;
  901. height: 6px;
  902. display: inline-block;
  903. position: absolute;
  904. left: -12px;
  905. top: 50%;
  906. transform: translateY(-50%);
  907. border-radius: 50%;
  908. background: #f00;
  909. }
  910. }
  911. }
  912. .form-cont {
  913. padding-top: 30px;
  914. margin-top: 30px;
  915. border-top: 1px dashed #AAB4CC;
  916. input::-webkit-outer-spin-button,
  917. input::-webkit-inner-spin-button {
  918. -webkit-appearance: none;
  919. }
  920. input[type="number"]{
  921. -moz-appearance: textfield;
  922. }
  923. }
  924. }
  925. }
  926. .dia-bot {
  927. padding: 20px 0 30px;
  928. display: flex;
  929. justify-content: center;
  930. }
  931. .tip-cont {
  932. padding: 30px;
  933. }
  934. .tip-label {
  935. position: absolute;
  936. bottom: 30px;
  937. right: 30px;
  938. color: #409EFF;
  939. cursor: pointer;
  940. }
  941. }
  942. </style>