jwyu 1 gadu atpakaļ
vecāks
revīzija
ad80c2494f

+ 205 - 5
src/views/dataEntry_manage/databaseComponents/batchComputedSave.vue

@@ -21,7 +21,7 @@
                     <el-select
 						v-model="scope.row.frequency"
 						placeholder="请选择频率"
-						clearable
+                        @change="handleFrequencyChange(scope)"
 					>
 						<el-option
 							v-for="item in frequencyArr"
@@ -43,29 +43,41 @@
                 </template>
                 <template slot-scope="{row,$index}">
                     <el-cascader
-						v-model="row.menu"
+						v-model="row.classify"
 						:options="classifyOpt"
 						:props="levelProps"
-						clearable
 						placeholder="请选择指标目录"
                         :disabled="classifyType===1&&$index>0"
+                        @change="handleClassifyChange(row,$index)"
 					/>
                 </template>
             </el-table-column>
         </el-table>
         <div style="text-align:center;margin:60px 0 40px 0">
             <el-button type="primary" plain @click="handleClose">取消</el-button>
-            <el-button type="primary">批量计算</el-button>
+            <el-button type="primary" @click="handleSubmit" :loading="loading">{{loading ? '批量计算中...' : '批量计算'}}</el-button>
         </div>
     </div>
 </template>
 
 <script>
 import { dataBaseInterface } from '@/api/api.js';
+import {generateSeriesArray} from './util'
+const tag_arr = generateSeriesArray();
 export default {
     props:{
+        computedType:null,
+        subComputedType:null,
         selectList:null,
         formData:null,
+        select_target:null
+    },
+    computed: {
+        sourceTypeVal(){
+            if(!this.computedType) return 0
+            if(this.subComputedType) return this.subComputedType
+            return ['withNum','withEDB'].includes(this.computedType)?4:this.computedType
+        }
     },
     data() {
         return {
@@ -79,8 +91,13 @@ export default {
 				label: 'ClassifyName',
 				value: 'ClassifyId',
 				children: 'Children',
-				checkStrictly: true
+				checkStrictly: true,
+                emitPath:false
 			},
+
+            loading:false,
+
+            computedArr:[],//多指标求和\平均的指标数组
         }
     },
     mounted() {
@@ -88,9 +105,191 @@ export default {
         this.getClassifyOpt()
     },
     methods: {
+        // 初始化数据
         initData(){
+            let arr=[]
+
+            // 如果是多指标求和\平均
+            if(this.computedType==='multipleEDB'){
+                this.computedArr=this.selectList
+                arr=[{...this.selectList[0]}]
+            }else{
+                arr=this.selectList
+            }
+            
+            
+            arr.forEach(item=>{
+                this.setDefaultVal(item)
+            })
             
         },
+        // 设置默认值
+        setDefaultVal(item){
+            const obj={
+                EdbName:item.EdbName,
+                EdbInfoId:item.EdbInfoId,
+                name:'',
+                unit:'',
+                frequency:'',
+                classify:''
+            }
+            const tMap=new Map([
+				['日度','D'],
+				['周度','W'],
+				['旬度','T'],
+				['月度','M'],
+				['季度','Q'],
+				['年度','Y'],
+			])
+			const name_map = {
+                4:item.EdbName,
+				5: `${item.EdbName}转月值`,
+				8: `${item.EdbName}/${this.formData.nNum}${tMap.get(item.Frequency)}MA`,
+				14: `${item.EdbName}/日频`,
+				6: `${item.EdbName}同比`,
+				7: `${item.EdbName}同差`,
+				12: `${item.EdbName}${this.formData.nNum}${item.Frequency.slice(0,1)}环比`,
+				13: `${item.EdbName}${this.formData.nNum}${item.Frequency.slice(0,1)}环差`,
+				35: `${item.EdbName}超季节性/${this.formData.nNum}年${this.formData.calendarType==='公历'?'':'/'+this.formData.calendarType}`,
+				52: `${item.EdbName}年化值`,
+				51: `${item.EdbName}/${item.Frequency.substr(0,1)}频`,
+				61:  `${item.EdbName}转季值`,
+				62:  `${item.EdbName}累计值/${this.formData.frequency}`,
+				63:  `${item.EdbName}累计值/${item.Frequency}`,
+                72:`${item.EdbName}指数修匀`,
+				75: `${item.EdbName}日均值`,
+                81:item.EdbName,
+                82:item.EdbName,
+			}
+			
+			let frequerncyMap = {
+				14: '日度',
+				61: '季度',
+                62:this.formData.frequency,
+                51:this.formData.frequency,
+			}
+
+            obj.name=name_map[this.sourceTypeVal] || ''
+            obj.frequency=frequerncyMap[this.sourceTypeVal]|| item.Frequency
+            obj.classify=item.ClassifyId||''
+
+            if([5,8,14,7,35,75].includes(this.sourceTypeVal)){
+                obj.unit=item.Unit
+            }else if([4].includes(this.sourceTypeVal)){
+                obj.unit=''
+            }else{
+                obj.unit='无'
+            }
+            
+
+            this.list.push(obj)
+        },
+        // 频度变化 修改指标名
+		handleFrequencyChange(e){
+			if(!this.sourceTypeVal||![51,62].includes(this.sourceTypeVal)) return;
+			const name_map = {
+				51: `${obj.EdbName}/${this.formData.frequency.substr(0,1)}频`,
+				62:  `${obj.EdbName}累计值/${this.formData.frequency}`,
+			}
+			this.list[e.$index].name=name_map[this.sourceTypeVal]
+		},
+
+        // 同目录修改
+        handleClassifyChange(e,index){
+            if(this.classifyType===1){
+                // 修改所有的指标的目录为第一个
+                this.list.forEach(item=>{
+                    item.classify=e.classify
+                })
+            }
+        },
+
+        // 提交计算
+        async handleSubmit(){
+            const edbList=this.list.map((item,index)=>{
+                return{
+                    CalculateId:tag_arr[index],
+                    ClassifyId:item.classify,
+                    EdbName:item.name,
+                    Frequency:item.frequency,
+                    Unit:item.unit,
+                    FromEdbInfoId:item.EdbInfoId
+                }
+            })
+            const valueMap = {
+				51: 'valueType',
+                72:'alphaValue'
+			}
+            const params={
+                EdbList:edbList,
+                Formula:valueMap[this.sourceTypeVal] ? String(this.formData[valueMap[this.sourceTypeVal]]) : String(this.formData.nNum),
+                Source:this.sourceTypeVal,
+                CalculateFormula:this.formData.formula,
+                EdbInfoIdArr:this.select_target?[{EdbInfoId:this.select_target,FromTag:'B'}]:[],
+                MoveType:0,
+                MoveFrequency:'',
+                Calendar:this.formData.calendarType,
+                EmptyType: this.formData.nullValueWay,
+				MaxEmptyType: this.formData.maxNullWay,
+                Extra:JSON.stringify({
+                    LastValType:this.formData.newValue,
+                    DateTag:this.formData.timeSeriesVal
+                })
+            }
+            // 处理多指标求和\平均 情况的数据
+            if(this.computedType==='multipleEDB'){
+                const arr=this.computedArr.map((item,index)=>{
+                    return{
+                        EdbInfoId:item.EdbInfoId,
+                        FromTag:tag_arr[index]
+                    }
+                })
+                params.EdbInfoIdArr=arr
+            }
+            console.log(params);
+
+            let isEnough = params.EdbList.every(item => item.EdbName&&item.Unit&&item.ClassifyId&&item.Frequency)
+            if(!isEnough) return this.$message.warning('请填写完整信息');
+
+            this.loading=true
+            this.$message.success('请等待计算完成,该过程可能持续2-3分钟')
+            const res=await dataBaseInterface.batchCalculateTargetAdd(params)
+            this.loading=false
+            
+            if(res.Ret !== 200) return
+
+            const { Fail,Success } = res.Data;
+
+            if(Fail.length) {
+                let message = '';
+                Fail.forEach(item => {
+                    message+=`${item.CalculateId}:${item.Msg}</br>`
+                })
+
+                this.$message({
+                    dangerouslyUseHTMLString: true,
+                    message,
+                    type: 'error'
+                })
+                this.dealFailHandle(Fail)
+            }else {
+                this.$message.success('添加成功');
+                // this.init();
+                this.$emit('addCallBack','add',{ code:Success[0].UniqueCode,id:Success[0].EdbInfoId,classifyId:Success[0].ClassifyId});
+            }
+
+        },
+
+        // 处理批量添加失败的指标
+        dealFailHandle(data){
+            let temarr=[]
+            data.forEach(item=>{
+                const index=tag_arr.indexOf(item.CalculateId)
+                temarr.push(this.list[index])
+            })
+            this.list=temarr
+        },
+
 
         handleClose(){
             this.$emit('close')
@@ -120,6 +319,7 @@ export default {
     .el-input{
         input{
             border: none;
+            text-align: center;
         }
     }
     .el-table tr{

+ 133 - 31
src/views/dataEntry_manage/databaseComponents/batchComputedV2.vue

@@ -72,7 +72,7 @@
                         <el-radio v-model="subComputedType" :label="62">累计值</el-radio>
                     </el-form-item>
                     <el-form-item required label="频度" style="width:180px" v-if="subComputedType==62">
-                        <el-select style="width:120px">
+                        <el-select v-model="formData.frequency" style="width:120px">
                             <el-option v-for="opt in frequencyArr" :key="opt" :label="opt" :value="opt"></el-option>
                         </el-select>
                     </el-form-item>
@@ -88,7 +88,7 @@
                     </template>
 
                     <!-- 指数修匀 -->
-                    <template v-if="computedType=='alpha'">
+                    <template v-if="computedType==72">
                     <el-form-item required label="alpha值" style="width:220px">
                         <el-input v-model.trim="formData.alphaValue" style="width:140px" placeholder="请输入alpha值"></el-input>
                     </el-form-item>
@@ -133,7 +133,7 @@
                     </el-form-item>
                     <el-form-item label="生成指标时间序列">
                         <el-cascader
-							v-model="timeSeriesVal"
+							v-model="formData.timeSeriesVal"
 							style="width:180px"
 							:options="timeSeriesOpt"
 							:props="{emitPath:false}"
@@ -167,17 +167,17 @@
                     </el-form-item>
                     </template>
 
-                    <!-- 与单指标计算 -->
+                    <!-- 多指标求和/平均 -->
                     <template v-if="computedType=='multipleEDB'">
                     <el-form-item style="margin-right:30px">
                     <el-radio-group v-model="subComputedType">
-                        <el-radio :label="80">求和</el-radio>
-                        <el-radio :label="81">求平均</el-radio>
+                        <el-radio :label="81">求和</el-radio>
+                        <el-radio :label="82">求平均</el-radio>
                     </el-radio-group>
                     </el-form-item>
                     <el-form-item label="生成指标时间序列">
                         <el-cascader
-							v-model="timeSeriesVal"
+							v-model="formData.timeSeriesVal"
 							style="width:180px"
 							:options="timeSeriesOpt"
 							:props="{emitPath:false}"
@@ -280,7 +280,7 @@
                     >
                         <el-table-column type="selection" min-width="50" align="center" />
                         <el-table-column label="指标全称" show-overflow-tooltip align="center" prop="EdbName"/>
-                        <el-table-column label="最新日期" align="center" prop="LatestDate" sortable="custom" width="120px" />
+                        <el-table-column label="最新日期" align="center" prop="LatestDate" width="120px" />
                         <el-table-column label="最新值" align="center" show-overflow-tooltip prop="LatestValue" width="80px"/>
                         <el-table-column label="创建人" align="center" show-overflow-tooltip prop="SysUserRealName" width="80px"/>
                         <el-table-column label="频度" align="center" prop="Frequency" width="50px"/>
@@ -298,7 +298,7 @@
                     />
                 </div>
                 <div style="padding-top:200px;margin:0 30px">
-                    <el-button type="primary" @click="getAddEdbListData">加入已选指标</el-button>
+                    <el-button type="primary" :loading="addLoading" @click="getAddEdbListData">加入已选指标</el-button>
                 </div>
                 <div class="right-box">
                     <el-table 
@@ -306,6 +306,11 @@
                         border 
                         height="500px"
                     >
+                        <el-table-column label="序号" width="50px" align="center" prop="No" v-if="computedType=='multipleEDB'">
+                            <template slot-scope="scope">
+                                {{scope.$index|getNoText}}
+                            </template>
+                        </el-table-column>
                         <el-table-column label="指标全称" show-overflow-tooltip align="center" prop="EdbName"/>
                         <el-table-column width="50px" align="center">
                             <template slot="header" slot-scope="scope">
@@ -324,7 +329,16 @@
             </div>
         </div>
         <!-- 结果保存 -->
-        <batchComputedSave :selectList="selectList" :formData="formData" @close="showSave=false" v-else/>
+        <batchComputedSave 
+            :select_target="select_target"
+            :computedType="computedType" 
+            :subComputedType="subComputedType" 
+            :selectList="selectList" 
+            :formData="formData" 
+            @close="showSave=false" 
+            @addCallBack="handleAddSuccess"
+            v-else
+        />
     </el-dialog>
 </template>
 
@@ -333,6 +347,8 @@ import mPage from '@/components/mPage.vue'
 import {computedBatchTypesV2} from './util'
 import { dataBaseInterface,departInterence } from '@/api/api.js';
 import batchComputedSave from './batchComputedSave.vue';
+import {generateSeriesArray} from './util'
+const tag_arr = generateSeriesArray();
 export default {
     components:{mPage,batchComputedSave},
     props:{
@@ -340,6 +356,11 @@ export default {
             type: Boolean
         },
     },
+    filters:{
+        getNoText(e){
+            return tag_arr[e]
+        }
+    },
     computed:{
         // 最大添加指标的上限
         MAXAddNUM(){
@@ -355,6 +376,70 @@ export default {
 
 			return haveMaxOrMin && this.formData.nullValueWay===4
 		},
+        timeSeriesOpt(){
+            let arr=[
+                {
+                    label:`指标A`,
+                    value:'A'
+                },
+                {
+                    label:`指标B`,
+                    value:'B'
+                }
+            ]
+            if(this.computedType=='multipleEDB'){
+                arr=this.selectList.map((item,index)=>{
+                    return{
+                        label:`指标${tag_arr[index]}`,
+                        value:tag_arr[index]
+                    }
+                })
+            }
+            return [
+                {
+                    label:'指定指标时间序列',
+					value:'0',
+                    children:arr
+                },
+                {
+					label:'所有指标时间序列并集',
+					value:'all',
+				}
+            ]
+        }
+    },
+    watch: {
+        isShow(n){
+            if(!n){
+                this.subComputedType=''
+                this.select_target=''
+                this.selectList=[]
+                this.tableDataCheckedList=[]
+                this.tableDataIds=[]
+                this.isCheckAll=false
+                this.isCheckIndeterminate=false
+                this.checkAllStatus=false
+                this.selectionReactCancel=false
+                this.filter={
+                    classify:'',
+                    frequency:'',
+                    user:'',
+                    keyword:''
+                }
+                this.formData={
+                    nNum:1,
+                    calendarType:'公历',
+                    frequency:'',
+                    valueType:'期末值',
+                    newValue:0,
+                    alphaValue:'',
+                    formula:'',
+                    timeSeriesVal:'A',
+                    nullValueWay:0,
+                    maxNullWay:1,
+                }
+            }
+        }
     },
     data() {
         return {
@@ -406,26 +491,6 @@ export default {
                 emitPath:false
             },
 
-            timeSeriesOpt:[
-                {
-					label:'指定指标时间序列',
-					value:'0',
-					children:[
-                        {
-                            label:`指标A`,
-                            value:'A'
-                        },
-                        {
-                            label:`指标B`,
-                            value:'B'
-                        }
-                    ]
-				},
-				{
-					label:'所有指标时间序列并集',
-					value:'all',
-				}
-            ],
             nullWayOptions: [
 				{ label: '查找前后35天最近值',value: 0 },
 				{ label: '不计算',value: 1 },
@@ -449,7 +514,7 @@ export default {
             tableDataIds:[],
 
             selectList:[],//添加到右侧的数据
-
+            addLoading:false,
 
         }
     },
@@ -460,12 +525,44 @@ export default {
     },
     
     methods: {
+        //批量计算成功回调
+        handleAddSuccess(type,params){
+            this.$emit('addCallBack',type,params)
+        },
         // 跳转下一步
         handleNextStep(){
             if(this.selectList.length===0){
                 this.$message.warning('请选择指标')
                 return
             }
+            if([8,12,13,35].includes(this.computedType) && !this.formData.nNum){
+                this.$message.warning('请输入N数值')
+                return
+            }
+            if([51].includes(this.computedType)&& !this.formData.frequency){
+                this.$message.warning('请选择频度')
+                return
+            }
+            if(['accumulate'].includes(this.computedType)&&this.subComputedType==62&& !this.formData.frequency){
+                this.$message.warning('请选择频度')
+                return
+            }
+            if(this.computedType==72&&!this.formData.alphaValue){
+                this.$message.warning('请输入alpha值')
+                return
+            }
+            if(this.computedType=='withEDB'&&!this.select_target){
+                this.$message.warning('请选择指标B')
+                return
+            }
+            if(['withNum','withEDB'].includes(this.computedType)&&!this.formData.formula){
+                this.$message.warning('请输入公式')
+                return
+            }
+
+            this.isCheckAll=false
+            this.isCheckIndeterminate=false
+            this.checkAllStatus=false
 
             this.showSave=true
         },
@@ -488,7 +585,9 @@ export default {
                 SelectAll:this.checkAllStatus,
                 EdbInfoIds:this.tableDataCheckedList.join(',')
             }
+            this.addLoading=true
             const res=await dataBaseInterface.getBatchFilterAddEdbList(params)
+            this.addLoading=false
             if(res.Ret!=200) return
             // 加入到已选指标中 要去重
             const arr=res.Data.SearchItem||[]
@@ -521,6 +620,7 @@ export default {
         // 切换计算类型
         handleComputedTypeChange(){
             this.subComputedType=''
+            this.select_target=''
             this.formData={
                 nNum:1,
                 calendarType:'公历',
@@ -537,6 +637,8 @@ export default {
                 this.subComputedType=5
             }else if(this.computedType=='accumulate'){
                 this.subComputedType=62
+            }else if(this.computedType=='multipleEDB'){
+                this.subComputedType=81
             }
         },
 

+ 2 - 2
src/views/dataEntry_manage/databaseComponents/util.js

@@ -201,7 +201,7 @@ export const computedBatchTypesV2=[
 	},
 	{
 		name:'指数修匀',
-		type:'alpha'
+		type:72
 	},
 	{
 		name:'日均值',
@@ -217,7 +217,7 @@ export const computedBatchTypesV2=[
 	},
 	{
 		name:'多指标求和/平均',
-		type:'multipleEDB'
+		type:'multipleEDB',//81求和 82求平均
 	},
 ]
 

+ 8 - 1
src/views/dataEntry_manage/databaseList.vue

@@ -502,7 +502,11 @@
 		/>
 
 		<!-- 批量计算指标 -->
-		<batchComputedV2 :isShow="showBatchComputedPop" @close="showBatchComputedPop=false"/>
+		<batchComputedV2 
+			:isShow="showBatchComputedPop" 
+			@close="showBatchComputedPop=false" 
+			@addCallBack="addComputedCallBack"
+		/>
 	</div>
 </template>
 
@@ -1624,6 +1628,9 @@ export default {
 			this.computed_source = 1;
 			this.showAssociateChart=false
 			this.showAssociateComputeData=false
+			this.showBatchComputedPop=false
+			this.isOpenComputed = false
+			console.log(type, params);
 			// this.getTreeData();
 			type === 'add' ? this.getTreeData(params) : this.getTreeData();
 			type === 'edit' && this.initGetData()