apzl_leasing/src_tenwa/quartz/AutoDistribute.java
2021-06-15 15:24:48 +08:00

542 lines
20 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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<BizObject> 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<String,Integer> 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<String,String[]> 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<String, Integer> getDay(JBOTransaction tx) throws JBOException {
Map<String, Integer> map = new HashMap<String, Integer>();
int beginDay1 = 0;
int endDay1 = 0;
int beginDay2 = 0;
int endDay2 = 0;
int beginDay3 = 0;
// 获取天数
@SuppressWarnings("unchecked")
List<BizObject> 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<String,String[]> getUser(JBOTransaction tx){
Map<String,String[]> usermap = new HashMap<String, String[]>();
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<Map<String, String>>dataListA = DataOperatorUtil.getDataBySql(tx, Sql1, null);
String userA = new String();
for (Map<String, String> 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<Map<String, String>> dataListB = DataOperatorUtil.getDataBySql(tx, Sql2, null);
String userB = new String();
for (Map<String, String> 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<Map<String, String>> dataListC = DataOperatorUtil.getDataBySql(tx, Sql3, null);
String userC = new String();
for (Map<String, String> 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<BizObject> 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<BizObject> 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<Map<String, String>> 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<Map<String, String>> dataListAY = DataOperatorUtil.getDataBySql(tx, sqlY, null);
if(dataListAN.size()>0){
String useridAN = new String();
for (Map<String, String> 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<String, String> 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<String, String> 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<Map<String, String>> 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<Map<String, String>> dataListAY = DataOperatorUtil.getDataBySql(tx, sqlY, null);
if(dataListAN.size()>0){
String useridAN = new String();
for (Map<String, String> 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<String, String> 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<String, String> 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<Map<String, String>> 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<Map<String, String>> dataListAY = DataOperatorUtil.getDataBySql(tx, sqlY, null);;
if(dataListAN.size()>0){
String useridAN = new String();
for (Map<String, String> 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<String, String> 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<String, String> 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;
}
}