AlgorithmManage.vue 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698
  1. <script setup lang="ts">
  2. import { onMounted, ref, useTemplateRef } from 'vue';
  3. import dayjs, { Dayjs } from 'dayjs';
  4. import DeviceGroupSelect from '@/components/DeviceGroupSelect.vue';
  5. import SvgIcon from '@/components/SvgIcon.vue';
  6. import { useDictData } from '@/hooks/dict-data';
  7. import { useRequest } from '@/hooks/request';
  8. import { t } from '@/i18n';
  9. import { addAlgorithmConfigUpdate, getAlgorithmConfigInfo } from '@/api';
  10. import { DictCode } from '@/constants';
  11. import EquipmentControl from './EquipmentControl.vue';
  12. import MonthSetting from './MonthSetting.vue';
  13. import SetInterval from './SetInterval.vue';
  14. import type { FormInstance, Rule } from 'ant-design-vue/es/form';
  15. import type { AlgorithmForm, ChillersItem, TemperatureRange, TemperatureRangeItem } from '@/types';
  16. const { dictData: algTempCtrlMinStep, getDictData: getAlgTempCtrlMinStep } = useDictData(DictCode.AlgTempCtrlMinStep);
  17. const { dictData: algTempHumCollectPeriod, getDictData: getAlgTempHumCollectPeriod } = useDictData(
  18. DictCode.AlgTempHumCollectPeriod,
  19. );
  20. const { dictData: algWtTempCtrlMode, getDictData: getAlgWtTempCtrlMode } = useDictData(DictCode.AlgWtTempCtrlMode);
  21. const { dictData: algAlways, getDictData: getAlgAlways } = useDictData(DictCode.AlgAlways);
  22. const { dictData: algWtTempSetStep, getDictData: getAlgWtTempSetStep } = useDictData(DictCode.AlgWtTempSetStep);
  23. const formRef = ref<FormInstance>();
  24. const monthSettingRefs = useTemplateRef('monthSetting');
  25. const setIntervalRefs = ref<InstanceType<typeof SetInterval>[]>([]);
  26. const equipmentControlRefs = ref<InstanceType<typeof EquipmentControl>[]>([]);
  27. const { handleRequest } = useRequest();
  28. const activeKey = ref<string[]>(['1', '2', '3']);
  29. const customStyle = 'border-radius: 4px;;border: 0;background: #F5F6F7;';
  30. const analysisOpen = ref<boolean>(false);
  31. const setOpen = ref<boolean>(false);
  32. const temperatureSettingValue = ref<string>('');
  33. const analysisTypeDisplay = ref<number>(0);
  34. const coolingPipeDynamicOffsetDisplay = ref<number>(0);
  35. const coolingPipeDynamicSetDisplay = ref<number>(0);
  36. const coolingPipeDynamicDeadZoneDisplay = ref<number>(0);
  37. const coolingPipeDynamicLowerDisplay = ref<number>(0);
  38. const coolingPipeDynamicUpperDisplay = ref<number>(0);
  39. const temperatureRangeList = ref<TemperatureRange[]>([]);
  40. const chillersList = ref<ChillersItem[]>([]);
  41. const algorithmId = ref<number>();
  42. const algorithmForm = ref<AlgorithmForm>({
  43. enabled: false,
  44. sendCtrlCmd: true,
  45. msgBox: true,
  46. tempRiseCtrlPeriod: 10,
  47. tempReductionCtrlPeriod: 3,
  48. minCtrlStep: '',
  49. intelligentMode: 0,
  50. controlBasis: 0,
  51. period: 0,
  52. tempSafetyMargin: 0,
  53. humiditySafetyMargin: 0,
  54. tempHumidityCollectPeriod: '',
  55. waterSupplyTempSource: 0,
  56. analysis: true,
  57. analysisType: 0,
  58. enableRefrigerationPipeDynamicSet: true,
  59. enableCoolingPipeDynamicSet: false,
  60. coolingPipeDynamicOffset: 0,
  61. coolingPipeDynamicSet: 0,
  62. coolingPipeDynamicDeadZone: 0,
  63. coolingPipeDynamicLower: 0,
  64. coolingPipeDynamicUpper: 0,
  65. });
  66. const addClick = () => {
  67. temperatureRangeList.value.push({
  68. time: undefined,
  69. lower: 0,
  70. upper: 0,
  71. });
  72. };
  73. const deleteClick = (index: number) => {
  74. temperatureRangeList.value.splice(index, 1);
  75. };
  76. const rules: Record<string, Rule[]> = {
  77. sendCtrlCmd: [{ required: true, message: t('common.cannotEmpty'), trigger: 'change' }],
  78. msgBox: [{ required: true, message: t('common.cannotEmpty'), trigger: 'change' }],
  79. tempRiseCtrlPeriod: [{ required: true, message: t('common.cannotEmpty'), trigger: 'change' }],
  80. tempReductionCtrlPeriod: [{ required: true, message: t('common.cannotEmpty'), trigger: 'change' }],
  81. minCtrlStep: [{ required: true, message: t('common.cannotEmpty'), trigger: 'change' }],
  82. intelligentMode: [{ required: true, message: t('common.cannotEmpty'), trigger: 'change' }],
  83. controlBasis: [{ required: true, message: t('common.cannotEmpty'), trigger: 'change' }],
  84. period: [{ required: true, message: t('common.cannotEmpty'), trigger: 'change' }],
  85. tempSafetyMargin: [{ required: true, message: t('common.cannotEmpty'), trigger: 'change' }],
  86. humiditySafetyMargin: [{ required: true, message: t('common.cannotEmpty'), trigger: 'change' }],
  87. tempHumidityCollectPeriod: [{ required: true, message: t('common.cannotEmpty'), trigger: 'change' }],
  88. waterSupplyTempSource: [{ required: true, message: t('common.cannotEmpty'), trigger: 'change' }],
  89. };
  90. const handleDevGroupChange = (groupingId: number) => {
  91. temperatureRangeList.value = [];
  92. chillersList.value = [];
  93. handleRequest(async () => {
  94. const {
  95. id: algId,
  96. enabled,
  97. sendCtrlCmd,
  98. msgBox,
  99. tempRiseCtrlPeriod,
  100. minCtrlStep,
  101. intelligentMode,
  102. controlBasis,
  103. period,
  104. tempSafetyMargin,
  105. humiditySafetyMargin,
  106. tempHumidityCollectPeriod,
  107. waterSupplyTempSource,
  108. tempReductionCtrlPeriod,
  109. analysis,
  110. analysisType,
  111. enableRefrigerationPipeDynamicSet,
  112. enableCoolingPipeDynamicSet,
  113. coolingPipeDynamicOffset,
  114. coolingPipeDynamicSet,
  115. coolingPipeDynamicDeadZone,
  116. coolingPipeDynamicLower,
  117. coolingPipeDynamicUpper,
  118. chillers,
  119. chilledWaterOutletTempRangeList,
  120. chilledWaterOutletTempSet,
  121. } = await getAlgorithmConfigInfo(groupingId);
  122. algorithmId.value = algId;
  123. Object.assign(algorithmForm.value, {
  124. enabled,
  125. sendCtrlCmd,
  126. msgBox,
  127. tempRiseCtrlPeriod,
  128. tempReductionCtrlPeriod,
  129. minCtrlStep: String(minCtrlStep),
  130. intelligentMode,
  131. controlBasis,
  132. period,
  133. tempSafetyMargin,
  134. humiditySafetyMargin,
  135. tempHumidityCollectPeriod: String(tempHumidityCollectPeriod),
  136. waterSupplyTempSource,
  137. analysis,
  138. analysisType,
  139. enableRefrigerationPipeDynamicSet,
  140. enableCoolingPipeDynamicSet,
  141. coolingPipeDynamicOffset,
  142. coolingPipeDynamicSet,
  143. coolingPipeDynamicDeadZone,
  144. coolingPipeDynamicLower,
  145. coolingPipeDynamicUpper,
  146. });
  147. analysisTypeDisplay.value = analysisType;
  148. coolingPipeDynamicOffsetDisplay.value = coolingPipeDynamicOffset;
  149. coolingPipeDynamicSetDisplay.value = coolingPipeDynamicSet;
  150. coolingPipeDynamicDeadZoneDisplay.value = coolingPipeDynamicDeadZone;
  151. coolingPipeDynamicLowerDisplay.value = coolingPipeDynamicLower;
  152. coolingPipeDynamicUpperDisplay.value = coolingPipeDynamicUpper;
  153. temperatureSettingValue.value = chilledWaterOutletTempSet;
  154. chilledWaterOutletTempRangeList.forEach((item) => {
  155. const { startTime, endTime, lower, upper } = item;
  156. temperatureRangeList.value.push({
  157. time: [dayjs(startTime, 'HH:mm'), dayjs(endTime, 'HH:mm')],
  158. lower,
  159. upper,
  160. });
  161. });
  162. chillers.forEach((item) => {
  163. const {
  164. id,
  165. devId,
  166. waterTempControlMode,
  167. continuous,
  168. stopCompensate,
  169. restartCompensate,
  170. safeDiffPressureLower,
  171. safeLoadLower,
  172. waterTempStep,
  173. deviceName,
  174. } = item;
  175. chillersList.value.push({
  176. id,
  177. algId,
  178. devId,
  179. waterTempControlMode: String(waterTempControlMode),
  180. continuous: String(continuous),
  181. stopCompensate,
  182. restartCompensate,
  183. safeDiffPressureLower,
  184. safeLoadLower,
  185. waterTempStep: String(waterTempStep),
  186. deviceName,
  187. });
  188. });
  189. });
  190. };
  191. const analysisEditor = () => {
  192. analysisTypeDisplay.value = algorithmForm.value.analysisType;
  193. analysisOpen.value = true;
  194. };
  195. const setEditor = () => {
  196. const {
  197. coolingPipeDynamicOffset,
  198. coolingPipeDynamicSet,
  199. coolingPipeDynamicDeadZone,
  200. coolingPipeDynamicLower,
  201. coolingPipeDynamicUpper,
  202. } = algorithmForm.value;
  203. coolingPipeDynamicOffsetDisplay.value = coolingPipeDynamicOffset;
  204. coolingPipeDynamicSetDisplay.value = coolingPipeDynamicSet;
  205. coolingPipeDynamicDeadZoneDisplay.value = coolingPipeDynamicDeadZone;
  206. coolingPipeDynamicLowerDisplay.value = coolingPipeDynamicLower;
  207. coolingPipeDynamicUpperDisplay.value = coolingPipeDynamicUpper;
  208. setOpen.value = true;
  209. };
  210. const okConfirm = () => {
  211. algorithmForm.value.analysisType = analysisTypeDisplay.value;
  212. analysisOpen.value = false;
  213. };
  214. const okSetConfirm = () => {
  215. algorithmForm.value.coolingPipeDynamicOffset = coolingPipeDynamicOffsetDisplay.value;
  216. algorithmForm.value.coolingPipeDynamicSet = coolingPipeDynamicSetDisplay.value;
  217. algorithmForm.value.coolingPipeDynamicDeadZone = coolingPipeDynamicDeadZoneDisplay.value;
  218. algorithmForm.value.coolingPipeDynamicLower = coolingPipeDynamicLowerDisplay.value;
  219. algorithmForm.value.coolingPipeDynamicUpper = coolingPipeDynamicUpperDisplay.value;
  220. setOpen.value = false;
  221. };
  222. // 添加格式转换
  223. const formatDate = (date: Dayjs) => date.format('HH:mm');
  224. const addAlgorithm = async () => {
  225. try {
  226. // 创建校验任务队列(包含所有子组件+父组件自身)
  227. const allTasks = [
  228. ...setIntervalRefs.value.map((c) => c.formRefSubmit()),
  229. ...equipmentControlRefs.value.map((c) => c.formRefSubmit()),
  230. formRef.value?.validate() || Promise.resolve(),
  231. monthSettingRefs.value?.formRefSubmit(),
  232. ];
  233. // 并行执行所有校验(父+子)
  234. await Promise.all(allTasks);
  235. handleRequest(async () => {
  236. const timeList: TemperatureRangeItem[] = [];
  237. temperatureRangeList.value.forEach((item) => {
  238. const { time, lower, upper } = item;
  239. const data = time?.map(formatDate) || [];
  240. timeList.push({
  241. startTime: data[0],
  242. endTime: data[1],
  243. lower,
  244. upper,
  245. });
  246. });
  247. await addAlgorithmConfigUpdate({
  248. ...algorithmForm.value,
  249. id: algorithmId.value,
  250. chillers: chillersList.value,
  251. chilledWaterOutletTempRangeList: timeList,
  252. chilledWaterOutletTempSet: monthSettingRefs.value ? monthSettingRefs.value.stringConversion() : '',
  253. });
  254. });
  255. } catch {
  256. console.log('存在验证未通过的表单');
  257. }
  258. };
  259. onMounted(() => {
  260. handleRequest(async () => {
  261. await getAlgTempCtrlMinStep();
  262. algorithmForm.value.minCtrlStep = algTempCtrlMinStep.value[0].dictEngValue;
  263. await getAlgTempHumCollectPeriod();
  264. algorithmForm.value.tempHumidityCollectPeriod = algTempHumCollectPeriod.value[0].dictEngValue;
  265. await getAlgWtTempCtrlMode();
  266. await getAlgAlways();
  267. await getAlgWtTempSetStep();
  268. });
  269. });
  270. </script>
  271. <template>
  272. <div>
  273. <AFlex justify="space-between">
  274. <div class="title-text">算法配置</div>
  275. <DeviceGroupSelect @change="handleDevGroupChange" />
  276. </AFlex>
  277. <div class="algorithm-content">
  278. <ACollapse v-model:active-key="activeKey" style="border: 0" collapsible="icon">
  279. <ACollapsePanel key="1" :style="customStyle">
  280. <template #header>
  281. <AFlex align="center" class="header-heigth">
  282. <span class="header-text">主机冷冻水智控</span>
  283. <ASwitch v-model:checked="algorithmForm.enabled" />
  284. </AFlex>
  285. </template>
  286. <div>
  287. <AForm
  288. ref="formRef"
  289. class="algorithm-form"
  290. :model="algorithmForm"
  291. label-align="left"
  292. layout="vertical"
  293. :rules="rules"
  294. >
  295. <AFlex class="flex-bottom" :gap="40">
  296. <AFormItem label="是否下发控制指令" name="sendCtrlCmd">
  297. <ARadioGroup v-model:value="algorithmForm.sendCtrlCmd">
  298. <ARadio class="radio-right" :value="true">是</ARadio>
  299. <ARadio :value="false">否</ARadio>
  300. </ARadioGroup>
  301. </AFormItem>
  302. <AFormItem label="是否弹窗提醒" name="msgBox">
  303. <ARadioGroup v-model:value="algorithmForm.msgBox">
  304. <ARadio class="radio-right" :value="true">是</ARadio>
  305. <ARadio :value="false">否</ARadio>
  306. </ARadioGroup>
  307. </AFormItem>
  308. <AFormItem label="智控策略升温调控周期" name="tempRiseCtrlPeriod">
  309. <AInputNumber
  310. v-model:value="algorithmForm.tempRiseCtrlPeriod"
  311. class="input-width"
  312. addon-after="min"
  313. :min="1"
  314. :max="99999"
  315. />
  316. </AFormItem>
  317. <AFormItem label="智控策略降温调控周期" name="tempReductionCtrlPeriod">
  318. <AInputNumber
  319. v-model:value="algorithmForm.tempReductionCtrlPeriod"
  320. class="input-width"
  321. addon-after="min"
  322. :min="1"
  323. :max="99999"
  324. />
  325. </AFormItem>
  326. <AFormItem class="input-width" label="最小控制步长(℃)" name="minCtrlStep">
  327. <ASelect
  328. v-model:value="algorithmForm.minCtrlStep"
  329. :options="algTempCtrlMinStep"
  330. :field-names="{ label: 'dictValue', value: 'dictEngValue' }"
  331. :placeholder="$t('common.plzSelect')"
  332. />
  333. </AFormItem>
  334. </AFlex>
  335. <div class="analysis-style interval-style"><span>* </span>冷冻水出水温度设定区间</div>
  336. <div v-for="(item, index) in temperatureRangeList" :key="index">
  337. <SetInterval
  338. ref="setIntervalRefs"
  339. :index="index"
  340. :form="item"
  341. @addClick="addClick"
  342. @deleteClick="deleteClick"
  343. />
  344. </div>
  345. <div class="analysis-style"><span>* </span>初始冷冻水出水温度设定值</div>
  346. <MonthSetting ref="monthSetting" :temperature-setting-value="temperatureSettingValue" />
  347. <AFlex class="flex-bottom" wrap="wrap" :gap="40">
  348. <AFormItem label="智能模式" name="intelligentMode">
  349. <ARadioGroup v-model:value="algorithmForm.intelligentMode">
  350. <ARadio class="radio-right" :value="0">
  351. <AFlex align="center">
  352. <div>智能节能</div>
  353. <SvgIcon class="icon-style" name="question-circle-o" />
  354. </AFlex>
  355. </ARadio>
  356. <ARadio :value="1">
  357. <AFlex align="center">
  358. <div>需求优先</div>
  359. <SvgIcon class="icon-style" name="question-circle-o" />
  360. </AFlex>
  361. </ARadio>
  362. </ARadioGroup>
  363. </AFormItem>
  364. <AFormItem label="控制依据" name="controlBasis">
  365. <ARadioGroup v-model:value="algorithmForm.controlBasis">
  366. <ARadio class="radio-right" :value="0">温度</ARadio>
  367. <ARadio class="radio-right" :value="1">湿度</ARadio>
  368. <ARadio :value="2">温湿度</ARadio>
  369. </ARadioGroup>
  370. </AFormItem>
  371. <AFormItem label="计算周期" name="period">
  372. <AInputNumber v-model:value="algorithmForm.period" class="input-width" addon-after="min" />
  373. </AFormItem>
  374. <AFormItem label="温度安全余量" name="tempSafetyMargin">
  375. <AInputNumber v-model:value="algorithmForm.tempSafetyMargin" class="input-width" addon-after="℃" />
  376. </AFormItem>
  377. <AFormItem label="湿度安全余量" name="humiditySafetyMargin">
  378. <AInputNumber
  379. v-model:value="algorithmForm.humiditySafetyMargin"
  380. class="input-width"
  381. addon-after="%"
  382. />
  383. </AFormItem>
  384. <AFormItem label="温湿度采集周期(min)" name="tempHumidityCollectPeriod">
  385. <ASelect
  386. class="input-width"
  387. v-model:value="algorithmForm.tempHumidityCollectPeriod"
  388. :options="algTempHumCollectPeriod"
  389. :field-names="{ label: 'dictValue', value: 'dictEngValue' }"
  390. :placeholder="$t('common.plzSelect')"
  391. />
  392. </AFormItem>
  393. <AFormItem label="供水温度来源" name="waterSupplyTempSource">
  394. <ARadioGroup v-model:value="algorithmForm.waterSupplyTempSource">
  395. <ARadio class="radio-right" :value="0">加权 </ARadio>
  396. <ARadio :value="1"> 读取 </ARadio>
  397. </ARadioGroup>
  398. </AFormItem>
  399. </AFlex>
  400. </AForm>
  401. </div>
  402. </ACollapsePanel>
  403. <ACollapsePanel
  404. v-show="chillersList.length > 0"
  405. :style="customStyle"
  406. v-for="item in chillersList"
  407. :key="item.id"
  408. >
  409. <template #header>
  410. <AFlex align="center" class="header-heigth">
  411. <span class="header-text">{{ item.deviceName }}</span>
  412. </AFlex>
  413. </template>
  414. <EquipmentControl
  415. ref="equipmentControlRefs"
  416. :alg-wt-temp-ctrl-mode="algWtTempCtrlMode"
  417. :alg-always="algAlways"
  418. :alg-wt-temp-set-step="algWtTempSetStep"
  419. :form="item"
  420. />
  421. </ACollapsePanel>
  422. <ACollapsePanel key="3" :style="customStyle">
  423. <template #header>
  424. <AFlex align="center" class="header-heigth">
  425. <span class="header-text">系统功能设置</span>
  426. </AFlex>
  427. </template>
  428. <div>
  429. <AFlex align="center" class="analysis-bottom">
  430. <div class="text">能效分析</div>
  431. <ASwitch class="analysis-margin" v-model:checked="algorithmForm.analysis" />
  432. <div @click="analysisEditor" class="editor-style">编辑</div>
  433. </AFlex>
  434. <AFlex align="center">
  435. <div class="div-width">动态调整</div>
  436. <AFlex align="center" class="adjustment-div">
  437. <div class="adjustment-text">动态调整冷冻总管出水温度设定值</div>
  438. <ASwitch v-model:checked="algorithmForm.enableRefrigerationPipeDynamicSet" />
  439. <div class="adjustment-text adjustment-left">动态调整冷却总管回水温度设定值</div>
  440. <ASwitch v-model:checked="algorithmForm.enableCoolingPipeDynamicSet" />
  441. <div @click="setEditor" class="editor-style editor-left">编辑</div>
  442. </AFlex>
  443. </AFlex>
  444. </div>
  445. </ACollapsePanel>
  446. </ACollapse>
  447. <AFlex justify="space-between" class="bottom-style">
  448. <AButton type="text">取消</AButton>
  449. <AButton type="primary" class="button-width" @click="addAlgorithm">确定</AButton>
  450. </AFlex>
  451. </div>
  452. <AModal v-model:open="analysisOpen" title="能效分析设置" width="460px" :mask-closable="false" @ok="okConfirm">
  453. <div class="analysis-style"><span>* </span>能效分析计算方式</div>
  454. <ARadioGroup v-model:value="analysisTypeDisplay">
  455. <ARadio class="radio-right" :value="0">冷量表</ARadio>
  456. <ARadio class="radio-right" :value="1">流量表</ARadio>
  457. <ARadio :value="2">COP算法</ARadio>
  458. </ARadioGroup>
  459. </AModal>
  460. <AModal v-model:open="setOpen" title="设置" width="460px" :mask-closable="false" @ok="okSetConfirm">
  461. <AFlex align="center" class="set-top set-bottom">
  462. <div class="text">冷却总管回水温度设定值(℃) &nbsp;=&nbsp; 室外湿球温度 +</div>
  463. &nbsp;&nbsp;
  464. <AInputNumber v-model:value="coolingPipeDynamicOffsetDisplay" :min="-99999.99999" :max="99999" />
  465. </AFlex>
  466. <AFlex align="center" class="set-bottom">
  467. <div class="text set-text">初始值(℃)</div>
  468. <AInputNumber
  469. class="set-input-width set-input-right"
  470. v-model:value="coolingPipeDynamicSetDisplay"
  471. :min="-99999.99999"
  472. :max="99999"
  473. />
  474. <div class="set-text text">死区(℃)</div>
  475. <AInputNumber
  476. class="set-input-width"
  477. v-model:value="coolingPipeDynamicDeadZoneDisplay"
  478. :min="-99999.99999"
  479. :max="99999"
  480. />
  481. </AFlex>
  482. <AFlex align="center" class="set-bottom">
  483. <div class="text lower-limit">下限(℃)</div>
  484. <AInputNumber
  485. class="set-input-width set-input-right"
  486. v-model:value="coolingPipeDynamicLowerDisplay"
  487. :min="-99999.99999"
  488. :max="99999"
  489. />
  490. <div class="set-text text">上限(℃)</div>
  491. <AInputNumber
  492. class="set-input-width"
  493. v-model:value="coolingPipeDynamicUpperDisplay"
  494. :min="-99999.99999"
  495. :max="99999"
  496. />
  497. </AFlex>
  498. </AModal>
  499. </div>
  500. </template>
  501. <style lang="scss" scoped>
  502. .button-width {
  503. width: 128px;
  504. height: 40px;
  505. }
  506. .bottom-style {
  507. width: 55%;
  508. padding-left: 28px;
  509. margin-top: 8px;
  510. }
  511. .set-top {
  512. margin-top: 20px;
  513. }
  514. .set-bottom {
  515. margin-bottom: 24px;
  516. }
  517. .lower-limit {
  518. margin-right: 26px;
  519. }
  520. .set-input-right {
  521. margin-right: 40px;
  522. }
  523. .algorithm-form :deep(.ant-form-item-label > label) {
  524. color: #666;
  525. }
  526. .set-text {
  527. margin-right: 12px;
  528. }
  529. .text {
  530. font-size: 14px;
  531. font-style: normal;
  532. font-weight: 400;
  533. line-height: 22px;
  534. color: #666;
  535. }
  536. .set-input-width {
  537. width: 96px;
  538. }
  539. .editor-left {
  540. margin-left: 16px;
  541. }
  542. .adjustment-left {
  543. margin-left: 82px;
  544. }
  545. .adjustment-text {
  546. margin-right: 16px;
  547. font-size: 14px;
  548. font-style: normal;
  549. font-weight: 400;
  550. line-height: 22px;
  551. color: #666;
  552. text-align: left;
  553. }
  554. .analysis-style {
  555. margin-top: 16px;
  556. margin-bottom: 13px;
  557. color: #666;
  558. }
  559. .analysis-style span {
  560. color: red;
  561. }
  562. .analysis-bottom {
  563. margin-bottom: 24px;
  564. }
  565. .div-width {
  566. width: 72px;
  567. color: #666;
  568. }
  569. .adjustment-div {
  570. width: 100%;
  571. height: 72px;
  572. padding-left: 16px;
  573. background: #f5f7fa;
  574. border-radius: 4px;
  575. }
  576. .editor-style {
  577. color: #32bac0;
  578. text-decoration: underline;
  579. cursor: pointer;
  580. }
  581. .analysis-margin {
  582. margin: 0 18px 0 17px;
  583. }
  584. .header-heigth {
  585. height: 32px;
  586. }
  587. .icon-style {
  588. margin-left: 4px;
  589. }
  590. .flex-margin {
  591. margin: 16px 0;
  592. }
  593. .radio-right {
  594. margin-right: 16px;
  595. }
  596. .flex-bottom {
  597. row-gap: 0 !important;
  598. }
  599. .input-width {
  600. width: 192px;
  601. }
  602. .header-text {
  603. margin-right: 18px;
  604. font-size: 16px;
  605. font-style: normal;
  606. font-weight: 500;
  607. line-height: 24px;
  608. color: #000;
  609. text-align: left;
  610. }
  611. :deep(.algorithm-content) {
  612. .ant-collapse > .ant-collapse-item > .ant-collapse-header .ant-collapse-expand-icon {
  613. margin-top: 6px;
  614. }
  615. .ant-input-number-group .ant-input-number-group-addon {
  616. background-color: #fff;
  617. }
  618. .ant-collapse .ant-collapse-content {
  619. border: 0;
  620. .ant-collapse-content-box {
  621. padding: 16px 0;
  622. }
  623. }
  624. }
  625. .algorithm-content {
  626. width: 100%;
  627. height: 100%;
  628. padding: 24px;
  629. margin-top: 16px;
  630. background: #fff;
  631. border-radius: 16px;
  632. }
  633. .title-text {
  634. font-size: 20px;
  635. font-style: normal;
  636. font-weight: 500;
  637. line-height: 32px;
  638. color: rgb(0 0 0 / 85%);
  639. text-align: left;
  640. }
  641. .interval-style {
  642. margin-top: 0;
  643. }
  644. </style>