Compare commits

...

6 Commits

@ -103,5 +103,11 @@ export const PlanApi = {
// 周生产趋势
getWeekTrend: async () => {
return await request.get({ url: `/mes/plan/getWeekTrend` })
},
getPlanCapacity: async (type: number) => {
return await request.get({ url: `/mes/plan/getPlanCapacity?type=` + type })
},
getLastDaysRate: async () => {
return await request.get({ url: `/mes/plan/getLastDaysRate` })
}
}

@ -1214,6 +1214,416 @@ export default {
}
},
FactoryModeling: {
FactoryStructure: {
moduleName: 'Factory Structure',
searchCodeLabel: 'Organization Code',
searchCodePlaceholder: 'Please enter organization code',
searchParentLabel: 'Parent Organization',
searchParentPlaceholder: 'Please select parent organization',
searchNameLabel: 'Organization Name',
searchNamePlaceholder: 'Please enter organization name',
searchOrgClassLabel: 'Organization Level',
searchOrgClassPlaceholder: 'Please select organization level',
searchButtonText: 'Search',
resetButtonText: 'Reset',
addButtonText: 'Add',
exportButtonText: 'Export',
expandButtonText: 'Expand/Collapse',
tableCodeColumn: 'Organization Code',
tableNameColumn: 'Organization Name',
tableSortColumn: 'Display Order',
tableMachineColumn: 'Related Device',
tableOrgClassColumn: 'Organization Level',
tableOrgTypeColumn: 'Process',
tableCreateTimeColumn: 'Create Time',
tableOperateColumn: 'Operation',
tableEditAction: 'Edit',
tableDeleteAction: 'Delete',
dialogCodeLabel: 'Code',
dialogCodeTooltip: 'Factory structure code',
dialogCodePlaceholder: 'Code is auto generated after saving',
dialogParentLabel: 'Parent Organization',
dialogParentPlaceholder: 'Please select parent organization',
dialogNameLabel: 'Organization Name',
dialogNamePlaceholder: 'Please enter organization name',
dialogOrgClassLabel: 'Organization Level',
dialogSortLabel: 'Display Order',
dialogSortTooltip: 'Same parent nodes are sorted in ascending order',
dialogSortPlaceholder: 'Please enter display order',
dialogOrgTypeLabel: 'Process',
dialogOrgTypeTooltip: 'Source: Data dictionary - Process',
dialogOrgTypePlaceholder: 'Please select type',
dialogMachineLabel: 'Related Device',
dialogMachinePlaceholder: 'Please select device',
dialogCancelButton: 'Cancel',
dialogSubmitButton: 'Confirm',
orgTreeRootName: 'Top Organization',
validatorNameRequired: 'Organization name can not be empty',
validatorParentRequired: 'Parent organization can not be empty',
validatorOrgClassRequired: 'Organization level can not be empty'
},
FactoryWorker: {
moduleName: 'Workstation Worker',
searchNameLabel: 'Organization Name',
searchNamePlaceholder: 'Please enter organization name',
searchStatusLabel: 'Organization Status',
searchStatusPlaceholder: 'Please select organization status',
searchButtonText: 'Search',
resetButtonText: 'Reset',
exportButtonText: 'Export',
expandButtonText: 'Expand/Collapse',
tabsZhijiang: 'Pulping',
tabsChengxing: 'Forming',
tabsHonggan: 'Drying',
tabsZhuanyi: 'Transfer',
tabsJiashi: 'Humidifying',
tabsReya: 'Hot Press',
tabsQiebian: 'Trimming',
tabsPanjian: 'Inspection',
tabsDabao: 'Packing',
tabsTiebiao: 'Labeling',
tabsPinyin: 'Printing',
tabsSufeng: 'Sealing',
tabsAll: 'All',
tableNameColumn: 'Organization Name',
tableOrgClassColumn: 'Organization Level',
tableOrgTypeColumn: 'Type',
tableWorkerColumn: 'Today Worker',
tableOperateColumn: 'Operation',
tableDispatchAction: 'Dispatch',
exportFileName: 'Workstation.xls'
},
ProductCategory: {
moduleName: 'Product Material Category',
searchNameLabel: 'Category Name',
searchNamePlaceholder: 'Please enter category name',
searchStatusLabel: 'Enable Status',
searchStatusPlaceholder: 'Please select enable status',
searchButtonText: 'Search',
resetButtonText: 'Reset',
addButtonText: 'Add',
exportButtonText: 'Export',
expandButtonText: 'Expand/Collapse',
tableCodeColumn: 'Category Code',
tableNameColumn: 'Category Name',
tableSortColumn: 'Sort',
tableStatusColumn: 'Status',
tableCreateTimeColumn: 'Create Time',
tableOperateColumn: 'Operation',
tableEditAction: 'Edit',
tableDeleteAction: 'Delete',
dialogParentLabel: 'Parent Category',
dialogParentPlaceholder: 'Please select parent category',
dialogCodeLabel: 'Code',
dialogCodePlaceholder: 'Please enter code',
dialogNameLabel: 'Name',
dialogNamePlaceholder: 'Please enter name',
dialogSortLabel: 'Sort',
dialogSortPlaceholder: 'Please enter sort',
dialogStatusLabel: 'Status',
dialogCancelButton: 'Cancel',
dialogSubmitButton: 'Confirm',
treeRootName: 'Top Product Category',
validatorParentRequired: 'Parent category can not be empty',
validatorNameRequired: 'Name can not be empty',
validatorCodeRequired: 'Code can not be empty',
validatorSortRequired: 'Sort can not be empty',
validatorStatusRequired: 'Status can not be empty'
},
ProductInformation: {
moduleName: 'Product Material Information',
searchNameLabel: 'Name',
searchNamePlaceholder: 'Please enter name',
searchButtonText: 'Search',
resetButtonText: 'Reset',
addButtonText: 'Add',
exportButtonText: 'Export',
tableBarCodeColumn: 'Code',
tableNameColumn: 'Name',
tableStandardColumn: 'Specification',
tableCategoryColumn: 'Category',
tableUnitColumn: 'Unit',
tableStatusColumn: 'Status',
tableCreateTimeColumn: 'Create Time',
tableOperateColumn: 'Operation',
tableEditAction: 'Edit',
tableDeleteAction: 'Delete',
dialogBarCodeLabel: 'Code',
dialogBarCodePlaceholder: 'Please enter code',
dialogNameLabel: 'Name',
dialogNamePlaceholder: 'Please enter name',
dialogCategoryLabel: 'Category',
dialogCategoryPlaceholder: 'Please select category',
dialogUnitLabel: 'Unit',
dialogUnitPlaceholder: 'Please select unit',
dialogStandardLabel: 'Specification',
dialogStandardPlaceholder: 'Please enter specification',
dialogExpiryDayLabel: 'Shelf Life (Days)',
dialogExpiryDayPlaceholder: 'Please enter shelf life (days)',
dialogWeightLabel: 'Weight (g)',
dialogWeightPlaceholder: 'Please enter weight (g)',
dialogPurchasePriceLabel: 'Purchase Price',
dialogPurchasePricePlaceholder: 'Please enter purchase price (CNY)',
dialogSalePriceLabel: 'Sale Price',
dialogSalePricePlaceholder: 'Please enter sale price (CNY)',
dialogMinPriceLabel: 'Minimum Price',
dialogMinPricePlaceholder: 'Please enter minimum price (CNY)',
dialogStatusLabel: 'Status',
dialogRemarkLabel: 'Remark',
dialogRemarkPlaceholder: 'Please enter remark',
dialogCancelButton: 'Cancel',
dialogSubmitButton: 'Confirm',
validatorNameRequired: 'Product name can not be empty',
validatorBarCodeRequired: 'Product barcode can not be empty',
validatorCategoryRequired: 'Product category id can not be empty',
validatorUnitRequired: 'Unit id can not be empty',
validatorStatusRequired: 'Product status can not be empty'
},
AutocodeRule: {
moduleName: 'Code Rules',
searchRuleCodeLabel: 'Rule Code',
searchRuleCodePlaceholder: 'Please enter rule code',
searchRuleNameLabel: 'Rule Name',
searchRuleNamePlaceholder: 'Please enter rule name',
searchRuleDescLabel: 'Description',
searchRuleDescPlaceholder: 'Please enter description',
searchRemarkLabel: 'Remark',
searchRemarkPlaceholder: 'Please enter remark',
searchIsEnableLabel: 'Enabled',
searchIsEnablePlaceholder: 'Please select enabled',
searchButtonText: 'Search',
resetButtonText: 'Reset',
addButtonText: 'Add',
exportButtonText: 'Export',
tableRuleCodeColumn: 'Rule Code',
tableRuleNameColumn: 'Rule Name',
tableRuleDescColumn: 'Description',
tableMaxLengthColumn: 'Max Length',
tableIsPaddedColumn: 'Pad',
tablePaddedCharColumn: 'Pad Char',
tablePaddedMethodColumn: 'Pad Method',
tableIsEnableColumn: 'Enabled',
tableOperateColumn: 'Operation',
tableEditAction: 'Edit',
tableDeleteAction: 'Delete',
tableTestCodeAction: 'Test Code',
listPartTabLabel: 'Code Parts',
dialogPartTabLabel: 'Code Rule Parts',
exportFilename: 'CodeRules.xls',
dialogRuleCodeLabel: 'Rule Code',
dialogRuleCodePlaceholder: 'Please enter rule code',
dialogRuleNameLabel: 'Rule Name',
dialogRuleNamePlaceholder: 'Please enter rule name',
dialogRuleDescLabel: 'Description',
dialogRuleDescPlaceholder: 'Please enter description',
dialogMaxLengthLabel: 'Max Length',
dialogMaxLengthPlaceholder: 'Please enter max length',
dialogIsPaddedLabel: 'Pad',
dialogPaddedCharLabel: 'Pad Char',
dialogPaddedCharPlaceholder: 'Please enter pad char',
dialogPaddedMethodLabel: 'Pad Method',
dialogRemarkLabel: 'Remark',
dialogRemarkPlaceholder: 'Please enter remark',
dialogIsEnableLabel: 'Enabled',
validatorIsEnableRequired: 'Enabled can not be empty',
validatorRuleIdRequired: 'Rule id can not be empty',
validatorPartIndexRequired: 'Part index can not be empty',
validatorPartLengthRequired: 'Part length can not be empty',
partTableIndexColumn: 'Index',
partTableIdColumn: 'ID',
partTablePartIndexColumn: 'Part Index',
partTablePartTypeColumn: 'Part Type',
partTablePartCodeColumn: 'Part Code',
partTablePartNameColumn: 'Part Name',
partTablePartLengthColumn: 'Part Length',
partTableDatetimeFormatColumn: 'Datetime Format',
partTableInputCharacterColumn: 'Input Char',
partTableFixCharacterColumn: 'Fixed Char',
partTableSeriaStartNoColumn: 'Serial Start',
partTableSeriaStepColumn: 'Serial Step',
partTableSeriaNowNoColumn: 'Serial Current',
partTableCycleFlagColumn: 'Serial Cycle',
partTableCycleMethodColumn: 'Cycle Method',
partTableRemarkColumn: 'Remark',
partTableIsEnableColumn: 'Enabled',
partTableCreateTimeColumn: 'Create Time',
partTableOperateColumn: 'Operation',
partPlaceholderPartIndex: 'Please enter part index',
partPlaceholderPartCode: 'Please enter part code',
partPlaceholderPartName: 'Please enter part name',
partPlaceholderPartLength: 'Please enter part length',
partPlaceholderDatetimeFormat: 'Please enter datetime format',
partPlaceholderInputCharacter: 'Please enter input char',
partPlaceholderFixCharacter: 'Please enter fixed char',
partPlaceholderSeriaStartNo: 'Please enter serial start',
partPlaceholderSeriaStep: 'Please enter serial step',
partPlaceholderSeriaNowNo: 'Please enter current serial',
partPlaceholderRemark: 'Please enter remark',
addPartButtonText: 'Add Code Rule Part'
},
ProductBOM: {
moduleName: 'Product BOM',
searchCodeLabel: 'BOM Code',
searchCodePlaceholder: 'Please enter BOM code',
searchProductLabel: 'Product',
searchProductPlaceholder: 'Please select product',
searchRemarkLabel: 'Remark',
searchRemarkPlaceholder: 'Please enter remark',
searchEnableLabel: 'Enable Status',
searchEnablePlaceholder: 'Please select enable status',
searchButtonText: 'Search',
resetButtonText: 'Reset',
addButtonText: 'Add',
exportButtonText: 'Export',
tableCodeColumn: 'BOM Code',
tableVersionColumn: 'BOM Version',
tableProductColumn: 'Product',
tableUnitColumn: 'Unit',
tableYieldRateColumn: 'Yield Rate %',
tableRemarkColumn: 'Remark',
tableEnableColumn: 'Enabled',
tableCreateTimeColumn: 'Create Time',
tableOperateColumn: 'Operation',
tableEditAction: 'Edit',
tableDeleteAction: 'Delete',
detailTabLabel: 'Product BOM Detail',
dialogCodeLabel: 'BOM Code',
dialogCodePlaceholder: 'Please enter BOM code',
dialogVersionLabel: 'BOM Version',
dialogVersionPlaceholder: 'Please enter BOM version',
dialogProductLabel: 'Product',
dialogProductPlaceholder: 'Please select product',
dialogUnitLabel: 'Unit',
dialogUnitPlaceholder: 'Please select unit',
dialogYieldRateLabel: 'Yield Rate %',
dialogYieldRatePlaceholder: 'Please enter yield rate',
dialogRemarkLabel: 'Remark',
dialogRemarkPlaceholder: 'Please enter remark',
dialogEnableLabel: 'Enabled',
dialogCancelButton: 'Cancel',
dialogSubmitButton: 'Confirm',
detailTableIndexColumn: 'No.',
detailTableMaterialColumn: 'Material',
detailTableUsageNumberColumn: 'Usage Quantity',
detailTableUnitColumn: 'Unit',
detailTableLossRateColumn: 'Loss Rate %',
detailTableRemarkColumn: 'Remark',
detailTableOperateColumn: 'Operation',
detailMaterialPlaceholder: 'Please select material',
detailUnitPlaceholder: 'Please select unit',
detailUsageNumberPlaceholder: 'Please enter usage quantity',
detailLossRatePlaceholder: 'Please enter loss rate',
detailRemarkPlaceholder: 'Please enter remark',
detailAddButtonText: 'Add Product BOM Detail',
validatorCodeRequired: 'BOM code can not be empty',
validatorVersionRequired: 'BOM version can not be empty',
validatorProductRequired: 'Product can not be empty',
validatorUnitRequired: 'Unit can not be empty',
validatorEnableRequired: 'Enable status can not be empty',
validatorDetailMaterialRequired: 'Material can not be empty',
validatorDetailBomRequired: 'BOM id can not be empty',
validatorDetailUsageNumberRequired: 'Usage quantity can not be empty'
},
WorkTeam: {
moduleName: 'Work Team Management',
searchTeamNameLabel: 'Team Name',
searchTeamNamePlaceholder: 'Please enter team name',
searchProcessLabel: 'Process',
searchProcessPlaceholder: 'Please select process',
searchRemarkLabel: 'Remark',
searchRemarkPlaceholder: 'Please enter remark',
searchButtonText: 'Search',
resetButtonText: 'Reset',
addButtonText: 'Add',
exportButtonText: 'Export',
tabsAll: 'All',
tabsDay: 'Day Shift',
tabsNight: 'Night Shift',
tabsLongDay: 'Long Day Shift',
tableTeamNameColumn: 'Team Name',
tableLeaderColumn: 'Leader',
tableGroupTypeColumn: 'Team Type',
tableWorkTimeColumn: 'Working Time',
tableProcessColumn: 'Process',
tableRemarkColumn: 'Remark',
tableEnableColumn: 'Enabled',
tableCreateTimeColumn: 'Create Time',
tableOperateColumn: 'Operation',
tableEditAction: 'Edit',
tableDeleteAction: 'Delete',
detailTabLabel: 'Team Members',
dialogTeamNameLabel: 'Team Name',
dialogTeamNamePlaceholder: 'Please enter team name',
dialogProcessLabel: 'Process',
dialogProcessTooltip: 'Source: Data dictionary - Process',
dialogGroupTypeLabel: 'Team Type',
dialogGroupTypeTooltip: 'Source: Data dictionary - Team Type',
dialogWorkTimeLabel: 'Working Time',
dialogWorkTimeRangeSeparator: 'To',
dialogWorkTimeStartPlaceholder: 'Start Time',
dialogWorkTimeEndPlaceholder: 'End Time',
dialogRemarkLabel: 'Remark',
dialogRemarkPlaceholder: 'Please enter remark',
dialogEnableLabel: 'Enabled',
dialogCancelButton: 'Cancel',
dialogSubmitButton: 'Confirm',
detailAddButtonText: 'Add',
detailTableJobNoColumn: 'Job No.',
detailTableRoleColumn: 'Role',
detailTableRemarkColumn: 'Remark',
detailTableCreateTimeColumn: 'Create Time',
detailTableOperateColumn: 'Operation',
detailDialogJobNoLabel: 'Job No.',
detailDialogJobNoPlaceholder: 'Please select job no.',
detailDialogRoleLabel: 'Role',
detailDialogRoleTooltip: 'Source: Data dictionary - Team Member Role',
detailDialogRemarkLabel: 'Remark',
detailDialogRemarkPlaceholder: 'Please enter remark',
detailDialogMemberSuffix: 'Member',
validatorTeamNameRequired: 'Team name can not be empty',
validatorProcessRequired: 'Process type can not be empty',
validatorGroupTypeRequired: 'Team type can not be empty',
validatorEnableRequired: 'Enable status can not be empty',
validatorDetailUserRequired: 'User id can not be empty',
validatorDetailRoleRequired: 'Role can not be empty',
validatorSelectWorkTeamFirst: 'Please select a work team first'
},
ProductUnit: {
moduleName: 'Unit Management',
searchNameLabel: 'Unit Name',
searchNamePlaceholder: 'Please enter unit name',
searchStatusLabel: 'Unit Status',
searchStatusPlaceholder: 'Please select unit status',
searchButtonText: 'Search',
resetButtonText: 'Reset',
addButtonText: 'Add',
exportButtonText: 'Export',
tableNameColumn: 'Unit Name',
tablePrimaryFlagColumn: 'Is Primary Unit',
tableChangeRateColumn: 'Conversion Rate to Primary Unit',
tableStatusColumn: 'Status',
tableCreateTimeColumn: 'Create Time',
tableOperateColumn: 'Operation',
tableEditAction: 'Edit',
tableDeleteAction: 'Delete',
dialogNameLabel: 'Unit Name',
dialogNamePlaceholder: 'Please enter unit name',
dialogPrimaryFlagLabel: 'Is Primary Unit',
dialogPrimaryUnitLabel: 'Related Primary Unit',
dialogPrimaryUnitPlaceholder: 'Please select primary unit',
dialogChangeRateLabel: 'Conversion Rate',
dialogChangeRatePlaceholder: 'Please enter conversion rate',
dialogStatusLabel: 'Unit Status',
dialogCancelButton: 'Cancel',
dialogSubmitButton: 'Confirm',
validatorNameRequired: 'Unit name can not be empty',
validatorStatusRequired: 'Unit status can not be empty',
validatorPrimaryFlagRequired: 'Primary unit flag can not be empty'
}
},
MoldManagement: {
MoldBrand: {
code: 'Model Code',

@ -1998,5 +1998,414 @@ export default {
manualTableReferColumn: '参考值',
manualTableRemarkColumn: '备注'
}
},
FactoryModeling: {
FactoryStructure: {
moduleName: '厂区结构',
searchCodeLabel: '组织编码',
searchCodePlaceholder: '请输入组织编码',
searchParentLabel: '父组织',
searchParentPlaceholder: '请选择父组织',
searchNameLabel: '组织名称',
searchNamePlaceholder: '请输入组织名称',
searchOrgClassLabel: '组织等级',
searchOrgClassPlaceholder: '请选择组织等级',
searchButtonText: '搜索',
resetButtonText: '重置',
addButtonText: '新增',
exportButtonText: '导出',
expandButtonText: '展开/折叠',
tableCodeColumn: '组织编码',
tableNameColumn: '组织名称',
tableSortColumn: '显示顺序',
tableMachineColumn: '关联设备',
tableOrgClassColumn: '组织等级',
tableOrgTypeColumn: '工序',
tableCreateTimeColumn: '创建时间',
tableOperateColumn: '操作',
tableEditAction: '编辑',
tableDeleteAction: '删除',
dialogCodeLabel: '编码',
dialogCodeTooltip: '厂区结构编码',
dialogCodePlaceholder: '编码保存后自动生成',
dialogParentLabel: '父组织',
dialogParentPlaceholder: '请选择父组织',
dialogNameLabel: '组织名称',
dialogNamePlaceholder: '请输入组织名称',
dialogOrgClassLabel: '组织等级',
dialogSortLabel: '显示顺序',
dialogSortTooltip: '同父级按照显示顺序从小到大排序',
dialogSortPlaceholder: '请输入显示顺序',
dialogOrgTypeLabel: '工序',
dialogOrgTypeTooltip: '来源:数据字典-工序',
dialogOrgTypePlaceholder: '请选择类型',
dialogMachineLabel: '关联设备',
dialogMachinePlaceholder: '请选择设备',
dialogCancelButton: '取 消',
dialogSubmitButton: '确 定',
orgTreeRootName: '顶级组织',
validatorNameRequired: '组织名称不能为空',
validatorParentRequired: '父组织不能为空',
validatorOrgClassRequired: '组织等级不能为空'
},
FactoryWorker: {
moduleName: '工位人员',
searchNameLabel: '组织名称',
searchNamePlaceholder: '请输入组织名称',
searchStatusLabel: '组织状态',
searchStatusPlaceholder: '请选择组织状态',
searchButtonText: '搜索',
resetButtonText: '重置',
exportButtonText: '导出',
expandButtonText: '展开/折叠',
tabsZhijiang: '制浆',
tabsChengxing: '成型',
tabsHonggan: '烘干',
tabsZhuanyi: '转移',
tabsJiashi: '加湿',
tabsReya: '热压',
tabsQiebian: '切边',
tabsPanjian: '品检',
tabsDabao: '打包',
tabsTiebiao: '贴标',
tabsPinyin: '品印',
tabsSufeng: '塑封',
tabsAll: '所有',
tableNameColumn: '组织名称',
tableOrgClassColumn: '组织等级',
tableOrgTypeColumn: '类型',
tableWorkerColumn: '今日工人',
tableOperateColumn: '操作',
tableDispatchAction: '派工',
exportFileName: '产线工位.xls'
},
ProductCategory: {
moduleName: '产品物料分类',
searchNameLabel: '分类名称',
searchNamePlaceholder: '请输入分类名称',
searchStatusLabel: '开启状态',
searchStatusPlaceholder: '请选择开启状态',
searchButtonText: '搜索',
resetButtonText: '重置',
addButtonText: '新增',
exportButtonText: '导出',
expandButtonText: '展开/折叠',
tableCodeColumn: '分类编码',
tableNameColumn: '分类名称',
tableSortColumn: '排序',
tableStatusColumn: '状态',
tableCreateTimeColumn: '创建时间',
tableOperateColumn: '操作',
tableEditAction: '编辑',
tableDeleteAction: '删除',
dialogParentLabel: '上级编号',
dialogParentPlaceholder: '请选择上级编号',
dialogCodeLabel: '编码',
dialogCodePlaceholder: '请输入编码',
dialogNameLabel: '名称',
dialogNamePlaceholder: '请输入名称',
dialogSortLabel: '排序',
dialogSortPlaceholder: '请输入排序',
dialogStatusLabel: '状态',
dialogCancelButton: '取 消',
dialogSubmitButton: '确 定',
treeRootName: '顶级产品分类',
validatorParentRequired: '上级编号不能为空',
validatorNameRequired: '名称不能为空',
validatorCodeRequired: '编码不能为空',
validatorSortRequired: '排序不能为空',
validatorStatusRequired: '状态不能为空'
},
ProductInformation: {
moduleName: '产品物料信息',
searchNameLabel: '名称',
searchNamePlaceholder: '请输入名称',
searchButtonText: '搜索',
resetButtonText: '重置',
addButtonText: '新增',
exportButtonText: '导出',
tableBarCodeColumn: '编码',
tableNameColumn: '名称',
tableStandardColumn: '规格',
tableCategoryColumn: '分类',
tableUnitColumn: '单位',
tableStatusColumn: '状态',
tableCreateTimeColumn: '创建时间',
tableOperateColumn: '操作',
tableEditAction: '编辑',
tableDeleteAction: '删除',
dialogBarCodeLabel: '编码',
dialogBarCodePlaceholder: '请输入编码',
dialogNameLabel: '名称',
dialogNamePlaceholder: '请输入名称',
dialogCategoryLabel: '分类',
dialogCategoryPlaceholder: '请选择分类',
dialogUnitLabel: '单位',
dialogUnitPlaceholder: '请选择单位',
dialogStandardLabel: '规格',
dialogStandardPlaceholder: '请输入规格',
dialogExpiryDayLabel: '保质期天数',
dialogExpiryDayPlaceholder: '请输入保质期天数',
dialogWeightLabel: '重量g',
dialogWeightPlaceholder: '请输入重量g',
dialogPurchasePriceLabel: '采购价格',
dialogPurchasePricePlaceholder: '请输入采购价格,单位:元',
dialogSalePriceLabel: '销售价格',
dialogSalePricePlaceholder: '请输入销售价格,单位:元',
dialogMinPriceLabel: '最低价格',
dialogMinPricePlaceholder: '请输入最低价格,单位:元',
dialogStatusLabel: '状态',
dialogRemarkLabel: '备注',
dialogRemarkPlaceholder: '请输入备注',
dialogCancelButton: '取 消',
dialogSubmitButton: '确 定',
validatorNameRequired: '产品名称不能为空',
validatorBarCodeRequired: '产品条码不能为空',
validatorCategoryRequired: '产品分类编号不能为空',
validatorUnitRequired: '单位编号不能为空',
validatorStatusRequired: '产品状态不能为空'
},
AutocodeRule: {
moduleName: '编码规则',
searchRuleCodeLabel: '规则编码',
searchRuleCodePlaceholder: '请输入规则编码',
searchRuleNameLabel: '规则名称',
searchRuleNamePlaceholder: '请输入规则名称',
searchRuleDescLabel: '描述',
searchRuleDescPlaceholder: '请输入描述',
searchRemarkLabel: '备注',
searchRemarkPlaceholder: '请输入备注',
searchIsEnableLabel: '是否启用',
searchIsEnablePlaceholder: '请选择是否启用',
searchButtonText: '搜索',
resetButtonText: '重置',
addButtonText: '新增',
exportButtonText: '导出',
tableRuleCodeColumn: '规则编码',
tableRuleNameColumn: '规则名称',
tableRuleDescColumn: '描述',
tableMaxLengthColumn: '最大长度',
tableIsPaddedColumn: '是否补齐',
tablePaddedCharColumn: '补齐字符',
tablePaddedMethodColumn: '补齐方式',
tableIsEnableColumn: '是否启用',
tableOperateColumn: '操作',
tableEditAction: '编辑',
tableDeleteAction: '删除',
tableTestCodeAction: '测试编码',
listPartTabLabel: '编码组成',
dialogPartTabLabel: '编码规则组成',
exportFilename: '编码规则.xls',
dialogRuleCodeLabel: '规则编码',
dialogRuleCodePlaceholder: '请输入规则编码',
dialogRuleNameLabel: '规则名称',
dialogRuleNamePlaceholder: '请输入规则名称',
dialogRuleDescLabel: '描述',
dialogRuleDescPlaceholder: '请输入描述',
dialogMaxLengthLabel: '最大长度',
dialogMaxLengthPlaceholder: '请输入最大长度',
dialogIsPaddedLabel: '是否补齐',
dialogPaddedCharLabel: '补齐字符',
dialogPaddedCharPlaceholder: '请输入补齐字符',
dialogPaddedMethodLabel: '补齐方式',
dialogRemarkLabel: '备注',
dialogRemarkPlaceholder: '请输入备注',
dialogIsEnableLabel: '是否启用',
validatorIsEnableRequired: '是否启用不能为空',
validatorRuleIdRequired: '规则ID不能为空',
validatorPartIndexRequired: '分段序号不能为空',
validatorPartLengthRequired: '分段长度不能为空',
partTableIndexColumn: '序号',
partTableIdColumn: 'ID',
partTablePartIndexColumn: '分段序号',
partTablePartTypeColumn: '分段类型',
partTablePartCodeColumn: '分段编号',
partTablePartNameColumn: '分段名称',
partTablePartLengthColumn: '分段长度',
partTableDatetimeFormatColumn: '日期时间格式',
partTableInputCharacterColumn: '输入字符',
partTableFixCharacterColumn: '固定字符',
partTableSeriaStartNoColumn: '流水号起始值',
partTableSeriaStepColumn: '流水号步长',
partTableSeriaNowNoColumn: '流水号当前值',
partTableCycleFlagColumn: '流水号是否循环',
partTableCycleMethodColumn: '循环方式',
partTableRemarkColumn: '备注',
partTableIsEnableColumn: '是否启用',
partTableCreateTimeColumn: '创建时间',
partTableOperateColumn: '操作',
partPlaceholderPartIndex: '请输入分段序号',
partPlaceholderPartCode: '请输入分段编号',
partPlaceholderPartName: '请输入分段名称',
partPlaceholderPartLength: '请输入分段长度',
partPlaceholderDatetimeFormat: '请输入日期时间格式',
partPlaceholderInputCharacter: '请输入输入字符',
partPlaceholderFixCharacter: '请输入固定字符',
partPlaceholderSeriaStartNo: '请输入流水号起始值',
partPlaceholderSeriaStep: '请输入流水号步长',
partPlaceholderSeriaNowNo: '请输入流水号当前值',
partPlaceholderRemark: '请输入备注',
addPartButtonText: '添加编码规则组成'
},
ProductBOM: {
moduleName: '产品BOM',
searchCodeLabel: 'BOM编码',
searchCodePlaceholder: '请输入BOM编码',
searchProductLabel: '产品',
searchProductPlaceholder: '请选择产品',
searchRemarkLabel: '备注',
searchRemarkPlaceholder: '请输入备注',
searchEnableLabel: '开启状态',
searchEnablePlaceholder: '请选择是否启用',
searchButtonText: '搜索',
resetButtonText: '重置',
addButtonText: '新增',
exportButtonText: '导出',
tableCodeColumn: 'BOM编码',
tableVersionColumn: 'BOM版本',
tableProductColumn: '产品',
tableUnitColumn: '单位',
tableYieldRateColumn: '成品率%',
tableRemarkColumn: '备注',
tableEnableColumn: '是否启用',
tableCreateTimeColumn: '创建时间',
tableOperateColumn: '操作',
tableEditAction: '编辑',
tableDeleteAction: '删除',
detailTabLabel: '产品BOM明细',
dialogCodeLabel: 'BOM编码',
dialogCodePlaceholder: '请输入BOM编码',
dialogVersionLabel: 'BOM版本',
dialogVersionPlaceholder: '请输入BOM版本',
dialogProductLabel: '产品',
dialogProductPlaceholder: '请选择产品',
dialogUnitLabel: '单位',
dialogUnitPlaceholder: '请选择单位',
dialogYieldRateLabel: '成品率%',
dialogYieldRatePlaceholder: '请输入成品率',
dialogRemarkLabel: '备注',
dialogRemarkPlaceholder: '请输入备注',
dialogEnableLabel: '是否启用',
dialogCancelButton: '取 消',
dialogSubmitButton: '确 定',
detailTableIndexColumn: '序号',
detailTableMaterialColumn: '原料',
detailTableUsageNumberColumn: '用量',
detailTableUnitColumn: '单位',
detailTableLossRateColumn: '损耗率%',
detailTableRemarkColumn: '备注',
detailTableOperateColumn: '操作',
detailMaterialPlaceholder: '请选择原料',
detailUnitPlaceholder: '请选择单位',
detailUsageNumberPlaceholder: '请输入用量',
detailLossRatePlaceholder: '请输入损耗率',
detailRemarkPlaceholder: '请输入备注',
detailAddButtonText: '添加产品BOM明细',
validatorCodeRequired: 'BOM编码不能为空',
validatorVersionRequired: 'BOM版本不能为空',
validatorProductRequired: '产品不能为空',
validatorUnitRequired: '单位不能为空',
validatorEnableRequired: '是否启用不能为空',
validatorDetailMaterialRequired: '原料不能为空',
validatorDetailBomRequired: 'BOM 不能为空',
validatorDetailUsageNumberRequired: '用量不能为空'
},
WorkTeam: {
moduleName: '班组管理',
searchTeamNameLabel: '班组名称',
searchTeamNamePlaceholder: '请输入班组名称',
searchProcessLabel: '工序',
searchProcessPlaceholder: '请选择工序',
searchRemarkLabel: '备注',
searchRemarkPlaceholder: '请输入备注',
searchButtonText: '搜索',
resetButtonText: '重置',
addButtonText: '新增',
exportButtonText: '导出',
tabsAll: '所有',
tabsDay: '白班',
tabsNight: '夜班',
tabsLongDay: '长白班',
tableTeamNameColumn: '班组名称',
tableLeaderColumn: '组长',
tableGroupTypeColumn: '班组类型',
tableWorkTimeColumn: '工作时间',
tableProcessColumn: '工序',
tableRemarkColumn: '备注',
tableEnableColumn: '是否启用',
tableCreateTimeColumn: '创建时间',
tableOperateColumn: '操作',
tableEditAction: '编辑',
tableDeleteAction: '删除',
detailTabLabel: '班组成员',
dialogTeamNameLabel: '班组名称',
dialogTeamNamePlaceholder: '请输入班组名称',
dialogProcessLabel: '工序',
dialogProcessTooltip: '来源:数据字典-工序',
dialogGroupTypeLabel: '班组类型',
dialogGroupTypeTooltip: '来源:数据字典-班组类型',
dialogWorkTimeLabel: '工作时间',
dialogWorkTimeRangeSeparator: '至',
dialogWorkTimeStartPlaceholder: '开始时间',
dialogWorkTimeEndPlaceholder: '结束时间',
dialogRemarkLabel: '备注',
dialogRemarkPlaceholder: '请输入备注',
dialogEnableLabel: '是否启用',
dialogCancelButton: '取 消',
dialogSubmitButton: '确 定',
detailAddButtonText: '新增',
detailTableJobNoColumn: '工号',
detailTableRoleColumn: '角色',
detailTableRemarkColumn: '备注',
detailTableCreateTimeColumn: '创建时间',
detailTableOperateColumn: '操作',
detailDialogJobNoLabel: '工号',
detailDialogJobNoPlaceholder: '请选择工号',
detailDialogRoleLabel: '角色',
detailDialogRoleTooltip: '来源:数据字典-班组成员角色',
detailDialogRemarkLabel: '备注',
detailDialogRemarkPlaceholder: '请输入备注',
detailDialogMemberSuffix: '成员',
validatorTeamNameRequired: '班组名称不能为空',
validatorProcessRequired: '工序类型不能为空',
validatorGroupTypeRequired: '班组类型不能为空',
validatorEnableRequired: '是否启用不能为空',
validatorDetailUserRequired: '用户ID不能为空',
validatorDetailRoleRequired: '角色不能为空',
validatorSelectWorkTeamFirst: '请选择一个生产班组'
},
ProductUnit: {
moduleName: '单位管理',
searchNameLabel: '单位名称',
searchNamePlaceholder: '请输入单位名称',
searchStatusLabel: '单位状态',
searchStatusPlaceholder: '请选择单位状态',
searchButtonText: '搜索',
resetButtonText: '重置',
addButtonText: '新增',
exportButtonText: '导出',
tableNameColumn: '单位名称',
tablePrimaryFlagColumn: '是否主单位',
tableChangeRateColumn: '与主单位换算比例',
tableStatusColumn: '状态',
tableCreateTimeColumn: '创建时间',
tableOperateColumn: '操作',
tableEditAction: '编辑',
tableDeleteAction: '删除',
dialogNameLabel: '单位名称',
dialogNamePlaceholder: '请输入单位名称',
dialogPrimaryFlagLabel: '是否主单位',
dialogPrimaryUnitLabel: '关联主单位',
dialogPrimaryUnitPlaceholder: '请选择主单位',
dialogChangeRateLabel: '换算比例',
dialogChangeRatePlaceholder: '请输入换算比例',
dialogStatusLabel: '单位状态',
dialogCancelButton: '取 消',
dialogSubmitButton: '确 定',
validatorNameRequired: '单位名称不能为空',
validatorStatusRequired: '单位状态不能为空',
validatorPrimaryFlagRequired: '是否主单位不能为空'
}
}
}

@ -6,49 +6,49 @@
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="68px"
min-label-width="68px"
>
<el-form-item label="规则编码" prop="ruleCode">
<el-form-item :label="t('FactoryModeling.AutocodeRule.searchRuleCodeLabel')" prop="ruleCode">
<el-input
v-model="queryParams.ruleCode"
placeholder="请输入规则编码"
:placeholder="t('FactoryModeling.AutocodeRule.searchRuleCodePlaceholder')"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="规则名称" prop="ruleName">
<el-form-item :label="t('FactoryModeling.AutocodeRule.searchRuleNameLabel')" prop="ruleName">
<el-input
v-model="queryParams.ruleName"
placeholder="请输入规则名称"
:placeholder="t('FactoryModeling.AutocodeRule.searchRuleNamePlaceholder')"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="描述" prop="ruleDesc">
<el-form-item :label="t('FactoryModeling.AutocodeRule.searchRuleDescLabel')" prop="ruleDesc">
<el-input
v-model="queryParams.ruleDesc"
placeholder="请输入描述"
:placeholder="t('FactoryModeling.AutocodeRule.searchRuleDescPlaceholder')"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-form-item :label="t('FactoryModeling.AutocodeRule.searchRemarkLabel')" prop="remark">
<el-input
v-model="queryParams.remark"
placeholder="请输入备注"
:placeholder="t('FactoryModeling.AutocodeRule.searchRemarkPlaceholder')"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="是否启用" prop="isEnable">
<el-form-item :label="t('FactoryModeling.AutocodeRule.searchIsEnableLabel')" prop="isEnable">
<el-select
v-model="queryParams.isEnable"
placeholder="请选择是否启用"
:placeholder="t('FactoryModeling.AutocodeRule.searchIsEnablePlaceholder')"
clearable
class="!w-240px"
>
@ -61,15 +61,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('FactoryModeling.AutocodeRule.searchButtonText') }}</el-button>
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> {{ t('FactoryModeling.AutocodeRule.resetButtonText') }}</el-button>
<el-button
type="primary"
plain
@click="openForm('create')"
v-hasPermi="['erp:autocode-rule:create']"
>
<Icon icon="ep:plus" class="mr-5px" /> 新增
<Icon icon="ep:plus" class="mr-5px" /> {{ t('FactoryModeling.AutocodeRule.addButtonText') }}
</el-button>
<el-button
type="success"
@ -78,7 +78,7 @@
:loading="exportLoading"
v-hasPermi="['erp:autocode-rule:export']"
>
<Icon icon="ep:download" class="mr-5px" /> 导出
<Icon icon="ep:download" class="mr-5px" /> {{ t('FactoryModeling.AutocodeRule.exportButtonText') }}
</el-button>
</el-form-item>
</el-form>
@ -91,36 +91,36 @@
<el-table-column type="expand">
<template #default="scope">
<el-tabs model-value="autocodePart">
<el-tab-pane label="编码组成" name="autocodePart">
<el-tab-pane :label="t('FactoryModeling.AutocodeRule.listPartTabLabel')" name="autocodePart">
<AutocodePartList :rule-id="scope.row.id" />
</el-tab-pane>
</el-tabs>
</template>
</el-table-column>
<!-- <el-table-column label="ID" align="center" prop="id" /> -->
<el-table-column label="规则编码" align="center" prop="ruleCode" />
<el-table-column label="规则名称" align="center" prop="ruleName" />
<el-table-column label="描述" align="center" prop="ruleDesc" />
<el-table-column label="最大长度" align="center" prop="maxLength" />
<el-table-column label="是否补齐" align="center" prop="isPadded">
<el-table-column :label="t('FactoryModeling.AutocodeRule.tableRuleCodeColumn')" align="center" prop="ruleCode" />
<el-table-column :label="t('FactoryModeling.AutocodeRule.tableRuleNameColumn')" align="center" prop="ruleName" />
<el-table-column :label="t('FactoryModeling.AutocodeRule.tableRuleDescColumn')" align="center" prop="ruleDesc" />
<el-table-column :label="t('FactoryModeling.AutocodeRule.tableMaxLengthColumn')" align="center" prop="maxLength" />
<el-table-column :label="t('FactoryModeling.AutocodeRule.tableIsPaddedColumn')" align="center" prop="isPadded">
<template #default="scope">
<dict-tag :type="DICT_TYPE.ERP_AUTOCODE_IS_PADDING" :value="scope.row.isPadded" />
</template>
</el-table-column>
<el-table-column label="补齐字符" align="center" prop="paddedChar" />
<el-table-column label="补齐方式" align="center" prop="paddedMethod">
<el-table-column :label="t('FactoryModeling.AutocodeRule.tablePaddedCharColumn')" align="center" prop="paddedChar" />
<el-table-column :label="t('FactoryModeling.AutocodeRule.tablePaddedMethodColumn')" align="center" prop="paddedMethod">
<template #default="scope">
<dict-tag :type="DICT_TYPE.ERP_AUTOCODE_PADDING_TYPE" :value="scope.row.paddedMethod" />
</template>
</el-table-column>
<!-- <el-table-column label="备注" align="center" prop="remark" /> -->
<el-table-column label="是否启用" align="center" prop="isEnable">
<el-table-column :label="t('FactoryModeling.AutocodeRule.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" fixed="right" width="200">
<el-table-column :label="t('FactoryModeling.AutocodeRule.tableOperateColumn')" align="center" fixed="right" width="200">
<template #default="scope">
<el-button
link
@ -128,7 +128,7 @@
@click="openForm('update', scope.row.id)"
v-hasPermi="['erp:autocode-rule:update']"
>
编辑
{{ t('FactoryModeling.AutocodeRule.tableEditAction') }}
</el-button>
<el-button
link
@ -136,7 +136,7 @@
@click="handleDelete(scope.row.id)"
v-hasPermi="['erp:autocode-rule:delete']"
>
删除
{{ t('FactoryModeling.AutocodeRule.tableDeleteAction') }}
</el-button>
<el-button
link
@ -144,7 +144,7 @@
@click="handleTestCode(scope.row.ruleCode)"
v-hasPermi="['erp:autocode-rule:update']"
>
测试编码
{{ t('FactoryModeling.AutocodeRule.tableTestCodeAction') }}
</el-button>
</template>
</el-table-column>
@ -257,7 +257,7 @@ const handleExport = async () => {
//
exportLoading.value = true
const data = await AutocodeRuleApi.exportAutocodeRule(queryParams)
download.excel(data, '编码规则.xls')
download.excel(data, t('FactoryModeling.AutocodeRule.exportFilename'))
} catch {
} finally {
exportLoading.value = false

@ -1,5 +1,5 @@
<template>
<Dialog :title="dialogTitle" v-model="dialogVisible" width = "1200">
<Dialog :title="dialogTitle" v-model="dialogVisible" width="1200">
<el-form
ref="formRef"
:model="formData"
@ -7,19 +7,32 @@
label-width="100px"
v-loading="formLoading"
>
<el-form-item label="规则编码" prop="ruleCode">
<el-input v-model="formData.ruleCode" placeholder="请输入规则编码" :disabled = "formType == 'update'"/>
<el-form-item :label="t('FactoryModeling.AutocodeRule.dialogRuleCodeLabel')" prop="ruleCode">
<el-input
v-model="formData.ruleCode"
:placeholder="t('FactoryModeling.AutocodeRule.dialogRuleCodePlaceholder')"
:disabled="formType == 'update'"
/>
</el-form-item>
<el-form-item label="规则名称" prop="ruleName">
<el-input v-model="formData.ruleName" placeholder="请输入规则名称" />
<el-form-item :label="t('FactoryModeling.AutocodeRule.dialogRuleNameLabel')" prop="ruleName">
<el-input
v-model="formData.ruleName"
:placeholder="t('FactoryModeling.AutocodeRule.dialogRuleNamePlaceholder')"
/>
</el-form-item>
<el-form-item label="描述" prop="ruleDesc">
<el-input v-model="formData.ruleDesc" placeholder="请输入描述" />
<el-form-item :label="t('FactoryModeling.AutocodeRule.dialogRuleDescLabel')" prop="ruleDesc">
<el-input
v-model="formData.ruleDesc"
:placeholder="t('FactoryModeling.AutocodeRule.dialogRuleDescPlaceholder')"
/>
</el-form-item>
<el-form-item label="最大长度" prop="maxLength">
<el-input v-model="formData.maxLength" placeholder="请输入最大长度" />
<el-form-item :label="t('FactoryModeling.AutocodeRule.dialogMaxLengthLabel')" prop="maxLength">
<el-input
v-model="formData.maxLength"
:placeholder="t('FactoryModeling.AutocodeRule.dialogMaxLengthPlaceholder')"
/>
</el-form-item>
<el-form-item label="是否补齐" prop="isPadded">
<el-form-item :label="t('FactoryModeling.AutocodeRule.dialogIsPaddedLabel')" prop="isPadded">
<el-radio-group v-model="formData.isPadded">
<el-radio
v-for="dict in getStrDictOptions(DICT_TYPE.ERP_AUTOCODE_IS_PADDING)"
@ -30,10 +43,13 @@
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="补齐字符" prop="paddedChar">
<el-input v-model="formData.paddedChar" placeholder="请输入补齐字符" />
<el-form-item :label="t('FactoryModeling.AutocodeRule.dialogPaddedCharLabel')" prop="paddedChar">
<el-input
v-model="formData.paddedChar"
:placeholder="t('FactoryModeling.AutocodeRule.dialogPaddedCharPlaceholder')"
/>
</el-form-item>
<el-form-item label="补齐方式" prop="paddedMethod">
<el-form-item :label="t('FactoryModeling.AutocodeRule.dialogPaddedMethodLabel')" prop="paddedMethod">
<el-radio-group v-model="formData.paddedMethod">
<el-radio
v-for="dict in getStrDictOptions(DICT_TYPE.ERP_AUTOCODE_PADDING_TYPE)"
@ -44,10 +60,13 @@
</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('FactoryModeling.AutocodeRule.dialogRemarkLabel')" prop="remark">
<el-input
v-model="formData.remark"
:placeholder="t('FactoryModeling.AutocodeRule.dialogRemarkPlaceholder')"
/>
</el-form-item>
<el-form-item label="是否启用" prop="isEnable">
<el-form-item :label="t('FactoryModeling.AutocodeRule.dialogIsEnableLabel')" prop="isEnable">
<el-radio-group v-model="formData.isEnable">
<el-radio
v-for="dict in getBoolDictOptions(DICT_TYPE.INFRA_BOOLEAN_STRING)"
@ -61,13 +80,13 @@
</el-form>
<!-- 子表的表单 -->
<el-tabs v-model="subTabsName">
<el-tab-pane label="编码规则组成" name="autocodePart">
<el-tab-pane :label="t('FactoryModeling.AutocodeRule.dialogPartTabLabel')" name="autocodePart">
<AutocodePartForm ref="autocodePartFormRef" :rule-id="formData.id" />
</el-tab-pane>
</el-tabs>
<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('common.ok') }}</el-button>
<el-button @click="dialogVisible = false">{{ t('common.cancel') }}</el-button>
</template>
</Dialog>
</template>
@ -99,7 +118,9 @@ const formData = ref({
isEnable: undefined
})
const formRules = reactive({
isEnable: [{ required: true, message: '是否启用不能为空', trigger: 'blur' }]
isEnable: [
{ required: true, message: t('FactoryModeling.AutocodeRule.validatorIsEnableRequired'), trigger: 'blur' }
]
})
const formRef = ref() // Ref
@ -174,4 +195,4 @@ const resetForm = () => {
}
formRef.value?.resetFields()
}
</script>
</script>

@ -8,15 +8,18 @@
:inline-message="true"
>
<el-table :data="formData" class="-mt-10px">
<el-table-column label="序号" type="index" width="100" />
<el-table-column label="分段序号" min-width="150">
<el-table-column :label="t('FactoryModeling.AutocodeRule.partTableIndexColumn')" type="index" width="100" />
<el-table-column :label="t('FactoryModeling.AutocodeRule.partTablePartIndexColumn')" min-width="150">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.partIndex`" :rules="formRules.partIndex" class="mb-0px!">
<el-input v-model="row.partIndex" placeholder="请输入分段序号" />
<el-input
v-model="row.partIndex"
:placeholder="t('FactoryModeling.AutocodeRule.partPlaceholderPartIndex')"
/>
</el-form-item>
</template>
</el-table-column>
<el-table-column label="分段类型" min-width="150">
<el-table-column :label="t('FactoryModeling.AutocodeRule.partTablePartTypeColumn')" min-width="150">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.partType`" :rules="formRules.partType" class="mb-0px!">
@ -32,70 +35,97 @@
</el-form-item>
</template>
</el-table-column>
<el-table-column label="分段编号" min-width="150">
<el-table-column :label="t('FactoryModeling.AutocodeRule.partTablePartCodeColumn')" min-width="150">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.partCode`" :rules="formRules.partCode" class="mb-0px!">
<el-input v-model="row.partCode" placeholder="请输入分段编号" />
<el-input
v-model="row.partCode"
:placeholder="t('FactoryModeling.AutocodeRule.partPlaceholderPartCode')"
/>
</el-form-item>
</template>
</el-table-column>
<el-table-column label="分段名称" min-width="150">
<el-table-column :label="t('FactoryModeling.AutocodeRule.partTablePartNameColumn')" min-width="150">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.partName`" :rules="formRules.partName" class="mb-0px!">
<el-input v-model="row.partName" placeholder="请输入分段名称" />
<el-input
v-model="row.partName"
:placeholder="t('FactoryModeling.AutocodeRule.partPlaceholderPartName')"
/>
</el-form-item>
</template>
</el-table-column>
<el-table-column label="分段长度" min-width="150">
<el-table-column :label="t('FactoryModeling.AutocodeRule.partTablePartLengthColumn')" min-width="150">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.partLength`" :rules="formRules.partLength" class="mb-0px!">
<el-input v-model="row.partLength" placeholder="请输入分段长度" />
<el-input
v-model="row.partLength"
:placeholder="t('FactoryModeling.AutocodeRule.partPlaceholderPartLength')"
/>
</el-form-item>
</template>
</el-table-column>
<el-table-column label="日期时间格式" min-width="150">
<el-table-column :label="t('FactoryModeling.AutocodeRule.partTableDatetimeFormatColumn')" min-width="150">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.datetimeFormat`" :rules="formRules.datetimeFormat" class="mb-0px!">
<el-input v-model="row.datetimeFormat" placeholder="请输入日期时间格式" />
<el-input
v-model="row.datetimeFormat"
:placeholder="t('FactoryModeling.AutocodeRule.partPlaceholderDatetimeFormat')"
/>
</el-form-item>
</template>
</el-table-column>
<el-table-column label="输入字符" min-width="150">
<el-table-column :label="t('FactoryModeling.AutocodeRule.partTableInputCharacterColumn')" min-width="150">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.inputCharacter`" :rules="formRules.inputCharacter" class="mb-0px!">
<el-input v-model="row.inputCharacter" placeholder="请输入输入字符" />
<el-input
v-model="row.inputCharacter"
:placeholder="t('FactoryModeling.AutocodeRule.partPlaceholderInputCharacter')"
/>
</el-form-item>
</template>
</el-table-column>
<el-table-column label="固定字符" min-width="150">
<el-table-column :label="t('FactoryModeling.AutocodeRule.partTableFixCharacterColumn')" min-width="150">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.fixCharacter`" :rules="formRules.fixCharacter" class="mb-0px!">
<el-input v-model="row.fixCharacter" placeholder="请输入固定字符" />
<el-input
v-model="row.fixCharacter"
:placeholder="t('FactoryModeling.AutocodeRule.partPlaceholderFixCharacter')"
/>
</el-form-item>
</template>
</el-table-column>
<el-table-column label="流水号起始值" min-width="150">
<el-table-column :label="t('FactoryModeling.AutocodeRule.partTableSeriaStartNoColumn')" min-width="150">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.seriaStartNo`" :rules="formRules.seriaStartNo" class="mb-0px!">
<el-input v-model="row.seriaStartNo" placeholder="请输入流水号起始值" />
<el-input
v-model="row.seriaStartNo"
:placeholder="t('FactoryModeling.AutocodeRule.partPlaceholderSeriaStartNo')"
/>
</el-form-item>
</template>
</el-table-column>
<el-table-column label="流水号步长" min-width="150">
<el-table-column :label="t('FactoryModeling.AutocodeRule.partTableSeriaStepColumn')" min-width="150">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.seriaStep`" :rules="formRules.seriaStep" class="mb-0px!">
<el-input v-model="row.seriaStep" placeholder="请输入流水号步长" />
<el-input
v-model="row.seriaStep"
:placeholder="t('FactoryModeling.AutocodeRule.partPlaceholderSeriaStep')"
/>
</el-form-item>
</template>
</el-table-column>
<el-table-column label="流水号当前值" min-width="150">
<el-table-column :label="t('FactoryModeling.AutocodeRule.partTableSeriaNowNoColumn')" min-width="150">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.seriaNowNo`" :rules="formRules.seriaNowNo" class="mb-0px!">
<el-input v-model="row.seriaNowNo" placeholder="请输入流水号当前值" />
<el-input
v-model="row.seriaNowNo"
:placeholder="t('FactoryModeling.AutocodeRule.partPlaceholderSeriaNowNo')"
/>
</el-form-item>
</template>
</el-table-column>
<el-table-column label="流水号是否循环" min-width="150">
<el-table-column :label="t('FactoryModeling.AutocodeRule.partTableCycleFlagColumn')" min-width="150">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.cycleFlag`" :rules="formRules.cycleFlag" class="mb-0px!">
<el-radio-group v-model="row.cycleFlag">
@ -110,7 +140,7 @@
</el-form-item>
</template>
</el-table-column>
<el-table-column label="循环方式" min-width="150">
<el-table-column :label="t('FactoryModeling.AutocodeRule.partTableCycleMethodColumn')" min-width="150">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.cycleMethod`" :rules="formRules.cycleMethod" class="mb-0px!">
<el-radio-group v-model="row.cycleMethod">
@ -125,14 +155,17 @@
</el-form-item>
</template>
</el-table-column>
<el-table-column label="备注" min-width="150">
<el-table-column :label="t('FactoryModeling.AutocodeRule.partTableRemarkColumn')" min-width="150">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.remark`" :rules="formRules.remark" class="mb-0px!">
<el-input v-model="row.remark" placeholder="请输入备注" />
<el-input
v-model="row.remark"
:placeholder="t('FactoryModeling.AutocodeRule.partPlaceholderRemark')"
/>
</el-form-item>
</template>
</el-table-column>
<el-table-column label="是否启用" min-width="150">
<el-table-column :label="t('FactoryModeling.AutocodeRule.partTableIsEnableColumn')" min-width="150">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.isEnable`" :rules="formRules.isEnable" class="mb-0px!">
<el-radio-group v-model="row.isEnable">
@ -147,7 +180,12 @@
</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('FactoryModeling.AutocodeRule.partTableOperateColumn')"
width="60"
>
<template #default="{ $index }">
<el-button @click="handleDelete($index)" link></el-button>
</template>
@ -155,23 +193,33 @@
</el-table>
</el-form>
<el-row justify="center" class="mt-3">
<el-button @click="handleAdd" round>+ 添加编码规则组成</el-button>
<el-button @click="handleAdd" round>+ {{ t('FactoryModeling.AutocodeRule.addPartButtonText') }}</el-button>
</el-row>
</template>
<script setup lang="ts">
import { getStrDictOptions, getBoolDictOptions, DICT_TYPE, getIntDictOptions } from '@/utils/dict'
import { AutocodeRuleApi } from '@/api/erp/autocode'
const { t } = useI18n() //
const props = defineProps<{
ruleId: undefined // ID
}>()
const formLoading = ref(false) //
const formData = ref([])
const formRules = reactive({
ruleId: [{ required: true, message: '规则ID不能为空', trigger: 'blur' }],
partIndex: [{ required: true, message: '分段序号不能为空', trigger: 'blur' }],
partLength: [{ required: true, message: '分段长度不能为空', trigger: 'blur' }],
isEnable: [{ required: true, message: '是否启用不能为空', trigger: 'blur' }]
ruleId: [
{ required: true, message: t('FactoryModeling.AutocodeRule.validatorRuleIdRequired'), trigger: 'blur' }
],
partIndex: [
{ required: true, message: t('FactoryModeling.AutocodeRule.validatorPartIndexRequired'), trigger: 'blur' }
],
partLength: [
{ required: true, message: t('FactoryModeling.AutocodeRule.validatorPartLengthRequired'), trigger: 'blur' }
],
isEnable: [
{ required: true, message: t('FactoryModeling.AutocodeRule.validatorIsEnableRequired'), trigger: 'blur' }
]
})
const formRef = ref() // Ref
@ -236,4 +284,4 @@ const getData = () => {
}
defineExpose({ validate, getData })
</script>
</script>

@ -2,40 +2,100 @@
<!-- 列表 -->
<ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
<el-table-column label="ID" align="center" prop="id" />
<el-table-column label="分段序号" align="center" prop="partIndex" />
<el-table-column label="分段类型" align="center" prop="partType" >
<el-table-column :label="t('FactoryModeling.AutocodeRule.partTableIdColumn')" align="center" prop="id" />
<el-table-column
:label="t('FactoryModeling.AutocodeRule.partTablePartIndexColumn')"
align="center"
prop="partIndex"
/>
<el-table-column
:label="t('FactoryModeling.AutocodeRule.partTablePartTypeColumn')"
align="center"
prop="partType"
>
<template #default="scope">
<dict-tag :type="DICT_TYPE.ERP_AUTOCODE_PARTTYPE" :value="scope.row.partType" />
</template>
</el-table-column>
<el-table-column label="分段编号" align="center" prop="partCode" />
<el-table-column label="分段名称" align="center" prop="partName" />
<el-table-column label="分段长度" align="center" prop="partLength" />
<el-table-column label="日期时间格式" align="center" prop="datetimeFormat" />
<el-table-column label="输入字符" align="center" prop="inputCharacter" />
<el-table-column label="固定字符" align="center" prop="fixCharacter" />
<el-table-column label="流水号起始值" align="center" prop="seriaStartNo" />
<el-table-column label="流水号步长" align="center" prop="seriaStep" />
<el-table-column label="流水号当前值" align="center" prop="seriaNowNo" />
<el-table-column label="流水号是否循环" align="center" prop="cycleFlag" >
<el-table-column
:label="t('FactoryModeling.AutocodeRule.partTablePartCodeColumn')"
align="center"
prop="partCode"
/>
<el-table-column
:label="t('FactoryModeling.AutocodeRule.partTablePartNameColumn')"
align="center"
prop="partName"
/>
<el-table-column
:label="t('FactoryModeling.AutocodeRule.partTablePartLengthColumn')"
align="center"
prop="partLength"
/>
<el-table-column
:label="t('FactoryModeling.AutocodeRule.partTableDatetimeFormatColumn')"
align="center"
prop="datetimeFormat"
/>
<el-table-column
:label="t('FactoryModeling.AutocodeRule.partTableInputCharacterColumn')"
align="center"
prop="inputCharacter"
/>
<el-table-column
:label="t('FactoryModeling.AutocodeRule.partTableFixCharacterColumn')"
align="center"
prop="fixCharacter"
/>
<el-table-column
:label="t('FactoryModeling.AutocodeRule.partTableSeriaStartNoColumn')"
align="center"
prop="seriaStartNo"
/>
<el-table-column
:label="t('FactoryModeling.AutocodeRule.partTableSeriaStepColumn')"
align="center"
prop="seriaStep"
/>
<el-table-column
:label="t('FactoryModeling.AutocodeRule.partTableSeriaNowNoColumn')"
align="center"
prop="seriaNowNo"
/>
<el-table-column
:label="t('FactoryModeling.AutocodeRule.partTableCycleFlagColumn')"
align="center"
prop="cycleFlag"
>
<template #default="scope">
<dict-tag :type="DICT_TYPE.ERP_AUTOCODE_IS_PADDING" :value="scope.row.cycleFlag" />
</template>
</el-table-column>
<el-table-column label="循环方式" align="center" prop="cycleMethod">
<el-table-column
:label="t('FactoryModeling.AutocodeRule.partTableCycleMethodColumn')"
align="center"
prop="cycleMethod"
>
<template #default="scope">
<dict-tag :type="DICT_TYPE.ERP_AUTOCODE_CYCLEMETHOD" :value="scope.row.cycleMethod" />
</template>
</el-table-column>
<el-table-column label="备注" align="center" prop="remark" />
<el-table-column label="是否启用" align="center" prop="isEnable">
<el-table-column
:label="t('FactoryModeling.AutocodeRule.partTableRemarkColumn')"
align="center"
prop="remark"
/>
<el-table-column
:label="t('FactoryModeling.AutocodeRule.partTableIsEnableColumn')"
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="创建时间"
:label="t('FactoryModeling.AutocodeRule.partTableCreateTimeColumn')"
align="center"
prop="createTime"
:formatter="dateFormatter"
@ -78,4 +138,4 @@ const handleQuery = () => {
onMounted(() => {
getList()
})
</script>
</script>

@ -4,29 +4,29 @@
ref="formRef"
:model="formData"
:rules="formRules"
label-width="100px"
label-width="120px"
v-loading="formLoading"
>
<el-form-item label="上级编号" prop="parentId">
<el-form-item :label="t('FactoryModeling.ProductCategory.dialogParentLabel')" prop="parentId">
<el-tree-select
v-model="formData.parentId"
:data="productCategoryTree"
:props="defaultProps"
check-strictly
default-expand-all
placeholder="请选择上级编号"
:placeholder="t('FactoryModeling.ProductCategory.dialogParentPlaceholder')"
/>
</el-form-item>
<el-form-item label="编码" prop="code">
<el-input v-model="formData.code" placeholder="请输入编码" :disabled = "formType === 'update'"/>
<el-form-item :label="t('FactoryModeling.ProductCategory.dialogCodeLabel')" prop="code">
<el-input v-model="formData.code" :placeholder="t('FactoryModeling.ProductCategory.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('FactoryModeling.ProductCategory.dialogNameLabel')" prop="name">
<el-input v-model="formData.name" :placeholder="t('FactoryModeling.ProductCategory.dialogNamePlaceholder')" />
</el-form-item>
<el-form-item label="排序" prop="sort">
<el-input v-model="formData.sort" placeholder="请输入排序" />
<el-form-item :label="t('FactoryModeling.ProductCategory.dialogSortLabel')" prop="sort">
<el-input v-model="formData.sort" :placeholder="t('FactoryModeling.ProductCategory.dialogSortPlaceholder')" />
</el-form-item>
<el-form-item label="状态" prop="status">
<el-form-item :label="t('FactoryModeling.ProductCategory.dialogStatusLabel')" prop="status">
<el-radio-group v-model="formData.status">
<el-radio
v-for="dict in getIntDictOptions(DICT_TYPE.COMMON_STATUS)"
@ -39,8 +39,8 @@
</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('FactoryModeling.ProductCategory.dialogSubmitButton') }}</el-button>
<el-button @click="dialogVisible = false">{{ t('FactoryModeling.ProductCategory.dialogCancelButton') }}</el-button>
</template>
</Dialog>
</template>
@ -69,11 +69,11 @@ const formData = ref({
status: CommonStatusEnum.ENABLE
})
const formRules = reactive({
parentId: [{ required: true, message: '上级编号不能为空', trigger: 'blur' }],
name: [{ required: true, message: '名称不能为空', trigger: 'blur' }],
code: [{ required: true, message: '编码不能为空', trigger: 'blur' }],
sort: [{ required: true, message: '排序不能为空', trigger: 'blur' }],
status: [{ required: true, message: '状态不能为空', trigger: 'blur' }]
parentId: [{ required: true, message: t('FactoryModeling.ProductCategory.validatorParentRequired'), trigger: 'blur' }],
name: [{ required: true, message: t('FactoryModeling.ProductCategory.validatorNameRequired'), trigger: 'blur' }],
code: [{ required: true, message: t('FactoryModeling.ProductCategory.validatorCodeRequired'), trigger: 'blur' }],
sort: [{ required: true, message: t('FactoryModeling.ProductCategory.validatorSortRequired'), trigger: 'blur' }],
status: [{ required: true, message: t('FactoryModeling.ProductCategory.validatorStatusRequired'), trigger: 'blur' }]
})
const formRef = ref() // Ref
const productCategoryTree = ref() //
@ -138,7 +138,7 @@ const resetForm = () => {
const getProductCategoryTree = async () => {
productCategoryTree.value = []
const data = await ProductCategoryApi.getProductCategoryList()
const root: Tree = { id: 0, name: '顶级产品分类', children: [] }
const root: Tree = { id: 0, name: t('FactoryModeling.ProductCategory.treeRootName'), children: [] }
root.children = handleTree(data, 'id', 'parentId')
productCategoryTree.value.push(root)
}

@ -8,21 +8,21 @@
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="68px"
label-width="120px"
>
<el-form-item :label="t('basedata.product.category.name')" prop="name">
<el-form-item :label="t('FactoryModeling.ProductCategory.searchNameLabel')" prop="name">
<el-input
v-model="queryParams.name"
placeholder="请输入分类名称"
:placeholder="t('FactoryModeling.ProductCategory.searchNamePlaceholder')"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="开启状态" prop="status">
<el-form-item :label="t('FactoryModeling.ProductCategory.searchStatusLabel')" prop="status">
<el-select
v-model="queryParams.status"
placeholder="请选择开启状态"
:placeholder="t('FactoryModeling.ProductCategory.searchStatusPlaceholder')"
clearable
class="!w-240px"
>
@ -35,15 +35,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('FactoryModeling.ProductCategory.searchButtonText') }}</el-button>
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> {{ t('FactoryModeling.ProductCategory.resetButtonText') }}</el-button>
<el-button
type="primary"
plain
@click="openForm('create')"
v-hasPermi="['erp:product-category:create']"
>
<Icon icon="ep:plus" class="mr-5px" /> 新增
<Icon icon="ep:plus" class="mr-5px" /> {{ t('FactoryModeling.ProductCategory.addButtonText') }}
</el-button>
<el-button
type="success"
@ -52,10 +52,10 @@
:loading="exportLoading"
v-hasPermi="['erp:product-category:export']"
>
<Icon icon="ep:download" class="mr-5px" /> 导出
<Icon icon="ep:download" class="mr-5px" /> {{ t('FactoryModeling.ProductCategory.exportButtonText') }}
</el-button>
<el-button type="danger" plain @click="toggleExpandAll">
<Icon icon="ep:sort" class="mr-5px" /> 展开/折叠
<Icon icon="ep:sort" class="mr-5px" /> {{ t('FactoryModeling.ProductCategory.expandButtonText') }}
</el-button>
</el-form-item>
</el-form>
@ -72,22 +72,22 @@
:default-expand-all="isExpandAll"
v-if="refreshTable"
>
<el-table-column label="分类编码" align="center" prop="code" />
<el-table-column label="分类名称" align="center" prop="name" />
<el-table-column label="排序" align="center" prop="sort" />
<el-table-column label="状态" align="center" prop="status">
<el-table-column :label="t('FactoryModeling.ProductCategory.tableCodeColumn')" align="center" prop="code" />
<el-table-column :label="t('FactoryModeling.ProductCategory.tableNameColumn')" align="center" prop="name" />
<el-table-column :label="t('FactoryModeling.ProductCategory.tableSortColumn')" align="center" prop="sort" />
<el-table-column :label="t('FactoryModeling.ProductCategory.tableStatusColumn')" 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="创建时间"
:label="t('FactoryModeling.ProductCategory.tableCreateTimeColumn')"
align="center"
prop="createTime"
:formatter="dateFormatter"
width="180px"
/>
<el-table-column label="操作" align="center">
<el-table-column :label="t('FactoryModeling.ProductCategory.tableOperateColumn')" align="center">
<template #default="scope">
<el-button
link
@ -95,7 +95,7 @@
@click="openForm('update', scope.row.id)"
v-hasPermi="['erp:product-category:update']"
>
编辑
{{ t('FactoryModeling.ProductCategory.tableEditAction') }}
</el-button>
<el-button
link
@ -103,7 +103,7 @@
@click="handleDelete(scope.row.id)"
v-hasPermi="['erp:product-category:delete']"
>
删除
{{ t('FactoryModeling.ProductCategory.tableDeleteAction') }}
</el-button>
</template>
</el-table-column>

@ -5,36 +5,36 @@
ref="formRef"
:model="formData"
:rules="formRules"
label-width="100px"
label-width="120px"
v-loading="formLoading"
>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="编码" prop="barCode">
<el-input v-model="formData.barCode" placeholder="请输入编码" :disabled = "formType === 'update'"/>
<el-form-item :label="t('FactoryModeling.ProductInformation.dialogBarCodeLabel')" prop="barCode">
<el-input v-model="formData.barCode" :placeholder="t('FactoryModeling.ProductInformation.dialogBarCodePlaceholder')" :disabled = "formType === 'update'"/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="名称" prop="name">
<el-input v-model="formData.name" placeholder="请输入名称" />
<el-form-item :label="t('FactoryModeling.ProductInformation.dialogNameLabel')" prop="name">
<el-input v-model="formData.name" :placeholder="t('FactoryModeling.ProductInformation.dialogNamePlaceholder')" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="分类" prop="categoryId">
<el-form-item :label="t('FactoryModeling.ProductInformation.dialogCategoryLabel')" prop="categoryId">
<el-tree-select
v-model="formData.categoryId"
:data="categoryList"
:props="defaultProps"
check-strictly
default-expand-all
placeholder="请选择分类"
:placeholder="t('FactoryModeling.ProductInformation.dialogCategoryPlaceholder')"
class="w-1/1"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="单位" prop="unitId">
<el-select v-model="formData.unitId" clearable placeholder="请选择单位" class="w-1/1">
<el-form-item :label="t('FactoryModeling.ProductInformation.dialogUnitLabel')" prop="unitId">
<el-select v-model="formData.unitId" clearable :placeholder="t('FactoryModeling.ProductInformation.dialogUnitPlaceholder')" class="w-1/1">
<el-option
v-for="unit in unitList"
:key="unit.id"
@ -45,15 +45,15 @@
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="规格" prop="standard">
<el-input v-model="formData.standard" placeholder="请输入规格" />
<el-form-item :label="t('FactoryModeling.ProductInformation.dialogStandardLabel')" prop="standard">
<el-input v-model="formData.standard" :placeholder="t('FactoryModeling.ProductInformation.dialogStandardPlaceholder')" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="保质期天数" prop="expiryDay">
<el-form-item :label="t('FactoryModeling.ProductInformation.dialogExpiryDayLabel')" prop="expiryDay">
<el-input-number
v-model="formData.expiryDay"
placeholder="请输入保质期天数"
:placeholder="t('FactoryModeling.ProductInformation.dialogExpiryDayPlaceholder')"
:min="0"
:precision="0"
class="!w-1/1"
@ -61,20 +61,20 @@
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="重量g" prop="weight">
<el-form-item :label="t('FactoryModeling.ProductInformation.dialogWeightLabel')" prop="weight">
<el-input-number
v-model="formData.weight"
placeholder="请输入重量g"
:placeholder="t('FactoryModeling.ProductInformation.dialogWeightPlaceholder')"
:min="0"
class="!w-1/1"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="采购价格" prop="purchasePrice">
<el-form-item :label="t('FactoryModeling.ProductInformation.dialogPurchasePriceLabel')" prop="purchasePrice">
<el-input-number
v-model="formData.purchasePrice"
placeholder="请输入采购价格,单位:元"
:placeholder="t('FactoryModeling.ProductInformation.dialogPurchasePricePlaceholder')"
:min="0"
:precision="2"
class="!w-1/1"
@ -82,10 +82,10 @@
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="销售价格" prop="salePrice">
<el-form-item :label="t('FactoryModeling.ProductInformation.dialogSalePriceLabel')" prop="salePrice">
<el-input-number
v-model="formData.salePrice"
placeholder="请输入销售价格,单位:元"
:placeholder="t('FactoryModeling.ProductInformation.dialogSalePricePlaceholder')"
:min="0"
:precision="2"
class="!w-1/1"
@ -93,10 +93,10 @@
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="最低价格" prop="minPrice">
<el-form-item :label="t('FactoryModeling.ProductInformation.dialogMinPriceLabel')" prop="minPrice">
<el-input-number
v-model="formData.minPrice"
placeholder="请输入最低价格,单位:元"
:placeholder="t('FactoryModeling.ProductInformation.dialogMinPricePlaceholder')"
:min="0"
:precision="2"
class="!w-1/1"
@ -104,7 +104,7 @@
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="状态" prop="status">
<el-form-item :label="t('FactoryModeling.ProductInformation.dialogStatusLabel')" prop="status">
<el-radio-group v-model="formData.status">
<el-radio
v-for="dict in getIntDictOptions(DICT_TYPE.COMMON_STATUS)"
@ -117,15 +117,15 @@
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="备注" prop="remark">
<el-input type="textarea" v-model="formData.remark" placeholder="请输入备注" />
<el-form-item :label="t('FactoryModeling.ProductInformation.dialogRemarkLabel')" prop="remark">
<el-input type="textarea" v-model="formData.remark" :placeholder="t('FactoryModeling.ProductInformation.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('common.ok') }}</el-button>
<el-button @click="dialogVisible = false">{{ t('common.cancel') }}</el-button>
</template>
</Dialog>
</template>
@ -164,11 +164,11 @@ const formData = ref({
safetyNumber: undefined
})
const formRules = reactive({
name: [{ required: true, message: '产品名称不能为空', trigger: 'blur' }],
barCode: [{ required: true, message: '产品条码不能为空', trigger: 'blur' }],
categoryId: [{ required: true, message: '产品分类编号不能为空', trigger: 'blur' }],
unitId: [{ required: true, message: '单位编号不能为空', trigger: 'blur' }],
status: [{ required: true, message: '产品状态不能为空', trigger: 'blur' }]
name: [{ required: true, message: t('FactoryModeling.ProductInformation.validatorNameRequired'), trigger: 'blur' }],
barCode: [{ required: true, message: t('FactoryModeling.ProductInformation.validatorBarCodeRequired'), trigger: 'blur' }],
categoryId: [{ required: true, message: t('FactoryModeling.ProductInformation.validatorCategoryRequired'), trigger: 'blur' }],
unitId: [{ required: true, message: t('FactoryModeling.ProductInformation.validatorUnitRequired'), trigger: 'blur' }],
status: [{ required: true, message: t('FactoryModeling.ProductInformation.validatorStatusRequired'), trigger: 'blur' }]
})
const formRef = ref() // Ref
const categoryList = ref<ProductCategoryVO[]>([]) //

@ -9,27 +9,27 @@
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="68px"
label-width="120px"
>
<el-form-item label="名称" prop="name">
<el-form-item :label="t('FactoryModeling.ProductInformation.searchNameLabel')" prop="name">
<el-input
v-model="queryParams.name"
placeholder="请输入名称"
:placeholder="t('FactoryModeling.ProductInformation.searchNamePlaceholder')"
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('FactoryModeling.ProductInformation.searchButtonText') }}</el-button>
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> {{ t('FactoryModeling.ProductInformation.resetButtonText') }}</el-button>
<el-button
type="primary"
plain
@click="openForm('create')"
v-hasPermi="['erp:product:create']"
>
<Icon icon="ep:plus" class="mr-5px" /> 新增
<Icon icon="ep:plus" class="mr-5px" /> {{ t('FactoryModeling.ProductInformation.addButtonText') }}
</el-button>
<el-button
type="success"
@ -38,7 +38,7 @@
:loading="exportLoading"
v-hasPermi="['erp:product:export']"
>
<Icon icon="ep:download" class="mr-5px" /> 导出
<Icon icon="ep:download" class="mr-5px" /> {{ t('FactoryModeling.ProductInformation.exportButtonText') }}
</el-button>
</el-form-item>
</el-form>
@ -63,24 +63,24 @@
<el-tab-pane label="其他" name="0" /> -->
</el-tabs>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
<el-table-column label="编码" align="center" prop="barCode" />
<el-table-column label="名称" align="left" prop="name" width="220px"/>
<el-table-column label="规格" align="center" prop="standard" />
<el-table-column label="分类" align="center" prop="subCategoryName" />
<el-table-column label="单位" align="center" prop="unitName" />
<el-table-column label="状态" align="center" prop="status">
<el-table-column :label="t('FactoryModeling.ProductInformation.tableBarCodeColumn')" align="center" prop="barCode" />
<el-table-column :label="t('FactoryModeling.ProductInformation.tableNameColumn')" align="left" prop="name" width="220px"/>
<el-table-column :label="t('FactoryModeling.ProductInformation.tableStandardColumn')" align="center" prop="standard" />
<el-table-column :label="t('FactoryModeling.ProductInformation.tableCategoryColumn')" align="center" prop="subCategoryName" />
<el-table-column :label="t('FactoryModeling.ProductInformation.tableUnitColumn')" align="center" prop="unitName" />
<el-table-column :label="t('FactoryModeling.ProductInformation.tableStatusColumn')" 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="创建时间"
:label="t('FactoryModeling.ProductInformation.tableCreateTimeColumn')"
align="center"
prop="createTime"
:formatter="dateFormatter"
width="180px"
/>
<el-table-column label="操作" align="center" width="150px">
<el-table-column :label="t('FactoryModeling.ProductInformation.tableOperateColumn')" align="center" width="150px">
<template #default="scope">
<!-- <el-button-->
<!-- v-if="scope.row.categoryId ===2"-->
@ -96,7 +96,7 @@
@click="openForm('update', scope.row.id)"
v-hasPermi="['erp:product:update']"
>
编辑
{{ t('FactoryModeling.ProductInformation.tableEditAction') }}
</el-button>
<el-button
link
@ -104,7 +104,7 @@
@click="handleDelete(scope.row.id)"
v-hasPermi="['erp:product:delete']"
>
删除
{{ t('FactoryModeling.ProductInformation.tableDeleteAction') }}
</el-button>
</template>
</el-table-column>

@ -4,13 +4,17 @@
ref="formRef"
:model="formData"
:rules="formRules"
label-width="100px"
label-width="120px"
v-loading="formLoading"
>
<el-form-item label="单位名称" prop="name">
<el-input v-model="formData.name" placeholder="请输入单位名称" :disabled = "formType === 'update'"/>
<el-form-item :label="t('FactoryModeling.ProductUnit.dialogNameLabel')" prop="name">
<el-input
v-model="formData.name"
:placeholder="t('FactoryModeling.ProductUnit.dialogNamePlaceholder')"
:disabled="formType === 'update'"
/>
</el-form-item>
<el-form-item label="是否主单位" prop="primaryFlag">
<el-form-item :label="t('FactoryModeling.ProductUnit.dialogPrimaryFlagLabel')" prop="primaryFlag">
<el-radio-group v-model="formData.primaryFlag">
<el-radio
v-for="dict in getStrDictOptions(DICT_TYPE.PRIMARY_FLAG)"
@ -21,25 +25,39 @@
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="关联主单位" v-if="formData.primaryFlag === 'N'" prop="primaryId">
<el-select
v-model="formData.primaryId"
clearable
filterable
placeholder="请选择主单位"
>
<el-option
v-for="item in unitList"
:key="item.id"
:label="item.name"
:value="item.id"
/>
</el-select>
<el-form-item
:label="t('FactoryModeling.ProductUnit.dialogPrimaryUnitLabel')"
v-if="formData.primaryFlag === 'N'"
prop="primaryId"
>
<el-select
v-model="formData.primaryId"
clearable
filterable
:placeholder="t('FactoryModeling.ProductUnit.dialogPrimaryUnitPlaceholder')"
>
<el-option
v-for="item in unitList"
:key="item.id"
:label="item.name"
:value="item.id"
/>
</el-select>
</el-form-item>
<el-form-item label="换算比例" v-if="formData.primaryFlag === 'N'" prop="changeRate">
<el-input-number v-model="formData.changeRate" controls-position="right" :step="0.1" placeholder="请输入换算比例" class="!w-1000px"/>
<el-form-item
:label="t('FactoryModeling.ProductUnit.dialogChangeRateLabel')"
v-if="formData.primaryFlag === 'N'"
prop="changeRate"
>
<el-input-number
v-model="formData.changeRate"
controls-position="right"
:step="0.1"
:placeholder="t('FactoryModeling.ProductUnit.dialogChangeRatePlaceholder')"
class="!w-1000px"
/>
</el-form-item>
<el-form-item label="单位状态" prop="status">
<el-form-item :label="t('FactoryModeling.ProductUnit.dialogStatusLabel')" prop="status">
<el-radio-group v-model="formData.status">
<el-radio
v-for="dict in getIntDictOptions(DICT_TYPE.COMMON_STATUS)"
@ -52,8 +70,12 @@
</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('FactoryModeling.ProductUnit.dialogSubmitButton') }}
</el-button>
<el-button @click="dialogVisible = false">
{{ t('FactoryModeling.ProductUnit.dialogCancelButton') }}
</el-button>
</template>
</Dialog>
</template>
@ -82,9 +104,27 @@ const formData = ref({
changeRate: undefined,
})
const formRules = reactive({
name: [{ required: true, message: '单位名字不能为空', trigger: 'blur' }],
status: [{ required: true, message: '单位状态不能为空', trigger: 'blur' }],
primaryFlag: [{ required: true, message: '是否主单位不能为空', trigger: 'blur' }],
name: [
{
required: true,
message: t('FactoryModeling.ProductUnit.validatorNameRequired'),
trigger: 'blur'
}
],
status: [
{
required: true,
message: t('FactoryModeling.ProductUnit.validatorStatusRequired'),
trigger: 'blur'
}
],
primaryFlag: [
{
required: true,
message: t('FactoryModeling.ProductUnit.validatorPrimaryFlagRequired'),
trigger: 'blur'
}
]
})
const formRef = ref() // Ref

@ -6,21 +6,21 @@
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="68px"
label-width="120px"
>
<el-form-item label="单位名称" prop="name">
<el-form-item :label="t('FactoryModeling.ProductUnit.searchNameLabel')" prop="name">
<el-input
v-model="queryParams.name"
placeholder="请输入单位名称"
:placeholder="t('FactoryModeling.ProductUnit.searchNamePlaceholder')"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="单位状态" prop="status">
<el-form-item :label="t('FactoryModeling.ProductUnit.searchStatusLabel')" prop="status">
<el-select
v-model="queryParams.status"
placeholder="请选择单位状态"
:placeholder="t('FactoryModeling.ProductUnit.searchStatusPlaceholder')"
clearable
class="!w-240px"
>
@ -33,15 +33,22 @@
</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('FactoryModeling.ProductUnit.searchButtonText') }}
</el-button>
<el-button @click="resetQuery">
<Icon icon="ep:refresh" class="mr-5px" />
{{ t('FactoryModeling.ProductUnit.resetButtonText') }}
</el-button>
<el-button
type="primary"
plain
@click="openForm('create')"
v-hasPermi="['erp:product-unit:create']"
>
<Icon icon="ep:plus" class="mr-5px" /> 新增
<Icon icon="ep:plus" class="mr-5px" />
{{ t('FactoryModeling.ProductUnit.addButtonText') }}
</el-button>
<el-button
type="success"
@ -50,7 +57,8 @@
:loading="exportLoading"
v-hasPermi="['erp:product-unit:export']"
>
<Icon icon="ep:download" class="mr-5px" /> 导出
<Icon icon="ep:download" class="mr-5px" />
{{ t('FactoryModeling.ProductUnit.exportButtonText') }}
</el-button>
</el-form-item>
</el-form>
@ -59,23 +67,35 @@
<!-- 列表 -->
<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="primaryFlag" />
<el-table-column
:label="t('FactoryModeling.ProductUnit.tableNameColumn')"
align="center"
prop="name"
/>
<el-table-column
:label="t('FactoryModeling.ProductUnit.tablePrimaryFlagColumn')"
align="center"
prop="primaryFlag"
/>
<!-- <el-table-column label="关联主单位" align="center" prop="primaryId" /> -->
<el-table-column label="与主单位换算比例" align="center" prop="changeRate" />
<el-table-column label="状态" align="center" prop="status">
<el-table-column
:label="t('FactoryModeling.ProductUnit.tableChangeRateColumn')"
align="center"
prop="changeRate"
/>
<el-table-column :label="t('FactoryModeling.ProductUnit.tableStatusColumn')" 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="创建时间"
:label="t('FactoryModeling.ProductUnit.tableCreateTimeColumn')"
align="center"
prop="createTime"
:formatter="dateFormatter"
width="180px"
/>
<el-table-column label="操作" align="center">
<el-table-column :label="t('FactoryModeling.ProductUnit.tableOperateColumn')" align="center">
<template #default="scope">
<el-button
link
@ -83,7 +103,7 @@
@click="openForm('update', scope.row.id)"
v-hasPermi="['erp:product-unit:update']"
>
编辑
{{ t('FactoryModeling.ProductUnit.tableEditAction') }}
</el-button>
<el-button
link
@ -91,7 +111,7 @@
@click="handleDelete(scope.row.id)"
v-hasPermi="['erp:product-unit:delete']"
>
删除
{{ t('FactoryModeling.ProductUnit.tableDeleteAction') }}
</el-button>
</template>
</el-table-column>

@ -4,21 +4,21 @@
ref="formRef"
:model="formData"
:rules="formRules"
label-width="100px"
label-width="120px"
v-loading="formLoading"
>
<el-form-item label="BOM编码" prop="code">
<el-input v-model="formData.code" placeholder="请输入BOM编码" :disabled = "formType === 'update'"/>
<el-form-item :label="t('FactoryModeling.ProductBOM.dialogCodeLabel')" prop="code">
<el-input v-model="formData.code" :placeholder="t('FactoryModeling.ProductBOM.dialogCodePlaceholder')" :disabled = "formType === 'update'"/>
</el-form-item>
<el-form-item label="BOM版本" prop="version">
<el-input v-model="formData.version" placeholder="请输入BOM版本" />
<el-form-item :label="t('FactoryModeling.ProductBOM.dialogVersionLabel')" prop="version">
<el-input v-model="formData.version" :placeholder="t('FactoryModeling.ProductBOM.dialogVersionPlaceholder')" />
</el-form-item>
<el-form-item label="产品" prop="productId">
<el-form-item :label="t('FactoryModeling.ProductBOM.dialogProductLabel')" prop="productId">
<el-select
v-model="formData.productId"
clearable
filterable
placeholder="请选择产品"
:placeholder="t('FactoryModeling.ProductBOM.dialogProductPlaceholder')"
class="!w-1/1"
>
<el-option
@ -29,8 +29,8 @@
/>
</el-select>
</el-form-item>
<el-form-item label="单位" prop="unitId">
<el-select v-model="formData.unitId" clearable placeholder="请选择单位" class="w-1/1">
<el-form-item :label="t('FactoryModeling.ProductBOM.dialogUnitLabel')" prop="unitId">
<el-select v-model="formData.unitId" clearable :placeholder="t('FactoryModeling.ProductBOM.dialogUnitPlaceholder')" class="w-1/1">
<el-option
v-for="unit in unitList"
:key="unit.id"
@ -39,20 +39,20 @@
/>
</el-select>
</el-form-item>
<el-form-item label="成品率%" prop="yieldRate">
<el-form-item :label="t('FactoryModeling.ProductBOM.dialogYieldRateLabel')" prop="yieldRate">
<el-input-number
v-model="formData.yieldRate"
:min="0"
:max="100"
:precision="2"
class="!w-1/1"
placeholder="请输入成品率"
:placeholder="t('FactoryModeling.ProductBOM.dialogYieldRatePlaceholder')"
/>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="formData.remark" placeholder="请输入备注" />
<el-form-item :label="t('FactoryModeling.ProductBOM.dialogRemarkLabel')" prop="remark">
<el-input v-model="formData.remark" :placeholder="t('FactoryModeling.ProductBOM.dialogRemarkPlaceholder')" />
</el-form-item>
<el-form-item label="是否启用" prop="isEnable">
<el-form-item :label="t('FactoryModeling.ProductBOM.dialogEnableLabel')" prop="isEnable">
<el-radio-group v-model="formData.isEnable">
<el-radio
v-for="dict in getBoolDictOptions(DICT_TYPE.INFRA_BOOLEAN_STRING)"
@ -66,13 +66,13 @@
</el-form>
<!-- 子表的表单 -->
<el-tabs v-model="subTabsName">
<el-tab-pane label="产品BOM明细" name="bomDetail">
<el-tab-pane :label="t('FactoryModeling.ProductBOM.detailTabLabel')" name="bomDetail">
<BomDetailForm ref="bomDetailFormRef" :bom-id="formData.id" />
</el-tab-pane>
</el-tabs>
<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('common.ok') }}</el-button>
<el-button @click="dialogVisible = false">{{ t('common.cancel') }}</el-button>
</template>
</Dialog>
</template>
@ -107,11 +107,11 @@ const formData = ref({
isEnable: undefined
})
const formRules = reactive({
code: [{ required: true, message: 'BOM编码不能为空', trigger: 'blur' }],
version: [{ required: true, message: 'BOM版本不能为空', trigger: 'blur' }],
productId: [{ required: true, message: '产品不能为空', trigger: 'blur' }],
unitId: [{ required: true, message: '单位不能为空', trigger: 'blur' }],
isEnable: [{ required: true, message: '是否启用不能为空', trigger: 'blur' }]
code: [{ required: true, message: t('FactoryModeling.ProductBOM.validatorCodeRequired'), trigger: 'blur' }],
version: [{ required: true, message: t('FactoryModeling.ProductBOM.validatorVersionRequired'), trigger: 'blur' }],
productId: [{ required: true, message: t('FactoryModeling.ProductBOM.validatorProductRequired'), trigger: 'blur' }],
unitId: [{ required: true, message: t('FactoryModeling.ProductBOM.validatorUnitRequired'), trigger: 'blur' }],
isEnable: [{ required: true, message: t('FactoryModeling.ProductBOM.validatorEnableRequired'), trigger: 'blur' }]
})
const formRef = ref() // Ref

@ -8,15 +8,15 @@
:inline-message="true"
>
<el-table :data="formData" class="-mt-10px">
<el-table-column label="序号" type="index" width="100" />
<el-table-column label="原料" min-width="150">
<el-table-column :label="t('FactoryModeling.ProductBOM.detailTableIndexColumn')" type="index" width="100" />
<el-table-column :label="t('FactoryModeling.ProductBOM.detailTableMaterialColumn')" min-width="150">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.productId`" :rules="formRules.productId" class="mb-0px!">
<el-select
v-model="row.productId"
clearable
filterable
placeholder="请选择原料"
:placeholder="t('FactoryModeling.ProductBOM.detailMaterialPlaceholder')"
>
<el-option
v-for="item in productList"
@ -28,10 +28,10 @@
</el-form-item>
</template>
</el-table-column>
<el-table-column label="单位" min-width="150">
<el-table-column :label="t('FactoryModeling.ProductBOM.detailTableUnitColumn')" min-width="150">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.unitId`" :rules="formRules.unitId" class="mb-0px!">
<el-select v-model="row.unitId" clearable filterable placeholder="请选择单位" class="w-1/1">
<el-select v-model="row.unitId" clearable filterable :placeholder="t('FactoryModeling.ProductBOM.detailUnitPlaceholder')" class="w-1/1">
<el-option
v-for="unit in unitList"
:key="unit.id"
@ -43,15 +43,15 @@
</template>
</el-table-column>
<el-table-column label="用量" min-width="150">
<el-table-column :label="t('FactoryModeling.ProductBOM.detailTableUsageNumberColumn')" min-width="150">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.usageNumber`" :rules="formRules.usageNumber" class="mb-0px!">
<el-input-number v-model="row.usageNumber" :min="0" :precision="2" class="!w-1/1" placeholder="请输入用量"
<el-input-number v-model="row.usageNumber" :min="0" :precision="2" class="!w-1/1" :placeholder="t('FactoryModeling.ProductBOM.detailUsageNumberPlaceholder')"
/>
</el-form-item>
</template>
</el-table-column>
<el-table-column label="损耗率%" min-width="150">
<el-table-column :label="t('FactoryModeling.ProductBOM.detailTableLossRateColumn')" min-width="150">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.yieldRate`" :rules="formRules.yieldRate" class="mb-0px!">
<el-input-number
@ -59,19 +59,19 @@
:min="0"
:precision="2"
class="!w-1/1"
placeholder="请输入损耗率"
:placeholder="t('FactoryModeling.ProductBOM.detailLossRatePlaceholder')"
/>
</el-form-item>
</template>
</el-table-column>
<el-table-column label="备注" min-width="150">
<el-table-column :label="t('FactoryModeling.ProductBOM.detailTableRemarkColumn')" min-width="150">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.remark`" :rules="formRules.remark" class="mb-0px!">
<el-input v-model="row.remark" placeholder="请输入备注" />
<el-input v-model="row.remark" :placeholder="t('FactoryModeling.ProductBOM.detailRemarkPlaceholder')" />
</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('FactoryModeling.ProductBOM.detailTableOperateColumn')" width="60">
<template #default="{ $index }">
<el-button type="danger" @click="handleDelete($index)" link>
<Icon icon="ep:delete" />
@ -81,14 +81,16 @@
</el-table>
</el-form>
<el-row justify="center" class="mt-3">
<el-button @click="handleAdd" round>+ 添加产品BOM明细</el-button>
<el-button @click="handleAdd" round>+ {{ t('FactoryModeling.ProductBOM.detailAddButtonText') }}</el-button>
</el-row>
</template>
<script setup lang="ts">
import { BomApi } from '@/api/mes/bom'
import { ProductUnitApi, ProductUnitVO } from '@/api/erp/product/unit'
import {ProductApi, ProductVO} from "@/api/erp/product/product";
import { ProductApi, ProductVO } from '@/api/erp/product/product'
import { BomApi } from '@/api/mes/bom'
const { t } = useI18n()
const unitList = ref<ProductUnitVO[]>([]) //
const productList = ref<ProductVO[]>([]) //
@ -98,9 +100,9 @@ const props = defineProps<{
const formLoading = ref(false) //
const formData = ref([])
const formRules = reactive({
productId: [{ required: true, message: '原料不能为空', trigger: 'blur' }],
bomId: [{ required: true, message: 'BOM 不能为空', trigger: 'blur' }],
usageNumber: [{ required: true, message: '用量不能为空', trigger: 'blur' }]
productId: [{ required: true, message: t('FactoryModeling.ProductBOM.validatorDetailMaterialRequired'), trigger: 'blur' }],
bomId: [{ required: true, message: t('FactoryModeling.ProductBOM.validatorDetailBomRequired'), trigger: 'blur' }],
usageNumber: [{ required: true, message: t('FactoryModeling.ProductBOM.validatorDetailUsageNumberRequired'), trigger: 'blur' }]
})
const formRef = ref() // Ref

@ -3,11 +3,11 @@
<ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
<!-- <el-table-column label="ID" align="center" prop="id" />-->
<el-table-column label="原料" align="center" prop="productName" />
<el-table-column label="用量" align="center" prop="usageNumber" />
<el-table-column label="单位" align="center" prop="unitName" />
<el-table-column label="损耗率%" align="center" prop="yieldRate" />
<el-table-column label="备注" align="center" prop="remark" />
<el-table-column :label="t('FactoryModeling.ProductBOM.detailTableMaterialColumn')" align="center" prop="productName" />
<el-table-column :label="t('FactoryModeling.ProductBOM.detailTableUsageNumberColumn')" align="center" prop="usageNumber" />
<el-table-column :label="t('FactoryModeling.ProductBOM.detailTableUnitColumn')" align="center" prop="unitName" />
<el-table-column :label="t('FactoryModeling.ProductBOM.detailTableLossRateColumn')" align="center" prop="yieldRate" />
<el-table-column :label="t('FactoryModeling.ProductBOM.detailTableRemarkColumn')" align="center" prop="remark" />
</el-table>
</ContentWrap>

@ -6,20 +6,19 @@
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="80px"
label-width="120px"
>
<el-form-item label="BOM编码" prop="code">
<el-form-item :label="t('FactoryModeling.ProductBOM.searchCodeLabel')" prop="code">
<el-input
v-model="queryParams.code"
placeholder="请输入BOM编码"
:placeholder="t('FactoryModeling.ProductBOM.searchCodePlaceholder')"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="产品" prop="productId">
<el-select v-model="queryParams.productId" @change="handleQuery" clearable filterable placeholder="请选择产品" class="!w-240px">
<el-form-item :label="t('FactoryModeling.ProductBOM.searchProductLabel')" prop="productId">
<el-select v-model="queryParams.productId" @change="handleQuery" clearable filterable :placeholder="t('FactoryModeling.ProductBOM.searchProductPlaceholder')" class="!w-240px">
<el-option
v-for="item in productList"
:key="item.id"
@ -29,19 +28,19 @@
</el-select>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-form-item :label="t('FactoryModeling.ProductBOM.searchRemarkLabel')" prop="remark">
<el-input
v-model="queryParams.remark"
placeholder="请输入备注"
:placeholder="t('FactoryModeling.ProductBOM.searchRemarkPlaceholder')"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="开启状态" prop="isEnable">
<el-form-item :label="t('FactoryModeling.ProductBOM.searchEnableLabel')" prop="isEnable">
<el-select
v-model="queryParams.isEnable"
placeholder="请选择是否启用"
:placeholder="t('FactoryModeling.ProductBOM.searchEnablePlaceholder')"
clearable
@change="handleQuery"
class="!w-240px"
@ -56,15 +55,15 @@
</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('FactoryModeling.ProductBOM.searchButtonText') }}</el-button>
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> {{ t('FactoryModeling.ProductBOM.resetButtonText') }}</el-button>
<el-button
type="primary"
plain
@click="openForm('create')"
v-hasPermi="['mes:bom:create']"
>
<Icon icon="ep:plus" class="mr-5px" /> 新增
<Icon icon="ep:plus" class="mr-5px" /> {{ t('FactoryModeling.ProductBOM.addButtonText') }}
</el-button>
<el-button
type="success"
@ -73,7 +72,7 @@
:loading="exportLoading"
v-hasPermi="['mes:bom:export']"
>
<Icon icon="ep:download" class="mr-5px" /> 导出
<Icon icon="ep:download" class="mr-5px" /> {{ t('FactoryModeling.ProductBOM.exportButtonText') }}
</el-button>
</el-form-item>
</el-form>
@ -86,32 +85,32 @@
<el-table-column type="expand">
<template #default="scope">
<el-tabs model-value="bomDetail">
<el-tab-pane label="产品BOM明细" name="bomDetail">
<el-tab-pane :label="t('FactoryModeling.ProductBOM.detailTabLabel')" name="bomDetail">
<BomDetailList :bom-id="scope.row.id" />
</el-tab-pane>
</el-tabs>
</template>
</el-table-column>
<!-- <el-table-column label="ID" align="center" prop="id" /> -->
<el-table-column label="BOM编码" align="center" prop="code" />
<el-table-column label="BOM版本" align="center" prop="version" />
<el-table-column label="产品" align="center" prop="productName" />
<el-table-column label="单位" align="center" prop="unitName" />
<el-table-column label="成品率%" align="center" prop="yieldRate" />
<el-table-column label="备注" align="center" prop="remark" />
<el-table-column label="是否启用" align="center" prop="isEnable">
<el-table-column :label="t('FactoryModeling.ProductBOM.tableCodeColumn')" align="center" prop="code" />
<el-table-column :label="t('FactoryModeling.ProductBOM.tableVersionColumn')" align="center" prop="version" />
<el-table-column :label="t('FactoryModeling.ProductBOM.tableProductColumn')" align="center" prop="productName" />
<el-table-column :label="t('FactoryModeling.ProductBOM.tableUnitColumn')" align="center" prop="unitName" />
<el-table-column :label="t('FactoryModeling.ProductBOM.tableYieldRateColumn')" align="center" prop="yieldRate" />
<el-table-column :label="t('FactoryModeling.ProductBOM.tableRemarkColumn')" align="center" prop="remark" />
<el-table-column :label="t('FactoryModeling.ProductBOM.tableEnableColumn')" 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="创建时间"
:label="t('FactoryModeling.ProductBOM.tableCreateTimeColumn')"
align="center"
prop="createTime"
:formatter="dateFormatter"
width="180px"
/>
<el-table-column label="操作" align="center" fixed="right" width="150">
<el-table-column :label="t('FactoryModeling.ProductBOM.tableOperateColumn')" align="center" fixed="right" width="150">
<template #default="scope">
<el-button
link
@ -119,7 +118,7 @@
@click="openForm('update', scope.row.id)"
v-hasPermi="['mes:bom:update']"
>
编辑
{{ t('FactoryModeling.ProductBOM.tableEditAction') }}
</el-button>
<el-button
link
@ -127,7 +126,7 @@
@click="handleDelete(scope.row.id)"
v-hasPermi="['mes:bom:delete']"
>
删除
{{ t('FactoryModeling.ProductBOM.tableDeleteAction') }}
</el-button>
</template>
</el-table-column>

@ -4,24 +4,24 @@
ref="formRef"
:model="formData"
:rules="formRules"
label-width="100px"
label-width="120px"
v-loading="formLoading"
>
<el-form-item prop="code">
<template #label>
<span>
编码
<el-tooltip content="厂区结构编码" placement="top">
{{ t('FactoryModeling.FactoryStructure.dialogCodeLabel') }}
<el-tooltip :content="t('FactoryModeling.FactoryStructure.dialogCodeTooltip')" 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.code"
placeholder="编码保存后自动生成"
<el-input
:disabled="formData.isCode == true || formType === 'update'"
v-model="formData.code"
:placeholder="t('FactoryModeling.FactoryStructure.dialogCodePlaceholder')"
/>
</el-col>
<el-col :xs="24" :sm="6" :md="4" :lg="3" :xl="2">
@ -35,20 +35,20 @@
</el-row>
</el-form-item>
<el-form-item label="父组织" prop="parentId">
<el-form-item :label="t('FactoryModeling.FactoryStructure.dialogParentLabel')" prop="parentId">
<el-tree-select
v-model="formData.parentId"
:data="organizationTree"
:props="defaultProps"
check-strictly
default-expand-all
placeholder="请选择父组织"
:placeholder="t('FactoryModeling.FactoryStructure.dialogParentPlaceholder')"
/>
</el-form-item>
<el-form-item label="组织名称" prop="name">
<el-input v-model="formData.name" placeholder="请输入组织名称" />
<el-form-item :label="t('FactoryModeling.FactoryStructure.dialogNameLabel')" prop="name">
<el-input v-model="formData.name" :placeholder="t('FactoryModeling.FactoryStructure.dialogNamePlaceholder')" />
</el-form-item>
<el-form-item label="组织等级" prop="orgClass">
<el-form-item :label="t('FactoryModeling.FactoryStructure.dialogOrgClassLabel')" prop="orgClass">
<el-radio-group v-model="formData.orgClass">
<el-radio
v-for="dict in getStrDictOptions(DICT_TYPE.MES_ORG_CLASS)"
@ -59,27 +59,27 @@
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item prop="sort">
<el-form-item prop="sort">
<template #label>
<span>
显示顺序
<el-tooltip content="同父级按照显示顺序从小到大排序" placement="top">
{{ t('FactoryModeling.FactoryStructure.dialogSortLabel') }}
<el-tooltip :content="t('FactoryModeling.FactoryStructure.dialogSortTooltip')" placement="top">
<Icon icon="ep:question-filled" />
</el-tooltip>
</span>
</template>
<el-input v-model="formData.sort" placeholder="请输入显示顺序" />
<el-input v-model="formData.sort" :placeholder="t('FactoryModeling.FactoryStructure.dialogSortPlaceholder')" />
</el-form-item>
<el-form-item v-if="formData.orgClass == 'workplace' || formData.orgClass == 'process'" prop="orgType">
<template #label>
<span>
工序
<el-tooltip content="来源:数据字典-工序" placement="top">
{{ t('FactoryModeling.FactoryStructure.dialogOrgTypeLabel') }}
<el-tooltip :content="t('FactoryModeling.FactoryStructure.dialogOrgTypeTooltip')" placement="top">
<Icon icon="ep:question-filled" />
</el-tooltip>
</span>
</template>
<el-select v-model="formData.orgType" @change="handleOrgTypeChange" placeholder="请选择类型">
<el-select v-model="formData.orgType" @change="handleOrgTypeChange" :placeholder="t('FactoryModeling.FactoryStructure.dialogOrgTypePlaceholder')">
<el-option
v-for="dict in getStrDictOptions(DICT_TYPE.MES_ORG_TYPE)"
:key="dict.value"
@ -88,7 +88,7 @@
/>
</el-select>
</el-form-item>
<el-form-item label="关联设备" v-if="formData.orgClass == 'workplace'" prop="machineId">
<el-form-item :label="t('FactoryModeling.FactoryStructure.dialogMachineLabel')" v-if="formData.orgClass == 'workplace'" prop="machineId">
<!-- <el-tree-select
v-model="formData.machineId"
:data="machineComponentTree"
@ -97,7 +97,7 @@
default-expand-all
placeholder="请选择机台"
/> -->
<el-select v-model="formData.machineId" placeholder="请选择设备">
<el-select v-model="formData.machineId" :placeholder="t('FactoryModeling.FactoryStructure.dialogMachinePlaceholder')">
<el-option
v-for="item in deviceList"
:key="item.id"
@ -119,8 +119,8 @@
</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('FactoryModeling.FactoryStructure.dialogSubmitButton') }}</el-button>
<el-button @click="dialogVisible = false">{{ t('FactoryModeling.FactoryStructure.dialogCancelButton') }}</el-button>
</template>
</Dialog>
</template>
@ -163,9 +163,9 @@ const formData = ref({
isCode: undefined
})
const formRules = reactive({
name: [{ required: true, message: '组织名称不能为空', trigger: 'blur' }],
parentId: [{ required: true, message: '父组织不能为空', trigger: 'blur' }],
orgClass: [{ required: true, message: '组织等级不能为空', trigger: 'blur' }]
name: [{ required: true, message: t('FactoryModeling.FactoryStructure.validatorNameRequired'), trigger: 'blur' }],
parentId: [{ required: true, message: t('FactoryModeling.FactoryStructure.validatorParentRequired'), trigger: 'blur' }],
orgClass: [{ required: true, message: t('FactoryModeling.FactoryStructure.validatorOrgClassRequired'), trigger: 'blur' }]
})
const formRef = ref() // Ref
const organizationTree = ref() //
@ -239,7 +239,7 @@ const resetForm = () => {
const getOrganizationTree = async () => {
organizationTree.value = []
const data = await OrganizationApi.getOrganizationList()
const root: Tree = { id: 0, name: '顶级组织', children: [] }
const root: Tree = { id: 0, name: t('FactoryModeling.FactoryStructure.orgTreeRootName'), children: [] }
root.children = handleTree(data, 'id', 'parentId')
organizationTree.value.push(root)
}

@ -6,27 +6,27 @@
:inline="true"
:model="queryParams"
class="-mb-15px"
label-width="68px"
label-width="120px"
>
<el-row>
<el-col :span="5">
<el-form-item label="组织名称" prop="name">
<el-form-item :label="t('FactoryModeling.FactoryWorker.searchNameLabel')" prop="name">
<el-input
v-model="queryParams.name"
class="!w-240px"
clearable
placeholder="请输入组织名称"
:placeholder="t('FactoryModeling.FactoryWorker.searchNamePlaceholder')"
@keyup.enter="handleQuery"
/>
</el-form-item>
</el-col>
<el-col :span="5">
<el-form-item label="组织状态" prop="status">
<el-form-item :label="t('FactoryModeling.FactoryWorker.searchStatusLabel')" prop="status">
<el-select
v-model="queryParams.status"
class="!w-240px"
clearable
placeholder="请选择组织状态"
:placeholder="t('FactoryModeling.FactoryWorker.searchStatusPlaceholder')"
>
<el-option
v-for="dict in getStrDictOptions(DICT_TYPE.MES_ORG_STATUS)"
@ -39,8 +39,8 @@
</el-col>
<el-col :span="9">
<el-form-item>
<el-button @click="handleQuery"><Icon class="mr-5px" icon="ep:search" /> 搜索</el-button>
<el-button @click="resetQuery"><Icon class="mr-5px" icon="ep:refresh" /> 重置</el-button>
<el-button @click="handleQuery"><Icon class="mr-5px" icon="ep:search" /> {{ t('FactoryModeling.FactoryWorker.searchButtonText') }}</el-button>
<el-button @click="resetQuery"><Icon class="mr-5px" icon="ep:refresh" /> {{ t('FactoryModeling.FactoryWorker.resetButtonText') }}</el-button>
<el-button
v-hasPermi="['mes:organization:export']"
:loading="exportLoading"
@ -48,10 +48,10 @@
type="success"
@click="handleExport"
>
<Icon class="mr-5px" icon="ep:download" /> 导出
<Icon class="mr-5px" icon="ep:download" /> {{ t('FactoryModeling.FactoryWorker.exportButtonText') }}
</el-button>
<el-button plain type="danger" @click="toggleExpandAll">
<Icon class="mr-5px" icon="ep:sort" /> 展开/折叠
<Icon class="mr-5px" icon="ep:sort" /> {{ t('FactoryModeling.FactoryWorker.expandButtonText') }}
</el-button>
</el-form-item>
</el-col>
@ -62,19 +62,19 @@
<!-- 列表 -->
<el-tabs v-model="activeName" @tab-click="handleTabClick">
<el-tab-pane label="制浆" name="zhijiang" />
<el-tab-pane label="成型" name="chengxing" />
<el-tab-pane label="烘干" name="honggan" />
<el-tab-pane label="转移" name="zhuanyi" />
<el-tab-pane label="加湿" name="jiashi" />
<el-tab-pane label="热压" name="reya" />
<el-tab-pane label="切边" name="qiebian" />
<el-tab-pane label="品检" name="pinjian" />
<el-tab-pane label="打包" name="dabao" />
<el-tab-pane label="贴标" name="tiebiao" />
<el-tab-pane label="品印" name="pinyin" />
<el-tab-pane label="塑封" name="sufeng" />
<el-tab-pane label="所有" name="" />
<el-tab-pane :label="t('FactoryModeling.FactoryWorker.tabsZhijiang')" name="zhijiang" />
<el-tab-pane :label="t('FactoryModeling.FactoryWorker.tabsChengxing')" name="chengxing" />
<el-tab-pane :label="t('FactoryModeling.FactoryWorker.tabsHonggan')" name="honggan" />
<el-tab-pane :label="t('FactoryModeling.FactoryWorker.tabsZhuanyi')" name="zhuanyi" />
<el-tab-pane :label="t('FactoryModeling.FactoryWorker.tabsJiashi')" name="jiashi" />
<el-tab-pane :label="t('FactoryModeling.FactoryWorker.tabsReya')" name="reya" />
<el-tab-pane :label="t('FactoryModeling.FactoryWorker.tabsQiebian')" name="qiebian" />
<el-tab-pane :label="t('FactoryModeling.FactoryWorker.tabsPanjian')" name="pinjian" />
<el-tab-pane :label="t('FactoryModeling.FactoryWorker.tabsDabao')" name="dabao" />
<el-tab-pane :label="t('FactoryModeling.FactoryWorker.tabsTiebiao')" name="tiebiao" />
<el-tab-pane :label="t('FactoryModeling.FactoryWorker.tabsPinyin')" name="pinyin" />
<el-tab-pane :label="t('FactoryModeling.FactoryWorker.tabsSufeng')" name="sufeng" />
<el-tab-pane :label="t('FactoryModeling.FactoryWorker.tabsAll')" name="" />
</el-tabs>
<el-row>
@ -91,20 +91,20 @@
highlight-current-row
@current-change="handleCurrentChange"
>
<el-table-column align="center" label="组织名称" prop="name" width="200px"/>
<el-table-column align="center" :label="t('FactoryModeling.FactoryWorker.tableNameColumn')" prop="name" width="200px"/>
<el-table-column align="center" label="组织等级" prop="orgClass">
<el-table-column align="center" :label="t('FactoryModeling.FactoryWorker.tableOrgClassColumn')" prop="orgClass">
<template #default="scope">
<dict-tag v-if="notEmpty(scope.row.orgClass)" :type="DICT_TYPE.MES_ORG_CLASS" :value="scope.row.orgClass" />
</template>
</el-table-column>
<el-table-column align="center" label="类型" >
<el-table-column align="center" :label="t('FactoryModeling.FactoryWorker.tableOrgTypeColumn')" >
<template #default="scope">
<dict-tag v-if="notEmpty(scope.row.orgType)" :type="DICT_TYPE.MES_ORG_TYPE" :value="scope.row.orgType" />
</template>
</el-table-column>
<el-table-column align="center" label="今日工人" prop="workerUserName" />
<el-table-column align="center" fixed="right" label="操作" width="80">
<el-table-column align="center" :label="t('FactoryModeling.FactoryWorker.tableWorkerColumn')" prop="workerUserName" />
<el-table-column align="center" fixed="right" :label="t('FactoryModeling.FactoryWorker.tableOperateColumn')" width="80">
<template #default="scope">
<el-button
v-if="scope.row.orgClass=='workplace' && scope.row.status=='free'"
@ -113,7 +113,7 @@
type="warning"
@click="openForm(scope.row.orgType, scope.row.id,scope.row.name, scope.row.workerUserName)"
>
派工
{{ t('FactoryModeling.FactoryWorker.tableDispatchAction') }}
</el-button>
</template>
</el-table-column>

@ -6,18 +6,18 @@
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="68px"
min-label-width="68px"
>
<el-form-item label="组织编码" prop="code">
<el-form-item :label="t('FactoryModeling.FactoryStructure.searchCodeLabel')" prop="code">
<el-input
v-model="queryParams.code"
placeholder="请输入组织编码"
:placeholder="t('FactoryModeling.FactoryStructure.searchCodePlaceholder')"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="父组织" prop="parentId">
<el-form-item :label="t('FactoryModeling.FactoryStructure.searchParentLabel')" prop="parentId">
<el-tree-select
v-model="queryParams.parentId"
:data="organizationTree"
@ -26,14 +26,14 @@
@select="handleQuery"
clearable
default-expand-all
placeholder="请选择父组织"
:placeholder="t('FactoryModeling.FactoryStructure.searchParentPlaceholder')"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="组织名称" prop="name">
<el-form-item :label="t('FactoryModeling.FactoryStructure.searchNameLabel')" prop="name">
<el-input
v-model="queryParams.name"
placeholder="请输入组织名称"
:placeholder="t('FactoryModeling.FactoryStructure.searchNamePlaceholder')"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
@ -54,10 +54,10 @@
/>
</el-select>
</el-form-item> -->
<el-form-item label="组织等级" prop="orgClass">
<el-form-item :label="t('FactoryModeling.FactoryStructure.searchOrgClassLabel')" prop="orgClass">
<el-select
v-model="queryParams.orgClass"
placeholder="请选择组织等级"
:placeholder="t('FactoryModeling.FactoryStructure.searchOrgClassPlaceholder')"
clearable
class="!w-240px"
>
@ -71,15 +71,15 @@
</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('FactoryModeling.FactoryStructure.searchButtonText') }}</el-button>
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> {{ t('FactoryModeling.FactoryStructure.resetButtonText') }}</el-button>
<el-button
type="primary"
plain
@click="openForm('create')"
v-hasPermi="['mes:organization:create']"
>
<Icon icon="ep:plus" class="mr-5px" /> 新增
<Icon icon="ep:plus" class="mr-5px" /> {{ t('FactoryModeling.FactoryStructure.addButtonText') }}
</el-button>
<el-button
type="success"
@ -88,10 +88,10 @@
:loading="exportLoading"
v-hasPermi="['mes:organization:export']"
>
<Icon icon="ep:download" class="mr-5px" /> 导出
<Icon icon="ep:download" class="mr-5px" /> {{ t('FactoryModeling.FactoryStructure.exportButtonText') }}
</el-button>
<el-button type="danger" plain @click="toggleExpandAll">
<Icon icon="ep:sort" class="mr-5px" /> 展开/折叠
<Icon icon="ep:sort" class="mr-5px" /> {{ t('FactoryModeling.FactoryStructure.expandButtonText') }}
</el-button>
</el-form-item>
</el-form>
@ -123,35 +123,35 @@
:default-expand-all="isExpandAll"
v-if="refreshTable"
>
<el-table-column label="组织编码" align="center" prop="code" />
<el-table-column label="组织名称" align="center" prop="name" />
<el-table-column label="显示顺序" align="center" prop="sort" />
<el-table-column :label="t('FactoryModeling.FactoryStructure.tableCodeColumn')" align="center" prop="code" />
<el-table-column :label="t('FactoryModeling.FactoryStructure.tableNameColumn')" align="center" prop="name" />
<el-table-column :label="t('FactoryModeling.FactoryStructure.tableSortColumn')" align="center" prop="sort" />
<!-- <el-table-column label="负责人" align="center" prop="workerUserId" />-->
<el-table-column label="关联设备" align="center" prop="machineName" />
<el-table-column :label="t('FactoryModeling.FactoryStructure.tableMachineColumn')" align="center" prop="machineName" />
<!-- <el-table-column label="组织状态" align="center" prop="status">
<template #default="scope">
<dict-tag :type="DICT_TYPE.MES_ORG_STATUS" :value="scope.row.status" />
</template>
</el-table-column> -->
<el-table-column label="组织等级" align="center" prop="orgClass">
<el-table-column :label="t('FactoryModeling.FactoryStructure.tableOrgClassColumn')" align="center" prop="orgClass">
<template #default="scope">
<dict-tag :type="DICT_TYPE.MES_ORG_CLASS" :value="scope.row.orgClass" />
</template>
</el-table-column>
<el-table-column label="工序" align="center" prop="orgType">
<el-table-column :label="t('FactoryModeling.FactoryStructure.tableOrgTypeColumn')" align="center" prop="orgType">
<template #default="scope">
<dict-tag :type="DICT_TYPE.MES_ORG_TYPE" :value="scope.row.orgType" />
</template>
</el-table-column>
<el-table-column
label="创建时间"
:label="t('FactoryModeling.FactoryStructure.tableCreateTimeColumn')"
align="center"
prop="createTime"
:formatter="dateFormatter"
width="180px"
/>
<el-table-column label="操作" align="center" fixed="right" width="150">
<el-table-column :label="t('FactoryModeling.FactoryStructure.tableOperateColumn')" align="center" fixed="right" width="150">
<template #default="scope">
<el-button
link
@ -159,7 +159,7 @@
@click="openForm('update', scope.row.id)"
v-hasPermi="['mes:organization:update']"
>
编辑
{{ t('FactoryModeling.FactoryStructure.tableEditAction') }}
</el-button>
<el-button
link
@ -167,7 +167,7 @@
@click="handleDelete(scope.row.id)"
v-hasPermi="['mes:organization:delete']"
>
删除
{{ t('FactoryModeling.FactoryStructure.tableDeleteAction') }}
</el-button>
</template>
</el-table-column>

@ -4,17 +4,17 @@
ref="formRef"
:model="formData"
:rules="formRules"
label-width="100px"
label-width="120px"
v-loading="formLoading"
>
<el-form-item label="班组名称" prop="teamName">
<el-input v-model="formData.teamName" placeholder="请输入班组名称" />
<el-form-item :label="t('FactoryModeling.WorkTeam.dialogTeamNameLabel')" prop="teamName">
<el-input v-model="formData.teamName" :placeholder="t('FactoryModeling.WorkTeam.dialogTeamNamePlaceholder')" />
</el-form-item>
<el-form-item prop="teamType">
<template #label>
<span>
工序
<el-tooltip content="来源:数据字典-工序" placement="top">
{{ t('FactoryModeling.WorkTeam.dialogProcessLabel') }}
<el-tooltip :content="t('FactoryModeling.WorkTeam.dialogProcessTooltip')" placement="top">
<Icon icon="ep:question-filled" />
</el-tooltip>
</span>
@ -32,8 +32,8 @@
<el-form-item prop="groupType">
<template #label>
<span>
班组类型
<el-tooltip content="来源:数据字典-班组类型" placement="top">
{{ t('FactoryModeling.WorkTeam.dialogGroupTypeLabel') }}
<el-tooltip :content="t('FactoryModeling.WorkTeam.dialogGroupTypeTooltip')" placement="top">
<Icon icon="ep:question-filled" />
</el-tooltip>
</span>
@ -48,20 +48,20 @@
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="工作时间" prop="工作时间">
<el-form-item :label="t('FactoryModeling.WorkTeam.dialogWorkTimeLabel')" prop="工作时间">
<el-time-picker
v-model="formData.dateRange"
is-range
value-format="x"
range-separator=""
start-placeholder="开始时间"
end-placeholder="结束时间"
:range-separator="t('FactoryModeling.WorkTeam.dialogWorkTimeRangeSeparator')"
:start-placeholder="t('FactoryModeling.WorkTeam.dialogWorkTimeStartPlaceholder')"
:end-placeholder="t('FactoryModeling.WorkTeam.dialogWorkTimeEndPlaceholder')"
/>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="formData.remark" placeholder="请输入备注" />
<el-form-item :label="t('FactoryModeling.WorkTeam.dialogRemarkLabel')" prop="remark">
<el-input v-model="formData.remark" :placeholder="t('FactoryModeling.WorkTeam.dialogRemarkPlaceholder')" />
</el-form-item>
<el-form-item label="是否启用" prop="isEnable">
<el-form-item :label="t('FactoryModeling.WorkTeam.dialogEnableLabel')" prop="isEnable">
<el-radio-group v-model="formData.isEnable">
<el-radio
v-for="dict in getBoolDictOptions(DICT_TYPE.INFRA_BOOLEAN_STRING)"
@ -74,8 +74,8 @@
</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('common.ok') }}</el-button>
<el-button @click="dialogVisible = false">{{ t('common.cancel') }}</el-button>
</template>
</Dialog>
</template>
@ -107,10 +107,10 @@ const formData = ref({
})
const formRules = reactive({
teamType: [{ required: true, message: '工序类型不能为空', trigger: 'blur' }],
groupType: [{ required: true, message: '班组类型不能为空', trigger: 'blur' }],
isEnable: [{ required: true, message: '是否启用不能为空', trigger: 'blur' }],
teamName: [{ required: true, message: '班组名称不能为空', trigger: 'blur' }]
teamType: [{ required: true, message: t('FactoryModeling.WorkTeam.validatorProcessRequired'), trigger: 'blur' }],
groupType: [{ required: true, message: t('FactoryModeling.WorkTeam.validatorGroupTypeRequired'), trigger: 'blur' }],
isEnable: [{ required: true, message: t('FactoryModeling.WorkTeam.validatorEnableRequired'), trigger: 'blur' }],
teamName: [{ required: true, message: t('FactoryModeling.WorkTeam.validatorTeamNameRequired'), trigger: 'blur' }]
})
const formRef = ref() // Ref

@ -4,11 +4,16 @@
ref="formRef"
:model="formData"
:rules="formRules"
label-width="100px"
label-width="120px"
v-loading="formLoading"
>
<el-form-item label="工号" prop="userId">
<el-select v-model="formData.userId" clearable filterable placeholder="请选择工号">
<el-form-item :label="t('FactoryModeling.WorkTeam.detailDialogJobNoLabel')" prop="userId">
<el-select
v-model="formData.userId"
clearable
filterable
:placeholder="t('FactoryModeling.WorkTeam.detailDialogJobNoPlaceholder')"
>
<el-option
v-for="item in userList"
:key="item.id"
@ -19,12 +24,12 @@
</el-form-item>
<el-form-item prop="userRole">
<template #label>
<span>
角色
<el-tooltip content="来源:数据字典-班组成员角色" placement="top">
<Icon icon="ep:question-filled" />
</el-tooltip>
</span>
<span>
{{ t('FactoryModeling.WorkTeam.detailDialogRoleLabel') }}
<el-tooltip :content="t('FactoryModeling.WorkTeam.detailDialogRoleTooltip')" placement="top">
<Icon icon="ep:question-filled" />
</el-tooltip>
</span>
</template>
<el-radio-group v-model="formData.userRole">
<el-radio
@ -36,13 +41,16 @@
</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('FactoryModeling.WorkTeam.detailDialogRemarkLabel')" prop="remark">
<el-input
v-model="formData.remark"
:placeholder="t('FactoryModeling.WorkTeam.detailDialogRemarkPlaceholder')"
/>
</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('common.ok') }}</el-button>
<el-button @click="dialogVisible = false">{{ t('common.cancel') }}</el-button>
</template>
</Dialog>
</template>
@ -66,15 +74,28 @@ const formData = ref({
remark: undefined,
})
const formRules = reactive({
userId: [{ required: true, message: '用户ID不能为空', trigger: 'blur' }],
userRole: [{ required: true, message: '角色不能为空', trigger: 'blur' }],
userId: [
{
required: true,
message: t('FactoryModeling.WorkTeam.validatorDetailUserRequired'),
trigger: 'blur'
}
],
userRole: [
{
required: true,
message: t('FactoryModeling.WorkTeam.validatorDetailRoleRequired'),
trigger: 'blur'
}
]
})
const formRef = ref() // Ref
const userList = ref<UserApi.UserVO[]>([]) //
/** 打开弹窗 */
const open = async (type: string, id?: number, workTeamId: number, teamName?:string) => {
dialogVisible.value = true
dialogTitle.value = t('action.' + type)+" ["+teamName+"] 成员"
dialogTitle.value =
t('action.' + type) + ' [' + teamName + '] ' + t('FactoryModeling.WorkTeam.detailDialogMemberSuffix')
formType.value = type
resetForm()
formData.value.workTeamId = workTeamId

@ -7,26 +7,26 @@
@click="openForm('create')"
v-hasPermi="['mes:work-team:create']"
>
<Icon icon="ep:plus" class="mr-5px" /> 新增
<Icon icon="ep:plus" class="mr-5px" /> {{ t('FactoryModeling.WorkTeam.detailAddButtonText') }}
</el-button>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
<!-- <el-table-column label="ID" align="center" prop="id" /> -->
<el-table-column label="工号" align="center" prop="nickName" />
<el-table-column :label="t('FactoryModeling.WorkTeam.detailTableJobNoColumn')" align="center" prop="nickName" />
<!-- <el-table-column label="成员名称" align="center" prop="userName" /> -->
<el-table-column label="角色" align="center" prop="userRole">
<el-table-column :label="t('FactoryModeling.WorkTeam.detailTableRoleColumn')" align="center" prop="userRole">
<template #default="scope">
<dict-tag :type="DICT_TYPE.MES_WORK_TEAM_USER_ROLE" :value="scope.row.userRole" />
</template>
</el-table-column>
<el-table-column label="备注" align="center" prop="remark" />
<el-table-column :label="t('FactoryModeling.WorkTeam.detailTableRemarkColumn')" align="center" prop="remark" />
<el-table-column
label="创建时间"
:label="t('FactoryModeling.WorkTeam.detailTableCreateTimeColumn')"
align="center"
prop="createTime"
:formatter="dateFormatter"
width="180px"
/>
<el-table-column label="操作" align="center">
<el-table-column :label="t('FactoryModeling.WorkTeam.detailTableOperateColumn')" align="center">
<template #default="scope">
<el-button
link
@ -34,7 +34,7 @@
@click="openForm('update', scope.row.id)"
v-hasPermi="['mes:work-team:update']"
>
编辑
{{ t('FactoryModeling.WorkTeam.tableEditAction') }}
</el-button>
<el-button
link
@ -42,7 +42,7 @@
@click="handleDelete(scope.row.id)"
v-hasPermi="['mes:work-team:delete']"
>
删除
{{ t('FactoryModeling.WorkTeam.tableDeleteAction') }}
</el-button>
</template>
</el-table-column>
@ -115,7 +115,7 @@ const handleQuery = () => {
const formRef = ref()
const openForm = (type: string, id?: number) => {
if (!props.workTeamId) {
message.error('请选择一个生产班组')
message.error(t('FactoryModeling.WorkTeam.validatorSelectWorkTeamFirst'))
return
}
formRef.value.open(type, id, props.workTeamId, props.teamName)

@ -6,21 +6,21 @@
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="68px"
label-width="120px"
>
<el-form-item label="班组名称" prop="teamName">
<el-form-item :label="t('FactoryModeling.WorkTeam.searchTeamNameLabel')" prop="teamName">
<el-input
v-model="queryParams.teamName"
placeholder="请输入班组名称"
:placeholder="t('FactoryModeling.WorkTeam.searchTeamNamePlaceholder')"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="工序" prop="teamType">
<el-form-item :label="t('FactoryModeling.WorkTeam.searchProcessLabel')" prop="teamType">
<el-select
v-model="queryParams.teamType"
placeholder="请选择工序"
:placeholder="t('FactoryModeling.WorkTeam.searchProcessPlaceholder')"
clearable
class="!w-240px"
>
@ -32,10 +32,10 @@
/>
</el-select>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-form-item :label="t('FactoryModeling.WorkTeam.searchRemarkLabel')" prop="remark">
<el-input
v-model="queryParams.remark"
placeholder="请输入备注"
:placeholder="t('FactoryModeling.WorkTeam.searchRemarkPlaceholder')"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
@ -43,15 +43,15 @@
</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('FactoryModeling.WorkTeam.searchButtonText') }}</el-button>
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> {{ t('FactoryModeling.WorkTeam.resetButtonText') }}</el-button>
<el-button
type="primary"
plain
@click="openForm('create')"
v-hasPermi="['mes:work-team:create']"
>
<Icon icon="ep:plus" class="mr-5px" /> 新增
<Icon icon="ep:plus" class="mr-5px" /> {{ t('FactoryModeling.WorkTeam.addButtonText') }}
</el-button>
<el-button
type="success"
@ -60,7 +60,7 @@
:loading="exportLoading"
v-hasPermi="['mes:work-team:export']"
>
<Icon icon="ep:download" class="mr-5px" /> 导出
<Icon icon="ep:download" class="mr-5px" /> {{ t('FactoryModeling.WorkTeam.exportButtonText') }}
</el-button>
</el-form-item>
</el-form>
@ -69,10 +69,10 @@
<!-- 列表 -->
<ContentWrap>
<el-tabs v-model="activeName" @tab-click="handleTabClick">
<el-tab-pane label="所有" name="" />
<el-tab-pane label="白班" name="1" />
<el-tab-pane label="夜班" name="2" />
<el-tab-pane label="长白班" name="3" />
<el-tab-pane :label="t('FactoryModeling.WorkTeam.tabsAll')" name="" />
<el-tab-pane :label="t('FactoryModeling.WorkTeam.tabsDay')" name="1" />
<el-tab-pane :label="t('FactoryModeling.WorkTeam.tabsNight')" name="2" />
<el-tab-pane :label="t('FactoryModeling.WorkTeam.tabsLongDay')" name="3" />
</el-tabs>
<el-table
v-loading="loading"
@ -83,37 +83,37 @@
@current-change="handleCurrentChange"
>
<!-- <el-table-column label="ID" align="center" prop="id" /> -->
<el-table-column label="班组名称" align="center" prop="teamName" />
<el-table-column label="组长" align="center" prop="teamLeaderName" />
<el-table-column label="班组类型" align="center" prop="groupType">
<el-table-column :label="t('FactoryModeling.WorkTeam.tableTeamNameColumn')" align="center" prop="teamName" />
<el-table-column :label="t('FactoryModeling.WorkTeam.tableLeaderColumn')" align="center" prop="teamLeaderName" />
<el-table-column :label="t('FactoryModeling.WorkTeam.tableGroupTypeColumn')" align="center" prop="groupType">
<template #default="scope">
<dict-tag :type="DICT_TYPE.MES_GROUP_TYPE" :value="scope.row.groupType" />
</template>
</el-table-column>
<el-table-column label="工作时间" align="center" prop="startTime">
<el-table-column :label="t('FactoryModeling.WorkTeam.tableWorkTimeColumn')" align="center" prop="startTime">
<template #default="scope">
<el-text>{{getHour(scope.row.startTime)+'-'+getHour(scope.row.endTime)}}</el-text>
</template>
</el-table-column>
<el-table-column label="工序" align="center" prop="teamType" sortable>
<el-table-column :label="t('FactoryModeling.WorkTeam.tableProcessColumn')" align="center" prop="teamType" sortable>
<template #default="scope">
<dict-tag :type="DICT_TYPE.MES_ORG_TYPE" :value="scope.row.teamType" />
</template>
</el-table-column>
<el-table-column label="备注" align="center" prop="remark" />
<el-table-column label="是否启用" align="center" prop="isEnable">
<el-table-column :label="t('FactoryModeling.WorkTeam.tableRemarkColumn')" align="center" prop="remark" />
<el-table-column :label="t('FactoryModeling.WorkTeam.tableEnableColumn')" 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="创建时间"
:label="t('FactoryModeling.WorkTeam.tableCreateTimeColumn')"
align="center"
prop="createTime"
:formatter="dateFormatter"
width="180px"
/>
<el-table-column label="操作" align="center">
<el-table-column :label="t('FactoryModeling.WorkTeam.tableOperateColumn')" align="center">
<template #default="scope">
<el-button
link
@ -121,7 +121,7 @@
@click="openForm('update', scope.row.id)"
v-hasPermi="['mes:work-team:update']"
>
编辑
{{ t('FactoryModeling.WorkTeam.tableEditAction') }}
</el-button>
<el-button
link
@ -129,7 +129,7 @@
@click="handleDelete(scope.row.id)"
v-hasPermi="['mes:work-team:delete']"
>
删除
{{ t('FactoryModeling.WorkTeam.tableDeleteAction') }}
</el-button>
</template>
</el-table-column>
@ -148,7 +148,7 @@
<!-- 子表的列表 -->
<ContentWrap>
<el-tabs model-value="workTeamDetail">
<el-tab-pane label="班组成员" name="workTeamDetail">
<el-tab-pane :label="t('FactoryModeling.WorkTeam.detailTabLabel')" name="workTeamDetail">
<WorkTeamDetailList :work-team-id="currentRow.id" :team-name="currentRow.teamName"/>
</el-tab-pane>
</el-tabs>

@ -7,18 +7,9 @@
</div>
<div class="tabs">
<el-select
v-model="selectedEnergyTypeId"
placeholder="请选择"
style="width: 120px"
size="small"
@change="getChartData"
>
<el-option
v-for="item in energyTypes"
:key="item.id"
:label="item.name"
:value="item.id"
/>
v-model="selectedEnergyTypeId" placeholder="请选择" style="width: 120px" size="small"
@change="getChartData">
<el-option v-for="item in energyTypes" :key="item.id" :label="item.name" :value="item.id" />
</el-select>
</div>
</div>
@ -69,7 +60,7 @@ const getChartData = async () => {
const render = (data: any = []) => {
if (!chart) return
// (time/createTime)(value/consumption)
//
// fallback
@ -125,7 +116,7 @@ onMounted(() => {
if (!chartRef.value) return
chart = echarts.init(chartRef.value, 'dark', { renderer: 'canvas' })
//
render([])
render([])
//
getEnergyTypes()
window.addEventListener('resize', resize)
@ -142,22 +133,24 @@ onUnmounted(() => {
background-color: rgba(2, 6, 23, 0.3);
box-shadow: 0 0 0 1px rgba(56, 189, 248, 0.4) inset;
}
:deep(.el-select .el-input__inner) {
color: #e5f0ff;
}
:deep(.el-select .el-input.is-focus .el-input__wrapper) {
box-shadow: 0 0 0 1px rgba(56, 189, 248, 0.9) inset !important;
}
.card {
height: 100%;
background: linear-gradient(135deg, rgba(15,23,42,0.96), rgba(15,23,42,0.88));
background: linear-gradient(135deg, rgba(15, 23, 42, 0.96), rgba(15, 23, 42, 0.88));
border-radius: 8px;
border: 1px solid rgba(30,64,175,0.85);
border: 1px solid rgba(30, 64, 175, 0.85);
box-shadow:
0 18px 45px rgba(15,23,42,0.95),
0 0 0 1px rgba(15,23,42,1),
inset 0 0 0 1px rgba(56,189,248,0.05);
0 18px 45px rgba(15, 23, 42, 0.95),
0 0 0 1px rgba(15, 23, 42, 1),
inset 0 0 0 1px rgba(56, 189, 248, 0.05);
position: relative;
display: flex;
flex-direction: column;
@ -172,7 +165,7 @@ onUnmounted(() => {
width: 12px;
height: 12px;
border-radius: 2px;
border: 1px solid rgba(56,189,248,0.75);
border: 1px solid rgba(56, 189, 248, 0.75);
opacity: 0.6;
pointer-events: none;
}
@ -216,8 +209,8 @@ onUnmounted(() => {
width: 10px;
height: 10px;
border-radius: 50%;
border: 1px solid rgba(56,189,248,0.95);
box-shadow: 0 0 12px rgba(56,189,248,0.45);
border: 1px solid rgba(56, 189, 248, 0.95);
box-shadow: 0 0 12px rgba(56, 189, 248, 0.45);
}
.tabs {
@ -226,7 +219,7 @@ onUnmounted(() => {
gap: 10px;
font-size: 11px;
font-weight: 600;
color: rgba(148,163,184,0.95);
color: rgba(148, 163, 184, 0.95);
}
.tab {
@ -234,14 +227,14 @@ onUnmounted(() => {
user-select: none;
padding: 2px 8px;
border-radius: 999px;
border: 1px solid rgba(148,163,184,0.4);
background: rgba(2,6,23,0.2);
border: 1px solid rgba(148, 163, 184, 0.4);
background: rgba(2, 6, 23, 0.2);
}
.tab.active {
border-color: rgba(56,189,248,0.85);
border-color: rgba(56, 189, 248, 0.85);
color: #e0f2fe;
box-shadow: 0 0 14px rgba(56,189,248,0.35);
box-shadow: 0 0 14px rgba(56, 189, 248, 0.35);
}
.panel-body {
@ -255,4 +248,15 @@ onUnmounted(() => {
height: 100%;
min-height: 160px;
}
:deep(.el-select__wrapper) {
background-color: transparent;
border: 1px solid rgba(56, 189, 248, 0.55);
box-shadow: 0 0 18px rgba(56, 189, 248, 0.35);
color: #94a3b8;
}
:deep(.el-select__placeholder) {
color: #94a3b8;
}
</style>

@ -234,10 +234,13 @@ onUnmounted(() => {
.table-body {
padding: 0;
overflow-x: auto;
overflow-y: hidden;
}
.task-table {
width: 100%;
min-width: 450px;
font-size: 12px;
/* Element Plus Table Variables Override */
--el-table-bg-color: transparent;
@ -260,6 +263,22 @@ onUnmounted(() => {
display: none;
}
/* 横向滚动条样式,贴合深色大屏风格,仅在任务列表区域生效 */
.table-body::-webkit-scrollbar {
height: 6px;
}
.table-body::-webkit-scrollbar-track {
background: rgba(15, 23, 42, 0.9);
border-radius: 999px;
}
.table-body::-webkit-scrollbar-thumb {
background: linear-gradient(to right, rgba(56, 189, 248, 0.85), rgba(59, 130, 246, 0.8));
border-radius: 999px;
box-shadow: 0 0 10px rgba(56, 189, 248, 0.4);
}
/* Header Styles */
.task-table :deep(thead th.el-table__cell) {
background: radial-gradient(circle at 0 0, rgba(56,189,248,0.18), transparent 90%) !important;

@ -19,22 +19,18 @@
<div class="metric-card">
<div class="metric-label">排产单数量</div>
<div class="metric-value" ref="dayOrderEl"></div>
<!-- <div class="metric-extra"><span></span><span>含加急 4 </span></div> -->
</div>
<div class="metric-card">
<div class="metric-label">排产数量</div>
<div class="metric-label">排产数量</div>
<div class="metric-value" ref="dayPlanEl"></div>
<!-- <div class="metric-extra"><span></span><span>含三班倒</span></div> -->
</div>
<div class="metric-card">
<div class="metric-label">待生产数量</div>
<div class="metric-value warn" ref="dayPendingEl"></div>
<!-- <div class="metric-extra"><span></span><span>预计 4 小时内完成</span></div> -->
<div class="metric-label">已生产数量</div>
<div class="metric-value ok" ref="dayPendingEl"></div>
</div>
<div class="metric-card">
<div class="metric-label">产能达成</div>
<div class="metric-label">产能合格</div>
<div class="metric-value accent" ref="dayRateEl"></div>
<!-- <div class="metric-extra"><span>目标 80%</span><span>状态良好</span></div> -->
</div>
</div>
</div>
@ -47,8 +43,21 @@
import { ref, onMounted, onUnmounted } from 'vue'
import * as echarts from 'echarts'
import { colors, animateCount, style } from '../utils'
import { PlanApi } from '@/api/mes/plan'
const day = { orders: 36, plan: 18000, pending: 3200, rate: 82.2 }
type CapacityData = {
orders: number
scheduled: number
produced: number
rate: number
}
const day: CapacityData = {
orders: 0,
scheduled: 0,
produced: 0,
rate: 0
}
const chartRef = ref<HTMLElement | null>(null)
const dayOrderEl = ref<HTMLElement | null>(null)
@ -58,6 +67,26 @@ const dayRateEl = ref<HTMLElement | null>(null)
let chart: echarts.ECharts | null = null
const mapCapacity = (raw: any): CapacityData => {
const orderCount = Number(raw?.orders ?? raw?.order ?? 0)
const scheduled = Number(raw?.plan ?? 0)
const produced = Number(raw?.pending ?? 0)
const rate = Number(raw?.rate ?? raw?.passRate ?? raw?.qualifiedRate ?? 0)
return { orders: orderCount, scheduled, produced, rate }
}
const loadDayCapacity = async () => {
try {
const raw = await PlanApi.getPlanCapacity(1)
const mapped = mapCapacity(raw || {})
day.orders = mapped.orders
day.scheduled = mapped.scheduled
day.produced = mapped.produced
day.rate = mapped.rate
} catch {
}
}
const initChart = () => {
if (!chartRef.value) return
chart = echarts.init(chartRef.value, 'dark', { renderer: 'canvas' })
@ -73,8 +102,8 @@ const initChart = () => {
label: { show: false },
emphasis: { scale: false },
data: [
{ value: day.plan - day.pending, name: '已排产', itemStyle: { color: colors.cyan } },
{ value: day.pending, name: '已生产', itemStyle: { color: colors.green } }
{ value: day.scheduled, name: '已排产', itemStyle: { color: colors.cyan } },
{ value: day.produced, name: '已生产', itemStyle: { color: colors.green } }
]
}
]
@ -85,11 +114,12 @@ const resizeHandler = () => {
chart?.resize()
}
onMounted(() => {
onMounted(async () => {
await loadDayCapacity()
initChart()
animateCount(dayOrderEl.value, day.orders, '', 900)
animateCount(dayPlanEl.value, day.plan, '', 900)
animateCount(dayPendingEl.value, day.pending, '', 900)
animateCount(dayPlanEl.value, day.scheduled, '', 900)
animateCount(dayPendingEl.value, day.produced, '', 900)
animateCount(dayRateEl.value, day.rate, '%', 900)
window.addEventListener('resize', resizeHandler)
})

@ -7,35 +7,91 @@
</span>
<span>能耗周趋势</span>
</div>
<span class="tag">本周能耗对比</span>
<div class="card-toolbar">
<el-select
v-model="selectedEnergyTypeId" placeholder="请选择" class="energy-type-select" size="small"
@change="handleEnergyTypeChange">
<el-option v-for="item in energyTypes" :key="item.id" :label="item.name" :value="item.id" />
</el-select>
</div>
</div>
<div class="card-body">
<div id="chart-energy" class="chart"></div>
<div ref="chartRef" class="chart"></div>
</div>
</div>
</template>
<script setup lang="ts">
import { onMounted } from 'vue'
import { onMounted, onUnmounted, ref } from 'vue'
import * as echarts from 'echarts'
import { useChart, colors, style } from '../utils'
import { colors, style } from '../utils'
import { EnergyTypeApi, EnergyTypeVO } from '@/api/mes/energytype'
import { EnergyDeviceApi } from '@/api/mes/energydevice'
const { init } = useChart('chart-energy')
const energyTypes = ref<EnergyTypeVO[]>([])
const selectedEnergyTypeId = ref<number | undefined>(undefined)
const chartRef = ref<HTMLElement | null>(null)
let chart: echarts.ECharts | null = null
const energyDays = ['周一','周二','周三','周四','周五','周六','周日']
const energyUse = [520, 540, 580, 610, 640, 590, 560]
const energyStd = [500, 520, 540, 560, 580, 560, 540]
const getEnergyTypes = async () => {
try {
const res = await EnergyTypeApi.getEnergyTypeList()
const list = (res as any).data || (Array.isArray(res) ? res : [])
energyTypes.value = list
if (list.length > 0 && !selectedEnergyTypeId.value) {
selectedEnergyTypeId.value = list[0].id
await getChartData()
}
} catch (e) {
console.error('Failed to fetch energy types:', e)
}
}
onMounted(() => {
const chart = init()
const getChartData = async () => {
if (!selectedEnergyTypeId.value || !chart) return
try {
const res = await EnergyDeviceApi.getLastEnergyStatistics({
deviceTypeId: selectedEnergyTypeId.value,
orgId: 132
})
render(res)
} catch (e) {
console.error('Failed to fetch weekly energy data:', e)
}
}
const handleEnergyTypeChange = () => {
getChartData()
}
const render = (data: any = []) => {
if (!chart) return
const list = (data as any).data || (Array.isArray(data) ? data : [])
const x: string[] = []
const actual: number[] = []
const baseline: number[] = []
if (list && list.length > 0) {
list.forEach((item: any) => {
const label = item.hour || item.day || ''
x.push(label)
const v = Number(item.value ?? item.energy ?? item.consumption ?? 0)
actual.push(Number.isNaN(v) ? 0 : v)
})
}
chart.setOption({
backgroundColor: 'transparent',
tooltip: { trigger: 'axis' },
legend: { top: 0, right: 0, textStyle: style.legendText },
grid: { top: '20%', left: '6%', right: '6%', bottom: '10%', containLabel: true },
xAxis: { type: 'category', data: energyDays, axisLine: style.axisLine, axisLabel: style.axisLabel },
grid: { top: '20%', left: '6%', right: '6%', bottom: '14%', containLabel: true },
xAxis: {
type: 'category',
data: x,
axisLine: style.axisLine,
axisLabel: { ...style.axisLabel, fontSize: 10, rotate: 40 }
},
yAxis: { type: 'value', axisLine: { show: false }, axisLabel: style.axisLabel, splitLine: style.splitLine },
series: [
{
@ -43,13 +99,13 @@ onMounted(() => {
type: 'bar',
barWidth: 16,
itemStyle: {
borderRadius: [4,4,0,0],
color: new echarts.graphic.LinearGradient(0,0,0,1,[
borderRadius: [4, 4, 0, 0],
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
{ offset: 0, color: colors.danger },
{ offset: 1, color: 'rgba(239,68,68,0.10)' }
])
},
data: energyUse
data: actual
},
{
name: '基准能耗(kWh)',
@ -57,22 +113,39 @@ onMounted(() => {
smooth: true,
showSymbol: false,
lineStyle: { width: 2, color: colors.green },
data: energyStd
data: baseline
}
]
})
}
const resize = () => {
chart?.resize()
}
onMounted(async () => {
if (!chartRef.value) return
chart = echarts.init(chartRef.value, 'dark', { renderer: 'canvas' })
render([])
await getEnergyTypes()
window.addEventListener('resize', resize)
})
onUnmounted(() => {
window.removeEventListener('resize', resize)
chart?.dispose()
})
</script>
<style scoped>
.card {
background: linear-gradient(135deg, rgba(15,23,42,0.96), rgba(15,23,42,0.88));
background: linear-gradient(135deg, rgba(15, 23, 42, 0.96), rgba(15, 23, 42, 0.88));
border-radius: 10px;
border: 1px solid rgba(30,64,175,0.85);
border: 1px solid rgba(30, 64, 175, 0.85);
box-shadow:
0 18px 45px rgba(15,23,42,0.95),
0 0 0 1px rgba(15,23,42,1),
inset 0 0 0 1px rgba(56,189,248,0.05);
0 18px 45px rgba(15, 23, 42, 0.95),
0 0 0 1px rgba(15, 23, 42, 1),
inset 0 0 0 1px rgba(56, 189, 248, 0.05);
padding: 10px 10px 10px 10px;
position: relative;
display: flex;
@ -87,7 +160,7 @@ onMounted(() => {
width: 13px;
height: 13px;
border-radius: 2px;
border: 1px solid rgba(56,189,248,0.75);
border: 1px solid rgba(56, 189, 248, 0.75);
opacity: 0.6;
pointer-events: none;
}
@ -128,6 +201,12 @@ onMounted(() => {
color: #22d3ee;
}
.card-toolbar {
display: flex;
align-items: center;
gap: 6px;
}
.card-body {
flex: 1;
min-height: 0;
@ -140,7 +219,7 @@ onMounted(() => {
border-radius: 999px;
padding: 2px 6px;
font-size: 10px;
border: 1px solid rgba(148,163,184,0.4);
border: 1px solid rgba(148, 163, 184, 0.4);
color: #94a3b8;
}
@ -150,7 +229,40 @@ onMounted(() => {
min-height: 180px;
}
.energy-type-select {
width: 140px;
}
:deep(.el-select__wrapper) {
background-color: transparent;
border: 1px solid rgba(56, 189, 248, 0.55);
box-shadow: 0 0 18px rgba(56, 189, 248, 0.35);
color: #94a3b8;
}
:deep(.el-select__placeholder) {
color: #94a3b8;
}
:deep(.energy-type-select .el-input__wrapper) {
border-radius: 999px;
border-color: rgba(56, 189, 248, 0.85);
background: radial-gradient(circle at 0 0, rgba(56, 189, 248, 0.22), transparent 70%);
box-shadow: 0 0 18px rgba(56, 189, 248, 0.45);
}
:deep(.energy-type-select .el-input__wrapper.is-focus) {
border-color: rgba(96, 165, 250, 0.95);
background: radial-gradient(circle at 0 0, rgba(59, 130, 246, 0.35), transparent 70%);
}
:deep(.energy-type-select .el-input__inner) {
color: #e0f2fe;
}
@media (max-width: 1600px) {
.chart { min-height: 160px; }
.chart {
min-height: 160px;
}
}
</style>

@ -19,22 +19,18 @@
<div class="metric-card">
<div class="metric-label">排产单数量</div>
<div class="metric-value" ref="monthOrderEl"></div>
<div class="metric-extra"><span></span><span>同比 +8.6%</span></div>
</div>
<div class="metric-card">
<div class="metric-label">排产数量</div>
<div class="metric-label">排产数量</div>
<div class="metric-value" ref="monthPlanEl"></div>
<div class="metric-extra"><span></span><span>较计划 +3.2%</span></div>
</div>
<div class="metric-card">
<div class="metric-label">待生产数量</div>
<div class="metric-value warn" ref="monthPendingEl"></div>
<div class="metric-extra"><span></span><span>剩余 5 天完成</span></div>
<div class="metric-label">已生产数量</div>
<div class="metric-value ok" ref="monthPendingEl"></div>
</div>
<div class="metric-card">
<div class="metric-label">产能达成</div>
<div class="metric-label">产能合格</div>
<div class="metric-value accent" ref="monthRateEl"></div>
<div class="metric-extra"><span>目标 85%</span><span>接近预期</span></div>
</div>
</div>
</div>
@ -47,8 +43,21 @@
import { ref, onMounted, onUnmounted } from 'vue'
import * as echarts from 'echarts'
import { colors, animateCount, style } from '../utils'
import { PlanApi } from '@/api/mes/plan'
const month = { orders: 158, plan: 420000, pending: 75600, rate: 82.0 }
type CapacityData = {
orders: number
scheduled: number
produced: number
rate: number
}
const month: CapacityData = {
orders: 0,
scheduled: 0,
produced: 0,
rate: 0
}
const chartRef = ref<HTMLElement | null>(null)
const monthOrderEl = ref<HTMLElement | null>(null)
@ -58,6 +67,26 @@ const monthRateEl = ref<HTMLElement | null>(null)
let chart: echarts.ECharts | null = null
const mapCapacity = (raw: any): CapacityData => {
const orderCount = Number(raw?.orders ?? raw?.order ?? 0)
const scheduled = Number(raw?.plan ?? 0)
const produced = Number(raw?.pending ?? 0)
const rate = Number(raw?.rate ?? raw?.passRate ?? raw?.qualifiedRate ?? 0)
return { orders: orderCount, scheduled, produced, rate }
}
const loadMonthCapacity = async () => {
try {
const raw = await PlanApi.getPlanCapacity(2)
const mapped = mapCapacity(raw || {})
month.orders = mapped.orders
month.scheduled = mapped.scheduled
month.produced = mapped.produced
month.rate = mapped.rate
} catch {
}
}
const initChart = () => {
if (!chartRef.value) return
chart = echarts.init(chartRef.value, 'dark', { renderer: 'canvas' })
@ -73,8 +102,8 @@ const initChart = () => {
label: { show: false },
emphasis: { scale: false },
data: [
{ value: month.plan - month.pending, name: '已完成', itemStyle: { color: colors.green } },
{ value: month.pending, name: '待生产', itemStyle: { color: 'rgba(15,23,42,0.8)' } }
{ value: month.scheduled, name: '已排产', itemStyle: { color: colors.cyan } },
{ value: month.produced, name: '已生产', itemStyle: { color: colors.green } }
]
}
]
@ -85,11 +114,12 @@ const resizeHandler = () => {
chart?.resize()
}
onMounted(() => {
onMounted(async () => {
await loadMonthCapacity()
initChart()
animateCount(monthOrderEl.value, month.orders, '', 900)
animateCount(monthPlanEl.value, month.plan, '', 900)
animateCount(monthPendingEl.value, month.pending, '', 900)
animateCount(monthPlanEl.value, month.scheduled, '', 900)
animateCount(monthPendingEl.value, month.produced, '', 900)
animateCount(monthRateEl.value, month.rate, '%', 900)
window.addEventListener('resize', resizeHandler)
})

@ -19,6 +19,7 @@
import { onMounted } from 'vue'
import * as echarts from 'echarts'
import { useChart, colors, style } from '../utils'
import { PlanApi } from '@/api/mes/plan'
const { init } = useChart('chart-quality')
@ -31,7 +32,54 @@ for (let i = 6; i >= 0; i--) {
const passRate = [98.5, 99.2, 97.8, 98.9, 99.0, 98.2, 99.5]
onMounted(() => {
type QualityPoint = {
label: string
rate: number
}
const normalizeQualityData = (raw: any): QualityPoint[] => {
if (!raw) return []
const source = raw && typeof raw === 'object' && 'data' in raw ? raw.data : raw
const rows: QualityPoint[] = []
if (Array.isArray(source)) {
source.forEach((row: any) => {
const rawDate = row?.day ?? row?.date ?? row?.statDate ?? row?.createDate ?? ''
const rawLabel = typeof rawDate === 'string' ? rawDate : String(rawDate || '')
const label = rawLabel.length >= 10 ? rawLabel.slice(5, 10).replace('-', '/') : rawLabel
const rawRate = row?.rate ?? row?.passRate ?? row?.qualifiedRate ?? row?.value ?? 0
const n = Number(rawRate)
const rate = Number.isNaN(n) ? 0 : n
rows.push({ label, rate })
})
} else if (source && typeof source === 'object') {
const entries = Object.entries(source).sort(([a], [b]) => a.localeCompare(b))
entries.forEach(([key, value]) => {
const rawLabel = String(key || '')
const label = rawLabel.length >= 10 ? rawLabel.slice(5, 10).replace('-', '/') : rawLabel
const n = Number(value)
const rate = Number.isNaN(n) ? 0 : n
rows.push({ label, rate })
})
}
return rows.filter((item) => item.label)
}
onMounted(async () => {
let xAxisData = last7Days.slice()
let seriesData = passRate.slice()
try {
const data = await PlanApi.getLastDaysRate()
const list = normalizeQualityData(data)
if (list.length > 0) {
xAxisData = list.map((item) => item.label)
seriesData = list.map((item) => item.rate)
}
} catch {
}
const chart = init()
if (!chart) return
@ -39,8 +87,8 @@ onMounted(() => {
backgroundColor: 'transparent',
tooltip: { trigger: 'axis' },
grid: { top: '18%', left: '6%', right: '6%', bottom: '10%', containLabel: true },
xAxis: { type: 'category', data: last7Days, axisLine: style.axisLine, axisLabel: style.axisLabel },
yAxis: { type: 'value', min: 96, max: 100, axisLine: { show: false }, axisLabel: style.axisLabel, splitLine: style.splitLine },
xAxis: { type: 'category', data: xAxisData, axisLine: style.axisLine, axisLabel: style.axisLabel },
yAxis: { type: 'value', min: 0, max: 100, axisLine: { show: false }, axisLabel: style.axisLabel, splitLine: style.splitLine },
series: [{
name: '合格率',
type: 'bar',
@ -52,7 +100,7 @@ onMounted(() => {
{ offset: 1, color: 'rgba(139,92,246,0.10)' }
])
},
data: passRate,
data: seriesData,
markLine: {
symbol: ['none', 'none'],
label: { show: true, color: '#fff', fontSize: 12, formatter: '平均 {c}%' },

Loading…
Cancel
Save