123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350 |
- import React, { useCallback, useEffect, useRef, useState } from 'react'
- import styles from './index.module.scss'
- import {
- Button,
- Cascader,
- Checkbox,
- DatePicker,
- Form,
- FormInstance,
- Input,
- Radio,
- Select
- } from 'antd'
- import MyPopconfirm from '@/components/MyPopconfirm'
- import { nationSelect } from '../data'
- import { useDispatch, useSelector } from 'react-redux'
- import { A1_APIgetInfo, A1_APIgetNumList, A1_APIsave } from '@/store/action/A1record'
- import { RootState } from '@/store'
- import A1num from '../A1num'
- import { myCity } from '@/utils/history'
- import TextArea from 'antd/es/input/TextArea'
- import ZupTypes from '@/components/ZupTypes'
- import ZupVideos from '@/components/ZupVideos'
- import dayjs from 'dayjs'
- import { MessageFu } from '@/utils/message'
- type Props = {
- sId: number
- closeFu: () => void
- addTableFu: () => void
- upTableFu: () => void
- }
- function A1add({ sId, closeFu, addTableFu, upTableFu }: Props) {
- // 表单的ref
- const FormBoxRef = useRef<FormInstance>(null)
- // 多张图片的ref
- const ZupImgsRef = useRef<any>(null)
- // 多个视频的ref
- const ZupVideosRef = useRef<any>(null)
- // 编辑进来获取详情
- const getInfoFu = useCallback(async (id: number) => {
- const res = await A1_APIgetInfo(id)
- if (res.code === 0) {
- const obj = res.data
- if (obj.dictPanId) fanHaoRef.current = obj.dictPanId
- // 生卒日期
- if (obj.dateStart) obj.dateStart = dayjs(obj.dateStart)
- if (obj.dateEnd) obj.dateEnd = dayjs(obj.dateEnd)
- // 籍贯
- if (obj.nativeProvince) obj.myNative = [obj.nativeProvince]
- if (obj.nativeCity) obj.myNative.push(obj.nativeCity)
- if (obj.nativeRegion) obj.myNative.push(obj.nativeRegion)
- // 牺牲地
- if (obj.lossProvince) obj.myLoss = [obj.lossProvince]
- if (obj.lossCity) obj.myLoss.push(obj.lossCity)
- if (obj.lossRegion) obj.myLoss.push(obj.lossRegion)
- FormBoxRef.current?.setFieldsValue(obj)
- }
- const file = res.data.img || []
- // 传给 附件 组件的
- const sonInfo = {
- type: 'img',
- fileList: file
- }
- ZupImgsRef.current?.setFileComFileFu(sonInfo)
- ZupVideosRef.current?.setFileComFileFu(res.data.video || [])
- }, [])
- useEffect(() => {
- if (sId > 0) getInfoFu(sId)
- else FormBoxRef.current?.setFieldsValue({ nation: '汉族' })
- }, [getInfoFu, sId])
- // 没有通过校验
- const onFinishFailed = useCallback(() => {}, [])
- // 通过校验点击确定
- const onFinish = useCallback(
- async (values: any) => {
- // 多张图片
- const { sonFileIds, sonIsOk, coverUrl, coverUrlBig } = ZupImgsRef.current?.fileComFileResFu()
- // 多个视频
- const list = ZupVideosRef.current?.fileComFileResFu() || []
- // 生卒日期
- let dateStart = ''
- if (values.dateStart) dateStart = dayjs(values.dateStart).format('YYYY-MM-DD')
- let dateEnd = ''
- if (values.dateEnd) dateEnd = dayjs(values.dateEnd).format('YYYY-MM-DD')
- // 籍贯
- let nativeProvince = ''
- let nativeCity = ''
- let nativeRegion = ''
- if (values.myNative && values.myNative.length) {
- nativeProvince = values.myNative[0] || ''
- nativeCity = values.myNative[1] || ''
- nativeRegion = values.myNative[2] || ''
- }
- // 牺牲地
- let lossProvince = ''
- let lossCity = ''
- let lossRegion = ''
- if (values.myLoss && values.myLoss.length) {
- lossProvince = values.myLoss[0] || ''
- lossCity = values.myLoss[1] || ''
- lossRegion = values.myLoss[2] || ''
- }
- const obj = {
- ...values,
- id: sId > 0 ? sId : null,
- dateStart,
- dateEnd,
- nativeProvince,
- nativeCity,
- nativeRegion,
- lossProvince,
- lossCity,
- lossRegion,
- thumb: coverUrl || '',
- thumbPc: coverUrlBig || '',
- imgIds: sonIsOk ? '' : sonFileIds.join(','),
- videoIds: list.map((v: any) => v.id).join(',')
- }
- const res = await A1_APIsave(obj)
- if (res.code === 0) {
- MessageFu.success(sId > 0 ? '编辑成功' : '新增成功')
- sId > 0 ? upTableFu() : addTableFu()
- closeFu()
- }
- // if (1 + 1 === 2) {
- // console.log('------222', obj)
- // return
- // }
- },
- [addTableFu, closeFu, sId, upTableFu]
- )
- const formDomRef = useRef<HTMLDivElement>(null)
- // -------------获取番号列表--------------
- const dispatch = useDispatch()
- useEffect(() => {
- dispatch(A1_APIgetNumList())
- }, [dispatch])
- const numList = useSelector((state: RootState) => state.A1record.numList)
- const [numShow, setNumShow] = useState(false)
- const fanHaoRef = useRef(0)
- return (
- <div className={styles.A1add}>
- <div className='A1addMain'>
- <div className='A1aTit'>{sId > 0 ? '编辑' : '新增'}烈士</div>
- <div className='A1accc' ref={formDomRef}>
- <div>
- <Form
- ref={FormBoxRef}
- name='basic'
- onFinish={onFinish}
- onFinishFailed={onFinishFailed}
- autoComplete='off'
- scrollToFirstError
- >
- <div className='A1aRow A1aRow3'>
- <Form.Item
- label='姓名'
- name='name'
- rules={[{ required: true, message: '请输入姓名' }]}
- // getValueFromEvent={(e) => e.target.value.replace(/\s+/g, "")}
- getValueFromEvent={e => e.target.value.trim()}
- >
- <Input maxLength={10} showCount placeholder='请输入内容' />
- </Form.Item>
- <Form.Item
- label='性别'
- name='gender'
- rules={[{ required: true, message: '请选择性别' }]}
- >
- <Radio.Group
- options={[
- { value: 1, label: '男' },
- { value: 2, label: '女' }
- ]}
- />
- </Form.Item>
- <Form.Item valuePropName='checked' label='寻亲烈士' name='display'>
- <Checkbox></Checkbox>
- </Form.Item>
- </div>
- <div className='A1aRow'>
- <Form.Item label='民族' name='nation'>
- <Select
- getPopupContainer={() => formDomRef.current!}
- allowClear
- placeholder='请搜索并选择'
- showSearch
- options={nationSelect}
- />
- </Form.Item>
- <div className='A1aRowSon'>
- <Form.Item label='番号' name='dictPanId'>
- <Select
- onChange={e => (fanHaoRef.current = e)}
- getPopupContainer={() => formDomRef.current!}
- filterOption={(input, option) =>
- (option?.label ?? '').toLowerCase().includes(input.toLowerCase())
- }
- allowClear
- placeholder='请搜索并选择'
- showSearch
- options={numList.map(v => ({ value: v.id, label: v.name }))}
- />
- </Form.Item>
- <Button type='primary' onClick={() => setNumShow(true)}>
- 管理
- </Button>
- </div>
- </div>
- <div className='A1aRow'>
- <Form.Item label='籍贯' name='myNative'>
- <Cascader options={myCity} placeholder='请选择' allowClear changeOnSelect />
- </Form.Item>
- <Form.Item label='籍贯详址' name='nativeAddress'>
- <Input maxLength={50} showCount placeholder='请输入内容' />
- </Form.Item>
- </div>
- <div className='A1aRow'>
- <Form.Item label='牺牲地' name='myLoss'>
- <Cascader options={myCity} placeholder='请选择' allowClear changeOnSelect />
- </Form.Item>
- <Form.Item label='牺牲详址' name='lossAddress'>
- <Input maxLength={50} showCount placeholder='请输入内容' />
- </Form.Item>
- </div>
- <div className='A1aRow'>
- <Form.Item label='出生年月' name='dateStart'>
- <DatePicker picker='month' placeholder='请选择年月' />
- </Form.Item>
- <Form.Item label='牺牲年月' name='dateEnd'>
- <DatePicker picker='month' placeholder='请选择年月' />
- </Form.Item>
- </div>
- {/* <div className='A1aRowAll'>
- <Form.Item label='个人介绍' name='intro'>
- <TextArea maxLength={500} showCount placeholder='请输入内容' />
- </Form.Item>
- </div> */}
- {/* 多个图片 */}
- <div className='formRow'>
- <div className='formLeft'>图片:</div>
- <div className='formRight'>
- <ZupTypes
- ref={ZupImgsRef}
- isLook={false}
- fileCheck={false}
- selecFlag='图片'
- imgSize={5}
- imgLength={50}
- dirCode='A1record'
- myUrl='cms/martyr/upload'
- isTypeShow={true}
- oneIsCover={true}
- />
- </div>
- </div>
- {/* 多个视频 */}
- <div className='formRow formRow2'>
- <div className='formLeft'>视频:</div>
- <div className='formRight'>
- <ZupVideos
- isLook={false}
- size={500}
- fileNum={50}
- dirCode='A1recordVideo'
- myUrl='cms/martyr/upload'
- upTxt=';数量不超过50个。'
- ref={ZupVideosRef}
- />
- </div>
- </div>
- <div className='A1aRowAll'>
- <Form.Item label='场景链接' name='link'>
- <TextArea maxLength={500} showCount placeholder='请输入内容' />
- </Form.Item>
- </div>
- <div className='A1aRowAll'>
- <Form.Item label='备注' name='remark'>
- <TextArea maxLength={500} showCount placeholder='请输入内容' />
- </Form.Item>
- </div>
- {/* 确定和取消按钮 */}
- <Form.Item className='A1aBtn'>
- <Button type='primary' htmlType='submit'>
- 提交
- </Button>
- <br />
- <br />
- <MyPopconfirm txtK='取消' onConfirm={closeFu} />
- </Form.Item>
- </Form>
- </div>
- </div>
- </div>
- {/* 番号管理 */}
- {numShow ? (
- <A1num
- AcId={fanHaoRef.current}
- closeFu={() => setNumShow(false)}
- upNumList={() => dispatch(A1_APIgetNumList())}
- />
- ) : null}
- </div>
- )
- }
- const MemoA1add = React.memo(A1add)
- export default MemoA1add
|