#test
no.exit.key=Key information not found

#\u9519\u8BEF\u6D88\u606F
not.null=* Required
user.jcaptcha.error=Invalid verification code
user.jcaptcha.expire=Verification code expired
user.not.exists=User not found/Password incorrect
user.password.not.match=User not found/Password incorrect
user.password.retry.limit.count=Incorrect password entered {0} times
user.password.retry.limit.exceed=Account locked for 10 minutes after {0} failed attempts
user.password.delete=Your account has been deleted
user.blocked=Contact administrator: Account blocked
role.blocked=Contact administrator: Role blocked
user.logout.success=Logout successful
length.not.valid=Length between {min} and {max} characters
user.username.not.valid=* 2-20 alphanumeric/underscore (non-numeric start)
user.password.not.valid=* 5-50 characters
user.email.not.valid=Invalid email format
user.mobile.phone.number.not.valid=Invalid phone number format
user.login.success=Login successful
user.register.success=Registration successful
user.notfound=Session expired. Please login again
user.forcelogout=Admin forced logout. Re-login required
user.unknown.error=System error. Please re-login

##\u6587\u4EF6\u4E0A\u4F20\u6D88\u606F
upload.exceed.maxSize=File size exceeds limit!<br/>Max: {0}MB
upload.filename.exceed.length=Filename max {0} characters

##\u6743\u9650
no.permission=No data permission. Contact admin: [{0}]
no.create.permission=No create permission. Contact admin: [{0}]
no.update.permission=No update permission. Contact admin: [{0}]
no.delete.permission=No delete permission. Contact admin: [{0}]
no.export.permission=No export permission. Contact admin: [{0}]
no.view.permission=No view permission. Contact admin: [{0}]


##\u56DB\u3001\u5168\u5C40\u5F02\u5E38\u5904\u7406\u5668
exception.auth.no.permission=Access denied. Contact administrator
exception.demo.mode.not.allow=Demo mode: Operation disabled

##\u4E94\u3001AjaxResult \u9ED8\u8BA4\u6D88\u606F
ajax.result.success=Operation successful
ajax.result.error=Operation failed

##\u516D\u3001Controller \u7528\u6237\u7BA1\u7406\u76F8\u5173\u63D0\u793A
user.add.fail.login.account.exist=Username '{0}' already exists
user.add.fail.phone.exist=Phone '{0}' already registered
user.add.fail.email.exist=Email '{0}' already registered
user.update.fail.phone.exist=Phone conflict: '{0}' in use
user.update.fail.email.exist=Email conflict: '{0}' in use
user.update.user.detail.exception=Profile update failed. Contact admin


##\u4E03\u3001Service \u5F02\u5E38\u63D0\u793A
##\u7528\u6237\u670D\u52A1
user.service.import.data.not.null=Import data cannot be empty!
user.service.operate.super.admin.not.allow=Super admin operation prohibited
user.service.access.data.no.permission=Unauthorized user data access
##\u5C97\u4F4D\u670D\u52A1
post.service.delete.assigned.not.allow={0} assigned. Deletion blocked
##\u89D2\u8272\u670D\u52A1
role.service.operate.super.admin.not.allow=Super role modification prohibited
role.service.access.data.no.permission=Unauthorized role access
role.service.delete.assigned.not.allow={0} assignment exists. Deletion blocked
##\u914D\u7F6E\u670D\u52A1
config.service.built.in.param.delete.not.allow=Built-in parameter [{0}] protected
##\u5B57\u5178\u7C7B\u578B\u670D\u52A1
dict.type.service.delete.assigned.not.allow={0} referenced. Deletion blocked
##\u90E8\u95E8\u670D\u52A1
dept.service.access.data.no.permission=Department access denied
dept.service.add.disabled.not.allow=Department inactive: Add prohibited
##\u4EE3\u7801\u751F\u6210\u670D\u52A1
code.gen.service.import.fail=Import failed: {0}
code.gen.service.render.template.fail=Template render failed: Table {0}
code.gen.service.sync.data.fail.table.not.exist=Sync failed: Table missing
code.gen.service.tree.code.field.not.null=Tree code field required
code.gen.service.tree.parent.code.field.not.null=Parent tree code required
code.gen.service.tree.name.field.not.null=Tree name field required
code.gen.service.sub.table.name.not.null=Child table name required
code.gen.service.sub.table.fk.name.not.null=Foreign key required for child table
##\u7528\u6237\u8BE6\u60C5\u670D\u52A1
user.detail.service.login.user.not.exist=User {0} not found
user.detail.service.account.deleted=Account {0} deleted
user.detail.service.account.disabled=Account {0} suspended
user.detail.service.account.blacklisted=Blocked from {1} module: Account {0}
user.detail.service.account.lack.role.permission=Missing role permissions: Account {0}
##\u79FB\u52A8\u7AEF\u767B\u5F55\u670D\u52A1
mobile.login.service.sys.config.register.role.code.not.config=Configure register_role_code in sys_config
mobile.login.service.sys.config.register.dept.code.not.config=Configure register_dept_code in sys_config
mobile.login.service.sys.config.register.post.code.not.config=Configure register_post_code in sys_config
##\u9650\u6D41\u670D\u52A1
limit.service.access.too.frequent=Request throttled. Try later
##\u5B89\u5168\u5DE5\u5177
security.util.get.user.id.error=User ID retrieval failed
security.util.get.dept.id.error=Department ID retrieval failed
security.util.get.user.account.error=Account retrieval failed
security.util.get.user.info.error=User info retrieval failed


##\u516B\u3001CommonResult \u6210\u529F\u6D88\u606F
common.result.success.device.info= Device:{0}
common.result.success.import.data=Imported {0} records


##\u4E5D\u3001Assert \u53C2\u6570\u6821\u9A8C\u63D0\u793A
##\u901A\u7528\u63D0\u793A
assert.common.delete.select.data=Select records to delete!
assert.common.param.id.not.null=ID required!
assert.common.param.primary.key.id.not.null=Primary key required!
assert.common.param.invalid=Invalid parameters!
##\u4F5C\u4E1A\u7968\u76F8\u5173
assert.work.order.info.not.exist=Work order not found!
assert.work.order.data.lost=Work order data corrupt!
assert.work.order.id.not.null=Work order ID required!
assert.work.order.current.id.not.null=Current work order ID required!
assert.work.order.step.six.cannot.cancel=Step 6: Cancellation prohibited
assert.work.order.wait.lock.complete=Wait for lock completion: [{0}]
assert.work.order.specify=Specify work order!
assert.work.order.job.id.not.null=Job ID required!
assert.work.order.device.taken.cannot.operate=Device allocated: Operation blocked
assert.work.order.not.started.cannot.co.lock=Work order not started: Group Lock invalid
assert.work.order.already.co.locked.cannot.repeat=Group Lock active: Duplication prevented
assert.work.order.not.co.locked.cannot.unlock=No Group Lock: Unlock aborted
assert.work.order.already.unlocked.cannot.repeat=Already unlocked: Operation ignored
assert.work.order.code.not.null=Work order code required!
assert.work.order.name.not.null=Work order name required!
assert.work.order.select.isolation.point=Select isolation points!
assert.work.order.person.info.not.null=Personnel info required!
assert.work.order.point.info.not.null=Point information missing!
##\u94A5\u5319\u76F8\u5173
assert.key.data.lost=Key data corruption!
assert.key.nfc.no.corresponding.info=NFC tag unrecognized
assert.key.specify.nfc=Specify key NFC!
assert.key.nfc.not.null=Key NFC required!
assert.key.nfc.corresponding.info.not.exist=Key not found: {0}
##\u6302\u9501\u76F8\u5173
assert.lock.data.lost=Lock data corrupt!
assert.lock.nfc.no.corresponding.info=NFC tag unrecognized
assert.lock.nfc.not.null=Lock NFC required!
assert.lock.nfc.corresponding.data.not.exist=Lock not found: {0}
assert.lock.nfc.missing=Lock NFC missing!
assert.lock.specify.nfc=Specify lock NFC!
assert.lock.name.already.taken={0} currently in use!
assert.lock.point.error.duplicate=Duplicate lock point [{0}]. Complete multi-lock first!
assert.lock.take.at.least.one=Remove minimum one lock!
##\u786C\u4EF6\u76F8\u5173
assert.hardware.serial.no.corresponding.info=Serial number unrecognized
assert.hardware.lock.no.init.data.for.update=Lock initialization missing
assert.hardware.accessory.no.init.data.for.update=Accessory initialization missing
assert.hardware.code.not.null=Hardware code required!
assert.hardware.name.not.null=Hardware name required!
assert.hardware.code.already.used={0} already in use!
assert.hardware.specify.return.location=Specify return location!
assert.hardware.specify.return.cabinet=Specify storage cabinet!
##\u9694\u79BB\u70B9\u76F8\u5173
assert.isolation.point.nfc.no.corresponding.info=NFC tag unrecognized
assert.isolation.point.name.used.by.sop.cannot.delete={0} linked to SOP: Deletion blocked
assert.isolation.point.used.by.loto.cannot.delete={0} used by {1} station: Unbind first
assert.isolation.point.name.not.null=Isolation point name required!
assert.isolation.point.code.name.not.null=Code/Name required!
assert.isolation.point.id.not.null=Isolation point ID required!
assert.isolation.point.name.already.used=Name already exists!
assert.isolation.point.nfc.already.used=NFC already assigned!
assert.isolation.point.code.already.used=Code already in use!
assert.isolation.point.serial.no.already.used=Serial number duplicate!
assert.isolation.point.query.error=Query failed!
##\u8F85\u4EF6\u76F8\u5173
assert.accessory.nfc.no.corresponding.info=NFC tag unrecognized
assert.accessory.nfc.missing=Accessory NFC missing!
assert.accessory.take.at.least.one=Remove minimum one accessory!
##\u5C97\u4F4D\u76F8\u5173
assert.post.info.not.exist=Position not found!
assert.post.name.not.null=Position name required!
assert.post.name.already.used=Name already exists!
assert.post.id.not.null=Position ID required!
assert.post.not.null=Position required!
assert.post.used.by.user.cannot.delete=Assigned to users: Deletion blocked
assert.post.has.children.cannot.delete=Sub positions exist: Deletion blocked
##SOP \u76F8\u5173
assert.sop.data.not.exist=SOP not found!
assert.sop.id.not.null=SOP ID required!
assert.sop.name.not.null=SOP name required!
assert.sop.code.name.not.null=Code/Name required!
assert.sop.code.already.used=Code already exists!
assert.sop.sort.data.not.null=Sort order required!
##\u8BBE\u5907\u5DE5\u827A\u76F8\u5173
assert.machinery.process.info.not.exist=Process not found!
assert.machinery.process.name.not.null=Name required!
assert.machinery.process.parent.id.not.null=Parent ID required!
assert.machinery.process.name.already.used=[{0}] exists in processes/equipment!
assert.machinery.process.select.isolation.point=Select isolation points!
##\u5DE5\u4F5C\u533A\u57DF\u76F8\u5173
assert.work.area.name.not.null=Area name required!
assert.work.area.code.name.not.null=Code/Name required!
assert.work.area.id.not.null=Area ID required!
assert.work.area.code.already.used=Code already exists!
assert.work.area.has.isolation.point.cannot.delete={0} contains points: Deletion blocked
assert.work.area.pass.id=Pass area ID!
##\u9501\u63A7\u67DC / \u7269\u8D44\u67DC\u76F8\u5173
assert.cabinet.lock.id.not.null=Cabinet lock ID required!
assert.cabinet.material.code.not.null=Material cabinet code required!
assert.cabinet.material.info.not.exist=Cabinet not found!
assert.cabinet.material.code.identity.unrecognized=Unknown cabinet: {0}!
assert.cabinet.not.exist=Cabinet missing!
assert.cabinet.material.specify=Specify material cabinet!
assert.cabinet.code.not.null=Cabinet code required!
assert.cabinet.material.no.inspection.plan=No inspection plans assigned!
assert.cabinet.material.no.executable.inspection.plan=No active inspection plans!
assert.cabinet.clear.position.info.first=Clear compartments first!
assert.cabinet.code.already.used=Code already exists!
assert.cabinet.name.already.used=Name already exists!
assert.cabinet.electric.id.not.null=Electrical cabinet ID required!
assert.cabinet.electric.pass.id=Pass electrical cabinet ID!
assert.cabinet.name.not.null=Name required!
assert.cabinet.name.already.used.retry=Name exists. Try different!
##\u7269\u8D44\u76F8\u5173
assert.material.rfid.not.null=Material RFID required!
assert.material.rfid.not.found=Material not found: RFID {0}!
assert.material.cabinet.code.not.found=Cabinet not found: Code {0}!
assert.material.put.new.in.cabinet=Add new materials to cabinet!
assert.material.original.not.exist=Original material missing!
assert.material.new.not.exist=New material missing!
assert.material.code.already.used=Code already exists!
assert.material.rfid.already.used=RFID already assigned!
assert.material.not.exist=Material not found!
assert.material.specify.rfid=Specify material RFID!
assert.material.specify.borrow.or.return=Specify borrow/return action!
assert.material.rfid.already.borrowed={0} already borrowed!
assert.material.rfid.already.in.cabinet={0} already stored!
assert.material.cabinet.info.not.null=Cabinet info required!
assert.material.select=Select materials!
assert.material.old.id.not.null=Old material ID required!
assert.material.new.rfid.not.null=New material RFID required!
assert.material.to.replace.not.taken=Original material not removed!
assert.material.has.cabinet.cannot.replace=Still stored: Replacement blocked!
assert.material.replace.abnormal=Replacement failed!
assert.material.no.maintain.or.replace=No repair/replacement specified!
assert.material.import.data.not.null=Import data required!
##\u7269\u8D44\u5206\u7C7B\u76F8\u5173
assert.material.category.has.materials.cannot.delete={0} contains items: Deletion blocked!
assert.material.category.has.children.cannot.delete={0} has subcategories: Deletion blocked!
assert.material.category.code.already.used=Category code exists!
assert.material.category.borrow.duration.gte.reminder=Borrow duration >= reminder period!
##\u7535\u673A\u76F8\u5173
assert.motor.data.not.exist=Motor data missing!
assert.motor.map.primary.key.not.null=Map primary key required!
##\u5730\u56FE\u76F8\u5173
assert.map.data.parse.fail=Map parsing failed!
assert.map.provide.loto.cabinet.serial.no=Provide Lockout cabinet serial!
##\u68C0\u67E5\u8BA1\u5212\u76F8\u5173
assert.inspection.plan.configure.template=Configure inspection template in base data!
assert.inspection.plan.id.not.null=Plan ID required!
##\u6307\u7EB9\u76F8\u5173
assert.fingerprint.specify.user=Link fingerprint to user!
assert.fingerprint.group.not.null=Fingerprint group required!
assert.fingerprint.entry.limit.reached=Max {0} prints reached!
assert.fingerprint.unrecognizable.retry=Unreadable print: Re-scan!
assert.fingerprint.similarity.low.retry=Low similarity: Re-enroll!
assert.fingerprint.info.not.null=Print data required!
##\u4EBA\u8138\u76F8\u5173
assert.face.specify.user=Link face to user!
assert.face.entry.limit.reached=Max {0} faces stored!
assert.face.file.parse.fail=Face file corrupt!
assert.face.upload.file=Upload face image!
assert.face.get.fail=Face retrieval failed!
assert.face.get.feature.fail=Feature extraction failed!
assert.face.not.recognized=Face not recognized!
assert.face.comparison.error=Comparison error: {0}!
assert.face.info.not.null=Face data required!
assert.face.data.not.exist=No Face Data Found!
##\u767B\u5F55\u76F8\u5173
assert.login.fingerprint.identity.unknown=Fingerprint unrecognized: Alternative login!
assert.login.face.identity.unknown=Face unrecognized: Alternative login!
##\u7F16\u7801\u89C4\u5219\u76F8\u5173
assert.code.rule.input.char.not.null=Rule input required!
assert.code.rule.type.not.found=Rule type [{0}] missing!
assert.code.rule.result.record.not.found=Result record missing: [{0}]!
assert.code.rule.input.char.length.error=Input length mismatch!
assert.code.rule.serial.number.component.unique=Single component rule: {0}!
assert.code.rule.generated.code.empty=Empty generated code: [{0}]!
assert.code.rule.generated.code.exceed.max.length=Code [{0}] too long: Max {1} chars!
##\u4E1A\u52A1\u7F16\u7801\u76F8\u5173
assert.business.code.max.length.less.than.sum=Max length {0} < segment sum {1}!
##\u6587\u4EF6\u4E0A\u4F20\u76F8\u5173
assert.file.upload.param.invalid=Invalid upload parameters!
##\u7EDF\u8BA1\u76F8\u5173
assert.statistics.type.not.null=Statistic type required!
##\u7528\u6237\u76F8\u5173
assert.user.data.duplicate.name.modify=Duplicate names detected: Modify!
assert.user.not.exist.in.system=User not in system!
assert.user.work.card.not.bound=Card not linked to user!
assert.user.employee.card.no.work.task=No tasks assigned!
assert.user.operate.co.lock.status.not.null=G-Lock status required!
assert.user.work.card.nfc.not.null=Card NFC required!
##\u5B57\u5178\u6570\u636E\u76F8\u5173
assert.dict.data.key.value.exist=Value exists: {0}!
##\u5176\u4ED6\u4E1A\u52A1\u903B\u8F91
assert.business.no.data.received=No data received!
assert.business.specify.isolation.point.info=Specify isolation points!
assert.business.specify.lock.or.unlock=Specify lock/unlock action!
assert.business.specify.task.status=Specify task status!
assert.business.point.switch.data.not.null=Switch data required!
assert.business.loto.serial.no.not.null=Lockout serial required!
assert.business.point.serial.no.not.null=Point serial required!
assert.business.nfc.no.lock.info.found=No lock found via NFC!
assert.business.multiple.faces.recognized.adjust=Multiple faces detected: Re-position!
assert.business.task.name.not.null=Task name required!
assert.business.key.required=Specify KEY!
assert.business.config.param.not.exist=Config parameter missing!
assert.business.email.param.missing.check=Email params missing!
assert.business.step4.executed.cannot.change.locker=Step 4 completed: Locker change blocked!
assert.business.card.no.required=Enter card number!
assert.business.card.not.exist=Card not found!
assert.business.no.associated.user=No linked user!
assert.business.please.login.first=Login required!
assert.business.user.not.exist=User not found!
assert.business.user.not.bound.card=User-card link missing!
assert.business.card.invalid=Invalid card!
assert.business.current.user.info.not.exist=User profile missing!
assert.business.data.not.exist=Data not found!
assert.business.current.task.param.missing=Task parameters missing!
assert.business.task.not.exist=Task not found!
assert.business.template.code.not.null=Template code required!
assert.business.type.not.null=Type required!
assert.business.cabinet.code.not.exist=Cabinet code invalid!
assert.business.recipient.not.exist=Recipient missing!
assert.business.key.info.not.null=Key info required!
assert.business.no.corresponding.accessory.info=Accessory not found!
assert.business.please.select.personnel.info=Select personnel!
assert.business.please.configure.person.post.first=Assign position first!
assert.business.step.id.not.null=Step ID required!
assert.business.status.not.null=Status required!
assert.business.please.execute.previous.step.first=Complete previous step!
assert.business.please.set.locker.first=Designate locker!
assert.business.at.least.one.co.locker.required=Minimum one G-Locker required!
assert.business.work.permit.step.lost.check.data=Step loss detected: Review data!
assert.business.input.fingerprint.not.null=Fingerprint required!
assert.business.no.fingerprint.in.database=No prints enrolled!


# \u90AE\u4EF6\u4EFB\u52A1\u76F8\u5173
assert.mail.task.receive.user.not.null=Recipient required!
assert.mail.task.template.not.null=Email template required!
assert.mail.task.scheduled.send.time.not.null=Scheduled send time required!

# \u4F5C\u4E1A\u7968\u76F8\u5173
assert.job.ticket.step6.executed.cannot.change.user=User cannot be changed after step 6 execution!
assert.job.ticket.process.not.null=Process required!
assert.job.ticket.unfinished.step.cannot.complete=Completion blocked by unfinished steps!

# \u7269\u8D44\u67DC\u76F8\u5173
assert.material.cabinet.identity.required=Cabinet ID or code required!
assert.material.cabinet.code.not.blank=Cabinet code required!
assert.material.cabinet.no.materials=No materials in cabinet!
assert.material.cabinet.not.null=Cabinet required!
assert.material.cabinet.code.required=Code required!
assert.material.cabinet.code.already.used=Code already in use!
assert.material.cabinet.name.already.used=Cabinet name already exists!
assert.material.cabinet.has.materials.cannot.delete=Cannot delete cabinet with materials present!

# \u68C0\u67E5\u8BA1\u5212\u76F8\u5173
assert.material.check.plan.date.not.null=Inspection date required!
assert.material.check.plan.inspector.not.null=Inspector required!
assert.material.check.plan.select.cabinet.required=Cabinet selection required!
assert.material.check.plan.name.already.used=Name already exists!
assert.material.check.plan.id.not.null=Check plan ID required!
assert.material.check.plan.duplicate.record=Duplicate record detected!
assert.material.check.record.id.not.null=Record ID required!
assert.material.check.plan.plan.id.not.null=Plan ID required!
assert.material.check.plan.no.data.to.submit=No data to submit!
assert.material.check.plan.unchecked.materials=Uninspected materials found!

# \u7269\u8D44\u76F8\u5173
assert.material.id.not.null=Material ID required!
assert.material.loan.restitution.user.id.not.null=Return user ID required!
assert.material.loan.restitution.cabinet.id.not.null=Return cabinet ID required!
assert.material.change.old.id.not.null=Original material ID required!
assert.material.change.new.id.not.null=New material ID required for replacement!
assert.material.change.new.not.in.current.cabinet=New material not in current cabinet!
assert.material.change.abnormal.replacement=Abnormal replacement detected!
assert.cabinet.material.not.exist=Data missing!

# SOP\u76F8\u5173
assert.sop.machinery.process.id.not.null=Machinery process ID required!
assert.sop.already.exists=SOP already exists!
assert.sop.import.material.data.not.null=Import data required!

# \u94A5\u5319\u76F8\u5173
assert.key.name.not.blank=Key name required!
assert.key.name.already.used=Key name already in use!
assert.key.code.already.used=Key code already in use!
assert.key.mac.already.used=MAC address already in use!
assert.key.nfc.required=NFC required for key!
assert.key.mac.address.required=MAC address required for key!
assert.key.nfc.already.exists=Key with NFC already exists!
assert.key.mac.already.exists=Key with MAC already exists!

# \u5DE5\u5361\u76F8\u5173
assert.job.card.nfc.required=NFC required for job card!
assert.job.card.nfc.already.exists=Job card with NFC already exists!

# \u6302\u9501\u76F8\u5173
assert.lock.name.already.used=Padlock name already in use!
assert.lock.code.already.used=Padlock code already in use!
assert.lock.nfc.required=NFC required for padlock!
assert.lock.nfc.already.exists=Padlock with NFC already exists!

# \u6302\u9501\u7C7B\u578B\u76F8\u5173
assert.lock.type.name.already.used=Padlock type name already exists!
assert.lock.type.code.already.used=Padlock type code already in use!
assert.lock.type.has.subtype.cannot.delete=Cannot delete type with subtypes!
assert.lock.type.in.use.by.isolation.point.cannot.delete=Type in use by isolation points!

# \u9501\u5177\u7C7B\u578B\u76F8\u5173
assert.lockset.type.name.already.used=Lockset type name already exists!
assert.lockset.type.code.already.used=Lockset type code already in use!
assert.lockset.type.remove.subset.first=Remove subset first!

# RFID\u76F8\u5173
assert.rfid.token.already.exists=RFID token already exists!
assert.rfid.token.in.use.by.isolation.point.cannot.delete=Token in use by isolation points!
assert.rfid.token.required=RFID token required!

# \u90AE\u4EF6\u6A21\u677F\u76F8\u5173
assert.mail.template.code.not.blank=Template code required!
assert.mail.template.code.already.used=Template code already exists!
assert.mail.template.id.not.null=Template ID required!

# \u7CFB\u7EDF\u5C5E\u6027\u76F8\u5173
assert.system.attribute.value.not.blank=Attribute value required!
assert.system.attribute.key.already.used=Attribute key already exists!
assert.system.attribute.key.not.blank=Attribute key required!

# \u5F00\u5173\u5E03\u5C40\u76F8\u5173
assert.loto.switch.map.id.not.null=Switch map ID required!

# \u5176\u4ED6
assert.res.api.check.id.not.null=Check ID required!


\u4EBA\u5458\u7BA1\u7406=Personnel
\u90E8\u95E8\u7BA1\u7406=Department
\u5C97\u4F4D\u7BA1\u7406=Position
\u5355\u4F4D\u7BA1\u7406=Unit
\u89D2\u8272\u7BA1\u7406=Role
\u786C\u4EF6\u7BA1\u7406=Hardware
\u786C\u4EF6\u7C7B\u578B=Hardware Type
\u9501\u5177\u673A\u6784\u7C7B\u578B=Latch Type
\u6302\u9501\u7C7B\u578B=Padlock Type
\u786C\u4EF6=Hardware
\u786C\u4EF6\u4FE1\u606F=Hardware Info
\u9501\u5177\u673A\u6784\u4FE1\u606F=Latch Info
\u94A5\u5319\u4FE1\u606F=Key Info
\u6302\u9501\u4FE1\u606F=Padlock Info
RFID\u6807\u8BC6=RFID Tag
\u9501\u67DC\u7BA1\u7406=Cabinet
\u5DE5\u5361\u4FE1\u606F=Job Card Info
\u8BBE\u5907\u7BA1\u7406=Equipment
\u8BBE\u5907\u7C7B\u578B\u8BBE\u7F6E=Equipment Type Config
\u9501\u5B9A\u7AD9\u7BA1\u7406=LOTO Station
\u5F00\u5173\u5E03\u5C40\u7BA1\u7406=Switch Layout
\u5F00\u5173\u7535\u673A\u7BA1\u7406=Switch Motor
\u9694\u79BB\u70B9\u7BA1\u7406=Isolation Point
SOP\u7BA1\u7406=SOP
SOP\u5217\u8868=SOP List
\u4F5C\u4E1A\u7BA1\u7406=Work Order
\u4F5C\u4E1A\u6267\u884C=Work Order Execution
\u4F5C\u4E1A\u5217\u8868=Work Order List
\u6570\u636E\u7EDF\u8BA1=Data Analytics
\u57FA\u7840\u6570\u636E\u7EDF\u8BA1=Base Stats
\u9886\u53D6\u5F52\u8FD8\u7EDF\u8BA1=Pickup/Return Stats
\u7269\u8D44\u7BA1\u7406=Material
\u7269\u8D44\u67DC=Material Cabinet
\u7269\u8D44\u7C7B\u578B=Material Type
\u7269\u8D44\u76D8\u70B9=Material Inventory
\u7269\u8D44\u89C4\u683C\u79CD\u7C7B=Material Spec Types
\u7269\u8D44\u6E05\u5355=Material List
\u7269\u8D44\u9886\u53D6\u5F52\u8FD8=Material Pickup/Return
\u7269\u8D44\u68C0\u67E5\u8BA1\u5212=Inspection Plan
\u7269\u8D44\u68C0\u67E5\u8BB0\u5F55=Inspection Records
\u7EF4\u4FEE/\u66F4\u6362\u8BB0\u5F55=Maintenance/Replacement Records
\u7269\u8D44\u67DC\u9ED1\u540D\u5355=Blacklist
\u7269\u8D44\u4F7F\u7528\u8BF4\u660E=Usage Guide
\u5F02\u5E38\u7BA1\u7406=Exception
\u7269\u8D44\u5F52\u8FD8\u5F02\u5E38=Return Exception
\u7269\u8D44\u67DC\u95E8\u5F02\u5E38=Cabinet Door Exception
\u4EBA\u5DE5\u4E0A\u4F20\u5F02\u5E38=Manual Upload Exception
\u90AE\u4EF6\u7BA1\u7406=Email
\u90AE\u4EF6\u6A21\u677F=Templates
\u90AE\u4EF6\u63D0\u9192=Notifications
\u7CFB\u7EDF\u7BA1\u7406=System
\u83DC\u5355\u7BA1\u7406=Menu
\u5B57\u5178\u7BA1\u7406=Dictionary
\u901A\u77E5\u516C\u544A=Announcements
\u65E5\u5FD7\u7BA1\u7406=Log
\u64CD\u4F5C\u65E5\u5FD7=Operation Log
\u767B\u5F55\u65E5\u5FD7=Login Log
\u7F16\u7801\u89C4\u5219=Auto Code Rules
\u57FA\u7840\u6570\u636E=Base Data
\u5730\u56FE\u53C2\u6570=Map Params
\u5730\u56FE\u70B9\u4F4D=Map Points
\u7CFB\u7EDF\u5DE5\u5177=DevTools
\u8868\u5355\u6784\u5EFA=Form Builder
\u4EE3\u7801\u751F\u6210=Code Generator
\u7CFB\u7EDF\u63A5\u53E3=API


##\u5B57\u5178\u90E8\u5206
\u603B\u89C8=Summary
\u67DC\u4E2D=Available
\u501F\u51FA=Loaned
\u6B63\u5E38=Normal
\u8FC7\u671F=Expired
\u635F\u574F=Damaged
\u662F=Yes
\u5426=No
\u672A\u5F00\u59CB=Pending
\u5DF2\u53D6\u6D88=Cancelled
\u5DF2\u7ED3\u675F=Closed
\u5F85\u89E3\u9501=Pending Release
\u5F85\u4E0A\u9501=Pending Lockout
\u505C\u7528=Deactivated
\u5F02\u5E38=Exception
\u663E\u793A=Show
\u9690\u85CF=Hide
\u5173\u95ED=Close


#\u516B\u5927\u6B65\u9AA4
#pc
\u8BC6\u522B\u6240\u8981\u5B8C\u6210\u7684\u5DE5\u4F5C\u5185\u5BB9=Identify Work Content
\u5224\u65AD\u5DE5\u4F5C\u6240\u6D89\u53CA\u7684\u80FD\u91CF\u6E90\u53CA\u9694\u79BB\u65B9\u5F0F=Energy Isolation Method
\u901A\u77E5\u6240\u6709\u53D7\u5F71\u54CD\u7684\u4EBA=Notify Affected Employees
\u5982\u679C\u8BBE\u5907\u6B63\u5728\u8FD0\u884C\uFF0C\u6309\u6B63\u5E38\u64CD\u4F5C\u505C\u673A=Shutdown Operation
\u4E0A\u9501\u5E76\u6302\u724C=Lockout Tagout
\u53D6\u9501\u524D\u7684\u68C0\u67E5=Pre-Unlock Check
\u62C6\u9664\u9501\u5177\uFF0C\u5E76\u628A\u9694\u79BB\u5F00\u5173\u6062\u590D\u5230\u6B63\u5E38\u4F4D\u7F6E=Unlock and Restore Switch

#android
\u8BC6\u522B\u5DE5\u4F5C\u5185\u5BB9=Identify Work Content
\u80FD\u91CF\u6E90\u9694\u79BB\u65B9\u5F0F=Energy Isolation Method
\u901A\u77E5\u4EBA\u5458=Notify Affected Personnel
\u64CD\u4F5C\u505C\u673A=Shutdown Operation
\u4E0A\u9501\u6302\u724C=Lockout
\u80FD\u91CF\u9694\u79BB\u8BC1\u5B9E=Verify Energy Isolation
\u53D6\u9501\u524D\u68C0\u67E5=Pre-Unlock Check
\u62C6\u9501\u6062\u590D\u5F00\u5173=Remove Lock & Restore Power

#TicketOperLog
\u542F\u52A8\u4F5C\u4E1A=Start Work Order
\u4F5C\u4E1A=Work Order
\u5DF2\u542F\u52A8=Initiated

\u64CD\u4F5C\u786E\u8BA4=Confirm
\u5DF2\u786E\u8BA4\u6267\u884C=Confirmed

\u2F08\u5458\u53D8\u52A8=Personnel Changes
\u5DF2\u6DFB\u52A0\u4E0A\u9501\u4EBA=Locker Added
\u5DF2\u6DFB\u52A0\u5171\u9501\u4EBA=G-Locker Added
\u79FB\u9664\u52A0\u4E0A\u9501\u4EBA=Remove Locker
\u79FB\u9664\u52A0\u5171\u9501\u4EBA=Remove G-Locker

\u542F\u52A8\u4E0A\u9501=Start Lockout

\u5B8C\u6210\u4E0A\u9501=Complete Lockout
\u5DF2\u4E0A\u9501=Locked

\u5DF2\u6DFB\u52A0\u5171\u9501=G-Locked
\u6DFB\u52A0\u5171\u9501=Add Group Lock

\u5DF2\u89E3\u9664\u5171\u9501=G-Unlocked
\u89E3\u9664\u5171\u9501=Release Group Lock

\u542F\u52A8\u89E3\u9501=Start Release

\u5B8C\u6210\u89E3\u9501=Complete Release
\u5DF2\u89E3\u9501=Released

\u5DF2\u5B8C\u6210\u4F5C\u4E1A=Work Order Completed
\u7ED3\u675F\u4F5C\u4E1A=Close Work Order

\u5DF2\u53D6\u6D88\u4F5C\u4E1A=Work Order Cancelled
\u53D6\u6D88\u4F5C\u4E1A=Cancel Work Order


