fix(amap):core

This commit is contained in:
wang_yp 2024-10-23 16:35:41 +08:00
parent ad9ce024d7
commit 9b3a268310
13 changed files with 376 additions and 19 deletions

View File

@ -0,0 +1,35 @@
import { useState } from "react";
import DebounceSelect from "./featch_select";
import { inject, observer } from "mobx-react";
import { Store } from "antd/es/form/interface";
interface UserValue {
label: string;
value: string;
}
const Dumbselect = (props: Store) => {
const { usrStore } = props;
const [value, setValue] = useState<UserValue[]>([]);
async function fetchUserList(username: string): Promise<UserValue[]> {
return usrStore.serchUser(username).then((res) => {
return res.data.record.map((item) => ({
label: item.user_name,
value: item.identity,
}));
});
}
return (
<DebounceSelect
mode="multiple"
value={value}
placeholder="Select users"
fetchOptions={fetchUserList}
onChange={(newValue) => {
setValue(newValue as UserValue[]);
}}
style={{ width: "100%" }}
/>
);
};
export default inject("usrStore")(observer(Dumbselect));

View File

@ -0,0 +1,51 @@
import React, { useMemo, useRef, useState } from 'react';
import { Select, Spin } from 'antd';
import type { SelectProps } from 'antd';
import debounce from 'lodash/debounce';
export interface DebounceSelectProps<ValueType = any>
extends Omit<SelectProps<ValueType | ValueType[]>, 'options' | 'children'> {
fetchOptions: (search: string) => Promise<ValueType[]>;
debounceTimeout?: number;
}
const DebounceSelect = <
ValueType extends { key?: string; label: React.ReactNode; value: string | number } = any,
>({ fetchOptions, debounceTimeout = 800, ...props }: DebounceSelectProps<ValueType>) =>{
const [fetching, setFetching] = useState(false);
const [options, setOptions] = useState<ValueType[]>([]);
const fetchRef = useRef(0);
const debounceFetcher = useMemo(() => {
const loadOptions = (value: string) => {
fetchRef.current += 1;
const fetchId = fetchRef.current;
setOptions([]);
setFetching(true);
fetchOptions(value).then((newOptions) => {
if (fetchId !== fetchRef.current) {
return;
}
setOptions(newOptions);
setFetching(false);
});
};
return debounce(loadOptions, debounceTimeout);
}, [fetchOptions, debounceTimeout]);
return (
<Select
labelInValue
filterOption={false}
onSearch={debounceFetcher}
notFoundContent={fetching ? <Spin size="small" /> : null}
{...props}
options={options}
/>
);
}
export default DebounceSelect

View File

@ -13,6 +13,7 @@ export enum FormType {
cehckbox = "checkbox", cehckbox = "checkbox",
cehckboxGroup = "checkboxGroup", cehckboxGroup = "checkboxGroup",
password = "password", password = "password",
fetchList = "fetchList",
} }
export interface FormDatas { export interface FormDatas {

View File

@ -5,6 +5,7 @@ import { FormSelect } from "./select";
import AliUpload from "../ali_upload"; import AliUpload from "../ali_upload";
import MyEditor from "../edittor"; import MyEditor from "../edittor";
import MapFrom from "../map/MapFrom"; import MapFrom from "../map/MapFrom";
import Dumbselect from "./dump_seleft";
const { TextArea } = Input; const { TextArea } = Input;
const SimpleForm = (props: SimpleFormData) => { const SimpleForm = (props: SimpleFormData) => {
const [form] = Form.useForm(); const [form] = Form.useForm();
@ -29,7 +30,7 @@ const SimpleForm = (props: SimpleFormData) => {
onFinish={onFinish} onFinish={onFinish}
autoComplete="on" autoComplete="on"
> >
{props.childrenPosi? null: props.children ?? props.children} {props.childrenPosi ? null : props.children ?? props.children}
{props.formDatas.map((v) => { {props.formDatas.map((v) => {
switch (v.type) { switch (v.type) {
case FormType.input: case FormType.input:
@ -54,6 +55,17 @@ const SimpleForm = (props: SimpleFormData) => {
<InputNumber defaultValue={v.value} value={v.value} /> <InputNumber defaultValue={v.value} value={v.value} />
</Form.Item> </Form.Item>
); );
// case FormType.fetchList:
// return (
// <Form.Item
// key={v.label}
// label={v.label}
// name={v.name}
// rules={v.rules}
// >
// <Dumbselect />
// </Form.Item>
// );
case "password": case "password":
return ( return (
<Form.Item <Form.Item
@ -161,7 +173,9 @@ const SimpleForm = (props: SimpleFormData) => {
> >
<Radio.Group> <Radio.Group>
{v.radioData?.map((item) => ( {v.radioData?.map((item) => (
<Radio key={item.val} value={item.val}>{item.key}</Radio> <Radio key={item.val} value={item.val}>
{item.key}
</Radio>
))} ))}
</Radio.Group> </Radio.Group>
</Form.Item> </Form.Item>
@ -205,7 +219,7 @@ const SimpleForm = (props: SimpleFormData) => {
); );
} }
})} })}
{props.childrenPosi? props.children ?? props.children: null} {props.childrenPosi ? props.children ?? props.children : null}
</Form> </Form>
); );
}; };

View File

@ -48,6 +48,10 @@ const LayOut = (props: Store) => {
key: "/admin/grid", key: "/admin/grid",
label: `网格管理`, label: `网格管理`,
}, },
{
key: "/admin/patrolBrigade",
label: `巡防大队`,
},
], ],
}, },
{ {
@ -137,7 +141,7 @@ const LayOut = (props: Store) => {
<Outlet /> <Outlet />
</Content> </Content>
<Footer style={{ textAlign: "center" }}> <Footer style={{ textAlign: "center" }}>
©{new Date().getFullYear()} Created ©{new Date().getFullYear()} Created
</Footer> </Footer>
</div> </div>
); );

View File

@ -1,11 +1,3 @@
// const Patrol = ()=>{
// return <>
// <p>巡逻</p>
// </>
// }
// export default Patrol
import { Button, Space, Modal, FormInstance } from "antd"; import { Button, Space, Modal, FormInstance } from "antd";
import { inject, observer } from "mobx-react"; import { inject, observer } from "mobx-react";
import type { ColumnsType } from "antd/es/table"; import type { ColumnsType } from "antd/es/table";

View File

@ -0,0 +1,59 @@
import { FormType } from "@/components/form/interface";
import { UserDataType } from "@/model/userModel";
import { ColumnsType } from "antd/lib/table";
export const defaultConfig = () => [
// {
// type: FormType.fetchList,
// label: "用户名",
// name: "user_identity",
// value: [],
// rules: [{ required: true, message: "请输入用户名称!" }],
// },
{
type: FormType.input,
label: "身份类别",
name: "identity_type",
value: "",
rules: [{ required: true, message: "请输入用户名称!" }],
},
{
type: FormType.input,
label: "所属队伍",
name: "assigned_team",
value: "",
rules: [{ required: true, message: "请输入所属队伍!" }],
},
{
type: FormType.input,
label: "备注",
name: "note",
value: "",
rules: [{ required: true, message: "请输入备注!" }],
},
];
export const columns: ColumnsType<UserDataType> = [
{
title: "用户名",
dataIndex: "user_name",
fixed: "left",
},
{
title: "性别",
dataIndex: "sex",
render: (sex) => <span>{sex === 1 ? "男" : "女"}</span>,
},
{
title: "身份证",
dataIndex: "id_card",
},
{
title: "联系电话",
dataIndex: "tel",
},
{
title: "备注",
dataIndex: "note",
},
];

View File

@ -0,0 +1,162 @@
import { Button, Space, Modal, FormInstance, Form } from "antd";
import { inject, observer } from "mobx-react";
import BTable from "@/components/b_table";
import { useEffect, useState } from "react";
import { Store } from "antd/lib/form/interface";
import SimpleForm from "@/components/form/simple_form";
import React from "react";
import { columns, defaultConfig } from "./config";
import dayjs from "dayjs";
import DebounceSelect from "@/components/form/featch_select";
interface UserValue {
label: string;
value: string;
}
const PatrolBrigade = (props: Store) => {
const { usrStore, patrolBrigadeStore } = 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 [userId, setId] = useState<Number | null>(null);
const [value, setValue] = useState<UserValue[]>([]);
const edit = (record) => {
record = {
...record,
vet_in_time: dayjs(record.vet_in_time),
vet_out_time: dayjs(record.vet_out_time),
imageUrl: [{ url: record.imageUrl }],
};
setProjectConfig(defaultConfig());
setIsModalOpen(true);
setRecord(record);
setId(record.id);
};
const onFinish = async (values: any) => {
var list:any = []
values.user_identity.forEach((item)=>{
list.push({
note:values.note,
identity_type:values.identity_type,
assigned_team:values.assigned_team,
user_identity: item.value
})
})
if (!userId) {
let res = await patrolBrigadeStore.add({list:list});
if (res) {
setIsModalOpen(false);
}
} else {
let res = await usrStore.putItem(userId, values);
if (res) {
setIsModalOpen(false);
}
}
};
useEffect(() => {
patrolBrigadeStore.getlist();
}, [patrolBrigadeStore]);
const addHandler = () => {
setProjectConfig(defaultConfig());
setId(null);
setRecord(null);
setIsModalOpen(true);
};
async function fetchUserList(username: string): Promise<UserValue[]> {
return usrStore.serchUser(username).then((res) => {
return res.data.record.map((item) => ({
label: item.user_name,
value: item.identity,
}));
});
}
const onFinishFailed = () => {};
return (
<div className="contentBox">
<Space direction="vertical" size="middle" style={{ display: "flex" }}>
<Space direction="horizontal" size={"middle"}>
<Button type="default" onClick={() => addHandler()}>
</Button>
</Space>
<BTable
store={usrStore}
scroll={{ x: "max-content" }}
columns={[
...columns,
{
title: "操作",
fixed: "right",
with: 200,
render: (any, record) => (
<Space wrap>
<Button
type="dashed"
size="small"
onClick={() => edit(record)}
>
</Button>
</Space>
),
},
]}
dataSource={patrolBrigadeStore.list}
/>
<Modal
title={"绑定巡防成员"}
width={800}
open={isModalOpen}
afterClose={() => formRef.current?.resetFields()}
onOk={() => formRef.current?.submit()}
okText="确定"
cancelText="取消"
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={"user_identity"}
label={"用户名"}
name={"user_identity"}
rules={[{ required: true, message: "请输入用户名称!" }]}
>
<DebounceSelect
mode="multiple"
value={value}
placeholder="输入搜索"
fetchOptions={fetchUserList}
style={{ width: "100%" }}
/>
</Form.Item>
</>
</SimpleForm>
</Modal>
</Space>
</div>
);
};
export default inject(
"usrStore",
"patrolBrigadeStore"
)(observer(PatrolBrigade));

View File

@ -25,6 +25,7 @@ import OrgChartSelf from "@/pages/OrgChart";
import GloryPlaque from "@/pages/glory_plaque"; import GloryPlaque from "@/pages/glory_plaque";
import Grid from "@/pages/grid"; import Grid from "@/pages/grid";
import Community from "@/pages/community"; import Community from "@/pages/community";
import PatrolBrigade from "@/pages/patrolBrigade";
export const homeRouter = [ export const homeRouter = [
{ {
path: "/", path: "/",
@ -75,6 +76,11 @@ export const homeRouter = [
index: true, index: true,
element: <Grid />, element: <Grid />,
}, },
{
path: "/admin/patrolBrigade",
index: true,
element: <PatrolBrigade />,
},
{ {
path: "/admin/community", path: "/admin/community",
index: true, index: true,

View File

@ -24,6 +24,8 @@ import homeStore from './home';
import gpStore from './gp'; import gpStore from './gp';
import { communityStore } from './community'; import { communityStore } from './community';
import { gridStore } from './grid'; import { gridStore } from './grid';
import { patrolBrigadeStore } from './patrol_brigade';
const store = { const store = {
@ -52,7 +54,8 @@ const store = {
homeStore, homeStore,
gpStore, gpStore,
gridStore, gridStore,
communityStore communityStore,
patrolBrigadeStore
}; };
export default store; export default store;

View File

@ -0,0 +1,18 @@
import { makeObservable } from "mobx";
// 用户信息
import BaseStore from "./baseStore";
import { TagDataType } from "@/model/userModel";
class PatrolBrigadeConfig {
static LIST: string = "user/getPatrol"
static ADD: string = "user/setPatrol"
}
class PatrolBrigadeStore extends BaseStore<TagDataType> {
constructor() {
super(PatrolBrigadeConfig)
makeObservable(this, {})
}
}
export const patrolBrigadeStore = new PatrolBrigadeStore();

View File

@ -13,6 +13,9 @@ class UserConfig {
static pover: string = "user/userPower" static pover: string = "user/userPower"
static team: string = "team/list" static team: string = "team/list"
static per: string = "persMgmt/list" static per: string = "persMgmt/list"
static serch: string = "user/serch"
static getPatrol: string = "user/getPatrol"
} }
class UserStore extends BaseStore<UserDataType> { class UserStore extends BaseStore<UserDataType> {
@ -28,8 +31,10 @@ class UserStore extends BaseStore<UserDataType> {
login: action, login: action,
getTeam: action, getTeam: action,
getPer: action, getPer: action,
serchUser: action,
setPoverDe: action, setPoverDe: action,
setUserDetaul: action, setUserDetaul: action,
getPatrol:action,
_userinfo: observable, _userinfo: observable,
isNeedLogin: observable, isNeedLogin: observable,
poverDetail: observable, poverDetail: observable,
@ -47,6 +52,13 @@ class UserStore extends BaseStore<UserDataType> {
async getPover() { async getPover() {
return await baseHttp.get(UserConfig.pover, null) return await baseHttp.get(UserConfig.pover, null)
} }
async serchUser(params: any) {
return await baseHttp.get(UserConfig.serch, {user_name:params})
}
async getPatrol() {
return await baseHttp.get(UserConfig.getPatrol, {})
}
get userInfo(): UserInfos { get userInfo(): UserInfos {
if (!this._userinfo.token) { if (!this._userinfo.token) {
let token = window.localStorage.getItem("token") let token = window.localStorage.getItem("token")

View File

@ -1,11 +1,11 @@
class Config { class Config {
// static baseUrl = "https://rw.quwanya.cn/"; static baseUrl = "https://rw.quwanya.cn/";
// static uploadUrl = "https://rw.quwanya.cn/"; static uploadUrl = "https://rw.quwanya.cn/";
// static ws = "wss://rw.quwanya.cn/wsadmin?id=admin"; static ws = "wss://rw.quwanya.cn/wsadmin?id=admin";
static rtc = "wss://rw.quwanya.cn/ws"; static rtc = "wss://rw.quwanya.cn/ws";
static ws = "ws://127.0.0.1:12214/ws?id=admin"; // static ws = "ws://127.0.0.1:12214/ws?id=admin";
static baseUrl = "http://127.0.0.1:12214/"; // static baseUrl = "http://127.0.0.1:12214/";
static uploadUrl = "http://127.0.0.1:12214/"; // static uploadUrl = "http://127.0.0.1:12214/";
} }
export default Config; export default Config;