Добрый день!
Биллинг мне достался в наследство поэтому приходится с работать с тем что имеем.
Версия 4.5.
Есть договор, на нём подвешена услуга Абонплаты. Смотрим в наработке за май месяц 2014 года. абонка отсутствует.
Иду в модуль абон платы, выбираю интересующий договор и делаю перерасчёт за май месяц.
результат работы в логах:
scheduler.log
Код:
INFO 27.06.2014 10:54:21 Running Task: Thread[Thread-267109,1,main]
INFO 27.06.2014 10:54:21 PaymentRecalculator time: 01.05.2014 00
INFO 27.06.2014 10:54:21 [23:00:00; 0] Calculate past month
DEBUG 27.06.2014 10:54:21 [23:00:00; 0] Services: -1,72,73,74,75,76,78,79,80,81,82,83,84,85,86,87,89,90,91,92,93,94,95,96,97,113,240,126,127,128,129,151,152,153,154,155,171,172,173,174,175,184,263,222,223,224,236,264,265,266,267,268,269,272,273,276,277,280,281,283,284,285,286,287,288,290,292,293,294,296,297,298,299,300,301,302,303,304,305,306,308,309,310,315,316,317,318,319,320,321,327,322,323,324,325,326,332,334,335,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,366,367,368,369,370,371,372,376,375,377,378,379,380,381,382,383,384,385,386,387,388,389
INFO 27.06.2014 10:54:21 Memory total: 265 158 656; max: 1 864 171 520; free: 100 653 400
DEBUG 27.06.2014 10:54:21 [23:00:00; 0] Found service taker cid: 103099; sid: 345; date1: 01.01.2013; date2: ; col: 1; eid: 1156274
DEBUG 27.06.2014 10:54:21 [23:00:00; 0] After trimming cid: 103099; sid: 345; date1: 01.05.2014; date2: 31.05.2014
DEBUG 27.06.2014 10:54:21 [23:00:00; 0] Tariff period: 01.06.2010-
DEBUG 27.06.2014 10:54:21 [23:00:00; 0] Calculating item 01.05.2014-31.05.2014
DEBUG 27.06.2014 10:54:21 [23:00:00; 0] Reset request accepted => false relevance => -1 REQ: sid => 345 action => reset RESP: calc_type => 0 calc_mode => month HIST:
DEBUG 27.06.2014 10:54:21 [23:00:00; 0] Request accepted => true relevance => -1 REQ: sid => 345 time => 31.05.2014 00:00:00 action => calculate month_days => 31 period_days => 31 RESP: cost => 12000.0 HIST:
ERROR 27.06.2014 10:54:21 [23:00:00; 0] Duplicate entry '2014-5-103099-345' for key 1
com.mysql.jdbc.exceptions.MySQLIntegrityConstraintViolationException: Duplicate entry '2014-5-103099-345' for key 1
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:931)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2870)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1573)
at com.mysql.jdbc.ServerPreparedStatement.serverExecute(ServerPreparedStatement.java:1160)
at com.mysql.jdbc.ServerPreparedStatement.executeInternal(ServerPreparedStatement.java:685)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1400)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1314)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1299)
at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:233)
at bitel.billing.server.npay.Calculator.executeTask(Calculator.java:334)
at bitel.billing.server.task.TaskBase.run(TaskBase.java:45)
INFO 27.06.2014 10:54:21 [23:00:00; 0] time=319 ms.
server.log
Код:
DEBUG 27.06.2014 10:54:21 executing bitel.billing.server.npay.action.ActionRecalculatePay; time => 14 ms.
DEBUG 27.06.2014 10:54:21 executing bitel.billing.server.contract.action.ActionUpdateContractTariffPlan; time => 16 ms.
DEBUG 27.06.2014 10:54:22 executing bitel.billing.server.contract.action.ActionContractTariffPlans; time => 11 ms.
DEBUG 27.06.2014 10:54:24 executing bitel.billing.server.contract.action.ActionContractTariffPlan; time => 14 ms.
scheduler.out ни чего не попало.
видим что sheduler.log есть проблемы (но об этом ниже)
Код:
bitel.billing.server.npay.Calculator.executeTask(Calculator.java:334)
после перерасчёта смотрим в наработку абон плата появляется. Всё бы ни чего и можно было бы наплевать на ошибку но при преобсчёте по всем договорам начисление происходит только по 1-му договору, после которого вылетает указанная ошибка и задача дальше не выполняется.
Стало интересно что же там такое в
Код:
bitel.billing.server.npay.Calculator.executeTask(Calculator.java:334)
Декомпильнул модуль и вот что в нем увидел:
Код:
query = "DELETE FROM contract_account WHERE yy=? AND mm=? AND sid IN (" + this.serviceList + ")";
query = query + andCidPart;
ps = this.con.prepareStatement(query);
ps.setInt(1, this.startMonth.get(1));
ps.setInt(2, this.startMonth.get(2) + 1);
ps.executeUpdate();
query = "INSERT INTO contract_account (yy, mm, cid, sid, summa) VALUES (?, ?, ?, ?, ?)";
ps = this.con.prepareStatement(query);
ps.setInt(1, this.startMonth.get(1));
ps.setInt(2, this.startMonth.get(2) + 1);
for (CostSum costSum : this.costCache.getAmounts())
{
ps.setInt(3, costSum.cid);
ps.setInt(4, costSum.sid);
ps.setFloat(5, (float)costSum.cost);
ps.executeUpdate();
contractForSetBalance.add(Integer.valueOf(costSum.cid));
}
334 строка это ps.executeUpdate();
видно что из таблицы contract_account сначала вычищаются записи, а потом они туда добавляются снова. Вроде бы всё логично, НО откуда тогда берётся злосчастный «Duplicate entry '2014-5-103099-345' for key 1»?