Browse Source

添加检测记录级联以及echarts添加标准线

master
songguoqiang 1 year ago
parent
commit
8fdd04dca4
  1. 4
      src/api/spc/itembasic/index.ts
  2. 2
      src/api/spc/project/index.ts
  3. 412
      src/components/ImportForm/src/DetecImportForm.vue
  4. 112
      src/components/ImportForm/src/ImportForm.vue
  5. 2
      src/views/Login/components/LoginForm.vue
  6. 2
      src/views/Login/components/MobileForm.vue
  7. 5
      src/views/detection/records/index.vue
  8. 62
      src/views/tjanalysis/zlanalysis/index.vue

4
src/api/spc/itembasic/index.ts

@ -84,4 +84,8 @@ export const importTemplate = () => {
export const selectItems = async () => { export const selectItems = async () => {
return await request.get({ url: `/spc/itembasic/selectItems`}) return await request.get({ url: `/spc/itembasic/selectItems`})
}
export const selectItemsByProjectCode = async (code:String) => {
return await request.get({ url: `/spc/itembasic/selectItemsByProjectCode?code=` + code})
} }

2
src/api/spc/project/index.ts

@ -55,6 +55,6 @@ export const importTemplate = () => {
return request.download({ url: '/spc/project/get-import-template' }) return request.download({ url: '/spc/project/get-import-template' })
} }
export const selectAllPros = async () => { export const selectAllPros = async () => {//查询所有的项目
return await request.get({ url: `/spc/project/selectAllPros`}) return await request.get({ url: `/spc/project/selectAllPros`})
} }

412
src/components/ImportForm/src/DetecImportForm.vue

@ -0,0 +1,412 @@
<!-- 导入组件 -->
<template>
<Dialog v-model="dialogVisible" title="导入" width="800">
<el-form
:inline="true"
:model="queryParams"
class="demo-form-inline"
style="margin-bottom: 10px"
label-width="100px"
>
<el-form-item label="项目" style="width: calc(26%)">
<el-select
v-model="queryParams.proCode"
placeholder="请选择项目"
clearable
style="width: 100%"
@change="detectionProjectChange"
>
<el-option v-for=" (item) in projectList" :key="item" :label="item.name" :value="item.code" />
</el-select>
</el-form-item>
<el-form-item label="物料" style="width: calc(26%)">
<el-select
v-model="queryParams.itemCode"
placeholder="请选择物料"
clearable
style="width: 100%"
@change="detectionItemChange"
>
<el-option v-for=" (item) in itemList" :key="item" :label="item.name" :value="item.code" />
</el-select>
</el-form-item>
<el-form-item label="检测类型" style="width: calc(26%)">
<el-select
v-model="queryParams.detectionType"
placeholder="请选择检测类型"
clearable
style="width: 100%"
@change="detectionTypeChange"
>
<el-option v-for="dict in dictTypeList" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
</el-form>
<el-upload v-if="uploadOpen" ref="uploadRef" v-model:file-list="fileList" :action="importUrl + '?mode=' + mode + '&file=' + file + '&updatePart=' + updatePart + '&outFile=' + outFile"
:auto-upload="false" :disabled="formLoading" :headers="uploadHeaders" :limit="1" :on-error="submitFormError"
:on-exceed="handleExceed" :on-success="submitFormSuccess" :accept="accept" drag
style="width:300px;margin:0 auto">
<Icon icon="ep:upload-filled" color="#c0c4cc" size="60" />
<div class="el-upload__text">将文件拖到此处<em>点击上传</em></div>
<template #tip>
<div class="el-upload__tip ml--126px mr--80px">
<div class="flex">
<div class="label h-32px mr-26px color-#acaeb3 font-size-14px w-100px text-right" style="line-height:32px">导入模式</div>
<div class="">
<div class="radio">
<el-radio-group v-model="mode">
<el-radio :label="1" :disabled="updateIsDisable">更新</el-radio>
<el-radio :label="2" :disabled="appendIsDisable">追加</el-radio>
<el-radio :label="3" :disabled="coverIsDisable">覆盖</el-radio>
</el-radio-group>
</div>
<div class="tips color-#acaeb3 font-size-14px">
<div class="mt-2">更新新增并修改</div>
<div class="mt-2">追加只新增不修改</div>
<div class="mt-2">覆盖只修改不新增</div>
</div>
</div>
</div>
<div class="flex mt-16px">
<div class="label h-32px mr-26px color-#acaeb3 font-size-14px w-100px text-right" style="line-height:32px">部分保存</div>
<div class="">
<div class="switch">
<el-switch v-model="updatePart" />
</div>
<div class="tips color-#acaeb3 font-size-14px">
<div class="mt-2">部分保存如存在错误数据正确数据正常导入</div>
<div class="mt-2">全部保存全部数据正确才能导入</div>
</div>
</div>
</div>
<div class="flex mt-16px" v-if="isShowOut">
<div class="label h-32px mr-26px color-#acaeb3 font-size-14px w-100px text-right" style="line-height:32px">是否外部资源</div>
<div class="">
<div class="switch">
<el-switch v-model="outFile" />
</div>
</div>
</div>
</div>
</template>
</el-upload>
<template #footer>
<div class="flex items-center">
<div class="flex-1 text-left">
<el-button type="primary" plain @click="importTemplate">
<Icon icon="ep:download" />
下载模板
</el-button>
</div>
<el-button :disabled="formLoading" type="primary" @click="submitForm"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
</div>
</template>
</Dialog>
</template>
<script lang="ts" setup>
import { getAccessToken, getTenantId } from '@/utils/auth'
import download from '@/utils/download'
defineOptions({ name: 'ImportForm' })
import * as ZlnalysisAPI from '@/api/tjanalysis/zlanalysis'
import * as ProjecAPI from '@/api/spc/project'
import * as ItembasicApi from '@/api/spc/itembasic'
import * as TemplateItemDetailsApi from '@/api/spc/templateItemDetails'
import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
import {formatDate} from '@/utils/formatTime'
const message = useMessage() //
const dialogVisible = ref(false) //
const formLoading = ref(false) //
const uploadRef = ref()
const uploadHeaders = ref() // Header
const fileList = ref([]) //
const file = ref('')
const queryParams = reactive({
proCode: '',
itemCode: '',
detectionType: '',
detectionItemContentId: null,
ecTab: '1'
})
const uploadOpen=ref(false)
const props = defineProps({
importTemplateData: {
type: Object,
required: true
},
//
accept: {
type: String,
required: false,
default:'.xlsx,.xls'
},
// .1
mode: {
type: Number,
required: false,
default: 1
},
// ,
updateIsDisable: {
type: Boolean,
required: false,
default: false
},
// ,
appendIsDisable: {
type: Boolean,
required: false,
default: false
},
// ,
coverIsDisable: {
type: Boolean,
required: false,
default: false
},
// ,
updatePart: {
type: Boolean,
required: false,
default: false
},
url:{
type: String,
required: false,
},
//
isShowOut: {
type: Boolean,
required: false,
default: false
},
outFile: {
type: Boolean,
required: false,
default: false
},
})
const importTemplateData= ref(props.importTemplateData)
const accept= ref(props.accept)
const mode = ref(props.mode)//.1
const updateIsDisable = ref(props.updateIsDisable)//,
const appendIsDisable = ref(props.appendIsDisable)//,
const coverIsDisable = ref(props.coverIsDisable)//,
const updatePart = ref(props.updatePart)//
const outFile = ref(props.outFile)//
//
const projectList = ref()
//
const itemList = ref()
//
const dictTypeList = ref()
const getProject = async () => {//
const _projectList = await ProjecAPI.selectAllPros()
if (_projectList != null && _projectList.length != 0) {
projectList.value = _projectList
let code = projectList.value[0].code;
queryParams.proCode = code;
await _itemList(code);
}
}
//code
const _itemList =async (projectCode)=>{
itemList.value = []
const _itemList = await ItembasicApi.selectItemsByProjectCode(projectCode);
if (_itemList != null && _itemList.length != 0) {
itemList.value = _itemList
queryParams.itemCode = itemList.value[0].code
dictOptions();
}
}
const dictOptions = async () => {//
dictTypeList.value = []
const dictOptions = await getIntDictOptions(DICT_TYPE.ITEMBASIC_TYPE);
if (dictOptions != null && dictOptions.length != 0) {
dictTypeList.value = dictOptions;
queryParams.detectionType = dictOptions[0].value + ''
uploadOpen.value = true;
}
}
const detectionProjectChange =async ()=>{//
if(queryParams.proCode==''){
queryParams.itemCode=''
queryParams.detectionType=''
itemList.value = [];
dictTypeList.value = [];
uploadOpen.value = false;
}else{
_itemList(queryParams.proCode);
}
}
const detectionTypeChange=async()=>{
if(queryParams.detectionType==''){
uploadOpen.value = false;
}else{
uploadOpen.value = true;
}
}
const detectionItemChange = async ()=>{//
if(queryParams.itemCode==''){
queryParams.detectionType=''
dictTypeList.value = [];
uploadOpen.value = false;
}else{
dictOptions();
uploadOpen.value =true;
}
}
onMounted(()=>{
getProject()
})
const importUrl =
import.meta.env.VITE_BASE_URL + import.meta.env.VITE_API_URL + props.url
/** 打开弹窗 */
const open = () => {
console.log(111)
dialogVisible.value = true
resetForm()
}
defineExpose({ open }) // open
/** 提交表单 */
const submitForm = async () => {
if (fileList.value.length == 0) {
message.error('请上传文件')
return
}
file.value = fileList.value[0].name
//
uploadHeaders.value = {
Authorization: 'Bearer ' + getAccessToken(),
'tenant-id': getTenantId(),
}
formLoading.value = true
uploadRef.value!.submit()
}
/** 文件上传成功 */
const emits = defineEmits(['success'])
const submitFormSuccess = (response: any) => {
formLoading.value = true
if(response){
if(response.code == 500){
message.error('导入失败')
return;
} else if (response.data.errorCount > 0) {
message.confirm('文件中有部分数据导入失败,是否下载失败数据?').then(() => {
// download.excel(file, 'file_' + new Date().getTime())
// url
// const downloadElement = document.createElement('a')
// console.log(172, import.meta.env.VITE_BASE_URL + import.meta.env.VITE_API_URL + '/' + response.data.errorFile)
// console.log(172, import.meta.env.VITE_BASE_URL + '/admin-api/opt/profile/' + response.data.errorFile)
window.open(import.meta.env.VITE_BASE_URL + '/admin-api/profile/' + response.data.errorFile ,'222')
// downloadElement.setAttribute('href', import.meta.env.VITE_BASE_URL + import.meta.env.VITE_API_URL + response.data.errorFile )
//
// downloadElement.click()
})
}
}else{
message.success('导入成功')
}
// if (response.code !== 0) {
// message.error(response.msg)
// formLoading.value = false
// return
// }
// //
// const data = response.data
// const create = response.data.importResult[0]
// const update = response.data.importResult[1]
// const failure = response.data.importResult[2]
// let text = '' + data[create].length + ';'
// for (let name of data[create]) {
// text += '< ' + name + ' >'
// }
// text += '' + data[update].length + ';'
// for (const name of data[update]) {
// text += '< ' + name + ' >'
// }
// text += '' + Object.keys(data[failure]).length + ';'
// for (const name in data[failure]) {
// text += '< ' + name + ': ' + data[failure][name] + ' >'
// }
// message.alert(text)
//
formLoading.value = false
emits('success')
dialogVisible.value = false
}
/** 上传错误提示 */
const submitFormError = (): void => {
message.error('上传失败,请您重新上传!')
formLoading.value = false
}
/** 重置表单 */
const resetForm = () => {
//
formLoading.value = false
uploadRef.value?.clearFiles()
fileList.value = []
}
/** 文件数超出提示 */
const handleExceed = (): void => {
message.error('最多只能上传一个文件!')
}
/** 下载模板操作 */
const importTemplate = () => {
const res = importTemplateData.value.templateUrl
download.excel(res, importTemplateData.value.templateTitle)
}
</script>
<style scoped lang="scss">
.tips {
div {
position: relative;
padding-left: 22px;
&::before {
width: 4px;
height: 4px;
border-radius: 50%;
content: '';
background: #c2c2c2;
position: absolute;
top: 50%;
margin-top: -2px;
left: 4px;
}
}
}
</style>

112
src/components/ImportForm/src/ImportForm.vue

@ -1,63 +1,6 @@
<!-- 导入组件 --> <!-- 导入组件 -->
<template> <template>
<Dialog v-model="dialogVisible" title="导入" width="600"> <Dialog v-model="dialogVisible" title="导入" width="600">
<el-form
:inline="true"
:model="queryParams"
class="demo-form-inline"
style="margin-bottom: -17px"
label-width="100px"
>
<el-form-item label="项目" style="width: calc(20% - 32px)">
<el-select
v-model="queryParams.proCode"
placeholder="请选择项目"
clearable
style="width: 100%"
>
<el-option v-for=" (item) in projectList" :key="item" :label="item.name" :value="item.code" />
</el-select>
</el-form-item>
<el-form-item label="物料" style="width: calc(20% - 32px)">
<el-select
v-model="queryParams.itemCode"
placeholder="请选择物料"
clearable
style="width: 100%"
@change="detectionItemChange"
>
<el-option v-for=" (item) in itemList" :key="item" :label="item.name" :value="item.code" />
</el-select>
</el-form-item>
<el-form-item label="物料类型" style="width: calc(20% - 32px)">
<el-select
v-model="queryParams.detectionType"
placeholder="请选择检测类型"
clearable
style="width: 100%"
@change="detectionItemChange"
>
<el-option v-for="dict in getIntDictOptions(DICT_TYPE.ITEMBASIC_TYPE)" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
<el-form-item label="检测项" style="width: calc(20% - 32px)">
<el-select
v-model="queryParams.detectionItemContentId"
placeholder="请选择检测项"
clearable
style="width: 100%"
@change="deItemChange"
>
<el-option v-for=" (item) in detectionItemList" :key="item" :label="item.name" :value="item.value" />
</el-select>
</el-form-item>
<!-- <el-form-item>
<el-button type="info" plain @click="handleQuery">
<Icon class="mr-5px" icon="ep:search" />
搜索
</el-button>
</el-form-item> -->
</el-form>
<el-upload ref="uploadRef" v-model:file-list="fileList" :action="importUrl + '?mode=' + mode + '&file=' + file + '&updatePart=' + updatePart + '&outFile=' + outFile" <el-upload ref="uploadRef" v-model:file-list="fileList" :action="importUrl + '?mode=' + mode + '&file=' + file + '&updatePart=' + updatePart + '&outFile=' + outFile"
:auto-upload="false" :disabled="formLoading" :headers="uploadHeaders" :limit="1" :on-error="submitFormError" :auto-upload="false" :disabled="formLoading" :headers="uploadHeaders" :limit="1" :on-error="submitFormError"
:on-exceed="handleExceed" :on-success="submitFormSuccess" :accept="accept" drag :on-exceed="handleExceed" :on-success="submitFormSuccess" :accept="accept" drag
@ -126,12 +69,6 @@ import { getAccessToken, getTenantId } from '@/utils/auth'
import download from '@/utils/download' import download from '@/utils/download'
defineOptions({ name: 'ImportForm' }) defineOptions({ name: 'ImportForm' })
import * as ZlnalysisAPI from '@/api/tjanalysis/zlanalysis'
import * as ProjecAPI from '@/api/spc/project'
import * as ItembasicApi from '@/api/spc/itembasic'
import * as TemplateItemDetailsApi from '@/api/spc/templateItemDetails'
import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
import {formatDate} from '@/utils/formatTime'
const message = useMessage() // const message = useMessage() //
@ -142,13 +79,6 @@ const uploadHeaders = ref() // 上传 Header 头
const fileList = ref([]) // const fileList = ref([]) //
const file = ref('') const file = ref('')
const queryParams = reactive({
proCode: '',
itemCode: '',
detectionType: '',
detectionItemContentId: null,
ecTab: '1'
})
const props = defineProps({ const props = defineProps({
@ -217,53 +147,11 @@ const coverIsDisable = ref(props.coverIsDisable)//覆盖是否禁用,默认值
const updatePart = ref(props.updatePart)// const updatePart = ref(props.updatePart)//
const outFile = ref(props.outFile)// const outFile = ref(props.outFile)//
//
const projectList = ref()
//
const itemList = ref()
//
const detectionItemList = ref()
const pnaLoading = ref(true)
const tabLoading = ref(true)
const ec1Loading = ref(true)
const ec2Loading = ref(true)
const ec3Loading = ref(true)
const ec4Loading = ref(true)
const ec5Loading = ref(true)
const initQuerys = async () => {
const dictOptions = await getIntDictOptions(DICT_TYPE.ITEMBASIC_TYPE)
if (dictOptions != null && dictOptions.length != 0) {
queryParams.detectionType = dictOptions[0].value + ''
}
const _projectList = await ProjecAPI.selectAllPros()
if (_projectList != null && _projectList.length != 0) {
projectList.value = _projectList
}
const _itemList = await ItembasicApi.selectItems()
if (_itemList != null && _itemList.length != 0) {
itemList.value = _itemList
queryParams.itemCode = _itemList[0].code
}
const _detectionItemList = await TemplateItemDetailsApi.selectDetectionItems(queryParams.itemCode , queryParams.detectionType)
if (_detectionItemList != null && _detectionItemList.lenght != 0) {
detectionItemList.value = _detectionItemList
queryParams.detectionItemContentId = _detectionItemList[0].value
}
}
onMounted(()=>{
initQuerys()
})
const importUrl = const importUrl =
import.meta.env.VITE_BASE_URL + import.meta.env.VITE_API_URL + props.url import.meta.env.VITE_BASE_URL + import.meta.env.VITE_API_URL + props.url
/** 打开弹窗 */ /** 打开弹窗 */
const open = () => { const open = () => {
console.log(111)
dialogVisible.value = true dialogVisible.value = true
resetForm() resetForm()
} }

2
src/views/Login/components/LoginForm.vue

@ -120,7 +120,7 @@ const loginData = reactive({
captchaEnable: import.meta.env.VITE_APP_CAPTCHA_ENABLE, captchaEnable: import.meta.env.VITE_APP_CAPTCHA_ENABLE,
tenantEnable: import.meta.env.VITE_APP_TENANT_ENABLE, tenantEnable: import.meta.env.VITE_APP_TENANT_ENABLE,
loginForm: { loginForm: {
tenantName: '闻荫源码', tenantName: '长春华涛',
username: 'admin', username: 'admin',
password: '123456', password: '123456',
captchaVerification: '', captchaVerification: '',

2
src/views/Login/components/MobileForm.vue

@ -132,7 +132,7 @@ const loginData = reactive({
}, },
loginForm: { loginForm: {
uuid: '', uuid: '',
tenantName: '闻荫源码', tenantName: '长春华涛',
mobileNumber: '', mobileNumber: '',
code: '' code: ''
} }

5
src/views/detection/records/index.vue

@ -52,7 +52,8 @@
/> />
<!-- 导入 --> <!-- 导入 -->
<ImportForm ref="importFormRef" url="/detection/records/import" :importTemplateData="importTemplateData" @success="importSuccess" /> <DetecImportForm ref="importFormRef" url="/detection/records/import" :importTemplateData="importTemplateData" @success="importSuccess" />
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
@ -219,7 +220,7 @@ const searchFormClick = (searchData) => {
/** 初始化 **/ /** 初始化 **/
onMounted(async () => { onMounted(async () => {
getList() getList()
//importTemplateData.templateUrl = await RecordsApi.importTemplate() importTemplateData.templateUrl = await RecordsApi.importTemplate()
}) })
</script> </script>

62
src/views/tjanalysis/zlanalysis/index.vue

@ -14,6 +14,7 @@
placeholder="请选择项目" placeholder="请选择项目"
clearable clearable
style="width: 100%" style="width: 100%"
@change="detectionProjectChange"
> >
<el-option v-for=" (item) in projectList" :key="item" :label="item.name" :value="item.code" /> <el-option v-for=" (item) in projectList" :key="item" :label="item.name" :value="item.code" />
</el-select> </el-select>
@ -230,6 +231,7 @@ const tabIndex = ref(0)
// //
function setChart1(datavv) { function setChart1(datavv) {
console.info("datavv",datavv)
let chart = echart.init(document.getElementById('myEcharts1'), 'light') let chart = echart.init(document.getElementById('myEcharts1'), 'light')
// //
chart.setOption({ chart.setOption({
@ -355,7 +357,6 @@ function setChart2(rangeData) {
} }
} }
function setChart3(ztData) { function setChart3(ztData) {
// console.log(ztData , 'daikun')
if (ztData != null) { if (ztData != null) {
myEcharts3Ref.value.open(ztData.datas , ztData.downLimit , ztData.upLimit) myEcharts3Ref.value.open(ztData.datas , ztData.downLimit , ztData.upLimit)
} }
@ -370,11 +371,11 @@ function setChart4(ybData) {
tooltip: { tooltip: {
trigger: 'axis' trigger: 'axis'
}, },
// legend: { legend: {
// data: ['Highest', 'Lowest'], data: ['标准上限', '标准下限'],
// top: '0', top: '0',
// right: '3%' right: '3%'
// }, },
grid: { grid: {
left: '3%', left: '3%',
right: '4%', right: '4%',
@ -394,7 +395,17 @@ function setChart4(ybData) {
name: '检测值', name: '检测值',
data: ybData != null ? ybData.yDatas : [], data: ybData != null ? ybData.yDatas : [],
type: 'line' type: 'line'
} },
{
name: '标准上限',
data: ybData != null ? ybData.bzsx : [],
type: 'line'
},
{
name: '标准下限',
data: ybData != null ? ybData.bzxx : [],
type: 'line'
},
] ]
}) })
window.onresize = function () { window.onresize = function () {
@ -412,11 +423,11 @@ function setChart5(jzData) {
tooltip: { tooltip: {
trigger: 'axis' trigger: 'axis'
}, },
// legend: { legend: {
// data: ['Highest', 'Lowest'], data: ['均值上限', '均值下限'],
// top: '0', top: '0',
// right: '3%' right: '3%'
// }, },
grid: { grid: {
left: '3%', left: '3%',
right: '4%', right: '4%',
@ -436,6 +447,16 @@ function setChart5(jzData) {
name: '均值', name: '均值',
data: jzData != null ? jzData.yDatas : [], data: jzData != null ? jzData.yDatas : [],
type: 'line' type: 'line'
},
{
name: '均值上限',
data: jzData != null ? jzData.jzsx : [],
type: 'line'
},
{
name: '均值下限',
data: jzData != null ? jzData.jzxx : [],
type: 'line'
} }
] ]
}) })
@ -445,6 +466,20 @@ function setChart5(jzData) {
} }
} }
const detectionProjectChange = async()=> {
if(queryParams.proCode==''){
}
queryParams.detectionItemContentId = null
const _detectionItemList = await TemplateItemDetailsApi.selectDetectionItems(queryParams.itemCode , queryParams.detectionType)
if (_detectionItemList != null && _detectionItemList.length != 0) {
detectionItemList.value = _detectionItemList
queryParams.detectionItemContentId = _detectionItemList[0].value
}
initData()
}
const detectionItemChange = async()=> { const detectionItemChange = async()=> {
detectionItemList.value = null detectionItemList.value = null
queryParams.detectionItemContentId = null queryParams.detectionItemContentId = null
@ -474,7 +509,6 @@ const changTabIndex = async (tIndexV) => {
tabIndex.value = tIndexV tabIndex.value = tIndexV
queryParams.ecTab = tIndexV queryParams.ecTab = tIndexV
const dvDatas = await ZlnalysisAPI.getZcnlEcharts(queryParams) const dvDatas = await ZlnalysisAPI.getZcnlEcharts(queryParams)
// console.log(dvDatas , '333333')
if (dvDatas != null) { if (dvDatas != null) {
if (tIndexV == 0) { if (tIndexV == 0) {
setChart1(dvDatas.menMap) setChart1(dvDatas.menMap)
@ -515,7 +549,7 @@ const initData = async () => {
} }
const initQuerys = async () => { const initQuerys = async () => {
const dictOptions = await getIntDictOptions(DICT_TYPE.ITEMBASIC_TYPE) const dictOptions = await getIntDictOptions(DICT_TYPE.ITEMBASIC_TYPE)//
if (dictOptions != null && dictOptions.length != 0) { if (dictOptions != null && dictOptions.length != 0) {
queryParams.detectionType = dictOptions[0].value + '' queryParams.detectionType = dictOptions[0].value + ''
} }

Loading…
Cancel
Save