Commit 39a4ab8a authored by 左玲玲's avatar 左玲玲 😬

1723

parent cf32b0ef
......@@ -337,6 +337,12 @@ export default [
icon: '',
component: './lease/contract',
},
{
name: '费用分析',
path: '/lease/costanalysis',
icon: '',
component: './lease/costanalysis',
},
{
name: '租赁设备',
path: '/lease/leasedevice',
......
......@@ -13,7 +13,7 @@ export default {
dev: {
[defaultSetting.proxypath]: {
// 要代理的地址
target: 'http://192.168.40.111:8000', //jf哥
target: 'http://192.168.40.110:8000', //jf哥
// target: 'http://192.168.40.248:8080', //jf哥
// target: 'http://192.168.40.64:28000', //gc哥
// target: 'http://192.168.40.203:8000', //dj哥
......@@ -22,7 +22,7 @@ export default {
},
'/token': {
// 要代理的地址
target: 'http://192.168.40.111:8000',
target: 'http://192.168.40.110:8000',
changeOrigin: true,
},
'/staticfile/': {
......
......@@ -73,6 +73,7 @@
"react-dom": "^17.0.0",
"react-helmet-async": "^1.2.0",
"react-resizable": "^3.0.4",
"socket.io-client": "2.2.0",
"umi-request": "^1.4.0"
},
"devDependencies": {
......
......@@ -120,7 +120,7 @@ export default (props) => {
{props.childposition == 'bottom' && props.children}
</Card>
) : (
<div className="tabsTable">
<div className="tabstable">
<div style={{ display: 'flex', justifyContent: 'space-between', padding: '16px 20px 0' }}>
<div style={{ fontSize: 16, fontWeight: 500 }}>{props.pagetitle}</div>
<div className="center">{renderextra()}</div>
......
......@@ -36,7 +36,11 @@ function DrawerPro(props) {
{props?.children}
</div>
) : (
<>
{props.childrenposition == 'top' && props.children}
<InitForm {...newProps} />
{props.childrenposition == 'bottom' && props.children}
</>
)}
{pushSettingFlag ? (
......
......@@ -138,11 +138,11 @@ let FormRender = memo(({ fields = [], name, curindex, formRef, action }) => {
<Col {...item.colProps} key={index}>
{curindex == 0 ? (
<div>
<label htmlFor="">{item.title}</label>
<label htmlFor="" style={{ marginBottom: 10, display: 'inline-block' }} >{item.title}</label>
{
hideInFormShowKey ? <div style={{ padding: "6px 0 0 0", margin: 0 }}>{value[hideInFormShowKey]}</div>
hideInFormShowKey ? <div style={{ margin: 0 }}>{value[hideInFormShowKey]}</div>
:
<div style={{ padding: "6px 0 0 0", margin: 0 }}>
<div style={{ margin: 0 }}>
<b style={{ color: "red" }}>!</b>{" "}
需满足条件才可以填写{item.title}
</div>
......@@ -154,7 +154,7 @@ let FormRender = memo(({ fields = [], name, curindex, formRef, action }) => {
{
hideInFormShowKey ? <>{value[hideInFormShowKey]}</>
:
<div style={{ padding: "6px 0 0 0", margin: 0 }}>
<div style={{ margin: 0 }}>
<b style={{ color: "red" }}>!</b>{" "}
需满足条件才可以填写{item.title}
</div>
......@@ -180,8 +180,8 @@ let FormRender = memo(({ fields = [], name, curindex, formRef, action }) => {
return curindex === 0 ? (
<Col {...item.colProps} style={{ height: 68 }} key={index}>
<div>
<label htmlFor="">{item.title}</label>
<div style={{ padding: "6px 0 0 0", margin: 0 }}>
<label htmlFor="" style={{ marginBottom: 10, display: 'inline-block' }} >{item.title}</label>
<div style={{ margin: 0 }}>
{value[item?.key ?? item?.dataIndex] ?? "-"}
</div>
</div>
......@@ -189,7 +189,7 @@ let FormRender = memo(({ fields = [], name, curindex, formRef, action }) => {
) : (
<Col {...item.colProps} style={{ height: 68 }} key={index}>
<div>
<div style={{ padding: "6px 0 0 0", margin: 0 }}>
<div style={{ margin: 0 }}>
{value[item?.key ?? item?.dataIndex] ?? "-"}
</div>
</div>
......@@ -383,7 +383,7 @@ function DigitRange({ item, colProps }) {
}
//Date
function Date({ item, colProps }) {
function Date({ item, colProps, curindex = 0 }) {
return (
<>
<ProFormDatePicker
......@@ -391,7 +391,7 @@ function Date({ item, colProps }) {
formItemProps={item.formItemProps}
name={item?.key ?? item?.dataIndex}
colProps={item.colProps ?? colProps}
label={item.title}
label={curindex == 0 ? item.title : ""}
placeholder={`请选择${item.title}`}
width="100%"
/>
......@@ -1452,11 +1452,23 @@ function Expandable({ item, colProps }) {
}
function FormList(props) {
const [isEmpty, cie] = useState(false);
let { item, colProps, formRef } = props;
let col = item.colProps ?? colProps;
let fields = item.columns?.filter(it => !it.hideInTable) ?? [];
useEffect(() => {
let value = props.formRef.current.getFieldValue(
item?.key ?? item?.dataIndex
);
if (value?.length == 0) {
cie(true);
}
}, [props]);
return (
<Col {...col}>
<div className="formlist">
{
!isEmpty ?
<ProFormList
name={item.key ?? item.dataIndex}
label={item.title}
......@@ -1482,6 +1494,20 @@ function FormList(props) {
);
}}
</ProFormList>
:
<div>
<div>{item.title}</div>
<Empty
image={"./empty.svg"}
imageStyle={{
height: 60,
}}
/>
</div>
}
</div>
</Col>
);
}
......
import React, { useCallback, useState, useMemo } from 'react';
import React, { useCallback, useState, useMemo, useEffect } from 'react';
import { LogoutOutlined, LockOutlined } from '@ant-design/icons';
import { Menu, Spin, Button, Form, Modal, message, Avatar, Select } from 'antd';
import { history, useModel } from '@umijs/max';
......@@ -14,6 +14,14 @@ import ECB from 'crypto-js/mode-ecb';
import Pkcs7 from 'crypto-js/pad-pkcs7';
import Utf8 from 'crypto-js/enc-utf8';
import moment from 'moment';
import io from 'socket.io-client';
const { NODE_ENV } = process.env;
const websocketUrl = NODE_ENV == "development" ? "ws://192.168.40.110:9933" : `${window.location.protocol == "http:" ? "ws" : "wss"}://${window.location.host}`;
const socket = io(websocketUrl, {
reconnectionDelay: 4000,
transports: ['websocket'],
autoConnect: true,
});
/**
* 退出登录,并且将当前的 url 保存
*/
......@@ -31,6 +39,7 @@ const AvatarDropdown = ({ menu }) => {
return res?.data || {};
});
const { initialState, setInitialState } = useModel('@@initialState');
const { allWebsocket, changeWebsocket } = useModel('useGlobal');
const [visible, cv] = useState(false),
[formRef] = Form.useForm(),
{ run, loading } = useRequest(doFetch, {
......@@ -50,6 +59,14 @@ const AvatarDropdown = ({ menu }) => {
}
},
});
useEffect(() => {
changeWebsocket((s) => ({ ...s, commonWebsocket: socket }));
socket.on('iotData', (data) => {
changeWebsocket((s) => ({ ...s, commonWebmsg: data }));
});
}, []);
const fields = useMemo(() => {
return {
password: {
......@@ -184,7 +201,7 @@ const AvatarDropdown = ({ menu }) => {
formRef={formRef}
fields={fields}
col={{ span: 24 }}
onChange={(changedValues, allValues) => {}}
onChange={(changedValues, allValues) => { }}
submitData={(values, fn) => {
saveData(values, fn);
}}
......
......@@ -368,7 +368,7 @@ ol {
}
}
.tabsTable {
.tabstable {
background: #fff;
.ant-tabs-nav {
......@@ -561,12 +561,24 @@ ol {
}
}
.formList {
.ledgerf {
.ant-card-head {
display: none !important;
}
.ant-card-body {
padding: 0 !important;
}
}
.formlist {
>div {
>div {
>div {
>div {
>div:last-child {
border: 1px solid #dbdbdb;
padding: 12px;
}
}
......@@ -574,13 +586,3 @@ ol {
}
}
}
\ No newline at end of file
.ledgerf {
.ant-card-head {
display: none !important;
}
.ant-card-body {
padding: 0 !important;
}
}
\ No newline at end of file
import { useState, useCallback } from 'react';
export default function useGlobal() {
const [alive, setAlive] = useState(false),
[newMenus, setMenu] = useState({});
[newMenus, setMenu] = useState({}),
[allWebsocket, setAllWebsocket] = useState({});
const changealive = useCallback((parser) => {
setAlive(parser);
......@@ -10,11 +11,16 @@ export default function useGlobal() {
const setMenuFn = useCallback((val) => {
setMenu(val);
}, []);
const changeWebsocket = useCallback((parser) => {
setAllWebsocket(parser)
}, []);
return {
alive,
changealive,
newMenus,
setMenuFn,
allWebsocket,
changeWebsocket
};
}
......@@ -3,6 +3,7 @@ import { Tooltip, Tabs } from 'antd';
import Filedetail from "@/components/Filedetail";
import DetailPro from '@/components/DetailPro';
import AutoTable from '@/components/AutoTable/mtable';
import { history } from '@umijs/max';
const fields = [
{
title: '合同单号',
......@@ -188,14 +189,31 @@ const fields = [
render: (_, row) => {
return (
<Tooltip title={row.equipmentNo}>
{
row.pageStatus == 0 ?
<span className="table-cell">
{row.equipmentNo}
</span>
:
<a
className="table-cell"
onClick={() => {
history.push({
path: '/lease/costanalysis',
query: {
pageStatus: row.pageStatus,
extraparams: {
contractId: row.contractId,
equipmentId: row.id
}
}
})
}}
>
{row.equipmentNo}
</a>
}
</Tooltip>
);
}
......
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';
import { history } from '@umijs/max';
const columns = [
{
title: '设备编号',
dataIndex: 'equipmentNo',
key: 'equipmentNo'
},
{
title: '设备名称',
dataIndex: 'equipmentName',
key: 'equipmentName',
},
{
title: '设备类型',
dataIndex: 'equipmentTypeName',
key: 'equipmentType',
hideInSearch: true,
// valueType: 'select',
// options: [
// { label: '设备', value: 1 },
// { label: '智能单元', value: 2 },
// ]
},
{
title: '设备型号',
dataIndex: 'equipmentModelName',
key: 'equipmentModelName',
},
{
title: '开始租赁时间',
dataIndex: 'startLeaseDate',
key: 'startLeaseDateList',
valueType: 'dateRange'
},
{
title: '结束租赁时间',
dataIndex: 'endLeaseDate',
key: 'endLeaseDateList',
valueType: 'dateRange'
},
{
title: '实际结束时间',
dataIndex: 'realEndDate',
key: 'realEndDateList',
valueType: 'dateRange'
},
{
title: '采集状态',
dataIndex: 'collectStatusName',
key: 'collectStatusName',
hideInSearch: true
},
];
const Devices = ({ drawer }) => {
return <div>
<AutoTable
columns={columns}
path={'/lease/umContractEquipment/queryByContractId'}
resizeable={false}
pageextra="none"
bordered={false}
extraparams={{ contractId: drawer?.item?.id }}
pagination={'false'}
/>
</div>
}
export default Devices;
\ No newline at end of file
......@@ -18,7 +18,8 @@ function getcolumns(setdrawer, drawer) {
open: true,
item: row,
val: 'only',
title: '合同详情'
title: '合同详情',
type: 'detail'
}));
}}
>
......@@ -71,13 +72,14 @@ function getcolumns(setdrawer, drawer) {
<a
className="table-cell"
onClick={() => {
// setdrawer && setdrawer((s) => ({
// ...s,
// open: true,
// item: row,
// val: 'only',
// title: '租赁设备'
// }));
setdrawer && setdrawer((s) => ({
...s,
open: true,
item: row,
val: 'only',
title: '租赁设备',
type: 'device'
}));
}}
>
{row.equipmentNum}
......
......@@ -18,6 +18,79 @@ import Addform from '@/components/Addform';
import Detail from '@/components/RepaireDetail/Detail';
import dayjs from 'dayjs';
import Details from "./Details";
import Devices from "./Devices";
const formCommonColumns = [
{
title: '是否可操作',
dataIndex: 'isFinish',
key: 'isFinish',
editable: false,
hideInTable: true
},
{
title: '设备编号',
dataIndex: 'equipmentNo',
key: 'equipmentNo',
colProps: {
sm: 3,
},
editable: false
},
{
title: '设备名称',
dataIndex: 'equipmentName',
key: 'equipmentName',
colProps: {
sm: 3,
},
editable: false
},
{
title: '设备型号',
dataIndex: 'equipmentModelName',
key: 'equipmentModelName',
colProps: {
sm: 3,
},
editable: false
},
{
title: '每期单价(元)',
dataIndex: 'unitPrice',
key: 'unitPrice',
colProps: {
sm: 2,
},
editable: false
},
{
title: '押金(元)',
dataIndex: 'deposit',
key: 'deposit',
editable: false,
colProps: {
sm: 2,
},
},
{
title: '结束租赁时间',
dataIndex: 'endLeaseDate',
key: 'endLeaseDate',
editable: false,
colProps: {
sm: 3,
},
},
{
title: '采集状态',
dataIndex: 'collectStatusName',
key: 'collectStatusName',
editable: false,
colProps: {
sm: 2,
},
}
];
function Contract(props) {
let actionRef = useRef(),
formRef = useRef();
......@@ -269,8 +342,65 @@ function Contract(props) {
key='out'
btn={{
size: 'small',
onClick: () => {
onClick: async () => {
let res = await doFetch({ url: '/lease/umContractEquipment/queryBeforeRentout', params: { contractId: row.id } });
setdrawer((s) => ({
...s,
open: true,
item: { ...row, deviceList: res?.data?.dataList ?? [] },
val: 'out',
title: '退租',
fields: [
{
title: '',
dataIndex: 'deviceList',
key: 'deviceList',
valueType: 'formList',
initialValue: [
{
state: 'all',
title: '标题',
},
],
colProps: {
xs: 24,
sm: 24,
},
columns: [
...formCommonColumns,
{
title: '实际结束时间',
dataIndex: 'realEndDate',
key: 'realEndDate',
valueType: 'date',
colProps: {
sm: 3,
},
hideInForm: {
isFinish: [2]
},
hideInFormShowKey: 'realEndDate'
},
{
title: '违约金(元)',
dataIndex: 'violatePrice',
key: 'violatePrice',
colProps: {
sm: 3,
},
valueType: 'digit',
precision: 2,
hideInForm: {
isFinish: [2]
},
hideInFormShowKey: 'violatePrice'
},
],
creatorButtonProps: false,
deleteIconProps: false,
}
]
}));
},
}}
>
......@@ -280,8 +410,38 @@ function Contract(props) {
key='break'
btn={{
size: 'small',
onClick: () => {
onClick: async () => {
let res = await doFetch({ url: '/lease/umContractEquipment/queryBeforeEndOrHandle', params: { contractId: row.id } });
setdrawer((s) => ({
...s,
open: true,
item: { ...row, deviceList: res?.data?.dataList ?? [] },
val: 'break',
title: '结束',
fields: [
{
title: '返程运费',
dataIndex: 'returnFreight',
key: 'returnFreight',
colProps: { span: 8 },
valueType: 'digit',
precision: 2,
formItemProps: { rules: [{ required: true, message: '此项为必填项' }] }
},
{
title: '返程运费承担方',
dataIndex: 'returnBear',
key: 'returnBear',
valueType: 'select',
options: [
{ label: '客户', value: '1' },
{ label: '平台', value: '2' },
],
colProps: { span: 8 },
formItemProps: { rules: [{ required: true, message: '此项为必填项' }] }
},
]
}));
},
}}
>
......@@ -291,8 +451,46 @@ function Contract(props) {
key='handle'
btn={{
size: 'small',
onClick: () => {
onClick: async () => {
let res = await doFetch({ url: '/lease/umContractEquipment/queryBeforeEndOrHandle', params: { contractId: row.id } });
setdrawer((s) => ({
...s,
open: true,
item: { ...row, deviceList: res?.data?.dataList ?? [] },
val: 'handle',
title: '处理',
fields: [
{
title: '退还押金',
dataIndex: 'refund',
key: 'refund',
colProps: { span: 8 },
valueType: 'digit',
precision: 2,
formItemProps: { rules: [{ required: true, message: '此项为必填项' }] }
},
{
title: '租赁物归还确认单上传',
dataIndex: 'leaseReturnFileList',
key: 'leaseReturnFileList',
valueType: 'uploadBtn',
fieldProps: {
limit: 1,
},
colProps: { span: 24 },
},
{
title: '押金归还确认单上传',
dataIndex: 'refundFileList',
key: 'refundFileList',
valueType: 'uploadBtn',
fieldProps: {
limit: 1,
},
colProps: { span: 24 },
},
]
}));
},
}}
>
......@@ -342,6 +540,17 @@ function Contract(props) {
let end = dayjs(start).add(drawer.item.tenancy, 'months').subtract(1, 'day');
return end;
};
function getOnlyDom() {
switch (drawer.type) {
case 'detail':
return <Details drawer={drawer} />;
case 'device':
return <Devices drawer={drawer} />;
}
}
return (
<div style={{ position: 'relative' }}>
<AutoTable
......@@ -401,15 +610,30 @@ function Contract(props) {
open: false,
}));
}}
onFinish={(vals) => {
onFinish={async (vals) => {
let newVals = JSON.parse(JSON.stringify(vals));
if (drawer?.val == 'add') {
run({ url: pathconfig?.add, params: { ...newVals, amount } });
await runAsync({ url: pathconfig?.add, params: { ...newVals, amount } });
} else if (drawer?.val == 'edit') {
run({ url: pathconfig?.edit, params: { ...newVals, id: drawer?.item?.id, amount } });
await runAsync({ 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 } });
await runAsync({ url: '/lease/umContract/start', params: { ...newVals, id: drawer?.item?.id } });
} else if (drawer?.val == 'out') {
let contractEquipmentList = newVals.deviceList?.filter(it => {
if (it.isFinish == 1) {
return {
id: it.id,
realEndDate: it.realEndDate,
violatePrice: it.violatePrice
}
}
})
await runAsync({ url: '/lease/umContract/rentout', params: { contractEquipmentList, id: drawer?.item?.id } });
} else if (drawer?.val == 'break') {
await runAsync({ url: '/lease/umContract/end', params: { ...newVals, id: drawer?.item?.id } });
} else if (drawer?.val == 'handle') {
await runAsync({ url: '/lease/umContract/handle', params: { ...newVals, id: drawer?.item?.id } });
}
}}
onValuesChange={(changedValues, allValues) => {
......@@ -448,10 +672,12 @@ function Contract(props) {
render: (props, doms) => {
return [
<div key='render' className='spread' style={{ position: 'fixed', bottom: 12, width: 'calc(100% - 62px)' }}>
<div key='amount' style={{ color: 'red', fontSize: 16, fontWeight: 500 }}>
{
(drawer.val == 'add' || drawer.val == 'edit') && <div key='amount' style={{ color: 'red', fontSize: 16, fontWeight: 500 }}>
<span>合同金额(单位:元):</span>
<span>{amount}</span>
</div>,
</div>
}
<div>
<PremButton
key='rest'
......@@ -481,8 +707,39 @@ function Contract(props) {
},
}}
childrenposition={(drawer.val == 'break' || drawer.val == 'handle') ? 'top' : ''}
>
<Details drawer={drawer} />
{
drawer.val == 'only' && getOnlyDom()
}
{
(drawer.val == 'break' || drawer.val == 'handle') && <FormTable columns={[
...formCommonColumns,
{
title: '实际结束时间',
dataIndex: 'realEndDate',
key: 'realEndDate',
colProps: {
sm: 3,
},
editable: false
},
{
title: '违约金(元)',
dataIndex: 'violatePrice',
key: 'violatePrice',
colProps: {
sm: 3,
},
editable: false
},
]}
dataSource={drawer?.item?.deviceList}
resizeable={false}
pageextra="none"
/>
}
</DrawerPro>
</div>
);
......
import React, { useMemo, useState } from 'react';
import DrawerPro from '@/components/DrawerPro';
import AutoTable from '@/components/AutoTable/mtable';
import PremButton from '@/components/PremButton';
import { Tooltip } from "antd";
import Filedetail from "@/components/Filedetail";
import { doFetch, exportFetch } from '@/utils/doFetch';
import { message } from "antd";
const commona = [
{
title: '当期金额',
dataIndex: 'thisPrice',
key: 'thisPrice',
search: false
},
{
title: '回款日期',
dataIndex: 'collectionDate',
key: 'collectionDate',
search: false
},
{
title: '预警日期',
dataIndex: 'warnDate',
key: 'warnDate',
search: false
},
{
title: '状态',
dataIndex: 'statusName',
key: 'statusName',
search: false
}
],
commonb = [
{
title: '是否回款',
dataIndex: 'isCollectionName',
key: 'isCollectionName',
search: false
},
{
title: '回款时间',
dataIndex: 'collectionTime',
key: 'collectionTime',
search: false
},
{
title: '回款形式',
dataIndex: 'collectionTypeName',
key: 'collectionTypeName',
search: false
}
],
columnsc = [
{
title: '基本信息',
valueType: 'split'
},
{
title: '期数',
dataIndex: 'thisTenancy',
key: 'thisTenancy'
},
{
title: '当期开始时间',
dataIndex: 'tenancyStartDate',
key: 'tenancyStartDate'
},
{
title: '当期结束时间',
dataIndex: 'tenancyEndDate',
key: 'tenancyEndDate'
},
...commona,
{
title: '回款信息',
valueType: 'split'
},
...commonb,
{
title: '回款确认人',
dataIndex: 'collectionUserName',
key: 'collectionUserName'
},
{
title: '是否逾期',
dataIndex: 'isOverdueName',
key: 'isOverdueName'
},
{
title: '减免租金信息',
valueType: 'split'
},
{
title: '当期租金减免金额',
dataIndex: 'reducePrice',
key: 'reducePrice'
},
{
title: '最近租金减免时间',
dataIndex: 'reduceTime',
key: 'reduceTime'
},
{
title: '最近租金减免人',
dataIndex: 'reduceUserName',
key: 'reduceUserName'
},
{
title: '减免情况说明',
dataIndex: 'reduceRemark',
key: 'reduceRemark'
},
{
title: '相关文件',
dataIndex: 'reduceFileFileList',
key: 'reduceFileFileList',
render: (_, row) => {
return <Filedetail files={row?.['reduceFileFileList']} />
}
},
{
title: '开票信息',
valueType: 'split'
},
{
title: '是否开票',
dataIndex: 'isOpenName',
key: 'isOpenName'
},
{
title: '开票时间',
dataIndex: 'openTime',
key: 'openTime'
},
{
title: '开票记录人',
dataIndex: 'openUserName',
key: 'openUserName'
},
];
const Leaseterminformation = ({ drawer, boxRef }) => {
const [detail, cd] = useState({
open: false,
});
const columns = [
{
title: '期数',
dataIndex: 'thisTenancy',
key: 'thisTenancy',
search: false
},
...commona,
...commonb,
{
title: '是否逾期',
dataIndex: 'isOverdueName',
key: 'isOverdueName',
search: false
},
{
title: '租金减免金额',
dataIndex: 'reducePrice',
key: 'reducePrice',
search: false
},
{
title: '租金情况说明',
dataIndex: 'reduceRemark',
key: 'reduceRemark',
search: false
},
{
title: '是否开票',
dataIndex: 'isOpenName',
key: 'isOpenName',
search: false
},
{
title: '操作',
valueType: 'option',
width: 80,
render: (text, row, _, action) => rightExtra(text, row, _, action),
}
];
const rightExtra = (text, row, _, action) => {
return [
<PremButton
key='confirm'
btn={{
size: 'small',
onClick: () => {
cd((s) => ({
...s,
open: true,
item: row,
title: '租期详情',
val: 'detail'
}));
},
}}
>
详情
</PremButton>
]
}
return <div style={{ position: "relative" }}>
<div style={{ display: 'flex', justifyContent: 'flex-end' }}>
<PremButton
key='export'
btn={{
type: 'primary',
onClick: async () => {
message.warning('导出中,请稍后');
await exportFetch({ url: '/lease/umContractEquipmentTenancy/exportExcelTenancy', params: { id: drawer?.item?.id } });
}
}}
>
导出
</PremButton>
</div>
<AutoTable
columns={columns}
path={'/lease/umContractEquipmentTenancy/queryByContractEquipmentId'}
resizeable={false}
bordered={false}
extraparams={{ id: drawer?.item?.id }}
options={false}
pagination='false'
/>
<DrawerPro
{...detail}
fields={columnsc}
params={{ id: detail?.item?.id }}
detailpath='/lease/umContractEquipmentTenancy/queryDetail'
placement="right"
onClose={() => {
cd((s) => ({
...s,
open: false,
}));
}}
getContainer={() => boxRef.current}
>
</DrawerPro>
</div>
}
export default Leaseterminformation;
\ No newline at end of file
import { Tooltip, Image, Tag } from 'antd';
import { doFetch } from '@/utils/doFetch';
const statusColors = {
1: '#7ac143',
2: 'orange',
3: '#fa4659'
};
function getcolumns(setdrawer, activeKey) {
const commona = [
{
title: '客户',
dataIndex: 'customerName',
key: 'customerId',
valueType: 'select',
options: { path: '/lease/umLeaseCustomer/getSelection', params: {} },
fieldProps: {
showSearch: true
},
fixed: 'left'
},
{
title: '合同单号',
dataIndex: 'contractNo',
key: 'contractNo',
fixed: 'left'
},
{
title: '设备编号',
dataIndex: 'equipmentNo',
key: 'equipmentNo'
},
{
title: '设备名称',
dataIndex: 'equipmentName',
key: 'equipmentName',
},
{
title: '智能单元莫格云眼编号',
dataIndex: 'intelligentUnitNo',
key: 'intelligentUnitNo',
width: 170
},
{
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
}
],
commonb = [
{
title: '开票期数',
dataIndex: 'openNum',
key: 'openNum',
hideInSearch: true
},
{
title: '已发生租金',
dataIndex: 'occurredPrice',
key: 'occurredPrice',
hideInSearch: true
},
{
title: '累计逾期欠费',
dataIndex: 'overduePrice',
key: 'overduePrice',
hideInSearch: true
},
{
title: '累计回款金额',
dataIndex: 'collectionPrice',
key: 'collectionPrice',
hideInSearch: true
},
{
title: '逾期次数',
dataIndex: 'overdueNum',
key: 'overdueNum',
hideInSearch: true
},
{
title: '开始租赁时间',
dataIndex: 'startLeaseDate',
key: 'startLeaseDateList',
valueType: 'dateRange'
},
{
title: '结束租赁时间',
dataIndex: 'endLeaseDate',
key: 'endLeaseDateList',
valueType: 'dateRange'
},
{
title: '实际结束时间',
dataIndex: 'realEndDate',
key: 'realEndDateList',
valueType: 'dateRange'
}
];
return [
{
tab: '未完成',
key: 'item-1',
columns: [
...commona,
{
title: '当前租期/租期',
dataIndex: 'thisTenancy',
key: 'thisTenancy',
render: (_, row) => {
return (
<a
className="table-cell"
onClick={() => {
setdrawer && setdrawer((s) => ({
...s,
open: true,
item: row,
val: 'only',
title: '租期信息',
type: 'detail'
}));
}}
>
{row.thisTenancy + '/' + row.tenancyTotal}
</a>
);
},
hideInSearch: true
},
...commonb,
{
title: '回款状态',
dataIndex: 'collectionStatusName',
key: 'collectionStatus',
hideInForm: true,
valueType: 'select',
options: [
{ label: '正常', value: 1 },
{ label: '预警', value: 2 },
{ label: '报警', value: 3 }
],
fixed: 'right',
render: (_, row) => {
return <span style={{ color: statusColors[row.collectionStatus] }}>{row.collectionStatusName}</span>
},
width: 100
},
]
},
{
tab: '已完成',
key: 'item-2',
columns: [
...commona,
{
title: '租期',
dataIndex: 'tenancyTotal',
key: 'tenancyTotal',
render: (_, row) => {
return (
<a
className="table-cell"
onClick={() => {
setdrawer && setdrawer((s) => ({
...s,
open: true,
item: row,
val: 'only',
title: '租期信息',
type: 'detail'
}));
}}
>
{row.tenancyTotal}
</a>
);
},
hideInSearch: true
},
...commonb,]
}
]
}
export default getcolumns;
\ No newline at end of file
import React, { useState, useMemo, useRef, useEffect } from 'react';
import DrawerPro from '@/components/DrawerPro';
import AutoTable from '@/components/AutoTable';
import PremButton from '@/components/PremButton';
import getcolumns from './columns';
import { doFetch } from '@/utils/doFetch';
import { useRequest } from "ahooks";
import { Divider, Tabs, ProDescriptions, message } from "antd";
import dayjs from 'dayjs';
import Leaseterminformation from "./Leaseterminformation";
const Costanalysis = () => {
let actionRef = useRef(), formRef = useRef(), boxRef = useRef();
const [drawer, setdrawer] = useState({
open: false,
}),
[extraparams, setextraparams] = useState({}),
[activeKey, catk] = useState('item-1');
const { run, loading, runAsync } = useRequest(doFetch, {
manual: true,
onSuccess: (res, params) => {
if (res?.code == "0000") {
actionRef?.current?.reload();
setdrawer((s) => ({
...s,
open: false,
}));
}
},
});
const columns = useMemo(() => {
let defcolumn = getcolumns(setdrawer, activeKey)?.filter(it => it.key == activeKey)?.[0]?.columns ?? [];
return defcolumn.concat({
title: '操作',
valueType: 'option',
width: activeKey == 'item-1' ? 260 : 100,
render: (text, row, _, action) => rightExtra(text, row, _, action),
});
}, [activeKey]);
const rightExtra = (text, row, _, action) => {
return [
activeKey == 'item-1' && <PremButton
key='confirm'
btn={{
size: 'small',
onClick: async () => {
let res = await doFetch({ url: '/lease/umContractEquipment/queryBeforeCollection', params: { id: row.id } });
if (res?.data?.data?.waitNum == 0) {
message.warning('该设备需回款的租期已全部回款,无需再次回款!')
} else {
setdrawer((s) => ({
...s,
open: true,
item: { ...row, waitNum: res?.data?.data?.waitNum, isColl: res?.data?.data?.isColl },
val: 'confirm',
title: '回款确认',
fields: [
{
title: '本期是否回款',
dataIndex: 'isColl',
key: 'isColl',
fieldProps: {
disabled: true
},
colProps: { span: 8 },
},
{
title: '剩余回款期数',
dataIndex: 'waitNum',
key: 'waitNum',
fieldProps: {
disabled: true
},
colProps: { span: 8 },
},
{
title: '本次回款期数',
dataIndex: 'collNum',
key: 'collNum',
valueType: 'digit',
colProps: { span: 8 },
precision: 0,
formItemProps: { rules: [{ required: true, message: '此项为必填项' }] }
},
{
title: '回款形式',
dataIndex: 'collType',
key: 'collType',
valueType: 'select',
options: [
{ label: '现金', value: 1 },
{ label: '银行承兑', value: 2 },
],
colProps: { span: 8 },
formItemProps: { rules: [{ required: true, message: '此项为必填项' }] },
},
]
}));
}
},
}}
>
回款确认
</PremButton>,
activeKey == 'item-1' && <PremButton
key='reduction'
btn={{
size: 'small',
onClick: async () => {
},
}}
>
租金减免
</PremButton>,
<PremButton
key='invoicing'
btn={{
size: 'small',
onClick: async () => {
},
}}
>
开票记录
</PremButton>
]
};
return <div ref={boxRef}>
<AutoTable
pagetitle={<h3 className="page-title">费用分析</h3>}
columns={columns}
path={activeKey == 'item-1' ? '/lease/umContractEquipment/queryNoAnalysis' : '/lease/umContractEquipment/queryYesAnalysis'}
actionRef={actionRef}
resizeable={false}
bordered={false}
x={2500}
extraparams={extraparams}
onTabChange={(key) => {
catk(key);
}}
activeTabKey={activeKey}
tabList={getcolumns()}
/>
<DrawerPro
{...drawer}
fields={drawer.fields}
params={{ id: drawer?.item?.id }}
defaultFormValue={drawer?.item ?? {}}
placement="right"
onClose={() => {
setdrawer((s) => ({
...s,
open: false,
}));
}}
>
<Leaseterminformation drawer={drawer} boxRef={boxRef} />
</DrawerPro>
</div>
}
export default Costanalysis;
\ No newline at end of file
import { Tooltip, Image, Tag } from 'antd';
import { doFetch } from '@/utils/doFetch';
const statusColors = {
1: '#7ac143',
2: '#00bce4',
3: '#6a737b',
4: '#fa4659'
};
function getcolumns(setdrawer, activeKey) {
return activeKey == 'item-1' ? {
columns: [
......@@ -130,12 +136,15 @@ function getcolumns(setdrawer, activeKey) {
hideInForm: true,
valueType: 'select',
options: [
{ label: '工作', value: '1' },
{ label: '待机', value: '2' },
{ label: '关机', value: '3' },
{ label: '报警', value: '4' }
{ label: '工作', value: 1 },
{ label: '待机', value: 2 },
{ label: '关机', value: 3 },
{ label: '报警', value: 4 }
],
fixed: 'right'
fixed: 'right',
render: (_, row) => {
return <span style={{ color: statusColors[row.collectStatus] }}>{row.collectStatusName}</span>
}
},
{
title: '所属信息',
......
......@@ -10,6 +10,8 @@ import TreeRender from '@/components/TreeRender';
import { Divider, Tabs, ProDescriptions } from "antd";
import Account from "./Account";
import Basemsg from "./Basemsg";
import { useModel } from "@umijs/max";
import dayjs from 'dayjs';
const Devicedata = () => {
let actionRef = useRef(), formRef = useRef(), boxRef = useRef();
const [drawer, setdrawer] = useState({
......@@ -18,7 +20,9 @@ const Devicedata = () => {
[extraparams, setextraparams] = useState({}),
[activeKey, catk] = useState('item-1'),
[item2extraparams, citp] = useState({}),
[searchParams, csp] = useState({});
[searchParams, csp] = useState({}),
[leaseList, clea] = useState([]);
const { allWebsocket: { commonWebsocket, commonWebmsg } } = useModel('useGlobal');
const { run, loading, runAsync } = useRequest(doFetch, {
manual: true,
onSuccess: (res, params) => {
......@@ -31,12 +35,42 @@ const Devicedata = () => {
}
},
}),
tableData = useRequest(async () => {
let res = await doFetch({ url: '/lease/umLeaseLedger/queryLeaseList', params: { ...searchParams, ...extraparams } });
return res?.data?.dataList ?? [];
}, {
refreshDeps: [extraparams, searchParams]
})
tableData = useRequest(() => doFetch({ url: '/lease/umLeaseLedger/queryLeaseList', params: { ...searchParams, ...extraparams } }), {
refreshDeps: [extraparams, searchParams],
onSuccess: (res, params) => {
if (res.code == '0000') {
clea(res?.data?.dataList ?? [])
}
}
});
useEffect(() => {
const msg = commonWebmsg?.msg;
if (commonWebmsg?.wsMsgModel == 'LEASE') {
let newList = JSON.parse(JSON.stringify(leaseList));
newList = newList?.map(it => {
if (it.id == msg.id) {
it.collectStatusName = msg.collectStatusName;
it.collectStatus = msg.collectStatus;
}
return it
});
clea(newList);
}
}, [commonWebmsg]);
useEffect(() => {
try {
commonWebsocket && commonWebsocket.emit("sendMessage", {
"wsMsgModel": "LEASE",
"subId": dayjs().valueOf(),
param: '',
unsubscribe: false,
});
} catch (error) {
}
}, []);
const columns = useMemo(() => {
let defcolumn = getcolumns(setdrawer, activeKey)?.columns ?? [];
return defcolumn;
......@@ -49,7 +83,7 @@ const Devicedata = () => {
key: 'item-1',
children: <AutoTable
columns={columns}
dataSource={tableData?.data ?? []}
dataSource={leaseList}
actionRef={actionRef}
resizeable={false}
bordered={false}
......@@ -70,7 +104,7 @@ const Devicedata = () => {
children: <Account boxRef={boxRef} extraparams={item2extraparams} />
}
]
}, [extraparams, tableData?.data]);
}, [extraparams, leaseList]);
const items = useMemo(() => {
if (drawer.val == 'only') {
if (activeKey == 'item-1') {
......
......@@ -2,6 +2,7 @@ import React, { useState, useRef } from 'react';
import AutoTable from '@/components/AutoTable/mtable';
import { useRequest } from 'ahooks';
import { doFetch } from '@/utils/doFetch';
import styles from "./index.less";
const columnsa = [
{
title: '客户名称',
......@@ -42,7 +43,10 @@ const columnsa = [
dataIndex: 'equipmentModelName',
key: 'equipmentModelId',
valueType: 'select',
options: { path: '/asset/equipmentModel/query/selection', params: {} }
options: { path: '/asset/equipmentModel/query/selection', params: {} },
fieldProps: {
showSearch: true
}
},
{
title: '设备品牌',
......@@ -77,25 +81,37 @@ const columnsa = [
title: '工作',
dataIndex: 'runRate',
key: 'runRate',
search: false
search: false,
render: (_, row) => {
return <span style={{ color: "#7ac143" }}>{row.runRate}%</span>
}
},
{
title: '待机',
dataIndex: 'standbyRate',
key: 'standbyRate',
search: false
search: false,
render: (_, row) => {
return <span style={{ color: "#00bce4" }}>{row.runRate}%</span>
}
},
{
title: '报警',
dataIndex: 'alarmRate',
key: 'alarmRate',
search: false
search: false,
render: (_, row) => {
return <span style={{ color: "#fa4659" }}>{row.runRate}%</span>
}
},
{
title: '关机',
dataIndex: 'offRate',
key: 'offRate',
search: false
search: false,
render: (_, row) => {
return <span style={{ color: "#6a737b" }}>{row.runRate}%</span>
}
},
];
......@@ -109,7 +125,7 @@ const Leasedevice = () => {
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">
......@@ -128,7 +144,7 @@ const Leasedevice = () => {
onRow={(record) => {
return {
onClick: (event) => {
console.log(event, record);
cr(record);
}
};
}}
......@@ -139,14 +155,19 @@ const Leasedevice = () => {
}}
toolBarRender={true}
options={false}
rowKey='ledgerCustomerId'
rowClassName={(record, index) => {
return record.ledgerCustomerId == clickrow?.ledgerCustomerId ? styles.rowClass : ''
}}
/>
</div>
<div style={{ flex: 2 }}>
<AutoTable
columns={columnsb}
path='/lease/umLeaseLedger/ledgerCustomerEquipmentUseDetail'
path={clickrow?.ledgerCustomerId ? '/lease/umLeaseLedger/ledgerCustomerEquipmentUseDetail' : ''}
resizeable={false}
pageextra="none"
extraparams={{ ledgerCustomerId: clickrow?.ledgerCustomerId }}
/>
</div>
</div>
......
.rowClass {
background-color: #e6f4ff;
}
\ No newline at end of file
......@@ -10,9 +10,9 @@ import TreeRender from '@/components/TreeRender';
const { RangePicker } = DatePicker;
const statusColors = {
报警: '#fa4659',
工作: '#00fff5',
待机: '#80d6ff',
关机: '#194769'
工作: '#7ac143',
待机: '#00bce4',
关机: '#6a737b'
},
format = 'YYYY-MM-DD HH:mm:ss';
const Devicestatus = ({ drawer }) => {
......@@ -151,14 +151,14 @@ const Devicestatus = ({ drawer }) => {
<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' }} >
return <div key={it} style={{ width: '31%', 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 style={{ width: '31%', display: 'flex', gap: 16, justifyContent: 'center' }} >
<div>总时长</div>
<div>{chartdata?.data?.data?.timeRange}小时</div>
</div>
......
......@@ -4099,6 +4099,11 @@ address@^1.0.1, address@^1.1.2:
resolved "https://mirrors.huaweicloud.com/repository/npm/address/-/address-1.2.2.tgz#2b5248dac5485a6390532c6a517fda2e3faac89e"
integrity sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==
after@0.8.2:
version "0.8.2"
resolved "https://registry.npmmirror.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f"
integrity sha512-QbJ0NTQ/I9DI3uSJA4cbexiwQeRAfjPScqIbSjUDd9TOrcg6pTkdgziesOqxBMBzit8vFCTwrP27t13vFOORRA==
agent-base@6:
version "6.0.2"
resolved "https://registry.npmmirror.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77"
......@@ -4463,6 +4468,11 @@ array.prototype.tosorted@^1.1.1:
es-shim-unscopables "^1.0.0"
get-intrinsic "^1.1.3"
arraybuffer.slice@~0.0.7:
version "0.0.7"
resolved "https://registry.npmmirror.com/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz#3bbc4275dd584cc1b10809b89d4e8b63a69e7675"
integrity sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==
arrify@^1.0.1:
version "1.0.1"
resolved "https://mirrors.huaweicloud.com/repository/npm/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d"
......@@ -4825,6 +4835,11 @@ babel-types@^6.26.0:
lodash "^4.17.4"
to-fast-properties "^1.0.3"
backo2@1.0.2:
version "1.0.2"
resolved "https://registry.npmmirror.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947"
integrity sha512-zj6Z6M7Eq+PBZ7PQxl5NT665MvJdAkzp0f60nAJ+sLaSCBPMwVak5ZegFbgVCzFcCJTKFoMizvM5Ld7+JrRJHA==
bail@^1.0.0:
version "1.0.5"
resolved "https://mirrors.huaweicloud.com/repository/npm/bail/-/bail-1.0.5.tgz#b6fa133404a392cbc1f8c4bf63f5953351e7a776"
......@@ -4840,6 +4855,11 @@ balanced-match@^2.0.0:
resolved "https://mirrors.huaweicloud.com/repository/npm/balanced-match/-/balanced-match-2.0.0.tgz#dc70f920d78db8b858535795867bf48f820633d9"
integrity sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==
base64-arraybuffer@0.1.5:
version "0.1.5"
resolved "https://registry.npmmirror.com/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz#73926771923b5a19747ad666aa5cd4bf9c6e9ce8"
integrity sha512-437oANT9tP582zZMwSvZGy2nmSeAb8DW2me3y+Uv1Wp2Rulr8Mqlyrv3E7MLxmsiaPSMMDmiDVzgE+e8zlMx9g==
base64-js@^1.0.2, base64-js@^1.3.1:
version "1.5.1"
resolved "https://mirrors.huaweicloud.com/repository/npm/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
......@@ -4865,6 +4885,13 @@ bcrypt-pbkdf@^1.0.0:
dependencies:
tweetnacl "^0.14.3"
better-assert@~1.0.0:
version "1.0.2"
resolved "https://registry.npmmirror.com/better-assert/-/better-assert-1.0.2.tgz#40866b9e1b9e0b55b481894311e68faffaebc522"
integrity sha512-bYeph2DFlpK1XmGs6fvlLRUN29QISM3GBuUwSFsMY2XRx4AvC0WNCS57j4c/xGrK2RS24C1w3YoBOsw9fT46tQ==
dependencies:
callsite "1.0.0"
big.js@^5.2.2:
version "5.2.2"
resolved "https://mirrors.huaweicloud.com/repository/npm/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328"
......@@ -4889,6 +4916,11 @@ blink-diff@^1.0.13:
resolved "https://mirrors.huaweicloud.com/repository/npm/blink-diff/-/blink-diff-1.0.13.tgz#80e3df69de804b30d40c70f041e983841ecda899"
integrity sha512-2hIEnGq8wruXfje9GvDV41VXo+4YdjrjL5ZMlVJT3Wi5k1jjz20fCTlVejSXoERirhEVsFYz9NmgdUYgQ41Giw==
blob@0.0.5:
version "0.0.5"
resolved "https://registry.npmmirror.com/blob/-/blob-0.0.5.tgz#d680eeef25f8cd91ad533f5b01eed48e64caf683"
integrity sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==
bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9:
version "4.12.0"
resolved "https://mirrors.huaweicloud.com/repository/npm/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88"
......@@ -5209,6 +5241,11 @@ caller-path@^2.0.0:
dependencies:
caller-callsite "^2.0.0"
callsite@1.0.0:
version "1.0.0"
resolved "https://registry.npmmirror.com/callsite/-/callsite-1.0.0.tgz#280398e5d664bd74038b6f0905153e6e8af1bc20"
integrity sha512-0vdNRFXn5q+dtOqjfFtmtlI9N2eVZ7LMyEV2iKC5mEEFvSg/69Ml6b/WU2qF8W1nLRa0wiSrDT3Y5jOHZCwKPQ==
callsites@^2.0.0:
version "2.0.0"
resolved "https://mirrors.huaweicloud.com/repository/npm/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50"
......@@ -5608,6 +5645,11 @@ compare-versions@^5.0.1:
resolved "https://mirrors.huaweicloud.com/repository/npm/compare-versions/-/compare-versions-5.0.3.tgz#a9b34fea217472650ef4a2651d905f42c28ebfd7"
integrity sha512-4UZlZP8Z99MGEY+Ovg/uJxJuvoXuN4M6B3hKaiackiHrgzQFEe3diJi1mf1PNHbFujM7FvLrK2bpgIaImbtZ1A==
component-bind@1.0.0:
version "1.0.0"
resolved "https://registry.npmmirror.com/component-bind/-/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1"
integrity sha512-WZveuKPeKAG9qY+FkYDeADzdHyTYdIboXS59ixDeRJL5ZhxpqUnxSOwop4FQjMsiYm3/Or8cegVbpAHNA7pHxw==
component-classes@^1.2.5:
version "1.2.6"
resolved "https://mirrors.huaweicloud.com/repository/npm/component-classes/-/component-classes-1.2.6.tgz#c642394c3618a4d8b0b8919efccbbd930e5cd691"
......@@ -5615,7 +5657,12 @@ component-classes@^1.2.5:
dependencies:
component-indexof "0.0.3"
component-emitter@^1.2.1:
component-emitter@1.2.1:
version "1.2.1"
resolved "https://registry.npmmirror.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6"
integrity sha512-jPatnhd33viNplKjqXKRkGU345p263OIWzDL2wH3LGIGp5Kojo+uXizHmOADRvhGFFTnJqX3jBAKP6vvmSDKcA==
component-emitter@^1.2.1, component-emitter@~1.3.0:
version "1.3.0"
resolved "https://mirrors.huaweicloud.com/repository/npm/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0"
integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==
......@@ -5625,6 +5672,11 @@ component-indexof@0.0.3:
resolved "https://mirrors.huaweicloud.com/repository/npm/component-indexof/-/component-indexof-0.0.3.tgz#11d091312239eb8f32c8f25ae9cb002ffe8d3c24"
integrity sha512-puDQKvx/64HZXb4hBwIcvQLaLgux8o1CbWl39s41hrIIZDl1lJiD5jc22gj3RBeGK0ovxALDYpIbyjqDUUl0rw==
component-inherit@0.0.3:
version "0.0.3"
resolved "https://registry.npmmirror.com/component-inherit/-/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143"
integrity sha512-w+LhYREhatpVqTESyGFg3NlP6Iu0kEKUHETY9GoZP/pQyW4mHFZuFWRUCIqVPZ36ueVLtoOEZaAqbCF2RDndaA==
compressible@~2.0.16:
version "2.0.18"
resolved "https://mirrors.huaweicloud.com/repository/npm/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba"
......@@ -6123,6 +6175,13 @@ debug@^3.1.0, debug@^3.2.6:
dependencies:
ms "^2.1.1"
debug@~3.1.0:
version "3.1.0"
resolved "https://registry.npmmirror.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261"
integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==
dependencies:
ms "2.0.0"
decamelize-keys@^1.1.0:
version "1.1.1"
resolved "https://mirrors.huaweicloud.com/repository/npm/decamelize-keys/-/decamelize-keys-1.1.1.tgz#04a2d523b2f18d80d0158a43b895d56dff8d19d8"
......@@ -6626,6 +6685,34 @@ end-of-stream@^1.1.0, end-of-stream@^1.4.1:
dependencies:
once "^1.4.0"
engine.io-client@~3.3.1:
version "3.3.3"
resolved "https://registry.npmmirror.com/engine.io-client/-/engine.io-client-3.3.3.tgz#aeb45695ced81b787a8a10c92b0bc226b1cb3c53"
integrity sha512-PXIgpzb1brtBzh8Q6vCjzCMeu4nfEPmaDm+L3Qb2sVHwLkxC1qRiBMSjOB0NJNjZ0hbPNUKQa+s8J2XxLOIEeQ==
dependencies:
component-emitter "1.2.1"
component-inherit "0.0.3"
debug "~3.1.0"
engine.io-parser "~2.1.1"
has-cors "1.1.0"
indexof "0.0.1"
parseqs "0.0.5"
parseuri "0.0.5"
ws "~6.1.0"
xmlhttprequest-ssl "~1.6.3"
yeast "0.1.2"
engine.io-parser@~2.1.1:
version "2.1.3"
resolved "https://registry.npmmirror.com/engine.io-parser/-/engine.io-parser-2.1.3.tgz#757ab970fbf2dfb32c7b74b033216d5739ef79a6"
integrity sha512-6HXPre2O4Houl7c4g7Ic/XzPnHBvaEmN90vtRO9uLmwtRqQmTOw0QMevL1TOfL2Cpu1VzsaTmMotQgMdkzGkVA==
dependencies:
after "0.8.2"
arraybuffer.slice "~0.0.7"
base64-arraybuffer "0.1.5"
blob "0.0.5"
has-binary2 "~1.0.2"
enhanced-resolve@5.9.3:
version "5.9.3"
resolved "https://mirrors.huaweicloud.com/repository/npm/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz#44a342c012cbc473254af5cc6ae20ebd0aae5d88"
......@@ -8401,6 +8488,18 @@ has-bigints@^1.0.1, has-bigints@^1.0.2:
resolved "https://mirrors.huaweicloud.com/repository/npm/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa"
integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==
has-binary2@~1.0.2:
version "1.0.3"
resolved "https://registry.npmmirror.com/has-binary2/-/has-binary2-1.0.3.tgz#7776ac627f3ea77250cfc332dab7ddf5e4f5d11d"
integrity sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==
dependencies:
isarray "2.0.1"
has-cors@1.1.0:
version "1.1.0"
resolved "https://registry.npmmirror.com/has-cors/-/has-cors-1.1.0.tgz#5e474793f7ea9843d1bb99c23eef49ff126fff39"
integrity sha512-g5VNKdkFuUuVCP9gYfDJHjK2nqdQJ7aDLTnycnc2+RvsOQbuLdF5pm7vuE5J76SEBIQjs4kQY/BWq74JUmjbXA==
has-flag@^2.0.0:
version "2.0.0"
resolved "https://mirrors.huaweicloud.com/repository/npm/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51"
......@@ -8849,6 +8948,11 @@ indent-string@^4.0.0:
resolved "https://mirrors.huaweicloud.com/repository/npm/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251"
integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==
indexof@0.0.1:
version "0.0.1"
resolved "https://registry.npmmirror.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d"
integrity sha512-i0G7hLJ1z0DE8dsqJa2rycj9dBmNKgXBvotXtZYXakU9oivfB9Uj2ZBC27qqef2U58/ZLwalxa1X/RDCdkHtVg==
inflight@^1.0.4:
version "1.0.6"
resolved "https://mirrors.huaweicloud.com/repository/npm/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
......@@ -9424,6 +9528,11 @@ isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0:
resolved "https://mirrors.huaweicloud.com/repository/npm/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==
isarray@2.0.1:
version "2.0.1"
resolved "https://registry.npmmirror.com/isarray/-/isarray-2.0.1.tgz#a37d94ed9cda2d59865c9f76fe596ee1f338741e"
integrity sha512-c2cu3UxbI+b6kR3fy0nRnAhodsvR9dx7U5+znCOzdj6IfP3upFURTr0Xl5BlQZNKZjEtxrmVyfSdeE3O57smoQ==
isarray@^2.0.5:
version "2.0.5"
resolved "https://mirrors.huaweicloud.com/repository/npm/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723"
......@@ -10889,6 +10998,11 @@ object-assign@4.x, object-assign@^4, object-assign@^4.0.1, object-assign@^4.1.0,
resolved "https://mirrors.huaweicloud.com/repository/npm/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==
object-component@0.0.3:
version "0.0.3"
resolved "https://registry.npmmirror.com/object-component/-/object-component-0.0.3.tgz#f0c69aa50efc95b866c186f400a33769cb2f1291"
integrity sha512-S0sN3agnVh2SZNEIGc0N1X4Z5K0JeFbGBrnuZpsxuUh5XLF0BnvWkMjRXo/zGKLd/eghvNIKcx1pQkmUjXIyrA==
object-copy@^0.1.0:
version "0.1.0"
resolved "https://mirrors.huaweicloud.com/repository/npm/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c"
......@@ -11263,6 +11377,20 @@ parse5@6.0.1:
resolved "https://registry.npmmirror.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b"
integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==
parseqs@0.0.5:
version "0.0.5"
resolved "https://registry.npmmirror.com/parseqs/-/parseqs-0.0.5.tgz#d5208a3738e46766e291ba2ea173684921a8b89d"
integrity sha512-B3Nrjw2aL7aI4TDujOzfA4NsEc4u1lVcIRE0xesutH8kjeWF70uk+W5cBlIQx04zUH9NTBvuN36Y9xLRPK6Jjw==
dependencies:
better-assert "~1.0.0"
parseuri@0.0.5:
version "0.0.5"
resolved "https://registry.npmmirror.com/parseuri/-/parseuri-0.0.5.tgz#80204a50d4dbb779bfdc6ebe2778d90e4bce320a"
integrity sha512-ijhdxJu6l5Ru12jF0JvzXVPvsC+VibqeaExlNoMhWN6VQ79PGjkmc7oA4W1lp00sFkNyj0fx6ivPLdV51/UMog==
dependencies:
better-assert "~1.0.0"
parseurl@~1.3.3:
version "1.3.3"
resolved "https://mirrors.huaweicloud.com/repository/npm/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4"
......@@ -14085,6 +14213,35 @@ snapdragon@^0.8.1:
source-map-resolve "^0.5.0"
use "^3.1.0"
socket.io-client@2.2.0:
version "2.2.0"
resolved "https://registry.npmmirror.com/socket.io-client/-/socket.io-client-2.2.0.tgz#84e73ee3c43d5020ccc1a258faeeb9aec2723af7"
integrity sha512-56ZrkTDbdTLmBIyfFYesgOxsjcLnwAKoN4CiPyTVkMQj3zTUh0QAx3GbvIvLpFEOvQWu92yyWICxB0u7wkVbYA==
dependencies:
backo2 "1.0.2"
base64-arraybuffer "0.1.5"
component-bind "1.0.0"
component-emitter "1.2.1"
debug "~3.1.0"
engine.io-client "~3.3.1"
has-binary2 "~1.0.2"
has-cors "1.1.0"
indexof "0.0.1"
object-component "0.0.3"
parseqs "0.0.5"
parseuri "0.0.5"
socket.io-parser "~3.3.0"
to-array "0.1.4"
socket.io-parser@~3.3.0:
version "3.3.3"
resolved "https://registry.npmmirror.com/socket.io-parser/-/socket.io-parser-3.3.3.tgz#3a8b84823eba87f3f7624e64a8aaab6d6318a72f"
integrity sha512-qOg87q1PMWWTeO01768Yh9ogn7chB9zkKtQnya41Y355S0UmpXgpcrFwAgjYJxu9BdKug5r5e9YtVSeWhKBUZg==
dependencies:
component-emitter "~1.3.0"
debug "~3.1.0"
isarray "2.0.1"
sonic-boom@^2.2.1:
version "2.8.0"
resolved "https://mirrors.huaweicloud.com/repository/npm/sonic-boom/-/sonic-boom-2.8.0.tgz#c1def62a77425090e6ad7516aad8eb402e047611"
......@@ -14861,6 +15018,11 @@ tmpl@1.0.5:
resolved "https://mirrors.huaweicloud.com/repository/npm/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc"
integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==
to-array@0.1.4:
version "0.1.4"
resolved "https://registry.npmmirror.com/to-array/-/to-array-0.1.4.tgz#17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890"
integrity sha512-LhVdShQD/4Mk4zXNroIQZJC+Ap3zgLcDuwEdcmLv9CCO73NWockQDwyUnW/m8VX/EElfL6FcYx7EeutN4HJA6A==
to-arraybuffer@^1.0.0:
version "1.0.1"
resolved "https://mirrors.huaweicloud.com/repository/npm/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43"
......@@ -15822,6 +15984,13 @@ ws@^8.2.3:
resolved "https://registry.npmmirror.com/ws/-/ws-8.14.1.tgz#4b9586b4f70f9e6534c7bb1d3dc0baa8b8cf01e0"
integrity sha512-4OOseMUq8AzRBI/7SLMUwO+FEDnguetSk7KMb1sHwvF2w2Wv5Hoj0nlifx8vtGsftE/jWHojPy8sMMzYLJ2G/A==
ws@~6.1.0:
version "6.1.4"
resolved "https://registry.npmmirror.com/ws/-/ws-6.1.4.tgz#5b5c8800afab925e94ccb29d153c8d02c1776ef9"
integrity sha512-eqZfL+NE/YQc1/ZynhojeV8q+H050oR8AZ2uIev7RU10svA9ZnJUddHcOUZTJLinZ9yEfdA2kSATS2qZK5fhJA==
dependencies:
async-limiter "~1.0.0"
xdg-basedir@^3.0.0:
version "3.0.0"
resolved "https://mirrors.huaweicloud.com/repository/npm/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4"
......@@ -15837,6 +16006,11 @@ xmlchars@^2.2.0:
resolved "https://registry.npmmirror.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb"
integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==
xmlhttprequest-ssl@~1.6.3:
version "1.6.3"
resolved "https://registry.npmmirror.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.6.3.tgz#03b713873b01659dfa2c1c5d056065b27ddc2de6"
integrity sha512-3XfeQE/wNkvrIktn2Kf0869fC0BN6UpydVasGIeSm2B1Llihf7/0UfZM+eCkOw3P7bP4+qPgqhm7ZoxuJtFU0Q==
xtend@^4.0.0:
version "4.0.2"
resolved "https://mirrors.huaweicloud.com/repository/npm/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54"
......@@ -15906,6 +16080,11 @@ yauzl@^2.10.0:
buffer-crc32 "~0.2.3"
fd-slicer "~1.1.0"
yeast@0.1.2:
version "0.1.2"
resolved "https://registry.npmmirror.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419"
integrity sha512-8HFIh676uyGYP6wP13R/j6OJ/1HwJ46snpvzE7aHAN3Ryqh2yX6Xox2B4CUmTwwOIzlG3Bs7ocsP5dZH/R1Qbg==
yocto-queue@^0.1.0:
version "0.1.0"
resolved "https://mirrors.huaweicloud.com/repository/npm/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b"
......
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