前端提交

This commit is contained in:
罗松柏 2022-11-10 11:31:43 +08:00
parent c2696e5b1c
commit 4139d1b8d4
29 changed files with 1509 additions and 362 deletions

View File

@ -114,6 +114,8 @@
.backgroundcolor .ant-tree{ background-color: rgba(255, 255, 255, 0) !important; } .backgroundcolor .ant-tree{ background-color: rgba(255, 255, 255, 0) !important; }
.textindent7{text-indent: 7px;}
.fontweight{font-weight: bold;} .fontweight{font-weight: bold;}
.padding24 { padding: 24px; } .padding24 { padding: 24px; }
.margin24 { margin: 24px; } .margin24 { margin: 24px; }

View File

@ -49,7 +49,6 @@ function AppLayOut() {
// //
const handlMouseLeave = () => { const handlMouseLeave = () => {
console.log(11111)
setCollapsed(true) setCollapsed(true)
} }

View File

@ -71,7 +71,7 @@ export default function PositionResponsble({ updataPosition, postdata }) {
} else { } else {
data['list'] = gatuserlist data['list'] = gatuserlist
} }
console.log(data) // console.log(data)
setUserlist(data) setUserlist(data)
setVisible(true) setVisible(true)
}, },

View File

@ -20,6 +20,7 @@ import {
interviewupdate, interviewupdate,
sendinterviewee, sendinterviewee,
} from '../../util/requestURL' } from '../../util/requestURL'
import PubSub from 'pubsub-js'
const { confirm } = Modal const { confirm } = Modal
export default class CandidateTable extends Component { export default class CandidateTable extends Component {
@ -100,6 +101,14 @@ export default class CandidateTable extends Component {
} }
componentDidMount() { componentDidMount() {
this.PostInterviewwaiteinfind() this.PostInterviewwaiteinfind()
this.updatacandidate = PubSub.subscribe('updatacandidate',(_,stateObj)=>{
this.props.updatainterviewstagenum()
this.PostInterviewwaiteinfind()
})
}
componentWillUnmount(){
PubSub.unsubscribe(this.updatacandidate)
} }
componentDidUpdate() { componentDidUpdate() {
@ -651,6 +660,9 @@ export default class CandidateTable extends Component {
onCancel={() => { onCancel={() => {
this.setState({ this.setState({
interviewerInfo: false, interviewerInfo: false,
},()=>{
this.props.updatainterviewstagenum()
this.PostInterviewwaiteinfind()
}) })
}} }}
onEditresume={() => { onEditresume={() => {

View File

@ -39,5 +39,5 @@
.upload-button-box button { width: 100%; } .upload-button-box button { width: 100%; }
.upload-button-box .ant-upload-list {display: none;} .upload-button-box .ant-upload-list {display: none;}
.resume-energy-box { display: flex; justify-content: space-between; } .resume-energy-box { display: flex; justify-content: space-between; }
.resume-xq-box { height: 625px; overflow-x: hidden; overflow-y: auto; } .resume-xq-box { width: 50%; height: 625px; overflow-x: hidden; overflow-y: auto; }
.width700 { width: 700px; } .width700 { width: 700px; }

View File

@ -1,10 +1,12 @@
import React,{useEffect} from 'react' import React,{useEffect} from 'react'
import './index.css' import './index.css'
import { UploadOutlined } from '@ant-design/icons' import { UploadOutlined } from '@ant-design/icons'
import memoryUtils from '../../../util/memoryUtils'
import { Button, message, Upload,Input } from 'antd' import { Button, message, Upload,Input } from 'antd'
export default function EnclosureTabs({data, Tabsnum}) { export default function EnclosureTabs({data, Tabsnum}) {
let userInfo = memoryUtils.userInfo
const token = userInfo.token_type + ' ' + userInfo.token || ''
useEffect(() => { useEffect(() => {
if (Tabsnum === '6') { if (Tabsnum === '6') {
// getoperatelog({ user_id: data }).then( // getoperatelog({ user_id: data }).then(
@ -21,13 +23,14 @@ export default function EnclosureTabs({data, Tabsnum}) {
const props = { const props = {
name: 'file', name: 'file',
// action: 'http://10.0.0.240:7800/api/v1/itr/resume_affix',
// action: 'http://myip.legu.cc:7800/api/v1/itr/resume_affix', // action: 'http://myip.legu.cc:7800/api/v1/itr/resume_affix',
action: 'http://10.0.0.4:7800/api/v1/itr/resume_affix', action: 'http://10.0.0.4:7800/api/v1/itr/resume_affix',
data:{ data:{
uid: data.uid uid: data
}, },
headers: { headers: {
authorization: 'authorization-text', Authorization: token,
}, },
onChange(info) { onChange(info) {

View File

@ -9,31 +9,30 @@ import storageUtils from '../../../util/storageUtils'
import './index.css' import './index.css'
const { TextArea } = Input const { TextArea } = Input
export default function Feedback({ visible, onClose, uid }) { export default function Feedback({ visible, onClose, uid,setuserid }) {
var userInfo = storageUtils.getUser() var userInfo = storageUtils.getUser()
const [voice, setvoice] = useState(1) const [voice, setvoice] = useState(1)
const [thought, setthought] = useState(1) const [thought, setthought] = useState(1)
const [diathesis, setdiathesis] = useState(1) const [diathesis, setdiathesis] = useState(1)
const [evaluate, setevaluate] = useState('') const [evaluate, setevaluate] = useState('')
const [teacherback, setteacherback] = useState(1) const [teacherback, setteacherback] = useState(1)
const [isupdata, setisupdata] = useState(0) // const [isupdata, setisupdata] = useState(0)
useEffect(() => { useEffect(() => {
if (uid) { if (uid) {
getteacher({ uid: uid }).then( getteacher({ uid: uid }).then(
(res) => { (res) => {
if (res.msg === 'ok') { if (res.msg === 'ok') {
if (res.data.uid) { if (res.data[0].uid) {
const user_id = userInfo.user_id const user_id = setuserid.user_id
if (res.data['survey']['']) { if (res.data[0]['survey'][user_id]) {
setisupdata(1) // setisupdata(1)
setvoice(res.data['survey'][user_id].voice || 1) setvoice(res.data[0]['survey'][user_id].voice || 1)
setthought(res.data['survey'][user_id].thought || 1) setthought(res.data[0]['survey'][user_id].thought || 1)
setdiathesis( setdiathesis(
res.data['survey'][user_id].diathesis || 1 res.data[0]['survey'][user_id].diathesis || 1
) )
setevaluate(res.data['survey'][user_id].evaluate) setevaluate(res.data[0]['survey'][user_id].evaluate)
setteacherback(res.data['survey'][user_id].teacher_back) setteacherback(res.data[0]['survey'][user_id].teacher_back)
} }
} }
} }
@ -47,47 +46,51 @@ export default function Feedback({ visible, onClose, uid }) {
const handelFeedback = () => { const handelFeedback = () => {
const date = { const date = {
name: userInfo.name, user_id:setuserid.user_id,
name: setuserid.name,
voice, voice,
thought, thought,
diathesis, diathesis,
evaluate, evaluate,
teacher_back: teacherback, teacher_back: teacherback
} }
if (isupdata === 0) { // if (isupdata === 0) {
interviewteacher({ // interviewteacher({
uid: uid, // uid: uid,
survey: { // survey: {
[userInfo.user_id]: date, // [setuserid.user_id]: date,
}, // },
}).then( // }).then(
(res) => { // (res) => {
if (res.msg === 'ok') { // if (res.msg === 'ok') {
message.success('添加成功') // message.success('')
onClose() // onClose()
} // }
}, // },
(err) => { // (err) => {
message.error('网络加载失败,请稍后再试') // message.error('')
} // }
) // )
} else { // } else {
upteacher({ upteacher({
uid: uid, uid: uid,
[userInfo.user_id]: date, survey: date,
relevancy_id: setuserid.relevancy_id
}).then( }).then(
(res) => { (res) => {
if (res.msg === 'ok') { if (res.msg === 'ok') {
message.success('修改成功') message.success('修改成功')
onClose() onClose()
}else {
message.success(res.msg)
} }
}, },
(err) => { (err) => {
message.error('网络加载失败,请稍后再试') message.error('网络加载失败,请稍后再试')
} }
) )
} // }
} }
return ( return (

View File

@ -1,4 +1,9 @@
import React, { useState, useEffect } from 'react' import React, {
useState,
useEffect,
forwardRef,
useImperativeHandle,
} from 'react'
import { Button, Collapse, Divider, message, Tag, Empty } from 'antd' import { Button, Collapse, Divider, message, Tag, Empty } from 'antd'
import Enterthenextstage from '../../Enterthenextstage' import Enterthenextstage from '../../Enterthenextstage'
import { record, teacherstate } from '../../../util/requestURL' import { record, teacherstate } from '../../../util/requestURL'
@ -13,17 +18,23 @@ import {
const { Panel } = Collapse const { Panel } = Collapse
export default function InterviewTabs({ const InterviewTabs = ({ data, Tabsnum, setisfeedback, seefeedback },ref) => {
data,
Tabsnum,
setisfeedback,
seefeedback,
}) {
const [isenterthenextstage, setisenterthenextstage] = useState(false) const [isenterthenextstage, setisenterthenextstage] = useState(false)
const [datalist, setdatalist] = useState([]) const [datalist, setdatalist] = useState([])
let userinfo = storageUtils.getUser() let userinfo = storageUtils.getUser()
console.log(ref)
useImperativeHandle(ref, () => ({
getData: updatarecord
}))
useEffect(() => { useEffect(() => {
if (Tabsnum === '2') { if (Tabsnum === '2') {
updatarecord()
}
}, [Tabsnum])
const updatarecord = () => {
record({ uid: data.uid }).then( record({ uid: data.uid }).then(
(res) => { (res) => {
// console.log(res) // console.log(res)
@ -34,7 +45,6 @@ export default function InterviewTabs({
} }
) )
} }
}, [Tabsnum])
const handelFeedback = (record) => { const handelFeedback = (record) => {
teacherstate({ teacherstate({
@ -134,7 +144,7 @@ export default function InterviewTabs({
/>{' '} />{' '}
未评估 未评估
</div> </div>
) : item.teacher_back === ) : items.teacher_back ===
1 ? ( 1 ? (
<div> <div>
<LikeOutlined <LikeOutlined
@ -144,7 +154,7 @@ export default function InterviewTabs({
/>{' '} />{' '}
满意 满意
</div> </div>
) : item.teacher_back === ) : items.teacher_back ===
2 ? ( 2 ? (
<div> <div>
<LikeOutlined <LikeOutlined
@ -154,7 +164,7 @@ export default function InterviewTabs({
/>{' '} />{' '}
非常满意 非常满意
</div> </div>
) : item.teacher_back === ) : items.teacher_back ===
3 ? ( 3 ? (
<div> <div>
<DislikeOutlined <DislikeOutlined
@ -178,8 +188,7 @@ export default function InterviewTabs({
</div> </div>
<div> <div>
{item.back_status === {!items.type ? (
0 ? (
<div> <div>
<Button <Button
type="link" type="link"
@ -191,12 +200,20 @@ export default function InterviewTabs({
> >
催促反馈 催促反馈
</Button> </Button>
{userinfo.id === {userinfo.user_id ===
items.user_id || userinfo.name === 'root' ? ( items.user_id ||
userinfo.name ===
'root' ? (
<Button <Button
type="link" type="link"
onClick={() => { onClick={() => {
setisfeedback() setisfeedback(
{
...items,
relevancy_id:
item.relevancy_id,
}
)
}} }}
> >
填写反馈 填写反馈
@ -210,7 +227,13 @@ export default function InterviewTabs({
<Button <Button
type="link" type="link"
onClick={() => { onClick={() => {
seefeedback() seefeedback(
{
...items,
relevancy_id:
item.relevancy_id,
}
)
}} }}
> >
查看反馈 查看反馈
@ -255,3 +278,5 @@ export default function InterviewTabs({
</div> </div>
) )
} }
export default forwardRef(InterviewTabs)

View File

@ -31,7 +31,7 @@ import {
const { Option } = Select const { Option } = Select
const dateFormat = 'YYYY/MM/DD' const dateFormat = 'YYYY/MM/DD'
export default function OfferTabs({ data }) { export default function OfferTabs({ data , updata }) {
const [OfferPostList, setOfferPostList] = useState([]) //offer const [OfferPostList, setOfferPostList] = useState([]) //offer
const [Offerstate, setOfferstate] = useState(false) const [Offerstate, setOfferstate] = useState(false)
const [offerdata, setoffdata] = useState({ const [offerdata, setoffdata] = useState({
@ -92,8 +92,11 @@ export default function OfferTabs({ data }) {
job_id: data.job_id, job_id: data.job_id,
}).then( }).then(
(res) => { (res) => {
console.log(res.data)
// setOfferPostList(res.data) if(res.msg === 'ok'){
message.success('操作成功')
updata();
}
}, },
(err) => { (err) => {
message.error('网络加载错误,请稍后再试') message.error('网络加载错误,请稍后再试')
@ -153,7 +156,15 @@ export default function OfferTabs({ data }) {
<div className="OfferTabs-title-box">入职记录</div> <div className="OfferTabs-title-box">入职记录</div>
<div className="OfferTabs-border-box display"> <div className="OfferTabs-border-box display">
<span>尚未确定候选人是否入职</span> {
data.interview_stage === 7 ? (
<span className=''>已入职</span>
): data.interview_stage === 11 ? (
<span className=''>已淘汰</span>
): (
<span className=''>尚未确定候选人是否入职</span>
)
}
<div className=""> <div className="">
<Button <Button
onClick={() => { onClick={() => {
@ -164,7 +175,7 @@ export default function OfferTabs({ data }) {
</Button> </Button>
<Button <Button
onClick={() => { onClick={() => {
postupdataentry(6) postupdataentry(11)
}} }}
> >
放弃入职 放弃入职

View File

@ -1,4 +1,4 @@
import React, { useState, useEffect } from 'react' import React, { useState, useEffect, useRef } from 'react'
import { Button, Form, Input, Modal, Tabs, Badge, message, Avatar } from 'antd' import { Button, Form, Input, Modal, Tabs, Badge, message, Avatar } from 'antd'
import Steptone from '../Steptone' import Steptone from '../Steptone'
import InterviewTabs from './InterviewTabs' import InterviewTabs from './InterviewTabs'
@ -37,6 +37,8 @@ export default function InterviewerInfoPop({
const [isremarks, setisremarks] = useState(false) const [isremarks, setisremarks] = useState(false)
const [Tabsnum, setTabsnum] = useState(0) const [Tabsnum, setTabsnum] = useState(0)
const [isfeedback, setisfeedback] = useState(false) const [isfeedback, setisfeedback] = useState(false)
const [userid , setuserid] = useState();
const updatarecord = useRef()
const onChange = (key) => { const onChange = (key) => {
// console.log(key) // console.log(key)
@ -88,6 +90,11 @@ export default function InterviewerInfoPop({
setisremarks(false) setisremarks(false)
} }
//
const updatarecordlist = ()=>{
updatarecord.current.getData();
}
return ( return (
<div> <div>
<Modal <Modal
@ -492,18 +499,24 @@ export default function InterviewerInfoPop({
<InterviewTabs <InterviewTabs
data={candidateinfo} data={candidateinfo}
Tabsnum={Tabsnum} Tabsnum={Tabsnum}
setisfeedback={() => { setuserid= {userid}
ref={updatarecord}
setisfeedback={(userid) => {
setisfeedback(true) setisfeedback(true)
setuserid(userid)
}} }}
seefeedback={() => { seefeedback={(userid) => {
setisfeedback(true) setisfeedback(true)
postfindcriterion() postfindcriterion()
setuserid(userid)
}} }}
/> />
</div> </div>
</TabPane> </TabPane>
<TabPane tab="Offer/录用" key="4"> <TabPane tab="Offer/录用" key="4">
<OfferTabs data={candidateinfo} /> <OfferTabs data={candidateinfo} updata={()=>{
postfindcriterion()
}}/>
</TabPane> </TabPane>
<TabPane <TabPane
@ -551,7 +564,7 @@ export default function InterviewerInfoPop({
type="primary" type="primary"
block block
onClick={handelNextstage} onClick={handelNextstage}
disabled={candidateinfo.interview_stage === 3 && candidateinfo.teacher_state !== 2? true:false} disabled={candidateinfo.interview_stage === 3 && candidateinfo.teacher_state !== 2? true: candidateinfo.interview_stage === 7 || candidateinfo.interview_stage === 11 ? true : false}
> >
进入下一阶段 进入下一阶段
</Button> </Button>
@ -559,7 +572,7 @@ export default function InterviewerInfoPop({
'' ''
)} )}
{candidateinfo.teacher_state != 2 ? ( {/* {candidateinfo.teacher_state != 2 ? (
<Button <Button
block block
onClick={() => { onClick={() => {
@ -579,7 +592,7 @@ export default function InterviewerInfoPop({
> >
修改反馈 修改反馈
</Button> </Button>
)} )} */}
<Button <Button
block block
@ -629,9 +642,11 @@ export default function InterviewerInfoPop({
<Feedback <Feedback
visible={isfeedback} visible={isfeedback}
uid={candidateinfo.uid} uid={candidateinfo.uid}
setuserid= {userid}
onClose={() => { onClose={() => {
setisfeedback(false) setisfeedback(false)
postfindcriterion() postfindcriterion()
updatarecordlist()
}} }}
/> />
</div> </div>

View File

@ -0,0 +1,9 @@
.StandardResume-box .ant-row { margin-left: 0 !important; margin-right: 0 !important; }
.resume-pop-box .ant-tabs-content-holder { overflow-y: scroll; max-height: calc( 100vh - 375px); }
.from-label {padding: 0 0 8px; line-height: 1.5715; white-space: initial; text-align: left; display: inline-block; margin-top: 12px;}
.textalignright { text-align: right; }
.select-box div {
width: 100%;
}
.StandardResume-box { width: 100%; }

View File

@ -0,0 +1,540 @@
import React, { useState, useEffect } from 'react'
import {
Form,
Input,
Row,
Col,
Divider,
Button,
Space,
DatePicker,
Select,
} from 'antd'
import { PlusOutlined, MinusCircleOutlined } from '@ant-design/icons'
import 'moment/locale/zh-cn'
import locale from 'antd/es/date-picker/locale/zh_CN'
import moment from 'moment'
import './index.css'
const dateFormat = 'YYYY-MM-DD'
export default function StandardResume({ data, updataPosition }) {
const [form] = Form.useForm()
const { TextArea } = Input
const { Option } = Select
const { RangePicker } = DatePicker
const typelist = {
work_list: {
company_name: '',
duty: '',
position_name: '',
},
project_undergo: {
time: '',
name: '',
work: '',
comment: '',
duty: '',
},
language: {
language_name: '',
has_sleep: 1,
reading: 1,
writing: 1,
},
remembrance: {
prize_name: '',
prize_time: '',
},
}
const [worklist, setworklist] = useState([])
const [projectundergo, setprojectundergo] = useState([])
const [language, setlanguage] = useState([])
const [remembrance, setremembrance] = useState([])
useEffect(() => {
// updataPosition({...data.data,work_list:worklist,project_undergo:projectundergo,language_list:language,remembrance_list:remembrance})
}, [])
const onValuesChange = (type, e, valuestype, index) => {
switch (type) {
case 'work_list':
const newworklist = worklist.map((item, key) => {
if (index === key) return { ...item, [valuestype]: e }
else return item
})
setworklist(newworklist)
updataPosition({ work_list: newworklist })
break
case 'project_undergo':
const newprojectundergo = projectundergo.map((item, key) => {
if (index === key)
return valuestype !== 'time'
? { ...item, [valuestype]: e }
: { ...item, [valuestype]: e }
else return item
})
setprojectundergo(newprojectundergo)
updataPosition({ project_undergo: newprojectundergo })
break
case 'language':
const newlanguage = language.map((item, key) => {
if (index === key) return { ...item, [valuestype]: e }
else return item
})
setlanguage(newlanguage)
updataPosition({ language_list: newlanguage })
break
case 'remembrance':
const newremembrance = remembrance.map((item, key) => {
if (index === key)
return valuestype !== 'prize_time'
? { ...item, [valuestype]: e }
: { ...item, [valuestype]: e }
else return item
})
setremembrance(newremembrance)
updataPosition({ remembrance_list: newremembrance })
break
default:
break
}
}
const add = (type) => {
switch (type) {
case 'work_list':
const newworklist = [...worklist, typelist[type]]
setworklist(newworklist)
break
case 'project_undergo':
const newprojectundergo = [...projectundergo, typelist[type]]
setprojectundergo(newprojectundergo)
break
case 'language':
const newlanguage = [...language, typelist[type]]
setlanguage(newlanguage)
break
case 'remembrance':
const newremembrance = [...remembrance, typelist[type]]
setremembrance(newremembrance)
break
default:
break
}
}
const remove = (type, index) => {
switch (type) {
case 'work_list':
const newworklist = worklist.filter((item, key) => {
return key !== index
})
setworklist(newworklist)
break
case 'project_undergo':
const newprojectundergo = projectundergo.filter((item, key) => {
return key !== index
})
setprojectundergo(newprojectundergo)
break
case 'language':
const newlanguage = language.filter((item, key) => {
return key !== index
})
setlanguage(newlanguage)
break
case 'remembrance':
const newremembrance = remembrance.filter((item, key) => {
return key !== index
})
setremembrance(newremembrance)
break
default:
break
}
}
return (
<div>
<div className="StandardResume-box">
{/* <Form layout="vertical" onValuesChange={onValuesChange}> */}
<Divider orientation="left">工作经验</Divider>
{worklist.map((item, key) => {
return (
<Row gutter={24} align="baseline" key={key}>
<Col span={11} className="marginbottom10">
<label className="from-label">公司名称</label>
<Input
placeholder="请输入公司名称"
value={item.company_name}
onChange={(e) => {
onValuesChange(
'work_list',
e.target.value,
'company_name',
key
)
}}
/>
</Col>
<Col span={11} className="marginbottom10">
<label className="from-label">职位名称</label>
<Input
placeholder="请输入职位名称"
value={item.position_name}
onChange={(e) => {
onValuesChange(
'work_list',
e.target.value,
'position_name',
key
)
}}
/>
</Col>
<Col span={2} className="textalignright">
<MinusCircleOutlined
onClick={() => remove('work_list', key)}
/>
</Col>
<Col span={24} className="marginbottom10">
<label className="from-label">工作职责</label>
<TextArea
rows={4}
placeholder="请输入工作职责"
value={item.duty}
onChange={(e) => {
onValuesChange(
'work_list',
e.target.value,
'duty',
key
)
}}
/>
</Col>
</Row>
)
})}
<Col span={24}>
<Form.Item>
<Button
type="dashed"
onClick={() => add('work_list')}
block
icon={<PlusOutlined />}
>
添加
</Button>
</Form.Item>
</Col>
<Divider orientation="left">项目经验</Divider>
{projectundergo.map((item, key) => {
return (
<Row key={key} gutter={24} align="baseline">
<Col span={12} className="marginbottom10">
<label className="from-label">起止时间 </label>
<div>
<RangePicker
locale={locale}
picker="month"
allowClear={false}
value={
item.time.length > 0
? [
moment(
item.time.split(
'/'
)[0],
dateFormat
),
moment(
item.time.split(
'/'
)[1],
dateFormat
),
]
: ''
}
onChange={(date, dateString) => {
console.log(dateString)
onValuesChange(
'project_undergo',
dateString[0] +
'/' +
dateString[1],
'time',
key
)
}}
/>
</div>
</Col>
<Col span={12} className="textalignright">
<MinusCircleOutlined
onClick={() =>
remove('project_undergo', key)
}
/>
</Col>
<Col span={12} className="marginbottom10">
<label className="from-label">项目名称</label>
<Input
placeholder="参与项目"
onChange={(e) => {
onValuesChange(
'project_undergo',
e.target.value,
'name',
key
)
}}
/>
</Col>
<Col span={12} className="marginbottom10">
<label className="from-label">职务</label>
<Input
placeholder="请输入职务名称"
onChange={(e) => {
onValuesChange(
'project_undergo',
e.target.value,
'work',
key
)
}}
/>
</Col>
<Col span={24} className="marginbottom10">
<label className="from-label">项目介绍</label>
<TextArea
rows={4}
placeholder="内容"
onChange={(e) => {
onValuesChange(
'project_undergo',
e.target.value,
'comment',
key
)
}}
/>
</Col>
<Col span={24} className="marginbottom10">
<label className="from-label">项目中职责</label>
<TextArea
rows={4}
placeholder="项目中职责"
onChange={(e) => {
onValuesChange(
'project_undergo',
e.target.value,
'duty',
key
)
}}
/>
</Col>
</Row>
)
})}
<Col span={24}>
<Form.Item>
<Button
type="dashed"
onClick={() => add('project_undergo')}
block
icon={<PlusOutlined />}
>
添加
</Button>
</Form.Item>
</Col>
<Divider orientation="left">语言能力</Divider>
{language.map((item, key) => {
return (
<Row key={key} gutter={24} align="baseline">
<Col span={11} className="marginbottom10">
<label className="from-label">语言类型</label>
<Input
placeholder="请输入掌握语言类型"
onChange={(e) => {
onValuesChange(
'language',
e.target.value,
'language_name',
key
)
}}
/>
</Col>
<Col span={11} className="marginbottom10">
<label className="from-label">掌握程度</label>
<div className="select-box">
<Select
placeholder="请选择"
onChange={(e) => {
onValuesChange(
'language',
e,
'has_sleep',
key
)
}}
>
<Option value={'初级'}>初级</Option>
<Option value={'中级'}>中级</Option>
<Option value={'高级'}>高级</Option>
</Select>
</div>
</Col>
<Col span={2} className="textalignright">
<MinusCircleOutlined
onClick={() => remove('language', key)}
/>
</Col>
<Col span={11} className="marginbottom10">
<label className="from-label">听说</label>
<div className="select-box">
<Select
placeholder="请选择"
onChange={(e) => {
onValuesChange(
'language',
e,
'reading',
key
)
}}
>
<Option value={'初级'}>初级</Option>
<Option value={'中级'}>中级</Option>
<Option value={'高级'}>高级</Option>
</Select>
</div>
</Col>
<Col span={11} className="marginbottom10">
<label className="from-label">读写</label>
<div className="select-box">
<Select
placeholder="请选择"
onChange={(e) => {
onValuesChange(
'language',
e,
'writing',
key
)
}}
>
<Option value={'初级'}>初级</Option>
<Option value={'中级'}>中级</Option>
<Option value={'高级'}>高级</Option>
</Select>
</div>
</Col>
</Row>
)
})}
<Col span={24}>
<Form.Item>
<Button
type="dashed"
onClick={() => add('language')}
block
icon={<PlusOutlined />}
>
添加
</Button>
</Form.Item>
</Col>
<Divider orientation="left">自我描述</Divider>
<Row gutter={24} align="baseline">
<Col span={24}>
<label className="from-label">自我描述</label>
<TextArea
rows={4}
placeholder="请输入自我描述"
onChange={(e) => {
updataPosition({ review: e.target.value })
}}
/>
</Col>
</Row>
<Divider orientation="left">获奖经历</Divider>
{remembrance.map((item, key) => {
return (
<Row key={key} gutter={24} align="baseline">
<Col span={11} className="marginbottom10">
<label className="from-label">获奖时间</label>
<div className="select-box">
<DatePicker
locale={locale}
onChange={(date, dateString) => {
onValuesChange(
'remembrance',
dateString[0],
'prize_time',
key
)
}}
/>
</div>
</Col>
<Col span={11} className="marginbottom10">
<label className="from-label">奖项名称</label>
<Input
placeholder="请输入奖项名称"
onChange={(e) => {
onValuesChange(
'remembrance',
e.target.value,
'prize_name',
key
)
}}
/>
</Col>
<Col span={2} className="textalignright">
<Form.Item label=" ">
<MinusCircleOutlined
onClick={() =>
remove('remembrance', key)
}
/>
</Form.Item>
</Col>
</Row>
)
})}
<Col span={24}>
<Form.Item>
<Button
type="dashed"
onClick={() => add('remembrance')}
block
icon={<PlusOutlined />}
>
添加
</Button>
</Form.Item>
</Col>
</div>
</div>
)
}

View File

@ -0,0 +1,25 @@
.resume-pop-box {
display: flex;
justify-content: space-between;
}
.resume-img-box {
width: 40%;
}
.resume-content-box {
/* width: 55%; */
}
.resume-energy-box2 {
width: 100%;
}
.ant-tabs {
width: 80%;
}
.resume-right-box {
width: 20%;
background-color: #eee;
margin-top: 46px;
}
.resume-xq-box2 { width: 100%; height: 625px; overflow-x: hidden; overflow-y: auto; }
.resume-energy-box2 .ant-tabs { width: 100%; display: flex; justify-content: space-between; }
.ResumeUpload-box .resume-pop-box .ant-tabs-content-holder{overflow-y:scroll; max-height: calc( 100vh - 375px);}

View File

@ -0,0 +1,267 @@
import React, { useState, Component } from 'react'
import {
Form,
Input,
Modal,
Radio,
Row,
Col,
Select,
DatePicker,
Tabs,
Button,
message,
} from 'antd'
import 'moment/locale/zh-cn'
import moment from 'moment'
import locale from 'antd/es/date-picker/locale/zh_CN'
import StandardResume from './StandardResume'
import { manual_resume } from '../../util/requestURL'
import './index.css'
const { Option } = Select
const dateFormat = 'YYYY-MM-DD'
export default class Manualaddcandidate extends Component {
state = {
hope_money: '',
feedback: 0,
name: '',
phone: '',
job_name: '',
work_exp: 0,
work_undergo: [],
project_undergo: [],
work_list: [],
school: '',
at_school: '',
specialty: '',
specialty_do: [],
mail: '',
gender: '',
age: 0,
nation: '',
review: '',
pass_text: '',
file_url: '',
now_address: '',
birthday: '',
accounts: '',
remembrance: [],
language: [],
}
updataPosition = (item) => {
this.setState(item, () => {
// console.log(this.state)
})
}
onValuesChange = (item) => {
this.setState(item, () => {
// console.log(this.state)
})
}
render() {
const { visible, onCancel } = this.props
return (
<div className="ResumeUpload-box">
<Modal
width={'1600px'}
visible={visible}
closable={false}
maskClosable={false}
destroyOnClose={true}
footer={[
<Button key={'cancel'} onClick={onCancel}>
取消
</Button>,
<Button
key={'ok'}
type="primary"
onClick={() => {
var data = this.state
console.log(data)
if(data.name === "" || data.job_name === "" || data.phone === "" || data.mail ===""){
message.warning('姓名,职位,电话,邮箱必填')
return;
}
manual_resume({data_in:this.state}).then((res)=>{
if(res.msg === "ok"){
message.success("添加成功!")
onCancel();
}
},(err)=>{
message.error('网络加载错误,请稍后再试')
})
}}
>
保存
</Button>,
]}
>
<div className="resume-pop-box">
{/* <div className='resume-img-box'>
</div> */}
<div className="resume-content-box">
<Form
onValuesChange={this.onValuesChange}
layout="vertical"
name="form_in_modal"
>
<Row gutter={24}>
<Col span={6}>
<Form.Item
name="name"
rules={[
{
required: true,
message: '填写姓名',
},
]}
>
<Input placeholder="填写姓名" />
</Form.Item>
</Col>
<Col span={6}>
<Form.Item
name="job_name"
rules={[
{
required: true,
message: '请填写岗位',
},
]}
>
<Input
type="textarea"
placeholder="填写岗位"
/>
</Form.Item>
</Col>
<Col span={6}>
<Form.Item name="gender">
<Select
placeholder="选择性别"
optionFilterProp="children"
>
<Option value={0}></Option>
<Option value={1}></Option>
</Select>
</Form.Item>
</Col>
<Col span={6}>
<Form.Item name="birthday">
<DatePicker
placeholder="请选择出生年月"
locale={locale}
onChange={(
dates,
dateStrings
) => {
this.updataPosition({
birthday: dateStrings,
})
}}
/>
</Form.Item>
</Col>
<Col span={6}>
<Form.Item
name="phone"
rules={[
{
required: true,
message: '请输入手机号',
},
]}
>
<Input
addonBefore={'+86'}
style={{
width: '100%',
}}
/>
</Form.Item>
</Col>
<Col span={6}>
<Form.Item
name="mail"
rules={[
{
type: 'email',
message: '邮箱格式错误!',
},
{
required: true,
message: '请输入邮箱!',
},
]}
>
<Input placeholder="请填写邮箱"/>
</Form.Item>
</Col>
<Col span={4}>
<Form.Item name="work_exp">
<Select
placeholder="选择工作年限"
optionFilterProp="children"
>
<Option value={0}>
应届生
</Option>
<Option value={1}>1-3</Option>
<Option value={2}>3-5</Option>
<Option value={3}>
5年以上
</Option>
</Select>
</Form.Item>
</Col>
<Col span={4}>
<Form.Item name="education">
<Select
placeholder="选择学历"
optionFilterProp="children"
>
<Option value={1}>大专</Option>
<Option value={2}>本科</Option>
<Option value={3}>硕士</Option>
<Option value={4}>博士</Option>
</Select>
</Form.Item>
</Col>
<Col span={4}>
<Form.Item
name="now_address"
rules={[
{
message: '填写现住地址',
},
]}
>
<Input placeholder="填写现住地址" />
</Form.Item>
</Col>
</Row>
<div className="resume-energy-box2">
<div className="resume-xq-box2">
<StandardResume
data = {this.state}
updataPosition={this.updataPosition}
/>
</div>
</div>
</Form>
</div>
</div>
</Modal>
</div>
)
}
}

View File

@ -9,6 +9,7 @@ import {
AlertOutlined, AlertOutlined,
} from '@ant-design/icons' } from '@ant-design/icons'
const { Search } = Input const { Search } = Input
// const suffix = ( // const suffix = (
// <AudioOutlined // <AudioOutlined

View File

@ -18,11 +18,10 @@ export default class Originalresume extends Component {
var url = "" var url = ""
if(JSON.stringify(data) != "{}"){ if(JSON.stringify(data) != "{}"){
const urlarr = data.file_url.split('hrms/') const urlarr = data.file_url.split('hrms/')
// url = 'http://localhost:3000/pdf/hrms/' + decodeURIComponent(urlarr[1]) // url = './pdf/hrms/' + decodeURIComponent(urlarr[1])
url = 'http://10.0.0.4/pdf/hrms/' + decodeURIComponent(urlarr[1]) url = data.file_url
} }
return ( return (
<div> <div>
{ {

View File

@ -1,24 +1,29 @@
import React, { useState } from 'react' import React, { useState } from 'react'
import ResumeUpload from '../../pages/ResumeUpload' import ResumeUpload from '../../pages/ResumeUpload'
import Uploadresume from '../Uploadresume' import Uploadresume from '../Uploadresume'
import Manualaddcandidate from '../Manualaddcandidate'
import { Button, Dropdown, Menu } from 'antd' import { Button, Dropdown, Menu } from 'antd'
import { useNavigate } from 'react-router-dom' import { useNavigate } from 'react-router-dom'
import { PlusOutlined } from '@ant-design/icons' import { PlusOutlined } from '@ant-design/icons'
import PubSub from 'pubsub-js'
export default function ResumeUploadPop() { export default function ResumeUploadPop() {
const navigate = useNavigate() const navigate = useNavigate()
const [visible, setVisible] = useState(false) const [visible, setVisible] = useState(false)
const [usvisible, setusvisible] = useState(false) const [usvisible, setusvisible] = useState(false)
const [Manualvisible,setManualvisible] = useState(false)
// //
const [data, setdata] = useState([]) const [data, setdata] = useState([])
const onCreate = (values) => { const onCreate = (values) => {
console.log('Received values of form: ', values)
setVisible(false) setVisible(false)
} }
const ManualonCreate = () =>{
setManualvisible(false)
}
const UsonCreate = (values) => { const UsonCreate = (values) => {
setusvisible(false) setusvisible(false)
} }
@ -26,7 +31,8 @@ export default function ResumeUploadPop() {
const onMenuClick = (e) => { const onMenuClick = (e) => {
console.log('click', e) console.log('click', e)
if (e.key == 1) { if (e.key == 1) {
setVisible(true) // setVisible(true)
setManualvisible(true)
} else if (e.key == 2) { } else if (e.key == 2) {
// //
navigate('/admin/position/addposition') navigate('/admin/position/addposition')
@ -39,10 +45,10 @@ export default function ResumeUploadPop() {
<Menu <Menu
onClick={onMenuClick} onClick={onMenuClick}
items={[ items={[
// { {
// key: '1', key: '1',
// label: '', label: '添加候选人',
// }, },
{ {
key: '4', key: '4',
label: '上传简历', label: '上传简历',
@ -82,6 +88,19 @@ export default function ResumeUploadPop() {
}} }}
/> />
<Manualaddcandidate
visible={Manualvisible}
onCreate={ManualonCreate}
onCancel={() => {
PubSub.publish('updatacandidate', {isupdata: true})
setManualvisible(false)
}}
onReupload={() => {
//
setManualvisible(false)
}}
/>
<Uploadresume <Uploadresume
visible={usvisible} visible={usvisible}
onCreate={UsonCreate} onCreate={UsonCreate}
@ -89,6 +108,7 @@ export default function ResumeUploadPop() {
setusvisible(false) setusvisible(false)
setVisible(true) setVisible(true)
setdata(data) setdata(data)
PubSub.publish('updatacandidate', {isupdata: true})
}} }}
onCancel={() => { onCancel={() => {
setusvisible(false) setusvisible(false)

View File

@ -37,9 +37,9 @@ export default class Candidate extends Component {
const props = { const props = {
name: 'file', name: 'file',
multiple: true, multiple: true,
action: 'http://10.0.0.240:7800/api/v1/itr/file_to_hw', // action: 'http://10.0.0.240:7800/api/v1/itr/file_to_hw',
// action: 'http://myip.legu.cc:7800/api/v1/itr/file_to_hw', // action: 'http://myip.legu.cc:7800/api/v1/itr/file_to_hw',
// action: 'http://10.0.0.4:7800/api/v1/itr/file_to_hw', action: 'http://10.0.0.4:7800/api/v1/itr/file_to_hw',
headers: { headers: {
Authorization: token, Authorization: token,
}, },
@ -66,9 +66,9 @@ export default class Candidate extends Component {
candidatedata.data['uid'] = candidatedata.data['uid'] =
info.file.response.data.uid info.file.response.data.uid
candidatedata.data['owner_name'] = candidatedata.data['owner_name'] =
this.state.owner_name that.state.owner_name
candidatedata.data['resume_affix_id'] = candidatedata.data['resume_affix_id'] =
this.state.resume_affix_id that.state.resume_affix_id
that.props.onResumeUpload(candidatedata) that.props.onResumeUpload(candidatedata)
} }
} else { } else {
@ -115,9 +115,9 @@ export default class Candidate extends Component {
const propss = { const propss = {
name: 'file', name: 'file',
multiple: true, multiple: true,
action: 'http://10.0.0.240:7800/api/v1/itr/resume_affix', // action: 'http://10.0.0.240:7800/api/v1/itr/resume_affix',
// action: 'http://myip.legu.cc:7800/api/v1/itr/resume_affix', // action: 'http://myip.legu.cc:7800/api/v1/itr/resume_affix',
// action: 'http://10.0.0.4:7800/api/v1/itr/resume_affix', action: 'http://10.0.0.4:7800/api/v1/itr/resume_affix',
headers: { headers: {
Authorization: token, Authorization: token,
}, },

View File

@ -40,7 +40,7 @@ export default class ResumeUpload extends Component {
render(){ render(){
const { visible, onCancel, onCreate,onReupload, data } = this.props const { visible, onCancel, onCreate,onReupload, data } = this.props
// console.log(data)
return( return(
<div className="ResumeUpload-box"> <div className="ResumeUpload-box">
<Modal <Modal

View File

@ -38,6 +38,8 @@ export default class Candidate extends Component {
componentDidMount() { componentDidMount() {
PubSub.publish('headtitle', { headtitle: '候选人管理' }) PubSub.publish('headtitle', { headtitle: '候选人管理' })
getsection().then( getsection().then(
(res) => { (res) => {
const data = res.data const data = res.data
@ -93,8 +95,6 @@ export default class Candidate extends Component {
const onSelect = (selectedKeys, info) => { const onSelect = (selectedKeys, info) => {
// console.log(selectedKeys) // console.log(selectedKeys)
if(selectedKeys[0].length > 3){ if(selectedKeys[0].length > 3){
console.log(selectedKeys)
console.log(info.node.title)
this.setState({ this.setState({
job_names:info.node.title job_names:info.node.title
}) })
@ -106,6 +106,7 @@ export default class Candidate extends Component {
this.setState({ this.setState({
step: key, step: key,
}) })
this.updatainterviewstagenum()
} }
const treeSeletData = [ const treeSeletData = [

View File

@ -151,7 +151,7 @@ function Interview() {
// //
const onEditresume = (data) => { const onEditresume = (data) => {
setInterviewerInfo(false) setInterviewerInfo(false)
console.log(data) // console.log(data)
setTimeout(() => { setTimeout(() => {
setEditresume(true) setEditresume(true)
}, 500) }, 500)
@ -318,11 +318,15 @@ function Interview() {
render: (text, record, index) => ( render: (text, record, index) => (
<div className="font-size14 color1"> <div className="font-size14 color1">
{text.type === 0 ? ( {text.type === 0 ? (
<WarningOutlined style={{ color: '#f59f00' }} /> <div>
<WarningOutlined style={{ color: '#f59f00' }} /> &nbsp; 未全部反馈
</div>
) : ( ) : (
<LikeOutlined style={{ color: '#51cf66' }} /> <div>
<LikeOutlined style={{ color: '#51cf66' }} /> &nbsp; 已全部反馈
</div>
)} )}
&nbsp;{text.name}
</div> </div>
), ),
}, },
@ -338,13 +342,13 @@ function Interview() {
> >
查看详情 查看详情
</span> </span>
<span {/* <span
className="cursor" className="cursor"
style={{ margin: '0px 5px' }} style={{ margin: '0px 5px' }}
onClick={() => handelFeedback(record, index)} onClick={() => handelFeedback(record, index)}
> >
{text.type === 0 ? '催促反馈' : ''} {text.type === 0 ? '催促反馈' : ''}
</span> </span> */}
</div> </div>
), ),
}, },

View File

@ -23,16 +23,11 @@ import {
} from '@ant-design/icons' } from '@ant-design/icons'
import { interviewstagenu } from '../../../util/requestURL' import { interviewstagenu } from '../../../util/requestURL'
import { Link } from 'react-router-dom' import { Link } from 'react-router-dom'
import storageUtils from '../../../util/storageUtils'
import './index.css' import './index.css'
const { TabPane } = Tabs const { TabPane } = Tabs
const { CheckableTag } = Tag const { CheckableTag } = Tag
const tagsData = [ const tagsData = ['面试反馈', '安排面试', '通讯记录', '面试官拒绝面试', '其它']
'面试反馈',
'安排面试',
'通讯记录',
'面试官拒绝面试',
'其它',
]
export default class Overview extends Component { export default class Overview extends Component {
state = { state = {
@ -52,14 +47,17 @@ export default class Overview extends Component {
}, },
], ],
data: [], data: [],
userinfo:{rank:1}
} }
componentDidMount() { componentDidMount() {
PubSub.publish('headtitle', { headtitle: '总览' }) PubSub.publish('headtitle', { headtitle: '总览' })
let userinfo = storageUtils.getUser()
interviewstagenu({ date: {} }).then( interviewstagenu({ date: {} }).then(
(res) => { (res) => {
this.setState({ this.setState({
data: res.data, data: res.data,
userinfo: userinfo,
}) })
}, },
(err) => { (err) => {
@ -69,7 +67,7 @@ export default class Overview extends Component {
} }
render() { render() {
const { data } = this.state const { data, userinfo } = this.state
const onChange = (key) => { const onChange = (key) => {
console.log(key) console.log(key)
@ -115,11 +113,19 @@ export default class Overview extends Component {
}} }}
/> />
</div> </div>
<div className="Overview-card-list"> <div className="Overview-card-list">
{userinfo.rank === 1 ? (
<Link to={'/admin/candidate'}> <Link to={'/admin/candidate'}>
<p>{data[1]}</p> <p>{data[1]}</p>
<span>今日待筛选申请</span> <span>今日待筛选申请</span>
</Link> </Link>
) : (
<Link to={'/admin/Interview_manager'}>
<p>{data[1]}</p>
<span>今日待筛选申请</span>
</Link>
)}
</div> </div>
</div> </div>
<div className="xian"></div> <div className="xian"></div>
@ -133,10 +139,17 @@ export default class Overview extends Component {
/> />
</div> </div>
<div className="Overview-card-list"> <div className="Overview-card-list">
{userinfo.rank === 1 ? (
<Link to={'/admin/interview'}> <Link to={'/admin/interview'}>
<p>{data.now}</p> <p>{data.now}</p>
<span>今日面试</span> <span>今日面试</span>
</Link> </Link>
) : (
<Link to={'/admin/Interview_manager'}>
<p>{data.now}</p>
<span>今日面试</span>
</Link>
)}
</div> </div>
</div> </div>
</div> </div>
@ -147,16 +160,30 @@ export default class Overview extends Component {
</div> </div>
<div className="Overview-card-list-box2"> <div className="Overview-card-list-box2">
<div className="Overview-card-list2"> <div className="Overview-card-list2">
{userinfo.rank === 1 ? (
<Link to={'/admin/candidate'}> <Link to={'/admin/candidate'}>
<p>{data.offer}</p> <p>{data.offer}</p>
<span>待发送Offer</span> <span>待发送Offer</span>
</Link> </Link>
) : (
<Link to={'/admin/Interview_manager'}>
<p>{data.offer}</p>
<span>待发送Offer</span>
</Link>
)}
</div> </div>
<div className="Overview-card-list2"> <div className="Overview-card-list2">
{userinfo.rank === 1 ? (
<Link to={'/admin/candidate'}> <Link to={'/admin/candidate'}>
<p>{data[6]}</p> <p>{data[6]}</p>
<span>待入职</span> <span>待入职</span>
</Link> </Link>
) : (
<Link to={'/admin/Interview_manager'}>
<p>{data[6]}</p>
<span>待入职</span>
</Link>
)}
</div> </div>
</div> </div>
</div> </div>
@ -167,22 +194,43 @@ export default class Overview extends Component {
</div> </div>
<div className="Overview-card-list-box2"> <div className="Overview-card-list-box2">
<div className="color8 Overview-card-list2"> <div className="color8 Overview-card-list2">
{userinfo.rank === 1 ? (
<Link to={'/admin/interview'}> <Link to={'/admin/interview'}>
<p>0</p> <p>0</p>
<span>待面试</span> <span>待面试</span>
</Link> </Link>
) : (
<Link to={'/admin/Interview_manager'}>
<p>0</p>
<span>待面试</span>
</Link>
)}
</div> </div>
<div className="Overview-card-list2"> <div className="Overview-card-list2">
{userinfo.rank === 1 ? (
<Link to={'/admin/interview'}> <Link to={'/admin/interview'}>
<p>0</p> <p>0</p>
<span>待反馈</span> <span>待反馈</span>
</Link> </Link>
) : (
<Link to={'/admin/Interview_manager'}>
<p>0</p>
<span>待反馈</span>
</Link>
)}
</div> </div>
<div className="Overview-card-list2"> <div className="Overview-card-list2">
{userinfo.rank === 1 ? (
<Link to={'/admin/candidate'}> <Link to={'/admin/candidate'}>
<p>0</p> <p>0</p>
<span>待处理</span> <span>待处理</span>
</Link> </Link>
) : (
<Link to={'/admin/Interview_manager'}>
<p>0</p>
<span>待处理</span>
</Link>
)}
</div> </div>
</div> </div>
</div> </div>

View File

@ -19,5 +19,5 @@
.Resumescreen-list-data-box .CandidateTable-owner { width: 10%; } .Resumescreen-list-data-box .CandidateTable-owner { width: 10%; }
.Resumescreen-list-data-box .CandidateTable-list-box { align-items: center; } .Resumescreen-list-data-box .CandidateTable-list-box { align-items: center; }
.Resumescreen-list-data-box .CandidateTable-info { margin-left: 0; } .Resumescreen-list-data-box .CandidateTable-info { margin-left: 0; }
.tongyi { color: rgb(12, 140, 246); }
.jvj { color: #ff4d4f; }

View File

@ -37,7 +37,8 @@ export default class Resumescreen extends Component {
hr_manner: 2, hr_manner: 2,
userInfo: storageUtils.getUser(), userInfo: storageUtils.getUser(),
interviewerInfo: false, interviewerInfo: false,
uid: 0 uid: 0,
types: true,
} }
componentDidMount() { componentDidMount() {
@ -55,15 +56,27 @@ export default class Resumescreen extends Component {
} }
Updatalist = () => { Updatalist = () => {
const { name, job_id, hr_manner, userInfo } = this.state const { name, job_id, hr_manner, userInfo, types } = this.state
interviewfind({ const interview_query = types === "true" ? (
interview_query: { {
interview_stage: 1, interview_stage: 1,
department: userInfo.user_id, department: userInfo.user_id,
name: name, name: name,
job_id: job_id, job_id: job_id,
hr_manner: hr_manner, hr_manner: hr_manner,
}, }
):(
{
department: userInfo.user_id,
name: name,
job_id: job_id,
hr_manner: hr_manner,
}
);
interviewfind({
interview_query: interview_query,
data_in: {}, data_in: {},
}).then( }).then(
(res) => { (res) => {
@ -75,19 +88,18 @@ export default class Resumescreen extends Component {
) )
interviewmannernum({ interviewmannernum({
interview_query: { data: {
interview_stage: 1,
department: userInfo.user_id,
name: name, name: name,
job_id: job_id job_id: job_id,
hr_manner: hr_manner,
department: userInfo.user_id,
}, },
data_in: {}, types: types,
}).then( }).then(
(res) => { (res) => {
console.log(res.data)
this.setState({ this.setState({
manner_2_num : res.data.manner_2_num, manner_2_num: res.data.manner_2_num,
manner_01_num : res.data.manner_01_num manner_01_num: res.data.manner_01_num,
}) })
}, },
(err) => {} (err) => {}
@ -95,14 +107,15 @@ export default class Resumescreen extends Component {
} }
onValuesChange = (e) => { onValuesChange = (e) => {
// console.log(e) // console.log(e)
this.setState(e,()=>{ this.setState(e, () => {
this.Updatalist() this.Updatalist()
}) })
} }
handeleditstate = (uid, hr_manner) => { handeleditstate = (uid, hr_manner) => {
const interview_stage = hr_manner === 1 ? 2 : 11
interviewupdate({ interviewupdate({
data_in: { hr_manner: hr_manner, interview_stage:2 }, data_in: { hr_manner: hr_manner, interview_stage: interview_stage },
interview_query: { uid: uid }, interview_query: { uid: uid },
}).then( }).then(
(res) => { (res) => {
@ -120,9 +133,21 @@ export default class Resumescreen extends Component {
} }
handelonChange = (e) => { handelonChange = (e) => {
const { hr_manner } = this.state
var newhr_manner = 0;
if(hr_manner === 2 && e === "true"){
newhr_manner = 2
}else if(hr_manner !== 2 && e === "true"){
newhr_manner = 2
}else if(hr_manner === 2 && e === "false" ){
newhr_manner = ""
}else {
newhr_manner = hr_manner
}
this.setState( this.setState(
{ {
hr_manner: e, types: e,
hr_manner: newhr_manner,
}, },
() => { () => {
this.Updatalist() this.Updatalist()
@ -130,16 +155,16 @@ export default class Resumescreen extends Component {
) )
} }
handelCandidateClick = (uid) =>{ handelCandidateClick = (uid) => {
console.log(uid)
this.setState({ this.setState({
interviewerInfo: true, interviewerInfo: true,
uid : uid uid: uid,
}) })
} }
render() { render() {
const { getjoblist, data, manner_2_num, manner_01_num } = this.state const { getjoblist, data, manner_2_num, manner_01_num, hr_manner } =
this.state
const onSearch = (value) => console.log(value) const onSearch = (value) => console.log(value)
return ( return (
<div className="Resumescreen-box"> <div className="Resumescreen-box">
@ -193,7 +218,7 @@ export default class Resumescreen extends Component {
<div className="Resumescreen-list-data-box"> <div className="Resumescreen-list-data-box">
<div className="Resumescreen-list-tab-box"> <div className="Resumescreen-list-tab-box">
<Tabs <Tabs
defaultActiveKey="2" defaultActiveKey={true}
onChange={(e) => this.handelonChange(e)} onChange={(e) => this.handelonChange(e)}
> >
<Tabs.TabPane <Tabs.TabPane
@ -205,7 +230,7 @@ export default class Resumescreen extends Component {
<div>待筛选的候选人</div> <div>待筛选的候选人</div>
</div> </div>
} }
key={2} key={true}
></Tabs.TabPane> ></Tabs.TabPane>
<Tabs.TabPane <Tabs.TabPane
tab={ tab={
@ -216,7 +241,7 @@ export default class Resumescreen extends Component {
<div>筛选记录</div> <div>筛选记录</div>
</div> </div>
} }
key="" key={false}
></Tabs.TabPane> ></Tabs.TabPane>
</Tabs> </Tabs>
</div> </div>
@ -241,7 +266,9 @@ export default class Resumescreen extends Component {
className="CandidateTable-list-box" className="CandidateTable-list-box"
key={item.uid} key={item.uid}
onClick={() => onClick={() =>
this.handelCandidateClick(item.uid) this.handelCandidateClick(
item.uid
)
} }
> >
<div className="CandidateTable-info-box"> <div className="CandidateTable-info-box">
@ -354,10 +381,13 @@ export default class Resumescreen extends Component {
{item.interview_stage} {item.interview_stage}
</span> </span>
</div> </div>
<div className="CandidateTable-owner"> {hr_manner === 2 ? (
<div className="CandidateTable-owner textindent7">
<Button <Button
type="text" type="text"
style={{ color: '#0c8cf6' }} style={{
color: '#0c8cf6',
}}
onClick={(e) => { onClick={(e) => {
e.stopPropagation() e.stopPropagation()
this.handeleditstate( this.handeleditstate(
@ -370,7 +400,9 @@ export default class Resumescreen extends Component {
</Button> </Button>
<Button <Button
type="text" type="text"
style={{ color: '#0c8cf6' }} style={{
color: '#0c8cf6',
}}
onClick={(e) => { onClick={(e) => {
e.stopPropagation() e.stopPropagation()
this.handeleditstate( this.handeleditstate(
@ -382,6 +414,19 @@ export default class Resumescreen extends Component {
拒绝 拒绝
</Button> </Button>
</div> </div>
) : item.hr_manner === 1 ? (
<div className="CandidateTable-owner">
<span className="tongyi">
同意
</span>
</div>
) : (
<div className="CandidateTable-owner">
<span className="jvj">
拒绝
</span>
</div>
)}
</div> </div>
) )
}) })
@ -407,7 +452,6 @@ export default class Resumescreen extends Component {
interviewerInfo: false, interviewerInfo: false,
}) })
}} }}
/> />
</div> </div>
) )

View File

@ -124,6 +124,8 @@
.talentpool-table-action { .talentpool-table-action {
display: flex; display: flex;
justify-content: space-between;
align-items: center;
border-bottom: 1px solid #f4f4f5; padding: 10px 0; border-bottom: 1px solid #f4f4f5; padding: 10px 0;
} }

View File

@ -7,6 +7,7 @@ import {
message, message,
Pagination, Pagination,
Modal, Modal,
Button,
} from 'antd' } from 'antd'
import Addscreen from './Addscreen' import Addscreen from './Addscreen'
import { import {
@ -14,7 +15,8 @@ import {
talent_pool, talent_pool,
talent_pool_nu, talent_pool_nu,
option, option,
get_number get_number,
send_talent_pool,
} from '../../../util/requestURL' } from '../../../util/requestURL'
import { import {
PrinterFilled, PrinterFilled,
@ -39,22 +41,24 @@ export default class Talent_pool extends Component {
datalist: [], datalist: [],
pages: 1, pages: 1,
total: 0, total: 0,
candidate:0, candidate: 0,
now:0 now: 0,
} }
componentDidMount() { componentDidMount() {
PubSub.publish('headtitle', { headtitle: '人才库' }) PubSub.publish('headtitle', { headtitle: '人才库' })
get_number().then((res)=>{ get_number().then(
(res) => {
console.log(res) console.log(res)
this.setState({ this.setState({
candidate: res.data.candidate, candidate: res.data.candidate,
now: res.data.now now: res.data.now,
}) })
}, },
(err)=>{ (err) => {
message.error('网络错误,请稍后再试') message.error('网络错误,请稍后再试')
}) }
)
this.handelupdatascreen() this.handelupdatascreen()
this.posttalentpool() this.posttalentpool()
} }
@ -151,7 +155,68 @@ export default class Talent_pool extends Component {
} }
render() { render() {
const { data, datalist,candidate,now } = this.state const { data, datalist, candidate, now } = this.state
//
const todata = datalist.length
//
const onAllChange = (e) => {
const type = e.target.checked
const { datalist } = this.state
const newData = datalist.map((dataObj) => {
return { ...dataObj, choice: type }
})
this.setState({ datalist: newData })
}
//
let choiceCount = 0
if (datalist.length > 0) {
choiceCount = datalist.reduce(
(pre, item) => pre + (item.choice ? 1 : 0),
0
)
}
//
const onChange = (e) => {
const type = e.target.checked
const id = e.target.value
const { datalist } = this.state
const newData = datalist.map((dataObj) => {
if (dataObj.id_card === id) return { ...dataObj, choice: type }
else return dataObj
})
this.setState({
datalist: newData,
})
}
const handeladdCandidate = (e) => {
const { datalist } = this.state
const newdatalist = []
for (let i in datalist) {
if (datalist[i].choice) {
newdatalist.push(datalist[i])
}
}
if (newdatalist.length > 0) {
send_talent_pool({ send: newdatalist }).then(
(res) => {
console.log(res)
if (res.msg === 'ok') {
message.success('操作成功')
this.handelupdatascreen()
}
},
(err) => {
message.error('网络错误,请稍后再试')
}
)
} else {
message.warning('选择候选人')
}
}
return ( return (
<div className="talentpool-box"> <div className="talentpool-box">
{/* <Empty description="该功能暂未开放" className='talentpool-Empty-box'/> */} {/* <Empty description="该功能暂未开放" className='talentpool-Empty-box'/> */}
@ -293,15 +358,32 @@ export default class Talent_pool extends Component {
<div className="talentpool-list-box"> <div className="talentpool-list-box">
<div className="talentpool-table-action"> <div className="talentpool-table-action">
<div className="qxcheck-box"> <div className="qxcheck-box">
<Checkbox> <Checkbox
onChange={onAllChange}
checked={
choiceCount === todata
? true
: false
}
>
<CaretDownFilled <CaretDownFilled
style={{ color: '#424954' }} style={{ color: '#424954' }}
/> />
</Checkbox> </Checkbox>
</div> </div>
<div>
<Button
type="primary"
onClick={handeladdCandidate}
>
{' '}
+ 添加到候选人
</Button>
</div>
</div> </div>
<div> <div>
{datalist.map((item, key) => { {datalist.length > 0 ? (
datalist.map((item, key) => {
return ( return (
<div <div
className="talentpool-info-box" className="talentpool-info-box"
@ -309,7 +391,13 @@ export default class Talent_pool extends Component {
> >
<div className="talentpool-list-left"> <div className="talentpool-list-left">
<div> <div>
<Checkbox></Checkbox> <Checkbox
checked={
item.choice
}
onChange={onChange}
value={item.id_card}
></Checkbox>
</div> </div>
<div className="talentpool-info"> <div className="talentpool-info">
<div> <div>
@ -323,7 +411,8 @@ export default class Talent_pool extends Component {
| {item.age} | {item.age}
</span> </span>
<span className="exp"> <span className="exp">
{item.work_exp === 0 {item.work_exp ===
0
? '| 实习生' ? '| 实习生'
: item.work_exp === : item.work_exp ===
1 1
@ -337,7 +426,9 @@ export default class Talent_pool extends Component {
<BlockOutlined />{' '} <BlockOutlined />{' '}
</span>{' '} </span>{' '}
<span className="similar-num"> <span className="similar-num">
{item.similarity} {
item.similarity
}
位相似候选人 位相似候选人
</span> </span>
</div> </div>
@ -346,7 +437,9 @@ export default class Talent_pool extends Component {
return ( return (
<div <div
className="work-exp-box" className="work-exp-box"
key={index} key={
index
}
> >
<CalendarFilled /> <CalendarFilled />
<span> <span>
@ -377,13 +470,16 @@ export default class Talent_pool extends Component {
{item.school} {item.school}
</span> </span>
<span> <span>
| {item.specialty} |{' '}
{item.specialty}
</span> </span>
<span> <span>
| {item.education} |{' '}
{item.education}
</span> </span>
<span> <span>
|{item.at_school} |
{item.at_school}
</span> </span>
</div> </div>
</div> </div>
@ -398,11 +494,15 @@ export default class Talent_pool extends Component {
</div> </div>
<div className="margintop5"> <div className="margintop5">
应聘职位 应聘职位
<span>{item.job_name}</span> <span>
{item.job_name}
</span>
</div> </div>
<div className="margintop5"> <div className="margintop5">
归档人才库 归档人才库
<span>系统公共人才库</span> <span>
系统公共人才库
</span>
</div> </div>
</div> </div>
@ -438,7 +538,12 @@ export default class Talent_pool extends Component {
</div> </div>
</div> </div>
) )
})} })
) : (
<div className="margintop30 Empty-box">
<Empty description="暂无数据" />
</div>
)}
</div> </div>
</div> </div>
<div className="page-box"> <div className="page-box">
@ -458,11 +563,14 @@ export default class Talent_pool extends Component {
visible={this.state.isaddscreen} visible={this.state.isaddscreen}
data={this.state.data} data={this.state.data}
onCancel={() => { onCancel={() => {
this.setState({ this.setState(
{
isaddscreen: false, isaddscreen: false,
},()=>{ },
() => {
this.handelupdatascreen() this.handelupdatascreen()
}) }
)
}} }}
/> />
</div> </div>

View File

@ -1,12 +1,12 @@
const { createProxyMiddleware } = require('http-proxy-middleware') const { createProxyMiddleware } = require('http-proxy-middleware')
// https://legu-cdn-source.obs.cn-east-2.myhuaweicloud.com // https://legu-cdn-source.obs.cn-east-2.myhuaweicloud.com
module.exports = function(app){ module.exports = function(app){
debugger
app.use( app.use(
createProxyMiddleware('/pdf',{ //遇见/api1前缀的请求,就会触发该代理配置 createProxyMiddleware('/pdf',{ //遇见/pdf前缀的请求,就会触发该代理配置
target:'https://legu-cdn-source.obs.cn-east-2.myhuaweicloud.com', //请求转发给谁 target:'https://legu-cdn-source.obs.cn-east-2.myhuaweicloud.com', //请求转发给谁
changeOrigin:true,//控制服务器收到的请求头中Host的值 changeOrigin:true,//控制服务器收到的请求头中Host的值
pathRewrite:{'^/pdf':''} //重写请求路径(必须) pathRewrite:{'^/pdf':''}, //重写请求路径(必须)
logLevel: "debug",
}), }),
) )
} }

View File

@ -28,9 +28,9 @@ import memoryUtils from './memoryUtils'
import storageUtils from './storageUtils' import storageUtils from './storageUtils'
// const baseURL = 'http://10.0.0.94:7800/api/v1' // const baseURL = 'http://10.0.0.94:7800/api/v1'
const baseURL = 'http://10.0.0.240:7800/api/v1' // const baseURL = 'http://10.0.0.240:7800/api/v1'
// const baseURL = 'http://myip.legu.cc:7800/api/v1' // const baseURL = 'http://myip.legu.cc:7800/api/v1'
// const baseURL = 'http://10.0.0.4:7800/api/v1' const baseURL = 'http://10.0.0.4:7800/api/v1'
axios.defaults.timeout = 600000 axios.defaults.timeout = 600000
axios.defaults.baseURL = baseURL axios.defaults.baseURL = baseURL

View File

@ -17,6 +17,11 @@ export function resumeaffix(params){
return request('post','/itr/resume_affix',params) return request('post','/itr/resume_affix',params)
} }
// 手动添加候选人
export function manual_resume(params){
return request('post','/forms/manual_resume',params)
}
//面试安排 //面试安排
//获取用户名 //获取用户名
@ -243,5 +248,9 @@ export function get_number(params){
return request('get','/itr/get_number',params) return request('get','/itr/get_number',params)
} }
export function send_talent_pool(params){
return request('post','/itr/send_talent_pool',params)
}