wangrong
2026-09-20 dc77841fcc93a5078469bf8dd5d6824d1c63f073
修复每日称重汇总任务
5个文件已修改
5个文件已删除
25757 ■■■■■ 已修改文件
src/entities.ts 151 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/modules/report/service/ExecutorSiteDeptDaily.ts 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/modules/report/service/taskservice.ts 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/modules/report/service/taskservicedepartment.ts 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/modules/report/service/taskservicesite.ts 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
womp-20260716154200.sql 3665 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
womp-20260716230000.sql 4591 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
womp-20260717162800.sql 6064 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
womp-20260718115500.sql 7067 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
womp-shop-20260814101500.sql 4169 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/entities.ts
@@ -1,2 +1,151 @@
// 自动生成的文件,请勿手动修改
export const entities = [];
import * as entity0 from './modules/user/entity/wx';
import * as entity1 from './modules/user/entity/info';
import * as entity2 from './modules/user/entity/address';
import * as entity3 from './modules/task/entity/log';
import * as entity4 from './modules/task/entity/info';
import * as entity5 from './modules/space/entity/type';
import * as entity6 from './modules/space/entity/info';
import * as entity7 from './modules/shop/entity/transaction';
import * as entity8 from './modules/shop/entity/recycleorderitem';
import * as entity9 from './modules/shop/entity/recycleorder';
import * as entity10 from './modules/shop/entity/recycleitem';
import * as entity11 from './modules/shop/entity/recycleappointmentlog';
import * as entity12 from './modules/shop/entity/recycleappointment';
import * as entity13 from './modules/report/entity/joblog';
import * as entity14 from './modules/report/entity/dailyvehicle';
import * as entity15 from './modules/report/entity/dailysorter';
import * as entity16 from './modules/report/entity/dailysite';
import * as entity17 from './modules/report/entity/dailydepartment';
import * as entity18 from './modules/recycle/entity/data';
import * as entity19 from './modules/push/entity/weight';
import * as entity20 from './modules/push/entity/vehiclegps';
import * as entity21 from './modules/push/entity/sorterhealth';
import * as entity22 from './modules/push/entity/sortergps';
import * as entity23 from './modules/push/entity/sorterattendance';
import * as entity24 from './modules/push/entity/sorteralarm';
import * as entity25 from './modules/push/entity/siteweight';
import * as entity26 from './modules/push/entity/isapieventtype';
import * as entity27 from './modules/push/entity/isapientity';
import * as entity28 from './modules/push/entity/deviceonoff';
import * as entity29 from './modules/push/entity/devicealarm';
import * as entity30 from './modules/push/entity/cameragps';
import * as entity31 from './modules/push/entity/auditlog';
import * as entity32 from './modules/plugin/entity/info';
import * as entity33 from './modules/order/entity/info';
import * as entity34 from './modules/order/entity/goods';
import * as entity35 from './modules/operation/entity/wastesale';
import * as entity36 from './modules/operation/entity/traderecord';
import * as entity37 from './modules/monitor/entity/capturetask';
import * as entity38 from './modules/market/entity/coupon/user';
import * as entity39 from './modules/market/entity/coupon/info';
import * as entity40 from './modules/info/entity/banner';
import * as entity41 from './modules/goods/entity/type';
import * as entity42 from './modules/goods/entity/spec';
import * as entity43 from './modules/goods/entity/searchKeyword';
import * as entity44 from './modules/goods/entity/info';
import * as entity45 from './modules/goods/entity/comment';
import * as entity46 from './modules/dict/entity/type';
import * as entity47 from './modules/dict/entity/info';
import * as entity48 from './modules/demo/entity/goods';
import * as entity49 from './modules/cs/entity/session';
import * as entity50 from './modules/cs/entity/msg';
import * as entity51 from './modules/cs/entity/conn';
import * as entity52 from './modules/basicdata/entity/wastetype';
import * as entity53 from './modules/basicdata/entity/vehicle';
import * as entity54 from './modules/basicdata/entity/sorter';
import * as entity55 from './modules/basicdata/entity/site';
import * as entity56 from './modules/basicdata/entity/iot';
import * as entity57 from './modules/basicdata/entity/driver';
import * as entity58 from './modules/basicdata/entity/buyer';
import * as entity59 from './modules/base/entity/base';
import * as entity60 from './modules/base/entity/sys/user_role';
import * as entity61 from './modules/base/entity/sys/user';
import * as entity62 from './modules/base/entity/sys/role_menu';
import * as entity63 from './modules/base/entity/sys/role_department';
import * as entity64 from './modules/base/entity/sys/role';
import * as entity65 from './modules/base/entity/sys/param';
import * as entity66 from './modules/base/entity/sys/menu';
import * as entity67 from './modules/base/entity/sys/log';
import * as entity68 from './modules/base/entity/sys/department';
import * as entity69 from './modules/base/entity/sys/conf';
import * as entity70 from './modules/app/entity/version';
import * as entity71 from './modules/app/entity/goods';
import * as entity72 from './modules/app/entity/feedback';
import * as entity73 from './modules/app/entity/complain';
export const entities = [
  ...Object.values(entity0),
  ...Object.values(entity1),
  ...Object.values(entity2),
  ...Object.values(entity3),
  ...Object.values(entity4),
  ...Object.values(entity5),
  ...Object.values(entity6),
  ...Object.values(entity7),
  ...Object.values(entity8),
  ...Object.values(entity9),
  ...Object.values(entity10),
  ...Object.values(entity11),
  ...Object.values(entity12),
  ...Object.values(entity13),
  ...Object.values(entity14),
  ...Object.values(entity15),
  ...Object.values(entity16),
  ...Object.values(entity17),
  ...Object.values(entity18),
  ...Object.values(entity19),
  ...Object.values(entity20),
  ...Object.values(entity21),
  ...Object.values(entity22),
  ...Object.values(entity23),
  ...Object.values(entity24),
  ...Object.values(entity25),
  ...Object.values(entity26),
  ...Object.values(entity27),
  ...Object.values(entity28),
  ...Object.values(entity29),
  ...Object.values(entity30),
  ...Object.values(entity31),
  ...Object.values(entity32),
  ...Object.values(entity33),
  ...Object.values(entity34),
  ...Object.values(entity35),
  ...Object.values(entity36),
  ...Object.values(entity37),
  ...Object.values(entity38),
  ...Object.values(entity39),
  ...Object.values(entity40),
  ...Object.values(entity41),
  ...Object.values(entity42),
  ...Object.values(entity43),
  ...Object.values(entity44),
  ...Object.values(entity45),
  ...Object.values(entity46),
  ...Object.values(entity47),
  ...Object.values(entity48),
  ...Object.values(entity49),
  ...Object.values(entity50),
  ...Object.values(entity51),
  ...Object.values(entity52),
  ...Object.values(entity53),
  ...Object.values(entity54),
  ...Object.values(entity55),
  ...Object.values(entity56),
  ...Object.values(entity57),
  ...Object.values(entity58),
  ...Object.values(entity59),
  ...Object.values(entity60),
  ...Object.values(entity61),
  ...Object.values(entity62),
  ...Object.values(entity63),
  ...Object.values(entity64),
  ...Object.values(entity65),
  ...Object.values(entity66),
  ...Object.values(entity67),
  ...Object.values(entity68),
  ...Object.values(entity69),
  ...Object.values(entity70),
  ...Object.values(entity71),
  ...Object.values(entity72),
  ...Object.values(entity73),
];
src/modules/report/service/ExecutorSiteDeptDaily.ts
@@ -20,18 +20,17 @@
    taskServiceDepartment: TaskServiceDepartment;
    async execute() {
        // 捞出所有待处理任务
        const pendingSiteJobs = await this.reportJoblogEntity.find({
            where: {
                status: In(['INIT', 'FAILED']),
                jobName: In(['SITE_DAILY', 'DEPT_DAILY']),
            },
            order: {
                dataDate: 'ASC', // 先算历史,后算今天
                // 确保在同一天内,SITE_DAILY 先跑,DEPT_DAILY 后跑
                // 在 JS 数组中我们可以进一步控制排序,或者由业务逻辑严格控制依赖
            },
            where: { status: In(['INIT', 'FAILED']), jobName: In(['SITE_DAILY', 'DEPT_DAILY']) },
            order: { dataDate: 'ASC' },
        });
        // 显式排序:同日期内 SITE_DAILY 必须排在 DEPT_DAILY 前面
        pendingSiteJobs.sort((a, b) => {
            const d = String(a.dataDate).localeCompare(String(b.dataDate));
            if (d !== 0) return d;
            return a.jobName === 'SITE_DAILY' ? -1 : 1;
        });
        for (const job of pendingSiteJobs) {
            // 严格依赖检查:如果是部门日表任务,必须确保同天的站点日表任务已经是 SUCCESS
@@ -78,20 +77,17 @@
            } catch (error) {
                // 失败:记录堆栈,等待下一小时重试
                var errorMessage = '';
                let errorMessage = '';
                if (error instanceof Error) {
                    errorMessage = error.stack ?? error.message;
                }
                if (typeof error === 'string') {
                    console.error('[JOB-FAILED]', job.jobName, job.dataDate, error?.message ?? error);
                    console.error(error.stack);
                } else if (typeof error === 'string') {
                    errorMessage = error;
                }
                try {
                    errorMessage = JSON.stringify(error);
                } catch {
                    errorMessage = String(error);
                }
                } else {
                    try { errorMessage = JSON.stringify(error); }
                    catch { errorMessage = String(error); }
                }
                await this.reportJoblogEntity.update(job.id, {
                    status: 'FAILED',
                    endTime: new Date(),
src/modules/report/service/taskservice.ts
@@ -46,7 +46,6 @@
    ]);
    return '任务执行:ReportTaskService';
  }
src/modules/report/service/taskservicedepartment.ts
@@ -151,6 +151,7 @@
                    .values(chunk)
                    // 💡 显式声明:当 ['date', 'departmentId'] 发生冲突时,强行把 allUpdateFields 里的字段全部更新一遍
                    .orUpdate(allUpdateFields, ['date', 'departmentId'])
                    .updateEntity(false)
                    .execute();
            }
        }
src/modules/report/service/taskservicesite.ts
@@ -58,8 +58,8 @@
        // 映射表:将明细里的 garbageType 映射到你 Entity 里的字段后缀
        const typeKeyMap: Record<string, string> = {
            'SW60': 'Sw60', 'SW61': 'Sw61', 'SW62': 'Sw62', 'SW63': 'Sw63', 'SW64': 'Sw64',
            '900-001-S62': 'Sw62001', '900-002-S62': 'Sw62002', '900-003-S62': 'Sw62003',
            '900-004-S62': 'Sw62004', '900-005-S62': 'Sw62005', '900-006-S62': 'Sw62006', '900-007-S62': 'Sw62007'
            'Sw62001': 'Sw62001', 'Sw62002': 'Sw62002', 'Sw62003': 'Sw62003',
            'Sw62004': 'Sw62004', 'Sw62005': 'Sw62005', 'Sw62006': 'Sw62006', 'Sw62007': 'Sw62007'
        };
@@ -142,12 +142,14 @@
            for (let i = 0; i < finalRecords.length; i += chunkSize) {
                const chunk = finalRecords.slice(i, i + chunkSize);
                await this.reportDailysiteEntity.createQueryBuilder()
                const result = await this.reportDailysiteEntity.createQueryBuilder()
                    .insert()
                    .values(chunk)
                    // 💡 显式声明:当 ['date', 'siteId'] 发生冲突时,强行把 allUpdateFields 里的字段全部更新一遍
                    .orUpdate(allUpdateFields, ['date', 'siteId'])
                    .updateEntity(false)        // ← 加这一行,跳过 ReturningResultsEntityUpdator
                    .execute();
                console.log(`[SITE-UPSERT-OK] date=${targetDate} chunk=${chunk} raw=${JSON.stringify(result?.raw)}`);
            }
        }
womp-20260716154200.sql
File was deleted
womp-20260716230000.sql
File was deleted
womp-20260717162800.sql
File was deleted
womp-20260718115500.sql
File was deleted
womp-shop-20260814101500.sql
File was deleted