多语言控制以及外部展示部门负责人

上海顺胜组织架构图v2
Chengliang 1 year ago
parent 3d3b8a61da
commit 6badf8edb3

@ -18,6 +18,7 @@ import { message } from 'antd';
import jsPDF from 'jspdf'; import jsPDF from 'jspdf';
import ExportJsonExcel from 'js-export-excel'; import ExportJsonExcel from 'js-export-excel';
import './index.less'; import './index.less';
import { i18n } from '../../util/i18n.js';
let addNodeChildFunc = null; let addNodeChildFunc = null;
let orgChart = null; let orgChart = null;
@ -45,6 +46,7 @@ export default class DrawerComponents extends React.Component {
// //
onNodeClick = (node) => { onNodeClick = (node) => {
if (node.ftype == '4') { if (node.ftype == '4') {
debugger;
this.setState({ this.setState({
jobResponsibility: node.jobResponsibility, jobResponsibility: node.jobResponsibility,
isModalOpen: true, isModalOpen: true,
@ -76,6 +78,7 @@ export default class DrawerComponents extends React.Component {
// //
getDeatilDatas(params, type = 'chart', showJob = '1') { getDeatilDatas(params, type = 'chart', showJob = '1') {
const { language } = this.props;
this.setState({ spinning: true }); this.setState({ spinning: true });
d3.json( d3.json(
'/api/bs/hrmorganization/orgchart/getDepartmentDetail?' + '/api/bs/hrmorganization/orgchart/getDepartmentDetail?' +
@ -85,7 +88,49 @@ export default class DrawerComponents extends React.Component {
if (type == 'chart') { if (type == 'chart') {
this.setState({ data: data.data, spinning: false }); this.setState({ data: data.data, spinning: false });
} else { } else {
this.setState({ dataSource: data.dataSource, columns: data.columns }); let columns = [
{
dataIndex: 'id',
key: 'id',
title: `${i18n.table.no[language]}`,
},
{
dataIndex: 'workCode',
key: 'workCode',
title: `${i18n.table.workCode[language]}`,
},
{
dataIndex: 'lastName',
key: 'lastName',
title: `${i18n.table.lastName[language]}`,
},
{
dataIndex: 'sex',
key: 'sex',
title: `${i18n.table.gender[language]}`,
},
{
dataIndex: 'departmentName',
key: 'departmentName',
title: `${i18n.table.department[language]}`,
},
{
dataIndex: 'subcompanyName',
key: 'subcompanyName',
title: `${i18n.table.company[language]}`,
},
{
dataIndex: 'jobTitle',
key: 'jobTitle',
title: `${i18n.table.possition[language]}`,
},
{
dataIndex: 'mobile',
key: 'mobile',
title: `${i18n.table.mobile[language]}`,
},
];
this.setState({ dataSource: data.dataSource, columns: columns });
} }
}); });
} }
@ -177,6 +222,7 @@ export default class DrawerComponents extends React.Component {
}; };
handleExport = (e) => { handleExport = (e) => {
const { language } = this.props;
let type = e.key == '1' ? 'png' : e.key == '1' ? 'pdf' : 'excel'; let type = e.key == '1' ? 'png' : e.key == '1' ? 'pdf' : 'excel';
if (type == 'png') { if (type == 'png') {
orgChart && orgChart.exportImg({ full: true }); orgChart && orgChart.exportImg({ full: true });
@ -203,7 +249,7 @@ export default class DrawerComponents extends React.Component {
} }
} }
} }
option.fileName = '组织信息'; option.fileName = `${i18n.table.orgInfo[language]}`;
option.datas = [ option.datas = [
{ {
sheetData: dataTable, sheetData: dataTable,
@ -219,14 +265,14 @@ export default class DrawerComponents extends React.Component {
'手机号', '手机号',
], ],
sheetHeader: [ sheetHeader: [
'序号', i18n.table.no[language],
'工号', i18n.table.workCode[language],
'姓名', i18n.table.lastName[language],
'性别', i18n.table.gender[language],
'部门', i18n.table.department[language],
'分部', i18n.table.company[language],
'岗位', i18n.table.possition[language],
'手机号', i18n.table.mobile[language],
], ],
}, },
]; ];
@ -239,6 +285,8 @@ export default class DrawerComponents extends React.Component {
* 节点渲染 * 节点渲染
*/ */
nodeContentRender = (d, i, arr, state) => { nodeContentRender = (d, i, arr, state) => {
const { language } = this.props;
if (d.data.ftype == 2) { if (d.data.ftype == 2) {
return `<div style="position: relative;"> return `<div style="position: relative;">
<div style=" height: 152px;background-size: 100% 100%;box-sizing: border-box;padding-top: 30px;position:relative;z-index:2"> <div style=" height: 152px;background-size: 100% 100%;box-sizing: border-box;padding-top: 30px;position:relative;z-index:2">
@ -260,11 +308,13 @@ export default class DrawerComponents extends React.Component {
${d.data.fname} ${d.data.fname}
</div> </div>
<div style="font-size: 13px;font-family: Microsoft YaHei-Bold, Microsoft YaHei;color: #333333;height: 25px;line-height: 25px;"> <div style="font-size: 13px;font-family: Microsoft YaHei-Bold, Microsoft YaHei;color: #333333;height: 25px;line-height: 25px;">
负责人:${d.data.fleader} ${i18n.head[language]}:${d.data.fleader}
</div> </div>
<div style="display:flex" > <div style="display:flex" >
<div style="height: 25px; line-height: 25px; min-width: 80px;"> <div style="height: 25px; line-height: 25px; min-width: 80px;">
在岗: ${d.data.fonjob} ${i18n.onJob[language]}: ${d.data.fonjob} ${
i18n.onJob[language] == 'cn' ? '人' : ''
}
</div> </div>
</div> </div>
</div> </div>
@ -279,9 +329,13 @@ export default class DrawerComponents extends React.Component {
</div> </div>
<img src="./img/user-card/jobicon-orange.png" style="margin-left: 20px; vertical-align: top;"/> <img src="./img/user-card/jobicon-orange.png" style="margin-left: 20px; vertical-align: top;"/>
<div style="display: inline-block; margin-left: 15px;"> <div style="display: inline-block; margin-left: 15px;">
<div style="font-size: 15px;height: 25px;line-height: 25px;font-family: Microsoft YaHei-Bold, Microsoft YaHei;font-weight: bold;color: #333333;">${d.data.fname}</div> <div style="font-size: 15px;height: 25px;line-height: 25px;font-family: Microsoft YaHei-Bold, Microsoft YaHei;font-weight: bold;color: #333333;">${
d.data.fname
}</div>
<div style="font-size: 13px;font-family: Microsoft YaHei-Regular, Microsoft YaHei;font-weight: 400;color: #333333;display: flex;height: 25px;line-height: 25px;"> <div style="font-size: 13px;font-family: Microsoft YaHei-Regular, Microsoft YaHei;font-weight: 400;color: #333333;display: flex;height: 25px;line-height: 25px;">
<span>在岗: ${d.data.fonjob} </span> <span>${i18n.onJob[language]}: ${d.data.fonjob} ${
i18n.onJob[language] == 'cn' ? '人' : ''
}</span>
</div> </div>
</div> </div>
</div> </div>
@ -307,8 +361,10 @@ export default class DrawerComponents extends React.Component {
}</div> }</div>
</div> </div>
<div style="font-size: 13px;font-family: Microsoft YaHei-Regular, Microsoft YaHei;font-weight: 400;color: #333333;height: 25px;line-height: 25px;"> <div style="font-size: 13px;font-family: Microsoft YaHei-Regular, Microsoft YaHei;font-weight: 400;color: #333333;height: 25px;line-height: 25px;">
<span>司龄: ${d.data.companyWorkYear} </span> <span>${i18n.serveAge[language]}: ${
<div>岗位: ${d.data.jobTitle}</div> d.data.companyWorkYear
} ${i18n.year[language]}</span>
<div>${i18n.postion[language]}: ${d.data.jobTitle}</div>
</div> </div>
</div> </div>
</div> </div>
@ -347,6 +403,8 @@ export default class DrawerComponents extends React.Component {
}; };
render() { render() {
const { language } = this.props;
const { const {
params, params,
open, open,
@ -362,17 +420,17 @@ export default class DrawerComponents extends React.Component {
} = this.state; } = this.state;
let arr = []; let arr = [];
if (detailType == 'chart') { if (detailType == 'chart') {
arr.push({ label: '导出图片', key: '1' }); arr.push({ label: `${i18n.exportImage[language]}`, key: '1' });
//arr.push({ label: 'PDF', key: '2' }); //arr.push({ label: 'PDF', key: '2' });
} else { } else {
arr.push({ label: '导出表格', key: '3' }); arr.push({ label: `${i18n.exportTable[language]}`, key: '3' });
} }
const menu = <Menu onClick={this.handleExport.bind(this)} items={arr} />; const menu = <Menu onClick={this.handleExport.bind(this)} items={arr} />;
return ( return (
<Drawer <Drawer
title="详细信息" title={i18n.detailInfo[language]}
width={1100} width={1100}
onClose={this.onClose} onClose={this.onClose}
open={open} open={open}
@ -397,11 +455,11 @@ export default class DrawerComponents extends React.Component {
); );
}} }}
> >
是否显示岗位 {i18n.showJob[language]}
</Checkbox> </Checkbox>
)} )}
<Dropdown overlay={menu}> <Dropdown overlay={menu}>
<Button type="primary">导出</Button> <Button type="primary">{i18n.export[language]}</Button>
</Dropdown> </Dropdown>
<img <img
style={{ width: 36, height: 36, cursor: 'pointer' }} style={{ width: 36, height: 36, cursor: 'pointer' }}
@ -440,13 +498,16 @@ export default class DrawerComponents extends React.Component {
jump_to: '跳至', jump_to: '跳至',
page: '页', page: '页',
}, },
showTotal: (total) => `${dataSource.length}`, showTotal: (total) =>
language == 'cn'
? `${dataSource.length}`
: `${dataSource.length} ${i18n.table.records[language]} ${i18n.table.total[language]}`,
}} }}
/> />
</div> </div>
)} )}
<Modal <Modal
title="岗位职责" title={`${i18n.postionInfo[language]}-`}
open={isModalOpen} open={isModalOpen}
onCancel={() => this.setState({ isModalOpen: false })} onCancel={() => this.setState({ isModalOpen: false })}
footer={[ footer={[
@ -454,7 +515,7 @@ export default class DrawerComponents extends React.Component {
key="back" key="back"
onClick={() => this.setState({ isModalOpen: false })} onClick={() => this.setState({ isModalOpen: false })}
> >
关闭 {i18n.close[language]}
</Button>, </Button>,
<Button <Button
type="primary" type="primary"
@ -465,7 +526,7 @@ export default class DrawerComponents extends React.Component {
) )
} }
> >
人员详情 {i18n.employeeInfo[language]}
</Button>, </Button>,
]} ]}
> >

@ -24,12 +24,7 @@ import locale from 'antd/lib/date-picker/locale/zh_CN';
import { HomeOutlined, FolderOpenOutlined } from '@ant-design/icons'; import { HomeOutlined, FolderOpenOutlined } from '@ant-design/icons';
moment.locale('zh-cn'); moment.locale('zh-cn');
const defaultLevelOpt = [ import { i18n } from '../../util/i18n.js';
{ value: '1', label: '全部' },
{ value: '2', label: '一级' },
{ value: '3', label: '二级' },
{ value: '4', label: '三级' },
];
export class TopBar extends React.Component { export class TopBar extends React.Component {
constructor(props) { constructor(props) {
@ -51,7 +46,8 @@ export class TopBar extends React.Component {
open: false, open: false,
confirmLoading: false, confirmLoading: false,
description: '', description: '',
levelOpt: defaultLevelOpt, defaultLevelOpt: [],
levelOpt: [],
}; };
} }
@ -200,9 +196,13 @@ export class TopBar extends React.Component {
* 虚拟维度部门层级构建 * 虚拟维度部门层级构建
*/ */
buildLevelOpt = (level) => { buildLevelOpt = (level) => {
let opt = [{ value: '1', label: '全部' }]; const { language } = this.props;
let opt = [{ value: '1', label: `${i18n.all[language]}` }];
for (let index = 1; index <= level; index++) { for (let index = 1; index <= level; index++) {
opt.push({ value: `${index + 1}`, label: `${index}` }); opt.push({
value: `${index + 1}`,
label: language == 'cn' ? `${index}` : `Level ${index}`,
});
} }
return opt; return opt;
}; };
@ -214,6 +214,17 @@ export class TopBar extends React.Component {
}; };
componentDidMount() { componentDidMount() {
const { language } = this.props;
const defaultLevelOpt = [
{ value: '1', label: `${i18n.all[language]}` },
{ value: '2', label: language == 'cn' ? '一级' : 'Level 1' },
{ value: '3', label: language == 'cn' ? '二级' : 'Level 2' },
{ value: '4', label: language == 'cn' ? '三级' : 'Level 3' },
];
this.setState({
levelOpt: defaultLevelOpt,
defaultLevelOpt: defaultLevelOpt,
});
this.getSeatchCondition(this.props.url); this.getSeatchCondition(this.props.url);
} }
@ -236,7 +247,7 @@ export class TopBar extends React.Component {
onClick={this.handleExportMenuClick.bind(this)} onClick={this.handleExportMenuClick.bind(this)}
items={[ items={[
{ {
label: '导出图片', label: `${i18n.exportImage[this.props.language]}`,
key: '1', key: '1',
}, },
// { // {
@ -248,7 +259,7 @@ export class TopBar extends React.Component {
); );
render() { render() {
const { disabled, type } = this.props; const { disabled, type, language } = this.props;
const { const {
rootTreeData, rootTreeData,
open, open,
@ -257,6 +268,7 @@ export class TopBar extends React.Component {
requestData, requestData,
deptTreeData, deptTreeData,
levelOpt, levelOpt,
defaultLevelOpt,
} = this.state; } = this.state;
const { fclass, department } = requestData; const { fclass, department } = requestData;
@ -264,7 +276,7 @@ export class TopBar extends React.Component {
<div className={style.topbarWrapper}> <div className={style.topbarWrapper}>
<Row> <Row>
<Col span={6}> <Col span={6}>
维度 {i18n.fclass[language]}
<Select <Select
defaultValue="0" defaultValue="0"
style={{ width: 140 }} style={{ width: 140 }}
@ -300,14 +312,14 @@ export class TopBar extends React.Component {
</Select> </Select>
</Col> </Col>
<Col span={fclass == '0' ? 6 : 8}> <Col span={fclass == '0' ? 6 : 8}>
根节点 {i18n.companyRoot[language]}
<TreeSelect <TreeSelect
treeDataSimpleMode treeDataSimpleMode
allowClear allowClear
style={{ width: '75%' }} style={{ width: '65%' }}
value={this.state.requestData.root} value={this.state.requestData.root}
dropdownStyle={{ maxHeight: 400, overflow: 'auto' }} dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
placeholder="请选择根节点" placeholder={i18n.placeholder[language]}
onChange={this.onRootChange} onChange={this.onRootChange}
loadData={this.onRootLoadData} loadData={this.onRootLoadData}
treeData={rootTreeData} treeData={rootTreeData}
@ -325,11 +337,11 @@ export class TopBar extends React.Component {
}) })
} }
> >
隐藏部门 {i18n.hideDept[language]}
</Checkbox> </Checkbox>
<Tooltip <Tooltip
title="提示:开启后将只显示分部组织架构!!!" title={i18n.tipsDept[language]}
color="#0082fb" color="#0082fb"
placement="rightTop" placement="rightTop"
> >
@ -342,7 +354,7 @@ export class TopBar extends React.Component {
'' ''
)} )}
<Col span={6}> <Col span={6}>
部门层级 {i18n.level[language]}
<Select <Select
style={{ width: 140 }} style={{ width: 140 }}
value={this.state.requestData.level} value={this.state.requestData.level}
@ -368,10 +380,10 @@ export class TopBar extends React.Component {
}) })
} }
> >
显示虚拟组织 {i18n.virtual[language]}
</Checkbox> </Checkbox>
<Tooltip <Tooltip
title="提示:若启用虚拟组织,需要在分部自定义表增加字段(名称 fblx) 字段类型 下拉框(0实体 1虚拟) 部门自定义表同上(字段名称 bmlx)。" title={i18n.tipsVirtual[language]}
color="#0082fb" color="#0082fb"
placement="rightTop" placement="rightTop"
> >
@ -385,14 +397,14 @@ export class TopBar extends React.Component {
)} )}
{fclass != '0' ? ( {fclass != '0' ? (
<Col span={8}> <Col span={8}>
部门根节点 {i18n.deptRoot[language]}
<TreeSelect <TreeSelect
treeDataSimpleMode treeDataSimpleMode
allowClear allowClear
style={{ width: '75%' }} style={{ width: '75%' }}
value={department} value={department}
dropdownStyle={{ maxHeight: 400, overflow: 'auto' }} dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
placeholder="请选择部门节点" placeholder={i18n.placeholder[language]}
onChange={this.onDeptChange} onChange={this.onDeptChange}
treeData={deptTreeData} treeData={deptTreeData}
treeIcon treeIcon
@ -409,10 +421,10 @@ export class TopBar extends React.Component {
this.props.onSearch(this.state.requestData); this.props.onSearch(this.state.requestData);
}} }}
> >
查询 {i18n.search[language]}
</Button> </Button>
<Dropdown overlay={this.menu}> <Dropdown overlay={this.menu}>
<Button type="primary">导出</Button> <Button type="primary">{i18n.export[language]}</Button>
</Dropdown> </Dropdown>
</Col> </Col>
</Row> </Row>

@ -12,6 +12,7 @@ import moment from 'moment';
import qs from 'qs'; import qs from 'qs';
import { message, Spin, notification } from 'antd'; import { message, Spin, notification } from 'antd';
import { SmileOutlined } from '@ant-design/icons'; import { SmileOutlined } from '@ant-design/icons';
import { i18n } from '../util/i18n.js';
let active = 'top'; let active = 'top';
let drawerCom = null; let drawerCom = null;
@ -29,19 +30,26 @@ export default function companyPage() {
let addNodeChildFunc = null; let addNodeChildFunc = null;
const [hasRight, setHasRight] = useState(''); const [hasRight, setHasRight] = useState('');
const [timelineId, setTimelineId] = useState(0); const [timelineId, setTimelineId] = useState(0);
const [language, setLanguage] = useState('cn');
const infoRef = useRef(); const infoRef = useRef();
useEffect(() => { useEffect(() => {
infoRef.current = timelineId;
let { hash } = window.location;
let languageValue = hash.match(/language=([^&]+)/i);
let language = 'cn';
if (languageValue && languageValue.length > 1) {
language = languageValue[1];
setLanguage(language);
}
notification.open({ notification.open({
message: '提示', message: i18n.tips[language],
description: description: i18n.tipsContent[language],
'组织架构图中编制数和在编数显示初始化需参考文档配置定时任务并执行!!!(编制数默认取本年度最新编制信息,人数统计展示仅限于行政维度)',
icon: <SmileOutlined style={{ color: '#108ee9' }} />, icon: <SmileOutlined style={{ color: '#108ee9' }} />,
}); });
}, []);
useEffect(() => {
infoRef.current = timelineId;
}, [timelineId]); }, [timelineId]);
const [spinning, setSpinning] = useState(false); const [spinning, setSpinning] = useState(false);
// //
@ -150,6 +158,7 @@ export default function companyPage() {
const nodeContentRender = (d, i, arr, state) => { const nodeContentRender = (d, i, arr, state) => {
let fclass = topbar.state.requestData.fclass; let fclass = topbar.state.requestData.fclass;
let statisticsStyle = fclass == 0 ? 'block' : 'none'; let statisticsStyle = fclass == 0 ? 'block' : 'none';
let headStyle = fclass == 0 ? 'none' : 'block';
if (d.data.ftype == 0) { if (d.data.ftype == 0) {
return `<div style = "text-align: center"> return `<div style = "text-align: center">
<div style="display: inline-block; margin-left: 5px;"> <div style="display: inline-block; margin-left: 5px;">
@ -200,6 +209,9 @@ export default function companyPage() {
<span style="color:red">${d.data.staffNum}</span> / <span style="color:red">${d.data.staffNum}</span> /
<span style="color:green">${d.data.onJobNum}</span> <span style="color:green">${d.data.onJobNum}</span>
</div> </div>
<div style="display: ${headStyle}">
<span>${d.data.fleader}</span>
</div>
</div> </div>
</div> </div>
`; `;
@ -449,6 +461,7 @@ export default function companyPage() {
}} }}
type="company" type="company"
url="/api/bs/hrmorganization/orgchart/getCondition?fclass=0&type=company&id=0" url="/api/bs/hrmorganization/orgchart/getCondition?fclass=0&type=company&id=0"
language={language}
/> />
<ToolBar <ToolBar
onTopLayoutClick={(progressBtn) => handleTopLayoutClick(progressBtn)} onTopLayoutClick={(progressBtn) => handleTopLayoutClick(progressBtn)}
@ -478,7 +491,7 @@ export default function companyPage() {
nodeContent={nodeContentRender} nodeContent={nodeContentRender}
/> />
</Spin> </Spin>
<DrawerComponents ref={(r) => (drawerCom = r)} /> <DrawerComponents ref={(r) => (drawerCom = r)} language={language} />
<OperateDialog <OperateDialog
ref={(r) => (operateCom = r)} ref={(r) => (operateCom = r)}
addFolderNode={addFolderNode} addFolderNode={addFolderNode}

@ -99,7 +99,7 @@ export default function userPage() {
// //
useEffect(() => { useEffect(() => {
document.cookie = document.cookie =
'ecology_JSessionid=aaawGLaPO07RO41dNaL5y; JSESSIONID=aaawGLaPO07RO41dNaL5y; languageidweaver=7; Systemlanguid=7; loginuuids=1; loginidweaver=sysadmin; __randcode__=62651c45-391e-4d84-a5a7-9db939559994'; 'ecology_JSessionid=aaaJufMEQ3m8EecoqOd8y; JSESSIONID=aaaJufMEQ3m8EecoqOd8y; Systemlanguid=7; languageidweaver=7; loginidweaver=sysadmin; loginuuids=1;';
d3.json( d3.json(
'/api/bs/hrmorganization/orgchart/userData?fclass=0&fisvitual=0&root=0&level=3&id=0', '/api/bs/hrmorganization/orgchart/userData?fclass=0&fisvitual=0&root=0&level=3&id=0',
).then((data) => { ).then((data) => {

@ -0,0 +1,54 @@
export const i18n = {
fclass: { cn: '维度', en: 'Organizational type' },
companyRoot: { cn: '分部根节点', en: 'Company' },
deptRoot: { cn: '部门根节点', en: 'Department' },
level: { cn: '部门层级', en: 'Hierarchy' },
search: { cn: '查询', en: 'Search' },
export: { cn: '导出', en: 'Export' },
exportImage: { cn: '导出图片', en: ' Export Image' },
exportTable: { cn: '导出表格', en: ' Export Table' },
hideDept: { cn: '隐藏部门', en: 'Hide Department' },
virtual: { cn: '显示虚拟组织', en: 'View Virtual Organization' },
detailInfo: { cn: '详细信息', en: 'Detailed Information' },
head: { cn: '负责人', en: 'Head' },
onJob: { cn: '在岗', en: 'HeadCount' },
serveAge: { cn: '司龄', en: 'Serving Age' },
year: { cn: '年', en: 'Year' },
postion: { cn: '岗位', en: 'Position' },
postionInfo: { cn: '岗位职责', en: 'Job Responsibilities' },
close: { cn: '关闭', en: 'Close' },
employeeInfo: { cn: '人员详情', en: 'Employee Information' },
placeholder: { cn: '请选择', en: 'Please Select' },
all: { cn: '全部', en: 'All' },
showJob: { cn: '是否显示岗位', en: 'Is Show Job' },
tips: { cn: '提示', en: 'Tips' },
tipsContent: {
cn: '组织架构图中编制数和在编数显示初始化需参考文档配置定时任务并执行!!!(编制数默认取本年度最新编制信息,人数统计展示仅限于行政维度)',
en: 'The number of entries and the number of entries displayed in the organizational diagram Initialize the scheduled task and execute it. (The compilation number is the latest compilation information of this year by default, and the display of the number of people is limited to the administrative dimension)',
},
tipsDept: {
cn: '提示:开启后将只显示分部组织架构!!!',
en: 'Tip: Only the branch organization structure will be displayed after it is turned on!!!',
},
tipsVirtual: {
cn: '提示:若启用虚拟组织,需要在分部自定义表增加字段(名称 fblx) 字段类型 下拉框(0实体 1虚拟) 部门自定义表同上(字段名称 bmlx)。',
en: 'Tip: If virtual organization is enabled, you need to add a field (name fblx) Field type drop-down box (0 entity 1 Virtual) to the department custom table as above (field name bmlx).',
},
/** 表头 */
table: {
no: { cn: '序号', en: 'No' },
workCode: { cn: '工号', en: 'WorkCode' },
lastName: { cn: '姓名', en: 'LastName' },
gender: { cn: '性别', en: 'Gender' },
department: { cn: '部门', en: 'Department' },
company: { cn: '分部', en: 'Company' },
possition: { cn: '岗位', en: 'Possition ' },
mobile: { cn: '手机号', en: 'Mobile Phone Number ' },
orgInfo: { cn: '组织信息', en: 'Organization Information' },
total: { cn: '共', en: 'in total' },
records: { cn: '条', en: 'records' },
},
};
Loading…
Cancel
Save