@ -7,12 +7,18 @@ import { observer } from "mobx-react";
import * as config from "../config" ;
import * as config from "../config" ;
import { NavLink } from "react-router-dom" ;
import { NavLink } from "react-router-dom" ;
import * as comm from '@haina/utils-commons' ;
import * as comm from '@haina/utils-commons' ;
import { show _vs _tag } from './../utils/commons' ;
import { utils , writeFileXLSX } from "xlsx" ;
import DateGroupRadio from '../components/DateGroupRadio' ;
import DateGroupRadio from '../components/DateGroupRadio' ;
import SearchForm from './../components/search/SearchForm' ;
import SearchForm from './../components/search/SearchForm' ;
import { TableExportBtn } from './../components/Data' ;
import { TableExportBtn , VSDataTag } from './../components/Data' ;
import ParetoChart from "../components/Pareto" ;
import ParetoChart from "../components/Pareto" ;
import { toJS } from 'mobx' ;
const DataRenderCell = ( { data1 , data2 , dataSuffix = '' , showDiffData , ... props } ) => {
if ( showDiffData ) {
return < VSDataTag data1 = { data1 } data2 = { data2 } dataSuffix = { dataSuffix } { ...props } / > ;
}
return < div > { data1 } { dataSuffix } < / div > ;
} ;
class Orders extends Component {
class Orders extends Component {
static contextType = stores _Context ;
static contextType = stores _Context ;
@ -24,229 +30,181 @@ class Orders extends Component {
format _data ( data ) {
format _data ( data ) {
const { date _picker _store , orders _store } = this . context ;
const { date _picker _store , orders _store } = this . context ;
const result = { dataSource : [ ] , columns : [ ] } ;
const result = { dataSource : [ ] , columns : [ ] } ;
if ( ! comm . emptyValue ( data ) ) {
if ( ! comm . isEmpty ( data ) ) {
const ordercountTotal1 = data . ordercountTotal1 ;
const rows1Map = data . ordercount1 . reduce ( ( a , row1 ) => ( { ... a , [ row1 . OrderTypeSN ] : row1 } ) , { } ) ;
const ordercountTotal2 = data . ordercountTotal2 ;
const rows2Map = data . ordercount2 . reduce ( ( a , row2 ) => ( { ... a , [ row2 . OrderTypeSN ] : row2 } ) , { } ) ;
if ( date _picker _store . start _date _cp && date _picker _store . end _date _cp ) {
/ / D i f f : e l e m e n t s i n r o w s 2 b u t n o t i n r o w s 1
/ / 有 比 较 的 数 据
const diffKey = [ ... new Set ( Object . keys ( rows2Map ) . filter ( ( x ) => ! new Set ( Object . keys ( rows1Map ) ) . has ( x ) ) ) ] ;
result . columns = [
const withDiff1 = ( structuredClone ( toJS ( data . ordercount1 ) ) || [ ] ) . map ( ( r1 ) => ( { ... r1 , diff : rows2Map [ r1 . OrderTypeSN ] } ) ) ;
{
withDiff1 . push (
title : '#' ,
... diffKey . map ( ( key ) => ( {
fixed : 'left' ,
diff : rows2Map [ key ] ,
children : [
EOI _ObjSN : rows2Map [ key ] . EOI _ObjSN ,
{
OrderType : rows2Map [ key ] . OrderType ,
title : (
CJrate : 0 ,
< span >
CJCount _vs : - 100 ,
< div >
CJPersonNum _vs : - 100 ,
{ date _picker _store . start _date . format ( config . DATE _FORMAT ) } ~ { date _picker _store . end _date . format ( config . DATE _FORMAT ) }
CJrate _vs : - 100 ,
< / div >
YJLY _vs : - 100 ,
< div >
OrderCount _vs : - 100 ,
{ date _picker _store . start _date _cp . format ( config . DATE _FORMAT ) } ~ { date _picker _store . end _date _cp . format ( config . DATE _FORMAT ) }
CJCount _diff : - rows2Map [ key ] . CJCount ,
< / div >
CJPersonNum _diff : - rows2Map [ key ] . CJPersonNum ,
< / span >
CJrate _diff : - rows2Map [ key ] . CJrate ,
) ,
YJLY _diff : - rows2Map [ key ] . YJLY ,
titleX : ` ${ date _picker _store . start _date . format ( config . DATE _FORMAT ) } ~ ${ date _picker _store . end _date . format ( config . DATE _FORMAT ) } vs ${ date _picker _store . start _date _cp . format (
OrderCount _diff : - rows2Map [ key ] . OrderCount ,
config . DATE _FORMAT
Ordervalue : 0 ,
) } ~ $ { date _picker _store . end _date _cp . format ( config . DATE _FORMAT ) } ` ,
Ordervalue _diff : - rows2Map [ key ] . Ordervalue ,
dataIndex : 'OrderType' ,
Ordervalue _vs : - 100 ,
fixed : 'left' ,
} ) )
render : ( text , record ) => < NavLink to = { ` /orders_sub/ ${ orders _store . active _tab _key } / ${ record . OrderTypeSN } / ${ encodeURIComponent ( record . OrderType ) } ` } > { text } < / NavLink > ,
) ;
} ,
const showDiff = date _picker _store . start _date _cp && date _picker _store . end _date _cp ;
] ,
result . dataSource = withDiff1 ;
} ,
{
title : '数量' ,
children : [
{
title : show _vs _tag ( ordercountTotal1 . OrderCount _vs , ordercountTotal1 . OrderCount _diff , ordercountTotal1 . OrderCount , ordercountTotal2 . OrderCount ) ,
titleX : [ ordercountTotal1 . OrderCount , ordercountTotal2 . OrderCount ] . join ( ' vs ' ) ,
dataIndex : 'OrderCount' ,
} ,
] ,
} ,
{
title : '成交数' ,
children : [
{
title : show _vs _tag ( ordercountTotal1 . CJCount _vs , ordercountTotal1 . CJCount _diff , ordercountTotal1 . CJCount , ordercountTotal2 . CJCount ) ,
titleX : [ ordercountTotal1 . CJCount , ordercountTotal2 . CJCount ] . join ( ' vs ' ) ,
dataIndex : 'CJCount' ,
} ,
] ,
} ,
{
title : '成交人数' ,
children : [
{
title : show _vs _tag ( ordercountTotal1 . CJPersonNum _vs , ordercountTotal1 . CJPersonNum _diff , ordercountTotal1 . CJPersonNum , ordercountTotal2 . CJPersonNum ) ,
titleX : [ ordercountTotal1 . CJPersonNum , ordercountTotal2 . CJPersonNum ] . join ( ' vs ' ) ,
dataIndex : 'CJPersonNum' ,
} ,
] ,
} ,
{
title : '成交率' ,
children : [
{
title : show _vs _tag ( ordercountTotal1 . CJrate _vs , ordercountTotal1 . CJrate _diff , ordercountTotal1 . CJrate , ordercountTotal2 . CJrate ) ,
titleX : [ ordercountTotal1 . CJrate , ordercountTotal2 . CJrate ] . join ( ' vs ' ) ,
dataIndex : 'CJrate' ,
} ,
] ,
} ,
{
title : '成交毛利(预计)' ,
children : [
{
title : show _vs _tag ( ordercountTotal1 . YJLY _vs , ordercountTotal1 . YJLY _diff , ordercountTotal1 . YJLY , ordercountTotal2 . YJLY ) ,
titleX : [ ordercountTotal1 . YJLY , ordercountTotal2 . YJLY ] . join ( ' vs ' ) ,
dataIndex : 'YJLY' ,
} ,
] ,
} ,
{
const ordercountTotal1 = data . ordercountTotal1 ;
title : '单个订单价值' ,
const ordercountTotal2 = data . ordercountTotal2 ;
children : [
result . columns = [
{
{
title : show _vs _tag ( ordercountTotal1 . Ordervalue _vs , ordercountTotal1 . Ordervalue _diff , ordercountTotal1 . Ordervalue , ordercountTotal2 . Ordervalue ) ,
title : '#' ,
titleX : [ ordercountTotal1 . Ordervalue , ordercountTotal2 . Ordervalue ] . join ( ' vs ' ) ,
fixed : 'left' ,
dataIndex : 'Ordervalue' ,
children : [
} ,
{
] ,
title : (
} ,
< span >
] ;
< div >
/ / 1 . 找 出 两 个 数 组 O r d e r T y p e 相 同 的 数 据 做 比 较 显 示 2 . 找 出 两 组 数 据 O r d e r T y p e 都 不 相 同 的 数 据 做 显 示
{ date _picker _store . start _date . format ( config . DATE _FORMAT ) } ~ { date _picker _store . end _date . format ( config . DATE _FORMAT ) }
let has _same _type = false ; / / 数 组 1 在 数 组 2 中 是 否 找 到 相 同 的 类 型
< / div >
for ( const item of data . ordercount1 ) {
{ showDiff ? < div >
has _same _type = false ;
{ date _picker _store . start _date _cp . format ( config . DATE _FORMAT ) } ~ { date _picker _store . end _date _cp . format ( config . DATE _FORMAT ) }
/ / 数 组 1 在 数 组 2 中 相 同 的 类 型
< / div > : null }
for ( const item2 of data . ordercount2 ) {
< / span >
if ( item . OrderType === item2 . OrderType ) {
) ,
has _same _type = true ;
titleX : showDiff ? ` ${ date _picker _store . start _date . format ( config . DATE _FORMAT ) } ~ ${ date _picker _store . end _date . format ( config . DATE _FORMAT ) } vs ${ date _picker _store . start _date _cp . format (
result . dataSource . push ( {
config . DATE _FORMAT
key : item . key ,
) } ~ $ { date _picker _store . end _date _cp . format ( config . DATE _FORMAT ) } ` : ` $ { date _picker _store . start _date . format ( config . DATE _FORMAT ) } ~ $ { date _picker _store . end _date . format ( config . DATE _FORMAT ) } ` ,
OrderType : item . OrderType ,
dataIndex : 'OrderType' ,
OrderTypeSN : item . OrderTypeSN ,
fixed : 'left' ,
OrderCount : show _vs _tag ( item . OrderCount _vs , item . OrderCount _diff , item . OrderCount , item2 . OrderCount ) ,
render : ( text , record ) => < NavLink to = { ` /orders_sub/ ${ orders _store . active _tab _key } / ${ record . OrderTypeSN } / ${ encodeURIComponent ( record . OrderType ) } ` } > { text } < / NavLink > ,
OrderCount _X : ( [ item . OrderCount , item2 . OrderCount ] . join ( ' vs ' ) ) ,
} ,
CJCount : show _vs _tag ( item . CJCount _vs , item . CJCount _diff , item . CJCount , item2 . CJCount ) ,
] ,
CJCount _X : ( [ item . CJCount , item2 . CJCount ] . join ( ' vs ' ) ) ,
} ,
CJPersonNum : show _vs _tag ( item . CJPersonNum _vs , item . CJPersonNum _diff , item . CJPersonNum , item2 . CJPersonNum ) ,
{
CJPersonNum _X : ( [ item . CJPersonNum , item2 . CJPersonNum ] . join ( ' vs ' ) ) ,
title : '数量' ,
CJrate : show _vs _tag ( item . CJrate _vs , item . CJrate _diff , item . CJrate , item2 . CJrate ) ,
children : [
CJrate _X : ( [ item . CJrate , item2 . CJrate ] . join ( ' vs ' ) ) ,
{
YJLY : show _vs _tag ( item . YJLY _vs , item . YJLY _diff , item . YJLY , item2 . YJLY ) ,
title : (
YJLY _X : ( [ item . YJLY , item2 . YJLY ] . join ( ' vs ' ) ) ,
< DataRenderCell
Ordervalue : show _vs _tag ( item . Ordervalue _vs , item . Ordervalue _diff , item . Ordervalue , item2 . Ordervalue ) ,
showDiffData = { showDiff }
Ordervalue _X : ( [ item . Ordervalue , item2 . Ordervalue ] . join ( ' vs ' ) ) ,
data1 = { ordercountTotal1 ? . OrderCount }
} ) ;
data2 = { ordercountTotal2 ? . OrderCount }
}
diffPercent = { ordercountTotal1 ? . OrderCount _vs }
}
diffData = { ordercountTotal1 ? . OrderCount _diff }
/ / 数 组 1 中 不 在 数 组 2 的 类 型
/ >
if ( has _same _type === false ) {
) ,
result . dataSource . push ( {
titleX : [ ordercountTotal1 . OrderCount , ordercountTotal2 . OrderCount ] . join ( ' vs ' ) ,
key : item . key ,
dataIndex : 'OrderCount' ,
OrderType : item . OrderType ,
render : ( text , r ) => < DataRenderCell showDiffData = { showDiff } data1 = { text } data2 = { r . diff ? . OrderCount } diffPercent = { r . OrderCount _vs } diffData = { r . OrderCount _diff } / > ,
OrderTypeSN : item . OrderTypeSN ,
} ,
OrderCount : show _vs _tag ( comm . formatPercent ( item . OrderCount ) , item . OrderCount , item . OrderCount , 0 ) ,
] ,
OrderCount _X : ( [ item . OrderCount , 0 ] . join ( ' vs ' ) ) ,
} ,
CJCount : show _vs _tag ( comm . formatPercent ( item . CJCount ) , item . CJCount , item . CJCount , 0 ) ,
{
CJCount _X : ( [ item . CJCount , 0 ] . join ( ' vs ' ) ) ,
title : '成交数' ,
CJPersonNum : show _vs _tag ( comm . formatPercent ( item . CJPersonNum ) , item . CJPersonNum , item . CJPersonNum , 0 ) ,
children : [
CJPersonNum _X : ( [ item . CJPersonNum , 0 ] . join ( ' vs ' ) ) ,
{
CJrate : show _vs _tag ( item . CJrate , item . CJrate , item . CJrate , 0 ) ,
title : (
CJrate _X : ( [ item . CJrate , 0 ] . join ( ' vs ' ) ) ,
< DataRenderCell
YJLY : show _vs _tag ( comm . formatPercent ( item . YJLY ) , item . YJLY , item . YJLY , 0 ) ,
showDiffData = { showDiff }
YJLY _X : ( [ item . YJLY , 0 ] . join ( ' vs ' ) ) ,
data1 = { ordercountTotal1 ? . CJCount }
Ordervalue : show _vs _tag ( comm . formatPercent ( item . Ordervalue ) , item . Ordervalue , item . Ordervalue , 0 ) ,
data2 = { ordercountTotal2 ? . CJCount }
Ordervalue _X : ( [ item . Ordervalue , 0 ] . join ( ' vs ' ) ) ,
diffPercent = { ordercountTotal1 ? . CJCount _vs }
} ) ;
diffData = { ordercountTotal1 ? . CJCount _diff }
}
/ >
}
) ,
/ / 数 组 2 中 不 在 数 组 1 的 类 型
titleX : [ ordercountTotal1 . CJCount , ordercountTotal2 . CJCount ] . join ( ' vs ' ) ,
for ( const item2 of data . ordercount2 ) {
dataIndex : 'CJCount' ,
has _same _type = false ;
render : ( text , r ) => < DataRenderCell showDiffData = { showDiff } data1 = { text } data2 = { r . diff ? . CJCount } diffPercent = { r . CJCount _vs } diffData = { r . CJCount _diff } / > ,
for ( const item of data . ordercount1 ) {
} ,
if ( item . OrderType === item2 . OrderType ) {
] ,
has _same _type = true ;
} ,
}
{
}
title : '成交人数' ,
if ( has _same _type === false ) {
children : [
result . dataSource . push ( {
{
key : item2 . key ,
title : (
OrderType : item2 . OrderType ,
< DataRenderCell
OrderTypeSN : item2 . OrderTypeSN ,
showDiffData = { showDiff }
OrderCount : show _vs _tag ( comm . formatPercent ( - item2 . OrderCount ) , - item2 . OrderCount , 0 , item2 . OrderCount ) ,
data1 = { ordercountTotal1 ? . CJPersonNum }
OrderCount _X : ( [ 0 , item2 . OrderCount ] . join ( ' vs ' ) ) ,
data2 = { ordercountTotal2 ? . CJPersonNum }
CJCount : show _vs _tag ( comm . formatPercent ( - item2 . CJCount ) , - item2 . CJCount , 0 , item2 . CJCount ) ,
diffPercent = { ordercountTotal1 ? . CJPersonNum _vs }
CJCount _X : ( [ 0 , item2 . CJCount ] . join ( ' vs ' ) ) ,
diffData = { ordercountTotal1 ? . CJPersonNum _diff }
CJPersonNum : show _vs _tag ( comm . formatPercent ( - item2 . CJPersonNum ) , - item2 . CJPersonNum , 0 , item2 . CJPersonNum ) ,
/ >
CJPersonNum _X : ( [ 0 , item2 . CJPersonNum ] . join ( ' vs ' ) ) ,
) ,
CJrate : show _vs _tag ( - item2 . CJrate , - item2 . CJrate , 0 , item2 . CJrate ) ,
titleX : [ ordercountTotal1 . CJPersonNum , ordercountTotal2 . CJPersonNum ] . join ( ' vs ' ) ,
CJrate _X : ( [ 0 , item2 . CJrate ] . join ( ' vs ' ) ) ,
dataIndex : 'CJPersonNum' ,
YJLY : show _vs _tag ( comm . formatPercent ( - item2 . YJLY ) , - item2 . YJLY , 0 , item2 . YJLY ) ,
render : ( text , r ) => < DataRenderCell showDiffData = { showDiff } data1 = { text } data2 = { r . diff ? . CJPersonNum } diffPercent = { r . CJPersonNum _vs } diffData = { r . CJPersonNum _diff } / > ,
YJLY _X : ( [ 0 , item2 . YJLY ] . join ( ' vs ' ) ) ,
} ,
Ordervalue : show _vs _tag ( comm . formatPercent ( - item2 . Ordervalue ) , - item2 . Ordervalue , 0 , item2 . Ordervalue ) ,
] ,
Ordervalue _X : ( [ 0 , item2 . Ordervalue ] . join ( ' vs ' ) ) ,
} ,
} ) ;
{
}
title : '成交率' ,
}
children : [
} else {
{
result . columns = [
title : (
{
< DataRenderCell
title : "#" ,
showDiffData = { showDiff }
fixed : 'left' ,
data1 = { ordercountTotal1 ? . CJrate }
children : [
data2 = { ordercountTotal2 ? . CJrate }
{
diffPercent = { ordercountTotal1 ? . CJrate _vs }
title : (
diffData = { ordercountTotal1 ? . CJrate _diff }
< span >
/ >
< div >
) ,
{ date _picker _store . start _date . format ( config . DATE _FORMAT ) } ~ { date _picker _store . end _date . format ( config . DATE _FORMAT ) }
titleX : [ ordercountTotal1 . CJrate , ordercountTotal2 . CJrate ] . join ( ' vs ' ) ,
< / div >
dataIndex : 'CJrate' ,
< / span >
render : ( text , r ) => < DataRenderCell showDiffData = { showDiff } data1 = { text } data2 = { r . diff ? . CJrate } diffPercent = { r . CJrate _vs } diffData = { r . CJrate _diff } / > ,
) ,
} ,
titleX : ` ${ date _picker _store . start _date . format ( config . DATE _FORMAT ) } ~ ${ date _picker _store . end _date . format ( config . DATE _FORMAT ) } ` ,
] ,
fixed : 'left' ,
} ,
dataIndex : "OrderType" ,
{
render : ( text , record ) => < NavLink to = { ` /orders_sub/ ${ orders _store . active _tab _key } / ${ record . OrderTypeSN } / ${ encodeURIComponent ( record . OrderType ) } ` } > { text } < / NavLink > ,
title : '成交毛利(预计)' ,
} ,
children : [
] ,
{
} ,
title : (
{
< DataRenderCell
title : "数量" ,
showDiffData = { showDiff }
children : [ { title : ordercountTotal1 . OrderCount , dataIndex : "OrderCount" } ] ,
data1 = { ordercountTotal1 ? . YJLY }
sorter : ( a , b ) => b . OrderCount - a . OrderCount ,
data2 = { ordercountTotal2 ? . YJLY }
} ,
diffPercent = { ordercountTotal1 ? . YJLY _vs }
{
diffData = { ordercountTotal1 ? . YJLY _diff }
title : "成交数" ,
/ >
children : [ { title : ordercountTotal1 . CJCount , dataIndex : "CJCount" } ] ,
) ,
sorter : ( a , b ) => b . CJCount - a . CJCount ,
titleX : [ ordercountTotal1 . YJLY , ordercountTotal2 . YJLY ] . join ( ' vs ' ) ,
} ,
dataIndex : 'YJLY' ,
{
render : ( text , r ) => < DataRenderCell showDiffData = { showDiff } data1 = { text } data2 = { r . diff ? . YJLY } diffPercent = { r . YJLY _vs } diffData = { r . YJLY _diff } / > ,
title : "成交人数" ,
} ,
children : [ { title : ordercountTotal1 . CJPersonNum , dataIndex : "CJPersonNum" } ] ,
] ,
sorter : ( a , b ) => b . CJPersonNum - a . CJPersonNum ,
} ,
} ,
{
{
title : "成交率" ,
title : '单个订单价值' ,
children : [ { title : ordercountTotal1 . CJrate , dataIndex : "CJrate" } ] ,
children : [
sorter : ( a , b ) => parseInt ( b . CJrate ) - parseInt ( a . CJrate ) ,
{
} ,
title : (
{
< DataRenderCell
title : "成交毛利(预计)" ,
showDiffData = { showDiff }
children : [ { title : ordercountTotal1 . YJLY , dataIndex : "YJLY" } ] ,
data1 = { ordercountTotal1 ? . Ordervalue }
sorter : ( a , b ) => parseFloat ( b . YJLY . replace ( /,/g , "" ) ) - parseFloat ( a . YJLY . replace ( /,/g , "" ) ) ,
data2 = { ordercountTotal2 ? . Ordervalue }
} ,
diffPercent = { ordercountTotal1 ? . Ordervalue _vs }
diffData = { ordercountTotal1 ? . Ordervalue _diff }
/ >
) ,
titleX : [ ordercountTotal1 . Ordervalue , ordercountTotal2 . Ordervalue ] . join ( ' vs ' ) ,
dataIndex : 'Ordervalue' ,
render : ( text , r ) => < DataRenderCell showDiffData = { showDiff } data1 = { text } data2 = { r . diff ? . Ordervalue } diffPercent = { r . Ordervalue _vs } diffData = { r . Ordervalue _diff } / > ,
} ,
] ,
} ,
] ;
return result ;
{
title : "单个订单价值" ,
children : [ { title : ordercountTotal1 . Ordervalue , dataIndex : "Ordervalue" } ] ,
sorter : ( a , b ) => parseFloat ( b . Ordervalue . replace ( /,/g , "" ) ) - parseFloat ( a . Ordervalue . replace ( /,/g , "" ) ) ,
} ,
] ;
result . dataSource = data . ordercount1 ;
}
}
}
return result ;
return result ;
}
}
@ -256,10 +214,10 @@ class Orders extends Component {
const table _data = orders _store . orderCountData _Form ? this . format _data ( orders _store . orderCountData _Form ) : [ ] ;
const table _data = orders _store . orderCountData _Form ? this . format _data ( orders _store . orderCountData _Form ) : [ ] ;
const data _source = orders _store . orderCountData ? orders _store . orderCountData : [ ] ;
const data _source = orders _store . orderCountData ? orders _store . orderCountData : [ ] ;
const avg _line _y = Math . round ( orders _store . avgLine1 ) ;
const avg _line _y = Math . round ( orders _store . avgLine1 ) ;
const pie _data = comm . emptyValue ( orders _store . orderCountData _Form )
const pie _data = comm . isEmpty ( orders _store . orderCountData _Form )
? [ ]
? [ ]
: orders _store . orderCountData _Form . ordercount1 . map ( ( ele ) => ( { ... ele , YJLYx : comm . price _to _number ( ele . YJLY ) } ) ) ; / / 饼 图 的 显 示
: orders _store . orderCountData _Form . ordercount1 . map ( ( ele ) => ( { ... ele , YJLYx : comm . price _to _number ( ele . YJLY ) } ) ) ; / / 饼 图 的 显 示
const pie _data2 = comm . emptyValue ( orders _store . orderCountData _Form )
const pie _data2 = comm . isEmpty ( orders _store . orderCountData _Form )
? [ ]
? [ ]
: orders _store . orderCountData _Form . ordercount2 . map ( ( ele ) => ( { ... ele , YJLYx : comm . price _to _number ( ele . YJLY ) } ) ) ;
: orders _store . orderCountData _Form . ordercount2 . map ( ( ele ) => ( { ... ele , YJLYx : comm . price _to _number ( ele . YJLY ) } ) ) ;