add 补料策略界面

This commit is contained in:
Asoka 2025-06-09 19:21:44 +08:00
parent bd5cbdf5a0
commit 9a62ccc99d
4 changed files with 1087 additions and 0 deletions

View File

@ -0,0 +1,107 @@
import {
PageInputFeedingConfigGetPageInput,
FeedingConfigGetPageOutput,
FeedingConfigUpdateInput,
FeedingConfigAddInput,
FeedingConfigGetOutput,
ResultOutputFeedingConfigGetOutput,
ResultOutputPageOutputFeedingConfigGetPageOutput,
ResultOutputInt64
} from './data-contracts'
import { HttpClient, ContentType, RequestParams } from './http-client'
import { AxiosResponse } from 'axios'
export class UspFeedingConfigApi<SecurityDataType = unknown> extends HttpClient<SecurityDataType> {
/**
*
* @request GET:/api/admin/usp-feeding-config/get
*/
get = (
query?: { id?: number },
params: RequestParams = {}
) =>
this.request<ResultOutputFeedingConfigGetOutput, any>({
path: '/api/admin/usp-feeding-config/get',
method: 'GET',
query,
secure: true,
format: 'json',
...params,
})
/**
*
* @request POST:/api/admin/usp-feeding-config/get-page
*/
getPage = (data: PageInputFeedingConfigGetPageInput, params: RequestParams = {}) =>
this.request<ResultOutputPageOutputFeedingConfigGetPageOutput, any>({
path: '/api/admin/usp-feeding-config/get-page',
method: 'POST',
body: data,
secure: true,
type: ContentType.Json,
format: 'json',
...params,
})
/**
*
* @request POST:/api/admin/usp-feeding-config/add
*/
add = (data: FeedingConfigAddInput, params: RequestParams = {}) =>
this.request<ResultOutputInt64, any>({
path: '/api/admin/usp-feeding-config/add',
method: 'POST',
body: data,
secure: true,
type: ContentType.Json,
format: 'json',
...params,
})
/**
*
* @request PUT:/api/admin/usp-feeding-config/update
*/
update = (data: FeedingConfigUpdateInput, params: RequestParams = {}) =>
this.request<AxiosResponse, any>({
path: '/api/admin/usp-feeding-config/update',
method: 'PUT',
body: data,
secure: true,
type: ContentType.Json,
...params,
})
/**
*
* @request DELETE:/api/admin/usp-feeding-config/delete
*/
delete = (
query?: { id?: number },
params: RequestParams = {}
) =>
this.request<AxiosResponse, any>({
path: '/api/admin/usp-feeding-config/delete',
method: 'DELETE',
query,
secure: true,
...params,
})
/**
*
* @request DELETE:/api/admin/usp-feeding-config/soft-delete
*/
softDelete = (
query?: { id?: number },
params: RequestParams = {}
) =>
this.request<AxiosResponse, any>({
path: '/api/admin/usp-feeding-config/soft-delete',
method: 'DELETE',
query,
secure: true,
...params,
})
}

View File

@ -7787,3 +7787,370 @@ export interface ResultOutputPageOutputRelayGetPageOutput {
/** 分页信息输出 */
data?: PageOutputRelayGetPageOutput
}
export type PageInputFeedingConfigGetPageInput = {
dynamicFilter?: DynamicFilterInfo
/** 排序列表 */
sortList?: SortInput[] | null
/**
*
* @format int32
*/
currentPage?: number
/**
*
* @format int32
*/
pageSize?: number
filter?: FeedingConfigGetPageInput
}
export type FeedingConfigGetListOutput = {
id: number
configName: string
intervalTime: number
setSpeed: number
speedDiff: number
calibrateDuration: number
calibrateVolumePercent: number
highSpeedPercent: number
highSpeedVolumePercent: number
lowSpeedPercent: number
lowSpeedVolumePercent: number
excessPercentage: number
timeOutSeconds: number
feedTime: number
terminalVolumePercent: number
ditherCoefficient: number
ditherIntervalCoefficient: number
ditherMonitorTime: number
ditherScaleCoefficient: number
jamCoefficient: number
jamIntervalCoefficient: number
rebateCoefficient: number
rebateIntervalCoefficient: number
isTwoStep: number
enabled: boolean
}
export type FeedingConfigUpdateInput = {
id: number
configName: string
intervalTime: number
setSpeed: number
speedDiff: number
calibrateDuration: number
calibrateVolumePercent: number
highSpeedPercent: number
highSpeedVolumePercent: number
lowSpeedPercent: number
lowSpeedVolumePercent: number
excessPercentage: number
timeOutSeconds: number
feedTime: number
terminalVolumePercent: number
ditherCoefficient: number
ditherIntervalCoefficient: number
ditherMonitorTime: number
ditherScaleCoefficient: number
jamCoefficient: number
jamIntervalCoefficient: number
rebateCoefficient: number
rebateIntervalCoefficient: number
isTwoStep: number
enabled: boolean
}
/** 分页请求 */
export interface FeedingConfigGetPageInput {
/** 关键词 */
keyWord?: string | null
/** 开始日期 */
stDate?: string | null
/** 结束日期 */
edDate?: string | null
}
/** 分页信息输入 */
export interface PageInputFeedingConfigGetPageInput {
dynamicFilter?: DynamicFilterInfo
/** 排序列表 */
sortList?: SortInput[] | null
/**
*
* @format int32
*/
currentPage?: number
/**
*
* @format int32
*/
pageSize?: number
/** 分页请求 */
filter?: FeedingConfigGetPageInput
}
/** 分页响应 */
export interface FeedingConfigGetPageOutput {
/**
*
* @format int64
*/
id?: number
/** 策略名称 */
configName?: string | null
/** 环控间隔时间(秒) */
intervalTime?: number
/** 下发泵速 */
setSpeed?: number
/** 泵速差值 */
speedDiff?: number
/** 校准阶段时长 */
calibrateDuration?: number
/** 校准阶段材料占总量百分比 */
calibrateVolumePercent?: number
/** 加速阶段泵速百分比 */
highSpeedPercent?: number
/** 加速阶段补料占总量百分比 */
highSpeedVolumePercent?: number
/** 减速阶段泵速占比 */
lowSpeedPercent?: number
/** 减速阶段补料占总量百分比 */
lowSpeedVolumePercent?: number
/** 补料超量百分比 */
excessPercentage?: number
/** 超时时间(秒) */
timeOutSeconds?: number
/** 补料时间(秒) */
feedTime?: number
/** 终点百分比 */
terminalVolumePercent?: number
/** 抖动系数 */
ditherCoefficient?: number
/** 抖动环控时间系数 */
ditherIntervalCoefficient?: number
/** 抖动观察时间系数 */
ditherMonitorTime?: number
/** 抖动地秤系数 */
ditherScaleCoefficient?: number
/** 堵塞系数 */
jamCoefficient?: number
/** 堵塞环控时间系数 */
jamIntervalCoefficient?: number
/** 返水系数 */
rebateCoefficient?: number
/** 返水环控时间系数 */
rebateIntervalCoefficient?: number
/** 是否二段式 */
isTwoStep?: number
/** 状态 */
enabled?: boolean
/** 创建者 */
createdUserName?: string | null
/**
*
* @format date-time
*/
createdTime?: string | null
}
/** 分页信息输出 */
export interface PageOutputFeedingConfigGetPageOutput {
/**
*
* @format int64
*/
total?: number
/** 数据 */
list?: FeedingConfigGetPageOutput[] | null
}
/** 结果输出 */
export interface ResultOutputPageOutputFeedingConfigGetPageOutput {
/** 是否成功标记 */
success?: boolean
/** 编码 */
code?: string | null
/** 消息 */
msg?: string | null
/** 分页信息输出 */
data?: PageOutputFeedingConfigGetPageOutput
}
/** 补料配置 */
export interface FeedingConfigGetOutput {
/** 策略名称 */
configName?: string | null
/** 环控间隔时间(秒) */
intervalTime?: number
/** 下发泵速 */
setSpeed?: number
/** 泵速差值 */
speedDiff?: number
/** 校准阶段时长 */
calibrateDuration?: number
/** 校准阶段材料占总量百分比 */
calibrateVolumePercent?: number
/** 加速阶段泵速百分比 */
highSpeedPercent?: number
/** 加速阶段补料占总量百分比 */
highSpeedVolumePercent?: number
/** 减速阶段泵速占比 */
lowSpeedPercent?: number
/** 减速阶段补料占总量百分比 */
lowSpeedVolumePercent?: number
/** 补料超量百分比 */
excessPercentage?: number
/** 超时时间(秒) */
timeOutSeconds?: number
/** 补料时间(秒) */
feedTime?: number
/** 终点百分比 */
terminalVolumePercent?: number
/** 抖动系数 */
ditherCoefficient?: number
/** 抖动环控时间系数 */
ditherIntervalCoefficient?: number
/** 抖动观察时间系数 */
ditherMonitorTime?: number
/** 抖动地秤系数 */
ditherScaleCoefficient?: number
/** 堵塞系数 */
jamCoefficient?: number
/** 堵塞环控时间系数 */
jamIntervalCoefficient?: number
/** 返水系数 */
rebateCoefficient?: number
/** 返水环控时间系数 */
rebateIntervalCoefficient?: number
/** 是否二段式 */
isTwoStep?: number
/** 启用 */
enabled?: boolean
/**
* Id
* @format int64
*/
id: number
}
/** 结果输出 */
export interface ResultOutputFeedingConfigGetOutput {
/** 是否成功标记 */
success?: boolean
/** 编码 */
code?: string | null
/** 消息 */
msg?: string | null
/** 补料配置 */
data?: FeedingConfigGetOutput
}
/** 添加 */
export interface FeedingConfigAddInput {
/** 策略名称 */
configName?: string | null
/** 环控间隔时间(秒) */
intervalTime?: number
/** 下发泵速 */
setSpeed?: number
/** 泵速差值 */
speedDiff?: number
/** 校准阶段时长 */
calibrateDuration?: number
/** 校准阶段材料占总量百分比 */
calibrateVolumePercent?: number
/** 加速阶段泵速百分比 */
highSpeedPercent?: number
/** 加速阶段补料占总量百分比 */
highSpeedVolumePercent?: number
/** 减速阶段泵速占比 */
lowSpeedPercent?: number
/** 减速阶段补料占总量百分比 */
lowSpeedVolumePercent?: number
/** 补料超量百分比 */
excessPercentage?: number
/** 超时时间(秒) */
timeOutSeconds?: number
/** 补料时间(秒) */
feedTime?: number
/** 终点百分比 */
terminalVolumePercent?: number
/** 抖动系数 */
ditherCoefficient?: number
/** 抖动环控时间系数 */
ditherIntervalCoefficient?: number
/** 抖动观察时间系数 */
ditherMonitorTime?: number
/** 抖动地秤系数 */
ditherScaleCoefficient?: number
/** 堵塞系数 */
jamCoefficient?: number
/** 堵塞环控时间系数 */
jamIntervalCoefficient?: number
/** 返水系数 */
rebateCoefficient?: number
/** 返水环控时间系数 */
rebateIntervalCoefficient?: number
/** 是否二段式 */
isTwoStep?: number
/** 启用 */
enabled?: boolean
}
/** 修改 */
export interface FeedingConfigUpdateInput {
/** 策略名称 */
configName?: string | null
/** 环控间隔时间(秒) */
intervalTime?: number
/** 下发泵速 */
setSpeed?: number
/** 泵速差值 */
speedDiff?: number
/** 校准阶段时长 */
calibrateDuration?: number
/** 校准阶段材料占总量百分比 */
calibrateVolumePercent?: number
/** 加速阶段泵速百分比 */
highSpeedPercent?: number
/** 加速阶段补料占总量百分比 */
highSpeedVolumePercent?: number
/** 减速阶段泵速占比 */
lowSpeedPercent?: number
/** 减速阶段补料占总量百分比 */
lowSpeedVolumePercent?: number
/** 补料超量百分比 */
excessPercentage?: number
/** 超时时间(秒) */
timeOutSeconds?: number
/** 补料时间(秒) */
feedTime?: number
/** 终点百分比 */
terminalVolumePercent?: number
/** 抖动系数 */
ditherCoefficient?: number
/** 抖动环控时间系数 */
ditherIntervalCoefficient?: number
/** 抖动观察时间系数 */
ditherMonitorTime?: number
/** 抖动地秤系数 */
ditherScaleCoefficient?: number
/** 堵塞系数 */
jamCoefficient?: number
/** 堵塞环控时间系数 */
jamIntervalCoefficient?: number
/** 返水系数 */
rebateCoefficient?: number
/** 返水环控时间系数 */
rebateIntervalCoefficient?: number
/** 是否二段式 */
isTwoStep?: number
/** 启用 */
enabled?: boolean
/**
* Id
* @format int64
*/
id: number
}

View File

@ -0,0 +1,372 @@
<template>
<el-dialog
v-model="dialogVisible"
:title="title"
width="1200px"
class="custom-dialog"
draggable
:close-on-click-modal="false"
:close-on-press-escape="false"
append-to-body
destroy-on-close
:style="{ height: '95vh' }"
@close="close"
>
<el-form
ref="formRef"
:model="formData"
:rules="rules"
label-width="220px"
size="default"
v-loading="loading"
>
<el-row :gutter="25">
<!-- 阶段 -->
<el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
<el-card shadow="hover" class="group-card">
<div class="section-title">阶段</div>
<el-form-item label="策略名称" prop="configName" required>
<el-input v-model="formData.configName" clearable placeholder="请输入策略名称" />
</el-form-item>
<el-form-item label="总理论时长" prop="totalTheoryTime" required>
<el-input-number v-model="formData.totalTheoryTime" :min="0" style="width:100%" />
<template #append>min</template>
</el-form-item>
<div class="sub-group">
<div class="sub-title">校准</div>
<el-form-item label="校准阶段时长" prop="calibrateDuration" required>
<el-input-number v-model="formData.calibrateDuration" :min="0" style="width:100%" />
<template #append>s</template>
</el-form-item>
<el-form-item label="校准阶段补料占总量百分比" prop="calibrateVolumePercent" required>
<el-input-number v-model="formData.calibrateVolumePercent" :min="0" :max="100" style="width:100%" />
<template #append>%</template>
</el-form-item>
<el-form-item label="校准理论速度" prop="calibrateTheorySpeed" required>
<el-input-number v-model="formData.calibrateTheorySpeed" :min="0" style="width:100%" />
<template #append>%</template>
</el-form-item>
</div>
<div class="sub-group">
<div class="sub-title">高速</div>
<el-form-item label="高速阶段泵速百分比" prop="highSpeedPercent" required>
<el-input-number v-model="formData.highSpeedPercent" :min="0" :max="100" style="width:100%" />
<template #append>%</template>
</el-form-item>
<el-form-item label="高速阶段补料占总量百分比" prop="highSpeedVolumePercent" required>
<el-input-number v-model="formData.highSpeedVolumePercent" :min="0" :max="100" style="width:100%" />
<template #append>%</template>
</el-form-item>
<el-form-item label="高速理论时长" prop="highSpeedTheoryTime" required>
<el-input-number v-model="formData.highSpeedTheoryTime" :min="0" style="width:100%" />
<template #append>min</template>
</el-form-item>
</div>
<div class="sub-group">
<div class="sub-title">低速</div>
<el-form-item label="低速阶段泵速百分比" prop="lowSpeedPercent" required>
<el-input-number v-model="formData.lowSpeedPercent" :min="0" :max="100" style="width:100%" />
<template #append>%</template>
</el-form-item>
<el-form-item label="低速阶段补料占总量百分比" prop="lowSpeedVolumePercent" required>
<el-input-number v-model="formData.lowSpeedVolumePercent" :min="0" :max="100" style="width:100%" />
<template #append>%</template>
</el-form-item>
<el-form-item label="低速理论时长" prop="lowSpeedTheoryTime" required>
<el-input-number v-model="formData.lowSpeedTheoryTime" :min="0" style="width:100%" />
<template #append>min</template>
</el-form-item>
</div>
</el-card>
</el-col>
<!-- 监控 -->
<el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
<el-card shadow="hover" class="group-card">
<div class="section-title">监控</div>
<el-form-item label="环控间隔时间" prop="intervalTime" required>
<el-input-number v-model="formData.intervalTime" :min="0" style="width:100%" />
<template #append>s</template>
</el-form-item>
<el-form-item label="补料超量百分比" prop="excessPercentage" required>
<el-input-number v-model="formData.excessPercentage" :min="0" style="width:100%" />
<template #append>%</template>
</el-form-item>
<el-form-item label="超时时间" prop="timeOutSeconds" required>
<el-input-number v-model="formData.timeOutSeconds" :min="0" style="width:100%" />
<template #append>s</template>
</el-form-item>
<el-form-item label="终点百分比" prop="terminalVolumePercent" required>
<el-input-number v-model="formData.terminalVolumePercent" :min="0" :max="100" style="width:100%" />
<template #append>%</template>
</el-form-item>
<div class="sub-group">
<div class="sub-title">抖动</div>
<el-form-item label="抖动环控时间系数" prop="ditherIntervalCoefficient" required>
<el-input-number v-model="formData.ditherIntervalCoefficient" :min="0" style="width:100%" />
</el-form-item>
<el-form-item label="抖动系数" prop="ditherCoefficient" required>
<el-input-number v-model="formData.ditherCoefficient" :min="0" style="width:100%" />
</el-form-item>
<el-form-item label="抖动观察时间系数" prop="ditherMonitorTime" required>
<el-input-number v-model="formData.ditherMonitorTime" :min="0" style="width:100%" />
</el-form-item>
<el-form-item label="抖动地秤系数" prop="ditherScaleCoefficient" required>
<el-input-number v-model="formData.ditherScaleCoefficient" :min="0" style="width:100%" />
</el-form-item>
</div>
<div class="sub-group">
<div class="sub-title">返水</div>
<el-form-item label="返水环控时间系数" prop="rebateIntervalCoefficient" required>
<el-input-number v-model="formData.rebateIntervalCoefficient" :min="0" style="width:100%" />
</el-form-item>
<el-form-item label="返水系数" prop="rebateCoefficient" required>
<el-input-number v-model="formData.rebateCoefficient" :min="-100" style="width:100%" />
</el-form-item>
</div>
<div class="sub-group">
<div class="sub-title">堵塞</div>
<el-form-item label="堵塞环控时间系数" prop="jamIntervalCoefficient" required>
<el-input-number v-model="formData.jamIntervalCoefficient" :min="0" style="width:100%" />
</el-form-item>
<el-form-item label="堵塞系数" prop="jamCoefficient" required>
<el-input-number v-model="formData.jamCoefficient" :min="0" style="width:100%" />
</el-form-item>
</div>
</el-card>
</el-col>
</el-row>
</el-form>
<template #footer>
<span class="dialog-footer">
<el-button @click="close" size="default"> </el-button>
<el-button type="primary" @click="handleSubmit" size="default" :loading="loading"> </el-button>
</span>
</template>
</el-dialog>
</template>
<script lang="ts" setup>
import { ref, reactive, watch } from 'vue'
import { ElMessage } from 'element-plus'
import type { FormInstance } from 'element-plus'
import { UspFeedingConfigApi } from '/@/api/admin/UspFeedingConfigApi'
const props = defineProps<{
modelValue: boolean
title: string
}>()
const emit = defineEmits<{
(e: 'update:modelValue', value: boolean): void
(e: 'refresh'): void
}>()
const formRef = ref<FormInstance>()
//
const formData = reactive({
configName: '',
totalTheoryTime: 0,
calibrateDuration: 0,
calibrateVolumePercent: 0,
calibrateTheorySpeed: 0,
highSpeedPercent: 0,
highSpeedVolumePercent: 0,
highSpeedTheoryTime: 0,
lowSpeedPercent: 0,
lowSpeedVolumePercent: 0,
lowSpeedTheoryTime: 0,
intervalTime: 0,
excessPercentage: 0,
timeOutSeconds: 0,
terminalVolumePercent: 0,
ditherIntervalCoefficient: 0,
ditherCoefficient: 0,
ditherMonitorTime: 0,
ditherScaleCoefficient: 0,
rebateIntervalCoefficient: 0,
rebateCoefficient: 0,
jamIntervalCoefficient: 0,
jamCoefficient: 0,
enabled: true,
isTwoStep: 0,
id: 0
})
const rules = {
configName: [{ required: true, message: '请输入策略名称', trigger: ['blur', 'change'] }],
totalTheoryTime: [{ required: true, message: '请输入总理论时长', trigger: ['blur', 'change'] }],
calibrateDuration: [{ required: true, message: '请输入校准阶段时长', trigger: ['blur', 'change'] }],
calibrateVolumePercent: [{ required: true, message: '请输入校准阶段补料占总量百分比', trigger: ['blur', 'change'] }],
calibrateTheorySpeed: [{ required: true, message: '请输入校准理论速度', trigger: ['blur', 'change'] }],
highSpeedPercent: [{ required: true, message: '请输入高速阶段泵速百分比', trigger: ['blur', 'change'] }],
highSpeedVolumePercent: [{ required: true, message: '请输入高速阶段补料占总量百分比', trigger: ['blur', 'change'] }],
highSpeedTheoryTime: [{ required: true, message: '请输入高速理论时长', trigger: ['blur', 'change'] }],
lowSpeedPercent: [{ required: true, message: '请输入低速阶段泵速百分比', trigger: ['blur', 'change'] }],
lowSpeedVolumePercent: [{ required: true, message: '请输入低速阶段补料占总量百分比', trigger: ['blur', 'change'] }],
lowSpeedTheoryTime: [{ required: true, message: '请输入低速理论时长', trigger: ['blur', 'change'] }],
intervalTime: [{ required: true, message: '请输入环控间隔时间', trigger: ['blur', 'change'] }],
excessPercentage: [{ required: true, message: '请输入补料超量百分比', trigger: ['blur', 'change'] }],
timeOutSeconds: [{ required: true, message: '请输入超时时间', trigger: ['blur', 'change'] }],
terminalVolumePercent: [{ required: true, message: '请输入终点百分比', trigger: ['blur', 'change'] }],
ditherIntervalCoefficient: [{ required: true, message: '请输入抖动环控时间系数', trigger: ['blur', 'change'] }],
ditherCoefficient: [{ required: true, message: '请输入抖动系数', trigger: ['blur', 'change'] }],
ditherMonitorTime: [{ required: true, message: '请输入抖动观察时间系数', trigger: ['blur', 'change'] }],
ditherScaleCoefficient: [{ required: true, message: '请输入抖动地秤系数', trigger: ['blur', 'change'] }],
rebateIntervalCoefficient: [{ required: true, message: '请输入返水环控时间系数', trigger: ['blur', 'change'] }],
rebateCoefficient: [{ required: true, message: '请输入返水系数', trigger: ['blur', 'change'] }],
jamIntervalCoefficient: [{ required: true, message: '请输入堵塞环控时间系数', trigger: ['blur', 'change'] }],
jamCoefficient: [{ required: true, message: '请输入堵塞系数', trigger: ['blur', 'change'] }]
}
const loading = ref(false)
const dialogVisible = ref(false)
const api = new UspFeedingConfigApi()
watch(
() => props.modelValue,
(val) => {
dialogVisible.value = val
}
)
watch(
() => dialogVisible.value,
(val) => {
emit('update:modelValue', val)
if (!val) resetForm()
}
)
function resetForm() {
formRef.value?.resetFields()
Object.assign(formData, {
configName: '',
totalTheoryTime: 0,
calibrateDuration: 0,
calibrateVolumePercent: 0,
calibrateTheorySpeed: 0,
highSpeedPercent: 0,
highSpeedVolumePercent: 0,
highSpeedTheoryTime: 0,
lowSpeedPercent: 0,
lowSpeedVolumePercent: 0,
lowSpeedTheoryTime: 0,
intervalTime: 0,
excessPercentage: 0,
timeOutSeconds: 0,
terminalVolumePercent: 0,
ditherIntervalCoefficient: 0,
ditherCoefficient: 0,
ditherMonitorTime: 0,
ditherScaleCoefficient: 0,
rebateIntervalCoefficient: 0,
rebateCoefficient: 0,
jamIntervalCoefficient: 0,
jamCoefficient: 0,
enabled: true,
isTwoStep: 0,
id: 0
})
}
function setFormData(data: any) {
Object.assign(formData, data)
}
function close() {
dialogVisible.value = false
}
async function open(row?: any) {
dialogVisible.value = true
if (row && row.id) {
loading.value = true
try {
const res = await api.get({ id: row.id })
if (res.success && res.data) setFormData(res.data)
else ElMessage.warning(res.msg || '获取数据失败')
} catch (error) {
console.error(error)
ElMessage.error('获取数据出错')
} finally {
loading.value = false
}
} else resetForm()
}
async function handleSubmit() {
if (!formRef.value) return
await formRef.value.validate(async (valid: boolean) => {
if (!valid) return
loading.value = true
try {
if (formData.id) {
const updateInput = {
...formData,
setSpeed: formData.calibrateTheorySpeed,
speedDiff: 0,
feedTime: formData.totalTheoryTime
}
await api.update(updateInput)
ElMessage.success('修改成功')
} else {
const addInput = {
...formData,
setSpeed: formData.calibrateTheorySpeed,
speedDiff: 0,
feedTime: formData.totalTheoryTime
}
delete (addInput as any).id
await api.add(addInput)
ElMessage.success('新增成功')
}
emit('refresh')
close()
} catch (error) {
console.error(error)
ElMessage.error('提交失败')
} finally {
loading.value = false
}
})
}
defineExpose({ open })
</script>
<style scoped>
.group-card {
margin-bottom: 24px;
border-radius: 10px;
box-shadow: 0 2px 12px #f0f1f2;
background: #fff;
}
.section-title {
font-size: 18px;
font-weight: bold;
color: #409EFF;
margin-bottom: 18px;
letter-spacing: 2px;
}
.sub-group {
background: #f7fafd;
border-radius: 8px;
padding: 12px 16px 4px 16px;
margin-bottom: 18px;
margin-top: 18px;
}
.sub-title {
font-size: 15px;
color: #6ca0dc;
font-weight: bold;
margin-bottom: 10px;
letter-spacing: 1px;
}
.el-form-item {
margin-bottom: 18px !important;
}
@media (max-width: 1200px) {
.group-card {
margin-bottom: 16px;
}
}
</style>

View File

@ -0,0 +1,241 @@
<template>
<MyLayout>
<el-card class="my-query-box" shadow="never">
<template #header>
<el-form ref="queryFormRef" :model="state.filter" :inline="true" class="demo-form-inline">
<el-form-item label="策略名称">
<el-input v-model="state.filter.keyWord" placeholder="请输入策略名称" clearable />
</el-form-item>
<el-form-item label="开始时间">
<el-date-picker
v-model="state.filter.stDate"
type="datetime"
placeholder="选择开始时间"
format="YYYY-MM-DD HH:mm:ss"
value-format="YYYY-MM-DD HH:mm:ss"
style="width: 180px"
/>
</el-form-item>
<el-form-item label="结束时间">
<el-date-picker
v-model="state.filter.edDate"
type="datetime"
placeholder="选择结束时间"
format="YYYY-MM-DD HH:mm:ss"
value-format="YYYY-MM-DD HH:mm:ss"
style="width: 180px"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="ele-Search" @click="handleQuery">查询</el-button>
<el-button v-if="hasAuth('api:admin:usp-feeding-config:add')" type="primary" icon="ele-Plus" @click="handleAdd">
新增
</el-button>
</el-form-item>
</el-form>
</template>
</el-card>
<el-card class="my-fill mt8" shadow="never">
<div class="my-tools-box mb8 my-flex my-flex-between">
<div></div>
</div>
<el-table
v-loading="state.loading"
:data="state.tableData"
style="width: 100%"
border
>
<el-table-column prop="configName" label="策略名称" min-width="120" show-overflow-tooltip />
<el-table-column label="补料方式" min-width="100" align="center" show-overflow-tooltip>
<template #default="{ row }">
<el-tag type="success" v-if="row.isTwoStep === 1">二段式</el-tag>
<el-tag type="info" v-else>三段式</el-tag>
</template>
</el-table-column>
<el-table-column prop="feedTime" label="补料时长(s)" min-width="100" show-overflow-tooltip />
<el-table-column prop="calibrateDuration" label="校准阶段时长/s" min-width="120" show-overflow-tooltip />
<el-table-column prop="calibrateVolumePercent" label="校准阶段补料占总量百分比/%" min-width="180" show-overflow-tooltip />
<el-table-column prop="highSpeedPercent" label="高速阶段泵速比例/%" min-width="140" show-overflow-tooltip />
<el-table-column prop="highSpeedVolumePercent" label="高速阶段补料占比/%" min-width="140" show-overflow-tooltip />
<el-table-column prop="lowSpeedPercent" label="低速阶段泵速比例/%" min-width="140" show-overflow-tooltip />
<el-table-column prop="lowSpeedVolumePercent" label="低速阶段补料占比/%" min-width="140" show-overflow-tooltip />
<el-table-column label="状态" width="80" align="center" show-overflow-tooltip>
<template #default="{ row }">
<el-tag type="success" v-if="row.enabled">启用</el-tag>
<el-tag type="danger" v-else>禁用</el-tag>
</template>
</el-table-column>
<el-table-column label="操作" width="150" fixed="right">
<template #default="{ row }">
<el-button
type="primary"
link
@click="handleEdit(row)"
v-if="hasAuth('api:admin:usp-feeding-config:update')"
>
编辑
</el-button>
<el-button
type="danger"
link
@click="handleDelete(row)"
v-if="hasAuth('api:admin:usp-feeding-config:soft-delete')"
>
删除
</el-button>
</template>
</el-table-column>
</el-table>
<div class="my-flex my-flex-end" style="margin-top: 10px">
<el-pagination
v-model:current-page="state.pageInput.currentPage"
v-model:page-size="state.pageInput.pageSize"
:page-sizes="[10, 20, 30, 50]"
layout="total, sizes, prev, pager, next, jumper"
:total="state.total"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
/>
</div>
</el-card>
<feeding-config-form ref="formRef" @success="handleSuccess" :model-value="false" title="补料配置" />
</MyLayout>
</template>
<script lang="ts" setup name="admin/feeding-config">
import { ref, reactive, onMounted, getCurrentInstance } from 'vue'
import { ElMessage, ElMessageBox } from 'element-plus'
import { UspFeedingConfigApi } from '/@/api/admin/UspFeedingConfigApi'
import {
PageInputFeedingConfigGetPageInput,
FeedingConfigGetPageOutput,
FeedingConfigGetPageInput
} from '/@/api/admin/data-contracts'
import FeedingConfigForm from './components/feeding-config-form.vue'
import { auth as hasAuth } from '/@/utils/authFunction'
import { filter } from 'lodash-es'
const { proxy } = getCurrentInstance() as any
const formRef = ref()
const state = reactive({
loading: false,
total: 0,
pageInput: {
currentPage: 1,
pageSize: 20,
} as PageInputFeedingConfigGetPageInput,
tableData: [] as FeedingConfigGetPageOutput[],
filter: {
keyWord: '',
stDate: '',
edDate: ''
},
})
// API
const uspFeedingConfigApi = new UspFeedingConfigApi() // HttpClient
const getList = async () => {
state.loading = true
try {
state.pageInput.filter = {
keyWord: state.filter.keyWord || '',
stDate: state.filter.stDate || null,
edDate: state.filter.edDate || null,
}
const res = await uspFeedingConfigApi.getPage(state.pageInput)
console.log(res)
if (res.success && res.data) {
state.tableData = res.data.list || []
state.total = res.data.total || 0
} else {
state.tableData = []
state.total = 0
ElMessage.warning(res.msg || '获取数据失败')
}
} catch (error) {
console.error('获取列表数据出错:', error)
ElMessage.error('获取列表数据出错')
} finally {
state.loading = false
}
}
const handleQuery = () => {
state.pageInput.currentPage = 1
getList()
}
const resetQuery = () => {
state.filter.keyWord = ''
state.filter.stDate = ''
state.filter.edDate = ''
handleQuery()
}
const handleSizeChange = (val: number) => {
state.pageInput.pageSize = val
getList()
}
const handleCurrentChange = (val: number) => {
state.pageInput.currentPage = val
getList()
}
const handleAdd = () => {
formRef.value?.open()
}
const handleEdit = (row: FeedingConfigGetPageOutput) => {
formRef.value?.open(row)
}
const handleDelete = (row: FeedingConfigGetPageOutput) => {
ElMessageBox.confirm('确认要删除该策略吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(async () => {
try {
console.log(row)
const res = await uspFeedingConfigApi.softDelete({ id: row.id })
if (res) {
ElMessage.success('删除成功')
getList()
}
} catch (error) {
console.error('删除出错:', error)
ElMessage.error('删除失败')
}
}).catch(() => {})
}
const handleSuccess = () => {
getList()
}
onMounted(() => {
getList()
})
</script>
<style scoped>
.card-header {
display: flex;
justify-content: space-between;
align-items: center;
}
.pagination-container {
margin-top: 20px;
display: flex;
justify-content: flex-end;
}
</style>