21 changed files with 955 additions and 5 deletions
			
			
		| @ -0,0 +1,161 @@ | |||||
|  | /* eslint-disable*/ | ||||
|  | 
 | ||||
|  | 'use strict'; | ||||
|  | 
 | ||||
|  | module.exports = dc => { | ||||
|  |   const DataTypes = dc.ORM; | ||||
|  |   const sequelize = dc.orm; | ||||
|  |   const PatrolRecordIssueHandle = sequelize.define("patrolRecordIssueHandle", { | ||||
|  |     id: { | ||||
|  |       type: DataTypes.INTEGER, | ||||
|  |       allowNull: false, | ||||
|  |       defaultValue: null, | ||||
|  |       comment: null, | ||||
|  |       primaryKey: true, | ||||
|  |       field: "id", | ||||
|  |       autoIncrement: true, | ||||
|  |       unique: "patrol_record_issue_handle_id_uindex" | ||||
|  |     }, | ||||
|  |     patrolRecordId: { | ||||
|  |       type: DataTypes.INTEGER, | ||||
|  |       allowNull: true, | ||||
|  |       defaultValue: null, | ||||
|  |       comment: "巡检记录id", | ||||
|  |       primaryKey: false, | ||||
|  |       field: "patrol_record_id", | ||||
|  |       autoIncrement: false | ||||
|  |     }, | ||||
|  |     repairPerson: { | ||||
|  |       type: DataTypes.JSONB, | ||||
|  |       allowNull: true, | ||||
|  |       defaultValue: null, | ||||
|  |       comment: "维修人", | ||||
|  |       primaryKey: false, | ||||
|  |       field: "repair_person", | ||||
|  |       autoIncrement: false | ||||
|  |     }, | ||||
|  |     repairUnit: { | ||||
|  |       type: DataTypes.STRING, | ||||
|  |       allowNull: true, | ||||
|  |       defaultValue: null, | ||||
|  |       comment: "维修单位", | ||||
|  |       primaryKey: false, | ||||
|  |       field: "repair_unit", | ||||
|  |       autoIncrement: false | ||||
|  |     }, | ||||
|  |     startTime: { | ||||
|  |       type: DataTypes.DATE, | ||||
|  |       allowNull: true, | ||||
|  |       defaultValue: null, | ||||
|  |       comment: null, | ||||
|  |       primaryKey: false, | ||||
|  |       field: "start_time", | ||||
|  |       autoIncrement: false | ||||
|  |     }, | ||||
|  |     endTime: { | ||||
|  |       type: DataTypes.DATE, | ||||
|  |       allowNull: true, | ||||
|  |       defaultValue: null, | ||||
|  |       comment: null, | ||||
|  |       primaryKey: false, | ||||
|  |       field: "end_time", | ||||
|  |       autoIncrement: false | ||||
|  |     }, | ||||
|  |     repairAsk: { | ||||
|  |       type: DataTypes.STRING, | ||||
|  |       allowNull: true, | ||||
|  |       defaultValue: null, | ||||
|  |       comment: "维修要求", | ||||
|  |       primaryKey: false, | ||||
|  |       field: "repair_ask", | ||||
|  |       autoIncrement: false | ||||
|  |     }, | ||||
|  |     checkPerson: { | ||||
|  |       type: DataTypes.JSONB, | ||||
|  |       allowNull: true, | ||||
|  |       defaultValue: null, | ||||
|  |       comment: "质检验收人", | ||||
|  |       primaryKey: false, | ||||
|  |       field: "check_person", | ||||
|  |       autoIncrement: false | ||||
|  |     }, | ||||
|  |     state: { | ||||
|  |       type: DataTypes.INTEGER, | ||||
|  |       allowNull: true, | ||||
|  |       defaultValue: null, | ||||
|  |       comment: "流程状态 \n1 制定计划 待审核\n2 \n3\n4\n5\n6\n7", | ||||
|  |       primaryKey: false, | ||||
|  |       field: "state", | ||||
|  |       autoIncrement: false | ||||
|  |     }, | ||||
|  |     approvePerson: { | ||||
|  |       type: DataTypes.JSONB, | ||||
|  |       allowNull: true, | ||||
|  |       defaultValue: null, | ||||
|  |       comment: "审批人", | ||||
|  |       primaryKey: false, | ||||
|  |       field: "approve_person", | ||||
|  |       autoIncrement: false | ||||
|  |     }, | ||||
|  |     approveDate: { | ||||
|  |       type: DataTypes.DATE, | ||||
|  |       allowNull: true, | ||||
|  |       defaultValue: null, | ||||
|  |       comment: "审批日期", | ||||
|  |       primaryKey: false, | ||||
|  |       field: "approve_date", | ||||
|  |       autoIncrement: false | ||||
|  |     }, | ||||
|  |     approveOpinion: { | ||||
|  |       type: DataTypes.STRING, | ||||
|  |       allowNull: true, | ||||
|  |       defaultValue: null, | ||||
|  |       comment: "审批意见", | ||||
|  |       primaryKey: false, | ||||
|  |       field: "approve_opinion", | ||||
|  |       autoIncrement: false | ||||
|  |     }, | ||||
|  |     repairDesc: { | ||||
|  |       type: DataTypes.STRING, | ||||
|  |       allowNull: true, | ||||
|  |       defaultValue: null, | ||||
|  |       comment: "维修情况描述", | ||||
|  |       primaryKey: false, | ||||
|  |       field: "repair_desc", | ||||
|  |       autoIncrement: false | ||||
|  |     }, | ||||
|  |     repairImage: { | ||||
|  |       type: DataTypes.JSONB, | ||||
|  |       allowNull: true, | ||||
|  |       defaultValue: null, | ||||
|  |       comment: null, | ||||
|  |       primaryKey: false, | ||||
|  |       field: "repair_image", | ||||
|  |       autoIncrement: false | ||||
|  |     }, | ||||
|  |     creator: { | ||||
|  |       type: DataTypes.JSONB, | ||||
|  |       allowNull: true, | ||||
|  |       defaultValue: null, | ||||
|  |       comment: "审批人", | ||||
|  |       primaryKey: false, | ||||
|  |       field: "creator", | ||||
|  |       autoIncrement: false | ||||
|  |     }, | ||||
|  |     createTime: { | ||||
|  |       type: DataTypes.DATE, | ||||
|  |       allowNull: true, | ||||
|  |       defaultValue: null, | ||||
|  |       comment: "制定日期", | ||||
|  |       primaryKey: false, | ||||
|  |       field: "create_time", | ||||
|  |       autoIncrement: false | ||||
|  |     }, | ||||
|  |   }, { | ||||
|  |     tableName: "patrol_record_issue_handle", | ||||
|  |     comment: "", | ||||
|  |     indexes: [] | ||||
|  |   }); | ||||
|  |   dc.models.PatrolRecordIssueHandle = PatrolRecordIssueHandle; | ||||
|  |   return PatrolRecordIssueHandle; | ||||
|  | }; | ||||
| @ -0,0 +1,60 @@ | |||||
|  | DROP TABLE IF EXISTS "public"."patrol_record_issue_handle"; | ||||
|  | create table patrol_record_issue_handle | ||||
|  | ( | ||||
|  |     id               serial | ||||
|  |         constraint patrol_record_issue_handle_pk | ||||
|  |             primary key, | ||||
|  |     patrol_record_id integer, | ||||
|  |     repair_person    jsonb, | ||||
|  |     repair_unit      varchar(255), | ||||
|  |     start_time       timestamp(6) with time zone, | ||||
|  |     end_time         timestamp(6) with time zone, | ||||
|  |     repair_ask       varchar(255), | ||||
|  |     check_person     jsonb, | ||||
|  |     state            integer, | ||||
|  |     approve_person   jsonb, | ||||
|  |     approve_date     timestamp(6) with time zone, | ||||
|  |     approve_opinion  varchar(255), | ||||
|  |     repair_desc      varchar(255), | ||||
|  |     repair_image     jsonb, | ||||
|  | 	creator   jsonb, | ||||
|  |     create_time     timestamp(6) with time zone, | ||||
|  | ); | ||||
|  | 
 | ||||
|  | comment on column patrol_record_issue_handle.patrol_record_id is '巡检记录id'; | ||||
|  | 
 | ||||
|  | comment on column patrol_record_issue_handle.repair_person is '维修人'; | ||||
|  | 
 | ||||
|  | comment on column patrol_record_issue_handle.repair_unit is '维修单位'; | ||||
|  | 
 | ||||
|  | comment on column patrol_record_issue_handle.repair_ask is '维修要求'; | ||||
|  | 
 | ||||
|  | comment on column patrol_record_issue_handle.check_person is '质检验收人'; | ||||
|  | 
 | ||||
|  | comment on column patrol_record_issue_handle.state is '流程状态  | ||||
|  | 1 待制定计划 | ||||
|  | 2 待审核 | ||||
|  | 3 计划驳回 | ||||
|  | 4 待维修 | ||||
|  | 5 待验收 | ||||
|  | 6 验收通过 | ||||
|  | 7 验收不通过'; | ||||
|  | 
 | ||||
|  | comment on column patrol_record_issue_handle.approve_person is '审批人'; | ||||
|  | 
 | ||||
|  | comment on column patrol_record_issue_handle.approve_date is '审批日期'; | ||||
|  | 
 | ||||
|  | comment on column patrol_record_issue_handle.approve_opinion is '审批意见'; | ||||
|  | 
 | ||||
|  | comment on column patrol_record_issue_handle.repair_desc is '维修情况描述'; | ||||
|  | 
 | ||||
|  | comment on column patrol_record_issue_handle.creator is '制定人'; | ||||
|  | 
 | ||||
|  | comment on column patrol_record_issue_handle.create_time is '制定日期'; | ||||
|  | 
 | ||||
|  | alter table patrol_record_issue_handle | ||||
|  |     owner to "FashionAdmin"; | ||||
|  | 
 | ||||
|  | create unique index patrol_record_issue_handle_id_uindex | ||||
|  |     on patrol_record_issue_handle (id); | ||||
|  | 
 | ||||
| @ -0,0 +1,11 @@ | |||||
|  | 'use strict'; | ||||
|  | 
 | ||||
|  | 
 | ||||
|  | import * as record from './record' | ||||
|  | 
 | ||||
|  | 
 | ||||
|  | export default { | ||||
|  | 
 | ||||
|  |     ...record, | ||||
|  | 
 | ||||
|  | } | ||||
| @ -0,0 +1,32 @@ | |||||
|  | 'use strict'; | ||||
|  | 
 | ||||
|  | import { basicAction } from '@peace/utils' | ||||
|  | import { ApiTable } from '$utils' | ||||
|  | 
 | ||||
|  | 
 | ||||
|  | export function addPatrolRecordIssueHandle(params) { | ||||
|  |     return (dispatch) => basicAction({ | ||||
|  |         type: 'post', | ||||
|  |         data: params, | ||||
|  |         dispatch, | ||||
|  |         actionType: 'ADD_PatrolRecordIssueHandle_REPORT', | ||||
|  |         url: ApiTable.addPatrolRecordIssueHandle, | ||||
|  |         msg: { | ||||
|  |             option: '维修计划新增', | ||||
|  |         }, | ||||
|  |     }); | ||||
|  | } | ||||
|  | 
 | ||||
|  | export function modifyPatrolRecordIssueHandle(id, params, msg) { | ||||
|  |     return (dispatch) => basicAction({ | ||||
|  |         type: 'put', | ||||
|  |         data: params, | ||||
|  |         dispatch, | ||||
|  |         actionType: 'MODIFY_PatrolRecordIssueHandle_REPORT', | ||||
|  |         url: ApiTable.modifyPatrolRecordIssueHandle.replace('{id}', id), | ||||
|  |         msg: { | ||||
|  |             option: msg || '维修计划审批', | ||||
|  |         }, | ||||
|  |     }); | ||||
|  | } | ||||
|  | 
 | ||||
| @ -0,0 +1,280 @@ | |||||
|  | import React, { useState, useRef } from 'react'; | ||||
|  | import { Button, Form, Row, Col, Table, Popconfirm, Input, message } from 'antd'; | ||||
|  | import { | ||||
|  |     ModalForm, | ||||
|  |     ProFormText, | ||||
|  |     ProFormSelect, | ||||
|  |     ProFormTextArea, | ||||
|  |     ProFormDatePicker, | ||||
|  |     ProFormDateRangePicker | ||||
|  | } from '@ant-design/pro-form'; | ||||
|  | import Uploads from '$components/Uploads'; | ||||
|  | import moment from 'moment'; | ||||
|  | const FormItem = Form.Item; | ||||
|  | //state: 1下发未上报 2已上报待审批 3整改完成   上报结果result:  status 0 已上报未审批 1 审批通过 2 审批驳回
 | ||||
|  | export default (props) => { | ||||
|  |     const { title, triggerRender, editData = null, onFinish, readOnly, companyList, user } = props; | ||||
|  |     const formItemLayout = { labelCol: { span: 7 }, wrapperCol: { span: 16 } }; | ||||
|  |     const formRef = useRef(); | ||||
|  | 
 | ||||
|  |     const initialValues = editData ? { | ||||
|  |         ...editData, | ||||
|  |         ...editData?.patrolRecordIssueHandles[0], | ||||
|  | 
 | ||||
|  |     } : {}; | ||||
|  |     if (editData?.patrolRecordIssueHandles?.length > 0) { | ||||
|  |         initialValues.dateRange = [editData?.patrolRecordIssueHandles[0]?.startTime, editData?.patrolRecordIssueHandles[0]?.endTime] | ||||
|  |     } | ||||
|  |     const [reason, setReason] = useState('') | ||||
|  | 
 | ||||
|  | 
 | ||||
|  |     const approve = async (approve) => { | ||||
|  |         formRef.current.validateFields().then(async (values) => { | ||||
|  | 
 | ||||
|  |             onFinish && await onFinish({ | ||||
|  |                 msg: approve ? '计划同意' : '计划驳回', | ||||
|  |                 state: approve ? 4 : 3, | ||||
|  |                 approveOpinion: values?.approveOpinion, | ||||
|  |                 approvePerson: user, | ||||
|  |                 approveDate: moment() | ||||
|  |             }, editData) | ||||
|  |             return true; | ||||
|  |         }) | ||||
|  |             .catch((errors) => { | ||||
|  |                 if (errors) { | ||||
|  | 
 | ||||
|  |                 } | ||||
|  |             }); | ||||
|  | 
 | ||||
|  |     } | ||||
|  | 
 | ||||
|  |     const renderPlanInfo = () => { | ||||
|  |         return <> | ||||
|  |             {/* <Card title={'巡检信息'}> */} | ||||
|  |             <div className="item-title">{"巡检信息"}</div> | ||||
|  |             <Form> | ||||
|  |                 <Row> | ||||
|  |                     <Col span={12}> | ||||
|  |                         <Form.Item label="结构物名称:" {...formItemLayout}> | ||||
|  |                             <Input value={editData?.points?.project?.name} readOnly /> | ||||
|  |                         </Form.Item> | ||||
|  |                         <Form.Item label="巡检人:" {...formItemLayout}> | ||||
|  |                             <Input value={editData?.points?.user?.name} readOnly /> | ||||
|  |                         </Form.Item> | ||||
|  |                     </Col> | ||||
|  |                     <Col span={12}> | ||||
|  |                         <Form.Item label="巡检单位:" {...formItemLayout}> | ||||
|  |                             <Input value={editData?.points?.user?.department?.name} readOnly title={222} /> | ||||
|  |                         </Form.Item> | ||||
|  | 
 | ||||
|  |                         <Form.Item label="巡检时间:" {...formItemLayout}> | ||||
|  |                             <Input value={editData?.inspectionTime && moment(editData?.inspectionTime).format('YYYY-MM-DD HH:mm:ss')} readOnly /> | ||||
|  |                         </Form.Item> | ||||
|  |                     </Col> | ||||
|  |                 </Row> | ||||
|  |             </Form> | ||||
|  | 
 | ||||
|  |             <div className="item-title">{"问题详情"}</div> | ||||
|  |             <Row> | ||||
|  |                 <Col span={6}> | ||||
|  |                     <Form.Item label="点位名称:" {...formItemLayout}> | ||||
|  |                         <Input value={editData?.points?.itemData?.name} readOnly /> | ||||
|  |                     </Form.Item> | ||||
|  |                 </Col> | ||||
|  | 
 | ||||
|  |                 <Col span={18}> | ||||
|  |                     { | ||||
|  |                         Object.keys(editData?.points?.inspectContent).map(key => { | ||||
|  |                             if (editData?.points?.inspectContent[key]?.isNormal == false) { | ||||
|  |                                 return <Row style={{ marginBottom: 15 }}> | ||||
|  |                                     <Col span={12}> | ||||
|  |                                         <Form.Item label="检查项:" {...formItemLayout}> | ||||
|  |                                             <Input value={key} readOnly /> | ||||
|  |                                         </Form.Item> | ||||
|  |                                         <Form.Item label="异常等级:" {...formItemLayout}> | ||||
|  |                                             <Input value={editData?.points?.inspectContent[key]?.level} readOnly /> | ||||
|  |                                         </Form.Item> | ||||
|  |                                     </Col> | ||||
|  |                                     <Col span={12}> | ||||
|  |                                         <Form.Item label="问题描述:" {...formItemLayout}> | ||||
|  |                                             <Input value={editData?.points?.inspectContent[key]?.msgInp} readOnly title={222} /> | ||||
|  |                                         </Form.Item> | ||||
|  | 
 | ||||
|  |                                         <Form.Item label="现场图片:" {...formItemLayout}> | ||||
|  |                                             <Uploads | ||||
|  |                                                 listType='picture-card' | ||||
|  |                                                 uploadType='project' | ||||
|  |                                                 maxFilesNum={1} | ||||
|  |                                                 maxFileSize={10} | ||||
|  |                                                 isQiniu={true} | ||||
|  |                                                 disabled={true} | ||||
|  |                                                 fileTypes={["png", "jpg"]} | ||||
|  |                                                 defaultValue={ | ||||
|  |                                                     (() => { | ||||
|  |                                                         let nextV = [] | ||||
|  |                                                         for (let s of (editData?.points?.inspectContent[key].imgs || [])) { | ||||
|  |                                                             if (s) { | ||||
|  |                                                                 nextV.push({ | ||||
|  |                                                                     storageUrl: s | ||||
|  |                                                                 }) | ||||
|  |                                                             } | ||||
|  |                                                         } | ||||
|  |                                                         return nextV | ||||
|  |                                                     })() | ||||
|  |                                                 } | ||||
|  |                                             /> | ||||
|  | 
 | ||||
|  |                                         </Form.Item> | ||||
|  |                                     </Col> | ||||
|  |                                 </Row> | ||||
|  |                             } | ||||
|  |                         }) | ||||
|  |                     } | ||||
|  |                 </Col> | ||||
|  |             </Row></> | ||||
|  |     } | ||||
|  | 
 | ||||
|  |     return ( | ||||
|  |         <ModalForm | ||||
|  |             formRef={formRef} | ||||
|  |             title={title || ''} | ||||
|  |             initialValues={initialValues} | ||||
|  |             trigger={ | ||||
|  |                 triggerRender ? triggerRender : <Button type="primary" > | ||||
|  |                     {title || ''} | ||||
|  |                 </Button> | ||||
|  |             } | ||||
|  |             width={1200} | ||||
|  |             layout="horizontal" | ||||
|  |             // grid={true}
 | ||||
|  |             {...formItemLayout} | ||||
|  |             modalProps={{ | ||||
|  |                 destroyOnClose: true, | ||||
|  |                 // onCancel: () => { },
 | ||||
|  |                 bodyStyle: { height: 720, overflowY: 'auto' } | ||||
|  |             }} | ||||
|  |             onFinish={async (values) => { | ||||
|  |                 values.startTime = values?.dateRange[0]; | ||||
|  |                 values.endTime = values?.dateRange[1]; | ||||
|  |                 onFinish && await onFinish(values, editData) | ||||
|  |                 //message.success('提交成功');
 | ||||
|  |                 return true; | ||||
|  |             }} | ||||
|  | 
 | ||||
|  |             submitter={editData?.patrolRecordIssueHandles[0]?.state === 2 ? { | ||||
|  |                 render: (props, defaultDoms) => { | ||||
|  |                     return [ | ||||
|  |                         <Button onClick={() => { approve(1); }} type='primary'>确定</Button>, | ||||
|  |                         <Button onClick={() => { approve(0); }}>驳回</Button> | ||||
|  |                     ]; | ||||
|  |                 } | ||||
|  |             } : !readOnly} | ||||
|  |         > | ||||
|  |             <div> | ||||
|  |                 {/*问题记录信息*/} | ||||
|  |                 {renderPlanInfo()} | ||||
|  | 
 | ||||
|  |                 {/*维修处理计划表单*/} | ||||
|  |                 { | ||||
|  |                     ((editData?.patrolRecordIssueHandles?.length == 0 && !readOnly) || editData?.patrolRecordIssueHandles?.length > 0) && | ||||
|  |                     <> | ||||
|  |                         <div className="item-title">{"维修计划信息"}</div> | ||||
|  |                         <Row> | ||||
|  |                             <Col span={12}> | ||||
|  |                                 <ProFormSelect | ||||
|  |                                     rules={[{ required: true, message: '请选择维修人' }]} | ||||
|  |                                     options={[{ value: 1, label: '维修工1' }, { value: 2, label: '维修工2' }]} | ||||
|  |                                     disabled={readOnly} | ||||
|  |                                     name="repairPerson" | ||||
|  |                                     label="选择维修人" | ||||
|  |                                     fieldProps={{ | ||||
|  |                                         showSearch: true | ||||
|  |                                     }} | ||||
|  |                                 /> | ||||
|  |                             </Col> | ||||
|  |                             <Col span={12}> | ||||
|  |                                 <ProFormText | ||||
|  |                                     name="repairUnit" | ||||
|  |                                     label="维修单位:" | ||||
|  |                                     disabled={readOnly} | ||||
|  |                                     rules={[ | ||||
|  |                                         { | ||||
|  |                                             max: 50, message: '维修单位长度不能大于50个字符' | ||||
|  |                                         }, | ||||
|  |                                         { | ||||
|  |                                             whitespace: true, message: '请勿输入空格' | ||||
|  |                                         }]} | ||||
|  |                                     placeholder="请输入维修单位" | ||||
|  |                                 /> | ||||
|  |                             </Col> | ||||
|  | 
 | ||||
|  |                             <Col span={12}> | ||||
|  |                                 <ProFormDateRangePicker | ||||
|  |                                     disabled={readOnly} | ||||
|  |                                     name="dateRange" | ||||
|  |                                     label="计划开始时间~结束时间:" | ||||
|  |                                     rules={[{ required: true, message: '请选择计划时间范围' }]} | ||||
|  |                                 /> | ||||
|  |                             </Col> | ||||
|  |                             <Col span={12}> | ||||
|  |                                 <ProFormSelect | ||||
|  |                                     rules={[{ required: true, message: '请选择质检人' }]} | ||||
|  |                                     options={[{ value: 3, label: '质检人1' }, { value: 4, label: '质检人2' }]} | ||||
|  |                                     disabled={readOnly} | ||||
|  |                                     name="checkPerson" | ||||
|  |                                     label="选择质检人" | ||||
|  |                                     fieldProps={{ | ||||
|  |                                         showSearch: true | ||||
|  |                                     }} | ||||
|  |                                 /> | ||||
|  |                             </Col> | ||||
|  |                             <Col span={12}> | ||||
|  |                                 <ProFormTextArea | ||||
|  |                                     name="repairAsk" | ||||
|  |                                     label="维修要求:" | ||||
|  |                                     disabled={readOnly} | ||||
|  |                                     rules={[ | ||||
|  |                                         { | ||||
|  |                                             max: 200, message: '维修要求长度不能大于200个字符' | ||||
|  |                                         }, | ||||
|  |                                         { | ||||
|  |                                             whitespace: true, message: '请勿输入空格' | ||||
|  |                                         }]} | ||||
|  |                                     placeholder="请输入维修要求" | ||||
|  |                                 /></Col> | ||||
|  |                             <Col span={12}></Col> | ||||
|  |                         </Row> | ||||
|  |                     </> | ||||
|  |                 } | ||||
|  | 
 | ||||
|  |                 { | ||||
|  |                     editData?.patrolRecordIssueHandles[0]?.state === 2 && | ||||
|  |                     <> | ||||
|  |                         <div className="item-title">{"维修计划审批"}</div> | ||||
|  |                         <div> | ||||
|  |                             <ProFormTextArea | ||||
|  |                                 labelCol={{ span: 5 }} | ||||
|  |                                 wrapperCol={{ span: 16 }} | ||||
|  |                                 name="approveOpinion" | ||||
|  |                                 label="审批意见:" | ||||
|  |                                 disabled={editData?.patrolRecordIssueHandles[0]?.state !== 2} | ||||
|  |                                 rules={[ | ||||
|  |                                     { required: true, message: '请输入审批意见' }, | ||||
|  |                                     { | ||||
|  |                                         max: 200, message: '审批意见长度不能大于200个字符' | ||||
|  |                                     }, | ||||
|  |                                     { | ||||
|  |                                         whitespace: true, message: '请勿输入空格' | ||||
|  |                                     }]} | ||||
|  |                                 placeholder="请输入审批意见" | ||||
|  |                             /> | ||||
|  |                         </div> | ||||
|  |                     </> | ||||
|  |                 } | ||||
|  |             </div> | ||||
|  | 
 | ||||
|  | 
 | ||||
|  | 
 | ||||
|  |         </ ModalForm> | ||||
|  |     ); | ||||
|  | }; | ||||
| @ -0,0 +1,5 @@ | |||||
|  | 'use strict'; | ||||
|  | 
 | ||||
|  | import PatrolReocrd from './patrolRecord'; | ||||
|  | 
 | ||||
|  | export {  PatrolReocrd }; | ||||
| @ -0,0 +1,234 @@ | |||||
|  | 
 | ||||
|  | 'use strict' | ||||
|  | 
 | ||||
|  | import React, { useEffect, useState } from 'react'; | ||||
|  | import { connect } from 'react-redux'; | ||||
|  | import { Form, Input, Select, Button, Table, Modal, DatePicker, Checkbox, Row, Col, Collapse } from 'antd'; | ||||
|  | import moment from "moment"; | ||||
|  | import Uploads from '$components/Uploads'; | ||||
|  | import IssueHandleModal from '../components/isuue-handle-mdal' | ||||
|  | import '../style.less' | ||||
|  | 
 | ||||
|  | const { Panel } = Collapse; | ||||
|  | const ISSUEHANDLE_STATE = [1, 2, 3, 4, 5, 6, 7] | ||||
|  | const STATE_TEXT = { 1: '待制定计划', 2: '待审核', 3: '计划驳回', 4: '待维修', 5: '待验收', 6: '验收通过', 7: '验收不通过', } | ||||
|  | 
 | ||||
|  | const PatrolRecord = (props) => { | ||||
|  |     const { dispatch, actions, user } = props | ||||
|  |     const { patrolManage, issueHandle } = actions | ||||
|  |     const [tableList, settableList] = useState([]) | ||||
|  |     const [name, setName] = useState(''); | ||||
|  |     const [curState, setCurState] = useState('null'); | ||||
|  |     const format = 'YYYY-MM-DD HH:mm:ss' | ||||
|  |     const times = [moment().subtract(70, 'years').format(format), moment().format(format)] | ||||
|  |     const [search, setSearch] = useState({ name: null, time: [times[0], times[1]], state: 'null' }) | ||||
|  | 
 | ||||
|  |     useEffect(() => { | ||||
|  |         queryData() | ||||
|  |     }, []) | ||||
|  | 
 | ||||
|  |     const queryData = () => { | ||||
|  |         dispatch(patrolManage.records(`patrolRecord/all/${times[0]}/${times[1]}/true/null`)).then(res => { | ||||
|  |             if (res.success) { | ||||
|  |                 settableList(name != null ? res.payload.data?.filter(v => | ||||
|  |                     (v.points.user.name.indexOf(name) != -1 || v.points.project.name.indexOf(name) != -1)) | ||||
|  |                     .map(v => ({ ...v, key: v.id })) : res.payload.data?.map(v => ({ ...v, key: v.id }))) | ||||
|  |             } | ||||
|  |         }) | ||||
|  |     } | ||||
|  |     const onFinish = async (values, editData) => { | ||||
|  |         const dataToSave = { ...values }; | ||||
|  |         if (editData?.patrolRecordIssueHandles?.length > 0) { | ||||
|  |             let msg = ''; | ||||
|  |             if (editData?.patrolRecordIssueHandles[0]?.state == 3) { | ||||
|  |                 dataToSave.state = 2; | ||||
|  |                 msg = '维修计划修改'; | ||||
|  |             } | ||||
|  |             return dispatch( | ||||
|  |                 issueHandle.modifyPatrolRecordIssueHandle(editData?.patrolRecordIssueHandles[0]?.id, dataToSave, | ||||
|  |                     values?.msg || msg), | ||||
|  |             ).then(() => { | ||||
|  |                 queryData(); | ||||
|  |             }); | ||||
|  |         } | ||||
|  |         let state = ISSUEHANDLE_STATE[1]; | ||||
|  | 
 | ||||
|  |         return dispatch(issueHandle.addPatrolRecordIssueHandle({ | ||||
|  |             ...dataToSave, | ||||
|  |             state, | ||||
|  |             patrolRecordId: editData?.id, | ||||
|  |             creator: user, | ||||
|  |             createTime: moment() | ||||
|  |         })).then(() => { | ||||
|  |             queryData(); | ||||
|  |         }); | ||||
|  |     }; | ||||
|  | 
 | ||||
|  |     const renderOptionText = (currentState) => { | ||||
|  |         let text = '查看' | ||||
|  | 
 | ||||
|  |         return STATE_TEXT[currentState] || text | ||||
|  |     } | ||||
|  | 
 | ||||
|  |     const columns = [ | ||||
|  |         { | ||||
|  |             title: '结构物名称', | ||||
|  |             dataIndex: 'name', | ||||
|  |             key: 'name', | ||||
|  |             width: '10%', | ||||
|  |             showInDetail: true, | ||||
|  |             render: (text, record, index) => { | ||||
|  |                 return !record.points?.project ? '' : <div>{record.points.project.name}</div> | ||||
|  |             } | ||||
|  |         }, | ||||
|  |         { | ||||
|  |             title: '上报人', | ||||
|  |             dataIndex: 'type', | ||||
|  |             key: 'type', | ||||
|  |             showInDetail: true, | ||||
|  |             width: '10%', | ||||
|  |             render: (text, record, index) => { | ||||
|  |                 return !record.points?.user ? '' : <div>{record.points.user.name}</div> | ||||
|  |             } | ||||
|  |         }, | ||||
|  |         { | ||||
|  |             title: '上报时间', | ||||
|  |             dataIndex: 'time', | ||||
|  |             key: 'time', | ||||
|  |             showInDetail: true, | ||||
|  |             render: (text, record, index) => moment(record.inspectionTime).format('YYYY-MM-DD HH:mm:ss') || '--' | ||||
|  |         }, { | ||||
|  |             title: '点位名称', | ||||
|  |             dataIndex: 'station', | ||||
|  |             key: 'station', | ||||
|  |             showInDetail: true, | ||||
|  |             render: (text, record, index) => record?.points?.itemData?.name | ||||
|  |         }, | ||||
|  |         { | ||||
|  |             title: '问题来源', | ||||
|  |             dataIndex: 'source', | ||||
|  |             key: 'source', | ||||
|  |             showInDetail: true, | ||||
|  |             render: (text, record, index) => '巡检上报' //暂定巡检上报 后续会增加平台录入
 | ||||
|  |         }, | ||||
|  |         { | ||||
|  |             title: '严重等级', | ||||
|  |             dataIndex: 'level', | ||||
|  |             key: 'level', | ||||
|  |             showInDetail: true, | ||||
|  |             render: (text, record, index) => { | ||||
|  |                 const LEVELS_ = ['严重', '中度', '轻微']; | ||||
|  |                 const recordLevels = [] | ||||
|  |                 Object.keys(record?.points?.inspectContent).map(key => { | ||||
|  |                     recordLevels.push(record?.points?.inspectContent[key]?.level) | ||||
|  |                 }) | ||||
|  |                 const level = LEVELS_.find(s => recordLevels.find(x => x == s)) | ||||
|  |                 return level; | ||||
|  |             } | ||||
|  |         }, | ||||
|  |         { | ||||
|  |             title: '当前状态', | ||||
|  |             dataIndex: 'state', | ||||
|  |             key: 'name', | ||||
|  |             width: '10%', | ||||
|  |             showInDetail: true, | ||||
|  |             render: (text, record, index) => { | ||||
|  |                 return !record?.patrolRecordIssueHandles || record?.patrolRecordIssueHandles?.length == 0 ? '待制定计划' : | ||||
|  |                     renderOptionText(record?.patrolRecordIssueHandles[0]?.state) | ||||
|  |             } | ||||
|  |         }, | ||||
|  |         { | ||||
|  |             title: '操作', | ||||
|  |             dataIndex: 'operation', | ||||
|  |             key: 'operation', | ||||
|  |             render: (text, record, index) => { | ||||
|  |                 const options = []; | ||||
|  |                 if (!record?.patrolRecordIssueHandles || record?.patrolRecordIssueHandles?.length == 0) { | ||||
|  |                     options.push(<IssueHandleModal | ||||
|  |                         editData={record} | ||||
|  |                         readOnly={false} | ||||
|  |                         key="edit" | ||||
|  |                         title="制定计划" | ||||
|  |                         triggerRender={<a style={{ marginRight: 6 }}>{renderOptionText(1)}</a>} | ||||
|  |                         user={user} | ||||
|  |                         onFinish={onFinish} />) | ||||
|  |                 } | ||||
|  |                 if (record?.patrolRecordIssueHandles[0]?.state == 2) { | ||||
|  |                     options.push(<IssueHandleModal | ||||
|  |                         editData={record} | ||||
|  |                         readOnly={true} | ||||
|  |                         key="edit" | ||||
|  |                         title="审核" | ||||
|  |                         triggerRender={<a style={{ marginRight: 6 }}>{renderOptionText(2)}</a>} | ||||
|  |                         user={user} | ||||
|  |                         onFinish={onFinish} />) | ||||
|  |                 } | ||||
|  | 
 | ||||
|  |                 if (record?.patrolRecordIssueHandles[0]?.state == 3) { | ||||
|  |                     options.push(<IssueHandleModal | ||||
|  |                         editData={record} | ||||
|  |                         readOnly={false} | ||||
|  |                         key="edit" | ||||
|  |                         title="修改计划" | ||||
|  |                         triggerRender={<a style={{ marginRight: 6 }}>修改计划</a>} | ||||
|  |                         user={user} | ||||
|  |                         onFinish={onFinish} />) | ||||
|  |                 } | ||||
|  | 
 | ||||
|  |                 options.push(<IssueHandleModal | ||||
|  |                     editData={record} | ||||
|  |                     readOnly={true} | ||||
|  |                     key="edit" | ||||
|  |                     title="查看详情" | ||||
|  |                     triggerRender={<a>查看详情</a>} | ||||
|  |                     user={user} | ||||
|  |                     onFinish={onFinish} />) | ||||
|  | 
 | ||||
|  |                 return options; | ||||
|  |             } | ||||
|  |         } | ||||
|  |     ] | ||||
|  | 
 | ||||
|  |     return ( | ||||
|  |         <div id='patrol-record'> | ||||
|  |             <div style={{ marginBottom: 20 }}> | ||||
|  |                 <Input style={{ width: 240, marginRight: 20 }} | ||||
|  |                     value={name} onChange={e => { setName(e.target.value) }} | ||||
|  |                     placeholder="请输入结构物名称或上报人" allowClear /> | ||||
|  |                 <Select style={{ width: 140, marginRight: 20 }} allowClear | ||||
|  |                     options={[ | ||||
|  |                         { value: 'null', label: '全部' }, | ||||
|  |                         { value: 1, label: '待制定计划' }, | ||||
|  |                         { value: 2, label: '待审核' }, | ||||
|  |                         { value: 3, label: '计划驳回' }, | ||||
|  |                         { value: 4, label: '待维修' }, | ||||
|  |                         { value: 5, label: '待验收' }, | ||||
|  |                         { value: 6, label: '验收通过' }, | ||||
|  |                         { value: 7, label: '验收不通过' }, | ||||
|  |                     ]} /> | ||||
|  |                 <Button type='primary' onClick={() => { queryData() }}>搜索</Button> | ||||
|  |             </div> | ||||
|  |             <Table | ||||
|  |                 columns={columns} | ||||
|  |                 dataSource={tableList} | ||||
|  |                 pagination={{ | ||||
|  |                     showSizeChanger: true, | ||||
|  |                     pageSizeOptions: [10, 20, 50], | ||||
|  | 
 | ||||
|  |                 }} | ||||
|  |             /> | ||||
|  | 
 | ||||
|  | 
 | ||||
|  |         </div> | ||||
|  |     ) | ||||
|  | } | ||||
|  | 
 | ||||
|  | function mapStateToProps(state) { | ||||
|  |     const { auth, global } = state; | ||||
|  |     return { | ||||
|  |         user: auth.user, | ||||
|  |         actions: global.actions, | ||||
|  |     }; | ||||
|  | } | ||||
|  | 
 | ||||
|  | export default connect(mapStateToProps)(PatrolRecord); | ||||
| @ -0,0 +1,15 @@ | |||||
|  | 'use strict'; | ||||
|  | 
 | ||||
|  | import reducers from './reducers'; | ||||
|  | import routes from './routes'; | ||||
|  | import actions from './actions'; | ||||
|  | import { getNavItem } from './nav-item'; | ||||
|  | 
 | ||||
|  | export default { | ||||
|  |     key: 'issueHandle', | ||||
|  |     name: '', | ||||
|  |     reducers: reducers, | ||||
|  |     routes: routes, | ||||
|  |     actions: actions, | ||||
|  |     getNavItem: getNavItem | ||||
|  | }; | ||||
| @ -0,0 +1,18 @@ | |||||
|  | import React from 'react'; | ||||
|  | import { Link } from 'react-router-dom'; | ||||
|  | import { Menu } from 'antd'; | ||||
|  | import { SettingOutlined } from '@ant-design/icons'; | ||||
|  | 
 | ||||
|  | const SubMenu = Menu.SubMenu; | ||||
|  | 
 | ||||
|  | export function getNavItem(user, dispatch) { | ||||
|  |     // if (!Func.isAuthorized("ORG_MANAGE")) {
 | ||||
|  |     //     return null
 | ||||
|  |     // }
 | ||||
|  |     return ( | ||||
|  |         <Menu.Item icon={<SettingOutlined />} key="issueHandle"> | ||||
|  |             <Link to="/issueHandle">维修处理</Link> | ||||
|  |         </Menu.Item> | ||||
|  | 
 | ||||
|  |     ); | ||||
|  | } | ||||
| @ -0,0 +1,5 @@ | |||||
|  | 'use strict'; | ||||
|  | 
 | ||||
|  | export default {     | ||||
|  |      | ||||
|  | }; | ||||
| @ -0,0 +1,32 @@ | |||||
|  | 'use strict'; | ||||
|  | import * as actionTypes from '../actions/record'; | ||||
|  | import Immutable from 'immutable'; | ||||
|  | 
 | ||||
|  | const initState = { | ||||
|  |     data: {}, | ||||
|  |     isRequesting: false, | ||||
|  |     error: null | ||||
|  | }; | ||||
|  | 
 | ||||
|  | function record(state = initState, action) { | ||||
|  |     const payload = action.payload; | ||||
|  |     switch (action.type){ | ||||
|  |         case actionTypes.GET_PATROL_RECORD_LIST: | ||||
|  |             return Immutable.fromJS(state).set('data',  | ||||
|  |                 payload.data).toJS(); | ||||
|  |         case actionTypes.GET_PATROL_RECORD_LIST_SUCCESS: | ||||
|  |             return Immutable.fromJS(state).merge({ | ||||
|  |                 isRequesting: false, | ||||
|  |                 data: payload.data | ||||
|  |             }).toJS(); | ||||
|  |         case actionTypes.GET_PATROL_RECORD_LIST_ERROR: | ||||
|  |             return Immutable.fromJS(state).merge({ | ||||
|  |                 isRequesting: false, | ||||
|  |                 error: payload.error | ||||
|  |             }).toJS(); | ||||
|  |         default: | ||||
|  |             return state; | ||||
|  |     } | ||||
|  | } | ||||
|  | 
 | ||||
|  | export default record; | ||||
| @ -0,0 +1,13 @@ | |||||
|  | 'use strict'; | ||||
|  | import { PatrolReocrd } from './containers'; | ||||
|  | 
 | ||||
|  | export default [{ | ||||
|  |     type: 'inner', | ||||
|  |     route: { | ||||
|  |         path: '/issueHandle', | ||||
|  |         key: 'issueHandle', | ||||
|  |         breadcrumb: '维修处理', | ||||
|  |         component: PatrolReocrd, | ||||
|  | 
 | ||||
|  |     } | ||||
|  | }]; | ||||
| @ -0,0 +1,13 @@ | |||||
|  | .patrol-record-detail-modal { | ||||
|  |     .ant-collapse>.ant-collapse-item>.ant-collapse-header { | ||||
|  |         padding: 0 | ||||
|  |     } | ||||
|  | } | ||||
|  | 
 | ||||
|  | .item-title { | ||||
|  |     background-color: #4A93DF; | ||||
|  |     padding: 10px; | ||||
|  |     color: #fff; | ||||
|  |     margin-bottom: 20px; | ||||
|  |     padding-left: 20px; | ||||
|  | } | ||||
					Loading…
					
					
				
		Reference in new issue