我在数据库中有一个Agent表。结构如下:
information(id,name,group) and 12 columns containing months values(month1,month2,....).
表的图像已附加。每个月应将评估员分配给相应的代理。我有21位评估者,评估表如下:
(Id(EvaluatorId), Group(to which he belongs),Quantity(how many times he can be assigned to agent))
因此,我面临的问题是我无法全部分配他们。我认为我的SQL查询出现问题,该查询从“代理”表中随机选择未分配的代理。
这是我在API方面写的:
List<Integer> results=new ArrayList<>();
List<Evaluation> evaluations= evaluationRepository.findTop1000ByOrderByEvaluatorAsc();
for (Evaluation evaluation : evaluations) {
for (int i = 0; i < evaluation.getQuantity(); i++) {
Agent agent=AgentRepository.getNotAssignedAgent(evaluation.getGroup(),LocalDate.now().getMonthValue(),evaluation.getEvaluator());
System.out.println(agent.getId()+" : "+evaluation.getGroup()+" : "+evaluation.getEvaluator());
results.add((int)agent.getId());
AgentRepository.updateAgent((int)agent.getId(),LocalDate.now().getMonthValue(),evaluation.getEvaluator());
}
return results;
}
从AgentRepository的“代理”表中获取未分配代理的方法:
public Agent getNotAssignedAgent(int groupType,int monthId,int evaluator) {
String sql="Select TOP(1) Id,Agent,GroupType From [AgentAllocator].[dbo].[Agent] Where GroupType="+groupType+" AND ["+ monthId +"] is null AND ( ["+(monthId-1)+"] <>"+evaluator+" Or "+(monthId-1)+" is null ) AND ( ["+(monthId-2)+"] <>"+evaluator+" Or "+(monthId-2)+" is null ) Order by rand()";
Agent agent=new Agent();
try{
Statement statement=connection.createStatement();
ResultSet resultSet=statement.executeQuery(sql);
while (resultSet.next()) {
agent.setAgent(resultSet.getString(2));
agent.setGroupType(Integer.parseInt(resultSet.getString(3)));
agent.setId(Integer.parseInt(resultSet.getString(1)));
}
}catch(Exception e){
e.printStackTrace();
}
return agent;
}
示例查询:
Select TOP(1) Id,Agent,GroupType From [AgentAllocator].[dbo].[Agent] Where GroupType=1 AND [6] is null AND ( [5] <>21 Or [5] is null ) AND ( [4] <>21 Or [4] is null ) Order by rand();
更新AgentRepository中的Agent表的方法:
@Override
public int updateAgent(int agentId,int month, int value){
String sql="Update [AgentAllocator].[dbo].[Agent] set ["+month+"] ="+value+" WHERE Id="+agentId;
int res=-100;
try{
Statement statement=connection.createStatement();
res=statement.executeUpdate(sql);
}catch(Exception e){
e.printStackTrace();
}
return res;
}
我的预期结果是:评估表中的所有评估者都应分配给代理。没有人应该离开。应分配283次的311名特工和21名评估员。
运行该api时,我从283个代理中分配了241个代理。