diff --git a/api/app/lib/controllers/workOrder/index.js b/api/app/lib/controllers/workOrder/index.js index 217dbf6..4c49d5a 100644 --- a/api/app/lib/controllers/workOrder/index.js +++ b/api/app/lib/controllers/workOrder/index.js @@ -39,13 +39,16 @@ async function basicDataAllProject (ctx) { try { const { models } = ctx.fs.dc; const { clickHouse } = ctx.app.fs + const { includeDel } = ctx.query - const proRes = await models.ProjectCorrelation.findAll({ - where: { - del: false, - }, + let findOption = { + where: {}, order: [['updateTime', 'desc']], - }) + } + if (!includeDel) { + findOption.where.del = false + } + const proRes = await models.ProjectCorrelation.findAll(findOption) let pepProjectIds = new Set() for (let p of proRes) { @@ -72,7 +75,7 @@ async function basicDataAllProject (ctx) { return { value: p.id, label: corPro.project_name || p.name, - disabled: corPro.isdelete == 1 + disabled: corPro.isdelete == 1 || p.del } }) diff --git a/web/client/src/components/workflow/approval.jsx b/web/client/src/components/workflow/approval.jsx index a2255a1..62bc13f 100644 --- a/web/client/src/components/workflow/approval.jsx +++ b/web/client/src/components/workflow/approval.jsx @@ -42,7 +42,6 @@ const WorkFlowApprovalModal = (props) => { }, []) useEffect(() => { - console.log('iframeRef.current', iframeRef.current); if (checkProcessInstanceId && processAuditList.length && iframeRef.current) { const corProcessData = type == 'draft' ? processAuditList.find(p => p.id == checkProcessInstanceId) @@ -88,8 +87,15 @@ const WorkFlowApprovalModal = (props) => { 让世间万物拥有感知,服务人类社会于美好 { - onCancel && onCancel(); - setLoading(false); + if (false && ['approval', 'draft'].includes(type)) { + // 通知 ifream 准备关闭 + iframeRef.current.contentWindow.postMessage({ + type: 'prepareClose', + }, '*') + } else { + onCancel && onCancel(); + setLoading(false); + } }} />
diff --git a/web/client/src/components/workflow/index.jsx b/web/client/src/components/workflow/index.jsx index 3809e4f..c315760 100644 --- a/web/client/src/components/workflow/index.jsx +++ b/web/client/src/components/workflow/index.jsx @@ -3,6 +3,7 @@ import React from 'react'; import { connect } from 'react-redux'; import { Modal, Spin, Notification, Row, Space, Button } from '@douyinfe/semi-ui'; +import { push } from 'react-router-redux'; import { RouteTable } from '../../utils/webapi'; import { EmisRequest, EmisApiTable } from '$utils'; import { useState } from 'react'; @@ -47,7 +48,7 @@ const WorkFlowModal = (props) => { const handelApprovalCenter = (activeKey) => { if (webOa) { - window.open(webOa + "/approval/center?activeKey=" + activeKey); + dispatch(push("/workOrder/workOrderList/preserve")); } } @@ -78,8 +79,8 @@ const WorkFlowModal = (props) => { if (event && event.data && typeof (event.data) == 'string') { let data = JSON.parse(event.data); const { type, isSaveDraft, setIntervalSave, draftId, msg } = data; + console.log(data, msg); if (msg) { - console.log(msg); Notification.success({ title: msg }) } setDraftId(draftId); @@ -89,7 +90,11 @@ const WorkFlowModal = (props) => { if (setIntervalSave) { Notification.success({ title: '60秒,表单暂存草稿成功' }); } else { - Notification.success(保存草稿成功,可在 handelApprovalCenter("save")}>【审批中心/保存待发】查看详情, 10); + Notification.success({ + title: 保存草稿成功,可在 handelApprovalCenter("save")} + >【工单列表/我发起的】查看详情 + }); } } else { Notification.success({ title: '提交成功,可在【工单列表/我发起的】查看详情' }); @@ -110,7 +115,6 @@ const WorkFlowModal = (props) => { } }, []) - console.log(webEmis, processId); return (
{ /> - -
-
); diff --git a/web/client/src/sections/workOrder/actions/jobOrder.js b/web/client/src/sections/workOrder/actions/jobOrder.js index b977ddd..deddc14 100644 --- a/web/client/src/sections/workOrder/actions/jobOrder.js +++ b/web/client/src/sections/workOrder/actions/jobOrder.js @@ -2,6 +2,18 @@ import { ApiTable, basicAction } from '$utils' +export function getPomsProjectBasicAll () { + return dispatch => basicAction({ + type: 'get', + dispatch: dispatch, + actionType: 'GET_POMS_PROJECT_BASIC_ALL', + url: `${ApiTable.getPomsProjectBasicAll}?includeDel=true`, + msg: { error: '获取项目列表失败' }, + reducer: { name: 'pomsProjectBasicAll' } + }); +} + + export function getEnabledWorkflowProcess () { return dispatch => basicAction({ type: 'get', diff --git a/web/client/src/sections/workOrder/containers/aboutMe.jsx b/web/client/src/sections/workOrder/containers/aboutMe.jsx index 1dddd58..d99f061 100644 --- a/web/client/src/sections/workOrder/containers/aboutMe.jsx +++ b/web/client/src/sections/workOrder/containers/aboutMe.jsx @@ -1,14 +1,14 @@ import React, { useEffect, useRef, useState } from 'react'; import { connect } from 'react-redux'; -import { ApiTable, EmisApiTable, EmisRequest } from '$utils' +import { ApiTable, EmisApiTable, EmisRequest, parseProcessData, judgmentProcessState } from '$utils' import { Skeleton, Button, Pagination, Form, Popconfirm, Table, Toast } from '@douyinfe/semi-ui'; import { IconSearch } from '@douyinfe/semi-icons'; import { SkeletonScreen, WorkflowApprovalModal } from "$components"; import moment from "moment"; const Rest = (props) => { - const { dispatch, actions, user, socket } = props - + const { dispatch, actions, user, socket, pomsProjectBasicAll } = props + const { workOrder } = actions const [query, setQuery] = useState({ limit: 10, offset: 0 }); //页码信息 const [limits, setLimits] = useState(0)//每页实际条数 const [tableData, setTableData] = useState([]); @@ -20,23 +20,42 @@ const Rest = (props) => { useEffect(() => { backlogData() + if (!pomsProjectBasicAll.length) { + dispatch(workOrder.getPomsProjectBasicAll()) + } }, []) let backlogData = (obj = { limit: 10, offset: 0 }) => { - setLoading(true) EmisRequest.get(EmisApiTable.processInstancemMyNoticeList, - { userId: user?.id, businessType: '', ...obj }) + { + userId: user?.id, + businessType: '运维中台表单', + ...obj, + queryFormData: 'true' + }) .then(res => { - setTableData(res?.data) + let nextTableData = (res?.data || []).map(r => { + let pomsNeedData = {} + if (r?.formData?.formData && r?.formData?.workflowProcessVersion?.workflowProcessForm?.formSchema) { + pomsNeedData = parseProcessData({ + formSchema: r?.formData?.workflowProcessVersion?.workflowProcessForm?.formSchema, + formData: r?.formData?.formData + }) + } + return { + ...r, + pomsNeedData + } + }) + setTableData(nextTableData) setLoading(false) }, error => { Toast.error({ content: '抄送我的工单列表请求失败', duration: 1, }) setLoading(false) - }); EmisRequest.get(EmisApiTable.processInstancemMyNoticeCount, - { userId: user?.id, businessType: '', ...obj, limit: "", offset: "" }) + { userId: user?.id, businessType: '运维中台工单', ...obj, limit: "", offset: "" }) .then(res => { setLimits(res.count || 0) }, error => { @@ -50,10 +69,22 @@ const Rest = (props) => { render: (text, record, index) => index + 1 }, { title: '标题', - dataIndex: 'nae', + dataIndex: 'title', + render: (text, record, index) => { + return record?.pomsNeedData?.title?.value || '' + } }, { title: '关联项目', - dataIndex: 'nae', + dataIndex: 'pomsProject', + render: (text, record, index) => { + const pomsProjectId = record?.pomsNeedData?.pomsProjectId?.value + if (pomsProjectId) { + const corProject = pomsProjectBasicAll.find(p => p.value == pomsProjectId) + return corProject?.label || '' + } else { + return '' + } + } }, { title: '申请人', dataIndex: 'applyerName', @@ -62,14 +93,20 @@ const Rest = (props) => { dataIndex: 'applyDepartmentName', }, { title: '审批状态', - dataIndex: 'apName', + dataIndex: 'status', + render: (text, record) => { + return judgmentProcessState(record, 'copy') + }, }, { title: '提交时间', dataIndex: 'startTime', render: (text, record, index) => text && moment(text).format('YYYY-MM-DD HH:mm:ss') || '--' }, { title: '期望完成时间', - dataIndex: 'nae', + dataIndex: 'expectTime', + render: (text, record, index) => { + return record?.pomsNeedData?.expectTime?.value || '' + } }, { title: '操作', dataIndex: 'hadle', @@ -187,13 +224,11 @@ const Rest = (props) => { } function mapStateToProps (state) { - const { auth, global, members, webSocket } = state; + const { auth, global, pomsProjectBasicAll } = state; return { - // loading: members.isRequesting, user: auth.user, - // actions: global.actions, - // members: members.data, - // socket: webSocket.socket + actions: global.actions, + pomsProjectBasicAll: pomsProjectBasicAll.data || [] }; } diff --git a/web/client/src/sections/workOrder/containers/initiated.jsx b/web/client/src/sections/workOrder/containers/initiated.jsx index 6e383f8..d71ee57 100644 --- a/web/client/src/sections/workOrder/containers/initiated.jsx +++ b/web/client/src/sections/workOrder/containers/initiated.jsx @@ -1,13 +1,13 @@ import React, { useEffect, useRef, useState } from 'react'; import { connect } from 'react-redux'; -import { ApiTable, EmisApiTable, EmisRequest } from '$utils' +import { ApiTable, EmisApiTable, EmisRequest, parseProcessData, judgmentProcessState } from '$utils' import { Skeleton, Button, Pagination, Form, Popconfirm, Table, Toast } from '@douyinfe/semi-ui'; import { SkeletonScreen, WorkflowApprovalModal, } from "$components"; import moment from "moment"; const Rest = (props) => { - const { dispatch, actions, user, socket } = props - + const { dispatch, actions, user, socket, pomsProjectBasicAll } = props + const { workOrder } = actions const [query, setQuery] = useState({ limit: 10, offset: 0 }); //页码信息 const [limits, setLimits] = useState(0)//每页实际条数 const [tableData, setTableData] = useState([]); @@ -18,20 +18,40 @@ const Rest = (props) => { useEffect(() => { backlogData() + if (!pomsProjectBasicAll.length) { + dispatch(workOrder.getPomsProjectBasicAll()) + } }, []) let backlogData = (obj = { limit: 10, offset: 0 }) => { setLoading(true) EmisRequest.get(EmisApiTable.processInstancemMyApplyList, - { userId: user?.id, businessType: '', ...obj }) + { + userId: user?.id, + businessType: '运维中台表单', + ...obj, + queryFormData: 'true' + }) .then(res => { - setTableData(res?.data) + let nextTableData = (res?.data || []).map(r => { + let pomsNeedData = {} + if (r?.formData?.submitFormData && r?.formData?.workflowProcessVersion?.workflowProcessForm?.formSchema) { + pomsNeedData = parseProcessData({ + formSchema: r?.formData?.workflowProcessVersion?.workflowProcessForm?.formSchema, + formData: r?.formData?.submitFormData + }) + } + return { + ...r, + pomsNeedData + } + }) + setTableData(nextTableData) setLimits(res.count || 0) setLoading(false) }, error => { Toast.error({ content: '由我发起的工单列表请求失败', duration: 1, }) setLoading(false) - }); } @@ -41,10 +61,22 @@ const Rest = (props) => { render: (text, record, index) => index + 1 }, { title: '标题', - dataIndex: 'nae', + dataIndex: 'title', + render: (text, record, index) => { + return record?.pomsNeedData?.title?.value || '' + } }, { title: '关联项目', - dataIndex: 'nae', + dataIndex: 'pomsProject', + render: (text, record, index) => { + const pomsProjectId = record?.pomsNeedData?.pomsProjectId?.value + if (pomsProjectId) { + const corProject = pomsProjectBasicAll.find(p => p.value == pomsProjectId) + return corProject?.label || '' + } else { + return '' + } + } }, { title: '申请人', dataIndex: 'applyerName', @@ -53,14 +85,20 @@ const Rest = (props) => { dataIndex: 'applyDepartmentName', }, { title: '审批状态', - dataIndex: 'apName', + dataIndex: 'status', + render: (text, record) => { + return judgmentProcessState(record, 'initiate') + }, }, { title: '提交时间', dataIndex: 'startTime', render: (text, record, index) => text && moment(text).format('YYYY-MM-DD HH:mm:ss') || '--' }, { title: '期望完成时间', - dataIndex: 'nae', + dataIndex: 'expectTime', + render: (text, record, index) => { + return record?.pomsNeedData?.expectTime?.value || '' + } }, { title: '操作', dataIndex: 'hadle', @@ -178,13 +216,11 @@ const Rest = (props) => { } function mapStateToProps (state) { - const { auth, global, members, webSocket } = state; + const { auth, global, pomsProjectBasicAll } = state; return { - // loading: members.isRequesting, user: auth.user, - // actions: global.actions, - // members: members.data, - // socket: webSocket.socket + actions: global.actions, + pomsProjectBasicAll: pomsProjectBasicAll.data || [] }; } diff --git a/web/client/src/sections/workOrder/containers/jobOrder.jsx b/web/client/src/sections/workOrder/containers/jobOrder.jsx index 32fd548..cdc83e5 100644 --- a/web/client/src/sections/workOrder/containers/jobOrder.jsx +++ b/web/client/src/sections/workOrder/containers/jobOrder.jsx @@ -85,21 +85,12 @@ const JobOrder = (props) => { onCancel={() => { setWorkflowModalVisible(false) }} successCallBack={() => { setWorkflowModalVisible(false) }} /> - {/* */} - {/* { { setWorkflowModalVisible(false) }} - />} */} ) } function mapStateToProps (state) { const { auth, global, workflowProcess } = state; - console.log(global); return { user: auth.user, actions: global.actions, diff --git a/web/client/src/sections/workOrder/containers/preserve.jsx b/web/client/src/sections/workOrder/containers/preserve.jsx index b818e05..c190729 100644 --- a/web/client/src/sections/workOrder/containers/preserve.jsx +++ b/web/client/src/sections/workOrder/containers/preserve.jsx @@ -1,14 +1,14 @@ import React, { useEffect, useRef, useState } from 'react'; import { connect } from 'react-redux'; -import { ApiTable, EmisApiTable, EmisRequest } from '$utils' +import { ApiTable, EmisApiTable, EmisRequest, parseProcessData, judgmentProcessState, processState } from '$utils' import { Skeleton, Button, Pagination, Form, Popconfirm, Table, Toast, Tooltip } from '@douyinfe/semi-ui'; import { IconSearch } from '@douyinfe/semi-icons'; import { SkeletonScreen, WorkflowApprovalModal } from "$components"; import moment from "moment"; const Rest = (props) => { - const { dispatch, actions, user, socket } = props - + const { dispatch, actions, user, socket, pomsProjectBasicAll } = props + const { workOrder } = actions const [query, setQuery] = useState({ limit: 10, offset: 0 }); //页码信息 const [limits, setLimits] = useState(0)//每页实际条数 const [tableData, setTableData] = useState([]); @@ -19,14 +19,34 @@ const Rest = (props) => { useEffect(() => { backlogData() + if (!pomsProjectBasicAll.length) { + dispatch(workOrder.getPomsProjectBasicAll()) + } }, []) let backlogData = (obj = { limit: 10, offset: 0 }) => { setLoading(true) EmisRequest.get(EmisApiTable.processInstancemMyDraftList, - { userId: user?.id, businessType: '', ...obj }) + { + userId: user?.id, + businessType: '运维中台表单', + ...obj + }) .then(res => { - setTableData(res?.data) + let nextTableData = (res?.data || []).map(r => { + let pomsNeedData = {} + if (r?.formData && r?.formSchema) { + pomsNeedData = parseProcessData({ + formSchema: r?.formSchema, + formData: r?.formData + }) + } + return { + ...r, + pomsNeedData + } + }) + setTableData(nextTableData) setLimits(res.count || 0) setLoading(false) }, error => { @@ -41,10 +61,22 @@ const Rest = (props) => { render: (text, record, index) => index + 1 }, { title: '标题', - dataIndex: 'nae', + dataIndex: 'title', + render: (text, record, index) => { + return record?.pomsNeedData?.title?.value || '' + } }, { title: '关联项目', - dataIndex: 'nae', + dataIndex: 'pomsProject', + render: (text, record, index) => { + const pomsProjectId = record?.pomsNeedData?.pomsProjectId?.value + if (pomsProjectId) { + const corProject = pomsProjectBasicAll.find(p => p.value == pomsProjectId) + return corProject?.label || '' + } else { + return '' + } + } }, { title: '申请人', dataIndex: 'applyerName', @@ -55,14 +87,20 @@ const Rest = (props) => { render: (text, record, index) => user?.department[0]?.name }, { title: '审批状态', - dataIndex: 'apName', + dataIndex: 'status', + render: (text, record) => { + return judgmentProcessState({ state: processState.wait }, 'save') + }, }, { title: '提交时间', dataIndex: 'createAt', render: (text, record, index) => text && moment(text).format('YYYY-MM-DD HH:mm:ss') || '--' }, { title: '期望完成时间', - dataIndex: 'nae', + dataIndex: 'expectTime', + render: (text, record, index) => { + return record?.pomsNeedData?.expectTime?.value || '' + } }, { title: '操作', dataIndex: 'hadle', @@ -200,13 +238,11 @@ const Rest = (props) => { } function mapStateToProps (state) { - const { auth, global, members, webSocket } = state; + const { auth, global, pomsProjectBasicAll } = state; return { - // loading: members.isRequesting, user: auth.user, - // actions: global.actions, - // members: members.data, - // socket: webSocket.socket + actions: global.actions, + pomsProjectBasicAll: pomsProjectBasicAll.data || [] }; } diff --git a/web/client/src/sections/workOrder/containers/receipt.jsx b/web/client/src/sections/workOrder/containers/receipt.jsx index 7e06d57..10cf77f 100644 --- a/web/client/src/sections/workOrder/containers/receipt.jsx +++ b/web/client/src/sections/workOrder/containers/receipt.jsx @@ -1,14 +1,14 @@ import React, { useEffect, useRef, useState } from 'react'; import { connect } from 'react-redux'; -import { ApiTable, EmisApiTable, EmisRequest } from '$utils' +import { ApiTable, EmisApiTable, EmisRequest, parseProcessData, judgmentProcessState } from '$utils' import { Skeleton, Button, Pagination, Form, Popconfirm, Table, Toast } from '@douyinfe/semi-ui'; import { IconSearch } from '@douyinfe/semi-icons'; import { SkeletonScreen, WorkflowApprovalModal } from "$components"; import moment from "moment"; const Rest = (props) => { - const { dispatch, actions, user, socket } = props - + const { dispatch, actions, user, socket, pomsProjectBasicAll } = props + const { workOrder } = actions const [query, setQuery] = useState({ limit: 10, offset: 0 }); //页码信息 const [limits, setLimits] = useState(0)//每页实际条数 const [tableData, setTableData] = useState([]); @@ -17,25 +17,48 @@ const Rest = (props) => { const [checkProcessInstanceId, setCheckProcessInstanceId] = useState(null) const [params, setParams] = useState({}) - useEffect(() => { backlogData() + if (!pomsProjectBasicAll.length) { + dispatch(workOrder.getPomsProjectBasicAll()) + } }, []) let backlogData = (obj = { limit: 10, offset: 0 }) => { - setLoading(true) EmisRequest.get(EmisApiTable.processInstancemMyDoneList, - { userId: user?.id, businessType: '', ...obj }) + { + userId: user?.id, + businessType: '运维中台表单', + ...obj, + queryFormData: 'true' + }) .then(res => { - setTableData(res?.data) + let nextTableData = (res?.data || []).map(r => { + let pomsNeedData = {} + if (r?.formData?.formData && r?.formData?.workflowProcessVersion?.workflowProcessForm?.formSchema) { + pomsNeedData = parseProcessData({ + formSchema: r?.formData?.workflowProcessVersion?.workflowProcessForm?.formSchema, + formData: r?.formData?.formData + }) + } + return { + ...r, + pomsNeedData + } + }) + setTableData(nextTableData) setLoading(false) }, error => { Toast.error({ content: '已办工单列表请求失败', duration: 1, }) setLoading(false) }); EmisRequest.get(EmisApiTable.processInstancemMyDoneCount, - { userId: user?.id, businessType: '', ...obj, limit: "", offset: "" }) + { + userId: user?.id, + // businessType: '运维中台工单', + ...obj, limit: "", offset: "" + }) .then(res => { setLimits(res.count || 0) }, error => { @@ -49,10 +72,22 @@ const Rest = (props) => { render: (text, record, index) => index + 1 }, { title: '标题', - dataIndex: 'nae', + dataIndex: 'title', + render: (text, record, index) => { + return record?.pomsNeedData?.title?.value || '' + } }, { title: '关联项目', - dataIndex: 'nae', + dataIndex: 'pomsProject', + render: (text, record, index) => { + const pomsProjectId = record?.pomsNeedData?.pomsProjectId?.value + if (pomsProjectId) { + const corProject = pomsProjectBasicAll.find(p => p.value == pomsProjectId) + return corProject?.label || '' + } else { + return '' + } + } }, { title: '申请人', dataIndex: 'application', @@ -61,14 +96,20 @@ const Rest = (props) => { dataIndex: 'applyDepartmentName', }, { title: '审批状态', - dataIndex: 'apName', + dataIndex: 'status', + render: (text, record) => { + return judgmentProcessState(record, 'done') + }, }, { title: '提交时间', dataIndex: 'submissionTime', render: (text, record, index) => text && moment(text).format('YYYY-MM-DD HH:mm:ss') || '--' }, { title: '期望完成时间', - dataIndex: 'nae', + dataIndex: 'expectTime', + render: (text, record, index) => { + return record?.pomsNeedData?.expectTime?.value || '' + } }, { title: '操作', dataIndex: 'hadle', @@ -186,9 +227,11 @@ const Rest = (props) => { } function mapStateToProps (state) { - const { auth, } = state; + const { auth, global, pomsProjectBasicAll } = state; return { user: auth.user, + actions: global.actions, + pomsProjectBasicAll: pomsProjectBasicAll.data || [] }; } diff --git a/web/client/src/sections/workOrder/containers/stayDoWorkOrder.jsx b/web/client/src/sections/workOrder/containers/stayDoWorkOrder.jsx index 9fd0ef7..e1a0bdf 100644 --- a/web/client/src/sections/workOrder/containers/stayDoWorkOrder.jsx +++ b/web/client/src/sections/workOrder/containers/stayDoWorkOrder.jsx @@ -1,14 +1,14 @@ import React, { useEffect, useRef, useState } from 'react'; import { connect } from 'react-redux'; -import { ApiTable, EmisApiTable, EmisRequest } from '$utils' +import { ApiTable, EmisApiTable, EmisRequest, parseProcessData } from '$utils' import { Skeleton, Button, Pagination, Form, Popconfirm, Table, Toast } from '@douyinfe/semi-ui'; import { IconSearch } from '@douyinfe/semi-icons'; import { SkeletonScreen, WorkflowModal, WorkflowApprovalModal } from "$components"; import moment from "moment"; const Rest = (props) => { - const { dispatch, actions, user, socket } = props - + const { dispatch, actions, user, socket, pomsProjectBasicAll } = props + const { workOrder } = actions const [query, setQuery] = useState({ limit: 10, page: 0 }); //页码信息 const [limits, setLimits] = useState(0)//每页实际条数 const [tableData, setTableData] = useState([]); //获取项目状态列表 @@ -18,14 +18,35 @@ const Rest = (props) => { useEffect(() => { backlogData() + if (!pomsProjectBasicAll.length) { + dispatch(workOrder.getPomsProjectBasicAll()) + } }, []) let backlogData = (obj = {}) => { setLoading(true) EmisRequest.get(EmisApiTable.processInstancemMyAuditList, - { userId: user?.id, businessType: '', ...obj }) + { + userId: user?.id, + businessType: "运维中台表单", + ...obj, + queryFormData: 'true' + }) .then(res => { - setTableData(res) + let nextTableData = (res || []).map(r => { + let pomsNeedData = {} + if (r?.formData?.formData && r?.formData?.workflowProcessVersion?.workflowProcessForm?.formSchema) { + pomsNeedData = parseProcessData({ + formSchema: r?.formData?.workflowProcessVersion?.workflowProcessForm?.formSchema, + formData: r?.formData?.formData + }) + } + return { + ...r, + pomsNeedData + } + }) + setTableData(nextTableData) setLimits(res.length || 0) setLoading(false) }, error => { @@ -40,10 +61,22 @@ const Rest = (props) => { render: (text, record, index) => index + 1 }, { title: '标题', - dataIndex: 'nae', + dataIndex: 'title', + render: (text, record, index) => { + return record?.pomsNeedData?.title?.value || '' + } }, { title: '关联项目', - dataIndex: 'nae', + dataIndex: 'pomsProject', + render: (text, record, index) => { + const pomsProjectId = record?.pomsNeedData?.pomsProjectId?.value + if (pomsProjectId) { + const corProject = pomsProjectBasicAll.find(p => p.value == pomsProjectId) + return corProject?.label || '' + } else { + return '' + } + } }, { title: '申请人', dataIndex: 'applyerName', @@ -56,7 +89,10 @@ const Rest = (props) => { render: (text, record, index) => text && moment(text).format('YYYY-MM-DD HH:mm:ss') || '--' }, { title: '期望完成时间', - dataIndex: 'nae', + dataIndex: 'expectTime', + render: (text, record, index) => { + return record?.pomsNeedData?.expectTime?.value || '' + } }, { title: '操作', dataIndex: 'hadle', @@ -172,9 +208,11 @@ const Rest = (props) => { } function mapStateToProps (state) { - const { auth, global, } = state; + const { auth, global, pomsProjectBasicAll } = state; return { user: auth.user, + actions: global.actions, + pomsProjectBasicAll: pomsProjectBasicAll.data || [] }; } diff --git a/web/client/src/utils/aboutProcess.js b/web/client/src/utils/aboutProcess.js new file mode 100644 index 0000000..c8c6589 --- /dev/null +++ b/web/client/src/utils/aboutProcess.js @@ -0,0 +1,48 @@ +'use strict'; + +export const processState = { + wait: 'WAIT', //保存待发 + active: 'ACTIVE', // 正在运行中 + suspended: 'SUSPENDED', // 流程暂停 + completed: 'COMPLETED', //流程正常结束 + externally: 'EXTERNALLY_TERMINATED', // 手动结束流程 + internally: 'INTERNALLY_TERMINATED' //流程异常结束 +} + +export const judgmentProcessState = (record, activeKey) => { + let content = ''; + const { state, status } = record + const state_ = state || status + switch (state_) { + case processState.wait: + content = '草稿' + break; + case processState.active: + content = '待审批' + break; + case processState.completed: + content = '审批通过'; + break; + case processState.externally: + content = '审批驳回'; + break; + case processState.suspended: + content = '撤销'; + break; + case processState.internally: + content = '异常流程'; + break; + default: + break; + } + if (state_ == processState.active && record.reviewTime != '') { + content = '审批中' + } + if (activeKey == 'review' && record.reviewTime == '') { + content = '待审批' + } + if (activeKey == 'review' && record.reviewTime != '') { + content = '审批中' + } + return content +} \ No newline at end of file diff --git a/web/client/src/utils/index.js b/web/client/src/utils/index.js index 427e2b7..903624e 100644 --- a/web/client/src/utils/index.js +++ b/web/client/src/utils/index.js @@ -6,6 +6,8 @@ import { AxyRequest, EmisRequest, basicAction, RouteRequest } from './webapi' +import { parseProcessData } from './parseProcessData' +import { processState, judgmentProcessState } from './aboutProcess' export { isAuthorized, @@ -18,4 +20,8 @@ export { EmisRequest, basicAction, RouteRequest, + + parseProcessData, + processState, + judgmentProcessState, } \ No newline at end of file diff --git a/web/client/src/utils/parseProcessData.js b/web/client/src/utils/parseProcessData.js new file mode 100644 index 0000000..76afa0d --- /dev/null +++ b/web/client/src/utils/parseProcessData.js @@ -0,0 +1,99 @@ +'use strict'; + +const schemaRecursionObj = (obj, target, schemaPath) => { + let schemaPath_ = JSON.parse(JSON.stringify(schemaPath)) + if (obj.properties) { + for (let prKey in obj.properties) { + if (obj.properties[prKey].title == target) { + schemaPath_.push({ + prKey, + ...obj.properties[prKey] + }) + return schemaPath_ + } + const hasProperties = obj.properties[prKey].properties + const isGroup = obj.properties[prKey].type == 'array' && obj.properties[prKey].title == '分组' + if (hasProperties || isGroup) { + schemaPath_.push({ + prKey, + ...obj.properties[prKey], + isGroup: isGroup, + }) + schemaPath_ = schemaRecursionObj( + isGroup ? + obj.properties[prKey].items + : obj.properties[prKey], + target, + schemaPath_ + ) + if (!schemaPath_) { + return [] + } + if (schemaPath_.length > schemaPath.length) { + return schemaPath_ + } + } + } + } else { + return schemaPath_ + } +} + +const dataRecursionObj = (dataObj, index, needData, lastKeyObj, nd) => { + const keyObj = needData[nd].schemaPath[index] + if (dataObj.hasOwnProperty(keyObj.prKey)) { + if (lastKeyObj.prKey == keyObj.prKey) { + let gotValue = dataObj[keyObj.prKey] + if (keyObj.enum && !needData[nd].fromDataSource) { + let vIndex = keyObj.enum.findIndex(ke => ke == gotValue) + gotValue = keyObj.enumNames[vIndex] + } + return gotValue + } else { + if (keyObj.isGroup) { + for (let item of dataObj[keyObj.prKey]) { + const gotValue = dataRecursionObj(item, index + 1, needData, lastKeyObj, nd) + if (gotValue) { + return gotValue + } + } + } else { + return dataRecursionObj(dataObj[keyObj.prKey], index + 1, needData, lastKeyObj, nd) + } + } + } +} + +const getData = (applyDetail, needData) => { + for (let nd in needData) { + if (needData[nd].noProcess) { + continue + } + needData[nd].schemaPath = schemaRecursionObj(applyDetail.formSchema.jsonSchema, needData[nd]['keyWord'], []) + if (needData[nd].schemaPath && needData[nd].schemaPath.length) { + const lastKeyObj = needData[nd].schemaPath[ + needData[nd].schemaPath.length - 1 + ] + needData[nd].value = dataRecursionObj(applyDetail.formData, 0, needData, lastKeyObj, nd) + } else { + // 记录错误 关键数据没找到 + } + } +} + +export const parseProcessData = (applyDetail, pomsNeedData = { + title: { + keyWord: '标题', + }, + pomsProjectId: { + keyWord: '关联项目', + fromDataSource: true + }, + expectTime: { + keyWord: '期望完成时间' + } +}) => { + let needData = JSON.parse(JSON.stringify(pomsNeedData)) + getData(applyDetail, needData) + return needData +} \ No newline at end of file diff --git a/web/client/src/utils/webapi.js b/web/client/src/utils/webapi.js index 29cc4f8..01282bc 100644 --- a/web/client/src/utils/webapi.js +++ b/web/client/src/utils/webapi.js @@ -80,6 +80,7 @@ export const ApiTable = { //工单 getEnabledWorkflowProcess: 'workflow/process/enabled',//获取工作流可用表单 + getPomsProjectBasicAll: 'basic-data/workflow/single/allProject', }; // 项企的接口