Browse Source

巡检模板

master
巴林闲侠 2 years ago
parent
commit
938a76aa07
  1. 3
      api/.vscode/launch.json
  2. 6
      api/app/lib/schedule/clearExpiredData.js
  3. 64
      api/app/lib/schedule/metting.js
  4. 415
      api/app/lib/utils/member.js
  5. 9
      api/package-lock.json
  6. 3
      web/client/src/sections/patrolManage/containers/index.js
  7. 164
      web/client/src/sections/patrolManage/containers/patrolTemplate.js
  8. 3
      web/client/src/sections/patrolManage/nav-item.js
  9. 7
      web/client/src/sections/patrolManage/routes.js

3
api/.vscode/launch.json

@ -15,7 +15,8 @@
"args": [
"-p 4900",
//
"-g postgres://postgres:123456@10.8.16.184:5432/XunJian",
"-g postgres://FashionAdmin:123456@10.8.30.39:5432/Inspection",
// "-g postgres://FashionAdmin:123456@10.8.30.156:5432/inspection",
//
// "--apiEmisUrl http://10.8.30.161:1111",
// "--qnak XuDgkao6cL0HidoMAPnA5OB10Mc_Ew08mpIfRJK5",

6
api/app/lib/schedule/clearExpiredData.js

@ -22,11 +22,7 @@ module.exports = function (app, opts) {
expired: { $lt: now }
}
})
await models.PhoneValidateCode.destroy({
where: {
expired: { $lt: now }
}
})
fs.readdir(path.join(__dirname, `../../downloadFiles`), function (err, files) {
if (err) {
return;

64
api/app/lib/schedule/metting.js

@ -1,64 +0,0 @@
const moment = require('moment')
const TEST = false
// const TEST = true
module.exports = function (app, opts) {
const mettingGenerate = app.fs.scheduleInit(
{
interval: '0 0 0 */1 * *',
immediate: TEST,
proRun: !TEST,
},
async () => {
try {
const { models } = app.fs.dc
const today = moment()
const date = today.date()
const dateFormat = moment().format('YYYY-MM-DD')
let sites = await models.Site.findAll({
where: { del: false },
attributes: ['id', 'name']
});
let datasM = [], datasB = [], datasD = [], datas6 = []
sites.map(s => {
datasM.push({
siteId: s.id,
type: '月度安全例会',
date: dateFormat
});
datasB.push({
siteId: s.id,
type: '班前会',
date: dateFormat
});
datasD.push({
siteId: s.id,
type: '日调度会',
date: dateFormat
});
datas6.push({
siteId: s.id,
type: '逢六教育培训',
date: dateFormat
})
})
if (date == 1) {
await models.Metting.bulkCreate(datasM)
}
await models.Metting.bulkCreate(datasB)
await models.Metting.bulkCreate(datasD)
if (parseInt(date) % 10 == 6) {
await models.Metting.bulkCreate(datas6)
}
} catch (error) {
app.fs.logger.error(`sechedule: mettingGenerate, error: ${error}`);
}
}
);
return {
mettingGenerate
}
}

415
api/app/lib/utils/member.js

@ -1,415 +0,0 @@
'use strict';
const moment = require('moment')
const request = require('superagent');
module.exports = function (app, opts) {
async function memberList ({
keywordTarget, keyword, limit, page, state,
hiredateStart, hiredateEnd, marital, native, workPlace,
orderBy, orderDirection,
nowAttendanceTime,
overtimeDayStatisticStartDate, overtimeDayStatisticendDate,
overtimeCountStatistic, overtimeCountStatisticStartDate, overtimeCountStatisticendDate,
vacateDayStatisticStartDate, vacateDayStatisticendDate,
vacateDurationStatistic, vacateCountStatistic, vacateCountStatisticStartDate, vacateCountStatisticendDate
}) {
const { judgeHoliday } = app.fs.utils
const { clickHouse } = app.fs
const { database: pepEmis } = clickHouse.pepEmis.opts.config
const curDay = moment().format('YYYY-MM-DD')
const nowTime = moment()
let whereOption = []
let whereFromSelectOption = []
let returnEmpty = false
if (state == 'inOffice') {
// 在岗
const holidayJudge = await judgeHoliday(curDay)
if (holidayJudge) {
if (
holidayJudge.workday
&& nowTime.isAfter(moment(curDay + ' 08:30'))
&& nowTime.isBefore(moment(curDay + ' 17:30'))
) {
// 在工作日的工作时间范围 无请假记录
whereFromSelectOption.push(`vacateStartTime = '1970-01-01 00:00:00.000000'`)
} else {
returnEmpty = true
}
} else {
returnEmpty = true
}
}
if (state == 'dayoff') {
// 放假
const holidayJudge = await judgeHoliday(curDay)
if (holidayJudge) {
if (
holidayJudge.dayoff || holidayJudge.festivals
) {
// 在休息日范围内且无加班申请
whereFromSelectOption.push(`overtimeStartTime = '1970-01-01 00:00:00.000000'`)
} else {
returnEmpty = true
}
} else {
returnEmpty = true
}
}
if (returnEmpty) {
return {
count: 0,
rows: []
}
}
let overtimeDayStatisticWhere = []
if (overtimeDayStatisticStartDate) {
overtimeDayStatisticWhere.push(`overtime_day.day >= '${moment(overtimeDayStatisticStartDate).format('YYYY-MM-DD')}'`)
}
if (overtimeDayStatisticendDate) {
overtimeDayStatisticWhere.push(`overtime_day.day <= '${moment(overtimeDayStatisticendDate).format('YYYY-MM-DD')}'`)
}
let overtimeCountStatisticWhere = []
if (overtimeCountStatisticStartDate) {
overtimeCountStatisticWhere.push(`overtime.start_time >= '${moment(overtimeCountStatisticStartDate).startOf('day').format('YYYY-MM-DD HH:mm:ss')}'`)
}
if (overtimeCountStatisticendDate) {
overtimeCountStatisticWhere.push(`overtime.end_time <= '${moment(overtimeCountStatisticendDate).endOf('day').format('YYYY-MM-DD HH:mm:ss')}'`)
}
let vacateDayStatisticWhere = []
if (vacateDayStatisticStartDate) {
vacateDayStatisticWhere.push(`vacate_day.day >= '${moment(vacateDayStatisticStartDate).format('YYYY-MM-DD')}'`)
}
if (vacateDayStatisticendDate) {
vacateDayStatisticWhere.push(`vacate_day.day <= '${moment(vacateDayStatisticendDate).format('YYYY-MM-DD')}'`)
}
let vacateCountStatisticWhere = []
if (vacateCountStatisticStartDate) {
vacateCountStatisticWhere.push(`vacate.start_time >= '${moment(vacateCountStatisticStartDate).startOf('day').format('YYYY-MM-DD HH:mm:ss')}'`)
}
if (vacateCountStatisticendDate) {
vacateCountStatisticWhere.push(`vacate.end_time <= '${moment(vacateCountStatisticendDate).endOf('day').format('YYYY-MM-DD HH:mm:ss')}'`)
}
// CRAZY
const innerSelectQuery = `
FROM member
INNER JOIN ${pepEmis}.user AS user
ON member.pep_user_id = user.id
${keywordTarget == 'number' && keyword ? `
AND user.people_code LIKE '%${keyword}%'
`: ''}
${keywordTarget == 'name' && keyword ? `
AND user.name LIKE '%${keyword}%'
`: ''}
${nowAttendanceTime ? `
${state == 'vacate' ? 'INNER' : 'LEFT'} JOIN (
SELECT
pep_user_id,
any(start_time) AS vacateStartTime,
any(end_time) AS vacateEndTime
FROM vacate
WHERE
start_time <= '${nowTime.format('YYYY-MM-DD HH:mm:ss')}'
AND end_time > '${nowTime.format('YYYY-MM-DD HH:mm:ss')}'
GROUP BY pep_user_id
) AS hrVacate
ON hrVacate.pep_user_id = member.pep_user_id
`: ''}
${nowAttendanceTime ? `
LEFT JOIN (
SELECT
pep_user_id,
any(start_time) AS overtimeStartTime,
any(end_time) AS overtimeEndTime
FROM overtime
WHERE
start_time <= '${nowTime.format('YYYY-MM-DD HH:mm:ss')}'
AND end_time > '${nowTime.format('YYYY-MM-DD HH:mm:ss')}'
GROUP BY pep_user_id
) AS hrOvertime
ON hrOvertime.pep_user_id = member.pep_user_id
`: ''}
${orderBy == 'overtimeTakeRestSum' ||
orderBy == 'overtimePaySum' ||
orderBy == 'overtimeSum' ?
`LEFT JOIN (
SELECT
overtime.pep_user_id AS pepUserId,
sum(overtime_day.duration) AS duration
FROM overtime_day
INNER JOIN overtime
ON overtime.id = overtime_day.overtime_id
${orderBy == 'overtimeTakeRestSum' ? `AND overtime.compensate = '调休'` : ''}
${orderBy == 'overtimePaySum' ? `AND overtime.compensate = '发放加班补偿'` : ''}
${overtimeDayStatisticWhere.length ? `
WHERE ${overtimeDayStatisticWhere.join(' AND ')}
`: ''}
GROUP BY overtime.pep_user_id
) AS overtimeDayStatistic
ON overtimeDayStatistic.pepUserId = member.pep_user_id`: ''}
${overtimeCountStatistic ? `
LEFT JOIN (
SELECT
overtime.pep_user_id AS pepUserId,
count(pep_process_story_id) AS count
FROM overtime
${overtimeCountStatisticWhere.length ? `
WHERE ${overtimeCountStatisticWhere.join(' AND ')}
`: ''}
GROUP BY overtime.pep_user_id
) AS overtimeCountStatistic
ON overtimeCountStatistic.pepUserId = member.pep_user_id
`: ''}
${vacateDurationStatistic ||
orderBy == 'vacateSum' ?
`LEFT JOIN (
SELECT
vacate.pep_user_id AS pepUserId,
sum(vacate_day.duration) AS duration
FROM vacate_day
INNER JOIN vacate
ON vacate.id = vacate_day.vacate_id
${vacateDayStatisticWhere.length ? `
WHERE ${vacateDayStatisticWhere.join(' AND ')}
`: ''}
GROUP BY vacate.pep_user_id
) AS vacateDayStatistic
ON vacateDayStatistic.pepUserId = member.pep_user_id`: ''}
${vacateCountStatistic ? `
LEFT JOIN (
SELECT
vacate.pep_user_id AS pepUserId,
count(pep_process_story_id) AS count
FROM vacate
${vacateCountStatisticWhere.length ? `
WHERE ${vacateCountStatisticWhere.join(' AND ')}
`: ''}
GROUP BY vacate.pep_user_id
) AS vacateCountStatistic
ON vacateCountStatistic.pepUserId = member.pep_user_id
`: ''}
WHERE
member.del = '0'
${keywordTarget == 'post' && keyword ? `
AND user.post IN (
SELECT basicDataPost.id
FROM ${pepEmis}.basicdata_post AS basicDataPost
where basicDataPost.name LIKE '%${keyword}%'
)
` : ''}
${keywordTarget == 'dep' && keyword ? `
AND user.id IN (
SELECT department_user.user
FROM ${pepEmis}.department_user AS department_user
INNER JOIN ${pepEmis}.department AS department
ON department.id = department_user.department
AND department.name LIKE '%${keyword}%'
)
` : ''}
${state == 'dimission' ? `AND member.dimission_date IS NOT null` : ''}
${state == 'onJob' ? `AND member.dimission_date IS null` : ''}
${whereFromSelectOption.length && nowAttendanceTime ? `AND ${whereFromSelectOption.join('AND')}` : ''}
${hiredateStart ? `
AND member.hiredate >= '${moment(hiredateStart).format('YYYY-MM-DD')}'
`: ''}
${hiredateEnd ? `
AND member.hiredate <= '${moment(hiredateEnd).format('YYYY-MM-DD')}'
` : ''}
${marital ? `
AND member.marital = '${marital}'
`: ''}
${native ? `
AND member.native_place = '${native}'
`: ''}
${workPlace ? `
AND member.work_place = '${workPlace}'
`: ''}
`
const userRes = await clickHouse.hr.query(`
SELECT
hrMember."member.pep_user_id" AS pepUserId,
hrMember.*,
user.name AS userName,
user.people_code AS userCode,
basicDataPost.name AS userPost,
role.name AS roleName,
role.id AS roleId,
department.name AS depName,
department.id AS depId,
user.job AS userJob,
user.active_status AS userActiveStatus,
user.organization AS userOrganization
FROM (
SELECT
${orderBy == 'overtimeTakeRestSum'
|| orderBy == 'overtimePaySum'
|| orderBy == 'overtimeSum' ? `
overtimeDayStatistic.duration AS overtimeDayStatisticDuration,
`: ''}
${overtimeCountStatistic ? `
overtimeCountStatistic.count AS overtimeCount,
`: ''}
${orderBy == 'vacateSum' || vacateDurationStatistic ? `
vacateDayStatistic.duration AS vacateDayStatisticDuration,
`: ''}
${vacateCountStatistic ? `
vacateCountStatistic.count AS vacateCount,
`: ''}
${nowAttendanceTime ? `
hrVacate.vacateStartTime AS vacateStartTime,
hrVacate.vacateEndTime AS vacateEndTime,
hrOvertime.overtimeStartTime AS overtimeStartTime,
hrOvertime.overtimeEndTime AS overtimeEndTime,
`: ''}
member.*
${innerSelectQuery}
${limit ? `LIMIT ${limit}` : ''}
${limit && page ? 'OFFSET ' + parseInt(limit) * parseInt(page) : ''}
) AS hrMember
LEFT JOIN ${pepEmis}.user AS user
ON pepUserId = user.id
LEFT JOIN ${pepEmis}.user_role AS user_role
ON ${pepEmis}.user_role.user = user.id
LEFT JOIN ${pepEmis}.role AS role
ON ${pepEmis}.role.id = user_role.role
LEFT JOIN ${pepEmis}.basicdata_post AS basicDataPost
ON ${pepEmis}.basicdata_post.id = user.post
LEFT JOIN ${pepEmis}.department_user AS department_user
ON department_user.user = user.id
LEFT JOIN ${pepEmis}.department AS department
ON department.id = department_user.department
${whereOption.length ? `WHERE ${whereOption.join(' AND ')}` : ''}
ORDER BY ${orderBy == 'code' ?
'user.people_code'
: orderBy == 'hiredate'
? 'hrMember."member.hiredate"'
: orderBy == 'age'
? 'hrMember."member.birthday"'
: orderBy == 'overtimeTakeRestSum'
|| orderBy == 'overtimePaySum'
|| orderBy == 'overtimeSum' ?
'hrMember.overtimeDayStatisticDuration'
: orderBy == 'overtimeCount' ?
'hrMember.overtimeCount'
: orderBy == 'vacateSum' ?
'hrMember.vacateDayStatisticDuration'
: orderBy == 'vacateCount' ?
'hrMember.vacateCount'
: 'user.people_code'}
${orderDirection || 'ASC'}
`).toPromise()
const countRes = await clickHouse.hr.query(`
SELECT
count(member.pep_user_id) AS count
${innerSelectQuery}
`).toPromise()
return {
count: countRes[0].count,
rows: userRes
}
}
async function packageUserData (userRes, option = {}) {
const { judgeHoliday, } = app.fs.utils
let workTime = false
let dayoffTime = false
if (option.state) {
const curDay = moment().format('YYYY-MM-DD')
const nowTime = moment()
const holidayJudge = await judgeHoliday(curDay)
if (holidayJudge) {
if (
holidayJudge.workday
&& nowTime.isAfter(moment(curDay + ' 08:30'))
&& nowTime.isBefore(moment(curDay + ' 17:30'))
) {
workTime = true
} else if (holidayJudge.dayoff || holidayJudge.festivals) {
dayoffTime = true
}
}
}
let returnD = []
let pepUserIds = [-1]
userRes.rows.forEach(u => {
let existUser = returnD.find(r => r.pepUserId == u.pepUserId)
if (existUser) {
if (u.depId && !existUser.departmrnt.some(d => d.id == u.depId)) {
existUser.departmrnt.push({
id: u.depId,
name: u.depName
})
}
if (u.roleId && !existUser.role.some(r => r.id == u.roleId)) {
existUser.role.push({
id: u.roleId,
name: u.roleName
})
}
} else {
let obj = {}
for (let k in u) {
let nextKey = k.replace('hrMember.', '')
.replace('member.', '')
if (nextKey.includes('_')) {
nextKey = nextKey.toLowerCase()
.replace(
/(_)[a-z]/g,
(L) => L.toUpperCase()
)
.replace(/_/g, '')
}
obj[nextKey] = u[k] == '1970-01-01 00:00:00.000000' || u[k] == '1970-01-01 08:00:00.000000' ? null : u[k]
}
pepUserIds.push(u.pepUserId)
console.log("查询到的用户信息:", obj);
returnD.push({
...obj,
departmrnt: u.depId ? [{
id: u.depId,
name: u.depName
}] : [],
role: u.roleId ? [{
id: u.roleId,
name: u.roleName
}] : [],
state: option.state ?
obj['dimissionDate'] ? 'dimission' :
obj['vacateStartTime'] ? 'vacate' :
workTime ? 'inOffice' :
dayoffTime ? 'dayoff' : 'rest'
: undefined,
del: undefined,
pepuserid: undefined
})
}
})
return { packageUser: returnD, pepUserIds }
}
return {
memberList,
packageUserData
}
}

9
api/package-lock.json

@ -1604,6 +1604,15 @@
"resolved": "http://10.8.30.22:7000/fresh/-/fresh-0.5.2.tgz",
"integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac="
},
"fs-attachment": {
"version": "1.0.0",
"resolved": "http://10.8.30.22:7000/fs-attachment/-/fs-attachment-1.0.0.tgz",
"integrity": "sha512-wuOjl1Dtcnj5cbiF5OrT8jyEV4OUencDsL8OAMA7LZNHyUopChWEqEGXnRF01VLRY9xdbXlcXiTcD4PowKkXHA==",
"requires": {
"qiniu": "^7.1.1",
"uuid": "^3.1.0"
}
},
"fs-constants": {
"version": "1.0.0",
"resolved": "http://10.8.30.22:7000/fs-constants/-/fs-constants-1.0.0.tgz",

3
web/client/src/sections/patrolManage/containers/index.js

@ -2,5 +2,6 @@
import PatrolPlan from './patrolPlan';
import PatrolReocrd from './patrolRecord';
import PlanTemplate from './patrolTemplate'
export { PatrolPlan, PatrolReocrd };
export { PatrolPlan, PatrolReocrd, PlanTemplate };

164
web/client/src/sections/patrolManage/containers/patrolTemplate.js

@ -0,0 +1,164 @@
import React, { useState, useRef } from 'react';
import { connect } from 'react-redux';
import { Button, Popconfirm } from 'antd';
import ProTable from '@ant-design/pro-table';
import PlanModal from '../components/planModal';
import { createPatrolPlan, delPatrolPlan, updatePatrolPlan, getPatrolPlan } from '../actions/plan';
import moment from 'moment';
function PatrolTemplate (props) {
const { dispatch, user } = props;
const tableRef = useRef();
const [dataSource, setDataSource] = useState([{}]);
const [visible, setVisible] = useState(false);
const [type, setType] = useState();
const [curRecord, setCurRecord] = useState();
const onCreate = (values) => {
if (type === 'create') {
dispatch(createPatrolPlan(values)).then(res => {
if (res.success) {
tableRef.current.reload();
}
})
} else {
dispatch(updatePatrolPlan({ ...values, id: curRecord.id })).then(res => {
if (res.success) {
tableRef.current.reload();
}
})
}
setVisible(false);
};
const columns = [{
title: '结构物名称',
dataIndex: 'struName',
key: 'struName',
ellipsis: true,
render: (_, record) => {
return <div>{record?.project?.name}</div>
}
}, {
title: '巡检任务名称',
dataIndex: 'name',
key: 'name',
ellipsis: true
}, {
title: '开始时间',
dataIndex: 'startTime',
key: 'startTime',
ellipsis: true,
render: (_, record) => moment(record.startTime).format('YYYY-MM-DD')
}, {
title: '结束时间',
dataIndex: 'endTime',
key: 'endTime',
ellipsis: true,
render: (_, record) => moment(record.endTime).format('YYYY-MM-DD')
}, {
title: '巡检频次',
dataIndex: 'frequency',
key: 'frequency',
ellipsis: true,
}, {
title: '巡检点位',
dataIndex: 'patrolPoints',
key: 'patrolPoints',
ellipsis: true,
render: (_, record) => <div>{record?.points?.length ? record?.points?.map(p => p.name).join() : '-'}</div>
}, {
title: '巡检人',
dataIndex: 'patrolPerson',
key: 'patrolPerson',
ellipsis: true,
render: (_, record) => <div>{record?.user?.name}</div>
}, {
title: '巡检次数统计',
dataIndex: 'patrolCount',
key: 'patrolCount',
ellipsis: true,
}, {
title: '操作',
dataIndex: 'action',
key: 'action',
search: false,
width: 200,
render: (_, record) => {
return <>
<Button type="link" onClick={() => {
setType('edit')
setCurRecord(record)
setVisible(true)
}}>修改</Button>
<Button type="link" onClick={() => {
setType('view')
setCurRecord(record)
setVisible(true)
}}>查看</Button>
<Popconfirm
title="确认删除?"
onConfirm={() => {
dispatch(delPatrolPlan(record.id)).then(res => {
if (res.success) {
tableRef.current.reload();
}
})
}}>
<Button type="link" danger>删除</Button>
</Popconfirm>
</>
},
}];
return (
<>
<ProTable
columns={columns}
actionRef={tableRef}
options={false}
dataSource={dataSource || []}
rowKey='id'
pagination={{ pageSize: 10 }}
search={false}
request={async (params = {}) => {
const res = await dispatch(getPatrolPlan(params));
setDataSource(res?.payload.data?.rows);
return { ...res };
}}
onReset={() => { }}
toolBarRender={() => [
<Button
type="primary"
key="primary"
onClick={() => {
setType('create')
setVisible(true)
}}
>新增巡检模板</Button>
]}
/>
{
visible ?
<PlanModal
visible={visible}
onCreate={onCreate}
type={type}
curRecord={curRecord}
onCancel={() => {
setVisible(false);
}}
/> : null
}
</>
)
}
function mapStateToProps (state) {
const { auth } = state
return {
user: auth.user
}
}
export default connect(mapStateToProps)(PatrolTemplate);

3
web/client/src/sections/patrolManage/nav-item.js

@ -17,6 +17,9 @@ export function getNavItem(user, dispatch) {
<Menu.Item key="patrolRecord">
<Link to="/patrolManage/patrolRecord">巡检记录</Link>
</Menu.Item>
<Menu.Item key="patrolTemplate">
<Link to="/patrolManage/patrolTemplate">巡检模板</Link>
</Menu.Item>
</SubMenu>
);
}

7
web/client/src/sections/patrolManage/routes.js

@ -1,5 +1,5 @@
'use strict';
import { PatrolPlan, PatrolReocrd } from './containers';
import { PatrolPlan, PatrolReocrd, PlanTemplate } from './containers';
export default [{
type: 'inner',
@ -17,6 +17,11 @@ export default [{
key: 'patrolRecord',
component: PatrolReocrd,
breadcrumb: '巡检记录',
}, {
path: '/patrolTemplate',
key: 'patrolTemplate',
component: PlanTemplate,
breadcrumb: '巡检模板',
}]
}
}];
Loading…
Cancel
Save