SetChartEnName.vue 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658
  1. <script setup>
  2. //设置图表英文名称
  3. import {ref,watch} from 'vue'
  4. import apiChart from '@/api/chart'
  5. import apiFutureChart from '@/api/futureChart'
  6. import apiCorrelationChart from '@/api/correlationChart'
  7. import apiLineEquationChart from '@/api/lineEquationChart'
  8. import apiStatisticFeatureChart from '@/api/statisticFeatureChart'
  9. import apiCrossVarietyChart from '@/api/crossVarietyChart'
  10. import { showToast } from 'vant';
  11. const props = defineProps({
  12. isShow:{
  13. type:Boolean,
  14. default:false
  15. },
  16. chartInfo:{
  17. type:Object,
  18. default:{}
  19. },
  20. chartType:{
  21. type:Number,
  22. default:0
  23. }
  24. })
  25. const emits = defineEmits(['cancel','success'])
  26. //折叠面板的展开项
  27. const activeGroup = ref([])
  28. //表格组
  29. const formGroup = ref([
  30. /* {
  31. groupName:'图表名称',//分组名称
  32. formList:[{
  33. label:'图表名称',
  34. cnValue:'测试截面散点图',//中文值
  35. enValue:'',//英文值
  36. Value:'',//v-model的值,为cnValue/Value
  37. noEdit:false,//是否允许编辑
  38. }],//需要填写的项
  39. } */
  40. ])
  41. //截面图的其他参数
  42. const _ExtraConfig = ref({})
  43. watch(
  44. ()=>props.isShow,
  45. ()=>{
  46. if(props.isShow){
  47. initForm()
  48. }else{
  49. formGroup.value = []
  50. }
  51. },
  52. {immediate:true}
  53. )
  54. async function initForm(){
  55. const {EdbInfoList} = props.chartInfo
  56. const {ChartName,ChartNameEn,ExtraConfig} = props.chartInfo.ChartInfo
  57. //第一项固定为图表名称
  58. formGroup.value.push({
  59. groupName:'图表名称',
  60. formList:[{
  61. label:'图表中文名称',
  62. cnValue:ChartName,
  63. enValue:ChartNameEn,
  64. Value:ChartName,
  65. noEdit:true
  66. },{
  67. label:'英文图表名称',
  68. cnValue:ChartName,
  69. enValue:ChartNameEn,
  70. Value:ChartNameEn,
  71. placeholder:'请输入英文图表名称'
  72. }]
  73. })
  74. //截面散点图 chartType===10 与其他图格式不一样
  75. if(Number(props.chartInfo.ChartInfo.ChartType)===10){
  76. _ExtraConfig.value = JSON.parse(ExtraConfig)
  77. const {XName,XNameEn,XUnitName,XUnitNameEn} = JSON.parse(ExtraConfig)
  78. const {YName,YNameEn,YUnitName,YUnitNameEn} = JSON.parse(ExtraConfig)
  79. let suppleFormList = [{
  80. label:`X轴名称:${XName}`,
  81. cnValue:XName,
  82. enValue:XNameEn,
  83. Value:XNameEn,
  84. key:'XNameEn',
  85. placeholder:'请输入X轴英文名称'
  86. },{
  87. label:`X轴单位:${XUnitName}`,
  88. cnValue:XUnitName,
  89. enValue:XUnitNameEn,
  90. Value:XUnitNameEn,
  91. key:'XUnitNameEn',
  92. placeholder:'请输入X轴英文单位'
  93. },{
  94. label:`Y轴名称:${YName}`,
  95. cnValue:YName,
  96. enValue:YNameEn,
  97. Value:YNameEn,
  98. key:'YNameEn',
  99. placeholder:'请输入Y轴英文名称'
  100. },{
  101. label:`Y轴单位:${YUnitName}`,
  102. cnValue:YUnitName,
  103. enValue:YUnitNameEn,
  104. Value:YUnitNameEn,
  105. key:'YUnitNameEn',
  106. placeholder:'请输入Y轴英文单位'
  107. }]
  108. //补充第一项
  109. formGroup.value[0].formList = formGroup.value[0].formList.concat(suppleFormList)
  110. const {SeriesList} = JSON.parse(ExtraConfig)
  111. const seriesEdbInfoList = SeriesList[0].EdbInfoList //每一项的EdbInfoList是一样的,取第一项就行
  112. let formSeriesList = []
  113. let formEdbInfoList = []
  114. SeriesList.forEach((serise,index)=>{
  115. formSeriesList.push({
  116. label:`系列${index+1}:${serise.Name}`,
  117. cnValue:serise.Name,
  118. enValue:serise.NameEn,
  119. Value:serise.NameEn,
  120. placeholder:'请输入系列英文名称'
  121. })
  122. })
  123. seriesEdbInfoList.forEach((edb,index)=>{
  124. formEdbInfoList.push({
  125. label:`标签${index+1}:${edb.Name}`,
  126. cnValue:edb.Name,
  127. enValue:edb.NameEn,
  128. Value:edb.NameEn,
  129. placeholder:'请输入标签英文名称'
  130. })
  131. })
  132. //第二项
  133. formGroup.value.push({
  134. groupName:'标签,系列名称',
  135. SeriesListLength:formSeriesList.length,
  136. formList:[...formSeriesList,...formEdbInfoList]
  137. })
  138. let formEdbList = []
  139. for(const edb of EdbInfoList){
  140. formEdbList.push({
  141. EdbInfoId:edb.EdbInfoId,
  142. label:edb.EdbName,
  143. cnValue:edb.EdbName,
  144. enValue:edb.EdbNameEn,
  145. Value:edb.EdbNameEn,
  146. placeholder:'请输入英文指标名称'
  147. })
  148. }
  149. //第三项
  150. formGroup.value.push({
  151. groupName:'指标名称',
  152. formList:formEdbList
  153. })
  154. activeGroup.value = formGroup.value.map(i=>i.groupName)
  155. return
  156. }
  157. // 价格曲线
  158. if(props.chartInfo.ChartInfo.Source===2){
  159. //补充第一项
  160. let forwardFormList=[
  161. {
  162. label:'期货名称',
  163. cnValue:props.chartInfo.EdbInfoList[1].EdbName,
  164. enValue:props.chartInfo.EdbInfoList[1].EdbNameEn,
  165. Value:props.chartInfo.EdbInfoList[1].EdbName,
  166. noEdit:true
  167. },
  168. {
  169. label:'英文期货名称',
  170. cnValue:props.chartInfo.EdbInfoList[1].EdbName,
  171. enValue:props.chartInfo.EdbInfoList[1].EdbNameEn,
  172. Value:props.chartInfo.EdbInfoList[1].EdbNameEn,
  173. placeholder:'请输入英文期货名称'
  174. }
  175. ]
  176. formGroup.value[0].formList = formGroup.value[0].formList.concat(forwardFormList)
  177. for(const edb of [EdbInfoList[0]]){
  178. formGroup.value.push({
  179. groupName:`${edb.EdbName}`,
  180. EdbInfoId:edb.EdbInfoId,
  181. formList:[
  182. {
  183. label:'指标名称',
  184. cnValue:edb.EdbName,
  185. enValue:edb.EdbNameEn,
  186. Value:edb.EdbName,
  187. noEdit:true,
  188. },
  189. {
  190. label:'单位',
  191. cnValue:edb.Unit,
  192. enValue:edb.UnitEn,
  193. Value:edb.Unit,
  194. noEdit:true
  195. },
  196. {
  197. label:'英文指标名称',
  198. cnValue:edb.EdbName,
  199. enValue:edb.EdbNameEn,
  200. Value:edb.EdbNameEn,
  201. placeholder:'请输入英文指标名称'
  202. },
  203. {
  204. label:'英文单位',
  205. cnValue:edb.Unit,
  206. enValue:edb.UnitEn,
  207. Value:edb.UnitEn,
  208. placeholder:'请输入英文单位'
  209. }
  210. ]
  211. })
  212. }
  213. activeGroup.value = formGroup.value.map(i=>i.groupName)
  214. return
  215. }
  216. // 利润曲线
  217. if(props.chartInfo.ChartInfo.Source===5){
  218. //补充第一项
  219. let forwardFormList=[
  220. {
  221. label:'盘面利润名称',
  222. cnValue:props.chartInfo.DataResp.ProfitName,
  223. enValue:props.chartInfo.DataResp.ProfitNameEn,
  224. Value:props.chartInfo.DataResp.ProfitName,
  225. noEdit:true
  226. },
  227. {
  228. label:'英文盘面利润名称',
  229. cnValue:props.chartInfo.DataResp.ProfitName,
  230. enValue:props.chartInfo.DataResp.ProfitNameEn,
  231. Value:props.chartInfo.DataResp.ProfitNameEn,
  232. placeholder:'请输入英文盘面利润名称'
  233. }
  234. ]
  235. formGroup.value[0].formList = formGroup.value[0].formList.concat(forwardFormList)
  236. for(const edb of [EdbInfoList[0]]){
  237. formGroup.value.push({
  238. groupName:`${edb.EdbName}`,
  239. EdbInfoId:edb.EdbInfoId,
  240. formList:[
  241. {
  242. label:'指标名称',
  243. cnValue:edb.EdbName,
  244. enValue:edb.EdbNameEn,
  245. Value:edb.EdbName,
  246. noEdit:true,
  247. },
  248. {
  249. label:'单位',
  250. cnValue:edb.Unit,
  251. enValue:edb.UnitEn,
  252. Value:edb.Unit,
  253. noEdit:true
  254. },
  255. {
  256. label:'英文指标名称',
  257. cnValue:edb.EdbName,
  258. enValue:edb.EdbNameEn,
  259. Value:edb.EdbNameEn,
  260. placeholder:'请输入英文指标名称'
  261. },
  262. {
  263. label:'英文单位',
  264. cnValue:edb.Unit,
  265. enValue:edb.UnitEn,
  266. Value:edb.UnitEn,
  267. placeholder:'请输入英文单位'
  268. }
  269. ]
  270. })
  271. }
  272. activeGroup.value = formGroup.value.map(i=>i.groupName)
  273. return
  274. }
  275. // 相关性-3;拟合方程-6;统计特征-7,8,9
  276. if([3,6,7,8,9].includes(props.chartInfo.ChartInfo.Source)){
  277. activeGroup.value = formGroup.value.map(i=>i.groupName)
  278. return
  279. }
  280. if(props.chartInfo.ChartInfo.Source===10) { //跨品种分析
  281. let res = await apiCrossVarietyChart.chartLangOption({ChartInfoId: props.chartInfo.ChartInfo.ChartInfoId})
  282. const { TagList,VarietyList } = res.Data;
  283. let forwardFormList=[
  284. {
  285. label:'X轴名称',
  286. id: TagList[0].ChartTagId,
  287. cnValue:TagList[0].ChartTagName,
  288. enValue:TagList[0].ChartTagNameEn,
  289. Value:TagList[0].ChartTagName,
  290. noEdit:true
  291. },
  292. {
  293. label:'英文X轴名称',
  294. id: TagList[0].ChartTagId,
  295. cnValue:TagList[0].ChartTagName,
  296. enValue:TagList[0].ChartTagNameEn,
  297. Value:TagList[0].ChartTagNameEn,
  298. placeholder:'请输入英文X轴名称'
  299. },
  300. {
  301. label:'Y轴名称',
  302. id: TagList[1].ChartTagId,
  303. cnValue:TagList[1].ChartTagName,
  304. enValue:TagList[1].ChartTagNameEn,
  305. Value:TagList[1].ChartTagName,
  306. noEdit:true
  307. },
  308. {
  309. label:'英文Y轴名称',
  310. id: TagList[1].ChartTagId,
  311. cnValue:TagList[1].ChartTagName,
  312. enValue:TagList[1].ChartTagNameEn,
  313. Value:TagList[1].ChartTagNameEn,
  314. placeholder:'请输入英文Y轴名称'
  315. }
  316. ]
  317. formGroup.value[0].formList = formGroup.value[0].formList.concat(forwardFormList)
  318. for(const item of VarietyList){
  319. formGroup.value.push({
  320. groupName:`${item.ChartVarietyName}`,
  321. id:item.ChartVarietyId,
  322. formList:[
  323. {
  324. label:'品种名称',
  325. cnValue:item.ChartVarietyName,
  326. enValue:item.ChartVarietyNameEn,
  327. Value:item.ChartVarietyName,
  328. noEdit:true,
  329. },
  330. {
  331. label:'英文品种名称',
  332. cnValue:item.ChartVarietyName,
  333. enValue:item.ChartVarietyNameEn,
  334. Value:item.ChartVarietyNameEn,
  335. placeholder:'请输入英文品种名称'
  336. }
  337. ]
  338. })
  339. }
  340. activeGroup.value = formGroup.value.map(i=>i.groupName)
  341. return
  342. }
  343. //普通图
  344. for(const edb of EdbInfoList){
  345. formGroup.value.push({
  346. groupName:`${edb.EdbName}`,
  347. EdbInfoId:edb.EdbInfoId,
  348. formList:[
  349. {
  350. label:'指标名称',
  351. cnValue:edb.EdbName,
  352. enValue:edb.EdbNameEn,
  353. Value:edb.EdbName,
  354. noEdit:true,
  355. },
  356. {
  357. label:'单位',
  358. cnValue:edb.Unit,
  359. enValue:edb.UnitEn,
  360. Value:edb.Unit,
  361. noEdit:true
  362. },
  363. {
  364. label:'英文指标名称',
  365. cnValue:edb.EdbName,
  366. enValue:edb.EdbNameEn,
  367. Value:edb.EdbNameEn,
  368. placeholder:'请输入英文指标名称'
  369. },
  370. {
  371. label:'英文单位',
  372. cnValue:edb.Unit,
  373. enValue:edb.UnitEn,
  374. Value:edb.UnitEn,
  375. placeholder:'请输入英文单位'
  376. }
  377. ]
  378. })
  379. }
  380. //默认全部展开
  381. activeGroup.value = formGroup.value.map(i=>i.groupName)
  382. }
  383. const showCellEditDialog = ref(false)
  384. const currentCell = ref({})
  385. let tempValue=''
  386. function handleCellClick(cell){
  387. if(cell.noEdit) return
  388. currentCell.value = cell
  389. tempValue = cell.Value
  390. showCellEditDialog.value = true
  391. }
  392. function handleConfirmEditCell(){
  393. //console.log('check',currentCell.value)
  394. }
  395. function handleCancelEditCell(){
  396. currentCell.value.Value = tempValue
  397. }
  398. function handleSave(){
  399. let params = {
  400. ChartInfoId:props.chartInfo.ChartInfo.ChartInfoId,
  401. ChartNameEn:formGroup.value[0].formList[1].Value,
  402. ChartEdbInfoList:[],
  403. }
  404. if(Number(props.chartInfo.ChartInfo.ChartType)===10){
  405. //指标数据
  406. let ChartEdbInfoList = []
  407. formGroup.value[2].formList.forEach(item=>{
  408. ChartEdbInfoList.push({
  409. EdbInfoId:item.EdbInfoId,
  410. EdbNameEn:item.Value.trim(),
  411. UnitEn:''
  412. })
  413. })
  414. params.ChartEdbInfoList = ChartEdbInfoList
  415. //额外数据
  416. _ExtraConfig.value.SeriesList.forEach((item,index)=>{
  417. const {SeriesListLength} = formGroup.value[1]
  418. item.NameEn = formGroup.value[1].formList[index].Value.trim()
  419. item.EdbInfoList.forEach((edb,edb_index) => {
  420. edb.NameEn= formGroup.value[1].formList[edb_index+SeriesListLength].Value.trim();
  421. })
  422. })
  423. let suppleConfig = {}
  424. let suppleList = formGroup.value[0].formList
  425. for(let suppleIndex = 2;suppleIndex<suppleList.length;suppleIndex++){
  426. const key = suppleList[suppleIndex].key
  427. suppleConfig[key] = suppleList[suppleIndex].Value.trim()
  428. }
  429. _ExtraConfig.value = {..._ExtraConfig.value,...suppleConfig}
  430. params.ExtraConfig = JSON.stringify(_ExtraConfig.value)
  431. }
  432. else if(Number(props.chartInfo.ChartInfo.Source)===10) {
  433. params = {
  434. ChartInfoId:props.chartInfo.ChartInfo.ChartInfoId,
  435. ChartNameEn:formGroup.value[0].formList[1].Value,
  436. TagList: [
  437. { ChartTagId: formGroup.value[0].formList[3].id,TagNameEn: formGroup.value[0].formList[3].Value },
  438. { ChartTagId: formGroup.value[0].formList[5].id,TagNameEn: formGroup.value[0].formList[5].Value }
  439. ],
  440. VarietyList: formGroup.value.filter((_,index)=>index>0).map(_ => ({
  441. ChartVarietyId: _.id,
  442. VarietyNameEn: _.formList[1].Value
  443. }))
  444. }
  445. }
  446. else{
  447. let ChartEdbInfoList = []
  448. for(let index = 1;index<formGroup.value.length;index++){
  449. ChartEdbInfoList.push({
  450. EdbInfoId:formGroup.value[index].EdbInfoId,
  451. EdbNameEn:formGroup.value[index].formList[2].Value.trim(),
  452. UnitEn:formGroup.value[index].formList[3].Value.trim()
  453. })
  454. }
  455. params.ChartEdbInfoList = ChartEdbInfoList
  456. }
  457. saveChartEn(params)
  458. }
  459. async function saveChartEn(params){
  460. console.log(params);
  461. let res=null
  462. if([2,5].includes(props.chartInfo.ChartInfo.Source)){//商品价格
  463. res=await apiFutureChart.chartInfoEditEn({
  464. ChartInfoId: params.ChartInfoId,
  465. ChartNameEn: params.ChartNameEn,
  466. UnitEn: formGroup.value[1].formList[3].enValue || '',
  467. EdbNameEn: formGroup.value[1].formList[2].enValue || '',
  468. FutureGoodNameEn: props.chartInfo.ChartInfo.Source==2?formGroup.value[0].formList[3].enValue : '',
  469. ProfitNameEn: props.chartInfo.ChartInfo.Source==5?formGroup.value[0].formList[3].enValue : '',
  470. })
  471. }else if(props.chartInfo.ChartInfo.Source===3){//相关性
  472. res=await apiCorrelationChart.chartInfoEditEn({
  473. ChartInfoId: params.ChartInfoId,
  474. ChartNameEn: params.ChartNameEn,
  475. })
  476. }else if(props.chartInfo.ChartInfo.Source===6){//拟合方程
  477. res=await apiLineEquationChart.chartInfoEditEn({
  478. ChartInfoId: params.ChartInfoId,
  479. ChartNameEn: params.ChartNameEn,
  480. })
  481. }else if([7,8,9].includes(props.chartInfo.ChartInfo.Source)){//统计特征
  482. res=await apiStatisticFeatureChart.chartInfoEditEn({
  483. ChartInfoId: params.ChartInfoId,
  484. ChartNameEn: params.ChartNameEn,
  485. })
  486. }else if(props.chartInfo.ChartInfo.Source===10){//统计特征
  487. res=await apiCrossVarietyChart.editChartEn(params)
  488. }else{
  489. res = await apiChart.chartInfoEditEn(params)
  490. }
  491. if(res.Ret!==200) return
  492. showToast({message:'设置英文名称成功',type:'success'})
  493. emits('success')
  494. }
  495. </script>
  496. <template>
  497. <div class="set-name-pop-wrap">
  498. <van-collapse v-model="activeGroup">
  499. <van-collapse-item
  500. v-for="node in formGroup"
  501. :key="node.groupName"
  502. :name="node.groupName"
  503. :title="node.groupName"
  504. :is-link="true"
  505. >
  506. <van-cell
  507. v-for="cell in node.formList"
  508. :key="cell.label"
  509. :title="cell.label"
  510. :label="cell.Value.length?cell.Value:cell.placeholder"
  511. :is-link="!cell.noEdit"
  512. @click.stop="handleCellClick(cell,node)"
  513. >
  514. </van-cell>
  515. </van-collapse-item>
  516. </van-collapse>
  517. <div class="tool-box">
  518. <div class="btn cancel" @click="emits('cancel')">取消</div>
  519. <div class="btn" @click="handleSave">保存</div>
  520. </div>
  521. <van-dialog
  522. v-model:show="showCellEditDialog"
  523. title="设置英文名称"
  524. show-cancel-button
  525. confirmButtonText="确定"
  526. @cancel="handleCancelEditCell"
  527. @confirm="handleConfirmEditCell"
  528. >
  529. <div class="name">{{ currentCell.cnValue||'无'}}</div>
  530. <div class="rename-wrap">
  531. <input type="text" :placeholder="currentCell.placeholder" v-model="currentCell.Value">
  532. </div>
  533. </van-dialog>
  534. </div>
  535. </template>
  536. <style lang="scss">
  537. .set-name-pop-wrap{
  538. .van-collapse{
  539. flex: 1;
  540. background-color:#F6F6F6;
  541. }
  542. .van-collapse-item{
  543. padding-bottom:20px;
  544. &:last-child{
  545. padding-bottom: 0;
  546. }
  547. }
  548. .van-badge__wrapper{
  549. align-self: center;
  550. }
  551. .van-collapse-item__content{
  552. padding:0;
  553. }
  554. .name{
  555. text-align: center;
  556. margin-top:32px;
  557. color: #666;
  558. }
  559. .rename-wrap{
  560. padding:48px;
  561. input{
  562. padding: 24px 32px;
  563. border-radius: 12px;
  564. background-color: #F6F6F6;
  565. width: 100%;
  566. }
  567. .label{
  568. color: #666666;
  569. margin-bottom: 32px;
  570. text-align: center;
  571. }
  572. }
  573. @media screen and (min-width:$media-width){
  574. .van-collapse-item{
  575. padding-bottom:10px;
  576. }
  577. .name{
  578. margin-top:16px;
  579. }
  580. .rename-wrap{
  581. padding:24px;
  582. input{
  583. padding: 12px 16px;
  584. border-radius: 6px;
  585. background-color: #F6F6F6;
  586. width: 100%;
  587. }
  588. .label{
  589. margin-bottom: 16px;
  590. }
  591. }
  592. }
  593. }
  594. </style>
  595. <style scoped lang="scss">
  596. .set-name-pop-wrap{
  597. height: 100%;
  598. display: flex;
  599. flex-direction: column;
  600. .tool-box{
  601. position:sticky;
  602. z-index: 99;
  603. bottom: 0;
  604. left:0;
  605. right:0;
  606. background-color: #fff;
  607. padding:48px;
  608. display: flex;
  609. gap: 24px;
  610. .btn{
  611. flex: 1;
  612. border:1px solid $theme-color;
  613. border-radius: 12px;
  614. background-color: $theme-color;
  615. color:#fff;
  616. text-align: center;
  617. padding:16px;
  618. &.cancel{
  619. background-color: #fff;
  620. color: $theme-color;
  621. }
  622. }
  623. }
  624. @media screen and (min-width:$media-width){
  625. .tool-box{
  626. padding:24px;
  627. gap:12px;
  628. .btn{
  629. border-radius: 6px;
  630. padding:8px;
  631. }
  632. }
  633. }
  634. }
  635. </style>