停车场项目web, 互联网仓库, 开发完成后, 需要将代码回传云桌面.
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.

1143 lines
48 KiB

  1. import React, { useState, useRef, useEffect } from "react";
  2. import { ResultFlowResult, QuickMenu } from "@/components"
  3. import { Select, Button, Table, message, Pagination, Input, Modal, Image, DatePicker, Space, Upload } from 'antd'
  4. import {
  5. pageSizeOptions
  6. } from '@/config/character.config.js'
  7. import "./index.scss";
  8. import { SearchOutlined, DeleteOutlined, PlusOutlined, DownOutlined, UpOutlined } from '@ant-design/icons';
  9. import ajax from '@/services'
  10. import moment from 'moment'
  11. import copy from 'copy-to-clipboard';
  12. const { RangePicker } = DatePicker;
  13. const { TextArea } = Input;
  14. function CallbackSuggestion(props) {
  15. const [ajaxLoading, setAjaxLoading] = useState(false)
  16. const [resultData, setResultData] = useState({
  17. data: [],
  18. total_records: 0,
  19. export_url: '',
  20. process_url: ""
  21. })
  22. const parameter = {
  23. carAppealId: '', //意见ID
  24. mobile: '',//手机号
  25. content: '',//标题
  26. adviseType: 0,//意见类型
  27. operateType: 0,//意见状态
  28. start_time: moment().subtract(30, 'days').startOf('day').format('YYYY-MM-DD HH:mm:ss'),
  29. end_time: moment().format('YYYY-MM-DD 23:59:59'),
  30. pn: 1,
  31. page_size: Number(pageSizeOptions[0]), // 每页条数
  32. }
  33. const [formData, setFormData] = useState(parameter)
  34. const [lastFormData, setLastFormData] = useState(formData)
  35. const lastFormDataRef = useRef(formData)
  36. const [imgVisible, setImgVisible] = useState(false)
  37. const [orderVisible, setOrderVisible] = useState(false)
  38. const [evidenceVisible, setEvidenceVisible] = useState(false)
  39. //物品型号
  40. const handleAdviseType = (value) => {
  41. setFormData({ ...formData, adviseType: value })
  42. }
  43. //申诉ID
  44. const handleCarAppealId = (v) => {
  45. setFormData({ ...formData, carAppealId: v.target.value })
  46. }
  47. //手机号
  48. const handleMobile = (v) => {
  49. setFormData({ ...formData, mobile: v.target.value })
  50. }
  51. //车牌号
  52. const handleContent = (v) => {
  53. setFormData({ ...formData, content: v.target.value })
  54. }
  55. const onChange = (value, dateString) => {
  56. setFormData({
  57. ...formData,
  58. start_time: dateString[0],
  59. end_time: dateString[1]
  60. })
  61. };
  62. //审核状态
  63. const handleStatus = (value) => {
  64. setFormData({ ...formData, operateType: value })
  65. }
  66. const addChild = (child, res) => {
  67. if (child.children) {
  68. child.children.forEach((item) => {
  69. addChild(item, res);
  70. });
  71. } else {
  72. res.push(child.id);
  73. }
  74. };
  75. //列表
  76. const handleColumns = (tab) => {
  77. let result = [...deployListColumns];
  78. switch (tab) {
  79. case '1':
  80. result.splice(5, 1)
  81. break;
  82. }
  83. return result;
  84. }
  85. const handleDealData = (tab) => {
  86. let result = [...dealListColumns];
  87. switch (tab) {
  88. case '1':
  89. result.splice(5, 1)
  90. break;
  91. }
  92. return result;
  93. }
  94. const [rotate, setRotate] = useState(false)
  95. const dealListColumns = [
  96. {
  97. title: '停车订单ID',
  98. dataIndex: 'parkRecordId',
  99. key: 'parkRecordId',
  100. render: (text, record) => {
  101. return <>
  102. <div>
  103. <span className="iconLined" onClick={handleTrans}>{rotate === false ? <DownOutlined /> : <UpOutlined />} </span>
  104. <a onClick={() => { navigator.clipboard.writeText(`${record.park_id}`).then(() => { message.success("已复制到剪切板") }); }}>{record.park_id}</a>
  105. </div>
  106. </>
  107. }
  108. },
  109. {
  110. title: '车牌号',
  111. dataIndex: 'plateNumber',
  112. key: 'plateNumber',
  113. },
  114. {
  115. title: '停车场名称',
  116. dataIndex: 'parkName',
  117. key: 'parkName',
  118. },
  119. {
  120. title: '入场时间',
  121. dataIndex: 'strEntryTime',
  122. key: 'strEntryTime',
  123. },
  124. {
  125. title: '出场时间',
  126. dataIndex: 'strExitTime',
  127. key: 'strExitTime',
  128. },
  129. ]
  130. //列表
  131. const deployListColumns = [
  132. {
  133. title: '意见ID',
  134. dataIndex: 'memberAdviseId',
  135. key: 'memberAdviseId',
  136. },
  137. {
  138. title: '手机号',
  139. dataIndex: 'mobile',
  140. key: 'mobile',
  141. },
  142. {
  143. title: '标题',
  144. dataIndex: 'content',
  145. key: 'content',
  146. },
  147. {
  148. title: '意见状态',
  149. dataIndex: 'adviseStatus',
  150. key: 'adviseStatus',
  151. },
  152. {
  153. title: '意见类型',
  154. dataIndex: 'adviseType',
  155. key: 'adviseType',
  156. },
  157. {
  158. title: '停车订单ID',
  159. dataIndex: 'parkRecordsId',
  160. key: 'parkRecordsId',
  161. },
  162. {
  163. title: '最后信息时间',
  164. dataIndex: 'updatedTime',
  165. key: 'updatedTime',
  166. },
  167. {
  168. title: '操作',
  169. render: (text, record) => {
  170. return <>
  171. <a onClick={() => { CheckImg(record) }}>查看详情</a>
  172. </>
  173. }
  174. }]
  175. //图片
  176. const [getImg, setGetImg] = useState({})
  177. const [getImgList, setGetImgList] = useState([])
  178. const [getId, setGetId] = useState({})
  179. const CheckImg = (record) => {
  180. setGetId(record.id)
  181. let data = {
  182. id: record.id
  183. }
  184. ajax.checkFeedData(data).then(res => {
  185. if (res.status === 20000) {
  186. setImgVisible(true)
  187. setGetImg(res.data)
  188. setGetImgList(res.data.dialogueDetail)
  189. } else {
  190. message.error(res.message)
  191. }
  192. })
  193. }
  194. const imgModal = () => {
  195. setImgVisible(false)
  196. setRepairData({
  197. content: '',
  198. image: []
  199. })
  200. setFileList([])
  201. }
  202. const cancelImg = () => {
  203. setImgVisible(false)
  204. setRepairData({
  205. content: '',
  206. image: []
  207. })
  208. setFileList([])
  209. }
  210. const getParkId = (record) => {
  211. if (copy(record.parkRecordId)) {
  212. message.success("复制成功");
  213. } else message.error("复制失败,请手动复制");
  214. }
  215. // 获取列表数据
  216. const getData = (data = formData) => {
  217. if (moment(data.end_time) - moment(data.start_time) > 180 * 3600 * 24000) {
  218. if (!(data.carAppealId || data.mobile)) {
  219. message.error('查询时间范围大于半年,需填写手机号或意见ID!')
  220. return
  221. }
  222. }
  223. setAjaxLoading(true)
  224. ajax.getFeedbackList(data).then(res => {
  225. setAjaxLoading(false)
  226. if (res.status === 20000) {
  227. let resDataArr = res.data.list.map((item) => {
  228. item.key = item.id
  229. return item
  230. })
  231. setResultData({
  232. ...resultData,
  233. data: resDataArr,
  234. total_records: res.data.total_records
  235. })
  236. } else {
  237. setResultData({
  238. data: [],
  239. total_records: 0,
  240. export_url: '',
  241. process_url: ""
  242. })
  243. message.error(res.message)
  244. }
  245. }, err => {
  246. console.log(err)
  247. })
  248. }
  249. //切换分页
  250. const changePn = (pn, length) => {
  251. if (lastFormData.page_size === length) {
  252. setFormData(Object.assign({}, formData, { pn: pn, page_size: length }))
  253. setLastFormData(Object.assign({}, lastFormData, { pn: pn, page_size: length }))
  254. lastFormDataRef.current = Object.assign({}, lastFormData, { pn: pn, page_size: length })
  255. getData(Object.assign({}, formData, { pn: pn, page_size: length }))
  256. }
  257. }
  258. //切换每页条数
  259. const changeLength = (pn, length) => {
  260. setFormData(Object.assign({}, formData, { pn: 1, page_size: length }))
  261. setLastFormData(Object.assign({}, lastFormData, { pn: 1, page_size: length }))
  262. lastFormDataRef.current = Object.assign({}, lastFormData, { pn: 1, page_size: length })
  263. getData(Object.assign({}, formData, { pn: 1, page_size: length }))
  264. }
  265. //检索数据
  266. const getSearchData = (data = formData) => {
  267. // getData(data)
  268. setFormData({ ...formData, pn: 1 })
  269. getData(Object.assign({}, formData, { pn: 1 }))
  270. }
  271. //重置数据
  272. const getResetData = () => {
  273. setFormData({
  274. ...parameter
  275. })
  276. getData({ ...parameter, pn: 1 })
  277. }
  278. //详情回复
  279. const onChangeText = (value) => {
  280. setRepairData({ ...repairData, content: value.target.value })
  281. }
  282. const getBase64 = (file) =>
  283. new Promise((resolve, reject) => {
  284. const reader = new FileReader();
  285. reader.readAsDataURL(file);
  286. reader.onload = () => resolve(reader.result);
  287. reader.onerror = (error) => reject(error);
  288. });
  289. const [previewOpen, setPreviewOpen] = useState(false);
  290. const [previewImage, setPreviewImage] = useState('');
  291. const [previewTitle, setPreviewTitle] = useState('');
  292. const [repairData, setRepairData] = useState({})
  293. const handleCancel = () => setPreviewOpen(false);
  294. const [fileList, setFileList] = useState([])
  295. console.log(fileList);
  296. const imgData = () => {
  297. let imgUrl = []
  298. fileList.map(res => {
  299. imgUrl.push(res.response?.data)
  300. })
  301. setRepairData(
  302. Object.assign({}, repairData, { image: imgUrl })
  303. );
  304. }
  305. //撤回
  306. const handleReject = (res) => {
  307. let data = {
  308. dialogueId: res.dialogueId,
  309. id: getId
  310. }
  311. ajax.getRejectData(data).then(res => {
  312. if (res.status === 20000) {
  313. console.log(res.data);
  314. setGetImgList(res.data.dialogueDetail)
  315. } else {
  316. message.error(res.message)
  317. }
  318. })
  319. }
  320. // 日期转换
  321. const parseDate = (val, format) => {
  322. if (val) {
  323. return moment(val, format ? format : "YYYY-MM-DD HH:mm:ss");
  324. } else {
  325. return null;
  326. }
  327. };
  328. const handleAgain = (res) => {
  329. setRepairData({ content: res.replyContent })
  330. }
  331. const handleRepair = () => {
  332. let data = {
  333. ...repairData,
  334. id: getId
  335. }
  336. let dataId = {
  337. id: getId
  338. }
  339. ajax.replyData(data).then(res => {
  340. if (res.status === 20000) {
  341. ajax.checkFeedData(dataId).then(res => {
  342. if (res.status === 20000) {
  343. setGetImg(res.data)
  344. setGetImgList(res.data.dialogueDetail)
  345. setRepairData({
  346. content: '',
  347. image: []
  348. })
  349. setFileList([])
  350. } else {
  351. message.error(res.message)
  352. }
  353. })
  354. } else {
  355. message.error(res.message)
  356. }
  357. })
  358. }
  359. useEffect(() => {
  360. imgData()
  361. }, [fileList])
  362. // 在上传前进行文件类型检查
  363. const beforeUpload = (file) => {
  364. const isValidType = file.type === 'image/jpeg' || file.type === 'image/png' || file.type === 'image/jpg';
  365. if (!isValidType) {
  366. message.error(`请上传png,jpeg,jpg类型图片`);
  367. }
  368. return isValidType || Upload.LIST_IGNORE;
  369. };
  370. const handlePreview = async (file) => {
  371. if (!file.url && !file.preview) {
  372. file.preview = await getBase64(file.originFileObj);
  373. }
  374. setPreviewImage(file.url || file.preview);
  375. setPreviewOpen(true);
  376. setPreviewTitle(file.name || file.url.substring(file.url.lastIndexOf('/') + 1));
  377. };
  378. const handleChange = ({ fileList: newFileList }) => setFileList(newFileList);
  379. const uploadButton = (
  380. <div>
  381. <PlusOutlined />
  382. <div
  383. style={{
  384. marginTop: 8,
  385. }}
  386. >
  387. 点击上传
  388. </div>
  389. </div>
  390. );
  391. const handleTrans = () => {
  392. if (rotate === false) {
  393. setRotate(true)
  394. }
  395. if (rotate === true) {
  396. setRotate(false)
  397. }
  398. console.log(rotate);
  399. }
  400. //去处理
  401. const orderModal = () => {
  402. setOrderVisible(false)
  403. setSubmitDeploy({ change_content: '', update_value: '', plate_type: '', deal_reason: '' })
  404. setGetAdjustTimeValue(1)
  405. setGetValueList({})
  406. }
  407. const [getDealData, setGetDealData] = useState({
  408. data: []
  409. })
  410. const [getOrderData, setGetOrderData] = useState({})
  411. const handleDeal = () => {
  412. let data = {
  413. id: getImg.parkRecordId
  414. }
  415. ajax.dealData(data).then(res => {
  416. if (res.status === 20000) {
  417. let resDataArr = res.data.map((item) => {
  418. setGetOrderData(item)
  419. item.key = item.id
  420. return item
  421. })
  422. setOrderVisible(true)
  423. setGetDealData({
  424. ...getDealData,
  425. data: resDataArr
  426. })
  427. } else {
  428. message.error(res.message)
  429. }
  430. })
  431. }
  432. const [submitDeploy, setSubmitDeploy] = useState({
  433. change_content: '',
  434. update_value: '',
  435. plate_type: '',
  436. deal_reason: '',
  437. adjustTime:1
  438. })
  439. //提交审核
  440. const onChangeReason = (value) => {
  441. setSubmitDeploy({ ...submitDeploy, deal_reason: value.target.value })
  442. }
  443. const [getValueList, setGetValueList] = useState({})
  444. const handleChoose = (value) => {
  445. setGetValueList(value)
  446. // setSubmitDeploy({ ...submitDeploy, change_content: value })
  447. if (value) {
  448. setSubmitDeploy({
  449. ...submitDeploy,
  450. update_value: '',
  451. plate_type: '',
  452. change_content: value
  453. })
  454. }
  455. }
  456. const [getAdjustTimeValue, setGetAdjustTimeValue] = useState(1)
  457. const handleAdjust = (value) => {
  458. setGetAdjustTimeValue(value)
  459. submitDeploy.update_value = ''
  460. }
  461. const handleAdjustTime = (v, dateString) => {
  462. setSubmitDeploy({ ...submitDeploy, update_value: dateString })
  463. }
  464. const handlePlateColor = (v) => {
  465. setSubmitDeploy({ ...submitDeploy, plate_type: v })
  466. }
  467. const handlePlateNumber = (v) => {
  468. setSubmitDeploy({ ...submitDeploy, update_value: v.target.value })
  469. }
  470. const handleAdd = (v) => {
  471. setSubmitDeploy({ ...submitDeploy, add: v })
  472. }
  473. const handleAddCount = (v) => {
  474. setSubmitDeploy({ ...submitDeploy, update_value: v.target.value })
  475. }
  476. const handleComeTime = (v) => {
  477. setSubmitDeploy({ ...submitDeploy, update_value: v.target.value })
  478. }
  479. const cancelBtn = () => {
  480. setOrderVisible(false)
  481. setSubmitDeploy({ change_content: '', update_value: '', plate_type: '', deal_reason: '' })
  482. setGetAdjustTimeValue(1)
  483. setGetValueList({})
  484. }
  485. const submitBtn = () => {
  486. let data = {
  487. ...submitDeploy,
  488. id: [getImg.parkRecordId],
  489. examine_reason_id: submitDeploy.change_content,
  490. examine_reason: submitDeploy.deal_reason
  491. }
  492. if (submitDeploy.deal_reason === '') {
  493. message.error('请输入处理理由')
  494. } else if (submitDeploy.change_content === '') {
  495. message.error('请选择对应的更改项')
  496. }else if (submitDeploy.update_value === '') {
  497. message.error('请输入对应的更改项')
  498. }else {
  499. ajax.submitData(data).then(res => {
  500. if (res.status === 20000) {
  501. setOrderVisible(false)
  502. setImgVisible(false)
  503. setSubmitDeploy({ change_content: '', update_value: '', plate_type: '', deal_reason: '' })
  504. setGetAdjustTimeValue(1)
  505. setGetValueList({})
  506. } else {
  507. message.error(res.message)
  508. }
  509. })
  510. }
  511. }
  512. const exportData = () => {
  513. let data = {
  514. ...formData
  515. }
  516. ajax.exportDataList(data).then(res => {
  517. window.open(res.data.export_url)
  518. })
  519. }
  520. const checkPic = () => {
  521. setEvidenceVisible(true)
  522. }
  523. const evidenceModal = () => {
  524. setEvidenceVisible(false)
  525. }
  526. const closePic = () => {
  527. setEvidenceVisible(false)
  528. }
  529. useEffect(() => {
  530. getData()
  531. }, [])
  532. return <>
  533. <div className="paid-CallbackSuggestion">
  534. <div className="paid-search">
  535. <label className="search">查询条件</label>
  536. <div className="yisa-search">
  537. <label>意见ID</label>
  538. <Input
  539. placeholder="请输入准确信息"
  540. value={formData.carAppealId}
  541. style={{ width: 270, marginLeft: 14 }}
  542. onChange={handleCarAppealId}
  543. />
  544. </div>
  545. <div className="yisa-search">
  546. <label>手机号</label>
  547. <Input
  548. placeholder="请输入准确信息"
  549. value={formData.mobile}
  550. style={{ width: 270, marginLeft: 14 }}
  551. onChange={handleMobile}
  552. />
  553. </div>
  554. <div className="yisa-search">
  555. <label>标题</label>
  556. <Input
  557. placeholder="请输入准确信息"
  558. value={formData.content}
  559. style={{ width: 270, marginLeft: 28 }}
  560. onChange={handleContent}
  561. />
  562. </div>
  563. <div className="yisa-search">
  564. <label>意见状态</label>
  565. <Select
  566. style={{ width: 270 }}
  567. placeholder="请选择"
  568. value={formData.operateType}
  569. options={[
  570. {
  571. value: 0,
  572. label: '全部'
  573. },
  574. {
  575. value: 1,
  576. label: '待回复'
  577. }, {
  578. value: 2,
  579. label: '已回复'
  580. }
  581. ]}
  582. onChange={handleStatus}
  583. />
  584. </div>
  585. <div className="yisa-search">
  586. <label>意见类型</label>
  587. <Select
  588. style={{ width: 270 }}
  589. placeholder="请选择"
  590. value={formData.adviseType}
  591. options={sysConfig.feedbackType}
  592. onChange={handleAdviseType}
  593. />
  594. </div>
  595. <div className="yisa-time">
  596. <label>最后信息时间</label>
  597. <Space direction="vertical" size={12}>
  598. <RangePicker
  599. value={[moment(formData.start_time), moment(formData.end_time)]}
  600. showTime={{
  601. format: 'HH:mm:ss',
  602. }}
  603. allowClear={false}
  604. style={{ width: 344 }}
  605. format="YYYY-MM-DD HH:mm:ss"
  606. onChange={onChange}
  607. />
  608. </Space>
  609. <QuickMenu
  610. dropdownData={[
  611. { text: '昨日', value: 1 },
  612. { text: '今日', value: 0 },
  613. { text: '近三日', value: 2 },
  614. { text: '近一周', value: 6 },
  615. { text: '近一月', value: 29 },
  616. { text: '近半年', value: 180 },
  617. { text: '近一年', value: 365 },
  618. { text: '近两年', value: 730 },
  619. ]}
  620. onChange={(v) => {
  621. setFormData({ ...formData, start_time: v.startDateTime, end_time: v.endDateTime })
  622. }} />
  623. </div>
  624. <div className="timePicker ">
  625. <div className="btnBox">
  626. <Button className="yisa-btn colorReset reset" onClick={() => { getResetData() }}>
  627. 重置
  628. </Button>
  629. <Button type="primary" className="yisa-btn colorBtn submit" onClick={() => { getSearchData() }}>
  630. 查询
  631. </Button>
  632. </div>
  633. </div>
  634. </div>
  635. <div className="paid-result">
  636. <div className="result">
  637. <div className="result-info-row">
  638. <span className="font">共检索到<em>{resultData.total_records}</em>条结果</span>
  639. <Button type="primary" className="yisa-btn colorBtn" onClick={() => { exportData() }}>
  640. 导出
  641. </Button>
  642. </div>
  643. <ResultFlowResult ajaxLoad={ajaxLoading} resultData={resultData.data ? resultData.data : []}>
  644. <Table
  645. bordered
  646. // className='yisa-table'
  647. dataSource={resultData.data}
  648. columns={
  649. handleColumns()
  650. }
  651. pagination={false}
  652. loading={ajaxLoading}
  653. />
  654. <Pagination
  655. className="pagination-common"
  656. showSizeChanger
  657. showQuickJumper
  658. showTotal={() => `${resultData.total_records}`}
  659. total={resultData.total_records}
  660. current={formData.pn}
  661. pageSize={formData.page_size}
  662. pageSizeOptions={pageSizeOptions}
  663. onChange={changePn}
  664. onShowSizeChange={changeLength}
  665. />
  666. </ResultFlowResult>
  667. </div>
  668. </div>
  669. </div>
  670. <Modal
  671. visible={imgVisible}
  672. onCancel={imgModal}
  673. footer={null}
  674. className="checkMsg"
  675. title='查看详情'
  676. >
  677. <div className="car-error">
  678. <div className="car-msg">
  679. <div className="plate">
  680. 意见ID<span className="font">{getImg.memberAdviseId}</span>
  681. </div>
  682. <div className="plate">
  683. 停车订单ID<span className="font">{getImg.parkRecordId}</span>
  684. </div>
  685. <div className="plate">
  686. 出场时间<span className="font">{getImg.strExitTime}</span>
  687. </div>
  688. </div>
  689. <div className="car-msg">
  690. <div className="plate">
  691. 手机号<span className="font">{getImg.memberName}</span>
  692. </div>
  693. <div className="plate">
  694. 车牌号<span className="font">{getImg.plateNumber}</span>
  695. </div>
  696. </div>
  697. <div className="car-msg">
  698. <div className="plate">
  699. 类型<span className="font">{getImg.adviseType}</span>
  700. </div>
  701. <div className="plate">
  702. 停车场名称<span className="font">{getImg.parkName}</span>
  703. </div>
  704. </div>
  705. <div className="car-msg">
  706. <div className="plate">
  707. 状态<span className="font">{getImg.adviseStatus}</span>
  708. </div>
  709. <div className="plate">
  710. 入场时间<span className="font">{getImg.strEntryTime}</span>
  711. </div>
  712. </div>
  713. </div>
  714. <div className="deal"><button onClick={handleDeal}>去处理</button></div>
  715. <div className="id-msg">
  716. <div className="feedback">
  717. <div className="title"><span>意见反馈</span></div>
  718. <div className="message">
  719. {
  720. getImgList.map((res, index) => {
  721. console.log(res);
  722. return (
  723. <div className="content">
  724. {res.type == '1' ?
  725. <div className="feedbackMsg">
  726. <div className="margin-msg">
  727. <div className="time">{res.adviseTime}</div>
  728. <div className="concent">意见内容<span>{res.content}</span></div>
  729. <div className="picFlex">
  730. <div className="pic">
  731. {res.answerImgMap.length ?
  732. res.answerImgMap.map(res => {
  733. return (
  734. <Image src={res} />
  735. )
  736. }) : ''
  737. }
  738. </div>
  739. </div>
  740. </div>
  741. </div>
  742. :
  743. <div className="reject">
  744. {
  745. res.status == 0 ? <div className="content">
  746. <div className="reply">
  747. <div className="margin-msg">
  748. <div className="time">{res.replyTime}</div>
  749. <div className="concent">{res.sysUserName}回复<span>{res.replyContent}</span>
  750. </div>
  751. <div className="picFlex">
  752. {res.answerImgMap.length ?
  753. res.answerImgMap.map(res => {
  754. return (
  755. <div className="pic"><Image src={res} /></div>
  756. )
  757. })
  758. : ''
  759. }
  760. </div>
  761. </div>
  762. </div>
  763. <div className="rejectContent" onClick={() => { handleReject(res) }}>撤回</div>
  764. </div>
  765. :
  766. <div className="reapir">你撤回了一条消息
  767. <span className="again" onClick={() => { handleAgain(res) }}>重新编辑</span>
  768. </div>
  769. }
  770. </div>
  771. }
  772. </div>
  773. )
  774. })
  775. }
  776. <TextArea showCount maxLength={200} value={repairData.content} className="text" onChange={onChangeText} />
  777. <div className="uploadBtn">
  778. <div className="upload">
  779. <Upload
  780. action="/PMS/api/com/common/file_upload"
  781. listType="picture-card"
  782. fileList={fileList}
  783. // accept=".doc,.docx,.xml,application/msword,application/vnd.openxmlformats-officedocument.wordprocessingml.document"
  784. onPreview={handlePreview}
  785. beforeUpload={beforeUpload}
  786. onChange={handleChange}
  787. >
  788. {fileList.length >= 8 ? null : uploadButton}
  789. </Upload>
  790. <Modal open={previewOpen} title={previewTitle} footer={null} onCancel={handleCancel}>
  791. <img
  792. alt="example"
  793. style={{
  794. width: '100%',
  795. }}
  796. src={previewImage}
  797. />
  798. </Modal>
  799. </div>
  800. <div className="repairBtn">
  801. <button onClick={handleRepair}>回复</button>
  802. </div>
  803. </div>
  804. </div>
  805. </div>
  806. </div>
  807. <div className="btn"><button className="passBtn" onClick={cancelImg}>返回</button></div>
  808. </Modal>
  809. <Modal
  810. visible={orderVisible}
  811. onCancel={orderModal}
  812. footer={null}
  813. className="checkOrder"
  814. title='异常订单处理记录审核'
  815. >
  816. <div className="error-order">
  817. <div className="carTitle">
  818. <span className="font">停车订单列表</span>
  819. </div>
  820. <Table
  821. bordered
  822. // className='yisa-table'
  823. dataSource={getDealData.data}
  824. columns={
  825. handleDealData()
  826. }
  827. pagination={false}
  828. loading={ajaxLoading}
  829. />
  830. {
  831. rotate === false ? <div className="order-detail">
  832. <div className="park-detail">
  833. <div className="title">车场详情</div>
  834. <div className="park-area">
  835. <div className="car-msg">
  836. <div className="plate">
  837. 停车车名称<span className="font">{getOrderData.parkName}</span>
  838. </div>
  839. <div className="plate">
  840. 商户名称<span className="font">{getOrderData.operationName}</span>
  841. </div>
  842. <div className="plate">
  843. 车场类型:<span className="font">{getOrderData.parkTypeName}</span>
  844. </div>
  845. </div>
  846. <div className="car-msg">
  847. <div className="plate">
  848. 区域<span className="font">{getOrderData.areaName}</span>
  849. </div>
  850. <div className="plate">
  851. 泊位号<span className="font">{getOrderData.berthCode}</span>
  852. </div>
  853. </div>
  854. </div>
  855. </div>
  856. <div className="park-detail">
  857. <div className="title">车场详情</div>
  858. <div className="park-area">
  859. <div className="car-msg">
  860. <div className="plate">
  861. 车牌号<span className="font">{getOrderData.plateNumber}</span>
  862. </div>
  863. <div className="plate">
  864. 入场时间<span className="font">{getOrderData.strEntryTime}</span>
  865. </div>
  866. <div className="plate">
  867. 入场记录来源:<span className="font">{getOrderData.entryDataSourceName}</span>
  868. </div>
  869. <div className="plate">
  870. 出入场图像:<span className="font"><a onClick={checkPic}>查看</a></span>
  871. </div>
  872. </div>
  873. <div className="car-msg">
  874. <div className="plate">
  875. 停车时长<span className="font">{getOrderData.parkTime}</span>
  876. </div>
  877. <div className="plate">
  878. 出场时间<span className="font">{getOrderData.strExitTime}</span>
  879. </div>
  880. <div className="plate">
  881. 出场记录来源<span className="font">{getOrderData.exitDataSourceName}</span>
  882. </div>
  883. </div>
  884. </div>
  885. </div>
  886. <div className="park-detail">
  887. <div className="title">车辆详情</div>
  888. <div className="park-area">
  889. <div className="car-msg">
  890. <div className="plate">
  891. 应收金额<span className="font">{getOrderData.shouldPayMoney}</span>
  892. </div>
  893. <div className="plate">
  894. 优惠券<span className="font">{getOrderData.coupon}</span>
  895. </div>
  896. </div>
  897. <div className="car-msg">
  898. <div className="plate">
  899. 优惠总计<span className="font">{getOrderData.totalCoupon}</span>
  900. </div>
  901. <div className="plate">
  902. 实付总计<span className="font">{getOrderData.totalPreMoney}</span>
  903. </div>
  904. <div className="plate">
  905. 欠费总计<span className="font">{getOrderData.sumActualPay}</span>
  906. </div>
  907. </div>
  908. </div>
  909. </div>
  910. </div> : ''
  911. }
  912. <div className="carTitle">
  913. <span className="font">异常停车处理信息</span>
  914. </div>
  915. <div className="deal-reason">
  916. <div className="logpTip">
  917. <div className="redLogo">*</div>
  918. <div className="title">处理理由</div>
  919. </div>
  920. <TextArea showCount maxLength={30} value={submitDeploy.deal_reason} className="text" onChange={onChangeReason} />
  921. </div>
  922. <div className="deal-style">
  923. <div className="title">处理方式</div>
  924. <div className="yisa-search">
  925. <div className="redLogo">*</div>
  926. <label style={{width:56}}> 更改项</label>
  927. <Select
  928. style={{ width: 200 }}
  929. placeholder="请选择"
  930. placement='topRight'
  931. value={submitDeploy.change_content}
  932. options={[
  933. {
  934. value: 1,
  935. label: '调整出场时间'
  936. },
  937. {
  938. value: 2,
  939. label: '变更车牌号'
  940. },
  941. {
  942. value: 3,
  943. label: '变更订单金额'
  944. },
  945. {
  946. value: 4,
  947. label: '免费该订单'
  948. },
  949. // {
  950. // value: 5,
  951. // label: '作废该订单'
  952. // }
  953. ]}
  954. onChange={handleChoose}
  955. />
  956. {getValueList === 1 ?
  957. <>
  958. <label style={{width:76,marginLeft: 30 }}>调整基于</label>
  959. <Select
  960. style={{ width: 200 }}
  961. placeholder="请选择"
  962. placement='topRight'
  963. value={submitDeploy.adjustTime}
  964. options={[
  965. {
  966. value: 1,
  967. label: '具体时间日期'
  968. },
  969. {
  970. value: 2,
  971. label: '记录入场时间'
  972. }
  973. ]}
  974. onChange={handleAdjust}
  975. />
  976. <div className="redLogo" style={{ marginLeft: 30 }}>*</div>
  977. <label style={{width:60}}>调整为</label>
  978. {
  979. getAdjustTimeValue === 1 ?
  980. <DatePicker
  981. format="YYYY-MM-DD HH:mm:ss"
  982. placement='topRight'
  983. value={parseDate(submitDeploy?.update_value, 'YYYY-MM-DD HH:mm:ss')}
  984. style={{ width: 300 }}
  985. showTime
  986. onChange={handleAdjustTime}
  987. /> : ''
  988. }
  989. {
  990. getAdjustTimeValue === 2 ?
  991. <div className="comeTime" style={{ display: "contents" }}>
  992. <label>入场时间+</label>
  993. <Input
  994. placeholder="请输入数字"
  995. value={submitDeploy.update_value}
  996. style={{ width: 150 }}
  997. onChange={handleComeTime}
  998. />
  999. <label></label>
  1000. </div> : ''
  1001. }
  1002. </> : ''
  1003. }
  1004. {
  1005. getValueList === 2 ?
  1006. <>
  1007. <div className="redLogo" style={{ marginLeft: 30 }}>*</div>
  1008. <label >车牌号:</label>
  1009. <Select
  1010. style={{ width: 100 }}
  1011. placeholder="请选择"
  1012. placement='topRight'
  1013. value={submitDeploy.plate_type}
  1014. options={sysConfig.plateColor}
  1015. onChange={handlePlateColor}
  1016. />
  1017. <Input
  1018. placeholder="请输入内容"
  1019. value={submitDeploy.update_value}
  1020. style={{ width: 150 }}
  1021. onChange={handlePlateNumber}
  1022. />
  1023. </> : ''
  1024. }
  1025. {
  1026. getValueList === 3 ? <>
  1027. <div className="redLogo" style={{ marginLeft: 30 }}>*</div>
  1028. <label >/:</label>
  1029. <Select
  1030. style={{ width: 100 }}
  1031. placeholder="请选择"
  1032. value={1}
  1033. disabled={true}
  1034. options={[
  1035. {
  1036. value: 1,
  1037. label: '减'
  1038. },
  1039. {
  1040. value: 2,
  1041. label: '增'
  1042. }
  1043. ]}
  1044. onChange={handleAdd}
  1045. />
  1046. <div className="redLogo" style={{ marginLeft: 30 }}>*</div>
  1047. <label>金额-</label>
  1048. <Input
  1049. placeholder="请输入内容"
  1050. value={submitDeploy.update_value}
  1051. style={{ width: 150 }}
  1052. onChange={handleAddCount}
  1053. />
  1054. </> : ''
  1055. }
  1056. </div>
  1057. </div>
  1058. <div className="deal-btn">
  1059. <button className="submit" onClick={submitBtn}>提交审核</button>
  1060. <button className="cancel" onClick={cancelBtn}>关闭窗口</button>
  1061. </div>
  1062. </div>
  1063. </Modal>
  1064. <Modal
  1065. visible={evidenceVisible}
  1066. onCancel={evidenceModal}
  1067. footer={null}
  1068. className="checkevidence"
  1069. title='证据图像查看'
  1070. >
  1071. <div className="admissionPic">
  1072. <div className="pic">
  1073. <div className="carTitle">
  1074. <span className="font">入场图像</span>
  1075. </div>
  1076. <div className="car-plate">
  1077. <div className="carPic">
  1078. <div className="name">车辆照片</div>
  1079. <div className="pic">
  1080. {
  1081. getOrderData.admissionPic === '' ? <div className="nodate">暂无数据</div> : <Image src={getOrderData.admissionPic} />
  1082. }
  1083. </div>
  1084. </div>
  1085. <div className="plate">
  1086. <div className="name">车牌照片</div>
  1087. <div className="pic">
  1088. {
  1089. getOrderData.admissionPicPlate === '' ? <div className="nodate">暂无数据</div> : <Image src={getOrderData.admissionPicPlate} />
  1090. }
  1091. </div>
  1092. </div>
  1093. </div>
  1094. </div>
  1095. <div className="exitPic">
  1096. <div className="carTitle">
  1097. <span className="font">出场图像</span>
  1098. </div>
  1099. <div className="car-plate">
  1100. <div className="carPic">
  1101. <div className="name">车辆照片</div>
  1102. <div className="pic">
  1103. {
  1104. getOrderData.exitionPic === '' ? <div className="nodate">暂无数据</div> : <Image src={getOrderData.exitionPic} />
  1105. }
  1106. </div>
  1107. </div>
  1108. <div className="plate">
  1109. <div className="name">车牌照片</div>
  1110. <div className="pic">
  1111. {
  1112. getOrderData.exitionPicPlate === '' ? <div className="nodate">暂无数据</div> : <Image src={getOrderData.exitionPicPlate} />
  1113. }
  1114. </div>
  1115. </div>
  1116. </div>
  1117. </div>
  1118. <div className="btn">
  1119. <button onClick={closePic}>关闭窗口</button>
  1120. </div>
  1121. </div>
  1122. </Modal>
  1123. </>
  1124. }
  1125. export default CallbackSuggestion;