liutao_branch
kkk-ops 2 months ago
commit 8263c44c0a

@ -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` })
}
}

@ -52,6 +52,7 @@ export default {
status: 'Status',
createTime: 'Create Time',
updateTime: 'Update Time',
operate: 'Operation',
copy: 'Copy',
copySuccess: 'Copy Success',
copyError: 'Copy Error'
@ -455,6 +456,235 @@ export default {
btn_zoom_out: 'Zoom out',
preview: 'Preivew'
},
SystemManagement: {
Dept: {
name: 'Department Name',
statusLabel: 'Department Status',
status: 'Status',
leader: 'Leader',
sort: 'Sort',
phone: 'Phone',
email: 'Email',
parent: 'Parent Department',
createTime: 'Create Time',
actions: 'Actions',
searchNamePlaceholder: 'Please input department name',
searchStatusPlaceholder: 'Please select department status',
parentPlaceholder: 'Please select parent department',
leaderPlaceholder: 'Please select leader',
phonePlaceholder: 'Please input phone number',
emailPlaceholder: 'Please input email',
statusPlaceholder: 'Please select status',
parentRequired: 'Parent department is required',
nameRequired: 'Department name is required',
sortRequired: 'Sort is required',
emailInvalid: 'Please input a valid email address',
phoneInvalid: 'Please input a valid mobile number',
statusRequired: 'Status is required',
toggleExpand: 'Expand / Collapse'
},
User: {
workNo: 'Work No',
username: 'User Name',
nickname: 'Nickname',
dept: 'Department',
mobile: 'Mobile',
email: 'Email',
sex: 'User Gender',
post: 'Post',
remark: 'Remark',
status: 'Status',
createTime: 'Create Time',
actions: 'Actions',
password: 'User Password',
role: 'Role',
import: 'User Import',
importDragText: 'Drag file here, or',
importClickText: 'click to upload',
importUpdateSupport: 'Update existing user data if present',
importFormatLimit: 'Only xls, xlsx format files are allowed.',
importDownloadTemplate: 'Download template',
searchWorkNoPlaceholder: 'Please input work No',
searchUsernamePlaceholder: 'Please input user name',
searchMobilePlaceholder: 'Please input mobile',
searchStatusPlaceholder: 'Please select status',
searchCreateTimeStartPlaceholder: 'Start date',
searchCreateTimeEndPlaceholder: 'End date',
deptPlaceholder: 'Please select department',
sexPlaceholder: 'Please select',
postPlaceholder: 'Please select',
remarkPlaceholder: 'Please input content',
usernamePlaceholder: 'Please input user name',
passwordPlaceholder: 'Please input user password',
workNoPlaceholder: 'Please input work No',
mobilePlaceholder: 'Please input mobile',
emailPlaceholder: 'Please input email',
usernameRequired: 'User name is required',
workNoRequired: 'Work No is required',
passwordRequired: 'User password is required',
deptRequired: 'Department is required',
emailInvalid: 'Please input a valid email address',
mobileInvalid: 'Please input a valid mobile number',
importFileRequired: 'Please upload file',
importSuccessTip: 'Upload success: {createCount}; Update success: {updateCount}; Update failed: {failureCount};',
importFailed: 'Upload failed, please upload again!',
importFileLimit: 'Only one file can be uploaded!',
resetPasswordTitle: 'Please input new password for "{username}"',
resetPasswordSuccess: 'Modified successfully, new password is: {password}',
resetPassword: 'Reset Password',
assignRole: 'Assign Role',
changeStatusConfirm: 'Are you sure to {action} user "{username}"?'
},
Post: {
code: 'Post Code',
name: 'Post Name',
sort: 'Post Order',
remark: 'Post Remark',
status: 'Status',
createTime: 'Create Time',
actions: 'Actions',
searchNamePlaceholder: 'Please input post name',
searchCodePlaceholder: 'Please input post code',
searchStatusPlaceholder: 'Please select status',
codePlaceholder: 'Please input post code',
namePlaceholder: 'Please input post name',
sortPlaceholder: 'Please input post order',
statusPlaceholder: 'Please select status',
remarkPlaceholder: 'Please input remark',
codeRequired: 'Post code is required',
nameRequired: 'Post name is required',
sortRequired: 'Post order is required',
statusRequired: 'Post status is required'
},
Role: {
code: 'Role Code',
name: 'Role Name',
type: 'Role Type',
sort: 'Display Order',
remark: 'Remark',
status: 'Status',
menuPermission: 'Menu Permission',
dataPermission: 'Data Permission',
dataScope: 'Permission Scope',
selectAll: 'Select/Deselect All',
expandCollapse: 'Expand/Collapse All',
parentChildLink: 'Parent-child linkage (select parent to select children)',
yes: 'Yes',
no: 'No',
loadingText: 'Loading, please wait',
searchCodePlaceholder: 'Please input role code',
searchNamePlaceholder: 'Please input role name',
searchStatusPlaceholder: 'Please select status',
codePlaceholder: 'Please input role code',
namePlaceholder: 'Please input role name',
sortPlaceholder: 'Please input display order',
statusPlaceholder: 'Please select status',
remarkPlaceholder: 'Please input remark',
codeRequired: 'Role code is required',
nameRequired: 'Role name is required',
sortRequired: 'Display order is required',
statusRequired: 'Status is required'
},
Menu: {
name: 'Menu Name',
parent: 'Parent Menu',
type: 'Menu Type',
icon: 'Menu Icon',
path: 'Route Path',
component: 'Component Path',
componentName: 'Component Name',
permission: 'Permission',
sort: 'Display Order',
status: 'Menu Status',
visible: 'Visible',
alwaysShow: 'Always Show',
keepAlive: 'Keep Alive',
actions: 'Actions',
searchNamePlaceholder: 'Please input menu name',
searchStatusPlaceholder: 'Please select menu status',
namePlaceholder: 'Please input menu name',
pathPlaceholder: 'Please input route path',
componentPlaceholder: 'For example: system/user/index',
componentNamePlaceholder: 'For example: SystemUser',
permissionPlaceholder: 'Please input permission',
sortPlaceholder: 'Please input display order',
toggleExpand: 'Expand / Collapse',
refreshCache: 'Refresh Menu Cache',
updateCacheConfirm: 'The cache will be updated and the browser will be refreshed!',
updateCacheTitle: 'Refresh Menu Cache',
visibleShow: 'Show',
visibleHide: 'Hide',
always: 'Always',
notAlways: 'Not Always',
keep: 'Cache',
notKeep: 'No Cache',
parentRoot: 'Root Menu',
nameRequired: 'Menu name is required',
sortRequired: 'Menu order is required',
pathRequired: 'Route path is required',
statusRequired: 'Status is required',
pathMustStartWithSlash: 'Path must start with /',
pathMustNotStartWithSlash: 'Path must not start with /',
pathTooltipTitle: 'Route Path',
pathTooltipMessage:
'Route path to access, such as `user`. For external link, start with `http(s)://`.',
permissionTooltipTitle: 'Permission',
permissionTooltipMessage:
"Permission string on Controller method, e.g. @PreAuthorize(`@ss.hasPermission('system:user:list')`)",
visibleTooltipTitle: 'Visible',
visibleTooltipMessage:
'When hidden is selected, the route will not appear in the sidebar but can still be accessed',
alwaysShowTooltipTitle: 'Always Show',
alwaysShowTooltipMessage:
'When not selected, if the menu has only one child, the parent will be hidden and the child will be displayed directly',
keepAliveTooltipTitle: 'Keep Alive',
keepAliveTooltipMessage:
'When cached is selected, it will be cached by `keep-alive`, and the "Component Name" field must be filled in'
},
Dict: {
id: 'Dict ID',
name: 'Dict Name',
type: 'Dict Type',
label: 'Dict Label',
value: 'Dict Value',
sort: 'Dict Sort',
status: 'Status',
remark: 'Remark',
colorType: 'Color Type',
cssClass: 'CSS Class',
createTime: 'Create Time',
actions: 'Actions',
data: 'Data',
searchNamePlaceholder: 'Please input dict name',
searchTypePlaceholder: 'Please input dict type',
searchStatusPlaceholder: 'Please select dict status',
searchLabelPlaceholder: 'Please input dict label',
searchDataStatusPlaceholder: 'Please select data status',
namePlaceholder: 'Please input dict name',
typePlaceholder: 'Please input dict type',
labelPlaceholder: 'Please input data label',
valuePlaceholder: 'Please input data value',
sortPlaceholder: 'Please input data order',
remarkPlaceholder: 'Please input content',
statusPlaceholder: 'Please select status',
colorTypePlaceholder: 'Please select color type',
cssClassPlaceholder: 'Please input CSS Class',
nameRequired: 'Dict name is required',
typeRequired: 'Dict type is required',
statusRequired: 'Status is required',
labelRequired: 'Data label is required',
valueRequired: 'Data value is required',
sortRequired: 'Data order is required',
colorTypeDefault: 'Default',
colorTypePrimary: 'Primary',
colorTypeSuccess: 'Success',
colorTypeInfo: 'Info',
colorTypeWarning: 'Warning',
colorTypeDanger: 'Danger',
typeExportFilename: 'DictType.xls',
dataExportFilename: 'DictData.xls'
}
},
basedata: {
product: {
category: {
@ -986,6 +1216,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',

@ -52,6 +52,7 @@ export default {
status: '状态',
createTime: '创建时间',
updateTime: '更新时间',
operate: '操作',
copy: '复制',
copySuccess: '复制成功',
copyError: '复制失败'
@ -458,6 +459,231 @@ export default {
}
}
},
SystemManagement: {
Dept: {
name: '部门名称',
statusLabel: '部门状态',
status: '状态',
leader: '负责人',
sort: '显示排序',
phone: '联系电话',
email: '邮箱',
parent: '上级部门',
createTime: '创建时间',
actions: '操作',
searchNamePlaceholder: '请输入部门名称',
searchStatusPlaceholder: '请选择部门状态',
parentPlaceholder: '请选择上级部门',
leaderPlaceholder: '请选择负责人',
phonePlaceholder: '请输入联系电话',
emailPlaceholder: '请输入邮箱',
statusPlaceholder: '请选择状态',
parentRequired: '上级部门不能为空',
nameRequired: '部门名称不能为空',
sortRequired: '显示排序不能为空',
emailInvalid: '请输入正确的邮箱地址',
phoneInvalid: '请输入正确的手机号码',
statusRequired: '状态不能为空',
toggleExpand: '展开/折叠'
},
User: {
workNo: '工号',
username: '用户名称',
nickname: '用户昵称',
dept: '归属部门',
mobile: '手机号码',
email: '邮箱',
sex: '用户性别',
post: '岗位',
remark: '备注',
status: '状态',
createTime: '创建时间',
actions: '操作',
password: '用户密码',
role: '角色',
import: '用户导入',
importDragText: '将文件拖到此处,或',
importClickText: '点击上传',
importUpdateSupport: '是否更新已经存在的用户数据',
importFormatLimit: '仅允许导入 xls、xlsx 格式文件。',
importDownloadTemplate: '下载模板',
searchWorkNoPlaceholder: '请输入工号',
searchUsernamePlaceholder: '请输入用户名称',
searchMobilePlaceholder: '请输入手机号码',
searchStatusPlaceholder: '请选择状态',
searchCreateTimeStartPlaceholder: '开始日期',
searchCreateTimeEndPlaceholder: '结束日期',
deptPlaceholder: '请选择归属部门',
sexPlaceholder: '请选择',
postPlaceholder: '请选择',
remarkPlaceholder: '请输入内容',
usernamePlaceholder: '请输入用户名称',
passwordPlaceholder: '请输入用户密码',
workNoPlaceholder: '请输入工号',
mobilePlaceholder: '请输入手机号码',
emailPlaceholder: '请输入邮箱',
usernameRequired: '用户名称不能为空',
workNoRequired: '工号不能为空',
passwordRequired: '用户密码不能为空',
deptRequired: '部门不能为空',
emailInvalid: '请输入正确的邮箱地址',
mobileInvalid: '请输入正确的手机号码',
importFileRequired: '请上传文件',
importSuccessTip: '上传成功数量:{createCount};更新成功数量:{updateCount};更新失败数量:{failureCount}',
importFailed: '上传失败,请您重新上传!',
importFileLimit: '最多只能上传一个文件!',
resetPasswordTitle: '请输入"{username}"的新密码',
resetPasswordSuccess: '修改成功,新密码是:{password}',
resetPassword: '重置密码',
assignRole: '分配角色',
changeStatusConfirm: '确认要"{action}""{username}"用户吗?'
},
Post: {
code: '岗位编码',
name: '岗位名称',
sort: '岗位顺序',
remark: '岗位备注',
status: '状态',
createTime: '创建时间',
actions: '操作',
searchNamePlaceholder: '请输入岗位名称',
searchCodePlaceholder: '请输入岗位编码',
searchStatusPlaceholder: '请选择状态',
codePlaceholder: '请输入岗位编码',
namePlaceholder: '请输入岗位名称',
sortPlaceholder: '请输入岗位顺序',
statusPlaceholder: '请选择状态',
remarkPlaceholder: '请输入备注',
codeRequired: '岗位编码不能为空',
nameRequired: '岗位名称不能为空',
sortRequired: '岗位顺序不能为空',
statusRequired: '岗位状态不能为空'
},
Role: {
code: '角色编码',
name: '角色名称',
type: '角色类型',
sort: '显示顺序',
remark: '备注',
status: '状态',
menuPermission: '菜单权限',
dataPermission: '数据权限',
dataScope: '权限范围',
selectAll: '全选/全不选',
expandCollapse: '全部展开/折叠',
parentChildLink: '父子联动(选中父节点,自动选择子节点)',
yes: '是',
no: '否',
loadingText: '加载中,请稍候',
searchCodePlaceholder: '请输入角色编码',
searchNamePlaceholder: '请输入角色名称',
searchStatusPlaceholder: '请选择状态',
codePlaceholder: '请输入角色编码',
namePlaceholder: '请输入角色名称',
sortPlaceholder: '请输入显示顺序',
statusPlaceholder: '请选择状态',
remarkPlaceholder: '请输入备注',
codeRequired: '角色标识不能为空',
nameRequired: '角色名称不能为空',
sortRequired: '显示顺序不能为空',
statusRequired: '状态不能为空'
},
Menu: {
name: '菜单名称',
parent: '上级菜单',
type: '菜单类型',
icon: '菜单图标',
path: '路由地址',
component: '组件地址',
componentName: '组件名称',
permission: '权限标识',
sort: '显示排序',
status: '菜单状态',
visible: '显示状态',
alwaysShow: '总是显示',
keepAlive: '缓存状态',
actions: '操作',
searchNamePlaceholder: '请输入菜单名称',
searchStatusPlaceholder: '请选择菜单状态',
namePlaceholder: '请输入菜单名称',
pathPlaceholder: '请输入路由地址',
componentPlaceholder: '例如说system/user/index',
componentNamePlaceholder: '例如说SystemUser',
permissionPlaceholder: '请输入权限标识',
sortPlaceholder: '请输入显示排序',
toggleExpand: '展开/折叠',
refreshCache: '刷新菜单缓存',
updateCacheConfirm: '即将更新缓存刷新浏览器!',
updateCacheTitle: '刷新菜单缓存',
visibleShow: '显示',
visibleHide: '隐藏',
always: '总是',
notAlways: '不是',
keep: '缓存',
notKeep: '不缓存',
parentRoot: '主类目',
nameRequired: '菜单名称不能为空',
sortRequired: '菜单顺序不能为空',
pathRequired: '路由地址不能为空',
statusRequired: '状态不能为空',
pathMustStartWithSlash: '路径必须以 / 开头',
pathMustNotStartWithSlash: '路径不能以 / 开头',
pathTooltipTitle: '路由地址',
pathTooltipMessage: '访问的路由地址,如:`user`。如需外网地址时,则以 `http(s)://` 开头',
permissionTooltipTitle: '权限标识',
permissionTooltipMessage:
"Controller 方法上的权限字符,如:@PreAuthorize(`@ss.hasPermission('system:user:list')`)",
visibleTooltipTitle: '显示状态',
visibleTooltipMessage: '选择隐藏时,路由将不会出现在侧边栏,但仍然可以访问',
alwaysShowTooltipTitle: '总是显示',
alwaysShowTooltipMessage: '选择不是时,当该菜单只有一个子菜单时,不展示自己,直接展示子菜单',
keepAliveTooltipTitle: '缓存状态',
keepAliveTooltipMessage: '选择缓存时,则会被 `keep-alive` 缓存,必须填写「组件名称」字段'
},
Dict: {
id: '字典编号',
name: '字典名称',
type: '字典类型',
label: '字典标签',
value: '字典键值',
sort: '字典排序',
status: '状态',
remark: '备注',
colorType: '颜色类型',
cssClass: 'CSS Class',
createTime: '创建时间',
actions: '操作',
data: '数据',
searchNamePlaceholder: '请输入字典名称',
searchTypePlaceholder: '请输入字典类型',
searchStatusPlaceholder: '请选择字典状态',
searchLabelPlaceholder: '请输入字典标签',
searchDataStatusPlaceholder: '请选择数据状态',
namePlaceholder: '请输入字典名称',
typePlaceholder: '请输入字典类型',
labelPlaceholder: '请输入数据标签',
valuePlaceholder: '请输入数据键值',
sortPlaceholder: '请输入数据顺序',
remarkPlaceholder: '请输入内容',
statusPlaceholder: '请选择状态',
colorTypePlaceholder: '请选择颜色类型',
cssClassPlaceholder: '请输入 CSS Class',
nameRequired: '字典名称不能为空',
typeRequired: '字典类型不能为空',
statusRequired: '状态不能为空',
labelRequired: '数据标签不能为空',
valueRequired: '数据键值不能为空',
sortRequired: '数据顺序不能为空',
colorTypeDefault: '默认',
colorTypePrimary: '主要',
colorTypeSuccess: '成功',
colorTypeInfo: '信息',
colorTypeWarning: '警告',
colorTypeDanger: '危险',
typeExportFilename: '字典类型.xls',
dataExportFilename: '字典数据.xls'
}
},
// 设备管理
EquipmentManagement: {
// 设备分类
@ -1774,5 +2000,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" 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" filterable 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>
@ -160,9 +160,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() //
@ -236,7 +236,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}%' },

@ -5,27 +5,28 @@
v-loading="formLoading"
:model="formData"
:rules="formRules"
label-width="80px"
label-width="auto"
class="dept-dialog-form"
>
<el-form-item label="上级部门" prop="parentId">
<el-form-item :label="t('SystemManagement.Dept.parent')" prop="parentId">
<el-tree-select
v-model="formData.parentId"
:data="deptTree"
:props="defaultProps"
check-strictly
default-expand-all
placeholder="请选择上级部门"
:placeholder="t('SystemManagement.Dept.parentPlaceholder')"
value-key="deptId"
/>
</el-form-item>
<el-form-item label="部门名称" prop="name">
<el-input v-model="formData.name" placeholder="请输入部门名称" />
<el-form-item :label="t('SystemManagement.Dept.name')" prop="name">
<el-input v-model="formData.name" :placeholder="t('SystemManagement.Dept.searchNamePlaceholder')" />
</el-form-item>
<el-form-item label="显示排序" prop="sort">
<el-form-item :label="t('SystemManagement.Dept.sort')" prop="sort">
<el-input-number v-model="formData.sort" :min="0" controls-position="right" />
</el-form-item>
<el-form-item label="负责人" prop="leaderUserId">
<el-select v-model="formData.leaderUserId" clearable placeholder="请输入负责人">
<el-form-item :label="t('SystemManagement.Dept.leader')" prop="leaderUserId">
<el-select v-model="formData.leaderUserId" clearable :placeholder="t('SystemManagement.Dept.leaderPlaceholder')">
<el-option
v-for="item in userList"
:key="item.id"
@ -34,14 +35,14 @@
/>
</el-select>
</el-form-item>
<el-form-item label="联系电话" prop="phone">
<el-input v-model="formData.phone" maxlength="11" placeholder="请输入联系电话" />
<el-form-item :label="t('SystemManagement.Dept.phone')" prop="phone">
<el-input v-model="formData.phone" maxlength="11" :placeholder="t('SystemManagement.Dept.phonePlaceholder')" />
</el-form-item>
<el-form-item label="邮箱" prop="email">
<el-input v-model="formData.email" maxlength="50" placeholder="请输入邮箱" />
<el-form-item :label="t('SystemManagement.Dept.email')" prop="email">
<el-input v-model="formData.email" maxlength="50" :placeholder="t('SystemManagement.Dept.emailPlaceholder')" />
</el-form-item>
<el-form-item label="状态" prop="status">
<el-select v-model="formData.status" clearable placeholder="请选择状态">
<el-form-item :label="t('SystemManagement.Dept.status')" prop="status">
<el-select v-model="formData.status" clearable :placeholder="t('SystemManagement.Dept.statusPlaceholder')">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.COMMON_STATUS)"
:key="dict.value"
@ -52,8 +53,8 @@
</el-form-item>
</el-form>
<template #footer>
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
<el-button type="primary" @click="submitForm">{{ t('common.ok') }}</el-button>
<el-button @click="dialogVisible = false">{{ t('common.cancel') }}</el-button>
</template>
</Dialog>
</template>
@ -86,15 +87,15 @@ const formData = ref({
status: CommonStatusEnum.ENABLE
})
const formRules = reactive<FormRules>({
parentId: [{ required: true, message: '上级部门不能为空', trigger: 'blur' }],
name: [{ required: true, message: '部门名称不能为空', trigger: 'blur' }],
sort: [{ required: true, message: '显示排序不能为空', trigger: 'blur' }],
email: [{ type: 'email', message: '请输入正确的邮箱地址', trigger: ['blur', 'change'] }],
phone: [
{ pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/, message: '请输入正确的手机号码', trigger: 'blur' }
],
status: [{ required: true, message: '状态不能为空', trigger: 'blur' }]
})
parentId: [{ required: true, message: t('SystemManagement.Dept.parentRequired'), trigger: 'blur' }],
name: [{ required: true, message: t('SystemManagement.Dept.nameRequired'), trigger: 'blur' }],
sort: [{ required: true, message: t('SystemManagement.Dept.sortRequired'), trigger: 'blur' }],
email: [{ type: 'email', message: t('SystemManagement.Dept.emailInvalid'), trigger: ['blur', 'change'] }],
phone: [
{ pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/, message: t('SystemManagement.Dept.phoneInvalid'), trigger: 'blur' }
],
status: [{ required: true, message: t('SystemManagement.Dept.statusRequired'), trigger: 'blur' }]
})
const formRef = ref() // Ref
const deptTree = ref() //
const userList = ref<UserApi.UserVO[]>([]) //
@ -172,3 +173,8 @@ const getTree = async () => {
deptTree.value.push(dept)
}
</script>
<style scoped>
.dept-dialog-form :deep(.el-form-item__label) {
min-width: 80px;
}
</style>

@ -2,25 +2,25 @@
<!-- 搜索工作栏 -->
<ContentWrap>
<el-form
class="-mb-15px"
class="-mb-15px dept-search-form"
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="68px"
label-width="auto"
>
<el-form-item label="部门名称" prop="name">
<el-form-item :label="t('SystemManagement.Dept.name')" prop="name">
<el-input
v-model="queryParams.name"
placeholder="请输入部门名称"
:placeholder="t('SystemManagement.Dept.searchNamePlaceholder')"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="部门状态" prop="status">
<el-form-item :label="t('SystemManagement.Dept.statusLabel')" prop="status">
<el-select
v-model="queryParams.status"
placeholder="请选择部门状态"
:placeholder="t('SystemManagement.Dept.searchStatusPlaceholder')"
clearable
class="!w-240px"
>
@ -33,18 +33,18 @@
</el-select>
</el-form-item>
<el-form-item>
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> {{ t('common.query') }}</el-button>
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> {{ t('common.reset') }}</el-button>
<el-button
type="primary"
plain
@click="openForm('create')"
v-hasPermi="['system:dept:create']"
>
<Icon icon="ep:plus" class="mr-5px" /> 新增
<Icon icon="ep:plus" class="mr-5px" /> {{ t('action.add') }}
</el-button>
<el-button type="danger" plain @click="toggleExpandAll">
<Icon icon="ep:sort" class="mr-5px" /> 展开/折叠
<Icon icon="ep:sort" class="mr-5px" /> {{ t('SystemManagement.Dept.toggleExpand') }}
</el-button>
</el-form-item>
</el-form>
@ -59,26 +59,26 @@
:default-expand-all="isExpandAll"
v-if="refreshTable"
>
<el-table-column prop="name" label="部门名称" />
<el-table-column prop="leader" label="负责人">
<el-table-column prop="name" :label="t('SystemManagement.Dept.name')" />
<el-table-column prop="leader" :label="t('SystemManagement.Dept.leader')">
<template #default="scope">
{{ userList.find((user) => user.id === scope.row.leaderUserId)?.nickname }}
</template>
</el-table-column>
<el-table-column prop="sort" label="排序" />
<el-table-column prop="status" label="状态">
<el-table-column prop="sort" :label="t('SystemManagement.Dept.sort')" />
<el-table-column prop="status" :label="t('common.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('common.createTime')"
align="center"
prop="createTime"
width="180"
:formatter="dateFormatter"
/>
<el-table-column label="操作" align="center">
<el-table-column :label="t('table.action')" align="center">
<template #default="scope">
<el-button
link
@ -86,7 +86,7 @@
@click="openForm('update', scope.row.id)"
v-hasPermi="['system:dept:update']"
>
修改
{{ t('action.edit') }}
</el-button>
<el-button
link
@ -94,7 +94,7 @@
@click="handleDelete(scope.row.id)"
v-hasPermi="['system:dept:delete']"
>
删除
{{ t('action.del') }}
</el-button>
</template>
</el-table-column>
@ -188,3 +188,8 @@ onMounted(async () => {
userList.value = await UserApi.getSimpleUserList()
})
</script>
<style scoped>
.dept-search-form :deep(.el-form-item__label) {
min-width: 68px;
}
</style>

@ -5,19 +5,22 @@
v-loading="formLoading"
:model="formData"
:rules="formRules"
label-width="80px"
label-width="auto"
>
<el-form-item label="字典名称" prop="name">
<el-input v-model="formData.name" placeholder="请输入字典名称" />
<el-form-item :label="t('SystemManagement.Dict.name')" prop="name">
<el-input
v-model="formData.name"
:placeholder="t('SystemManagement.Dict.namePlaceholder')"
/>
</el-form-item>
<el-form-item label="字典类型" prop="type">
<el-form-item :label="t('SystemManagement.Dict.type')" prop="type">
<el-input
v-model="formData.type"
:disabled="typeof formData.id !== 'undefined'"
placeholder="请输入参数名称"
:placeholder="t('SystemManagement.Dict.typePlaceholder')"
/>
</el-form-item>
<el-form-item label="状态" prop="status">
<el-form-item :label="t('SystemManagement.Dict.status')" prop="status">
<el-radio-group v-model="formData.status">
<el-radio
v-for="dict in getIntDictOptions(DICT_TYPE.COMMON_STATUS)"
@ -28,13 +31,19 @@
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="formData.remark" placeholder="请输入内容" type="textarea" />
<el-form-item :label="t('SystemManagement.Dict.remark')" prop="remark">
<el-input
v-model="formData.remark"
:placeholder="t('SystemManagement.Dict.remarkPlaceholder')"
type="textarea"
/>
</el-form-item>
</el-form>
<template #footer>
<el-button :disabled="formLoading" type="primary" @click="submitForm"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
<el-button :disabled="formLoading" type="primary" @click="submitForm">
{{ t('common.ok') }}
</el-button>
<el-button @click="dialogVisible = false">{{ t('common.cancel') }}</el-button>
</template>
</Dialog>
</template>
@ -60,9 +69,11 @@ const formData = ref({
remark: ''
})
const formRules = reactive({
name: [{ required: true, message: '字典名称不能为空', trigger: 'blur' }],
type: [{ required: true, message: '字典类型不能为空', trigger: 'blur' }],
status: [{ required: true, message: '状态不能为空', trigger: 'change' }]
name: [{ required: true, message: t('SystemManagement.Dict.nameRequired'), trigger: 'blur' }],
type: [{ required: true, message: t('SystemManagement.Dict.typeRequired'), trigger: 'blur' }],
status: [
{ required: true, message: t('SystemManagement.Dict.statusRequired'), trigger: 'change' }
]
})
const formRef = ref() // Ref

@ -5,25 +5,31 @@
v-loading="formLoading"
:model="formData"
:rules="formRules"
label-width="80px"
label-width="auto"
>
<el-form-item label="字典类型" prop="type">
<el-form-item :label="t('SystemManagement.Dict.type')" prop="type">
<el-input
v-model="formData.dictType"
:disabled="typeof formData.id !== 'undefined'"
placeholder="请输入参数名称"
:placeholder="t('SystemManagement.Dict.typePlaceholder')"
/>
</el-form-item>
<el-form-item label="数据标签" prop="label">
<el-input v-model="formData.label" placeholder="请输入数据标签" />
<el-form-item :label="t('SystemManagement.Dict.label')" prop="label">
<el-input
v-model="formData.label"
:placeholder="t('SystemManagement.Dict.labelPlaceholder')"
/>
</el-form-item>
<el-form-item label="数据键值" prop="value">
<el-input v-model="formData.value" placeholder="请输入数据键值" />
<el-form-item :label="t('SystemManagement.Dict.value')" prop="value">
<el-input
v-model="formData.value"
:placeholder="t('SystemManagement.Dict.valuePlaceholder')"
/>
</el-form-item>
<el-form-item label="显示排序" prop="sort">
<el-form-item :label="t('SystemManagement.Dict.sort')" prop="sort">
<el-input-number v-model="formData.sort" :min="0" controls-position="right" />
</el-form-item>
<el-form-item label="状态" prop="status">
<el-form-item :label="t('SystemManagement.Dict.status')" prop="status">
<el-radio-group v-model="formData.status">
<el-radio
v-for="dict in getIntDictOptions(DICT_TYPE.COMMON_STATUS)"
@ -34,8 +40,11 @@
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="颜色类型" prop="colorType">
<el-select v-model="formData.colorType">
<el-form-item :label="t('SystemManagement.Dict.colorType')" prop="colorType">
<el-select
v-model="formData.colorType"
:placeholder="t('SystemManagement.Dict.colorTypePlaceholder')"
>
<el-option
v-for="item in colorTypeOptions"
:key="item.value"
@ -44,16 +53,25 @@
/>
</el-select>
</el-form-item>
<el-form-item label="CSS Class" prop="cssClass">
<el-input v-model="formData.cssClass" placeholder="请输入 CSS Class" />
<el-form-item :label="t('SystemManagement.Dict.cssClass')" prop="cssClass">
<el-input
v-model="formData.cssClass"
:placeholder="t('SystemManagement.Dict.cssClassPlaceholder')"
/>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="formData.remark" placeholder="请输入内容" type="textarea" />
<el-form-item :label="t('SystemManagement.Dict.remark')" prop="remark">
<el-input
v-model="formData.remark"
:placeholder="t('SystemManagement.Dict.remarkPlaceholder')"
type="textarea"
/>
</el-form-item>
</el-form>
<template #footer>
<el-button :disabled="formLoading" type="primary" @click="submitForm"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
<el-button :disabled="formLoading" type="primary" @click="submitForm">
{{ t('common.ok') }}
</el-button>
<el-button @click="dialogVisible = false">{{ t('common.cancel') }}</el-button>
</template>
</Dialog>
</template>
@ -83,10 +101,12 @@ const formData = ref({
remark: ''
})
const formRules = reactive({
label: [{ required: true, message: '数据标签不能为空', trigger: 'blur' }],
value: [{ required: true, message: '数据键值不能为空', trigger: 'blur' }],
sort: [{ required: true, message: '数据顺序不能为空', trigger: 'blur' }],
status: [{ required: true, message: '状态不能为空', trigger: 'change' }]
label: [{ required: true, message: t('SystemManagement.Dict.labelRequired'), trigger: 'blur' }],
value: [{ required: true, message: t('SystemManagement.Dict.valueRequired'), trigger: 'blur' }],
sort: [{ required: true, message: t('SystemManagement.Dict.sortRequired'), trigger: 'blur' }],
status: [
{ required: true, message: t('SystemManagement.Dict.statusRequired'), trigger: 'change' }
]
})
const formRef = ref() // Ref
@ -94,27 +114,27 @@ const formRef = ref() // 表单 Ref
const colorTypeOptions = readonly([
{
value: 'default',
label: '默认'
label: t('SystemManagement.Dict.colorTypeDefault')
},
{
value: 'primary',
label: '主要'
label: t('SystemManagement.Dict.colorTypePrimary')
},
{
value: 'success',
label: '成功'
label: t('SystemManagement.Dict.colorTypeSuccess')
},
{
value: 'info',
label: '信息'
label: t('SystemManagement.Dict.colorTypeInfo')
},
{
value: 'warning',
label: '警告'
label: t('SystemManagement.Dict.colorTypeWarning')
},
{
value: 'danger',
label: '危险'
label: t('SystemManagement.Dict.colorTypeDanger')
}
])

@ -1,14 +1,18 @@
<template>
<ContentWrap>
<el-form
class="-mb-15px"
class="-mb-15px dict-data-search-form"
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="68px"
label-width="auto"
>
<el-form-item label="字典名称" prop="dictType">
<el-select v-model="queryParams.dictType" class="!w-240px">
<el-form-item :label="t('SystemManagement.Dict.name')" prop="dictType">
<el-select
v-model="queryParams.dictType"
class="!w-240px"
:placeholder="t('SystemManagement.Dict.searchNamePlaceholder')"
>
<el-option
v-for="item in dictTypeList"
:key="item.type"
@ -17,17 +21,22 @@
/>
</el-select>
</el-form-item>
<el-form-item label="字典标签" prop="label">
<el-form-item :label="t('SystemManagement.Dict.label')" prop="label">
<el-input
v-model="queryParams.label"
placeholder="请输入字典标签"
:placeholder="t('SystemManagement.Dict.searchLabelPlaceholder')"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="状态" prop="status">
<el-select v-model="queryParams.status" placeholder="数据状态" clearable class="!w-240px">
<el-form-item :label="t('SystemManagement.Dict.status')" prop="status">
<el-select
v-model="queryParams.status"
:placeholder="t('SystemManagement.Dict.searchDataStatusPlaceholder')"
clearable
class="!w-240px"
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.COMMON_STATUS)"
:key="dict.value"
@ -37,15 +46,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('common.query') }}
</el-button>
<el-button @click="resetQuery">
<Icon icon="ep:refresh" class="mr-5px" />
{{ t('common.reset') }}
</el-button>
<el-button
type="primary"
plain
@click="openForm('create')"
v-hasPermi="['system:dict:create']"
>
<Icon icon="ep:plus" class="mr-5px" /> 新增
<Icon icon="ep:plus" class="mr-5px" />
{{ t('action.add') }}
</el-button>
<el-button
type="success"
@ -54,7 +70,8 @@
:loading="exportLoading"
v-hasPermi="['system:dict:export']"
>
<Icon icon="ep:download" class="mr-5px" /> 导出
<Icon icon="ep:download" class="mr-5px" />
{{ t('action.export') }}
</el-button>
</el-form-item>
</el-form>
@ -63,26 +80,31 @@
<!-- 列表 -->
<ContentWrap>
<el-table v-loading="loading" :data="list">
<el-table-column label="字典编码" align="center" prop="id" />
<el-table-column label="字典标签" align="center" prop="label" />
<el-table-column label="字典键值" align="center" prop="value" />
<el-table-column label="字典排序" align="center" prop="sort" />
<el-table-column label="状态" align="center" prop="status">
<el-table-column :label="t('SystemManagement.Dict.id')" align="center" prop="id" />
<el-table-column :label="t('SystemManagement.Dict.label')" align="center" prop="label" />
<el-table-column :label="t('SystemManagement.Dict.value')" align="center" prop="value" />
<el-table-column :label="t('SystemManagement.Dict.sort')" align="center" prop="sort" />
<el-table-column :label="t('SystemManagement.Dict.status')" align="center" prop="status">
<template #default="scope">
<dict-tag :type="DICT_TYPE.COMMON_STATUS" :value="scope.row.status" />
</template>
</el-table-column>
<el-table-column label="颜色类型" align="center" prop="colorType" />
<el-table-column label="CSS Class" align="center" prop="cssClass" />
<el-table-column label="备注" align="center" prop="remark" show-overflow-tooltip />
<el-table-column :label="t('SystemManagement.Dict.colorType')" align="center" prop="colorType" />
<el-table-column :label="t('SystemManagement.Dict.cssClass')" align="center" prop="cssClass" />
<el-table-column
:label="t('SystemManagement.Dict.remark')"
align="center"
prop="remark"
show-overflow-tooltip
/>
<el-table-column
label="创建时间"
:label="t('common.createTime')"
align="center"
prop="createTime"
width="180"
:formatter="dateFormatter"
/>
<el-table-column label="操作" align="center">
<el-table-column :label="t('common.operate')" align="center">
<template #default="scope">
<el-button
link
@ -90,7 +112,7 @@
@click="openForm('update', scope.row.id)"
v-hasPermi="['system:dict:update']"
>
修改
{{ t('action.edit') }}
</el-button>
<el-button
link
@ -98,7 +120,7 @@
@click="handleDelete(scope.row.id)"
v-hasPermi="['system:dict:delete']"
>
删除
{{ t('action.del') }}
</el-button>
</template>
</el-table-column>
@ -194,7 +216,7 @@ const handleExport = async () => {
//
exportLoading.value = true
const data = await DictDataApi.exportDictData(queryParams)
download.excel(data, '字典数据.xls')
download.excel(data, t('SystemManagement.Dict.dataExportFilename'))
} catch {
} finally {
exportLoading.value = false
@ -208,3 +230,9 @@ onMounted(async () => {
dictTypeList.value = await DictTypeApi.getSimpleDictTypeList()
})
</script>
<style scoped>
.dict-data-search-form :deep(.el-form-item__label) {
min-width: 68px;
}
</style>

@ -5,33 +5,33 @@
ref="queryFormRef"
:inline="true"
:model="queryParams"
class="-mb-15px"
label-width="68px"
class="-mb-15px dict-search-form"
label-width="auto"
>
<el-form-item label="字典名称" prop="name">
<el-form-item :label="t('SystemManagement.Dict.name')" prop="name">
<el-input
v-model="queryParams.name"
class="!w-240px"
clearable
placeholder="请输入字典名称"
:placeholder="t('SystemManagement.Dict.searchNamePlaceholder')"
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item label="字典类型" prop="type">
<el-form-item :label="t('SystemManagement.Dict.type')" prop="type">
<el-input
v-model="queryParams.type"
class="!w-240px"
clearable
placeholder="请输入字典类型"
:placeholder="t('SystemManagement.Dict.searchTypePlaceholder')"
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item label="状态" prop="status">
<el-form-item :label="t('SystemManagement.Dict.status')" prop="status">
<el-select
v-model="queryParams.status"
class="!w-240px"
clearable
placeholder="请选择字典状态"
:placeholder="t('SystemManagement.Dict.searchStatusPlaceholder')"
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.COMMON_STATUS)"
@ -41,13 +41,13 @@
/>
</el-select>
</el-form-item>
<el-form-item label="创建时间" prop="createTime">
<el-form-item :label="t('common.createTime')" prop="createTime">
<el-date-picker
v-model="queryParams.createTime"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-240px"
end-placeholder="结束日期"
start-placeholder="开始日期"
:end-placeholder="t('common.endTimeText')"
:start-placeholder="t('common.startTimeText')"
type="daterange"
value-format="YYYY-MM-DD HH:mm:ss"
/>
@ -55,11 +55,11 @@
<el-form-item>
<el-button @click="handleQuery">
<Icon class="mr-5px" icon="ep:search" />
搜索
{{ t('common.query') }}
</el-button>
<el-button @click="resetQuery">
<Icon class="mr-5px" icon="ep:refresh" />
重置
{{ t('common.reset') }}
</el-button>
<el-button
v-hasPermi="['system:dict:create']"
@ -68,7 +68,7 @@
@click="openForm('create')"
>
<Icon class="mr-5px" icon="ep:plus" />
新增
{{ t('action.add') }}
</el-button>
<el-button
v-hasPermi="['system:dict:export']"
@ -78,7 +78,7 @@
@click="handleExport"
>
<Icon class="mr-5px" icon="ep:download" />
导出
{{ t('action.export') }}
</el-button>
</el-form-item>
</el-form>
@ -87,23 +87,33 @@
<!-- 列表 -->
<ContentWrap>
<el-table v-loading="loading" :data="list">
<el-table-column align="center" label="字典编号" prop="id" />
<el-table-column align="center" label="字典名称" prop="name" show-overflow-tooltip />
<el-table-column align="center" label="字典类型" prop="type" width="300" />
<el-table-column align="center" label="状态" prop="status">
<el-table-column align="center" :label="t('SystemManagement.Dict.id')" prop="id" />
<el-table-column
align="center"
:label="t('SystemManagement.Dict.name')"
prop="name"
show-overflow-tooltip
/>
<el-table-column
align="center"
:label="t('SystemManagement.Dict.type')"
prop="type"
width="300"
/>
<el-table-column align="center" :label="t('SystemManagement.Dict.status')" prop="status">
<template #default="scope">
<dict-tag :type="DICT_TYPE.COMMON_STATUS" :value="scope.row.status" />
</template>
</el-table-column>
<el-table-column align="center" label="备注" prop="remark" />
<el-table-column align="center" :label="t('SystemManagement.Dict.remark')" prop="remark" />
<el-table-column
:formatter="dateFormatter"
align="center"
label="创建时间"
:label="t('common.createTime')"
prop="createTime"
width="180"
/>
<el-table-column align="center" label="操作">
<el-table-column align="center" :label="t('common.operate')">
<template #default="scope">
<el-button
v-hasPermi="['system:dict:update']"
@ -111,10 +121,10 @@
type="primary"
@click="openForm('update', scope.row.id)"
>
修改
{{ t('action.edit') }}
</el-button>
<router-link :to="'/dict/type/data/' + scope.row.type">
<el-button link type="primary">数据</el-button>
<el-button link type="primary">{{ t('SystemManagement.Dict.data') }}</el-button>
</router-link>
<el-button
v-hasPermi="['system:dict:delete']"
@ -122,7 +132,7 @@
type="danger"
@click="handleDelete(scope.row.id)"
>
删除
{{ t('action.del') }}
</el-button>
</template>
</el-table-column>
@ -217,7 +227,7 @@ const handleExport = async () => {
//
exportLoading.value = true
const data = await DictTypeApi.exportDictType(queryParams)
download.excel(data, '字典类型.xls')
download.excel(data, t('SystemManagement.Dict.typeExportFilename'))
} catch {
} finally {
exportLoading.value = false
@ -229,3 +239,9 @@ onMounted(() => {
getList()
})
</script>
<style scoped>
.dict-search-form :deep(.el-form-item__label) {
min-width: 68px;
}
</style>

@ -5,9 +5,10 @@
v-loading="formLoading"
:model="formData"
:rules="formRules"
label-width="100px"
label-width="auto"
class="system-menu-form"
>
<el-form-item label="上级菜单">
<el-form-item :label="t('SystemManagement.Menu.parent')">
<el-tree-select
v-model="formData.parentId"
:data="menuTree"
@ -17,10 +18,10 @@
node-key="id"
/>
</el-form-item>
<el-form-item label="菜单名称" prop="name">
<el-input v-model="formData.name" clearable placeholder="请输入菜单名称" />
<el-form-item :label="t('SystemManagement.Menu.name')" prop="name">
<el-input v-model="formData.name" clearable :placeholder="t('SystemManagement.Menu.namePlaceholder')" />
</el-form-item>
<el-form-item label="菜单类型" prop="type">
<el-form-item :label="t('SystemManagement.Menu.type')" prop="type">
<el-radio-group v-model="formData.type">
<el-radio-button
v-for="dict in getIntDictOptions(DICT_TYPE.SYSTEM_MENU_TYPE)"
@ -31,37 +32,37 @@
</el-radio-button>
</el-radio-group>
</el-form-item>
<el-form-item v-if="formData.type !== 3" label="菜单图标">
<el-form-item v-if="formData.type !== 3" :label="t('SystemManagement.Menu.icon')">
<IconSelect v-model="formData.icon" clearable />
</el-form-item>
<el-form-item v-if="formData.type !== 3" label="路由地址" prop="path">
<el-form-item v-if="formData.type !== 3" :label="t('SystemManagement.Menu.path')" prop="path">
<template #label>
<Tooltip
message="访问的路由地址,如:`user`。如需外网地址时,则以 `http(s)://` 开头"
title="路由地址"
:message="t('SystemManagement.Menu.pathTooltipMessage')"
:title="t('SystemManagement.Menu.pathTooltipTitle')"
/>
</template>
<el-input v-model="formData.path" clearable placeholder="请输入路由地址" />
<el-input v-model="formData.path" clearable :placeholder="t('SystemManagement.Menu.pathPlaceholder')" />
</el-form-item>
<el-form-item v-if="formData.type === 2" label="组件地址" prop="component">
<el-input v-model="formData.component" clearable placeholder="例如说system/user/index" />
<el-form-item v-if="formData.type === 2" :label="t('SystemManagement.Menu.component')" prop="component">
<el-input v-model="formData.component" clearable :placeholder="t('SystemManagement.Menu.componentPlaceholder')" />
</el-form-item>
<el-form-item v-if="formData.type === 2" label="组件名字" prop="componentName">
<el-input v-model="formData.componentName" clearable placeholder="例如说SystemUser" />
<el-form-item v-if="formData.type === 2" :label="t('SystemManagement.Menu.componentName')" prop="componentName">
<el-input v-model="formData.componentName" clearable :placeholder="t('SystemManagement.Menu.componentNamePlaceholder')" />
</el-form-item>
<el-form-item v-if="formData.type !== 1" label="权限标识" prop="permission">
<el-form-item v-if="formData.type !== 1" :label="t('SystemManagement.Menu.permission')" prop="permission">
<template #label>
<Tooltip
message="Controller 方法上的权限字符,如:@PreAuthorize(`@ss.hasPermission('system:user:list')`)"
title="权限标识"
:message="t('SystemManagement.Menu.permissionTooltipMessage')"
:title="t('SystemManagement.Menu.permissionTooltipTitle')"
/>
</template>
<el-input v-model="formData.permission" clearable placeholder="请输入权限标识" />
<el-input v-model="formData.permission" clearable :placeholder="t('SystemManagement.Menu.permissionPlaceholder')" />
</el-form-item>
<el-form-item label="显示排序" prop="sort">
<el-form-item :label="t('SystemManagement.Menu.sort')" prop="sort">
<el-input-number v-model="formData.sort" :min="0" clearable controls-position="right" />
</el-form-item>
<el-form-item label="菜单状态" prop="status">
<el-form-item :label="t('SystemManagement.Menu.status')" prop="status">
<el-radio-group v-model="formData.status">
<el-radio
v-for="dict in getIntDictOptions(DICT_TYPE.COMMON_STATUS)"
@ -72,43 +73,43 @@
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item v-if="formData.type !== 3" label="显示状态" prop="visible">
<el-form-item v-if="formData.type !== 3" :label="t('SystemManagement.Menu.visible')" prop="visible">
<template #label>
<Tooltip message="选择隐藏时,路由将不会出现在侧边栏,但仍然可以访问" title="显示状态" />
<Tooltip :message="t('SystemManagement.Menu.visibleTooltipMessage')" :title="t('SystemManagement.Menu.visibleTooltipTitle')" />
</template>
<el-radio-group v-model="formData.visible">
<el-radio key="true" :value="true" border>显示</el-radio>
<el-radio key="false" :value="false" border>隐藏</el-radio>
<el-radio key="true" :value="true" border>{{ t('SystemManagement.Menu.visibleShow') }}</el-radio>
<el-radio key="false" :value="false" border>{{ t('SystemManagement.Menu.visibleHide') }}</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item v-if="formData.type !== 3" label="总是显示" prop="alwaysShow">
<el-form-item v-if="formData.type !== 3" :label="t('SystemManagement.Menu.alwaysShow')" prop="alwaysShow">
<template #label>
<Tooltip
message="选择不是时,当该菜单只有一个子菜单时,不展示自己,直接展示子菜单"
title="总是显示"
:message="t('SystemManagement.Menu.alwaysShowTooltipMessage')"
:title="t('SystemManagement.Menu.alwaysShowTooltipTitle')"
/>
</template>
<el-radio-group v-model="formData.alwaysShow">
<el-radio key="true" :value="true" border>总是</el-radio>
<el-radio key="false" :value="false" border>不是</el-radio>
<el-radio key="true" :value="true" border>{{ t('SystemManagement.Menu.always') }}</el-radio>
<el-radio key="false" :value="false" border>{{ t('SystemManagement.Menu.notAlways') }}</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item v-if="formData.type === 2" label="缓存状态" prop="keepAlive">
<el-form-item v-if="formData.type === 2" :label="t('SystemManagement.Menu.keepAlive')" prop="keepAlive">
<template #label>
<Tooltip
message="选择缓存时,则会被 `keep-alive` 缓存,必须填写「组件名称」字段"
title="缓存状态"
:message="t('SystemManagement.Menu.keepAliveTooltipMessage')"
:title="t('SystemManagement.Menu.keepAliveTooltipTitle')"
/>
</template>
<el-radio-group v-model="formData.keepAlive">
<el-radio key="true" :value="true" border>缓存</el-radio>
<el-radio key="false" :value="false" border>不缓存</el-radio>
<el-radio key="true" :value="true" border>{{ t('SystemManagement.Menu.keep') }}</el-radio>
<el-radio key="false" :value="false" border>{{ t('SystemManagement.Menu.notKeep') }}</el-radio>
</el-radio-group>
</el-form-item>
</el-form>
<template #footer>
<el-button :disabled="formLoading" type="primary" @click="submitForm"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
<el-button :disabled="formLoading" type="primary" @click="submitForm">{{ t('common.ok') }}</el-button>
<el-button @click="dialogVisible = false">{{ t('common.cancel') }}</el-button>
</template>
</Dialog>
</template>
@ -146,10 +147,10 @@ const formData = ref({
alwaysShow: true
})
const formRules = reactive({
name: [{ required: true, message: '菜单名称不能为空', trigger: 'blur' }],
sort: [{ required: true, message: '菜单顺序不能为空', trigger: 'blur' }],
path: [{ required: true, message: '路由地址不能为空', trigger: 'blur' }],
status: [{ required: true, message: '状态不能为空', trigger: 'blur' }]
name: [{ required: true, message: t('SystemManagement.Menu.nameRequired'), trigger: 'blur' }],
sort: [{ required: true, message: t('SystemManagement.Menu.sortRequired'), trigger: 'blur' }],
path: [{ required: true, message: t('SystemManagement.Menu.pathRequired'), trigger: 'blur' }],
status: [{ required: true, message: t('SystemManagement.Menu.statusRequired'), trigger: 'blur' }]
})
const formRef = ref() // Ref
@ -192,10 +193,10 @@ const submitForm = async () => {
) {
if (!isExternal(formData.value.path)) {
if (formData.value.parentId === 0 && formData.value.path.charAt(0) !== '/') {
message.error('路径必须以 / 开头')
message.error(t('SystemManagement.Menu.pathMustStartWithSlash'))
return
} else if (formData.value.parentId !== 0 && formData.value.path.charAt(0) === '/') {
message.error('路径不能以 / 开头')
message.error(t('SystemManagement.Menu.pathMustNotStartWithSlash'))
return
}
}
@ -223,7 +224,7 @@ const menuTree = ref<Tree[]>([]) // 树形结构
const getTree = async () => {
menuTree.value = []
const res = await MenuApi.getSimpleMenusList()
let menu: Tree = { id: 0, name: '主类目', children: [] }
let menu: Tree = { id: 0, name: t('SystemManagement.Menu.parentRoot'), children: [] }
menu.children = handleTree(res)
menuTree.value.push(menu)
}

@ -8,24 +8,24 @@
ref="queryFormRef"
:inline="true"
:model="queryParams"
class="-mb-15px"
label-width="68px"
class="-mb-15px system-menu-query-form"
label-width="auto"
>
<el-form-item label="菜单名称" prop="name">
<el-form-item :label="t('SystemManagement.Menu.name')" prop="name">
<el-input
v-model="queryParams.name"
class="!w-240px"
clearable
placeholder="请输入菜单名称"
:placeholder="t('SystemManagement.Menu.searchNamePlaceholder')"
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item label="状态" prop="status">
<el-form-item :label="t('SystemManagement.Menu.status')" prop="status">
<el-select
v-model="queryParams.status"
class="!w-240px"
clearable
placeholder="请选择菜单状态"
:placeholder="t('SystemManagement.Menu.searchStatusPlaceholder')"
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.COMMON_STATUS)"
@ -38,11 +38,11 @@
<el-form-item>
<el-button @click="handleQuery">
<Icon class="mr-5px" icon="ep:search" />
搜索
{{ t('common.query') }}
</el-button>
<el-button @click="resetQuery">
<Icon class="mr-5px" icon="ep:refresh" />
重置
{{ t('common.reset') }}
</el-button>
<el-button
v-hasPermi="['system:menu:create']"
@ -51,15 +51,15 @@
@click="openForm('create')"
>
<Icon class="mr-5px" icon="ep:plus" />
新增
{{ t('action.add') }}
</el-button>
<el-button plain type="danger" @click="toggleExpandAll">
<Icon class="mr-5px" icon="ep:sort" />
展开/折叠
{{ t('SystemManagement.Menu.toggleExpand') }}
</el-button>
<el-button plain @click="refreshMenu">
<Icon class="mr-5px" icon="ep:refresh" />
刷新菜单缓存
{{ t('SystemManagement.Menu.refreshCache') }}
</el-button>
</el-form-item>
</el-form>
@ -74,17 +74,17 @@
:default-expand-all="isExpandAll"
row-key="id"
>
<el-table-column :show-overflow-tooltip="true" label="菜单名称" prop="name" width="250" />
<el-table-column align="center" label="图标" prop="icon" width="100">
<el-table-column :show-overflow-tooltip="true" :label="t('SystemManagement.Menu.name')" prop="name" width="250" />
<el-table-column align="center" :label="t('SystemManagement.Menu.icon')" prop="icon" width="100">
<template #default="scope">
<Icon :icon="scope.row.icon" />
</template>
</el-table-column>
<el-table-column label="排序" prop="sort" width="60" />
<el-table-column :show-overflow-tooltip="true" label="权限标识" prop="permission" />
<el-table-column :show-overflow-tooltip="true" label="组件路径" prop="component" />
<el-table-column :show-overflow-tooltip="true" label="组件名称" prop="componentName" />
<el-table-column label="状态" prop="status">
<el-table-column :label="t('SystemManagement.Menu.sort')" prop="sort" width="60" />
<el-table-column :show-overflow-tooltip="true" :label="t('SystemManagement.Menu.permission')" prop="permission" />
<el-table-column :show-overflow-tooltip="true" :label="t('SystemManagement.Menu.component')" prop="component" />
<el-table-column :show-overflow-tooltip="true" :label="t('SystemManagement.Menu.componentName')" prop="componentName" />
<el-table-column :label="t('SystemManagement.Menu.status')" prop="status">
<template #default="scope">
<el-switch
class="ml-4px"
@ -97,7 +97,7 @@
/>
</template>
</el-table-column>
<el-table-column align="center" label="操作">
<el-table-column align="center" :label="t('SystemManagement.Menu.actions')">
<template #default="scope">
<el-button
v-hasPermi="['system:menu:update']"
@ -105,7 +105,7 @@
type="primary"
@click="openForm('update', scope.row.id)"
>
修改
{{ t('action.edit') }}
</el-button>
<el-button
v-hasPermi="['system:menu:create']"
@ -113,7 +113,7 @@
type="primary"
@click="openForm('create', undefined, scope.row.id)"
>
新增
{{ t('action.add') }}
</el-button>
<el-button
v-hasPermi="['system:menu:delete']"
@ -121,7 +121,7 @@
type="danger"
@click="handleDelete(scope.row.id)"
>
删除
{{ t('action.delete') }}
</el-button>
</template>
</el-table-column>
@ -196,7 +196,7 @@ const toggleExpandAll = () => {
/** 刷新菜单缓存按钮操作 */
const refreshMenu = async () => {
try {
await message.confirm('即将更新缓存刷新浏览器!', '刷新菜单缓存')
await message.confirm(t('SystemManagement.Menu.updateCacheConfirm'), t('SystemManagement.Menu.updateCacheTitle'))
//
wsCache.delete(CACHE_KEY.USER)
wsCache.delete(CACHE_KEY.ROLE_ROUTERS)

@ -5,19 +5,20 @@
v-loading="formLoading"
:model="formData"
:rules="formRules"
label-width="80px"
label-width="auto"
class="post-dialog-form"
>
<el-form-item label="岗位编码" prop="code">
<el-input v-model="formData.code" placeholder="请输入岗位编码" />
<el-form-item :label="t('SystemManagement.Post.code')" prop="code">
<el-input v-model="formData.code" :placeholder="t('SystemManagement.Post.codePlaceholder')" />
</el-form-item>
<el-form-item label="岗位名称" prop="name">
<el-input v-model="formData.name" placeholder="请输入岗位名称" />
<el-form-item :label="t('SystemManagement.Post.name')" prop="name">
<el-input v-model="formData.name" :placeholder="t('SystemManagement.Post.namePlaceholder')" />
</el-form-item>
<el-form-item label="岗位顺序" prop="sort">
<el-input v-model="formData.sort" placeholder="请输入岗位顺序" />
<el-form-item :label="t('SystemManagement.Post.sort')" prop="sort">
<el-input v-model="formData.sort" :placeholder="t('SystemManagement.Post.sortPlaceholder')" />
</el-form-item>
<el-form-item label="状态" prop="status">
<el-select v-model="formData.status" clearable placeholder="请选择状态">
<el-form-item :label="t('SystemManagement.Post.status')" prop="status">
<el-select v-model="formData.status" clearable :placeholder="t('SystemManagement.Post.statusPlaceholder')">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.COMMON_STATUS)"
:key="dict.value"
@ -26,13 +27,13 @@
/>
</el-select>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="formData.remark" placeholder="请输备注" type="textarea" />
<el-form-item :label="t('SystemManagement.Post.remark')" prop="remark">
<el-input v-model="formData.remark" :placeholder="t('SystemManagement.Post.remarkPlaceholder')" type="textarea" />
</el-form-item>
</el-form>
<template #footer>
<el-button :disabled="formLoading" type="primary" @click="submitForm"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
<el-button :disabled="formLoading" type="primary" @click="submitForm">{{ t('common.ok') }}</el-button>
<el-button @click="dialogVisible = false">{{ t('common.cancel') }}</el-button>
</template>
</Dialog>
</template>
@ -59,11 +60,11 @@ const formData = ref({
remark: ''
})
const formRules = reactive({
name: [{ required: true, message: '岗位名称不能为空', trigger: 'blur' }],
code: [{ required: true, message: '岗位编码不能为空', trigger: 'change' }],
sort: [{ required: true, message: '岗位顺序不能为空', trigger: 'blur' }],
status: [{ required: true, message: '岗位状态不能为空', trigger: 'change' }],
remark: [{ required: false, message: '岗位内容不能为空', trigger: 'blur' }]
name: [{ required: true, message: t('SystemManagement.Post.nameRequired'), trigger: 'blur' }],
code: [{ required: true, message: t('SystemManagement.Post.codeRequired'), trigger: 'change' }],
sort: [{ required: true, message: t('SystemManagement.Post.sortRequired'), trigger: 'blur' }],
status: [{ required: true, message: t('SystemManagement.Post.statusRequired'), trigger: 'change' }],
remark: [{ required: false, message: t('SystemManagement.Post.remarkPlaceholder'), trigger: 'blur' }]
})
const formRef = ref() // Ref
@ -124,3 +125,8 @@ const resetForm = () => {
formRef.value?.resetFields()
}
</script>
<style scoped>
.post-dialog-form :deep(.el-form-item__label) {
min-width: 80px;
}
</style>

@ -2,32 +2,37 @@
<ContentWrap>
<!-- 搜索工作栏 -->
<el-form
class="-mb-15px"
class="-mb-15px post-search-form"
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="68px"
label-width="auto"
>
<el-form-item label="岗位名称" prop="name">
<el-form-item :label="t('SystemManagement.Post.name')" prop="name">
<el-input
v-model="queryParams.name"
placeholder="请输入岗位名称"
:placeholder="t('SystemManagement.Post.searchNamePlaceholder')"
clearable
class="!w-240px"
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item label="岗位编码" prop="code">
<el-form-item :label="t('SystemManagement.Post.code')" prop="code">
<el-input
v-model="queryParams.code"
placeholder="请输入岗位编码"
:placeholder="t('SystemManagement.Post.searchCodePlaceholder')"
clearable
class="!w-240px"
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item label="状态" prop="status">
<el-select v-model="queryParams.status" placeholder="请选择状态" clearable class="!w-240px">
<el-form-item :label="t('SystemManagement.Post.status')" prop="status">
<el-select
v-model="queryParams.status"
:placeholder="t('SystemManagement.Post.searchStatusPlaceholder')"
clearable
class="!w-240px"
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.COMMON_STATUS)"
:key="dict.value"
@ -37,15 +42,15 @@
</el-select>
</el-form-item>
<el-form-item>
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> {{ t('common.query') }}</el-button>
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> {{ t('common.reset') }}</el-button>
<el-button
type="primary"
plain
@click="openForm('create')"
v-hasPermi="['system:post:create']"
>
<Icon icon="ep:plus" class="mr-5px" /> 新增
<Icon icon="ep:plus" class="mr-5px" /> {{ t('action.add') }}
</el-button>
<el-button
type="success"
@ -54,7 +59,7 @@
:loading="exportLoading"
v-hasPermi="['system:post:export']"
>
<Icon icon="ep:download" class="mr-5px" /> 导出
<Icon icon="ep:download" class="mr-5px" /> {{ t('action.export') }}
</el-button>
</el-form-item>
</el-form>
@ -63,23 +68,23 @@
<!-- 列表 -->
<ContentWrap>
<el-table v-loading="loading" :data="list">
<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="remark" />
<el-table-column label="状态" align="center" prop="status">
<el-table-column :label="t('SystemManagement.Post.code')" align="center" prop="code" />
<el-table-column :label="t('SystemManagement.Post.name')" align="center" prop="name" />
<el-table-column :label="t('SystemManagement.Post.sort')" align="center" prop="sort" />
<el-table-column :label="t('SystemManagement.Post.remark')" align="center" prop="remark" />
<el-table-column :label="t('common.status')" align="center" prop="status">
<template #default="scope">
<dict-tag :type="DICT_TYPE.COMMON_STATUS" :value="scope.row.status" />
</template>
</el-table-column>
<el-table-column
label="创建时间"
:label="t('common.createTime')"
align="center"
prop="createTime"
width="180"
:formatter="dateFormatter"
/>
<el-table-column label="操作" align="center">
<el-table-column :label="t('table.action')" align="center">
<template #default="scope">
<el-button
link
@ -87,7 +92,7 @@
@click="openForm('update', scope.row.id)"
v-hasPermi="['system:post:update']"
>
编辑
{{ t('action.edit') }}
</el-button>
<el-button
link
@ -95,7 +100,7 @@
@click="handleDelete(scope.row.id)"
v-hasPermi="['system:post:delete']"
>
删除
{{ t('action.del') }}
</el-button>
</template>
</el-table-column>

@ -1,28 +1,34 @@
<template>
<Dialog v-model="dialogVisible" title="菜单权限">
<el-form ref="formRef" v-loading="formLoading" :model="formData" label-width="80px">
<el-form-item label="角色名称">
<Dialog v-model="dialogVisible" :title="t('SystemManagement.Role.menuPermission')">
<el-form
ref="formRef"
v-loading="formLoading"
:model="formData"
label-width="auto"
class="role-assign-menu-form"
>
<el-form-item :label="t('SystemManagement.Role.name')">
<el-tag>{{ formData.name }}</el-tag>
</el-form-item>
<el-form-item label="角色标识">
<el-form-item :label="t('SystemManagement.Role.code')">
<el-tag>{{ formData.code }}</el-tag>
</el-form-item>
<el-form-item label="菜单权限">
<el-form-item :label="t('SystemManagement.Role.menuPermission')">
<el-card class="w-full h-400px !overflow-y-scroll" shadow="never">
<template #header>
全选/全不选:
{{ t('SystemManagement.Role.selectAll') }}:
<el-switch
v-model="treeNodeAll"
active-text=""
inactive-text=""
:active-text="t('SystemManagement.Role.yes')"
:inactive-text="t('SystemManagement.Role.no')"
inline-prompt
@change="handleCheckedTreeNodeAll"
/>
全部展开/折叠:
{{ t('SystemManagement.Role.expandCollapse') }}:
<el-switch
v-model="menuExpand"
active-text="展开"
inactive-text="折叠"
:active-text="t('SystemManagement.Role.yes')"
:inactive-text="t('SystemManagement.Role.no')"
inline-prompt
@change="handleCheckedTreeExpand"
/>
@ -31,7 +37,7 @@
ref="treeRef"
:data="menuOptions"
:props="defaultProps"
empty-text="加载中,请稍候"
:empty-text="t('SystemManagement.Role.loadingText')"
node-key="id"
show-checkbox
/>
@ -39,8 +45,8 @@
</el-form-item>
</el-form>
<template #footer>
<el-button :disabled="formLoading" type="primary" @click="submitForm"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
<el-button :disabled="formLoading" type="primary" @click="submitForm">{{ t('common.ok') }}</el-button>
<el-button @click="dialogVisible = false">{{ t('common.cancel') }}</el-button>
</template>
</Dialog>
</template>
@ -81,9 +87,9 @@ const open = async (row: RoleApi.RoleVO) => {
formData.code = row.code
formLoading.value = true
try {
formData.value.menuIds = await PermissionApi.getRoleMenuList(row.id)
formData.menuIds = await PermissionApi.getRoleMenuList(row.id)
//
formData.value.menuIds.forEach((menuId: number) => {
formData.menuIds.forEach((menuId: number) => {
treeRef.value.setChecked(menuId, true, false)
})
} finally {
@ -125,12 +131,10 @@ const resetForm = () => {
treeNodeAll.value = false
menuExpand.value = false
//
formData.value = {
id: undefined,
name: '',
code: '',
menuIds: []
}
formData.id = undefined
formData.name = ''
formData.code = ''
formData.menuIds = []
treeRef.value?.setCheckedNodes([])
formRef.value?.resetFields()
}
@ -151,3 +155,9 @@ const handleCheckedTreeExpand = () => {
}
}
</script>
<style scoped>
.role-assign-menu-form :deep(.el-form-item__label) {
min-width: 80px;
}
</style>

@ -5,19 +5,20 @@
v-loading="formLoading"
:model="formData"
:rules="formRules"
label-width="80px"
label-width="auto"
class="role-dialog-form"
>
<el-form-item label="角色编码" prop="code">
<el-input v-model="formData.code" placeholder="请输入角色编码" />
<el-form-item :label="t('SystemManagement.Role.code')" prop="code">
<el-input v-model="formData.code" :placeholder="t('SystemManagement.Role.codePlaceholder')" />
</el-form-item>
<el-form-item label="角色名称" prop="name">
<el-input v-model="formData.name" placeholder="请输入角色名称" />
<el-form-item :label="t('SystemManagement.Role.name')" prop="name">
<el-input v-model="formData.name" :placeholder="t('SystemManagement.Role.namePlaceholder')" />
</el-form-item>
<el-form-item label="显示顺序" prop="sort">
<el-input v-model="formData.sort" placeholder="请输入显示顺序" />
<el-form-item :label="t('SystemManagement.Role.sort')" prop="sort">
<el-input v-model="formData.sort" :placeholder="t('SystemManagement.Role.sortPlaceholder')" />
</el-form-item>
<el-form-item label="状态" prop="status">
<el-select v-model="formData.status" clearable placeholder="请选择状态">
<el-form-item :label="t('SystemManagement.Role.status')" prop="status">
<el-select v-model="formData.status" clearable :placeholder="t('SystemManagement.Role.statusPlaceholder')">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.COMMON_STATUS)"
:key="dict.value"
@ -26,13 +27,13 @@
/>
</el-select>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="formData.remark" placeholder="请输备注" type="textarea" />
<el-form-item :label="t('SystemManagement.Role.remark')" prop="remark">
<el-input v-model="formData.remark" :placeholder="t('SystemManagement.Role.remarkPlaceholder')" type="textarea" />
</el-form-item>
</el-form>
<template #footer>
<el-button :disabled="formLoading" type="primary" @click="submitForm"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
<el-button :disabled="formLoading" type="primary" @click="submitForm">{{ t('common.ok') }}</el-button>
<el-button @click="dialogVisible = false">{{ t('common.cancel') }}</el-button>
</template>
</Dialog>
</template>
@ -59,11 +60,10 @@ const formData = ref({
remark: ''
})
const formRules = reactive({
name: [{ required: true, message: '角色名称不能为空', trigger: 'blur' }],
code: [{ required: true, message: '角色标识不能为空', trigger: 'change' }],
sort: [{ required: true, message: '显示顺序不能为空', trigger: 'change' }],
status: [{ required: true, message: '状态不能为空', trigger: 'change' }],
remark: [{ required: false, message: '备注不能为空', trigger: 'blur' }]
name: [{ required: true, message: t('SystemManagement.Role.nameRequired'), trigger: 'blur' }],
code: [{ required: true, message: t('SystemManagement.Role.codeRequired'), trigger: 'change' }],
sort: [{ required: true, message: t('SystemManagement.Role.sortRequired'), trigger: 'change' }],
status: [{ required: true, message: t('SystemManagement.Role.statusRequired'), trigger: 'change' }]
})
const formRef = ref() // Ref
@ -124,3 +124,9 @@ const submitForm = async () => {
}
}
</script>
<style scoped>
.role-dialog-form :deep(.el-form-item__label) {
min-width: 80px;
}
</style>

@ -1,34 +1,38 @@
<template>
<ContentWrap>
<!-- 搜索工作栏 -->
<el-form
ref="queryFormRef"
:inline="true"
:model="queryParams"
class="-mb-15px"
label-width="68px"
class="-mb-15px role-search-form"
label-width="auto"
>
<el-form-item label="角色编码" prop="code">
<el-form-item :label="t('SystemManagement.Role.code')" prop="code">
<el-input
v-model="queryParams.code"
class="!w-240px"
clearable
placeholder="请输入角色编码"
:placeholder="t('SystemManagement.Role.searchCodePlaceholder')"
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item label="角色名称" prop="name">
<el-form-item :label="t('SystemManagement.Role.name')" prop="name">
<el-input
v-model="queryParams.name"
class="!w-240px"
clearable
placeholder="请输入角色名称"
:placeholder="t('SystemManagement.Role.searchNamePlaceholder')"
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item label="状态" prop="status">
<el-select v-model="queryParams.status" class="!w-240px" clearable placeholder="请选择状态">
<el-form-item :label="t('SystemManagement.Role.status')" prop="status">
<el-select
v-model="queryParams.status"
class="!w-240px"
clearable
:placeholder="t('SystemManagement.Role.searchStatusPlaceholder')"
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.COMMON_STATUS)"
:key="dict.value"
@ -37,13 +41,13 @@
/>
</el-select>
</el-form-item>
<el-form-item label="创建时间" prop="createTime">
<el-form-item :label="t('common.createTime')" prop="createTime">
<el-date-picker
v-model="queryParams.createTime"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-240px"
end-placeholder="结束日期"
start-placeholder="开始日期"
:end-placeholder="t('common.endTimeText')"
:start-placeholder="t('common.startTimeText')"
type="daterange"
value-format="YYYY-MM-DD HH:mm:ss"
/>
@ -51,11 +55,11 @@
<el-form-item>
<el-button @click="handleQuery">
<Icon class="mr-5px" icon="ep:search" />
搜索
{{ t('common.query') }}
</el-button>
<el-button @click="resetQuery">
<Icon class="mr-5px" icon="ep:refresh" />
重置
{{ t('common.reset') }}
</el-button>
<el-button
v-hasPermi="['system:role:create']"
@ -64,7 +68,7 @@
@click="openForm('create')"
>
<Icon class="mr-5px" icon="ep:plus" />
新增
{{ t('action.add') }}
</el-button>
<el-button
v-hasPermi="['system:role:export']"
@ -74,7 +78,7 @@
@click="handleExport"
>
<Icon class="mr-5px" icon="ep:download" />
导出
{{ t('action.export') }}
</el-button>
</el-form-item>
</el-form>
@ -83,16 +87,16 @@
<!-- 列表 -->
<ContentWrap>
<el-table v-loading="loading" :data="list">
<el-table-column align="center" label="角色编码" prop="code" />
<el-table-column align="center" label="角色名称" prop="name" />
<el-table-column label="角色类型" align="center" prop="type">
<el-table-column align="center" :label="t('SystemManagement.Role.code')" prop="code" />
<el-table-column align="center" :label="t('SystemManagement.Role.name')" prop="name" />
<el-table-column :label="t('SystemManagement.Role.type')" align="center" prop="type">
<template #default="scope">
<dict-tag :type="DICT_TYPE.SYSTEM_ROLE_TYPE" :value="scope.row.type" />
</template>
</el-table-column>
<el-table-column align="center" label="显示顺序" prop="sort" />
<el-table-column align="center" label="备注" prop="remark" />
<el-table-column align="center" label="状态" prop="status">
<el-table-column align="center" :label="t('SystemManagement.Role.sort')" prop="sort" />
<el-table-column align="center" :label="t('SystemManagement.Role.remark')" prop="remark" />
<el-table-column align="center" :label="t('SystemManagement.Role.status')" prop="status">
<template #default="scope">
<dict-tag :type="DICT_TYPE.COMMON_STATUS" :value="scope.row.status" />
</template>
@ -100,11 +104,11 @@
<el-table-column
:formatter="dateFormatter"
align="center"
label="创建时间"
:label="t('common.createTime')"
prop="createTime"
width="180"
/>
<el-table-column :width="300" align="center" label="操作">
<el-table-column :width="300" align="center" :label="t('common.operate')">
<template #default="scope">
<el-button
v-hasPermi="['system:role:update']"
@ -112,27 +116,27 @@
type="primary"
@click="openForm('update', scope.row.id)"
>
编辑
{{ t('action.edit') }}
</el-button>
<el-button
v-hasPermi="['system:permission:assign-role-menu']"
link
preIcon="ep:basketball"
title="菜单权限"
:title="t('SystemManagement.Role.menuPermission')"
type="primary"
@click="openAssignMenuForm(scope.row)"
>
菜单权限
{{ t('SystemManagement.Role.menuPermission') }}
</el-button>
<el-button
v-hasPermi="['system:permission:assign-role-data-scope']"
link
preIcon="ep:coin"
title="数据权限"
:title="t('SystemManagement.Role.dataPermission')"
type="primary"
@click="openDataPermissionForm(scope.row)"
>
数据权限
{{ t('SystemManagement.Role.dataPermission') }}
</el-button>
<el-button
v-hasPermi="['system:role:delete']"
@ -140,7 +144,7 @@
type="danger"
@click="handleDelete(scope.row.id)"
>
删除
{{ t('action.del') }}
</el-button>
</template>
</el-table-column>
@ -259,8 +263,13 @@ const handleExport = async () => {
}
}
/** 初始化 **/
onMounted(() => {
getList()
})
</script>
<style scoped>
.role-search-form :deep(.el-form-item__label) {
min-width: 68px;
}
</style>

@ -1,6 +1,6 @@
<template>
<div class="head-container">
<el-input v-model="deptName" class="mb-20px" clearable placeholder="请输入部门名称">
<el-input v-model="deptName" class="mb-20px" clearable :placeholder="t('SystemManagement.Dept.searchNamePlaceholder')">
<template #prefix>
<Icon icon="ep:search" />
</template>
@ -28,6 +28,7 @@ import { defaultProps, handleTree } from '@/utils/tree'
defineOptions({ name: 'SystemUserDeptTree' })
const { t } = useI18n() //
const deptName = ref('')
const deptList = ref<Tree[]>([]) //
const treeRef = ref<InstanceType<typeof ElTree>>()

@ -1,21 +1,21 @@
<template>
<Dialog v-model="dialogVisible" title="分配角色">
<el-form ref="formRef" v-loading="formLoading" :model="formData" label-width="80px">
<el-form-item label="用户名称">
<Dialog v-model="dialogVisible" :title="t('SystemManagement.User.assignRole')">
<el-form ref="formRef" v-loading="formLoading" :model="formData" label-width="auto" class="system-user-assign-role-form">
<el-form-item :label="t('SystemManagement.User.username')">
<el-input v-model="formData.username" :disabled="true" />
</el-form-item>
<el-form-item label="用户昵称">
<el-form-item :label="t('SystemManagement.User.nickname')">
<el-input v-model="formData.nickname" :disabled="true" />
</el-form-item>
<el-form-item label="角色">
<el-select v-model="formData.roleIds" multiple placeholder="请选择角色">
<el-form-item :label="t('SystemManagement.User.role')">
<el-select v-model="formData.roleIds" multiple :placeholder="t('SystemManagement.User.rolePlaceholder')">
<el-option v-for="item in roleList" :key="item.id" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
</el-form>
<template #footer>
<el-button :disabled="formLoading" type="primary" @click="submitForm"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
<el-button :disabled="formLoading" type="primary" @click="submitForm">{{ t('common.ok') }}</el-button>
<el-button @click="dialogVisible = false">{{ t('common.cancel') }}</el-button>
</template>
</Dialog>
</template>

@ -5,19 +5,20 @@
v-loading="formLoading"
:model="formData"
:rules="formRules"
label-width="80px"
label-width="auto"
class="system-user-form"
>
<el-row>
<el-col :span="12">
<el-form-item v-if="formData.id === undefined" label="用户名称" prop="username">
<el-input v-model="formData.username" placeholder="请输入用户名称" />
<el-form-item v-if="formData.id === undefined" :label="t('SystemManagement.User.username')" prop="username">
<el-input v-model="formData.username" :placeholder="t('SystemManagement.User.usernamePlaceholder')" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item v-if="formData.id === undefined" label="用户密码" prop="password">
<el-form-item v-if="formData.id === undefined" :label="t('SystemManagement.User.password')" prop="password">
<el-input
v-model="formData.password"
placeholder="请输入用户密码"
:placeholder="t('SystemManagement.User.passwordPlaceholder')"
show-password
type="password"
/>
@ -26,39 +27,39 @@
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="工号" prop="nickname">
<el-input v-model="formData.nickname" placeholder="请输入工号" />
<el-form-item :label="t('SystemManagement.User.workNo')" prop="nickname">
<el-input v-model="formData.nickname" :placeholder="t('SystemManagement.User.workNoPlaceholder')" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="归属部门" prop="deptId">
<el-form-item :label="t('SystemManagement.User.dept')" prop="deptId">
<el-tree-select
v-model="formData.deptId"
:data="deptList"
:props="defaultProps"
check-strictly
node-key="id"
placeholder="请选择归属部门"
:placeholder="t('SystemManagement.User.deptPlaceholder')"
/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="手机号码" prop="mobile">
<el-input v-model="formData.mobile" maxlength="11" placeholder="请输入手机号码" />
<el-form-item :label="t('SystemManagement.User.mobile')" prop="mobile">
<el-input v-model="formData.mobile" maxlength="11" :placeholder="t('SystemManagement.User.mobilePlaceholder')" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="邮箱" prop="email">
<el-input v-model="formData.email" maxlength="50" placeholder="请输入邮箱" />
<el-form-item :label="t('SystemManagement.User.email')" prop="email">
<el-input v-model="formData.email" maxlength="50" :placeholder="t('SystemManagement.User.emailPlaceholder')" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="用户性别">
<el-select v-model="formData.sex" placeholder="请选择">
<el-form-item :label="t('SystemManagement.User.sex')">
<el-select v-model="formData.sex" :placeholder="t('SystemManagement.User.sexPlaceholder')">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.SYSTEM_USER_SEX)"
:key="dict.value"
@ -69,8 +70,8 @@
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="岗位">
<el-select v-model="formData.postIds" multiple placeholder="请选择">
<el-form-item :label="t('SystemManagement.User.post')">
<el-select v-model="formData.postIds" multiple :placeholder="t('SystemManagement.User.postPlaceholder')">
<el-option
v-for="item in postList"
:key="item.id"
@ -83,15 +84,15 @@
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="备注">
<el-input v-model="formData.remark" placeholder="请输入内容" type="textarea" />
<el-form-item :label="t('SystemManagement.User.remark')">
<el-input v-model="formData.remark" :placeholder="t('SystemManagement.User.remarkPlaceholder')" type="textarea" />
</el-form-item>
</el-col>
</el-row>
</el-form>
<template #footer>
<el-button :disabled="formLoading" type="primary" @click="submitForm"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
<el-button :disabled="formLoading" type="primary" @click="submitForm">{{ t('common.ok') }}</el-button>
<el-button @click="dialogVisible = false">{{ t('common.cancel') }}</el-button>
</template>
</Dialog>
</template>
@ -128,18 +129,18 @@ const formData = ref({
roleIds: []
})
const formRules = reactive<FormRules>({
username: [{ required: true, message: '用户名称不能为空', trigger: 'blur' },{
username: [{ required: true, message: t('SystemManagement.User.usernameRequired'), trigger: 'blur' },{
pattern: /^[a-zA-Z0-9_\-@.]+$/,
message: '用户名只能包含英文、数字、下划线、连字符、@和点',
trigger: 'blur'
}],
nickname: [{ required: true, message: '工号不能为空', trigger: 'blur' }],
password: [{ required: true, message: '用户密码不能为空', trigger: 'blur' }],
deptId: [{ required: true, message: '部门不能为空', trigger: 'blur' }],
nickname: [{ required: true, message: t('SystemManagement.User.workNoRequired'), trigger: 'blur' }],
password: [{ required: true, message: t('SystemManagement.User.passwordRequired'), trigger: 'blur' }],
deptId: [{ required: true, message: t('SystemManagement.User.deptRequired'), trigger: 'blur' }],
email: [
{
type: 'email',
message: '请输入正确的邮箱地址',
message: t('SystemManagement.User.emailInvalid'),
trigger: ['blur', 'change']
}
],
@ -147,7 +148,7 @@ const formRules = reactive<FormRules>({
{
required: true,
pattern: /^(?:(?:\+|00)86)?1(?:3[\d]|4[5-79]|5[0-35-9]|6[5-7]|7[0-8]|8[\d]|9[189])\d{8}$/,
message: '请输入正确的手机号码',
message: t('SystemManagement.User.mobileInvalid'),
trigger: 'blur'
}
]

@ -1,5 +1,5 @@
<template>
<Dialog v-model="dialogVisible" title="用户导入" width="400">
<Dialog v-model="dialogVisible" :title="t('SystemManagement.User.import')" width="400">
<el-upload
ref="uploadRef"
v-model:file-list="fileList"
@ -15,28 +15,30 @@
drag
>
<Icon icon="ep:upload" />
<div class="el-upload__text">将文件拖到此处<em>点击上传</em></div>
<div class="el-upload__text">
{{ t('SystemManagement.User.importDragText') }}<em>{{ t('SystemManagement.User.importClickText') }}</em>
</div>
<template #tip>
<div class="el-upload__tip text-center">
<div class="el-upload__tip">
<el-checkbox v-model="updateSupport" />
是否更新已经存在的用户数据
{{ t('SystemManagement.User.importUpdateSupport') }}
</div>
<span>仅允许导入 xlsxlsx 格式文件</span>
<span>{{ t('SystemManagement.User.importFormatLimit') }}</span>
<el-link
:underline="false"
style="font-size: 12px; vertical-align: baseline"
type="primary"
@click="importTemplate"
>
下载模板
{{ t('SystemManagement.User.importDownloadTemplate') }}
</el-link>
</div>
</template>
</el-upload>
<template #footer>
<el-button :disabled="formLoading" type="primary" @click="submitForm"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
<el-button :disabled="formLoading" type="primary" @click="submitForm">{{ t('common.ok') }}</el-button>
<el-button @click="dialogVisible = false">{{ t('common.cancel') }}</el-button>
</template>
</Dialog>
</template>
@ -47,6 +49,7 @@ import download from '@/utils/download'
defineOptions({ name: 'SystemUserImportForm' })
const { t } = useI18n() //
const message = useMessage() //
const dialogVisible = ref(false) //
@ -70,7 +73,7 @@ defineExpose({ open }) // 提供 open 方法,用于打开弹窗
/** 提交表单 */
const submitForm = async () => {
if (fileList.value.length == 0) {
message.error('请上传文件')
message.error(t('SystemManagement.User.importFileRequired'))
return
}
//
@ -92,15 +95,17 @@ const submitFormSuccess = (response: any) => {
}
//
const data = response.data
let text = '上传成功数量:' + data.createUsernames.length + ';'
let text = t('SystemManagement.User.importSuccessTip', {
createCount: data.createUsernames.length,
updateCount: data.updateUsernames.length,
failureCount: Object.keys(data.failureUsernames).length
})
for (let username of data.createUsernames) {
text += '< ' + username + ' >'
}
text += '更新成功数量:' + data.updateUsernames.length + ';'
for (const username of data.updateUsernames) {
text += '< ' + username + ' >'
}
text += '更新失败数量:' + Object.keys(data.failureUsernames).length + ';'
for (const username in data.failureUsernames) {
text += '< ' + username + ': ' + data.failureUsernames[username] + ' >'
}
@ -113,7 +118,7 @@ const submitFormSuccess = (response: any) => {
/** 上传错误提示 */
const submitFormError = (): void => {
message.error('上传失败,请您重新上传!')
message.error(t('SystemManagement.User.importFailed'))
formLoading.value = false
}
@ -127,7 +132,7 @@ const resetForm = async (): Promise<void> => {
/** 文件数超出提示 */
const handleExceed = (): void => {
message.error('最多只能上传一个文件!')
message.error(t('SystemManagement.User.importFileLimit'))
}
/** 下载模板操作 */

@ -10,43 +10,43 @@
<!-- 搜索 -->
<ContentWrap>
<el-form
class="-mb-15px"
class="-mb-15px system-user-query-form"
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="68px"
label-width="auto"
>
<el-form-item label="工号" prop="nickname">
<el-form-item :label="t('SystemManagement.User.workNo')" prop="nickname">
<el-input
v-model="queryParams.nickname"
placeholder="请输入工号"
:placeholder="t('SystemManagement.User.searchWorkNoPlaceholder')"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="用户名称" prop="username">
<el-form-item :label="t('SystemManagement.User.username')" prop="username">
<el-input
v-model="queryParams.username"
placeholder="请输入用户名称"
:placeholder="t('SystemManagement.User.searchUsernamePlaceholder')"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="手机号码" prop="mobile">
<el-form-item :label="t('SystemManagement.User.mobile')" prop="mobile">
<el-input
v-model="queryParams.mobile"
placeholder="请输入手机号码"
:placeholder="t('SystemManagement.User.searchMobilePlaceholder')"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="状态" prop="status">
<el-form-item :label="t('SystemManagement.User.status')" prop="status">
<el-select
v-model="queryParams.status"
placeholder="用户状态"
:placeholder="t('SystemManagement.User.searchStatusPlaceholder')"
clearable
class="!w-240px"
>
@ -58,26 +58,26 @@
/>
</el-select>
</el-form-item>
<el-form-item label="创建时间" prop="createTime">
<el-form-item :label="t('SystemManagement.User.createTime')" prop="createTime">
<el-date-picker
v-model="queryParams.createTime"
value-format="YYYY-MM-DD HH:mm:ss"
type="datetimerange"
start-placeholder="开始日期"
end-placeholder="结束日期"
:start-placeholder="t('SystemManagement.User.searchCreateTimeStartPlaceholder')"
:end-placeholder="t('SystemManagement.User.searchCreateTimeEndPlaceholder')"
class="!w-240px"
/>
</el-form-item>
<el-form-item>
<el-button @click="handleQuery"><Icon icon="ep:search" />搜索</el-button>
<el-button @click="resetQuery"><Icon icon="ep:refresh" />重置</el-button>
<el-button @click="handleQuery"><Icon icon="ep:search" />{{ t('common.query') }}</el-button>
<el-button @click="resetQuery"><Icon icon="ep:refresh" />{{ t('common.reset') }}</el-button>
<el-button
type="primary"
plain
@click="openForm('create')"
v-hasPermi="['system:user:create']"
>
<Icon icon="ep:plus" /> 新增
<Icon icon="ep:plus" /> {{ t('action.add') }}
</el-button>
<el-button
type="warning"
@ -85,7 +85,7 @@
@click="handleImport"
v-hasPermi="['system:user:import']"
>
<Icon icon="ep:upload" /> 导入
<Icon icon="ep:upload" /> {{ t('action.import') }}
</el-button>
<el-button
type="success"
@ -94,7 +94,7 @@
:loading="exportLoading"
v-hasPermi="['system:user:export']"
>
<Icon icon="ep:download" />导出
<Icon icon="ep:download" />{{ t('action.export') }}
</el-button>
</el-form-item>
</el-form>
@ -102,31 +102,31 @@
<ContentWrap>
<el-table v-loading="loading" :data="list">
<el-table-column
label="工号"
:label="t('SystemManagement.User.workNo')"
align="center"
prop="nickname"
:show-overflow-tooltip="true"
/>
<el-table-column
label="用户名称"
:label="t('SystemManagement.User.username')"
align="center"
prop="username"
:show-overflow-tooltip="true"
/>
<el-table-column
label="部门"
:label="t('SystemManagement.User.dept')"
align="center"
key="deptName"
prop="deptName"
:show-overflow-tooltip="true"
/>
<el-table-column label="用户性别" align="center" prop="sex">
<el-table-column :label="t('SystemManagement.User.sex')" align="center" prop="sex">
<template #default="scope">
<dict-tag :type="DICT_TYPE.SYSTEM_USER_SEX" :value="scope.row.sex" />
</template>
</el-table-column>
<el-table-column label="手机号码" align="center" prop="mobile" width="120" />
<el-table-column label="状态" key="status">
<el-table-column :label="t('SystemManagement.User.mobile')" align="center" prop="mobile" width="120" />
<el-table-column :label="t('SystemManagement.User.status')" key="status">
<template #default="scope">
<el-switch
v-model="scope.row.status"
@ -137,13 +137,13 @@
</template>
</el-table-column>
<el-table-column
label="创建时间"
:label="t('SystemManagement.User.createTime')"
align="center"
prop="createTime"
:formatter="dateFormatter"
width="180"
/>
<el-table-column label="操作" align="center" width="160">
<el-table-column :label="t('SystemManagement.User.actions')" align="center" width="200">
<template #default="scope">
<div class="flex items-center justify-center">
<el-button
@ -152,7 +152,7 @@
@click="openForm('update', scope.row.id)"
v-hasPermi="['system:user:update']"
>
<Icon icon="ep:edit" />修改
<Icon icon="ep:edit" />{{ t('action.edit') }}
</el-button>
<el-dropdown
@command="(command) => handleCommand(command, scope.row)"
@ -162,26 +162,26 @@
'system:permission:assign-user-role'
]"
>
<el-button type="primary" link><Icon icon="ep:d-arrow-right" /> 更多</el-button>
<el-button type="primary" link><Icon icon="ep:d-arrow-right" /> {{ t('action.more') }}</el-button>
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item
command="handleDelete"
v-if="checkPermi(['system:user:delete'])"
>
<Icon icon="ep:delete" />删除
<Icon icon="ep:delete" />{{ t('action.delete') }}
</el-dropdown-item>
<el-dropdown-item
command="handleResetPwd"
v-if="checkPermi(['system:user:update-password'])"
>
<Icon icon="ep:key" />重置密码
<Icon icon="ep:key" />{{ t('SystemManagement.User.resetPassword') }}
</el-dropdown-item>
<el-dropdown-item
command="handleRole"
v-if="checkPermi(['system:permission:assign-user-role'])"
>
<Icon icon="ep:circle-check" />分配角色
<Icon icon="ep:circle-check" />{{ t('SystemManagement.User.assignRole') }}
</el-dropdown-item>
</el-dropdown-menu>
</template>
@ -239,6 +239,9 @@ const queryParams = reactive({
})
const queryFormRef = ref() //
const resetPasswordLabel = computed(() => t('SystemManagement.User.resetPassword'))
const assignRoleLabel = computed(() => t('SystemManagement.User.assignRole'))
/** 查询列表 */
const getList = async () => {
loading.value = true
@ -285,8 +288,8 @@ const handleImport = () => {
const handleStatusChange = async (row: UserApi.UserVO) => {
try {
//
const text = row.status === CommonStatusEnum.ENABLE ? '启用' : '停用'
await message.confirm('确认要"' + text + '""' + row.username + '"用户吗?')
const text = row.status === CommonStatusEnum.ENABLE ? t('common.enable') : t('common.disable')
await message.confirm(t('SystemManagement.User.changeStatusConfirm', { action: text, username: row.username }))
//
await UserApi.updateUserStatus(row.id, row.status)
//

Loading…
Cancel
Save