chartDetailDia.vue 55 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653
  1. <template>
  2. <div>
  3. <el-dialog
  4. :visible.sync="isOpenDetail"
  5. :close-on-click-modal="false"
  6. :modal-append-to-body="false"
  7. :append-to-body="false"
  8. @close="close"
  9. custom-class="chart-detail-container"
  10. top="4vh"
  11. center
  12. width="80%"
  13. v-dialogDrag
  14. >
  15. <div slot="title" style="display: flex; align-items: center;padding-right: 40px;">
  16. <span style="font-size: 16px;cursor:pointer" class="my-chart-title" @dblclick.stop="copyTitleText"
  17. :data-clipboard-text="chartInfo.ChartName">{{
  18. isNoChart ? '暂无' : (currentLang==='en'?chartInfo.ChartNameEn||chartInfo.ChartName : chartInfo.ChartName)
  19. }}</span>
  20. </div>
  21. <div class="nodata" v-if="isNoChart">
  22. <tableNoData text="暂无图表"/>
  23. </div>
  24. <template v-else>
  25. <div class="header">
  26. <div class="top-left">
  27. <!-- 默认曲线图 -->
  28. <template v-if="sameOptionType.includes(chartInfo.ChartType) && chartInfo.Source===1">
  29. <el-button
  30. type="primary"
  31. v-for="item in yearSelector"
  32. :key="item.value"
  33. size="medium"
  34. :plain="item.value !== year_select"
  35. class="year-btn"
  36. @click.native="changeYear(item)"
  37. >{{ item.name }}</el-button
  38. >
  39. <el-button type="text" class="btn-sty" @click="openDateDia">{{
  40. dateTip
  41. }}</el-button>
  42. </template>
  43. <!-- 季节性图选择年份区间 -->
  44. <!-- <date-picker
  45. v-else-if="chartInfo.ChartType === 2"
  46. v-model="season_year"
  47. type="month"
  48. value-type="format"
  49. range
  50. placeholder="年份日期选择"
  51. @change="seasonYearChange"
  52. /> -->
  53. <div v-else-if="chartInfo.ChartType === 2" @click="openDateDia" class="date-setting">
  54. {{ season_year && season_year.length>0 ? season_year[0]+'~'+season_year[1]:"年份日期选择" }}
  55. </div>
  56. </div>
  57. <div class="top-right" v-if="chartInfo.Button">
  58. <span v-permission="permissionBtn.myETAPermission.myChart_move"
  59. class="collected" @click="removeMychart(chartInfo)" v-if="classifyUserId === roleId">
  60. <i class="el-icon-remove-outline"></i>移出
  61. </span>
  62. <el-popover
  63. v-permission="permissionBtn.myETAPermission.myChart_share"
  64. v-if="!chartInfo.Disabled"
  65. placement="top"
  66. width="200"
  67. trigger="manual"
  68. v-model="showPopConfirmMap['url']">
  69. <p>{{hintText}}</p>
  70. <div style="text-align: right; margin: 0">
  71. <el-button size="mini" type="text" @click="closePop('url')">取消</el-button>
  72. <el-button type="primary" size="mini" @click="copyChart('url')">确定</el-button>
  73. </div>
  74. <span class="span-item shareLink" style="margin-left: 7px;" slot="reference"
  75. @click="copyChartConfirm('url')" :data-clipboard-text="linkUrl" v-if="!chartInfo.Disabled">
  76. <i class="el-icon-share"/>&nbsp;分享
  77. </span>
  78. </el-popover>
  79. <span v-permission="permissionBtn.myETAPermission.myChart_copyTo"
  80. class="span-item" @click="$parent.moveMychart(chartInfo.ChartInfoId)" v-if="classifyUserId === roleId">
  81. <img
  82. :src="$icons.chart_move_ico"
  83. alt=""
  84. style="
  85. width: 12px;
  86. height: 12px;
  87. margin-left: 7px;
  88. vertical-align: middle;
  89. "
  90. />
  91. 复制到
  92. </span>
  93. <span v-permission="permissionBtn.myETAPermission.myChart_refresh"
  94. class="span-item" @click="refreshHandle" style="margin-left: 7px;">
  95. <span><i class="el-icon-refresh" style="font-size: 15px;"/>&nbsp;刷新 </span>
  96. </span>
  97. <span
  98. class="span-item"
  99. style="margin-left: 7px"
  100. @click="$parent.addMychartHandle(chartInfo)"
  101. v-if="['/database'].includes($route.path)"
  102. >
  103. <img
  104. :src="$icons.chart_join_ico"
  105. alt=""
  106. style="width: 13px; height: 12px; vertical-align: middle"
  107. />
  108. 加入我的图库
  109. </span>
  110. <span
  111. v-permission="permissionBtn.myETAPermission.myChart_edit"
  112. class="span-item"
  113. style="margin-left: 7px"
  114. v-if="chartInfo.Button.IsEdit"
  115. @click="editChartHandle"
  116. >
  117. <span> <i class="el-icon-edit" />&nbsp;编辑 </span>
  118. </span>
  119. <span
  120. v-permission="permissionBtn.myETAPermission.myChart_save"
  121. class="span-item"
  122. style="margin-left: 7px"
  123. @click="saveChartMapHandle"
  124. v-if="![3,4,6,7,8,9].includes(chartInfo.Source)"
  125. >
  126. <span> <i class="el-icon-collection" />&nbsp;保存 </span>
  127. </span>
  128. <span
  129. v-permission="permissionBtn.myETAPermission.myChart_otherSave"
  130. class="span-item"
  131. style="margin-left: 7px"
  132. v-if="chartInfo.Button.IsCopy"
  133. @click="saveChartOtherHandle"
  134. >
  135. <span> <i class="el-icon-document-add" />&nbsp;另存为 </span>
  136. </span>
  137. <el-popover
  138. v-permission="permissionBtn.myETAPermission.myChart_copyOffice"
  139. v-if="!chartInfo.Disabled"
  140. placement="top"
  141. width="200"
  142. trigger="manual"
  143. v-click-outside="resetShowPopConfirmMap"
  144. v-model="showPopConfirmMap['office']">
  145. <p>{{hintText}}</p>
  146. <div style="text-align: right; margin: 0">
  147. <el-button size="mini" type="text" @click="closePop('office')">取消</el-button>
  148. <el-button type="primary" size="mini" @click="copyChart('office')">确定</el-button>
  149. </div>
  150. <span
  151. slot="reference"
  152. class="span-item copy"
  153. style="margin-left: 7px"
  154. @click="copyChartConfirm('office')"
  155. v-if="!chartInfo.Disabled"
  156. >
  157. <i class="el-icon-document-copy" />&nbsp;复制至office
  158. </span>
  159. </el-popover>
  160. <el-popover
  161. v-permission="permissionBtn.myETAPermission.myChart_copyWechat"
  162. v-if="!chartInfo.Disabled"
  163. placement="top"
  164. width="200"
  165. trigger="manual"
  166. v-click-outside="resetShowPopConfirmMap"
  167. v-model="showPopConfirmMap['微信']">
  168. <p>{{hintText}}</p>
  169. <div style="text-align: right; margin: 0">
  170. <el-button size="mini" type="text" @click="closePop('微信')">取消</el-button>
  171. <el-button type="primary" size="mini" @click="copyChart('微信')">确定</el-button>
  172. </div>
  173. <span
  174. slot="reference"
  175. class="span-item copy"
  176. style="margin: 0 7px"
  177. @click="copyChartConfirm('微信')"
  178. v-if="!chartInfo.Disabled"
  179. >
  180. <img style="width: 13px; height: 12px;vertical-align: middle" src="~@/assets/img/chart_m/WeChat.jpg" />&nbsp;复制至微信
  181. </span>
  182. </el-popover>
  183. <span
  184. v-permission="permissionBtn.myETAPermission.myChart_enNameSetting"
  185. class="span-item"
  186. style="margin-left: 7px"
  187. @click="openEnNameDia"
  188. >
  189. <span> <img style="width: 16px;vertical-align: middle" :src="$icons.to_en" />&nbsp;设置英文名称 </span>
  190. </span>
  191. <el-popconfirm
  192. v-permission="permissionBtn.myETAPermission.myChart_del"
  193. title="删除后该图表将不能再引用,确认删除吗?"
  194. icon="el-icon-info"
  195. @onConfirm="delChartHandle"
  196. v-if="chartInfo.Button.IsEdit"
  197. >
  198. <span
  199. slot="reference"
  200. class="span-item"
  201. style="color: #ff4040"
  202. >
  203. <i class="el-icon-delete" style="color: #ff4040" />&nbsp;删除
  204. </span>
  205. </el-popconfirm>
  206. </div>
  207. </div>
  208. <div class="cont-bottom" v-loading="refreshLoading">
  209. <div class="chartEn-mark" v-show="chartInfo.IsEnChart" style="top: unset;left:unset;">En</div>
  210. <div class="chart-show-cont">
  211. <div class="chartWrapper" id="chartWrapper">
  212. <template v-if="!chartInfo.WarnMsg">
  213. <Chart :options="options" ref="chartRef"/>
  214. <!-- 上下限 -->
  215. <div class="range-cont left" v-if="leftIndex != -1">
  216. <el-input
  217. style="width: 60px; display: block"
  218. size="mini"
  219. type="number"
  220. placeholder="上限"
  221. :disabled="!isAllowEditLimit"
  222. v-model="tableData[leftIndex].MaxData"
  223. />
  224. <el-input
  225. class="min-data-input"
  226. size="mini"
  227. type="number"
  228. placeholder="下限"
  229. :disabled="!isAllowEditLimit"
  230. v-model="tableData[leftIndex].MinData"
  231. />
  232. </div>
  233. <div class="range-cont right" v-if="rightIndex != -1">
  234. <el-input
  235. style="width: 60px; display: block"
  236. size="mini"
  237. type="number"
  238. placeholder="上限"
  239. :disabled="!isAllowEditLimit"
  240. v-model="tableData[rightIndex].MaxData"
  241. />
  242. <el-input
  243. class="min-data-input"
  244. size="mini"
  245. type="number"
  246. placeholder="下限"
  247. :disabled="!isAllowEditLimit"
  248. v-model="tableData[rightIndex].MinData"
  249. />
  250. </div>
  251. <!-- 右2上下限设置 -->
  252. <div class="range-cont rightTwo" v-if="rightTwoIndex != -1">
  253. <el-input
  254. style="width: 60px; display: block"
  255. size="mini"
  256. type="number"
  257. placeholder="上限"
  258. :disabled="!isAllowEditLimit"
  259. v-model="tableData[rightTwoIndex].MaxData"
  260. />
  261. <el-input
  262. class="min-data-input"
  263. size="mini"
  264. type="number"
  265. placeholder="下限"
  266. :disabled="!isAllowEditLimit"
  267. v-model="tableData[rightTwoIndex].MinData"
  268. />
  269. </div>
  270. <!-- 后续新图专用上下限 和其他数据依赖不公用 柱形图 截面散点-->
  271. <template v-if="[7,10].includes(chartInfo.ChartType)">
  272. <div class="range-cont left">
  273. <el-input
  274. style="width: 60px; display: block"
  275. size="mini"
  276. type="number"
  277. placeholder="上限"
  278. :disabled="!isAllowEditLimit"
  279. v-model="chartLimit.max"
  280. @change="changeLimit"
  281. />
  282. <el-input
  283. class="min-data-input"
  284. size="mini"
  285. type="number"
  286. placeholder="下限"
  287. :disabled="!isAllowEditLimit"
  288. v-model="chartLimit.min"
  289. @change="changeLimit"
  290. />
  291. </div>
  292. <!-- x轴上下限 -->
  293. <div class="range-cont bottom" v-if="chartLimit.x_min||chartLimit.x_max">
  294. <el-input
  295. class="left"
  296. size="mini"
  297. type="number"
  298. placeholder="下限"
  299. :disabled="!isAllowEditLimit"
  300. v-model="chartLimit.x_min"
  301. @change="changeLimit"
  302. />
  303. <el-input
  304. class="left"
  305. size="mini"
  306. type="number"
  307. placeholder="上限"
  308. :disabled="!isAllowEditLimit"
  309. v-model="chartLimit.x_max"
  310. @change="changeLimit"
  311. />
  312. </div>
  313. </template>
  314. </template>
  315. <!-- 异常显示 -->
  316. <p class="error-tip" v-if="chartInfo.WarnMsg">{{chartInfo.WarnMsg}}</p>
  317. <!-- 左右切换按钮 -->
  318. <template v-if="allChart.length > 1">
  319. <img :src="$icons.chart_left_arrow" alt="" class="arrow left" @click="switchChart('prev')">
  320. <img :src="$icons.chart_right_arrow" alt="" class="arrow right" @click="switchChart('next')">
  321. </template>
  322. </div>
  323. <!-- 公历农历切换 只用于季节性图 -->
  324. <el-radio-group
  325. v-if="chartInfo.ChartType === 2 && !chartInfo.WarnMsg"
  326. v-model="calendar_type"
  327. class="calendar-cont"
  328. @change="getPreviewChartInfo"
  329. >
  330. <el-radio-button label="公历" />
  331. <el-radio-button label="农历" />
  332. </el-radio-group>
  333. </div>
  334. <el-table
  335. :data="tableData"
  336. ref="tableRef"
  337. @row-click="rowClickHandle"
  338. @expand-change="expandChangeHandle"
  339. :row-key="getRowKey"
  340. :expand-row-keys="expandKey"
  341. highlight-current-row
  342. border
  343. >
  344. <!-- 可配置展开 只用于默认图 季节性隐藏-->
  345. <el-table-column type="expand" v-if="sameOptionType.includes(chartInfo.ChartType) && chartInfo.ChartType!==5 && chartInfo.Source===1">
  346. <template slot-scope="props">
  347. <div class="options-cont">
  348. <!-- 堆叠图 或组合图中的堆叠类型 非第一项隐藏配置 -->
  349. <template v-if="showYOptionsHandle(props.row,props.$index)">
  350. <el-checkbox v-model="props.row.IsOrder">逆序</el-checkbox>
  351. <el-radio-group v-model="props.row.IsAxis" size="mini">
  352. <el-radio-button :label="1">左轴</el-radio-button>
  353. <el-radio-button :label="0">右轴</el-radio-button>
  354. <!-- 指标有右轴时才可以选右2轴 不然没有右2这个概念的意义 -->
  355. <el-radio-button
  356. v-if="[1,6].includes(chartInfo.ChartType)"
  357. :label="2"
  358. :disabled="(tableData.findIndex(_ => _.IsAxis===0) === -1)
  359. || (tableData.findIndex(_ => _.IsAxis===0) === props.$index
  360. && tableData.filter(_ => _.IsAxis===0).length === 1)"
  361. >右2轴</el-radio-button>
  362. </el-radio-group>
  363. </template>
  364. <div style="min-width: 250px">
  365. <el-radio
  366. v-model="props.row.EdbInfoType"
  367. :label="1"
  368. @change="getPreviewChartInfo"
  369. >标准指标</el-radio
  370. >
  371. <div style="margin-top: 22px">
  372. <el-radio
  373. v-model="props.row.EdbInfoType"
  374. :label="0"
  375. style="margin-right: 10px"
  376. @change="getPreviewChartInfo"
  377. >领先指标</el-radio
  378. >
  379. <template v-if="props.row.EdbInfoType === 0">
  380. 领先
  381. <el-input
  382. style="width: 60px"
  383. size="mini"
  384. type="number"
  385. min="0"
  386. v-model="props.row.LeadValue"
  387. @change="getPreviewChartInfo"
  388. @keyup.native="filterCode(props.row)"
  389. ></el-input>
  390. <el-select
  391. v-model="props.row.LeadUnit"
  392. placeholder=""
  393. style="width: 60px"
  394. size="mini"
  395. @change="getPreviewChartInfo"
  396. >
  397. <el-option
  398. v-for="item in fre_options"
  399. :key="item"
  400. :label="item"
  401. :value="item"
  402. >
  403. </el-option>
  404. </el-select>
  405. </template>
  406. </div>
  407. </div>
  408. <div>
  409. <div style="display: flex">
  410. <span style="margin-right: 3px">线条颜色:</span>
  411. <el-color-picker
  412. v-model="props.row.ChartColor"
  413. size="mini"
  414. show-alpha
  415. :predefine="predefineColors"
  416. ></el-color-picker>
  417. </div>
  418. <div
  419. style="margin-top: 12px"
  420. v-if="chartInfo.ChartType === 1
  421. || (chartInfo.ChartType === 6 && props.row.ChartStyle==='spline')"
  422. >
  423. 线条粗细:
  424. <el-input
  425. style="width: 60px"
  426. size="mini"
  427. type="number"
  428. :min="1"
  429. v-model="props.row.ChartWidth"
  430. />
  431. </div>
  432. </div>
  433. <div v-if="chartInfo.ChartType === 6">
  434. <span style="margin-right: 3px">生成样式:</span>
  435. <el-select
  436. v-model="props.row.ChartStyle"
  437. placeholder="请选择生成样式"
  438. style="width: 50%"
  439. class="edb-item-style"
  440. >
  441. <el-option
  442. v-for="item in chartItemStyleArr"
  443. :key="item.key"
  444. :label="item.label"
  445. :value="item.value"
  446. >
  447. </el-option>
  448. </el-select>
  449. </div>
  450. <div class="copy-excel">
  451. <span class="editsty" @click="copyCode(props.row)" v-if="isAllowCopyData">
  452. <i class="el-icon-document-copy" />&nbsp;复制数据</span
  453. >
  454. <span
  455. class="editsty" v-if="isAllowCheckData"
  456. @click="viewTarget(props.row)"
  457. style="display:block;margin-top:15px;"
  458. >&nbsp;查看数据</span>
  459. </div>
  460. </div>
  461. </template>
  462. </el-table-column>
  463. <el-table-column
  464. v-for="item in tableColums"
  465. :key="item.label"
  466. :label="item.label"
  467. :width="item.widthsty"
  468. :min-width="item.minwidthsty"
  469. align="center"
  470. >
  471. <template slot-scope="scope">
  472. <span v-if="item.key==='SourceName'">
  473. {{scope.row[item.key]}}
  474. <i
  475. class="el-icon-tickets"
  476. style="color:#409EFF;font-size:18px"
  477. @click="isLookHistory=true;lookEdbId=scope.row.EdbInfoId"
  478. v-if="scope.row.EdbType===2"
  479. />
  480. </span>
  481. <span v-else>{{ currentLang==='en' ? (scope.row[item.enKey]||scope.row[item.key]) : scope.row[item.key] }}</span>
  482. </template>
  483. </el-table-column>
  484. <el-table-column
  485. label="操作"
  486. key="Copy"
  487. align="center"
  488. v-if="[2,5,7].includes(chartInfo.ChartType)"
  489. width="110"
  490. >
  491. <template slot-scope="scope">
  492. <span class="editsty" @click="copyCode(scope.row)" v-if="isAllowCopyData">
  493. <i class="el-icon-document-copy" />&nbsp;复制数据</span
  494. >
  495. <span v-if="isAllowCheckData"
  496. class="editsty"
  497. @click="viewTarget(scope.row)"
  498. >查看数据</span>
  499. </template>
  500. </el-table-column>
  501. <div slot="empty">
  502. <tableNoData text="暂无指标" size="mini"/>
  503. </div>
  504. </el-table>
  505. </div>
  506. </template>
  507. <img :src="drawImg" alt="" class="drawImg" />
  508. </el-dialog>
  509. <!-- 自定义时间段选择弹窗 -->
  510. <DateChooseDia
  511. :isDateDia="isDateDia"
  512. :dateForm="dateForm"
  513. @cancel="isDateDia = false"
  514. @dateBack="dataChangeBack"
  515. />
  516. <!-- 图表另存 -->
  517. <SaveChartOther
  518. :show.sync="isShowSaveOther"
  519. :data="chartInfo"
  520. :source="chartInfo.Source"
  521. />
  522. <!-- 输入英文指标弹窗 -->
  523. <set-en-name-dia
  524. :isOpenDialog="setEnName"
  525. @cancel="setEnName=false"
  526. @updateEnName="updateEnName"
  527. :formData="formItemArray"
  528. :chartType="chartInfo.ChartType"
  529. :datainfo="chartInfo.ChartType===10?JSON.parse(chartInfo.ExtraConfig):null"
  530. :edblist="chartInfo.ChartType===10?tableData:[]"
  531. />
  532. <!-- 指标历史记录 -->
  533. <edbHistoryDialog
  534. :isOpenDialog.sync="isLookHistory"
  535. :edbId="lookEdbId"
  536. />
  537. </div>
  538. </template>
  539. <script>
  540. import { dataBaseInterface,mychartInterface } from '@/api/api.js';
  541. import futuresInterface from '@/api/modules/futuresBaseApi';
  542. import chartRelevanceApi from '@/api/modules/chartRelevanceApi';
  543. import { fittingEquationInterface,statisticFeatureInterface } from '@/api/modules/chartRelevanceApi';
  544. import {
  545. seasonOptions,
  546. copyOtherOptions
  547. } from '@/utils/defaultOptions';
  548. import Chart from '@/views/dataEntry_manage/components/chart';
  549. import SaveChartOther from '@/views/dataEntry_manage/components/SaveChartOther';
  550. import DateChooseDia from '@/views/dataEntry_manage/components/DateChooseDia';
  551. import changeLang from "@/views/dataEntry_manage/components/changeLang"
  552. import setEnNameDia from "@/views/dataEntry_manage/components/setEnNameDia"
  553. import { chartSetMixin } from '@/views/dataEntry_manage/mixins/chartPublic'
  554. export default {
  555. components: { Chart, DateChooseDia,SaveChartOther,changeLang,setEnNameDia },
  556. mixins: [ chartSetMixin ],
  557. directives: {
  558. 'click-outside':{
  559. bind(el, binding) {
  560. const clickHandle = (e)=>{
  561. //console.log(e.target.className)
  562. //如果弹窗没打开就没必要执行了
  563. if(!(this&&this.isOpenDetail)) return
  564. const isCurrentTarget = el.contains(e.target)||e.target.className==='el-popover el-popper'||['shareLink','copy'].some(str => e.target.className.includes(str))
  565. if(isCurrentTarget){
  566. return false
  567. }
  568. if(binding.value && typeof binding.value === 'function'){
  569. //console.log('binding')
  570. binding.value(e)
  571. }
  572. }
  573. el.__click__outside = clickHandle
  574. document.addEventListener('click',clickHandle)
  575. },
  576. unbind(el,binding,vnode){
  577. document.removeEventListener('click',el.__click__outside)
  578. }
  579. },
  580. },
  581. props: {
  582. isOpenDetail: {
  583. type: Boolean,
  584. },
  585. chart_code: {
  586. type: String,
  587. },
  588. allChart: {
  589. type: Array,
  590. },
  591. select_classify: {
  592. type: Number
  593. },
  594. classifyUserId: {
  595. type: Number
  596. }
  597. },
  598. computed: {
  599. role() {
  600. let role = localStorage.getItem('Role') || '';
  601. if (['rai_researcher', 'ficc_researcher', 'researcher','ficc_seller','rai_seller','seller'].includes(role)) {
  602. return 'researcher';
  603. } else if (['rai_admin', 'ficc_admin'].includes(role)) {
  604. return 'admin';
  605. } else {
  606. return role;
  607. }
  608. },
  609. /* 登录角色id */
  610. roleId() {
  611. let id = parseInt(localStorage.getItem('AdminId'));
  612. return id;
  613. },
  614. /* 分享地址 */
  615. linkUrl() {
  616. const LINK_CHART_URL = this.$setting.dynamicOutLinks.ChartViewUrl+'/chartshow';
  617. return `${LINK_CHART_URL}?code=${this.chartInfo.UniqueCode}&fromType=share?&lang=${this.currentLang}`
  618. },
  619. //是否允许编辑上下限
  620. isAllowEditLimit(){
  621. return this.permissionBtn.isShowBtn('myETAPermission','myChart_editLimit')
  622. },
  623. //是否允许复制数据
  624. isAllowCopyData(){
  625. return this.permissionBtn.isShowBtn('myETAPermission','myChart_copyData')
  626. },
  627. //是否允许查看数据
  628. isAllowCheckData(){
  629. return this.permissionBtn.isShowBtn('myETAPermission','myChart_checkData')
  630. }
  631. },
  632. watch: {
  633. isOpenDetail(newval) {
  634. this.isNoChart = false;
  635. this.currentLang=this.$parent.chart_lang;
  636. this.formItemArray=[]
  637. newval && this.getChartDetail();
  638. this.resetShowPopConfirmMap()
  639. },
  640. tableData: {
  641. handler(newval) {
  642. newval.length && !this.chartInfo.WarnMsg && this.chartInfo.Source===1&& this.setChartOptionHandle(newval);
  643. },
  644. deep: true,
  645. },
  646. },
  647. data() {
  648. return {
  649. isNoChart: false, //删完最后一张图展示缺省
  650. refreshLoading: false,//loading
  651. showChart: false,
  652. chartInfo: {},
  653. dateTip: '请选择时间段',
  654. season_year: [], //季节图时间段
  655. calendar_type: '', //公历农历选择项
  656. drawImg: '', //用于复制后的图标图片存储
  657. expandKey: [], //展开数组
  658. showPopConfirmMap:{
  659. '微信':false,
  660. 'office':false,
  661. 'url':false
  662. },
  663. hintText:'英文名称未输入完整,分享图表上可能出现空名称的情况,确定继续分享吗?',
  664. /* 查看历史弹窗 */
  665. isLookHistory: false,
  666. lookEdbId: 0
  667. };
  668. },
  669. methods: {
  670. // 配合修改英文信息 chartPublic.js ,防止没有getChartInfo()这个方法
  671. getChartInfo(){
  672. this.getChartDetail(this.chartInfo.UniqueCode)
  673. },
  674. /* 获取详情 */
  675. getChartDetail(code = '') {
  676. this.refreshLoading = true;
  677. dataBaseInterface
  678. .getChartByCode({
  679. UniqueCode: code || this.chart_code,
  680. })
  681. .then((res) => {
  682. this.refreshLoading = false;
  683. if (res.Ret !== 200) return;
  684. this.chartInfo = res.Data.ChartInfo;
  685. if(this.chartInfo.Source===1) {
  686. this.tableData = res.Data.EdbInfoList;
  687. //eta图
  688. this.setDefaultDateSelect(); //设置默认的日期选中
  689. this.chartInfo.ChartType === 7 && this.initBarData(res.Data);
  690. this.chartInfo.ChartType === 10 && this.initSectionScatterData(res.Data);
  691. }else if([2,5].includes(this.chartInfo.Source)) {
  692. this.tableData = [res.Data.EdbInfoList[0]];
  693. this.chartInfo = res.Data.ChartInfo.Source===5 ? {
  694. ...res.Data.ChartInfo,
  695. ProfitNameEn: res.Data.DataResp.ProfitNameEn,
  696. ProfitName: res.Data.DataResp.ProfitName,
  697. } : res.Data.ChartInfo;
  698. //商品价格图
  699. this.initCommodityData(res.Data);
  700. }else if([3].includes(this.chartInfo.Source)){//相关性 滚动相关性
  701. this.relevanceChartData={
  702. ChartInfo:res.Data.ChartInfo,
  703. EdbInfoList:res.Data.EdbInfoList,
  704. XEdbIdValue:res.Data.XEdbIdValue,
  705. CorrelationChartInfo:res.Data.CorrelationChartInfo,
  706. YDataList:[
  707. {
  708. Value: res.Data.YDataList[0].Value,
  709. Color:'#00f',
  710. Name:res.Data.ChartInfo.ChartName,
  711. NameEn:res.Data.ChartInfo.ChartNameEn
  712. }
  713. ]
  714. }
  715. this.initRelevanceChartData()
  716. this.tableData = res.Data.EdbInfoList
  717. }else if(this.chartInfo.Source===4) {//滚动相关性换成曲线图绘图
  718. this.tableData = res.Data.EdbInfoList
  719. this.relevanceChartData = {
  720. CorrelationChartInfo: res.Data.CorrelationChartInfo
  721. }
  722. this.setDefaultChart([res.Data.DataResp]);
  723. }else if([6,7,8].includes(this.chartInfo.Source)){//拟合方程 标准差 百分比
  724. this.tableData = res.Data.EdbInfoList;
  725. this.setDefaultChart([res.Data.DataResp]);
  726. }else if(this.chartInfo.Source===9) { //统计频率
  727. this.tableData = res.Data.EdbInfoList;
  728. this.statisticFrequencyData = res.Data.DataResp;
  729. this.setStatisticFrequency();
  730. }
  731. });
  732. },
  733. /* 设置默认时间选中项 */
  734. setDefaultDateSelect() {
  735. this.year_select = this.chartInfo.DateType;
  736. this.count_year = this.chartInfo.StartYear;
  737. this.select_date = [this.chartInfo.StartDate, this.chartInfo.EndDate];
  738. this.calendar_type = this.chartInfo.Calendar; //日历类型
  739. if(this.chartInfo.ChartType==2){
  740. if(this.year_select==20){
  741. let latestYear = parseInt(this.tableData[0].LatestDate.substring(0,4))
  742. this.season_year=[`${latestYear-this.count_year+1}-01-01`,`${latestYear}-12-31`]
  743. }else if(this.year_select==6){
  744. this.season_year = [this.chartInfo.SeasonStartDate,this.tableData[0].LatestDate];
  745. }else{
  746. this.season_year = [this.chartInfo.SeasonStartDate,this.chartInfo.SeasonEndDate]
  747. }
  748. }
  749. this.dateTip =
  750. this.chartInfo.DateType === 5
  751. ? `${this.chartInfo.StartDate}~${this.chartInfo.EndDate}`
  752. : this.chartInfo.DateType === 6
  753. ? `${this.chartInfo.StartDate}~至今`
  754. : this.chartInfo.DateType === 20
  755. ?`最近${this.chartInfo.StartYear}年`
  756. :'请选择时间段';
  757. },
  758. /* 曲线图筛选项发生变化时 非配置项 获取新的图表数据 */
  759. async getPreviewChartInfo() {
  760. let dateArray=this.chartInfo.ChartType==2?this.season_year:this.select_date
  761. let params = {
  762. ChartType: this.chartInfo.ChartType,
  763. DateType: this.year_select,
  764. StartDate: [5 , 6].includes(this.year_select)
  765. ? dateArray[0]
  766. : '',
  767. EndDate: this.year_select === 5 ? dateArray[1] : '',
  768. Calendar: this.calendar_type,
  769. //ETA1.0.5 去除了这两个入参
  770. // SeasonStartDate: this.season_year ? this.season_year[0] : '',
  771. // SeasonEndDate: this.season_year ? this.season_year[1] : '',
  772. SeasonExtraConfig:this.SeasonExtraConfig,
  773. StartYear:this.count_year || 0,
  774. ChartEdbInfoList: this.tableData.map(_ => ({
  775. EdbInfoId: _.EdbInfoId,
  776. EdbInfoType: _.EdbInfoType,
  777. LeadValue: _.EdbInfoType ? 0 : Number(_.LeadValue),
  778. LeadUnit: _.EdbInfoType ? '' : _.LeadUnit,
  779. }))
  780. }
  781. const res = await dataBaseInterface.getSplinePreviewData(params)
  782. if(res.Ret !== 200) return
  783. const { EdbInfoList } = res.Data;
  784. this.tableData.forEach((item) => {
  785. let edbData = EdbInfoList.find(_ => _.EdbInfoId===item.EdbInfoId);
  786. item.DataList = edbData.DataList;
  787. if(edbData.EdbInfoCategoryType===1) item.MoveLatestDate = edbData.MoveLatestDate;
  788. });
  789. },
  790. /* 打开时间段弹窗 */
  791. openDateDia() {
  792. // 自定义时间段回显
  793. let selectDateStart = this.chartInfo.ChartType === 2?this.season_year[0]:this.select_date[0]
  794. let selectDateEnd = this.chartInfo.ChartType === 2?this.season_year[1]:this.select_date[1]
  795. this.dateForm = {
  796. date_type: this.year_select,
  797. start_date:
  798. this.year_select === 5 || this.year_select === 6
  799. ? selectDateStart
  800. : '',
  801. end_date: this.year_select === 5 ? selectDateEnd : '',
  802. count_year: this.year_select === 20 ? this.count_year : ''
  803. };
  804. this.isDateDia = true;
  805. },
  806. /* 保存完自定义日期 刷新数据 保存当前的图表配置和上下限 只改变图表*/
  807. dataChangeBack(data) {
  808. this.year_select = data.dateType;
  809. this.isDateDia = false;
  810. this.select_date = [data.start_date, data.end_date];
  811. this.count_year = data.count_year
  812. this.dateTip =
  813. data.dateType === 5
  814. ? `${data.start_date}~${data.end_date}`
  815. : data.dateType === 6
  816. ?`${data.start_date}~至今`
  817. :`最近${this.count_year}年`
  818. if(this.chartInfo.ChartType === 2){
  819. let latestYear = parseInt(this.tableData[0].LatestDate.substring(0,4))
  820. let dateStart = data.start_date
  821. let dateEnd = data.end_date
  822. if(data.dateType==20){
  823. dateStart = `${latestYear-this.count_year+1}-01-01`
  824. dateEnd = `${latestYear}-12-31`
  825. }else if(data.dateType==6){
  826. dateEnd = this.tableData[0].LatestDate
  827. }
  828. this.season_year = [dateStart, dateEnd];
  829. }
  830. // this.saveNowOptions();
  831. this.getPreviewChartInfo();
  832. },
  833. /* 季节图切换年份 保持当前配置 */
  834. seasonYearChange() {
  835. // this.saveNowOptions();
  836. this.getPreviewChartInfo();
  837. },
  838. /* 年份改变 重新刷新图表接口 保存当前的图表配置和上下限 只改变图表 */
  839. changeYear(item) {
  840. this.year_select = item.value;
  841. this.select_date = '';
  842. this.dateTip = '请选择时间段';
  843. //保存表格配置和上下限 曲线图需要保存表格配置
  844. // this.saveNowOptions();
  845. this.getPreviewChartInfo();
  846. },
  847. /* 保存图表当前配置项 上下限 */
  848. saveNowOptions() {
  849. // const dataArr = _.cloneDeep(this.tableData);
  850. // dataArr.forEach((item) => {
  851. // item.MaxData = Number(item.MaxData);
  852. // item.MinData = Number(item.MinData);
  853. // delete item.DataList;
  854. // });
  855. // sessionStorage.setItem('myChartbeforeOptions', JSON.stringify(dataArr));
  856. },
  857. /* 一键刷新 超长等待..*/
  858. async refreshHandle() {
  859. // 清除缓存配置项
  860. this.refreshLoading = true;
  861. const { Source,ChartInfoId,UniqueCode } = this.chartInfo;
  862. let res=null
  863. if(Source===1){
  864. res= await dataBaseInterface.chartRefresh({ ChartInfoId })
  865. }else if([2,5].includes(Source)){
  866. res=await futuresInterface.refreshChart({ ChartInfoId })
  867. }else if([3,4].includes(Source)){
  868. res=await chartRelevanceApi.refreshChart({ ChartInfoId })
  869. }else if(Source===6){
  870. res=await fittingEquationInterface.refreshChart({ ChartInfoId })
  871. }else if([7,8,9].includes(Source)) {
  872. res=await statisticFeatureInterface.refreshChart({ ChartInfoId })
  873. }
  874. this.refreshLoading = false;
  875. if (res.Ret !== 200) return
  876. this.$message.success(res.Msg);
  877. Source === 1 ? this.getPreviewChartInfo() : this.getChartDetail(UniqueCode);
  878. },
  879. // 英文面板时候的判断
  880. copyChartConfirm(type){
  881. if(this.currentLang=='en'){
  882. // 是否所有数据都填写完
  883. let flag=true
  884. // 是否有英文表格名称
  885. if(!this.chartInfo.ChartNameEn) flag = false
  886. if(flag&&this.chartInfo.Source!=3){
  887. for (const data of this.tableData) {
  888. if(data.EdbNameEn=="" ||data.UnitEn==""){
  889. flag = false
  890. break
  891. }
  892. }
  893. }
  894. if(!flag){
  895. //用Popconfirm替代confirm confirm嵌套:append-to-body="false"的弹窗会有遮罩问题
  896. this.resetShowPopConfirmMap()
  897. this.$set(this.showPopConfirmMap,type,true)
  898. /* this.$confirm('英文名称未输入完整,分享图表上可能出现空名称的情况,确定继续分享吗?', '提示', {
  899. confirmButtonText: '确定',
  900. cancelButtonText: '取消',
  901. type: 'warning',
  902. })
  903. .then(() => {
  904. if(type==='url'){
  905. // this.shareUrl()
  906. const input = document.createElement('input')
  907. input.setAttribute('readonly','readonly')
  908. input.value = this.linkUrl
  909. document.body.appendChild(input)
  910. input.select();
  911. document.execCommand('copy');
  912. document.body.removeChild(input);
  913. this.$message.success('复制链接成功')
  914. }else{
  915. this.copyChartHandle(type)
  916. }
  917. $('body .v-modal').remove()
  918. $('#right > div > div:nth-child(4)').append('<div class="v-modal" tabindex="0"></div>')
  919. })
  920. .catch(() => {
  921. $('body .v-modal').remove()
  922. $('#right > div > div:nth-child(4)').append('<div class="v-modal" tabindex="0"></div>')
  923. }); */
  924. }else{
  925. this.$set(this.showPopConfirmMap,type,false)
  926. if(type=='url'){
  927. this.shareUrl()
  928. }else{
  929. this.copyChartHandle(type)
  930. }
  931. }
  932. }else{
  933. if(type=='url'){
  934. this.shareUrl()
  935. }else{
  936. this.copyChartHandle(type)
  937. }
  938. }
  939. },
  940. copyChart(type){
  941. console.log('复制的是:',type)
  942. if(type==='url'){
  943. const input = document.createElement('input')
  944. input.setAttribute('readonly','readonly')
  945. input.value = this.linkUrl
  946. document.body.appendChild(input)
  947. input.select();
  948. document.execCommand('copy');
  949. document.body.removeChild(input);
  950. this.$message.success('复制链接成功')
  951. }else{
  952. this.copyChartHandle(type)
  953. }
  954. this.closePop(type)
  955. },
  956. closePop(type){
  957. this.$set(this.showPopConfirmMap,type,false)
  958. },
  959. resetShowPopConfirmMap(){
  960. this.showPopConfirmMap={
  961. '微信':false,
  962. 'office':false,
  963. 'url':false
  964. }
  965. },
  966. /* 点击复制先用canvas画出 转成图片在放到粘贴板中 */
  967. copyChartHandle:_.debounce(function(type){
  968. let chartsName = this.currentLang=='ch'?this.chartInfo.ChartName:this.chartInfo.ChartNameEn
  969. let { heightNum, widthNum , newTitle , dynamic_copyOptions} = this.dynamicWidthAndHeight(type,this.chartInfo.ChartType,chartsName, this.chartInfo.Source === 1?this.tableData.length:this.commodityChartData.length)
  970. const chartType = this.sameOptionType.includes(this.chartInfo.ChartType) ? 'legend' : 'seasonLegend';
  971. // 英文转SVG设置变动
  972. if(this.currentLang == 'en'){
  973. // 散点图 如果横轴单位为'英文单位',表示客户没填,转成svg时置为空
  974. if(this.chartInfo.ChartType == 5){
  975. this.$refs.chartRef.chart.options.xAxis.forEach(it => {
  976. if(it.title.text == '英文单位') it.title.text=''
  977. });
  978. }
  979. // 如果竖轴坐标单位为'英文单位',表示客户没填,转成svg时置为空
  980. this.$refs.chartRef.chart.options.yAxis.forEach(it => {
  981. if(it.title.text == '英文单位') it.title.text=''
  982. });
  983. }
  984. let svgObj={
  985. chart:{
  986. width:widthNum,
  987. height:heightNum,
  988. backgroundColor:"rgba(255, 255, 255, 0)",
  989. },
  990. title: {
  991. text: newTitle,
  992. margin: 10,
  993. style: {
  994. fontSize: '18px'
  995. }
  996. },
  997. legend:{
  998. ...copyOtherOptions[chartType],
  999. ...dynamic_copyOptions[chartType]
  1000. },
  1001. }
  1002. let svg = this.$refs.chartRef.chart.getSVG(svgObj);
  1003. this.copyBlobItem(widthNum,heightNum,svg,type);
  1004. },500),
  1005. // 选择
  1006. getSelect(targetNode) {
  1007. if (window.getSelection) {
  1008. //chrome等主流浏览器
  1009. var selection = window.getSelection();
  1010. var range = document.createRange();
  1011. range.selectNode(targetNode);
  1012. selection.removeAllRanges();
  1013. selection.addRange(range);
  1014. } else if (document.body.createTextRange) {
  1015. //ie
  1016. var range = document.body.createTextRange();
  1017. range.moveToElementText(targetNode);
  1018. range.select();
  1019. }
  1020. },
  1021. /* 图表保存 分配 */
  1022. saveChartMapHandle() {
  1023. const sourceMap = {
  1024. 1: this.saveChartHandle,
  1025. 2: this.saveCommodityChart,
  1026. 5: this.saveCommodityChart,//利润曲线
  1027. }
  1028. sourceMap[this.chartInfo.Source]&&sourceMap[this.chartInfo.Source]();
  1029. },
  1030. /* 商品价格图保存 */
  1031. saveCommodityChart: _.debounce(async function() {
  1032. const { Ret } = await futuresInterface.chartSave({
  1033. ChartInfoId: this.chartInfo.ChartInfoId,
  1034. LeftMin: String(this.chartLimit.min),
  1035. LeftMax: String(this.chartLimit.max),
  1036. })
  1037. if(Ret!==200) return
  1038. this.$message.success('保存成功');
  1039. //关联图表和图片
  1040. this.setChartImage();
  1041. },300),
  1042. /* 保存当前图表配置 */
  1043. saveChartHandle: _.debounce(function () {
  1044. //遍历每条线的指标配置
  1045. let arr = this.tableData.map((item) => {
  1046. return {
  1047. ChartColor: item.ChartColor,
  1048. ChartStyle: item.ChartStyle,
  1049. ChartWidth: Number(item.ChartWidth),
  1050. EdbInfoId: item.EdbInfoId,
  1051. EdbInfoType: item.EdbInfoType,
  1052. IsAxis: item.IsAxis,
  1053. IsOrder: item.IsOrder,
  1054. LeadUnit: item.EdbInfoType ? '' : item.LeadUnit,
  1055. LeadValue: item.EdbInfoType ? 0 : Number(item.LeadValue),
  1056. MaxData: Number(item.MaxData),
  1057. MinData: Number(item.MinData),
  1058. };
  1059. });
  1060. let public_param = {
  1061. ChartInfoId: this.chartInfo.ChartInfoId || 0,
  1062. ChartEdbInfoList: arr,
  1063. }
  1064. let typeChartParam = {};
  1065. switch(this.chartInfo.ChartType) {
  1066. case 2:
  1067. typeChartParam = {
  1068. ...public_param,
  1069. Calendar: this.calendar_type,
  1070. DateType: this.year_select,
  1071. StartYear:this.count_year || 0,
  1072. StartDate: this.season_year ? this.season_year[0] : '',
  1073. EndDate: this.season_year ? this.season_year[1] : '',
  1074. }
  1075. break
  1076. case 7:
  1077. typeChartParam = {
  1078. ...public_param,
  1079. DateType: 6,
  1080. LeftMin: String(this.chartLimit.min),
  1081. LeftMax: String(this.chartLimit.max),
  1082. }
  1083. case 10:
  1084. typeChartParam = {
  1085. ...public_param,
  1086. DateType: 6,
  1087. Calendar: "公历",
  1088. ExtraConfig: JSON.stringify({
  1089. ...JSON.parse(this.chartInfo.ExtraConfig),
  1090. XMinValue: String(this.chartLimit.x_min),
  1091. XMaxValue: String(this.chartLimit.x_max),
  1092. YMinValue: String(this.chartLimit.min),
  1093. YMaxValue: String(this.chartLimit.max),
  1094. })
  1095. }
  1096. }
  1097. let params = this.sameOptionType.includes(this.chartInfo.ChartType)
  1098. ? {
  1099. ...public_param,
  1100. DateType: this.year_select,
  1101. StartYear:this.count_year || 0,
  1102. StartDate:
  1103. this.year_select === 5 || this.year_select === 6
  1104. ? this.select_date[0]
  1105. : '',
  1106. EndDate: this.year_select === 5 ? this.select_date[1] : '',
  1107. }
  1108. : typeChartParam;
  1109. dataBaseInterface.chartSave(params).then((res) => {
  1110. if (res.Ret === 200) {
  1111. this.$message.success('保存成功');
  1112. sessionStorage.removeItem('myChartbeforeOptions');
  1113. //关联图表和图片
  1114. this.setChartImage();
  1115. }
  1116. });
  1117. }, 500),
  1118. /* 删除图表 */
  1119. delChartHandle() {
  1120. this.delHandle(this.chartInfo.ChartInfoId);
  1121. },
  1122. /* 删除方法 */
  1123. delHandle(ChartInfoId) {
  1124. dataBaseInterface
  1125. .delChartClassify({
  1126. ChartInfoId,
  1127. })
  1128. .then((res) => {
  1129. if (res.Ret !== 200) return;
  1130. this.$message.success(res.Msg);
  1131. sessionStorage.removeItem('myChartbeforeOptions');
  1132. let index = this.allChart.findIndex(
  1133. (item) => item === this.chartInfo.UniqueCode
  1134. );
  1135. this.$emit('remove',this.chartInfo.UniqueCode);
  1136. const newId = index > this.allChart.length - 1 ? this.allChart[0] : this.allChart[index];
  1137. if(this.allChart.length >= 1) this.getChartDetail(newId);
  1138. // //只有一个图表且删除了 则展示缺省
  1139. this.isNoChart = !this.allChart.length ? true : false;
  1140. });
  1141. },
  1142. /* 转base64 */
  1143. svgToBase64(svg) {
  1144. const base64img = `data:image/svg+xml;base64,${window.btoa(
  1145. unescape(encodeURI(svg))
  1146. )}`;
  1147. // console.log(base64img)
  1148. return base64img;
  1149. },
  1150. /* 点击保存时关联图表和截取的图片 */
  1151. setChartImage() {
  1152. let svg = this.$refs.chartRef.chart.getSVG({
  1153. chart:{
  1154. width: 340,
  1155. height: 230,
  1156. }
  1157. });
  1158. let form = new FormData();
  1159. form.append('Img', svg);
  1160. this.setImageHandle(form);
  1161. },
  1162. async setImageHandle(form) {
  1163. let { Data } = await dataBaseInterface.uploadImgSvg(form);
  1164. // let { Data } = await dataBaseInterface.uploadImg(form);
  1165. await dataBaseInterface.setChartImage({
  1166. ChartInfoId: this.chartInfo.ChartInfoId,
  1167. ImageUrl: Data.ResourceUrl,
  1168. });
  1169. },
  1170. /* 点击表格行展开配置项 */
  1171. rowClickHandle(row) {
  1172. this.expandKey =
  1173. this.expandKey.length && this.expandKey[0] === row.EdbCode
  1174. ? []
  1175. : [row.EdbCode];
  1176. // this.$refs.tableRef.toggleRowExpansion(row);
  1177. //曲线图点击行 自动置底
  1178. if (this.sameOptionType.includes(this.chartInfo.ChartType)) {
  1179. this.$nextTick(() => {
  1180. $('.cont-bottom')[0].scrollTop = 10000;
  1181. });
  1182. }
  1183. },
  1184. /* 设置row-key */
  1185. getRowKey(row) {
  1186. return row.EdbCode;
  1187. },
  1188. /* 控制展开一行收起其他行并高亮 */
  1189. expandChangeHandle(row, expandedRows) {
  1190. this.expandKey =
  1191. this.expandKey.length && this.expandKey[0] === row.EdbCode
  1192. ? []
  1193. : [row.EdbCode];
  1194. //曲线图点击行 自动置底
  1195. if (this.selected_chartType === 1) {
  1196. this.$nextTick(() => {
  1197. $('.cont-bottom')[0].scrollTop = 10000;
  1198. });
  1199. }
  1200. this.$refs.tableRef.setCurrentRow(row);
  1201. },
  1202. /* 移出我的图库 */
  1203. removeMychart(item) {
  1204. if (!this.select_classify)
  1205. return this.$message.warning(
  1206. '当前图表所属多个分类,请选中具体分类移出'
  1207. );
  1208. mychartInterface.del({ MyChartId: item.MyChartId,MyChartClassifyId: this.select_classify }).then((res) => {
  1209. if (res.Ret !== 200) return;
  1210. this.$message.success('移出成功');
  1211. item.IsAdd = false;
  1212. sessionStorage.removeItem('myChartbeforeOptions');
  1213. let index = this.allChart.findIndex(
  1214. (item) => item === this.chartInfo.UniqueCode
  1215. );
  1216. this.$emit('remove',item.UniqueCode);
  1217. const newId = index > this.allChart.length - 1 ? this.allChart[0] : this.allChart[index];
  1218. if(this.allChart.length >= 1) this.getChartDetail(newId);
  1219. // //只有一个图表且删除了 则展示缺省
  1220. this.isNoChart = !this.allChart.length ? true : false;
  1221. });
  1222. },
  1223. /* 上下切换图表 同一分类内 */
  1224. switchChart(type) {
  1225. //判断当前图表在列表中的index pre时为0去最后一个 next时为最后一个取0
  1226. this.formItemArray=[]
  1227. let index = this.allChart.findIndex(
  1228. (item) => item === this.chartInfo.UniqueCode
  1229. );
  1230. let newCode = '';
  1231. if (type === 'prev') {
  1232. newCode =
  1233. index === 0
  1234. ? this.allChart[this.allChart.length - 1]
  1235. : this.allChart[index - 1];
  1236. } else {
  1237. newCode =
  1238. index === this.allChart.length - 1
  1239. ? this.allChart[0]
  1240. : this.allChart[index + 1];
  1241. }
  1242. sessionStorage.removeItem('myChartbeforeOptions');
  1243. this.getChartDetail(newCode);
  1244. this.resetShowPopConfirmMap()
  1245. },
  1246. /* 编辑图表 */
  1247. editChartHandle() {
  1248. let path = '';
  1249. if(this.chartInfo.Source === 1){
  1250. path='/editchart'
  1251. }else if([2,5].includes(this.chartInfo.Source)){
  1252. path='/addCommodityChart'
  1253. }else if([3,4].includes(this.chartInfo.Source)){
  1254. path='/relevancechartEditor'
  1255. }else if(this.chartInfo.Source===6){
  1256. path='/fittingEquationChartEditor'
  1257. }else if([7,8,9].includes(this.chartInfo.Source)) {
  1258. path='/statisticFeatureChartEditor'
  1259. }
  1260. let { href } = this.$router.resolve({
  1261. path,
  1262. query: {
  1263. code: this.chartInfo.UniqueCode,
  1264. from: 'mychart'
  1265. }
  1266. })
  1267. window.open(href,'_blank');
  1268. },
  1269. /* 分享图表链接 */
  1270. shareUrl() {
  1271. var clipboard = new this.Clipboard('.shareLink')
  1272. clipboard.on('success', e => {
  1273. this.$message.success('复制链接成功')
  1274. e.clearSelection() // 释放内存
  1275. clipboard.destroy()
  1276. })
  1277. // // 浏览器不支持
  1278. clipboard.on('error', e => {
  1279. this.$message.warning('浏览器暂不支持')
  1280. // 释放内存
  1281. clipboard.destroy()
  1282. })
  1283. },
  1284. copyTitleText() {
  1285. let clipboard = new this.Clipboard('.my-chart-title')
  1286. clipboard.on('success', e => {
  1287. this.$message.success('复制标题成功')
  1288. e.clearSelection() // 释放内存
  1289. clipboard.destroy()
  1290. })
  1291. // // 浏览器不支持
  1292. clipboard.on('error', e => {
  1293. this.$message.warning('浏览器暂不支持')
  1294. // 释放内存
  1295. clipboard.destroy()
  1296. })
  1297. },
  1298. init() {
  1299. this.dateTip = '请选择时间段';
  1300. sessionStorage.removeItem('myChartbeforeOptions');
  1301. },
  1302. close() {
  1303. this.init();
  1304. this.$emit('close');
  1305. $('#right > div > div:nth-child(4) .v-modal').remove()
  1306. },
  1307. },
  1308. created() {},
  1309. mounted() {},
  1310. };
  1311. </script>
  1312. <style lang="scss">
  1313. .chart-detail-container {
  1314. min-width: 1200px;
  1315. $font_normal: 14px;
  1316. $font_mini: 12px;
  1317. $normal_height: 650px;
  1318. $mini_height: 550px;
  1319. .date-setting{
  1320. border: 1px solid #DCDFE6;
  1321. border-radius: 4px;
  1322. cursor: pointer;
  1323. color: #333333;
  1324. line-height: 16px;
  1325. }
  1326. @media screen and (max-width: 1710px) {
  1327. /* transform: scale(0.8);
  1328. left: 10%;
  1329. top: 5%; */
  1330. .year-btn {
  1331. padding: 8px 20px;
  1332. }
  1333. .year-btn,.btn-sty,.top-right {
  1334. font-size: $font_mini;
  1335. }
  1336. .el-icon-refresh {
  1337. font-size: 14px;
  1338. }
  1339. .el-table {
  1340. font-size: $font_mini;
  1341. td,th {
  1342. padding: 8px 0;
  1343. }
  1344. .el-table__expanded-cell {
  1345. padding: 10px 15px;
  1346. }
  1347. }
  1348. .cont-bottom,.nodata {
  1349. height: $mini_height;
  1350. }
  1351. .min-data-input {
  1352. margin-top: 220px;
  1353. }
  1354. .btn-sty {
  1355. padding: 8px;
  1356. }
  1357. .date-setting{
  1358. width: 180px;
  1359. padding: 10px;
  1360. font-size: 12px;
  1361. }
  1362. }
  1363. @media screen and (min-width: 1711px) {
  1364. .year-btn,.btn-sty,.top-right {
  1365. font-size: $font_normal;
  1366. }
  1367. .cont-bottom,.nodata {
  1368. height: $normal_height;
  1369. }
  1370. .min-data-input {
  1371. margin-top: 308px;
  1372. }
  1373. .btn-sty {
  1374. padding: 10px;
  1375. }
  1376. .date-setting{
  1377. width: 210px;
  1378. padding: 10px;
  1379. border: 1px solid #DCDFE6;
  1380. border-radius: 4px;
  1381. cursor: pointer;
  1382. font-size: 14px;
  1383. color: #333333;
  1384. }
  1385. .el-table__expanded-cell {
  1386. padding: 20px 26px;
  1387. }
  1388. }
  1389. .el-dialog__body {
  1390. padding: 10px 0 20px;
  1391. }
  1392. .nodata {
  1393. text-align: center;
  1394. padding: 40px 0;
  1395. color: #999;
  1396. }
  1397. .my-chart-title:hover {
  1398. text-decoration: underline;
  1399. }
  1400. .header {
  1401. padding: 0 30px 0;
  1402. position: relative;
  1403. display: flex;
  1404. align-items: center;
  1405. justify-content: space-between;
  1406. .close {
  1407. font-size: 26px;
  1408. position: absolute;
  1409. right: 0;
  1410. top: 50%;
  1411. transform: translateY(-50%);
  1412. cursor: pointer;
  1413. }
  1414. .top-left {
  1415. .year-btn {
  1416. min-width: 98px;
  1417. margin-right: 5px;
  1418. margin-bottom: 5px;
  1419. }
  1420. .btn-sty {
  1421. border: 1px solid #409eff;
  1422. }
  1423. }
  1424. .top-right {
  1425. .join_txt {
  1426. color: #409eff;
  1427. cursor: pointer;
  1428. &:hover {
  1429. text-decoration: underline;
  1430. }
  1431. }
  1432. .collected {
  1433. color: #f00;
  1434. cursor: pointer;
  1435. &:hover {
  1436. text-decoration: underline;
  1437. }
  1438. }
  1439. .span-item {
  1440. color: #409eff;
  1441. cursor: pointer;
  1442. &:hover {
  1443. text-decoration: underline;
  1444. }
  1445. .el-icon-collection,
  1446. .el-icon-document-copy {
  1447. color: #409eff;
  1448. }
  1449. }
  1450. }
  1451. }
  1452. .cont-bottom {
  1453. padding: 10px 30px 30px;
  1454. overflow: auto;
  1455. .error-tip{ color: #D03F28; font-size: 16px;padding: 25px 0 0 25px; }
  1456. .el-input__inner {
  1457. height: 27px;
  1458. line-height: 27px;
  1459. padding: 0 4px;
  1460. }
  1461. .el-input-number .el-input__inner {
  1462. padding: 0 34px 0 4px;
  1463. }
  1464. .el-color-picker--mini .el-color-picker__trigger {
  1465. width: 60px;
  1466. height: 25px;
  1467. padding: 0;
  1468. }
  1469. .el-color-picker--mini .el-color-picker__mask {
  1470. width: 60px;
  1471. height: 25px;
  1472. }
  1473. .highcharts-range-selector-group {
  1474. display: none;
  1475. .highcharts-input-group {
  1476. display: none;
  1477. }
  1478. }
  1479. .highcharts-axis-title {
  1480. display: block;
  1481. }
  1482. .calendar-cont {
  1483. display: block;
  1484. margin: 10px auto 0;
  1485. text-align: center;
  1486. }
  1487. /* =================== */
  1488. .chart-show-cont {
  1489. /* margin-bottom: 15px; */
  1490. padding: 0 180px 10px 150px;
  1491. position: relative;
  1492. .chart-title {
  1493. font-size: 16px;
  1494. font-weight: normal;
  1495. text-align: center;
  1496. margin-bottom: 10px;
  1497. }
  1498. .chart-author {
  1499. color: #333;
  1500. position: absolute;
  1501. bottom: 20px;
  1502. right: 38px;
  1503. }
  1504. .chartWrapper {
  1505. position: relative;
  1506. min-height: 300px;
  1507. .range-cont {
  1508. position: absolute;
  1509. top: 10%;
  1510. .min-data-input {
  1511. width: 60px;
  1512. display: block;
  1513. }
  1514. &.left {
  1515. left: -80px;
  1516. }
  1517. &.right {
  1518. right: -65px;
  1519. }
  1520. &.rightTwo {
  1521. right: -140px;
  1522. }
  1523. &.bottom {
  1524. width: 100%;
  1525. display: flex;
  1526. justify-content: space-between;
  1527. top: auto;
  1528. right: 0;
  1529. bottom: -1%;
  1530. .left {
  1531. width: 60px;
  1532. display: block;
  1533. flex-shrink: 0;
  1534. }
  1535. }
  1536. }
  1537. .arrow {
  1538. width: 38px;
  1539. height: 38px;
  1540. position: absolute;
  1541. color: #999;
  1542. top: 50%;
  1543. transform: translateY(-50%);
  1544. cursor: pointer;
  1545. &:hover {
  1546. opacity: 0.7;
  1547. }
  1548. &.left {
  1549. left: -150px;
  1550. }
  1551. &.right {
  1552. right: -180px;
  1553. }
  1554. }
  1555. }
  1556. }
  1557. .options-cont {
  1558. display: flex;
  1559. flex-wrap: wrap;
  1560. justify-content: space-between;
  1561. }
  1562. }
  1563. .drawImg {
  1564. position: absolute;
  1565. top: -999px;
  1566. z-index: -100;
  1567. }
  1568. }
  1569. </style>
  1570. <style lang="scss">
  1571. .el-dialog .el-dialog__header {
  1572. padding: 15px 40px 15px 25px;
  1573. }
  1574. .edb-item-style .el-input__icon {
  1575. line-height: 27px;
  1576. }
  1577. </style>