|
|
@@ -12,6 +12,7 @@ import { Skeleton } from '@d8d/shared-ui-components/components/ui/skeleton';
|
|
|
import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle } from '@d8d/shared-ui-components/components/ui/dialog';
|
|
|
import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from '@d8d/shared-ui-components/components/ui/form';
|
|
|
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@d8d/shared-ui-components/components/ui/select';
|
|
|
+import { RadioGroup, RadioGroupItem } from '@d8d/shared-ui-components/components/ui/radio-group';
|
|
|
import { useForm } from 'react-hook-form';
|
|
|
import { zodResolver } from '@hookform/resolvers/zod';
|
|
|
import { toast } from 'sonner';
|
|
|
@@ -67,6 +68,13 @@ const DisabilityPersonManagement: React.FC = () => {
|
|
|
const [updatePersonPhones, setUpdatePersonPhones] = useState<PersonPhoneItem[]>([]);
|
|
|
const [currentUserId] = useState<number>(1); // 假设当前用户ID为1,实际应从认证状态获取
|
|
|
|
|
|
+ // 身份证有效期类型状态('date' | 'long_term')
|
|
|
+ const [createIdValidDateType, setCreateIdValidDateType] = useState<'date' | 'long_term'>('date');
|
|
|
+ const [updateIdValidDateType, setUpdateIdValidDateType] = useState<'date' | 'long_term'>('date');
|
|
|
+ // 残疾证有效期类型状态('date' | 'long_term')
|
|
|
+ const [createDisabilityValidDateType, setCreateDisabilityValidDateType] = useState<'date' | 'long_term'>('date');
|
|
|
+ const [updateDisabilityValidDateType, setUpdateDisabilityValidDateType] = useState<'date' | 'long_term'>('date');
|
|
|
+
|
|
|
// 表单实例 - 创建表单
|
|
|
const createForm = useForm<CreateDisabledPersonRequest>({
|
|
|
resolver: zodResolver(CreateDisabledPersonSchema),
|
|
|
@@ -474,6 +482,9 @@ const DisabilityPersonManagement: React.FC = () => {
|
|
|
setCreateVisits([]); // 重置创建回访状态
|
|
|
setCreateGuardianPhones([]); // 重置创建监护人电话状态
|
|
|
setCreatePersonPhones([]); // 重置创建本人电话状态
|
|
|
+ // 重置有效期类型状态为默认"指定日期"
|
|
|
+ setCreateIdValidDateType('date');
|
|
|
+ setCreateDisabilityValidDateType('date');
|
|
|
setIsModalOpen(true);
|
|
|
};
|
|
|
|
|
|
@@ -488,6 +499,10 @@ const DisabilityPersonManagement: React.FC = () => {
|
|
|
setUpdateGuardianPhones([]);
|
|
|
setUpdatePersonPhones([]);
|
|
|
|
|
|
+ // 根据数据设置有效期类型状态(NULL 表示长期有效)
|
|
|
+ setUpdateIdValidDateType(person.idValidDate === null ? 'long_term' : 'date');
|
|
|
+ setUpdateDisabilityValidDateType(person.disabilityValidDate === null ? 'long_term' : 'date');
|
|
|
+
|
|
|
// 加载聚合数据获取照片、银行卡、备注、回访信息
|
|
|
if (person.id) {
|
|
|
disabilityClientManager.get().getAggregatedDisabledPerson[':id']['$get']({
|
|
|
@@ -1141,6 +1156,7 @@ const DisabilityPersonManagement: React.FC = () => {
|
|
|
/>
|
|
|
|
|
|
<div className="grid grid-cols-1 md:grid-cols-3 gap-4">
|
|
|
+ {/* 身份证有效期 - 支持指定日期和长期有效选项 */}
|
|
|
<FormField
|
|
|
control={createForm.control}
|
|
|
name="idValidDate"
|
|
|
@@ -1148,19 +1164,43 @@ const DisabilityPersonManagement: React.FC = () => {
|
|
|
<FormItem>
|
|
|
<FormLabel>身份证有效期</FormLabel>
|
|
|
<FormControl>
|
|
|
- <Input
|
|
|
- type="date"
|
|
|
- placeholder="选择身份证有效期"
|
|
|
- {...field}
|
|
|
- value={field.value ? new Date(field.value).toISOString().split('T')[0] : ''}
|
|
|
- onChange={(e) => field.onChange(e.target.value ? new Date(e.target.value) : undefined)}
|
|
|
- />
|
|
|
+ <div className="space-y-3">
|
|
|
+ <RadioGroup
|
|
|
+ value={createIdValidDateType}
|
|
|
+ onValueChange={(value: 'date' | 'long_term') => {
|
|
|
+ setCreateIdValidDateType(value);
|
|
|
+ if (value === 'long_term') {
|
|
|
+ field.onChange(undefined); // 清空日期
|
|
|
+ }
|
|
|
+ }}
|
|
|
+ >
|
|
|
+ <div className="flex items-center space-x-2">
|
|
|
+ <RadioGroupItem value="date" id="id-date-create" />
|
|
|
+ <Label htmlFor="id-date-create" className="cursor-pointer">指定日期</Label>
|
|
|
+ </div>
|
|
|
+ <div className="flex items-center space-x-2">
|
|
|
+ <RadioGroupItem value="long_term" id="id-longterm-create" />
|
|
|
+ <Label htmlFor="id-longterm-create" className="cursor-pointer">长期有效</Label>
|
|
|
+ <span className="text-xs text-muted-foreground">(身份证无固定期限时选择)</span>
|
|
|
+ </div>
|
|
|
+ </RadioGroup>
|
|
|
+ {createIdValidDateType === 'date' && (
|
|
|
+ <Input
|
|
|
+ type="date"
|
|
|
+ placeholder="选择身份证有效期"
|
|
|
+ value={field.value ? new Date(field.value).toISOString().split('T')[0] : ''}
|
|
|
+ onChange={(e) => field.onChange(e.target.value ? new Date(e.target.value) : undefined)}
|
|
|
+ data-testid="id-valid-date-input-create"
|
|
|
+ />
|
|
|
+ )}
|
|
|
+ </div>
|
|
|
</FormControl>
|
|
|
<FormMessage />
|
|
|
</FormItem>
|
|
|
)}
|
|
|
/>
|
|
|
|
|
|
+ {/* 残疾证有效期 - 支持指定日期和长期有效选项 */}
|
|
|
<FormField
|
|
|
control={createForm.control}
|
|
|
name="disabilityValidDate"
|
|
|
@@ -1168,19 +1208,41 @@ const DisabilityPersonManagement: React.FC = () => {
|
|
|
<FormItem>
|
|
|
<FormLabel>残疾证有效期</FormLabel>
|
|
|
<FormControl>
|
|
|
- <Input
|
|
|
- type="date"
|
|
|
- placeholder="选择残疾证有效期"
|
|
|
- {...field}
|
|
|
- value={field.value ? new Date(field.value).toISOString().split('T')[0] : ''}
|
|
|
- onChange={(e) => field.onChange(e.target.value ? new Date(e.target.value) : undefined)}
|
|
|
- />
|
|
|
+ <div className="space-y-3">
|
|
|
+ <RadioGroup
|
|
|
+ value={createDisabilityValidDateType}
|
|
|
+ onValueChange={(value: 'date' | 'long_term') => {
|
|
|
+ setCreateDisabilityValidDateType(value);
|
|
|
+ if (value === 'long_term') {
|
|
|
+ field.onChange(undefined); // 清空日期
|
|
|
+ }
|
|
|
+ }}
|
|
|
+ >
|
|
|
+ <div className="flex items-center space-x-2">
|
|
|
+ <RadioGroupItem value="date" id="disability-date-create" />
|
|
|
+ <Label htmlFor="disability-date-create" className="cursor-pointer">指定日期</Label>
|
|
|
+ </div>
|
|
|
+ <div className="flex items-center space-x-2">
|
|
|
+ <RadioGroupItem value="long_term" id="disability-longterm-create" />
|
|
|
+ <Label htmlFor="disability-longterm-create" className="cursor-pointer">长期有效</Label>
|
|
|
+ <span className="text-xs text-muted-foreground">(残疾证无固定期限时选择)</span>
|
|
|
+ </div>
|
|
|
+ </RadioGroup>
|
|
|
+ {createDisabilityValidDateType === 'date' && (
|
|
|
+ <Input
|
|
|
+ type="date"
|
|
|
+ placeholder="选择残疾证有效期"
|
|
|
+ value={field.value ? new Date(field.value).toISOString().split('T')[0] : ''}
|
|
|
+ onChange={(e) => field.onChange(e.target.value ? new Date(e.target.value) : undefined)}
|
|
|
+ data-testid="disability-valid-date-input-create"
|
|
|
+ />
|
|
|
+ )}
|
|
|
+ </div>
|
|
|
</FormControl>
|
|
|
<FormMessage />
|
|
|
</FormItem>
|
|
|
)}
|
|
|
/>
|
|
|
-
|
|
|
</div>
|
|
|
|
|
|
<div>
|
|
|
@@ -1559,6 +1621,7 @@ const DisabilityPersonManagement: React.FC = () => {
|
|
|
/>
|
|
|
|
|
|
<div className="grid grid-cols-1 md:grid-cols-3 gap-4">
|
|
|
+ {/* 身份证有效期 - 支持指定日期和长期有效选项 */}
|
|
|
<FormField
|
|
|
control={updateForm.control}
|
|
|
name="idValidDate"
|
|
|
@@ -1566,19 +1629,43 @@ const DisabilityPersonManagement: React.FC = () => {
|
|
|
<FormItem>
|
|
|
<FormLabel>身份证有效期</FormLabel>
|
|
|
<FormControl>
|
|
|
- <Input
|
|
|
- type="date"
|
|
|
- placeholder="选择身份证有效期"
|
|
|
- {...field}
|
|
|
- value={field.value ? (field.value instanceof Date ? field.value : new Date(field.value)).toISOString().split('T')[0] : ''}
|
|
|
- onChange={(e) => field.onChange(e.target.value ? new Date(e.target.value) : undefined)}
|
|
|
- />
|
|
|
+ <div className="space-y-3">
|
|
|
+ <RadioGroup
|
|
|
+ value={updateIdValidDateType}
|
|
|
+ onValueChange={(value: 'date' | 'long_term') => {
|
|
|
+ setUpdateIdValidDateType(value);
|
|
|
+ if (value === 'long_term') {
|
|
|
+ field.onChange(undefined); // 清空日期
|
|
|
+ }
|
|
|
+ }}
|
|
|
+ >
|
|
|
+ <div className="flex items-center space-x-2">
|
|
|
+ <RadioGroupItem value="date" id="id-date-update" />
|
|
|
+ <Label htmlFor="id-date-update" className="cursor-pointer">指定日期</Label>
|
|
|
+ </div>
|
|
|
+ <div className="flex items-center space-x-2">
|
|
|
+ <RadioGroupItem value="long_term" id="id-longterm-update" />
|
|
|
+ <Label htmlFor="id-longterm-update" className="cursor-pointer">长期有效</Label>
|
|
|
+ <span className="text-xs text-muted-foreground">(身份证无固定期限时选择)</span>
|
|
|
+ </div>
|
|
|
+ </RadioGroup>
|
|
|
+ {updateIdValidDateType === 'date' && (
|
|
|
+ <Input
|
|
|
+ type="date"
|
|
|
+ placeholder="选择身份证有效期"
|
|
|
+ value={field.value ? (field.value instanceof Date ? field.value : new Date(field.value)).toISOString().split('T')[0] : ''}
|
|
|
+ onChange={(e) => field.onChange(e.target.value ? new Date(e.target.value) : undefined)}
|
|
|
+ data-testid="id-valid-date-input-update"
|
|
|
+ />
|
|
|
+ )}
|
|
|
+ </div>
|
|
|
</FormControl>
|
|
|
<FormMessage />
|
|
|
</FormItem>
|
|
|
)}
|
|
|
/>
|
|
|
|
|
|
+ {/* 残疾证有效期 - 支持指定日期和长期有效选项 */}
|
|
|
<FormField
|
|
|
control={updateForm.control}
|
|
|
name="disabilityValidDate"
|
|
|
@@ -1586,19 +1673,41 @@ const DisabilityPersonManagement: React.FC = () => {
|
|
|
<FormItem>
|
|
|
<FormLabel>残疾证有效期</FormLabel>
|
|
|
<FormControl>
|
|
|
- <Input
|
|
|
- type="date"
|
|
|
- placeholder="选择残疾证有效期"
|
|
|
- {...field}
|
|
|
- value={field.value ? (field.value instanceof Date ? field.value : new Date(field.value)).toISOString().split('T')[0] : ''}
|
|
|
- onChange={(e) => field.onChange(e.target.value ? new Date(e.target.value) : undefined)}
|
|
|
- />
|
|
|
+ <div className="space-y-3">
|
|
|
+ <RadioGroup
|
|
|
+ value={updateDisabilityValidDateType}
|
|
|
+ onValueChange={(value: 'date' | 'long_term') => {
|
|
|
+ setUpdateDisabilityValidDateType(value);
|
|
|
+ if (value === 'long_term') {
|
|
|
+ field.onChange(undefined); // 清空日期
|
|
|
+ }
|
|
|
+ }}
|
|
|
+ >
|
|
|
+ <div className="flex items-center space-x-2">
|
|
|
+ <RadioGroupItem value="date" id="disability-date-update" />
|
|
|
+ <Label htmlFor="disability-date-update" className="cursor-pointer">指定日期</Label>
|
|
|
+ </div>
|
|
|
+ <div className="flex items-center space-x-2">
|
|
|
+ <RadioGroupItem value="long_term" id="disability-longterm-update" />
|
|
|
+ <Label htmlFor="disability-longterm-update" className="cursor-pointer">长期有效</Label>
|
|
|
+ <span className="text-xs text-muted-foreground">(残疾证无固定期限时选择)</span>
|
|
|
+ </div>
|
|
|
+ </RadioGroup>
|
|
|
+ {updateDisabilityValidDateType === 'date' && (
|
|
|
+ <Input
|
|
|
+ type="date"
|
|
|
+ placeholder="选择残疾证有效期"
|
|
|
+ value={field.value ? (field.value instanceof Date ? field.value : new Date(field.value)).toISOString().split('T')[0] : ''}
|
|
|
+ onChange={(e) => field.onChange(e.target.value ? new Date(e.target.value) : undefined)}
|
|
|
+ data-testid="disability-valid-date-input-update"
|
|
|
+ />
|
|
|
+ )}
|
|
|
+ </div>
|
|
|
</FormControl>
|
|
|
<FormMessage />
|
|
|
</FormItem>
|
|
|
)}
|
|
|
/>
|
|
|
-
|
|
|
</div>
|
|
|
|
|
|
<div>
|
|
|
@@ -1785,13 +1894,13 @@ const DisabilityPersonManagement: React.FC = () => {
|
|
|
<div>
|
|
|
<label className="text-sm font-medium">身份证有效期</label>
|
|
|
<p className="text-sm text-muted-foreground">
|
|
|
- {viewData.personInfo.idValidDate ? format(new Date(viewData.personInfo.idValidDate), 'yyyy-MM-dd') : '未填写'}
|
|
|
+ {viewData.personInfo.idValidDate ? format(new Date(viewData.personInfo.idValidDate), 'yyyy-MM-dd') : '长期'}
|
|
|
</p>
|
|
|
</div>
|
|
|
<div>
|
|
|
<label className="text-sm font-medium">残疾证有效期</label>
|
|
|
<p className="text-sm text-muted-foreground">
|
|
|
- {viewData.personInfo.disabilityValidDate ? format(new Date(viewData.personInfo.disabilityValidDate), 'yyyy-MM-dd') : '未填写'}
|
|
|
+ {viewData.personInfo.disabilityValidDate ? format(new Date(viewData.personInfo.disabilityValidDate), 'yyyy-MM-dd') : '长期'}
|
|
|
</p>
|
|
|
</div>
|
|
|
<div className="col-span-1 md:col-span-2">
|