У меня есть таблица агента в базе данных. Структура выглядит следующим образом:
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;
}
Способ получения неназначенного агента из таблицы Agent в 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:
@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;
}
Мой ожидаемый результат: все оценщики в таблице оценки должны быть назначены агенту. Никого не должно быть. Есть 311 агентов и 21 оценщик, которые должны быть назначены 283 раза.
Когда я запускаю API, я получаю 241 агента из 283.