You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

638 lines
20 KiB

2 months ago
2 months ago
4 months ago
4 months ago
  1. /* eslint-disable array-callback-return */
  2. import { Button, Form, Input, message, Select, InputNumber, Cascader, Row, Col, Spin } from "antd";
  3. import { useEffect, useRef, useState } from "react";
  4. import { useNavigate } from "react-router";
  5. import { getDetailList, saveMeasurement_new } from "../../../services/measure/analysis";
  6. import { useAppSelector } from "../../../utils/hooks";
  7. import {
  8. getOrgListService,
  9. dictionaryListService,
  10. queryStationData
  11. } from "../../../services/ktj/org";
  12. import type { InputRef } from 'antd/es/input';
  13. import type {
  14. OrgItem,
  15. GwdDicItem,
  16. KTJ_BASE_TYPE,
  17. options,
  18. dataSourceOptions,
  19. unitTypesOptions,
  20. unitType,
  21. extraDescType
  22. } from "../../../services/ktjTypes";
  23. import { RAIN_TYPES, XB_CODES, DATA_SOURCE } from "../../../constant/index";
  24. import "./MeasureAction.scss";
  25. import { GwdItem, orgCascaderType, OrgOptions, systemItem } from "../../system/types";
  26. export default function MeasureConfig() {
  27. const navigate = useNavigate();
  28. const [KTJOrgList, setKTJOrgList] = useState<orgCascaderType[]>([]);
  29. const [extraDesc, setExtraDesc] = useState<extraDescType>()
  30. const measureState = useAppSelector((store) => store.measureState);
  31. const [messageApi, contextHolder] = message.useMessage();
  32. const [form] = Form.useForm();
  33. const [orgValues, setOrgValues] = useState<string[]>([])
  34. const [WRPS_GGGX_List, setWRPSGGGXList] = useState<KTJ_BASE_TYPE[]>([]);
  35. const [dataSource, setDataSource] = useState('')
  36. const [SJLY_List, setSJLYList] = useState<KTJ_BASE_TYPE[]>([]);
  37. const [stationList, setStationList] = useState<KTJ_BASE_TYPE[]>([])
  38. const [XLFL_List, setXLFLList] = useState<KTJ_BASE_TYPE[]>([]);
  39. const [WRPS_CJFS_List, setWRPSCJFSList] = useState<KTJ_BASE_TYPE[]>([]);
  40. const [xbCodeOptions, setXbCodeOptions] = useState<dataSourceOptions[]>()
  41. const [unitTypeList, setUnitTypeList] = useState<unitTypesOptions[]>([])
  42. const [unitType, setUnitType] = useState<number>()
  43. const inputRef = useRef<InputRef>(null);
  44. const systemState = useAppSelector((store) => store.systemState);
  45. const [kilMet, setKilMet] = useState<Record<string, any>>({})
  46. const [loading, setLoading] = useState(false)
  47. useEffect(()=>{
  48. showLastForm()
  49. queryDictionaryList()
  50. resetRailTypes()
  51. resetDataSource()
  52. // queryRailData()
  53. console.log('systemState.orgInfo---', systemState.orgInfo)
  54. setTimeout(() => {
  55. if(inputRef.current){
  56. inputRef.current.focus()
  57. }
  58. }, 100)
  59. }, [])
  60. //获取铁路局数据
  61. // function queryRailData(){
  62. // getOrgListService().then((res) => {
  63. // if (res && res.data) {
  64. // let resData: OrgItem[] = res.data;
  65. // let data = convertToCascaderData(resData)
  66. // setKTJOrgList(data)
  67. // // 使用上次保存时的参数。
  68. // }
  69. // }).catch((e) => {});
  70. // }
  71. function showLastForm () {
  72. let mfInfo: any = {}
  73. // 获取记录中的第一条数据
  74. const params = {
  75. pageSize: 5,
  76. pageNum: 1,
  77. }
  78. setLoading(true)
  79. getDetailList(params).then(res => {
  80. if(res.success){
  81. const list = res.data.list
  82. if(list && list.length){
  83. mfInfo = list[0]
  84. setForm(mfInfo)
  85. }else{
  86. setForm({})
  87. }
  88. }
  89. setLoading(false)
  90. }).catch( ()=> {
  91. setLoading(false)
  92. })
  93. }
  94. const getDate = () => {
  95. const currentDate = new Date(); // 获取当前时间
  96. const year = currentDate.getFullYear(); // 获取完整的年份
  97. let month: string | number = currentDate.getMonth() + 1; // 获取月份(0-11),需要加1
  98. let day: string | number = currentDate.getDate(); // 获取日
  99. month = month < 10 ? "0" + month : month
  100. day = day < 10 ? "0" + day : day
  101. const currentTime = `${year}-${month}-${day}`
  102. let now = `${year}${month}${day}`
  103. return {
  104. now,
  105. nowfm: currentTime,
  106. }; // 格式化日期为YYYY-MM-DD格式
  107. }
  108. const setForm = (mfInfo: any) => {
  109. console.log('mfInfo---', mfInfo)
  110. let kilometre = 0
  111. let meters = 0
  112. if(mfInfo.mileage){
  113. kilometre = mfInfo.mileage.split('+')[0]
  114. meters = mfInfo.mileage.split('+')[1]
  115. }
  116. const ymd = getDate();
  117. const createTime = mfInfo.createTime
  118. let todayNumber = mfInfo.todayNumber || 0
  119. if(createTime && createTime.indexOf(ymd.nowfm) === -1 ){
  120. todayNumber = 0
  121. }
  122. let orgInfo = systemState.orgInfo;
  123. let labels: string[] = []
  124. let orgCode: string[] = []
  125. if(orgInfo && orgInfo.value){
  126. const orgValue = JSON.parse(orgInfo.value)
  127. orgValue && orgValue.forEach((org: OrgOptions) => {
  128. labels.push(org.label)
  129. orgCode.push(org.value)
  130. })
  131. }
  132. let stationCode = null
  133. if(orgCode && orgCode[2] === mfInfo.xmCode){
  134. stationCode = mfInfo.stationCode
  135. }
  136. let label = labels.join('-')
  137. // let name = `${label}-${ymd.now}${(Number(todayNumber) + 1).toString().padStart(4, '0') }`
  138. let name = mfInfo?.name
  139. setKilMet({
  140. kilometre,
  141. meters
  142. })
  143. const user = localStorage.getItem("user");
  144. let userData = JSON.parse(user || "");
  145. form.setFieldsValue({
  146. ...mfInfo,
  147. orgValues: orgCode,
  148. kilometre,
  149. meters,
  150. name,
  151. operator: userData.nickname || userData.account,
  152. stationCode,
  153. });
  154. const railList = orgCode
  155. setOrgValues(railList)
  156. getStationData(railList)
  157. setDataSource(mfInfo.dataSource)
  158. onUnitTypeChange(mfInfo.unitType)
  159. }
  160. function convertToCascaderData(data:OrgItem[]) {
  161. return data.map(item => {
  162. const newItem:orgCascaderType = {
  163. value: item.key,
  164. label: item.value,
  165. };
  166. if (item.gwdDicList && item.gwdDicList.length > 0) {
  167. newItem.children = item.gwdDicList.map(gwdItem => {
  168. const newGwdItem:GwdItem = {
  169. value: gwdItem.key,
  170. label: gwdItem.value,
  171. };
  172. if (gwdItem.railDicList && gwdItem.railDicList.length > 0) {
  173. newGwdItem.children = gwdItem.railDicList.map(railItem => ({
  174. value: railItem.key,
  175. label: railItem.value || railItem.input
  176. }));
  177. }
  178. return newGwdItem;
  179. });
  180. }
  181. return newItem;
  182. });
  183. }
  184. function onOrgChange(value:string[], selectedOptions: orgCascaderType[]){
  185. if(value.length){
  186. form.setFieldsValue({tljCode: value[0]})
  187. form.setFieldsValue({gwdCode: value[1]})
  188. form.setFieldsValue({xmCode: value[2]})
  189. getStationData(value)
  190. form.resetFields(["stationCode"]);
  191. }
  192. }
  193. const onRailTypeChange = (value:string, option:any) => {
  194. setExtraDesc({...extraDesc,railSizeName:option.label})
  195. }
  196. //数据来源change
  197. const onDataSourceChange = (value:string, option:any) => {
  198. setExtraDesc({...extraDesc,dataSourceName:option.label})
  199. form.resetFields(["xbCode"]);
  200. setDataSource(value)
  201. }
  202. //车站
  203. const onSatioinChange = (value:string, option:any) => {
  204. setExtraDesc({...extraDesc,stationName:option.label})
  205. }
  206. //车站数据
  207. const getStationData = (railData: string[]) => {
  208. let orgInfo = systemState.orgInfo;
  209. let orgCode: string[] = []
  210. if(orgInfo && orgInfo.value){
  211. const orgValue = JSON.parse(orgInfo.value)
  212. orgValue && orgValue.forEach((org: OrgOptions) => {
  213. orgCode.push(org.value)
  214. })
  215. }
  216. let tljCode = orgCode[0]
  217. let gwdCode = orgCode[1]
  218. let xmCode = orgCode[2]
  219. const params = {
  220. tljCode,
  221. gwdCode,
  222. xmCode
  223. }
  224. queryStationData(params).then(res => {
  225. if(res && res.data?.length){
  226. setStationList(res.data)
  227. }else{
  228. setStationList([])
  229. }
  230. })
  231. }
  232. const queryDictionaryList = () => {
  233. dictionaryListService().then((res) => {
  234. if (res && res.data) {
  235. const { WRPS_CJFS, WRPS_GGGX, XLFL } = res.data;
  236. const SJLY:KTJ_BASE_TYPE[] = res.data.SJLY
  237. if(SJLY && SJLY.length){
  238. let sjlylist = SJLY.filter(item => item.key === 'XLDC' || item.key === 'DCDC')
  239. setSJLYList(sjlylist);
  240. }
  241. if(WRPS_CJFS && WRPS_CJFS.length){
  242. setWRPSCJFSList(WRPS_CJFS);
  243. }
  244. if(WRPS_GGGX && WRPS_GGGX.length){
  245. setWRPSGGGXList(WRPS_GGGX);
  246. }
  247. if(XLFL && XLFL.length){
  248. setXLFLList(XLFL);
  249. }
  250. }
  251. });
  252. };
  253. const resetDataSource = () => {
  254. let options:dataSourceOptions[] = []
  255. DATA_SOURCE.map(item => {
  256. let optionMap:any = {
  257. label: item.name,
  258. value: item.code,
  259. options:[]
  260. }
  261. let childOptions:options[] = []
  262. item.child.map(ele => {
  263. childOptions.push({
  264. label: ele.name,
  265. value: ele.code
  266. })
  267. optionMap.options = childOptions
  268. })
  269. options.push(optionMap)
  270. })
  271. setXbCodeOptions(options)
  272. }
  273. const onUnitTypeChange = (value:string) => {
  274. RAIN_TYPES.map(item => {
  275. if(item.code === value){
  276. setUnitType(item.type)
  277. }
  278. })
  279. }
  280. const resetRailTypes = () => {
  281. let zxOptions:unitTypesOptions = {
  282. label:'直线',
  283. options:[]
  284. }
  285. let qxOptions:unitTypesOptions = {
  286. label:'曲线',
  287. options:[]
  288. }
  289. let zxList:unitType[] = []
  290. let qxList:unitType[] = []
  291. RAIN_TYPES.map(item => {
  292. if(item.type === 1){
  293. zxList.push({
  294. label: item.name,
  295. value: item.code,
  296. })
  297. }else{
  298. qxList.push({
  299. label: item.name,
  300. value: item.code,
  301. })
  302. }
  303. })
  304. zxOptions.options = zxList
  305. qxOptions.options = qxList
  306. setUnitTypeList([zxOptions, qxOptions])
  307. }
  308. const onFinish = (values: any) => {
  309. let mtValue = values["meters"]
  310. //百米小于100时, 补齐3位。 比如 1 :"001", 10: "010"
  311. if (mtValue < 100) {
  312. mtValue = String(mtValue).padStart(3, '0');
  313. }
  314. console.log('values--11-', values)
  315. let orgInfo = systemState.orgInfo;
  316. let orgCode: string[] = []
  317. if(orgInfo && orgInfo.value){
  318. const orgValue = JSON.parse(orgInfo.value)
  319. orgValue && orgValue.forEach((org: OrgOptions) => {
  320. orgCode.push(org.value)
  321. })
  322. }
  323. const params = {
  324. operator: values["operator"],//操作员
  325. name: values["name"],//测量名称
  326. location: values["location"],//位置
  327. direction: values["direction"],//方向
  328. tljCode: orgCode[0],//values["tljCode"],//铁路局
  329. gwdCode: orgCode[1],//values["gwdCode"],//铁路段
  330. xmCode: orgCode[2],//values["xmCode"],//铁路线
  331. lineClassify: values["lineClassify"],//线路分类
  332. dataType: values["dataType"],//采集方式
  333. dataSource: values["dataSource"],//数据来源
  334. railSize: values["railSize"],//轨型
  335. xbCode: values["xbCode"],//行别
  336. unitType: values["unitType"],//股别
  337. mileage: `${values['kilometre']}+${mtValue}`,//里程
  338. stationCode: values['stationCode'],//车站
  339. batch: values['batch'],//批次
  340. radius: values["radius"],//半径
  341. turnoutNum: values["turnoutNum"],//道岔号
  342. sleeperNum: values["sleeperNum"],//枕木号
  343. extraDesc:JSON.stringify(extraDesc),
  344. alignPoints:[]
  345. };
  346. if(values.orgValues && values.orgValues.length){
  347. const orgItem = {
  348. tljCode: values.orgValues[0],
  349. gwdCode: values.orgValues[1],
  350. xmCode: values.orgValues[2]
  351. }
  352. localStorage.setItem('orgInfo', JSON.stringify(orgItem));
  353. params.tljCode = values.orgValues[0]
  354. params.gwdCode = values.orgValues[1]
  355. params.xmCode = values.orgValues[2]
  356. }
  357. params.extraDesc = JSON.stringify(extraDesc)
  358. let measureData = measureState.measureData;
  359. if(measureData && measureData.length){
  360. params.alignPoints = measureData
  361. }
  362. localStorage.setItem('measureForm', JSON.stringify(params))
  363. console.log('params---', params)
  364. saveMeasurement_new(params)
  365. .then((res) => {
  366. if (res.success) {
  367. messageApi.error(res.data.info);
  368. } else {
  369. message.success("保存成功");
  370. navigate("../action");
  371. }
  372. })
  373. .catch((e) => {
  374. navigate("../action");
  375. });
  376. };
  377. const resetLabel = (labelName: string) => {
  378. return <label style={{ fontSize: '20px' }}>{ labelName }</label>
  379. }
  380. return (
  381. <Spin spinning={loading}>
  382. <div >
  383. <Form
  384. form={form}
  385. size="large"
  386. labelCol={{span: 6}}
  387. initialValues={{ remember: true }}
  388. onFinish={onFinish}
  389. autoComplete="off"
  390. >
  391. <div style={{marginTop: '1rem', display:'grid', gridTemplateColumns: '1fr 1fr 1fr'}}>
  392. <Form.Item
  393. labelCol={{span: 3}}
  394. style={{marginLeft:'-1rem'}}
  395. label={resetLabel('测量名称')}
  396. name="name"
  397. rules={[{ required: true, message: "请输入测量名称" }]}
  398. >
  399. <Input ref={inputRef} style={{width: '71vw'}} className="label-vh" placeholder="请输入测量名称" />
  400. </Form.Item>
  401. </div>
  402. <div className="layout">
  403. <Form.Item
  404. label={resetLabel('操作员')}
  405. name="operator"
  406. rules={[{ required: true, message: "请输入操作员姓名" }]}
  407. >
  408. <Input className="label-vh w-[18vw]"/>
  409. </Form.Item>
  410. {/* <Form.Item
  411. label={resetLabel('铁路局')}
  412. name="orgValues"
  413. rules={[{ required: true, message: "请选择铁路局" }]}
  414. >
  415. <Cascader className='label-vh w-[600px]' key={orgValues.length} defaultValue={orgValues} options={KTJOrgList} onChange={onOrgChange} placeholder="请选择局段线" />
  416. </Form.Item> */}
  417. <Form.Item
  418. label={resetLabel('轨型')}
  419. name="railSize"
  420. rules={[{ required: true, message: "请选择轨型" }]}
  421. >
  422. <Select
  423. className="label-vh select-w200"
  424. placeholder="请选择轨型"
  425. onChange={onRailTypeChange}
  426. options={WRPS_GGGX_List.map((item) => ({
  427. label: item.value,
  428. value: item.key,
  429. }))}
  430. ></Select>
  431. </Form.Item>
  432. <Form.Item
  433. label={resetLabel('数据来源')}
  434. name="dataSource"
  435. rules={[{ required: true, message: "请选择数据来源" }]}
  436. >
  437. <Select
  438. className="label-vh"
  439. placeholder="请选择数据来源"
  440. onChange={onDataSourceChange}
  441. options={SJLY_List.map((item) => ({
  442. label: item.value,
  443. value: item.key,
  444. }))}
  445. ></Select>
  446. </Form.Item>
  447. {dataSource === "DCDC" &&
  448. <Form.Item
  449. label={resetLabel('车站')}
  450. name="stationCode"
  451. rules={[{ required: true, message: "请选择车站" }]}
  452. >
  453. <Select
  454. className="label-vh"
  455. style={{width: '18vw'}}
  456. placeholder="请选择车站"
  457. onChange={onSatioinChange}
  458. options={stationList.map((item) => ({
  459. label: item.value,
  460. value: item.key,
  461. }))}
  462. >
  463. </Select>
  464. </Form.Item>}
  465. <Form.Item
  466. label={resetLabel('线路分类')}
  467. name="lineClassify"
  468. rules={[{ required: true, message: "请选择线路分类" }]}
  469. >
  470. <Select
  471. className="label-vh"
  472. placeholder="请选择线路分类"
  473. options={XLFL_List.map((item) => ({
  474. label: item.value,
  475. value: item.key,
  476. }))}
  477. ></Select>
  478. </Form.Item>
  479. <Form.Item
  480. label={resetLabel('采集方式')}
  481. name="dataType"
  482. rules={[{ required: true, message: "请选择采集方式" }]}
  483. >
  484. <Select
  485. className="label-vh"
  486. placeholder="请选择采集方式"
  487. options={WRPS_CJFS_List.map((item) => ({
  488. label: item.value,
  489. value: item.key,
  490. }))}
  491. ></Select>
  492. </Form.Item>
  493. <Form.Item
  494. label={resetLabel('批次')}
  495. name="batch"
  496. rules={[{ required: true, message: "请输入批次" }]}
  497. >
  498. <InputNumber className="label-vh w-[18vw]" placeholder="请输入批次" />
  499. </Form.Item>
  500. {dataSource === 'DCDC' ? (
  501. <>
  502. <Form.Item
  503. label={resetLabel('道岔号')}
  504. name="turnoutNum"
  505. rules={[{ required: true, message: "请输入道岔号" }]}
  506. >
  507. <InputNumber className="abel-vh w-[18vw]" placeholder="请输入道岔号" />
  508. </Form.Item>
  509. <Form.Item
  510. label={resetLabel('枕木号')}
  511. name="sleeperNum"
  512. rules={[{ required: true, message: "请输入枕木号" }]}
  513. >
  514. <InputNumber className="abel-vh w-[18vw]" placeholder="请输入枕木号" />
  515. </Form.Item>
  516. <Form.Item
  517. label={resetLabel('行别')}
  518. name="xbCode"
  519. rules={[{ required: true, message: "请选择行别" }]}
  520. >
  521. <Select className="label-vh" placeholder="请选择行别" options={xbCodeOptions}>
  522. </Select>
  523. </Form.Item>
  524. </>
  525. ) : (
  526. <Form.Item
  527. label={resetLabel('行别')}
  528. name="xbCode"
  529. rules={[{ required: true, message: "请选择行别" }]}
  530. >
  531. <Select placeholder="请选择行别"
  532. className="label-vh"
  533. options={XB_CODES.map((item) => ({
  534. label: item.name,
  535. value: item.code,
  536. }))}
  537. >
  538. </Select>
  539. </Form.Item>
  540. )}
  541. {dataSource === "XLDC" &&
  542. <>
  543. <Form.Item
  544. label={resetLabel('里程')}
  545. name="kilometre"
  546. rules={[{ required: true, message: "请输入" }]}
  547. >
  548. <div style={{display:"flex",alignItems:"center"}}>
  549. <InputNumber className="label-vh w-[16vw]" defaultValue={kilMet.kilometre === 'undefined' ? '' : kilMet.kilometre} placeholder="公里" />
  550. </div>
  551. </Form.Item>
  552. <Form.Item
  553. label={resetLabel('百米')}
  554. name="meters"
  555. rules={[{ required: true, message: "请输入" }]}
  556. >
  557. <div style={{display:"flex",alignItems:"center"}}>
  558. <InputNumber className="label-vh w-[18vw]" defaultValue={kilMet.meters === 'undefined' ? '' : kilMet.meters} placeholder="百米" />
  559. </div>
  560. </Form.Item>
  561. </>
  562. }
  563. <Form.Item
  564. label={resetLabel('股别')}
  565. name="unitType"
  566. rules={[{ required: true, message: "请选择股别" }]}
  567. >
  568. <Select className="label-vh" placeholder="请选择股别" onChange={onUnitTypeChange} options={unitTypeList}>
  569. </Select>
  570. </Form.Item>
  571. {unitType === 2 &&
  572. <Form.Item
  573. label={resetLabel('半径')}
  574. name="radius"
  575. rules={[{ required: true, message: "请输入半径" }]}
  576. >
  577. <InputNumber className="label-vh w-[18vw]" placeholder="请输入半径" />
  578. </Form.Item>
  579. }
  580. </div>
  581. <div className="flex justify-center w-[60vw] mt-[15vh]">
  582. <Form.Item label={null} >
  583. <Button style={{ width: 150 }} onClick={() => navigate("../action", { replace: true })}>
  584. </Button>
  585. </Form.Item>
  586. <Form.Item label={null}>
  587. <Button
  588. type="primary"
  589. size="large"
  590. style={{ width: 150, marginLeft:"20px" }}
  591. htmlType="submit"
  592. >
  593. </Button>
  594. </Form.Item>
  595. </div>
  596. </Form>
  597. </div>
  598. </Spin>
  599. );
  600. }