Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
J
jinfa-admin
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
shenshaokai
jinfa-admin
Commits
9fedd4b6
Commit
9fedd4b6
authored
Jan 13, 2021
by
Bill
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'dev' of 10.0.0.22:lingxi/lingxi-business-system into dev
parents
82577175
7848c41d
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
411 additions
and
417 deletions
+411
-417
index.tsx
src/pages/rfq/details/index.tsx
+2
-2
index.tsx
src/pages/rfqOffer/details/index.tsx
+3
-3
payWayTable.tsx
...s/ruleSettingManage/paySetting/components/payWayTable.tsx
+3
-2
settingIndex.tsx
src/pages/ruleSettingManage/paySetting/settingIndex.tsx
+26
-21
detail.tsx
src/pages/ruleSettingManage/payStrategy/detail.tsx
+6
-7
index.tsx
src/pages/ruleSettingManage/schema/index.tsx
+1
-1
index.tsx
src/pages/systemManage/unit/index.tsx
+3
-3
index.ts
src/utils/index.ts
+367
-378
No files found.
src/pages/rfq/details/index.tsx
View file @
9fedd4b6
...
...
@@ -139,6 +139,7 @@ const Details: React.FC<{}> = (props) => {
title
:
'序号'
,
key
:
'inquiryListId'
,
dataIndex
:
'inquiryListId'
,
render
:
(
text
:
any
,
record
:
any
,
index
:
number
)
=>
<>
{
index
+
1
}
</>
},
{
title
:
'操作角色'
,
key
:
'roleName'
,
...
...
@@ -323,4 +324,4 @@ const Details: React.FC<{}> = (props) => {
)
}
export
default
Details
\ No newline at end of file
export
default
Details
src/pages/rfqOffer/details/index.tsx
View file @
9fedd4b6
...
...
@@ -112,6 +112,7 @@ const Details: React.FC<{}> = (props) => {
title
:
'序号'
,
key
:
'inquiryListId'
,
dataIndex
:
'inquiryListId'
,
render
:
(
text
:
any
,
record
:
any
,
index
:
number
)
=>
<>
{
index
+
1
}
</>
},
{
title
:
'操作角色'
,
key
:
'roleName'
,
...
...
@@ -236,7 +237,7 @@ const Details: React.FC<{}> = (props) => {
</
div
>
<
div
className=
{
style
.
item_wrap
}
>
<
div
className=
{
style
.
mainCol_title
}
style=
{
view
===
2
?
{
paddingBottom
:
'0px'
}
:
{
paddingBottom
:
'24px'
}
}
>
报价商品
</
div
>
<
StandardTable
<
StandardTable
currentRef=
{
ref
}
columns=
{
inquiryGoods
}
tableProps=
{
{
rowKew
:
'id'
}
}
...
...
@@ -319,4 +320,4 @@ const Details: React.FC<{}> = (props) => {
)
}
export
default
Details
\ No newline at end of file
export
default
Details
src/pages/ruleSettingManage/paySetting/components/payWayTable.tsx
View file @
9fedd4b6
...
...
@@ -6,6 +6,7 @@ import SetUpModal from './setUpModal';
interface
payWayTableParams
{
name
?:
string
,
way
?:
string
,
payParametersList
?:
any
,
payParametersListResponses
?:
any
,
visible
?:
boolean
,
...
...
@@ -22,7 +23,7 @@ const PayWayTable: React.FC<payWayTableParams> = (props) => {
const
[
edit
,
setedit
]
=
useState
<
any
>
({});
const
[
modifyIndex
,
setModifyIndex
]
=
useState
<
any
>
(
0
)
const
[
modify
,
setmodify
]
=
useState
<
boolean
>
(
false
);
const
{
name
,
payParametersListResponses
,
payParametersList
,
visible
,
onType
,
onGet
,
onDel
,
onEdit
,
id
}
=
props
;
const
{
name
,
payParametersListResponses
,
payParametersList
,
visible
,
onType
,
onGet
,
onDel
,
onEdit
,
id
,
way
}
=
props
;
const
columns
:
ColumnType
<
any
>
[]
=
[
{
title
:
'参数代码'
,
...
...
@@ -87,7 +88,7 @@ const PayWayTable: React.FC<payWayTableParams> = (props) => {
<
Button
style=
{
{
marginBottom
:
16
,
marginTop
:
24
}
}
block
icon=
{
<
PlusOutlined
/>
}
onClick=
{
()
=>
{
setmodalvisible
(
true
);
setType
(
id
);
setmodify
(
false
)
}
}
type=
'dashed'
>
新增参数配置
</
Button
>
{
id
!==
2
&&
way
!==
'微信'
&&
<>
<
div
style=
{
{
borderLeft
:
'2px solid #00B37A'
,
margin
:
'41px 0 8px'
,
padding
:
'1px 5px'
}
}
>
{
name
}
转账到银行卡参数配置
</
div
>
<
Table
...
...
src/pages/ruleSettingManage/paySetting/settingIndex.tsx
View file @
9fedd4b6
...
...
@@ -98,27 +98,33 @@ const PayWaySetTemplate: React.FC<{}> = () => {
const
onHnadleSubmit
=
()
=>
{
let
conditions
=
false
;
let
wayName
=
''
;
payItem
.
forEach
(
item
=>
{
if
(
item
.
id
===
2
&&
item
.
isPitchOn
===
1
)
{
if
(
item
.
payParametersAddListRequests
.
length
>
0
)
{
conditions
=
true
try
{
payItem
.
forEach
(
item
=>
{
if
(
item
.
way
===
'微信'
&&
item
.
isPitchOn
===
1
)
{
console
.
log
(
1
)
if
(
item
.
payParametersAddListRequests
.
length
>
0
)
{
conditions
=
true
}
else
{
conditions
=
false
wayName
=
item
.
way
throw
new
Error
}
}
else
if
(
item
.
way
===
'支付宝'
&&
item
.
isPitchOn
===
1
)
{
console
.
log
(
2
)
if
(
item
.
payParametersAddListRequests
.
length
>
0
&&
item
.
payParametersList
.
length
>
0
)
{
conditions
=
true
}
else
{
conditions
=
false
wayName
=
item
.
way
throw
new
Error
}
}
else
{
conditions
=
false
wayName
=
item
.
way
return
}
}
else
if
(
item
.
id
===
1
&&
item
.
isPitchOn
===
1
)
{
if
(
item
.
payParametersAddListRequests
.
length
>
0
&&
item
.
payParametersList
.
length
>
0
)
{
conditions
=
true
}
else
{
conditions
=
false
wayName
=
item
.
way
return
}
}
else
{
conditions
=
true
}
}
)
}
)
}
catch
{
message
.
error
(
`
${
wayName
}
缺少支付参数配置`
)
}
if
(
conditions
)
{
PublicApi
.
postPayCollectionParametersAdd
({
platformPayWays
:
payItem
...
...
@@ -127,8 +133,6 @@ const PayWaySetTemplate: React.FC<{}> = () => {
history
.
push
(
'/ruleSettingManager/paySetting'
)
}
})
}
else
{
message
.
error
(
`请新增
${
wayName
}
的支付参数配置`
)
}
}
...
...
@@ -179,9 +183,10 @@ const PayWaySetTemplate: React.FC<{}> = () => {
selectId=
{
payItem
[
idx
].
id
}
onChange=
{
(
value
)
=>
onChangeRaido
(
value
,
idx
)
}
/>
{
(
payItem
[
idx
].
id
===
1
||
payItem
[
idx
].
id
===
2
)
&&
{
(
payItem
[
idx
].
way
===
'微信'
||
payItem
[
idx
].
way
===
'支付宝'
)
&&
<
PayWayTable
id=
{
payItem
[
idx
].
id
}
way=
{
payItem
[
idx
].
way
}
onType=
{
payItem
[
idx
].
payType
}
name=
{
payItem
[
idx
].
way
}
payParametersList=
{
payItem
[
idx
].
payParametersList
}
...
...
src/pages/ruleSettingManage/payStrategy/detail.tsx
View file @
9fedd4b6
...
...
@@ -61,16 +61,16 @@ const PaySetting: React.FC<{}> = () => {
levelList
:
[],
roleList
:
[]
})
const
[
memberRowSelection
,
memberRowCtl
]
=
useRowSelectionTable
({
customKey
:
'
memberI
d'
})
const
[
memberRowSelection
,
memberRowCtl
]
=
useRowSelectionTable
({
customKey
:
'
i
d'
})
const
[
optionType
,
setoptionType
]
=
useState
(
0
)
const
{
preview
,
pageStatus
}
=
usePageStatus
()
// const initValue = useInitValue(PublicApi.getPayPayMemberTacticsDetails)
const
columnsSetMember
:
ColumnType
<
any
>
[]
=
[
{
title
:
'ID'
,
dataIndex
:
'
memberI
d'
,
dataIndex
:
'
i
d'
,
align
:
'center'
,
key
:
'
memberI
d'
,
key
:
'
i
d'
,
},
{
title
:
'会员名称'
,
...
...
@@ -130,7 +130,7 @@ const PaySetting: React.FC<{}> = () => {
// 弹出会员
const
handleAddMemberBtn
=
()
=>
{
const
checkBoxs
=
payActions
.
getFieldValue
(
'applyMember'
)
memberRowCtl
.
setSelectedRowKeys
(
checkBoxs
.
map
(
v
=>
v
.
memberI
d
))
memberRowCtl
.
setSelectedRowKeys
(
checkBoxs
.
map
(
v
=>
v
.
i
d
))
memberRowCtl
.
setSelectRow
(
checkBoxs
)
setvisible
(
true
)
console
.
log
(
visibleChannelMember
)
...
...
@@ -191,7 +191,7 @@ const PaySetting: React.FC<{}> = () => {
}).
then
(
res
=>
{
if
(
res
.
code
===
1000
)
{
let
{
data
}
=
res
.
data
memberRowCtl
.
setSelectedRowKeys
(
data
.
map
(
v
=>
v
.
memberI
d
))
memberRowCtl
.
setSelectedRowKeys
(
data
.
map
(
v
=>
v
.
i
d
))
memberRowCtl
.
setSelectRow
(
data
)
payActions
.
setFieldValue
(
'applyMember'
,
data
)
}
...
...
@@ -417,7 +417,6 @@ const PaySetting: React.FC<{}> = () => {
}
}
//新增
console
.
log
(
param
,
10086
)
if
(
param
.
memberIdRoleIds
.
length
===
0
&&
values
.
isSelected
===
0
)
{
message
.
error
(
'请选择指定的会员'
);
return
...
...
@@ -495,7 +494,7 @@ const PaySetting: React.FC<{}> = () => {
}
}
tableProps=
{
{
rowKey
:
'
memberI
d'
rowKey
:
'
i
d'
}
}
/>
</
PageHeaderWrapper
>
...
...
src/pages/ruleSettingManage/schema/index.tsx
View file @
9fedd4b6
...
...
@@ -55,7 +55,7 @@ export const strategyDetailTab = (props: any, usePageStatus: any) => {
"x-component"
:
'checkbox'
,
'x-component-props'
:
{
},
required
:
fals
e
,
required
:
tru
e
,
}
}
}
...
...
src/pages/systemManage/unit/index.tsx
View file @
9fedd4b6
...
...
@@ -16,8 +16,8 @@ const SensitiveWords: React.FC<{}> = () => {
await
PublicApi
.
getManageUnitUpdateUnitStatus
({
id
:
id
,
status
:
_status
})
ref
.
current
.
reload
()
}
const
confirmCancel
=
(
id
:
number
)
=>
{
PublicApi
.
postManageSensitiveWordDelete
({
ids
:
[
id
]
}).
then
(
res
=>
{
const
confirmCancel
=
(
id
:
any
)
=>
{
PublicApi
.
getManageUnitDeleteUnit
({
id
}).
then
(
res
=>
{
if
(
res
.
code
===
1000
)
{
message
.
success
(
'删除成功'
)
ref
.
current
.
reload
()
...
...
@@ -132,7 +132,7 @@ const SensitiveWords: React.FC<{}> = () => {
name
:
{
type
:
'string'
,
'x-component-props'
:
{
placeholder
:
'
属性
名称'
,
placeholder
:
'
单位
名称'
,
},
'x-component'
:
'Search'
}
...
...
src/utils/index.ts
View file @
9fedd4b6
import
deepClone
from
'clone'
import
moment
from
'moment'
;
import
{
ISchema
}
from
'@formily/antd'
;
function
isArray
(
arr
:
any
)
{
return
Array
.
isArray
(
arr
)
}
export
const
findArrayItem
=
(
arr
:
Array
<
any
>
,
flag
:
any
)
=>
{
const
result
=
arr
.
find
(
v
=>
v
.
value
===
flag
)
return
result
?
result
:
{}
}
/**
* 找到最后一个可用的工作流状态的索引
* @param {array} data 数据
* @param {string} customKey 自定义 key
*/
export
const
findLastIndexFlowState
=
(
data
:
any
[],
customKey
=
'isExecute'
):
number
=>
{
let
index
=
0
;
if
(
!
Array
.
isArray
(
data
))
{
return
index
;
}
// 循环数据,找到状态值,一直覆盖
for
(
let
i
=
0
;
i
<
data
.
length
;
i
++
)
{
if
(
data
[
i
][
customKey
])
{
index
=
i
;
}
}
return
index
;
};
export
function
formatTimeString
(
date
,
format
:
string
=
'YYYY-MM-DD HH:mm:ss'
)
{
return
date
?
moment
(
date
).
format
(
format
)
:
''
}
export
function
isObject
(
obj
:
any
)
{
return
Object
.
prototype
.
toString
.
call
(
obj
)
===
'[object Object]'
}
function
transformDataPre
(
data
:
object
,
key
:
string
):
object
{
const
trans
=
{}
Object
.
getOwnPropertyNames
(
data
).
forEach
(
k
=>
{
trans
[
`
${
key
}
.
${
k
}
`
]
=
data
[
k
]
})
return
trans
}
const
reg
=
/
(((
^https
?
:
(?:\/\/)?)(?:[
-;:&=
\+\$
,
\w]
+@
)?[
A-Za-z0-9.-
]
+
(?:
:
\d
+
)?
|
(?:
www.|
[
-;:&=
\+\$
,
\w]
+@
)[
A-Za-z0-9.-
]
+
)((?:\/[\+
~%
\/
.
\w
-_
]
*
)?\??(?:[
-
\+
=&;%@.
\w
_
]
*
)
#
?(?:[\w]
*
))?)
$/
;
export
function
timeRange
(
val
:
number
)
{
let
st
,
et
;
switch
(
val
)
{
case
0
:
st
=
et
=
''
;
break
;
case
1
:
st
=
moment
(
moment
()
.
startOf
(
'days'
)
.
format
(
'YYYY-MM-DD HH:mm:ss'
),
).
unix
();
et
=
moment
(
moment
()
.
endOf
(
'days'
)
.
format
(
'YYYY-MM-DD HH:mm:ss'
),
).
unix
();
break
;
case
2
:
st
=
moment
(
moment
()
.
subtract
(
7
,
'days'
)
.
format
(
'YYYY-MM-DD'
)
+
' 00:00:00'
,
).
unix
();
et
=
moment
(
moment
()
.
endOf
(
'days'
)
.
format
(
'YYYY-MM-DD HH:mm:ss'
),
).
unix
();
break
;
case
3
:
st
=
moment
(
moment
()
.
subtract
(
29
,
'days'
)
.
format
(
'YYYY-MM-DD'
)
+
' 00:00:00'
,
).
unix
();
et
=
moment
(
moment
()
.
endOf
(
'days'
)
.
format
(
'YYYY-MM-DD HH:mm:ss'
),
).
unix
();
break
;
case
4
:
st
=
moment
(
moment
()
.
subtract
(
89
,
'days'
)
.
format
(
'YYYY-MM-DD'
)
+
' 00:00:00'
,
).
unix
();
et
=
moment
(
moment
()
.
endOf
(
'days'
)
.
format
(
'YYYY-MM-DD HH:mm:ss'
),
).
unix
();
break
;
case
5
:
st
=
moment
(
moment
()
.
subtract
(
179
,
'days'
)
.
format
(
'YYYY-MM-DD'
)
+
' 00:00:00'
,
).
unix
();
et
=
moment
(
moment
()
.
endOf
(
'days'
)
.
format
(
'YYYY-MM-DD HH:mm:ss'
),
).
unix
();
break
;
case
6
:
st
=
moment
(
moment
()
.
subtract
(
364
,
'days'
)
.
format
(
'YYYY-MM-DD'
)
+
' 00:00:00'
,
).
unix
();
et
=
moment
(
moment
()
.
endOf
(
'days'
)
.
format
(
'YYYY-MM-DD HH:mm:ss'
),
).
unix
();
break
;
case
7
:
st
=
moment
(
moment
()
.
year
(
moment
().
year
()
-
1
)
.
startOf
(
'year'
)
.
format
(
'YYYY-MM-DD HH:mm:ss'
),
).
unix
();
et
=
moment
(
moment
()
.
year
(
moment
().
year
()
-
1
)
.
endOf
(
'year'
)
.
format
(
'YYYY-MM-DD HH:mm:ss'
),
).
unix
();
break
;
}
return
{
st
,
et
}
}
export
const
isUrl
=
(
path
:
string
):
boolean
=>
reg
.
test
(
path
);
/**
* @description 用于将传入的接口,并行请求,并组装成Select组件可识别的形式返回
* @param asyncList {Array} 异步函数数组
*/
export
const
getAsyncSelectList
=
async
(
asyncList
:
any
[])
=>
{
try
{
const
result
=
await
Promise
.
all
(
asyncList
)
return
result
.
map
(
v
=>
v
.
data
.
map
(
j
=>
{
return
{
label
:
j
.
name
,
value
:
j
.
id
}
}))
}
catch
(
error
)
{
return
error
}
}
// 抽离对象中的某些属性, 并返回一个新对象
export
const
omit
=
(
obj
:
any
,
arr
:
string
[]):
any
=>
{
const
newObj
=
deepClone
(
obj
)
for
(
let
item
=
0
;
item
<
arr
.
length
;
item
++
)
{
if
(
obj
[
arr
[
item
]]
!==
undefined
)
{
delete
newObj
[
arr
[
item
]]
}
}
return
newObj
}
/**
* @param { Object[] } arr 源数据
* @param { any } target 目标值 通常是id等主键
* @param { string } customKey 可选 自定义主键 默认'id'
*/
export
const
findItemAndDelete
=
(
arr
:
any
[],
target
:
any
,
customKey
?:
string
)
=>
{
const
newArr
=
[...
arr
]
if
(
newArr
.
length
>
0
&&
isObject
(
newArr
[
0
]))
{
return
newArr
.
filter
(
v
=>
v
[
customKey
||
'id'
]
!==
target
)
}
const
targetIndex
=
arr
.
indexOf
(
target
)
if
(
targetIndex
===
-
1
)
{
return
newArr
}
else
{
newArr
.
splice
(
targetIndex
,
1
)
return
newArr
}
}
// 遍历树拿到所有key的集合
export
const
findTreeKeys
=
(
arr
:
any
[],
keyword
?:
string
)
=>
{
const
copyArr
:
any
[]
=
deepClone
(
arr
)
const
results
:
any
[]
=
[]
while
(
copyArr
.
length
>
0
)
{
const
item
=
copyArr
.
shift
()
results
.
push
(
keyword
?
item
[
keyword
]
:
item
.
key
)
if
(
item
.
children
)
{
copyArr
.
push
(...
item
.
children
)
}
}
return
results
}
// 树形结构降为一维对象处理
export
const
treeReduction
=
(
data
:
any
[])
=>
{
const
hashMaps
=
{}
const
selfData
:
any
[]
=
deepClone
(
data
)
while
(
selfData
.
length
>
0
)
{
const
useItem
=
selfData
.
shift
()
// 存在子集
if
(
useItem
.
children
&&
useItem
.
children
.
length
>
0
)
{
useItem
.
children
=
useItem
.
children
.
map
(
v
=>
{
v
.
parentId
=
useItem
.
id
return
v
})
selfData
.
push
(...
useItem
.
children
)
}
hashMaps
[
useItem
.
id
]
=
useItem
}
return
hashMaps
}
// 获取某一节点的title路径
export
const
getParentTreeTitles
=
(
dataSouce
,
key
)
=>
{
const
hashMaps
=
treeReduction
(
dataSouce
)
let
targetKey
=
key
let
targetPath
=
''
while
(
targetKey
!==
''
)
{
if
(
!
hashMaps
[
targetKey
])
{
break
}
const
title
=
hashMaps
[
targetKey
].
title
targetPath
=
targetPath
===
''
?
title
:
`
${
title
}
-
${
targetPath
}
`
targetKey
=
hashMaps
[
targetKey
].
parentId
||
''
}
return
targetPath
}
// 数组通过某个key进行去重合并, 并返回一个新数组
export
const
mergeArrByKey
=
(
preArr
:
any
[],
nextArr
:
any
[],
target
?:
string
)
=>
{
const
mergeArr
=
preArr
.
concat
(
nextArr
)
if
(
target
)
{
const
result
:
any
[]
=
[]
mergeArr
.
forEach
(
v
=>
{
const
s
=
result
.
find
(
j
=>
j
[
target
]
===
v
[
target
])
if
(
!
s
)
{
result
.
push
(
v
)
}
})
return
result
}
else
{
return
Array
.
from
(
new
Set
(
mergeArr
))
}
}
// 数组去重
export
const
dupliArr
=
(
arr
:
any
[])
=>
{
return
Array
.
from
(
new
Set
(
arr
))
}
// 填充必填的schema message提示
export
const
padRequiredMessage
=
(
originSchema
:
ISchema
)
=>
{
const
messageSwich
=
(
type
)
=>
{
return
type
?
'请选择'
:
'请输入'
}
const
todoFn
=
(
targetSchema
)
=>
{
}
Object
.
entries
(
originSchema
.
properties
).
map
(([
key
,
value
])
=>
{
if
(
value
.
required
)
{
const
isSelect
=
value
.
enum
const
message
=
messageSwich
(
isSelect
)
+
(
value
.
title
||
''
)
value
[
'x-rules'
]
=
Array
.
isArray
(
value
[
'x-rules'
])
?
value
[
'x-rules'
].
concat
([{
message
,
required
:
true
}])
:
[{
message
,
required
:
true
}]
}
if
(
value
.
properties
)
{
padRequiredMessage
(
value
)
}
return
value
})
return
originSchema
}
export
interface
FileData
{
uid
:
string
;
name
:
string
;
status
:
'uploading'
|
'done'
|
'error'
|
'removed'
;
url
:
string
;
};
/**
* 初始化 Upload 数据
*/
export
function
normalizeFiledata
(
url
:
string
):
FileData
export
function
normalizeFiledata
(
url
:
any
):
any
{
if
(
!
url
)
{
return
url
;
}
const
splited
=
url
.
split
(
'/'
);
const
fileName
=
splited
&&
splited
.
length
?
splited
[
splited
.
length
-
1
]
:
''
;
return
{
uid
:
Math
.
random
().
toFixed
(
16
).
slice
(
2
,
10
),
name
:
fileName
,
status
:
'done'
,
url
,
};
};
/**
* 检查是否还有更多
* @param {Number} curPage 当前页码
* @param {Number} curSize 当前页数
* @param {Number} dataLen 当前数据长度
* @param {Number} dataTotal 数据总长度
*/
export
const
checkMore
=
(
curPage
:
number
,
curSize
:
number
,
dataLen
:
number
,
dataTotal
:
number
)
=>
{
let
hasMore
=
true
;
if
(
!
dataLen
||
dataLen
+
(
curPage
-
1
)
*
curSize
>=
+
dataTotal
)
{
hasMore
=
false
;
}
return
hasMore
;
};
/**
*
* @param {string} str 需要判断是否是 JSON字符串的 字符串
*/
export
const
isJSONStr
=
str
=>
{
if
(
typeof
str
===
'string'
)
{
try
{
const
complete
=
JSON
.
parse
(
str
);
return
complete
;
}
catch
(
e
)
{
return
null
;
}
}
return
str
;
}
/**
* 给 Table columns 的 filters 赋值
* @param {array} data 需要赋值的数组
* @param {string} dataIndex 索引
* @param {array} item 需要赋值的值
*/
export
const
coverColFiltersItem
=
(
data
:
Array
<
{[
key
:
string
]:
any
}
>
,
dataIndex
:
string
,
item
:
{[
key
:
string
]:
any
}
)
=>
{
const
index
=
data
.
findIndex
(
i
=>
i
.
dataIndex
===
dataIndex
);
if
(
index
!==
-
1
)
{
data
.
splice
(
index
,
1
,
{
...
data
[
index
],
filters
:
item
,
});
}
};
export
default
{
isArray
,
isObject
,
transformDataPre
}
\ No newline at end of file
import
deepClone
from
'clone'
import
moment
from
'moment'
;
import
{
ISchema
}
from
'@formily/antd'
;
function
isArray
(
arr
:
any
)
{
return
Array
.
isArray
(
arr
)
}
export
const
findArrayItem
=
(
arr
:
Array
<
any
>
,
flag
:
any
)
=>
{
const
result
=
arr
.
find
(
v
=>
v
.
value
===
flag
)
return
result
?
result
:
{}
}
/**
* 找到最后一个可用的工作流状态的索引
* @param {array} data 数据
* @param {string} customKey 自定义 key
*/
export
const
findLastIndexFlowState
=
(
data
:
any
[],
customKey
=
'isExecute'
):
number
=>
{
let
index
=
0
;
if
(
!
Array
.
isArray
(
data
))
{
return
index
;
}
// 循环数据,找到状态值,一直覆盖
for
(
let
i
=
0
;
i
<
data
.
length
;
i
++
)
{
if
(
data
[
i
][
customKey
])
{
index
=
i
;
}
}
return
index
;
};
export
function
formatTimeString
(
date
,
format
:
string
=
'YYYY-MM-DD HH:mm:ss'
)
{
return
date
?
moment
(
date
).
format
(
format
)
:
''
}
export
function
isObject
(
obj
:
any
)
{
return
Object
.
prototype
.
toString
.
call
(
obj
)
===
'[object Object]'
}
function
transformDataPre
(
data
:
object
,
key
:
string
):
object
{
const
trans
=
{}
Object
.
getOwnPropertyNames
(
data
).
forEach
(
k
=>
{
trans
[
`
${
key
}
.
${
k
}
`
]
=
data
[
k
]
})
return
trans
}
const
reg
=
/
(((
^https
?
:
(?:\/\/)?)(?:[
-;:&=
\+\$
,
\w]
+@
)?[
A-Za-z0-9.-
]
+
(?:
:
\d
+
)?
|
(?:
www.|
[
-;:&=
\+\$
,
\w]
+@
)[
A-Za-z0-9.-
]
+
)((?:\/[\+
~%
\/
.
\w
-_
]
*
)?\??(?:[
-
\+
=&;%@.
\w
_
]
*
)
#
?(?:[\w]
*
))?)
$/
;
export
function
timeRange
(
val
:
number
)
{
let
st
,
et
;
switch
(
val
)
{
case
0
:
st
=
et
=
''
;
break
;
case
1
:
st
=
moment
(
moment
()
.
startOf
(
'days'
)
.
format
(
'YYYY-MM-DD HH:mm:ss'
),
).
valueOf
();
et
=
moment
(
moment
()
.
endOf
(
'days'
)
.
format
(
'YYYY-MM-DD HH:mm:ss'
),
).
valueOf
();
break
;
case
2
:
st
=
moment
(
moment
()
.
subtract
(
7
,
'days'
)
.
format
(
'YYYY-MM-DD'
)
+
' 00:00:00'
,
).
valueOf
();
et
=
moment
(
moment
()
.
endOf
(
'days'
)
.
format
(
'YYYY-MM-DD HH:mm:ss'
),
).
valueOf
();
break
;
case
3
:
st
=
moment
(
moment
()
.
subtract
(
29
,
'days'
)
.
format
(
'YYYY-MM-DD'
)
+
' 00:00:00'
,
).
valueOf
();
et
=
moment
(
moment
()
.
endOf
(
'days'
)
.
format
(
'YYYY-MM-DD HH:mm:ss'
),
).
valueOf
();
break
;
case
4
:
st
=
moment
(
moment
()
.
subtract
(
89
,
'days'
)
.
format
(
'YYYY-MM-DD'
)
+
' 00:00:00'
,
).
valueOf
();
et
=
moment
(
moment
()
.
endOf
(
'days'
)
.
format
(
'YYYY-MM-DD HH:mm:ss'
),
).
valueOf
();
break
;
case
5
:
st
=
moment
(
moment
()
.
subtract
(
179
,
'days'
)
.
format
(
'YYYY-MM-DD'
)
+
' 00:00:00'
,
).
valueOf
();
et
=
moment
(
moment
()
.
endOf
(
'days'
)
.
format
(
'YYYY-MM-DD HH:mm:ss'
),
).
valueOf
();
break
;
case
6
:
st
=
moment
(
moment
()
.
subtract
(
364
,
'days'
)
.
format
(
'YYYY-MM-DD'
)
+
' 00:00:00'
,
).
valueOf
();
et
=
moment
(
moment
()
.
endOf
(
'days'
)
.
format
(
'YYYY-MM-DD HH:mm:ss'
),
).
valueOf
();
break
;
case
7
:
st
=
moment
(
'1971-01-01'
,
'YYYY-MM-DD'
).
valueOf
();
// 或者0
et
=
moment
().
subtract
(
1
,
"year"
).
valueOf
();
break
;
}
return
{
st
,
et
}
}
export
const
isUrl
=
(
path
:
string
):
boolean
=>
reg
.
test
(
path
);
/**
* @description 用于将传入的接口,并行请求,并组装成Select组件可识别的形式返回
* @param asyncList {Array} 异步函数数组
*/
export
const
getAsyncSelectList
=
async
(
asyncList
:
any
[])
=>
{
try
{
const
result
=
await
Promise
.
all
(
asyncList
)
return
result
.
map
(
v
=>
v
.
data
.
map
(
j
=>
{
return
{
label
:
j
.
name
,
value
:
j
.
id
}
}))
}
catch
(
error
)
{
return
error
}
}
// 抽离对象中的某些属性, 并返回一个新对象
export
const
omit
=
(
obj
:
any
,
arr
:
string
[]):
any
=>
{
const
newObj
=
deepClone
(
obj
)
for
(
let
item
=
0
;
item
<
arr
.
length
;
item
++
)
{
if
(
obj
[
arr
[
item
]]
!==
undefined
)
{
delete
newObj
[
arr
[
item
]]
}
}
return
newObj
}
/**
* @param { Object[] } arr 源数据
* @param { any } target 目标值 通常是id等主键
* @param { string } customKey 可选 自定义主键 默认'id'
*/
export
const
findItemAndDelete
=
(
arr
:
any
[],
target
:
any
,
customKey
?:
string
)
=>
{
const
newArr
=
[...
arr
]
if
(
newArr
.
length
>
0
&&
isObject
(
newArr
[
0
]))
{
return
newArr
.
filter
(
v
=>
v
[
customKey
||
'id'
]
!==
target
)
}
const
targetIndex
=
arr
.
indexOf
(
target
)
if
(
targetIndex
===
-
1
)
{
return
newArr
}
else
{
newArr
.
splice
(
targetIndex
,
1
)
return
newArr
}
}
// 遍历树拿到所有key的集合
export
const
findTreeKeys
=
(
arr
:
any
[],
keyword
?:
string
)
=>
{
const
copyArr
:
any
[]
=
deepClone
(
arr
)
const
results
:
any
[]
=
[]
while
(
copyArr
.
length
>
0
)
{
const
item
=
copyArr
.
shift
()
results
.
push
(
keyword
?
item
[
keyword
]
:
item
.
key
)
if
(
item
.
children
)
{
copyArr
.
push
(...
item
.
children
)
}
}
return
results
}
// 树形结构降为一维对象处理
export
const
treeReduction
=
(
data
:
any
[])
=>
{
const
hashMaps
=
{}
const
selfData
:
any
[]
=
deepClone
(
data
)
while
(
selfData
.
length
>
0
)
{
const
useItem
=
selfData
.
shift
()
// 存在子集
if
(
useItem
.
children
&&
useItem
.
children
.
length
>
0
)
{
useItem
.
children
=
useItem
.
children
.
map
(
v
=>
{
v
.
parentId
=
useItem
.
id
return
v
})
selfData
.
push
(...
useItem
.
children
)
}
hashMaps
[
useItem
.
id
]
=
useItem
}
return
hashMaps
}
// 获取某一节点的title路径
export
const
getParentTreeTitles
=
(
dataSouce
,
key
)
=>
{
const
hashMaps
=
treeReduction
(
dataSouce
)
let
targetKey
=
key
let
targetPath
=
''
while
(
targetKey
!==
''
)
{
if
(
!
hashMaps
[
targetKey
])
{
break
}
const
title
=
hashMaps
[
targetKey
].
title
targetPath
=
targetPath
===
''
?
title
:
`
${
title
}
-
${
targetPath
}
`
targetKey
=
hashMaps
[
targetKey
].
parentId
||
''
}
return
targetPath
}
// 数组通过某个key进行去重合并, 并返回一个新数组
export
const
mergeArrByKey
=
(
preArr
:
any
[],
nextArr
:
any
[],
target
?:
string
)
=>
{
const
mergeArr
=
preArr
.
concat
(
nextArr
)
if
(
target
)
{
const
result
:
any
[]
=
[]
mergeArr
.
forEach
(
v
=>
{
const
s
=
result
.
find
(
j
=>
j
[
target
]
===
v
[
target
])
if
(
!
s
)
{
result
.
push
(
v
)
}
})
return
result
}
else
{
return
Array
.
from
(
new
Set
(
mergeArr
))
}
}
// 数组去重
export
const
dupliArr
=
(
arr
:
any
[])
=>
{
return
Array
.
from
(
new
Set
(
arr
))
}
// 填充必填的schema message提示
export
const
padRequiredMessage
=
(
originSchema
:
ISchema
)
=>
{
const
messageSwich
=
(
type
)
=>
{
return
type
?
'请选择'
:
'请输入'
}
const
todoFn
=
(
targetSchema
)
=>
{
}
Object
.
entries
(
originSchema
.
properties
).
map
(([
key
,
value
])
=>
{
if
(
value
.
required
)
{
const
isSelect
=
value
.
enum
const
message
=
messageSwich
(
isSelect
)
+
(
value
.
title
||
''
)
value
[
'x-rules'
]
=
Array
.
isArray
(
value
[
'x-rules'
])
?
value
[
'x-rules'
].
concat
([{
message
,
required
:
true
}])
:
[{
message
,
required
:
true
}]
}
if
(
value
.
properties
)
{
padRequiredMessage
(
value
)
}
return
value
})
return
originSchema
}
export
interface
FileData
{
uid
:
string
;
name
:
string
;
status
:
'uploading'
|
'done'
|
'error'
|
'removed'
;
url
:
string
;
};
/**
* 初始化 Upload 数据
*/
export
function
normalizeFiledata
(
url
:
string
):
FileData
export
function
normalizeFiledata
(
url
:
any
):
any
{
if
(
!
url
)
{
return
url
;
}
const
splited
=
url
.
split
(
'/'
);
const
fileName
=
splited
&&
splited
.
length
?
splited
[
splited
.
length
-
1
]
:
''
;
return
{
uid
:
Math
.
random
().
toFixed
(
16
).
slice
(
2
,
10
),
name
:
fileName
,
status
:
'done'
,
url
,
};
};
/**
* 检查是否还有更多
* @param {Number} curPage 当前页码
* @param {Number} curSize 当前页数
* @param {Number} dataLen 当前数据长度
* @param {Number} dataTotal 数据总长度
*/
export
const
checkMore
=
(
curPage
:
number
,
curSize
:
number
,
dataLen
:
number
,
dataTotal
:
number
)
=>
{
let
hasMore
=
true
;
if
(
!
dataLen
||
dataLen
+
(
curPage
-
1
)
*
curSize
>=
+
dataTotal
)
{
hasMore
=
false
;
}
return
hasMore
;
};
/**
*
* @param {string} str 需要判断是否是 JSON字符串的 字符串
*/
export
const
isJSONStr
=
str
=>
{
if
(
typeof
str
===
'string'
)
{
try
{
const
complete
=
JSON
.
parse
(
str
);
return
complete
;
}
catch
(
e
)
{
return
null
;
}
}
return
str
;
}
/**
* 给 Table columns 的 filters 赋值
* @param {array} data 需要赋值的数组
* @param {string} dataIndex 索引
* @param {array} item 需要赋值的值
*/
export
const
coverColFiltersItem
=
(
data
:
Array
<
{[
key
:
string
]:
any
}
>
,
dataIndex
:
string
,
item
:
{[
key
:
string
]:
any
}
)
=>
{
const
index
=
data
.
findIndex
(
i
=>
i
.
dataIndex
===
dataIndex
);
if
(
index
!==
-
1
)
{
data
.
splice
(
index
,
1
,
{
...
data
[
index
],
filters
:
item
,
});
}
};
export
default
{
isArray
,
isObject
,
transformDataPre
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment