feat: 社保年度标准完善 — 医疗附加 + 继承旧配置 + 公积金独立上下限
1. 医疗附加金额:SocialYearStandard 和 SocialInsuranceConfig 新增 medicalOrgExtra/medicalEmpExtra 字段(如北京3元大病医疗) - calcSocialInsurance 计算时加上医疗附加 - 前端年度标准表单加医疗企业/个人附加输入 2. 新建年度标准继承:新增 /inherit-config API - 优先用当前年度标准 - 回退到旧 SocialInsuranceConfig/HousingFundConfig - 前端点击"新建年度标准"时自动继承填充 3. 公积金独立上下限:SocialYearStandard 新增 housingBaseMin/housingBaseMax - calcHousingFund 优先用公积金专用上下限,为0时回退到社保 - 前端公积金年度标准表单加公积金基数上下限输入 4. blank_employees/blank_all 模式跳过试用期工资覆盖 5. 劳务协议/实习协议人员 calcBatchEntry 强制社保公积金为0 Generated with [Devin](https://devin.ai) Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
This commit is contained in:
@@ -509,6 +509,8 @@ model SocialYearStandard {
|
|||||||
pensionEmp Float @default(8)
|
pensionEmp Float @default(8)
|
||||||
medicalOrg Float @default(9.8)
|
medicalOrg Float @default(9.8)
|
||||||
medicalEmp Float @default(2)
|
medicalEmp Float @default(2)
|
||||||
|
medicalOrgExtra Float @default(0) // 医疗企业附加(固定金额,如北京大病医疗)
|
||||||
|
medicalEmpExtra Float @default(0) // 医疗个人附加(固定金额,如北京3元大病医疗)
|
||||||
unemploymentOrg Float @default(0.5)
|
unemploymentOrg Float @default(0.5)
|
||||||
unemploymentEmp Float @default(0.5)
|
unemploymentEmp Float @default(0.5)
|
||||||
injuryOrg Float @default(0.2)
|
injuryOrg Float @default(0.2)
|
||||||
@@ -549,6 +551,8 @@ model SocialInsuranceConfig {
|
|||||||
pensionEmp Float @default(8) // 养老保险 个人比例 %
|
pensionEmp Float @default(8) // 养老保险 个人比例 %
|
||||||
medicalOrg Float @default(9.8) // 医疗保险 企业比例 %
|
medicalOrg Float @default(9.8) // 医疗保险 企业比例 %
|
||||||
medicalEmp Float @default(2) // 医疗保险 个人比例 %
|
medicalEmp Float @default(2) // 医疗保险 个人比例 %
|
||||||
|
medicalOrgExtra Float @default(0) // 医疗企业附加(固定金额)
|
||||||
|
medicalEmpExtra Float @default(0) // 医疗个人附加(固定金额,如北京3元)
|
||||||
unemploymentOrg Float @default(0.5) // 失业保险 企业比例 %
|
unemploymentOrg Float @default(0.5) // 失业保险 企业比例 %
|
||||||
unemploymentEmp Float @default(0.5) // 失业保险 个人比例 %
|
unemploymentEmp Float @default(0.5) // 失业保险 个人比例 %
|
||||||
injuryOrg Float @default(0.2) // 工伤保险 企业比例 %
|
injuryOrg Float @default(0.2) // 工伤保险 企业比例 %
|
||||||
|
|||||||
@@ -14,6 +14,8 @@ const socialConfigFields = {
|
|||||||
pensionEmp: z.number().optional(),
|
pensionEmp: z.number().optional(),
|
||||||
medicalOrg: z.number().optional(),
|
medicalOrg: z.number().optional(),
|
||||||
medicalEmp: z.number().optional(),
|
medicalEmp: z.number().optional(),
|
||||||
|
medicalOrgExtra: z.number().min(0).optional(),
|
||||||
|
medicalEmpExtra: z.number().min(0).optional(),
|
||||||
unemploymentOrg: z.number().optional(),
|
unemploymentOrg: z.number().optional(),
|
||||||
unemploymentEmp: z.number().optional(),
|
unemploymentEmp: z.number().optional(),
|
||||||
injuryOrg: z.number().optional(),
|
injuryOrg: z.number().optional(),
|
||||||
@@ -166,6 +168,47 @@ router.get('/accounts/:accountId/current-standard', async (req: AuthRequest, res
|
|||||||
} catch (err) { next(err) }
|
} catch (err) { next(err) }
|
||||||
})
|
})
|
||||||
|
|
||||||
|
// 按账户获取继承数据(当前标准 → 旧社保配置 → 默认值),用于新建年度标准初始值
|
||||||
|
router.get('/accounts/:accountId/inherit-config', async (req: AuthRequest, res: Response, next: NextFunction) => {
|
||||||
|
try {
|
||||||
|
const orgId = req.user!.orgId
|
||||||
|
const { accountId } = req.params
|
||||||
|
const account = await prisma.socialAccount.findFirst({ where: { id: accountId, orgId } })
|
||||||
|
if (!account) return res.status(404).json({ success: false, error: { code: 'NOT_FOUND', message: '账户不存在' } })
|
||||||
|
|
||||||
|
// 1. 优先用当前年度标准
|
||||||
|
const currentStandard = await prisma.socialYearStandard.findFirst({
|
||||||
|
where: { orgId, accountId, isCurrent: true },
|
||||||
|
orderBy: { effectiveFrom: 'desc' },
|
||||||
|
})
|
||||||
|
if (currentStandard) {
|
||||||
|
return res.json({ success: true, data: { ...currentStandard, source: 'current_standard' } })
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2. 回退到旧社保/公积金配置表(按城市)
|
||||||
|
if (account.type === 'HOUSING') {
|
||||||
|
const oldConfig = await prisma.housingFundConfig.findFirst({
|
||||||
|
where: { orgId, city: account.city },
|
||||||
|
orderBy: { effectiveFrom: 'desc' },
|
||||||
|
})
|
||||||
|
if (oldConfig) {
|
||||||
|
return res.json({ success: true, data: { ...oldConfig, source: 'old_housing_config' } })
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
const oldConfig = await prisma.socialInsuranceConfig.findFirst({
|
||||||
|
where: { orgId, city: account.city },
|
||||||
|
orderBy: { effectiveFrom: 'desc' },
|
||||||
|
})
|
||||||
|
if (oldConfig) {
|
||||||
|
return res.json({ success: true, data: { ...oldConfig, source: 'old_social_config' } })
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 3. 都没有,返回 null
|
||||||
|
res.json({ success: true, data: null })
|
||||||
|
} catch (err) { next(err) }
|
||||||
|
})
|
||||||
|
|
||||||
// 按账户+月份获取适用标准
|
// 按账户+月份获取适用标准
|
||||||
router.get('/accounts/:accountId/standard-by-month/:month', async (req: AuthRequest, res: Response, next: NextFunction) => {
|
router.get('/accounts/:accountId/standard-by-month/:month', async (req: AuthRequest, res: Response, next: NextFunction) => {
|
||||||
try {
|
try {
|
||||||
@@ -194,6 +237,8 @@ const yearStandardSchema = z.object({
|
|||||||
pensionEmp: z.number().optional(),
|
pensionEmp: z.number().optional(),
|
||||||
medicalOrg: z.number().optional(),
|
medicalOrg: z.number().optional(),
|
||||||
medicalEmp: z.number().optional(),
|
medicalEmp: z.number().optional(),
|
||||||
|
medicalOrgExtra: z.number().min(0).optional(),
|
||||||
|
medicalEmpExtra: z.number().min(0).optional(),
|
||||||
unemploymentOrg: z.number().optional(),
|
unemploymentOrg: z.number().optional(),
|
||||||
unemploymentEmp: z.number().optional(),
|
unemploymentEmp: z.number().optional(),
|
||||||
injuryOrg: z.number().optional(),
|
injuryOrg: z.number().optional(),
|
||||||
@@ -760,8 +805,8 @@ router.post('/calculate', async (req: AuthRequest, res: Response, next: NextFunc
|
|||||||
|
|
||||||
const pensionOrg = actualBase * config.pensionOrg / 100
|
const pensionOrg = actualBase * config.pensionOrg / 100
|
||||||
const pensionEmp = actualBase * config.pensionEmp / 100
|
const pensionEmp = actualBase * config.pensionEmp / 100
|
||||||
const medicalOrg = medicalBase * config.medicalOrg / 100
|
const medicalOrg = medicalBase * config.medicalOrg / 100 + (config.medicalOrgExtra || 0)
|
||||||
const medicalEmp = medicalBase * config.medicalEmp / 100
|
const medicalEmp = medicalBase * config.medicalEmp / 100 + (config.medicalEmpExtra || 0)
|
||||||
const unemploymentOrg = actualBase * config.unemploymentOrg / 100
|
const unemploymentOrg = actualBase * config.unemploymentOrg / 100
|
||||||
const unemploymentEmp = actualBase * config.unemploymentEmp / 100
|
const unemploymentEmp = actualBase * config.unemploymentEmp / 100
|
||||||
const injuryOrg = actualBase * config.injuryOrg / 100
|
const injuryOrg = actualBase * config.injuryOrg / 100
|
||||||
@@ -1150,7 +1195,7 @@ function calcSocialDetail(base: number, config: any) {
|
|||||||
const medicalBase = Math.min(Math.max(base, medMin), medMax)
|
const medicalBase = Math.min(Math.max(base, medMin), medMax)
|
||||||
const items = [
|
const items = [
|
||||||
{ name: '养老', orgRate: config.pensionOrg, empRate: config.pensionEmp, orgAmount: actualBase * config.pensionOrg / 100, empAmount: actualBase * config.pensionEmp / 100 },
|
{ name: '养老', orgRate: config.pensionOrg, empRate: config.pensionEmp, orgAmount: actualBase * config.pensionOrg / 100, empAmount: actualBase * config.pensionEmp / 100 },
|
||||||
{ name: '医疗', orgRate: config.medicalOrg, empRate: config.medicalEmp, orgAmount: medicalBase * config.medicalOrg / 100, empAmount: medicalBase * config.medicalEmp / 100 },
|
{ name: '医疗', orgRate: config.medicalOrg, empRate: config.medicalEmp, orgAmount: medicalBase * config.medicalOrg / 100 + (config.medicalOrgExtra || 0), empAmount: medicalBase * config.medicalEmp / 100 + (config.medicalEmpExtra || 0) },
|
||||||
{ name: '失业', orgRate: config.unemploymentOrg, empRate: config.unemploymentEmp, orgAmount: actualBase * config.unemploymentOrg / 100, empAmount: actualBase * config.unemploymentEmp / 100 },
|
{ name: '失业', orgRate: config.unemploymentOrg, empRate: config.unemploymentEmp, orgAmount: actualBase * config.unemploymentOrg / 100, empAmount: actualBase * config.unemploymentEmp / 100 },
|
||||||
{ name: '工伤', orgRate: config.injuryOrg, empRate: 0, orgAmount: actualBase * config.injuryOrg / 100, empAmount: 0 },
|
{ name: '工伤', orgRate: config.injuryOrg, empRate: 0, orgAmount: actualBase * config.injuryOrg / 100, empAmount: 0 },
|
||||||
{ name: '生育', orgRate: config.maternityOrg, empRate: 0, orgAmount: medicalBase * config.maternityOrg / 100, empAmount: 0 },
|
{ name: '生育', orgRate: config.maternityOrg, empRate: 0, orgAmount: medicalBase * config.maternityOrg / 100, empAmount: 0 },
|
||||||
|
|||||||
@@ -113,8 +113,8 @@ export function calcSocialInsurance(base: number, config: any) {
|
|||||||
const medMin = config.medicalBaseMin && config.medicalBaseMin > 0 ? config.medicalBaseMin : config.baseMin
|
const medMin = config.medicalBaseMin && config.medicalBaseMin > 0 ? config.medicalBaseMin : config.baseMin
|
||||||
const medMax = config.medicalBaseMax && config.medicalBaseMax > 0 ? config.medicalBaseMax : config.baseMax
|
const medMax = config.medicalBaseMax && config.medicalBaseMax > 0 ? config.medicalBaseMax : config.baseMax
|
||||||
const medicalBase = Math.min(Math.max(base, medMin), medMax)
|
const medicalBase = Math.min(Math.max(base, medMin), medMax)
|
||||||
let socialEmp = actualBase * (config.pensionEmp + config.unemploymentEmp) / 100 + medicalBase * config.medicalEmp / 100
|
let socialEmp = actualBase * (config.pensionEmp + config.unemploymentEmp) / 100 + medicalBase * config.medicalEmp / 100 + (config.medicalEmpExtra || 0)
|
||||||
let socialOrg = actualBase * (config.pensionOrg + config.unemploymentOrg + config.injuryOrg) / 100 + medicalBase * (config.medicalOrg + config.maternityOrg) / 100
|
let socialOrg = actualBase * (config.pensionOrg + config.unemploymentOrg + config.injuryOrg) / 100 + medicalBase * (config.medicalOrg + config.maternityOrg) / 100 + (config.medicalOrgExtra || 0)
|
||||||
// 附加险种(大病险/长护险等)
|
// 附加险种(大病险/长护险等)
|
||||||
const extraItems: any[] = []
|
const extraItems: any[] = []
|
||||||
if (config.extraInsurances && Array.isArray(config.extraInsurances)) {
|
if (config.extraInsurances && Array.isArray(config.extraInsurances)) {
|
||||||
|
|||||||
@@ -538,6 +538,9 @@ export const socialAccountApi = {
|
|||||||
/** 按账户获取当前生效标准 */
|
/** 按账户获取当前生效标准 */
|
||||||
currentStandard: (accountId: string) =>
|
currentStandard: (accountId: string) =>
|
||||||
get(`/social/accounts/${accountId}/current-standard`).then(unwrap<any>()),
|
get(`/social/accounts/${accountId}/current-standard`).then(unwrap<any>()),
|
||||||
|
/** 按账户获取继承数据(当前标准→旧配置→null),用于新建年度标准初始值 */
|
||||||
|
inheritConfig: (accountId: string) =>
|
||||||
|
get(`/social/accounts/${accountId}/inherit-config`).then(unwrap<any>()),
|
||||||
/** 按账户+月份获取适用标准 */
|
/** 按账户+月份获取适用标准 */
|
||||||
standardByMonth: (accountId: string, month: string) =>
|
standardByMonth: (accountId: string, month: string) =>
|
||||||
get(`/social/accounts/${accountId}/standard-by-month/${month}`).then(unwrap<any>()),
|
get(`/social/accounts/${accountId}/standard-by-month/${month}`).then(unwrap<any>()),
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ export function AccountCard({
|
|||||||
effectiveFrom: new Date().toISOString().slice(0, 7),
|
effectiveFrom: new Date().toISOString().slice(0, 7),
|
||||||
city: account.city,
|
city: account.city,
|
||||||
pensionOrg: 16, pensionEmp: 8,
|
pensionOrg: 16, pensionEmp: 8,
|
||||||
medicalOrg: 9.8, medicalEmp: 2,
|
medicalOrg: 9.8, medicalEmp: 2, medicalOrgExtra: 0, medicalEmpExtra: 0,
|
||||||
unemploymentOrg: 0.5, unemploymentEmp: 0.5,
|
unemploymentOrg: 0.5, unemploymentEmp: 0.5,
|
||||||
injuryOrg: 0.2, maternityOrg: 0.8,
|
injuryOrg: 0.2, maternityOrg: 0.8,
|
||||||
baseMin: 6326, baseMax: 33891,
|
baseMin: 6326, baseMax: 33891,
|
||||||
@@ -349,7 +349,7 @@ export function AccountCard({
|
|||||||
<div className="flex justify-between border-b pb-1.5"><span className="text-gray-500">医保基数上限</span><span className="font-medium">¥{fmt(config.medicalBaseMax)}</span></div>
|
<div className="flex justify-between border-b pb-1.5"><span className="text-gray-500">医保基数上限</span><span className="font-medium">¥{fmt(config.medicalBaseMax)}</span></div>
|
||||||
)}
|
)}
|
||||||
<div className="flex justify-between border-b pb-1.5"><span className="text-gray-500">养老(企业/个人)</span><span className="font-medium">{config.pensionOrg}% / {config.pensionEmp}%</span></div>
|
<div className="flex justify-between border-b pb-1.5"><span className="text-gray-500">养老(企业/个人)</span><span className="font-medium">{config.pensionOrg}% / {config.pensionEmp}%</span></div>
|
||||||
<div className="flex justify-between border-b pb-1.5"><span className="text-gray-500">医疗(企业/个人)</span><span className="font-medium">{config.medicalOrg}% / {config.medicalEmp}%</span></div>
|
<div className="flex justify-between border-b pb-1.5"><span className="text-gray-500">医疗(企业/个人)</span><span className="font-medium">{config.medicalOrg}% / {config.medicalEmp}%{(config.medicalOrgExtra > 0 || config.medicalEmpExtra > 0) && ` + ¥${fmt(config.medicalOrgExtra)}/¥${fmt(config.medicalEmpExtra)}`}</span></div>
|
||||||
<div className="flex justify-between border-b pb-1.5"><span className="text-gray-500">失业(企业/个人)</span><span className="font-medium">{config.unemploymentOrg}% / {config.unemploymentEmp}%</span></div>
|
<div className="flex justify-between border-b pb-1.5"><span className="text-gray-500">失业(企业/个人)</span><span className="font-medium">{config.unemploymentOrg}% / {config.unemploymentEmp}%</span></div>
|
||||||
<div className="flex justify-between border-b pb-1.5"><span className="text-gray-500">工伤(企业)</span><span className="font-medium">{config.injuryOrg}%</span></div>
|
<div className="flex justify-between border-b pb-1.5"><span className="text-gray-500">工伤(企业)</span><span className="font-medium">{config.injuryOrg}%</span></div>
|
||||||
<div className="flex justify-between border-b pb-1.5"><span className="text-gray-500">生育(企业)</span><span className="font-medium">{config.maternityOrg}%</span></div>
|
<div className="flex justify-between border-b pb-1.5"><span className="text-gray-500">生育(企业)</span><span className="font-medium">{config.maternityOrg}%</span></div>
|
||||||
@@ -397,7 +397,43 @@ export function AccountCard({
|
|||||||
|
|
||||||
{/* 操作按钮 */}
|
{/* 操作按钮 */}
|
||||||
<div className="flex items-center gap-2">
|
<div className="flex items-center gap-2">
|
||||||
<Button size="sm" onClick={() => setShowNewVersion(!showNewVersion)}>
|
<Button size="sm" onClick={async () => {
|
||||||
|
if (!showNewVersion) {
|
||||||
|
// 打开新建表单时,自动继承当前标准或旧配置
|
||||||
|
try {
|
||||||
|
const inherited = await socialAccountApi.inheritConfig(account.id)
|
||||||
|
if (inherited) {
|
||||||
|
setNewVersion({
|
||||||
|
...newVersion,
|
||||||
|
effectiveFrom: new Date().toISOString().slice(0, 7),
|
||||||
|
city: account.city,
|
||||||
|
pensionOrg: inherited.pensionOrg ?? newVersion.pensionOrg,
|
||||||
|
pensionEmp: inherited.pensionEmp ?? newVersion.pensionEmp,
|
||||||
|
medicalOrg: inherited.medicalOrg ?? newVersion.medicalOrg,
|
||||||
|
medicalEmp: inherited.medicalEmp ?? newVersion.medicalEmp,
|
||||||
|
medicalOrgExtra: inherited.medicalOrgExtra ?? 0,
|
||||||
|
medicalEmpExtra: inherited.medicalEmpExtra ?? 0,
|
||||||
|
unemploymentOrg: inherited.unemploymentOrg ?? newVersion.unemploymentOrg,
|
||||||
|
unemploymentEmp: inherited.unemploymentEmp ?? newVersion.unemploymentEmp,
|
||||||
|
injuryOrg: inherited.injuryOrg ?? newVersion.injuryOrg,
|
||||||
|
maternityOrg: inherited.maternityOrg ?? newVersion.maternityOrg,
|
||||||
|
baseMin: inherited.baseMin ?? newVersion.baseMin,
|
||||||
|
baseMax: inherited.baseMax ?? newVersion.baseMax,
|
||||||
|
medicalBaseMin: inherited.medicalBaseMin ?? 0,
|
||||||
|
medicalBaseMax: inherited.medicalBaseMax ?? 0,
|
||||||
|
minWage: inherited.minWage ?? 0,
|
||||||
|
extraInsurances: inherited.extraInsurances ?? [],
|
||||||
|
housingOrg: inherited.housingOrg ?? newVersion.housingOrg,
|
||||||
|
housingEmp: inherited.housingEmp ?? newVersion.housingEmp,
|
||||||
|
housingBaseMin: inherited.housingBaseMin ?? 0,
|
||||||
|
housingBaseMax: inherited.housingBaseMax ?? 0,
|
||||||
|
accountType: account.accountType || 'BASIC',
|
||||||
|
})
|
||||||
|
}
|
||||||
|
} catch {}
|
||||||
|
}
|
||||||
|
setShowNewVersion(!showNewVersion)
|
||||||
|
}}>
|
||||||
<Plus className="w-4 h-4 mr-1" />新建年度标准
|
<Plus className="w-4 h-4 mr-1" />新建年度标准
|
||||||
</Button>
|
</Button>
|
||||||
<Button variant="secondary" size="sm" onClick={() => setShowVersions(!showVersions)}>
|
<Button variant="secondary" size="sm" onClick={() => setShowVersions(!showVersions)}>
|
||||||
@@ -621,6 +657,8 @@ export function AccountCard({
|
|||||||
<div><Label>养老(个人%)</Label><Input type="number" step="0.1" value={newVersion.pensionEmp} onChange={(e) => setNewVersion({ ...newVersion, pensionEmp: Number(e.target.value) })} /></div>
|
<div><Label>养老(个人%)</Label><Input type="number" step="0.1" value={newVersion.pensionEmp} onChange={(e) => setNewVersion({ ...newVersion, pensionEmp: Number(e.target.value) })} /></div>
|
||||||
<div><Label>医疗(企业%)</Label><Input type="number" step="0.1" value={newVersion.medicalOrg} onChange={(e) => setNewVersion({ ...newVersion, medicalOrg: Number(e.target.value) })} /></div>
|
<div><Label>医疗(企业%)</Label><Input type="number" step="0.1" value={newVersion.medicalOrg} onChange={(e) => setNewVersion({ ...newVersion, medicalOrg: Number(e.target.value) })} /></div>
|
||||||
<div><Label>医疗(个人%)</Label><Input type="number" step="0.1" value={newVersion.medicalEmp} onChange={(e) => setNewVersion({ ...newVersion, medicalEmp: Number(e.target.value) })} /></div>
|
<div><Label>医疗(个人%)</Label><Input type="number" step="0.1" value={newVersion.medicalEmp} onChange={(e) => setNewVersion({ ...newVersion, medicalEmp: Number(e.target.value) })} /></div>
|
||||||
|
<div><Label>医疗企业附加(元)</Label><Input type="number" step="0.01" value={newVersion.medicalOrgExtra} onChange={(e) => setNewVersion({ ...newVersion, medicalOrgExtra: Number(e.target.value) })} placeholder="0" /><p className="text-xs text-gray-400 mt-1">固定金额,如大病医疗</p></div>
|
||||||
|
<div><Label>医疗个人附加(元)</Label><Input type="number" step="0.01" value={newVersion.medicalEmpExtra} onChange={(e) => setNewVersion({ ...newVersion, medicalEmpExtra: Number(e.target.value) })} placeholder="如 北京3元" /><p className="text-xs text-gray-400 mt-1">固定金额,如北京3元大病医疗</p></div>
|
||||||
<div><Label>失业(企业%)</Label><Input type="number" step="0.1" value={newVersion.unemploymentOrg} onChange={(e) => setNewVersion({ ...newVersion, unemploymentOrg: Number(e.target.value) })} /></div>
|
<div><Label>失业(企业%)</Label><Input type="number" step="0.1" value={newVersion.unemploymentOrg} onChange={(e) => setNewVersion({ ...newVersion, unemploymentOrg: Number(e.target.value) })} /></div>
|
||||||
<div><Label>失业(个人%)</Label><Input type="number" step="0.1" value={newVersion.unemploymentEmp} onChange={(e) => setNewVersion({ ...newVersion, unemploymentEmp: Number(e.target.value) })} /></div>
|
<div><Label>失业(个人%)</Label><Input type="number" step="0.1" value={newVersion.unemploymentEmp} onChange={(e) => setNewVersion({ ...newVersion, unemploymentEmp: Number(e.target.value) })} /></div>
|
||||||
<div><Label>工伤(企业%)</Label><Input type="number" step="0.1" value={newVersion.injuryOrg} onChange={(e) => setNewVersion({ ...newVersion, injuryOrg: Number(e.target.value) })} /></div>
|
<div><Label>工伤(企业%)</Label><Input type="number" step="0.1" value={newVersion.injuryOrg} onChange={(e) => setNewVersion({ ...newVersion, injuryOrg: Number(e.target.value) })} /></div>
|
||||||
|
|||||||
Reference in New Issue
Block a user