Selaa lähdekoodia

Merge branch 'master' into xqc_16

jwyu 1 vuosi sitten
vanhempi
commit
8f86470de6

+ 4 - 2
src/api/api.js

@@ -12,7 +12,8 @@ import {
   nationalInterface,
   databankInterface,
   yongyiInterface,
-  fwmtInterface
+  fwmtInterface,
+  guangqiInterface
 } from './modules/thirdBaseApi';
 
 //手工指标 手工数据 手工数据权限
@@ -116,7 +117,8 @@ export {
   businessTripInterence,
   reportVarietyENInterence,
   yongyiInterface,
-  fwmtInterface
+  fwmtInterface,
+  guangqiInterface,
 };
 
 //老接口 研报 ppt等

+ 10 - 0
src/api/modules/chartApi.js

@@ -933,6 +933,16 @@ const dataBaseInterface = {
 	 */
 	getReportrefreshStatus: params => {
 		return http.post('/datamanage/chart_info/batch_refresh/result',params)
+	},
+
+	/**
+	 * 获取雷达图预览数据
+	 * @param {
+	 * 	ExtraConfig: { EdbInfoIdList  DateList }
+	 * } params 
+	 */
+	getRadarPreviewData: params => {
+		return http.post('/datamanage/chart_info/preview/radar',params)
 	}
 	
 }

+ 55 - 1
src/api/modules/thirdBaseApi.js

@@ -800,6 +800,59 @@ const fwmtInterface={
 	// 搜索
 	getTargetListByName:params=>{
 		return http.get('/datamanage/fenwei/search_list',params);
+	}
+}
+
+const guangqiInterface={
+		/**
+		 * 分类列表
+		 * @param {} params 
+		 * @returns 
+		 */
+	getClassifyList: params => {
+		return http.get('/data_source/gfex/classify/list',params);
+	},
+	/**
+	 * 获取数据最新日期
+	 */
+	getNewtestDate: params => {
+		return http.get('/data_source/gfex/max/date',params);
+	},
+	/**
+ * 获取分类下合约
+ * @param {} params 
+ * BaseFromTradeGuangzhouClassifyId TradeDate
+ * @returns 
+ */
+	getContractList:params=>{
+		return http.get('/data_source/gfex/contract',params);
+	},
+	/**
+ * 获取指标数据
+ * @param {} params 
+ * BaseFromTradeGuangzhouClassifyId BaseFromTradeGuangzhouContractId TradeDate
+ * @returns 
+ */
+	getIndexDataList:params=>{
+		return http.get('/data_source/gfex/index_data',params);
+	},
+	/**
+ * 获取指标数据详情(一次性交割卖方仓单查询)
+ * @param {} params 
+ * BaseFromTradeGuangzhouIndexId TradeDate
+ * @returns 
+ */
+	getIndexDataDetail:params=>{
+		return http.get('/data_source/gfex/index/detail',params);
+	},
+	/**
+ * 导出指标数据详情(一次性交割卖方仓单查询)
+ * @param {} params 
+ * BaseFromTradeGuangzhouIndexId TradeDate
+ * @returns 
+ */
+	exportIndexDataDetail:params=>{
+		return http.get('/data_source/gfex/index/detail/export',params);
 	},
 }
 
@@ -815,5 +868,6 @@ export {
   nationalInterface,
   databankInterface,
   yongyiInterface,
-  fwmtInterface
+  fwmtInterface,
+	guangqiInterface
 }

+ 7 - 0
src/routes/modules/dataRoutes.js

@@ -132,6 +132,13 @@ export default [
           keepAlive: false,
         },
       },
+      {
+        path: "guangzhouFutures",
+        component: () =>
+          import("@/views/dataEntry_manage/thirdBase/gqExchangeData.vue"),
+        name: "广期所",
+        hidden: false
+      },
       {
         path: "chineseCoal",
         component: () => import("@/views/dataEntry_manage/coal/index.vue"),

+ 24 - 0
src/utils/common.js

@@ -314,4 +314,28 @@ const handleUploadToS3=(file,fileName,options={})=>{
             reject(error)
           }
     })
+  }
+  
+/**
+ * 等待几个请求返回才能进行下一步的中间函数
+ * @param {*} flag 执行下一步的标志 需要取到最新的值,传入返回值函数
+ * @param {*} callBack 回调
+ * @param {*} timeout 间隔
+ */
+export const waitRequestReturn=(flag,callBack,timeout)=>{
+  if(typeof(flag)!='function' || typeof(callBack)!='function'){
+    return console.error('waitRequestReturn--参数错误')
+  }
+  let timer=null
+  if(!flag()){
+    timer=setInterval(()=>{
+      // console.log(flag());
+        if(flag()){
+            clearInterval(timer)
+            callBack()
+        }
+    },+timeout||10)
+  }else{
+    callBack()
+  }
 }

+ 189 - 97
src/views/Login.vue

@@ -65,51 +65,73 @@
 				</el-form-item>
 			</el-form>  -->
 			<div class="login-box" id="login-container" v-if="activeModel!=='forgetPassModel'">
-				<span class="login-title">ETA — 让投研领先市场半步</span>
-				<el-tabs v-model="activeModel" @tab-click="handleClick">
-					<el-tab-pane label="账号登录" name="ordinaryModel">
-						<OrdinaryModel ref="ordinaryModel"
-							:loginCheck="loginCheck"
-							:accountCheck="accountCheck"
-							@clearnHint="clearnHint"
-							@changeModel="changeModel('forgetPassModel')"
-						/>
-					</el-tab-pane>
-					<el-tab-pane label="手机号登录" name="mobileModel">
-						<MobileModel ref="mobileModel"
-							:areaCode="areaCode"
-						/>
-					</el-tab-pane>
-					<!-- <el-tab-pane label="邮箱登录" name="emailModel"> -->
-						<EmailModel ref="emailModel" v-show="activeModel=='emailModel'"/>
-					<!-- </el-tab-pane> -->
-				</el-tabs>
-				<el-button
-					type="primary"
-					size="medium"
-					@click.native="handleLogin"
-					:loading="logining"
-					class="submit_btn"
-					>登录</el-button>
-                <div class="another-login-type">
-                    <div class="another-type-hint">
-                        <div class="type-hint-line"></div>
-                        <div class="type-hint-text">其他登录方式</div>
-                        <div class="type-hint-line"></div>
-                    </div>
-                    <div class="another-type">
-                        <!-- <div class="login-type-item"
-                        > -->
-                            <img src="~@/assets/img/icons/email-login-type.png" @click="activeModel='emailModel';handleClick({name:'emailModel'})" />
-                        <!-- </div> -->
+                <div class="fixed-login-cont">
+                    <span class="login-title">ETA — 让投研领先市场半步</span>
+                    <el-tabs v-model="activeModel" >
+                        <!-- <el-tab-pane label="账号登录" name="ordinaryModel">
+                            <OrdinaryModel ref="ordinaryModel"
+                                :loginCheck="loginCheck"
+                                :accountCheck="accountCheck"
+                                @clearnHint="clearnHint"
+                                @changeModel="changeModel('forgetPassModel')"
+                            />
+                        </el-tab-pane>
+                        <el-tab-pane label="手机号登录" name="mobileModel">
+                            <MobileModel ref="mobileModel"
+                                :areaCode="areaCode"
+                            />
+                        </el-tab-pane> -->
+
+                        <OrdinaryModel ref="ordinaryModel"
+                            :loginCheck="loginCheck"
+                            :accountCheck="accountCheck"
+                            @clearnHint="clearnHint"
+                            @changeModel="changeModel('forgetPassModel')"
+                            v-show="activeModel=='ordinaryModel'"
+                        />
+
+                        <MobileModel ref="mobileModel"
+                            :areaCode="areaCode"
+                            v-show="activeModel=='mobileModel'"
+                        />
+
+                        <EmailModel ref="emailModel" v-show="activeModel=='emailModel'"/>
+                    </el-tabs>
+                    <el-button
+                        type="primary"
+                        size="medium"
+                        @click.native="handleLogin"
+                        :loading="logining"
+                        class="submit_btn"
+                        >登录</el-button>
+                    <div class="another-login-type">
+                        <div class="another-type-hint">
+                            <div class="type-hint-line"></div>
+                            <div class="type-hint-text">其他登录方式</div>
+                            <div class="type-hint-line"></div>
+                        </div>
+                        <div class="another-type">
+                            <div class="login-type-item"
+                                v-for="item in loginTypeIcons"
+                                :key="item.name"
+                                :style="activeModel===item.name?'display: none':''"
+                                @click="activeModel=item.name;handleClick(item)"
+                            >
+                            <div v-html="item.svg"></div>
+                            {{item.label}}
+                            </div>
+                                <!-- <img src="~@/assets/img/icons/email-login-type.png" @click="activeModel='emailModel';handleClick({name:'emailModel'})" /> -->
+                        </div>
                     </div>
                 </div>
 			</div>
 			<div class="login-box" v-else>
-				<ForgetPassModel 
-					ref="forgetPassModel"
-					:autoAccount="$refs.ordinaryModel?$refs.ordinaryModel.form.account:''"
-					@changeModel="changeModel('ordinaryModel')"/>
+                <div class="fixed-login-cont">
+                    <ForgetPassModel 
+                        ref="forgetPassModel"
+                        :autoAccount="$refs.ordinaryModel?$refs.ordinaryModel.form.account:''"
+                        @changeModel="changeModel('ordinaryModel')"/>
+                </div>
 			</div>
 		</div>
 		<!-- 验证弹窗 -->
@@ -153,44 +175,122 @@ import OrdinaryModel from "./login_manage/OrdinaryModel.vue";
 
 export default {
     components: { OrdinaryModel, MobileModel, EmailModel, ForgetPassModel },
-  data() {
-    return {
-        b: new http.Base64(),
-        logining: false, //登录loadding
-        ruleForm: {
-            account: "",
-            checkPass: "",
-        },
-        rules: {
-            account: [
-            {
-                required: true,
-                message: "请输入用户名",
-                trigger: "blur",
+    data() {
+        return {
+            b: new http.Base64(),
+            logining: false, //登录loadding
+            ruleForm: {
+                account: "",
+                checkPass: "",
             },
-            ],
-            checkPass: [
-            {
-                required: true,
-                message: "请输入密码",
-                trigger: "blur",
+            rules: {
+                account: [
+                {
+                    required: true,
+                    message: "请输入用户名",
+                    trigger: "blur",
+                },
+                ],
+                checkPass: [
+                {
+                    required: true,
+                    message: "请输入密码",
+                    trigger: "blur",
+                },
+                ],
             },
-            ],
-        },
-        checked: false, //是否保持登录状态
-        visible: true, //密码输入类型
+            checked: false, //是否保持登录状态
+            visible: true, //密码输入类型
+
+            activeModel: 'ordinaryModel',
+            /* form check 错误提示标识*/
+            loginCheck:false, //账号或密码错误
+            accountCheck:false,//账号异常:多次输错密码、长时间未登录
+            accountForbidden:false,//账号被禁用
+            mobileCheck:false,//手机号未绑定
+            emailCheck:false,//邮箱未绑定
+            areaCode:[],
 
-        activeModel: 'ordinaryModel',
-        /* form check 错误提示标识*/
-        loginCheck:false, //账号或密码错误
-        accountCheck:false,//账号异常:多次输错密码、长时间未登录
-        accountForbidden:false,//账号被禁用
-        mobileCheck:false,//手机号未绑定
-        emailCheck:false,//邮箱未绑定
-        areaCode:[],
+            isCheckDialogShow:false,
+            checkActiveModel:'checkMobileModel',
+            
+            /* 登录方式icon */
+            loginTypeIcons: [
+                {
+                    name: 'ordinaryModel',
+                    label: '账号登录',
+                    svg: `<svg data-v-5b948168="" width="64" height="64" viewBox="0 0 60 64" fill="none" xmlns="http://www.w3.org/2000/svg"><g filter="url(#filter0_d_6575_1450)">
+                        <circle cx="26" cy="25" r="20" fill="white"></circle>
+                        <circle cx="26" cy="25" r="19.75" stroke="#DCDFE6" stroke-width="0.5"></circle>
+                        </g>
+                        <g clip-path="url(#clip0_6575_1450)">
+                        <path d="M30.9555 24.9201C29.6869 26.0392 28.0029 26.7261 26.1469 26.7261C24.2634 26.7261 22.5516 26.0169 21.2775 24.8647C18.3137 25.6402 16.48 28.2883 16.48 31.4516V33.0637C16.48 36.8364 35.5204 36.8364 35.5204 33.0637V31.4516C35.5203 28.3716 33.7809 25.7678 30.9555 24.9201ZM26.1469 25.5794C29.4321 25.5794 32.1023 23.0144 32.1023 19.8457C32.1023 16.677 29.4376 14.1064 26.1469 14.1064C22.8673 14.1064 20.1972 16.677 20.1972 19.8457C20.1972 23.0145 22.8673 25.5794 26.1469 25.5794Z" fill="#0052D9"></path>
+                        </g>
+                        <defs>
+                        <filter id="filter0_d_6575_1450" x="0" y="0" width="52" height="52" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+                        <feFlood flood-opacity="0" result="BackgroundImageFix"></feFlood>
+                        <feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"></feColorMatrix>
+                        <feOffset dy="1"></feOffset>
+                        <feGaussianBlur stdDeviation="3"></feGaussianBlur>
+                        <feComposite in2="hardAlpha" operator="out"></feComposite>
+                        <feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.1 0"></feColorMatrix>
+                        <feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_6575_1450"></feBlend>
+                        <feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_6575_1450" result="shape"></feBlend>
+                        </filter>
+                        <clipPath id="clip0_6575_1450">
+                        <rect width="24" height="24" fill="white" transform="translate(14 13)"></rect>
+                        </clipPath>
+                        </defs></svg>`
+                },
+                {
+                    name:'mobileModel',
+                    label: '手机号登录',
+                    svg: `<svg data-v-5b948168="" width="64" height="64" viewBox="0 0 56 64" fill="none" xmlns="http://www.w3.org/2000/svg">
+                        <g filter="url(#filter0_d_6575_1430)">
+                        <circle cx="26" cy="25" r="20" fill="white"></circle>
+                        <circle cx="26" cy="25" r="19.75" stroke="#DCDFE6" stroke-width="0.5"></circle>
+                        </g>
+                        <path d="M31.7982 13.6985H19.7718C18.6414 13.6985 17.7246 14.6153 17.7246 15.7457V34.2977C17.7246 35.4281 18.6414 36.3449 19.7718 36.3449H24.8262H27.6366H31.7982C32.9286 36.3449 33.8454 35.4281 33.8454 34.2977V15.7457C33.8454 14.6153 32.9286 13.6985 31.7982 13.6985ZM23.8038 15.1577H27.7662C27.963 15.1577 28.1238 15.3185 28.1238 15.5153C28.1238 15.7121 27.963 15.8729 27.7662 15.8729H23.8038C23.607 15.8729 23.4462 15.7121 23.4462 15.5153C23.4462 15.3185 23.607 15.1577 23.8038 15.1577ZM25.7862 33.9689C24.9894 33.9689 24.3438 33.3233 24.3438 32.5265C24.3438 31.7297 24.9894 31.0841 25.7862 31.0841C26.583 31.0841 27.2286 31.7297 27.2286 32.5265C27.2262 33.3233 26.5806 33.9689 25.7862 33.9689ZM32.3478 28.6337C32.3478 28.9169 32.1198 29.1449 31.8366 29.1449H19.7334C19.4502 29.1449 19.2222 28.9169 19.2222 28.6337V17.7377C19.2222 17.4545 19.4502 17.2265 19.7334 17.2265H31.8342C32.1174 17.2265 32.3454 17.4545 32.3454 17.7377V28.6337H32.3478Z" fill="#0052D9"></path>
+                        <defs>
+                        <filter id="filter0_d_6575_1430" x="0" y="0" width="52" height="52" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+                        <feFlood flood-opacity="0" result="BackgroundImageFix"></feFlood>
+                        <feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"></feColorMatrix>
+                        <feOffset dy="1"></feOffset>
+                        <feGaussianBlur stdDeviation="3"></feGaussianBlur>
+                        <feComposite in2="hardAlpha" operator="out"></feComposite>
+                        <feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.1 0"></feColorMatrix>
+                        <feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_6575_1430"></feBlend>
+                        <feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_6575_1430" result="shape"></feBlend>
+                        </filter>
+                        </defs></svg>`
+                },
+                {
+                    name: 'emailModel',
+                    label: '邮箱登录',
+                    svg: `
+                        <svg data-v-5b948168="" width="64" height="64" viewBox="0 4 64 64" fill="none" xmlns="http://www.w3.org/2000/svg">
+                        <g filter="url(#filter0_d_6575_1422)">
+                        <circle cx="32" cy="30" r="20" fill="white"></circle>
+                        <circle cx="32" cy="30" r="19.5" stroke="#DCDFE6"></circle>
+                        </g>
+                        <path d="M41.1382 34.9875C41.1382 37.1966 39.3473 38.9875 37.1382 38.9875H26.8774C24.6683 38.9875 22.8774 37.1966 22.8774 34.9875V28.1164C22.8774 26.864 23.464 25.6839 24.4623 24.9278L31.3139 19.7381C31.517 19.5832 31.7594 19.5 32.0078 19.5C32.2562 19.5 32.4986 19.5832 32.7017 19.7381L39.5533 24.9278C40.5516 25.6839 41.1382 26.864 41.1382 28.1164V34.9875Z" fill="#0052D9"></path>
+                        <path d="M38.682 26.5957C38.682 27.0061 38.4316 27.3751 38.0501 27.5266L33.4963 29.3353C32.5408 29.7148 31.4758 29.7119 30.5224 29.327L25.956 27.4837C25.5853 27.334 25.3425 26.9743 25.3425 26.5745C25.3425 26.033 25.7815 25.594 26.323 25.594H37.6803C38.2335 25.594 38.682 26.0425 38.682 26.5957Z" fill="white"></path>
+                        <defs>
+                        <filter id="filter0_d_6575_1422" x="0" y="0" width="64" height="64" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+                        <feFlood flood-opacity="0" result="BackgroundImageFix"></feFlood>
+                        <feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"></feColorMatrix>
+                        <feOffset dy="2"></feOffset>
+                        <feGaussianBlur stdDeviation="6"></feGaussianBlur>
+                        <feComposite in2="hardAlpha" operator="out"></feComposite>
+                        <feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.1 0"></feColorMatrix>
+                        <feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_6575_1422"></feBlend>
+                        <feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_6575_1422" result="shape"></feBlend>
+                        </filter>
+                        </defs></svg>`
+                },
+            ]
 
-        isCheckDialogShow:false,
-        checkActiveModel:'checkMobileModel'
+        
         };
     },
     created() {
@@ -577,7 +677,7 @@ export default {
 		}
 		.login-title {
 			color: #333;
-			font-size: 38px;
+			font-size: 32px;
 			display: block;
 			text-align: center;
 			margin-bottom: 60px;
@@ -593,6 +693,10 @@ export default {
 			input::-webkit-input-placeholder {
 				color: #595959 !important;
 			}
+            .fixed-login-cont {
+                width: 460px;
+                margin: 0 auto;
+            }
 			.remember {
 				margin: 0px 0 20px;
 			}
@@ -623,6 +727,8 @@ export default {
                     display: flex;
                     align-items: center;
                     justify-content: center;
+                    gap:10%;
+                    margin-top: 20px;
                     img{
                         margin-top: 20px;
                         height: 72px;
@@ -630,19 +736,11 @@ export default {
                         cursor: pointer;
                         // margin-bottom: 4px;
                     }
-					// .login-type-item{
-					// 	display: flex;
-					// 	flex-direction: column;
-					// 	justify-content: center;
-					// 	align-items: center;
-					// 	margin-top: 20px;
-					// 	cursor: pointer;
-	
-					// 	span{
-					// 		font-size: 16px;
-					// 		color: #666666;
-					// 	}
-					// }
+                    .login-type-item {
+                        text-align: center;
+                        color: #666;
+                        cursor: pointer;
+                    }
 				}
 			}
 			.el-input input {
@@ -704,16 +802,10 @@ export default {
 			#login-container ,.login-box{
 				width: 70%;
 				top:15%;
+                left: 50%;
+                transform: translateX(-50%);
 			}
 		}
-		@media screen and (max-width:1440px){
-			#login-container ,.login-box{
-				.login-title{
-					font-size: 32px;
-				}
-			}
-			
-		}
 		@media screen and (max-height:720px) {
 			#login-container ,.login-box{
 				top:20%;

+ 15 - 18
src/views/dataEntry_manage/addChart.vue

@@ -112,14 +112,7 @@
 							placeholder="请选择所属分类"
 						/>
 					</el-form-item>
-					<el-form-item label="图表单位" prop="Unit" v-if="chartInfo.ChartType===7">
-						<!-- <el-input
-							v-model="chartInfo.Unit"
-							style="width: 90%"
-							placeholder="请输入图表单位"
-							clearable
-							@change="changeUnit"
-						/> -->
+					<el-form-item label="图表单位" prop="Unit" v-if="[7,11].includes(chartInfo.ChartType)">
 						<el-select
 							v-model="chartInfo.Unit"
 							filterable
@@ -195,7 +188,8 @@
 						<el-checkbox v-model="tableData[0].IsOrder">逆序</el-checkbox>
 					</div>
 					
-          <el-collapse v-model="activeNames" class="target-list" v-if="tableData.length&&![7,10].includes(chartInfo.ChartType)">
+					<!-- 配置区  柱形 截面 雷达不需要-->
+          <el-collapse v-model="activeNames" class="target-list" v-if="tableData.length&&![7,10,11].includes(chartInfo.ChartType)">
             <el-collapse-item v-for="(item,index) in tableData" :key="item.EdbInfoId" :disabled="[2,5].includes(chartInfo.ChartType)">
               <template slot="title">
                 <span class="text_oneLine">{{item.EdbName}}</span>
@@ -326,14 +320,14 @@
             </el-collapse-item>
           </el-collapse>
 
-					<!-- 奇怪柱状图配置 -->
+					<!-- 奇怪柱状图配置 雷达图也要用 -->
 					<bar-option
-						v-if="chartInfo.ChartType===7"
+						v-if="[7,11].includes(chartInfo.ChartType)"
 						ref="BarOptRef"
 						:chartInfo="chartInfo"
 						:edblist="tableData"
-						:datedata="barDateList"
-						@getData="getBarPreviewData"
+						:datedata="chartInfo.ChartType===7?barDateList:radarChartData.YDataList"
+						@getData="barOptionPreviewMap"
 					/>
 
 					<!-- 截面散点图 -->
@@ -467,7 +461,7 @@
 							</div>
 
 							<!-- 后续新图专用上下限 和其他数据依赖不公用 柱形图 截面散点-->
-							<template v-if="[7,10].includes(chartInfo.ChartType)">	
+							<template v-if="[7,10,11].includes(chartInfo.ChartType)">	
 								<div class="range-cont left">
 									<el-input
 										style="width: 60px; display: block"
@@ -574,7 +568,7 @@
 							align="center"
 						>
 							<template slot-scope="scope">
-								<div v-if="item.key === 'EdbName' && [1,4,6,7].includes(chartInfo.ChartType)">
+								<div v-if="item.key === 'EdbName' && [1,4,6,7,11].includes(chartInfo.ChartType)">
 									<!-- 柱状图用别名 -->
 									<el-input 
 										v-model="scope.row.EdbAliasName"
@@ -685,9 +679,12 @@ export default {
 		tableData: {
       handler(newval, oldval) {
 				if(newval.length) {
-					if([7,10].includes(this.chartInfo.ChartType)) {
+					if([7,10,11].includes(this.chartInfo.ChartType)) {
 						// 奇怪柱形图
 						this.chartInfo.ChartType === 7 && this.barDateList.length && this.$refs.BarOptRef.getBarData();
+
+						//雷达图
+						this.chartInfo.ChartType === 11 && this.$refs.BarOptRef.getBarData();
 				
 					}else {
 						//拼接标题
@@ -739,9 +736,9 @@ export default {
 					// 季节图只允许添加一个指标
 					if(this.chartInfo.ChartType === 2 && this.tableData.length > 1) return this.$message.warning('您选择的图表样式为季节性图表,只支持单指标画图');
 
-					if(this.chartInfo.ChartType === 7 && !this.$refs.BarOptRef.dateList.length)  return this.$message.warning('请添加日期');
+					else if([7,11].includes(this.chartInfo.ChartType)  && !this.$refs.BarOptRef.dateList.length)  return this.$message.warning('请添加日期');
 
-					if(this.chartInfo.ChartType === 10 && !this.$refs.SectionScatterOptRef.seriesArr[0].edbs)  return this.$message.warning('请添加系列指标');
+					else if(this.chartInfo.ChartType === 10 && !this.$refs.SectionScatterOptRef.seriesArr[0].edbs)  return this.$message.warning('请添加系列指标');
 
 					if(this.chartInfo.ChartType === 2){
 						if(!(this.SeasonExtraConfig.XStartDate && this.SeasonExtraConfig.XEndDate)){

+ 9 - 5
src/views/dataEntry_manage/chartSetting.vue

@@ -177,7 +177,7 @@
 					</div>
 
           <el-collapse v-model="activeNames" class="target-list" v-if="tableData.length">
-            <el-collapse-item v-for="(item,index) in tableData" :key="item.EdbInfoId" :disabled="[2,5,7,10].includes(chartInfo.ChartType)">
+            <el-collapse-item v-for="(item,index) in tableData" :key="item.EdbInfoId" :disabled="![1,4,6].includes(chartInfo.ChartType)">
               <template slot="title">
                 <span class="text_oneLine">{{item.EdbName}}</span>
               </template>
@@ -443,7 +443,7 @@
                     </div>
 
                     <!-- 后续新图专用上下限 和其他数据依赖不公用 柱形图 截面散点-->
-                    <template v-if="[7,10].includes(chartInfo.ChartType)">	
+                    <template v-if="[7,10,11].includes(chartInfo.ChartType)">	
                       <div class="range-cont left">
                         <el-input
                           style="width: 60px; display: block"
@@ -1606,7 +1606,8 @@ export default {
 
       const chartTypeMap = {
         7: this.initBarData, //柱形图
-        10: this.initSectionScatterData //截面散点
+        10: this.initSectionScatterData, //截面散点
+        11: this.initRadarData //雷达图
       }
       chartTypeMap[this.chartInfo.ChartType] && chartTypeMap[this.chartInfo.ChartType](res.Data);
 
@@ -1811,12 +1812,14 @@ export default {
             }
             break
           case 7:
+          case 11:
             typeChartParam = {
                ...public_param,
               DateType: 6,
               LeftMin: String(this.chartLimit.min),
               LeftMax: String(this.chartLimit.max),
             }
+            break
           case 10: 
             typeChartParam = {
               ...public_param,
@@ -1829,7 +1832,8 @@ export default {
                 YMinValue: String(this.chartLimit.min),
                 YMaxValue: String(this.chartLimit.max),
               })
-            } 
+            }
+            break
         }
 
         let params = this.sameOptionType.includes(this.selected_chartType)
@@ -2204,7 +2208,7 @@ export default {
         .then((res) => {
           this.refreshLoading.close();
           if (res.Ret === 200) {
-            [7,10].includes(this.chartInfo.ChartType) ? this.getChartDetail() : this.getPreviewChartInfo();
+            [7,10,11].includes(this.chartInfo.ChartType) ? this.getChartDetail() : this.getPreviewChartInfo();
             this.$message.success(res.Msg);
           }
         });

+ 5 - 4
src/views/dataEntry_manage/components/barOptionSection.vue

@@ -2,7 +2,7 @@
   <div class="bar-option-wrapper">
     <template v-if="dateList.length">
       <!-- 排序规则 -->
-      <div v-if="isBaseBarShow">
+      <div v-if="isBaseBarShow&&chartInfo.ChartType===7">
         <div>
           <label style="margin-right: 5px;">排序规则</label> 
           <el-radio-group v-model="sortObj.sort" @change="() => { sortObj.sortIndex= '';changeSort()}">
@@ -141,7 +141,8 @@ export default {
     edblist: Array,
     datedata: Array,
     chartInfo: {
-      type: Object
+      type: Object,
+      default: () => {}
     },
     initData: {
       default: null
@@ -311,8 +312,8 @@ export default {
         Name:  _.Name
       }));
       this.sortObj = {
-        sort: Sort.Sort,
-        sortIndex: Sort.DateIndex
+        sort: Sort?Sort.Sort:0,
+        sortIndex: Sort?Sort.DateIndex:''
       }
     }
   }

+ 2 - 0
src/views/dataEntry_manage/components/chart.vue

@@ -5,9 +5,11 @@
 
 <script>
 import Highcharts from 'highcharts/highstock';
+import HighchartsMore from 'highcharts/highcharts-more';
 import HightchartsExport from 'highcharts/modules/exporting';
 import HighchartszhCN  from '@/utils/highcahrts-zh_CN'
 HighchartszhCN(Highcharts)
+HighchartsMore(Highcharts)
 HightchartsExport(Highcharts)
 const elementResizeDetectorMaker = require("element-resize-detector");//引入监听dom变化的组件
 const erd = elementResizeDetectorMaker();

+ 50 - 47
src/views/dataEntry_manage/components/markersSection.vue

@@ -1,57 +1,60 @@
 <template>
   <div class="chart-markers-section">
-    <!-- 标示线 -->
-    <div class="section-item">
-      <ul class="marker-list"  v-if="markerLinesArr.length">
-        <li class="marker-item" v-for="(item,index) in markerLinesArr" :key="index">
-          <span>{{item.axisName}}: {{item.value}}</span>
-          <div style="flex-shrink:0">
-            <i class="el-icon-view icon" :style="item.isShow?'color:#0052D9':'color:#999'" @click="item.isShow=!item.isShow;updateChartHandle()"/>
-            <i class="el-icon-edit icon" style="margin:0 6px" @click="openMarkerDiaHandle('line',index+1)"/>
-            <i class="el-icon-delete icon" @click="markerLinesArr.splice(index,1);updateChartHandle()"/>
-          </div>
-        </li>
-      </ul>
+    <!-- 雷达不要 -->
+    <template v-if="chartInfo.ChartType!==11">
+      <!-- 标示线 -->
+      <div class="section-item">
+        <ul class="marker-list"  v-if="markerLinesArr.length">
+          <li class="marker-item" v-for="(item,index) in markerLinesArr" :key="index">
+            <span>{{item.axisName}}: {{item.value}}</span>
+            <div style="flex-shrink:0">
+              <i class="el-icon-view icon" :style="item.isShow?'color:#0052D9':'color:#999'" @click="item.isShow=!item.isShow;updateChartHandle()"/>
+              <i class="el-icon-edit icon" style="margin:0 6px" @click="openMarkerDiaHandle('line',index+1)"/>
+              <i class="el-icon-delete icon" @click="markerLinesArr.splice(index,1);updateChartHandle()"/>
+            </div>
+          </li>
+        </ul>
+
+        <div
+          class="add-cont"
+          @click="openMarkerDiaHandle('line')"
+        >
+          <img
+            src="~@/assets/img/set_m/add_ico.png"
+            alt=""
+            style="width: 16px; height: 16px; margin-right: 10px"
+          />
+          <span>添加标识线</span>
+        </div>
 
-      <div
-        class="add-cont"
-        @click="openMarkerDiaHandle('line')"
-      >
-        <img
-          src="~@/assets/img/set_m/add_ico.png"
-          alt=""
-          style="width: 16px; height: 16px; margin-right: 10px"
-        />
-        <span>添加标识线</span>
       </div>
 
-    </div>
+      <!-- 标识区 -->
+      <div class="section-item">
+        <ul class="marker-list" v-if="markerAreasArr.length">
+          <li class="marker-item" v-for="(item,index) in markerAreasArr" :key="index">
+            <span>{{item.axisName}}: {{`${item.fromValue}至${item.toValue}`}}</span>
+            <div style="flex-shrink:0">
+              <i class="el-icon-view icon" :style="item.isShow?'color:#0052D9':'color:#999'" @click="item.isShow=!item.isShow;updateChartHandle()"/>
+              <i class="el-icon-edit icon" style="margin:0 6px" @click="openMarkerDiaHandle('area',index+1)"/>
+              <i class="el-icon-delete icon" @click="markerAreasArr.splice(index,1);updateChartHandle()"/>
+            </div>
+          </li>
+        </ul>
+        <div
+          class="add-cont"
+          @click="openMarkerDiaHandle('area')"
+        >
+          <img
+            src="~@/assets/img/set_m/add_ico.png"
+            alt=""
+            style="width: 16px; height: 16px; margin-right: 10px"
+          />
+          <span>添加标识区</span>
+        </div>
 
-    <!-- 标识区 -->
-    <div class="section-item">
-      <ul class="marker-list" v-if="markerAreasArr.length">
-        <li class="marker-item" v-for="(item,index) in markerAreasArr" :key="index">
-          <span>{{item.axisName}}: {{`${item.fromValue}至${item.toValue}`}}</span>
-          <div style="flex-shrink:0">
-            <i class="el-icon-view icon" :style="item.isShow?'color:#0052D9':'color:#999'" @click="item.isShow=!item.isShow;updateChartHandle()"/>
-            <i class="el-icon-edit icon" style="margin:0 6px" @click="openMarkerDiaHandle('area',index+1)"/>
-            <i class="el-icon-delete icon" @click="markerAreasArr.splice(index,1);updateChartHandle()"/>
-          </div>
-        </li>
-      </ul>
-      <div
-        class="add-cont"
-        @click="openMarkerDiaHandle('area')"
-      >
-        <img
-          src="~@/assets/img/set_m/add_ico.png"
-          alt=""
-          style="width: 16px; height: 16px; margin-right: 10px"
-        />
-        <span>添加标识区</span>
       </div>
-
-    </div>
+    </template>
 
     <!-- 图表说明 -->
     <div class="section-item">

+ 16 - 10
src/views/dataEntry_manage/editChart.vue

@@ -120,7 +120,7 @@
 							placeholder="请选择所属分类"
 						/>
 					</el-form-item>
-					<el-form-item label="图表单位" prop="Unit" v-if="chartInfo.ChartType===7">
+					<el-form-item label="图表单位" prop="Unit" v-if="[7,11].includes(chartInfo.ChartType)">
 						<el-select
 							v-model="chartInfo.Unit"
 							filterable
@@ -196,7 +196,7 @@
 						<el-checkbox v-model="tableData[0].IsOrder">逆序</el-checkbox>
 					</div>
 
-          <el-collapse v-model="activeNames" class="target-list" v-if="tableData.length&&![7,10].includes(chartInfo.ChartType)">
+          <el-collapse v-model="activeNames" class="target-list" v-if="tableData.length&&![7,10,11].includes(chartInfo.ChartType)">
             <el-collapse-item v-for="(item,index) in tableData" :key="item.EdbInfoId" :disabled="[2,5].includes(chartInfo.ChartType)">
               <template slot="title">
                 <span class="text_oneLine">{{item.EdbName}}</span>
@@ -317,13 +317,13 @@
 
 					<!-- 奇怪柱状图配置 -->
 					<bar-option
-						v-if="chartInfo.ChartType===7"
+						v-if="[7,11].includes(chartInfo.ChartType)"
 						ref="BarOptRef"
 						:chartInfo="chartInfo"
 						:edblist="tableData"
-						:datedata="barDateList"
-						:initData="initBarOptions"
-						@getData="getBarPreviewData"
+						:datedata="chartInfo.ChartType===7?barDateList:radarChartData.YDataList"
+						:initData="chartInfo.ChartType===7?initBarOptions:(chartInfo.ExtraConfig&&JSON.parse(chartInfo.ExtraConfig))"
+						@getData="barOptionPreviewMap"
 					/>
 
 					<!-- 截面散点图 -->
@@ -458,7 +458,7 @@
 							</div>
 
 							<!-- 后续新图专用上下限 和其他数据依赖不公用 柱形图 截面散点-->
-							<template v-if="[7,10].includes(chartInfo.ChartType)">	
+							<template v-if="[7,10,11].includes(chartInfo.ChartType)">	
 								<div class="range-cont left">
 									<el-input
 										style="width: 60px; display: block"
@@ -563,7 +563,7 @@
 							align="center"
 						>
 							<template slot-scope="scope">
-								<div v-if="item.key === 'EdbName' && [1,4,6,7].includes(chartInfo.ChartType)">
+								<div v-if="item.key === 'EdbName' && [1,4,6,7,11].includes(chartInfo.ChartType)">
 									<!-- 奇怪柱状图用别名 -->
 									<el-input 
 										v-model="scope.row.EdbAliasName"
@@ -682,9 +682,12 @@ export default {
 		tableData: {
       handler(newval, oldval) {
 				if(newval) {
-					if([7,10].includes(this.chartInfo.ChartType)) {
+					if([7,10,11].includes(this.chartInfo.ChartType)) {
 						// 奇怪柱形图
 						this.chartInfo.ChartType === 7 && this.barDateList.length && this.$refs.BarOptRef && this.$refs.BarOptRef.getBarData();
+
+						//雷达图
+						this.chartInfo.ChartType === 11 && this.$refs.BarOptRef && this.$refs.BarOptRef.getBarData();
 					}else {
 						this.setAddChartDefault();
 						newval.length && !this.chartInfo.WarnMsg && this.setChartOptionHandle(newval);
@@ -732,7 +735,7 @@ export default {
           this.chartInfo = {
 						...ChartInfo,
 						classify: [ChartInfo.ChartClassify[0].ParentId,...ChartInfo.ChartClassify.map(item => item.ChartClassifyId)],
-						Unit: BarChartInfo ? BarChartInfo.Unit : '',
+						Unit: ChartInfo.ChartType===7 ? BarChartInfo.Unit : ChartInfo.Unit,
 						SourcesFromVisable: ChartInfo.SourcesFrom ? JSON.parse(ChartInfo.SourcesFrom).isShow : true
 					};
 					//处理下历史默认来源
@@ -758,6 +761,9 @@ export default {
 
 					//截面散点图
 					this.chartInfo.ChartType === 10 && this.initSectionScatterData(res.Data);
+
+					//雷达图
+					this.chartInfo.ChartType === 11 && this.initRadarData(res.Data);
 					
 					this.getThemeList();
 

+ 79 - 25
src/views/dataEntry_manage/mixins/addOreditMixin.js

@@ -53,6 +53,7 @@ export default {
         { label: '组合图', key: 6 },
 				{ label: '柱形图',key: 7 },
 				{ label: '截面散点图',key: 10 },
+				{ label: '雷达图',key: 11 },
       ], //图表样式
 
 
@@ -138,7 +139,7 @@ export default {
 				this.getThemeList('init')
 
 				//柱形图 截面散点切换到普通图 依赖的指标信息其实只有信息无数据 需清空
-				if([7,10].includes(oldval)&&![7,10].includes(newval)) {
+				if([7,10,11].includes(oldval)&&![7,10,11].includes(newval)) {
 					this.tableData = [];
 					this.chartInfo.LeftMax = '';
 					this.chartInfo.LeftMin = '';
@@ -149,7 +150,7 @@ export default {
 				this.initStatus();
 
 				//共用结构的类型切换可以直接画图
-				if(![7,10].includes(newval)) {
+				if(![7,10,11].includes(newval)) {
 					//单指标允许切换到季节图需药重新请求数据
 					this.tableData.length===1 && this.selectTarget(this.tableData[0],'switch');
 					this.tableData.length > 1 && this.setChartOptionHandle(this.tableData);
@@ -163,26 +164,9 @@ export default {
 		selectTarget(item,type='') {
 			if(!item) return
 
-			/* 正常图获取指标数据 柱形图不获取 */
-			if(this.chartInfo.ChartType === 7) return this.setBarEdbList(item);
-				// let params = this.sameOptionType.includes(this.chartInfo.ChartType) 
-				// 	? {
-				// 		EdbInfoId: item.EdbInfoId,
-				// 		ChartType: this.chartInfo.ChartType,
-				// 		DateType: this.year_select,
-				// 		StartDate:
-				// 			this.year_select === 5 || this.year_select === 6
-				// 				? this.select_date[0]
-				// 				: '',
-				// 		EndDate: this.year_select === 5 ? this.select_date[1] : '',
-				// 	} 
-				// 	: {
-				// 		EdbInfoId: item.EdbInfoId,
-				// 		ChartType: this.chartInfo.ChartType,
-				// 		Calendar: this.calendar_type,
-				// 		SeasonStartDate: '',
-				// 		SeasonEndDate: '',
-				// 	};
+			/* 正常图获取指标数据 柱形图 雷达图不获取 */
+			if([7,11].includes(this.chartInfo.ChartType)) return this.setBarEdbList(item);
+
 				let dateArray=this.chartInfo.ChartType==2?this.season_year:this.select_date
 
 				let params = {
@@ -255,7 +239,7 @@ export default {
 
 		},
 
-		/* 添加柱形图表格 */
+		/* 添加柱形图 /雷达图指标数组 */
 		setBarEdbList(edb) {
 			let have_bol = this.tableData.some(item => item.EdbInfoId === edb.EdbInfoId);
 
@@ -265,7 +249,16 @@ export default {
 			this.search_txt = '';
 			this.chartInfo.Unit = this.chartInfo.Unit||edb.Unit
 			this.tableData.push(edb)
+		},
 
+		/* 奇怪柱形图的日期配置项现在不止柱形图用了 获取数据时扩展一下 */
+		barOptionPreviewMap(data) {
+			let tyepeMapApi = {
+				7: this.getBarPreviewData,//柱形图
+				11: this.getRadarPreviewData//雷达图
+			}
+
+			tyepeMapApi[this.chartInfo.ChartType](data);
 		},
 
 		/* 获取bar数据 */
@@ -314,6 +307,49 @@ export default {
 			})
 		},
 
+		/* 获取雷达图预览数据 */
+		async getRadarPreviewData({dateList}) {
+			if(this.tableData.length<3 || !dateList.length) return
+			
+			let parmas = {
+				ChartEdbInfoList: this.tableData.map(_ => ({
+					EdbInfoId: _.EdbInfoId,
+					EdbAliasName:_.EdbAliasName
+				})),
+				ExtraConfig: JSON.stringify({ DateList: dateList})
+			}
+
+			const res = await dataBaseInterface.getRadarPreviewData(parmas)
+
+			if(res.Ret!==200) return 
+
+			const { DataResp,EdbInfoList,ChartInfo } = res.Data;
+			this.chartInfo = {
+				...this.chartInfo,
+				ChartSource: ChartInfo.ChartSource
+			}
+			
+			this.radarChartData = {
+				YDataList: DataResp.YDataList,
+				XDataList: EdbInfoList.filter(_ => DataResp.XEdbIdValue.includes(_.EdbInfoId))
+			}
+
+			// //初始状态设置上下限极值
+			if(!this.chartInfo.LeftMin) {
+				const value_arr = this.radarChartData.YDataList.map(_ => _.Value).flat(Infinity)
+
+				this.chartLimit = {
+					min: Math.min(...value_arr),
+					max: Math.max(...value_arr)
+				}
+			}
+
+			//默认来源搞一下
+			this.setDefaultSourceFrom();
+
+			this.setRadarChart()
+		},
+
 		/* 曲线图切换筛选项时请求数据 */
 		async getPreviewSplineInfo() {
 			let dateArray=this.chartInfo.ChartType==2?this.season_year:this.select_date
@@ -683,10 +719,27 @@ export default {
 							}))
 						})
 					}	
+				case 11: 
+					return {
+						...public_param,
+						DateType: 6,
+						Unit: this.chartInfo.Unit,
+						LeftMin: String(this.chartLimit.min),
+						LeftMax: String(this.chartLimit.max),
+						ExtraConfig: JSON.stringify({
+							DateList: this.$refs.BarOptRef.dateList.map(item => ({
+								Type: item.Type,
+								Date: item.Date,
+								Value: item.Value,
+								Name: item.Name,
+								Color: item.Color
+							})),
+						})
+					}
 			}
 		},
 
-		/* 奇怪柱形图更新单位 */
+		/* 更新单位 */
 		changeUnit(val) {
 			if(!this.options.series) return
 
@@ -862,7 +915,8 @@ export default {
 			
 			const chartTypeMap = {
         7: this.setBarChart, //柱形图
-        10: this.setSectionScatterChart //截面散点
+        10: this.setSectionScatterChart, //截面散点
+				11: this.setRadarChart  //雷达图
       }
       chartTypeMap[this.chartInfo.ChartType] 
 				? chartTypeMap[this.chartInfo.ChartType]() 

+ 121 - 2
src/views/dataEntry_manage/mixins/chartPublic.js

@@ -189,7 +189,10 @@ export const chartSetMixin = {
 			},
 
       /* 跨品种分析图 */
-      crossVarietyChartData: {}
+      crossVarietyChartData: {},
+
+      /* 雷达图 */
+      radarChartData: {}
 		}
 	},
   watch: {
@@ -1797,6 +1800,121 @@ export const chartSetMixin = {
       this.currentLang=='en' && this.changeOptions()
     },
 
+    //雷达图数据初始化
+    initRadarData(data) {
+      const { DataResp,EdbInfoList,ChartInfo } = data;
+
+      this.leftIndex = -1;
+      this.rightIndex = -1;
+      this.rightTwoIndex = -1;
+      
+      this.radarChartData = {
+				YDataList: DataResp.YDataList,
+				XDataList: EdbInfoList.filter(_ => DataResp.XEdbIdValue.includes(_.EdbInfoId))
+			}
+      this.chartLimit = {
+        min: Number(ChartInfo.LeftMin),
+        max: Number(ChartInfo.LeftMax)
+      }
+
+      this.setRadarChart();
+    },
+    /*雷达图绘图*/
+    setRadarChart() {
+      const { YDataList,XDataList } = this.radarChartData;
+
+      /* 主题样式*/
+      const chartTheme =  this.chartInfo.ChartThemeStyle ? JSON.parse(this.chartInfo.ChartThemeStyle) : null;
+
+      //x轴
+      let xAxis = {
+        lineWidth: 0,
+        tickLength: 0,
+        tickmarkPlacement: 'on',
+        categories: XDataList.map(_ => _.EdbAliasName||_.EdbName),
+        labels: {
+          allowOverlap: true,
+          autoRotationLimit: 40,
+          distance: 20,
+          style: {
+            ...chartTheme&&chartTheme.xAxisOptions.style
+          }
+        }
+      }
+
+      //y轴
+      const { max,min } = this.chartLimit;
+      let yAxis = [{
+        gridLineInterpolation: 'polygon',
+        gridLineWidth: 1,
+        lineWidth: 0,
+        endOnTick: false,
+        startOnTick: false,
+        showLastLabel: true,
+        // tickAmount:4,
+        title: {
+          text:  this.chartInfo.Unit,
+          textCh: this.chartInfo.Unit,
+          textEn: this.chartInfo.UnitEn,
+          align: 'high',
+          rotation: 0,
+          y: 5,
+          x:10,
+          textAlign: 'left',
+          reserveSpace: false,
+          style:{
+            ...chartTheme&&chartTheme.yAxisOptions.style
+          },
+        },
+        labels: {
+          allowOverlap: true,
+          style:{
+            ...chartTheme&&chartTheme.yAxisOptions.style
+          }
+        },
+        min: Number(min),
+        max: Number(max),
+      }]
+
+      //系列
+      let series = [];
+      YDataList.forEach(item => {
+        let serie_item = {
+          data: item.Value,
+          pointPlacement: 'on',
+          type: (chartTheme&&chartTheme.lineOptions.lineType) || 'line',
+          dashStyle: (chartTheme&&chartTheme.lineOptions.dashStyle)||'Solid',
+          yAxis: 0,
+          name: item.Name || item.Date,
+          nameCh: item.Name || item.Date,
+          nameEn: item.Date,
+          color: item.Color,
+          lineWidth: (chartTheme&&chartTheme.lineOptions.lineWidth) || 1,
+          chartType: 'linear'
+        };
+        series.push(serie_item)
+      })
+
+      this.options = {
+        chart: {
+          ...defaultOpts.chart,
+					...chartTheme.drawOption,
+          spacing: [2,10,2,10],
+          polar:true,
+        },
+        title: {
+          text:''
+        },
+        pane: {
+          size: '80%'
+        },
+        series,
+        yAxis,
+        xAxis
+      }
+      this.currentLang=='en' && this.changeOptions();
+    },
+
 
     /* 统计频率图 */
     setStatisticFrequency() {
@@ -2319,7 +2437,8 @@ export const chartSetMixin = {
       //source1 eta图库的类型对应
       const typeMap = {
         7: this.setBarChart,
-        10: this.setSectionScatterChart
+        10: this.setSectionScatterChart,
+        11: this.setRadarChart
       }
       //其他source
       const sourceMap = {

+ 279 - 0
src/views/dataEntry_manage/thirdBase/gqExchangeData.vue

@@ -0,0 +1,279 @@
+<template>
+    <div class="exchangedata-wrap">
+        <span class="slide-btn-icon" :class="{'slide-left':isLeftWrapShow,'slide-right':!isLeftWrapShow}"
+        @click="isLeftWrapShow = !isLeftWrapShow">
+            <i :class="{'el-icon-d-arrow-left':isLeftWrapShow,'el-icon-d-arrow-right':!isLeftWrapShow}"></i>
+        </span>
+        <div class="left-wrap box" v-show="isLeftWrapShow">
+            <el-date-picker  style="width:100%"  v-model="time" type="date" placeholder="选择日期"
+            value-format="yyyy-MM-dd" :clearable="false" @change="handleTimeChange">
+            </el-date-picker>
+            <div class="scroll-wrap">
+                <el-tree ref="treeRef" class="target_tree custom-tree" :data="typeList" 
+                node-key="BaseFromTradeGuangzhouClassifyId" :default-expanded-keys="defaultShowNodes"
+                :props="{
+                    label: 'ClassifyName',
+                    children: 'Children',
+                }"
+                :current-node-key="type" empty-text="暂无分类" @current-change="handleChangeType">
+                    <span slot-scope="{ node, data }">{{ data.ClassifyName }}</span>
+                </el-tree>
+            </div>
+        </div>
+        <div class="right-wrap box" v-loading="loading" element-loading-text="拼命加载中" element-loading-spinner="el-icon-loading">
+            <el-button v-if="list.length>0 && haveSummation && (!summationView)" 
+                class="export-button" type="primary" plain @click="excelExport" :loading="exportBtnload">导出Excel</el-button>
+            <div class="content" v-if="list.length>0">
+                <table width="auto" border="0">
+                    <thead class="border-head">
+                        <tr>
+                            <td v-for="(val,index) in labelArr" :key="`${val}_${index}`">
+                                {{ val }}
+                            </td>
+                            <td v-if="haveSummation && summationView">操作</td>
+                        </tr>
+                    </thead>
+                    <tbody>
+                        <tr v-for="item in list" :key="item.BaseFromTradeGuangzhouIndexId">
+                            <td v-for="(val,key) in labelArr" :key="key">{{item[key]}}</td>
+                            <td v-if="haveSummation && summationView">
+                                <el-button type="text" @click="detailView(item)">查看详情</el-button>
+                            </td>
+                        </tr>
+                    </tbody>
+                </table>
+            </div>
+            <div class="empty-wrap" v-else>
+                <tableNoData text="暂无数据"/>
+            </div>
+            <div class="num-warp" v-if="numList.length>0">
+                <div v-for="item in numList" :key="item.BaseFromTradeGuangzhouContractId" 
+                :class="['num-box',num===item.BaseFromTradeGuangzhouContractId&&'num-active']" @click="handleChangeNum(item)">
+                    {{item.Contract}}
+                </div>
+            </div>
+        </div>
+    </div>
+</template>
+
+<script>
+// 广期所数据
+import { guangqiInterface } from "@/api/api.js";
+import {waitRequestReturn} from '@/utils/common.js'
+export default {
+    name: "gqExchangeData",
+    data() {
+        return {
+            isLeftWrapShow:true,
+            labelArr: {
+                IndexCode: "指标ID",
+                IndexName: "指标名称",
+                Value: "数值",
+                Unit: "单位",
+                Frequency: "频度",
+                StartDate: "起始日期",
+                EndDate: "最新日期",
+                // Operations:"操作"
+            },
+            summationView:true,// 当前是否是合计
+            haveSummation:false, // 是否有合计
+            time:'',
+            topLevelType:'',
+            type:'',
+            typeList:[],
+            defaultShowNodes:[],
+            numList:[],
+            num:'',
+            list:[],
+            loading:false,
+            tradeIndexId:'',
+            exportApi:process.env.VUE_APP_API_ROOT + "/data_source/gfex/index/detail/export",
+            exportBtnload:false
+        };
+    },
+    watch:{
+        type(value){
+            this.summationView=true
+        },
+        time(value){
+            this.summationView=true
+        }
+    },
+    computed:{
+        exportUrl(){
+            let url=this.exportApi + 
+                `?${localStorage.getItem("auth") || ""}&BaseFromTradeGuangzhouIndexId=${this.tradeIndexId}&TradeDate=${this.time}`
+            return this.escapeStr(url);
+        }
+    },
+    created () {
+        this.getClassifyListFun()  
+        this.getNewtestDateFun()  
+        waitRequestReturn(()=> this.type && this.time,this.getNumList,10)
+    },
+    methods: {
+        escapeStr(str) {
+            return str.replace(/#/g, escape("#")).replace(/;/g, escape(";"));
+        },
+        handleChangeNum(e){
+            this.num=e.BaseFromTradeGuangzhouContractId
+            this.getData()
+        },
+
+        // 时间切换
+        handleTimeChange(){
+            this.getNumList()
+        },
+
+        // 获取分类
+        getClassifyListFun(){
+            guangqiInterface.getClassifyList().then(res=>{
+                if(res.Ret===200){
+                    this.typeList=res.Data || []
+                    try {
+                        this.type=this.typeList[0].Children[0].BaseFromTradeGuangzhouClassifyId
+                        this.topLevelType = this.typeList[0].BaseFromTradeGuangzhouClassifyId
+                        this.$nextTick(() => {
+                            this.$refs.treeRef.setCurrentKey(this.type);
+                        });
+                        this.defaultShowNodes=[this.typeList[0].BaseFromTradeGuangzhouClassifyId,this.typeList[0].Children[0].BaseFromTradeGuangzhouClassifyId]
+                    } catch (error) {
+                        console.error('Data的返回存在问题或为空');
+                    }
+                }
+            })
+        },
+        // 获取最新日期
+        getNewtestDateFun(){
+            guangqiInterface.getNewtestDate().then(res=>{
+                if(res.Ret == 200){
+                    this.time=res.Data || this.$moment(new Date()).format('YYYY-MM-DD')
+                }
+            })
+        },
+        handleChangeType(data, node) {
+            if (data.BaseFromTradeGuangzhouClassifyId == this.type || (!data.ParentId)) return;
+            this.type = data.BaseFromTradeGuangzhouClassifyId
+            this.topLevelType = data.ParentId
+            this.getNumList()
+        },
+        // 获取合约号
+        async getNumList(){
+            this.loading=true
+            guangqiInterface.getContractList({
+                BaseFromTradeGuangzhouClassifyId:this.type,
+                TradeDate:this.time,
+            }).then(res=>{
+                if(res.Ret===200){
+                    this.numList=res.Data||[]
+                    this.num=this.numList[0]?this.numList[0].BaseFromTradeGuangzhouContractId||'':''
+                    this.getData()
+                }else{
+                    this.loading=false
+                }
+            }).catch(()=>{
+                this.loading=false
+            })
+        },
+        getData(){
+            $('.content').animate({scrollTop:0},0)
+            this.loading=true
+            guangqiInterface.getIndexDataList({
+                BaseFromTradeGuangzhouClassifyId:this.type,
+                TradeDate:this.time,
+                BaseFromTradeGuangzhouContractId:this.num
+            }).then(res =>{
+                if(res.Ret===200){
+                    this.list=res.Data || []
+                }
+            }).finally(()=>{
+                this.haveSummation = this.topLevelType == 4
+                this.loading=false
+            })
+        },
+        detailView(item){
+            this.loading=true
+            this.tradeIndexId = item.BaseFromTradeGuangzhouIndexId
+            let params={
+                BaseFromTradeGuangzhouIndexId:item.BaseFromTradeGuangzhouIndexId,
+                TradeDate:this.time
+            }
+            guangqiInterface.getIndexDataDetail(params).then(res=>{
+                if(res.Ret == 200){
+                    this.list=res.Data || []
+                    this.summationView=false
+                }
+            })
+            .finally(()=>{
+                this.loading=false
+            })
+        },
+        excelExport(){
+            this.exportBtnload = true;
+            const link = document.createElement("a");
+            link.href = this.exportUrl;
+            link.download = "";
+            link.click();
+            setTimeout(() => {
+                this.exportBtnload = false;
+            }, 2000);
+        }
+    }
+};
+</script>
+
+<style lang="scss" scoped>
+@import "../css/exchangedata.scss";
+
+.exchangedata-wrap{
+    .right-wrap{
+        display: flex;
+        flex-direction: column;
+        .export-button{
+            align-self: flex-start;
+            padding:0 40px;
+            margin-bottom: 20px;
+            height: 40px;
+        }
+        .content{
+            flex-grow: 1;
+            min-height: 90%;
+        }
+        .empty-wrap{
+            min-height: 90%;
+            flex-grow: 1;
+        }
+    }
+    .slide-btn-icon{
+        &.slide-left{
+            left:285px;
+        }
+        &.slide-right{
+            left: 0;
+        }
+      }
+    .left-wrap{
+        width: 300px;
+    }
+}
+
+.scroll-wrap {
+    margin: 20px 0;
+    height: calc(100vh - 250px);
+    overflow-y: auto;
+    .target_tree {
+        color: #333;
+    }
+}
+
+thead{
+    position: sticky;
+    top: 0;
+    left: 0;
+    border-top: 1px solid #dcdfe6;
+}
+</style>
+<style lang="scss">
+@import "../css/customtree.scss";
+
+</style>

+ 15 - 0
src/views/datasheet_manage/addSheet.vue

@@ -175,6 +175,14 @@ export default {
       }
       const res = await sheetInterface.sheetEdit(params)
       if(res.Ret !==200) return
+
+      if(res.Data.Status==1){
+        this.$message.warning(res.Data.Msg)
+        setTimeout(()=>{
+          this.backHandle()
+        },1000)
+        return 
+      }
       this.updateTime = this.$moment().format('YYYY-MM-DD HH:mm:ss')
 
       // console.log("自动保存");
@@ -214,6 +222,13 @@ export default {
 
       this.loading.close()
       if(res.Ret !==200) return
+      if(res.Data.Status==1){
+        this.$message.warning(res.Data.Msg)
+        setTimeout(()=>{
+          this.backHandle()
+        },1000)
+        return 
+      }
       this.updateTime = this.$moment().format('YYYY-MM-DD HH:mm:ss')
       
       this.sheetId = this.sheetId || res.Data.ExcelInfoId;

+ 34 - 20
src/views/datasheet_manage/customSheetEdit.vue

@@ -112,12 +112,12 @@ export default {
             this.permissionBtn.isShowBtn('etaTablePermission','etaTable_customize_data_save')
     }
   },
-  beforeRouteLeave(to,from,next){
-    if(to.path!='/addMixedSheet'){
-      this.markFinishStatus()
-    }
-    next()
-  },
+  // beforeRouteLeave(to,from,next){
+  //   if(to.path!='/addMixedSheet'){
+  //     this.markFinishStatus()
+  //   }
+  //   next()
+  // },
   data() {
     return {
       sheetId: this.$route.query.id || '',
@@ -232,9 +232,17 @@ export default {
         Source: 3,
         TableData: this.$refs.customTableRef.getSaveParams()
       };
-      console.log("自动保存");
+      // console.log("自动保存");
       const res = await sheetInterface.sheetEdit({ ExcelInfoId: Number(this.sheetId),...params })
       if(res.Ret !==200) return
+
+      if(res.Data.Status==1){
+        this.$message.warning(res.Data.Msg)
+        setTimeout(()=>{
+          this.backHandle()
+        },1000)
+        return 
+      }
       this.saveTime = this.$moment().format('YYYY-MM-DD HH:mm:ss')
     },1500),
     /* 保存表格 */
@@ -274,7 +282,13 @@ export default {
       : await sheetInterface.sheetAdd(params)
 
       if(res.Ret !==200) return
-
+      if(res.Data.Status==1){
+        this.$message.warning(res.Data.Msg)
+        setTimeout(()=>{
+          this.backHandle()
+        },1000)
+        return 
+      }
       this.sheetId = this.sheetId || res.Data.ExcelInfoId;
       this.$message.success('保存成功')
       this.saveTime =  this.$moment().format('YYYY-MM-DD HH:mm:ss')
@@ -289,23 +303,23 @@ export default {
       //   }
       // })
     },300),
-    markFinishStatus(){
-      if((!this.sheetId) || (!this.isCanEdit)) return
-      sheetInterface.markSheetEditStatus({ExcelInfoId: +this.sheetId,Status:2}).then(res=>{
-        if(res.Ret != 200) return 
-      })
-    }
+    // markFinishStatus(){
+    //   if((!this.sheetId) || (!this.isCanEdit)) return
+    //   sheetInterface.markSheetEditStatus({ExcelInfoId: +this.sheetId,Status:2}).then(res=>{
+    //     if(res.Ret != 200) return 
+    //   })
+    // }
   },
   created() {
     this.getClassify();
     this.getDetail();
   },
-  mounted(){
-    window.addEventListener('beforeunload',this.markFinishStatus)
-  },
-  beforeDestroy(){
-    window.removeEventListener('beforeunload',this.markFinishStatus)
-  }
+  // mounted(){
+  //   window.addEventListener('beforeunload',this.markFinishStatus)
+  // },
+  // beforeDestroy(){
+  //   window.removeEventListener('beforeunload',this.markFinishStatus)
+  // }
 }
 </script>
 <style scoped lang="scss">

+ 32 - 18
src/views/datasheet_manage/mixedSheetEdit.vue

@@ -86,12 +86,12 @@ export default {
               this.permissionBtn.isShowBtn('etaTablePermission','etaTable_customize_mix_save')
     }
   },
-  beforeRouteLeave(to,from,next){
-    if(to.path!='/addMixedSheet'){
-      this.markFinishStatus()
-    }
-    next()
-  },
+  // beforeRouteLeave(to,from,next){
+  //   if(to.path!='/addMixedSheet'){
+  //     this.markFinishStatus()
+  //   }
+  //   next()
+  // },
   data() {
     return {
       sheetId: this.$route.query.id || '',
@@ -181,6 +181,13 @@ export default {
       console.log("自动保存");
       const res = await sheetInterface.sheetEdit({ ExcelInfoId: Number(this.sheetId),...params })
       if(res.Ret !==200) return
+      if(res.Data.Status==1){
+        this.$message.warning(res.Data.Msg)
+        setTimeout(()=>{
+          this.backHandle()
+        },1000)
+        return 
+      }
       this.updateTime = this.$moment().format('YYYY-MM-DD HH:mm:ss')
     },1500),
 
@@ -220,6 +227,13 @@ export default {
       : await sheetInterface.sheetAdd(params)
 
       if(res.Ret !==200) return
+      if(res.Data.Status==1){
+        this.$message.warning(res.Data.Msg)
+        setTimeout(()=>{
+          this.backHandle()
+        },1000)
+        return 
+      }
       this.updateTime = this.$moment().format('YYYY-MM-DD HH:mm:ss')
       
       this.sheetId = this.sheetId || res.Data.ExcelInfoId;
@@ -227,23 +241,23 @@ export default {
       isAdd && this.$router.replace({path:'/addMixedSheet',query:{id:this.sheetId}})
     },300),
 
-    markFinishStatus(){
-      if((!this.sheetId) || (!this.isCanEdit)) return
-      sheetInterface.markSheetEditStatus({ExcelInfoId: +this.sheetId,Status:2}).then(res=>{
-        if(res.Ret != 200) return 
-      })
-    }
+    // markFinishStatus(){
+    //   if((!this.sheetId) || (!this.isCanEdit)) return
+    //   sheetInterface.markSheetEditStatus({ExcelInfoId: +this.sheetId,Status:2}).then(res=>{
+    //     if(res.Ret != 200) return 
+    //   })
+    // }
   },
   created() {
     this.getClassify();
     this.getDetail();
   },
-  mounted(){
-    window.addEventListener('beforeunload',this.markFinishStatus)
-  },
-  beforeDestroy(){
-    window.removeEventListener('beforeunload',this.markFinishStatus)
-  }
+  // mounted(){
+  //   window.addEventListener('beforeunload',this.markFinishStatus)
+  // },
+  // beforeDestroy(){
+  //   window.removeEventListener('beforeunload',this.markFinishStatus)
+  // }
 }
 </script>
 <style scoped lang="scss">

+ 64 - 7
src/views/datasheet_manage/sheetList.vue

@@ -344,7 +344,7 @@ export default {
   components: { mDialog, classifyDia, Sheet, CustomTable, MixedTable,sheetListWrap },
   mixins: [leftMixin],
   beforeRouteLeave(to,from,next){
-    if(from.path=='/sheetList' && to.path!='/sheetList'){
+    if(from.path=='/sheetList'){
       this.markFinishStatus()
     }
     next()
@@ -719,13 +719,21 @@ export default {
       });
       this.loading.close();
       if (res.Ret !== 200) return;
+      if(res.Data.Status==1){
+        this.$message.warning(res.Data.Msg)
+        this.refreshOnlineExcel()
+        this.onlineExcelEditing=false
+        this.editButtonText = `${res.Data.Editor}编辑中`
+        return 
+      }
       this.$message.success("保存成功");
-      this.getTreeData();
+      this.markFinishStatus()
 
+      this.getTreeData();
       this.getDetailHandle();
     }, 300),
     autoSaveFun:_.debounce(async function(){
-      console.log("自动保存");
+      // console.log("自动保存");
       if(!this.onlineExcelEditing || this.cancelAutoSave){
         this.cancelAutoSave=false
         return
@@ -744,6 +752,14 @@ export default {
         Content: JSON.stringify(data),
       });
       if (res.Ret !== 200) return;
+      if(res.Data.Status==1){
+        this.$message.warning(res.Data.Msg)
+        this.refreshOnlineExcel()
+        this.onlineExcelEditing=false
+        this.editButtonText = `${res.Data.Editor}编辑中`
+        this.autoSaveType=''
+        return 
+      }
       if(this.autoSaveType == "nameEdit"){
         this.getTreeData();
         this.autoSaveType=''
@@ -838,6 +854,11 @@ export default {
             3: "/addMixedSheet",
           };
           if(this.sheetDetailInfo.Source === 1) {
+            if(this.editButtonText.indexOf('编辑中')!=-1){
+              // 编辑中的状态 重新获取最新的详情数据
+              this.refreshOnlineExcel()
+            }
+
             this.onlineExcelEditing=true
           }else {
             this.$router.push({
@@ -911,7 +932,6 @@ export default {
     },
     // 标记 编辑完成
     markFinishStatus(select_id){
-      // console.log(select_id,'markFinishStatus',this.select_id);
       let id = select_id || this.select_id
       if((!this.onlineExcelEditing) || (!id) || id=='0'){
         this.onlineExcelEditing=false
@@ -921,6 +941,44 @@ export default {
         if(res.Ret != 200) return 
       })
       this.onlineExcelEditing=false
+    },
+    unloadMark(){
+      // sheetInterface.markSheetEditStatus({ExcelInfoId: this.select_id,Status:2}) 
+      if((!this.onlineExcelEditing) || (!this.select_id) || this.select_id=='0'){
+        this.onlineExcelEditing=false
+        return
+      }
+
+      let url = process.env.VUE_APP_API_ROOT + "/datamanage/excel_info/mark"
+      let params={ExcelInfoId: this.select_id,Status:2}
+      const uuid = localStorage.getItem("uuid") || "";
+      fetch(url, {
+        method: 'POST',
+        headers:{
+          Authorization:localStorage.getItem("auth"),
+          Uuid:uuid,
+          AccessToken:uuid + "--zheshiyigename"
+        },
+        body:JSON.stringify(params),
+        // 保持连接 让请求不会因为页面关闭而中断
+        keepalive: true
+      });
+    },
+    // 刷新在线excel详情数据
+    refreshOnlineExcel(){
+      sheetInterface.sheetDetail({
+        ExcelInfoId: this.select_id,
+      })
+      .then((res) => {
+        if (res.Ret !== 200) return;
+
+        this.sheetDetailInfo = res.Data;
+        this.saveTime = this.$moment(this.sheetDetailInfo.ModifyTime).format('YYYY-MM-DD HH:mm:ss')||''
+
+        this.$nextTick(() => {
+          this.$refs.sheetRef.init();
+        });
+      });
     }
   },
   mounted() {
@@ -933,16 +991,15 @@ export default {
       this.getTreeData();
       this.getPublicList();
     }
-
     window.addEventListener("resize", this.reloadRightWid);
     if(this.$route.path == '/sheetList'){
-      window.addEventListener('beforeunload',this.markFinishStatus)
+      window.addEventListener('beforeunload',this.unloadMark)
     }
   },
   destroyed() {
     window.removeEventListener("resize", this.reloadRightWid);
     if(this.$route.path == '/sheetList'){
-      window.removeEventListener('beforeunload',this.markFinishStatus)
+      window.removeEventListener('beforeunload',this.unloadMark)
     }
   },
 };

+ 4 - 0
src/views/login_manage/ForgetPassModel.vue

@@ -281,6 +281,10 @@ export default {
                     }).then(res=>{
                         if(res.Ret!==200) return
                         this.$message.success('重置密码成功,请登陆')
+                        localStorage.setItem('timeKey',Date.now())
+                        localStorage.setItem("account", new http.Base64().encode(this.form.account));
+                        localStorage.setItem("checkPass", new http.Base64().encode(this.passForm.pass1));
+
                         this.resetPassCountDown()
                         this.resetPassTimer = setInterval(()=>{
                             this.resetPassCountDown()

+ 11 - 4
src/views/mychart_manage/components/chartDetailDia.vue

@@ -272,7 +272,7 @@
                 </div>
 
                   <!-- 后续新图专用上下限 和其他数据依赖不公用 柱形图 截面散点-->
-                <template v-if="[7,10].includes(chartInfo.ChartType)">	
+                <template v-if="[7,10,11].includes(chartInfo.ChartType)">	
                   <div class="range-cont left">
                     <el-input
                       style="width: 60px; display: block"
@@ -517,7 +517,7 @@
               label="操作"
               key="Copy"
               align="center"
-              v-if="[2,5,7].includes(chartInfo.ChartType)"
+              v-if="chartInfo.Source!==1 || ![1,4,6].includes(chartInfo.ChartType)"
               width="110"
             >
               <template slot-scope="scope">
@@ -735,7 +735,11 @@ export default {
             this.setDefaultDateSelect(); //设置默认的日期选中
             this.chartInfo.ChartType === 7 && this.initBarData(res.Data);
 
+            //截面散点图
             this.chartInfo.ChartType === 10 && this.initSectionScatterData(res.Data);
+
+            //雷达图
+            this.chartInfo.ChartType === 11 && this.initRadarData(res.Data);
           }else if([2,5].includes(this.chartInfo.Source)) {
             this.tableData = [res.Data.EdbInfoList[0]];
             this.chartInfo = res.Data.ChartInfo.Source===5 ? {
@@ -947,7 +951,7 @@ export default {
         if (res.Ret !== 200) return
         this.$message.success(res.Msg);
 
-        Source===1&&![7,10].includes(ChartType)  
+        Source===1&&![7,10,11].includes(ChartType) 
           ? this.getPreviewChartInfo() 
           : this.getChartDetail(UniqueCode);
     },
@@ -1155,12 +1159,14 @@ export default {
           }
           break
         case 7:
+        case 11:
           typeChartParam = {
             ...public_param,
             DateType: 6,
             LeftMin: String(this.chartLimit.min),
             LeftMax: String(this.chartLimit.max),
           }
+          break
         case 10: 
           typeChartParam = {
             ...public_param,
@@ -1173,7 +1179,8 @@ export default {
               YMinValue: String(this.chartLimit.min),
               YMaxValue: String(this.chartLimit.max),
             })
-          } 
+          }
+          break
       }
 
       let params = this.sameOptionType.includes(this.chartInfo.ChartType)

+ 114 - 1
src/views/ppt_manage/mixins/mixins.js

@@ -75,7 +75,10 @@ export default {
       statisticFrequencyData: {},
 
       /* 跨品种分析图 */
-      crossVarietyChartData: {}
+      crossVarietyChartData: {},
+
+      /* 雷达图 */
+      radarChartData: {}
     }
   },
   methods: {
@@ -1491,6 +1494,116 @@ export default {
       }
     },
 
+    //雷达图数据初始化
+    initRadarData(data) {
+      const { DataResp,EdbInfoList,ChartInfo } = data;
+      
+      this.radarChartData = {
+        YDataList: DataResp.YDataList,
+        XDataList: EdbInfoList.filter(_ => DataResp.XEdbIdValue.includes(_.EdbInfoId))
+      }
+      this.chartLimit = {
+        min: Number(ChartInfo.LeftMin),
+        max: Number(ChartInfo.LeftMax)
+      }
+
+      this.setRadarChart();
+    },
+    /*雷达图绘图*/
+    setRadarChart() {
+      const { YDataList,XDataList } = this.radarChartData;
+
+      /* 主题样式*/
+      const chartTheme =  this.chartInfo.ChartThemeStyle ? JSON.parse(this.chartInfo.ChartThemeStyle) : null;
+
+      //x轴
+      let xAxis = {
+        lineWidth: 0,
+        tickLength: 0,
+        tickmarkPlacement: 'on',
+        categories: XDataList.map(_ => _.EdbAliasName||_.EdbName),
+        labels: {
+          allowOverlap: true,
+          autoRotationLimit: 40,
+          distance: 20,
+          style: {
+            ...chartTheme&&chartTheme.xAxisOptions.style
+          }
+        }
+      }
+
+      //y轴
+      const { max,min } = this.chartLimit;
+      let yAxis = [{
+        gridLineInterpolation: 'polygon',
+        gridLineWidth: 1,
+        lineWidth: 0,
+        endOnTick: false,
+        startOnTick: false,
+        showLastLabel: true,
+        // tickAmount:4,
+        title: {
+          text:  this.chartInfo.Unit,
+          textCh: this.chartInfo.Unit,
+          textEn: this.chartInfo.UnitEn,
+          align: 'high',
+          rotation: 0,
+          y: 5,
+          x:10,
+          textAlign: 'left',
+          reserveSpace: false,
+          style:{
+            ...chartTheme&&chartTheme.yAxisOptions.style
+          },
+        },
+        labels: {
+          allowOverlap: true,
+          style:{
+            ...chartTheme&&chartTheme.yAxisOptions.style
+          }
+        },
+        min: Number(min),
+        max: Number(max),
+      }]
+
+      //系列
+      let series = [];
+      YDataList.forEach(item => {
+        let serie_item = {
+          data: item.Value,
+          pointPlacement: 'on',
+          type: (chartTheme&&chartTheme.lineOptions.lineType) || 'line',
+          dashStyle: (chartTheme&&chartTheme.lineOptions.dashStyle)||'Solid',
+          yAxis: 0,
+          name: item.Name || item.Date,
+          nameCh: item.Name || item.Date,
+          nameEn: item.Date,
+          color: item.Color,
+          lineWidth: (chartTheme&&chartTheme.lineOptions.lineWidth) || 1,
+          chartType: 'linear'
+        };
+        series.push(serie_item)
+      })
+
+      this.options = {
+        chart: {
+          ...defaultOpts.chart,
+          ...chartTheme.drawOption,
+          spacing: [2,10,2,10],
+          polar:true,
+        },
+        title: {
+          text:''
+        },
+        pane: {
+          size: '80%'
+        },
+        series,
+        yAxis,
+        xAxis
+      }
+    },
+
     /* 查询范围为1年内 x轴显示为月/日 否则默认年/月 */
     xTimeDiffer() {
       const end_date =

+ 5 - 0
src/views/ppt_manage/mixins/pptMixins.js

@@ -1,7 +1,9 @@
 /** 图库9.0(智能PPT) 共通逻辑 */
 import Highcharts from "highcharts/highstock";
+import HighchartsMore from 'highcharts/highcharts-more';
 import HighchartszhCN  from '@/utils/highcahrts-zh_CN'
 HighchartszhCN(Highcharts)
+HighchartsMore(Highcharts)
 import { dataBaseInterface,pptInterface } from "@/api/api.js";
 import {etaBaseConfigInterence} from '@/api/modules/etaBaseConfigApi.js';
 import {pptEnInterface} from '@/api/modules/pptEnApi.js';
@@ -210,6 +212,8 @@ export default {
         this.chartInfo.ChartType === 7 && this.initBarData(res.Data);
         //截面散点图
         this.chartInfo.ChartType === 10 && this.initSectionScatterData(res.Data);
+        //雷达图
+        this.chartInfo.ChartType === 11 && this.initRadarData(res.Data);
 
         Data.Status && ![7,10].includes(this.chartInfo.ChartType) && this.setOptions();
         Data.Status&&this.setOptionsLang(currentLang)
@@ -557,6 +561,7 @@ export default {
             animation: false,
             backgroundColor: "rgba(0,0,0,0)",
             renderTo:$(`#${refName}`)[0],
+            ...options.chart||{}
           },
           legend: {
             ...defaultOpts.legend,

+ 3 - 2
src/views/system_manage/chartTheme/components/optionsSection.vue

@@ -32,8 +32,8 @@
                   </el-select>
                 </li>
 
-                <!-- 曲线额外配置 -->
-                <template v-if="[1,2].includes(chartType)">
+                <!-- 曲线额外配置 雷达 -->
+                <template v-if="[1,2,11].includes(chartType)">
                   <li class="option-item">
                     <label class="el-form-item__label">线型</label>
                     <el-select 
@@ -246,6 +246,7 @@ export default {
         6: {label:'线条、柱形设置',lineLabel: '系列'},
         7: {label:'柱形设置',lineLabel: '根'},
         10: {label:'散点设置',lineLabel: '系列'},
+        11: {label:'线条设置',lineLabel: '条'},
       },
       labelMap: new Map([
         ['lineOptions','线条设置'],

+ 4 - 1
src/views/system_manage/chartTheme/themeSetting.vue

@@ -112,8 +112,11 @@ export default {
         ChartThemeStyle: themeItem.Config
       };
       this.tableData = res.Data.EdbInfoList;
+
       if(this.chartInfo.ChartType === 7) return this.initBarData(res.Data);
-      if(this.chartInfo.ChartType === 10) return this.initSectionScatterData(res.Data);
+      else if(this.chartInfo.ChartType === 10) return this.initSectionScatterData(res.Data);
+      
+      else if(this.chartInfo.ChartType === 11) return this.initRadarData(res.Data);
 
       this.setChartOptionHandle(this.tableData)
     },