运维服务中台
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

119 lines
4.4 KiB

const moment = require('moment')
// let isDev = false
let isDev = true
module.exports = function (app, opts) {
const workorderStatistics = app.fs.scheduleInit(
{
interval: '24 0 */1 * * *', // 与 sql 相关 谨慎改动
immediate: isDev,
proRun: !isDev,
disabled: true
},
async () => {
try {
const { models, ORM: sequelize } = app.fs.dc
const { clickHouse } = app.fs
const { database: camWorkflow } = clickHouse.camWorkflow.opts.config
const { parseProcessData } = app.fs.utils
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
FROM
workflow_process_history AS story
INNER JOIN workflow_process_version AS fversion
ON fversion.id = story.version_id
INNER JOIN workflow_process_form AS fform
ON fform.id = fversion.form_id
INNER JOIN workflow_process AS fprocess
ON fprocess.id = fform.process_id
INNER JOIN workflow_group AS fgroup
ON fgroup.id = fprocess.group_id
AND fgroup.name = '运维中台表单'
INNER JOIN ${camWorkflow}.act_hi_procinst AS procin
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);
}
}
)
return {
workorderStatistics,
}
}