| 16:01:30.386 | trace | yii\base\Application::bootstrap | Bootstrap with yii\log\Dispatcher |
| 16:01:30.386 | trace | yii\base\Module::getModule | Loading module: debug |
| 16:01:30.386 | trace | yii\base\Application::bootstrap | Bootstrap with yii\debug\Module::bootstrap() |
| 16:01:30.386 | trace | yii\redis\Connection::open | Opening redis DB connection: redis.server.local:6379, database=1 |
| 16:01:30.386 | trace | yii\redis\Connection::executeCommand | Executing Redis Command: SELECT |
| 16:01:30.387 | trace | yii\redis\Connection::executeCommand | Executing Redis Command: GET |
| 16:01:30.387 | info | time tracing start | 1780300890387211008 |
| 16:01:30.387 | trace | yii\web\UrlManager::parseRequest | No matching URL rules. Using default URL parsing logic. |
| 16:01:30.387 | trace | yii\web\Application::handleRequest | Route requested: 'vue/erp-analysis/list-case-ticket' |
| 16:01:30.387 | trace | yii\base\Module::getModule | Loading module: vue |
| 16:01:30.388 | info | yii\web\Session::open | Session started |
| 16:01:30.388 | info | yii\db\Command::query | SELECT * FROM "global"."vw_user_login" WHERE "id"=1001 |
| 16:01:30.388 | info | yii\db\Connection::open | Opening DB connection: pgsql:host=postgresql.server.local;port=5432;dbname=beta |
| 16:01:30.389 | trace | yii\redis\Connection::executeCommand | Executing Redis Command: GET |
| 16:01:30.389 | trace | yii\redis\Connection::executeCommand | Executing Redis Command: MGET |
| 16:01:30.390 | trace | yii\redis\Connection::executeCommand | Executing Redis Command: GET |
| 16:01:30.390 | trace | yii\redis\Connection::executeCommand | Executing Redis Command: MGET |
| 16:01:30.390 | info | yii\db\Command::query | SELECT * FROM "a57be577deb434"."tbl_users" WHERE "id"=1001 |
| 16:01:30.390 | trace | yii\base\Controller::runAction | Route to run: vue/erp-analysis/list-case-ticket |
| 16:01:30.391 | trace | yii\redis\Connection::executeCommand | Executing Redis Command: GET |
| 16:01:30.392 | trace | uranus\rbac\DbManager::checkAccessFromCache | Checking role: Admin |
| 16:01:30.392 | trace | yii\base\InlineAction::runWithParams | Running action: app\modules\vue\controllers\ErpAnalysisController::actionListCaseTicket() |
| 16:01:30.392 | trace | yii\redis\Connection::executeCommand | Executing Redis Command: GET |
| 16:01:30.392 | trace | yii\redis\Connection::executeCommand | Executing Redis Command: GET |
| 16:01:30.393 | info | yii\db\Command::query | SELECT * FROM "a57be577deb434"."tbl_erp_settles" WHERE ("date"='2025-12-01') AND ("is_settle"=TRUE) |
| 16:01:30.394 | info | yii\db\Command::query | SELECT * FROM "a57be577deb434"."tbl_erp_settles" WHERE ("date"='2026-12-01') AND ("is_settle"=TRUE) |
| 16:01:30.395 | info | yii\db\Command::query | SELECT
COALESCE(ROUND(sum(summary.erp_labor_cost_amount)::numeric, 2), 0) as erp_labor_cost_amount,
COALESCE(ROUND(sum(summary.work_hours)::numeric, 2), 0) as work_hours,
COALESCE(ROUND(COALESCE(sum(summary.erp_labor_cost_amount), 0)::numeric / NULLIF(sum(summary.work_hours)::numeric, 0), 2), 0) as average_labor_cost_per_hour
FROM (SELECT
ct.ticket_id,
ct.ticket_type,
ct.ticket_type_name,
ct.ticket_no,
ct.case_id,
ct.case_no,
ct.project_id,
p.project_title,
ct.client_id,
c.name as client_name,
ct.sales_rep_id,
sr.name as sales_rep_name,
ct.engineer_id,
e.name as engineer_name,
ROUND(ct.work_hours::numeric, 2) as work_hours,
ROUND(COALESCE(tlc.erp_labor_cost_amount, 0)::numeric, 2) as erp_labor_cost_amount,
CASE WHEN ROUND(ct.work_hours::numeric, 2) = TRUNC(ROUND(ct.work_hours::numeric, 2)) THEN TRUNC(ROUND(ct.work_hours::numeric, 2))::text || 'h' ELSE ROUND(ct.work_hours::numeric, 2)::text || 'h' END as hours_spent_display,
ct.start_at,
to_char(ct.start_at, 'YYYY/MM/DD HH24:MI') as start_at_display,
ct.end_at,
to_char(ct.end_at, 'YYYY/MM/DD HH24:MI') as end_at_display
FROM ((SELECT
p.id as ticket_id,
'preSales' as ticket_type,
'售前' as ticket_type_name,
p.ticket_no,
p.case_id,
c.case_no,
COALESCE(p.client_id, c.client_id) as client_id,
c.project_id,
cl.sales_rep as sales_rep_id,
p.engineer_id,
p.start_at,
p.end_at,
date_trunc('month', p.start_at)::date as settle_month,
EXTRACT(EPOCH FROM (p.end_at - p.start_at)) / 3600 as work_hours
FROM "a57be577deb434"."tbl_pre_sales" "p" LEFT JOIN "a57be577deb434"."tbl_cases" "c" ON c.id = p.case_id LEFT JOIN "a57be577deb434"."tbl_clients" "cl" ON cl.id = COALESCE(p.client_id, c.client_id) WHERE (p.start_at IS NOT NULL) AND (p.end_at IS NOT NULL) AND (p.end_at > p.start_at) AND (p.engineer_id IS NOT NULL) AND (("p"."is_draft"=FALSE) OR (p.is_draft IS NULL)) AND ("p"."start_at" >= '2026-01-01 00:00:00') AND ("p"."start_at" <= '2026-12-31 23:59:59')) UNION ALL ( SELECT
i.id as ticket_id,
'implementRecords' as ticket_type,
'实施' as ticket_type_name,
i.ticket_no,
i.case_id,
c.case_no,
COALESCE(i.client_id, c.client_id) as client_id,
c.project_id,
cl.sales_rep as sales_rep_id,
c.last_engineer as engineer_id,
i.arrived_at as start_at,
i.left_at as end_at,
date_trunc('month', i.arrived_at)::date as settle_month,
EXTRACT(EPOCH FROM (i.left_at - i.arrived_at)) / 3600 as work_hours
FROM "a57be577deb434"."tbl_implement_records" "i" LEFT JOIN "a57be577deb434"."tbl_cases" "c" ON c.id = i.case_id LEFT JOIN "a57be577deb434"."tbl_clients" "cl" ON cl.id = COALESCE(i.client_id, c.client_id) WHERE (i.arrived_at IS NOT NULL) AND (i.left_at IS NOT NULL) AND (i.left_at > i.arrived_at) AND (c.last_engineer IS NOT NULL) AND (("i"."is_draft"=FALSE) OR (i.is_draft IS NULL)) AND ("i"."arrived_at" >= '2026-01-01 00:00:00') AND ("i"."arrived_at" <= '2026-12-31 23:59:59') )) "ct" LEFT JOIN "a57be577deb434"."tbl_clients" "c" ON c.id = ct.client_id LEFT JOIN "a57be577deb434"."tbl_projects" "p" ON p.id = ct.project_id LEFT JOIN "a57be577deb434"."tbl_users" "sr" ON sr.id = ct.sales_rep_id LEFT JOIN "a57be577deb434"."tbl_users" "e" ON e.id = ct.engineer_id LEFT JOIN (SELECT ct.ticket_id, ct.ticket_type, COALESCE(sum(CASE WHEN ct.work_hours > 0 THEN COALESCE(payroll.amount, 0) / GREATEST((
SELECT COUNT(1)
FROM generate_series(ct.settle_month::timestamp, (ct.settle_month + interval '1 month - 1 day')::timestamp, interval '1 day') AS work_dates(work_date)
LEFT JOIN a57be577deb434.tbl_legal_holidays lh ON lh.edate = work_dates.work_date::date
LEFT JOIN a57be577deb434.tbl_punch_strategy_schedules pss ON pss.edate = work_dates.work_date::date AND pss.punch_strategy_id = ps.id
WHERE CASE
WHEN ps.id IS NULL THEN EXTRACT(ISODOW FROM work_dates.work_date)::integer BETWEEN 1 AND 5
WHEN pss.id IS NOT NULL THEN pss.need_work
WHEN ps.legal_holiday AND lh.id IS NOT NULL THEN lh.is_exchange
ELSE (ps.week::integer & (1 << (EXTRACT(ISODOW FROM work_dates.work_date)::integer - 1))) <> 0
END
), 1) / GREATEST((CASE WHEN ps.id IS NULL THEN 8 WHEN ps.punch_type = 0 THEN 8 WHEN ps.work_hour IS NOT NULL AND ps.work_hour > 0 THEN ps.work_hour ELSE 8 END), 1) * ct.work_hours ELSE 0 END), 0) as erp_labor_cost_amount FROM ((SELECT
p.id as ticket_id,
'preSales' as ticket_type,
'售前' as ticket_type_name,
p.ticket_no,
p.case_id,
c.case_no,
COALESCE(p.client_id, c.client_id) as client_id,
c.project_id,
cl.sales_rep as sales_rep_id,
p.engineer_id,
p.start_at,
p.end_at,
date_trunc('month', p.start_at)::date as settle_month,
EXTRACT(EPOCH FROM (p.end_at - p.start_at)) / 3600 as work_hours
FROM "a57be577deb434"."tbl_pre_sales" "p" LEFT JOIN "a57be577deb434"."tbl_cases" "c" ON c.id = p.case_id LEFT JOIN "a57be577deb434"."tbl_clients" "cl" ON cl.id = COALESCE(p.client_id, c.client_id) WHERE (p.start_at IS NOT NULL) AND (p.end_at IS NOT NULL) AND (p.end_at > p.start_at) AND (p.engineer_id IS NOT NULL) AND (("p"."is_draft"=FALSE) OR (p.is_draft IS NULL)) AND ("p"."start_at" >= '2026-01-01 00:00:00') AND ("p"."start_at" <= '2026-12-31 23:59:59')) UNION ALL ( SELECT
i.id as ticket_id,
'implementRecords' as ticket_type,
'实施' as ticket_type_name,
i.ticket_no,
i.case_id,
c.case_no,
COALESCE(i.client_id, c.client_id) as client_id,
c.project_id,
cl.sales_rep as sales_rep_id,
c.last_engineer as engineer_id,
i.arrived_at as start_at,
i.left_at as end_at,
date_trunc('month', i.arrived_at)::date as settle_month,
EXTRACT(EPOCH FROM (i.left_at - i.arrived_at)) / 3600 as work_hours
FROM "a57be577deb434"."tbl_implement_records" "i" LEFT JOIN "a57be577deb434"."tbl_cases" "c" ON c.id = i.case_id LEFT JOIN "a57be577deb434"."tbl_clients" "cl" ON cl.id = COALESCE(i.client_id, c.client_id) WHERE (i.arrived_at IS NOT NULL) AND (i.left_at IS NOT NULL) AND (i.left_at > i.arrived_at) AND (c.last_engineer IS NOT NULL) AND (("i"."is_draft"=FALSE) OR (i.is_draft IS NULL)) AND ("i"."arrived_at" >= '2026-01-01 00:00:00') AND ("i"."arrived_at" <= '2026-12-31 23:59:59') )) "ct" LEFT JOIN (SELECT pay.user_id, pay.settle_month, COALESCE(sum(pay.amount), 0) as amount FROM ((SELECT am.user_id, t.settle_month::date as settle_month, COALESCE(sum(am.amount), 0) as amount FROM "a57be577deb434"."tbl_erp_wage_ticket_amounts" "am" LEFT JOIN "a57be577deb434"."tbl_erp_wage_tickets" "t" ON am.erp_wage_ticket_id = t.id WHERE ("t"."status"=2) AND (am.user_id IS NOT NULL) GROUP BY "am"."user_id", "t"."settle_month") UNION ALL ( SELECT am.user_id, t.settle_month::date as settle_month, COALESCE(sum(am.amount), 0) as amount FROM "a57be577deb434"."tbl_erp_social_insurance_amounts" "am" LEFT JOIN "a57be577deb434"."tbl_erp_social_insurances" "t" ON am.erp_social_insurance_id = t.id WHERE ("t"."status"=2) AND (am.user_id IS NOT NULL) GROUP BY "am"."user_id", "t"."settle_month" ) UNION ALL ( SELECT am.user_id, t.settle_month::date as settle_month, COALESCE(sum(am.amount), 0) as amount FROM "a57be577deb434"."tbl_erp_provident_fund_amounts" "am" LEFT JOIN "a57be577deb434"."tbl_erp_provident_funds" "t" ON am.erp_provident_fund_id = t.id WHERE ("t"."status"=2) AND (am.user_id IS NOT NULL) GROUP BY "am"."user_id", "t"."settle_month" ) UNION ALL ( SELECT am.user_id, t.settle_month::date as settle_month, COALESCE(sum(am.amount), 0) as amount FROM "a57be577deb434"."tbl_erp_personal_tax_amounts" "am" LEFT JOIN "a57be577deb434"."tbl_erp_personal_taxs" "t" ON am.erp_personal_tax_id = t.id WHERE ("t"."status"=2) AND (am.user_id IS NOT NULL) GROUP BY "am"."user_id", "t"."settle_month" )) "pay" GROUP BY "pay"."user_id", "pay"."settle_month") "payroll" ON payroll.user_id = ct.engineer_id AND payroll.settle_month = ct.settle_month LEFT JOIN "a57be577deb434"."tbl_punch_strategy_resource_rels" "psrr" ON psrr.user_id = ct.engineer_id LEFT JOIN "a57be577deb434"."tbl_punch_strategies" "ps" ON ps.id = psrr.punch_strategy_id GROUP BY "ct"."ticket_id", "ct"."ticket_type") "tlc" ON tlc.ticket_id = ct.ticket_id AND tlc.ticket_type = ct.ticket_type WHERE "ct"."engineer_id"='1023') "summary" |
| 16:01:30.412 | info | yii\db\Command::query | SELECT COUNT(*) FROM (SELECT
ct.ticket_id,
ct.ticket_type,
ct.ticket_type_name,
ct.ticket_no,
ct.case_id,
ct.case_no,
ct.project_id,
p.project_title,
ct.client_id,
c.name as client_name,
ct.sales_rep_id,
sr.name as sales_rep_name,
ct.engineer_id,
e.name as engineer_name,
ROUND(ct.work_hours::numeric, 2) as work_hours,
ROUND(COALESCE(tlc.erp_labor_cost_amount, 0)::numeric, 2) as erp_labor_cost_amount,
CASE WHEN ROUND(ct.work_hours::numeric, 2) = TRUNC(ROUND(ct.work_hours::numeric, 2)) THEN TRUNC(ROUND(ct.work_hours::numeric, 2))::text || 'h' ELSE ROUND(ct.work_hours::numeric, 2)::text || 'h' END as hours_spent_display,
ct.start_at,
to_char(ct.start_at, 'YYYY/MM/DD HH24:MI') as start_at_display,
ct.end_at,
to_char(ct.end_at, 'YYYY/MM/DD HH24:MI') as end_at_display
FROM ((SELECT
p.id as ticket_id,
'preSales' as ticket_type,
'售前' as ticket_type_name,
p.ticket_no,
p.case_id,
c.case_no,
COALESCE(p.client_id, c.client_id) as client_id,
c.project_id,
cl.sales_rep as sales_rep_id,
p.engineer_id,
p.start_at,
p.end_at,
date_trunc('month', p.start_at)::date as settle_month,
EXTRACT(EPOCH FROM (p.end_at - p.start_at)) / 3600 as work_hours
FROM "a57be577deb434"."tbl_pre_sales" "p" LEFT JOIN "a57be577deb434"."tbl_cases" "c" ON c.id = p.case_id LEFT JOIN "a57be577deb434"."tbl_clients" "cl" ON cl.id = COALESCE(p.client_id, c.client_id) WHERE (p.start_at IS NOT NULL) AND (p.end_at IS NOT NULL) AND (p.end_at > p.start_at) AND (p.engineer_id IS NOT NULL) AND (("p"."is_draft"=FALSE) OR (p.is_draft IS NULL)) AND ("p"."start_at" >= '2026-01-01 00:00:00') AND ("p"."start_at" <= '2026-12-31 23:59:59')) UNION ALL ( SELECT
i.id as ticket_id,
'implementRecords' as ticket_type,
'实施' as ticket_type_name,
i.ticket_no,
i.case_id,
c.case_no,
COALESCE(i.client_id, c.client_id) as client_id,
c.project_id,
cl.sales_rep as sales_rep_id,
c.last_engineer as engineer_id,
i.arrived_at as start_at,
i.left_at as end_at,
date_trunc('month', i.arrived_at)::date as settle_month,
EXTRACT(EPOCH FROM (i.left_at - i.arrived_at)) / 3600 as work_hours
FROM "a57be577deb434"."tbl_implement_records" "i" LEFT JOIN "a57be577deb434"."tbl_cases" "c" ON c.id = i.case_id LEFT JOIN "a57be577deb434"."tbl_clients" "cl" ON cl.id = COALESCE(i.client_id, c.client_id) WHERE (i.arrived_at IS NOT NULL) AND (i.left_at IS NOT NULL) AND (i.left_at > i.arrived_at) AND (c.last_engineer IS NOT NULL) AND (("i"."is_draft"=FALSE) OR (i.is_draft IS NULL)) AND ("i"."arrived_at" >= '2026-01-01 00:00:00') AND ("i"."arrived_at" <= '2026-12-31 23:59:59') )) "ct" LEFT JOIN "a57be577deb434"."tbl_clients" "c" ON c.id = ct.client_id LEFT JOIN "a57be577deb434"."tbl_projects" "p" ON p.id = ct.project_id LEFT JOIN "a57be577deb434"."tbl_users" "sr" ON sr.id = ct.sales_rep_id LEFT JOIN "a57be577deb434"."tbl_users" "e" ON e.id = ct.engineer_id LEFT JOIN (SELECT ct.ticket_id, ct.ticket_type, COALESCE(sum(CASE WHEN ct.work_hours > 0 THEN COALESCE(payroll.amount, 0) / GREATEST((
SELECT COUNT(1)
FROM generate_series(ct.settle_month::timestamp, (ct.settle_month + interval '1 month - 1 day')::timestamp, interval '1 day') AS work_dates(work_date)
LEFT JOIN a57be577deb434.tbl_legal_holidays lh ON lh.edate = work_dates.work_date::date
LEFT JOIN a57be577deb434.tbl_punch_strategy_schedules pss ON pss.edate = work_dates.work_date::date AND pss.punch_strategy_id = ps.id
WHERE CASE
WHEN ps.id IS NULL THEN EXTRACT(ISODOW FROM work_dates.work_date)::integer BETWEEN 1 AND 5
WHEN pss.id IS NOT NULL THEN pss.need_work
WHEN ps.legal_holiday AND lh.id IS NOT NULL THEN lh.is_exchange
ELSE (ps.week::integer & (1 << (EXTRACT(ISODOW FROM work_dates.work_date)::integer - 1))) <> 0
END
), 1) / GREATEST((CASE WHEN ps.id IS NULL THEN 8 WHEN ps.punch_type = 0 THEN 8 WHEN ps.work_hour IS NOT NULL AND ps.work_hour > 0 THEN ps.work_hour ELSE 8 END), 1) * ct.work_hours ELSE 0 END), 0) as erp_labor_cost_amount FROM ((SELECT
p.id as ticket_id,
'preSales' as ticket_type,
'售前' as ticket_type_name,
p.ticket_no,
p.case_id,
c.case_no,
COALESCE(p.client_id, c.client_id) as client_id,
c.project_id,
cl.sales_rep as sales_rep_id,
p.engineer_id,
p.start_at,
p.end_at,
date_trunc('month', p.start_at)::date as settle_month,
EXTRACT(EPOCH FROM (p.end_at - p.start_at)) / 3600 as work_hours
FROM "a57be577deb434"."tbl_pre_sales" "p" LEFT JOIN "a57be577deb434"."tbl_cases" "c" ON c.id = p.case_id LEFT JOIN "a57be577deb434"."tbl_clients" "cl" ON cl.id = COALESCE(p.client_id, c.client_id) WHERE (p.start_at IS NOT NULL) AND (p.end_at IS NOT NULL) AND (p.end_at > p.start_at) AND (p.engineer_id IS NOT NULL) AND (("p"."is_draft"=FALSE) OR (p.is_draft IS NULL)) AND ("p"."start_at" >= '2026-01-01 00:00:00') AND ("p"."start_at" <= '2026-12-31 23:59:59')) UNION ALL ( SELECT
i.id as ticket_id,
'implementRecords' as ticket_type,
'实施' as ticket_type_name,
i.ticket_no,
i.case_id,
c.case_no,
COALESCE(i.client_id, c.client_id) as client_id,
c.project_id,
cl.sales_rep as sales_rep_id,
c.last_engineer as engineer_id,
i.arrived_at as start_at,
i.left_at as end_at,
date_trunc('month', i.arrived_at)::date as settle_month,
EXTRACT(EPOCH FROM (i.left_at - i.arrived_at)) / 3600 as work_hours
FROM "a57be577deb434"."tbl_implement_records" "i" LEFT JOIN "a57be577deb434"."tbl_cases" "c" ON c.id = i.case_id LEFT JOIN "a57be577deb434"."tbl_clients" "cl" ON cl.id = COALESCE(i.client_id, c.client_id) WHERE (i.arrived_at IS NOT NULL) AND (i.left_at IS NOT NULL) AND (i.left_at > i.arrived_at) AND (c.last_engineer IS NOT NULL) AND (("i"."is_draft"=FALSE) OR (i.is_draft IS NULL)) AND ("i"."arrived_at" >= '2026-01-01 00:00:00') AND ("i"."arrived_at" <= '2026-12-31 23:59:59') )) "ct" LEFT JOIN (SELECT pay.user_id, pay.settle_month, COALESCE(sum(pay.amount), 0) as amount FROM ((SELECT am.user_id, t.settle_month::date as settle_month, COALESCE(sum(am.amount), 0) as amount FROM "a57be577deb434"."tbl_erp_wage_ticket_amounts" "am" LEFT JOIN "a57be577deb434"."tbl_erp_wage_tickets" "t" ON am.erp_wage_ticket_id = t.id WHERE ("t"."status"=2) AND (am.user_id IS NOT NULL) GROUP BY "am"."user_id", "t"."settle_month") UNION ALL ( SELECT am.user_id, t.settle_month::date as settle_month, COALESCE(sum(am.amount), 0) as amount FROM "a57be577deb434"."tbl_erp_social_insurance_amounts" "am" LEFT JOIN "a57be577deb434"."tbl_erp_social_insurances" "t" ON am.erp_social_insurance_id = t.id WHERE ("t"."status"=2) AND (am.user_id IS NOT NULL) GROUP BY "am"."user_id", "t"."settle_month" ) UNION ALL ( SELECT am.user_id, t.settle_month::date as settle_month, COALESCE(sum(am.amount), 0) as amount FROM "a57be577deb434"."tbl_erp_provident_fund_amounts" "am" LEFT JOIN "a57be577deb434"."tbl_erp_provident_funds" "t" ON am.erp_provident_fund_id = t.id WHERE ("t"."status"=2) AND (am.user_id IS NOT NULL) GROUP BY "am"."user_id", "t"."settle_month" ) UNION ALL ( SELECT am.user_id, t.settle_month::date as settle_month, COALESCE(sum(am.amount), 0) as amount FROM "a57be577deb434"."tbl_erp_personal_tax_amounts" "am" LEFT JOIN "a57be577deb434"."tbl_erp_personal_taxs" "t" ON am.erp_personal_tax_id = t.id WHERE ("t"."status"=2) AND (am.user_id IS NOT NULL) GROUP BY "am"."user_id", "t"."settle_month" )) "pay" GROUP BY "pay"."user_id", "pay"."settle_month") "payroll" ON payroll.user_id = ct.engineer_id AND payroll.settle_month = ct.settle_month LEFT JOIN "a57be577deb434"."tbl_punch_strategy_resource_rels" "psrr" ON psrr.user_id = ct.engineer_id LEFT JOIN "a57be577deb434"."tbl_punch_strategies" "ps" ON ps.id = psrr.punch_strategy_id GROUP BY "ct"."ticket_id", "ct"."ticket_type") "tlc" ON tlc.ticket_id = ct.ticket_id AND tlc.ticket_type = ct.ticket_type WHERE "ct"."engineer_id"='1023' ORDER BY ct.start_at DESC, ct.ticket_id DESC) "c" |
| 16:01:30.419 | info | yii\db\Command::query | SELECT
ct.ticket_id,
ct.ticket_type,
ct.ticket_type_name,
ct.ticket_no,
ct.case_id,
ct.case_no,
ct.project_id,
p.project_title,
ct.client_id,
c.name as client_name,
ct.sales_rep_id,
sr.name as sales_rep_name,
ct.engineer_id,
e.name as engineer_name,
ROUND(ct.work_hours::numeric, 2) as work_hours,
ROUND(COALESCE(tlc.erp_labor_cost_amount, 0)::numeric, 2) as erp_labor_cost_amount,
CASE WHEN ROUND(ct.work_hours::numeric, 2) = TRUNC(ROUND(ct.work_hours::numeric, 2)) THEN TRUNC(ROUND(ct.work_hours::numeric, 2))::text || 'h' ELSE ROUND(ct.work_hours::numeric, 2)::text || 'h' END as hours_spent_display,
ct.start_at,
to_char(ct.start_at, 'YYYY/MM/DD HH24:MI') as start_at_display,
ct.end_at,
to_char(ct.end_at, 'YYYY/MM/DD HH24:MI') as end_at_display
FROM ((SELECT
p.id as ticket_id,
'preSales' as ticket_type,
'售前' as ticket_type_name,
p.ticket_no,
p.case_id,
c.case_no,
COALESCE(p.client_id, c.client_id) as client_id,
c.project_id,
cl.sales_rep as sales_rep_id,
p.engineer_id,
p.start_at,
p.end_at,
date_trunc('month', p.start_at)::date as settle_month,
EXTRACT(EPOCH FROM (p.end_at - p.start_at)) / 3600 as work_hours
FROM "a57be577deb434"."tbl_pre_sales" "p" LEFT JOIN "a57be577deb434"."tbl_cases" "c" ON c.id = p.case_id LEFT JOIN "a57be577deb434"."tbl_clients" "cl" ON cl.id = COALESCE(p.client_id, c.client_id) WHERE (p.start_at IS NOT NULL) AND (p.end_at IS NOT NULL) AND (p.end_at > p.start_at) AND (p.engineer_id IS NOT NULL) AND (("p"."is_draft"=FALSE) OR (p.is_draft IS NULL)) AND ("p"."start_at" >= '2026-01-01 00:00:00') AND ("p"."start_at" <= '2026-12-31 23:59:59')) UNION ALL ( SELECT
i.id as ticket_id,
'implementRecords' as ticket_type,
'实施' as ticket_type_name,
i.ticket_no,
i.case_id,
c.case_no,
COALESCE(i.client_id, c.client_id) as client_id,
c.project_id,
cl.sales_rep as sales_rep_id,
c.last_engineer as engineer_id,
i.arrived_at as start_at,
i.left_at as end_at,
date_trunc('month', i.arrived_at)::date as settle_month,
EXTRACT(EPOCH FROM (i.left_at - i.arrived_at)) / 3600 as work_hours
FROM "a57be577deb434"."tbl_implement_records" "i" LEFT JOIN "a57be577deb434"."tbl_cases" "c" ON c.id = i.case_id LEFT JOIN "a57be577deb434"."tbl_clients" "cl" ON cl.id = COALESCE(i.client_id, c.client_id) WHERE (i.arrived_at IS NOT NULL) AND (i.left_at IS NOT NULL) AND (i.left_at > i.arrived_at) AND (c.last_engineer IS NOT NULL) AND (("i"."is_draft"=FALSE) OR (i.is_draft IS NULL)) AND ("i"."arrived_at" >= '2026-01-01 00:00:00') AND ("i"."arrived_at" <= '2026-12-31 23:59:59') )) "ct" LEFT JOIN "a57be577deb434"."tbl_clients" "c" ON c.id = ct.client_id LEFT JOIN "a57be577deb434"."tbl_projects" "p" ON p.id = ct.project_id LEFT JOIN "a57be577deb434"."tbl_users" "sr" ON sr.id = ct.sales_rep_id LEFT JOIN "a57be577deb434"."tbl_users" "e" ON e.id = ct.engineer_id LEFT JOIN (SELECT ct.ticket_id, ct.ticket_type, COALESCE(sum(CASE WHEN ct.work_hours > 0 THEN COALESCE(payroll.amount, 0) / GREATEST((
SELECT COUNT(1)
FROM generate_series(ct.settle_month::timestamp, (ct.settle_month + interval '1 month - 1 day')::timestamp, interval '1 day') AS work_dates(work_date)
LEFT JOIN a57be577deb434.tbl_legal_holidays lh ON lh.edate = work_dates.work_date::date
LEFT JOIN a57be577deb434.tbl_punch_strategy_schedules pss ON pss.edate = work_dates.work_date::date AND pss.punch_strategy_id = ps.id
WHERE CASE
WHEN ps.id IS NULL THEN EXTRACT(ISODOW FROM work_dates.work_date)::integer BETWEEN 1 AND 5
WHEN pss.id IS NOT NULL THEN pss.need_work
WHEN ps.legal_holiday AND lh.id IS NOT NULL THEN lh.is_exchange
ELSE (ps.week::integer & (1 << (EXTRACT(ISODOW FROM work_dates.work_date)::integer - 1))) <> 0
END
), 1) / GREATEST((CASE WHEN ps.id IS NULL THEN 8 WHEN ps.punch_type = 0 THEN 8 WHEN ps.work_hour IS NOT NULL AND ps.work_hour > 0 THEN ps.work_hour ELSE 8 END), 1) * ct.work_hours ELSE 0 END), 0) as erp_labor_cost_amount FROM ((SELECT
p.id as ticket_id,
'preSales' as ticket_type,
'售前' as ticket_type_name,
p.ticket_no,
p.case_id,
c.case_no,
COALESCE(p.client_id, c.client_id) as client_id,
c.project_id,
cl.sales_rep as sales_rep_id,
p.engineer_id,
p.start_at,
p.end_at,
date_trunc('month', p.start_at)::date as settle_month,
EXTRACT(EPOCH FROM (p.end_at - p.start_at)) / 3600 as work_hours
FROM "a57be577deb434"."tbl_pre_sales" "p" LEFT JOIN "a57be577deb434"."tbl_cases" "c" ON c.id = p.case_id LEFT JOIN "a57be577deb434"."tbl_clients" "cl" ON cl.id = COALESCE(p.client_id, c.client_id) WHERE (p.start_at IS NOT NULL) AND (p.end_at IS NOT NULL) AND (p.end_at > p.start_at) AND (p.engineer_id IS NOT NULL) AND (("p"."is_draft"=FALSE) OR (p.is_draft IS NULL)) AND ("p"."start_at" >= '2026-01-01 00:00:00') AND ("p"."start_at" <= '2026-12-31 23:59:59')) UNION ALL ( SELECT
i.id as ticket_id,
'implementRecords' as ticket_type,
'实施' as ticket_type_name,
i.ticket_no,
i.case_id,
c.case_no,
COALESCE(i.client_id, c.client_id) as client_id,
c.project_id,
cl.sales_rep as sales_rep_id,
c.last_engineer as engineer_id,
i.arrived_at as start_at,
i.left_at as end_at,
date_trunc('month', i.arrived_at)::date as settle_month,
EXTRACT(EPOCH FROM (i.left_at - i.arrived_at)) / 3600 as work_hours
FROM "a57be577deb434"."tbl_implement_records" "i" LEFT JOIN "a57be577deb434"."tbl_cases" "c" ON c.id = i.case_id LEFT JOIN "a57be577deb434"."tbl_clients" "cl" ON cl.id = COALESCE(i.client_id, c.client_id) WHERE (i.arrived_at IS NOT NULL) AND (i.left_at IS NOT NULL) AND (i.left_at > i.arrived_at) AND (c.last_engineer IS NOT NULL) AND (("i"."is_draft"=FALSE) OR (i.is_draft IS NULL)) AND ("i"."arrived_at" >= '2026-01-01 00:00:00') AND ("i"."arrived_at" <= '2026-12-31 23:59:59') )) "ct" LEFT JOIN (SELECT pay.user_id, pay.settle_month, COALESCE(sum(pay.amount), 0) as amount FROM ((SELECT am.user_id, t.settle_month::date as settle_month, COALESCE(sum(am.amount), 0) as amount FROM "a57be577deb434"."tbl_erp_wage_ticket_amounts" "am" LEFT JOIN "a57be577deb434"."tbl_erp_wage_tickets" "t" ON am.erp_wage_ticket_id = t.id WHERE ("t"."status"=2) AND (am.user_id IS NOT NULL) GROUP BY "am"."user_id", "t"."settle_month") UNION ALL ( SELECT am.user_id, t.settle_month::date as settle_month, COALESCE(sum(am.amount), 0) as amount FROM "a57be577deb434"."tbl_erp_social_insurance_amounts" "am" LEFT JOIN "a57be577deb434"."tbl_erp_social_insurances" "t" ON am.erp_social_insurance_id = t.id WHERE ("t"."status"=2) AND (am.user_id IS NOT NULL) GROUP BY "am"."user_id", "t"."settle_month" ) UNION ALL ( SELECT am.user_id, t.settle_month::date as settle_month, COALESCE(sum(am.amount), 0) as amount FROM "a57be577deb434"."tbl_erp_provident_fund_amounts" "am" LEFT JOIN "a57be577deb434"."tbl_erp_provident_funds" "t" ON am.erp_provident_fund_id = t.id WHERE ("t"."status"=2) AND (am.user_id IS NOT NULL) GROUP BY "am"."user_id", "t"."settle_month" ) UNION ALL ( SELECT am.user_id, t.settle_month::date as settle_month, COALESCE(sum(am.amount), 0) as amount FROM "a57be577deb434"."tbl_erp_personal_tax_amounts" "am" LEFT JOIN "a57be577deb434"."tbl_erp_personal_taxs" "t" ON am.erp_personal_tax_id = t.id WHERE ("t"."status"=2) AND (am.user_id IS NOT NULL) GROUP BY "am"."user_id", "t"."settle_month" )) "pay" GROUP BY "pay"."user_id", "pay"."settle_month") "payroll" ON payroll.user_id = ct.engineer_id AND payroll.settle_month = ct.settle_month LEFT JOIN "a57be577deb434"."tbl_punch_strategy_resource_rels" "psrr" ON psrr.user_id = ct.engineer_id LEFT JOIN "a57be577deb434"."tbl_punch_strategies" "ps" ON ps.id = psrr.punch_strategy_id GROUP BY "ct"."ticket_id", "ct"."ticket_type") "tlc" ON tlc.ticket_id = ct.ticket_id AND tlc.ticket_type = ct.ticket_type WHERE "ct"."engineer_id"='1023' ORDER BY ct.start_at DESC, ct.ticket_id DESC LIMIT 40 OFFSET 80 |
| 16:01:30.435 | trace | yii\redis\Connection::executeCommand | Executing Redis Command: GET |
| 16:01:30.436 | trace | yii\redis\Connection::executeCommand | Executing Redis Command: MGET |
| 16:01:30.436 | info | yii\db\Command::query | INSERT INTO "global"."tbl_api_log" ("code", "schema", "user_id", "device_type", "url", "request", "response", "php_error", "time", "duration") VALUES (200, 'a57be577deb434', 1001, 5, 'vue/erp-analysis/list-case-ticket', '{"user_id":"1023","created_at_period":"erpcurrentfascalyear","created_at_to":"","created_at_from":"","page":"3","pageSize":"40","listReload":"undefined","web_access_token":"XCfRahmCFXcXmdIMLA2cYqURDbuJi7wa"}', '{"code":2000,"result":{"erp_labor_cost_amount":"2291.19","work_hours":"143.74","average_labor_cost_per_hour":"15.94","list":[],"pagenation":{"totalcount":46,"thispage":3,"pagesize":40}},"status":1,"msg":[{"name":"success","success":"\u6210\u529f\u83b7\u53d6\u6570\u636e","error":""}],"mod":0,"ip":"221.216.117.119","ua":"Mozilla\/5.0 (Macintosh; Intel Mac OS X 10.15; rv:151.0) Gecko\/20100101 Firefox\/151.0"}', FALSE, '2026-06-01 16:01:30', 49083904) RETURNING "id" |
| 16:01:30.437 | trace | yii\redis\Connection::executeCommand | Executing Redis Command: GET |
| 16:01:30.437 | trace | yii\redis\Connection::executeCommand | Executing Redis Command: SET |