Переглянути джерело

网络招聘管理V2版本初次提交

Qifeng-Wu 4 роки тому
батько
коміт
cc6617e870
16 змінених файлів з 700 додано та 88 видалено
  1. 106 0
      happy-job-base-system/src/main/webapp/WEB-INF/tags/sys/imgUpload.tag
  2. 100 34
      happy-job-base-system/src/main/webapp/webpage/modules/omcandidate/omCandidateForm.jsp
  3. 54 17
      happy-job-base-system/src/main/webapp/webpage/modules/omcandidate/omCandidateInfoList.jsp
  4. 44 1
      happy-job-base-system/src/main/webapp/webpage/modules/omcandidate/omCandidateTrackInfo.jsp
  5. 92 7
      happy-job-base-system/src/main/webapp/webpage/modules/omcandidate/omOwnCandidateList.jsp
  6. 31 3
      happy-job-base-system/src/main/webapp/webpage/modules/omcandidate/status/omEmployForm.jsp
  7. 68 8
      happy-job-base-system/src/main/webapp/webpage/modules/omcandidate/status/omEntryForm.jsp
  8. 11 2
      happy-job-base-system/src/main/webapp/webpage/modules/omcandidate/status/omInviteInterviewForm.jsp
  9. 71 7
      happy-job-module-crm/src/main/java/com/jeeplus/modules/omcandidate/entity/OmCandidate.java
  10. 38 1
      happy-job-module-crm/src/main/java/com/jeeplus/modules/omcandidate/entity/OmCandidateTrack.java
  11. 5 1
      happy-job-module-crm/src/main/java/com/jeeplus/modules/omcandidate/mapper/OmCandidateMapper.java
  12. 31 2
      happy-job-module-crm/src/main/java/com/jeeplus/modules/omcandidate/mapper/xml/OmCandidateMapper.xml
  13. 17 1
      happy-job-module-crm/src/main/java/com/jeeplus/modules/omcandidate/mapper/xml/OmCandidateTrackMapper.xml
  14. 7 2
      happy-job-module-crm/src/main/java/com/jeeplus/modules/omcandidate/service/OmCandidateService.java
  15. 24 1
      happy-job-module-crm/src/main/java/com/jeeplus/modules/omcandidate/web/OmCandidateController.java
  16. 1 1
      happy-job-module-crm/src/main/java/com/jeeplus/modules/omcandidate/web/OmCandidateTrackController.java

+ 106 - 0
happy-job-base-system/src/main/webapp/WEB-INF/tags/sys/imgUpload.tag

@@ -0,0 +1,106 @@
+<%@ tag language="java" pageEncoding="UTF-8"%>
+<%@ include file="/webpage/include/taglib.jsp"%>
+<%@ attribute name="path" type="java.lang.String" required="true" description="输入框"%>
+<%@ attribute name="value" type="java.lang.String" required="true" description="输入框"%>
+<%--
+type:
+    all: 允许上传所有文件
+    file: 只允许上传所有非可执行文件(排除.sql,.exe,.jsp等等后缀类型的文件)
+    image: 只允许上传图片
+    audio: 只允许上传音频文件
+    video: 只允许上传视频文件
+    office: 只允许上传文档类型
+
+    指定type参数时,将忽略allowedExtensions 和 deniedExtensions参数,请勿配置。
+--%>
+<%@ attribute name="type" type="java.lang.String" required="false" description="*,files、images、video、audio、office"%>
+<%@ attribute name="uploadPath" type="java.lang.String" required="true" description="文件上传路径"%>
+<%@ attribute name="fileNumLimit" type="java.lang.String" required="false" description="是否允许多选"%>
+<%@ attribute name="fileSizeLimit" type="java.lang.String" required="false" description="文件大小"%>
+<%@ attribute name="readonly" type="java.lang.Boolean" required="false" description="是否查看模式"%>
+<%@ attribute name="isrequired" type="java.lang.Boolean" required="false" description="是否必填"%>
+<style type="text/css">
+	.ant-upload{
+		box-sizing: border-box;
+	    margin: 0;
+	    padding: 0;
+	    color: rgba(0,0,0,.85);
+	    font-size: 14px;
+	    font-variant: tabular-nums;
+	    line-height: 1.5715;
+	    list-style: none;
+	    font-feature-settings: "tnum";
+	    outline: 0;
+	}
+	.ant-upload-select{
+		display: inline-block;
+	}
+	.ant-upload-select-picture-card{
+		width: 160px;
+	    height: 100px;
+	    margin-right: 8px;
+	    margin-bottom: 8px;
+	    text-align: center;
+	    vertical-align: top;
+	    background-color: #fafafa;
+	    border: 1px dashed #d9d9d9;
+	    border-radius: 2px;
+	    cursor: pointer;
+	    transition: border-color .3s;
+	}
+	.img{
+		width: 160px;
+	    height: 100px;
+	}
+</style>
+<%--
+allowedExtensions:允许上传的文件类型
+deniedExtensions: 禁止上传的文件类型
+--%>
+<%@ attribute name="allowedExtensions" type="java.lang.String"  required="false" description="允许的文件类型"%>
+<%@ attribute name="title" type="java.lang.String" required="false" description="新增图片框内文字"%>
+<%--7z,aiff,asf,avi,bmp,csv,doc,docx,fla,flv,gif,gz,gzip,jpeg,jpg,mid,mov,mp3,mp4,mpc,mpeg,mpg,ods,odt,pdf,png,ppt,pptx,pxd,qt,ram,rar,rm,rmi,rmvb,rtf,sdc,sitd,swf,sxc,sxw,tar,tgz,tif,tiff,txt,vsd,wav,wma,wmv,xls,xlsx,zip--%>
+<%--bmp,gif,jpeg,jpg,png--%>
+
+<input type="hidden" name="${path}" value="${value}"/>
+<div class="ant-upload ant-upload-select ant-upload-select-picture-card" id="${path}Button" onclick="${path}FileDialogOpen();">
+	<img class="img" src="${ctxp}${value}" id="${path}Img" style="display:${(not empty value)?'block':'none'}"/>
+	<span class="ant-upload" id="${path}Upload" style="display:${(not empty value)?'none':'block'}">
+		<div style="margin-top:24px">
+			<svg viewBox="64 64 896 896" focusable="false" data-icon="plus" width="1em" height="1em" fill="currentColor">
+				<path d="M482 152h60q8 0 8 8v704q0 8-8 8h-60q-8 0-8-8V160q0-8 8-8z"></path>
+				<path d="M176 474h672q8 0 8 8v60q0 8-8 8H176q-8 0-8-8v-60q0-8 8-8z"></path>
+			</svg>
+			<div style="margin-top: 8px;">${title}</div>
+		</div>
+	</span>
+</div>
+<script type="text/javascript">
+    function ${path}FileDialogOpen() {   	
+        var currentFileValues = $("input[name='${path}']").val();
+        jp.open({
+            type: 2,
+            area: ['800px', '320px'],
+            title:"上传文件",
+            auto:true,
+            content: "${ctx}/tag/fileUpload?fileValues="+encodeURIComponent(currentFileValues)+"&uploadPath=${uploadPath}"+"&type=${type}"+"&readonly=${readonly}"
+            +"&fileNumLimit=${fileNumLimit}"+"&fileSizeLimit=${fileSizeLimit}"+"&allowedExtensions=${allowedExtensions}"+"&deniedExtensions=${deniedExtensions}",
+            cancel: function(index, layero){
+                var iframeWin = layero.find('iframe')[0]; //得到iframe页的窗口对象,执行iframe页的方法:iframeWin.method();
+                var fileNames =iframeWin.contentWindow.getUploadFileNames();//调用保存事件
+                var fileValues =iframeWin.contentWindow.getUploadFileValues();//调用保存事件
+                $("#${path}").val(fileNames);
+                $("input[name='${path}']").val(fileValues);
+            	if(fileValues){
+            		$("#${path}Upload").hide();           		
+            		$("#${path}Img").show();
+            	}else{
+            		$("#${path}Img").hide();
+            		$("#${path}Upload").show();
+            	}
+            	$("#${path}Img").attr("src",'${ctxp}'+fileValues);
+            }
+        });
+    }
+
+</script>

+ 100 - 34
happy-job-base-system/src/main/webapp/webpage/modules/omcandidate/omCandidateForm.jsp

@@ -6,7 +6,8 @@
 	<meta name="decorator" content="ani"/>
 	<script type="text/javascript">
 		$(document).ready(function() {
-			loadBeginWorkYearCollection();
+			var birthYear = '${omCandidate.birthYear}';
+			loadBeginWorkYearCollection(birthYear);
 			//编辑
 		    var id = "${omCandidate.id}";
 		    var mode = "${mode}";
@@ -28,17 +29,17 @@
 		        $(".t_h_s i").html($(".tattooing_detail").val().length);
 		    })
 		});
-        function loadBeginWorkYearCollection() {
+        function loadBeginWorkYearCollection(birthYear) {
 		    var currentDate=new Date();
 		    var currentYear=currentDate.getFullYear();
 		    var beginWorkYearsHtml="";
             var selectYear=0;
-            if(${empty omCandidate.birthYear}){
-                selectYear=0;
+            if(birthYear){
+            	 selectYear=birthYear;
+                 beginWorkYearsHtml+='<option label="请选择出生年份"/>';
+            }else{
+            	selectYear=0;
                 beginWorkYearsHtml+='<option label="请选择出生年份" selected="selected"/>';
-            }else {
-                selectYear='${omCandidate.birthYear}';
-                beginWorkYearsHtml+='<option label="请选择出生年份"/>';
             }
 			for(var i=0;i<=currentYear;i++){
 			    var beginWorkYear=currentYear-i;
@@ -107,27 +108,76 @@
             if(!isValidate){
                 return false;
 			}else{
-				if(flag){
-					flag = false;
-	                jp.loading();
-	                jp.post("${ctx}/omcandidate/omCandidate/save",$('#inputForm').serialize(),function(data){
-	                    if(data.success){
-	                    	var id = "${omCandidate.id}";
-	                    	if(id){//编辑
-	                    		jp.getParent().location.href = "${ctx}/omcandidate/omCandidate/candidateInfo?id=" + id;
-	                    	}else{//新增
-	                    		jp.getParent().refresh();
-	                    	}
-	                        var dialogIndex = parent.layer.getFrameIndex(window.name); // 获取窗口索引
-	                        parent.layer.close(dialogIndex);
-	                        jp.success(data.msg)
-	                    }else{
-	                        jp.error(data.msg);
-	                    }
-	                })
-				}
+				var id = "${omCandidate.id}";
+				var oldPhone = "${omCandidate.phone}";	
+				var newPhone = $("#phone").val();
+				if(id && oldPhone!=newPhone){//编辑 确认修改手机号
+					confirm('是否用户将所有信息迁移至'+newPhone+'并作为新的识别信息?',"修改手机号确认", function(){
+						sendSave(id);      	   
+					})
+				}else{
+					sendSave(id);
+				}			
 			}
         }
+        //发送提交请求
+        function sendSave(id){
+        	if(flag){
+        		$("#beginWorkYear").removeAttr("disabled");//移除select的disabled属性(不移除的话提交请求获取不到数据)
+        		$("#gender").removeAttr("disabled");
+				flag = false;
+                jp.loading();
+                jp.post("${ctx}/omcandidate/omCandidate/save",$('#inputForm').serialize(),function(data){
+                    if(data.success){
+                    	if(id){//编辑
+                    		jp.getParent().location.href = "${ctx}/omcandidate/omCandidate/candidateInfo?id=" + id;
+                    	}else{//新增
+                    		jp.getParent().refresh();
+                    	}
+                        var dialogIndex = parent.layer.getFrameIndex(window.name); // 获取窗口索引
+                        parent.layer.close(dialogIndex);
+                        jp.success(data.msg)
+                    }else{
+                        jp.error(data.msg);
+                    }
+                })
+			} 
+        }
+        //当输入身份证信息失去焦点时处理身份证信息自动填充出生年份和性别
+        function idcardNumberOnblur(idcard){
+        	var idcardNumber = $(idcard).val();
+        	var reg =/(^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$)|(^[1-9]\d{5}\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}$)/;
+        	if(reg.test(idcardNumber)){
+        		$("#beginWorkYear").empty();
+        		loadBeginWorkYearCollection(idcardNumber.substring(6, 10));
+        		if(parseInt(idcardNumber.substr(16,1))%2==1){ 
+        			$("#gender").val(1);
+        		 }else{ 
+        			$("#gender").val(2);
+        		 }
+        		$("#beginWorkYear").attr("disabled","disabled");
+        		$("#gender").attr("disabled","disabled");
+        	}
+        }
+        //重写确认弹框形式
+        function confirm(msg, title, succFuc, cancelFuc){
+    	    top.layer.confirm(msg,
+    	        {icon: 3, title: title, btn: ['确认','取消']
+    	        }, function(index){
+    	            if (typeof succFuc == 'function') {
+    	                succFuc();
+    	            }else{
+    	                location = succFuc;
+    	                jp.success("操作成功!", {icon:1});
+    	            }
+    	            top.layer.close(index);
+    	        }, function(index){
+    	            if(cancelFuc)
+    	                cancelFuc();
+    	            top.layer.close(index);
+    	        });
+    	    return false;
+    	}
 	</script>
 </head>
 <body>
@@ -148,9 +198,31 @@
 		<div class="form-group col-sm-6">
 			<label class="col-sm-3 control-label"><font color="red">*</font>手机号:</label>
 			<div class="col-sm-3">
-				<form:input path="phone" htmlEscape="false" maxlength="18" placeholder="请输入用户手机号" class="form-control input-sm required isphone existedphone" autocomplete="off"/>
+				<form:input path="phone" id="phone" htmlEscape="false" maxlength="18" placeholder="请输入用户手机号" class="form-control input-sm required isphone existedphone" autocomplete="off"/>
+			</div>
+		</div>
+		<div class="form-group col-sm-6">
+			<label class="col-sm-3 control-label">用户来源:</label>
+			<div class="col-sm-3">
+				<form:select path="userFrom" class="form-control input-sm">
+					<form:options items="${fns:getDictList('om_user_from')}" itemLabel="label" itemValue="value" htmlEscape="false"/>
+				</form:select>
+			</div>
+		</div>
+		<div class="form-group col-sm-6">
+			<label class="col-sm-3 control-label">身份证:</label>
+			<div class="col-sm-3">
+				<form:input path="idcardNumber" htmlEscape="false" maxlength="18" placeholder="请输入用户身份证" class="form-control input-sm idcardNumber" onblur="idcardNumberOnblur(this)"/>
+			</div>
+		</div>
+		<div class="form-group col-sm-6">
+			<label class="col-sm-3 control-label">上传照片:</label>
+			<div class="col-sm-3">
+				<sys:imgUpload path="idCardFront" value="${omCandidate.idCardFront}" type="file" title="上传身份证正面照" uploadPath="/omcandidate" fileNumLimit="1"/>
+				<div style="float:right"><sys:imgUpload path="idCardBack" value="${omCandidate.idCardBack}" type="file" title="上传身份证反面照" uploadPath="/omcandidate" fileNumLimit="1"/></div>
 			</div>
 		</div>
+
 		<div class="form-group col-sm-6">
 			<label class="col-sm-3 control-label">出生年份:</label>
 			<div class="col-sm-3">
@@ -162,18 +234,12 @@
 		<div class="form-group col-sm-6">
 			<label class="col-sm-3 control-label">性别:</label>
 			<div class="col-sm-3">
-				<form:select path="gender" class="form-control input-sm">
+				<form:select path="gender" class="form-control input-sm" id="gender">
 					<form:options items="${fns:getDictList('om_gender')}" itemLabel="label" itemValue="value" htmlEscape="false"/>
 				</form:select>
 			</div>
 		</div>
 		<div class="form-group col-sm-6">
-			<label class="col-sm-3 control-label">身份证:</label>
-			<div class="col-sm-3">
-				<form:input path="idcardNumber" htmlEscape="false" maxlength="18" placeholder="请输入用户身份证" class="form-control input-sm idcardNumber"/>
-			</div>
-		</div>
-		<div class="form-group col-sm-6">
 			<label class="col-sm-3 control-label">籍贯:</label>
 			<div class="col-sm-3">
 				<form:input path="nativePlace" htmlEscape="false" maxlength="45" placeholder="请输入用户籍贯" class="form-control input-sm" autocomplete="off"/>

+ 54 - 17
happy-job-base-system/src/main/webapp/webpage/modules/omcandidate/omCandidateInfoList.jsp

@@ -282,13 +282,13 @@
 					<div class="col-sm-7">${omCandidate.phone}</div>
 				</div>
 				<div class="form-group col-sm-3">
-					<label class="col-sm-4 control-label">年龄</label>
-					<div class="col-sm-7" id="age"></div>
-				</div>
-				<div class="form-group col-sm-3">
-					<label class="col-sm-4 control-label">性别</label>
-					<div class="col-sm-7">${fns:getDictLabel(omCandidate.gender, 'om_gender', '-')}</div>
+					<label class="col-sm-4 control-label">用户来源</label>
+					<div class="col-sm-7">${fns:getDictLabel(omCandidate.userFrom, 'om_user_from', '-')}</div>
 				</div>
+								<div class="form-group col-sm-3">
+					<label class="col-sm-4 control-label">学历</label>
+					<div class="col-sm-7">${fns:getDictLabel(omCandidate.qualification, 'om_qualification', '-')}</div>
+				</div>	
 			</div>
 			<div class="form-group col-sm-12">
 				<div class="form-group col-sm-3">
@@ -296,13 +296,14 @@
 					<div class="col-sm-7">${not empty omCandidate.idcardNumber?omCandidate.idcardNumber:'-'}</div>
 				</div>
 				<div class="form-group col-sm-3">
-					<label class="col-sm-4 control-label">籍贯</label>
-					<div class="col-sm-7">${not empty omCandidate.nativePlace?omCandidate.nativePlace:'-'}</div>
-				</div>	
+					<label class="col-sm-4 control-label">性别</label>
+					<div class="col-sm-7">${fns:getDictLabel(omCandidate.gender, 'om_gender', '-')}</div>
+				</div>
 				<div class="form-group col-sm-3">
-					<label class="col-sm-4 control-label">学历</label>
-					<div class="col-sm-7">${fns:getDictLabel(omCandidate.qualification, 'om_qualification', '-')}</div>
-				</div>	
+					<label class="col-sm-4 control-label">有无纹身</label>
+					<div class="col-sm-7">${fns:getDictLabel(omCandidate.hasTattooing, 'om_has_tattooing', '-')}</div>
+				</div>
+				
 				<div class="form-group col-sm-3">
 					<label class="col-sm-4 control-label">是否实习生</label>
 					<div class="col-sm-7">${fns:getDictLabel(omCandidate.isPlacement, 'om_is_placement', '-')}</div>
@@ -310,13 +311,49 @@
 			</div>
 			<div class="form-group col-sm-12">
 				<div class="form-group col-sm-3">
-					<label class="col-sm-4 control-label">有无纹身</label>
-					<div class="col-sm-7">${fns:getDictLabel(omCandidate.hasTattooing, 'om_has_tattooing', '-')}</div>
+					<label class="col-sm-4 control-label">年龄</label>
+					<div class="col-sm-7" id="age"></div>
 				</div>
-				<div class="form-group col-sm-9">
-					<label class="col-sm-1 control-label">纹身描述</label>
-					<div class="col-sm-8" style="margin-left:2.5%">${(not empty omCandidate.tattooingDetail && omCandidate.hasTattooing==true)?omCandidate.tattooingDetail:'-'}</div>
+				<div class="form-group col-sm-3">
+					<label class="col-sm-4 control-label">籍贯</label>
+					<div class="col-sm-7">${not empty omCandidate.nativePlace?omCandidate.nativePlace:'-'}</div>
 				</div>	
+				<div class="form-group col-sm-6">
+					<label class="col-sm-2 control-label">纹身描述</label>
+					<div class="col-sm-8">${(not empty omCandidate.tattooingDetail && omCandidate.hasTattooing==true)?omCandidate.tattooingDetail:'-'}</div>
+				</div>	
+			</div>
+			<div class="form-group col-sm-12">
+				<div class="form-group col-sm-3">
+					<label class="col-sm-4 control-label">身份证正面</label>
+					<div class="col-sm-7">
+						<c:choose>
+							<c:when test="${not empty omCandidate.idCardFront}">
+								<img onclick="jp.showPic('${ctxp}${omCandidate.idCardFront}')" src="${ctxp}${omCandidate.idCardFront}" style="width: 160px;height: 100px;cursor: pointer;">
+							</c:when>
+							<c:otherwise>
+								<div style="width:160px;height:105px;text-align:center;background:#eee;padding-top:40px;">
+									<span>暂未上传照片</span>
+								</div>
+							</c:otherwise>
+						</c:choose>
+					</div>
+				</div>
+				<div class="form-group col-sm-3">
+					<label class="col-sm-4 control-label">身份证反面</label>
+					<div class="col-sm-7">
+						<c:choose>
+							<c:when test="${not empty omCandidate.idCardBack}">
+								<img onclick="jp.showPic('${ctxp}${omCandidate.idCardBack}')" src="${ctxp}${omCandidate.idCardBack}" style="width: 160px;height: 100px;cursor: pointer;">
+							</c:when>
+							<c:otherwise>
+								<div style="width:160px;height:105px;text-align:center;background:#eee;padding-top:40px;">
+									<span>暂未上传照片</span>
+								</div>
+							</c:otherwise>
+						</c:choose>
+					</div>
+				</div>			
 			</div>
 			<div class="form-group col-sm-12">
 				<div class="form-group col-sm-12">

+ 44 - 1
happy-job-base-system/src/main/webapp/webpage/modules/omcandidate/omCandidateTrackInfo.jsp

@@ -51,13 +51,56 @@
 					<label class="col-sm-4 control-label">意向企业</label>
 					<div class="col-sm-8">${not empty omCandidateTrack.applyCompany?omCandidateTrack.applyCompany:'-'}</div>
 				</div>
+				<div class="form-group col-sm-4">
+					<label class="col-sm-4 control-label">订单类型</label>
+					<c:choose>
+						<c:when test="${omCandidateTrack.status==1||omCandidateTrack.status==3||omCandidateTrack.status==5||omCandidateTrack.status==7}">
+							<div class="col-sm-8" style="font-size:16px;color:#0F70E1">${fns:getDictLabel(omCandidateTrack.candidateType, 'om_candidate_order_type', '-')}</div>
+						</c:when>
+						<c:when test="${omCandidateTrack.status==2||omCandidateTrack.status==4||omCandidateTrack.status==6}">
+							<div class="col-sm-8" style="font-size:16px;color:#D00000">${fns:getDictLabel(omCandidateTrack.candidateType, 'om_candidate_order_type', '-')}</div>
+						</c:when>
+						<c:when test="${omCandidateTrack.status==8}">
+							<div class="col-sm-8" style="font-size:16px;color:#17AC00">${fns:getDictLabel(omCandidateTrack.candidateType, 'om_candidate_order_type', '-')}</div>
+						</c:when>
+						<c:otherwise>
+							<div class="col-sm-8">${fns:getDictLabel(omCandidateTrack.candidateType, 'om_candidate_order_type', '-')}</div>
+						</c:otherwise>
+					</c:choose>
+				</div>
 			</div>
 			<div class="form-group col-sm-12">
 				<div class="form-group col-sm-4">
+					<label class="col-sm-4 control-label">面试时间</label>
+					<div class="col-sm-8"><fmt:formatDate value="${omCandidateTrack.interviewTime}" pattern="yyyy/MM/dd HH:mm"/></div>
+				</div>	
+				<div class="form-group col-sm-4">
 					<label class="col-sm-4 control-label">开始时间</label>
 					<div class="col-sm-8"><fmt:formatDate value="${omCandidateTrack.generateTime}" pattern="yyyy/MM/dd HH:mm"/></div>
-				</div>		
+				</div>	
+			</div>
+			<div class="form-group col-sm-12">
+				<div class="form-group col-sm-4">
+					<label class="col-sm-4 control-label">用工类型</label>
+					<div class="col-sm-8">${fns:getDictLabel(omCandidateTrack.recruitType, 'om_recruit_type', '-')}</div>
+				</div>	
+				<div class="form-group col-sm-8">
+					<label class="col-sm-2 control-label">用工备注</label>
+					<div class="col-sm-8">${not empty omCandidateTrack.cashbackDetail?omCandidateTrack.cashbackDetail:'-'}</div>
+				</div>	
+			</div>
+			<c:if  test="${omCandidateTrack.recruitType == 2}">
+			<div class="form-group col-sm-12">
+				<div class="form-group col-sm-4">
+					<label class="col-sm-4 control-label">实际返费时间</label>
+					<div class="col-sm-8"><fmt:formatDate value="${omCandidateTrack.actualCashbackDate}" pattern="yyyy/MM/dd"/></div>
+				</div>	
+				<div class="form-group col-sm-4">
+					<label class="col-sm-4 control-label">实际返费金额</label>
+					<div class="col-sm-8">${not empty omCandidateTrack.actualCashback?omCandidateTrack.actualCashback:'-'}</div>
+				</div>	
 			</div>
+			</c:if>
 			<div class="form-group col-sm-12">
 				<div class="form-group col-sm-4">
 					<label class="col-sm-4 control-label">流失原因</label>

+ 92 - 7
happy-job-base-system/src/main/webapp/webpage/modules/omcandidate/omOwnCandidateList.jsp

@@ -17,6 +17,7 @@
 	</style>
 	<script>
 $(document).ready(function() {
+	dataShow();//数据统计展示
 	$('#omOwnCandidateTable').bootstrapTable({
 		  //请求方法
                method: 'post',
@@ -158,9 +159,12 @@ $(document).ready(function() {
                     }else if(row.status == 5){//待入职
                     	//info = '--';
                 	}else if(row.status == 7){//已入职(在职)
-                		if(row.omCandidateTrack.cashbackDate){
-                			info = '<button disabled="disabled" class="btn btn-xs btn-new" style="color:#D40000;border:1px solid #D40000">返费</button>&nbsp;'+ 
-                			'<span style="color:#D40000">'+dateFormat(row.omCandidateTrack.cashbackDate)+'</span>';
+                		var recruitType = row.omCandidateTrack.recruitType;
+                		if(recruitType == 0 || recruitType == 1){//普工或小时工
+                			info = '<div><a href="#" style="color:#0F70E1" onclick="entry('+row.omCandidateTrack.id+')">'+jp.getDictLabel(${fns:toJson(fns:getDictList('om_recruit_type'))}, recruitType, "—");+'</a></div>';
+                		}else if(recruitType == 2){//返费工
+                			info = '<button onclick="entry('+row.omCandidateTrack.id+')" class="btn btn-xs btn-new" style="color:#D40000;border:1px solid #D40000">返费</button>&nbsp;'+ 
+                			'<a style="color:#D40000" onclick="entry('+row.omCandidateTrack.id+')">'+dateFormat(row.omCandidateTrack.cashbackDate)+'</a>';
                 		}
                 	}
                     return info;
@@ -261,7 +265,6 @@ $(document).ready(function() {
                 }
               }
 		     ]
-		
 		});
 		
 		  
@@ -316,7 +319,7 @@ $(document).ready(function() {
   }
   //预约面试  
   function interview(id){
-	  jp.openSaveDialog('预约面试', "${ctx}/omcandidate/omCandidateTrack/interview?id="+id, '500PX', '500px');
+	  jp.openSaveDialog('预约面试', "${ctx}/omcandidate/omCandidateTrack/interview?id="+id, '500PX', '600px');
   }
   //重新选择面试时间  
   function interviewTime(id){
@@ -344,7 +347,7 @@ $(document).ready(function() {
   
   //录用	  
   function employ(id){
-	  jp.openSaveDialog('录用详情', "${ctx}/omcandidate/omCandidateTrack/employ?id="+id, '500PX', '380px');
+	  jp.openSaveDialog('录用详情', "${ctx}/omcandidate/omCandidateTrack/employ?id="+id, '500PX', '480px');
   }
   //未录用	  
   function noEmploy(id){
@@ -352,7 +355,7 @@ $(document).ready(function() {
   }
   //入职	  
   function entry(id){
-	  jp.openSaveDialog('入职详情', "${ctx}/omcandidate/omCandidateTrack/entry?id="+id, '500PX', '480px');
+	  jp.openSaveDialog('入职详情', "${ctx}/omcandidate/omCandidateTrack/entry?id="+id, '500PX', '580px');
   }
   //未入职	  
   function noEntry(id){
@@ -439,10 +442,92 @@ $(document).ready(function() {
           }
       });
   }
+  
+  //获取数据统计信息
+  function dataShow(){
+	var userName = "${belongUser}";
+	if(userName){
+		$.ajax({
+			url : "${ctx}/omcandidate/omCandidate/dataShow",
+			type : "POST",
+			dataType : "json",
+			async: false,
+			data : {userName: userName},
+			success : function(result) {
+				 if(result.success){
+					 var dataShow = result.body.dataShow;
+					 if(dataShow && dataShow.length>0){
+						 for(var i=0; i<dataShow.length; i++){
+							 $(".home-row span").eq(i).text(dataShow[i]);
+						 }
+					 }				
+				 }
+			},
+			error : function(xhr, type, errorThrown) {
+				layer.msg('获取数据统计失败');
+			}
+		});
+	}
+  }
 </script>
+<style type="text/css">
+	.header-data{font-weight:bold;color:#333333;font-size:24px}
+</style>
 </head>
 <body>
 	<div class="wrapper wrapper-content">
+		<div class="row home-row">
+			<div class="col-sm-12" >
+				<div class="home-stats col-sm-6" >
+				<a class="stat hvr-wobble-horizontal" style="text-align: center;font-size: 16px;font-weight:600;color: #666666;height: 100px">
+					<div class="label-header">我的用户</div>
+					<div class="col-sm-4">					
+						<div class="clearfix stat-detail">
+							<div class="label-body header-data"><span>0</span></div>
+							<div class="label-body">用户总数</div>
+						</div>
+					</div>
+					<div class="col-sm-4">					
+						<div class="clearfix stat-detail">
+							<div class="label-body header-data"><span>0</span></div>
+							<div class="label-body">正在跟进</div>
+						</div>
+					</div>
+					<div class="col-sm-4">					
+						<div class="clearfix stat-detail">
+							<div class="label-body header-data"><span>0</span></div>
+							<div class="label-body">在职人数</div>
+						</div>
+					</div>
+				</a>
+				</div>
+				<div class="home-stats col-sm-6">
+					<a class="stat hvr-wobble-horizontal" style="text-align: center;font-size: 16px;font-weight:600;color: #666666;height: 100px">
+						<div class="label-header">本周招聘</div>
+					<div class="col-sm-4">					
+						<div class="clearfix stat-detail">
+							<div class="label-body header-data"><span>0</span></div>
+							<div class="label-body">面试人次</div>
+						</div>
+					</div>
+					<div class="col-sm-4">					
+						<div class="clearfix stat-detail">
+							<div class="label-body header-data"><span>0</span></div>
+							<div class="label-body">录用人次</div>
+						</div>
+					</div>
+					<div class="col-sm-4">					
+						<div class="clearfix stat-detail">
+							<div class="label-body header-data"><span>0</span>%</div>
+							<div class="label-body">录用比例</div>
+						</div>
+					</div>
+					</a>
+				</div>
+			</div>
+		</div>
+
+	
 	<div class="panel panel-primary">
 	<div class="panel-heading">
 		<h3 class="panel-title">用户列表</h3>

+ 31 - 3
happy-job-base-system/src/main/webapp/webpage/modules/omcandidate/status/omEmployForm.jsp

@@ -6,7 +6,29 @@
 	<meta name="decorator" content="ani"/>
 	<script type="text/javascript">
 		$(document).ready(function() {
-					
+			$("#recruitType1").removeAttr("style");//radio button靠左对齐	
+			validateForm = $("#inputForm").validate({
+			 	rules: {
+			 		recruitType: {required:true}
+					},
+				messages: {
+					recruitType: {required: "请选择用工类型"}
+				}, 
+				
+				submitHandler: function(form){
+					loading('正在提交,请稍等...');
+					form.submit();
+				},
+				errorContainer: "#messageBox",
+				errorPlacement: function(error, element) {
+					$("#messageBox").text("输入有误,请先更正。");
+					if (element.is(":checkbox")||element.is(":radio")||element.parent().is(".input-append")){
+						error.appendTo(element.parent().parent().parent());
+					} else {
+						error.insertAfter(element);
+					}
+				}
+			});
 		});
 		var flag = true;
 		function save() {
@@ -37,9 +59,15 @@
 		<form:form id="inputForm" modelAttribute="omCandidateTrack" action="" method="post" class="form-horizontal">
 			<form:hidden path="id"/>
 			<div class="form-group col-sm-3">
-				<label class="col-sm-3 control-label">小时工/返费详情:</label>
+				<label class="col-sm-3 control-label"><font color="red">*</font>用工类型:</label>
+				<div class="col-sm-3">
+					<form:radiobuttons path="recruitType" items="${fns:getDictList('om_recruit_type')}" itemLabel="label" itemValue="value" htmlEscape="false" class="required" style="margin-left:15px"/>
+				</div>
+			</div>
+			<div class="form-group col-sm-3">
+				<label class="col-sm-3 control-label">备注详情:</label>
 				<div class="col-sm-3">
-	                <form:textarea path="cashbackDetail" htmlEscape="false" rows="9" class="form-control input-sm" maxlength="100" placeholder="请输入返费金额/详情"/>
+	                <form:textarea path="cashbackDetail" htmlEscape="false" rows="9" class="form-control input-sm" maxlength="100" placeholder="请输入备注详情"/>
 				</div>
 			</div>														
 		</form:form>

+ 68 - 8
happy-job-base-system/src/main/webapp/webpage/modules/omcandidate/status/omEntryForm.jsp

@@ -6,12 +6,17 @@
 	<meta name="decorator" content="ani"/>
 	<script type="text/javascript">
 		$(document).ready(function() {
+			$("#recruitType1").removeAttr("style");//radio button靠左对齐
+			recruitTypeChange();
 			$('#cashbackDate').datetimepicker({
 		        format: "YYYY-MM-DD"
 		    });	
 			$('#onboardingDate').datetimepicker({
 		        format: "YYYY-MM-DD"
-		    });	
+		    });
+			$('#actualCashbackDate').datetimepicker({
+		        format: "YYYY-MM-DD"
+		    });
 			validateForm = $("#inputForm").validate({
 			 	rules: {
 			 		cashbackDate: {required:true},
@@ -35,7 +40,19 @@
 						error.insertAfter(element);
 					}
 				}
-			});			
+			});	
+			
+			//监听备注详情
+			$("#cashbackDetail").change(function(){
+				var value = $("input[name='recruitType']:checked").val();
+				if(value==2 && $("#cashbackDetail").val().length<=0){
+					$("#cashbackDateDiv").hide();
+					$("#actualCashbackDiv").hide();
+				}else if(value==2){
+					$("#cashbackDateDiv").show();
+					$("#actualCashbackDiv").show();
+				}	
+		    })
 		});
 		var flag = true;
 		function save() {
@@ -59,20 +76,38 @@
 				}
 			}
         }
+		
+		//用工类型选择时触发事件
+		function recruitTypeChange(){
+			var value = $("input[name='recruitType']:checked").val();
+			if(value==0 || value==1){
+				$("#cashbackDateDiv").hide();
+				$("#actualCashbackDiv").hide();
+			}else if(value==2 && $("#cashbackDetail").val().length>0){
+				$("#cashbackDateDiv").show();
+				$("#actualCashbackDiv").show();
+			}
+		}
 	</script>
 </head>
 <body class="bg-white">
 	<div class="panel-body">
 		<form:form id="inputForm" modelAttribute="omCandidateTrack" action="" method="post" class="form-horizontal">
 			<form:hidden path="id"/>
-			<c:if test="${not empty omCandidateTrack.cashbackDetail}">
 			<div class="form-group col-sm-3">
-				<label class="col-sm-3 control-label">小时工/返费详情:</label>
+				<label class="col-sm-3 control-label"><font color="red">*</font>用工类型:</label>
 				<div class="col-sm-3">
-	                <form:textarea path="cashbackDetail" htmlEscape="false" rows="5" class="form-control input-sm" maxlength="100" readOnly="true"/>
+					<form:radiobuttons path="recruitType" items="${fns:getDictList('om_recruit_type')}" itemLabel="label" itemValue="value" htmlEscape="false" class="required" 
+									   onclick="recruitTypeChange()" style="margin-left:15px"/>
 				</div>
 			</div>
-			<div class="form-group col-sm-6">
+			<div class="form-group col-sm-3">
+				<label class="col-sm-3 control-label">备注详情:</label>
+				<div class="col-sm-3">
+	                <form:textarea path="cashbackDetail" id="cashbackDetail" htmlEscape="false" rows="5" class="form-control input-sm" maxlength="100"/>
+				</div>
+			</div>
+			<div class="form-group col-sm-6" id="cashbackDateDiv" style="display:none">
 				<label class="col-sm-3 control-label"><font color="red">*</font>返费时间:</label>
 				<div class="col-sm-3">
 					<div class='input-group form_datetime' id='cashbackDate'>
@@ -90,7 +125,6 @@
 					</div>
 				</div>
 			</div>	
-			</c:if>	
 			<div class="form-group col-sm-6">
 				<label class="col-sm-3 control-label"><font color="red">*</font>入职时间:</label>
 				<div class="col-sm-3">
@@ -108,7 +142,33 @@
 						</span>
 					</div>
 				</div>
-			</div>											
+			</div>	
+			<div id="actualCashbackDiv">
+			<div class="form-group col-sm-6">
+				<label class="col-sm-3 control-label">实际返费金额:</label>
+				<div class="col-sm-3">
+					 <form:input path="actualCashback" htmlEscape="false" class="form-control input-sm isFloatGtZero" maxlength="10"/>
+				</div>
+			</div>	
+			<div class="form-group col-sm-6">
+				<label class="col-sm-3 control-label">实际返费时间:</label>
+				<div class="col-sm-3">
+					<div class='input-group form_datetime' id='actualCashbackDate'>
+						<c:choose>
+							<c:when test="${omCandidateTrack.actualCashbackDate eq 'Fri Jan 01 00:00:00 CST 2100'}">
+								<input type='text' name="actualCashbackDate" class="form-control input-sm"  value=""/>
+							</c:when>
+							<c:otherwise>
+								<input type='text' name="actualCashbackDate" class="form-control input-sm"  value="<fmt:formatDate value="${omCandidateTrack.actualCashbackDate}" pattern="yyyy-MM-dd"/>"/>
+							</c:otherwise>
+						</c:choose>
+						<span class="input-group-addon">
+							<span class="glyphicon glyphicon-calendar"></span>
+						</span>
+					</div>
+				</div>
+			</div>
+			</div>									
 		</form:form>
 	</div>
 </body>

+ 11 - 2
happy-job-base-system/src/main/webapp/webpage/modules/omcandidate/status/omInviteInterviewForm.jsp

@@ -6,6 +6,7 @@
 	<meta name="decorator" content="ani"/>
 	<script type="text/javascript">
 		$(document).ready(function() {
+			$("#candidateType1").removeAttr("style");//radio button靠左对齐
 			$('#interviewTime').datetimepicker({
 		        format: "HH:mm"
 		    });
@@ -14,11 +15,13 @@
 		    });
 			validateForm = $("#inputForm").validate({
 			 	rules: {
+			 		candidateType: {required:true},
 			 		date: {required:true},
 			 		time: {required:true},
 			 		applyCompany: {required:true}
 					},
 				messages: {
+					candidateType: {required: "请选择订单类型"},
 					date: {required: "请选择面试日期"},
 					time: {required: "请选择面试时间"},
 					applyCompany: {required: "请输入意向公司全名"}
@@ -32,7 +35,7 @@
 				errorPlacement: function(error, element) {
 					$("#messageBox").text("输入有误,请先更正。");
 					if (element.is(":checkbox")||element.is(":radio")||element.parent().is(".input-append")){
-						error.appendTo(element.parent().parent());
+						error.appendTo(element.parent().parent().parent());
 					} else {
 						error.insertAfter(element);
 					}
@@ -72,6 +75,12 @@
 			<input type="hidden" name="candidateId" value="${omCandidate.id}">
 			<input type="hidden" name="interviewTime" id="interviewTimeHidden">
 			<div class="form-group col-sm-6">
+				<label class="col-sm-3 control-label"><font color="red">*</font>订单类型:</label>
+				<div class="col-sm-3">
+					<form:radiobuttons path="candidateType" items="${fns:getDictList('om_candidate_order_type')}" itemLabel="label" itemValue="value" htmlEscape="false" class="required" style="margin-left:15px"/>
+				</div>
+			</div>
+			<div class="form-group col-sm-6">
 				<label class="col-sm-3 control-label"><font color="red">*</font>面试日期:</label>
 				<div class="col-sm-3">
 					<div class='input-group form_datetime' id='interviewDate'>
@@ -86,7 +95,7 @@
 				<label class="col-sm-3 control-label"><font color="red">*</font>面试时间:</label>
 				<div class="col-sm-3">
 					<div class='input-group form_datetime' id='interviewTime'>
-						<input type='text' name="time" class="form-control input-sm"/>
+						<input type='text' name="time" value="13:00" class="form-control input-sm"/>
 						<span class="input-group-addon">
 							<span class="glyphicon glyphicon-calendar"></span>
 						</span>

+ 71 - 7
happy-job-module-crm/src/main/java/com/jeeplus/modules/omcandidate/entity/OmCandidate.java

@@ -5,8 +5,6 @@ package com.jeeplus.modules.omcandidate.entity;
 
 import java.util.Date;
 import com.fasterxml.jackson.annotation.JsonFormat;
-import javax.validation.constraints.NotNull;
-
 import com.jeeplus.core.persistence.DataEntity;
 import com.jeeplus.common.utils.excel.annotation.ExcelField;
 
@@ -23,6 +21,8 @@ public class OmCandidate extends DataEntity<OmCandidate> {
 	private Integer birthYear;		// 出生年份
 	private Integer gender;		// 性别(0:未知 1:男性  2:女性)
 	private String idcardNumber;		// 身份证号
+	private String idCardFront;		// 身份证正面
+	private String idCardBack;		// 身份证反面
 	private String nativePlace;		// 籍贯
 	private Integer qualification;		// 学历(0:初中及以下 1:中专/高中 2:大专 3.本科及以上)
 	private Boolean isPlacement;		// 是否实习生(0:否 1:是)
@@ -30,6 +30,7 @@ public class OmCandidate extends DataEntity<OmCandidate> {
 	private String tattooingDetail;		// 纹身描述
 	private Integer type;		// 类型(0:普通用户 1:优质用户 2:黑名单)
 	private Integer status;		// 最新状态(0:候选中 1:待面试 2:面试未通过 3:待录用 4:未录用 5:待入职 6:未入职 7:已入职 8:已离职)
+	private Integer userFrom;	//用户来源(0:Boss直聘 1:58同城 2:智联招聘 3:线下获客 4:其它)
 	private Date latestTrackTime;		// 最新跟进时间(新增时就是创建时间)
 	private String latestTrackBy;		// 最新跟进者(新增时就是创建者)
 	private String remark;		// 备注
@@ -42,6 +43,10 @@ public class OmCandidate extends DataEntity<OmCandidate> {
 	private Date blacklistTime;		  //拉黑时间(非表字段,仅供实体传参使用)
 	private Integer followUp;   	 //跟进情况(0:近期跟进 1:近期未跟进)(非表字段,仅供实体传参使用)
 	private String no;				//导出excel给个序号(非表字段,仅供实体传参使用)
+	private Date latestInterviewTime;		//最近面试时间
+	private String latestApplyCompany;	//最近面试公司
+	private Date latestOnboardingDate;	//最近入职日期
+	private Integer latestRecruitType;		//最近面试时间
 	
 	public OmCandidate() {
 		super();
@@ -103,6 +108,22 @@ public class OmCandidate extends DataEntity<OmCandidate> {
 		this.idcardNumber = idcardNumber;
 	}
 	
+	public String getIdCardFront() {
+		return idCardFront;
+	}
+
+	public void setIdCardFront(String idCardFront) {
+		this.idCardFront = idCardFront;
+	}
+
+	public String getIdCardBack() {
+		return idCardBack;
+	}
+
+	public void setIdCardBack(String idCardBack) {
+		this.idCardBack = idCardBack;
+	}
+
 	public String getNativePlace() {
 		return nativePlace;
 	}
@@ -151,7 +172,7 @@ public class OmCandidate extends DataEntity<OmCandidate> {
 		this.type = type;
 	}
 	
-	@ExcelField(title="状态",dictType="om_candidate_status_excel", align=2, sort=4)
+	@ExcelField(title="当前状态",dictType="om_candidate_status_excel", align=2, sort=4)
 	public Integer getStatus() {
 		return status;
 	}
@@ -160,6 +181,14 @@ public class OmCandidate extends DataEntity<OmCandidate> {
 		this.status = status;
 	}
 	
+	public Integer getUserFrom() {
+		return userFrom;
+	}
+
+	public void setUserFrom(Integer userFrom) {
+		this.userFrom = userFrom;
+	}
+
 	public String getLatestTrackBy() {
 		return latestTrackBy;
 	}
@@ -168,9 +197,6 @@ public class OmCandidate extends DataEntity<OmCandidate> {
 		this.latestTrackBy = latestTrackBy;
 	}
 	
-	@JsonFormat(pattern = "yyyy/MM/dd HH:mm")
-	@NotNull(message="最新跟进时间(新增时就是创建时间)不能为空")
-	@ExcelField(title="最后跟进时间", align=2, sort=6)
 	public Date getLatestTrackTime() {
 		return latestTrackTime;
 	}
@@ -203,7 +229,7 @@ public class OmCandidate extends DataEntity<OmCandidate> {
 		this.cashbackDate = cashbackDate;
 	}
 	
-	@ExcelField(title="跟进人", align=2, sort=5)
+	@ExcelField(title="招聘专员", align=2, sort=5)
 	public String getBelongUser() {
 		return belongUser;
 	}
@@ -228,4 +254,42 @@ public class OmCandidate extends DataEntity<OmCandidate> {
 		this.followUp = followUp;
 	}
 	
+	@JsonFormat(pattern = "yyyy/MM/dd HH:mm")
+	@ExcelField(title="面试时间", align=2, sort=6)
+	public Date getLatestInterviewTime() {
+		return latestInterviewTime;
+	}
+	
+	public void setLatestInterviewTime(Date latestInterviewTime) {
+		this.latestInterviewTime = latestInterviewTime;
+	}
+	
+	
+	@ExcelField(title="面试企业", align=2, sort=7)
+	public String getLatestApplyCompany() {
+		return latestApplyCompany;
+	}
+	
+	public void setLatestApplyCompany(String latestApplyCompany) {
+		this.latestApplyCompany = latestApplyCompany;
+	}
+	
+	@JsonFormat(pattern = "yyyy/MM/dd")
+	@ExcelField(title="入职时间", align=2, sort=8)
+	public Date getLatestOnboardingDate() {
+		return latestOnboardingDate;
+	}
+
+	public void setLatestOnboardingDate(Date latestOnboardingDate) {
+		this.latestOnboardingDate = latestOnboardingDate;
+	}
+	
+	@ExcelField(title="用工类型",dictType="om_recruit_type", align=2, sort=9)
+	public Integer getLatestRecruitType() {
+		return latestRecruitType;
+	}
+
+	public void setLatestRecruitType(Integer latestRecruitType) {
+		this.latestRecruitType = latestRecruitType;
+	}
 }

+ 38 - 1
happy-job-module-crm/src/main/java/com/jeeplus/modules/omcandidate/entity/OmCandidateTrack.java

@@ -3,6 +3,7 @@
  */
 package com.jeeplus.modules.omcandidate.entity;
 
+import java.math.BigDecimal;
 import java.util.Date;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import javax.validation.constraints.NotNull;
@@ -19,13 +20,17 @@ public class OmCandidateTrack extends DataEntity<OmCandidateTrack> {
 	
 	private static final long serialVersionUID = 1L;
 	private Integer candidateId;		// 候选人id
+	private Integer candidateType;		// 订单类型(0:本部单 1:外送单),因为有老数据,且老数据属于哪种类别未知,所以此字段为允许NULL,老数据都为NULL
 	private String applyCompany;		// 意向企业
 	private Date interviewTime;		// 面试时间
 	private String interviewNotPassReason;		// 面试未通过原因
-	private String cashbackDetail;		// 返费详情
+	private String cashbackDetail;		// 返费详情(此字段录用和入职状态共用)
 	private String noEmploymentReason;		// 未录用原因
+	private Integer recruitType;        // 用工类型(0:普工 1:小时工 2:返费工),因为有老数据,且老数据属于哪种类别未知,所以此字段为允许NULL,老数据都为NULL
 	private Date onboardingDate;		// 入职时间
 	private Date cashbackDate;		// 预计返费时间
+	private BigDecimal actualCashback; // 实际返费金额
+	private Date actualCashbackDate;   // 实际返费时间
 	private String noOnboardingReason;		// 未入职原因
 	private String outgoingRemark;		// 离职备注
 	private Integer status;		// 最新状态(1:待面试 2:面试未通过 3:待录用 4:未录用 5:待入职 6:未入职 7:已入职 8:已离职)
@@ -54,6 +59,14 @@ public class OmCandidateTrack extends DataEntity<OmCandidateTrack> {
 		this.candidateId = candidateId;
 	}
 	
+	public Integer getCandidateType() {
+		return candidateType;
+	}
+
+	public void setCandidateType(Integer candidateType) {
+		this.candidateType = candidateType;
+	}
+
 	@ExcelField(title="意向企业", align=2, sort=2)
 	public String getApplyCompany() {
 		return applyCompany;
@@ -100,6 +113,14 @@ public class OmCandidateTrack extends DataEntity<OmCandidateTrack> {
 		this.noEmploymentReason = noEmploymentReason;
 	}
 	
+	public Integer getRecruitType() {
+		return recruitType;
+	}
+
+	public void setRecruitType(Integer recruitType) {
+		this.recruitType = recruitType;
+	}
+
 	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
 	@ExcelField(title="入职时间", align=2, sort=7)
 	public Date getOnboardingDate() {
@@ -120,6 +141,22 @@ public class OmCandidateTrack extends DataEntity<OmCandidateTrack> {
 		this.cashbackDate = cashbackDate;
 	}
 	
+	public BigDecimal getActualCashback() {
+		return actualCashback;
+	}
+
+	public void setActualCashback(BigDecimal actualCashback) {
+		this.actualCashback = actualCashback;
+	}
+
+	public Date getActualCashbackDate() {
+		return actualCashbackDate;
+	}
+
+	public void setActualCashbackDate(Date actualCashbackDate) {
+		this.actualCashbackDate = actualCashbackDate;
+	}
+
 	@ExcelField(title="未入职原因", align=2, sort=9)
 	public String getNoOnboardingReason() {
 		return noOnboardingReason;

+ 5 - 1
happy-job-module-crm/src/main/java/com/jeeplus/modules/omcandidate/mapper/OmCandidateMapper.java

@@ -5,6 +5,8 @@ package com.jeeplus.modules.omcandidate.mapper;
 
 import java.util.List;
 
+import org.apache.ibatis.annotations.Param;
+
 import com.jeeplus.core.persistence.BaseMapper;
 import com.jeeplus.core.persistence.annotation.MyBatisMapper;
 import com.jeeplus.modules.omcandidate.entity.OmCandidate;
@@ -20,5 +22,7 @@ public interface OmCandidateMapper extends BaseMapper<OmCandidate> {
 	//获取当前用户的下属人员
 	List<OmUser>findAllSubordinate(String officeId);
 	//获取当前用户的归属候选人个数
-	Integer findCandidateCountByUserName (String name);
+	Integer findCandidateCountByUserName(@Param("userName")String userName);
+	//获取候选人的数据统计
+	List<Integer> findCandidateDataByUserName(@Param("userName")String userName);
 }

+ 31 - 2
happy-job-module-crm/src/main/java/com/jeeplus/modules/omcandidate/mapper/xml/OmCandidateMapper.xml

@@ -9,6 +9,8 @@
 		a.birth_year AS "birthYear",
 		a.gender AS "gender",
 		a.idcard_number AS "idcardNumber",
+		a.id_card_front AS "idCardFront",
+		a.id_card_back AS "idCardBack",
 		a.native_place AS "nativePlace",
 		a.qualification AS "qualification",
 		a.is_placement AS "isPlacement",
@@ -16,6 +18,7 @@
 		a.tattooing_detail AS "tattooingDetail",
 		a.type AS "type",
 		a.status AS "status",
+		a.user_from AS "userFrom",
 		a.latest_track_time AS "latestTrackTime",
 		a.latest_track_by AS "latestTrackBy",
 		a.remark AS "remark",
@@ -24,7 +27,11 @@
 		a.update_date AS "updateDate",
 		a.update_by AS "updateBy.id",
 		(select b.belong_user from om_candidate_belong b where b.candidate_id=a.id order by b.id DESC limit 1) AS "belongUser",
-		(select c.belong_time from om_candidate_belong c where c.type=2 and c.candidate_id=a.id order by c.id DESC limit 1) AS "blacklistTime"
+		(select c.belong_time from om_candidate_belong c where c.type=2 and c.candidate_id=a.id order by c.id DESC limit 1) AS "blacklistTime",
+		(select t.interview_time from om_candidate_track t where t.candidate_id=a.id order by t.id DESC limit 1) AS "latestInterviewTime",
+		(select t1.apply_company from om_candidate_track t1 where t1.candidate_id=a.id order by t1.id DESC limit 1) AS "latestApplyCompany",
+		(select t2.onboarding_date from om_candidate_track t2 where t2.candidate_id=a.id order by t2.id DESC limit 1) AS "latestOnboardingDate",
+		(select t3.recruit_type from om_candidate_track t3 where t3.candidate_id=a.id order by t3.id DESC limit 1) AS "latestRecruitType"
 	</sql>
 	
 	<sql id="omCandidateJoins">
@@ -102,6 +109,8 @@
 			birth_year,
 			gender,
 			idcard_number,
+			id_card_front,
+			id_card_back,
 			native_place,
 			qualification,
 			is_placement,
@@ -109,6 +118,7 @@
 			tattooing_detail,
 			type,
 			status,
+			user_from,
 			latest_track_time,
 			latest_track_by,
 			remark,
@@ -122,6 +132,8 @@
 			#{birthYear},
 			#{gender},
 			#{idcardNumber},
+			#{idCardFront},
+			#{idCardBack},
 			#{nativePlace},
 			#{qualification},
 			#{isPlacement},
@@ -129,6 +141,7 @@
 			#{tattooingDetail},
 			#{type},
 			#{status},
+			#{userFrom},
 			#{latestTrackTime},
 			#{latestTrackBy},
 			#{remark},
@@ -147,6 +160,8 @@
 			<if test="birthYear != null">birth_year = #{birthYear},</if>
 			<if test="gender != null">gender = #{gender},</if>
 			<if test="idcardNumber != null">idcard_number = #{idcardNumber},</if>
+			<if test="idCardFront != null">id_card_front = #{idCardFront},</if>
+			<if test="idCardBack != null">id_card_back = #{idCardBack},</if>
 			<if test="nativePlace != null">native_place = #{nativePlace},</if>
 			<if test="qualification != null">qualification = #{qualification},</if>			
 			<if test="isPlacement != null">is_placement = #{isPlacement},</if>
@@ -154,6 +169,7 @@
 			<if test="tattooingDetail != null">tattooing_detail = #{tattooingDetail},</if>
 			<if test="type != null">type = #{type},</if>
 			<if test="status != null">status = #{status},</if>
+			<if test="userFrom != null">user_from = #{userFrom},</if>
 			<if test="latestTrackTime != null">latest_track_time = #{latestTrackTime},</if>
 			<if test="latestTrackBy != null">latest_track_by = #{latestTrackBy},</if>
 			<if test="remark != null">remark = #{remark},</if>
@@ -189,6 +205,19 @@
 	
 	<!-- 获取当前用户的归属候选人个数 -->
 	<select id="findCandidateCountByUserName" resultType="java.lang.Integer">
-		SELECT COUNT(s.id) FROM (SELECT p.* FROM (SELECT b.* FROM om_candidate_belong b ORDER BY b.id DESC LIMIT 999999999) as p GROUP BY p.candidate_id HAVING p.type &lt;&gt;2 AND p.belong_user = #{name} ORDER BY p.id) AS s
+		SELECT COUNT(s.id) FROM (SELECT p.* FROM (SELECT b.* FROM om_candidate_belong b ORDER BY b.id DESC LIMIT 999999999) as p GROUP BY p.candidate_id HAVING p.type &lt;&gt;2 AND p.belong_user = #{userName} ORDER BY p.id) AS s
+	</select>
+	
+	<!-- 获取当前招聘专员候选人的数据统计 -->
+	<select id="findCandidateDataByUserName" resultType="java.lang.Integer">
+		SELECT COUNT(s.id) FROM (SELECT p.* FROM (SELECT b.* FROM om_candidate_belong b ORDER BY b.id DESC LIMIT 999999999) as p GROUP BY p.candidate_id HAVING p.type &lt;&gt; 2 AND p.belong_user = #{userName} ORDER BY p.id) AS s
+		UNION ALL
+		SELECT COUNT(s.id) FROM (SELECT p.* FROM (SELECT b.* FROM om_candidate_belong b ORDER BY b.id DESC LIMIT 999999999) as p GROUP BY p.candidate_id HAVING p.type &lt;&gt; 2 AND p.belong_user = #{userName} ORDER BY p.id) AS s left join om_candidate o on o.id=s.candidate_id where o.status IN (1,3,5)
+		UNION ALL
+		SELECT COUNT(s.id) FROM (SELECT p.* FROM (SELECT b.* FROM om_candidate_belong b ORDER BY b.id DESC LIMIT 999999999) as p GROUP BY p.candidate_id HAVING p.type &lt;&gt; 2 AND p.belong_user = #{userName} ORDER BY p.id) AS s left join om_candidate o on o.id=s.candidate_id where o.status=7
+		UNION ALL
+		SELECT COUNT(d.id) FROM om_candidate_track_detail d LEFT JOIN om_candidate_track t ON t.id=d.candidate_track_id WHERE YEARWEEK(DATE_FORMAT(t.interview_time,'%Y-%m-%d')) = YEARWEEK(NOW()) AND (d.status = 2 OR d.status = 3) AND d.track_by = #{userName}
+		UNION ALL
+		SELECT COUNT(d.id) FROM om_candidate_track_detail d WHERE YEARWEEK(DATE_FORMAT(d.track_time,'%Y-%m-%d')) = YEARWEEK(NOW()) AND d.status = 5 AND d.track_by = #{userName}
 	</select>
 </mapper>

+ 17 - 1
happy-job-module-crm/src/main/java/com/jeeplus/modules/omcandidate/mapper/xml/OmCandidateTrackMapper.xml

@@ -5,13 +5,17 @@
 	<sql id="omCandidateTrackColumns">
 		a.id AS "id",
 		a.candidate_id AS "candidateId",
+		a.candidate_type AS "candidateType",
 		a.apply_company AS "applyCompany",
 		a.interview_time AS "interviewTime",
 		a.interview_not_pass_reason AS "interviewNotPassReason",
 		a.cashback_detail AS "cashbackDetail",
 		a.no_employment_reason AS "noEmploymentReason",
+		a.recruit_type  AS "recruitType",
 		a.onboarding_date AS "onboardingDate",
 		a.cashback_date AS "cashbackDate",
+		a.actual_cashback AS "actualCashback",
+		a.actual_cashback_date AS "actualCashbackDate",
 		a.no_onboarding_reason AS "noOnboardingReason",
 		a.outgoing_remark AS "outgoingRemark",
 		a.status AS "status",
@@ -74,13 +78,17 @@
 	<insert id="insert" parameterType="OmCandidateTrack" useGeneratedKeys="true" keyProperty="id">
 		INSERT INTO om_candidate_track(
 			candidate_id,
+			candidate_type,
 			apply_company,
 			interview_time,
 			interview_not_pass_reason,
 			cashback_detail,
 			no_employment_reason,
+			recruit_type,
 			onboarding_date,
 			cashback_date,
+			actual_cashback,
+			actual_cashback_date,
 			no_onboarding_reason,
 			outgoing_remark,
 			status,
@@ -88,13 +96,17 @@
 			generate_by
 		) VALUES (
 			#{candidateId},
+			#{candidateType},
 			#{applyCompany},
 			#{interviewTime},
 			#{interviewNotPassReason},
 			#{cashbackDetail},
 			#{noEmploymentReason},
+			#{recruitType},
 			#{onboardingDate},
 			#{cashbackDate},
+			#{actualCashback},
+			#{actualCashbackDate},
 			#{noOnboardingReason},
 			#{outgoingRemark},
 			#{status},
@@ -106,13 +118,17 @@
 	<update id="update" parameterType="OmCandidateTrack" useGeneratedKeys="true" keyProperty="id">
 		UPDATE om_candidate_track 
 		<trim prefix="set" suffixOverrides=",">
+			<if test="candidateType != null">candidate_type = #{candidateType},</if>
 			<if test="applyCompany != null">apply_company = #{applyCompany},</if>
 			<if test="interviewTime != null">interview_time = #{interviewTime},</if>
 			<if test="interviewNotPassReason != null">interview_not_pass_reason = #{interviewNotPassReason},</if>
 			<if test="cashbackDetail != null">cashback_detail = #{cashbackDetail},</if>
 			<if test="noEmploymentReason != null">no_employment_reason = #{noEmploymentReason},</if>
+			<if test="recruitType != null">recruit_type = #{recruitType},</if>
 			<if test="onboardingDate != null">onboarding_date = #{onboardingDate},</if>
-			<if test="cashbackDate != null">cashback_date = #{cashbackDate},</if>			
+			<if test="cashbackDate != null">cashback_date = #{cashbackDate},</if>	
+			<if test="actualCashback != null">actual_cashback = #{actualCashback},</if>
+			<if test="actualCashbackDate != null">actual_cashback_date = #{actualCashbackDate},</if>		
 			<if test="noOnboardingReason != null">no_onboarding_reason = #{noOnboardingReason},</if>
 			<if test="outgoingRemark != null">outgoing_remark = #{outgoingRemark},</if>
 			<if test="status != null">status = #{status}</if>

+ 7 - 2
happy-job-module-crm/src/main/java/com/jeeplus/modules/omcandidate/service/OmCandidateService.java

@@ -62,10 +62,15 @@ public class OmCandidateService extends CrudService<OmCandidateMapper, OmCandida
 	}
 	
 	//获取当前用户的归属候选人个数
-	public Integer findCandidateCountByUserName (String name) {
-		return omCandidateMapper.findCandidateCountByUserName(name);
+	public Integer findCandidateCountByUserName (String userName) {
+		return omCandidateMapper.findCandidateCountByUserName(userName);
 	}
 	
+	//获取当前用户的归属候选人的数据统计
+	public List<Integer> findCandidateDataByUserName (String userName) {
+		return omCandidateMapper.findCandidateDataByUserName(userName);
+	}
+		
 	/**
 	 * 新增或编辑候选人保存(新增时添加归属记录至归属记录表)
 	 * @param omCandidate

+ 24 - 1
happy-job-module-crm/src/main/java/com/jeeplus/modules/omcandidate/web/OmCandidateController.java

@@ -3,8 +3,10 @@
  */
 package com.jeeplus.modules.omcandidate.web;
 
+import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 
@@ -96,6 +98,7 @@ public class OmCandidateController extends BaseController {
 		model.addAttribute("omCandidate", omCandidate);
 		return "modules/omcandidate/omBlacklistCandidateList";
 	}
+	
 	/**
 	 * 候选人列表数据
 	 */
@@ -308,7 +311,27 @@ public class OmCandidateController extends BaseController {
 		j.setSuccess(true);
 		return j;
 	}
-	   
+	  
+	/**
+	 * 获取当前招聘专员头部数据统计(用户总数、正在跟进、在职人数、面试人次、录用人次和录用比例(录用人次/面试人次))
+	 */
+	@ResponseBody
+	@RequestMapping(value = "dataShow")
+	public AjaxJson dataShow(String userName){
+		AjaxJson j = new AjaxJson();
+		List<Integer> dataShow = omCandidateService.findCandidateDataByUserName(userName);
+		BigDecimal employRatio = new BigDecimal(0);//录用比例:录用人次/面试人次
+		if(dataShow.get(3)!=null && dataShow.get(3)!=0) {
+			employRatio = new BigDecimal(dataShow.get(4)).divide(new BigDecimal(dataShow.get(3)),2,BigDecimal.ROUND_HALF_UP)
+						  .multiply(new BigDecimal(100)).setScale(0, BigDecimal.ROUND_HALF_UP);
+		}
+		dataShow.add(Integer.parseInt(String.valueOf(employRatio)));//将录用比例放入LIST:录用人次/面试人次
+		LinkedHashMap<String, Object> body = new LinkedHashMap<String, Object>();
+		body.put("dataShow", dataShow);			
+		j.setBody(body);
+		return j;
+	}
+	
 	/**
 	 * 导出excel文件
 	 */

+ 1 - 1
happy-job-module-crm/src/main/java/com/jeeplus/modules/omcandidate/web/OmCandidateTrackController.java

@@ -215,7 +215,7 @@ public class OmCandidateTrackController extends BaseController {
 	}
 	
 	/**
-	 * 入职信息保存
+	 * 办理离职保存
 	 */
 	@ResponseBody
 	@RequestMapping(value = "quitSave")