fix(staff)

This commit is contained in:
wang_yp 2025-03-18 23:59:00 +08:00
parent 7415fc8312
commit bf8ae54585
17 changed files with 279 additions and 316 deletions

View File

@ -44,19 +44,3 @@ You dont 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). 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/). To learn React, check out the [React documentation](https://reactjs.org/).
添加的数据
1、队伍属性管理 添加队伍
2、个人身份管理 添加身份
3、组织架构通过部门来组织
首页:
1、组织架构 用户数量统计,党员数量统计
2、武装力量 根据队伍统计
3、年度训练 按照年度统计类别,次数 (任务发布时,可选择多个类别)
4、物资管理
5、档案管理
6、评优争先

View File

@ -93,7 +93,7 @@
"build": "node scripts/build.js", "build": "node scripts/build.js",
"test": "node scripts/test.js" "test": "node scripts/test.js"
}, },
"proxy":"https://www.hswzct.cn:12016", "proxy":"http://127.0.0.1:12214",
"eslintConfig": { "eslintConfig": {
"extends": [ "extends": [
"react-app", "react-app",

View File

@ -14,6 +14,7 @@ const DebounceSelect = <
key?: string; key?: string;
label: React.ReactNode; label: React.ReactNode;
value: string | number; value: string | number;
head_img?: string;
} = any } = any
>({ >({
fetchOptions, fetchOptions,
@ -35,7 +36,6 @@ const DebounceSelect = <
if (fetchId !== fetchRef.current) { if (fetchId !== fetchRef.current) {
return; return;
} }
setOptions(newOptions); setOptions(newOptions);
setFetching(false); setFetching(false);
}); });
@ -51,7 +51,6 @@ const DebounceSelect = <
onSearch={debounceFetcher} onSearch={debounceFetcher}
notFoundContent={fetching ? <Spin size="small" /> : null} notFoundContent={fetching ? <Spin size="small" /> : null}
{...props} {...props}
options={options} options={options}
/> />
); );

View File

@ -95,6 +95,7 @@
.ec_right_end{ .ec_right_end{
position: absolute; position: absolute;
left: 0; left: 0;
cursor: pointer;
right: 0; right: 0;
bottom: 20px; bottom: 20px;
color: #fff; color: #fff;

View File

@ -1,4 +1,4 @@
import { Modal } from "antd"; import { Modal, Space } from "antd";
import { Store } from "antd/es/form/interface"; import { Store } from "antd/es/form/interface";
import { inject, observer } from "mobx-react"; import { inject, observer } from "mobx-react";
import { useState } from "react"; import { useState } from "react";
@ -9,6 +9,10 @@ import DebounceSelect from "@/components/form/featch_select";
interface UserValue { interface UserValue {
label: string; label: string;
value: string; value: string;
head_img: string;
age: number;
grid_letter_user: number;
pos_held: string;
} }
const Ec = (props: Store) => { const Ec = (props: Store) => {
const [isModalOpen, setIsModalOpen] = useState<boolean>(false); const [isModalOpen, setIsModalOpen] = useState<boolean>(false);
@ -27,6 +31,8 @@ const Ec = (props: Store) => {
return res.data.record.map((item) => ({ return res.data.record.map((item) => ({
label: item.user_name, label: item.user_name,
value: item.identity, value: item.identity,
identity: item.identity,
head_img:item.head_img,
})); }));
}); });
} }
@ -60,13 +66,18 @@ const Ec = (props: Store) => {
onChange={(newValue) => { onChange={(newValue) => {
setValue(newValue as UserValue[]); 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%" }} style={{ width: "100%" }}
/> />
<p></p>
{value.map((item: any) => { {value.map((item: any) => {
return ( return (
<div key={item.key}> <div key={item.key}>
<div>{item.label} : 线</div> <div>{item.label}</div>
<div> <div>
<PhoneTwoTone <PhoneTwoTone
@ -84,10 +95,10 @@ const Ec = (props: Store) => {
</div> </div>
<div className="ec_right"> <div className="ec_right">
<div style={{ display: "flex" }}> <div style={{ display: "flex" }}>
<video {/* <video
id="rtcVideo" id="rtcVideo"
style={{ width: "300px", height: "300px" }} style={{ width: "300px", height: "300px" }}
></video> ></video> */}
<video <video
id="remoteVideo" id="remoteVideo"
style={{ width: "300px", height: "300px" }} style={{ width: "300px", height: "300px" }}

View File

@ -46,6 +46,7 @@ const WhichVideo = (props) => {
return () => { return () => {
clearInterval(timer); clearInterval(timer);
}; };
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []); }, []);
return ( return (
<> <>

View File

@ -62,7 +62,7 @@ const Turn = (props: Store) => {
setImageUrl(item.file_url); setImageUrl(item.file_url);
}} }}
key={item.identity} key={item.identity}
style={{ width: "80px", height: "80px" }} style={{ width: "100%", height: "100px" }}
src={item.file_url} src={item.file_url}
alt="" alt=""
/> />
@ -72,11 +72,29 @@ const Turn = (props: Store) => {
let fileType = getFileTypeFromUrl(imageUrl); let fileType = getFileTypeFromUrl(imageUrl);
switch (fileType) { switch (fileType) {
case "jpeg": 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": 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": 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": case "pdf":
return ( return (
<div style={{ width: "100%", height: "500px" }}> <div style={{ width: "100%", height: "500px" }}>
@ -90,17 +108,17 @@ const Turn = (props: Store) => {
); );
case "mp4": case "mp4":
return ( return (
<div key={imageUrl} style={{ width: "100%", height: "600px" }}> <div key={imageUrl} style={{ width: "100%", height: "500px" }}>
<video <video
controls controls
style={{ width: "100%", height: "600px" }} style={{ width: "100%", height: "500px" }}
src={imageUrl} src={imageUrl}
></video> ></video>
</div> </div>
); );
case "docx": case "docx":
return ( return (
<div key={imageUrl} style={{ width: "100%", height: "600px" }}> <div key={imageUrl} style={{ width: "100%", height: "500px" }}>
<FileViewer <FileViewer
loader={undefined} loader={undefined}
src={imageUrl} src={imageUrl}
@ -112,9 +130,9 @@ const Turn = (props: Store) => {
</div> </div>
); );
case "": case "":
return <div style={{ width: "100%", height: "600px" }}></div>; return <div style={{ width: "100%", height: "500px" }}></div>;
default: default:
return <div style={{ width: "100%", height: "600px" }}></div>; return <div style={{ width: "100%", height: "500px" }}></div>;
} }
}; };
return ( return (
@ -139,15 +157,15 @@ const Turn = (props: Store) => {
> >
<div> <div>
<Row> <Row>
<Col span={2}> <Col span={3}>
<div style={{ color: "#fff" }}> <div style={{ color: "#fff" }}>
<div <div
style={{ style={{
height: "500px", height: "500px",
overflowY: "hidden", border: "1px solid rgb(51, 51, 51)",
border: "1px solid #fff",
padding: "10px", padding: "10px",
margin: "5px", margin: "5px",
overflowY: "scroll",
}} }}
> >
<p></p> <p></p>
@ -172,11 +190,12 @@ const Turn = (props: Store) => {
</div> </div>
</div> </div>
</Col> </Col>
<Col span={2}> <Col span={3}>
<div <div
style={{ style={{
height: "500px",
color: "#fff", color: "#fff",
border: "1px solid #fff", border: "1px solid rgb(51, 51, 51)",
padding: "10px", padding: "10px",
margin: "5px", margin: "5px",
}} }}
@ -201,11 +220,15 @@ const Turn = (props: Store) => {
})} })}
</div> </div>
</Col> </Col>
<Col span={2}> <Col span={3}>
<div style={{ color: "#fff", border: "1px solid #fff", <div
style={{
color: "#fff",
border: "1px solid rgb(51, 51, 51)",
padding: "10px", padding: "10px",
margin: "5px", }}> margin: "5px",
}}
>
<div style={{ height: "500px", overflowY: "scroll" }}> <div style={{ height: "500px", overflowY: "scroll" }}>
<p></p> <p></p>
{imageList?.map((item) => { {imageList?.map((item) => {
@ -270,7 +293,7 @@ const Turn = (props: Store) => {
</div> </div>
</div> </div>
</Col> </Col>
<Col span={18}> <Col span={15}>
<div <div
style={{ style={{
color: "#fff", color: "#fff",
@ -278,7 +301,7 @@ const Turn = (props: Store) => {
display: "flex", display: "flex",
alignItems: "center", alignItems: "center",
justifyContent: "center", justifyContent: "center",
padding:"10px" padding: "10px",
}} }}
> >
{preView()} {preView()}

View File

@ -179,7 +179,7 @@ const Ac = (props: Store) => {
<div style={{ display: "flex", alignItems: "flex-start" }}> <div style={{ display: "flex", alignItems: "flex-start" }}>
<div <div
style={{ style={{
border: "1px solid #fff", border: "1px solid rgb(51, 51, 51)",
width: "200px", width: "200px",
overflow: "auto", overflow: "auto",
height: "480px", height: "480px",
@ -207,9 +207,10 @@ const Ac = (props: Store) => {
); );
})} })}
</div> </div>
<div style={{ width: '10px' }}></div>
<div <div
style={{ style={{
border: "1px solid #fff", border: "1px solid rgb(51, 51, 51)",
width: "200px", width: "200px",
height: "480px", height: "480px",
overflow: "auto", overflow: "auto",
@ -234,6 +235,7 @@ const Ac = (props: Store) => {
); );
})} })}
</div> </div>
<div style={{ width: '10px' }}></div>
<div style={{height:"400px",flex:4}}> <div style={{height:"400px",flex:4}}>
{preView()} {preView()}
</div> </div>

View File

@ -4,5 +4,6 @@
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
border: 1px solid; border: 1px solid rgba(255, 255, 255, 0.3);
box-sizing: border-box;
} }

View File

@ -1,11 +1,13 @@
import Col from "antd/es/col";
import { Row } from "antd/lib/grid";
import * as echarts from "echarts"; import * as echarts from "echarts";
import "./kanban.less"; import "./kanban.less";
import { useEffect } from "react"; 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 = () => { const initChart = () => {
var myChart = echarts.init(document.getElementById("yibiaopan")); var myChart = echarts.init(document.getElementById("yibiaopan"));
var option = { var option = {
@ -15,30 +17,20 @@ const KanBan = () => {
center: ["50%", "70%"], center: ["50%", "70%"],
startAngle: 200, startAngle: 200,
endAngle: -20, endAngle: -20,
radius:70, radius: 100,
min: 0, min: 0,
max: 30, max: 30,
splitNumber: 12, splitNumber: 12,
itemStyle: { itemStyle: {
color: "#FFAB91", color: "#FFAB91",
}, },
axisLabel: {
distance: -20,
color: "#999",
fontSize: 20,
},
anchor: {
show: false,
},
title: {
show: true,
},
detail: { detail: {
valueAnimation: true, valueAnimation: true,
width: "40%", width: "40%",
lineHeight: 40, lineHeight: 80,
borderRadius: 8, borderRadius: 8,
offsetCenter: [0, "-10%"], offsetCenter: [0, "10%"],
fontSize: 20, fontSize: 20,
fontWeight: "bolder", fontWeight: "bolder",
formatter: "{value} °C", formatter: "{value} °C",
@ -54,12 +46,12 @@ const KanBan = () => {
type: "gauge", type: "gauge",
center: ["50%", "70%"], center: ["50%", "70%"],
startAngle: 200, startAngle: 200,
radius:70, radius: 80,
endAngle: -20, endAngle: 10,
min: 0, min: 0,
max: 60, max: 60,
itemStyle: { itemStyle: {
color: "#FD7347", color: "#FD7347"
}, },
progress: { progress: {
show: true, show: true,
@ -74,12 +66,8 @@ const KanBan = () => {
axisTick: { axisTick: {
show: false, show: false,
}, },
splitLine: { splitLine: { show: false },
show: false, axisLabel: { show: false },
},
axisLabel: {
show: false,
},
detail: { detail: {
show: false, show: false,
}, },
@ -93,7 +81,8 @@ const KanBan = () => {
}; };
option && myChart.setOption(option); option && myChart.setOption(option);
}; };
const sourece = (id: string) => {
const guoqi = (id: string, list: any) => {
var myChart = echarts.init(document.getElementById(id)); var myChart = echarts.init(document.getElementById(id));
var option = { var option = {
legend: { legend: {
@ -115,92 +104,19 @@ const KanBan = () => {
formatter: "{b}:{c}", formatter: "{b}:{c}",
}, },
}, },
data: [ data: list,
{ value: 40, name: "第三方" },
{ value: 18, name: "购买" },
{ value: 18, name: "自有" },
],
}, },
], ],
}; };
option && myChart.setOption(option); option && myChart.setOption(option);
}; };
const guoqi = (id: string) => {
var myChart = echarts.init(document.getElementById(id)); const gailan = (list) => {
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 = () => {
var myChart = echarts.init(document.getElementById("gailan")); var myChart = echarts.init(document.getElementById("gailan"));
var option = { var option = {
xAxis: { xAxis: {
type: "category", type: "category",
data: [ data: list.map((item) => item.name),
"个人携行",
"反恐维稳",
"反恐维稳",
"地震救援",
"防汛抗洪",
"灭火救援",
],
axisLabel: { axisLabel: {
show: true, show: true,
interval: 0, interval: 0,
@ -216,7 +132,7 @@ const KanBan = () => {
}, },
series: [ series: [
{ {
data: [820, 932, 901, 934, 1290, 1330], data: list.map((item) => item.value),
type: "line", type: "line",
smooth: true, smooth: true,
areaStyle: { areaStyle: {
@ -239,26 +155,54 @@ const KanBan = () => {
}; };
useEffect(() => { useEffect(() => {
initChart(); initChart();
sourece("sourece");
guoqi("yujing"); homeStore.getMm().then((res) => {
outin("baozhiqi"); gailan(res.data?.record ?? []);
sourece("level"); });
gailan(); 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 ( return (
<> <div style={{ marginBottom: "10px" }}>
<Row style={{ margin: "10px" }}> <div style={{ display: "flex" }} className="gutter-row">
<Col className="gutter-row" span={6}>
<div <div
className="kanban-item" style={{
style={{ backgroundColor: "rgba(37, 52, 70, 0.4)" }} flex: 1,
}}
>
<div
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 <p
style={{ style={{
backgroundColor: "#29ecb4", backgroundColor: "#29ecb4",
width: "100%", width: "100%",
padding: "10px", padding: "5px",
color: "#fff",
boxSizing: "border-box",
fontSize: "30px",
fontWeight: "800",
}} }}
> >
@ -266,17 +210,18 @@ const KanBan = () => {
<p <p
style={{ style={{
fontSize: "30px", fontSize: "30px",
margin: "0px", padding: "5px",
fontWeight: "800", fontWeight: "800",
color: "#29ecb4", color: "#29ecb4",
}} }}
> >
109 109
</p> </p>
<p style={{ color: "#29ecb4" }}>2024 / 12 / 12 09:10</p> <p style={{ color: "#29ecb4", padding: "5px" }}>
<Timer />
</p>
</div> </div>
</div> <div className="kanban-item">
<div className="kanban-item" style={{ margin: "10px 0px" }}>
<div> <div>
<div <div
id="yibiaopan" id="yibiaopan"
@ -284,44 +229,30 @@ const KanBan = () => {
></div> ></div>
</div> </div>
</div> </div>
<div className="kanban-item">
<div>
<div
id="sourece"
style={{ width: "240px", height: "240px" }}
></div>
</div> </div>
</div>
</Col>
<Col className="gutter-row" span={12}> <div style={{ flex: 2 }}>
<div className="kanban-item"> <div style={{ color: "#fff", textAlign: "center" }}></div>
<div></div>
</div> </div>
<div className="kanban-item" style={{ margin: "10px 0px" }}> <div style={{ flex: 1 }}>
<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 className="kanban-item"> <div className="kanban-item">
<div id="yujing" style={{ width: "240px", height: "240px" }}></div> <div id="yujing" style={{ width: "240px", height: "240px" }}></div>
</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 className="kanban-item">
<div id="level" style={{ width: "240px", height: "240px" }}></div> <div id="level" style={{ width: "240px", height: "240px" }}></div>
</div> </div>
</Col> </div>
</Row> </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));

View File

@ -118,6 +118,7 @@ const Material = (props: Store) => {
const edit = (record) => { const edit = (record) => {
setIsModalOpen(true); setIsModalOpen(true);
record.expiry_date = dayjs(record.expiry_date); record.expiry_date = dayjs(record.expiry_date);
record.supplie_piker=record.supplie_piker===""?[]:record.supplie_piker
setRecord(record); setRecord(record);
}; };
@ -130,7 +131,6 @@ const Material = (props: Store) => {
...values, ...values,
pid: values.pid ?? 0, pid: values.pid ?? 0,
storage_cloumn: Number(values.storage_cloumn), storage_cloumn: Number(values.storage_cloumn),
// supplie_piker: values.supplie_piker[0].name,
}; };
if (values.supplie_piker.length > 0) { if (values.supplie_piker.length > 0) {
data.supplie_piker = values.supplie_piker[0].name; data.supplie_piker = values.supplie_piker[0].name;

View File

@ -77,5 +77,6 @@ export const defaultConfig = [
label: "物资图片", label: "物资图片",
name: "supplie_piker", name: "supplie_piker",
value: [], value: [],
rules: [{ required: true, message: "请上传物资图片!" }],
}, },
]; ];

View File

@ -1,5 +1,4 @@
import { useEffect, useState } from "react"; import { useEffect, useState } from "react";
import * as echarts from "echarts";
import "./pv.less"; import "./pv.less";
import { SnippetsTwoTone } from "@ant-design/icons"; import { SnippetsTwoTone } from "@ant-design/icons";
import { inject, observer } from "mobx-react"; import { inject, observer } from "mobx-react";
@ -9,61 +8,13 @@ import PoverDetail from "../poverDetail";
const PoverPage = (props: Store) => { const PoverPage = (props: Store) => {
const { usrStore } = props; const { usrStore } = props;
const [poverData, setPover] = useState<any>(); 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(() => { useEffect(() => {
usrStore.getPover().then((e) => { 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); setPover(e.data);
}); });
}, [usrStore]); }, [usrStore]);
const serch = () => { const serch = (configs) => {
usrStore.getPoverList(config); usrStore.getPoverList(configs);
}; };
return ( return (
<div <div
@ -75,34 +26,52 @@ const PoverPage = (props: Store) => {
}} }}
> >
<div className="nav-header"> <div className="nav-header">
<div style={{ textAlign: "center", marginBottom: "20px" ,cursor:"pointer" }}> <div className="pv-head-item">
<SnippetsTwoTone style={{ fontSize: 30 }} />
<div <div
style={{ width: "150px", height: "100px" }}
id="pover_jgs"
onClick={() => { onClick={() => {
setConfig({ serch({
o_type: "01JAZAZDTHJE8FZ24GY9AJ758N",
size: 30,
offset: 1,
});
serch();
}}
></div>
<span style={{ color: "#fff" }}></span>
</div>
<div
style={{ textAlign: "center", marginBottom: "20px" }}
onClick={() => {
setConfig({
o_type: "01JAZB1GVJED5R34V6Z8MBWER4", o_type: "01JAZB1GVJED5R34V6Z8MBWER4",
size: 30, size: 30,
offset: 1, offset: 1,
}); });
serch();
}} }}
> >
<div style={{ width: "150px", height: "100%" }} id="pover_jg"></div> <div>{poverData?.o_types}</div>
<span style={{ color: "#fff" }}></span> <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,
});
}}
>
<div>{poverData?.o_type}</div>
<span></span>
</div>
</div>
<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> </div>
<div className="nav-content"> <div className="nav-content">
@ -115,12 +84,11 @@ const PoverPage = (props: Store) => {
<div <div
className="pv-head-item" className="pv-head-item"
onClick={(e) => { onClick={(e) => {
setConfig({ serch({
militia_type: 1, militia_type: 1,
size: 30, size: 30,
offset: 1, offset: 1,
}); });
serch();
}} }}
> >
<SnippetsTwoTone style={{ fontSize: 30 }} /> <SnippetsTwoTone style={{ fontSize: 30 }} />
@ -133,12 +101,11 @@ const PoverPage = (props: Store) => {
<SnippetsTwoTone style={{ fontSize: 30 }} /> <SnippetsTwoTone style={{ fontSize: 30 }} />
<div <div
onClick={() => { onClick={() => {
setConfig({ serch({
militia_type: 2, militia_type: 2,
size: 30, size: 30,
offset: 1, offset: 1,
}); });
serch();
}} }}
> >
<div>{poverData?.easy_meber}</div> <div>{poverData?.easy_meber}</div>
@ -149,18 +116,32 @@ const PoverPage = (props: Store) => {
<SnippetsTwoTone style={{ fontSize: 30 }} /> <SnippetsTwoTone style={{ fontSize: 30 }} />
<div <div
onClick={() => { onClick={() => {
setConfig({ serch({
vet: 1, vet: 1,
size: 30, size: 30,
offset: 1, offset: 1,
}); });
serch();
}} }}
> >
<div>{poverData?.vet_meber}</div> <div>{poverData?.vet_meber}</div>
<span>退</span> <span>退</span>
</div> </div>
</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>
<div className="content-right"> <div className="content-right">

View File

@ -14,7 +14,6 @@
justify-content: start; justify-content: start;
} }
.content-right { .content-right {
width: 85%;
height: 100%; height: 100%;
overflow: auto; overflow: auto;
text-align: center; text-align: center;

View File

@ -16,16 +16,32 @@ export const studyColumns: ColumnsType<UserDataType> = [
dataIndex: "tel", dataIndex: "tel",
}, },
{ {
title: "签到时间", title: "上午签到时间",
dataIndex: "created_at", dataIndex: "created_at",
render(leave_start_time) { render(leave_start_time) {
if (!leave_start_time){
return "未签到";
}
return dayjs(leave_start_time).format("YYYY-MM-DD HH:mm"); 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", dataIndex: "address",
}, },
{
title: "下午签到地址",
dataIndex: "pm_address",
},
// { // {
// title: "经度", // title: "经度",
// dataIndex: "long", // dataIndex: "long",
@ -65,5 +81,4 @@ export const serchConfig = [
value: "", value: "",
rules: [], rules: [],
}, },
]; ];

View File

@ -1,10 +1,9 @@
import { FormType } from "@/components/form/interface"; import { FormType } from "@/components/form/interface";
import { UserDataType } from "@/model/userModel"; import { UserDataType } from "@/model/userModel";
import { ColumnsType } from "antd/lib/table"; import { ColumnsType } from "antd/lib/table";
import { Avatar, Image } from "antd"; import { Avatar, Image, Tooltip } from "antd";
import { getAgeByIDCard, getBirthDateAndGender } from "@/util/util"; import { getAgeByIDCard, getBirthDateAndGender } from "@/util/util";
export const defaultConfig =(team,per)=> export const defaultConfig = (team, per) => [
[
{ {
type: FormType.input, type: FormType.input,
label: "用户名", label: "用户名",
@ -158,7 +157,7 @@ export const defaultConfig =(team,per)=>
type: FormType.cehckboxGroup, type: FormType.cehckboxGroup,
label: "所属队伍", label: "所属队伍",
name: "team_link_user", name: "team_link_user",
checkboxData:team, checkboxData: team,
value: "", value: "",
rules: [{ required: true, message: "请选择所属队伍" }], rules: [{ required: true, message: "请选择所属队伍" }],
}, },
@ -166,7 +165,7 @@ export const defaultConfig =(team,per)=>
type: FormType.cehckboxGroup, type: FormType.cehckboxGroup,
label: "个人身份属性", label: "个人身份属性",
name: "pers_link_user", name: "pers_link_user",
checkboxData:per, checkboxData: per,
value: "", value: "",
rules: [{ required: true, message: "请选择个人身份属性" }], rules: [{ required: true, message: "请选择个人身份属性" }],
}, },
@ -206,7 +205,6 @@ export const defaultConfig =(team,per)=>
value: "", value: "",
}, },
{ {
type: FormType.date, type: FormType.date,
label: "入伍时间", label: "入伍时间",
@ -279,7 +277,9 @@ export const columns: ColumnsType<UserDataType> = [
{ {
title: "性别", title: "性别",
width: 100, width: 100,
render: (render) => <span>{getBirthDateAndGender(render.id_card)?.gender}</span>, render: (render) => (
<span>{getBirthDateAndGender(render.id_card)?.gender}</span>
),
}, },
{ {
title: "年龄", title: "年龄",
@ -290,8 +290,10 @@ export const columns: ColumnsType<UserDataType> = [
title: "头像", title: "头像",
dataIndex: "head_img", dataIndex: "head_img",
width: 150, width: 150,
render: (head_img) =>{ render: (head_img) => {
return <Avatar size={64} shape="square" src={<Image src={head_img}></Image>} /> return (
<Avatar size={64} shape="square" src={<Image src={head_img}></Image>} />
);
}, },
}, },
{ {
@ -351,7 +353,15 @@ export const columns: ColumnsType<UserDataType> = [
}, },
{ {
title: "备注", title: "备注",
width: 300,
dataIndex: "remark", dataIndex: "remark",
ellipsis: {
showTitle: false,
},
width:200,
render: (remark) => (
<Tooltip placement="topLeft" title={remark}>
{remark}
</Tooltip>
),
}, },
]; ];

View File

@ -10,6 +10,7 @@ class HomeConfig {
static tr: string = "/v1/public/tr" static tr: string = "/v1/public/tr"
static af: string = "/v1/public/af" static af: string = "/v1/public/af"
static mm: string = "/v1/public/mm" static mm: string = "/v1/public/mm"
static mmb: string = "/v1/public/mmb"
static rm: string = "/v1/public/rm" static rm: string = "/v1/public/rm"
static ae: string = "/v1/public/ae" static ae: string = "/v1/public/ae"
static todo: string = "/v1/public/todo" static todo: string = "/v1/public/todo"
@ -63,6 +64,9 @@ class HomeStore extends BaseStore<TagDataType> {
async getRm() { async getRm() {
return await baseHttp.get(HomeConfig.rm, {}); return await baseHttp.get(HomeConfig.rm, {});
} }
async getmmb() {
return await baseHttp.get(HomeConfig.mmb, {});
}
async getAe() { async getAe() {
return await baseHttp.get(HomeConfig.ae, {}); return await baseHttp.get(HomeConfig.ae, {});
} }