From 8856bf7f74410588cc2631994beba21dfb383d7e Mon Sep 17 00:00:00 2001 From: "gao.zhiyuan" Date: Thu, 29 Jun 2023 17:17:16 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8A=93=E5=8F=96=E8=A1=A8=E5=8D=95=E6=95=B0?= =?UTF-8?q?=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/app/lib/models/workorder.js | 103 +++++++++++++++++++ api/app/lib/schedule/workorder_statistics.js | 74 +++++++++++-- api/app/lib/utils/parseProcessData.js | 6 ++ api/config.js | 8 +- api/sequelize-automate.config.js | 9 +- script/0.28/schema/1.create_workorder.sql | 41 ++++++++ 6 files changed, 227 insertions(+), 14 deletions(-) create mode 100644 api/app/lib/models/workorder.js create mode 100644 script/0.28/schema/1.create_workorder.sql diff --git a/api/app/lib/models/workorder.js b/api/app/lib/models/workorder.js new file mode 100644 index 0000000..0881e6e --- /dev/null +++ b/api/app/lib/models/workorder.js @@ -0,0 +1,103 @@ +/* eslint-disable*/ + +'use strict'; + +module.exports = dc => { + const DataTypes = dc.ORM; + const sequelize = dc.orm; + const Workorder = sequelize.define("workorder", { + id: { + type: DataTypes.INTEGER, + allowNull: false, + defaultValue: null, + comment: null, + primaryKey: true, + field: "id", + autoIncrement: true, + unique: "workorder_id_uindex" + }, + storyId: { + type: DataTypes.INTEGER, + allowNull: false, + defaultValue: null, + comment: "项企工作流的 history_id 实例id", + primaryKey: false, + field: "story_id", + autoIncrement: false, + unique: "workorder_story_id_uindex" + }, + pomsProjectId: { + type: DataTypes.INTEGER, + allowNull: true, + defaultValue: null, + comment: "运维的项目的id", + primaryKey: false, + field: "poms_project_id", + autoIncrement: false, + references: { + key: "id", + model: "projectCorrelation" + } + }, + expectTime: { + type: DataTypes.DATE, + allowNull: true, + defaultValue: null, + comment: "期望解决时间", + primaryKey: false, + field: "expect_time", + autoIncrement: false + }, + createTime: { + type: DataTypes.DATE, + allowNull: true, + defaultValue: null, + comment: "创建时间", + primaryKey: false, + field: "create_time", + autoIncrement: false + }, + completeTime: { + type: DataTypes.DATE, + allowNull: true, + defaultValue: null, + comment: "解决时间", + primaryKey: false, + field: "complete_time", + autoIncrement: false + }, + state: { + type: DataTypes.STRING, + allowNull: true, + defaultValue: null, + comment: "状态", + primaryKey: false, + field: "state", + autoIncrement: false + }, + problemType: { + type: DataTypes.STRING, + allowNull: true, + defaultValue: null, + comment: "问题类型", + primaryKey: false, + field: "problem_type", + autoIncrement: false + }, + solution: { + type: DataTypes.STRING, + allowNull: true, + defaultValue: null, + comment: "解决方案", + primaryKey: false, + field: "solution", + autoIncrement: false + } + }, { + tableName: "workorder", + comment: "", + indexes: [] + }); + dc.models.Workorder = Workorder; + return Workorder; +}; \ No newline at end of file diff --git a/api/app/lib/schedule/workorder_statistics.js b/api/app/lib/schedule/workorder_statistics.js index 50e27fd..bdf3bc9 100644 --- a/api/app/lib/schedule/workorder_statistics.js +++ b/api/app/lib/schedule/workorder_statistics.js @@ -1,34 +1,38 @@ const moment = require('moment') -let isDev = false -// let isDev = true +// let isDev = false +let isDev = true module.exports = function (app, opts) { const workorderStatistics = app.fs.scheduleInit( { - interval: '24 */1 * * * *', + interval: '24 0 */1 * * *', // 与 sql 相关 谨慎改动 immediate: isDev, proRun: !isDev, disabled: true }, + async () => { try { const { models, ORM: sequelize } = app.fs.dc - const { apMergeDeVeAnxinProjectId = '' } = opts const { clickHouse } = app.fs const { database: camWorkflow } = clickHouse.camWorkflow.opts.config const { parseProcessData } = app.fs.utils - const attendanceRes = await clickHouse.pepEmis.query( + const existWorkorderCount = await models.Workorder.count() + + const formRes = await clickHouse.pepEmis.query( ` SELECT story.id AS historyId, story.apply_user AS pepUserId, story.form_data AS formData, story.submit_form_data AS submitFormData, + story.create_at AS createAt, fform.form_schema AS formSchema, fprocess.name AS processName, procin.state_ AS state, + procin.end_time_ AS endTime, fform.id AS formId, fversion.id AS versionId, fgroup.name AS groupName @@ -44,13 +48,65 @@ module.exports = function (app, opts) { ON fgroup.id = fprocess.group_id AND fgroup.name = '运维中台表单' INNER JOIN ${camWorkflow}.act_hi_procinst AS procin - ON procin.id_ = story.procinst_id - ${existOvertimeCount || existVacateCount ? - `WHERE story.create_at > '2023-03-16 00:00:00'` - : ''} + ON procin.id_ = story.procinst_id + ${existWorkorderCount ? + // 25小时之内完成的 或 3个月内未完成的 + ` + WHERE + ( + procin.end_time_ IS NOT NULL + AND + procin.end_time_ > '${moment().subtract(25, 'hours').format('YYYY-MM-DD HH:mm:ss')}' + ) + OR + ( + procin.end_time_ IS NULL + AND + story.create_at > '${moment().subtract(3, 'months').format('YYYY-MM-DD HH:mm:ss')}' + ) + ` + : + '' + } ` + ).toPromise() + for (let f of formRes) { + const parseData = parseProcessData({ + formSchema: JSON.parse(f.formSchema), + formData: JSON.parse(f.formData) + }) + const existRes = await models.Workorder.findOne({ + where: { + storyId: f.historyId, + } + }) + if (existRes) { + await models.Workorder.update({ + completeTime: f.endTime || null, + state: f.state, + problemType: parseData.problemType.value, + solution: parseData.solution.value + }, { + where: { + storyId: f.historyId, + } + }) + } else { + const newRes = await models.Workorder.create({ + storyId: f.historyId, + pomsProjectId: parseData.pomsProjectId.value || null, + expectTime: parseData.expectTime.value || null, + createTime: f.createAt || null, + completeTime: f.endTime || null, + state: f.state, + problemType: parseData.problemType.value || null, + solution: parseData.solution.value || null + }) + } + } + } catch (error) { console.error(error); } diff --git a/api/app/lib/utils/parseProcessData.js b/api/app/lib/utils/parseProcessData.js index 22a2f99..f4a958b 100644 --- a/api/app/lib/utils/parseProcessData.js +++ b/api/app/lib/utils/parseProcessData.js @@ -93,6 +93,12 @@ module.exports = function (app, opts) { }, expectTime: { keyWord: '期望完成时间' + }, + problemType: { + keyWord: '问题类型', + }, + solution: { + keyWord: '解决方案' } }) => { let needData = JSON.parse(JSON.stringify(pomsNeedData)) diff --git a/api/config.js b/api/config.js index 5640487..d00c5ce 100644 --- a/api/config.js +++ b/api/config.js @@ -252,10 +252,10 @@ const product = { name: 'iot', db: CLICKHOUST_IOT }, - // { - // name: 'camWorkflow', - // db: CLICKHOUST_CAM_WORKFLOW - // }, + { + name: 'camWorkflow', + db: CLICKHOUST_CAM_WORKFLOW + }, ] } } diff --git a/api/sequelize-automate.config.js b/api/sequelize-automate.config.js index 0b063a4..8012e75 100644 --- a/api/sequelize-automate.config.js +++ b/api/sequelize-automate.config.js @@ -6,6 +6,13 @@ module.exports = { password: '123', dialect: 'postgres', host: '10.8.30.32', + + // database: 'POMS', + // username: 'FashionAdmin', + // password: '123456', + // dialect: 'postgres', + // host: '10.8.30.156', + port: 5432, define: { underscored: false, @@ -26,7 +33,7 @@ module.exports = { dir: './app/lib/models', // 指定输出 models 文件的目录 typesDir: 'models', // 指定输出 TypeScript 类型定义的文件目录,只有 TypeScript / Midway 等会有类型定义 emptyDir: false, // !!! 谨慎操作 生成 models 之前是否清空 `dir` 以及 `typesDir` - tables: ['alarm_push_config'], // 指定生成哪些表的 models,如 ['user', 'user_post'];如果为 null,则忽略改属性 + tables: ['workorder'], // 指定生成哪些表的 models,如 ['user', 'user_post'];如果为 null,则忽略改属性 skipTables: [], // 指定跳过哪些表的 models,如 ['user'];如果为 null,则忽略改属性 tsNoCheck: false, // 是否添加 `@ts-nocheck` 注释到 models 文件中 ignorePrefix: [], // 生成的模型名称忽略的前缀,因为 项目中有以下表名是以 t_ 开头的,在实际模型中不需要, 可以添加多个 [ 't_data_', 't_',] ,长度较长的 前缀放前面 diff --git a/script/0.28/schema/1.create_workorder.sql b/script/0.28/schema/1.create_workorder.sql new file mode 100644 index 0000000..cc19610 --- /dev/null +++ b/script/0.28/schema/1.create_workorder.sql @@ -0,0 +1,41 @@ +create table if not exists workorder +( + id serial not null + constraint workorder_pk + primary key, + story_id integer not null, + poms_project_id integer + constraint workorder_project_correlation_id_fk + references project_correlation, + expect_time timestamp with time zone, + create_time timestamp with time zone, + complete_time timestamp with time zone, + state varchar(64), + problem_type varchar(128), + solution varchar(128) +); + +comment on table workorder is '工单信息 定时任务采集自项企工作流'; + +comment on column workorder.story_id is '项企工作流的 history_id 实例id'; + +comment on column workorder.poms_project_id is '运维的项目的id'; + +comment on column workorder.expect_time is '期望解决时间'; + +comment on column workorder.create_time is '创建时间'; + +comment on column workorder.complete_time is '解决时间'; + +comment on column workorder.state is '状态'; + +comment on column workorder.problem_type is '问题类型'; + +comment on column workorder.solution is '解决方案'; + +create unique index if not exists workorder_id_uindex + on workorder (id); + +create unique index if not exists workorder_story_id_uindex + on workorder (story_id); +