潘志宝
2024-09-29 9907560470c1a6821f4998453bb885cd9fee3445
提交 | 用户 | 时间
c62768 1 <template>
J 2   <Dialog v-model="dialogVisible" :title="dialogTitle" width="55%">
3     <el-form
4       ref="formRef"
5       v-loading="formLoading"
6       :model="formData"
7       :rules="formRules" label-width="100px">
8       <el-row>
9         <el-col :span="12">
10           <el-form-item label="原子指标" prop="atomItem.id">
11             <el-select v-model="selected" clearable placeholder="请选择原子指标"
12                        @change="handleChange($event)">
13               <el-option
14                 v-for="item in atomItemList"
15                 :key="item.id"
16                 :label="item.itemNo"
17                 :value="item.id"
18               />
19             </el-select>
20           </el-form-item>
21         </el-col>
22         <el-col :span="12">
23           <el-form-item label="原子指标名称" prop="atomItem.itemName">
24             <el-input v-model="formData.atomItem.itemName" disabled/>
25           </el-form-item>
26         </el-col>
27       </el-row>
28       <el-row>
29         <el-col :span="12">
30           <el-form-item label="指标编码" prop="itemNo">
31             <el-input v-model="formData.itemNo" disabled/>
32           </el-form-item>
33         </el-col>
34         <el-col :span="12">
35           <el-form-item label="指标名称" prop="itemName">
36             <el-input v-model="formData.itemName"/>
37           </el-form-item>
38         </el-col>
39       </el-row>
40       <el-row>
41         <el-col :span="12">
42           <el-form-item label="指标分类" prop="itemCategory">
43             <el-select v-model="formData.itemCategory" clearable placeholder="请选择指标分类">
44               <el-option
45                 v-for="item in dataCategoryList"
46                 :key="item.id"
47                 :label="item.label"
48                 :value="item.id + ''"
49               />
50             </el-select>
51           </el-form-item>
52         </el-col>
53         <el-col :span="12">
54           <el-form-item label="时间粒度" prop="timeGranularity">
55             <el-select v-model="formData.timeGranularity" placeholder="请选择">
56               <el-option
57                 v-for="dict in getStrDictOptions(DICT_TYPE.TIME_GRANULARITY)"
58                 :key="dict.value"
59                 :label="dict.label"
60                 :value="dict.value"
61               />
62             </el-select>
63           </el-form-item>
64         </el-col>
65       </el-row>
66       <el-row>
d3ee81 67         <el-col :span="6">
c62768 68           <el-form-item label="指标精度" prop="precision">
J 69             <el-input v-model="formData.precision"/>
70           </el-form-item>
71         </el-col>
d3ee81 72         <el-col :span="6">
c62768 73           <el-form-item label="转换系数" prop="coefficient">
J 74             <el-input v-model="formData.coefficient"/>
75           </el-form-item>
76         </el-col>
77         <el-col :span="6">
78           <el-form-item label="数量单位" prop="unit">
79             <el-input v-model="formData.unit"/>
80           </el-form-item>
81         </el-col>
82       </el-row>
83       <el-row>
d3ee81 84         <el-col :span="6">
c62768 85           <el-form-item label="时间标识" prop="timeLabel">
J 86             <el-select v-model="formData.derItem.timeLabel" clearable placeholder="请选择时间标识">
87               <el-option
88                 v-for="item in dataSetFieldList"
89                 :key="item.id"
90                 :label="item.fieldCode"
91                 :value="item.id + ''"
92               />
93             </el-select>
94           </el-form-item>
95         </el-col>
d3ee81 96         <el-col :span="6">
c62768 97           <el-form-item label="时间限定" prop="timeLimit">
J 98             <el-select v-model="formData.timeLimit" placeholder="请选择"
99                        @change="handleTimeLimitChange($event)">
100               <el-option
d3ee81 101                 v-for="dict in getStrDictOptions(DICT_TYPE.IND_TIME_LIMIT)"
c62768 102                 :key="dict.value"
J 103                 :label="dict.label"
104                 :value="dict.value"
105               />
106             </el-select>
107           </el-form-item>
108         </el-col>
109       </el-row>
110       <el-row v-if="showTimeChange">
d3ee81 111         <el-col :span="6">
c62768 112           <el-form-item label="开始时间" prop="timeStart">
J 113             <el-date-picker
114               v-model="formData.derItem.timeStart"
115               type="datetime"
116               placeholder="请选择开始时间"
117             />
118           </el-form-item>
119         </el-col>
d3ee81 120         <el-col :span="6">
c62768 121           <el-form-item label="结束时间" prop="timeEnd">
J 122             <el-date-picker
123               v-model="formData.derItem.timeEnd"
124               type="datetime"
125               placeholder="请选择结束时间"
126             />
127           </el-form-item>
128         </el-col>
129       </el-row>
130       <el-row>
d3ee81 131         <el-col :span="24">
c62768 132           <el-form-item label="分析维度" prop="dimension">
J 133             <el-select v-model="formData.derItem.dimension" clearable placeholder="请选择分析维度" multiple>
134               <el-option
135                 v-for="item in dataSetFieldList"
136                 :key="item.id"
137                 :label="item.fieldCode"
138                 :value="item.id + ''"
139               />
140             </el-select>
d3ee81 141           </el-form-item>
142         </el-col>
143       </el-row>
144       <el-row>
145         <el-col :span="24">
146           <el-form-item label="备注" prop="remark">
147             <el-input v-model="formData.remark" type="textarea" maxlength="100"/>
c62768 148           </el-form-item>
J 149         </el-col>
150       </el-row>
151     </el-form>
152     <template #footer>
153       <el-button :="formLoading" type="primary" @click="submitForm">确 定</el-button>
154       <el-button @click="dialogVisible = false">取 消</el-button>
155     </template>
156   </Dialog>
157 </template>
158 <script lang="ts" setup>
159   import {DICT_TYPE, getStrDictOptions} from '@/utils/dict'
160   import * as DataSetApi from '@/api/data/ind/data/data.set'
161   import * as ItemApi from '@/api/data/ind/item/item'
162   import {CommonStatusEnum} from '@/utils/constants'
163   import * as DataSourceConfigApi from "@/api/infra/dataSourceConfig";
164   import {PageParam} from "@/api/data/ind/item/item";
165   import * as CategoryApi from "@/api/data/ind/category";
166   import * as DataSetFieldApi from "@/api/data/ind/data/data.field";
167
168   defineOptions({name: 'IndDataSetForm'})
169
170   const {t} = useI18n() // 国际化
171   const message = useMessage() // 消息弹窗
172
173   const dialogVisible = ref(false) // 弹窗的是否展示
174   const dialogTitle = ref('') // 弹窗的标题
175   const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
176   const formType = ref('') // 表单的类型:create - 新增;update - 修改
177   let formData = ref({
178     id: undefined,
179     itemNo: '',
180     itemName: '',
181     itemType: '',
182     itemCategory: '',
d3ee81 183     coefficient: 1,
184     precision: 0,
c62768 185     businessType: '',
J 186     timeRange: '',
187     timeGranularity: '',
188     atomItem: {
189       id: '',
190       itemNo: '',
191       itemName: '',
192     },
193     derItem: {
194       atomItemId: '',
195       timeLabel: '',
196       timeLimit: '',
197       timeStart: '',
198       timeEnd: '',
199       dimension: ''
200     }
201   })
202   const queryParams = ref({
203     itemType: 'ATOM'
204   })
205
206   const validateAsNumber = (rule, value, callback) => {
207     const regex = /^(\-|\+)?\d+(\.\d+)?$/;
208     if (!regex.test(value)) {
209       callback(new Error('请输入数字!'));
210     }
211   }
212
213   const formRules = reactive({
214     itemName: [{required: true, message: '指标名称不能为空', trigger: 'blur'}],
215     itemCategory: [{required: true, message: '指标类型不能为空', trigger: 'blur'}],
d3ee81 216     /*precision: [{validator: validateAsNumber, trigger: 'blur' }],
217     coefficient: [{validator: validateAsNumber, trigger: 'blur' }],*/
218     /*"atomItem.id": [{required: true, message: '原子指标不能为空', trigger: 'blur'}]*/
c62768 219   })
J 220   const formRef = ref() // 表单 Ref
221   const dataSourceList = ref([] as DataSourceConfigApi.DataSourceConfigVO[])
222   const atomItemList = ref([] as ItemApi.ItemVO[])
223   const selected = ref(null)
224   const showTimeChange = ref(false)
225   const dataCategoryList = ref([] as CategoryApi.IndItemCategoryVO[])
226   const dataSetFieldList = ref([] as DataSetFieldApi.DataSetFieldVO[])
227
228   /** 打开弹窗 */
229   const open = async (type: string, id?: string) => {
230     dialogVisible.value = true
231     dialogTitle.value = '派生指标'
232     formType.value = type
233     resetForm()
234     // 加载数据源列表
235     dataCategoryList.value = await CategoryApi.getCategoryListAllSimple()
236     atomItemList.value = await ItemApi.getItemList(queryParams)
237     selected.value = null
238     // 修改时,设置数据
239     if (id) {
240       formLoading.value = true
241       try {
242         formData.value = await ItemApi.getItem(id)
243       } finally {
244         formLoading.value = false
245       }
246     }
247   }
248   defineExpose({open}) // 提供 open 方法,用于打开弹窗
249
250   /** 提交表单 */
251   const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
252   const submitForm = async () => {
253     // 校验表单
254     if (!formRef) return
255     const valid = await formRef.value.validate()
256     if (!valid) return
257     // 提交请求
258     formLoading.value = true
259     try {
260       formData.value.itemType = 'DER'
261       formData.value.derItem.atomItemId = formData.value.atomItem.id
262       if(formData.value.derItem.dimension.length > 0){
263         let dimension = ''
264         for (let index in formData.value.derItem.dimension){
265           dimension = dimension + formData.value.derItem.dimension[index] + ','
266         }
267         formData.value.derItem.dimension = dimension.substring(0, dimension.length - 1)
268       }
269       const data = formData.value as ItemApi.ItemVO
270       if (formType.value === 'create') {
271         await ItemApi.createItem(data)
272         message.success(t('common.createSuccess'))
273       } else {
274         await ItemApi.updateItem(data)
275         message.success(t('common.updateSuccess'))
276       }
277       dialogVisible.value = false
278       // 发送操作成功的事件
279       emit('success')
280     } finally {
281       formLoading.value = false
282     }
283   }
284   /** 重置表单 */
285   const resetForm = () => {
286     formData.value = {
287       id: undefined,
288       itemNo: '',
289       itemName: '',
290       itemType: '',
291       itemCategory: '',
d3ee81 292       coefficient: 1,
293       precision: 0,
c62768 294       businessType: '',
J 295       timeRange: '',
296       timeGranularity: '',
297       remark: '',
298       atomItem: {
299         id: '',
300         itemNo: '',
301         itemName: '',
302       },
303       derItem: {
304         atomItemId: '',
305         timeLabel: '',
306         timeLimit: '',
307         timeStart: '',
308         timeEnd: '',
309         dimension: ''
310       }
311     }
312   }
313
314   async function handleChange(event) {
315     if (event !== null && event !== undefined) {
316       const itemData = await ItemApi.getItem(event)
317       formData.value.atomItem.itemName = itemData.itemName
318       formData.value.atomItem.id = itemData.atomItem.id
319       const queryParams = reactive({
320         dataSetId: itemData.atomItem.dataSet,
321       })
322       dataSetFieldList.value = (await DataSetFieldApi.getDataSetFieldPage(queryParams)).list
323     }
324   }
325
326   function handleTimeLimitChange(event) {
327     showTimeChange.value = event === 'CUSTOM';
328   }
329 </script>