Commit 6a7825aa authored by Bill's avatar Bill

feat: 会员考评页面

parent 95508cac
......@@ -327,6 +327,7 @@ const MemberRoute: RouterChild = {
path: '/memberCenter/memberAbility/memberEvaluate/detail',
name: '会员考评详情',
component: '@/pages/member/memberEvaluate/allQuery/detail',
hideInMenu: true,
noMargin: true,
},
{
......@@ -338,7 +339,73 @@ const MemberRoute: RouterChild = {
path: '/memberCenter/memberAbility/memberEvaluate/evaluate/createEvaluate/add',
name: '新建考评单',
component: '@/pages/member/memberEvaluate/createEvaluate/add',
hideInMenu: true,
},
{
path: '/memberCenter/memberAbility/memberEvaluate/tobeEvaluate',
name: '待考评打分',
component: '@/pages/member/memberEvaluate/tobeEvaluate/index',
},
{
path: '/memberCenter/memberAbility/memberEvaluate/tobeEvaluate/detail',
name: '待考评打分详情',
component: '@/pages/member/memberEvaluate/tobeEvaluate/detail',
noMargin: true,
hideInMenu: true,
},
// 待提交汇总考评结果
{
path: '/memberCenter/memberAbility/memberEvaluate/tobeSubmitSummary',
name: '待提交汇总考评结果',
component: '@/pages/member/memberEvaluate/tobeSubmitSummary/index',
},
// 待提交汇总考评结果详情
{
path: '/memberCenter/memberAbility/memberEvaluate/tobeSubmitSummary/detail',
name: '待提交汇总考评结果详情',
component: '@/pages/member/memberEvaluate/tobeSubmitSummary/detail',
noMargin: true,
hideInMenu: true,
},
// 待审核考评结果(一级)
{
path: '/memberCenter/memberAbility/memberEvaluate/tobeReviewI',
name: '待审核考评结果(一级)',
component: '@/pages/member/memberEvaluate/tobeReviewI/index',
},
{
path: '/memberCenter/memberAbility/memberEvaluate/tobeReviewI/detail',
name: '待审核考评结果(一级)',
component: '@/pages/member/memberEvaluate/tobeReviewI/detail',
noMargin: true,
hideInMenu: true,
},
// 待审核考评结果(二级)
{
path: '/memberCenter/memberAbility/memberEvaluate/tobeReviewII',
name: '待审核考评结果(二级)',
component: '@/pages/member/memberEvaluate/tobeReviewII/index',
},
{
path: '/memberCenter/memberAbility/memberEvaluate/tobeReviewII/detail',
name: '待审核考评结果(二级)详情',
component: '@/pages/member/memberEvaluate/tobeReviewII/detail',
hideInMenu: true,
noMargin: true,
},
// 待通报考评结果
{
path: '/memberCenter/memberAbility/memberEvaluate/tobeInformed',
name: '待通报考评结果',
component: '@/pages/member/memberEvaluate/tobeInformed/index',
},
{
path: '/memberCenter/memberAbility/memberEvaluate/tobeInformed/detail',
name: '待通报考评结果详情',
component: '@/pages/member/memberEvaluate/tobeInformed/detail',
hideInMenu: true,
noMargin: true,
}
]
},
]
......
/**
* 详情页审核
*/
import React, { useEffect } from 'react';
import { createAsyncFormActions, createFormActions, ISchema, FormEffectHooks } from '@formily/antd';
import { Modal } from 'antd';
import NiceForm from '@/components/NiceForm';
import { defaultSchema } from './schema';
const formActions = createFormActions();
const { onFieldValueChange$ } = FormEffectHooks
interface Iprops {
/**
* 显示/隐藏
*/
visible: boolean,
/**
* 模态框标题
*/
title: string,
/**
* form表单schema, 先写死
*/
// schema?: ISchema,
/**
* schemaComponent
*/
// components?: { [key: string]: any },
/**
* value, 表单值
*/
value: { [key: string]: any },
// expressionScope: any,
// effects: () =>
/**
* 提交
*/
onSubmit: (value: {[key: string]: any}) => void,
onCancel: () => void
}
export type SubmitDataTypes = {
/**
* @params 0 => 审核不通过, 1 => 审核通过
*/
status: 0 | 1,
/**
* 当审核不通过时,才有审核不通过原因填写
*/
reason?: string
}
const ExamVerify: React.FC<Iprops> = (props: Iprops) => {
const { title, visible, onSubmit, onCancel, value } = props;
const handleOk = () => {
formActions.submit()
}
const handleFormSubmit = (values: SubmitDataTypes) => {
onSubmit?.(values)
}
const handleCancel = () => {
onCancel?.();
}
useEffect(() => {
if (!visible) {
return ;
}
if(value.status === 0) {
formActions.setFieldState('status', state => {
state.editable = false;
})
}
}, [visible, value])
return (
<Modal
title={title}
visible={visible}
onOk={handleOk}
onCancel={handleCancel}
>
<NiceForm
value={value}
actions={formActions}
schema={defaultSchema}
onSubmit={handleFormSubmit}
/>
</Modal>
)
}
ExamVerify.defaultProps = {
// schema: defaultSchema,
value: {},
}
export default ExamVerify
import { ISchema } from '@formily/antd';
export const defaultSchema: ISchema = {
type: 'object',
properties: {
layout: {
type: 'object',
'x-component': 'mega-layout',
'x-component-props': {
labelCol: 5,
full: true,
labelAlign: 'left'
},
properties: {
status: {
title: '审核状态',
type: 'string',
'x-component': 'RadioGroup',
enum: [
{ label: '审核通过', value: 1 },
{ label: '审核不通过', value: 0 },
],
'x-rules': [
{
required: true,
message: '请选择审核状态',
},
],
'x-linkages': [
{
type: 'value:visible',
target: '*(reason)',
condition: '{{$value === 0}}'
},
]
},
reason: {
title: "不通过原因",
type: 'textarea',
'x-rules': [
{
required: true,
message: '请填写审核不通过原因',
},
],
},
}
}
}
}
import React from "react"
import { Tooltip } from 'antd';
import { QuestionCircleOutlined } from "@ant-design/icons"
const createRichTextUtils = () => {
return {
text(...args) {
return React.createElement('span', {}, ...args)
},
link(text: string, href: string, target: "_blank" | "_self" | "_parent" | "_top") {
return React.createElement('a', { href, target }, text)
},
gray(text: string) {
return React.createElement(
'span',
{ style: { color: 'gray', margin: '0 3px' } },
text
)
},
red(text: string) {
return React.createElement(
'span',
{ style: { color: 'red', margin: '0 3px' } },
text
)
},
help(text: string, offset = 3) {
return React.createElement(
Tooltip,
{ title: text },
<QuestionCircleOutlined
style={{ margin: '0 3px', cursor: 'default', marginLeft: offset }}
/>
)
},
tips(text: string, tips: string) {
return React.createElement(
Tooltip,
{ title: tips },
<span style={{ margin: '0 3px', cursor: 'default' }}>{text}</span>
)
}
}
}
export default createRichTextUtils
......@@ -5,10 +5,11 @@
.renderFileItemContainer {
position: relative;
padding: 0 @padding-xs;
padding: 4px 0;
display: flex;
flex-direction: column;
justify-content: center;
cursor: pointer;
.uploadProgress {
position: absolute;
......@@ -30,10 +31,10 @@
margin-right: @margin-sm;
}
}
&:hover {
background-color: @secondary-color;
color: @main-color;
}
// &:hover {
// background-color: @secondary-color;
// color: @main-color;
// }
}
}
......
......@@ -11,22 +11,36 @@ type PickProps = "headers" | "action" | "accept" | "beforeUpload" | "onChange" |
interface PickUploadProps extends Pick<UploadProps, PickProps> {
children?: React.ReactElement,
customizeItemRender?: ((files: UploadFile[], handleRemove: (fileItem: UploadFile) => void) => React.ReactNode) | null,
onRemove?: ((fileItem: UploadFile) => void) | null,
disable?: boolean,
mode?: "text" | "link" | "ghost" | "default" | "primary" | "dashed",
buttonText?: string,
fileContainerClassName?: string
customizeItemRender?: ((files: UploadFile[], handleRemove: (fileItem: UploadFile) => void) => React.ReactNode) | null,
onRemove?: ((fileItem: UploadFile) => void) | null,
}
const UploadFiles: React.FC<PickUploadProps> = (props: PickUploadProps) => {
const { headers, action, accept, beforeUpload, onChange, children, customizeItemRender, onRemove, disable, mode, buttonText } = props;
const {
headers,
action,
accept,
beforeUpload,
onChange,
children,
customizeItemRender,
onRemove,
disable,
mode,
buttonText,
fileContainerClassName
} = props;
const hasFileListProps = "fileList" in props;
const [files, setFiles] = useState<UploadFile[]>([]);
const renderFiles = hasFileListProps ? props.fileList : files;
const filesContainerCs = cx({
[styles.fileEmpty]: renderFiles.length === 0,
}, styles.renderFileContainer)
}, styles.renderFileContainer, fileContainerClassName)
const uploadProps = {
name: 'file',
......@@ -108,8 +122,8 @@ const UploadFiles: React.FC<PickUploadProps> = (props: PickUploadProps) => {
<Upload {...uploadProps}>
{
children || (
<Button type={mode}>
<CloudUploadOutlined /> {buttonText}
<Button type={mode} icon={<CloudUploadOutlined />}>
{buttonText}
</Button>
)
}
......@@ -130,7 +144,8 @@ UploadFiles.defaultProps = {
onRemove: null,
disable: false,
mode: 'default',
buttonText: '上传文件'
buttonText: '上传文件',
fileContainerClassName: ''
// fileList: []
}
......
......@@ -3,11 +3,9 @@
*/
import React, { useRef } from 'react';
import { Card } from 'antd'
import { StandardTable } from 'god';
import NiceForm from '@/components/NiceForm';
import { createFormActions, ISchema } from '@formily/antd';
import { PublicApi } from '@/services/api';
import { ColumnsType } from 'antd/es/table';
interface Iprops {
......@@ -20,7 +18,7 @@ interface Iprops {
const formActions = createFormActions();
const CustomizeColumn: React.FC<Iprops> = (props: Iprops) => {
const CustomizeQueryList: React.FC<Iprops> = (props: Iprops) => {
const { columns, schema, fetchListData, expressionScope, effects } = props;
const ref = useRef<any>({});
......@@ -51,9 +49,9 @@ const CustomizeColumn: React.FC<Iprops> = (props: Iprops) => {
)
}
CustomizeColumn.defaultProps = {
CustomizeQueryList.defaultProps = {
expressionScope: {},
effects: null
}
export default CustomizeColumn
export default CustomizeQueryList
......@@ -4,6 +4,7 @@ import AnchorPage from '@/layouts/AnchorPage';
import theme from '../../../../../config/lingxi.theme.config';
import { projectColumns, recordColumn } from '../columns/detail';
import CustomizeColumn from '@/components/CustomizeColumn';
import AuditProcess from '@/components/AuditProcess';
const { Step } = Steps;
......@@ -30,47 +31,47 @@ const EvaluateDetail = () => {
name: '流转记录'
}
]
const columnList = {
col1: [
{
title: '考察主题',
dataIndex: 'theme',
},
{
title: '会员名称',
dataIndex: 'memberName',
},
{
title: '考察类型',
dataIndex: 'type'
}
],
col2: [
{
title: '考察日期',
dataIndex: 'date'
},
{
title: '考察代表',
dataIndex: 'present'
},
{
title: "考察原因",
dataIndex: 'reason'
}
],
col3: [
{
title: '考察要求附件',
dataIndex: 'file',
render: (value?) => {
return (
<div>132</div>
)
}
},
]
}
const columnList = [
{
title: '考聘工单号',
value: 'theme',
},
{
title: '会员名称',
value: 'memberName',
},
{
title: '附件',
value: (
<div>123</div>
)
},
{
title: '考评主题',
value: (
<div>123</div>
)
},
{
title: '考察范围',
value: 'date'
},
{
title: '',
value: '',
},
{
title: "内部状态",
value: <div>
一通报考评结果
</div>
},
{
title: "考评完成时间",
value: 'reason'
},
]
const resultList = {
col: [
......@@ -120,22 +121,15 @@ const EvaluateDetail = () => {
anchors={anchorHeader}
// extra={headExtra && headExtra(detailInfo, returnAddress, exchangeAddress)}
>
<Card title="流转进度" id="progress">
<Steps current={1} progressDot>
<Step title="Finished" description="You can hover on the dot." />
<Step title="In Progress" description="You can hover on the dot." />
<Step title="Waiting" description="You can hover on the dot." />
<Step title="Waiting" description="You can hover on the dot." />
</Steps>
</Card>
<AuditProcess title="流转进度" id="progress" />
<div style={{ margin: `${theme["@margin-md"]} 0` }}>
<CustomizeColumn id="detail" columns={columnList} dataSource={{}} title="基本信息" />
<CustomizeColumn id="detail" data={columnList} title="基本信息" column={3} />
</div>
<Card title="考评项目" id="project" style={{ margin: `${theme["@margin-md"]} 0` }}>
<Table columns={projectColumns}></Table>
</Card>
<div style={{ margin: `${theme["@margin-md"]} 0` }}>
<CustomizeColumn id="result" columns={resultList} dataSource={{}} title="考评结果" />
{/* <CustomizeColumn id="result" columns={resultList} dataSource={{}} title="考评结果" /> */}
</div>
<Card title="流转记录" id="record" extra={<Button>内部流转</Button>}>
<Table columns={recordColumn}></Table>
......
......@@ -11,6 +11,7 @@ import { FORM_FILTER_PATH } from '@/formSchema/const';
import { useStateFilterSearchLinkageEffect } from '@/formSchema/effects/useFilterSearch';
import { PublicApi } from '@/services/api';
import CustomizeQueryList from '../../components/CustomizeQueryList';
import { Link } from 'react-router-dom';
// const formActions = createFormActions();
......@@ -31,9 +32,11 @@ const List: React.FC<Iprops> = (props: Iprops) => {
const controllerBtns = (
<div>
<Button type="primary">
<PlusOutlined /> 新建
</Button>
<Link to={"/memberCenter/memberAbility/memberEvaluate/evaluate/createEvaluate/add"}>
<Button type="primary">
<PlusOutlined /> 新建
</Button>
</Link>
</div>
)
......
import React, { useCallback, useRef, useState } from 'react';
import React, { useCallback, useEffect, useRef, useState } from 'react';
import { Drawer, Button } from 'antd';
// import { useModel } from '@/.umi/plugin-model/useModel';
import useModel from '../../hooks/useModal';
import useModal from '../../hooks/useModal';
import { StandardTable } from 'god';
import { ColumnsType } from 'antd/es/table';
import { createFormActions } from '@formily/antd';
......@@ -22,16 +22,21 @@ interface Iprops {
['x-component-props']: any,
},
mutators: {
change: (checked: boolean) => void
change: (record: any) => void
},
}
const FormilySelectMember: React.FC<Iprops> & { isFieldComponent: boolean } = (props: Iprops) => {
const { value, editable } = props;
const ref = useRef<any>({});
const { visible, toggleShow, handleCancel, handleConfirm } = useModel({});
const [selectedRecord, setSelectedRecord] = useState<any>(null);
// schema.getExtendsComponentProps() || {}
const { visible, toggle } = useModal();
const [prevState, setPrevState] = useState(null);
useEffect(() => {
if(visible) {
setPrevState(value)
}
}, [visible])
const columns: ColumnsType = [
{
......@@ -70,20 +75,18 @@ const FormilySelectMember: React.FC<Iprops> & { isFieldComponent: boolean } = (p
}
}
const onSelectChange = (record, selected, selectedRows) => {
console.log('selectedRowKeys changed: ', record, selected, selectedRows);
setSelectedRecord(record);
props.mutators.change(record);
};
const onCancel = useCallback(() => {
handleCancel()
}, [handleCancel])
props.mutators.change(prevState);
toggle(false)
}, [toggle, prevState])
const onConfirm = () => {
handleConfirm(() => {
props.mutators.change(selectedRecord);
})
toggle(false);
}
return (
......@@ -142,7 +145,7 @@ const FormilySelectMember: React.FC<Iprops> & { isFieldComponent: boolean } = (p
<span className={styles.name}>{value?.name}</span>
{
editable && (
<span className={styles.main} onClick={toggleShow}>{value ? '重新选择' : '选择考评人'}</span>
<span className={styles.main} onClick={() => toggle(true)}>{value ? '重新选择' : '选择考评人'}</span>
)
}
</div>
......
......@@ -4,7 +4,11 @@
padding: 8px 8px;
}
.ant-btn {
padding: 2px 0px;
// padding: 2px 0px;
}
.customizeFileContainer {
margin-bottom: 0;
color: @main-color;
}
}
}
......@@ -4,9 +4,7 @@ import { history } from 'umi';
import { PageHeaderWrapper } from '@ant-design/pro-layout';
import { LinkOutlined, PlusOutlined, SaveOutlined } from '@ant-design/icons';
import { createFormActions } from '@formily/antd';
import {
ArrayTable,
} from '@formily/antd-components'
import { ArrayTable } from '@formily/antd-components'
import ReutrnEle from '@/components/ReturnEle';
import NiceForm from '@/components/NiceForm';
import { evaluateAddSchema } from '../schema/add';
......@@ -49,7 +47,17 @@ const EvaluateAdd = () => {
memberName: {
"id": 2,
"name":"456"
}
},
moban: [
{
name: 'zzz.png',
url: 'http://www.baidu.com/zzz.png',
},
{
name: 'zzz1.png',
url: 'http://www.baidu.com/zzz1.png',
},
]
}
]
})
......@@ -75,16 +83,7 @@ const EvaluateAdd = () => {
}
const renderListTableRemove = (index: number) => (
<>
<a
onClick={() => handleRemove(index)}
style={{
color: '#ff4d4f',
}}
>
删除
</a>
</>
<a onClick={() => handleRemove(index)} style={{ color: '#ff4d4f'}}>删除</a>
);
return (
......
......@@ -11,6 +11,7 @@ import { useStateFilterSearchLinkageEffect } from '@/formSchema/effects/useFilte
import { FORM_FILTER_PATH } from '@/formSchema/const';
import useEvaluateColumn, { InspectionData } from '../hooks/useEvaluateColumn';
import useFetchList from '../hooks/useFetchList';
import { Link } from 'umi';
const formActions = createFormActions();
......@@ -39,12 +40,14 @@ const MemberEvaluate: React.FC<Iprops> = (props: Iprops) => {
])
const controllerBtns = (
<div>
<Button type="primary">
<PlusOutlined /> 新建
</Button>
<Space>
<Link to={"/memberCenter/memberAbility/memberEvaluate/evaluate/createEvaluate/add"}>
<Button type="primary">
<PlusOutlined />新建
</Button>
</Link>
<Button> 导入 </Button>
</div>
</Space>
)
return (
<Card>
......
import React, { useEffect, useState } from 'react';
/**
* 获取详情
*/
type ParamsType = {
id: number,
}
type HeadersType = {
[key: string]: any,
}
type Ires = {
code: number,
data: { [key: string]: any },
message: string
}
function useFetchInfo<T extends Ires>(api: (data: any) => Promise<T>, params: ParamsType, headers?: HeadersType) {
const [loading, setLoading] = useState<boolean>(false);
const [initialValue, setInitialValue] = useState<null | Ires["data"]>(null);
useEffect(() => {
async function init() {
setLoading(true)
return new Promise<void>((resolve) => {
setTimeout(() => {
setLoading(false);
setInitialValue({
theme: 'hellow',
files: [
{
name: '百度12312',
url: "http://www.baidu.com"
}
],
scoringList: [
{
id: 1,
projectName: "123",
memberName: {
"id": 2,
"name":"456"
},
baogao: [
{
name: '123',
url: 'http://www.baidu.com/zzz.png',
}
]
}
]
})
resolve()
}, 1500)
})
}
init()
}, [])
return { loading, initialValue }
}
export default useFetchInfo
import React, { useMemo, useState } from 'react';
import { Progress } from 'antd';
/**
* 获取考评详情页的公共部分
*/
type Options = {
blackList: string[]
initialValue?: any,
}
function useGetDetailCommon(options: Options) {
const { blackList, initialValue = {} } = options;
const [anchorHeader] = useState(() => {
const temp = [
{
key: 'progress',
name: '流转进度',
},
{
key: 'detail',
name: '基本信息',
},
{
key: 'project',
name: '考评项目'
},
{
key: 'result',
name: '考评结果'
},
{
key: 'record',
name: '流转记录'
}
]
return temp.filter((item) => !blackList.includes(item.key));
});
const basicInfoList = useMemo(() => {
return [
{
title: '考聘工单号',
value: 'theme',
},
{
title: '会员名称',
value: 'memberName',
},
{
title: '附件',
value: (
<div>
{
initialValue?.files?.map((_row) => _row.name)
}
</div>
)
},
{
title: '考评主题',
value: (
<div>123</div>
)
},
{
title: '考察范围',
value: 'date'
},
{
title: '',
value: '',
},
{
title: "内部状态",
value: <div>
一通报考评结果
</div>
},
{
title: "考评完成时间",
value: 'reason'
},
]
}, [initialValue]);
const evaluateResultColumn = useMemo(() => {
return [
{
title: '考评最终分',
value: (
<div style={{width: '60px', height: '30px'}}>
<Progress type="dashboard" percent={75} gapDegree={145} width={60} />
</div>
)
},
{
title: '考察结果',
value: 'b级,需要整改',
},
{
title: '附件',
value: (
<div>123</div>
)
},
{
title: '',
value: ''
},
{
title: '通知考评结果',
value: '是'
}
]
}, [])
return {anchorHeader, basicInfoList, evaluateResultColumn}
}
export default useGetDetailCommon;
import React, { useCallback, useEffect, useState } from 'react';
import React, { useCallback, useState } from 'react';
type ParamsType = {
// onCancel?: (() => void) | (() => Promise<any>)
// onConfirm?: (() => void) | (() => Promise<any>)
onVisible?: (() => void)
}
// type ParamsType = {
// onVisible?: (() => void)
// }
const isPromise = (value: any) => {
return value && Object.prototype.toString.call(value) === "[object Promise]"
}
// const isPromise = (value: any) => {
// return value && Object.prototype.toString.call(value) === "[object Promise]"
// }
function useModal(params: ParamsType) {
function useModal() {
const [visible, setVisible] = useState<boolean>(false);
const [loading, setLoading] = useState<boolean>(false);
// const [loading, setLoading] = useState<boolean>(false);
useEffect(() => {
if (visible) {
params.onVisible?.()
}
}, [visible])
// useEffect(() => {
// if (visible) {
// params?.onVisible?.()
// }
// }, [visible])
/**
* 取消
*/
const handleCancel = useCallback((onCancel?: (() => void) | (() => Promise<any>)) => {
if (isPromise(onCancel)) {
setLoading(() => true);
(onCancel() as Promise<any>)
.then((data) => {
setLoading(() => false);
setVisible(() => false)
})
return;
}
onCancel?.();
setVisible(false);
}, [])
/**
* 确认
*/
const handleConfirm = useCallback((onConfirm?: (() => void) | (() => Promise<any>)) => {
if (isPromise(onConfirm)) {
setLoading(() => true);
(onConfirm() as Promise<any>)
.then((data) => {
setLoading(() => false);
setVisible(() => false)
})
return;
}
onConfirm?.();
setVisible(() => false)
}, [])
// const onCancel = useCallback(() => {
// setVisible(() => false)
// }, [])
const toggleShow = useCallback(() => {
setVisible(() => true)
const toggle = useCallback((status: boolean) => {
setVisible(() => status)
}, [])
return { visible, loading, handleConfirm, handleCancel, toggleShow }
return { visible, toggle }
}
export default useModal
......@@ -88,7 +88,6 @@ export const evaluateAddSchema: ISchema = {
}
],
},
files: {
title: '考察要求附件',
type: 'object',
......@@ -207,7 +206,8 @@ export const evaluateAddSchema: ISchema = {
'x-component': 'FormilyUploadFiles',
'x-component-props': {
mode: 'link',
buttonText: '上传'
buttonText: '上传',
fileContainerClassName: 'customizeFileContainer'
},
"x-props": {
width: 180,
......@@ -219,7 +219,8 @@ export const evaluateAddSchema: ISchema = {
'x-component': 'FormilyUploadFiles',
'x-component-props': {
mode: 'link',
buttonText: '上传'
buttonText: '上传',
fileContainerClassName: 'customizeFileContainer'
},
"x-props": {
width: 180,
......
.form {
:global {
.ant-table-thead {
.ant-table-cell {
background-color: #F7F8FA;
color: #909399;
}
}
.ant-table-cell {
padding: 12px 12px;
}
.ant-btn {
padding: 2px 0px;
}
.customizeFileContainer {
margin-bottom: 0;
color: @main-color;
}
}
}
import React, { useEffect, useState } from 'react';
import { Spin, Card, Table, Button, Drawer } from 'antd';
import AnchorPage from '@/layouts/AnchorPage';
import CustomizeColumn from '@/components/CustomizeColumn';
import { projectColumns, recordColumn } from '../columns/detail';
import AuditProcess from '@/components/AuditProcess';
import useGetDetailCommon from '../hooks/useGetDetailCommon';
import theme from '../../../../../config/lingxi.theme.config';
import FormilyUploadFiles from '@/components/UploadFiles/FormilyUploadFiles';
import { ArrayTable,} from '@formily/antd-components'
import { SchemaForm, createFormActions} from '@formily/antd'
import { scoringSchema } from './schema';
import useModal from '../hooks/useModal';
import styles from './detail.less';
const formActions = createFormActions();
const TobeEvaluateDetail = () => {
const { visible, toggle } = useModal()
const [initialValue, setInitialValue] = useState({});
const { anchorHeader, basicInfoList } = useGetDetailCommon({blackList: ['project', 'result'], initialValue: initialValue})
/**
* @todo 抽出来
*/
useEffect(() => {
async function init() {
return new Promise<void>((resolve) => {
setTimeout(() => {
setInitialValue({
theme: 'hellow',
files: [
{
name: '百度12312',
url: "http://www.baidu.com"
}
],
scoringList: [
{
id: 1,
projectName: "123",
memberName: {
"id": 2,
"name":"456"
},
baogao: [
{
name: '123',
url: 'http://www.baidu.com/zzz.png',
}
]
}
]
})
resolve()
}, 1500)
})
}
init();
}, [])
const onDrawerConfirm = () => {
// handleConfirm()
formActions.submit();
}
const onSubmit = (value: any) => {
console.log(value);
// handleConfirm();
toggle(false);
}
return (
<Spin spinning={false}>
<AnchorPage
title={`温州市隆昌皮业有限公式`}
anchors={anchorHeader}
extra={
<Button onClick={() => toggle(true)}>考评打分</Button>
}
>
<AuditProcess title="流转进度" id="progress" />
<div style={{ margin: `${theme["@margin-md"]} 0` }}>
<CustomizeColumn id="detail" data={basicInfoList} title="基本信息" column={3} />
</div>
<Card title="流转记录" id="record" extra={<Button>内部流转</Button>}>
<Table columns={recordColumn}></Table>
</Card>
</AnchorPage>
<Drawer
title="考评打分"
visible={visible}
width={1200}
onClose={() => toggle(false)}
footer={
<div style={{ textAlign: 'right'}}>
<Button onClick={() => toggle(false)} style={{ marginRight: 8 }}>
取消
</Button>
<Button onClick={onDrawerConfirm} type="primary">
确认
</Button>
</div>
}
>
<div className={styles.form}>
<SchemaForm
onSubmit={onSubmit}
initialValues={initialValue}
schema={scoringSchema}
actions={formActions}
components={{
FormilyUploadFiles,
ArrayTable,
}}
/>
</div>
</Drawer>
</Spin>
)
}
export default TobeEvaluateDetail
import React from 'react';
import { Card, Space } from 'antd'
import useEvaluateColumn, { InspectionData } from '../hooks/useEvaluateColumn';
import { querySchema } from './schema';
import useFetchList from '../hooks/useFetchList';
import { FORM_FILTER_PATH } from '@/formSchema/const';
import { useStateFilterSearchLinkageEffect } from '@/formSchema/effects/useFilterSearch';
import { PublicApi } from '@/services/api';
import CustomizeQueryList from '../../components/CustomizeQueryList';
interface Iprops {};
const List: React.FC<Iprops> = (props: Iprops) => {
const { fetchListData } = useFetchList();
const { columns } = useEvaluateColumn<InspectionData>([
{
title: '操作',
render: (_text, _record) => (
<Space>
<a>考评打分</a>
</Space>
)
}
])
const handleFetch = async (params) => {
const result = fetchListData(PublicApi.getMemberAbilitySubPage, params);
return result
}
return (
<Card>
<CustomizeQueryList
columns={columns}
schema={querySchema}
fetchListData={handleFetch}
effects={($, actions) => {
useStateFilterSearchLinkageEffect(
$,
actions,
'name',
FORM_FILTER_PATH,
);
}}
/>
</Card>
)
}
export default List
import { ISchema } from '@formily/antd';
import { FORM_FILTER_PATH } from '@/formSchema/const';
/**
* 会员考评页scheam
*/
export const querySchema: ISchema = {
type: 'object',
properties: {
megaLayout: {
type: 'object',
'x-component': 'mega-layout',
properties: {
name: {
type: 'string',
'x-component': 'Search',
'x-component-props': {
placeholder: '搜索通知单号',
align: 'flex-left',
tip: '输入通知单号进行搜索',
},
},
[FORM_FILTER_PATH]: {
type: 'object',
'x-component': 'mega-layout',
'x-component-props': {
grid: true,
full: true,
autoRow: true,
columns: 6,
},
properties: {
summary: {
type: 'string',
'x-component-props': {
placeholder: '通知单摘要',
allowClear: true,
},
},
processName: {
type: 'string',
'x-component-props': {
placeholder: '加工企业名',
allowClear: true,
},
},
outerStatus: {
type: 'string',
default: undefined,
enum: [],
'x-component-props': {
placeholder: '外部状态(全部)',
allowClear: true,
},
},
innerStatus: {
type: 'string',
default: undefined,
enum: [],
'x-component-props': {
placeholder: '内部状态(全部)',
allowClear: true,
},
},
submit: {
'x-component': 'Submit',
'x-mega-props': {
span: 1,
},
'x-component-props': {
children: '查询',
},
},
},
},
},
},
},
};
export const scoringSchema: ISchema = {
type: 'object',
properties: {
scoringList: {
"type": "array",
"x-component": "arraytable",
"x-component-props": {
// operations: false,
renderAddition: () => null,
renderRemove: () => null,
renderMoveDown: () => null,
renderMoveUp: () => null,
operations: false,
},
items: {
type: "object",
properties: {
id: {
title: "序号",
editable: false,
type: 'string',
"x-props": {
width: 65,
},
},
projectName: {
title: '考评项目',
type: 'string',
"x-component-props": {},
"x-props": {
width: 160,
}
},
projectContent: {
title: '考评内容',
type: 'textarea',
'x-props': {
width: 424,
},
'x-component-props': {
row: 1,
style: {
height: 32,
}
}
},
'memberName.name': {
title: "考评人",
type: 'string',
editable: false,
'x-props': {
width: 128,
},
// "x-component": "FormilySelectMember",
// "x-component-props": {
// children: '选择考评人'
// }
},
moban: {
title: '考评模板',
type: "object",
'x-component': 'FormilyUploadFiles',
'x-component-props': {
mode: 'link',
buttonText: '上传',
fileContainerClassName: 'customizeFileContainer'
},
"x-props": {
width: 180,
}
},
baogao: {
title: '考评报告',
type: "object",
'x-component': 'FormilyUploadFiles',
'x-component-props': {
mode: 'link',
buttonText: '上传',
fileContainerClassName: 'customizeFileContainer'
},
"x-props": {
width: 180,
}
},
score1: {
title: '考评计分',
type: 'string',
"x-props": {
width: 95,
},
"x-component-props": {}
},
}
}
}
}
}
import React from 'react';
import { Spin, Card, Table, Button } from 'antd';
import { CheckCircleOutlined } from '@ant-design/icons';
import AnchorPage from '@/layouts/AnchorPage';
import CustomizeColumn from '@/components/CustomizeColumn';
import AuditProcess from '@/components/AuditProcess';
import { PublicApi } from '@/services/api';
import { projectColumns, recordColumn } from '../columns/detail';
import useGetDetailCommon from '../hooks/useGetDetailCommon';
import useFetchInfo from '../hooks/useFetchInfo';
import useModal from '../hooks/useModal';
import theme from '../../../../../config/lingxi.theme.config';
import ExamVerify, { SubmitDataTypes } from '@/components/ExamVerify';
const TobeEvaluateDetail = () => {
const { initialValue } = useFetchInfo(PublicApi.getMemberAbilitySubGet, { id: 1})
const { anchorHeader, basicInfoList, evaluateResultColumn } = useGetDetailCommon({blackList: [], initialValue: initialValue});
const onSubmitRes = () => {
}
return (
<Spin spinning={false}>
<AnchorPage
title={`温州市隆昌皮业有限公式`}
anchors={anchorHeader}
extra={
<Button type="primary" onClick={onSubmitRes}>提交考评结果</Button>
}
>
<AuditProcess title="流转进度" id="progress" />
<div style={{ margin: `${theme["@margin-md"]} 0` }}>
<CustomizeColumn id="detail" data={basicInfoList} title="基本信息" column={3} />
</div>
<Card title="考评项目" id="project">
<Table columns={projectColumns}></Table>
</Card>
<div style={{ margin: `${theme["@margin-md"]} 0` }}>
<CustomizeColumn id="result" data={evaluateResultColumn} title="基本信息" column={3} />
</div>
<div style={{ margin: `${theme["@margin-md"]} 0` }}>
<Card title="流转记录" id="record" extra={<Button>内部流转</Button>}>
<Table columns={recordColumn}></Table>
</Card>
</div>
</AnchorPage>
</Spin>
)
}
export default TobeEvaluateDetail
import React from 'react';
import { Card, Space, Button } from 'antd'
import useEvaluateColumn, { InspectionData } from '../hooks/useEvaluateColumn';
import { evaluationListSchema } from '../schema';
import useFetchList from '../hooks/useFetchList';
import { FORM_FILTER_PATH } from '@/formSchema/const';
import { useStateFilterSearchLinkageEffect } from '@/formSchema/effects/useFilterSearch';
import { PublicApi } from '@/services/api';
import CustomizeQueryList from '../../components/CustomizeQueryList';
interface Iprops {};
const List: React.FC<Iprops> = (props: Iprops) => {
const { fetchListData } = useFetchList();
const { columns } = useEvaluateColumn<InspectionData>([
{
title: '操作',
render: (_text, _record) => (
<Space>
<a>通报</a>
</Space>
)
}
])
const controllerBtns = (
<Space>
<Button>批量通报</Button>
</Space>
)
const handleFetch = async (params) => {
const result = fetchListData(PublicApi.getMemberAbilitySubPage, params);
return result
}
return (
<Card>
<CustomizeQueryList
columns={columns}
schema={evaluationListSchema}
fetchListData={handleFetch}
expressionScope={{controllerBtns}}
effects={($, actions) => {
useStateFilterSearchLinkageEffect($, actions, 'name', FORM_FILTER_PATH);
}}
/>
</Card>
)
}
export default List
import React from 'react';
import { Spin, Card, Table, Button } from 'antd';
import { CheckCircleOutlined } from '@ant-design/icons';
import AnchorPage from '@/layouts/AnchorPage';
import CustomizeColumn from '@/components/CustomizeColumn';
import AuditProcess from '@/components/AuditProcess';
import { PublicApi } from '@/services/api';
import { projectColumns, recordColumn } from '../columns/detail';
import useGetDetailCommon from '../hooks/useGetDetailCommon';
import useFetchInfo from '../hooks/useFetchInfo';
import useModal from '../hooks/useModal';
import theme from '../../../../../config/lingxi.theme.config';
import ExamVerify, { SubmitDataTypes } from '@/components/ExamVerify';
const TobeEvaluateDetail = () => {
const { initialValue } = useFetchInfo(PublicApi.getMemberAbilitySubGet, { id: 1})
const { anchorHeader, basicInfoList, evaluateResultColumn } = useGetDetailCommon({blackList: [], initialValue: initialValue});
const { visible, toggle } = useModal();
const onSubmit = (values: SubmitDataTypes) => {
console.log(values)
}
const onCancel = () => {
toggle(false);
}
const examValue = {
status: 0,
reason: '123'
}
return (
<Spin spinning={false}>
<AnchorPage
title={`温州市隆昌皮业有限公式`}
anchors={anchorHeader}
extra={
<Button type="primary" onClick={() => toggle(true)} icon={<CheckCircleOutlined />}>单据审核</Button>
}
>
<AuditProcess title="流转进度" id="progress" />
<div style={{ margin: `${theme["@margin-md"]} 0` }}>
<CustomizeColumn id="detail" data={basicInfoList} title="基本信息" column={3} />
</div>
<Card title="考评项目" id="project">
<Table columns={projectColumns}></Table>
</Card>
<div style={{ margin: `${theme["@margin-md"]} 0` }}>
<CustomizeColumn id="result" data={evaluateResultColumn} title="基本信息" column={3} />
</div>
<div style={{ margin: `${theme["@margin-md"]} 0` }}>
<Card title="流转记录" id="record" extra={<Button>内部流转</Button>}>
<Table columns={recordColumn}></Table>
</Card>
</div>
</AnchorPage>
<ExamVerify visible={visible} title="审核" onSubmit={onSubmit} onCancel={onCancel} value={examValue} />
</Spin>
)
}
export default TobeEvaluateDetail
import React from 'react';
import { Card, Space, Button } from 'antd'
import useEvaluateColumn, { InspectionData } from '../hooks/useEvaluateColumn';
import { evaluationListSchema } from '../schema';
import useFetchList from '../hooks/useFetchList';
import { FORM_FILTER_PATH } from '@/formSchema/const';
import { useStateFilterSearchLinkageEffect } from '@/formSchema/effects/useFilterSearch';
import { PublicApi } from '@/services/api';
import CustomizeQueryList from '../../components/CustomizeQueryList';
interface Iprops {};
const List: React.FC<Iprops> = (props: Iprops) => {
const { fetchListData } = useFetchList();
const { columns } = useEvaluateColumn<InspectionData>([
{
title: '操作',
render: (_text, _record) => (
<Space>
<a>审核</a>
</Space>
)
}
])
const controllerBtns = (
<Space>
<Button>批量审核通过</Button>
</Space>
)
const handleFetch = async (params) => {
const result = fetchListData(PublicApi.getMemberAbilitySubPage, params);
return result
}
return (
<Card>
<CustomizeQueryList
columns={columns}
schema={evaluationListSchema}
fetchListData={handleFetch}
expressionScope={{controllerBtns}}
effects={($, actions) => {
useStateFilterSearchLinkageEffect($, actions, 'name', FORM_FILTER_PATH);
}}
/>
</Card>
)
}
export default List
import React from 'react';
import { Spin, Card, Table, Button } from 'antd';
import { CheckCircleOutlined } from '@ant-design/icons';
import AnchorPage from '@/layouts/AnchorPage';
import CustomizeColumn from '@/components/CustomizeColumn';
import AuditProcess from '@/components/AuditProcess';
import { PublicApi } from '@/services/api';
import { projectColumns, recordColumn } from '../columns/detail';
import useGetDetailCommon from '../hooks/useGetDetailCommon';
import useFetchInfo from '../hooks/useFetchInfo';
import useModal from '../hooks/useModal';
import theme from '../../../../../config/lingxi.theme.config';
import ExamVerify, { SubmitDataTypes } from '@/components/ExamVerify';
const TobeReviewDetailII = () => {
const { initialValue } = useFetchInfo(PublicApi.getMemberAbilitySubGet, { id: 1})
const { anchorHeader, basicInfoList, evaluateResultColumn } = useGetDetailCommon({blackList: [], initialValue: initialValue});
const { visible, toggle } = useModal();
const onSubmit = (values: SubmitDataTypes) => {
console.log(values)
}
const onCancel = () => {
toggle(false);
}
const examValue = {
status: 0,
reason: '123'
}
return (
<Spin spinning={false}>
<AnchorPage
title={`温州市隆昌皮业有限公式`}
anchors={anchorHeader}
extra={
<Button type="primary" onClick={() => toggle(true)} icon={<CheckCircleOutlined />}>单据审核</Button>
}
>
<AuditProcess title="流转进度" id="progress" />
<div style={{ margin: `${theme["@margin-md"]} 0` }}>
<CustomizeColumn id="detail" data={basicInfoList} title="基本信息" column={3} />
</div>
<Card title="考评项目" id="project">
<Table columns={projectColumns}></Table>
</Card>
<div style={{ margin: `${theme["@margin-md"]} 0` }}>
<CustomizeColumn id="result" data={evaluateResultColumn} title="基本信息" column={3} />
</div>
<div style={{ margin: `${theme["@margin-md"]} 0` }}>
<Card title="流转记录" id="record" extra={<Button>内部流转</Button>}>
<Table columns={recordColumn}></Table>
</Card>
</div>
</AnchorPage>
<ExamVerify visible={visible} title="审核" onSubmit={onSubmit} onCancel={onCancel} value={examValue} />
</Spin>
)
}
export default TobeReviewDetailII
import React from 'react';
import { Card, Space, Button } from 'antd'
import useEvaluateColumn, { InspectionData } from '../hooks/useEvaluateColumn';
import { evaluationListSchema } from '../schema';
import useFetchList from '../hooks/useFetchList';
import { FORM_FILTER_PATH } from '@/formSchema/const';
import { useStateFilterSearchLinkageEffect } from '@/formSchema/effects/useFilterSearch';
import { PublicApi } from '@/services/api';
import CustomizeQueryList from '../../components/CustomizeQueryList';
interface Iprops {};
const TobeReviewListII: React.FC<Iprops> = (props: Iprops) => {
const { fetchListData } = useFetchList();
const { columns } = useEvaluateColumn<InspectionData>([
{
title: '操作',
render: (_text, _record) => (
<Space>
<a>审核</a>
</Space>
)
}
])
const controllerBtns = (
<Space>
<Button>批量审核通过</Button>
</Space>
)
const handleFetch = async (params) => {
const result = fetchListData(PublicApi.getMemberAbilitySubPage, params);
return result
}
return (
<Card>
<CustomizeQueryList
columns={columns}
schema={evaluationListSchema}
fetchListData={handleFetch}
expressionScope={{controllerBtns}}
effects={($, actions) => {
useStateFilterSearchLinkageEffect($, actions, 'name', FORM_FILTER_PATH);
}}
/>
</Card>
)
}
export default TobeReviewListII
.form {
:global {
.fileContainerClassName {
color: @main-color;
}
}
}
import React, { useEffect, useState, useMemo } from 'react';
import { Spin, Card, Table, Button, Drawer } from 'antd';
import { SchemaForm, createFormActions} from '@formily/antd'
import { CheckCircleOutlined } from '@ant-design/icons';
import { ArrayTable,} from '@formily/antd-components'
import AnchorPage from '@/layouts/AnchorPage';
import CustomizeColumn from '@/components/CustomizeColumn';
import AuditProcess from '@/components/AuditProcess';
import FormilyUploadFiles from '@/components/UploadFiles/FormilyUploadFiles';
import { modifyEvaluateScore, evaluateScoreRes } from './schema';
import { PublicApi } from '@/services/api';
import { projectColumns, recordColumn } from '../columns/detail';
import useGetDetailCommon from '../hooks/useGetDetailCommon';
import useFetchInfo from '../hooks/useFetchInfo';
import useModal from '../hooks/useModal';
import styles from './detail.less';
import theme from '../../../../../config/lingxi.theme.config';
import createRichTextUtils from '@/components/RangeTime/createRichText';
import FormilyCheckbox from '../../components/FormilyCheckBox'
const formActions = createFormActions();
const resultForm = createFormActions();
const TobeEvaluateDetail = () => {
const { visible, toggle } = useModal();
const { visible: resultVisible, toggle: resultToggle } = useModal();
const { initialValue } = useFetchInfo(PublicApi.getMemberAbilitySubGet, { id: 1})
const { anchorHeader, basicInfoList } = useGetDetailCommon({blackList: ['result'], initialValue: initialValue});
const [ editingScoreData, setEditingScoreData ] = useState<any>({})
const withEditProjectColumns = useMemo(() => {
const temp = projectColumns.concat({
title: '操作',
render: (text, record) => {
return <a onClick={() => editScore(record)}>修改</a>
}
})
return temp;
}, [projectColumns])
const editScore = (record: any) => {
setEditingScoreData(record);
}
const onDrawerCancel = () => {
// handleCancel();
toggle(false)
}
const onDrawerConfirm = (type: 'edit' | 'result') => {
if(type === 'edit') {
formActions.submit();
} else {
resultForm.submit();
}
}
const onSubmit = (value: any) => {
console.log(value);
toggle(false);
}
const resultOnSubmit = (value) => {
console.log(value);
resultToggle(false);
}
return (
<Spin spinning={false}>
<AnchorPage
title={`温州市隆昌皮业有限公式`}
anchors={anchorHeader}
extra={
<Button onClick={() => resultToggle(true)} icon={<CheckCircleOutlined />}>考评结果</Button>
}
>
<AuditProcess title="流转进度" id="progress" />
<div style={{ margin: `${theme["@margin-md"]} 0` }}>
<CustomizeColumn id="detail" data={basicInfoList} title="基本信息" column={3} />
</div>
<Card title="考评项目" id="project">
<Table columns={withEditProjectColumns}></Table>
</Card>
<div style={{ margin: `${theme["@margin-md"]} 0` }}>
<Card title="流转记录" id="record" extra={<Button>内部流转</Button>}>
<Table columns={recordColumn}></Table>
</Card>
</div>
</AnchorPage>
<Drawer
title="修改考评计分"
visible={visible}
width={1200}
onClose={onDrawerCancel}
footer={
<div style={{ textAlign: 'right' }}>
<Button onClick={onDrawerCancel} style={{ marginRight: 8 }}>
取消
</Button>
<Button onClick={() => onDrawerConfirm('edit')} type="primary">
确认
</Button>
</div>
}
>
<div className={styles.form}>
<SchemaForm
onSubmit={onSubmit}
initialValues={editingScoreData}
schema={modifyEvaluateScore}
actions={formActions}
components={{
FormilyUploadFiles,
ArrayTable,
}}
/>
</div>
</Drawer>
<Drawer
title="考评结果"
visible={resultVisible}
width={800}
onClose={() => resultToggle(false)}
footer={
<div style={{ textAlign: 'right' }}>
<Button onClick={() => resultToggle(false)} style={{ marginRight: 8 }}>
取消
</Button>
<Button onClick={() => onDrawerConfirm('result')} type="primary">
确认
</Button>
</div>
}
>
<SchemaForm
onSubmit={onSubmit}
initialValues={initialValue}
expressionScope={createRichTextUtils()}
schema={evaluateScoreRes}
actions={formActions}
components={{
FormilyUploadFiles,
ArrayTable,
FormilyCheckbox
}}
/>
</Drawer>
</Spin>
)
}
export default TobeEvaluateDetail
import React from 'react';
import { Card, Space, Button } from 'antd'
import useEvaluateColumn, { InspectionData } from '../hooks/useEvaluateColumn';
import { evaluationListSchema } from '../schema';
import useFetchList from '../hooks/useFetchList';
import { FORM_FILTER_PATH } from '@/formSchema/const';
import { useStateFilterSearchLinkageEffect } from '@/formSchema/effects/useFilterSearch';
import { PublicApi } from '@/services/api';
import CustomizeQueryList from '../../components/CustomizeQueryList';
interface Iprops {};
const List: React.FC<Iprops> = (props: Iprops) => {
const { fetchListData } = useFetchList();
const { columns } = useEvaluateColumn<InspectionData>([
{
title: '操作',
render: (_text, _record) => (
<Space>
<a>提交</a>
<a>编辑</a>
</Space>
)
}
])
const controllerBtns = (
<Space>
<Button>批量提交</Button>
</Space>
)
const handleFetch = async (params) => {
const result = fetchListData(PublicApi.getMemberAbilitySubPage, params);
return result
}
return (
<Card>
<CustomizeQueryList
columns={columns}
schema={evaluationListSchema}
fetchListData={handleFetch}
expressionScope={{controllerBtns}}
effects={($, actions) => {
useStateFilterSearchLinkageEffect($, actions, 'name', FORM_FILTER_PATH);
}}
/>
</Card>
)
}
export default List
import { ISchema } from '@formily/antd';
/**
* 修改考评打分
*/
export const modifyEvaluateScore: ISchema = {
type: 'object',
properties: {
layout: {
type: 'object',
'x-component': 'mega-layout',
'x-component-props': {
labelCol: 4,
full: true,
labelAlign: 'left'
},
properties: {
projectName: {
title: '考评项目',
type: 'string',
editable: false
},
content: {
title: "项目内容",
type: 'string',
editable: false,
},
memberName: {
title: '考评人',
type: "string",
editable: false,
},
isMemberScore: {
title: '考评人打分',
type: 'string',
editable: false
},
weight: {
title: '权重',
type: 'string',
},
scoring: {
title: '考评计分',
type: 'string',
},
files: {
title: '考评模板',
type: 'object',
'x-component': 'FormilyUploadFiles',
'x-component-props': {
fileContainerClassName: 'customizeFileContainer'
}
},
report: {
title: '考评报告',
type: 'object',
'x-component': 'FormilyUploadFiles',
'x-component-props': {
fileContainerClassName: 'customizeFileContainer'
}
},
}
}
}
}
/**
* 考评结果
*/
export const evaluateScoreRes = {
type: 'object',
properties: {
layout: {
type: 'object',
'x-component': 'mega-layout',
'x-component-props': {
labelCol: 4,
full: true,
labelAlign: 'left'
},
properties: {
score: {
title: '考评最终分',
type: 'string',
},
result: {
title: '考评结果',
type: 'textarea',
},
noticeResult: {
title: "{{ text('通知考评结果',help('将考评结果通知给考察对象')) }}",
type: "string",
'x-component': 'FormilyCheckbox'
},
files: {
title: '考评模板',
type: 'object',
'x-component': 'FormilyUploadFiles',
'x-component-props': {
fileContainerClassName: 'customizeFileContainer'
}
},
}
}
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment