Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
phsl
/
admin
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
0
Merge Requests
0
Pipelines
Wiki
Snippets
Members
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit
9d44b9ac
authored
Feb 23, 2024
by
YunaiV
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
✨
CRM:完善合同的新增、修改需求
parent
11766f51
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
184 additions
and
174 deletions
+184
-174
src/views/crm/business/BusinessForm.vue
+0
-2
src/views/crm/business/components/BusinessProductForm.vue
+1
-1
src/views/crm/contract/ContractForm.vue
+0
-0
src/views/crm/contract/components/ContractProductForm.vue
+183
-0
src/views/crm/contract/components/ProductList.vue
+0
-171
No files found.
src/views/crm/business/BusinessForm.vue
View file @
9d44b9ac
...
@@ -155,7 +155,6 @@ const formData = ref({
...
@@ -155,7 +155,6 @@ const formData = ref({
id
:
undefined
,
id
:
undefined
,
name
:
undefined
,
name
:
undefined
,
customerId
:
undefined
,
customerId
:
undefined
,
contactNextTime
:
undefined
,
ownerUserId
:
undefined
,
ownerUserId
:
undefined
,
statusTypeId
:
undefined
,
statusTypeId
:
undefined
,
dealTime
:
undefined
,
dealTime
:
undefined
,
...
@@ -273,7 +272,6 @@ const resetForm = () => {
...
@@ -273,7 +272,6 @@ const resetForm = () => {
id
:
undefined
,
id
:
undefined
,
name
:
undefined
,
name
:
undefined
,
customerId
:
undefined
,
customerId
:
undefined
,
contactNextTime
:
undefined
,
ownerUserId
:
undefined
,
ownerUserId
:
undefined
,
statusTypeId
:
undefined
,
statusTypeId
:
undefined
,
dealTime
:
undefined
,
dealTime
:
undefined
,
...
...
src/views/crm/business/components/BusinessProductForm.vue
View file @
9d44b9ac
...
@@ -95,7 +95,7 @@
...
@@ -95,7 +95,7 @@
</template>
</template>
<
script
setup
lang=
"ts"
>
<
script
setup
lang=
"ts"
>
import
*
as
ProductApi
from
'@/api/crm/product'
import
*
as
ProductApi
from
'@/api/crm/product'
import
{
erp
CountInputFormatter
,
erp
PriceInputFormatter
,
erpPriceMultiply
}
from
'@/utils'
import
{
erpPriceInputFormatter
,
erpPriceMultiply
}
from
'@/utils'
import
{
DICT_TYPE
}
from
'@/utils/dict'
import
{
DICT_TYPE
}
from
'@/utils/dict'
const
props
=
defineProps
<
{
const
props
=
defineProps
<
{
...
...
src/views/crm/contract/ContractForm.vue
View file @
9d44b9ac
This diff is collapsed.
Click to expand it.
src/views/crm/contract/components/ContractProductForm.vue
0 → 100644
View file @
9d44b9ac
<
template
>
<el-form
ref=
"formRef"
:model=
"formData"
:rules=
"formRules"
v-loading=
"formLoading"
label-width=
"0px"
:inline-message=
"true"
:disabled=
"disabled"
>
<el-table
:data=
"formData"
class=
"-mt-10px"
>
<el-table-column
label=
"序号"
type=
"index"
align=
"center"
width=
"60"
/>
<el-table-column
label=
"产品名称"
min-width=
"180"
>
<template
#
default=
"
{ row, $index }">
<el-form-item
:prop=
"`$
{$index}.productId`" :rules="formRules.productId" class="mb-0px!">
<el-select
v-model=
"row.productId"
clearable
filterable
@
change=
"onChangeProduct($event, row)"
placeholder=
"请选择产品"
>
<el-option
v-for=
"item in productList"
:key=
"item.id"
:label=
"item.name"
:value=
"item.id"
/>
</el-select>
</el-form-item>
</
template
>
</el-table-column>
<el-table-column
label=
"条码"
min-width=
"150"
>
<
template
#
default=
"{ row }"
>
<el-form-item
class=
"mb-0px!"
>
<el-input
disabled
v-model=
"row.productNo"
/>
</el-form-item>
</
template
>
</el-table-column>
<el-table-column
label=
"单位"
min-width=
"80"
>
<
template
#
default=
"{ row }"
>
<dict-tag
:type=
"DICT_TYPE.CRM_PRODUCT_UNIT"
:value=
"row.productUnit"
/>
</
template
>
</el-table-column>
<el-table-column
label=
"价格(元)"
min-width=
"120"
>
<
template
#
default=
"{ row }"
>
<el-form-item
class=
"mb-0px!"
>
<el-input
disabled
v-model=
"row.productPrice"
:formatter=
"erpPriceInputFormatter"
/>
</el-form-item>
</
template
>
</el-table-column>
<el-table-column
label=
"售价(元)"
fixed=
"right"
min-width=
"140"
>
<
template
#
default=
"{ row, $index }"
>
<el-form-item
:prop=
"`$
{$index}.contractPrice`" class="mb-0px!">
<el-input-number
v-model=
"row.contractPrice"
controls-position=
"right"
:min=
"0.001"
:precision=
"2"
class=
"!w-100%"
/>
</el-form-item>
</
template
>
</el-table-column>
<el-table-column
label=
"数量"
prop=
"count"
fixed=
"right"
min-width=
"120"
>
<
template
#
default=
"{ row, $index }"
>
<el-form-item
:prop=
"`$
{$index}.count`" :rules="formRules.count" class="mb-0px!">
<el-input-number
v-model=
"row.count"
controls-position=
"right"
:min=
"0.001"
:precision=
"3"
class=
"!w-100%"
/>
</el-form-item>
</
template
>
</el-table-column>
<el-table-column
label=
"合计"
prop=
"totalPrice"
fixed=
"right"
min-width=
"140"
>
<
template
#
default=
"{ row, $index }"
>
<el-form-item
:prop=
"`$
{$index}.totalPrice`" class="mb-0px!">
<el-input
disabled
v-model=
"row.totalPrice"
:formatter=
"erpPriceInputFormatter"
/>
</el-form-item>
</
template
>
</el-table-column>
<el-table-column
align=
"center"
fixed=
"right"
label=
"操作"
width=
"60"
>
<
template
#
default=
"{ $index }"
>
<el-button
@
click=
"handleDelete($index)"
link
>
—
</el-button>
</
template
>
</el-table-column>
</el-table>
</el-form>
<el-row
justify=
"center"
class=
"mt-3"
v-if=
"!disabled"
>
<el-button
@
click=
"handleAdd"
round
>
+ 添加产品
</el-button>
</el-row>
</template>
<
script
setup
lang=
"ts"
>
import
*
as
ProductApi
from
'@/api/crm/product'
import
{
erpPriceInputFormatter
,
erpPriceMultiply
}
from
'@/utils'
import
{
DICT_TYPE
}
from
'@/utils/dict'
const
props
=
defineProps
<
{
products
:
undefined
disabled
:
false
}
>
()
const
formLoading
=
ref
(
false
)
// 表单的加载中
const
formData
=
ref
([])
const
formRules
=
reactive
({
productId
:
[{
required
:
true
,
message
:
'产品不能为空'
,
trigger
:
'blur'
}],
contractPrice
:
[{
required
:
true
,
message
:
'合同价格不能为空'
,
trigger
:
'blur'
}],
count
:
[{
required
:
true
,
message
:
'产品数量不能为空'
,
trigger
:
'blur'
}]
})
const
formRef
=
ref
([])
// 表单 Ref
const
productList
=
ref
<
ProductApi
.
ProductVO
[]
>
([])
// 产品列表
/** 初始化设置产品项 */
watch
(
()
=>
props
.
products
,
async
(
val
)
=>
{
formData
.
value
=
val
},
{
immediate
:
true
}
)
/** 监听合同产品变化,计算合同产品总价 */
watch
(
()
=>
formData
.
value
,
(
val
)
=>
{
if
(
!
val
||
val
.
length
===
0
)
{
return
}
// 循环处理
val
.
forEach
((
item
)
=>
{
if
(
item
.
contractPrice
!=
null
&&
item
.
count
!=
null
)
{
item
.
totalPrice
=
erpPriceMultiply
(
item
.
contractPrice
,
item
.
count
)
}
else
{
item
.
totalPrice
=
undefined
}
})
},
{
deep
:
true
}
)
/** 新增按钮操作 */
const
handleAdd
=
()
=>
{
const
row
=
{
id
:
undefined
,
productId
:
undefined
,
productUnit
:
undefined
,
// 产品单位
productNo
:
undefined
,
// 产品条码
productPrice
:
undefined
,
// 产品价格
contractPrice
:
undefined
,
count
:
1
}
formData
.
value
.
push
(
row
)
}
/** 删除按钮操作 */
const
handleDelete
=
(
index
:
number
)
=>
{
formData
.
value
.
splice
(
index
,
1
)
}
/** 处理产品变更 */
const
onChangeProduct
=
(
productId
,
row
)
=>
{
const
product
=
productList
.
value
.
find
((
item
)
=>
item
.
id
===
productId
)
if
(
product
)
{
row
.
productUnit
=
product
.
unit
row
.
productNo
=
product
.
no
row
.
productPrice
=
product
.
price
row
.
contractPrice
=
product
.
price
}
}
/** 表单校验 */
const
validate
=
()
=>
{
return
formRef
.
value
.
validate
()
}
defineExpose
({
validate
})
/** 初始化 */
onMounted
(
async
()
=>
{
productList
.
value
=
await
ProductApi
.
getProductSimpleList
()
})
</
script
>
src/views/crm/contract/components/ProductList.vue
deleted
100644 → 0
View file @
11766f51
<!-- 合同 Form 表单下的 Product 列表 -->
<
template
>
<el-row
justify=
"end"
>
<el-button
plain
type=
"primary"
@
click=
"openForm"
>
添加产品
</el-button>
</el-row>
<el-table
:data=
"list"
:show-overflow-tooltip=
"true"
:stripe=
"true"
>
<el-table-column
align=
"center"
label=
"产品名称"
prop=
"name"
width=
"120"
/>
<el-table-column
:formatter=
"fenToYuanFormat"
align=
"center"
label=
"价格"
prop=
"price"
width=
"100"
/>
<el-table-column
align=
"center"
label=
"产品类型"
prop=
"categoryName"
width=
"100"
/>
<el-table-column
align=
"center"
label=
"产品单位"
prop=
"unit"
>
<template
#
default=
"scope"
>
<dict-tag
:type=
"DICT_TYPE.CRM_PRODUCT_UNIT"
:value=
"scope.row.unit"
/>
</
template
>
</el-table-column>
<el-table-column
align=
"center"
label=
"产品编码"
prop=
"no"
/>
<el-table-column
align=
"center"
fixed=
"right"
label=
"数量"
prop=
"count"
width=
"100"
>
<
template
#
default=
"{ row }: { row: ProductApi.ProductExpandVO }"
>
<el-input-number
v-model=
"row.count"
controls-position=
"right"
:min=
"0"
:precision=
"0"
class=
"!w-100%"
/>
</
template
>
</el-table-column>
<el-table-column
align=
"center"
fixed=
"right"
label=
"折扣(%)"
prop=
"discountPercent"
width=
"120"
>
<
template
#
default=
"{ row }: { row: ProductApi.ProductExpandVO }"
>
<el-input-number
v-model=
"row.discountPercent"
controls-position=
"right"
:min=
"0"
:max=
"100"
:precision=
"0"
class=
"!w-100%"
/>
</
template
>
</el-table-column>
<el-table-column
align=
"center"
fixed=
"right"
label=
"合计"
prop=
"totalPrice"
width=
"100"
>
<
template
#
default=
"{ row }: { row: ProductApi.ProductExpandVO }"
>
{{
fenToYuan
(
getTotalPrice
(
row
))
}}
</
template
>
</el-table-column>
<el-table-column
align=
"center"
fixed=
"right"
label=
"操作"
width=
"60"
>
<
template
#
default=
"scope"
>
<el-button
link
type=
"danger"
@
click=
"handleDelete(scope.row.id)"
>
移除
</el-button>
</
template
>
</el-table-column>
</el-table>
<!-- table 选择表单 -->
<TableSelectForm
ref=
"tableSelectFormRef"
v-model=
"multipleSelection"
title=
"选择产品"
>
<el-table-column
align=
"center"
label=
"产品名称"
prop=
"name"
width=
"160"
/>
<el-table-column
align=
"center"
label=
"产品类型"
prop=
"categoryName"
width=
"160"
/>
<el-table-column
align=
"center"
label=
"产品单位"
prop=
"unit"
>
<
template
#
default=
"scope"
>
<dict-tag
:type=
"DICT_TYPE.CRM_PRODUCT_UNIT"
:value=
"scope.row.unit"
/>
</
template
>
</el-table-column>
<el-table-column
align=
"center"
label=
"产品编码"
prop=
"no"
/>
<el-table-column
:formatter=
"fenToYuanFormat"
align=
"center"
label=
"价格(元)"
prop=
"price"
width=
"100"
/>
</TableSelectForm>
</template>
<
script
lang=
"ts"
setup
>
import
*
as
ProductApi
from
'@/api/crm/product'
import
{
DICT_TYPE
}
from
'@/utils/dict'
import
{
fenToYuanFormat
}
from
'@/utils/formatter'
import
{
TableSelectForm
}
from
'@/components/Table/index'
import
{
fenToYuan
,
floatToFixed2
,
yuanToFen
}
from
'@/utils'
defineOptions
({
name
:
'ProductList'
})
const
props
=
withDefaults
(
defineProps
<
{
modelValue
:
ProductApi
.
ProductExpandVO
[]
}
>
(),
{
modelValue
:
()
=>
[]
})
const
emits
=
defineEmits
<
{
(
e
:
'update:modelValue'
,
v
:
any
[]):
void
}
>
()
const
list
=
ref
<
ProductApi
.
ProductExpandVO
[]
>
([])
// 已添加的产品列表
const
multipleSelection
=
ref
<
ProductApi
.
ProductExpandVO
[]
>
([])
// 多选
/** 处理删除 */
const
handleDelete
=
(
id
:
number
)
=>
{
const
index
=
list
.
value
.
findIndex
((
item
)
=>
item
.
id
===
id
)
if
(
index
!==
-
1
)
{
list
.
value
.
splice
(
index
,
1
)
}
}
/** 打开 Product 弹窗 */
const
tableSelectFormRef
=
ref
<
InstanceType
<
typeof
TableSelectForm
>>
()
const
openForm
=
()
=>
{
tableSelectFormRef
.
value
?.
open
(
ProductApi
.
getProductPage
)
}
/** 计算 totalPrice */
const
getTotalPrice
=
computed
(()
=>
(
row
:
ProductApi
.
ProductExpandVO
)
=>
{
const
totalPrice
=
(
Number
(
row
.
price
)
/
100
)
*
Number
(
row
.
count
)
*
(
1
-
Number
(
row
.
discountPercent
)
/
100
)
row
.
totalPrice
=
isNaN
(
totalPrice
)
?
0
:
yuanToFen
(
totalPrice
)
return
isNaN
(
totalPrice
)
?
0
:
totalPrice
.
toFixed
(
2
)
})
/** 编辑时合同产品回显 */
const
isSetListValue
=
ref
(
false
)
// 判断是否已经给 list 赋值过,用于编辑表单产品回显
watch
(
()
=>
props
.
modelValue
,
(
val
)
=>
{
if
(
!
val
||
val
.
length
===
0
||
isSetListValue
.
value
)
{
return
}
list
.
value
=
[
...
props
.
modelValue
.
map
((
item
)
=>
{
item
.
totalPrice
=
floatToFixed2
(
item
.
totalPrice
)
as
unknown
as
number
return
item
})
]
isSetListValue
.
value
=
true
},
{
immediate
:
true
,
deep
:
true
}
)
/** 监听列表变化,动态更新合同产品列表 */
watch
(
list
,
(
val
)
=>
{
if
(
!
val
||
val
.
length
===
0
)
{
return
}
emits
(
'update:modelValue'
,
list
.
value
)
},
{
deep
:
true
}
)
// 监听产品选择结果动态添加产品到列表中,如果产品存在则不放入列表中
watch
(
multipleSelection
,
(
val
)
=>
{
if
(
!
val
||
val
.
length
===
0
)
{
return
}
// 过滤出不在列表中的产品
const
ids
=
list
.
value
.
map
((
item
)
=>
item
.
id
)
const
productList
=
multipleSelection
.
value
.
filter
((
item
)
=>
ids
.
indexOf
(
item
.
id
)
===
-
1
)
if
(
!
productList
||
productList
.
length
===
0
)
{
return
}
list
.
value
.
push
(...
productList
)
},
{
deep
:
true
}
)
</
script
>
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