package quartz; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.UUID; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import com.amarsoft.are.jbo.BizObject; import com.amarsoft.are.jbo.BizObjectManager; import com.amarsoft.are.jbo.JBOException; import com.amarsoft.are.jbo.JBOFactory; import com.amarsoft.are.jbo.JBOTransaction; import com.amarsoft.are.util.StringFunction; import com.base.util.QuartzUtil; //import com.tenwa.action.channelportal.ContractSignAction; //import com.tenwa.action.channelportal.comm.ContractTransferRightForEnd; import com.tenwa.comm.util.jboutil.DataOperatorUtil; import com.tenwa.lease.app.quartzmession.JobInitUserName; import jbo.com.tenwa.lease.comm.DAY_DISTRIBUTE; import jbo.com.tenwa.lease.comm.VI_AUTODISTRIBUTE; import jbo.sys.OVERDUE_DUNNING_INFO; public class AutoDistribute implements Job { private JobInitUserName jboName; //指定的北财催款员id(正式环境需要修改) private String beicaiUserID = "8009011U00000021"; @Override public void execute(JobExecutionContext arg0) throws JobExecutionException { String startime = StringFunction.getTodayNow(); Object userId = arg0.getTrigger().getJobDataMap().get("CurUserId"); String curUserId = userId == null ? "system" : userId.toString(); JBOTransaction tx = null; try { tx = JBOFactory.createJBOTransaction(); //给非北财分配催款员 ownershipTransferSign(tx, arg0); //北财逾期的合同分配给指定催款员 distributeBeicai(tx, arg0); QuartzUtil.insertLog(startime, "quartz.AutoDistribute", "success","成功", curUserId); } catch (Exception e) { QuartzUtil.insertLog(startime, "quartz.AutoDistribute", "error","失败", curUserId); e.printStackTrace(); try { if(tx!=null)tx.rollback(); } catch (JBOException e1) { e1.printStackTrace(); } }finally { try { if(tx!=null)tx.commit(); } catch (JBOException e) { e.printStackTrace(); } } } /** * 北财逾期的合同分配给指定催款员 * @param tx * @param arg0 * @throws JBOException */ public void distributeBeicai(JBOTransaction tx, JobExecutionContext arg0) { try { // 获取所有逾期的需要催收的合同信息 BizObjectManager bom; BizObjectManager overdueManager; overdueManager = JBOFactory.getBizObjectManager(OVERDUE_DUNNING_INFO.CLASS_NAME, tx); bom = JBOFactory.getBizObjectManager(VI_AUTODISTRIBUTE.CLASS_NAME, tx); @SuppressWarnings("unchecked") List boList = bom.createQuery("SELECT O.id,O.over_days FROM O WHERE O.project_manage IN (SELECT ur.userid FROM jbo.awe.USER_ROLE ur WHERE ur.roleid ='800R00000044')").getResultList(false); for (BizObject bo : boList) { String contractId = bo.getAttribute("id").toString(); //查询是否已经有催款员(目前北财只有一个指定的催款员) BizObject overdue = overdueManager.createQuery("contract_id=:contract_id").setParameter("contract_id", contractId).getSingleResult(false); if(overdue == null){ BizObject overdueBizObject = overdueManager.newObject(); String uuid = UUID.randomUUID().toString().replace("-", ""); overdueBizObject.setAttributeValue("id", uuid); overdueBizObject.setAttributeValue("part_dept", beicaiUserID); overdueBizObject.setAttributeValue("contract_id", contractId); overdueManager.saveObject(overdueBizObject); } } }catch(JBOException e) { e.printStackTrace(); } } /** * 给非北财分配催款员 * @param tx * @param arg0 * @throws Exception */ public void ownershipTransferSign(JBOTransaction tx,JobExecutionContext arg0) throws Exception{ //获取天数 Map dayMap = getDay(tx); int beginDay1 = dayMap.get("beginDay1"); int endDay1 = dayMap.get("endDay1"); int beginDay2 = dayMap.get("beginDay2"); int endDay2 = dayMap.get("endDay2"); int beginDay3 = dayMap.get("beginDay3"); //获取催款员角色下的用户 Map userMap = getUser(tx); String[] A = userMap.get("A");//轻催租 String[] B = userMap.get("B");//中催组 String[] C = userMap.get("C");//重催组 BizObjectManager overdueManager = JBOFactory.getBizObjectManager(OVERDUE_DUNNING_INFO.CLASS_NAME, tx); //获取所有逾期的需要催收的合同信息 String conInfo1 = getContractId(tx); if(!(conInfo1 == null || conInfo1.length() <= 0)){ String[] conInfos = conInfo1.split(","); for(String conInfo:conInfos){ String contract_id = conInfo.split("@")[0];//合同id String overDays = conInfo.split("@")[1];//逾期天数 int overDay = Integer.valueOf(overDays); //根据合同id查询表中数据,有则修改,无则新增 BizObject overdue = overdueManager.createQuery("contract_id=:contract_id").setParameter("contract_id", contract_id).getSingleResult(false); if(overdue!=null){//修改 //催款员 String partDept = overdue.getAttribute("part_dept").toString(); if(overDay>=beginDay2 && overDay<=endDay2){ if(Arrays.asList(B).contains(partDept)){ //此催款员是中催组的人员,不做任何操作 }else{//此催款员不是中催组的人员,则修改为中催组的人员 String person = getBPerson(tx); updatePartDept(overdueManager, contract_id, person); } }else if(overDay>=beginDay3){ if(Arrays.asList(C).contains(partDept)){ //此催款员是重催组的人员,不做任何操作 }else{ //此催款员不是重催组的人员,则修改为重催组的人员 String person = getCPerson(tx); updatePartDept(overdueManager, contract_id, person); } }else if(overDay>=beginDay1 && overDay<=endDay1){ if(Arrays.asList(A).contains(partDept)){ //此催款员是轻催组的人员,不做任何操作 }else{ //此催款员不是中催组的人员,则修改为轻催组的人员 String person = getAPerson(tx); updatePartDept(overdueManager, contract_id, person); }//此催款员不是中催组的人员,则修改为轻催组的人员 } }else{//新增 if(overDay>=beginDay1 && overDay<=endDay1){ String person = getAPerson(tx); savePartDept(overdueManager, contract_id,person); }else if(overDay>=beginDay2 && overDay<=endDay2){ String person = getBPerson(tx); savePartDept(overdueManager, contract_id ,person); }else if(overDay>=beginDay3){ String person = getCPerson(tx); savePartDept(overdueManager, contract_id, person); } } } } } /** * 修改方法 * @param overdueManager * @param contract_id * @param person * @throws JBOException */ private void updatePartDept(BizObjectManager overdueManager, String contract_id, String person) throws JBOException { overdueManager.createQuery("UPDATE O SET O.part_dept='"+person+"' WHERE contract_id='"+contract_id+"'").executeUpdate(); } /** * 保存方法 * @param overdueManager * @param contract_id * @param overdueBizObject * @param person * @throws JBOException */ private void savePartDept(BizObjectManager overdueManager, String contract_id, String person) throws JBOException { BizObject overdueBizObject = overdueManager.newObject(); String uuid = UUID.randomUUID().toString().replace("-", ""); overdueBizObject.setAttributeValue("id", uuid); overdueBizObject.setAttributeValue("part_dept", person); overdueBizObject.setAttributeValue("contract_id", contract_id); overdueManager.saveObject(overdueBizObject); } /** * 获取催款员的天数配置 * @param tx * @return * @throws JBOException */ public Map getDay(JBOTransaction tx) throws JBOException { Map map = new HashMap(); int beginDay1 = 0; int endDay1 = 0; int beginDay2 = 0; int endDay2 = 0; int beginDay3 = 0; // 获取天数 @SuppressWarnings("unchecked") List dayDistribute = JBOFactory.createBizObjectQuery(DAY_DISTRIBUTE.CLASS_NAME, "select * from O").getResultList(false); for (BizObject bizObject : dayDistribute) { String role = bizObject.getAttribute("role").toString(); int beginDay = bizObject.getAttribute("begin_day").getInt(); int endDay = bizObject.getAttribute("end_day") == null ? 0 : bizObject.getAttribute("end_day").getInt(); if ("轻催组".equals(role)) { beginDay1 = beginDay; endDay1 = endDay; } else if ("中催组".equals(role)) { beginDay2 = beginDay; endDay2 = endDay; } else { beginDay3 = beginDay; } } map.put("beginDay1", beginDay1); map.put("endDay1", endDay1); map.put("beginDay2", beginDay2); map.put("endDay2", endDay2); map.put("beginDay3", beginDay3); return map; } /** * 获取催款员角色下的用户 * @param tx * @return */ public Map getUser(JBOTransaction tx){ Map usermap = new HashMap(); try { //轻催组下的用户 String Sql1="SELECT ur.roleid,O.userid AS userid,O.loginid,O.username FROM USER_INFO O LEFT JOIN USER_ROLE AS ur ON ur.USERID = O.USERID LEFT JOIN USER_TASK_INFO uti ON uti.userid=O.userid AND uti.roleid=ur.roleid WHERE O.status='1' AND ur.roleid='800R00000041'"; List>dataListA = DataOperatorUtil.getDataBySql(tx, Sql1, null); String userA = new String(); for (Map map : dataListA) { String userid = map.get("userid"); userA += userid+"@"; } String[] A =null; A = userA.split("@"); usermap.put("A", A); //中催组下的用户 String Sql2="SELECT ur.roleid,O.userid AS userid,O.loginid,O.username FROM USER_INFO O LEFT JOIN USER_ROLE AS ur ON ur.USERID = O.USERID LEFT JOIN USER_TASK_INFO uti ON uti.userid=O.userid AND uti.roleid=ur.roleid WHERE O.status='1' AND ur.roleid='800R00000042'"; List> dataListB = DataOperatorUtil.getDataBySql(tx, Sql2, null); String userB = new String(); for (Map map : dataListB) { String userid = map.get("userid"); userB += userid+"@"; } String[] B =null; B = userB.split("@"); usermap.put("B", B); //重催组下的用户 String Sql3="SELECT ur.roleid,O.userid,O.loginid,O.username FROM USER_INFO O LEFT JOIN USER_ROLE AS ur ON ur.USERID = O.USERID LEFT JOIN USER_TASK_INFO uti ON uti.userid=O.userid AND uti.roleid=ur.roleid WHERE O.status='1' AND ur.roleid='800R00000043'"; List> dataListC = DataOperatorUtil.getDataBySql(tx, Sql3, null); String userC = new String(); for (Map map : dataListC) { String userid = map.get("userid"); userC += userid+"@"; } String[] C =null; C = userC.split("@"); usermap.put("C", C); } catch (Exception e) { e.printStackTrace(); } return usermap; } /** * 获取所有逾期的需要催收的合同信息 * * @param tx * @return * @throws Exception */ public String getContractId(JBOTransaction tx) throws Exception { /* * BizObjectManager * bom=JBOFactory.getBizObjectManager(LB_CONTRACT_INFO.CLASS_NAME,tx); * List boList = bom.createQuery( * "SELECT O.id,vo.over_days FROM O LEFT JOIN jbo.com.tenwa.lease.comm.LB_UNION_LESSEE lul ON lul.contract_id = O.id LEFT JOIN jbo.sys.OVERDUE_DUNNING_INFO odi ON odi.contract_id = O.id LEFT JOIN jbo.sys.USER_INFO ui ON ui.userid = odi.part_dept LEFT JOIN jbo.app.tenwa.calc.VI_OVERDUE_RENT_PLAN_SUM vo ON vo.contract_id=O.id WHERE lul.is_main='Y' AND O.contract_status='31' AND vo.over_money>0" * ).getResultList(true); */ // 获取所有逾期的需要催收的合同信息(非北财合同) BizObjectManager bom = JBOFactory.getBizObjectManager(VI_AUTODISTRIBUTE.CLASS_NAME, tx); @SuppressWarnings("unchecked") List boList = bom.createQuery("SELECT O.id,O.over_days FROM O WHERE O.project_manage NOT IN (SELECT ur.userid FROM jbo.awe.USER_ROLE ur WHERE ur.roleid ='800R00000044')").getResultList(true); String conInfos = new String(); for (BizObject bo : boList) { conInfos += bo.getAttribute("id") + "@"; conInfos += bo.getAttribute("over_days") + ","; } return conInfos; } /** * 获取中催组的人员 * @param tx * @return */ public String getBPerson(JBOTransaction tx){ String person = ""; try { //中催组下未分配且上岗的催款员 String sqlN = "SELECT MAX(O.userid) AS userid" +" FROM USER_INFO O LEFT JOIN USER_ROLE AS ur ON ur.USERID = O.USERID" +" LEFT JOIN USER_TASK_INFO uti ON uti.userid=O.userid AND uti.roleid=ur.roleid" + " WHERE O.status='1' AND uti.induction_state='induction_state01' AND ur.roleid='800R00000042'" + " AND O.userid NOT IN " + " (SELECT part_dept FROM OVERDUE_DUNNING_INFO)"; //虽然只让查出一条数据 List> dataListAN = DataOperatorUtil.getDataBySql(tx, sqlN, null); //此时中催组的所有人员都已分配,选出目前任务最少的人,且上岗 String sqlY = "SELECT MAX(o.part_dept) AS userid FROM " + "(SELECT COUNT(*) number,part_dept FROM OVERDUE_DUNNING_INFO GROUP BY part_dept) o"+ " LEFT JOIN USER_INFO ui ON ui.userid=o.part_dept"+ " LEFT JOIN USER_ROLE AS ur ON ur.USERID = ui.USERID"+ " LEFT JOIN USER_TASK_INFO uti ON uti.userid=ui.userid AND uti.roleid=ur.roleid"+ " WHERE uti.roleid='800R00000042' AND "+ " o.number IN (SELECT MIN(t.number) FROM"+ " (SELECT COUNT(*) number,part_dept FROM OVERDUE_DUNNING_INFO GROUP BY part_dept) t"+ " LEFT JOIN USER_INFO ui ON ui.userid=t.part_dept"+ " LEFT JOIN USER_ROLE AS ur ON ur.USERID = ui.USERID"+ " LEFT JOIN USER_TASK_INFO uti ON uti.userid=ui.userid AND uti.roleid=ur.roleid"+ " WHERE uti.roleid='800R00000042' AND ui.status='1' AND uti.induction_state='induction_state01')"; //虽然只能查出一条数据 List> dataListAY = DataOperatorUtil.getDataBySql(tx, sqlY, null); if(dataListAN.size()>0){ String useridAN = new String(); for (Map map : dataListAN) { String userid = map.get("userid"); useridAN += userid+"@"; } String[] AN =null; AN = useridAN.split("@"); person = AN[0]; if(person==null || "".equals(person) || "null".equals(person)){ String useridAY = new String(); for (Map map : dataListAY) { String userid = map.get("userid"); useridAY += userid+"@"; } String[] AY =null; AY = useridAY.split("@"); person = AY[0]; } }else{ String useridAY = new String(); for (Map map : dataListAY) { String userid = map.get("userid"); useridAY += userid+"@"; } String[] AY =null; AY = useridAY.split("@"); person = AY[0]; } } catch (Exception e) { e.printStackTrace(); } return person; } /** * 获取重催组下的人员 * @param tx * @return */ public String getCPerson(JBOTransaction tx){ String person = ""; try { //重催组下未分配的用户,且上岗 String sqlN = "SELECT MAX(O.userid) AS userid" +" FROM USER_INFO O LEFT JOIN USER_ROLE AS ur ON ur.USERID = O.USERID" +" LEFT JOIN USER_TASK_INFO uti ON uti.userid=O.userid AND uti.roleid=ur.roleid" + " WHERE O.status='1' AND uti.induction_state='induction_state01' AND ur.roleid='800R00000043'" + " AND O.userid NOT IN " + " (SELECT part_dept FROM OVERDUE_DUNNING_INFO)"; //虽然只让查出一条数据 List> dataListAN = DataOperatorUtil.getDataBySql(tx, sqlN, null); //此时重催组的所有人员都已分配,选出目前任务最少的人,且上岗 String sqlY = "SELECT MAX(o.part_dept) AS userid FROM " + "(SELECT COUNT(*) number,part_dept FROM OVERDUE_DUNNING_INFO GROUP BY part_dept) o"+ " LEFT JOIN USER_INFO ui ON ui.userid=o.part_dept"+ " LEFT JOIN USER_ROLE AS ur ON ur.USERID = ui.USERID"+ " LEFT JOIN USER_TASK_INFO uti ON uti.userid=ui.userid AND uti.roleid=ur.roleid"+ " WHERE uti.roleid='800R00000043' AND "+ " o.number IN (SELECT MIN(t.number) FROM"+ " (SELECT COUNT(*) number,part_dept FROM OVERDUE_DUNNING_INFO GROUP BY part_dept) t"+ " LEFT JOIN USER_INFO ui ON ui.userid=t.part_dept"+ " LEFT JOIN USER_ROLE AS ur ON ur.USERID = ui.USERID"+ " LEFT JOIN USER_TASK_INFO uti ON uti.userid=ui.userid AND uti.roleid=ur.roleid"+ " WHERE uti.roleid='800R00000043' AND ui.status='1' AND uti.induction_state='induction_state01')"; //虽然只能查出一条数据 List> dataListAY = DataOperatorUtil.getDataBySql(tx, sqlY, null); if(dataListAN.size()>0){ String useridAN = new String(); for (Map map : dataListAN) { String userid = map.get("userid"); useridAN += userid+"@"; } String[] AN =null; AN = useridAN.split("@"); person = AN[0]; if(person==null || "".equals(person) || "null".equals(person)){ String useridAY = new String(); for (Map map : dataListAY) { String userid = map.get("userid"); useridAY += userid+"@"; } String[] AY =null; AY = useridAY.split("@"); person = AY[0]; } }else{ String useridAY = new String(); for (Map map : dataListAY) { String userid = map.get("userid"); useridAY += userid+"@"; } String[] AY =null; AY = useridAY.split("@"); person = AY[0]; } } catch (Exception e) { e.printStackTrace(); } return person; } /** * 获取轻催组人员 * @return */ public String getAPerson(JBOTransaction tx){ String person = ""; try { //轻催组下未分配且上岗的催款员 String sqlN = "SELECT MAX(O.userid) AS userid" +" FROM USER_INFO O LEFT JOIN USER_ROLE AS ur ON ur.USERID = O.USERID" +" LEFT JOIN USER_TASK_INFO uti ON uti.userid=O.userid AND uti.roleid=ur.roleid" +" WHERE O.status='1' AND uti.induction_state='induction_state01' AND ur.roleid='800R00000041'" +" AND O.userid NOT IN" + " (SELECT part_dept FROM OVERDUE_DUNNING_INFO)"; //虽然只让查出一条数据 List> dataListAN = DataOperatorUtil.getDataBySql(tx, sqlN, null); //此时轻催组的所有人员都已分配,选出目前任务最少的人,且上岗 String sqlY = "SELECT MAX(o.part_dept) AS userid FROM " + "(SELECT COUNT(*) number,part_dept FROM OVERDUE_DUNNING_INFO GROUP BY part_dept) o"+ " LEFT JOIN USER_INFO ui ON ui.userid=o.part_dept"+ " LEFT JOIN USER_ROLE AS ur ON ur.USERID = ui.USERID"+ " LEFT JOIN USER_TASK_INFO uti ON uti.userid=ui.userid AND uti.roleid=ur.roleid"+ " WHERE uti.roleid='800R00000041' AND "+ " o.number IN (SELECT MIN(t.number) FROM"+ " (SELECT COUNT(*) number,part_dept FROM OVERDUE_DUNNING_INFO GROUP BY part_dept) t"+ " LEFT JOIN USER_INFO ui ON ui.userid=t.part_dept"+ " LEFT JOIN USER_ROLE AS ur ON ur.USERID = ui.USERID"+ " LEFT JOIN USER_TASK_INFO uti ON uti.userid=ui.userid AND uti.roleid=ur.roleid"+ " WHERE uti.roleid='800R00000041' AND ui.status='1' AND uti.induction_state='induction_state01')"; //虽然只能查出一条数据 List> dataListAY = DataOperatorUtil.getDataBySql(tx, sqlY, null);; if(dataListAN.size()>0){ String useridAN = new String(); for (Map map : dataListAN) { String userid = map.get("userid"); useridAN += userid+"@"; } String[] AN =null; AN = useridAN.split("@"); person = AN[0]; if(person==null || "".equals(person) || "null".equals(person)){ String useridAY = new String(); for (Map map : dataListAY) { String userid = map.get("userid"); useridAY += userid+"@"; } String[] AY =null; AY = useridAY.split("@"); person = AY[0]; } }else{ String useridAY = new String(); for (Map map : dataListAY) { String userid = map.get("userid"); useridAY += userid+"@"; } String[] AY =null; AY = useridAY.split("@"); person = AY[0]; } } catch (Exception e) { e.printStackTrace(); } return person; } }