kkk-ops 2 months ago
commit 9327f284dd

@ -71,5 +71,15 @@ export const ProductApi = {
// 导出产品 Excel
exportProduct: async (params) => {
return await request.download({ url: `/erp/product/export-excel`, params })
},
// 下载产品导入模板
importProductTemplate: async () => {
return await request.download({ url: `/erp/product/get-import-template` })
},
// 导入产品
importProduct: async (data: FormData) => {
return await request.upload({ url: `/erp/product/import`, data })
}
}

@ -32,6 +32,10 @@ export const CriticalComponentApi = {
return await request.download({ url: `/mes/critical-component/export-excel`, params })
},
importCriticalComponentTemplate: async () => {
return await request.download({ url: `/mes/critical-component/get-import-template` })
},
exportDeviceComponent: async (params: any) => {
return await request.download({ url: `/mes/critical-component/export-device-component`, params })
}

@ -111,6 +111,7 @@ export default {
price: 'Amount',
totalPrice: 'Total Price',
inType: 'Inbound Type',
file: 'Attachment',
tabProduct: 'Product Inbound',
tabMaterial: 'Material Inbound',
tabPart: 'Part Inbound',
@ -218,6 +219,34 @@ export default {
validatorWarehouseRequired: 'Warehouse name is required'
}
},
Record: {
product: 'Product',
warehouse: 'Warehouse',
bizType: 'Type',
bizNo: 'Business No',
categoryProduct: 'Product',
categoryMaterial: 'Material',
categorySpare: 'Spare Part',
categoryTool: 'Tool',
categoryConsumable: 'Consumable',
categoryOther: 'Other',
productName: 'Product Name',
categoryName: 'Product Category',
unitName: 'Unit',
warehouseName: 'Warehouse Code',
count: 'In/Out Quantity',
totalCount: 'Stock Quantity',
recordTime: 'In/Out Date',
createTime: 'Create Date',
creatorName: 'Operator',
placeholderProduct: 'Please select product',
placeholderWarehouse: 'Please select warehouse',
placeholderBizType: 'Please select type',
placeholderBizNo: 'Please input business no',
placeholderCreateTimeStart: 'Start Date',
placeholderCreateTimeEnd: 'End Date',
exportName: 'ProductStockRecord.xls'
},
Move: {
no: 'Transfer No',
product: 'Product',
@ -502,6 +531,8 @@ export default {
detail: 'Detail',
export: 'Export',
import: 'Import',
approve: 'Approve',
unapprove: 'Unapprove',
generate: 'Generate',
logout: 'Login Out',
test: 'Test',
@ -2637,6 +2668,154 @@ export default {
manualTableRemarkColumn: 'Remark'
}
},
EnergyManagement: {
EnergyType: {
moduleName: 'Energy Type',
searchCodeLabel: 'Energy Type Code',
searchCodePlaceholder: 'Please enter energy type code',
searchNameLabel: 'Energy Type Name',
searchNamePlaceholder: 'Please enter energy type name',
searchUnitLabel: 'Unit',
searchUnitPlaceholder: 'Please enter unit',
searchCreateTimeLabel: 'Create Time',
searchCreateTimeStartPlaceholder: 'Start Date',
searchCreateTimeEndPlaceholder: 'End Date',
searchButtonText: 'Search',
resetButtonText: 'Reset',
addButtonText: 'Add',
exportButtonText: 'Export',
tableCodeColumn: 'Energy Type Code',
tableNameColumn: 'Energy Type Name',
tableUnitColumn: 'Unit',
tableIsEnableColumn: 'Enabled',
tableRemarkColumn: 'Remark',
tableCreateTimeColumn: 'Create Time',
tableOperateColumn: 'Operation',
dialogCodeLabel: 'Energy Type Code',
dialogCodePlaceholder: 'Please enter energy type code',
dialogNameLabel: 'Energy Type Name',
dialogNamePlaceholder: 'Please enter energy type name',
dialogUnitLabel: 'Unit',
dialogUnitPlaceholder: 'Please enter unit',
dialogIsEnableLabel: 'Enabled',
dialogRemarkLabel: 'Remark',
dialogRemarkPlaceholder: 'Please enter remark',
dialogOkButtonText: 'Confirm',
dialogCancelButtonText: 'Cancel',
validatorCodeRequired: 'Energy type code can not be empty',
validatorNameRequired: 'Energy type name can not be empty',
validatorUnitRequired: 'Unit can not be empty',
validatorIsEnableRequired: 'Enabled can not be empty',
exportFilename: 'EnergyType.xls',
},
EnergyDeviceCheck: {
moduleName: 'Energy Report',
searchNameLabel: 'Meter Name',
searchNamePlaceholder: 'Please enter meter name',
searchOrgLabel: 'Area',
searchOrgPlaceholder: 'Please select area',
searchTimeRangeLabel: 'Time Range',
searchTimeRangeStartPlaceholder: 'Please select start time',
searchTimeRangeEndPlaceholder: 'Please select end time',
searchButtonText: 'Search',
resetButtonText: 'Reset',
exportButtonText: 'Export',
tableExpandPointNameColumn: 'Parameter Name',
tableExpandEarliestValueColumn: 'Earliest Value',
tableExpandEarliestTimeColumn: 'Earliest Time',
tableExpandLatestValueColumn: 'Latest Value',
tableExpandLatestTimeColumn: 'Latest Time',
tableExpandDifferenceColumn: 'Energy Usage',
tableNameColumn: 'Meter Name',
tableEnergyTypeColumn: 'Energy Type',
tableOrgColumn: 'Area',
tableEnergyConsumptionColumn: 'Energy Consumption',
tableStartTimeColumn: 'Start Time',
tableEndTimeColumn: 'End Time',
exportFileName: 'EnergyReport.xls',
dialogDeviceIdLabel: 'Energy Device ID',
dialogDeviceIdPlaceholder: 'Please enter energy device ID',
dialogLastCheckTimeLabel: 'Last Reading Time',
dialogLastCheckTimePlaceholder: 'Please select last reading time',
dialogLastCheckValueLabel: 'Last Reading',
dialogLastCheckValuePlaceholder: 'Please enter last reading',
dialogCheckTimeLabel: 'Reading Time',
dialogCheckTimePlaceholder: 'Please select reading time',
dialogCheckValueLabel: 'Reading',
dialogCheckValuePlaceholder: 'Please enter reading',
dialogDiffValueLabel: 'Difference',
dialogDiffValuePlaceholder: 'Please enter difference',
dialogUnitPriceLabel: 'Unit Price',
dialogUnitPricePlaceholder: 'Please enter unit price',
dialogRemarkLabel: 'Remark',
dialogRemarkPlaceholder: 'Please enter remark',
dialogOkButtonText: 'Confirm',
dialogCancelButtonText: 'Cancel',
validatorDeviceIdRequired: 'Energy device ID cannot be empty',
validatorCheckValueRequired: 'Reading cannot be empty'
},
EnergyDevice: {
moduleName: 'Energy Device',
searchNameLabel: 'Device Name',
searchNamePlaceholder: 'Please enter device name',
searchEnergyTypeLabel: 'Energy Type',
searchEnergyTypePlaceholder: 'Please select energy type',
searchButtonText: 'Search',
resetButtonText: 'Reset',
createButtonText: 'Add',
exportButtonText: 'Export',
tableCodeColumn: 'Device Code',
tableNameColumn: 'Device Name',
tableEnergyTypeColumn: 'Energy Type',
tableOrgColumn: 'Area',
tableIsEnableColumn: 'Enabled',
tableUpdateTimeColumn: 'Update Time',
tableOperateColumn: 'Operation',
tableEditAction: 'Edit',
tableDeleteAction: 'Delete',
exportFileName: 'EnergyDevice.xls',
dialogCodeLabel: 'Device Code',
dialogCodePlaceholder: 'Please enter device code',
dialogNameLabel: 'Device Name',
dialogNamePlaceholder: 'Please enter device name',
dialogEnergyTypeLabel: 'Energy Type',
dialogEnergyTypePlaceholder: 'Please select energy type',
dialogOrgLabel: 'Area',
dialogOrgTreePlaceholder: 'Please select area',
dialogRulesLabel: 'Calculation Rule',
dialogRulesPointPlaceholder: 'Please select device point',
dialogOperatorPlaceholder: 'Please select operator',
dialogIsEnableLabel: 'Enabled',
dialogSubmitButtonText: 'Confirm',
dialogCancelButtonText: 'Cancel',
validatorNameRequired: 'Device name cannot be empty',
validatorCodeRequired: 'Device code cannot be empty',
validatorOrgRequired: 'Area cannot be empty',
validatorIsEnableRequired: 'Enabled cannot be empty',
validatorRulesRequired: 'Calculation rule cannot be empty',
validatorRulesPointRequired: 'Device point cannot be empty',
validatorRulesOperatorRequired: 'Operator cannot be empty'
}
},
ProductionPlan: {
Task: {
moduleName: 'Production Task',
@ -3440,6 +3619,7 @@ export default {
alarmPointName: 'Point Name',
alarmPointValue: 'Point Value',
alarmLevel: 'Alarm Level',
alarmTime: 'Alarm Time',
emptyDescription: 'Click "Point" in the device list to view points and rules',

@ -57,7 +57,7 @@ export default {
copy: '复制',
copySuccess: '复制成功',
copyError: '复制失败',
code:'编码保存后自动生成'
code: '编码保存后自动生成'
},
ErpStock: {
Warehouse: {
@ -111,6 +111,7 @@ export default {
price: '金额',
totalPrice: '合计金额',
inType: '入库类型',
file: '附件',
tabProduct: '产品入库',
tabMaterial: '原料入库',
tabPart: '备件入库',
@ -218,6 +219,34 @@ export default {
validatorWarehouseRequired: '仓库名字不能为空'
}
},
Record: {
product: '产品',
warehouse: '仓库',
bizType: '类型',
bizNo: '业务单号',
categoryProduct: '产品',
categoryMaterial: '原料',
categorySpare: '备件',
categoryTool: '工具',
categoryConsumable: '耗材',
categoryOther: '其他',
productName: '产品名称',
categoryName: '产品分类',
unitName: '产品单位',
warehouseName: '仓库编号',
count: '出入库数量',
totalCount: '库存量',
recordTime: '出入库日期',
createTime: '创建日期',
creatorName: '操作人',
placeholderProduct: '请选择产品',
placeholderWarehouse: '请选择仓库',
placeholderBizType: '请选择类型',
placeholderBizNo: '请输入业务单号',
placeholderCreateTimeStart: '开始日期',
placeholderCreateTimeEnd: '结束日期',
exportName: '产品库存明细.xls'
},
Move: {
no: '调拨单号',
product: '产品',
@ -504,6 +533,8 @@ export default {
detail: '详情',
export: '导出',
import: '导入',
approve: '审批',
unapprove: '反审批',
generate: '生成',
logout: '强制退出',
test: '测试',
@ -729,7 +760,8 @@ export default {
emailInvalid: '请输入正确的邮箱地址',
mobileInvalid: '请输入正确的手机号码',
importFileRequired: '请上传文件',
importSuccessTip: '上传成功数量:{createCount};更新成功数量:{updateCount};更新失败数量:{failureCount}',
importSuccessTip:
'上传成功数量:{createCount};更新成功数量:{updateCount};更新失败数量:{failureCount}',
importFailed: '上传失败,请您重新上传!',
importFileLimit: '最多只能上传一个文件!',
resetPasswordTitle: '请输入"{username}"的新密码',
@ -1019,7 +1051,7 @@ export default {
placeholderInspectionMethod: '请选择检验方式',
placeholderValueType: '请选择值类型',
placeholderUpperVal: '请输入上限值',
placeholderLowerVal: '请输入下限值',
placeholderLowerVal: '请输入下限值'
},
// 方案维护
@ -3428,6 +3460,7 @@ export default {
alarmPointName: '点位名称',
alarmPointValue: '点位值',
alarmLevel: '告警等级',
alarmTime: '告警时间',
emptyDescription: '请点击设备列表的“点位”查看采集点和点位规则',
@ -3592,5 +3625,377 @@ export default {
messageDeviceNoParams: '该设备下没有参数',
messageFetchChartFailed: '获取图表数据失败'
}
},
EnergyManagement: {
EnergyType: {
moduleName: '能耗类型',
searchCodeLabel: '能耗类型编码',
searchCodePlaceholder: '请输入能耗类型编码',
searchNameLabel: '能耗类型名称',
searchNamePlaceholder: '请输入能耗类型名称',
searchUnitLabel: '单位',
searchUnitPlaceholder: '请输入单位',
searchCreateTimeLabel: '创建时间',
searchCreateTimeStartPlaceholder: '开始日期',
searchCreateTimeEndPlaceholder: '结束日期',
searchButtonText: '搜索',
resetButtonText: '重置',
addButtonText: '新增',
exportButtonText: '导出',
tableCodeColumn: '能耗类型编码',
tableNameColumn: '能耗类型名称',
tableUnitColumn: '单位',
tableIsEnableColumn: '是否启用',
tableRemarkColumn: '备注',
tableCreateTimeColumn: '创建时间',
tableOperateColumn: '操作',
dialogCodeLabel: '能耗类型编码',
dialogCodePlaceholder: '请输入能耗类型编码',
dialogNameLabel: '能耗类型名称',
dialogNamePlaceholder: '请输入能耗类型名称',
dialogUnitLabel: '单位',
dialogUnitPlaceholder: '请输入单位',
dialogIsEnableLabel: '是否启用',
dialogRemarkLabel: '备注',
dialogRemarkPlaceholder: '请输入备注',
dialogOkButtonText: '确 定',
dialogCancelButtonText: '取 消',
validatorCodeRequired: '能耗类型编码不能为空',
validatorNameRequired: '能耗类型名称不能为空',
validatorUnitRequired: '单位不能为空',
validatorIsEnableRequired: '是否启用不能为空',
exportFilename: '能耗类型.xls'
},
EnergyDeviceCheck: {
moduleName: '能源报表',
searchNameLabel: '表名称',
searchNamePlaceholder: '请输入表名称',
searchOrgLabel: '所属区域',
searchOrgPlaceholder: '请选择所属区域',
searchTimeRangeLabel: '时间范围',
searchTimeRangeStartPlaceholder: '请选择开始时间',
searchTimeRangeEndPlaceholder: '请选择结束时间',
searchButtonText: '查询',
resetButtonText: '重置',
exportButtonText: '导出',
tableExpandPointNameColumn: '参数名称',
tableExpandEarliestValueColumn: '最早采集值',
tableExpandEarliestTimeColumn: '最早采集时间',
tableExpandLatestValueColumn: '最新值',
tableExpandLatestTimeColumn: '最新采集时间',
tableExpandDifferenceColumn: '能耗用量',
tableNameColumn: '表名称',
tableEnergyTypeColumn: '能源类型',
tableOrgColumn: '所属区域',
tableEnergyConsumptionColumn: '能源用量',
tableStartTimeColumn: '开始时间',
tableEndTimeColumn: '结束时间',
exportFileName: '能源报表.xls',
dialogDeviceIdLabel: '能源设备Id',
dialogDeviceIdPlaceholder: '请输入能源设备Id',
dialogLastCheckTimeLabel: '上次抄表时间',
dialogLastCheckTimePlaceholder: '选择上次抄表时间',
dialogLastCheckValueLabel: '上次抄表值',
dialogLastCheckValuePlaceholder: '请输入上次抄表值',
dialogCheckTimeLabel: '抄表时间',
dialogCheckTimePlaceholder: '选择抄表时间',
dialogCheckValueLabel: '抄表值',
dialogCheckValuePlaceholder: '请输入抄表值',
dialogDiffValueLabel: '差值',
dialogDiffValuePlaceholder: '请输入差值',
dialogUnitPriceLabel: '单价',
dialogUnitPricePlaceholder: '请输入单价',
dialogRemarkLabel: '备注',
dialogRemarkPlaceholder: '请输入备注',
dialogOkButtonText: '确 定',
dialogCancelButtonText: '取 消',
validatorDeviceIdRequired: '能源设备Id不能为空',
validatorCheckValueRequired: '抄表值不能为空'
},
EnergyDevice: {
moduleName: '能源设备',
searchNameLabel: '设备名称',
searchNamePlaceholder: '请输入设备名称',
searchEnergyTypeLabel: '能耗类型',
searchEnergyTypePlaceholder: '请选择能耗类型',
searchButtonText: '搜索',
resetButtonText: '重置',
createButtonText: '新增',
exportButtonText: '导出',
tableCodeColumn: '设备编码',
tableNameColumn: '设备名称',
tableEnergyTypeColumn: '能耗类型',
tableOrgColumn: '所属区域',
tableIsEnableColumn: '是否启用',
tableUpdateTimeColumn: '更新时间',
tableOperateColumn: '操作',
tableEditAction: '编辑',
tableDeleteAction: '删除',
exportFileName: '能源设备.xls',
dialogCodeLabel: '设备编码',
dialogCodePlaceholder: '请输入设备编码',
dialogNameLabel: '设备名称',
dialogNamePlaceholder: '请输入设备名称',
dialogEnergyTypeLabel: '能耗类型',
dialogEnergyTypePlaceholder: '请选择能耗类型',
dialogOrgLabel: '所属区域',
dialogOrgTreePlaceholder: '请选择所属区域',
dialogRulesLabel: '计算规则',
dialogRulesPointPlaceholder: '请选择设备点位',
dialogOperatorPlaceholder: '请选择运算符',
dialogIsEnableLabel: '是否启用',
dialogSubmitButtonText: '确 定',
dialogCancelButtonText: '取 消',
validatorNameRequired: '设备名称不能为空',
validatorCodeRequired: '设备编码不能为空',
validatorOrgRequired: '所属区域不能为空',
validatorIsEnableRequired: '是否启用不能为空',
validatorRulesRequired: '计算规则不能为空',
validatorRulesPointRequired: '设备点位不能为空',
validatorRulesOperatorRequired: '运算符不能为空'
},
Device: {
Device: {
moduleName: '采集设备',
index: '序号',
deviceCode: '设备编号',
deviceName: '设备名称',
operatingStatus: '运行状态',
protocol: '采集协议',
status: '连接状态',
sampleCycle: '采集周期(s)',
isEnable: '是否启用',
collectionTime: '采集时间',
operate: '操作',
search: '搜索',
reset: '重置',
create: '新增',
batchDelete: '批量删除',
export: '导出',
placeholderDeviceCode: '请输入设备编号',
placeholderDeviceName: '请输入设备名称',
placeholderModel: '请选择设备模型',
placeholderSampleCycle: '请输入采集周期',
placeholderUrl: '请输入端点URL',
placeholderUsername: '请输入用户名',
placeholderPassword: '请输入密码',
model: '设备模型',
url: '端点URL',
username: '用户名',
password: '密码',
settingDialogTitle: '设备设置',
connect: '连接',
disconnect: '断开连接',
attributeModuleName: '点位',
attributeCode: '点位编码',
attributeName: '点位名称',
attributeType: '点位类型',
dataType: '数据类型',
address: '寄存器地址',
dataUnit: '单位',
ratio: '倍率',
remark: '备注',
deviceAttributeTabLabel: '设备属性',
deviceRuleTabLabel: '点位规则',
currentDeviceLabel: '当前设备:',
alarmHistoryTitle: '设备告警历史数据',
alarmRuleName: '规则名称',
alarmPointName: '点位名称',
alarmPointValue: '点位值',
alarmLevel: '告警等级',
alarmTime: '告警时间',
emptyDescription: '请点击设备列表的“点位”查看采集点和点位规则',
exportFilename: '物联设备.xls',
attributeExportFilename: '采集设备-点位管理.xls',
attributeLatestValue: '最新值',
attributeLatestCollectionTime: '最新采集时间',
attributeSort: '顺序',
attributePlaceholderSort: '请输入顺序',
placeholderAttributeCode: '请输入点位编码',
placeholderAttributeName: '请输入点位名称',
placeholderAttributeType: '请选择点位类型',
placeholderDataType: '请选择数据类型',
placeholderAddress: '请输入寄存器地址',
placeholderDataUnit: '请输入单位',
placeholderRatio: '请输入倍率',
placeholderRemark: '请输入备注',
validatorDeviceCodeRequired: '设备编号不能为空',
validatorDeviceNameRequired: '设备名称不能为空',
validatorSampleCycleRequired: '采集周期不能为空',
validatorIsEnableRequired: '是否启用不能为空',
validatorUrlRequired: '端点URL不能为空',
attributeValidatorCodeRequired: '点位编码不能为空',
attributeValidatorNameRequired: '点位名称不能为空',
attributeValidatorCodeNoChinese: '点位编码不允许输入中文',
attributeValidatorSortNumber: '顺序只能输入数字',
attributeValidatorRemarkTooLong: '备注不能超过100字',
messageSelectDeviceRequired: '请选择一个物联设备',
messageDeviceInfoMissingForRules: '设备信息缺失,无法加载点位规则'
},
RunReport: {
moduleName: '设备运行报表',
searchDeviceCodeLabel: '设备编码',
searchDeviceCodePlaceholder: '请输入设备编码',
searchDeviceNameLabel: '设备名称',
searchDeviceNamePlaceholder: '请输入设备名称',
searchTimeRangeLabel: '设备运行时间',
searchTimeRangeStartPlaceholder: '开始时间',
searchTimeRangeEndPlaceholder: '结束时间',
searchButtonText: '搜索',
resetButtonText: '重置',
exportButtonText: '导出',
tableDeviceCodeColumn: '设备编码',
tableDeviceNameColumn: '设备名称',
tableRunningTimeColumn: '运行时间(小时)',
tableStandbyTimeColumn: '待机时间(小时)',
tableFaultTimeColumn: '故障时间(小时)',
tableWarningTimeColumn: '警告时间(小时)',
tableUtilizationRateColumn: '稼动率',
tableStartTimeColumn: '设备运行开始时间',
tableEndTimeColumn: '设备运行结束时间',
exportFilename: '设备运行报表.xls'
},
RealTimeMonitoring: {
moduleName: '数据实时监控',
searchLineCodeLabel: '产线编码',
searchLineCodePlaceholder: '请输入产线编码',
searchLineNameLabel: '产线名称',
searchLineNamePlaceholder: '请输入产线名称',
searchDeviceCodeLabel: '设备编码',
searchDeviceCodePlaceholder: '请输入设备编码',
searchDeviceNameLabel: '设备名称',
searchDeviceNamePlaceholder: '请输入设备名称',
searchButtonText: '搜索',
resetButtonText: '重置',
exportButtonText: '导出',
tableLineCodeColumn: '产线编码',
tableLineNameColumn: '产线名称',
tableDeviceCodeColumn: '设备编码',
tableDeviceNameColumn: '设备名称',
tableStatusColumn: '连接状态',
tableCollectionTimeColumn: '最新采集时间',
tableOperateColumn: '操作',
tableActionSingleMonitorLabel: '单设备监控',
dialogTitle: '单设备监控',
dialogDeviceNameLabel: '设备名称:',
dialogCollectionTimeLabel: '采集时间:',
emptyDescription: '暂无数据',
defaultGroupName: '默认',
defaultFieldLabelPrefix: '字段',
messageDeviceInfoIncomplete: '设备信息不完整',
exportFilename: '实时监控设备.xls'
},
HistoryData: {
moduleName: '历史记录查询',
searchLineCodeLabel: '产线编码',
searchLineCodePlaceholder: '请输入产线编码',
searchLineNameLabel: '产线名称',
searchLineNamePlaceholder: '请输入产线名称',
searchDeviceCodeLabel: '设备编码',
searchDeviceCodePlaceholder: '请输入设备编码',
searchDeviceNameLabel: '设备名称',
searchDeviceNamePlaceholder: '请输入设备名称',
searchButtonText: '搜索',
resetButtonText: '重置',
exportButtonText: '导出',
tableLineCodeColumn: '产线编码',
tableLineNameColumn: '产线名称',
tableDeviceCodeColumn: '设备编码',
tableDeviceNameColumn: '设备名称',
tableCollectionTimeColumn: '采集时间',
tableOperateColumn: '操作',
tableActionHistoryLabel: '历史记录',
dialogTitlePrefix: '历史记录:',
dialogCollectionTimeLabel: '采集时间',
dialogCollectionTimeStartPlaceholder: '开始时间',
dialogCollectionTimeEndPlaceholder: '结束时间',
dialogSearchButtonText: '查询',
dialogResetButtonText: '重置',
dialogRecordCollectionTimePrefix: '采集时间:',
emptyDescription: '暂无数据',
defaultFieldLabelPrefix: '字段',
exportFilename: '历史数据设备.xls'
},
DeviceParamAnalysis: {
moduleName: '设备运行参数分析',
treeSearchPlaceholder: '搜索设备或参数',
formTimeLabel: '时间',
formTimeStartPlaceholder: '开始日期',
formTimeEndPlaceholder: '结束日期',
shortcutLast7Days: '最近 7 天',
shortcutLastWeek: '上周',
shortcutLastMonth: '上个月',
shortcutLast3Months: '三个月内',
searchButtonText: '搜索',
resetButtonText: '重置',
emptyDescription: '暂无数据',
emptySelectNodeDescription: '请选择左侧节点',
selectedParamTitle: '节点:{label}{unit}',
defaultSeriesName: '参数',
messageLoadTreeFailed: '获取树数据失败',
messageNodeNoParams: '该节点下暂无参数',
messageDeviceNoParams: '该设备下没有参数',
messageFetchChartFailed: '获取图表数据失败'
}
}
}
}

@ -31,6 +31,14 @@
>
<Icon icon="ep:plus" class="mr-5px" /> {{ t('action.add') }}
</el-button>
<el-button
type="warning"
plain
@click="openImport"
v-hasPermi="['erp:product:import']"
>
<Icon icon="ep:upload" class="mr-5px" /> {{ t('action.import') }}
</el-button>
<el-button
type="success"
plain
@ -97,6 +105,49 @@
<!-- 表单弹窗添加/修改 -->
<ProductForm ref="formRef" @success="getList" />
<Dialog v-model="importDialogVisible" :title="t('action.import')" width="400">
<el-upload
ref="uploadRef"
v-model:file-list="importFileList"
:action="importUrl + '?updateSupport=' + updateSupport"
:auto-upload="false"
:disabled="importLoading"
:headers="uploadHeaders"
:limit="1"
:on-error="handleImportError"
:on-exceed="handleImportExceed"
:on-success="handleImportSuccess"
accept=".xlsx, .xls"
drag
>
<Icon icon="ep:upload" />
<div class="el-upload__text">
将文件拖到此处或点击上传
</div>
<template #tip>
<div class="el-upload__tip text-center">
<div class="el-upload__tip">
<el-checkbox v-model="updateSupport" />
是否更新已存在的数据
</div>
<span>仅支持 .xlsx, .xls 格式</span>
<el-link
:underline="false"
style="font-size: 12px; vertical-align: baseline"
type="primary"
@click="importTemplate"
>
下载导入模板
</el-link>
</div>
</template>
</el-upload>
<template #footer>
<el-button :disabled="importLoading" type="primary" @click="submitImport">{{ t('common.ok') }}</el-button>
<el-button @click="importDialogVisible = false">{{ t('common.cancel') }}</el-button>
</template>
</Dialog>
</template>
<script setup lang="ts">
@ -108,8 +159,9 @@ import ProductForm from './ProductForm.vue'
import { DICT_TYPE } from '@/utils/dict'
import { defaultProps, handleTree } from '@/utils/tree'
import { erpPriceTableColumnFormatter } from '@/utils'
import BomForm from "@/views/mes/bom/BomForm.vue";
import {checkPermi} from "@/utils/permission";
import BomForm from '@/views/mes/bom/BomForm.vue'
import { checkPermi } from '@/utils/permission'
import { getAccessToken, getTenantId } from '@/utils/auth'
/** ERP 产品列表 */
defineOptions({ name: 'ErpProduct' })
@ -129,6 +181,15 @@ const queryParams = reactive({
const queryFormRef = ref() //
const exportLoading = ref(false) //
const importDialogVisible = ref(false)
const importLoading = ref(false)
const uploadRef = ref()
const importUrl =
import.meta.env.VITE_BASE_URL + import.meta.env.VITE_API_URL + '/erp/product/import'
const uploadHeaders = ref()
const importFileList = ref([])
const updateSupport = ref(0)
/** 查询列表 */
const getList = async () => {
loading.value = true
@ -188,6 +249,52 @@ const handleExport = async () => {
}
}
const openImport = () => {
importDialogVisible.value = true
importLoading.value = false
importFileList.value = []
updateSupport.value = 0
}
const submitImport = async () => {
if (importFileList.value.length === 0) {
message.error('请选择导入文件')
return
}
uploadHeaders.value = {
Authorization: 'Bearer ' + getAccessToken(),
tenantId: getTenantId()
}
importLoading.value = true
uploadRef.value?.submit()
}
const handleImportSuccess = (response: any) => {
if (!response || response.code !== 0) {
message.error(response?.msg || '导入失败')
importLoading.value = false
return
}
message.success('导入成功')
importLoading.value = false
importDialogVisible.value = false
getList()
}
const handleImportError = () => {
message.error('导入失败')
importLoading.value = false
}
const handleImportExceed = () => {
message.error('只能上传一个文件')
}
const importTemplate = async () => {
const res = await ProductApi.importProductTemplate()
download.excel(res, '产品导入模板.xls')
}
/** 初始化 **/
onMounted(async () => {
queryParams.categoryId = 2

@ -4,45 +4,45 @@
ref="formRef"
:model="formData"
:rules="formRules"
label-width="100px"
label-width="auto"
v-loading="formLoading"
:disabled="disabled"
>
<el-form-item prop="code">
<template #label>
<span>
入库单号
<el-tooltip content="入库单号" placement="top">
<Icon icon="ep:question-filled" />
</el-tooltip>
</span>
</template>
<el-row :gutter="10" style="width: 100%;">
<el-col :xs="24" :sm="18" :md="16" :lg="14" :xl="12">
<el-input
:disabled="formData.isCode == true || formType === 'update'"
v-model="formData.no"
placeholder="编码保存后自动生成"
/>
</el-col>
<el-col :xs="24" :sm="6" :md="4" :lg="3" :xl="2">
<div>
<el-switch
v-model="formData.isCode"
:disabled="formType === 'update'"
/>
</div>
</el-col>
</el-row>
</el-form-item>
<el-form-item prop="code">
<template #label>
<span>
{{ t('ErpStock.In.no') }}
<el-tooltip :content="t('ErpStock.In.no')" placement="top">
<Icon icon="ep:question-filled" />
</el-tooltip>
</span>
</template>
<el-row :gutter="10" style="width: 100%">
<el-col :xs="24" :sm="18" :md="16" :lg="14" :xl="12">
<el-input
:disabled="formData.isCode == true || formType === 'update'"
v-model="formData.no"
:placeholder="t('common.code')"
/>
</el-col>
<el-col :xs="24" :sm="6" :md="4" :lg="3" :xl="2">
<div>
<el-switch
v-model="formData.isCode"
:disabled="formType === 'update'"
/>
</div>
</el-col>
</el-row>
</el-form-item>
<el-row :gutter="20">
<el-col :span="8">
<el-form-item label="入库类型" prop="inType">
<el-form-item :label="t('ErpStock.In.inType')" prop="inType">
<el-select
v-model="formData.inType"
clearable
filterable
placeholder="请选择入库类型"
:placeholder="t('ErpStock.In.placeholderInType')"
class="!w-1/1"
>
<el-option
@ -56,12 +56,12 @@
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="入库时间" prop="inTime">
<el-form-item :label="t('ErpStock.In.inTime')" prop="inTime">
<el-date-picker
v-model="formData.inTime"
type="date"
value-format="x"
placeholder="选择入库时间"
:placeholder="t('ErpStock.In.placeholderInTime')"
class="!w-1/1"
/>
</el-form-item>
@ -85,17 +85,17 @@
</el-form-item>
</el-col> -->
<el-col :span="8">
<el-form-item label="备注" prop="remark">
<el-form-item :label="t('ErpStock.In.remark')" prop="remark">
<el-input
type="textarea"
v-model="formData.remark"
:rows="1"
placeholder="请输入备注"
:placeholder="t('ErpStock.In.placeholderRemark')"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="附件" prop="fileUrl">
<el-form-item :label="t('ErpStock.In.file')" prop="fileUrl">
<UploadFile :is-show-tip="false" v-model="formData.fileUrl" :limit="1" />
</el-form-item>
</el-col>
@ -104,16 +104,16 @@
<!-- 子表的表单 -->
<ContentWrap>
<el-tabs v-model="subTabsName" class="-mt-15px -mb-10px">
<el-tab-pane label="入库产品清单" name="item">
<el-tab-pane :label="t('ErpStock.In.list')" name="item">
<StockInItemForm ref="itemFormRef" :items="formData.items" :disabled="disabled" />
</el-tab-pane>
</el-tabs>
</ContentWrap>
<template #footer>
<el-button @click="submitForm" type="primary" :disabled="formLoading" v-if="!disabled">
{{ t('common.ok') }}
</el-button>
<el-button @click="dialogVisible = false"> </el-button>
<el-button @click="dialogVisible = false">{{ t('common.cancel') }}</el-button>
</template>
</Dialog>
</template>
@ -144,8 +144,8 @@ const formData = ref({
no: undefined
})
const formRules = reactive({
inTime: [{ required: true, message: '入库时间不能为空', trigger: 'blur' }],
inType: [{ required: true, message: '入库类型不能为空', trigger: 'blur' }]
inTime: [{ required: true, message: t('ErpStock.In.validatorInTimeRequired'), trigger: 'blur' }],
inType: [{ required: true, message: t('ErpStock.In.validatorInTypeRequired'), trigger: 'blur' }]
})
const disabled = computed(() => formType.value === 'detail')
const formRef = ref() // Ref
@ -153,12 +153,11 @@ const supplierList = ref<SupplierVO[]>([]) // 供应商列表
const options = [
{
value: '其他入库',
label: '其他入库',
label: t('ErpStock.In.tabOther')
},
{
value: '备件入库',
label: '备件入库',
label: t('ErpStock.In.tabPart')
},
// {
// value: '',
@ -166,7 +165,7 @@ const options = [
// },
{
value: '产品入库',
label: '产品入库',
label: t('ErpStock.In.tabProduct')
},
// {
// value: '',

@ -9,8 +9,8 @@
:disabled="disabled"
>
<el-table :data="formData" show-summary :summary-method="getSummaries" class="-mt-10px">
<el-table-column label="序号" type="index" align="center" width="60" />
<el-table-column label="仓库名称" min-width="125">
<el-table-column :label="t('common.index')" type="index" align="center" width="60" />
<el-table-column :label="t('ErpStock.Item.warehouse')" min-width="125">
<template #default="{ row, $index }">
<el-form-item
:prop="`${$index}.warehouseId`"
@ -21,7 +21,7 @@
v-model="row.warehouseId"
clearable
filterable
placeholder="请选择仓库"
:placeholder="t('ErpStock.Item.placeholderWarehouse')"
@change="onChangeWarehouse($event, row)"
>
<el-option
@ -34,7 +34,7 @@
</el-form-item>
</template>
</el-table-column>
<el-table-column label="产品名称" min-width="180">
<el-table-column :label="t('ErpStock.Item.product')" min-width="180">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.productId`" :rules="formRules.productId" class="mb-0px!">
<el-cascader
@ -45,34 +45,34 @@
clearable
filterable
@change="onChangeProduct($event, row)"
placeholder="请选择产品"
:placeholder="t('ErpStock.Item.placeholderProduct')"
class="!w-100%"
/>
</el-form-item>
</template>
</el-table-column>
<el-table-column label="库存" min-width="100">
<el-table-column :label="t('ErpStock.Item.stock')" min-width="100">
<template #default="{ row }">
<el-form-item class="mb-0px!">
<el-input disabled v-model="row.stockCount" :formatter="erpCountInputFormatter" />
</el-form-item>
</template>
</el-table-column>
<el-table-column label="条码" min-width="150">
<el-table-column :label="t('ErpStock.Item.barcode')" min-width="150">
<template #default="{ row }">
<el-form-item class="mb-0px!">
<el-input disabled v-model="row.productBarCode" />
</el-form-item>
</template>
</el-table-column>
<el-table-column label="单位" min-width="80">
<el-table-column :label="t('ErpStock.Item.unit')" min-width="80">
<template #default="{ row }">
<el-form-item class="mb-0px!">
<el-input disabled v-model="row.productUnitName" />
</el-form-item>
</template>
</el-table-column>
<el-table-column label="数量" prop="count" fixed="right" min-width="140">
<el-table-column :label="t('ErpStock.Item.count')" prop="count" fixed="right" min-width="140">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.count`" :rules="formRules.count" class="mb-0px!">
<el-input-number
@ -85,7 +85,7 @@
</el-form-item>
</template>
</el-table-column>
<el-table-column label="产品单价" fixed="right" min-width="120">
<el-table-column :label="t('ErpStock.Item.price')" fixed="right" min-width="120">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.productPrice`" class="mb-0px!">
<el-input-number
@ -98,21 +98,21 @@
</el-form-item>
</template>
</el-table-column>
<el-table-column label="合计金额" prop="totalPrice" fixed="right" min-width="100">
<el-table-column :label="t('ErpStock.Item.totalPrice')" prop="totalPrice" fixed="right" min-width="100">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.totalPrice`" class="mb-0px!">
<el-input disabled v-model="row.totalPrice" :formatter="erpPriceInputFormatter" />
</el-form-item>
</template>
</el-table-column>
<el-table-column label="备注" fixed="right" min-width="150">
<el-table-column :label="t('ErpStock.Item.remark')" fixed="right" min-width="150">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.remark`" class="mb-0px!">
<el-input v-model="row.remark" placeholder="请输入备注" />
<el-input v-model="row.remark" :placeholder="t('ErpStock.In.placeholderRemark')" />
</el-form-item>
</template>
</el-table-column>
<el-table-column align="center" fixed="right" label="操作" width="60">
<el-table-column align="center" fixed="right" :label="t('ErpStock.Item.action')" width="60">
<template #default="{ $index }">
<el-button type="danger" @click="handleDelete($index)" link>
<Icon icon="ep:delete" />
@ -122,7 +122,7 @@
</el-table>
</el-form>
<el-row justify="center" class="mt-3" v-if="!disabled">
<el-button @click="handleAdd" round>+ 添加入库产品</el-button>
<el-button @click="handleAdd" round>+ {{ t('ErpStock.In.addItem') }}</el-button>
</el-row>
</template>
<script setup lang="ts">
@ -142,11 +142,11 @@ const props = defineProps<{
}>()
const formLoading = ref(false) //
const formData = ref([])
const { t } = useI18n()
const formRules = reactive({
inId: [{ required: true, message: '入库编号不能为空', trigger: 'blur' }],
warehouseId: [{ required: true, message: '仓库不能为空', trigger: 'blur' }],
productId: [{ required: true, message: '产品不能为空', trigger: 'blur' }],
count: [{ required: true, message: '产品数量不能为空', trigger: 'blur' }]
warehouseId: [{ required: true, message: t('ErpStock.Item.validatorWarehouseRequired'), trigger: 'blur' }],
productId: [{ required: true, message: t('ErpStock.Item.validatorProductRequired'), trigger: 'blur' }],
count: [{ required: true, message: t('ErpStock.Item.validatorCountRequired'), trigger: 'blur' }]
})
const formRef = ref([]) // Ref
const productList = ref<ProductVO[]>([]) //

@ -6,23 +6,23 @@
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="68px"
label-width="auto"
>
<el-form-item label="入库单号" prop="no">
<el-form-item :label="t('ErpStock.In.no')" prop="no">
<el-input
v-model="queryParams.no"
placeholder="请输入入库单号"
:placeholder="t('ErpStock.In.placeholderNo')"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="产品" prop="productId">
<el-form-item :label="t('ErpStock.In.product')" prop="productId">
<el-select
v-model="queryParams.productId"
clearable
filterable
placeholder="请选择产品"
:placeholder="t('ErpStock.In.placeholderProduct')"
class="!w-240px"
>
<el-option
@ -33,13 +33,13 @@
/>
</el-select>
</el-form-item>
<el-form-item label="入库时间" prop="inTime">
<el-form-item :label="t('ErpStock.In.inTime')" prop="inTime">
<el-date-picker
v-model="queryParams.inTime"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
start-placeholder="开始日期"
end-placeholder="结束日期"
:start-placeholder="t('common.startTimeText')"
:end-placeholder="t('common.endTimeText')"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-220px"
/>
@ -60,12 +60,12 @@
/>
</el-select>
</el-form-item> -->
<el-form-item label="仓库" prop="warehouseId">
<el-form-item :label="t('ErpStock.In.warehouse')" prop="warehouseId">
<el-select
v-model="queryParams.warehouseId"
clearable
filterable
placeholder="请选择仓库"
:placeholder="t('ErpStock.In.placeholderWarehouse')"
class="!w-240px"
>
<el-option
@ -76,12 +76,12 @@
/>
</el-select>
</el-form-item>
<el-form-item label="创建人" prop="creator">
<el-form-item :label="t('ErpStock.In.creator')" prop="creator">
<el-select
v-model="queryParams.creator"
clearable
filterable
placeholder="请选择创建人"
:placeholder="t('ErpStock.In.placeholderCreator')"
class="!w-240px"
>
<el-option
@ -92,8 +92,13 @@
/>
</el-select>
</el-form-item>
<el-form-item label="状态" prop="status">
<el-select v-model="queryParams.status" placeholder="请选择状态" clearable class="!w-240px">
<el-form-item :label="t('ErpStock.In.status')" prop="status">
<el-select
v-model="queryParams.status"
:placeholder="t('ErpStock.In.placeholderStatus')"
clearable
class="!w-240px"
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.ERP_AUDIT_STATUS)"
:key="dict.value"
@ -102,25 +107,25 @@
/>
</el-select>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-form-item :label="t('ErpStock.In.remark')" prop="remark">
<el-input
v-model="queryParams.remark"
placeholder="请输入备注"
:placeholder="t('ErpStock.In.placeholderRemark')"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item>
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> {{ t('common.query') }}</el-button>
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> {{ t('common.reset') }}</el-button>
<el-button
type="primary"
plain
@click="openForm('create')"
v-hasPermi="['erp:stock-in:create']"
>
<Icon icon="ep:plus" class="mr-5px" /> 新增
<Icon icon="ep:plus" class="mr-5px" /> {{ t('action.add') }}
</el-button>
<el-button
type="success"
@ -129,7 +134,7 @@
:loading="exportLoading"
v-hasPermi="['erp:stock-in:export']"
>
<Icon icon="ep:download" class="mr-5px" /> 导出
<Icon icon="ep:download" class="mr-5px" /> {{ t('action.export') }}
</el-button>
<el-button
type="danger"
@ -138,7 +143,7 @@
v-hasPermi="['erp:stock-in:delete']"
:disabled="selectionList.length === 0"
>
<Icon icon="ep:delete" class="mr-5px" /> 删除
<Icon icon="ep:delete" class="mr-5px" /> {{ t('action.del') }}
</el-button>
</el-form-item>
</el-form>
@ -147,10 +152,10 @@
<!-- 列表 -->
<ContentWrap>
<el-tabs v-model="activeName" @tab-click="handleTabClick">
<el-tab-pane label="产品入库" name="产品入库" />
<!-- <el-tab-pane label="原料入库" name="原料入库" /> -->
<el-tab-pane label="备件入库" name="备件入库" />
<el-tab-pane label="其他入库" name="其他入库" />
<el-tab-pane :label="t('ErpStock.In.tabProduct')" name="产品入库" />
<!-- <el-tab-pane :label="t('ErpStock.In.tabMaterial')" name="原料入库" /> -->
<el-tab-pane :label="t('ErpStock.In.tabPart')" name="备件入库" />
<el-tab-pane :label="t('ErpStock.In.tabOther')" name="其他入库" />
</el-tabs>
<el-table
@ -160,20 +165,31 @@
:show-overflow-tooltip="true"
@selection-change="handleSelectionChange"
>
<el-table-column width="30" label="选择" type="selection" />
<el-table-column min-width="180" label="入库单号" align="center" prop="no" />
<el-table-column label="产品信息" align="left" sortable prop="productNames" min-width="200" />
<el-table-column width="30" :label="t('common.select')" type="selection" />
<el-table-column
min-width="180"
:label="t('ErpStock.In.no')"
align="center"
prop="no"
/>
<el-table-column
:label="t('ErpStock.In.productInfo')"
align="left"
sortable
prop="productNames"
min-width="200"
/>
<!-- <el-table-column label="供应商" align="center" prop="supplierName" /> -->
<el-table-column
label="入库时间"
:label="t('ErpStock.In.inTime')"
align="center"
prop="inTime"
:formatter="dateFormatter2"
width="120px"
/>
<el-table-column label="创建人" align="center" prop="creatorName" />
<el-table-column :label="t('ErpStock.In.creator')" align="center" prop="creatorName" />
<el-table-column
label="数量"
:label="t('ErpStock.In.count')"
align="right"
sortable
prop="totalCount"
@ -186,19 +202,25 @@
prop="totalPrice"
:formatter="erpPriceTableColumnFormatter"
/> -->
<el-table-column label="状态" align="center" fixed="right" width="90" prop="status">
<el-table-column
:label="t('ErpStock.In.status')"
align="center"
fixed="right"
width="90"
prop="status"
>
<template #default="scope">
<dict-tag :type="DICT_TYPE.ERP_AUDIT_STATUS" :value="scope.row.status" />
</template>
</el-table-column>
<el-table-column label="操作" align="center" fixed="right" width="220">
<el-table-column :label="t('common.operate')" align="center" fixed="right" width="220">
<template #default="scope">
<el-button
link
@click="openForm('detail', scope.row.id)"
v-hasPermi="['erp:stock-in:query']"
>
详情
{{ t('action.detail') }}
</el-button>
<el-button
link
@ -207,7 +229,7 @@
v-hasPermi="['erp:stock-in:update']"
:disabled="scope.row.status === 20"
>
编辑
{{ t('action.edit') }}
</el-button>
<el-button
link
@ -216,7 +238,7 @@
v-hasPermi="['erp:stock-in:update-status']"
v-if="scope.row.status === 10"
>
审批
{{ t('action.approve') }}
</el-button>
<el-button
link
@ -225,7 +247,7 @@
v-hasPermi="['erp:stock-in:update-status']"
v-else
>
反审批
{{ t('action.unapprove') }}
</el-button>
<el-button
link
@ -233,7 +255,7 @@
@click="handleDelete([scope.row.id])"
v-hasPermi="['erp:stock-in:delete']"
>
删除
{{ t('action.del') }}
</el-button>
</template>
</el-table-column>
@ -340,10 +362,12 @@ const handleDelete = async (ids: number[]) => {
const handleUpdateStatus = async (id: number, status: number) => {
try {
//
await message.confirm(`确定${status === 20 ? '审批' : '反审批'}该入库单吗?`)
const confirmText = status === 20 ? t('ErpStock.In.confirmApprove') : t('ErpStock.In.confirmReverseApprove')
await message.confirm(confirmText)
//
await StockInApi.updateStockInStatus(id, status)
message.success(`${status === 20 ? '审批' : '反审批'}成功`)
const successText = status === 20 ? t('ErpStock.In.approveSuccess') : t('ErpStock.In.reverseApproveSuccess')
message.success(successText)
//
await getList()
} catch {}
@ -357,7 +381,7 @@ const handleExport = async () => {
//
exportLoading.value = true
const data = await StockInApi.exportStockIn(queryParams)
download.excel(data, '其它入库单.xls')
download.excel(data, t('ErpStock.In.exportName'))
} catch {
} finally {
exportLoading.value = false

@ -132,12 +132,11 @@ const customerList = ref<CustomerVO[]>([]) // 客户列表
const options = [
{
value: '其他出库',
label: '其他出库',
label: t('ErpStock.Out.tabOther')
},
{
value: '备件出库',
label: '备件出库',
label: t('ErpStock.Out.tabPart')
},
// {
// value: '',
@ -149,10 +148,9 @@ const options = [
// },
{
value: '领料出库',
label: '领料出库',
disabled: true,
},
label: t('ErpStock.Out.tabPick'),
disabled: true
}
]
/** 子表的表单 */
const subTabsName = ref('item')

@ -9,8 +9,8 @@
:disabled="disabled"
>
<el-table :data="formData" show-summary :summary-method="getSummaries" class="-mt-10px">
<el-table-column label="序号" type="index" align="center" width="60" />
<el-table-column label="仓库名称" min-width="125">
<el-table-column :label="t('common.index')" type="index" align="center" width="60" />
<el-table-column :label="t('ErpStock.Item.warehouse')" min-width="125">
<template #default="{ row, $index }">
<el-form-item
:prop="`${$index}.warehouseId`"
@ -21,7 +21,7 @@
v-model="row.warehouseId"
clearable
filterable
placeholder="请选择仓库"
:placeholder="t('ErpStock.Item.placeholderWarehouse')"
@change="onChangeWarehouse($event, row)"
>
<el-option
@ -34,7 +34,7 @@
</el-form-item>
</template>
</el-table-column>
<el-table-column label="产品名称" min-width="180">
<el-table-column :label="t('ErpStock.Item.product')" min-width="180">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.productId`" :rules="formRules.productId" class="mb-0px!">
<el-cascader
@ -45,34 +45,34 @@
clearable
filterable
@change="onChangeProduct($event, row)"
placeholder="请选择产品"
:placeholder="t('ErpStock.Item.placeholderProduct')"
class="!w-100%"
/>
</el-form-item>
</template>
</el-table-column>
<el-table-column label="库存" min-width="100">
<el-table-column :label="t('ErpStock.Item.stock')" min-width="100">
<template #default="{ row }">
<el-form-item class="mb-0px!">
<el-input disabled v-model="row.stockCount" :formatter="erpCountInputFormatter" />
</el-form-item>
</template>
</el-table-column>
<el-table-column label="条码" min-width="150">
<el-table-column :label="t('ErpStock.Item.barcode')" min-width="150">
<template #default="{ row }">
<el-form-item class="mb-0px!">
<el-input disabled v-model="row.productBarCode" />
</el-form-item>
</template>
</el-table-column>
<el-table-column label="单位" min-width="80">
<el-table-column :label="t('ErpStock.Item.unit')" min-width="80">
<template #default="{ row }">
<el-form-item class="mb-0px!">
<el-input disabled v-model="row.productUnitName" />
</el-form-item>
</template>
</el-table-column>
<el-table-column label="数量" prop="count" fixed="right" min-width="140">
<el-table-column :label="t('ErpStock.Item.count')" prop="count" fixed="right" min-width="140">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.count`" :rules="formRules.count" class="mb-0px!">
<el-input-number
@ -85,7 +85,7 @@
</el-form-item>
</template>
</el-table-column>
<el-table-column label="产品单价" fixed="right" min-width="120">
<el-table-column :label="t('ErpStock.Item.price')" fixed="right" min-width="120">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.productPrice`" class="mb-0px!">
<el-input-number
@ -98,21 +98,21 @@
</el-form-item>
</template>
</el-table-column>
<el-table-column label="合计金额" prop="totalPrice" fixed="right" min-width="100">
<el-table-column :label="t('ErpStock.Item.totalPrice')" prop="totalPrice" fixed="right" min-width="100">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.totalPrice`" class="mb-0px!">
<el-input disabled v-model="row.totalPrice" :formatter="erpPriceInputFormatter" />
</el-form-item>
</template>
</el-table-column>
<el-table-column label="备注" fixed="right" min-width="150">
<el-table-column :label="t('ErpStock.Item.remark')" fixed="right" min-width="150">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.remark`" class="mb-0px!">
<el-input v-model="row.remark" placeholder="请输入备注" />
<el-input v-model="row.remark" :placeholder="t('ErpStock.Out.placeholderRemark')" />
</el-form-item>
</template>
</el-table-column>
<el-table-column align="center" fixed="right" label="操作" width="60">
<el-table-column align="center" fixed="right" :label="t('ErpStock.Item.action')" width="60">
<template #default="{ $index }">
<el-button type="danger" @click="handleDelete($index)" link>
<Icon icon="ep:delete" />
@ -122,7 +122,7 @@
</el-table>
</el-form>
<el-row justify="center" class="mt-3" v-if="!disabled">
<el-button @click="handleAdd" round>+ 添加出库产品</el-button>
<el-button @click="handleAdd" round>+ {{ t('ErpStock.Out.addItem') }}</el-button>
</el-row>
</template>
<script setup lang="ts">
@ -142,11 +142,11 @@ const props = defineProps<{
}>()
const formLoading = ref(false) //
const formData = ref([])
const { t } = useI18n()
const formRules = reactive({
inId: [{ required: true, message: '出库编号不能为空', trigger: 'blur' }],
warehouseId: [{ required: true, message: '仓库不能为空', trigger: 'blur' }],
productId: [{ required: true, message: '产品不能为空', trigger: 'blur' }],
count: [{ required: true, message: '产品数量不能为空', trigger: 'blur' }]
warehouseId: [{ required: true, message: t('ErpStock.Item.validatorWarehouseRequired'), trigger: 'blur' }],
productId: [{ required: true, message: t('ErpStock.Item.validatorProductRequired'), trigger: 'blur' }],
count: [{ required: true, message: t('ErpStock.Item.validatorCountRequired'), trigger: 'blur' }]
})
const formRef = ref([]) // Ref
const productList = ref<ProductVO[]>([]) //
@ -213,7 +213,7 @@ const getSummaries = (param: SummaryMethodProps) => {
const sums: string[] = []
columns.forEach((column, index) => {
if (index === 0) {
sums[index] = '合计'
sums[index] = t('common.total')
return
}
if (['count', 'totalPrice'].includes(column.property)) {

@ -6,23 +6,23 @@
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="68px"
label-width="auto"
>
<el-form-item label="出库单号" prop="no">
<el-form-item :label="t('ErpStock.Out.no')" prop="no">
<el-input
v-model="queryParams.no"
placeholder="请输入出库单号"
:placeholder="t('ErpStock.Out.placeholderNo')"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="产品" prop="productId">
<el-form-item :label="t('ErpStock.In.product')" prop="productId">
<el-select
v-model="queryParams.productId"
clearable
filterable
placeholder="请选择产品"
:placeholder="t('ErpStock.In.placeholderProduct')"
class="!w-240px"
>
<el-option
@ -33,13 +33,13 @@
/>
</el-select>
</el-form-item>
<el-form-item label="出库时间" prop="outTime">
<el-form-item :label="t('ErpStock.Out.outTime')" prop="outTime">
<el-date-picker
v-model="queryParams.outTime"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
start-placeholder="开始日期"
end-placeholder="结束日期"
:start-placeholder="t('common.startTimeText')"
:end-placeholder="t('common.endTimeText')"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-240px"
/>
@ -60,12 +60,12 @@
/>
</el-select>
</el-form-item> -->
<el-form-item label="仓库" prop="warehouseId">
<el-form-item :label="t('ErpStock.Out.warehouse')" prop="warehouseId">
<el-select
v-model="queryParams.warehouseId"
clearable
filterable
placeholder="请选择仓库"
:placeholder="t('ErpStock.In.placeholderWarehouse')"
class="!w-240px"
>
<el-option
@ -76,12 +76,12 @@
/>
</el-select>
</el-form-item>
<el-form-item label="创建人" prop="creator">
<el-form-item :label="t('ErpStock.In.creator')" prop="creator">
<el-select
v-model="queryParams.creator"
clearable
filterable
placeholder="请选择创建人"
:placeholder="t('ErpStock.In.placeholderCreator')"
class="!w-240px"
>
<el-option
@ -92,8 +92,13 @@
/>
</el-select>
</el-form-item>
<el-form-item label="状态" prop="status">
<el-select v-model="queryParams.status" placeholder="请选择状态" clearable class="!w-240px">
<el-form-item :label="t('ErpStock.In.status')" prop="status">
<el-select
v-model="queryParams.status"
:placeholder="t('ErpStock.In.placeholderStatus')"
clearable
class="!w-240px"
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.ERP_AUDIT_STATUS)"
:key="dict.value"
@ -102,25 +107,25 @@
/>
</el-select>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-form-item :label="t('ErpStock.Out.remark')" prop="remark">
<el-input
v-model="queryParams.remark"
placeholder="请输入备注"
:placeholder="t('ErpStock.Out.placeholderRemark')"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item>
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> {{ t('common.query') }}</el-button>
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> {{ t('common.reset') }}</el-button>
<el-button
type="primary"
plain
@click="openForm('create')"
v-hasPermi="['erp:stock-out:create']"
>
<Icon icon="ep:plus" class="mr-5px" /> 新增
<Icon icon="ep:plus" class="mr-5px" /> {{ t('common.add') }}
</el-button>
<el-button
type="success"
@ -129,7 +134,7 @@
:loading="exportLoading"
v-hasPermi="['erp:stock-out:export']"
>
<Icon icon="ep:download" class="mr-5px" /> 导出
<Icon icon="ep:download" class="mr-5px" /> {{ t('action.export') }}
</el-button>
<el-button
type="danger"
@ -138,7 +143,7 @@
v-hasPermi="['erp:stock-out:delete']"
:disabled="selectionList.length === 0"
>
<Icon icon="ep:delete" class="mr-5px" /> 删除
<Icon icon="ep:delete" class="mr-5px" /> {{ t('action.del') }}
</el-button>
</el-form-item>
</el-form>
@ -147,11 +152,11 @@
<!-- 列表 -->
<ContentWrap>
<el-tabs v-model="activeName" @tab-click="handleTabClick">
<el-tab-pane label="领料出库" name="领料出库" />
<!-- <el-tab-pane label="产品出库" name="产品出库" /> -->
<!-- <el-tab-pane label="原料出库" name="原料出库" /> -->
<el-tab-pane label="备件出库" name="备件出库" />
<el-tab-pane label="其他出库" name="其他出库" />
<el-tab-pane :label="t('ErpStock.Out.tabPick')" name="领料出库" />
<!-- <el-tab-pane :label="t('ErpStock.Out.tabProduct')" name="产品出库" /> -->
<!-- <el-tab-pane :label="t('ErpStock.Out.tabMaterial')" name="原料出库" /> -->
<el-tab-pane :label="t('ErpStock.Out.tabPart')" name="备件出库" />
<el-tab-pane :label="t('ErpStock.Out.tabOther')" name="其他出库" />
</el-tabs>
<el-table
@ -161,21 +166,32 @@
:show-overflow-tooltip="true"
@selection-change="handleSelectionChange"
>
<el-table-column width="30" label="选择" type="selection" />
<el-table-column min-width="180" label="出库单号" align="center" prop="no" />
<el-table-column label="产品信息" align="left" sortable prop="productNames" min-width="180" />
<el-table-column width="30" :label="t('common.select')" type="selection" />
<el-table-column
min-width="180"
:label="t('ErpStock.Out.no')"
align="center"
prop="no"
/>
<el-table-column
:label="t('ErpStock.In.productInfo')"
align="left"
sortable
prop="productNames"
min-width="180"
/>
<!-- <el-table-column label="客户" align="center" prop="customerName" /> -->
<el-table-column
label="出库时间"
:label="t('ErpStock.Out.outTime')"
align="center"
sortable
prop="outTime"
:formatter="dateFormatter2"
width="120px"
/>
<el-table-column label="创建人" align="center" prop="creatorName" />
<el-table-column :label="t('ErpStock.In.creator')" align="center" prop="creatorName" />
<el-table-column
label="数量"
:label="t('ErpStock.In.count')"
align="right"
sortable
prop="totalCount"
@ -188,19 +204,25 @@
prop="totalPrice"
:formatter="erpPriceTableColumnFormatter"
/> -->
<el-table-column label="状态" align="center" fixed="right" width="90" prop="status">
<el-table-column
:label="t('ErpStock.In.status')"
align="center"
fixed="right"
width="90"
prop="status"
>
<template #default="scope">
<dict-tag :type="DICT_TYPE.ERP_AUDIT_STATUS" :value="scope.row.status" />
</template>
</el-table-column>
<el-table-column label="操作" align="center" fixed="right" width="220">
<el-table-column :label="t('common.operate')" align="center" fixed="right" width="220">
<template #default="scope">
<el-button
link
@click="openForm('detail', scope.row.id)"
v-hasPermi="['erp:stock-out:query']"
>
详情
{{ t('action.detail') }}
</el-button>
<el-button
link
@ -209,7 +231,7 @@
v-hasPermi="['erp:stock-out:update']"
:disabled="scope.row.status === 20"
>
编辑
{{ t('action.edit') }}
</el-button>
<el-button
link
@ -218,7 +240,7 @@
v-hasPermi="['erp:stock-out:update-status']"
v-if="scope.row.status === 10"
>
审批
{{ t('action.approve') }}
</el-button>
<el-button
link
@ -227,7 +249,7 @@
v-hasPermi="['erp:stock-out:update-status']"
v-else
>
反审批
{{ t('action.unapprove') }}
</el-button>
<el-button
link
@ -235,7 +257,7 @@
@click="handleDelete([scope.row.id])"
v-hasPermi="['erp:stock-out:delete']"
>
删除
{{ t('action.del') }}
</el-button>
</template>
</el-table-column>
@ -344,10 +366,12 @@ const handleDelete = async (ids: number[]) => {
const handleUpdateStatus = async (id: number, status: number) => {
try {
//
await message.confirm(`确定${status === 20 ? '审批' : '反审批'}该出库单吗?`)
const confirmText = status === 20 ? t('ErpStock.Out.confirmApprove') : t('ErpStock.Out.confirmReverseApprove')
await message.confirm(confirmText)
//
await StockOutApi.updateStockOutStatus(id, status)
message.success(`${status === 20 ? '审批' : '反审批'}成功`)
const successText = status === 20 ? t('ErpStock.Out.approveSuccess') : t('ErpStock.Out.reverseApproveSuccess')
message.success(successText)
//
await getList()
} catch {}
@ -361,7 +385,7 @@ const handleExport = async () => {
//
exportLoading.value = true
const data = await StockOutApi.exportStockOut(queryParams)
download.excel(data, '其它出库单.xls')
download.excel(data, t('ErpStock.Out.exportName'))
} catch {
} finally {
exportLoading.value = false

@ -8,14 +8,14 @@
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="68px"
label-width="auto"
>
<el-form-item label="产品" prop="productId">
<el-form-item :label="t('ErpStock.Record.product')" prop="productId">
<el-select
v-model="queryParams.productId"
clearable
filterable
placeholder="请选择产品"
:placeholder="t('ErpStock.Record.placeholderProduct')"
class="!w-240px"
>
<el-option
@ -26,12 +26,12 @@
/>
</el-select>
</el-form-item>
<el-form-item label="仓库" prop="warehouseId">
<el-form-item :label="t('ErpStock.Record.warehouse')" prop="warehouseId">
<el-select
v-model="queryParams.warehouseId"
clearable
filterable
placeholder="请选择仓库"
:placeholder="t('ErpStock.Record.placeholderWarehouse')"
class="!w-240px"
>
<el-option
@ -42,10 +42,10 @@
/>
</el-select>
</el-form-item>
<el-form-item label="类型" prop="bizType">
<el-form-item :label="t('ErpStock.Record.bizType')" prop="bizType">
<el-select
v-model="queryParams.bizType"
placeholder="请选择类型"
:placeholder="t('ErpStock.Record.placeholderBizType')"
clearable
class="!w-240px"
>
@ -57,36 +57,36 @@
/>
</el-select>
</el-form-item>
<el-form-item label="业务单号" prop="bizNo">
<el-form-item :label="t('ErpStock.Record.bizNo')" prop="bizNo">
<el-input
v-model="queryParams.bizNo"
placeholder="请输入业务单号"
:placeholder="t('ErpStock.Record.placeholderBizNo')"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="创建时间" prop="createTime">
<el-form-item :label="t('common.createTime')" prop="createTime">
<el-date-picker
v-model="queryParams.createTime"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
start-placeholder="开始日期"
end-placeholder="结束日期"
:start-placeholder="t('ErpStock.Record.placeholderCreateTimeStart')"
:end-placeholder="t('ErpStock.Record.placeholderCreateTimeEnd')"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-220px"
/>
</el-form-item>
<el-form-item>
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> {{ t('common.query') }}</el-button>
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> {{ t('common.reset') }}</el-button>
<el-button
type="primary"
plain
@click="openForm('create')"
v-hasPermi="['erp:stock-record:create']"
>
<Icon icon="ep:plus" class="mr-5px" /> 新增
<Icon icon="ep:plus" class="mr-5px" /> {{ t('common.add') }}
</el-button>
<el-button
type="success"
@ -95,7 +95,7 @@
:loading="exportLoading"
v-hasPermi="['erp:stock-record:export']"
>
<Icon icon="ep:download" class="mr-5px" /> 导出
<Icon icon="ep:download" class="mr-5px" /> {{ t('action.export') }}
</el-button>
</el-form-item>
</el-form>
@ -104,27 +104,27 @@
<!-- 列表 -->
<ContentWrap>
<el-tabs v-model="activeName" @tab-click="handleTabClick">
<el-tab-pane label="产品" name="2" />
<el-tab-pane label="原料" name="1" />
<el-tab-pane label="备件" name="5" />
<el-tab-pane label="工具" name="3" />
<el-tab-pane label="耗材" name="4" />
<el-tab-pane label="其他" name="0" />
<el-tab-pane :label="t('ErpStock.Record.categoryProduct')" name="2" />
<el-tab-pane :label="t('ErpStock.Record.categoryMaterial')" name="1" />
<el-tab-pane :label="t('ErpStock.Record.categorySpare')" name="5" />
<el-tab-pane :label="t('ErpStock.Record.categoryTool')" name="3" />
<el-tab-pane :label="t('ErpStock.Record.categoryConsumable')" name="4" />
<el-tab-pane :label="t('ErpStock.Record.categoryOther')" name="0" />
</el-tabs>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
<el-table-column label="产品名称" align="left" sortable prop="productName" width="210px"/>
<el-table-column label="产品分类" align="center" prop="categoryName" />
<el-table-column label="产品单位" align="center" prop="unitName" />
<el-table-column label="仓库编号" align="center" prop="warehouseName" />
<el-table-column label="类型" align="center" prop="bizType" min-width="100">
<el-table-column :label="t('ErpStock.Record.productName')" align="left" sortable prop="productName" width="210px" />
<el-table-column :label="t('ErpStock.Record.categoryName')" align="center" prop="categoryName" />
<el-table-column :label="t('ErpStock.Record.unitName')" align="center" prop="unitName" />
<el-table-column :label="t('ErpStock.Record.warehouseName')" align="center" prop="warehouseName" />
<el-table-column :label="t('ErpStock.Record.bizType')" align="center" prop="bizType" min-width="100">
<template #default="scope">
<dict-tag :type="DICT_TYPE.ERP_STOCK_RECORD_BIZ_TYPE" :value="scope.row.bizType" />
</template>
</el-table-column>
<el-table-column label="出入库单号" align="center" prop="bizNo" width="200" />
<el-table-column :label="t('ErpStock.Record.bizNo')" align="center" prop="bizNo" width="200" />
<el-table-column
label="出入库数量"
:label="t('ErpStock.Record.count')"
align="right"
sortable
prop="count"
@ -132,7 +132,7 @@
:formatter="erpCountTableColumnFormatter"
/>
<el-table-column
label="库存量"
:label="t('ErpStock.Record.totalCount')"
align="right"
sortable
prop="totalCount"
@ -140,7 +140,7 @@
:formatter="erpCountTableColumnFormatter"
/>
<el-table-column
label="出入库日期"
:label="t('ErpStock.Record.recordTime')"
align="center"
sortable
prop="recordTime"
@ -148,13 +148,13 @@
width="120px"
/>
<el-table-column
label="创建日期"
:label="t('ErpStock.Record.createTime')"
align="center"
prop="createTime"
:formatter="dateFormatter"
width="180px"
/>
<el-table-column label="操作人" align="center" prop="creatorName" />
<el-table-column :label="t('ErpStock.Record.creatorName')" align="center" prop="creatorName" />
</el-table>
<!-- 分页 -->
<Pagination

@ -7,21 +7,21 @@
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="68px"
label-width="auto"
>
<el-form-item label="仓库名称" prop="name">
<el-form-item :label="t('ErpStock.Warehouse.name')" prop="name">
<el-input
v-model="queryParams.name"
placeholder="请输入仓库名称"
:placeholder="t('ErpStock.Warehouse.placeholderName')"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="仓库状态" prop="status">
<el-form-item :label="t('ErpStock.Warehouse.status')" prop="status">
<el-select
v-model="queryParams.status"
placeholder="请选择仓库状态"
:placeholder="t('ErpStock.Warehouse.placeholderStatus')"
clearable
class="!w-240px"
>
@ -34,15 +34,15 @@
</el-select>
</el-form-item>
<el-form-item>
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> {{ t('common.query') }}</el-button>
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> {{ t('common.reset') }}</el-button>
<el-button
type="primary"
plain
@click="openForm('create')"
v-hasPermi="['erp:warehouse:create']"
>
<Icon icon="ep:plus" class="mr-5px" /> 新增
<Icon icon="ep:plus" class="mr-5px" /> {{ t('action.add') }}
</el-button>
<el-button
type="success"
@ -51,7 +51,7 @@
:loading="exportLoading"
v-hasPermi="['erp:warehouse:export']"
>
<Icon icon="ep:download" class="mr-5px" /> 导出
<Icon icon="ep:download" class="mr-5px" /> {{ t('action.export') }}
</el-button>
</el-form-item>
</el-form>
@ -60,8 +60,8 @@
<!-- 列表 -->
<ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
<el-table-column label="仓库名称" align="center" prop="name" />
<el-table-column label="仓库地址" align="center" prop="address" />
<el-table-column :label="t('ErpStock.Warehouse.name')" align="center" prop="name" />
<el-table-column :label="t('ErpStock.Warehouse.address')" align="center" prop="address" />
<!-- <el-table-column
label="仓储费"
align="center"
@ -74,15 +74,15 @@
prop="truckagePrice"
:formatter="erpPriceTableColumnFormatter"
/> -->
<el-table-column label="负责人" align="center" prop="principal" />
<el-table-column label="备注" align="center" prop="remark" />
<el-table-column label="排序" align="center" prop="sort" />
<el-table-column label="状态" align="center" prop="status">
<el-table-column :label="t('ErpStock.Warehouse.principal')" align="center" prop="principal" />
<el-table-column :label="t('ErpStock.Warehouse.remark')" align="center" prop="remark" />
<el-table-column :label="t('ErpStock.Warehouse.sort')" align="center" prop="sort" />
<el-table-column :label="t('ErpStock.Warehouse.status')" align="center" prop="status">
<template #default="scope">
<dict-tag :type="DICT_TYPE.COMMON_STATUS" :value="scope.row.status" />
</template>
</el-table-column>
<el-table-column label="是否默认" align="center" prop="defaultStatus">
<el-table-column :label="t('ErpStock.Warehouse.defaultStatus')" align="center" prop="defaultStatus">
<template #default="scope">
<el-switch
v-model="scope.row.defaultStatus"
@ -93,13 +93,13 @@
</template>
</el-table-column>
<el-table-column
label="创建时间"
:label="t('ErpStock.Warehouse.createTime')"
align="center"
prop="createTime"
:formatter="dateFormatter"
width="180px"
/>
<el-table-column label="操作" align="center">
<el-table-column :label="t('common.operate')" align="center">
<template #default="scope">
<el-button
link
@ -107,7 +107,7 @@
@click="openForm('update', scope.row.id)"
v-hasPermi="['erp:warehouse:update']"
>
编辑
{{ t('action.edit') }}
</el-button>
<el-button
link
@ -115,7 +115,7 @@
@click="handleDelete(scope.row.id)"
v-hasPermi="['erp:warehouse:delete']"
>
删除
{{ t('action.del') }}
</el-button>
</template>
</el-table-column>
@ -206,8 +206,9 @@ const handleDelete = async (id: number) => {
const handleDefaultStatusChange = async (row: WarehouseVO) => {
try {
//
const text = row.defaultStatus ? '设置' : '取消'
await message.confirm('确认要' + text + '"' + row.name + '"默认吗?')
const actionText = row.defaultStatus ? t('ErpStock.Warehouse.set') : t('ErpStock.Warehouse.cancel')
const text = t('ErpStock.Warehouse.confirmDefaultStatus', { action: actionText, name: row.name })
await message.confirm(text)
//
await WarehouseApi.updateWarehouseDefaultStatus(row.id, row.defaultStatus)
//
@ -226,7 +227,7 @@ const handleExport = async () => {
//
exportLoading.value = true
const data = await WarehouseApi.exportWarehouse(queryParams)
download.excel(data, '仓库.xls')
download.excel(data, t('ErpStock.Warehouse.exportName'))
} catch {
} finally {
exportLoading.value = false

@ -41,22 +41,6 @@
/>
</el-select>
</el-form-item>
<el-form-item :label="t('RecipeManagement.RecipeLibrary.searchPlanLabel')" prop="planId">
<el-select
v-model="queryParams.planId"
:placeholder="t('RecipeManagement.RecipeLibrary.searchPlanPlaceholder')"
clearable
filterable
class="!w-240px"
>
<el-option
v-for="opt in planOptions"
:key="String(opt.value)"
:label="opt.label"
:value="opt.value"
/>
</el-select>
</el-form-item>
<!-- <el-form-item label="来源" prop="source">
<el-select v-model="queryParams.source" placeholder="请选择来源" clearable class="!w-240px">
<el-option v-for="opt in sourceOptions" :key="opt.value" :label="opt.label" :value="opt.value" />
@ -115,16 +99,6 @@
<span>{{ scope.row.recipeName ?? '-' }}</span>
</template>
</el-table-column>
<el-table-column
:label="t('RecipeManagement.RecipeLibrary.tablePlanCodeColumn')"
align="center"
prop="planCode"
min-width="160"
>
<template #default="scope">
<span>{{ scope.row.planCode ?? '-' }}</span>
</template>
</el-table-column>
<el-table-column
:label="t('RecipeManagement.RecipeLibrary.tableCreatorColumn')"
align="center"
@ -212,17 +186,6 @@
<el-option v-for="opt in recipeOptions" :key="String(opt.value)" :label="opt.label" :value="opt.value" />
</el-select>
</el-form-item>
<el-form-item :label="t('RecipeManagement.RecipeLibrary.dialogPlanLabel')" prop="planId">
<el-select
v-model="dialogForm.planId"
:placeholder="t('RecipeManagement.RecipeLibrary.dialogPlanPlaceholder')"
clearable
filterable
class="!w-full"
>
<el-option v-for="opt in planOptions" :key="String(opt.value)" :label="opt.label" :value="opt.value" />
</el-select>
</el-form-item>
<el-form-item :label="t('RecipeManagement.RecipeLibrary.dialogSourceLabel')" prop="source">
<el-select
v-model="dialogForm.source"
@ -256,7 +219,6 @@ import { dateFormatter } from '@/utils/formatTime'
import { RecipePlanDetailApi, RecipePlanDetailVO } from '@/api/iot/recipePlanDetail'
import { RecipeConfigApi } from '@/api/iot/recipeConfig'
import { RecipePointApi } from '@/api/iot/recipePoint'
import { PlanApi } from '@/api/mes/plan'
import FormulaLibraryDetailTabs from './components/FormulaLibraryDetailTabs.vue'
import FormulaLibraryReadDialog from './components/FormulaLibraryReadDialog.vue'
import { RecipeDeviceRecordApi} from '@/api/iot/recipeDeviceRecord'
@ -278,7 +240,6 @@ const queryParams = reactive({
code: '' as string,
name: '' as string,
recipeId: undefined as string | number | undefined,
planId: undefined as string | number | undefined,
source: undefined as string | undefined
})
@ -294,21 +255,13 @@ const sourceOptions: SelectOption<string>[] = [
]
const recipeOptions = ref<SelectOption[]>([])
const planOptions = ref<SelectOption[]>([])
const ensureOptionsLoaded = async () => {
const [recipeRes, planRes] = await Promise.all([
RecipeConfigApi.getRecipeConfigPage({}),
PlanApi.getPlanPage({ status: 6 })
])
const recipeRes = await RecipeConfigApi.getRecipeConfigPage({})
recipeOptions.value = (recipeRes?.list ?? []).map((item: any) => {
const label = item.name ? `${item.recipeCode ?? ''}${item.recipeCode ? '-' : ''}${item.name}` : String(item.id)
return { label, value: item.id }
})
planOptions.value = (planRes?.list ?? []).map((item: any) => {
const label = item.code ?? String(item.id)
return { label, value: item.id }
})
}
const buildQueryParams = () => {
@ -319,8 +272,7 @@ const buildQueryParams = () => {
pageSize: queryParams.pageSize,
code: code ? code : undefined,
name: name ? name : undefined,
recipeId: queryParams.recipeId ? String(queryParams.recipeId) : undefined,
planId: queryParams.planId ? String(queryParams.planId) : undefined,
recipeId: queryParams.recipeId ? String(queryParams.recipeId) : undefined,
source: queryParams.source ? queryParams.source : undefined
}
}
@ -394,13 +346,12 @@ const dialogFormRef = ref()
const dialogType = ref<'create' | 'update'>('create')
const dialogForm = ref<RecipePlanDetailVO>({
id: undefined,
code: '',
name: '',
recipeId: undefined,
planId: undefined,
source: undefined,
isEnable: undefined
id: undefined,
code: '',
name: '',
recipeId: undefined,
source: undefined,
isEnable: undefined
})
const dialogRules = reactive({
@ -412,9 +363,6 @@ const dialogRules = reactive({
],
recipeId: [
{ required: true, message: t('RecipeManagement.RecipeLibrary.validatorRecipeRequired'), trigger: 'change' }
],
planId: [
{ required: true, message: t('RecipeManagement.RecipeLibrary.validatorPlanRequired'), trigger: 'change' }
]
})
@ -423,9 +371,8 @@ const resetDialogForm = () => {
id: undefined,
code: '',
name: '',
recipeId: undefined,
planId: undefined,
source: undefined
recipeId: undefined,
source: undefined
}
dialogFormRef.value?.resetFields?.()
}
@ -441,8 +388,7 @@ const openDialog = async (type: 'create' | 'update', row?: RecipePlanDetailVO) =
id: row.id,
code: row.code,
name: row.name,
recipeId: row.recipeId ?? (row as any).recipeId,
planId: row.planId ?? (row as any).planId,
recipeId: row.recipeId ?? (row as any).recipeId,
source: row.source
}
}
@ -475,8 +421,7 @@ const submitDialog = async () => {
id: dialogForm.value.id,
code: dialogForm.value.code,
name: dialogForm.value.name,
recipeId: dialogForm.value.recipeId,
planId: dialogForm.value.planId,
recipeId: dialogForm.value.recipeId,
source: dialogForm.value.source
}
if (dialogType.value === 'create') {

@ -494,13 +494,78 @@
<el-empty v-else :description="t('DataCollection.Device.emptyDescription')" />
</ContentWrap>
<Dialog :title="t('DataCollection.Device.alarmHistoryTitle')" v-model="deviceAlarmDialogVisible" width="800px">
<Dialog :title="t('DataCollection.Device.alarmHistoryTitle')" v-model="deviceAlarmDialogVisible" width="1200px">
<el-form
class="-mb-15px"
:model="deviceAlarmQueryParams"
ref="deviceAlarmQueryFormRef"
:inline="true"
label-width="80px"
>
<el-form-item :label="t('DataCollection.Device.alarmRuleName')" prop="ruleId">
<el-select
v-model="deviceAlarmQueryParams.ruleId"
:loading="deviceAlarmRuleLoading"
clearable
filterable
class="!w-220px"
:placeholder="t('DataCollection.DeviceModel.ruleSearchFieldNamePlaceholder')"
>
<el-option
v-for="item in deviceAlarmRuleOptions"
:key="item.id"
:label="item.fieldName || item.ruleName || item.name"
:value="item.id"
/>
</el-select>
</el-form-item>
<el-form-item :label="t('DataCollection.Device.alarmPointName')" prop="modelId">
<el-select
v-model="deviceAlarmQueryParams.modelId"
:loading="deviceAlarmPointLoading"
clearable
filterable
class="!w-220px"
:placeholder="t('DataCollection.Device.placeholderAttributeName')"
>
<el-option
v-for="item in deviceAlarmPointOptions"
:key="item.id"
:label="item.attributeName || item.attributeCode || item.name"
:value="item.id"
/>
</el-select>
</el-form-item>
<el-form-item :label="t('DataCollection.Device.alarmTime')" prop="createTime">
<el-date-picker
v-model="deviceAlarmQueryParams.createTime"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
:start-placeholder="t('DataCollection.HistoryData.dialogCollectionTimeStartPlaceholder')"
:end-placeholder="t('DataCollection.HistoryData.dialogCollectionTimeEndPlaceholder')"
class="!w-260px"
/>
</el-form-item>
<el-form-item>
<el-button @click="handleDeviceAlarmQuery">
<Icon icon="ep:search" class="mr-5px" />
{{ t('DataCollection.Device.search') }}
</el-button>
<el-button @click="resetDeviceAlarmQuery">
<Icon icon="ep:refresh" class="mr-5px" />
{{ t('DataCollection.Device.reset') }}
</el-button>
</el-form-item>
</el-form>
<el-table
:data="deviceAlarmList"
v-loading="deviceAlarmLoading"
:stripe="true"
:show-overflow-tooltip="true"
:max-height="700"
class="mt-10px"
>
<el-table-column :label="t('DataCollection.Device.alarmRuleName')" align="center" prop="ruleName" />
<el-table-column :label="t('DataCollection.Device.alarmPointName')" align="center" prop="modelName" />
@ -510,7 +575,22 @@
<dict-tag :type="DICT_TYPE.IOT_ALARM_REGISTRATION" :value="scope.row.alarmLevel" />
</template>
</el-table-column>
<el-table-column
:label="t('DataCollection.Device.alarmTime')"
align="center"
prop="createTime"
:formatter="dateFormatter"
width="180px"
/>
</el-table>
<div class="mt-10px pb-10px flex justify-end">
<Pagination
:total="deviceAlarmTotal"
v-model:page="deviceAlarmQueryParams.pageNo"
v-model:limit="deviceAlarmQueryParams.pageSize"
@pagination="getDeviceAlarmList"
/>
</div>
</Dialog>
</template>
@ -803,7 +883,7 @@ const runningRuleOptions = [
{ value: '1', label: '运行' },
{ value: '2', label: '待机中(不运行、没故障)' },
{ value: '3', label: '故障中(故障且待机)' },
{ value: '4', label: '报警中(故障且运行)' },
// { value: '4', label: '' },
]
const alarmRuleOptions = [{ value: '5', label: '报警' }]
@ -1113,24 +1193,126 @@ onBeforeUnmount(() => {
const deviceAlarmDialogVisible = ref(false)
const deviceAlarmLoading = ref(false)
const deviceAlarmList = ref<any[]>([])
const deviceAlarmTotal = ref(0)
const deviceAlarmQueryParams = reactive({
pageNo: 1,
pageSize: 10,
deviceId: undefined as number | undefined,
modelId: undefined as number | undefined,
rule: undefined as string | undefined,
alarmLevel: undefined as string | undefined,
addressValue: undefined as string | undefined,
createTime: [] as string[],
ruleId: undefined as number | undefined,
})
const deviceAlarmQueryFormRef = ref()
const deviceAlarmRuleOptions = ref<any[]>([])
const deviceAlarmPointOptions = ref<any[]>([])
const deviceAlarmRuleLoading = ref(false)
const deviceAlarmPointLoading = ref(false)
const handleShowDeviceAlarmHistory = async () => {
if (!attributeDeviceId.value) {
message.error(t('DataCollection.Device.messageSelectDeviceRequired'))
return
const loadDeviceAlarmRuleOptions = async () => {
if (!attributeDeviceId.value) return
deviceAlarmRuleLoading.value = true
try {
const res = await request.get({
url: '/iot/device-point-rules/getList',
params: { id: attributeDeviceId.value },
})
const data = (res as any)?.data ?? res
const listData = Array.isArray((data as any)?.list)
? (data as any).list
: Array.isArray(data)
? data
: []
deviceAlarmRuleOptions.value = listData as any[]
} finally {
deviceAlarmRuleLoading.value = false
}
deviceAlarmDialogVisible.value = true
deviceAlarmLoading.value = true
}
const loadDeviceAlarmPointOptions = async () => {
if (!attributeDeviceId.value) return
deviceAlarmPointLoading.value = true
try {
const res = await request.get({
url: '/iot/device-warinning-record/getList',
url: '/iot/device/device-attribute/list',
params: { deviceId: attributeDeviceId.value },
})
const data = (res as any)?.data ?? res
deviceAlarmList.value = Array.isArray(data) ? data : []
const listData = Array.isArray((data as any)?.list)
? (data as any).list
: Array.isArray(data)
? data
: []
deviceAlarmPointOptions.value = listData as any[]
} finally {
deviceAlarmPointLoading.value = false
}
}
const getDeviceAlarmList = async () => {
if (!attributeDeviceId.value) return
deviceAlarmLoading.value = true
try {
deviceAlarmQueryParams.deviceId = attributeDeviceId.value
const params = {
pageNo: deviceAlarmQueryParams.pageNo,
pageSize: deviceAlarmQueryParams.pageSize,
deviceId: deviceAlarmQueryParams.deviceId,
modelId: deviceAlarmQueryParams.modelId,
rule: deviceAlarmQueryParams.rule,
alarmLevel: deviceAlarmQueryParams.alarmLevel,
addressValue: deviceAlarmQueryParams.addressValue,
createTime: deviceAlarmQueryParams.createTime,
ruleId: deviceAlarmQueryParams.ruleId,
}
const data = await request.get({
url: '/iot/device-warinning-record/page',
params,
})
const listData = Array.isArray((data as any)?.list)
? (data as any).list
: Array.isArray(data)
? data
: []
const totalData = (data as any)?.total ?? listData.length
deviceAlarmList.value = listData as any[]
deviceAlarmTotal.value = totalData
} finally {
deviceAlarmLoading.value = false
}
}
const handleDeviceAlarmQuery = () => {
if (!attributeDeviceId.value) return
deviceAlarmQueryParams.pageNo = 1
getDeviceAlarmList()
}
const resetDeviceAlarmQuery = () => {
if (!attributeDeviceId.value) return
deviceAlarmQueryFormRef.value?.resetFields?.()
deviceAlarmQueryParams.pageNo = 1
getDeviceAlarmList()
}
const handleShowDeviceAlarmHistory = async () => {
if (!attributeDeviceId.value) {
message.error(t('DataCollection.Device.messageSelectDeviceRequired'))
return
}
deviceAlarmQueryParams.pageNo = 1
deviceAlarmQueryParams.pageSize = 10
deviceAlarmQueryParams.modelId = undefined
deviceAlarmQueryParams.rule = undefined
deviceAlarmQueryParams.alarmLevel = undefined
deviceAlarmQueryParams.addressValue = undefined
deviceAlarmQueryParams.createTime = []
deviceAlarmQueryParams.ruleId = undefined
deviceAlarmDialogVisible.value = true
await Promise.all([loadDeviceAlarmRuleOptions(), loadDeviceAlarmPointOptions()])
await getDeviceAlarmList()
}
</script>

@ -111,7 +111,7 @@ link type="primary" @click="openForm('update', scope.row.id)"
<!-- 导入弹窗 -->
<Dialog v-model="importDialogVisible" :title="t('action.import')" width="400">
<el-upload
ref="uploadRef" v-model:file-list="importFileList" :action="importUrl + '?updateSupport=' + updateSupport" :auto-upload="false"
ref="uploadRef" v-model:file-list="importFileList" :action="importUrl + '?updateSupport=' + updateSupport + '&deviceModelId=' + props.id" :auto-upload="false"
:disabled="importLoading" :headers="uploadHeaders" :limit="1" :on-error="handleImportError"
:on-exceed="handleImportExceed" :on-success="handleImportSuccess" accept=".xlsx, .xls" drag>
<Icon icon="ep:upload" />

@ -54,6 +54,15 @@ v-for="col in section.columns" :key="col.prop" :prop="col.prop" :label="col.labe
<el-empty v-else :description="t('DataCollection.HistoryData.emptyDescription')" />
</ContentWrap>
</div>
<template #footer>
<Pagination
v-if="total > 0"
:total="total"
v-model:page="queryParams.pageNo"
v-model:limit="queryParams.pageSize"
@pagination="fetchHistory"
/>
</template>
</Dialog>
</template>
@ -106,7 +115,11 @@ const dialogTitle = computed(() => {
return `${t('DataCollection.HistoryData.dialogTitlePrefix')}${name}`
})
const queryParams = reactive({
pageNo: 1,
pageSize: 10
})
const total = ref(0)
const loading = ref(false)
const recordGroups = ref<RecordGroup[]>([])
@ -194,19 +207,36 @@ const buildSectionsFromGroups = (groups: Record<string, any[]>): Section[] => {
const fetchHistory = async () => {
if (props.deviceId === undefined || props.deviceId === null || props.deviceId === '') {
recordGroups.value = []
total.value = 0
return
}
loading.value = true
try {
const params: Parameters<typeof DeviceApi.getHistoryRecord>[0] = { deviceId: props.deviceId }
const params: any = {
deviceId: props.deviceId,
pageNo: queryParams.pageNo,
pageSize: queryParams.pageSize
}
if (Array.isArray(collectionTimeRange.value) && collectionTimeRange.value.length === 2) {
params.collectionStartTime = collectionTimeRange.value[0]
params.collectionEndTime = collectionTimeRange.value[1]
}
const res: any = await DeviceApi.getHistoryRecord(params)
const list = res?.data?.data ?? res?.data ?? res
const records = Array.isArray(list) ? list : []
recordGroups.value = records.map((item: any, index: number) => {
const responseData = res?.data?.data ?? res?.data ?? res
let list: any[] = []
if (responseData && Array.isArray(responseData.list)) {
list = responseData.list
total.value = responseData.total || 0
} else if (Array.isArray(responseData)) {
list = responseData
total.value = 0
} else {
list = []
total.value = 0
}
recordGroups.value = list.map((item: any, index: number) => {
const groups = toGroupMap(item)
return {
key: `${item?.collectTime ?? index}-${index}`,
@ -220,11 +250,14 @@ const fetchHistory = async () => {
}
const handleQuery = () => {
queryParams.pageNo = 1
fetchHistory()
}
const resetQuery = () => {
collectionTimeRange.value = []
queryParams.pageNo = 1
queryParams.pageSize = 10
fetchHistory()
}
@ -235,6 +268,8 @@ watch(
return
}
collectionTimeRange.value = buildLastHoursRange(4)
queryParams.pageNo = 1
queryParams.pageSize = 10
fetchHistory()
}
)

@ -85,12 +85,12 @@
prop="totalFaultTime"
min-width="140px"
/>
<el-table-column
<!-- <el-table-column
:label="t('DataCollection.RunReport.tableWarningTimeColumn')"
align="center"
prop="totalWarningTime"
min-width="140px"
/>
/> -->
<el-table-column
:label="t('DataCollection.RunReport.tableUtilizationRateColumn')"
align="center"
@ -117,6 +117,7 @@
</template>
<script setup lang="ts">
import dayjs from 'dayjs'
import download from '@/utils/download'
import { DeviceOperationRecordApi, type DeviceOperationRecordVO, type DeviceOperationRecordPageParams } from '@/api/iot/deviceOperationRecord'
@ -134,7 +135,10 @@ const queryParams = reactive({
pageSize: 10,
deviceCode: undefined as string | undefined,
deviceName: undefined as string | undefined,
timeRange: [] as string[] | [],
timeRange: [
dayjs().subtract(1, 'day').startOf('day').format('YYYY-MM-DD HH:mm:ss'),
dayjs().subtract(1, 'day').endOf('day').format('YYYY-MM-DD HH:mm:ss')
] as string[],
startTime: undefined as string | undefined,
endTime: undefined as string | undefined,
ids: undefined as string | undefined

@ -3,50 +3,31 @@
<el-form class="-mb-15px" :model="queryParams" ref="queryFormRef" :inline="true" min-label-width="68px">
<el-form-item :label="t('EquipmentManagement.EquipmentKeyItems.code')" prop="code">
<el-input
v-model="queryParams.code"
:placeholder="t('EquipmentManagement.EquipmentKeyItems.placeholderCode')"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
v-model="queryParams.code" :placeholder="t('EquipmentManagement.EquipmentKeyItems.placeholderCode')"
clearable @keyup.enter="handleQuery" class="!w-240px" />
</el-form-item>
<el-form-item :label="t('EquipmentManagement.EquipmentKeyItems.name')" prop="name">
<el-input
v-model="queryParams.name"
:placeholder="t('EquipmentManagement.EquipmentKeyItems.placeholderName')"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
v-model="queryParams.name" :placeholder="t('EquipmentManagement.EquipmentKeyItems.placeholderName')"
clearable @keyup.enter="handleQuery" class="!w-240px" />
</el-form-item>
<el-form-item :label="t('EquipmentManagement.EquipmentKeyItems.description')" prop="description">
<el-input
v-model="queryParams.description"
:placeholder="t('EquipmentManagement.EquipmentKeyItems.placeholderDescription')"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
v-model="queryParams.description"
:placeholder="t('EquipmentManagement.EquipmentKeyItems.placeholderDescription')" clearable
@keyup.enter="handleQuery" class="!w-240px" />
</el-form-item>
<el-form-item :label="t('EquipmentManagement.EquipmentKeyItems.remark')" prop="remark">
<el-input
v-model="queryParams.remark"
:placeholder="t('EquipmentManagement.EquipmentKeyItems.placeholderRemark')"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
v-model="queryParams.remark"
:placeholder="t('EquipmentManagement.EquipmentKeyItems.placeholderRemark')" clearable
@keyup.enter="handleQuery" class="!w-240px" />
</el-form-item>
<el-form-item :label="t('EquipmentManagement.EquipmentKeyItems.createTime')" prop="createTime">
<el-date-picker
v-model="queryParams.createTime"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
:start-placeholder="t('common.startTimeText')"
:end-placeholder="t('common.endTimeText')"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-220px"
/>
v-model="queryParams.createTime" value-format="YYYY-MM-DD HH:mm:ss" type="daterange"
:start-placeholder="t('common.startTimeText')" :end-placeholder="t('common.endTimeText')"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]" class="!w-220px" />
</el-form-item>
<el-form-item>
<el-button @click="handleQuery">
@ -62,22 +43,18 @@
{{ t('action.add') }}
</el-button>
<el-button
type="danger"
plain
@click="handleBatchDelete"
:disabled="!selectedIds.length"
v-hasPermi="['mes:critical-component:delete']"
>
type="danger" plain @click="handleBatchDelete" :disabled="!selectedIds.length"
v-hasPermi="['mes:critical-component:delete']">
<Icon icon="ep:delete" class="mr-5px" />
{{ t('EquipmentManagement.EquipmentKeyItems.delete') }}
</el-button>
<el-button type="warning" plain @click="openImport" v-hasPermi="['mes:critical-component:import']">
<Icon icon="ep:upload" class="mr-5px" />
{{ t('action.import') }}
</el-button>
<el-button
type="success"
plain
@click="handleExport"
:loading="exportLoading"
v-hasPermi="['mes:critical-component:export']"
>
type="success" plain @click="handleExport" :loading="exportLoading"
v-hasPermi="['mes:critical-component:export']">
<Icon icon="ep:download" class="mr-5px" />
{{ t('action.export') }}
</el-button>
@ -86,35 +63,87 @@
</ContentWrap>
<ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true" @selection-change="handleSelectionChange">
<el-table
v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true"
@selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" />
<el-table-column :label="t('EquipmentManagement.EquipmentKeyItems.code')" align="center" prop="code" min-width="140" />
<el-table-column :label="t('EquipmentManagement.EquipmentKeyItems.name')" align="center" prop="name" min-width="140" />
<el-table-column :label="t('EquipmentManagement.EquipmentKeyItems.description')" align="center" prop="description" min-width="180" />
<el-table-column :label="t('EquipmentManagement.EquipmentKeyItems.remark')" align="center" prop="remark" min-width="180" />
<el-table-column :label="t('EquipmentManagement.EquipmentKeyItems.createTime')" align="center" prop="createTime" :formatter="dateFormatter" width="180" />
<el-table-column :label="t('EquipmentManagement.EquipmentKeyItems.operate')" align="center" width="140" fixed="right">
<el-table-column
:label="t('EquipmentManagement.EquipmentKeyItems.code')" align="center" prop="code"
min-width="140" />
<el-table-column
:label="t('EquipmentManagement.EquipmentKeyItems.name')" align="center" prop="name"
min-width="140" />
<el-table-column
:label="t('EquipmentManagement.EquipmentKeyItems.description')" align="center" prop="description"
min-width="180" />
<el-table-column
:label="t('EquipmentManagement.EquipmentKeyItems.remark')" align="center" prop="remark"
min-width="180" />
<el-table-column
:label="t('EquipmentManagement.EquipmentKeyItems.createTime')" align="center" prop="createTime"
:formatter="dateFormatter" width="180" />
<el-table-column
:label="t('EquipmentManagement.EquipmentKeyItems.operate')" align="center" width="140"
fixed="right">
<template #default="scope">
<el-button link type="primary" @click="openForm('update', scope.row)" v-hasPermi="['mes:critical-component:update']">
<el-button
link type="primary" @click="openForm('update', scope.row)"
v-hasPermi="['mes:critical-component:update']">
{{ t('EquipmentManagement.EquipmentKeyItems.edit') }}
</el-button>
<el-button link type="danger" @click="handleDelete(scope.row.id)" v-hasPermi="['mes:critical-component:delete']">
<el-button
link type="danger" @click="handleDelete(scope.row.id)"
v-hasPermi="['mes:critical-component:delete']">
{{ t('EquipmentManagement.EquipmentKeyItems.delete') }}
</el-button>
</template>
</el-table-column>
</el-table>
<Pagination :total="total" v-model:page="queryParams.pageNo" v-model:limit="queryParams.pageSize" @pagination="getList" />
<Pagination
:total="total" v-model:page="queryParams.pageNo" v-model:limit="queryParams.pageSize"
@pagination="getList" />
</ContentWrap>
<CriticalComponentForm ref="formRef" @success="getList" />
<Dialog v-model="importDialogVisible" :title="t('action.import')" width="400">
<el-upload
ref="uploadRef" v-model:file-list="importFileList"
:action="importUrl + '?updateSupport=' + updateSupport" :auto-upload="false" :disabled="importLoading"
:headers="uploadHeaders" :limit="1" :on-error="handleImportError" :on-exceed="handleImportExceed"
:on-success="handleImportSuccess" accept=".xlsx, .xls" drag>
<Icon icon="ep:upload" />
<div class="el-upload__text">
将文件拖到此处或点击上传
</div>
<template #tip>
<div class="el-upload__tip text-center">
<div class="el-upload__tip">
<el-checkbox v-model="updateSupport" />
是否更新已存在的数据
</div>
<span>仅支持 .xlsx, .xls 格式</span>
<el-link
:underline="false" style="font-size: 12px; vertical-align: baseline" type="primary"
@click="importTemplate">
下载导入模板
</el-link>
</div>
</template>
</el-upload>
<template #footer>
<el-button :disabled="importLoading" type="primary" @click="submitImport">{{ t('common.ok') }}</el-button>
<el-button @click="importDialogVisible = false">{{ t('common.cancel') }}</el-button>
</template>
</Dialog>
</template>
<script setup lang="ts">
import { dateFormatter } from '@/utils/formatTime'
import download from '@/utils/download'
import { CriticalComponentApi, CriticalComponentVO } from '@/api/mes/criticalComponent'
import { getAccessToken, getTenantId } from '@/utils/auth'
import CriticalComponentForm from './CriticalComponentForm.vue'
defineOptions({ name: 'CriticalComponent' })
@ -140,6 +169,15 @@ const queryParams = reactive({
const queryFormRef = ref()
const selectedIds = ref<number[]>([])
const importDialogVisible = ref(false)
const importLoading = ref(false)
const uploadRef = ref()
const importUrl =
import.meta.env.VITE_BASE_URL + import.meta.env.VITE_API_URL + '/mes/critical-component/import'
const uploadHeaders = ref()
const importFileList = ref([])
const updateSupport = ref(0)
const getList = async () => {
loading.value = true
try {
@ -170,6 +208,13 @@ const openForm = (type: 'create' | 'update', row?: Partial<CriticalComponentVO>)
formRef.value.open(type, row)
}
const openImport = () => {
importDialogVisible.value = true
importLoading.value = false
importFileList.value = []
updateSupport.value = 0
}
const handleDelete = async (id?: number) => {
if (!id) return
try {
@ -209,6 +254,45 @@ const handleExport = async () => {
}
}
const submitImport = async () => {
if (importFileList.value.length === 0) {
message.error('请选择导入文件')
return
}
uploadHeaders.value = {
Authorization: 'Bearer ' + getAccessToken(),
tenantId: getTenantId()
}
importLoading.value = true
uploadRef.value?.submit()
}
const handleImportSuccess = (response: any) => {
if (!response || response.code !== 0) {
message.error(response?.msg || '导入失败')
importLoading.value = false
return
}
message.success('导入成功')
importLoading.value = false
importDialogVisible.value = false
getList()
}
const handleImportError = () => {
message.error('导入失败')
importLoading.value = false
}
const handleImportExceed = () => {
message.error('只能上传一个文件')
}
const importTemplate = async () => {
const res = await CriticalComponentApi.importCriticalComponentTemplate()
download.excel(res, '设备关键件导入模板.xls')
}
onMounted(() => {
getList()
})

@ -1,43 +1,81 @@
<template>
<Dialog :title="dialogTitle" v-model="dialogVisible" width="800px">
<el-form ref="formRef" :model="formData" :rules="formRules" label-width="100px" v-loading="formLoading">
<el-form-item label="表编码" prop="code">
<el-input v-model="formData.code" placeholder="请输入表编码" :disabled="formType === 'update'" />
<el-form
ref="formRef"
:model="formData"
:rules="formRules"
label-width="auto"
v-loading="formLoading"
class="energy-device-dialog-form"
>
<el-form-item :label="t('EnergyManagement.EnergyDevice.dialogCodeLabel')" prop="code">
<el-input
v-model="formData.code"
:placeholder="t('EnergyManagement.EnergyDevice.dialogCodePlaceholder')"
:disabled="formType === 'update'"
/>
</el-form-item>
<el-form-item label="表名称" prop="name">
<el-input v-model="formData.name" placeholder="请输入表名称" />
<el-form-item :label="t('EnergyManagement.EnergyDevice.dialogNameLabel')" prop="name">
<el-input
v-model="formData.name"
:placeholder="t('EnergyManagement.EnergyDevice.dialogNamePlaceholder')"
/>
</el-form-item>
<el-form-item label="能源类型" prop="deviceTypeId">
<el-form-item :label="t('EnergyManagement.EnergyDevice.dialogEnergyTypeLabel')" prop="deviceTypeId">
<el-select
v-model="formData.deviceTypeId" @change="handleDeviceTypeChange" placeholder="请选择能源类型" clearable
filterable class="!w-full">
v-model="formData.deviceTypeId"
@change="handleDeviceTypeChange"
:placeholder="t('EnergyManagement.EnergyDevice.dialogEnergyTypePlaceholder')"
clearable
filterable
class="!w-full"
>
<el-option v-for="item in typeList" :key="item.id" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
<el-form-item label="所属区域" prop="orgId">
<el-form-item :label="t('EnergyManagement.EnergyDevice.dialogOrgLabel')" prop="orgId">
<el-tree-select
v-model="formData.orgId" :data="orgSelectTree" :props="orgTreeSelectProps" filterable
check-strictly clearable class="!w-full" placeholder="根据区域结构筛选列表" :loading="analysisLoading"
:render-after-expand="false" @change="handleOrgChange" />
v-model="formData.orgId"
:data="orgSelectTree"
:props="orgTreeSelectProps"
filterable
check-strictly
clearable
class="!w-full"
:placeholder="t('EnergyManagement.EnergyDevice.dialogOrgTreePlaceholder')"
:loading="analysisLoading"
:render-after-expand="false"
@change="handleOrgChange"
/>
</el-form-item>
<el-form-item label="计算规则" prop="operationRulesVOList">
<el-form-item :label="t('EnergyManagement.EnergyDevice.dialogRulesLabel')" prop="operationRulesVOList">
<div class="w-full flex flex-col gap-8px">
<div
v-for="(rule, index) in formData.operationRulesVOList" :key="index"
class="w-full flex items-center gap-8px">
<el-tree-select
v-model="rule.pointValue" :data="equipmentTree" :props="treeSelectProps" filterable
clearable class="!w-full" placeholder="根据设备选择点位" :loading="devicePointLoading"
@change="(val) => handlePointSelected(index, val)" />
v-model="rule.pointValue"
:data="equipmentTree"
:props="treeSelectProps"
filterable
clearable
class="!w-full"
:placeholder="t('EnergyManagement.EnergyDevice.dialogRulesPointPlaceholder')"
:loading="devicePointLoading"
@change="(val) => handlePointSelected(index, val)"
/>
<template v-if="index < formData.operationRulesVOList.length - 1">
<el-select
v-model="formData.operationRulesVOList[index].operator" placeholder="运算符" class="!w-110px"
clearable>
v-model="formData.operationRulesVOList[index].operator"
:placeholder="t('EnergyManagement.EnergyDevice.dialogOperatorPlaceholder')"
class="!w-110px"
clearable
>
<el-option v-for="op in operatorOptions" :key="op" :label="op" :value="op" />
</el-select>
</template>
@ -57,7 +95,7 @@ v-model="formData.operationRulesVOList[index].operator" placeholder="运算符"
</div>
</el-form-item>
<el-form-item label="是否启用" prop="isEnable">
<el-form-item :label="t('EnergyManagement.EnergyDevice.dialogIsEnableLabel')" prop="isEnable">
<el-switch v-model="formData.isEnable" />
</el-form-item>
</el-form>
@ -65,8 +103,12 @@ v-model="formData.operationRulesVOList[index].operator" placeholder="运算符"
<Editor v-model="formData.info" height="250px" />
</el-form-item> -->
<template #footer>
<el-button @click="submitForm" type="primary" :disabled="formLoading"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
<el-button @click="submitForm" type="primary" :disabled="formLoading">
{{ t('EnergyManagement.EnergyDevice.dialogSubmitButtonText') }}
</el-button>
<el-button @click="dialogVisible = false">
{{ t('EnergyManagement.EnergyDevice.dialogCancelButtonText') }}
</el-button>
</template>
</Dialog>
</template>
@ -107,11 +149,11 @@ const formData = ref({
operationRulesVOList: [{ deviceId: undefined, pointId: undefined, operator: undefined, pointValue: undefined }],
})
const formRules = reactive({
name: [{ required: true, message: '表名称不能为空', trigger: 'blur' }],
code: [{ required: true, message: '表编码不能为空', trigger: 'blur' }],
orgId: [{ required: true, message: '所属区域不能为空', trigger: 'change' }],
operationRulesVOList: [{ required: true, validator: (_rule, _value, callback) => validateRules(callback), trigger: 'change' }],
isEnable: [{ required: true, message: '是否启用不能为空', trigger: 'blur' }]
name: [{ required: true, message: t('EnergyManagement.EnergyDevice.validatorNameRequired'), trigger: 'blur' }],
code: [{ required: true, message: t('EnergyManagement.EnergyDevice.validatorCodeRequired'), trigger: 'blur' }],
orgId: [{ required: true, message: t('EnergyManagement.EnergyDevice.validatorOrgRequired'), trigger: 'change' }],
operationRulesVOList: [{ required: true, validator: (_rule, _value, callback) => validateRules(callback), trigger: 'change' }],
isEnable: [{ required: true, message: t('EnergyManagement.EnergyDevice.validatorIsEnableRequired'), trigger: 'blur' }]
})
const formRef = ref() // Ref
@ -441,20 +483,26 @@ const hydratePointValues = () => {
const validateRules = (callback: any) => {
const list = formData.value.operationRulesVOList ?? []
if (!list.length) {
callback(new Error('计算规则不能为空'))
callback(new Error(t('EnergyManagement.EnergyDevice.validatorRulesRequired')))
return
}
for (let i = 0; i < list.length; i++) {
const r = list[i] as any
if (!r?.deviceId || !r?.pointId) {
callback(new Error('请选择设备点位'))
callback(new Error(t('EnergyManagement.EnergyDevice.validatorRulesPointRequired')))
return
}
if (i > 0 && !list[i - 1]?.operator) {
callback(new Error('请选择运算符'))
callback(new Error(t('EnergyManagement.EnergyDevice.validatorRulesOperatorRequired')))
return
}
}
callback()
}
</script>
<style scoped>
.energy-device-dialog-form :deep(.el-form-item__label) {
min-width: 100px;
}
</style>

@ -4,32 +4,33 @@
ref="formRef"
:model="formData"
:rules="formRules"
label-width="100px"
label-width="auto"
v-loading="formLoading"
class="energy-device-reset-dialog-form"
>
<el-form-item label="名称" prop="name">
<el-input disabled v-model="formData.name" placeholder="请输入名称" />
<el-form-item :label="t('EnergyManagement.EnergyDevice.dialogNameLabel')" prop="name">
<el-input disabled v-model="formData.name" :placeholder="t('EnergyManagement.EnergyDevice.dialogNamePlaceholder')" />
</el-form-item>
<el-form-item label="编码" prop="code">
<el-input disabled v-model="formData.code" placeholder="请输入编码" />
<el-form-item :label="t('EnergyManagement.EnergyDevice.dialogCodeLabel')" prop="code">
<el-input disabled v-model="formData.code" :placeholder="t('EnergyManagement.EnergyDevice.dialogCodePlaceholder')" />
</el-form-item>
<el-col :span="12">
<el-form-item label="上次抄表时间" prop="lastCheckTime">
<el-form-item :label="t('EnergyManagement.EnergyDeviceCheck.dialogLastCheckTimeLabel')" prop="lastCheckTime">
<el-date-picker
v-model="formData.lastCheckTime"
type="date"
value-format="x"
placeholder="选择上次抄表时间"
:placeholder="t('EnergyManagement.EnergyDeviceCheck.dialogLastCheckTimePlaceholder')"
/>
</el-form-item>
</el-col>
<el-form-item label="最后抄表值" prop="lastCheckValue">
<el-input v-model="formData.lastCheckValue" placeholder="请输入最后抄表值" />
<el-form-item :label="t('EnergyManagement.EnergyDeviceCheck.dialogLastCheckValueLabel')" prop="lastCheckValue">
<el-input v-model="formData.lastCheckValue" :placeholder="t('EnergyManagement.EnergyDeviceCheck.dialogLastCheckValuePlaceholder')" />
</el-form-item>
</el-form>
<template #footer>
<el-button @click="submitForm" type="primary" :disabled="formLoading"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
<el-button @click="submitForm" type="primary" :disabled="formLoading">{{ t('EnergyManagement.EnergyDeviceCheck.dialogOkButtonText') }}</el-button>
<el-button @click="dialogVisible = false">{{ t('EnergyManagement.EnergyDeviceCheck.dialogCancelButtonText') }}</el-button>
</template>
</Dialog>
</template>
@ -60,14 +61,14 @@ const formData = ref({
isEnable: undefined
})
const formRules = reactive({
isEnable: [{ required: true, message: '是否启用不能为空', trigger: 'blur' }]
isEnable: [{ required: true, message: t('EnergyManagement.EnergyDevice.validatorIsEnableRequired'), trigger: 'blur' }]
})
const formRef = ref() // Ref
/** 打开弹窗 */
const open = async (type: string, id?: number) => {
dialogVisible.value = true
dialogTitle.value = "重置最后抄表值"
dialogTitle.value = t('EnergyManagement.EnergyDeviceCheck.dialogLastCheckValueLabel')
formType.value = type
resetForm()
//

@ -4,40 +4,41 @@
ref="formRef"
:model="formData"
:rules="formRules"
label-width="100px"
label-width="auto"
v-loading="formLoading"
class="energy-device-dialog-form"
>
<el-row>
<el-col :span="12">
<el-form-item label="抄表时间" prop="checkTime">
<el-form-item :label="t('EnergyManagement.EnergyDeviceCheck.dialogCheckTimeLabel')" prop="checkTime">
<el-date-picker
v-model="formData.checkTime"
type="date"
value-format="x"
placeholder="选择抄表时间"
:placeholder="t('EnergyManagement.EnergyDeviceCheck.dialogCheckTimePlaceholder')"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="抄表值" prop="checkValue">
<el-form-item :label="t('EnergyManagement.EnergyDeviceCheck.dialogCheckValueLabel')" prop="checkValue">
<el-input-number v-model="formData.checkValue" @change="changeValue" :min="0" :precision="2" placeholder=""/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="上次抄表时间" prop="lastCheckTime">
<el-form-item :label="t('EnergyManagement.EnergyDeviceCheck.dialogLastCheckTimeLabel')" prop="lastCheckTime">
<el-date-picker
disabled
v-model="formData.lastCheckTime"
type="date"
value-format="x"
placeholder="选择上次抄表时间"
:placeholder="t('EnergyManagement.EnergyDeviceCheck.dialogLastCheckTimePlaceholder')"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="上次抄表值" prop="lastCheckValue">
<el-form-item :label="t('EnergyManagement.EnergyDeviceCheck.dialogLastCheckValueLabel')" prop="lastCheckValue">
<el-input-number disabled v-model="formData.lastCheckValue" :min="0" :precision="2" placeholder="" />
</el-form-item>
</el-col>
@ -45,23 +46,23 @@
<el-row>
<el-col :span="12">
<el-form-item label="单价" prop="unitPrice">
<el-form-item :label="t('EnergyManagement.EnergyDeviceCheck.dialogUnitPriceLabel')" prop="unitPrice">
<el-input-number v-model="formData.unitPrice" :min="0" :precision="2" placeholder="" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="差值" prop="diffValue">
<el-form-item :label="t('EnergyManagement.EnergyDeviceCheck.dialogDiffValueLabel')" prop="diffValue">
<el-input-number disabled v-model="formData.diffValue" :min="0" :precision="2" placeholder="" />
</el-form-item>
</el-col>
</el-row>
<el-form-item label="备注" prop="remark">
<el-input v-model="formData.remark" placeholder="请输入备注" />
<el-form-item :label="t('EnergyManagement.EnergyDeviceCheck.dialogRemarkLabel')" prop="remark">
<el-input v-model="formData.remark" :placeholder="t('EnergyManagement.EnergyDeviceCheck.dialogRemarkPlaceholder')" />
</el-form-item>
</el-form>
<template #footer>
<el-button @click="submitForm" type="primary" :disabled="formLoading"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
<el-button @click="submitForm" type="primary" :disabled="formLoading">{{ t('EnergyManagement.EnergyDeviceCheck.dialogOkButtonText') }}</el-button>
<el-button @click="dialogVisible = false">{{ t('EnergyManagement.EnergyDeviceCheck.dialogCancelButtonText') }}</el-button>
</template>
</Dialog>
</template>
@ -87,8 +88,8 @@ const formData = ref({
remark: undefined
})
const formRules = reactive({
deviceId: [{ required: true, message: '能源设备Id不能为空', trigger: 'blur' }],
checkValue: [{ required: true, message: '抄表值不能为空', trigger: 'blur' }]
deviceId: [{ required: true, message: t('EnergyManagement.EnergyDeviceCheck.validatorDeviceIdRequired'), trigger: 'blur' }],
checkValue: [{ required: true, message: t('EnergyManagement.EnergyDeviceCheck.validatorCheckValueRequired'), trigger: 'blur' }]
})
const formRef = ref() // Ref

@ -12,7 +12,7 @@
<!-- <el-text style="color:#339c1e;">{{props.deviceName}}</el-text>-->
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
<el-table-column
label="抄表时间"
:label="t('EnergyManagement.EnergyDeviceCheck.dialogCheckTimeLabel')"
align="center"
prop="checkTime"
:formatter="dateFormatter"
@ -20,20 +20,20 @@
sortable
/>
<el-table-column
label="上次抄表时间"
:label="t('EnergyManagement.EnergyDeviceCheck.dialogLastCheckTimeLabel')"
align="center"
prop="lastCheckTime"
:formatter="dateFormatter"
width="170px"
sortable
/>
<el-table-column label="抄表值" align="center" prop="checkValue" />
<el-table-column label="上次抄表值" align="center" prop="lastCheckValue" />
<el-table-column label="差值" align="center" prop="diffValue" />
<el-table-column label="单价" align="center" prop="unitPrice" />
<el-table-column label="备注" align="center" prop="remark" />
<el-table-column :label="t('EnergyManagement.EnergyDeviceCheck.dialogCheckValueLabel')" align="center" prop="checkValue" />
<el-table-column :label="t('EnergyManagement.EnergyDeviceCheck.dialogLastCheckValueLabel')" align="center" prop="lastCheckValue" />
<el-table-column :label="t('EnergyManagement.EnergyDeviceCheck.dialogDiffValueLabel')" align="center" prop="diffValue" />
<el-table-column :label="t('EnergyManagement.EnergyDeviceCheck.dialogUnitPriceLabel')" align="center" prop="unitPrice" />
<el-table-column :label="t('EnergyManagement.EnergyDeviceCheck.dialogRemarkLabel')" align="center" prop="remark" />
<el-table-column
label="创建时间"
:label="t('common.createTime')"
align="center"
prop="createTime"
:formatter="dateFormatter"
@ -55,7 +55,7 @@
@click="handleDelete(scope.row.id)"
v-hasPermi="['mes:energy-device:delete']"
>
删除
{{ t('common.delMessage') }}
</el-button>
</template>
</el-table-column>

@ -1,31 +1,50 @@
<template>
<ContentWrap>
<!-- 搜索工作栏 -->
<el-form class="-mb-15px" :model="queryParams" ref="queryFormRef" :inline="true" label-width="68px">
<el-form-item label="名称" prop="name">
<el-form
class="-mb-15px energy-device-filter-form"
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="auto"
>
<el-form-item :label="t('EnergyManagement.EnergyDevice.searchNameLabel')" prop="name">
<el-input
v-model="queryParams.name" placeholder="请输入名称" clearable @keyup.enter="handleQuery"
class="!w-240px" />
v-model="queryParams.name"
:placeholder="t('EnergyManagement.EnergyDevice.searchNamePlaceholder')"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="能耗类型" prop="deviceType">
<el-select v-model="queryParams.deviceType" placeholder="请选择设备类型" clearable class="!w-240px">
<el-form-item :label="t('EnergyManagement.EnergyDevice.searchEnergyTypeLabel')" prop="deviceType">
<el-select
v-model="queryParams.deviceType"
:placeholder="t('EnergyManagement.EnergyDevice.searchEnergyTypePlaceholder')"
clearable
class="!w-240px"
>
<el-option v-for="item in typeList" :key="item.id" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
<el-form-item>
<el-button @click="handleQuery">
<Icon icon="ep:search" class="mr-5px" /> 搜索
<Icon icon="ep:search" class="mr-5px" />
{{ t('EnergyManagement.EnergyDevice.searchButtonText') }}
</el-button>
<el-button @click="resetQuery">
<Icon icon="ep:refresh" class="mr-5px" /> 重置
<Icon icon="ep:refresh" class="mr-5px" />
{{ t('EnergyManagement.EnergyDevice.resetButtonText') }}
</el-button>
<el-button type="primary" plain @click="openForm('create')" v-hasPermi="['mes:energy-device:create']">
<Icon icon="ep:plus" class="mr-5px" /> 新增
<Icon icon="ep:plus" class="mr-5px" />
{{ t('EnergyManagement.EnergyDevice.createButtonText') }}
</el-button>
<el-button
type="success" plain @click="handleExport" :loading="exportLoading"
v-hasPermi="['mes:energy-device:export']">
<Icon icon="ep:download" class="mr-5px" /> 导出
<Icon icon="ep:download" class="mr-5px" />
{{ t('EnergyManagement.EnergyDevice.exportButtonText') }}
</el-button>
</el-form-item>
</el-form>
@ -44,10 +63,10 @@ type="success" plain @click="handleExport" :loading="exportLoading"
@selection-change="handleSelectionChange"
>
<!-- <el-table-column type="selection" width="50" align="center" /> -->
<el-table-column label="表编码" align="center" prop="code" />
<el-table-column label="表名称" align="center" prop="name" />
<el-table-column label="能耗类型" align="center" prop="deviceTypeName" />
<el-table-column label="所属区域" align="center" prop="orgName" />
<el-table-column :label="t('EnergyManagement.EnergyDevice.tableCodeColumn')" align="center" prop="code" />
<el-table-column :label="t('EnergyManagement.EnergyDevice.tableNameColumn')" align="center" prop="name" />
<el-table-column :label="t('EnergyManagement.EnergyDevice.tableEnergyTypeColumn')" align="center" prop="deviceTypeName" />
<el-table-column :label="t('EnergyManagement.EnergyDevice.tableOrgColumn')" align="center" prop="orgName" />
<!-- <el-table-column label="计算规则" align="center" prop="rules" /> -->
<!-- <el-table-column label="抄表周期" align="center" prop="checkCron" />
<el-table-column label="最后抄表值" align="center" prop="lastCheckValue" />
@ -60,13 +79,19 @@ type="success" plain @click="handleExport" :loading="exportLoading"
width="180px"
/> -->
<!-- <el-table-column label="设备资料" align="center" prop="info" /> -->
<el-table-column label="是否启用" align="center" prop="isEnable">
<el-table-column :label="t('EnergyManagement.EnergyDevice.tableIsEnableColumn')" align="center" prop="isEnable">
<template #default="scope">
<dict-tag :type="DICT_TYPE.INFRA_BOOLEAN_STRING" :value="scope.row.isEnable" />
</template>
</el-table-column>
<el-table-column label="最近更新时间" align="center" prop="updateTime" :formatter="dateFormatter" width="180px" />
<el-table-column label="操作" fixed="right" align="center" width="250px">
<el-table-column
:label="t('EnergyManagement.EnergyDevice.tableUpdateTimeColumn')"
align="center"
prop="updateTime"
:formatter="dateFormatter"
width="180px"
/>
<el-table-column :label="t('EnergyManagement.EnergyDevice.tableOperateColumn')" fixed="right" align="center" width="250px">
<template #default="scope">
<!-- <el-button
link
@ -87,10 +112,10 @@ type="success" plain @click="handleExport" :loading="exportLoading"
<el-button
link type="primary" @click="openForm('update', scope.row.id)"
v-hasPermi="['mes:energy-device:update']">
编辑
{{ t('EnergyManagement.EnergyDevice.tableEditAction') }}
</el-button>
<el-button link type="danger" @click="handleDelete(scope.row.id)" v-hasPermi="['mes:energy-device:delete']">
删除
{{ t('EnergyManagement.EnergyDevice.tableDeleteAction') }}
</el-button>
</template>
</el-table-column>
@ -226,7 +251,7 @@ const handleExport = async () => {
params.ids = selectedIds.value.join(',')
}
const data = await EnergyDeviceApi.exportEnergyDevice(params)
download.excel(data, '能源设备.xls')
download.excel(data, t('EnergyManagement.EnergyDevice.exportFileName'))
} catch {
} finally {
exportLoading.value = false
@ -253,3 +278,9 @@ const newRecordForm = (id: number, deviceType: string) => {
}
</script>
<style scoped>
.energy-device-filter-form :deep(.el-form-item__label) {
min-width: 80px;
}
</style>

@ -4,74 +4,70 @@
ref="formRef"
:model="formData"
:rules="formRules"
label-width="100px"
label-width="auto"
v-loading="formLoading"
class="energy-device-check-dialog-form"
>
<el-row>
<el-col :span="12">
<el-form-item label="能源设备Id" prop="deviceId">
<el-input v-model="formData.deviceId" placeholder="请输入能源设备Id" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="能源设备Id" prop="deviceId">
<el-input v-model="formData.deviceId" placeholder="请输入能源设备Id" />
<el-form-item :label="t('EnergyManagement.EnergyDeviceCheck.dialogDeviceIdLabel')" prop="deviceId">
<el-input v-model="formData.deviceId" :placeholder="t('EnergyManagement.EnergyDeviceCheck.dialogDeviceIdPlaceholder')" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="上次抄表时间" prop="lastCheckTime">
<el-form-item :label="t('EnergyManagement.EnergyDeviceCheck.dialogLastCheckTimeLabel')" prop="lastCheckTime">
<el-date-picker
v-model="formData.lastCheckTime"
type="date"
value-format="x"
placeholder="选择上次抄表时间"
:placeholder="t('EnergyManagement.EnergyDeviceCheck.dialogLastCheckTimePlaceholder')"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="上次抄表值" prop="lastCheckValue">
<el-input v-model="formData.lastCheckValue" placeholder="请输入上次抄表值" />
<el-form-item :label="t('EnergyManagement.EnergyDeviceCheck.dialogLastCheckValueLabel')" prop="lastCheckValue">
<el-input v-model="formData.lastCheckValue" :placeholder="t('EnergyManagement.EnergyDeviceCheck.dialogLastCheckValuePlaceholder')" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="抄表时间" prop="checkTime">
<el-form-item :label="t('EnergyManagement.EnergyDeviceCheck.dialogCheckTimeLabel')" prop="checkTime">
<el-date-picker
v-model="formData.checkTime"
type="date"
value-format="x"
placeholder="选择抄表时间"
:placeholder="t('EnergyManagement.EnergyDeviceCheck.dialogCheckTimePlaceholder')"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="抄表值" prop="checkValue">
<el-input v-model="formData.checkValue" placeholder="请输入抄表值" />
<el-form-item :label="t('EnergyManagement.EnergyDeviceCheck.dialogCheckValueLabel')" prop="checkValue">
<el-input v-model="formData.checkValue" :placeholder="t('EnergyManagement.EnergyDeviceCheck.dialogCheckValuePlaceholder')" />
</el-form-item>
</el-col>
</el-row>
<el-form-item label="差值" prop="diffValue">
<el-input v-model="formData.diffValue" placeholder="请输入差值" />
<el-form-item :label="t('EnergyManagement.EnergyDeviceCheck.dialogDiffValueLabel')" prop="diffValue">
<el-input v-model="formData.diffValue" :placeholder="t('EnergyManagement.EnergyDeviceCheck.dialogDiffValuePlaceholder')" />
</el-form-item>
<el-row>
<el-col :span="12">
<el-form-item label="单价" prop="unitPrice">
<el-input v-model="formData.unitPrice" placeholder="请输入单价" />
<el-form-item :label="t('EnergyManagement.EnergyDeviceCheck.dialogUnitPriceLabel')" prop="unitPrice">
<el-input v-model="formData.unitPrice" :placeholder="t('EnergyManagement.EnergyDeviceCheck.dialogUnitPricePlaceholder')" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="备注" prop="remark">
<el-input v-model="formData.remark" placeholder="请输入备注" />
<el-form-item :label="t('EnergyManagement.EnergyDeviceCheck.dialogRemarkLabel')" prop="remark">
<el-input v-model="formData.remark" :placeholder="t('EnergyManagement.EnergyDeviceCheck.dialogRemarkPlaceholder')" />
</el-form-item>
</el-col>
</el-row>
</el-form>
<template #footer>
<el-button @click="submitForm" type="primary" :disabled="formLoading"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
<el-button @click="submitForm" type="primary" :disabled="formLoading">{{ t('EnergyManagement.EnergyDeviceCheck.dialogOkButtonText') }}</el-button>
<el-button @click="dialogVisible = false">{{ t('EnergyManagement.EnergyDeviceCheck.dialogCancelButtonText') }}</el-button>
</template>
</Dialog>
</template>
@ -100,8 +96,8 @@ const formData = ref({
remark: undefined
})
const formRules = reactive({
deviceId: [{ required: true, message: '能源设备Id不能为空', trigger: 'blur' }],
checkValue: [{ required: true, message: '抄表值不能为空', trigger: 'blur' }]
deviceId: [{ required: true, message: t('EnergyManagement.EnergyDeviceCheck.validatorDeviceIdRequired'), trigger: 'blur' }],
checkValue: [{ required: true, message: t('EnergyManagement.EnergyDeviceCheck.validatorCheckValueRequired'), trigger: 'blur' }]
})
const formRef = ref() // Ref

@ -1,22 +1,22 @@
<template>
<ContentWrap>
<el-form class="-mb-15px" :model="queryParams" ref="queryFormRef" :inline="true" label-width="68px">
<el-form-item label="表名称" prop="name">
<el-form class="-mb-15px energy-device-check-filter-form" :model="queryParams" ref="queryFormRef" :inline="true" label-width="auto">
<el-form-item :label="t('EnergyManagement.EnergyDeviceCheck.searchNameLabel')" prop="name">
<el-input
v-model="queryParams.name" placeholder="请输入表名称" clearable @keyup.enter="handleQuery"
v-model="queryParams.name" :placeholder="t('EnergyManagement.EnergyDeviceCheck.searchNamePlaceholder')" clearable @keyup.enter="handleQuery"
class="!w-240px" />
</el-form-item>
<el-form-item label="所属区域" prop="orgId">
<el-select v-model="queryParams.orgId" filterable clearable placeholder="请选择所属区域" class="!w-240px">
<el-form-item :label="t('EnergyManagement.EnergyDeviceCheck.searchOrgLabel')" prop="orgId">
<el-select v-model="queryParams.orgId" filterable clearable :placeholder="t('EnergyManagement.EnergyDeviceCheck.searchOrgPlaceholder')" class="!w-240px">
<el-option v-for="opt in orgOptions" :key="String(opt.value)" :label="opt.label" :value="opt.value" />
</el-select>
</el-form-item>
<el-form-item label="时间范围" prop="timeRange">
<el-form-item :label="t('EnergyManagement.EnergyDeviceCheck.searchTimeRangeLabel')" prop="timeRange">
<el-date-picker
v-model="queryParams.timeRange" type="datetimerange" value-format="YYYY-MM-DD HH:mm:ss"
format="YYYY-MM-DD HH" start-placeholder="请选择开始时间" end-placeholder="请选择结束时间"
v-model="queryParams.timeRange" type="datetimerange" value-format="YYYY-MM-DD HH:mm:ss"
format="YYYY-MM-DD HH" :start-placeholder="t('EnergyManagement.EnergyDeviceCheck.searchTimeRangeStartPlaceholder')" :end-placeholder="t('EnergyManagement.EnergyDeviceCheck.searchTimeRangeEndPlaceholder')"
:default-time="[new Date('2000-01-01 00:00:00'), new Date('2000-01-01 23:00:00')]"
:disabled-time="getDisabledTime" class="!w-360px " popper-class="energydevicecheckPicker"
:teleported="false" />
@ -24,13 +24,13 @@ v-model="queryParams.timeRange" type="datetimerange" value-format="YYYY-MM-DD HH
<el-form-item>
<el-button @click="handleQuery">
<Icon icon="ep:search" class="mr-5px" /> 查询
<Icon icon="ep:search" class="mr-5px" /> {{ t('EnergyManagement.EnergyDeviceCheck.searchButtonText') }}
</el-button>
<el-button @click="resetQuery">
<Icon icon="ep:refresh" class="mr-5px" /> 重置
<Icon icon="ep:refresh" class="mr-5px" /> {{ t('EnergyManagement.EnergyDeviceCheck.resetButtonText') }}
</el-button>
<el-button type="success" plain @click="handleExport" :loading="exportLoading">
<Icon icon="ep:download" class="mr-5px" /> 导出
<Icon icon="ep:download" class="mr-5px" /> {{ t('EnergyManagement.EnergyDeviceCheck.exportButtonText') }}
</el-button>
</el-form-item>
</el-form>
@ -45,12 +45,12 @@ ref="tableRef" v-loading="loading" :data="list" :stripe="true" :show-overflow-to
<el-table
v-if="getPointDetailsRows(scope.row).length" :data="getPointDetailsRows(scope.row)"
:show-overflow-tooltip="true" size="small" border :header-cell-style="{ background: '#f5f7fa', color: '#909399' }">
<el-table-column label="参数名称" prop="pointName" min-width="140" />
<el-table-column label="最早采集值" prop="earliestValue" min-width="120" />
<el-table-column label="最早采集时间" prop="earliestTime" min-width="170" />
<el-table-column label="最新值" prop="latestValue" min-width="120" />
<el-table-column label="最新采集时间" prop="latestTime" min-width="170" />
<el-table-column label="能耗用量" prop="difference" min-width="120" />
<el-table-column :label="t('EnergyManagement.EnergyDeviceCheck.tableExpandPointNameColumn')" prop="pointName" min-width="140" />
<el-table-column :label="t('EnergyManagement.EnergyDeviceCheck.tableExpandEarliestValueColumn')" prop="earliestValue" min-width="120" />
<el-table-column :label="t('EnergyManagement.EnergyDeviceCheck.tableExpandEarliestTimeColumn')" prop="earliestTime" min-width="170" />
<el-table-column :label="t('EnergyManagement.EnergyDeviceCheck.tableExpandLatestValueColumn')" prop="latestValue" min-width="120" />
<el-table-column :label="t('EnergyManagement.EnergyDeviceCheck.tableExpandLatestTimeColumn')" prop="latestTime" min-width="170" />
<el-table-column :label="t('EnergyManagement.EnergyDeviceCheck.tableExpandDifferenceColumn')" prop="difference" min-width="120" />
</el-table>
</template>
</el-table-column>
@ -59,21 +59,21 @@ v-if="getPointDetailsRows(scope.row).length" :data="getPointDetailsRows(scope.ro
{{ (queryParams.pageNo - 1) * queryParams.pageSize + scope.$index + 1 }}
</template>
</el-table-column> -->
<el-table-column label="表名称" align="center" prop="name" min-width="120" />
<el-table-column label="能源类型" align="center" prop="deviceTypeName" min-width="100" />
<el-table-column label="所属区域" align="center" prop="orgName" min-width="100" />
<el-table-column label="能源用量" align="center" prop="energyConsumption" min-width="120" />
<el-table-column :label="t('EnergyManagement.EnergyDeviceCheck.tableNameColumn')" align="center" prop="name" min-width="120" />
<el-table-column :label="t('EnergyManagement.EnergyDeviceCheck.tableEnergyTypeColumn')" align="center" prop="deviceTypeName" min-width="100" />
<el-table-column :label="t('EnergyManagement.EnergyDeviceCheck.tableOrgColumn')" align="center" prop="orgName" min-width="100" />
<el-table-column :label="t('EnergyManagement.EnergyDeviceCheck.tableEnergyConsumptionColumn')" align="center" prop="energyConsumption" min-width="120" />
<!-- <el-table-column label="班次" align="center" min-width="90">
<template #default>
<el-tag type="success">早班</el-tag>
</template>
</el-table-column> -->
<el-table-column label="开始时间" align="center" min-width="170">
<el-table-column :label="t('EnergyManagement.EnergyDeviceCheck.tableStartTimeColumn')" align="center" min-width="170">
<template #default="scope">
{{ scope.row.startTime ?? scope.row.earliestDataTime ?? '-' }}
</template>
</el-table-column>
<el-table-column label="结束时间" align="center" min-width="170">
<el-table-column :label="t('EnergyManagement.EnergyDeviceCheck.tableEndTimeColumn')" align="center" min-width="170">
<template #default="scope">
{{ scope.row.endTime ?? scope.row.latestDataTime ?? '-' }}
</template>
@ -230,7 +230,7 @@ const handleExport = async () => {
params.ids = selectedIds.value.join(',')
}
const data = await EnergyDeviceApi.exportQueryDataRecords(params)
download.excel(data, '能源报表.xls')
download.excel(data, t('EnergyManagement.EnergyDeviceCheck.exportFileName'))
} catch {
} finally {
exportLoading.value = false

@ -4,19 +4,29 @@
ref="formRef"
:model="formData"
:rules="formRules"
label-width="120px"
label-width="140px"
v-loading="formLoading"
>
<el-form-item label="能耗类型编码" prop="code">
<el-input v-model="formData.code" placeholder="请输入能耗类型编码" :disabled="formType === 'update'" />
<el-form-item :label="t('EnergyManagement.EnergyType.dialogCodeLabel')" prop="code">
<el-input
v-model="formData.code"
:placeholder="t('EnergyManagement.EnergyType.dialogCodePlaceholder')"
:disabled="formType === 'update'"
/>
</el-form-item>
<el-form-item label="能耗类型名称" prop="name">
<el-input v-model="formData.name" placeholder="请输入能耗类型名称" />
<el-form-item :label="t('EnergyManagement.EnergyType.dialogNameLabel')" prop="name">
<el-input
v-model="formData.name"
:placeholder="t('EnergyManagement.EnergyType.dialogNamePlaceholder')"
/>
</el-form-item>
<el-form-item label="单位" prop="unit">
<el-input v-model="formData.unit" placeholder="请输入单位" />
<el-form-item :label="t('EnergyManagement.EnergyType.dialogUnitLabel')" prop="unit">
<el-input
v-model="formData.unit"
:placeholder="t('EnergyManagement.EnergyType.dialogUnitPlaceholder')"
/>
</el-form-item>
<el-form-item label="是否启用" prop="isEnable">
<el-form-item :label="t('EnergyManagement.EnergyType.dialogIsEnableLabel')" prop="isEnable">
<el-radio-group v-model="formData.isEnable">
<el-radio
v-for="dict in getBoolDictOptions(DICT_TYPE.INFRA_BOOLEAN_STRING)"
@ -27,13 +37,20 @@
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="formData.remark" placeholder="请输入备注" />
<el-form-item :label="t('EnergyManagement.EnergyType.dialogRemarkLabel')" prop="remark">
<el-input
v-model="formData.remark"
:placeholder="t('EnergyManagement.EnergyType.dialogRemarkPlaceholder')"
/>
</el-form-item>
</el-form>
<template #footer>
<el-button @click="submitForm" type="primary" :disabled="formLoading"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
<el-button @click="submitForm" type="primary" :disabled="formLoading">
{{ t('EnergyManagement.EnergyType.dialogOkButtonText') }}
</el-button>
<el-button @click="dialogVisible = false">
{{ t('EnergyManagement.EnergyType.dialogCancelButtonText') }}
</el-button>
</template>
</Dialog>
</template>
@ -60,10 +77,10 @@ const formData = ref({
remark: undefined,
})
const formRules = reactive({
code: [{ required: true, message: '能耗类型编码不能为空', trigger: 'blur' }],
name: [{ required: true, message: '能耗类型名称不能为空', trigger: 'blur' }],
unit: [{ required: true, message: '单位不能为空', trigger: 'blur' }],
isEnable: [{ required: true, message: '是否启用不能为空', trigger: 'blur' }],
code: [{ required: true, message: t('EnergyManagement.EnergyType.validatorCodeRequired'), trigger: 'blur' }],
name: [{ required: true, message: t('EnergyManagement.EnergyType.validatorNameRequired'), trigger: 'blur' }],
unit: [{ required: true, message: t('EnergyManagement.EnergyType.validatorUnitRequired'), trigger: 'blur' }],
isEnable: [{ required: true, message: t('EnergyManagement.EnergyType.validatorIsEnableRequired'), trigger: 'blur' }],
})
const formRef = ref() // Ref

@ -6,56 +6,63 @@
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="100px"
label-width="120px"
>
<el-form-item label="能耗类型编码" prop="code">
<el-form-item :label="t('EnergyManagement.EnergyType.searchCodeLabel')" prop="code">
<el-input
v-model="queryParams.code"
placeholder="请输入能耗类型编码"
:placeholder="t('EnergyManagement.EnergyType.searchCodePlaceholder')"
clearable
@keyup.enter="handleQuery"
class="!w-300px"
/>
</el-form-item>
<el-form-item label="能耗类型名称" prop="name">
<el-form-item :label="t('EnergyManagement.EnergyType.searchNameLabel')" prop="name">
<el-input
v-model="queryParams.name"
placeholder="请输入能耗类型名称"
:placeholder="t('EnergyManagement.EnergyType.searchNamePlaceholder')"
clearable
@keyup.enter="handleQuery"
class="!w-300px"
/>
</el-form-item>
<el-form-item label="单位" prop="unit">
<el-form-item :label="t('EnergyManagement.EnergyType.searchUnitLabel')" prop="unit">
<el-input
v-model="queryParams.unit"
placeholder="请输入单位"
:placeholder="t('EnergyManagement.EnergyType.searchUnitPlaceholder')"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="创建时间" prop="createTime">
<el-form-item :label="t('EnergyManagement.EnergyType.searchCreateTimeLabel')" prop="createTime">
<el-date-picker
v-model="queryParams.createTime"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
start-placeholder="开始日期"
end-placeholder="结束日期"
:start-placeholder="t('EnergyManagement.EnergyType.searchCreateTimeStartPlaceholder')"
:end-placeholder="t('EnergyManagement.EnergyType.searchCreateTimeEndPlaceholder')"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-220px"
/>
</el-form-item>
<el-form-item>
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
<el-button @click="handleQuery">
<Icon icon="ep:search" class="mr-5px" />
{{ t('EnergyManagement.EnergyType.searchButtonText') }}
</el-button>
<el-button @click="resetQuery">
<Icon icon="ep:refresh" class="mr-5px" />
{{ t('EnergyManagement.EnergyType.resetButtonText') }}
</el-button>
<el-button
type="primary"
plain
@click="openForm('create')"
v-hasPermi="['mes:energy-type:create']"
>
<Icon icon="ep:plus" class="mr-5px" /> 新增
<Icon icon="ep:plus" class="mr-5px" />
{{ t('EnergyManagement.EnergyType.addButtonText') }}
</el-button>
<el-button
type="success"
@ -64,7 +71,8 @@
:loading="exportLoading"
v-hasPermi="['mes:energy-type:export']"
>
<Icon icon="ep:download" class="mr-5px" /> 导出
<Icon icon="ep:download" class="mr-5px" />
{{ t('EnergyManagement.EnergyType.exportButtonText') }}
</el-button>
</el-form-item>
</el-form>
@ -82,23 +90,47 @@
>
<!-- <el-table-column label="ID" align="center" prop="id" /> -->
<el-table-column type="selection" width="55" reserve-selection />
<el-table-column label="能耗类型编码" align="center" prop="code" />
<el-table-column label="能耗类型名称" align="center" prop="name" />
<el-table-column label="单位" align="center" prop="unit" />
<el-table-column label="是否启用" align="center" prop="isEnable">
<el-table-column
:label="t('EnergyManagement.EnergyType.tableCodeColumn')"
align="center"
prop="code"
/>
<el-table-column
:label="t('EnergyManagement.EnergyType.tableNameColumn')"
align="center"
prop="name"
/>
<el-table-column
:label="t('EnergyManagement.EnergyType.tableUnitColumn')"
align="center"
prop="unit"
/>
<el-table-column
:label="t('EnergyManagement.EnergyType.tableIsEnableColumn')"
align="center"
prop="isEnable"
>
<template #default="scope">
<dict-tag :type="DICT_TYPE.INFRA_BOOLEAN_STRING" :value="scope.row.isEnable" />
</template>
</el-table-column>
<el-table-column label="备注" align="center" prop="remark" />
<el-table-column
label="创建时间"
:label="t('EnergyManagement.EnergyType.tableRemarkColumn')"
align="center"
prop="remark"
/>
<el-table-column
:label="t('EnergyManagement.EnergyType.tableCreateTimeColumn')"
align="center"
prop="createTime"
:formatter="dateFormatter"
width="180px"
/>
<el-table-column label="操作" align="center" min-width="120px">
<el-table-column
:label="t('EnergyManagement.EnergyType.tableOperateColumn')"
align="center"
min-width="120px"
>
<template #default="scope">
<el-button
link
@ -106,7 +138,7 @@
@click="openForm('update', scope.row.id)"
v-hasPermi="['mes:energy-type:update']"
>
编辑
{{ t('action.edit') }}
</el-button>
<el-button
link
@ -114,7 +146,7 @@
@click="handleDelete(scope.row.id)"
v-hasPermi="['mes:energy-type:delete']"
>
删除
{{ t('action.del') }}
</el-button>
</template>
</el-table-column>
@ -221,7 +253,7 @@ const handleExport = async () => {
ids: selectedIds.value.length ? selectedIds.value.join(',') : undefined
}
const data = await EnergyTypeApi.exportEnergyType(params)
download.excel(data, '能耗类型.xls')
download.excel(data, t('EnergyManagement.EnergyType.exportFilename'))
} catch {
} finally {
exportLoading.value = false

@ -149,7 +149,7 @@ const total = ref(0) // 列表的总页数
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
operateType: undefined,
operateType: '1',
moldId: undefined,
deviceId: undefined,
remark: undefined,

Loading…
Cancel
Save