Ver Fonte

部分页面中英文适配没做修复

pm há 1 mês atrás
pai
commit
74159db6ec

+ 1 - 1
src/components/DictTypeManagement.tsx

@@ -656,7 +656,7 @@ export default function DictTypeManagement() {
                           className="h-8 px-2"
                         >
                           <Eye className="w-4 h-4" />
-                          <span className="ml-1">数据</span>
+                          <span className="ml-1">{t('table.data')}</span>
                         </UIButton>
                       </PermissionWrapper>
                       <PermissionWrapper permission="system:dict:delete">

+ 65 - 63
src/components/IsolationWork.tsx

@@ -4724,7 +4724,9 @@ export default function IsolationWork({ subMenu }: IsolationWorkProps) {
                           {/* 头部 */}
                           <div className="px-4 py-2.5 bg-white border-b border-gray-200 flex items-center justify-between sticky top-0 z-10 shadow-sm">
                             <h3 className="text-sm font-medium text-gray-900">
-                              {workflowNodeConfig.nodeName || selectedWorkflowNode.data?.label || '节点'} 设置
+                              {t('isolationWork.nodeSettingsTitle', {
+                                nodeName: workflowNodeConfig.nodeName || selectedWorkflowNode.data?.label || t('isolationWork.nodeDefaultName'),
+                              })}
                             </h3>
                             <button
                               onClick={() => setSelectedWorkflowNode(null)}
@@ -4741,20 +4743,20 @@ export default function IsolationWork({ subMenu }: IsolationWorkProps) {
                             <div>
                               <h4 className="flex items-center gap-3 text-base font-semibold text-gray-900 mb-4">
                                 <span className="w-1 h-5 bg-blue-500 rounded-full flex-shrink-0" style={{ minWidth: '4px', minHeight: '20px' }}></span>
-                                节点信息
+                                {t('isolationWork.nodeInfo')}
                               </h4>
                               <div className="space-y-5">
                                 {/* 节点名称 */}
                                 <div>
                                   <label className="block text-sm font-medium text-gray-700 mb-2">
-                                    节点名称 <span className="text-red-500" style={{ color: '#ef4444' }}>*</span>
+                                    {t('isolationWork.nodeName')} <span className="text-red-500" style={{ color: '#ef4444' }}>*</span>
                                   </label>
                                   <Input
                                     value={workflowNodeConfig.nodeName || ''}
                                     onChange={(e) =>
                                       setWorkflowNodeConfig({ ...workflowNodeConfig, nodeName: e.target.value })
                                     }
-                                    placeholder="请输入节点名称"
+                                    placeholder={t('isolationWork.nodeNamePlaceholder')}
                                     className="rounded-lg border-gray-200"
                                     disabled={isViewMode}
                                   />
@@ -4764,14 +4766,14 @@ export default function IsolationWork({ subMenu }: IsolationWorkProps) {
                                 {selectedWorkflowNode.data?.type !== 'createJob' && selectedWorkflowNode.data?.type !== 'isolation' && selectedWorkflowNode.data?.type !== 'releaseIsolation' && (
                                   <div>
                                     <label className="block text-sm font-medium text-gray-700 mb-2">
-                                      负责人 <span className="text-red-500" style={{ color: '#ef4444' }}>*</span>
+                                      {t('isolationWork.responsible')} <span className="text-red-500" style={{ color: '#ef4444' }}>*</span>
                                     </label>
                                     <Select
                                       value={workflowNodeConfig.responsible || undefined}
                                       onChange={(value) =>
                                         setWorkflowNodeConfig({ ...workflowNodeConfig, responsible: value || undefined })
                                       }
-                                      placeholder="请选择负责人"
+                                      placeholder={t('isolationWork.responsiblePlaceholder')}
                                       className="w-full [&_.ant-select-selector]:!rounded-lg [&_.ant-select-selector]:!h-10"
                                       allowClear
                                       disabled={isViewMode}
@@ -4781,7 +4783,7 @@ export default function IsolationWork({ subMenu }: IsolationWorkProps) {
                                       ))}
                                     </Select>
                                     <p className="text-xs text-gray-500 mt-1.5 leading-relaxed">
-                                      对该任务或步骤节点进行处理的人员,若不选则需要在创建作业时进行选择。
+                                      {t('isolationWork.responsibleHelp')}
                                     </p>
                                   </div>
                                 )}
@@ -4812,12 +4814,12 @@ export default function IsolationWork({ subMenu }: IsolationWorkProps) {
                             <div>
                               <h4 className="flex items-center gap-3 text-base font-semibold text-gray-900 mb-4">
                                 <span className="w-1 h-5 bg-blue-500 rounded-full flex-shrink-0" style={{ minWidth: '4px', minHeight: '20px' }}></span>
-                                提交表单
+                                {t('isolationWork.submitFormSection')}
                               </h4>
                               <div className="space-y-5">
                                 <div>
                                   <label className="block text-sm font-medium text-gray-700 mb-2">
-                                    业务表单 
+                                    {t('isolationWork.businessForm')} 
                                     {/* 只有确认节点、审核节点、录入信息节点显示必填标记 */}
                                     {['confirm', 'review', 'inputInfo'].includes(selectedWorkflowNode.data?.type || '') && (
                                       <span className="text-red-500" style={{ color: '#ef4444' }}>*</span>
@@ -4828,7 +4830,7 @@ export default function IsolationWork({ subMenu }: IsolationWorkProps) {
                                     onChange={(value) =>
                                       setWorkflowNodeConfig({ ...workflowNodeConfig, submitForm: value || undefined })
                                     }
-                                    placeholder="请选择提交表单"
+                                    placeholder={t('isolationWork.businessFormPlaceholder')}
                                     className="w-full [&_.ant-select-selector]:!rounded-lg [&_.ant-select-selector]:!h-10"
                                     allowClear
                                     disabled={isViewMode || selectedWorkflowNode.data?.type === 'releaseIsolation'}
@@ -5004,14 +5006,14 @@ export default function IsolationWork({ subMenu }: IsolationWorkProps) {
                                     {/* 隔离方式 */}
                                     <div>
                                       <label className="block text-sm font-medium text-gray-700 mb-2">
-                                        隔离方式 <span className="text-red-500" style={{ color: '#ef4444' }}>*</span>
+                                        {t('isolationWork.isolationMethod')} <span className="text-red-500" style={{ color: '#ef4444' }}>*</span>
                                       </label>
                                       <Select
                                         value={workflowNodeConfig.isolationType || undefined}
                                         onChange={(value) =>
                                           setWorkflowNodeConfig({ ...workflowNodeConfig, isolationType: value || '' })
                                         }
-                                        placeholder="请选择隔离方式"
+                                        placeholder={t('isolationWork.isolationMethodPlaceholder')}
                                         className="w-full [&_.ant-select-selector]:!rounded-lg [&_.ant-select-selector]:!h-10"
                                         allowClear
                                         disabled={isViewMode || selectedWorkflowNode.data?.type === 'releaseIsolation'}
@@ -5028,7 +5030,7 @@ export default function IsolationWork({ subMenu }: IsolationWorkProps) {
                                     {(selectedWorkflowNode.data?.type === 'isolation' || selectedWorkflowNode.data?.type === 'releaseIsolation') && (
                                       <div>
                                         <label className="block text-sm font-medium text-gray-700 mb-2">
-                                          隔离点选择(可多选) <span className="text-red-500" style={{ color: '#ef4444' }}>*</span>
+                                          {t('isolationWork.isolationPointSelect')} <span className="text-red-500" style={{ color: '#ef4444' }}>*</span>
                                         </label>
                                         <Select
                                           mode="multiple"
@@ -5036,7 +5038,7 @@ export default function IsolationWork({ subMenu }: IsolationWorkProps) {
                                           onChange={(value) =>
                                             setWorkflowNodeConfig({ ...workflowNodeConfig, isolationPoints: value })
                                           }
-                                          placeholder="请选择隔离点"
+                                          placeholder={t('isolationWork.isolationPointPlaceholder')}
                                           className="w-full [&_.ant-select-selector]:!rounded-lg [&_.ant-select-selector]:!min-h-10"
                                           allowClear
                                           disabled={isViewMode || selectedWorkflowNode.data?.type === 'releaseIsolation'}
@@ -5053,14 +5055,14 @@ export default function IsolationWork({ subMenu }: IsolationWorkProps) {
                                     {(workflowNodeConfig.isolationType === '0' || workflowNodeConfig.isolationType === '2') && (
                                       <div>
                                         <label className="block text-sm font-medium text-gray-700 mb-2">
-                                          负责人 <span className="text-red-500" style={{ color: '#ef4444' }}>*</span>
+                                          {t('isolationWork.responsible')} <span className="text-red-500" style={{ color: '#ef4444' }}>*</span>
                                         </label>
                                         <Select
                                           value={workflowNodeConfig.responsible || undefined}
                                           onChange={(value) =>
                                             setWorkflowNodeConfig({ ...workflowNodeConfig, responsible: value || undefined })
                                           }
-                                          placeholder="请选择负责人"
+                                          placeholder={t('isolationWork.responsiblePlaceholder')}
                                           className="w-full [&_.ant-select-selector]:!rounded-lg [&_.ant-select-selector]:!h-10"
                                           allowClear
                                           disabled={isViewMode || selectedWorkflowNode.data?.type === 'releaseIsolation'}
@@ -5077,14 +5079,14 @@ export default function IsolationWork({ subMenu }: IsolationWorkProps) {
                                       <>
                                         <div>
                                           <label className="block text-sm font-medium text-gray-700 mb-2">
-                                            上锁人 <span className="text-red-500" style={{ color: '#ef4444' }}>*</span>
+                                            {t('isolationWork.locker')} <span className="text-red-500" style={{ color: '#ef4444' }}>*</span>
                                           </label>
                                           <Select
                                             value={workflowNodeConfig.lockPerson || undefined}
                                             onChange={(value) =>
                                               setWorkflowNodeConfig({ ...workflowNodeConfig, lockPerson: value || undefined })
                                             }
-                                            placeholder="请选择上锁人"
+                                            placeholder={t('isolationWork.lockerPlaceholder')}
                                             className="w-full [&_.ant-select-selector]:!rounded-lg [&_.ant-select-selector]:!h-10"
                                             allowClear
                                             disabled={isViewMode || selectedWorkflowNode.data?.type === 'releaseIsolation'}
@@ -5096,7 +5098,7 @@ export default function IsolationWork({ subMenu }: IsolationWorkProps) {
                                         </div>
                                         <div>
                                           <label className="block text-sm font-medium text-gray-700 mb-2">
-                                            共锁人(可多选)
+                                            {t('isolationWork.coLocker')}
                                           </label>
                                           <Select
                                             mode="multiple"
@@ -5104,7 +5106,7 @@ export default function IsolationWork({ subMenu }: IsolationWorkProps) {
                                             onChange={(value) =>
                                               setWorkflowNodeConfig({ ...workflowNodeConfig, coLockPersons: value })
                                             }
-                                            placeholder="请选择共锁人"
+                                            placeholder={t('isolationWork.coLockerPlaceholder')}
                                             className="w-full [&_.ant-select-selector]:!rounded-lg [&_.ant-select-selector]:!min-h-10"
                                             allowClear
                                             disabled={isViewMode || selectedWorkflowNode.data?.type === 'releaseIsolation'}
@@ -5127,12 +5129,12 @@ export default function IsolationWork({ subMenu }: IsolationWorkProps) {
                             <div>
                               <h4 className="flex items-center gap-3 text-base font-semibold text-gray-900 mb-4">
                                 <span className="w-1 h-5 bg-blue-500 rounded-full flex-shrink-0" style={{ minWidth: '4px', minHeight: '20px' }}></span>
-                                通知消息
+                                {t('isolationWork.notificationSection')}
                               </h4>
                               <div className="space-y-5">
                                 <div>
                                   <label className="block text-sm font-medium text-gray-700 mb-3">
-                                    通知方式
+                                    {t('isolationWork.notificationMethod')}
                                   </label>
                                   <div className="bg-gray-50 p-3 rounded-lg">
                                     <div className="mb-3">
@@ -5150,7 +5152,7 @@ export default function IsolationWork({ subMenu }: IsolationWorkProps) {
                                         }
                                         disabled={isViewMode || selectedWorkflowNode.data?.type === 'releaseIsolation'}
                                       >
-                                        短信
+                                        {t('isolationWork.notifySMS')}
                                       </Checkbox>
                                     </div>
                                     <div className="mb-3">
@@ -5168,7 +5170,7 @@ export default function IsolationWork({ subMenu }: IsolationWorkProps) {
                                         }
                                         disabled={isViewMode || selectedWorkflowNode.data?.type === 'releaseIsolation'}
                                       >
-                                        站内信
+                                        {t('isolationWork.notifyInbox')}
                                       </Checkbox>
                                     </div>
                                     <div className="mb-3">
@@ -5186,7 +5188,7 @@ export default function IsolationWork({ subMenu }: IsolationWorkProps) {
                                         }
                                         disabled={isViewMode || selectedWorkflowNode.data?.type === 'releaseIsolation'}
                                       >
-                                        邮件
+                                        {t('isolationWork.notifyEmail')}
                                       </Checkbox>
                                     </div>
                                     <div>
@@ -5204,23 +5206,23 @@ export default function IsolationWork({ subMenu }: IsolationWorkProps) {
                                         }
                                         disabled={isViewMode || selectedWorkflowNode.data?.type === 'releaseIsolation'}
                                       >
-                                        APP通知
+                                        {t('isolationWork.notifyApp')}
                                       </Checkbox>
                                     </div>
                                   </div>
                                 </div>
                                 <div>
                                   <label className="block text-sm font-medium text-gray-700 mb-3">
-                                    通知对象
+                                    {t('isolationWork.notificationTarget')}
                                   </label>
                                   <div className="mb-3 space-y-1 text-xs text-gray-500">
-                                    <div>1. 系统将默认发送消息给任务负责人(或上锁人\共锁人)</div>
-                                    <div>2. 请选择消息抄送对象:</div>
+                                    <div>{t('isolationWork.notificationTargetTip1')}</div>
+                                    <div>{t('isolationWork.notificationTargetTip2')}</div>
                                   </div>
                                   <div className="space-y-3 bg-gray-50 p-3 rounded-lg">
                                     <div>
                                       <label className="block text-sm font-medium text-gray-700 mb-2">
-                                        抄送给部门(部门下的所有人):
+                                        {t('isolationWork.ccDeptLabel')}
                                       </label>
                                       <TreeSelect
                                         multiple
@@ -5231,7 +5233,7 @@ export default function IsolationWork({ subMenu }: IsolationWorkProps) {
                                             copyDeptIds: Array.isArray(value) ? value.map(String) : value != null && value !== '' ? [String(value)] : [],
                                           })
                                         }
-                                        placeholder="请选择部门(可多选)"
+                                        placeholder={t('isolationWork.ccDeptPlaceholder')}
                                         treeData={workflowCcDeptTreeData}
                                         className="w-full"
                                         allowClear
@@ -5243,7 +5245,7 @@ export default function IsolationWork({ subMenu }: IsolationWorkProps) {
                                     </div>
                                     <div>
                                       <label className="block text-sm font-medium text-gray-700 mb-2">
-                                        抄送给人员:
+                                        {t('isolationWork.ccUserLabel')}
                                       </label>
                                       <TreeSelect
                                         multiple
@@ -5254,7 +5256,7 @@ export default function IsolationWork({ subMenu }: IsolationWorkProps) {
                                             copyUserIds: Array.isArray(value) ? value.map(String) : value != null && value !== '' ? [String(value)] : [],
                                           })
                                         }
-                                        placeholder="请选择人员(可多选)"
+                                        placeholder={t('isolationWork.ccUserPlaceholder')}
                                         treeData={workflowCcUserTreeData}
                                         className="w-full"
                                         allowClear
@@ -5962,7 +5964,7 @@ export default function IsolationWork({ subMenu }: IsolationWorkProps) {
                                   }
                                 }}
                               >
-                                保存当前节点
+                                {t('isolationWork.saveCurrentNode')}
                               </Button>
                             </div>
                           )}
@@ -5970,7 +5972,7 @@ export default function IsolationWork({ subMenu }: IsolationWorkProps) {
                       ) : (
                         <div className="p-4">
                           <div className="text-sm text-gray-600">
-                            请选择左侧流程中的节点进行配置
+                            {t('isolationWork.selectNodeToConfigure')}
                           </div>
                         </div>
                       )}
@@ -5985,20 +5987,20 @@ export default function IsolationWork({ subMenu }: IsolationWorkProps) {
                     className="max-w-2xl"
                   >
                     <div className="mb-4">
-                      <h3 className="text-base font-medium text-gray-900 mb-2">发布作业设置</h3>
-                      <p className="text-sm text-gray-500">请配置作业的执行时间并最终发布</p>
+                      <h3 className="text-base font-medium text-gray-900 mb-2">{t('isolationWork.publishSettingsTitle')}</h3>
+                      <p className="text-sm text-gray-500">{t('isolationWork.publishSettingsDesc')}</p>
                     </div>
 
                     <Form.Item
-                      label="发布方式"
+                      label={t('isolationWork.publishMethod')}
                       name="startType"
                       required
-                      rules={[{ required: true, message: '请选择发布方式' }]}
+                      rules={[{ required: true, message: t('isolationWork.publishMethodRequired') }]}
                       initialValue="0"
                     >
                       <Radio.Group disabled={isViewMode}>
-                        <Radio value="0">立即发布</Radio>
-                        <Radio value="1">定时发布</Radio>
+                        <Radio value="0">{t('isolationWork.publishNow')}</Radio>
+                        <Radio value="1">{t('isolationWork.publishScheduled')}</Radio>
                       </Radio.Group>
                     </Form.Item>
 
@@ -6011,16 +6013,16 @@ export default function IsolationWork({ subMenu }: IsolationWorkProps) {
                       {({ getFieldValue }) => 
                         getFieldValue('startType') === '1' ? (
                           <Form.Item
-                            label="发布时间"
+                            label={t('isolationWork.publishTime')}
                             name="planTime"
                             required
-                            rules={[{ required: true, message: '请选择发布时间' }]}
+                            rules={[{ required: true, message: t('isolationWork.publishTimeRequired') }]}
                           >
                             <DatePicker
                               showTime
                               format="YYYY-MM-DD HH:mm:ss"
                               className="w-full"
-                              placeholder="请选择发布时间"
+                              placeholder={t('isolationWork.publishTimePlaceholder')}
                               disabled={isViewMode}
                             />
                           </Form.Item>
@@ -6055,7 +6057,7 @@ export default function IsolationWork({ subMenu }: IsolationWorkProps) {
                       // 关闭弹框时刷新列表
                       getWorkJobList();
                     }}>
-                      {isViewMode ? '关闭' : '取消'}
+                      {isViewMode ? t('common.close') : t('common.cancel')}
                     </Button>
                     {!isViewMode ? (
                       <Button
@@ -6187,14 +6189,14 @@ export default function IsolationWork({ subMenu }: IsolationWorkProps) {
                           }
                         }}
                       >
-                        下一步
+                        {t('common.next')}
                       </Button>
                     ) : (
                       <Button
                         type="primary"
                         onClick={() => setWorkJobStep(1)}
                       >
-                        下一步
+                        {t('common.next')}
                       </Button>
                     )}
                   </>
@@ -6203,7 +6205,7 @@ export default function IsolationWork({ subMenu }: IsolationWorkProps) {
                   <div className="flex flex-col items-center w-full gap-2">
                     <div className="flex items-center gap-2">
                       <Button onClick={() => setWorkJobStep(0)}>
-                        上一步
+                        {t('common.previous')}
                       </Button>
                       {!isViewMode && (
                         <>
@@ -6255,12 +6257,12 @@ export default function IsolationWork({ subMenu }: IsolationWorkProps) {
                           }
                         }}
                       >
-                        下一步
+                        {t('common.next')}
                       </Button>
                       {!hasUnsavedNodes && (
                         <img 
                           src={new URL('../assets/finger.png', import.meta.url).href}
-                          alt="指向下一步"
+                          alt={t('common.next')}
                           className="pointer-hint-icon"
                           style={{
                             width: '32px',
@@ -6361,20 +6363,20 @@ export default function IsolationWork({ subMenu }: IsolationWorkProps) {
                           type="primary"
                           onClick={() => setWorkJobStep(2)}
                         >
-                          下一步
+                          {t('common.next')}
                         </Button>
                       )}
                     </div>
                     <div className="flex items-center text-red-600" style={{ fontSize: '12px' }}>
                       <span className="mr-1">⚠️</span>
-                      <span>提示:流程中的每一个节点都需要单独配置并保存,方可点击 "下一步"。</span>
+                      <span>{t('isolationWork.nextStepHint')}</span>
                     </div>
                   </div>
                 )}
                 {workJobStep === 2 && (
                   <>
                     <Button onClick={() => setWorkJobStep(1)}>
-                      上一步
+                      {t('common.previous')}
                     </Button>
                     {!isViewMode ? (
                     <Button
@@ -6456,7 +6458,7 @@ export default function IsolationWork({ subMenu }: IsolationWorkProps) {
                         }
                       }}
                     >
-                      确认发布
+                      {t('isolationWork.confirmPublish')}
                     </Button>
                     ) : (
                       <Button onClick={() => {
@@ -6477,7 +6479,7 @@ export default function IsolationWork({ subMenu }: IsolationWorkProps) {
                         setOriginalBasicFormData(null);
                         getWorkJobList();
                       }}>
-                        关闭
+                        {t('common.close')}
                       </Button>
                     )}
                   </>
@@ -6932,17 +6934,17 @@ export default function IsolationWork({ subMenu }: IsolationWorkProps) {
                 className="max-w-2xl"
               >
                 <div className="mb-4">
-                  <h3 className="text-base font-medium text-gray-900 mb-2">发布作业设置</h3>
-                  <p className="text-sm text-gray-500">请配置作业的执行时间并最终发布</p>
+                  <h3 className="text-base font-medium text-gray-900 mb-2">{t('isolationWork.publishSettingsTitle')}</h3>
+                  <p className="text-sm text-gray-500">{t('isolationWork.publishSettingsDesc')}</p>
                 </div>
 
                 <Form.Item
-                  label="发布方式"
+                  label={t('isolationWork.publishMethod')}
                   name="startType"
                 >
                   <Radio.Group disabled>
-                    <Radio value="0">立即发布</Radio>
-                    <Radio value="1">定时发布</Radio>
+                    <Radio value="0">{t('isolationWork.publishNow')}</Radio>
+                    <Radio value="1">{t('isolationWork.publishScheduled')}</Radio>
                   </Radio.Group>
                 </Form.Item>
 
@@ -6955,7 +6957,7 @@ export default function IsolationWork({ subMenu }: IsolationWorkProps) {
                   {({ getFieldValue }) => 
                     getFieldValue('startType') === '1' ? (
                       <Form.Item
-                        label="发布时间"
+                        label={t('isolationWork.publishTime')}
                         name="planTime"
                       >
                         <DatePicker
@@ -6963,7 +6965,7 @@ export default function IsolationWork({ subMenu }: IsolationWorkProps) {
                           showTime
                           format="YYYY-MM-DD HH:mm:ss"
                           className="w-full"
-                          placeholder="请选择发布时间"
+                          placeholder={t('isolationWork.publishTimePlaceholder')}
                         />
                       </Form.Item>
                     ) : null
@@ -6983,7 +6985,7 @@ export default function IsolationWork({ subMenu }: IsolationWorkProps) {
               viewWorkJobPublishForm.resetFields();
               setViewWorkflowJson(null);
             }}>
-              关闭
+              {t('common.close')}
             </Button>
           </div>
         </div>

+ 24 - 0
src/components/IsolationWorkListTable.css

@@ -6,6 +6,30 @@
   background-color: #e8e8e8 !important;
 }
 
+/* 列表表格:统一更紧凑的间距(钥匙管理等使用) */
+.isolation-work-list-table .ant-table {
+  font-size: 14px;
+}
+
+.isolation-work-list-table .ant-table-thead > tr > th {
+  padding: 10px 12px !important;
+  line-height: 1.25 !important;
+  vertical-align: middle !important;
+}
+
+.isolation-work-list-table .ant-table-tbody > tr > td {
+  padding: 10px 12px !important;
+  line-height: 1.25 !important;
+  vertical-align: middle !important;
+}
+
+/* 选择框列和操作列更居中一些 */
+.isolation-work-list-table .ant-table-selection-column,
+.isolation-work-list-table .ant-table-selection-column .ant-checkbox-wrapper,
+.isolation-work-list-table .ant-table-cell-fix-right {
+  vertical-align: middle !important;
+}
+
 /* 系统管理:shadcn Table 隔行(背景需落在 td 上) */
 .system-mgmt-shadcn-table [data-slot="table-body"] > [data-slot="table-row"].system-mgmt-row-alt > [data-slot="table-cell"] {
   background-color: #f0f0f0 !important;

+ 6 - 4
src/components/KeyManagement.tsx

@@ -141,25 +141,25 @@ export default function KeyManagement({ subMenu }: KeyManagementProps) {
     {
       title: t('table.keyName'),
       dataIndex: 'keyName',
-      width: 180,
+      width: 160,
     },
     {
       title: t('table.keyNfc'),
       dataIndex: 'keyNfc',
-      width: 180,
+      width: 160,
       ellipsis: true,
     },
     {
       title: t('table.keySpec'),
       dataIndex: 'keySpec',
-      width: 180,
+      width: 160,
       ellipsis: true,
       render: (text: string) => text || '-',
     },
     {
       title: t('table.macAddress'),
       dataIndex: 'macAddress',
-      width: 150,
+      width: 160,
       render: (text: string) => text || '-',
     },
     {
@@ -182,6 +182,8 @@ export default function KeyManagement({ subMenu }: KeyManagementProps) {
     {
       title: t('table.remark'),
       dataIndex: 'exRemark',
+      width: 220,
+      ellipsis: true,
       render: (text: string) => {
         const remarkText = text || '-';
         const maxLength = 20;

+ 2 - 0
src/components/PadLockManagement.tsx

@@ -380,6 +380,8 @@ export default function PadLockManagement({ subMenu }: PadLockManagementProps) {
     {
       title: t('table.remark'),
       dataIndex: 'exRemark',
+      width: 220,
+      ellipsis: true,
       render: (text: string) => {
         const remarkText = text || '-';
         const maxLength = 20;

+ 9 - 3
src/components/SegregationPointForm.tsx

@@ -35,6 +35,12 @@ const SegregationPointForm = forwardRef<SegregationPointFormRef, SegregationPoin
     const [pointGroupOptions, setPointGroupOptions] = useState<Array<{ label: string; value: number }>>([]);
     const [powerSourceOptions, setPowerSourceOptions] = useState<Array<{ label: string; value: string }>>([]);
 
+    const normalizeId = (val: unknown): number | undefined => {
+      if (val === null || val === undefined || val === '') return undefined;
+      const n = typeof val === 'number' ? val : Number(val);
+      return Number.isFinite(n) ? n : undefined;
+    };
+
     // 打开弹窗
     const open = async (type: string, id?: number) => {
       setDialogVisible(true);
@@ -78,7 +84,7 @@ const SegregationPointForm = forwardRef<SegregationPointFormRef, SegregationPoin
             pointPicture: data.pointPicture ?? '',
             // pointNfc: 如果是空字符串或 null,设置为 undefined(表单中不显示);如果有值则使用值
             pointNfc: data.pointNfc && data.pointNfc.trim() !== '' ? data.pointNfc : undefined,
-            workstationId: data.workstationId,
+            workstationId: normalizeId((data as any).workstationId),
             // lotoId 可能为 null,需要保留 null 值(不要转换为 undefined)
             // 如果为 null 则设置为 undefined(表单 Select 组件需要 undefined 而不是 null)
             lotoId: data.lotoId !== undefined && data.lotoId !== null ? data.lotoId : undefined,
@@ -238,7 +244,7 @@ const SegregationPointForm = forwardRef<SegregationPointFormRef, SegregationPoin
               pointPicture: values.pointPicture,
               // pointNfc: 如果为空字符串或 undefined,设置为 null;否则使用填入的值
               pointNfc: values.pointNfc && values.pointNfc.trim() !== '' ? values.pointNfc : null as any,
-              workstationId: values.workstationId,
+              workstationId: normalizeId(values.workstationId),
               lotoId: values.lotoId != null && values.lotoId !== '' ? Number(values.lotoId) : null,
               powerType: values.powerType != null && values.powerType !== '' ? Number(values.powerType) : undefined,
               // pointSerialNumber: 如果为空字符串或 undefined,设置为 null;否则使用填入的值
@@ -270,7 +276,7 @@ const SegregationPointForm = forwardRef<SegregationPointFormRef, SegregationPoin
               pointNfc: values.pointNfc !== undefined 
                 ? (values.pointNfc && values.pointNfc.trim() !== '' ? values.pointNfc : null)
                 : detailData.pointNfc,
-              workstationId: values.workstationId !== undefined ? values.workstationId : detailData.workstationId,
+              workstationId: values.workstationId !== undefined ? normalizeId(values.workstationId) : normalizeId((detailData as any).workstationId),
               // lotoId 处理:接口要求数字类型;表单中有值时转为 Number,清空时为 null
               lotoId: values.lotoId !== undefined
                 ? (values.lotoId != null && values.lotoId !== '' ? Number(values.lotoId) : null)

+ 12 - 4
src/components/lockCabinet/LockCabinetForm.tsx

@@ -27,6 +27,12 @@ const LockCabinetForm = forwardRef<LockCabinetFormRef, LockCabinetFormProps>(({
   const [isOnlineOptions] = useState(() => getStrDictOptions(DICT_TYPE.ISONLINE_STATUS));
   const [statusOptions] = useState(() => getStrDictOptions(DICT_TYPE.CANBINET_STATUS));
 
+  const normalizeId = (val: unknown): number | undefined => {
+    if (val === null || val === undefined || val === '') return undefined;
+    const n = typeof val === 'number' ? val : Number(val);
+    return Number.isFinite(n) ? n : undefined;
+  };
+
   // 获取岗位列表
   const getPostList = async () => {
     try {
@@ -82,7 +88,7 @@ const LockCabinetForm = forwardRef<LockCabinetFormRef, LockCabinetFormProps>(({
           form.setFieldsValue({
             cabinetId: cabinetId,
             cabinetName: data.cabinetName,
-            workstationId: data.workstationId,
+            workstationId: normalizeId((data as any).workstationId),
             hardwareId: data.hardwareId,
             serialNumber: data.serialNumber || '',
             isOnline: data.isOnline || '1',
@@ -127,6 +133,7 @@ const LockCabinetForm = forwardRef<LockCabinetFormRef, LockCabinetFormProps>(({
       
       const data: LockCabinetVO = {
         ...values,
+        workstationId: normalizeId(values.workstationId),
       };
 
       if (formType === 'create') {
@@ -178,15 +185,16 @@ const LockCabinetForm = forwardRef<LockCabinetFormRef, LockCabinetFormProps>(({
       confirmLoading={formLoading}
       okText={t('common.confirm')}
       cancelText={t('common.cancel')}
-      width={650}
+      width={740}
       destroyOnHidden
     >
       <Spin spinning={formLoading && formType === 'update'}>
         <Form
           form={form}
           layout="horizontal"
-          labelCol={{ span: 6 }}
-          wrapperCol={{ span: 18 }}
+          labelCol={{ flex: '190px' }}
+          wrapperCol={{ flex: '1 1 0' }}
+          labelWrap
           initialValues={{
             isOnline: '1',
             status: '1',

+ 13 - 8
src/components/user/FaceOrFingerForm.tsx

@@ -236,16 +236,21 @@ const FaceOrFingerForm = forwardRef<FaceOrFingerFormRef, FaceOrFingerFormProps>(
   // 表格列配置
   const columns: ColumnsType<UserCharacteristic> = [
     {
-      title: t('common.serialNumber'),
-      width: 80,
+      title: <span style={{ whiteSpace: 'nowrap' }}>{t('common.serialNumber')}</span>,
+      width: 130,
       align: 'center',
       render: (_: any, __: UserCharacteristic, index: number) => {
         return (queryParams.pageNo - 1) * queryParams.pageSize + index + 1;
       },
     },
     {
-      title: dataType === 'finger' ? t('form.fingerprint') : t('form.face'),
+      title: (
+        <span style={{ whiteSpace: 'nowrap' }}>
+          {dataType === 'finger' ? t('form.fingerprint') : t('form.face')}
+        </span>
+      ),
       align: 'center',
+      width: 220,
       render: (_: any, record: UserCharacteristic) => {
         const imgSrc = record.imageUrl || record.imagePath;
         return (
@@ -268,15 +273,15 @@ const FaceOrFingerForm = forwardRef<FaceOrFingerFormRef, FaceOrFingerFormProps>(
       },
     },
     {
-      title: t('table.createTime'),
+      title: <span style={{ whiteSpace: 'nowrap' }}>{t('table.createTime')}</span>,
       align: 'center',
-      width: 180,
+      width: 170,
       render: (_: any, record: UserCharacteristic) => formatDateTimeFull(record.createTime),
     },
     {
-      title: t('table.operation'),
+      title: <span style={{ whiteSpace: 'nowrap' }}>{t('table.operation')}</span>,
       align: 'center',
-      width: 120,
+      width: 110,
       render: (_: any, record: UserCharacteristic) => (
         <Button
           type="link"
@@ -340,7 +345,7 @@ const FaceOrFingerForm = forwardRef<FaceOrFingerFormRef, FaceOrFingerFormProps>(
         loading={formLoading}
         pagination={false}
         rowSelection={rowSelection}
-        scroll={{ y: 450 }}
+        scroll={{ x: 'max-content', y: 450 }}
         bordered
       />
 

+ 49 - 1
src/locales/en.json

@@ -241,7 +241,54 @@
     "processDesign": "Process Design",
     "formManagement": "Form Management",
     "myTask": "My Tasks",
-    "taskManagement": "Task Management"
+    "taskManagement": "Task Management",
+    "nodeDefaultName": "Node",
+    "nodeSettingsTitle": "{{nodeName}} Settings",
+    "nodeInfo": "Node Info",
+    "nodeName": "Node Name",
+    "nodeNamePlaceholder": "Please enter node name",
+    "saveCurrentNode": "Save Current Node",
+    "selectNodeToConfigure": "Please select a node in the workflow to configure",
+    "nextStepHint": "Tip: Each node in the workflow must be configured and saved before you can click \"Next\"."
+    ,
+    "submitFormSection": "Submit Form",
+    "businessForm": "Business Form",
+    "businessFormPlaceholder": "Please select submit form",
+    "notificationSection": "Notifications",
+    "notificationMethod": "Notification Method",
+    "notificationTarget": "Recipients",
+    "notifySMS": "SMS",
+    "notifyInbox": "Inbox Message",
+    "notifyEmail": "Email",
+    "notifyApp": "App Notification",
+    "notificationTargetTip1": "1. The system will send notifications to the task owner by default (or the locker/co-lockers).",
+    "notificationTargetTip2": "2. Please select CC recipients:",
+    "ccDeptLabel": "CC to Department (all users under the department):",
+    "ccDeptPlaceholder": "Please select departments (multiple)",
+    "ccUserLabel": "CC to Users:",
+    "ccUserPlaceholder": "Please select users (multiple)",
+    "responsible": "Responsible",
+    "responsiblePlaceholder": "Please select responsible person",
+    "responsibleHelp": "The person who will handle this task/step node. If not selected, it must be chosen when creating the work."
+    ,
+    "isolationMethod": "Isolation Method",
+    "isolationMethodPlaceholder": "Please select isolation method",
+    "isolationPointSelect": "Isolation Points (multiple)",
+    "isolationPointPlaceholder": "Please select isolation points",
+    "locker": "Locker",
+    "lockerPlaceholder": "Please select locker",
+    "coLocker": "Co-lockers (multiple)",
+    "coLockerPlaceholder": "Please select co-lockers",
+    "publishSettingsTitle": "Publish Settings",
+    "publishSettingsDesc": "Configure the execution time and publish the work",
+    "publishMethod": "Publish Method",
+    "publishMethodRequired": "Please select publish method",
+    "publishNow": "Publish Now",
+    "publishScheduled": "Scheduled Publish",
+    "publishTime": "Publish Time",
+    "publishTimeRequired": "Please select publish time",
+    "publishTimePlaceholder": "Please select publish time",
+    "confirmPublish": "Confirm Publish"
   },
   "common": {
     "loading": "Loading...",
@@ -249,6 +296,7 @@
     "success": "Success",
     "confirm": "Confirm",
     "cancel": "Cancel",
+    "close": "Close",
     "save": "Save",
     "delete": "Delete",
     "edit": "Edit",

+ 48 - 1
src/locales/zh.json

@@ -241,7 +241,53 @@
     "processDesign": "流程设计",
     "formManagement": "表单管理",
     "myTask": "我的任务",
-    "taskManagement": "任务管理"
+    "taskManagement": "任务管理",
+    "nodeDefaultName": "节点",
+    "nodeSettingsTitle": "{{nodeName}} 设置",
+    "nodeInfo": "节点信息",
+    "nodeName": "节点名称",
+    "nodeNamePlaceholder": "请输入节点名称",
+    "saveCurrentNode": "保存当前节点",
+    "selectNodeToConfigure": "请选择左侧流程中的节点进行配置",
+    "nextStepHint": "提示:流程中的每一个节点都需要单独配置并保存,方可点击 \"下一步\"。",
+    "submitFormSection": "提交表单",
+    "businessForm": "业务表单",
+    "businessFormPlaceholder": "请选择提交表单",
+    "notificationSection": "通知消息",
+    "notificationMethod": "通知方式",
+    "notificationTarget": "通知对象",
+    "notifySMS": "短信",
+    "notifyInbox": "站内信",
+    "notifyEmail": "邮件",
+    "notifyApp": "APP通知",
+    "notificationTargetTip1": "1. 系统将默认发送消息给任务负责人(或上锁人\\共锁人)",
+    "notificationTargetTip2": "2. 请选择消息抄送对象:",
+    "ccDeptLabel": "抄送给部门(部门下的所有人):",
+    "ccDeptPlaceholder": "请选择部门(可多选)",
+    "ccUserLabel": "抄送给人员:",
+    "ccUserPlaceholder": "请选择人员(可多选)",
+    "responsible": "负责人",
+    "responsiblePlaceholder": "请选择负责人",
+    "responsibleHelp": "对该任务或步骤节点进行处理的人员,若不选则需要在创建作业时进行选择。"
+    ,
+    "isolationMethod": "隔离方式",
+    "isolationMethodPlaceholder": "请选择隔离方式",
+    "isolationPointSelect": "隔离点选择(可多选)",
+    "isolationPointPlaceholder": "请选择隔离点",
+    "locker": "上锁人",
+    "lockerPlaceholder": "请选择上锁人",
+    "coLocker": "共锁人(可多选)",
+    "coLockerPlaceholder": "请选择共锁人",
+    "publishSettingsTitle": "发布作业设置",
+    "publishSettingsDesc": "请配置作业的执行时间并最终发布",
+    "publishMethod": "发布方式",
+    "publishMethodRequired": "请选择发布方式",
+    "publishNow": "立即发布",
+    "publishScheduled": "定时发布",
+    "publishTime": "发布时间",
+    "publishTimeRequired": "请选择发布时间",
+    "publishTimePlaceholder": "请选择发布时间",
+    "confirmPublish": "确认发布"
   },
   "common": {
     "loading": "加载中...",
@@ -249,6 +295,7 @@
     "success": "成功",
     "confirm": "确认",
     "cancel": "取消",
+    "close": "关闭",
     "save": "保存",
     "delete": "删除",
     "edit": "编辑",