فهرست منبع

v1.7.1_指数修匀

jwyu 1 سال پیش
والد
کامیت
99482bd8d5

+ 60 - 2
src/views/dataEDB/calculate/BatchDetail.vue

@@ -39,6 +39,7 @@ function getCalculateBtnText(){
 		[61,'转季值计算'],
 		[62,'累计值计算'],
 		[63,'年初至今计算'],
+        [72,'指数修匀计算'],
 	])
     str=btnTextMap.get(source.value)
 
@@ -59,6 +60,7 @@ function handleTabChange(){
             classifyName:'',
             frequency:'',
             numberN:1,
+            alphaVal:'',
         },
         {
             tag:letterOpts[1],
@@ -69,6 +71,7 @@ function handleTabChange(){
             classifyName:'',
             frequency:'',
             numberN:1,
+            alphaVal:'',
         }
     ]
 }
@@ -101,6 +104,7 @@ const edbList=ref([
         classifyName:'',
         frequency:'',
         numberN:1,
+        alphaVal:'',
     },
     {
         tag:letterOpts[1],
@@ -111,6 +115,7 @@ const edbList=ref([
         classifyName:'',
         frequency:'',
         numberN:1,
+        alphaVal:'',
     }
 ])
 function handleAddEdbList(){
@@ -129,6 +134,7 @@ function handleAddEdbList(){
         classifyName:'',
         frequency:'',
         numberN:1,
+        alphaVal:'',
 	};
 	edbList.value.push(item);
 }
@@ -152,6 +158,10 @@ function handleConfirmSelectEDB(e){
     edbList.value[currentEdbInfoIndex.value].name=obj.targetName
     edbList.value[currentEdbInfoIndex.value].unit=obj.unit
     edbList.value[currentEdbInfoIndex.value].frequency=obj.frequency
+
+    if([72].includes(source.value)){//指数修匀设置默认指标目录为选择的指标目录
+        selectEDBClassifyINS.value?.getSelectClassifyOpt(e.ClassifyId)//获取选择的分类目录
+    }
 }
 
 // 选择指标后设置基础信息
@@ -227,6 +237,12 @@ function setBaseInfo(obj,list){
 				unit: '无',
 				frequency: obj.Frequency
 			}
+        case 72:
+            return {
+                targetName:`${obj.EdbName}指数修匀`,
+                unit: obj.Unit,
+				frequency: obj.Frequency
+            }
     }
 }
 
@@ -235,6 +251,7 @@ const showSeeEDBDataList=ref(false)
 
 const edbNameInputFocus=ref(false)//指标名称输入框聚焦
 const numberNInputFocus=ref(false)//N值输入框聚焦
+const alphaValInputFocus=ref(false)//alpha值输入框聚焦
 
 // 选择单位
 const showSelectUnit=ref(false)
@@ -244,7 +261,13 @@ function onConfirmSelectUnit(value){
 
 //选择分类
 const showSelectClassify=ref(false)
+const selectEDBClassifyINS=ref(null)
 function handleConfirmClassify({value,selectedOptions}){
+    if(selectedOptions.length===0){
+        edbList.value[currentEdbInfoIndex.value].classify=''
+        edbList.value[currentEdbInfoIndex.value].classifyName=''
+        return
+    }
     edbList.value[currentEdbInfoIndex.value].classify=value
     edbList.value[currentEdbInfoIndex.value].classifyName=`${selectedOptions[0].ClassifyName}/${selectedOptions[1].ClassifyName}/${selectedOptions[2].ClassifyName}`
 }
@@ -276,7 +299,7 @@ async function handleSave(){
             CalculateInfo: {
                 ClassifyId: item.classify,
                 EdbName: item.name,
-                Formula: String(item.numberN),
+                Formula: [72].includes(source.value)?String(item.alphaVal) : String(item.numberN),
                 Frequency:item.frequency,
                 FromEdbInfoId: item.edbData.EdbInfoId,
                 MoveFrequency: "天",
@@ -287,6 +310,24 @@ async function handleSave(){
         }
     })
     console.log(params);
+    // 判断alpha的值
+    if([72].includes(source.value)){
+        let msg=[]
+        params.forEach(item=>{
+            if(item.CalculateInfo.Formula<=0||item.CalculateInfo.Formula>=1){
+                msg.push(item.CalculateId)
+            }
+
+        })
+        if(msg.length){
+            showDialog({
+                allowHtml:true,
+                message:'指标'+msg.join('、')+'的alpha值不合法'
+            })
+            return
+        }
+    }
+
     saveBtnLoading.value=true
     const res=await apiDataEDB.batchAddCalculateEDB(params)
     saveBtnLoading.value=false
@@ -448,6 +489,23 @@ async function handleSave(){
                         <svg-icon class="edit-icon" name="edit" :color="numberNInputFocus?'#0052D9':'#333333'"/>
                     </template>
                 </van-field>
+                <!-- 指数修匀 alpha 值 -->
+                <van-field
+                    v-if="[72].includes(source)"
+                    v-model.number="edbList[currentEdbInfoIndex].alphaVal"
+                    type="number"
+                    label="alpha值" 
+                    placeholder="请输入alpha值"
+                    input-align="right"
+                    required
+                    @focus="alphaValInputFocus=true"
+                    @blur="alphaValInputFocus=false"
+                    :disabled="isPreview"
+                >
+                    <template #right-icon>
+                        <svg-icon v-if="!isPreview" class="edit-icon" name="edit" :color="alphaValInputFocus?'#0052D9':'#333333'"/>
+                    </template>
+                </van-field>
             </div>
         </section>
 
@@ -473,7 +531,7 @@ async function handleSave(){
     <SelectEDBUnit v-model:show="showSelectUnit" @select="onConfirmSelectUnit"/>
 
     <!-- 选择分类 -->
-    <SelectEDBClassify v-model:show="showSelectClassify" @select="handleConfirmClassify" />
+    <SelectEDBClassify ref="selectEDBClassifyINS" v-model:show="showSelectClassify" @select="handleConfirmClassify" />
 
     <!-- 选择频度 -->
     <SelectEDBFrequency v-model:show="showSelectFrequency" @select="handleConfirmFrequency"/>

+ 1 - 1
src/views/dataEDB/calculate/Detail.vue

@@ -31,7 +31,7 @@ if(['edit','preview'].includes(route.query.type)){
     <!-- 指标运算 -->
     <FormulaCalculate v-if="['4'].includes(source)" :edbInfo="edbInfo"/>
     <!-- 其他的运算 编辑时toMonthSeason=5\61 accumulate=62\63 -->
-    <OtherCalculate v-if="['toMonthSeason','5','6','7','8','12','13','14','22','35','51','52','61','62','63','accumulate'].includes(source)" :edbInfo="edbInfo"/>
+    <OtherCalculate v-if="['toMonthSeason','5','6','7','8','12','13','14','22','35','51','52','61','62','63','accumulate','72'].includes(source)" :edbInfo="edbInfo"/>
     <!-- 拼接计算 编辑时则为 23\24 -->
     <JointCalculate v-if="['joint','23','24'].includes(source)" :edbInfo="edbInfo"/>
     <!-- 拟合残差计算 -->

+ 5 - 0
src/views/dataEDB/calculate/components/DiffusionIndexCalcualate.vue

@@ -163,6 +163,11 @@ const showSelectClassify=ref(false)
 const classifyStr=ref('')
 const selectEDBClassifyINS=ref(null)
 function handleConfirmClassify({value,selectedOptions}){
+    if(selectedOptions.length===0){
+        baseInfo.classify=''
+        classifyStr.value=''
+        return
+    }
     baseInfo.classify=value
     classifyStr.value=`${selectedOptions[0].ClassifyName}/${selectedOptions[1].ClassifyName}/${selectedOptions[2].ClassifyName}`
 }

+ 5 - 0
src/views/dataEDB/calculate/components/FittingResidualsCalculate.vue

@@ -161,6 +161,11 @@ const showSelectClassify=ref(false)
 const classifyStr=ref('')
 const selectEDBClassifyINS=ref(null)
 function handleConfirmClassify({value,selectedOptions}){
+    if(selectedOptions.length===0){
+        baseInfo.classify=''
+        classifyStr.value=''
+        return
+    }
     baseInfo.classify=value
     classifyStr.value=`${selectedOptions[0].ClassifyName}/${selectedOptions[1].ClassifyName}/${selectedOptions[2].ClassifyName}`
 }

+ 5 - 0
src/views/dataEDB/calculate/components/FormulaCalculate.vue

@@ -168,6 +168,11 @@ const showSelectClassify=ref(false)
 const classifyStr=ref('')
 const selectEDBClassifyINS=ref(null)
 function handleConfirmClassify({value,selectedOptions}){
+    if(selectedOptions.length===0){
+        baseInfo.classify=''
+        classifyStr.value=''
+        return
+    }
     baseInfo.classify=value
     classifyStr.value=`${selectedOptions[0].ClassifyName}/${selectedOptions[1].ClassifyName}/${selectedOptions[2].ClassifyName}`
 }

+ 5 - 0
src/views/dataEDB/calculate/components/JointCalculate.vue

@@ -150,6 +150,11 @@ const showSelectClassify=ref(false)
 const classifyStr=ref('')
 const selectEDBClassifyINS=ref(null)
 function handleConfirmClassify({value,selectedOptions}){
+    if(selectedOptions.length===0){
+        baseInfo.classify=''
+        classifyStr.value=''
+        return
+    }
     baseInfo.classify=value
     classifyStr.value=`${selectedOptions[0].ClassifyName}/${selectedOptions[1].ClassifyName}/${selectedOptions[2].ClassifyName}`
 }

+ 43 - 5
src/views/dataEDB/calculate/components/OtherCalculate.vue

@@ -48,6 +48,9 @@ watch(
             if([8,12,13,35].includes(edbInfoData.Source)){
                 baseInfo.numberN=Number(edbInfoData.CalculateFormula)
             }
+            if([72].includes(edbInfoData.Source)){//指数修匀
+                baseInfo.alphaVal=Number(edbInfoData.CalculateFormula)
+            }
 
             setTimeout(() => {
                 selectEDBClassifyINS.value?.getSelectClassifyOpt(props.edbInfo.EdbInfoDetail.ClassifyId)//获取选择的分类目录
@@ -90,6 +93,7 @@ function getCalculateBtnText(){
 		[61,'转季值计算'],
 		[62,'累计值计算'],
 		[63,'年初至今计算'],
+        [72,'指数修匀计算'],
 	])
     str=btnTextMap.get(source.value)
 
@@ -155,18 +159,22 @@ function updateBaseInfoData(data){
 		61:  data.EdbName,
 		62:  data.EdbName,
 		63:  data.EdbName,
+        72: `${data.EdbName}指数修匀`,
 	}
     baseInfo.name=name_map[source.value]||''
-    baseInfo.unit=[5,8,14,7,35].includes(source.value) ? data.Unit : '无',
+    baseInfo.unit=[5,8,14,7,35,72].includes(source.value) ? data.Unit : '无',
     baseInfo.frequency=source.value === 14 ? '日度' : source.value === 61 ? '季度' : source.value === 62 ? '' : data.Frequency
 
-    // baseInfo.classify=data.ClassifyId
-    // selectEDBClassifyINS.value?.getSelectClassifyOpt(data.ClassifyId)//获取选择的分类目录
+    if(source.value===72){//指数修匀目录默认和选择的指标在同一个目录
+        selectEDBClassifyINS.value?.getSelectClassifyOpt(data.ClassifyId)//获取选择的分类目录
+    }
+    
 }
 
 // 基础信息
 const edbNameInputFocus=ref(false)
 const numberNInputFocus=ref(false)
+const alphaValInputFocus=ref(false)
 const baseInfo=reactive({
     name:'',
     unit:'',
@@ -177,7 +185,8 @@ const baseInfo=reactive({
     moveType:1,
     moveUnit:'天',
     calendarType:'公历',
-    valueType:'期末值'
+    valueType:'期末值',
+    alphaVal:'',
 })
 
 // 选择单位
@@ -191,6 +200,11 @@ const showSelectClassify=ref(false)
 const classifyStr=ref('')
 const selectEDBClassifyINS=ref(null)
 function handleConfirmClassify({value,selectedOptions}){
+    if(selectedOptions.length===0){
+        baseInfo.classify=''
+        classifyStr.value=''
+        return
+    }
     baseInfo.classify=value
     classifyStr.value=`${selectedOptions[0].ClassifyName}/${selectedOptions[1].ClassifyName}/${selectedOptions[2].ClassifyName}`
 }
@@ -248,10 +262,17 @@ async function handleSave(){
         showToast('指标频度不能为空')
         return
     }
+    if([72].includes(source.value)){
+        if(baseInfo.alphaVal<=0||baseInfo.alphaVal>=1){
+            showToast('请输入>0,<1的alpha数值')
+            return
+        }
+    }
 
     const valueMap = {
 		22: 'moveVal',
-		51: 'valueType'
+		51: 'valueType',
+        72: 'alphaVal'
 	}
     const params={
         FromEdbInfoId: selectEDBinfo.value.EdbInfoId,
@@ -485,6 +506,23 @@ function handleShowEDBHistory(data){
                 @click-input="showDataValSelect=true"
                 :disabled="isPreview"
             />
+            <!-- 指数修匀 alpha 值 -->
+            <van-field
+                v-if="[72].includes(source)"
+                v-model.number="baseInfo.alphaVal"
+                type="number"
+                label="alpha值" 
+                placeholder="请输入alpha值"
+                input-align="right"
+                required
+                @focus="alphaValInputFocus=true"
+                @blur="alphaValInputFocus=false"
+                :disabled="isPreview"
+            >
+                <template #right-icon>
+                    <svg-icon v-if="!isPreview" class="edit-icon" name="edit" :color="alphaValInputFocus?'#0052D9':'#333333'"/>
+                </template>
+            </van-field>
         </section>
 
         <div class="formula-intro-btn" @click="showTips=true">

+ 3 - 0
src/views/dataEDB/components/SelectEDBClassify.vue

@@ -57,6 +57,9 @@ function getSelectClassifyOpt(id){
             })
         })
     })
+    if(arr.length===0){
+        classify.value=''
+    }
 
     emits('select',{value:id,selectedOptions:arr})
     return arr

+ 15 - 3
src/views/dataEDB/util/config.js

@@ -216,7 +216,11 @@ export const calculateTypeTipsMap=new Map([
 	日度数据年初至今:日期同原日度数据。将每年1月1日(含)到日度数据所在日期(含)之间的日度值,进行加总。<br>
 	周度数据年初至今:日期同原周度数据。将周度值转成日度频率,空值用插值法插值,然后算法同日度年度至今,再除以7<br>
 	月度/季度数据年初至今:日期同原月度/季度数据,将每年1月1日(含)到月度数据所在日期(含)之间的月度/季度值,进行加总<br>
-	以此类推`]
+	以此类推`],
+	[72,`指数修匀计算公式:<br>
+	1、设定指数修匀值序列的初始值=原来时间序列的初始值 <br>
+	2、选择平滑系数alpha值:在0-1之间,开区间 <br>
+	3、本期指数修匀值=alpha*本期实际值+(1-alpha)*上期指数修匀值`]
 ])
 
 // 常规计算类型
@@ -284,7 +288,11 @@ export const calculateType=[
 	{
 		name: '累计值',
 		type: 'accumulate'
-	}
+	},
+	{
+		name: '指数修匀',
+		type: 72
+	},
 ]
 
 // 批量计算类型
@@ -320,5 +328,9 @@ export const calculateBatchType=[
 	{
 		name: '累计值',
 		type: 'accumulate'
-	}
+	},
+	{
+		name: '指数修匀',
+		type: 72
+	},
 ]