diff --git a/src/executor/open/form/config.tsx b/src/executor/open/form/config.tsx index de342567920705274f77617294e4793dd6520bb4..ba243b01f8a3e4bef7c19cea47ce03c97a3c64d5 100644 --- a/src/executor/open/form/config.tsx +++ b/src/executor/open/form/config.tsx @@ -2,7 +2,7 @@ import { MenuItemType } from 'typings/globelType'; import { IForm } from '@/ts/core'; import React from 'react'; import EntityIcon from '@/components/Common/GlobalComps/entityIcon'; -import { model } from '@/ts/base'; +import { kernel, model } from '@/ts/base'; import { XEntity } from '@/ts/base/schema'; /** 创建选择字段菜单 */ const buildSpeciesFiledsTree = (fields: model.FieldModel[]): MenuItemType[] => { @@ -67,7 +67,40 @@ const buildSpeciesItemsTree = ( } return result; }; +export const loadCohortMembers = async (): Promise => { + const res = await kernel.querySubTargetById({ + id: '464369144951869440', + subTypeNames: ['单位', '医院', '大学'], + page: { + offset: 0, + limit: 2000, + filter: '', + }, + }); + if (res.success && res.data.total > 0) { + return { + children: res.data.result.map((item) => { + return { + children: [], + icon: undefined, + itemType: '集群单位', + key: item.id, + item, + label: item.name, + }; + }), + icon: undefined, + item: { + name: '浙江省职务科技成果转化组织群', + }, + itemType: 'Tab', + key: '123', + label: '浙江省职务科技成果转化组织群', + }; + } + return; +}; /** 加载表单分类菜单 */ export const loadSpeciesItemMenu = (form: IForm): MenuItemType => { const SpeciesFields = form.fields.filter((i) => i.options?.species); diff --git a/src/executor/open/form/detail/archive.tsx b/src/executor/open/form/detail/archive.tsx index f2612ef17e5824b2e8d10817a5f1c04d60995f09..1f7427198b236bc8326b974889c0823919c5cccd 100644 --- a/src/executor/open/form/detail/archive.tsx +++ b/src/executor/open/form/detail/archive.tsx @@ -19,14 +19,20 @@ const ThingArchive: React.FC = ({ instances }) => { {instances.map((a, index) => ( - + ))} ); }; -const ArchiveItem: React.FC<{ instance: schema.XWorkInstance }> = ({ instance }) => { +const ArchiveItem: React.FC<{ + instance: schema.XWorkInstance; + defaultOpenKey: string; +}> = ({ instance, defaultOpenKey }) => { const [task, setTask] = useState(); const [data, setData] = useState(); const belong = @@ -110,7 +116,7 @@ const ArchiveItem: React.FC<{ instance: schema.XWorkInstance }> = ({ instance }) }; return ( - + void; } - +let selectedKey: string = ''; +let filter = ''; /** 表单查看 */ const FormView: React.FC = ({ form, finished }) => { const [select, setSelcet] = useState(); @@ -28,16 +31,65 @@ const FormView: React.FC = ({ form, finished }) => { const filterExp: any[] = JSON.parse(dataRange?.filterExp ?? '[]'); const labels = dataRange?.labels ?? []; const FormBrower: React.FC = () => { - const [, rootMenu, selectMenu, setSelectMenu] = useMenuUpdate( + const [, rootMenu, selectMenu, setSelectMenu, refreshMenu] = useMenuUpdate( () => config.loadSpeciesItemMenu(form), new Controller(form.key), ); + const [totalCount, setTotalCount] = useState(0); + useEffect(() => { + //赋权-成果库-合同-转化信息- + if ( + [ + '535176821000519681', + '535176818458771457', + '535176822128787457', + '535176818869813249', + '535176823366107137', + ].includes(form.id) + ) { + config.loadCohortMembers().then((res) => { + res && refreshMenu(res); + }); + } + return () => { + selectedKey = ''; + filter = ''; + setTotalCount(0); + }; + }, []); if (!selectMenu || !rootMenu) return <>; const loadContent = () => { if (select) { - return ( - setSelcet(undefined)} /> - ); + switch (form.metadata.openType) { + case '事项': + //办事视图明细 查看 + return ( + setSelcet(undefined)} + openForm={form.metadata.id} + /> + ); + // 成果视图表单 查看 + case '关联事项': + return ( + setSelcet(undefined)} + /> + ); + default: + //默认卡片视图 + return ( + setSelcet(undefined)} + /> + ); + } } return ( = ({ form, finished }) => { mode: 'infinite', showScrollbar: 'onHover', }} - pager={{ visible: false }} + pager={{ + // visible: form.id === '535176818458771457', + visible: true, + showInfo: true, + infoText: '总计: ' + totalCount + ' 个', + }} onRowDblClick={(e: any) => setSelcet(e.data)} filterValue={filterExp} dataSource={ new CustomStore({ key: 'id', - async load(loadOptions) { + async load(loadOptions: any) { if ((filterExp && filterExp.length > 0) || labels.length > 0) { loadOptions.userData = labels.map((a) => a.value); - if (selectMenu.item?.value) { + if (selectMenu.key !== selectedKey) { + loadOptions.skip = 0; + } + + if (selectMenu.itemType === '集群单位' && selectMenu.item.id) { + loadOptions = { + ...loadOptions, + options: { + match: { belongId: selectMenu.item.id }, + }, + }; + } else if (selectMenu.item?.value) { loadOptions.userData.push(selectMenu.item.value); } else if (selectMenu.item?.code) { loadOptions.userData.push(selectMenu.item.code); } - return await form.loadThing(loadOptions); + + const res = await form.loadThing({ + ...loadOptions, + requireTotalCount: true, + }); + + if ( + loadOptions.userData.length > 0 && + JSON.stringify(loadOptions.userData) !== filter + ) { + setTotalCount(res.totalCount); + selectedKey = selectMenu.key; + filter = JSON.stringify(loadOptions.filter); + } + + return res; } return { data: [], success: true, totalCount: 0, groupCount: 0 }; }, diff --git a/src/executor/open/form/matters/index.tsx b/src/executor/open/form/matters/index.tsx new file mode 100644 index 0000000000000000000000000000000000000000..1d4e88f2bbffd44ecf049895d4c46b6b68ee904e --- /dev/null +++ b/src/executor/open/form/matters/index.tsx @@ -0,0 +1,141 @@ +import { Card, Table } from 'antd'; +import React, { useState, useEffect } from 'react'; +import { ImUndo2 } from 'react-icons/im'; +import { IForm } from '@/ts/core'; +import { schema } from '@/ts/base'; +import orgCtrl from '@/ts/controller'; +import { InstanceDataModel } from '@/ts/base/model'; +import EntityIcon from '@/components/Common/GlobalComps/entityIcon'; +import WorkForm from '@/executor/tools/workForm'; + +/** + * 事项-查看 + */ +interface IProps { + form: IForm; + thingData: schema.XThing; + onBack: () => void; + openForm: string; // 打开的表单 +} +const columns = [ + { + title: '单位名称', + dataIndex: 'belongId', + render: (text: string) => , + }, + { + title: '审批人', + dataIndex: 'createUser', + render: (text: string) => , + }, + { + title: '节点', + dataIndex: 'title', + }, + { + title: '审批时间', + dataIndex: 'createTime', + }, + { + title: '备注信息', + width: 300, + dataIndex: 'comment', + }, +]; +/** + * 物-查看 + * @returns + */ +const WorkFormView: React.FC = (props) => { + const hasDoneTasks = Object.values(props.thingData.archives); + const instance = hasDoneTasks[0]; + const [task, setTask] = useState(); + const [data, setData] = useState(); + const belong = + orgCtrl.user.companys.find((a) => a.id == instance?.belongId) || orgCtrl.user; + + useEffect(() => { + setTimeout(async () => { + const detail = await orgCtrl.work.loadInstanceDetail( + instance.id, + instance.belongId, + ); + if (detail) { + setTask(detail.tasks); + setData(JSON.parse(detail.data || '{}')); + } + }, 0); + }, []); + + /** 渲染表单 */ + const renderWorkForm = () => { + if (!data || !task) { + return <>; + } + const instanceList = [ + { + title: '开始', + belongId: instance?.belongId, + createTime: instance?.createTime, + createUser: instance?.createUser, + comment: '提交', + }, + ]; + task.forEach((tItem) => { + if (!tItem.records) { + return; + } + const instanceItems: any[] = tItem.records?.map((record: any) => { + return { + title: tItem.title, + belongId: instance?.belongId, + createTime: record.createTime, + createUser: record.createUser, + comment: record.comment ?? '同意', + }; + }); + instanceList.push(...instanceItems); + }); + return ( + <> + {data && ( + <> + + 流程明细} + columns={columns} + size="small" + dataSource={instanceList} + /> + + )} + + ); + }; + + return ( + { + props.onBack(); + }}> + + + + 返回 + + }> + {renderWorkForm()} + + ); +}; + +export default WorkFormView; diff --git a/src/executor/open/form/relateMatters/baseForm.tsx b/src/executor/open/form/relateMatters/baseForm.tsx new file mode 100644 index 0000000000000000000000000000000000000000..b0f7440dd2950ee9c07351849e53fe2caa475370 --- /dev/null +++ b/src/executor/open/form/relateMatters/baseForm.tsx @@ -0,0 +1,57 @@ +import React, { useEffect, useState } from 'react'; +import { schema } from '@/ts/base'; +import orgCtrl from '@/ts/controller'; +import { Card, Timeline } from 'antd'; +import WorkForm from '@/executor/tools/workForm'; +import { InstanceDataModel } from '@/ts/base/model'; + +interface IProps { + instances: schema.XWorkInstance[]; +} +/** + * 存储-物-归档日志 + */ +const ThingArchive: React.FC = ({ instances }) => { + return ( + + + {instances + .filter((s) => s.defineId === '535193119474462720') + .map((a, index) => ( + + ))} + + + ); +}; + +const ArchiveItem: React.FC<{ instance: schema.XWorkInstance }> = ({ instance }) => { + const [task, setTask] = useState(); + const [data, setData] = useState(); + const belong = + orgCtrl.user.companys.find((a) => a.id == instance.belongId) || orgCtrl.user; + + useEffect(() => { + setTimeout(async () => { + const detail = await orgCtrl.work.loadInstanceDetail( + instance.id, + instance.belongId, + ); + if (detail) { + setTask(detail.tasks); + setData(JSON.parse(detail.data || '{}')); + } + }, 10); + }, []); + + if (task == undefined) return <>; + + return ( + + {data && data.node && ( + + )} + + ); +}; +export default ThingArchive; diff --git a/src/executor/open/form/relateMatters/index.tsx b/src/executor/open/form/relateMatters/index.tsx new file mode 100644 index 0000000000000000000000000000000000000000..a021a72c6ac005096a32041cf4153b95c32a2452 --- /dev/null +++ b/src/executor/open/form/relateMatters/index.tsx @@ -0,0 +1,115 @@ +import { Card, Tabs, Empty } from 'antd'; +import React from 'react'; +import { ImUndo2 } from 'react-icons/im'; +import { IForm } from '@/ts/core'; +import { schema } from '@/ts/base'; +import ThingArchive from '../detail/archive'; +import BaseForm from './baseForm'; +interface IProps { + form: IForm; + thingData: schema.XThing; + onBack: () => void; +} + +/** + * 关联事项 + * @returns + */ +const RelateMatters: React.FC = (props) => { + const hasDoneTasks = Object.values(props.thingData.archives); + + return ( + + , + }, + { + key: '2', + label: `成果转化列表`, + children: ( + <> + {hasDoneTasks.filter((i) => i.defineId === '535193248780660736').length > + 0 ? ( + i.defineId === '535193248780660736', + )} + /> + ) : ( + + )} + + ), + }, + { + key: '3', + label: `合同信息`, + children: ( + <> + {hasDoneTasks.filter((i) => i.defineId === '53519324878').length > 0 ? ( + + ) : ( + + )} + + ), + }, + { + key: '4', + label: `收益分配信息`, + children: ( + <> + {hasDoneTasks.filter((i) => i.defineId === '53519324878').length > 0 ? ( + + ) : ( + + )} + + ), + }, + { + key: '5', + label: `赋权信息`, + children: ( + <> + {hasDoneTasks.filter((i) => i.defineId === '535193499293855744').length > + 0 ? ( + i.defineId === '535193499293855744', + )} + /> + ) : ( + + )} + + ), + }, + { + key: '6', + label: `流程信息`, + children: , + }, + ]} + tabBarExtraContent={ +
{ + props.onBack(); + }}> + + + + 返回 +
+ } + /> +
+ ); +}; + +export default RelateMatters; diff --git a/src/executor/operate/entityForm/labelsForm.tsx b/src/executor/operate/entityForm/labelsForm.tsx index 8456e6e1a7efa6286b38f8f8fc276d3fe6866f97..4efdd6a8606fb9fe8172226ce24022d9bfee9906 100644 --- a/src/executor/operate/entityForm/labelsForm.tsx +++ b/src/executor/operate/entityForm/labelsForm.tsx @@ -93,6 +93,19 @@ const LabelsForm = (props: Iprops) => { rules: [{ required: true, message: '类型为必填项' }], }, }, + { + title: '查看方式', + dataIndex: 'openType', + valueType: 'select', + fieldProps: { + options: ['卡片', '事项', '关联事项'].map((i) => { + return { + value: i, + label: i, + }; + }), + }, + }, ]; if (readonly) { columns.push(...EntityColumns(props.current!.metadata)); diff --git a/src/hooks/useMenuUpdate.ts b/src/hooks/useMenuUpdate.ts index 1b165460c97e377c5d51724a8a203d85673b4c38..8f78c207d9d06a208e0029fff7da04f3525134a8 100644 --- a/src/hooks/useMenuUpdate.ts +++ b/src/hooks/useMenuUpdate.ts @@ -18,16 +18,23 @@ const useMenuUpdate = ( MenuItemType | undefined, MenuItemType | undefined, (item: MenuItemType) => void, + (item?: MenuItemType) => void, ] => { const [key, setKey] = useState(''); const [rootMenu, setRootMenu] = useState(); const [selectMenu, setSelectMenu] = useState(); const ctrl = controller || orgCtrl; - + const [defaultMenu, setdefaultMenu] = useState(); /** 刷新菜单 */ - const refreshMenu = () => { + const refreshMenu = (defData?: any) => { setKey(generateUuid()); - const newMenus = loadMenu(); + let newMenus = loadMenu(); + if (defData?.key) { + setdefaultMenu(defData); + newMenus.children.push(defData); + } else if (defaultMenu) { + newMenus.children.push(defaultMenu); + } var item = findMenuItemByKey(newMenus, ctrl.currentKey); if (item === undefined) { item = newMenus; @@ -56,7 +63,7 @@ const useMenuUpdate = ( ctrl.unsubscribe(id); }; }, []); - return [key, rootMenu, selectMenu, onSelectMenu]; + return [key, rootMenu, selectMenu, onSelectMenu, refreshMenu]; }; export default useMenuUpdate; diff --git a/src/ts/base/schema.ts b/src/ts/base/schema.ts index d4cee3fca28ba7ed204bb356ff90b71e03c5b985..97e1be55715d23a1af74573571e6861c7b323360 100644 --- a/src/ts/base/schema.ts +++ b/src/ts/base/schema.ts @@ -193,6 +193,8 @@ export type XForm = { options: XFormProps | undefined; // 表单的特性 attributes: XAttribute[]; + //打开方式 + openType?: string; // 使用表单的流程节点 bindNodes: XWorkNode[] | undefined; // 表单的目录