前端提交

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; }
.textindent7{text-indent: 7px;}
.fontweight{font-weight: bold;}
.padding24 { padding: 24px; }
.margin24 { margin: 24px; }

View File

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

View File

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

View File

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

View File

@ -39,5 +39,5 @@
.upload-button-box button { width: 100%; }
.upload-button-box .ant-upload-list {display: none;}
.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; }

View File

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

View File

@ -9,31 +9,30 @@ import storageUtils from '../../../util/storageUtils'
import './index.css'
const { TextArea } = Input
export default function Feedback({ visible, onClose, uid }) {
export default function Feedback({ visible, onClose, uid,setuserid }) {
var userInfo = storageUtils.getUser()
const [voice, setvoice] = useState(1)
const [thought, setthought] = useState(1)
const [diathesis, setdiathesis] = useState(1)
const [evaluate, setevaluate] = useState('')
const [teacherback, setteacherback] = useState(1)
const [isupdata, setisupdata] = useState(0)
// const [isupdata, setisupdata] = useState(0)
useEffect(() => {
if (uid) {
getteacher({ uid: uid }).then(
(res) => {
if (res.msg === 'ok') {
if (res.data.uid) {
const user_id = userInfo.user_id
if (res.data['survey']['']) {
setisupdata(1)
setvoice(res.data['survey'][user_id].voice || 1)
setthought(res.data['survey'][user_id].thought || 1)
if (res.data[0].uid) {
const user_id = setuserid.user_id
if (res.data[0]['survey'][user_id]) {
// setisupdata(1)
setvoice(res.data[0]['survey'][user_id].voice || 1)
setthought(res.data[0]['survey'][user_id].thought || 1)
setdiathesis(
res.data['survey'][user_id].diathesis || 1
res.data[0]['survey'][user_id].diathesis || 1
)
setevaluate(res.data['survey'][user_id].evaluate)
setteacherback(res.data['survey'][user_id].teacher_back)
setevaluate(res.data[0]['survey'][user_id].evaluate)
setteacherback(res.data[0]['survey'][user_id].teacher_back)
}
}
}
@ -47,47 +46,51 @@ export default function Feedback({ visible, onClose, uid }) {
const handelFeedback = () => {
const date = {
name: userInfo.name,
user_id:setuserid.user_id,
name: setuserid.name,
voice,
thought,
diathesis,
evaluate,
teacher_back: teacherback,
teacher_back: teacherback
}
if (isupdata === 0) {
interviewteacher({
uid: uid,
survey: {
[userInfo.user_id]: date,
},
}).then(
(res) => {
if (res.msg === 'ok') {
message.success('添加成功')
onClose()
}
},
(err) => {
message.error('网络加载失败,请稍后再试')
}
)
} else {
// if (isupdata === 0) {
// interviewteacher({
// uid: uid,
// survey: {
// [setuserid.user_id]: date,
// },
// }).then(
// (res) => {
// if (res.msg === 'ok') {
// message.success('')
// onClose()
// }
// },
// (err) => {
// message.error('')
// }
// )
// } else {
upteacher({
uid: uid,
[userInfo.user_id]: date,
survey: date,
relevancy_id: setuserid.relevancy_id
}).then(
(res) => {
if (res.msg === 'ok') {
message.success('修改成功')
onClose()
}else {
message.success(res.msg)
}
},
(err) => {
message.error('网络加载失败,请稍后再试')
}
)
}
// }
}
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 Enterthenextstage from '../../Enterthenextstage'
import { record, teacherstate } from '../../../util/requestURL'
@ -13,17 +18,23 @@ import {
const { Panel } = Collapse
export default function InterviewTabs({
data,
Tabsnum,
setisfeedback,
seefeedback,
}) {
const InterviewTabs = ({ data, Tabsnum, setisfeedback, seefeedback },ref) => {
const [isenterthenextstage, setisenterthenextstage] = useState(false)
const [datalist, setdatalist] = useState([])
let userinfo = storageUtils.getUser()
console.log(ref)
useImperativeHandle(ref, () => ({
getData: updatarecord
}))
useEffect(() => {
if (Tabsnum === '2') {
updatarecord()
}
}, [Tabsnum])
const updatarecord = () => {
record({ uid: data.uid }).then(
(res) => {
// console.log(res)
@ -34,7 +45,6 @@ export default function InterviewTabs({
}
)
}
}, [Tabsnum])
const handelFeedback = (record) => {
teacherstate({
@ -134,7 +144,7 @@ export default function InterviewTabs({
/>{' '}
未评估
</div>
) : item.teacher_back ===
) : items.teacher_back ===
1 ? (
<div>
<LikeOutlined
@ -144,7 +154,7 @@ export default function InterviewTabs({
/>{' '}
满意
</div>
) : item.teacher_back ===
) : items.teacher_back ===
2 ? (
<div>
<LikeOutlined
@ -154,7 +164,7 @@ export default function InterviewTabs({
/>{' '}
非常满意
</div>
) : item.teacher_back ===
) : items.teacher_back ===
3 ? (
<div>
<DislikeOutlined
@ -178,8 +188,7 @@ export default function InterviewTabs({
</div>
<div>
{item.back_status ===
0 ? (
{!items.type ? (
<div>
<Button
type="link"
@ -191,12 +200,20 @@ export default function InterviewTabs({
>
催促反馈
</Button>
{userinfo.id ===
items.user_id || userinfo.name === 'root' ? (
{userinfo.user_id ===
items.user_id ||
userinfo.name ===
'root' ? (
<Button
type="link"
onClick={() => {
setisfeedback()
setisfeedback(
{
...items,
relevancy_id:
item.relevancy_id,
}
)
}}
>
填写反馈
@ -210,7 +227,13 @@ export default function InterviewTabs({
<Button
type="link"
onClick={() => {
seefeedback()
seefeedback(
{
...items,
relevancy_id:
item.relevancy_id,
}
)
}}
>
查看反馈
@ -255,3 +278,5 @@ export default function InterviewTabs({
</div>
)
}
export default forwardRef(InterviewTabs)

View File

@ -31,7 +31,7 @@ import {
const { Option } = Select
const dateFormat = 'YYYY/MM/DD'
export default function OfferTabs({ data }) {
export default function OfferTabs({ data , updata }) {
const [OfferPostList, setOfferPostList] = useState([]) //offer
const [Offerstate, setOfferstate] = useState(false)
const [offerdata, setoffdata] = useState({
@ -92,8 +92,11 @@ export default function OfferTabs({ data }) {
job_id: data.job_id,
}).then(
(res) => {
console.log(res.data)
// setOfferPostList(res.data)
if(res.msg === 'ok'){
message.success('操作成功')
updata();
}
},
(err) => {
message.error('网络加载错误,请稍后再试')
@ -153,7 +156,15 @@ export default function OfferTabs({ data }) {
<div className="OfferTabs-title-box">入职记录</div>
<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="">
<Button
onClick={() => {
@ -164,7 +175,7 @@ export default function OfferTabs({ data }) {
</Button>
<Button
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 Steptone from '../Steptone'
import InterviewTabs from './InterviewTabs'
@ -37,6 +37,8 @@ export default function InterviewerInfoPop({
const [isremarks, setisremarks] = useState(false)
const [Tabsnum, setTabsnum] = useState(0)
const [isfeedback, setisfeedback] = useState(false)
const [userid , setuserid] = useState();
const updatarecord = useRef()
const onChange = (key) => {
// console.log(key)
@ -88,6 +90,11 @@ export default function InterviewerInfoPop({
setisremarks(false)
}
//
const updatarecordlist = ()=>{
updatarecord.current.getData();
}
return (
<div>
<Modal
@ -492,18 +499,24 @@ export default function InterviewerInfoPop({
<InterviewTabs
data={candidateinfo}
Tabsnum={Tabsnum}
setisfeedback={() => {
setuserid= {userid}
ref={updatarecord}
setisfeedback={(userid) => {
setisfeedback(true)
setuserid(userid)
}}
seefeedback={() => {
seefeedback={(userid) => {
setisfeedback(true)
postfindcriterion()
setuserid(userid)
}}
/>
</div>
</TabPane>
<TabPane tab="Offer/录用" key="4">
<OfferTabs data={candidateinfo} />
<OfferTabs data={candidateinfo} updata={()=>{
postfindcriterion()
}}/>
</TabPane>
<TabPane
@ -551,7 +564,7 @@ export default function InterviewerInfoPop({
type="primary"
block
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>
@ -559,7 +572,7 @@ export default function InterviewerInfoPop({
''
)}
{candidateinfo.teacher_state != 2 ? (
{/* {candidateinfo.teacher_state != 2 ? (
<Button
block
onClick={() => {
@ -579,7 +592,7 @@ export default function InterviewerInfoPop({
>
修改反馈
</Button>
)}
)} */}
<Button
block
@ -629,9 +642,11 @@ export default function InterviewerInfoPop({
<Feedback
visible={isfeedback}
uid={candidateinfo.uid}
setuserid= {userid}
onClose={() => {
setisfeedback(false)
postfindcriterion()
updatarecordlist()
}}
/>
</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,
} from '@ant-design/icons'
const { Search } = Input
// const suffix = (
// <AudioOutlined

View File

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

View File

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

View File

@ -37,9 +37,9 @@ export default class Candidate extends Component {
const props = {
name: 'file',
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://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: {
Authorization: token,
},
@ -66,9 +66,9 @@ export default class Candidate extends Component {
candidatedata.data['uid'] =
info.file.response.data.uid
candidatedata.data['owner_name'] =
this.state.owner_name
that.state.owner_name
candidatedata.data['resume_affix_id'] =
this.state.resume_affix_id
that.state.resume_affix_id
that.props.onResumeUpload(candidatedata)
}
} else {
@ -115,9 +115,9 @@ export default class Candidate extends Component {
const propss = {
name: 'file',
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://10.0.0.4:7800/api/v1/itr/resume_affix',
action: 'http://10.0.0.4:7800/api/v1/itr/resume_affix',
headers: {
Authorization: token,
},

View File

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

View File

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

View File

@ -151,7 +151,7 @@ function Interview() {
//
const onEditresume = (data) => {
setInterviewerInfo(false)
console.log(data)
// console.log(data)
setTimeout(() => {
setEditresume(true)
}, 500)
@ -318,11 +318,15 @@ function Interview() {
render: (text, record, index) => (
<div className="font-size14 color1">
{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>
),
},
@ -338,13 +342,13 @@ function Interview() {
>
查看详情
</span>
<span
{/* <span
className="cursor"
style={{ margin: '0px 5px' }}
onClick={() => handelFeedback(record, index)}
>
{text.type === 0 ? '催促反馈' : ''}
</span>
</span> */}
</div>
),
},

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -28,9 +28,9 @@ import memoryUtils from './memoryUtils'
import storageUtils from './storageUtils'
// 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://10.0.0.4:7800/api/v1'
const baseURL = 'http://10.0.0.4:7800/api/v1'
axios.defaults.timeout = 600000
axios.defaults.baseURL = baseURL

View File

@ -17,6 +17,11 @@ export function resumeaffix(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)
}
export function send_talent_pool(params){
return request('post','/itr/send_talent_pool',params)
}