fix(staff)
This commit is contained in:
parent
7415fc8312
commit
bf8ae54585
16
README.md
16
README.md
|
@ -44,19 +44,3 @@ You don’t have to ever use `eject`. The curated feature set is suitable for sm
|
|||
You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started).
|
||||
|
||||
To learn React, check out the [React documentation](https://reactjs.org/).
|
||||
添加的数据
|
||||
|
||||
1、队伍属性管理 添加队伍
|
||||
2、个人身份管理 添加身份
|
||||
3、组织架构通过部门来组织
|
||||
|
||||
|
||||
首页:
|
||||
1、组织架构 用户数量统计,党员数量统计
|
||||
2、武装力量 根据队伍统计
|
||||
3、年度训练 按照年度统计类别,次数 (任务发布时,可选择多个类别)
|
||||
|
||||
4、物资管理
|
||||
5、档案管理
|
||||
|
||||
6、评优争先
|
|
@ -93,7 +93,7 @@
|
|||
"build": "node scripts/build.js",
|
||||
"test": "node scripts/test.js"
|
||||
},
|
||||
"proxy":"https://www.hswzct.cn:12016",
|
||||
"proxy":"http://127.0.0.1:12214",
|
||||
"eslintConfig": {
|
||||
"extends": [
|
||||
"react-app",
|
||||
|
|
|
@ -14,6 +14,7 @@ const DebounceSelect = <
|
|||
key?: string;
|
||||
label: React.ReactNode;
|
||||
value: string | number;
|
||||
head_img?: string;
|
||||
} = any
|
||||
>({
|
||||
fetchOptions,
|
||||
|
@ -35,7 +36,6 @@ const DebounceSelect = <
|
|||
if (fetchId !== fetchRef.current) {
|
||||
return;
|
||||
}
|
||||
|
||||
setOptions(newOptions);
|
||||
setFetching(false);
|
||||
});
|
||||
|
@ -51,7 +51,6 @@ const DebounceSelect = <
|
|||
onSearch={debounceFetcher}
|
||||
notFoundContent={fetching ? <Spin size="small" /> : null}
|
||||
{...props}
|
||||
|
||||
options={options}
|
||||
/>
|
||||
);
|
||||
|
|
|
@ -95,6 +95,7 @@
|
|||
.ec_right_end{
|
||||
position: absolute;
|
||||
left: 0;
|
||||
cursor: pointer;
|
||||
right: 0;
|
||||
bottom: 20px;
|
||||
color: #fff;
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import { Modal } from "antd";
|
||||
import { Modal, Space } from "antd";
|
||||
import { Store } from "antd/es/form/interface";
|
||||
import { inject, observer } from "mobx-react";
|
||||
import { useState } from "react";
|
||||
|
@ -9,6 +9,10 @@ import DebounceSelect from "@/components/form/featch_select";
|
|||
interface UserValue {
|
||||
label: string;
|
||||
value: string;
|
||||
head_img: string;
|
||||
age: number;
|
||||
grid_letter_user: number;
|
||||
pos_held: string;
|
||||
}
|
||||
const Ec = (props: Store) => {
|
||||
const [isModalOpen, setIsModalOpen] = useState<boolean>(false);
|
||||
|
@ -27,6 +31,8 @@ const Ec = (props: Store) => {
|
|||
return res.data.record.map((item) => ({
|
||||
label: item.user_name,
|
||||
value: item.identity,
|
||||
identity: item.identity,
|
||||
head_img:item.head_img,
|
||||
}));
|
||||
});
|
||||
}
|
||||
|
@ -60,13 +66,18 @@ const Ec = (props: Store) => {
|
|||
onChange={(newValue) => {
|
||||
setValue(newValue as UserValue[]);
|
||||
}}
|
||||
optionRender={(item:any) => {
|
||||
return <Space key={item.key}>
|
||||
<span>{item.label}</span>
|
||||
<img src={item.data.head_img} alt="" width={40} height={40} />
|
||||
</Space>
|
||||
}}
|
||||
style={{ width: "100%" }}
|
||||
/>
|
||||
<p></p>
|
||||
{value.map((item: any) => {
|
||||
return (
|
||||
<div key={item.key}>
|
||||
<div>姓名:{item.label} : 未在线</div>
|
||||
<div>姓名:{item.label}</div>
|
||||
<div>
|
||||
点击呼叫:
|
||||
<PhoneTwoTone
|
||||
|
@ -84,10 +95,10 @@ const Ec = (props: Store) => {
|
|||
</div>
|
||||
<div className="ec_right">
|
||||
<div style={{ display: "flex" }}>
|
||||
<video
|
||||
{/* <video
|
||||
id="rtcVideo"
|
||||
style={{ width: "300px", height: "300px" }}
|
||||
></video>
|
||||
></video> */}
|
||||
<video
|
||||
id="remoteVideo"
|
||||
style={{ width: "300px", height: "300px" }}
|
||||
|
|
|
@ -46,6 +46,7 @@ const WhichVideo = (props) => {
|
|||
return () => {
|
||||
clearInterval(timer);
|
||||
};
|
||||
// eslint-disable-next-line react-hooks/exhaustive-deps
|
||||
}, []);
|
||||
return (
|
||||
<>
|
||||
|
|
|
@ -62,7 +62,7 @@ const Turn = (props: Store) => {
|
|||
setImageUrl(item.file_url);
|
||||
}}
|
||||
key={item.identity}
|
||||
style={{ width: "80px", height: "80px" }}
|
||||
style={{ width: "100%", height: "100px" }}
|
||||
src={item.file_url}
|
||||
alt=""
|
||||
/>
|
||||
|
@ -72,11 +72,29 @@ const Turn = (props: Store) => {
|
|||
let fileType = getFileTypeFromUrl(imageUrl);
|
||||
switch (fileType) {
|
||||
case "jpeg":
|
||||
return <img style={{ width: "100%",objectFit:"fill" }} src={imageUrl} alt="" />;
|
||||
return (
|
||||
<img
|
||||
style={{ width: "100%", height: "500px", objectFit: "fill" }}
|
||||
src={imageUrl}
|
||||
alt=""
|
||||
/>
|
||||
);
|
||||
case "jpg":
|
||||
return <img style={{ width: "100%" ,objectFit:"fill"}} src={imageUrl} alt="" />;
|
||||
return (
|
||||
<img
|
||||
style={{ width: "100%", height: "500px", objectFit: "fill" }}
|
||||
src={imageUrl}
|
||||
alt=""
|
||||
/>
|
||||
);
|
||||
case "png":
|
||||
return <img style={{ width: "100%",objectFit:"fill" }} src={imageUrl} alt="" />;
|
||||
return (
|
||||
<img
|
||||
style={{ width: "100%", height: "500px", objectFit: "fill" }}
|
||||
src={imageUrl}
|
||||
alt=""
|
||||
/>
|
||||
);
|
||||
case "pdf":
|
||||
return (
|
||||
<div style={{ width: "100%", height: "500px" }}>
|
||||
|
@ -90,17 +108,17 @@ const Turn = (props: Store) => {
|
|||
);
|
||||
case "mp4":
|
||||
return (
|
||||
<div key={imageUrl} style={{ width: "100%", height: "600px" }}>
|
||||
<div key={imageUrl} style={{ width: "100%", height: "500px" }}>
|
||||
<video
|
||||
controls
|
||||
style={{ width: "100%", height: "600px" }}
|
||||
style={{ width: "100%", height: "500px" }}
|
||||
src={imageUrl}
|
||||
></video>
|
||||
</div>
|
||||
);
|
||||
case "docx":
|
||||
return (
|
||||
<div key={imageUrl} style={{ width: "100%", height: "600px" }}>
|
||||
<div key={imageUrl} style={{ width: "100%", height: "500px" }}>
|
||||
<FileViewer
|
||||
loader={undefined}
|
||||
src={imageUrl}
|
||||
|
@ -112,9 +130,9 @@ const Turn = (props: Store) => {
|
|||
</div>
|
||||
);
|
||||
case "":
|
||||
return <div style={{ width: "100%", height: "600px" }}></div>;
|
||||
return <div style={{ width: "100%", height: "500px" }}></div>;
|
||||
default:
|
||||
return <div style={{ width: "100%", height: "600px" }}></div>;
|
||||
return <div style={{ width: "100%", height: "500px" }}></div>;
|
||||
}
|
||||
};
|
||||
return (
|
||||
|
@ -139,15 +157,15 @@ const Turn = (props: Store) => {
|
|||
>
|
||||
<div>
|
||||
<Row>
|
||||
<Col span={2}>
|
||||
<Col span={3}>
|
||||
<div style={{ color: "#fff" }}>
|
||||
<div
|
||||
style={{
|
||||
height: "500px",
|
||||
overflowY: "hidden",
|
||||
border: "1px solid #fff",
|
||||
border: "1px solid rgb(51, 51, 51)",
|
||||
padding: "10px",
|
||||
margin: "5px",
|
||||
overflowY: "scroll",
|
||||
}}
|
||||
>
|
||||
<p>任务列表</p>
|
||||
|
@ -172,11 +190,12 @@ const Turn = (props: Store) => {
|
|||
</div>
|
||||
</div>
|
||||
</Col>
|
||||
<Col span={2}>
|
||||
<Col span={3}>
|
||||
<div
|
||||
style={{
|
||||
height: "500px",
|
||||
color: "#fff",
|
||||
border: "1px solid #fff",
|
||||
border: "1px solid rgb(51, 51, 51)",
|
||||
padding: "10px",
|
||||
margin: "5px",
|
||||
}}
|
||||
|
@ -201,13 +220,17 @@ const Turn = (props: Store) => {
|
|||
})}
|
||||
</div>
|
||||
</Col>
|
||||
<Col span={2}>
|
||||
<div style={{ color: "#fff", border: "1px solid #fff",
|
||||
padding: "10px",
|
||||
margin: "5px", }}>
|
||||
|
||||
<Col span={3}>
|
||||
<div
|
||||
style={{
|
||||
color: "#fff",
|
||||
border: "1px solid rgb(51, 51, 51)",
|
||||
padding: "10px",
|
||||
margin: "5px",
|
||||
}}
|
||||
>
|
||||
<div style={{ height: "500px", overflowY: "scroll" }}>
|
||||
<p>档案列表</p>
|
||||
<p>档案列表</p>
|
||||
{imageList?.map((item) => {
|
||||
let fileType = getFileTypeFromUrl(item.file_url);
|
||||
switch (fileType) {
|
||||
|
@ -270,7 +293,7 @@ const Turn = (props: Store) => {
|
|||
</div>
|
||||
</div>
|
||||
</Col>
|
||||
<Col span={18}>
|
||||
<Col span={15}>
|
||||
<div
|
||||
style={{
|
||||
color: "#fff",
|
||||
|
@ -278,7 +301,7 @@ const Turn = (props: Store) => {
|
|||
display: "flex",
|
||||
alignItems: "center",
|
||||
justifyContent: "center",
|
||||
padding:"10px"
|
||||
padding: "10px",
|
||||
}}
|
||||
>
|
||||
{preView()}
|
||||
|
|
|
@ -179,7 +179,7 @@ const Ac = (props: Store) => {
|
|||
<div style={{ display: "flex", alignItems: "flex-start" }}>
|
||||
<div
|
||||
style={{
|
||||
border: "1px solid #fff",
|
||||
border: "1px solid rgb(51, 51, 51)",
|
||||
width: "200px",
|
||||
overflow: "auto",
|
||||
height: "480px",
|
||||
|
@ -207,9 +207,10 @@ const Ac = (props: Store) => {
|
|||
);
|
||||
})}
|
||||
</div>
|
||||
<div style={{ width: '10px' }}></div>
|
||||
<div
|
||||
style={{
|
||||
border: "1px solid #fff",
|
||||
border: "1px solid rgb(51, 51, 51)",
|
||||
width: "200px",
|
||||
height: "480px",
|
||||
overflow: "auto",
|
||||
|
@ -234,6 +235,7 @@ const Ac = (props: Store) => {
|
|||
);
|
||||
})}
|
||||
</div>
|
||||
<div style={{ width: '10px' }}></div>
|
||||
<div style={{height:"400px",flex:4}}>
|
||||
{preView()}
|
||||
</div>
|
||||
|
|
|
@ -4,5 +4,6 @@
|
|||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
border: 1px solid;
|
||||
border: 1px solid rgba(255, 255, 255, 0.3);
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
|
|
@ -1,11 +1,13 @@
|
|||
import Col from "antd/es/col";
|
||||
import { Row } from "antd/lib/grid";
|
||||
import * as echarts from "echarts";
|
||||
|
||||
import "./kanban.less";
|
||||
import { useEffect } from "react";
|
||||
import Timer from "../homeLeft/timer";
|
||||
import { inject, observer } from "mobx-react";
|
||||
import { Store } from "antd/es/form/interface";
|
||||
|
||||
const KanBan = () => {
|
||||
const KanBan = (props: Store) => {
|
||||
const { homeStore } = props;
|
||||
const initChart = () => {
|
||||
var myChart = echarts.init(document.getElementById("yibiaopan"));
|
||||
var option = {
|
||||
|
@ -15,30 +17,20 @@ const KanBan = () => {
|
|||
center: ["50%", "70%"],
|
||||
startAngle: 200,
|
||||
endAngle: -20,
|
||||
radius:70,
|
||||
radius: 100,
|
||||
min: 0,
|
||||
max: 30,
|
||||
splitNumber: 12,
|
||||
itemStyle: {
|
||||
color: "#FFAB91",
|
||||
},
|
||||
axisLabel: {
|
||||
distance: -20,
|
||||
color: "#999",
|
||||
fontSize: 20,
|
||||
},
|
||||
anchor: {
|
||||
show: false,
|
||||
},
|
||||
title: {
|
||||
show: true,
|
||||
},
|
||||
|
||||
detail: {
|
||||
valueAnimation: true,
|
||||
width: "40%",
|
||||
lineHeight: 40,
|
||||
lineHeight: 80,
|
||||
borderRadius: 8,
|
||||
offsetCenter: [0, "-10%"],
|
||||
offsetCenter: [0, "10%"],
|
||||
fontSize: 20,
|
||||
fontWeight: "bolder",
|
||||
formatter: "{value} °C",
|
||||
|
@ -54,12 +46,12 @@ const KanBan = () => {
|
|||
type: "gauge",
|
||||
center: ["50%", "70%"],
|
||||
startAngle: 200,
|
||||
radius:70,
|
||||
endAngle: -20,
|
||||
radius: 80,
|
||||
endAngle: 10,
|
||||
min: 0,
|
||||
max: 60,
|
||||
itemStyle: {
|
||||
color: "#FD7347",
|
||||
color: "#FD7347"
|
||||
},
|
||||
progress: {
|
||||
show: true,
|
||||
|
@ -74,12 +66,8 @@ const KanBan = () => {
|
|||
axisTick: {
|
||||
show: false,
|
||||
},
|
||||
splitLine: {
|
||||
show: false,
|
||||
},
|
||||
axisLabel: {
|
||||
show: false,
|
||||
},
|
||||
splitLine: { show: false },
|
||||
axisLabel: { show: false },
|
||||
detail: {
|
||||
show: false,
|
||||
},
|
||||
|
@ -93,7 +81,8 @@ const KanBan = () => {
|
|||
};
|
||||
option && myChart.setOption(option);
|
||||
};
|
||||
const sourece = (id: string) => {
|
||||
|
||||
const guoqi = (id: string, list: any) => {
|
||||
var myChart = echarts.init(document.getElementById(id));
|
||||
var option = {
|
||||
legend: {
|
||||
|
@ -115,92 +104,19 @@ const KanBan = () => {
|
|||
formatter: "{b}:{c}",
|
||||
},
|
||||
},
|
||||
data: [
|
||||
{ value: 40, name: "第三方" },
|
||||
{ value: 18, name: "购买" },
|
||||
{ value: 18, name: "自有" },
|
||||
],
|
||||
data: list,
|
||||
},
|
||||
],
|
||||
};
|
||||
option && myChart.setOption(option);
|
||||
};
|
||||
const guoqi = (id: string) => {
|
||||
var myChart = echarts.init(document.getElementById(id));
|
||||
var option = {
|
||||
legend: {
|
||||
top: "bottom",
|
||||
show: false,
|
||||
},
|
||||
series: [
|
||||
{
|
||||
type: "pie",
|
||||
radius: [30, 80],
|
||||
center: ["50%", "50%"],
|
||||
itemStyle: {
|
||||
borderRadius: 2,
|
||||
},
|
||||
label: {
|
||||
normal: {
|
||||
show: true,
|
||||
position: "inner",
|
||||
formatter: "{b}:{c}",
|
||||
},
|
||||
},
|
||||
data: [
|
||||
{ value: 40, name: "即将过期" },
|
||||
{ value: 18, name: "已经过期" },
|
||||
{ value: 18, name: "未过期" },
|
||||
],
|
||||
},
|
||||
],
|
||||
};
|
||||
option && myChart.setOption(option);
|
||||
};
|
||||
const outin = (id: string) => {
|
||||
var myChart = echarts.init(document.getElementById(id));
|
||||
var option = {
|
||||
legend: {
|
||||
top: "bottom",
|
||||
show: false,
|
||||
},
|
||||
series: [
|
||||
{
|
||||
type: "pie",
|
||||
radius: [30, 80],
|
||||
center: ["50%", "50%"],
|
||||
itemStyle: {
|
||||
borderRadius: 2,
|
||||
},
|
||||
label: {
|
||||
normal: {
|
||||
show: true,
|
||||
position: "inner",
|
||||
formatter: "{b}:{c}",
|
||||
},
|
||||
},
|
||||
data: [
|
||||
{ value: 40, name: "出库" },
|
||||
{ value: 18, name: "入库" },
|
||||
],
|
||||
},
|
||||
],
|
||||
};
|
||||
option && myChart.setOption(option);
|
||||
};
|
||||
const gailan = () => {
|
||||
|
||||
const gailan = (list) => {
|
||||
var myChart = echarts.init(document.getElementById("gailan"));
|
||||
var option = {
|
||||
xAxis: {
|
||||
type: "category",
|
||||
data: [
|
||||
"个人携行",
|
||||
"反恐维稳",
|
||||
"反恐维稳",
|
||||
"地震救援",
|
||||
"防汛抗洪",
|
||||
"灭火救援",
|
||||
],
|
||||
data: list.map((item) => item.name),
|
||||
axisLabel: {
|
||||
show: true,
|
||||
interval: 0,
|
||||
|
@ -216,7 +132,7 @@ const KanBan = () => {
|
|||
},
|
||||
series: [
|
||||
{
|
||||
data: [820, 932, 901, 934, 1290, 1330],
|
||||
data: list.map((item) => item.value),
|
||||
type: "line",
|
||||
smooth: true,
|
||||
areaStyle: {
|
||||
|
@ -239,44 +155,73 @@ const KanBan = () => {
|
|||
};
|
||||
useEffect(() => {
|
||||
initChart();
|
||||
sourece("sourece");
|
||||
guoqi("yujing");
|
||||
outin("baozhiqi");
|
||||
sourece("level");
|
||||
gailan();
|
||||
}, []);
|
||||
|
||||
homeStore.getMm().then((res) => {
|
||||
gailan(res.data?.record ?? []);
|
||||
});
|
||||
homeStore.getmmb().then((res) => {
|
||||
guoqi("yujing", [
|
||||
{ value: res.data?.record?.other_num??0, name: "第三方" },
|
||||
{ value: res.data?.record?.own_num??0, name: "自有" },
|
||||
]);
|
||||
guoqi("sourece", [
|
||||
{ value: res.data?.record?.jygq??0, name: "即将过期" },
|
||||
{ value: res.data?.record?.gq??0, name: "已经过期" },
|
||||
{ value: res.data?.record?.bgq??0, name: "未过期" },
|
||||
]);
|
||||
guoqi("level", [
|
||||
{ value: res.data?.record?.drck??0, name: "当日出库" },
|
||||
{ value: res.data?.record?.drrk??0, name: "当日入库" },
|
||||
]);
|
||||
});
|
||||
|
||||
}, [homeStore]);
|
||||
return (
|
||||
<>
|
||||
<Row style={{ margin: "10px" }}>
|
||||
<Col className="gutter-row" span={6}>
|
||||
<div style={{ marginBottom: "10px" }}>
|
||||
<div style={{ display: "flex" }} className="gutter-row">
|
||||
<div
|
||||
style={{
|
||||
flex: 1,
|
||||
}}
|
||||
>
|
||||
<div
|
||||
className="kanban-item"
|
||||
style={{ backgroundColor: "rgba(37, 52, 70, 0.4)" }}
|
||||
style={{
|
||||
height: "240px",
|
||||
width: "100%",
|
||||
|
||||
backgroundColor: "rgba(37, 52, 70, 0.4)",
|
||||
border: "1px solid rgba(255, 255, 255, 0.3)",
|
||||
boxSizing: "border-box",
|
||||
}}
|
||||
>
|
||||
<div>
|
||||
<p
|
||||
style={{
|
||||
backgroundColor: "#29ecb4",
|
||||
width: "100%",
|
||||
padding: "10px",
|
||||
}}
|
||||
>
|
||||
安全运行天数
|
||||
</p>
|
||||
<p
|
||||
style={{
|
||||
fontSize: "30px",
|
||||
margin: "0px",
|
||||
fontWeight: "800",
|
||||
color: "#29ecb4",
|
||||
}}
|
||||
>
|
||||
109
|
||||
</p>
|
||||
<p style={{ color: "#29ecb4" }}>2024 / 12 / 12 星期四 09:10</p>
|
||||
</div>
|
||||
<p
|
||||
style={{
|
||||
backgroundColor: "#29ecb4",
|
||||
width: "100%",
|
||||
padding: "5px",
|
||||
color: "#fff",
|
||||
boxSizing: "border-box",
|
||||
fontSize: "30px",
|
||||
fontWeight: "800",
|
||||
}}
|
||||
>
|
||||
安全运行天数
|
||||
</p>
|
||||
<p
|
||||
style={{
|
||||
fontSize: "30px",
|
||||
padding: "5px",
|
||||
fontWeight: "800",
|
||||
color: "#29ecb4",
|
||||
}}
|
||||
>
|
||||
109
|
||||
</p>
|
||||
<p style={{ color: "#29ecb4", padding: "5px" }}>
|
||||
<Timer />
|
||||
</p>
|
||||
</div>
|
||||
<div className="kanban-item" style={{ margin: "10px 0px" }}>
|
||||
<div className="kanban-item">
|
||||
<div>
|
||||
<div
|
||||
id="yibiaopan"
|
||||
|
@ -284,44 +229,30 @@ const KanBan = () => {
|
|||
></div>
|
||||
</div>
|
||||
</div>
|
||||
<div className="kanban-item">
|
||||
<div>
|
||||
<div
|
||||
id="sourece"
|
||||
style={{ width: "240px", height: "240px" }}
|
||||
></div>
|
||||
</div>
|
||||
</div>
|
||||
</Col>
|
||||
</div>
|
||||
|
||||
<Col className="gutter-row" span={12}>
|
||||
<div className="kanban-item">
|
||||
<div>暂无视频</div>
|
||||
</div>
|
||||
<div className="kanban-item" style={{ margin: "10px 0px" }}>
|
||||
<div>暂无视频</div>
|
||||
</div>
|
||||
<div className="kanban-item">
|
||||
<div id="gailan" style={{ width: "100%", height: "240px" }}></div>
|
||||
</div>
|
||||
</Col>
|
||||
<Col className="gutter-row" span={6}>
|
||||
<div style={{ flex: 2 }}>
|
||||
<div style={{ color: "#fff", textAlign: "center" }}>暂无视频</div>
|
||||
</div>
|
||||
<div style={{ flex: 1 }}>
|
||||
<div className="kanban-item">
|
||||
<div id="yujing" style={{ width: "240px", height: "240px" }}></div>
|
||||
</div>
|
||||
<div className="kanban-item" style={{ margin: "10px 0px" }}>
|
||||
<div
|
||||
id="baozhiqi"
|
||||
style={{ width: "240px", height: "240px" }}
|
||||
></div>
|
||||
</div>
|
||||
<div className="kanban-item">
|
||||
<div id="level" style={{ width: "240px", height: "240px" }}></div>
|
||||
</div>
|
||||
</Col>
|
||||
</Row>
|
||||
</>
|
||||
</div>
|
||||
</div>
|
||||
<div style={{ display: "flex" }}>
|
||||
<div className="kanban-item" style={{ flex: 1 }}>
|
||||
<div id="sourece" style={{ width: "240px", height: "240px" }}></div>
|
||||
</div>
|
||||
<div className="kanban-item" style={{ flex: 3 }}>
|
||||
<div id="gailan" style={{ width: "100%", height: "240px" }}></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default KanBan;
|
||||
export default inject("homeStore")(observer(KanBan));
|
||||
|
|
|
@ -118,6 +118,7 @@ const Material = (props: Store) => {
|
|||
const edit = (record) => {
|
||||
setIsModalOpen(true);
|
||||
record.expiry_date = dayjs(record.expiry_date);
|
||||
record.supplie_piker=record.supplie_piker===""?[]:record.supplie_piker
|
||||
setRecord(record);
|
||||
};
|
||||
|
||||
|
@ -130,7 +131,6 @@ const Material = (props: Store) => {
|
|||
...values,
|
||||
pid: values.pid ?? 0,
|
||||
storage_cloumn: Number(values.storage_cloumn),
|
||||
// supplie_piker: values.supplie_piker[0].name,
|
||||
};
|
||||
if (values.supplie_piker.length > 0) {
|
||||
data.supplie_piker = values.supplie_piker[0].name;
|
||||
|
|
|
@ -77,5 +77,6 @@ export const defaultConfig = [
|
|||
label: "物资图片",
|
||||
name: "supplie_piker",
|
||||
value: [],
|
||||
rules: [{ required: true, message: "请上传物资图片!" }],
|
||||
},
|
||||
];
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
import { useEffect, useState } from "react";
|
||||
import * as echarts from "echarts";
|
||||
import "./pv.less";
|
||||
import { SnippetsTwoTone } from "@ant-design/icons";
|
||||
import { inject, observer } from "mobx-react";
|
||||
|
@ -9,61 +8,13 @@ import PoverDetail from "../poverDetail";
|
|||
const PoverPage = (props: Store) => {
|
||||
const { usrStore } = props;
|
||||
const [poverData, setPover] = useState<any>();
|
||||
const [config, setConfig] = useState<any>({
|
||||
militia_type: 1,
|
||||
vet: 1,
|
||||
o_type: "",
|
||||
});
|
||||
const initChart = (id: string, count: number, total: number) => {
|
||||
var myChart = echarts.init(document.getElementById(id));
|
||||
var option = {
|
||||
title: {
|
||||
text: count,
|
||||
left: "center",
|
||||
top: "center",
|
||||
textStyle: {
|
||||
color: "#fff",
|
||||
fontSize: "18px",
|
||||
},
|
||||
},
|
||||
series: [
|
||||
{
|
||||
type: "pie",
|
||||
radius: ["70%", "100%"],
|
||||
center: ["50%", "50%"],
|
||||
color: "#000",
|
||||
data: [
|
||||
{
|
||||
value: count,
|
||||
itemStyle: { color: "#254e99", borderRadius: 100 },
|
||||
emphasis: { scale: false },
|
||||
},
|
||||
{
|
||||
value: total,
|
||||
itemStyle: { color: "#f5f5f5" },
|
||||
emphasis: { scale: false },
|
||||
},
|
||||
],
|
||||
label: {
|
||||
show: false,
|
||||
},
|
||||
animationDelay: function (idx) {
|
||||
return Math.random() * 200;
|
||||
},
|
||||
},
|
||||
],
|
||||
};
|
||||
myChart.setOption(option);
|
||||
};
|
||||
useEffect(() => {
|
||||
usrStore.getPover().then((e) => {
|
||||
initChart("pover_jg", e.data.o_type, e.data.total);
|
||||
initChart("pover_jgs", e.data.o_types, e.data.total);
|
||||
setPover(e.data);
|
||||
});
|
||||
}, [usrStore]);
|
||||
const serch = () => {
|
||||
usrStore.getPoverList(config);
|
||||
const serch = (configs) => {
|
||||
usrStore.getPoverList(configs);
|
||||
};
|
||||
return (
|
||||
<div
|
||||
|
@ -75,34 +26,52 @@ const PoverPage = (props: Store) => {
|
|||
}}
|
||||
>
|
||||
<div className="nav-header">
|
||||
<div style={{ textAlign: "center", marginBottom: "20px" ,cursor:"pointer" }}>
|
||||
<div className="pv-head-item">
|
||||
<SnippetsTwoTone style={{ fontSize: 30 }} />
|
||||
<div
|
||||
style={{ width: "150px", height: "100px" }}
|
||||
id="pover_jgs"
|
||||
onClick={() => {
|
||||
setConfig({
|
||||
serch({
|
||||
o_type: "01JAZB1GVJED5R34V6Z8MBWER4",
|
||||
size: 30,
|
||||
offset: 1,
|
||||
});
|
||||
}}
|
||||
>
|
||||
<div>{poverData?.o_types}人</div>
|
||||
<span>机关单位</span>
|
||||
</div>
|
||||
</div>
|
||||
<div style={{ height: "10px" }}></div>
|
||||
<div className="pv-head-item">
|
||||
<SnippetsTwoTone style={{ fontSize: 30 }} />
|
||||
<div
|
||||
onClick={() => {
|
||||
serch({
|
||||
o_type: "01JAZAZDTHJE8FZ24GY9AJ758N",
|
||||
size: 30,
|
||||
offset: 1,
|
||||
});
|
||||
serch();
|
||||
}}
|
||||
></div>
|
||||
<span style={{ color: "#fff" }}>机关单位</span>
|
||||
>
|
||||
<div>{poverData?.o_type}人</div>
|
||||
<span>企事业单位</span>
|
||||
</div>
|
||||
</div>
|
||||
<div
|
||||
style={{ textAlign: "center", marginBottom: "20px" }}
|
||||
onClick={() => {
|
||||
setConfig({
|
||||
o_type: "01JAZB1GVJED5R34V6Z8MBWER4",
|
||||
size: 30,
|
||||
offset: 1,
|
||||
});
|
||||
serch();
|
||||
}}
|
||||
>
|
||||
<div style={{ width: "150px", height: "100%" }} id="pover_jg"></div>
|
||||
<span style={{ color: "#fff" }}>企事业单位</span>
|
||||
<div style={{ height: "10px" }}></div>
|
||||
<div className="pv-head-item">
|
||||
<SnippetsTwoTone style={{ fontSize: 30 }} />
|
||||
<div
|
||||
onClick={() => {
|
||||
serch({
|
||||
o_type: "01JAZB1QSM13C7PHZBTSDE1VXE",
|
||||
size: 30,
|
||||
offset: 1,
|
||||
});
|
||||
}}
|
||||
>
|
||||
<div>{poverData?.news_num}人</div>
|
||||
<span>新兴领域</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div className="nav-content">
|
||||
|
@ -115,12 +84,11 @@ const PoverPage = (props: Store) => {
|
|||
<div
|
||||
className="pv-head-item"
|
||||
onClick={(e) => {
|
||||
setConfig({
|
||||
serch({
|
||||
militia_type: 1,
|
||||
size: 30,
|
||||
offset: 1,
|
||||
});
|
||||
serch();
|
||||
}}
|
||||
>
|
||||
<SnippetsTwoTone style={{ fontSize: 30 }} />
|
||||
|
@ -133,12 +101,11 @@ const PoverPage = (props: Store) => {
|
|||
<SnippetsTwoTone style={{ fontSize: 30 }} />
|
||||
<div
|
||||
onClick={() => {
|
||||
setConfig({
|
||||
serch({
|
||||
militia_type: 2,
|
||||
size: 30,
|
||||
offset: 1,
|
||||
});
|
||||
serch();
|
||||
}}
|
||||
>
|
||||
<div>{poverData?.easy_meber}人</div>
|
||||
|
@ -149,18 +116,32 @@ const PoverPage = (props: Store) => {
|
|||
<SnippetsTwoTone style={{ fontSize: 30 }} />
|
||||
<div
|
||||
onClick={() => {
|
||||
setConfig({
|
||||
serch({
|
||||
vet: 1,
|
||||
size: 30,
|
||||
offset: 1,
|
||||
});
|
||||
serch();
|
||||
}}
|
||||
>
|
||||
<div>{poverData?.vet_meber}人</div>
|
||||
<span>退役军人</span>
|
||||
</div>
|
||||
</div>
|
||||
<div className="pv-head-item">
|
||||
<SnippetsTwoTone style={{ fontSize: 30 }} />
|
||||
<div
|
||||
onClick={() => {
|
||||
serch({
|
||||
grid_user: 1,
|
||||
size: 30,
|
||||
offset: 1,
|
||||
});
|
||||
}}
|
||||
>
|
||||
<div>{poverData?.grid_meber}人</div>
|
||||
<span>网格员</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="content-right">
|
||||
|
|
|
@ -14,7 +14,6 @@
|
|||
justify-content: start;
|
||||
}
|
||||
.content-right {
|
||||
width: 85%;
|
||||
height: 100%;
|
||||
overflow: auto;
|
||||
text-align: center;
|
||||
|
|
|
@ -16,16 +16,32 @@ export const studyColumns: ColumnsType<UserDataType> = [
|
|||
dataIndex: "tel",
|
||||
},
|
||||
{
|
||||
title: "签到时间",
|
||||
title: "上午签到时间",
|
||||
dataIndex: "created_at",
|
||||
render(leave_start_time) {
|
||||
if (!leave_start_time){
|
||||
return "未签到";
|
||||
}
|
||||
return dayjs(leave_start_time).format("YYYY-MM-DD HH:mm");
|
||||
},
|
||||
},
|
||||
{
|
||||
title: "签到地址",
|
||||
title: "下午签到时间",
|
||||
render(record) {
|
||||
if (record.created_at === record.updated_at){
|
||||
return "未签到";
|
||||
}
|
||||
return dayjs(record.created_at).format("YYYY-MM-DD HH:mm");
|
||||
},
|
||||
},
|
||||
{
|
||||
title: "上午签到地址",
|
||||
dataIndex: "address",
|
||||
},
|
||||
{
|
||||
title: "下午签到地址",
|
||||
dataIndex: "pm_address",
|
||||
},
|
||||
// {
|
||||
// title: "经度",
|
||||
// dataIndex: "long",
|
||||
|
@ -65,5 +81,4 @@ export const serchConfig = [
|
|||
value: "",
|
||||
rules: [],
|
||||
},
|
||||
|
||||
];
|
|
@ -1,10 +1,9 @@
|
|||
import { FormType } from "@/components/form/interface";
|
||||
import { UserDataType } from "@/model/userModel";
|
||||
import { ColumnsType } from "antd/lib/table";
|
||||
import { Avatar, Image } from "antd";
|
||||
import { Avatar, Image, Tooltip } from "antd";
|
||||
import { getAgeByIDCard, getBirthDateAndGender } from "@/util/util";
|
||||
export const defaultConfig =(team,per)=>
|
||||
[
|
||||
export const defaultConfig = (team, per) => [
|
||||
{
|
||||
type: FormType.input,
|
||||
label: "用户名",
|
||||
|
@ -158,7 +157,7 @@ export const defaultConfig =(team,per)=>
|
|||
type: FormType.cehckboxGroup,
|
||||
label: "所属队伍",
|
||||
name: "team_link_user",
|
||||
checkboxData:team,
|
||||
checkboxData: team,
|
||||
value: "",
|
||||
rules: [{ required: true, message: "请选择所属队伍" }],
|
||||
},
|
||||
|
@ -166,7 +165,7 @@ export const defaultConfig =(team,per)=>
|
|||
type: FormType.cehckboxGroup,
|
||||
label: "个人身份属性",
|
||||
name: "pers_link_user",
|
||||
checkboxData:per,
|
||||
checkboxData: per,
|
||||
value: "",
|
||||
rules: [{ required: true, message: "请选择个人身份属性" }],
|
||||
},
|
||||
|
@ -206,7 +205,6 @@ export const defaultConfig =(team,per)=>
|
|||
value: "",
|
||||
},
|
||||
|
||||
|
||||
{
|
||||
type: FormType.date,
|
||||
label: "入伍时间",
|
||||
|
@ -279,7 +277,9 @@ export const columns: ColumnsType<UserDataType> = [
|
|||
{
|
||||
title: "性别",
|
||||
width: 100,
|
||||
render: (render) => <span>{getBirthDateAndGender(render.id_card)?.gender}</span>,
|
||||
render: (render) => (
|
||||
<span>{getBirthDateAndGender(render.id_card)?.gender}</span>
|
||||
),
|
||||
},
|
||||
{
|
||||
title: "年龄",
|
||||
|
@ -290,8 +290,10 @@ export const columns: ColumnsType<UserDataType> = [
|
|||
title: "头像",
|
||||
dataIndex: "head_img",
|
||||
width: 150,
|
||||
render: (head_img) =>{
|
||||
return <Avatar size={64} shape="square" src={<Image src={head_img}></Image>} />
|
||||
render: (head_img) => {
|
||||
return (
|
||||
<Avatar size={64} shape="square" src={<Image src={head_img}></Image>} />
|
||||
);
|
||||
},
|
||||
},
|
||||
{
|
||||
|
@ -351,7 +353,15 @@ export const columns: ColumnsType<UserDataType> = [
|
|||
},
|
||||
{
|
||||
title: "备注",
|
||||
width: 300,
|
||||
dataIndex: "remark",
|
||||
ellipsis: {
|
||||
showTitle: false,
|
||||
},
|
||||
width:200,
|
||||
render: (remark) => (
|
||||
<Tooltip placement="topLeft" title={remark}>
|
||||
{remark}
|
||||
</Tooltip>
|
||||
),
|
||||
},
|
||||
];
|
||||
|
|
|
@ -10,6 +10,7 @@ class HomeConfig {
|
|||
static tr: string = "/v1/public/tr"
|
||||
static af: string = "/v1/public/af"
|
||||
static mm: string = "/v1/public/mm"
|
||||
static mmb: string = "/v1/public/mmb"
|
||||
static rm: string = "/v1/public/rm"
|
||||
static ae: string = "/v1/public/ae"
|
||||
static todo: string = "/v1/public/todo"
|
||||
|
@ -63,6 +64,9 @@ class HomeStore extends BaseStore<TagDataType> {
|
|||
async getRm() {
|
||||
return await baseHttp.get(HomeConfig.rm, {});
|
||||
}
|
||||
async getmmb() {
|
||||
return await baseHttp.get(HomeConfig.mmb, {});
|
||||
}
|
||||
async getAe() {
|
||||
return await baseHttp.get(HomeConfig.ae, {});
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue