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.

268 lines
9.4 KiB

4 months ago
4 months ago
5 months ago
4 months ago
4 months ago
4 months ago
4 months ago
4 months ago
4 months ago
4 months ago
4 months ago
4 months ago
4 months ago
4 months ago
5 months ago
4 months ago
4 months ago
4 months ago
  1. import { NavBar, Picker, Toast } from 'antd-mobile';
  2. import { useNavigate } from 'react-router';
  3. import icon_arr_r from '../assets/icon_arr_s_r.svg';
  4. import { ChangeEvent, useState } from 'react';
  5. import { useAppDispatch, useAppSelector } from '../utils/hooks';
  6. import { DATA_SOURCE, LINE_CLASSIFY, UNIT_TYPES, XB_CODES } from '../utils/constant';
  7. import { ExtraDesc, MeasurementDTO } from '../services/apiTypes';
  8. import Bridge from '../utils/bridge';
  9. import { resetState } from '../store/features/measureSlice';
  10. import { selectOrgTextArr } from '../store';
  11. export default function MeasureSave() {
  12. const navigate = useNavigate();
  13. const dispatch = useAppDispatch();
  14. const back = () => navigate(-1);
  15. const contextState = useAppSelector((state) => state.context);
  16. const baseState = useAppSelector((state) => state.baseData);
  17. const orgTextArr = useAppSelector(selectOrgTextArr);
  18. const [name, setName] = useState('');
  19. const [batch, setBatch] = useState('');
  20. const [mile, setMile] = useState(10);
  21. const [meter, setMeter] = useState(10);
  22. const [railPickerVisible, setRailPickerVisible] = useState(false);
  23. const [dataSourcePickerVisible, setDataSourcePickerVisible] = useState(false);
  24. const [lineClassPickerVisible, setLineClassPickerVisible] = useState(false);
  25. const [unitTypePickerVisible, setUnitTypePickerVisible] = useState(false);
  26. const [stationPickerVisible, setStationPickerVisible] = useState(false);
  27. const [directionCode, setDirectionCode] = useState<string[]>([XB_CODES[0].value]);
  28. const [dataSourceCode, setDataSourceCode] = useState<string[]>([DATA_SOURCE[0].value]);
  29. const [lineClassCode, setLineClassCode] = useState<string[]>([LINE_CLASSIFY[0].value]);
  30. const [stationCode, setStationCode] = useState<string[]>([contextState.stationList[0].value]);
  31. const [unitType, setUnitType] = useState<string[]>([UNIT_TYPES[0].value]);
  32. const onInputChange = (evt: ChangeEvent<HTMLInputElement>) => {
  33. if (evt.target.name === 'name') {
  34. setName(evt.target.value);
  35. } else if (evt.target.name === 'batch') {
  36. setBatch(evt.target.value);
  37. } else if (evt.target.name === 'mile') {
  38. if (/^\d*$/.test(evt.target.value)) {
  39. setMile(+evt.target.value);
  40. }
  41. } else if (evt.target.name === 'meter') {
  42. if (/^\d*$/.test(evt.target.value)) {
  43. setMeter(+evt.target.value);
  44. }
  45. }
  46. };
  47. const onSaveBtnClick = () => {
  48. if (!name) {
  49. return Toast.show('请输入测量名称');
  50. }
  51. if (!batch) {
  52. return Toast.show('请输入批次号');
  53. }
  54. const railType = baseState.railTypes.find((r) => r.id === contextState.currRailTypeId);
  55. const [tlj, gwd, xm] = orgTextArr;
  56. const desc: ExtraDesc = {
  57. railSize: railType!.name,
  58. tljCode: tlj,
  59. gwdCode: gwd,
  60. xmCode: xm,
  61. xbCode: XB_CODES.find((x) => x.value === directionCode[0])!.label,
  62. stationCode: contextState.stationList.find((s) => s.value === stationCode[0])!.label,
  63. lineClassify: LINE_CLASSIFY.find((l) => l.value === lineClassCode[0])!.label,
  64. dataSource: DATA_SOURCE.find((d) => d.value === dataSourceCode[0])!.label,
  65. unitType: UNIT_TYPES.find((u) => u.value === unitType[0])!.label,
  66. mile,
  67. meter,
  68. };
  69. const dto: MeasurementDTO = {
  70. operator: 'klj_test',
  71. dataType: 'MINIPROF',
  72. name,
  73. batch,
  74. railSize: railType!.code,
  75. tljCode: contextState.currOrgCode,
  76. gwdCode: contextState.currGWDCode,
  77. xmCode: contextState.currXMCode,
  78. xbCode: directionCode[0],
  79. stationCode: stationCode[0],
  80. lineClassify: lineClassCode[0],
  81. dataSource: dataSourceCode[0],
  82. unitType: unitType[0],
  83. mileage: `${mile}+${meter.toString().padStart(3, '0')}`,
  84. radius: '',
  85. extraDesc: JSON.stringify(desc),
  86. };
  87. Bridge.saveMeasure(dto).then((res) => {
  88. if (res.success) {
  89. Toast.show('保存成功');
  90. setTimeout(() => {
  91. navigate(-1);
  92. dispatch(resetState());
  93. }, 300);
  94. } else {
  95. Toast.show(res.message);
  96. }
  97. });
  98. };
  99. return (
  100. <>
  101. <div>
  102. <NavBar className="bg-white" onBack={back}>
  103. </NavBar>
  104. <div className="main-page-content overflow-x-hidden overflow-y-auto">
  105. <div className="bg-white px-5 text-sm text-text mt-2">
  106. <div className="h-12 flex items-center border-b border-[#eee]">
  107. <span></span>
  108. <input
  109. type="text"
  110. name="name"
  111. value={name}
  112. placeholder="请填写测量名称"
  113. className="border-0 outline-none self-stretch text-right flex-1 ml-4"
  114. onChange={onInputChange}
  115. />
  116. </div>
  117. <div className="h-12 flex items-center border-b border-[#eee]">
  118. <span></span>
  119. <input
  120. type="text"
  121. name="batch"
  122. value={batch}
  123. placeholder="请填写批次"
  124. className="border-0 outline-none self-stretch text-right flex-1 ml-4"
  125. onChange={onInputChange}
  126. />
  127. </div>
  128. <div className="h-12 flex items-center border-b border-[#eee]">
  129. <span></span>
  130. <input
  131. type="text"
  132. name="mile"
  133. value={mile}
  134. className="w-14 h-8 mx-1 border border-[#eee] rounded outline-none text-center ml-auto"
  135. onChange={onInputChange}
  136. />
  137. <span>+</span>
  138. <input
  139. type="text"
  140. name="meter"
  141. value={meter}
  142. className="w-14 h-8 mx-1 border border-[#eee] rounded outline-none text-center"
  143. onChange={onInputChange}
  144. />
  145. <span></span>
  146. </div>
  147. <div
  148. className="h-12 flex items-center border-b border-[#eee]"
  149. onClick={() => setDataSourcePickerVisible(true)}
  150. >
  151. <span></span>
  152. <span className="ml-auto mr-4">
  153. {DATA_SOURCE.find((r) => r.value === dataSourceCode[0])?.label || ''}
  154. </span>
  155. <img src={icon_arr_r} alt="arr" />
  156. </div>
  157. <div
  158. className="h-12 flex items-center border-b border-[#eee]"
  159. onClick={() => setStationPickerVisible(true)}
  160. >
  161. <span></span>
  162. <span className="ml-auto mr-4">
  163. {contextState.stationList.find((r) => r.value === stationCode[0])?.label || ''}
  164. </span>
  165. <img src={icon_arr_r} alt="arr" />
  166. </div>
  167. <div
  168. className="h-12 flex items-center border-b border-[#eee]"
  169. onClick={() => setLineClassPickerVisible(true)}
  170. >
  171. <span>线</span>
  172. <span className="ml-auto mr-4">
  173. {LINE_CLASSIFY.find((r) => r.value === lineClassCode[0])?.label || ''}
  174. </span>
  175. <img src={icon_arr_r} alt="arr" />
  176. </div>
  177. <div
  178. className="h-12 flex items-center border-b border-[#eee]"
  179. onClick={() => setRailPickerVisible(true)}
  180. >
  181. <span></span>
  182. <span className="ml-auto mr-4">
  183. {XB_CODES.find((r) => r.value === directionCode[0])?.label || ''}
  184. </span>
  185. <img src={icon_arr_r} alt="arr" />
  186. </div>
  187. <div className="h-12 flex items-center " onClick={() => setUnitTypePickerVisible(true)}>
  188. <span></span>
  189. <span className="ml-auto mr-4">
  190. {UNIT_TYPES.find((r) => r.value === unitType[0])?.label || ''}
  191. </span>
  192. <img src={icon_arr_r} alt="arr" />
  193. </div>
  194. </div>
  195. <div
  196. className="btn-contained rounded-md h-12 mx-9 my-8 text-base font-medium"
  197. onClick={onSaveBtnClick}
  198. >
  199. </div>
  200. </div>
  201. </div>
  202. <Picker
  203. columns={[XB_CODES]}
  204. visible={railPickerVisible}
  205. onClose={() => {
  206. setRailPickerVisible(false);
  207. }}
  208. value={directionCode}
  209. onConfirm={(v) => {
  210. setDirectionCode(v as string[]);
  211. }}
  212. />
  213. <Picker
  214. columns={[DATA_SOURCE]}
  215. visible={dataSourcePickerVisible}
  216. onClose={() => {
  217. setDataSourcePickerVisible(false);
  218. }}
  219. value={dataSourceCode}
  220. onConfirm={(v) => {
  221. setDataSourceCode(v as string[]);
  222. }}
  223. />
  224. <Picker
  225. columns={[LINE_CLASSIFY]}
  226. visible={lineClassPickerVisible}
  227. onClose={() => {
  228. setLineClassPickerVisible(false);
  229. }}
  230. value={dataSourceCode}
  231. onConfirm={(v) => {
  232. setLineClassCode(v as string[]);
  233. }}
  234. />
  235. <Picker
  236. columns={[UNIT_TYPES]}
  237. visible={unitTypePickerVisible}
  238. onClose={() => {
  239. setUnitTypePickerVisible(false);
  240. }}
  241. value={unitType}
  242. onConfirm={(v) => {
  243. setUnitType(v as string[]);
  244. }}
  245. />
  246. <Picker
  247. columns={[contextState.stationList]}
  248. visible={stationPickerVisible}
  249. onClose={() => {
  250. setStationPickerVisible(false);
  251. }}
  252. value={stationCode}
  253. onConfirm={(v) => {
  254. setStationCode(v as string[]);
  255. }}
  256. />
  257. </>
  258. );
  259. }