Commit cf32b0ef authored by 左玲玲's avatar 左玲玲 😬

1730

parent af888b94
......@@ -337,6 +337,12 @@ export default [
icon: '',
component: './lease/contract',
},
{
name: '租赁设备',
path: '/lease/leasedevice',
icon: '',
component: './lease/leasedevice',
},
],
},
];
......@@ -115,7 +115,7 @@ let FormRender = memo(({ fields = [], name, curindex, formRef, action }) => {
.filter((it) => it.hideInForm !== true)
.map((item, index) => {
let key = item?.valueType ? upperCase(item?.valueType) : "Input";
let { hideInForm, editable } = item;
let { hideInForm, editable, hideInFormShowKey } = item;
if (hideInForm && Object.keys(hideInForm)) {
return (
<ProFormDependency name={Object.keys(hideInForm)} key={index}>
......@@ -137,18 +137,29 @@ let FormRender = memo(({ fields = [], name, curindex, formRef, action }) => {
return (
<Col {...item.colProps} key={index}>
{curindex == 0 ? (
<p>
<div>
<label htmlFor="">{item.title}</label>
<p style={{ padding: "6px 0 0 0", margin: 0 }}>
{
hideInFormShowKey ? <div style={{ padding: "6px 0 0 0", margin: 0 }}>{value[hideInFormShowKey]}</div>
:
<div style={{ padding: "6px 0 0 0", margin: 0 }}>
<b style={{ color: "red" }}>!</b>{" "}
需满足条件才可以填写{item.title}
</p>
</p>
</div>
}
</div>
) : (
<p style={{ padding: "4px 0 0 0", margin: 0 }}>
<div style={{ padding: "4px 0 0 0", margin: 0 }}>
{
hideInFormShowKey ? <>{value[hideInFormShowKey]}</>
:
<div style={{ padding: "6px 0 0 0", margin: 0 }}>
<b style={{ color: "red" }}>!</b>{" "}
需满足条件才可以填写{item.title}
</p>
</div>
}
</div>
)}
</Col>
);
......@@ -168,20 +179,20 @@ let FormRender = memo(({ fields = [], name, curindex, formRef, action }) => {
} else if (editable === false) {
return curindex === 0 ? (
<Col {...item.colProps} style={{ height: 68 }} key={index}>
<p>
<div>
<label htmlFor="">{item.title}</label>
<p style={{ padding: "6px 0 0 0", margin: 0 }}>
<div style={{ padding: "6px 0 0 0", margin: 0 }}>
{value[item?.key ?? item?.dataIndex] ?? "-"}
</p>
</p>
</div>
</div>
</Col>
) : (
<Col {...item.colProps} style={{ height: 68 }} key={index}>
<p>
<p style={{ padding: "6px 0 0 0", margin: 0 }}>
<div>
<div style={{ padding: "6px 0 0 0", margin: 0 }}>
{value[item?.key ?? item?.dataIndex] ?? "-"}
</p>
</p>
</div>
</div>
</Col>
);
} else {
......@@ -1443,7 +1454,7 @@ function Expandable({ item, colProps }) {
function FormList(props) {
let { item, colProps, formRef } = props;
let col = item.colProps ?? colProps;
let fields = item.columns ?? [];
let fields = item.columns?.filter(it => !it.hideInTable) ?? [];
return (
<Col {...col}>
<ProFormList
......@@ -1457,6 +1468,7 @@ function FormList(props) {
alwaysShowItemLabel={false}
copyIconProps={item?.copyIconProps ?? false}
deleteIconProps={item?.deleteIconProps ?? true}
creatorButtonProps={item?.creatorButtonProps ?? true}
>
{(f, index, action) => {
return (
......
......@@ -42,6 +42,8 @@ const getParentKey = (key, tree) => {
}
function TreeRender({
isSelectFirst = false,
dataSource,
url,
deleteurl,
saveurl,
......@@ -58,10 +60,28 @@ function TreeRender({
visible: false,
});
const [expandall, setexpandall] = useState(false);
const [expandedKeys, onExpand] = useState();
const { data, loading, refresh } = useRequest(() => {
const [expandedKeys, onExpand] = useState(),
[selectedKeys, cselectedKeys] = useState([]),
[treeDataArr, cta] = useState([]);
const { loading, refresh, run } = useRequest(() => {
return doFetch({ url, params: params ?? {} });
}, {
manual: true,
onSuccess: (res, params) => {
if (res.code == '0000') {
cta(res?.data?.dataList ?? []);
}
}
});
useEffect(() => {
if (dataSource) {
cta(dataSource);
} else if (url && !dataSource) {
run();
}
}, [url, dataSource]);
const [autoExpandParent, setAutoExpandParent] = useState(true);
const allkeys = useMemo(() => {
......@@ -72,9 +92,9 @@ function TreeRender({
el.children && el.children.length > 0 ? fn(el.children) : ''; // 子级递归
});
};
fn(data?.data?.dataList ?? []);
fn(treeDataArr);
return res.filter((it) => it.children).map((it) => it.key);
}, [data]);
}, [treeDataArr]);
const alldata = useMemo(() => {
let res = [];
const fn = (source) => {
......@@ -83,19 +103,23 @@ function TreeRender({
el.children && el.children.length > 0 ? fn(el.children) : ''; // 子级递归
});
};
fn(data?.data?.dataList ?? []);
fn(treeDataArr);
return res;
}, [data]);
}, [treeDataArr]);
const treeData = useMemo(() => {
let res = data?.data?.dataList ?? [];
let res = treeDataArr;
if (isSelectFirst) {
cselectedKeys(res?.[0]?.key ? [res?.[0]?.key] : []);
}
return [
{
title: '全部类型',
key: '',
title: '全部',
key: '00000000',
children: res,
disabled: true
},
];
}, [data]);
}, [treeDataArr]);
const onChange = (e) => {
const { value } = e.target;
const dataLists = getAllList();
......@@ -124,7 +148,7 @@ function TreeRender({
const afterStr = item.title.substr(index + search.length);
let title =
index > -1 ? (
<Tooltip title={item.title} placement="bottom">
<span title={item.title} style={{ display: 'inherit' }}>
<span
style={{
display: 'inline-block',
......@@ -139,9 +163,9 @@ function TreeRender({
<span style={{ color: '#f50' }}>{search}</span>
{afterStr}
</span>
</Tooltip>
</span>
) : (
<Tooltip title={item.title} placement="bottom">
<span title={item.title} style={{ display: 'inherit' }}>
<span
style={{
display: 'inline-block',
......@@ -154,7 +178,7 @@ function TreeRender({
>
{item.title}
</span>
</Tooltip>
</span>
);
const actiontitle = (
......@@ -225,7 +249,6 @@ function TreeRender({
okText="删除"
cancelText="取消"
onConfirm={(e) => {
console.log(111);
doFetch({ url: deleteurl, params: { id: item.key } }).then((res) => {
if (res.code == '0000') {
message.success('操作成功');
......@@ -238,7 +261,6 @@ function TreeRender({
<Tooltip title="删除">
<MinusSquareOutlined
onClick={(e) => {
// console.log(e);
e.stopPropagation();
doFetch({ url: deleteurl, params: { id: item.key } }).then((res) => {
if (res.code == '0000') {
......@@ -287,7 +309,7 @@ function TreeRender({
setAutoExpandParent(!expandall);
}}
>
{expandall ? <ArrowDownOutlined /> : <ArrowRightOutlined />}
{expandall ? <ArrowDownOutlined style={{ color: 'rgba(0,0,0,0.85)' }} /> : <ArrowRightOutlined style={{ color: 'rgba(0,0,0,0.85)' }} />}
</Tooltip>
</div>
);
......@@ -300,6 +322,7 @@ function TreeRender({
children: loop(item.children),
level: item.level,
type: item.type,
disabled: item.disabled
};
}
return {
......@@ -307,6 +330,7 @@ function TreeRender({
key: item.key,
level: item.level,
type: item.type,
disabled: item.disabled
};
});
useEffect(() => {
......@@ -426,12 +450,13 @@ function TreeRender({
<Tree
onSelect={(selectedKeys, e) => {
// //console.log(selectedKeys);
cselectedKeys(selectedKeys);
onselected?.(selectedKeys, e, alldata);
}}
autoExpandParent={autoExpandParent}
defaultExpandAll={true}
expandedKeys={expandedKeys}
selectedKeys={selectedKeys}
onExpand={(expandedKeys, { expanded: bool, node }) => {
onExpand(expandedKeys);
setAutoExpandParent(false);
......
......@@ -50,6 +50,13 @@ ol {
padding-bottom: 24px !important;
}
.statuspage {
.ant-pro-table-list-toolbar-container {
padding-top: 0 !important;
padding-bottom: 0 !important;
}
}
.ant-pro-table-list-toolbar-right {
flex: 1 !important;
flex-direction: row !important;
......
import React, { useMemo } from 'react';
import { Tooltip, Tabs } from 'antd';
import Filedetail from "@/components/Filedetail";
import DetailPro from '@/components/DetailPro';
import AutoTable from '@/components/AutoTable/mtable';
const fields = [
{
title: '合同单号',
dataIndex: 'contractNo',
key: 'contractNo'
},
{
title: '合同金额(元)',
dataIndex: 'amount',
key: 'amount'
},
{
title: '客户编号',
dataIndex: 'customerNo',
key: 'customerNo'
},
{
title: '客户名称',
dataIndex: 'customerName',
key: 'customerName'
},
{
title: '合同租期(月)',
dataIndex: 'tenancy',
key: 'tenancy'
},
{
title: '营销区域',
dataIndex: 'marketRegion',
key: 'marketRegion'
},
{
title: '智享店',
dataIndex: 'zxstore',
key: 'zxstore'
},
{
title: '承接合同编号',
dataIndex: 'undertakingNo',
key: 'undertakingId'
},
{
title: '合同负责人',
dataIndex: 'head',
key: 'head'
},
{
title: '登记日期',
dataIndex: 'registrationDate',
key: 'registrationDate'
},
{
title: '状态',
dataIndex: 'statusName',
key: 'statusName'
},
{
title: '',
valueType: 'split'
},
{
title: '合同起租日',
dataIndex: 'startLeaseDate',
key: 'startLeaseDateList'
},
{
title: '合同终止日',
dataIndex: 'endLeaseDate',
key: 'endLeaseDate'
},
{
title: '回款设置(自然日)',
dataIndex: 'collectionSet',
key: 'collectionSet'
},
{
title: '预警设置(自然日)',
dataIndex: 'warnSet',
key: 'warnSet'
},
{
title: '',
valueType: 'split'
},
{
title: '去程运费(元)',
dataIndex: 'tripFreight',
key: 'tripFreight'
},
{
title: '去程运费承担方',
dataIndex: 'tripBearName',
key: 'tripBearName'
},
{
title: '返程运费(元)',
dataIndex: 'returnFreight',
key: 'returnFreight'
},
{
title: '返程运费承担方',
dataIndex: 'returnBearName',
key: 'returnBearName'
},
{
title: '',
valueType: 'split'
},
{
title: '退还押金(元)',
dataIndex: 'refund',
key: 'refund'
},
{
title: '处理人',
dataIndex: 'handleUserName',
key: 'handleUserName'
},
{
title: '处理时间',
dataIndex: 'handleTime',
key: 'handleTime'
},
{
title: '相关文件',
valueType: 'split'
},
{
title: '合同文件',
dataIndex: 'contractFileList',
key: 'contractFileList',
span: 3,
render: (_, row) => {
return <Filedetail files={row?.['contractFileList']} />
}
},
{
title: '起租单文件',
dataIndex: 'startLeaseFileList',
key: 'startLeaseFileList',
render: (_, row) => {
return <Filedetail files={row?.['startLeaseFileList']} />
}
},
{
title: '发用单文件',
dataIndex: 'hairuseFileList',
key: 'hairuseFileList',
render: (_, row) => {
return <Filedetail files={row?.['hairuseFileList']} />
}
},
{
title: '租赁物交付确认单文件',
dataIndex: 'leaseDeliverFileList',
key: 'leaseDeliverFileList',
render: (_, row) => {
return <Filedetail files={row?.['leaseDeliverFileList']} />
}
},
{
title: '租赁物归还确认单文件',
dataIndex: 'leaseReturnFileList',
key: 'leaseReturnFileList',
render: (_, row) => {
return <Filedetail files={row?.['leaseReturnFileList']} />
}
},
{
title: '押金归还确认单文件',
dataIndex: 'refundFileList',
key: 'refundFileList',
render: (_, row) => {
return <Filedetail files={row?.['refundFileList']} />
}
},
],
columns = [
{
title: '设备编号',
dataIndex: 'equipmentNo',
key: 'equipmentNo',
render: (_, row) => {
return (
<Tooltip title={row.equipmentNo}>
<a
className="table-cell"
onClick={() => {
}}
>
{row.equipmentNo}
</a>
</Tooltip>
);
}
},
{
title: '设备名称',
dataIndex: 'equipmentName',
key: 'equipmentName',
},
{
title: '智能单元',
dataIndex: 'intelligentUnitNo',
key: 'intelligentUnitNo',
},
{
title: '每期单价(元)',
dataIndex: 'unitPrice',
key: 'unitPrice',
hideInSearch: true
},
{
title: '智享价(元)',
dataIndex: 'zxPrice',
key: 'zxPrice',
hideInSearch: true
},
{
title: '返利金额(元)',
dataIndex: 'rebatePrice',
key: 'rebatePrice',
hideInSearch: true
},
{
title: '押金(元)',
dataIndex: 'deposit',
key: 'deposit',
hideInSearch: true
},
{
title: '实际结束时间',
dataIndex: 'realEndDate',
key: 'realEndDate',
hideInSearch: true
},
{
title: '违约金(元)',
dataIndex: 'violatePrice',
key: 'violatePrice',
hideInSearch: true
},
];
const Details = ({ drawer }) => {
const items = useMemo(() => {
return [
{
key: '1',
label: '基础信息',
children: <DetailPro
fields={fields}
detailpath="/lease/umContract/queryDetail"
params={{ id: drawer?.item?.id }}
/>,
},
{
key: '2',
label: '租赁设备',
children: <AutoTable
columns={columns}
path={'/lease/umContractEquipment/queryByContractId'}
resizeable={false}
pageextra="none"
bordered={false}
extraparams={{ contractId: drawer?.item?.id }}
pagination={'false'}
/>,
}
]
}, [drawer?.item?.id])
return <div>
<Tabs items={items} destroyInactiveTabPane />
</div>
}
export default Details;
\ No newline at end of file
......@@ -8,6 +8,24 @@ function getcolumns(setdrawer, drawer) {
key: 'contractNo',
formItemProps: { rules: [{ required: true, message: '此项为必填项' }] },
colProps: { span: 8 },
render: (_, row) => {
return (
<a
className="table-cell"
onClick={() => {
setdrawer && setdrawer((s) => ({
...s,
open: true,
item: row,
val: 'only',
title: '合同详情'
}));
}}
>
{row.contractNo}
</a>
);
}
},
{
title: '客户',
......@@ -37,15 +55,15 @@ function getcolumns(setdrawer, drawer) {
},
{
title: '本期应收回款',
dataIndex: 'amount',
key: 'amount',
dataIndex: 'thisCollection',
key: 'thisCollection',
hideInSearch: true,
hideInForm: true,
},
{
title: '设备台数',
dataIndex: 'amount',
key: 'amount',
dataIndex: 'equipmentNum',
key: 'equipmentNum',
hideInSearch: true,
hideInForm: true,
render: (_, row) => {
......@@ -62,7 +80,7 @@ function getcolumns(setdrawer, drawer) {
// }));
}}
>
{row.amount}
{row.equipmentNum}
</a>
);
}
......@@ -91,7 +109,7 @@ function getcolumns(setdrawer, drawer) {
hideInTable: true,
},
{
title: '回款设置',
title: '回款设置(自然日)',
dataIndex: 'collectionSet',
key: 'collectionSet',
valueType: 'digit',
......@@ -101,7 +119,7 @@ function getcolumns(setdrawer, drawer) {
hideInTable: true
},
{
title: '预警设置',
title: '预警设置(自然日)',
dataIndex: 'warnSet',
key: 'warnSet',
hideInSearch: true,
......@@ -155,7 +173,7 @@ function getcolumns(setdrawer, drawer) {
},
options: {
path: '/lease/umLeaseLedger/queryLedgerSelectbox',
params: {},
params: drawer?.val == 'add' ? {} : { contractId: drawer?.item?.id },
},
},
{
......@@ -277,12 +295,12 @@ function getcolumns(setdrawer, drawer) {
{
title: '承接合同编号',
dataIndex: 'undertakingNo',
key: 'undertakingNo',
key: 'undertakingId',
colProps: { span: 8 },
hideInSearch: true,
hideInTable: true,
valueType: 'select',
options: { path: '/', params: {} },
options: { path: '/lease/umContract/querySelect', params: {} },
},
{
title: '合同负责人',
......@@ -305,7 +323,7 @@ function getcolumns(setdrawer, drawer) {
},
colProps: { span: 24 },
render: (_, row) => {
return <Filedetail files={drawer?.val == 'only' ? row?.['contractFileList'] : (row?.['contractFileList']?.[0] ?? [])} />
return <Filedetail files={drawer?.val == 'only' ? row?.['contractFileList'] : (row?.['contractFileList']?.[0] ? [row?.['contractFileList']?.[0]] : [])} />
}
}
];
......@@ -346,7 +364,7 @@ function getcolumns(setdrawer, drawer) {
add: '/lease/umContract/save',
edit: '/lease/umContract/save',
list: '/lease/umContract/queryIncomplete',
delete: '/lease/umContract/deleteById',
delete: '/lease/umContract/delete',
detail: '/lease/umContract/queryDetail',
},
},
......
......@@ -17,6 +17,7 @@ import { doFetch } from '@/utils/doFetch';
import Addform from '@/components/Addform';
import Detail from '@/components/RepaireDetail/Detail';
import dayjs from 'dayjs';
import Details from "./Details";
function Contract(props) {
let actionRef = useRef(),
formRef = useRef();
......@@ -24,9 +25,10 @@ function Contract(props) {
open: false,
}),
[activeTabKey, setactiveTabKey] = useState('1'),
[amount, camount] = useState(0);
[amount, camount] = useState(0),
[intelligenceList, cil] = useState([]);
const { run, loading } = useRequest(doFetch, {
const { run, loading, runAsync } = useRequest(doFetch, {
manual: true,
onSuccess: (res, params) => {
if (res?.code == '0000') {
......@@ -50,11 +52,13 @@ function Contract(props) {
key='start'
btn={{
size: 'small',
onClick: () => {
onClick: async () => {
let res = await doFetch({ url: '/lease/umContractEquipment/queryBeforeStart', params: { contractId: row.id } });
cil(res?.data?.dataList ?? []);
setdrawer((s) => ({
...s,
open: true,
item: row,
item: { ...row, intelligenceList: res?.data?.dataList ?? [] },
val: 'start',
title: '开始',
fields: [
......@@ -75,12 +79,12 @@ function Contract(props) {
disabled: true
},
colProps: { span: 8 },
formItemProps: { rules: [{ required: true, message: '此项为必填项' }] },
formItemProps: { rules: [{ required: true, message: '此项为必填项' }] }
},
{
title: '第一期回款形式',
dataIndex: 'tripBear',
key: 'tripBear',
dataIndex: 'firstCollection',
key: 'firstCollection',
valueType: 'select',
options: [
{ label: '现金', value: 1 },
......@@ -91,11 +95,100 @@ function Contract(props) {
},
{
title: '租赁设备',
dataIndex: 'list',
key: 'list',
render: (_, row) => {
return <div>11</div>
}
dataIndex: 'intelligenceList',
key: 'intelligenceList',
valueType: 'formList',
initialValue: [
{
state: 'all',
title: '标题',
},
],
colProps: {
xs: 24,
sm: 24,
},
columns: [
{
title: '设备ID',
dataIndex: 'equipmentId',
key: 'equipmentId',
colProps: {
sm: 6,
},
editable: false,
hideInTable: true
},
{
title: '是否绑定智能单元',
dataIndex: 'isBindUnit',
key: 'isBindUnit',
colProps: {
sm: 6,
},
editable: false,
hideInTable: true
},
{
title: '设备编号',
dataIndex: 'equipmentNo',
key: 'equipmentNo',
colProps: {
sm: 6,
},
editable: false
},
{
title: '设备名称',
dataIndex: 'equipmentName',
key: 'equipmentName',
colProps: {
sm: 6,
},
editable: false
},
{
title: '设备型号',
dataIndex: 'equipmentModelName',
key: 'equipmentModelName',
colProps: {
sm: 6,
},
editable: false
},
{
title: '关联智能单元',
dataIndex: 'ledgerEquipmentId',
key: 'ledgerEquipmentId',
valueType: 'select',
fieldProps: {
placeholder: '请选择',
},
formItemProps: {
rules: [
{
required: true,
message: '此项为必填项',
},
],
},
colProps: {
sm: 6,
},
options: {
path: '/lease/umLeaseLedger/intelligentUnitSelectbox',
linkParams: {
equipmentId: 'id',
},
},
hideInForm: {
isBindUnit: [1]
},
hideInFormShowKey: 'intelligentUnitNo'
},
],
creatorButtonProps: false,
deleteIconProps: false,
},
{
title: '起租单上传',
......@@ -138,11 +231,15 @@ function Contract(props) {
key='edit'
btn={{
size: 'small',
onClick: () => {
onClick: async () => {
let res1 = await doFetch({ url: pathconfig.detail, params: { id: row.id } }),
res2 = await doFetch({ url: "/lease/umContractEquipment/queryByContractId", params: { contractId: row.id } });
let details = { ...(res1?.data?.data ?? {}), contractEquipmentList: res2?.data?.dataList ?? [] }
camount(row.amount);
setdrawer((s) => ({
...s,
open: true,
item: row,
item: details,
val: 'edit',
title: '编辑'
}));
......@@ -205,8 +302,8 @@ function Contract(props) {
}
const columns = useMemo(() => {
let defcolumn = getcolumns(setdrawer).filter((it) => it.key == activeTabKey)[0]?.columns;
let defpath = getcolumns(setdrawer).filter((it) => it.key == activeTabKey)[0]?.pathconfig ?? {};
let defcolumn = getcolumns(setdrawer, drawer).filter((it) => it.key == activeTabKey)[0]?.columns;
let defpath = getcolumns(setdrawer, drawer).filter((it) => it.key == activeTabKey)[0]?.pathconfig ?? {};
if (activeTabKey == 1) {
return defcolumn.concat({
title: '操作',
......@@ -217,7 +314,7 @@ function Contract(props) {
} else {
return defcolumn;
}
}, [activeTabKey]);
}, [activeTabKey, drawer]);
const pathconfig = useMemo(() => {
let defpath = getcolumns(setdrawer).filter((it) => it.key == activeTabKey)[0]?.pathconfig ?? {};
......@@ -241,6 +338,10 @@ function Contract(props) {
});
return list;
};
const getEndLeaseDate = (start) => {
let end = dayjs(start).add(drawer.item.tenancy, 'months').subtract(1, 'day');
return end;
};
return (
<div style={{ position: 'relative' }}>
<AutoTable
......@@ -286,8 +387,9 @@ function Contract(props) {
}}
/>
<DrawerPro
{...drawer}
fields={(drawer.val != 'add' && drawer.val != 'edit') ? drawer.fields : columns}
detailpath={pathconfig?.detail || null}
detailpath={drawer.val == 'only' ? pathconfig?.detail : null}
detailData={drawer?.item}
defaultFormValue={drawer?.item}
params={{ id: drawer?.item?.id }}
......@@ -299,13 +401,15 @@ function Contract(props) {
open: false,
}));
}}
{...drawer}
onFinish={(vals) => {
console.log(vals);
let newVals = JSON.parse(JSON.stringify(vals));
if (drawer?.val == 'add') {
run({ url: pathconfig?.add, params: { ...vals, amount } });
run({ url: pathconfig?.add, params: { ...newVals, amount } });
} else if (drawer?.val == 'edit') {
run({ url: pathconfig?.edit, params: { ...vals, id: drawer?.item?.id, amount } });
run({ url: pathconfig?.edit, params: { ...newVals, id: drawer?.item?.id, amount } });
} else if (drawer?.val == 'start') {
delete newVals.intelligenceList;
run({ url: '/lease/umContract/start', params: { ...newVals, id: drawer?.item?.id } });
}
}}
onValuesChange={(changedValues, allValues) => {
......@@ -323,6 +427,21 @@ function Contract(props) {
}
})
}
if (i == 'startLeaseDate') {
let end = getEndLeaseDate(changedValues[i]);
formRef?.current?.setFieldsValue({ ['endLeaseDate']: end });
setdrawer((s) => {
return {
...s,
item: { ...s.item, endLeaseDate: end }
}
})
}
if (i == 'intelligenceList') {
let params = changedValues[i], equipmentId = params.length > 0 ? intelligenceList[params.length - 1]?.equipmentId : "";
params = params.length > 0 ? params[params.length - 1] : {};
doFetch({ url: '/lease/umLeaseLedger/bound', params: { ...params, id: equipmentId } });
}
}
}}
submitter={{
......@@ -344,7 +463,7 @@ function Contract(props) {
}}
>
重置
</PremButton>,
</PremButton>
<PremButton
key='submit'
btn={{
......@@ -355,7 +474,7 @@ function Contract(props) {
}}
>
提交
</PremButton>,
</PremButton>
</div>
</div>
];
......@@ -363,7 +482,7 @@ function Contract(props) {
}}
>
{/* {selectType(drawer?.val)} */}
<Details drawer={drawer} />
</DrawerPro>
</div>
);
......
......@@ -61,6 +61,7 @@ const Devicedata = () => {
extraparams={extraparams}
pagination={false}
toolBarRender={true}
options={false}
/>
},
{
......
import React, { useState, useRef } from 'react';
import AutoTable from '@/components/AutoTable/mtable';
import { useRequest } from 'ahooks';
import { doFetch } from '@/utils/doFetch';
const columnsa = [
{
title: '客户名称',
dataIndex: 'ledgerCustomer',
key: 'ledgerCustomer'
},
{
title: '租赁数量',
dataIndex: 'deviceNum',
key: 'deviceNum',
search: false
},
{
title: '使用率',
dataIndex: 'rate',
key: 'rate',
search: false
},
],
columnsb = [
{
title: '合同单号',
dataIndex: 'contractNo',
key: 'contractNo'
},
{
title: '设备编号',
dataIndex: 'equipmentNo',
key: 'equipmentNo'
},
{
title: '设备名称',
dataIndex: 'equipmentName',
key: 'equipmentName'
},
{
title: '设备型号',
dataIndex: 'equipmentModelName',
key: 'equipmentModelId',
valueType: 'select',
options: { path: '/asset/equipmentModel/query/selection', params: {} }
},
{
title: '设备品牌',
dataIndex: 'brand',
key: 'brand'
},
{
title: '状态',
dataIndex: 'collectStatusName',
key: 'collectStatus',
valueType: 'select',
options: [
{
value: 1,
label: '工作'
},
{
value: 2,
label: '待机'
},
{
value: 3,
label: '关机'
},
{
value: 4,
label: '报警'
},
]
},
{
title: '工作',
dataIndex: 'runRate',
key: 'runRate',
search: false
},
{
title: '待机',
dataIndex: 'standbyRate',
key: 'standbyRate',
search: false
},
{
title: '报警',
dataIndex: 'alarmRate',
key: 'alarmRate',
search: false
},
{
title: '关机',
dataIndex: 'offRate',
key: 'offRate',
search: false
},
];
const Leasedevice = () => {
const [clickrow, cr] = useState({}),
[searchParams, csp] = useState({}),
formRef = useRef();
const ledgerCustomer = useRequest(async () => {
let res = await doFetch({ url: "/lease/umLeaseLedger/ledgerCustomerEquipmentUseRate", params: { ...searchParams } });
cr(res?.data?.dataList?.[0]);
return res?.data?.dataList ?? [];
}, {
refreshDeps: [searchParams]
})
return <div style={{ background: '#fff' }}>
<div className="ant-card-head" style={{ backgroundColor: 'white' }}>
<div className="ant-card-head-wrapper">
<div className="ant-card-head-title">
<h3 className="page-title">租赁设备</h3>
</div>
</div>
</div>
<div style={{ display: "flex", gap: 20, padding: 15 }}>
<div style={{ flex: 1 }}>
<AutoTable
columns={columnsa}
dataSource={ledgerCustomer?.data ?? []}
resizeable={false}
pageextra="none"
onRow={(record) => {
return {
onClick: (event) => {
console.log(event, record);
}
};
}}
pagination={'false'}
formRef={formRef}
dataSourceFieldsChange={(val) => {
csp({ ...val })
}}
toolBarRender={true}
options={false}
/>
</div>
<div style={{ flex: 2 }}>
<AutoTable
columns={columnsb}
path='/lease/umLeaseLedger/ledgerCustomerEquipmentUseDetail'
resizeable={false}
pageextra="none"
/>
</div>
</div>
</div>
}
export default Leasedevice;
\ No newline at end of file
import React, { useState, useMemo } from 'react';
import styles from "./index.less";
import { useRequest } from 'ahooks';
import { doFetch } from '@/utils/doFetch';
import { DatePicker, Button } from "antd";
import dayjs from 'dayjs';
import AutoTable from '@/components/AutoTable/mtable';
import ReactEcharts from 'echarts-for-react';
import TreeRender from '@/components/TreeRender';
const { RangePicker } = DatePicker;
const statusColors = {
报警: '#fa4659',
工作: '#00fff5',
待机: '#80d6ff',
关机: '#194769'
},
format = 'YYYY-MM-DD HH:mm:ss';
const Devicestatus = ({ drawer }) => {
const [dateTimeRange, cdate] = useState([dayjs().subtract(24, 'hours').format(format), dayjs().format(format)]),
[deviceId, cdv] = useState('');
const device = useRequest(async () => {
let res = await doFetch({ url: "/lease/umLeaseLedger/querySelectbox", params: {} });
cdv(res?.data?.dataList?.[0]?.value ?? '');
return res?.data?.dataList?.map((it) => {
return {
title: it.label,
key: it.value,
children: []
}
}) ?? [];
}),
chartdata = useRequest(async () => {
if (deviceId) {
let res = await doFetch({ url: "/lease/umLeaseLedger/queryEquipmentStatus", params: { dateTimeRange, id: deviceId } });
return res?.data ?? {};
} else {
return {}
}
}, {
refreshDeps: [dateTimeRange, deviceId]
});
const onselecteTree = (selectedKeys, e, alldata) => {
cdv(e.node.key);
};
const options = useMemo(() => {
let data = chartdata?.data?.data?.datalist ?? [];
const xAxisData = [];
const seriesData = [];
data.forEach((item) => {
xAxisData.push(item.start);
xAxisData.push(item.end);
const statusColor = statusColors[item.status];
seriesData.push([item.start, item.status, statusColor]);
seriesData.push([item.end, item.status, statusColor]);
});
const option = {
tooltip: {
formatter: (params) => {
}
},
xAxis: {
type: 'category',
name: '小时',
boundaryGap: false,
data: chartdata?.data?.data?.timeList ?? []
},
yAxis: {
type: 'category',
data: ['报警', '工作', '待机', '关机']
},
series: [
{
type: 'line',
step: 'start',
lineStyle: {
width: 2,
type: 'dotted'
},
data: seriesData.map((item) => ({
value: [item[0], item[1]],
itemStyle: {
color: item[2],
borderType: 'solid'
},
symbol:
item[2] == '#fa4659'
? 'triangle'
: item[2] == '#00fff5'
? 'rect'
: '',
symbolSize: 12
}))
}
]
};
return option;
}, [chartdata?.data]);
return <div style={{ display: "flex", justifyContent: "space-between", position: "relative" }}>
<div style={{ width: 300, padding: '0 16px', flexShrink: 0 }}>
<TreeRender dataSource={device?.data} onselected={onselecteTree} noaction={true} isSelectFirst={true} maxWidth={240} />
</div>
<div style={{ padding: 16, flex: 1, borderLeft: '1px solid #f0f0f0' }}>
<div style={{ marginBottom: 30 }}>
<RangePicker
showTime={{
format: 'HH:mm:ss',
}}
format={format}
onChange={(val, dateString) => {
}}
value={dateTimeRange?.length > 0 ? [dayjs(dateTimeRange?.[0]), dayjs(dateTimeRange?.[1])] : []}
/>
<Button onClick={() => {
chartdata.run()
}} type="primary" style={{ marginLeft: 15 }}>查询</Button>
</div>
<div style={{ display: 'flex' }}>
<div className='statuspage' style={{ flex: 1, marginRight: 30 }}>
<AutoTable
columns={[
{
title: '采集时间',
dataIndex: 'start',
key: 'start',
search: false
},
{
title: '采集状态',
dataIndex: 'status',
key: 'status',
search: false
},
]}
dataSource={chartdata?.data?.data?.datalist?.map((it, i) => {
return {
...it,
id: i
}
}) ?? []}
resizeable={false}
pageextra="none"
options={false}
/>
</div>
<div style={{ flex: 2 }}>
<div style={{ display: "flex", flexWrap: "wrap", gap: 15 }}>
{
Object?.keys(statusColors)?.map(it => {
return <div key={it} style={{ width: '30%', display: 'flex', gap: 16, justifyContent: 'center' }} >
<div style={{ color: statusColors[it] }}>{it}时长</div>
<div>{chartdata?.data?.data?.rateList?.filter(item => item.name == it)?.[0]?.time ?? 0}小时</div>
<div>{chartdata?.data?.data?.rateList?.filter(item => item.name == it)?.[0]?.rate ?? 0}%</div>
</div>
})
}
<div style={{ width: '30%', display: 'flex', gap: 16, justifyContent: 'center' }} >
<div>总时长</div>
<div>{chartdata?.data?.data?.timeRange}小时</div>
</div>
</div>
<ReactEcharts
style={{ height: 600, width: '100%' }}
option={options}
/>
</div>
</div>
</div>
</div>
}
export default Devicestatus;
\ No newline at end of file
......@@ -30,7 +30,8 @@ function getcolumns(setdrawer) {
open: true,
item: row,
val: 'only',
title: '设备详情'
title: '设备详情',
type: ''
}));
}}
>
......
......@@ -12,6 +12,7 @@ import Leaseresume from "./Leaseresume";
import Operatinghistory from "./Operatinghistory";
import Resume from "./Resume";
import Basemsg from "./Basemsg";
import Devicestatus from "./Devicestatus";
import setAllCanvas from "@/utils/drawimage"//导出二维码
const Ledger = () => {
let actionRef = useRef();
......@@ -244,7 +245,7 @@ const Ledger = () => {
}
const items = useMemo(() => {
if (drawer.val == 'only') {
if (drawer.item.equipmentType == 1) {
if (drawer?.item?.equipmentType == 1) {
return [
{ label: '基础信息', key: 'item-1', children: <Basemsg drawer={drawer} /> },
{ label: '绑定履历', key: 'item-2', children: <Resume drawer={drawer} url='/lease/umLeaseLedgerEquipment/queryList' /> },
......@@ -312,7 +313,13 @@ const Ledger = () => {
btn={{
type: 'default',
onClick: () => {
setdrawer((s) => ({
...s,
open: true,
val: 'only',
title: '状态查看',
type: "status"
}))
},
style: { marginLeft: 12 }
}}
......@@ -382,8 +389,12 @@ const Ledger = () => {
await runAsync({ url: "/lease/umLeaseLedger/bound", params: { ...newParams, id: drawer?.item?.id } });
}
}}
bodyStyle={drawer?.type == 'status' ? { padding: 0 } : {}}
>
{
drawer.type == 'status' ? <Devicestatus /> :
<Tabs items={items} destroyInactiveTabPane />
}
</DrawerPro>
</div>
}
......
......@@ -6548,6 +6548,22 @@ ecc-jsbn@~0.1.1:
jsbn "~0.1.0"
safer-buffer "^2.1.0"
echarts-for-react@^3.0.2:
version "3.0.2"
resolved "https://registry.npmmirror.com/echarts-for-react/-/echarts-for-react-3.0.2.tgz#ac5859157048a1066d4553e34b328abb24f2b7c1"
integrity sha512-DRwIiTzx8JfwPOVgGttDytBqdp5VzCSyMRIxubgU/g2n9y3VLUmF2FK7Icmg/sNVkv4+rktmrLN9w22U2yy3fA==
dependencies:
fast-deep-equal "^3.1.3"
size-sensor "^1.0.1"
echarts@^5.4.3:
version "5.4.3"
resolved "https://registry.npmmirror.com/echarts/-/echarts-5.4.3.tgz#f5522ef24419164903eedcfd2b506c6fc91fb20c"
integrity sha512-mYKxLxhzy6zyTi/FaEbJMOZU1ULGEQHaeIeuMR5L+JnJTpz+YR03mnnpBhbR4+UYJAgiXgpyTVLffPAjOTLkZA==
dependencies:
tslib "2.3.0"
zrender "5.4.4"
ee-first@1.1.1:
version "1.1.1"
resolved "https://mirrors.huaweicloud.com/repository/npm/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
......@@ -14001,6 +14017,11 @@ sisteransi@^1.0.5:
resolved "https://mirrors.huaweicloud.com/repository/npm/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed"
integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==
size-sensor@^1.0.1:
version "1.0.2"
resolved "https://registry.npmmirror.com/size-sensor/-/size-sensor-1.0.2.tgz#b8f8da029683cf2b4e22f12bf8b8f0a1145e8471"
integrity sha512-2NCmWxY7A9pYKGXNBfteo4hy14gWu47rg5692peVMst6lQLPKrVjhY+UTEsPI5ceFRJSl3gVgMYaUi/hKuaiKw==
slash2@2.0.0:
version "2.0.0"
resolved "https://mirrors.huaweicloud.com/repository/npm/slash2/-/slash2-2.0.0.tgz#f4e0a11708b8545b912695981cf7096f52c63487"
......@@ -14978,6 +14999,11 @@ tslib@2.0.1:
resolved "https://mirrors.huaweicloud.com/repository/npm/tslib/-/tslib-2.0.1.tgz#410eb0d113e5b6356490eec749603725b021b43e"
integrity sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ==
tslib@2.3.0:
version "2.3.0"
resolved "https://registry.npmmirror.com/tslib/-/tslib-2.3.0.tgz#803b8cdab3e12ba581a4ca41c8839bbb0dacb09e"
integrity sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==
tslib@^1.8.1:
version "1.14.1"
resolved "https://mirrors.huaweicloud.com/repository/npm/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"
......@@ -15885,6 +15911,13 @@ yocto-queue@^0.1.0:
resolved "https://mirrors.huaweicloud.com/repository/npm/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b"
integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==
zrender@5.4.4:
version "5.4.4"
resolved "https://registry.npmmirror.com/zrender/-/zrender-5.4.4.tgz#8854f1d95ecc82cf8912f5a11f86657cb8c9e261"
integrity sha512-0VxCNJ7AGOMCWeHVyTrGzUgrK4asT4ml9PEkeGirAkKNYXYzoPJCLvmyfdoOXcjTHPs10OZVMfD1Rwg16AZyYw==
dependencies:
tslib "2.3.0"
zscroller@~0.4.0:
version "0.4.8"
resolved "https://mirrors.huaweicloud.com/repository/npm/zscroller/-/zscroller-0.4.8.tgz#69eed68690808eedf81f9714014356b36cdd20f4"
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment