SetChartEnName.vue 18 KB

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