fix(api):task crud
This commit is contained in:
parent
ba59eadd34
commit
35ec46e38c
|
@ -5,10 +5,12 @@ export enum FormType {
|
|||
select = "select",
|
||||
editor = "editor",
|
||||
date = "date",
|
||||
map = "map",
|
||||
textarea = "textarea",
|
||||
radio = "radio",
|
||||
upload = "upload",
|
||||
cehckbox = "checkbox",
|
||||
cehckboxGroup = "checkboxGroup",
|
||||
password = "password",
|
||||
}
|
||||
|
||||
|
@ -19,6 +21,7 @@ export interface FormDatas {
|
|||
value: any,
|
||||
selectUrl?: string,
|
||||
selectList?: Array<selectItem>
|
||||
checkboxData?: Array<any>,
|
||||
rules: Array<rules>
|
||||
}
|
||||
|
||||
|
|
|
@ -4,6 +4,7 @@ import { FormType, SimpleFormData } from "./interface";
|
|||
import { FormSelect } from "./select";
|
||||
import AliUpload from "../ali_upload";
|
||||
import MyEditor from "../edittor";
|
||||
import MapFrom from "../map/MapFrom";
|
||||
const { TextArea } = Input;
|
||||
const SimpleForm = (props: SimpleFormData) => {
|
||||
const [form] = Form.useForm();
|
||||
|
@ -28,9 +29,7 @@ const SimpleForm = (props: SimpleFormData) => {
|
|||
onFinish={onFinish}
|
||||
autoComplete="on"
|
||||
>
|
||||
{
|
||||
props.children??props.children
|
||||
}
|
||||
{props.children ?? props.children}
|
||||
{props.formDatas.map((v) => {
|
||||
switch (v.type) {
|
||||
case FormType.input:
|
||||
|
@ -66,6 +65,23 @@ const SimpleForm = (props: SimpleFormData) => {
|
|||
<Checkbox>Remember me</Checkbox>
|
||||
</Form.Item>
|
||||
);
|
||||
case FormType.cehckboxGroup:
|
||||
return (
|
||||
<Form.Item
|
||||
key={v.label}
|
||||
label={v.label}
|
||||
name={v.name}
|
||||
rules={v.rules}
|
||||
>
|
||||
<Checkbox.Group
|
||||
options={v.checkboxData}
|
||||
defaultValue={["Pear"]}
|
||||
onChange={(res) => {
|
||||
form.setFieldValue(v.name, res);
|
||||
}}
|
||||
/>
|
||||
</Form.Item>
|
||||
);
|
||||
case FormType.select:
|
||||
return FormSelect(v);
|
||||
case FormType.upload:
|
||||
|
@ -149,6 +165,19 @@ const SimpleForm = (props: SimpleFormData) => {
|
|||
<DatePicker />
|
||||
</Form.Item>
|
||||
);
|
||||
case FormType.map:
|
||||
return (
|
||||
<Form.Item
|
||||
key={v.label}
|
||||
label={v.label}
|
||||
name={v.name}
|
||||
rules={v.rules}
|
||||
>
|
||||
<MapFrom onChange={(m)=>{
|
||||
form.setFieldValue(v.name, m);
|
||||
}}/>
|
||||
</Form.Item>
|
||||
);
|
||||
default:
|
||||
return (
|
||||
<Form.Item
|
||||
|
@ -162,8 +191,6 @@ const SimpleForm = (props: SimpleFormData) => {
|
|||
);
|
||||
}
|
||||
})}
|
||||
|
||||
|
||||
</Form>
|
||||
);
|
||||
};
|
||||
|
|
|
@ -0,0 +1,65 @@
|
|||
import { useEffect, useState } from "react";
|
||||
import AMapLoader from "@amap/amap-jsapi-loader";
|
||||
|
||||
export default function MapFrom(props:any) {
|
||||
let [amap, setmaps] = useState<any>(null);
|
||||
useEffect(() => {
|
||||
loadMaps();
|
||||
return () => {
|
||||
amap?.destroy();
|
||||
};
|
||||
// eslint-disable-next-line react-hooks/exhaustive-deps
|
||||
}, []);
|
||||
|
||||
const loadMaps = async () => {
|
||||
const Amap = await AMapLoader.load({
|
||||
key: "d58999d072ed7e5897d3900a769cfda0", // 申请好的Web端开发者Key,首次调用 load 时必填
|
||||
version: "2.0", // 指定要加载的 JSAPI 的版本,缺省时默认为 1.4.15
|
||||
plugins: ["AMap.Scale", "AMap.AutoComplete", "AMap.PlaceSearch"],
|
||||
});
|
||||
amap = new Amap.Map("mapFrom", {
|
||||
viewMode: "2D", // 是否为3D地图模式
|
||||
zoom: 11, // 初始化地图级别
|
||||
center: [103.55, 30.34], // 初始化地图中心点位置
|
||||
});
|
||||
|
||||
Amap.plugin(["AMap.PlaceSearch", "AMap.AutoComplete"], function () {
|
||||
var auto = new Amap.AutoComplete({ input: "tipinput" });
|
||||
var placeSearch = new Amap.PlaceSearch({ map: amap }); //构造地点查询类
|
||||
auto.on("select", (e) => {
|
||||
placeSearch.setCity(e.poi.adcode);
|
||||
placeSearch.search(e.poi.name); //关键字查询查询
|
||||
}); //注册监听,当选中某条记录时会触发
|
||||
});
|
||||
var markers = []
|
||||
Amap.plugin(["AMap.MouseTool"], function () {
|
||||
var mouseTool = new Amap.MouseTool(amap);
|
||||
// 开启坐标选择功能
|
||||
mouseTool.on("draw", function (event) {
|
||||
var lnglat = event.obj.getBounds().getCenter(); // 获取图形的中心点坐标
|
||||
console.log("选择的坐标是:", lnglat.lng, lnglat.lat);
|
||||
markers = mouseTool.overlays.marker
|
||||
props.onChange({lng:lnglat.lng,lat:lnglat.lat})
|
||||
var mk = []
|
||||
for (let index = 0; index < markers.length-1; index++) {
|
||||
mk.push(markers[index])
|
||||
}
|
||||
amap.remove(mk);
|
||||
});
|
||||
mouseTool.marker();
|
||||
});
|
||||
setmaps(Amap);
|
||||
};
|
||||
|
||||
return (
|
||||
<div style={{ height: "400px", width: "400px" }}>
|
||||
<div style={{ position: "relative" }}>
|
||||
<div id="mapFrom" style={{ height: "400px", width: "400px" }}></div>
|
||||
<input
|
||||
style={{ position: "absolute", right: "5px", top: "5px" }}
|
||||
id="tipinput"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
|
@ -140,7 +140,7 @@ const Dep = (props: Store) => {
|
|||
formRef.current?.setFieldsValue(record);
|
||||
}}
|
||||
formName="card_basic"
|
||||
colProps={4}
|
||||
colProps={25}
|
||||
subBtnName="提交"
|
||||
formDatas={projectConfig}
|
||||
onFinish={onFinish}
|
||||
|
|
|
@ -0,0 +1,200 @@
|
|||
import { Button, Space, Modal, FormInstance } from "antd";
|
||||
import { inject, observer } from "mobx-react";
|
||||
import type { ColumnsType } from "antd/es/table";
|
||||
import BTable from "@/components/b_table";
|
||||
import { useEffect, useState } from "react";
|
||||
import { UserDataType } from "@/model/userModel";
|
||||
import { Store } from "antd/lib/form/interface";
|
||||
import SimpleForm from "@/components/form/simple_form";
|
||||
import React from "react";
|
||||
import { FormType } from "@/components/form/interface";
|
||||
import baseHttp from "@/service/base";
|
||||
|
||||
const Emergency = (props: Store) => {
|
||||
const { emergencyStore } = props;
|
||||
const [isModalOpen, setIsModalOpen] = useState<boolean>(false);
|
||||
const [projectConfig, setProjectConfig] = useState<any>([]);
|
||||
const formRef = React.useRef<FormInstance>(null);
|
||||
const [record, setRecord] = useState<any>(null);
|
||||
const [tagId, setId] = useState<Number | null>(null);
|
||||
const [userList, setUserList] = useState<Array<any>>([]);
|
||||
const columns: ColumnsType<UserDataType> = [
|
||||
{ title: "应急处突名称", dataIndex: "emergency_name" },
|
||||
{ title: "目标位置", dataIndex: "target_location" },
|
||||
{ title: "目标精度", dataIndex: "long" },
|
||||
{ title: "目标纬度", dataIndex: "lat" },
|
||||
{ title: "任务描述", dataIndex: "desc" },
|
||||
{
|
||||
title: "完成状态",
|
||||
dataIndex: "status",
|
||||
render: (accomplish) =>
|
||||
accomplish.status === 0 ? (
|
||||
<span style={{ color: "green" }}>进行中</span>
|
||||
) : (
|
||||
<span style={{ color: "red" }}>已完成</span>
|
||||
),
|
||||
},
|
||||
{
|
||||
title: "操作",
|
||||
dataIndex: "id",
|
||||
render: (any, record) => (
|
||||
<Space wrap>
|
||||
<Button
|
||||
type="dashed"
|
||||
size="small"
|
||||
onClick={() => {
|
||||
edit(record);
|
||||
}}
|
||||
>
|
||||
编辑
|
||||
</Button>
|
||||
<Button
|
||||
type="dashed"
|
||||
size="small"
|
||||
onClick={() => {
|
||||
emergencyStore.deleteItem(record.id);
|
||||
}}
|
||||
>
|
||||
完成
|
||||
</Button>
|
||||
<Button
|
||||
type="dashed"
|
||||
danger
|
||||
size="small"
|
||||
onClick={() => {
|
||||
dele(record)
|
||||
}}
|
||||
>
|
||||
删除
|
||||
</Button>
|
||||
</Space>
|
||||
),
|
||||
},
|
||||
];
|
||||
const dele = (record)=>{
|
||||
emergencyStore.deleteItem(record.identity);
|
||||
}
|
||||
const edit = (record) => {
|
||||
setProjectConfig(defaultConfig);
|
||||
|
||||
setIsModalOpen(true);
|
||||
formRef.current?.setFieldsValue(record);
|
||||
setRecord(record);
|
||||
setId(record.id);
|
||||
};
|
||||
const onFinish = (values: any) => {
|
||||
let data = {
|
||||
...values,
|
||||
long: values.marker["lng"],
|
||||
lat: values.marker["lat"],
|
||||
};
|
||||
if (!tagId) {
|
||||
emergencyStore.add(data);
|
||||
} else {
|
||||
emergencyStore.putItem(tagId, data);
|
||||
}
|
||||
setIsModalOpen(false);
|
||||
};
|
||||
useEffect(() => {
|
||||
emergencyStore.getlist();
|
||||
baseHttp.get("/user/list", null).then((res) => {
|
||||
let data = res.data?.record ?? [];
|
||||
data.forEach((item) => {
|
||||
item.label = item.account;
|
||||
item.value = item.identity;
|
||||
});
|
||||
setUserList(data ?? []);
|
||||
});
|
||||
}, [emergencyStore]);
|
||||
const defaultConfig = [
|
||||
{
|
||||
type: FormType.input,
|
||||
label: "处突名称",
|
||||
name: "emergency_name",
|
||||
value: "",
|
||||
rules: [{ required: true, message: "请输入处突名称!" }],
|
||||
},
|
||||
{
|
||||
type: FormType.input,
|
||||
label: "任务描述",
|
||||
name: "desc",
|
||||
value: "",
|
||||
rules: [{ required: true, message: "请输入任务描述!" }],
|
||||
},
|
||||
{
|
||||
type: FormType.input,
|
||||
label: "目标位置",
|
||||
name: "target_location",
|
||||
value: "",
|
||||
rules: [{ required: true, message: "请输入任务描述!" }],
|
||||
},
|
||||
{
|
||||
type: FormType.map,
|
||||
label: "坐标信息",
|
||||
name: "marker",
|
||||
value: "",
|
||||
rules: [{ required: true, message: "请输入任务描述!" }],
|
||||
},
|
||||
{
|
||||
type: FormType.cehckboxGroup,
|
||||
label: "参与人员选择",
|
||||
name: "user_id",
|
||||
value: [],
|
||||
checkboxData: userList,
|
||||
rules: [{ required: true, message: "请选择参与人员!" }],
|
||||
},
|
||||
];
|
||||
const onFinishFailed = () => {};
|
||||
// 用户选择回调
|
||||
return (
|
||||
<div className="contentBox">
|
||||
<Space direction="vertical" size="middle" style={{ display: "flex" }}>
|
||||
<Space direction="horizontal" size={"middle"}>
|
||||
<Button
|
||||
type="default"
|
||||
onClick={() => {
|
||||
setProjectConfig(defaultConfig);
|
||||
setId(null);
|
||||
setIsModalOpen(true);
|
||||
}}
|
||||
>
|
||||
任务发布
|
||||
</Button>
|
||||
</Space>
|
||||
|
||||
<BTable
|
||||
store={emergencyStore}
|
||||
columns={columns}
|
||||
dataSource={emergencyStore.list}
|
||||
/>
|
||||
<Modal
|
||||
title={!tagId ? "任务发布" : "任务编辑"}
|
||||
width={1200}
|
||||
open={isModalOpen}
|
||||
afterClose={() => formRef.current?.resetFields()}
|
||||
onOk={() => formRef.current?.submit()}
|
||||
onCancel={() => {
|
||||
setId(null);
|
||||
setIsModalOpen(false);
|
||||
}}
|
||||
>
|
||||
<SimpleForm
|
||||
formRef={formRef}
|
||||
createCallback={() => {
|
||||
formRef.current?.setFieldsValue(record);
|
||||
}}
|
||||
formName="card_basic"
|
||||
colProps={25}
|
||||
subBtnName="提交"
|
||||
formDatas={projectConfig}
|
||||
onFinish={onFinish}
|
||||
initialValues={true}
|
||||
onFinishFailed={onFinishFailed}
|
||||
/>
|
||||
</Modal>
|
||||
</Space>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default inject("emergencyStore")(observer(Emergency));
|
|
@ -0,0 +1,224 @@
|
|||
// const Patrol = ()=>{
|
||||
// return <>
|
||||
// <p>巡逻</p>
|
||||
// </>
|
||||
// }
|
||||
|
||||
// export default Patrol
|
||||
|
||||
import { Button, Space, Modal, FormInstance } from "antd";
|
||||
import { inject, observer } from "mobx-react";
|
||||
import type { ColumnsType } from "antd/es/table";
|
||||
import BTable from "@/components/b_table";
|
||||
import { useEffect, useState } from "react";
|
||||
import { UserDataType } from "@/model/userModel";
|
||||
import { Store } from "antd/lib/form/interface";
|
||||
import SimpleForm from "@/components/form/simple_form";
|
||||
import React from "react";
|
||||
import { FormType } from "@/components/form/interface";
|
||||
import baseHttp from "@/service/base";
|
||||
import dayjs from "dayjs";
|
||||
|
||||
const Patrol = (props: Store) => {
|
||||
const { patrolStore } = props;
|
||||
const [isModalOpen, setIsModalOpen] = useState<boolean>(false);
|
||||
const [projectConfig, setProjectConfig] = useState<any>([]);
|
||||
const formRef = React.useRef<FormInstance>(null);
|
||||
const [record, setRecord] = useState<any>(null);
|
||||
const [tagId, setId] = useState<Number | null>(null);
|
||||
const [userList, setUserList] = useState<Array<any>>([]);
|
||||
const columns: ColumnsType<UserDataType> = [
|
||||
{ title: "任务标题", dataIndex: "title" },
|
||||
{ title: "任务描述", dataIndex: "patrol_desc" },
|
||||
{ title: "任务地点", dataIndex: "address" },
|
||||
{ title: "任务开始时间", dataIndex: "start_time" },
|
||||
{ title: "任务结束时间", dataIndex: "end_time" },
|
||||
{ title: "任务积分", dataIndex: "score" },
|
||||
{
|
||||
title: "完成状态",
|
||||
dataIndex: "status",
|
||||
render: (status) =>
|
||||
status === 0 ? (
|
||||
<span>进行中</span>
|
||||
) : (
|
||||
<span style={{ color: "red" }}>已完成</span>
|
||||
),
|
||||
},
|
||||
{
|
||||
title: "操作",
|
||||
dataIndex: "id",
|
||||
render: (any, record) => (
|
||||
<Space wrap>
|
||||
<Button
|
||||
type="dashed"
|
||||
size="small"
|
||||
onClick={() => {
|
||||
edit(record);
|
||||
}}
|
||||
>
|
||||
编辑
|
||||
</Button>
|
||||
<Button
|
||||
type="dashed"
|
||||
size="small"
|
||||
onClick={() => {
|
||||
patrolStore.deleteItem(record.id);
|
||||
}}
|
||||
>
|
||||
完成
|
||||
</Button>
|
||||
<Button
|
||||
type="dashed"
|
||||
danger
|
||||
size="small"
|
||||
onClick={() => {
|
||||
patrolStore.deleteItem(record.id);
|
||||
}}
|
||||
>
|
||||
删除
|
||||
</Button>
|
||||
</Space>
|
||||
),
|
||||
},
|
||||
];
|
||||
const edit = (record) => {
|
||||
let data = {
|
||||
...record,
|
||||
start_time: dayjs(record.start_time),
|
||||
end_time: dayjs(record.end_time),
|
||||
};
|
||||
setProjectConfig(defaultConfig);
|
||||
setIsModalOpen(true);
|
||||
formRef.current?.setFieldsValue(data);
|
||||
setRecord(data);
|
||||
setId(record.id);
|
||||
};
|
||||
const onFinish = (values: any) => {
|
||||
let data = {
|
||||
...values,
|
||||
score: Number(values.score ?? 0),
|
||||
};
|
||||
if (!tagId) {
|
||||
patrolStore.add(data);
|
||||
} else {
|
||||
patrolStore.putItem(tagId, data);
|
||||
}
|
||||
setIsModalOpen(false);
|
||||
};
|
||||
useEffect(() => {
|
||||
patrolStore.getlist();
|
||||
baseHttp.get("/user/list", null).then((res) => {
|
||||
let data = res.data?.record ?? [];
|
||||
data.forEach((item) => {
|
||||
item.label = item.account;
|
||||
item.value = item.identity;
|
||||
});
|
||||
setUserList(data ?? []);
|
||||
});
|
||||
}, [patrolStore]);
|
||||
const defaultConfig = [
|
||||
{
|
||||
type: FormType.input,
|
||||
label: "任务标题",
|
||||
name: "title",
|
||||
value: "",
|
||||
rules: [{ required: true, message: "请输入任务标题!" }],
|
||||
},
|
||||
{
|
||||
type: FormType.input,
|
||||
label: "任务描述",
|
||||
name: "patrol_desc",
|
||||
value: "",
|
||||
rules: [{ required: true, message: "请输入任务描述!" }],
|
||||
},
|
||||
{
|
||||
type: FormType.input,
|
||||
label: "巡逻地点",
|
||||
name: "address",
|
||||
value: "",
|
||||
rules: [{ required: true, message: "请输入巡逻地点!" }],
|
||||
},
|
||||
{
|
||||
type: FormType.date,
|
||||
label: "开始时间",
|
||||
name: "start_time",
|
||||
value: "",
|
||||
rules: [{ required: true, message: "请输入任务开始时间!" }],
|
||||
},
|
||||
{
|
||||
type: FormType.date,
|
||||
label: "任务结束时间",
|
||||
name: "end_time",
|
||||
value: "",
|
||||
rules: [{ required: true, message: "请选择任务结束时间!" }],
|
||||
},
|
||||
{
|
||||
type: FormType.input,
|
||||
label: "任务积分设置",
|
||||
name: "score",
|
||||
value: "",
|
||||
rules: [{ required: true, message: "请输入任务积分!" }],
|
||||
},
|
||||
{
|
||||
type: FormType.cehckboxGroup,
|
||||
label: "任务参与人",
|
||||
name: "user_identity",
|
||||
value: [],
|
||||
checkboxData: userList,
|
||||
rules: [{ required: true, message: "请选择参与人!" }],
|
||||
},
|
||||
];
|
||||
const onFinishFailed = () => {};
|
||||
// 用户选择回调
|
||||
return (
|
||||
<div className="contentBox">
|
||||
<Space direction="vertical" size="middle" style={{ display: "flex" }}>
|
||||
<Space direction="horizontal" size={"middle"}>
|
||||
<Button
|
||||
type="default"
|
||||
onClick={() => {
|
||||
setProjectConfig(defaultConfig);
|
||||
setId(null);
|
||||
setIsModalOpen(true);
|
||||
}}
|
||||
>
|
||||
任务发布
|
||||
</Button>
|
||||
</Space>
|
||||
|
||||
<BTable
|
||||
store={patrolStore}
|
||||
columns={columns}
|
||||
dataSource={patrolStore.list}
|
||||
/>
|
||||
<Modal
|
||||
title={!tagId ? "任务发布" : "任务编辑"}
|
||||
width={1200}
|
||||
open={isModalOpen}
|
||||
afterClose={() => formRef.current?.resetFields()}
|
||||
onOk={() => formRef.current?.submit()}
|
||||
onCancel={() => {
|
||||
setId(null);
|
||||
setIsModalOpen(false);
|
||||
}}
|
||||
>
|
||||
<SimpleForm
|
||||
formRef={formRef}
|
||||
createCallback={() => {
|
||||
formRef.current?.setFieldsValue(record);
|
||||
}}
|
||||
formName="card_basic"
|
||||
colProps={12}
|
||||
subBtnName="提交"
|
||||
formDatas={projectConfig}
|
||||
onFinish={onFinish}
|
||||
initialValues={true}
|
||||
onFinishFailed={onFinishFailed}
|
||||
/>
|
||||
</Modal>
|
||||
</Space>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default inject("patrolStore")(observer(Patrol));
|
|
@ -0,0 +1,28 @@
|
|||
import { Tabs, TabsProps } from "antd";
|
||||
import Trainings from "./training";
|
||||
import TrainingCat from "./trainingCat";
|
||||
|
||||
const Training = ()=>{
|
||||
const onChange = (key: string) => {
|
||||
console.log(key);
|
||||
};
|
||||
const items: TabsProps['items'] = [
|
||||
{
|
||||
key: '1',
|
||||
label: '训练分类管理',
|
||||
children: <TrainingCat />,
|
||||
},
|
||||
{
|
||||
key: '2',
|
||||
label: '训练任务管理',
|
||||
children: <Trainings />
|
||||
},
|
||||
];
|
||||
return (
|
||||
<>
|
||||
<Tabs defaultActiveKey="1" items={items} onChange={onChange} />
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
export default Training
|
|
@ -0,0 +1,230 @@
|
|||
import { Button, Space, Modal, FormInstance, Form, Select } from "antd";
|
||||
import { inject, observer } from "mobx-react";
|
||||
import type { ColumnsType } from "antd/es/table";
|
||||
import BTable from "@/components/b_table";
|
||||
import { useEffect, useState } from "react";
|
||||
import { UserDataType } from "@/model/userModel";
|
||||
import { Store } from "antd/lib/form/interface";
|
||||
import SimpleForm from "@/components/form/simple_form";
|
||||
import React from "react";
|
||||
import { FormType } from "@/components/form/interface";
|
||||
import baseHttp from "@/service/base";
|
||||
import dayjs from "dayjs";
|
||||
const { Option } = Select;
|
||||
|
||||
|
||||
|
||||
const Trainings = (props: Store) => {
|
||||
const { trainingStore, trainingCatStore } = props;
|
||||
const [isModalOpen, setIsModalOpen] = useState<boolean>(false);
|
||||
const [projectConfig, setProjectConfig] = useState<any>([]);
|
||||
const formRef = React.useRef<FormInstance>(null);
|
||||
const [record, setRecord] = useState<any>(null);
|
||||
const [tagId, setId] = useState<Number | null>(null);
|
||||
const [stashList, setStash] = useState<any>(null); // 仓库列表
|
||||
const [userList, setUserList] = useState<Array<any>>([]);
|
||||
const columns: ColumnsType<UserDataType> = [
|
||||
{ title: "任务标题", dataIndex: "title" },
|
||||
{ title: "任务描述", dataIndex: "desc" },
|
||||
{ title: "任务地点", dataIndex: "address" },
|
||||
{ title: "任务开始时间", dataIndex: "start_time" },
|
||||
{ title: "任务结束时间", dataIndex: "end_time" },
|
||||
{ title: "任务积分设置", dataIndex: "score" },
|
||||
{ title: "任务类别", dataIndex: "category_identity" },
|
||||
{
|
||||
title: "操作",
|
||||
dataIndex: "id",
|
||||
render: (any, record) => (
|
||||
<Space wrap>
|
||||
<Button
|
||||
type="dashed"
|
||||
size="small"
|
||||
onClick={() => {
|
||||
edit(record);
|
||||
}}
|
||||
>
|
||||
编辑
|
||||
</Button>
|
||||
<Button
|
||||
type="dashed"
|
||||
danger
|
||||
size="small"
|
||||
onClick={() => {
|
||||
dele(record);
|
||||
}}
|
||||
>
|
||||
删除
|
||||
</Button>
|
||||
</Space>
|
||||
),
|
||||
},
|
||||
];
|
||||
const dele = (record) => {
|
||||
trainingStore.deleteItem(record.identity);
|
||||
};
|
||||
const edit = (record) => {
|
||||
let data = {
|
||||
...record,
|
||||
start_time: dayjs(record.start_time),
|
||||
end_time: dayjs(record.end_time),
|
||||
};
|
||||
setProjectConfig(defaultConfig);
|
||||
setIsModalOpen(true);
|
||||
formRef.current?.setFieldsValue(data);
|
||||
setRecord(data);
|
||||
setId(record.id);
|
||||
};
|
||||
useEffect(() => {
|
||||
trainingCatStore.getlist().then(() => {
|
||||
setStash(trainingCatStore.list);
|
||||
});
|
||||
baseHttp.get("/user/list", null).then((res) => {
|
||||
let data = res.data?.record ?? [];
|
||||
data.forEach((item) => {
|
||||
item.label = item.account;
|
||||
item.value = item.identity;
|
||||
});
|
||||
setUserList(data ?? []);
|
||||
});
|
||||
}, [trainingCatStore]);
|
||||
|
||||
const onFinish = (values: any) => {
|
||||
let data = {
|
||||
...values,
|
||||
score: Number(values.score),
|
||||
};
|
||||
if (!tagId) {
|
||||
trainingStore.add(data);
|
||||
} else {
|
||||
trainingStore.putItem(tagId, data);
|
||||
}
|
||||
setIsModalOpen(false);
|
||||
};
|
||||
useEffect(() => {
|
||||
trainingStore.getlist();
|
||||
}, [trainingStore]);
|
||||
const defaultConfig = [
|
||||
{
|
||||
type: FormType.input,
|
||||
label: "任务标题",
|
||||
name: "title",
|
||||
value: "",
|
||||
rules: [{ required: true, message: "请输入任务标题!" }],
|
||||
},
|
||||
{
|
||||
type: FormType.input,
|
||||
label: "任务描述",
|
||||
name: "desc",
|
||||
value: "",
|
||||
rules: [{ required: true, message: "请输入任务描述!" }],
|
||||
},
|
||||
{
|
||||
type: FormType.input,
|
||||
label: "任务地点",
|
||||
name: "address",
|
||||
value: "",
|
||||
rules: [{ required: true, message: "请输入任务地点!" }],
|
||||
},
|
||||
{
|
||||
type: FormType.date,
|
||||
label: "任务开始时间",
|
||||
name: "start_time",
|
||||
value: "",
|
||||
rules: [{ required: true, message: "请输入任务开始时间!" }],
|
||||
},
|
||||
{
|
||||
type: FormType.date,
|
||||
label: "任务结束时间",
|
||||
name: "end_time",
|
||||
value: "",
|
||||
rules: [{ required: true, message: "请输入任务结束时间!" }],
|
||||
},
|
||||
{
|
||||
type: FormType.input,
|
||||
label: "任务积分设置",
|
||||
name: "score",
|
||||
value: "",
|
||||
rules: [{ required: true, message: "请输入任务积分设置!" }],
|
||||
},
|
||||
{
|
||||
type: FormType.cehckboxGroup,
|
||||
label: "参与人员选择",
|
||||
name: "user_id",
|
||||
value: [],
|
||||
checkboxData: userList,
|
||||
rules: [{ required: true, message: "请选择参与人员!" }],
|
||||
},
|
||||
];
|
||||
const onFinishFailed = () => {};
|
||||
// 用户选择回调
|
||||
return (
|
||||
<div className="contentBox">
|
||||
<Space direction="vertical" size="middle" style={{ display: "flex" }}>
|
||||
<Space direction="horizontal" size={"middle"}>
|
||||
<Button
|
||||
type="default"
|
||||
onClick={() => {
|
||||
setProjectConfig(defaultConfig);
|
||||
setId(null);
|
||||
setIsModalOpen(true);
|
||||
}}
|
||||
>
|
||||
任务发布
|
||||
</Button>
|
||||
</Space>
|
||||
|
||||
<BTable
|
||||
store={trainingStore}
|
||||
columns={columns}
|
||||
dataSource={trainingStore.list}
|
||||
/>
|
||||
<Modal
|
||||
title={!tagId ? "任务发布" : "任务编辑"}
|
||||
width={800}
|
||||
open={isModalOpen}
|
||||
afterClose={() => formRef.current?.resetFields()}
|
||||
onOk={() => formRef.current?.submit()}
|
||||
onCancel={() => {
|
||||
setId(null);
|
||||
setIsModalOpen(false);
|
||||
}}
|
||||
>
|
||||
<SimpleForm
|
||||
formRef={formRef}
|
||||
createCallback={() => {
|
||||
formRef.current?.setFieldsValue(record);
|
||||
}}
|
||||
formName="card_basic"
|
||||
colProps={25}
|
||||
subBtnName="提交"
|
||||
formDatas={projectConfig}
|
||||
onFinish={onFinish}
|
||||
initialValues={true}
|
||||
onFinishFailed={onFinishFailed}
|
||||
>
|
||||
<>
|
||||
<Form.Item
|
||||
key="category_identity"
|
||||
label="训练类别"
|
||||
name="category_identity"
|
||||
rules={[{ required: true, message: "请选择训练类别!" }]}
|
||||
>
|
||||
<Select placeholder="">
|
||||
{stashList?.map((v: any) => {
|
||||
return (
|
||||
<Option key={v.identity} value={v.identity}>
|
||||
{v.name}
|
||||
</Option>
|
||||
);
|
||||
})}
|
||||
</Select>
|
||||
</Form.Item>
|
||||
</>
|
||||
</SimpleForm>
|
||||
</Modal>
|
||||
</Space>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default inject("trainingStore", "trainingCatStore")(observer(Trainings));
|
|
@ -0,0 +1,154 @@
|
|||
// const TrainingCat = () => {
|
||||
// return (
|
||||
// <>
|
||||
// <p>训练分类管理</p>
|
||||
// </>
|
||||
// );
|
||||
// };
|
||||
// export default TrainingCat;
|
||||
|
||||
|
||||
import { Button, Space, Modal, FormInstance } from "antd";
|
||||
import { inject, observer } from "mobx-react";
|
||||
import type { ColumnsType } from "antd/es/table";
|
||||
import BTable from "@/components/b_table";
|
||||
import { useEffect, useState } from "react";
|
||||
import { UserDataType } from "@/model/userModel";
|
||||
import { Store } from "antd/lib/form/interface";
|
||||
import SimpleForm from "@/components/form/simple_form";
|
||||
import React from "react";
|
||||
import { FormType } from "@/components/form/interface";
|
||||
|
||||
const TrainingCat = (props: Store) => {
|
||||
const { trainingCatStore } = props;
|
||||
const [isModalOpen, setIsModalOpen] = useState<boolean>(false);
|
||||
const [projectConfig, setProjectConfig] = useState<any>([]);
|
||||
const formRef = React.useRef<FormInstance>(null);
|
||||
const [record, setRecord] = useState<any>(null);
|
||||
const [tagId, setId] = useState<Number | null>(null);
|
||||
const columns: ColumnsType<UserDataType> = [
|
||||
{ title: "名称", dataIndex: "name" },
|
||||
{ title: "任务描述", dataIndex: "desc" },
|
||||
{
|
||||
title: "操作",
|
||||
dataIndex: "id",
|
||||
render: (any, record) => (
|
||||
<Space wrap>
|
||||
<Button
|
||||
type="dashed"
|
||||
size="small"
|
||||
onClick={() => {
|
||||
edit(record);
|
||||
}}
|
||||
>
|
||||
编辑
|
||||
</Button>
|
||||
<Button
|
||||
type="dashed"
|
||||
danger
|
||||
size="small"
|
||||
onClick={() => {
|
||||
dele(record)
|
||||
}}
|
||||
>
|
||||
删除
|
||||
</Button>
|
||||
</Space>
|
||||
),
|
||||
},
|
||||
];
|
||||
const dele = (record)=>{
|
||||
trainingCatStore.deleteItem(record.identity);
|
||||
}
|
||||
const edit = (record) => {
|
||||
setProjectConfig(defaultConfig);
|
||||
|
||||
setIsModalOpen(true);
|
||||
formRef.current?.setFieldsValue(record);
|
||||
setRecord(record);
|
||||
setId(record.id);
|
||||
};
|
||||
const onFinish = (values: any) => {
|
||||
let data = {
|
||||
...values,
|
||||
};
|
||||
if (!tagId) {
|
||||
trainingCatStore.add(data);
|
||||
} else {
|
||||
trainingCatStore.putItem(tagId, data);
|
||||
}
|
||||
setIsModalOpen(false);
|
||||
};
|
||||
useEffect(() => {
|
||||
trainingCatStore.getlist();
|
||||
}, [trainingCatStore]);
|
||||
const defaultConfig = [
|
||||
{
|
||||
type: FormType.input,
|
||||
label: "分类名称",
|
||||
name: "name",
|
||||
value: "",
|
||||
rules: [{ required: true, message: "请输入名称!" }],
|
||||
},
|
||||
{
|
||||
type: FormType.input,
|
||||
label: "描述",
|
||||
name: "desc",
|
||||
value: "",
|
||||
rules: [{ required: true, message: "请输入描述!" }],
|
||||
},
|
||||
];
|
||||
const onFinishFailed = () => {};
|
||||
// 用户选择回调
|
||||
return (
|
||||
<div className="contentBox">
|
||||
<Space direction="vertical" size="middle" style={{ display: "flex" }}>
|
||||
<Space direction="horizontal" size={"middle"}>
|
||||
<Button
|
||||
type="default"
|
||||
onClick={() => {
|
||||
setProjectConfig(defaultConfig);
|
||||
setId(null);
|
||||
setIsModalOpen(true);
|
||||
}}
|
||||
>
|
||||
添加分类
|
||||
</Button>
|
||||
</Space>
|
||||
|
||||
<BTable
|
||||
store={trainingCatStore}
|
||||
columns={columns}
|
||||
dataSource={trainingCatStore.list}
|
||||
/>
|
||||
<Modal
|
||||
title={!tagId ? "任务发布" : "任务编辑"}
|
||||
width={1200}
|
||||
open={isModalOpen}
|
||||
afterClose={() => formRef.current?.resetFields()}
|
||||
onOk={() => formRef.current?.submit()}
|
||||
onCancel={() => {
|
||||
setId(null);
|
||||
setIsModalOpen(false);
|
||||
}}
|
||||
>
|
||||
<SimpleForm
|
||||
formRef={formRef}
|
||||
createCallback={() => {
|
||||
formRef.current?.setFieldsValue(record);
|
||||
}}
|
||||
formName="card_basic"
|
||||
colProps={12}
|
||||
subBtnName="提交"
|
||||
formDatas={projectConfig}
|
||||
onFinish={onFinish}
|
||||
initialValues={true}
|
||||
onFinishFailed={onFinishFailed}
|
||||
/>
|
||||
</Modal>
|
||||
</Space>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default inject("trainingCatStore")(observer(TrainingCat));
|
|
@ -8,6 +8,7 @@ import { Store } from "antd/lib/form/interface";
|
|||
import "./user.less";
|
||||
import SimpleForm from "@/components/form/simple_form";
|
||||
import React from "react";
|
||||
import { FormType } from "@/components/form/interface";
|
||||
|
||||
const User = (props: Store) => {
|
||||
const { usrStore } = props;
|
||||
|
@ -106,46 +107,40 @@ const User = (props: Store) => {
|
|||
}, [usrStore]);
|
||||
const defaultConfig = [
|
||||
{
|
||||
type: "input",
|
||||
type: FormType.input,
|
||||
label: "用户名",
|
||||
name: "acount",
|
||||
value: "",
|
||||
rules: [{ required: true, message: "请输入人物名称!" }],
|
||||
},
|
||||
{
|
||||
type: "input",
|
||||
type: FormType.input,
|
||||
label: "年龄",
|
||||
name: "age",
|
||||
value: "",
|
||||
rules: [{ required: true, message: "请输入卡片内容" }],
|
||||
},
|
||||
{
|
||||
type: "input",
|
||||
type: FormType.input,
|
||||
label: "居住地",
|
||||
name: "address",
|
||||
value: "",
|
||||
rules: [{ required: true, message: "请输入卡片内容" }],
|
||||
},
|
||||
{
|
||||
type: "Radio",
|
||||
type: FormType.radio,
|
||||
label: "性别",
|
||||
name: "sex",
|
||||
value: 0,
|
||||
rules: [{ required: true, message: "请输入卡片内容" }],
|
||||
},
|
||||
{
|
||||
type: "upload",
|
||||
type: FormType.upload,
|
||||
label: "头像",
|
||||
name: "headImg",
|
||||
value: [],
|
||||
rules: [{ required: true, message: "请上传头像" }],
|
||||
},
|
||||
{
|
||||
type: "input",
|
||||
label: "角色",
|
||||
name: "role",
|
||||
value: "",
|
||||
},
|
||||
];
|
||||
const onFinishFailed = () => {};
|
||||
return (
|
||||
|
@ -162,7 +157,6 @@ const User = (props: Store) => {
|
|||
>
|
||||
添加用户
|
||||
</Button>
|
||||
|
||||
</Space>
|
||||
|
||||
<BTable store={usrStore} columns={columns} dataSource={usrStore.list} />
|
||||
|
@ -183,7 +177,7 @@ const User = (props: Store) => {
|
|||
formRef.current?.setFieldsValue(record);
|
||||
}}
|
||||
formName="card_basic"
|
||||
colProps={4}
|
||||
colProps={25}
|
||||
subBtnName="提交"
|
||||
formDatas={projectConfig}
|
||||
onFinish={onFinish}
|
||||
|
|
|
@ -13,6 +13,9 @@ import User from "@/pages/user/user";
|
|||
import WhseMgmt from "@/pages/whseMgmt";
|
||||
import Storage from "@/pages/storage";
|
||||
import WhseMgmtRoute from "@/pages/whseMgmt/whseMgmt_route";
|
||||
import Emergency from "@/pages/emergency";
|
||||
import Patrol from "@/pages/patrol";
|
||||
import Training from "@/pages/training";
|
||||
export const homeRouter = [
|
||||
{
|
||||
path: "/",
|
||||
|
@ -78,6 +81,21 @@ export const homeRouter = [
|
|||
index: true,
|
||||
element: <TeamMgmt />,
|
||||
},
|
||||
{
|
||||
path: "/admin/emergency",
|
||||
index: true,
|
||||
element: <Emergency />,
|
||||
},
|
||||
{
|
||||
path: "/admin/patrol",
|
||||
index: true,
|
||||
element: <Patrol />,
|
||||
},
|
||||
{
|
||||
path: "/admin/training",
|
||||
index: true,
|
||||
element: <Training />,
|
||||
},
|
||||
{
|
||||
path: "/admin/whse",
|
||||
element: <WhseMgmtRoute />,
|
||||
|
|
|
@ -0,0 +1,28 @@
|
|||
import { action, makeObservable } from "mobx";
|
||||
// 档案分类
|
||||
import BaseStore from "./baseStore";
|
||||
import { TagDataType } from "@/model/userModel";
|
||||
import baseHttp from "@/service/base";
|
||||
|
||||
|
||||
class EmergencyConfig {
|
||||
static LIST: string = "emerg/list"
|
||||
static ADD: string = "emerg"
|
||||
static DELETE: string = "emerg"
|
||||
static EDIT: string = "emerg"
|
||||
static ACCESS: string = "emerg/accept"
|
||||
}
|
||||
class EmergencyStore extends BaseStore<TagDataType> {
|
||||
constructor() {
|
||||
super(EmergencyConfig)
|
||||
makeObservable(this, {
|
||||
access: action
|
||||
})
|
||||
}
|
||||
async access(id: number, param: any) {
|
||||
await baseHttp.put(EmergencyConfig.ACCESS + "/" + id, param)
|
||||
this.getlist()
|
||||
}
|
||||
}
|
||||
export const emergencyStore = new EmergencyStore()
|
||||
|
|
@ -15,6 +15,10 @@ import { regulationsCatStore } from './regulationsCat';
|
|||
import { regulationsStore } from './regulations';
|
||||
import { leaveCategoryStore } from './leave_cat';
|
||||
import { leaveStore } from './leave';
|
||||
import { emergencyStore } from './emergency';
|
||||
import { patrolStore } from './patrol';
|
||||
import { trainingStore } from './training';
|
||||
import { trainingCatStore } from './trainingCat';
|
||||
|
||||
const store = {
|
||||
usrStore,
|
||||
|
@ -33,7 +37,11 @@ const store = {
|
|||
regulationsCatStore,
|
||||
regulationsStore,
|
||||
leaveCategoryStore,
|
||||
leaveStore
|
||||
leaveStore,
|
||||
emergencyStore,
|
||||
patrolStore,
|
||||
trainingStore,
|
||||
trainingCatStore
|
||||
};
|
||||
|
||||
export default store;
|
|
@ -0,0 +1,28 @@
|
|||
import { action, makeObservable } from "mobx";
|
||||
// 档案分类
|
||||
import BaseStore from "./baseStore";
|
||||
import { TagDataType } from "@/model/userModel";
|
||||
import baseHttp from "@/service/base";
|
||||
|
||||
|
||||
class PatrolConfig {
|
||||
static LIST: string = "patrol/list"
|
||||
static ADD: string = "patrol"
|
||||
static DELETE: string = "patrol"
|
||||
static EDIT: string = "patrol"
|
||||
static ACCESS: string = "patrol/accept"
|
||||
}
|
||||
class PatrolStore extends BaseStore<TagDataType> {
|
||||
constructor() {
|
||||
super(PatrolConfig)
|
||||
makeObservable(this, {
|
||||
access: action
|
||||
})
|
||||
}
|
||||
async access(id: number, param: any) {
|
||||
await baseHttp.put(PatrolConfig.ACCESS + "/" + id, param)
|
||||
this.getlist()
|
||||
}
|
||||
}
|
||||
export const patrolStore = new PatrolStore()
|
||||
|
|
@ -0,0 +1,28 @@
|
|||
import { action, makeObservable } from "mobx";
|
||||
// 档案分类
|
||||
import BaseStore from "./baseStore";
|
||||
import { TagDataType } from "@/model/userModel";
|
||||
import baseHttp from "@/service/base";
|
||||
|
||||
|
||||
class TrainingConfig {
|
||||
static LIST: string = "training/list"
|
||||
static ADD: string = "training"
|
||||
static DELETE: string = "training"
|
||||
static EDIT: string = "training"
|
||||
static ACCESS: string = "training/accept"
|
||||
}
|
||||
class TrainingStore extends BaseStore<TagDataType> {
|
||||
constructor() {
|
||||
super(TrainingConfig)
|
||||
makeObservable(this, {
|
||||
access: action
|
||||
})
|
||||
}
|
||||
async access(id: number, param: any) {
|
||||
await baseHttp.put(TrainingConfig.ACCESS + "/" + id, param)
|
||||
this.getlist()
|
||||
}
|
||||
}
|
||||
export const trainingStore = new TrainingStore()
|
||||
|
|
@ -0,0 +1,21 @@
|
|||
import { makeObservable } from "mobx";
|
||||
// 分类
|
||||
import BaseStore from "./baseStore";
|
||||
import { TagDataType } from "@/model/userModel";
|
||||
|
||||
|
||||
class TrainingCatConfig {
|
||||
static LIST: string = "training/category/list"
|
||||
static ADD: string = "training/category"
|
||||
static DELETE: string = "training/category"
|
||||
static EDIT: string = "training/category"
|
||||
}
|
||||
class TrainingCatStore extends BaseStore<TagDataType> {
|
||||
constructor() {
|
||||
super(TrainingCatConfig)
|
||||
makeObservable(this, {
|
||||
})
|
||||
}
|
||||
}
|
||||
export const trainingCatStore = new TrainingCatStore()
|
||||
|
|
@ -5,7 +5,7 @@ import BaseStore from "./baseStore";
|
|||
import { UserDataType, UserInfos } from "@/model/userModel";
|
||||
class UserConfig {
|
||||
static LOGINURI: string = "anth/login"
|
||||
static LIST: string = "userMgmt/user/list"
|
||||
static LIST: string = "user/list"
|
||||
static ADD: string = "user"
|
||||
static DELETE: string = "user"
|
||||
static EDIT: string = "user"
|
||||
|
|
Loading…
Reference in New Issue