<template>
|
<div class="app-container">
|
<el-form
|
:model="queryParams"
|
ref="queryForm"
|
size="small"
|
:inline="true"
|
v-show="showSearch"
|
label-width="68px"
|
>
|
<el-form-item label="套餐名称" prop="pacName">
|
<el-input
|
v-model="queryParams.pacName"
|
placeholder="请输入套餐名称"
|
clearable
|
@keyup.enter.native="handleQuery"
|
/>
|
</el-form-item>
|
<el-form-item label="套餐描述" prop="pacRemark">
|
<el-input
|
v-model="queryParams.pacRemark"
|
placeholder="请输入套餐描述"
|
clearable
|
@keyup.enter.native="handleQuery"
|
/>
|
</el-form-item>
|
<el-form-item label="体检类别" prop="tjCategory">
|
<el-select
|
v-model="queryParams.tjCategory"
|
placeholder="请选择状态"
|
style="width: 200px"
|
filterable
|
clearable
|
>
|
<el-option
|
v-for="dict in dict.type.dict_tjtype"
|
:key="dict.id"
|
:label="dict.label"
|
:value="dict.value"
|
></el-option>
|
</el-select>
|
</el-form-item>
|
<el-form-item>
|
<el-button
|
type="primary"
|
icon="el-icon-search"
|
size="mini"
|
@click="handleQuery"
|
>搜索</el-button
|
>
|
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery"
|
>重置</el-button
|
>
|
</el-form-item>
|
</el-form>
|
|
<el-row :gutter="10" class="mb8">
|
<el-col :span="1.5">
|
<el-button
|
type="primary"
|
icon="el-icon-plus"
|
size="mini"
|
@click="handleAdd"
|
v-hasPermi="['system:package:add']"
|
>新增</el-button
|
>
|
</el-col>
|
<el-col :span="1.5">
|
<el-button
|
type="primary"
|
icon="el-icon-edit"
|
size="mini"
|
:disabled="single"
|
@click="handleUp"
|
v-hasPermi="['system:package:edit']"
|
>修改</el-button
|
>
|
</el-col>
|
<el-col :span="1.5">
|
<el-button
|
type="primary"
|
icon="el-icon-delete"
|
size="mini"
|
:disabled="multiple"
|
@click="handleDelete"
|
v-hasPermi="['system:package:remove']"
|
>删除</el-button
|
>
|
</el-col>
|
<el-col :span="1.5">
|
<el-button
|
type="primary"
|
icon="el-icon-download"
|
size="mini"
|
@click="handleExport"
|
v-hasPermi="['system:package:export']"
|
>导出</el-button
|
>
|
</el-col>
|
<right-toolbar
|
:showSearch.sync="showSearch"
|
@queryTable="getList"
|
></right-toolbar>
|
</el-row>
|
|
<template>
|
<el-table
|
v-loading="loading"
|
style="width: 100%"
|
:data="packageList"
|
@selection-change="handleSelectionChange"
|
border
|
>
|
<el-table-column
|
fixed
|
type="selection"
|
width="40"
|
align="center"
|
:show-overflow-tooltip="true"
|
/>
|
<el-table-column
|
label="序号"
|
align="center"
|
width="50"
|
prop="newID"
|
fixed
|
/>
|
<el-table-column
|
label="体检类别"
|
width="100px"
|
align="center"
|
prop="categoryNames"
|
fixed
|
>
|
<template slot-scope="scope">
|
<dict-tag
|
:options="dict.type.dict_tjtype"
|
:value="scope.row.tjCategory"
|
/>
|
</template>
|
</el-table-column>
|
<el-table-column
|
label="套餐名称"
|
align="center"
|
prop="pacName"
|
width="150px"
|
fixed
|
/>
|
<el-table-column
|
label="原价"
|
width="80px"
|
align="center"
|
prop="price"
|
fixed
|
></el-table-column>
|
<el-table-column
|
label="折扣"
|
width="80px"
|
align="center"
|
prop="limits"
|
fixed
|
></el-table-column>
|
<el-table-column
|
label="现价"
|
width="80px"
|
align="center"
|
prop="newPrice"
|
fixed
|
>
|
</el-table-column>
|
<el-table-column
|
label="单项列表"
|
align="center"
|
prop="allProName"
|
width="1200px"
|
>
|
</el-table-column>
|
<el-table-column
|
label="套餐描述"
|
align="center"
|
:show-overflow-tooltip="true"
|
width="120px"
|
>
|
<template slot-scope="scope">
|
<div class="showInline">{{ scope.row.pacRemark }}</div>
|
</template>
|
</el-table-column>
|
<el-table-column
|
label="关键字"
|
width="110px"
|
align="center"
|
prop="keyNames"
|
></el-table-column>
|
<el-table-column
|
label="是否上架"
|
width="94px"
|
align="center"
|
prop="isOnSale"
|
>
|
<template slot-scope="scope">
|
<dict-tag
|
:options="dict.type.sys_yes_no"
|
:value="scope.row.isOnSale"
|
/>
|
</template>
|
</el-table-column>
|
<el-table-column
|
label="排序"
|
width="50px"
|
align="center"
|
prop="sort"
|
></el-table-column>
|
<el-table-column
|
label="小程序价格"
|
width="90px"
|
align="center"
|
prop="retailPrice"
|
></el-table-column>
|
<el-table-column
|
label="已售数量"
|
width="90px"
|
align="center"
|
prop="saleNum"
|
></el-table-column>
|
<el-table-column
|
label="状态"
|
align="center"
|
prop="pacStatus"
|
fixed="right"
|
width="100px"
|
>
|
<template slot-scope="scope">
|
<el-switch
|
v-model="scope.row.pacStatus"
|
active-value="0"
|
inactive-value="1"
|
@change="handleStatusChange(scope.row)"
|
></el-switch>
|
</template>
|
</el-table-column>
|
<el-table-column
|
label="操作"
|
align="center"
|
width="80px"
|
fixed="right"
|
class-name="small-padding fixed-width"
|
>
|
<template slot-scope="scope">
|
<el-button
|
size="mini"
|
type="text"
|
icon="el-icon-edit"
|
@click="handleUpdate(scope.row)"
|
v-hasPermi="['system:package:edit']"
|
title="修改"
|
></el-button>
|
<el-button
|
size="mini"
|
type="text"
|
icon="el-icon-delete"
|
@click="handleDelete(scope.row)"
|
v-hasPermi="['system:package:remove']"
|
title="删除"
|
></el-button>
|
</template>
|
</el-table-column>
|
</el-table>
|
|
<div class="pag">
|
<div class="pag1">
|
<pagination
|
v-show="total > 0"
|
:total="total"
|
:page.sync="queryParams.pageNum"
|
:limit.sync="queryParams.pageSize"
|
@pagination="getList"
|
/>
|
</div>
|
</div>
|
</template>
|
|
<!-- 修改体检套餐对话框 -->
|
<el-dialog
|
:title="title"
|
:visible.sync="open"
|
width="1400px"
|
append-to-body
|
:close-on-click-modal="false"
|
>
|
<el-form
|
ref="form"
|
:model="form"
|
:rules="rules"
|
label-width="100px"
|
:inline="true"
|
>
|
<el-form-item label="套餐名称" prop="pacName">
|
<span
|
slot="label"
|
style="display: inline-block; border-bottom: 2px solid blue"
|
@click="handlePackage"
|
>
|
套餐名称
|
</span>
|
<el-input
|
v-model="form.pacName"
|
placeholder="请输入套餐名称"
|
style="width: 150px"
|
/>
|
</el-form-item>
|
<el-form-item label="套餐状态" prop="pacStatus">
|
<el-select
|
v-model="form.pacStatus"
|
placeholder="请选择状态"
|
style="width: 150px"
|
filterable
|
clearable
|
>
|
<el-option
|
v-for="dict in dict.type.sys_normal_disable"
|
:key="dict.value"
|
:label="dict.label"
|
:value="dict.value"
|
></el-option>
|
</el-select>
|
</el-form-item>
|
<el-form-item label="体检类别" prop="tjCategory">
|
<el-select
|
v-model="form.tjCategory"
|
placeholder="请选择体检类别"
|
style="width: 150px"
|
filterable
|
clearable
|
>
|
<el-option
|
v-for="dict in dict.type.dict_tjtype"
|
:key="dict.value"
|
:label="dict.label"
|
:value="dict.value"
|
></el-option>
|
</el-select>
|
</el-form-item>
|
<el-form-item label="是否上架" prop="isOnSale">
|
<el-select
|
v-model="form.isOnSale"
|
placeholder="请选择是否上架"
|
style="width: 140px"
|
filterable
|
clearable
|
>
|
<el-option
|
v-for="dict in dict.type.sys_yes_no"
|
:key="dict.value"
|
:label="dict.label"
|
:value="dict.value"
|
></el-option>
|
</el-select>
|
</el-form-item>
|
<el-form-item label="排序" prop="sort">
|
<el-input
|
v-model="form.sort"
|
placeholder="请输入排序"
|
style="width: 150px"
|
/>
|
</el-form-item>
|
<el-form-item label="小程序价格" prop="retailPrice">
|
<el-input
|
v-model="form.retailPrice"
|
placeholder="请输入小程序价格"
|
style="width: 150px"
|
/>
|
</el-form-item>
|
<el-form-item label="原价" prop="pics">
|
<el-input
|
v-model="pics"
|
placeholder="请输入原价"
|
style="width: 150px"
|
/>
|
</el-form-item>
|
<el-form-item label="折扣">
|
<el-input-number
|
ref="inputNumber"
|
style="width: 150px"
|
v-model="youhui"
|
:precision="2"
|
:step="0.1"
|
:max="10"
|
:min="1"
|
@change="numberChange"
|
></el-input-number>
|
</el-form-item>
|
<el-form-item label="现价1">
|
<el-input
|
ref="inputName"
|
v-model="form.xianprice"
|
placeholder="请输入现价"
|
clearable
|
style="width: 140px"
|
type="number"
|
:min="0"
|
@change="handleXianPriceChange"
|
@input="handleXianPriceInput"
|
/>
|
</el-form-item>
|
<el-form-item label="关键字" prop="keywords">
|
<el-select
|
multiple
|
v-model="form.keywords"
|
placeholder="请选择关键字"
|
style="width: 160px"
|
@change="sel"
|
filterable
|
clearable
|
>
|
<el-option
|
v-for="item in keywordList"
|
:key="item.id"
|
:label="item.keyword"
|
:value="item.id"
|
></el-option>
|
</el-select>
|
</el-form-item>
|
|
<div v-if="!isCollapsed" style="display: flex">
|
<div>
|
<el-form-item label="套餐描述" prop="pacRemark">
|
<el-input
|
type="textarea"
|
v-model="form.pacRemark"
|
placeholder="请输入套餐描述"
|
style="width: 670px"
|
rows="2"
|
></el-input>
|
</el-form-item>
|
<el-form-item label="详细介绍" prop="detail">
|
<editor
|
v-model="form.detail"
|
:min-height="192"
|
style="width: 670px"
|
/>
|
</el-form-item>
|
</div>
|
<div class="dialo2">
|
<el-form-item label="图片">
|
<image-upload v-model="form.pacPhone" />
|
</el-form-item>
|
</div>
|
</div>
|
</el-form>
|
<el-button type="primary" plain size="mini" @click="toggleCollapse">{{
|
isCollapsed ? "展开" : "收起"
|
}}</el-button>
|
|
<el-row style="display: flex; width: 1300px">
|
<el-col>
|
<div
|
style="text-align: center; margin-bottom: 10px; margin-top: 10px"
|
>
|
项目列表
|
</div>
|
<el-input
|
placeholder="输入关键字进行过滤"
|
@input="handleFilterInput"
|
v-model="queryParams1.nr"
|
clearable
|
/>
|
<div class="tab3" style="height: 365px">
|
<el-tree
|
class="filter-tree"
|
v-loading="loading"
|
:data="Treedata"
|
:props="defaultProps"
|
show-checkbox
|
node-key="proId"
|
@check-change="handleCurrentChecked"
|
:default-checked-keys="checkedkey"
|
:filter-node-method="filterNode"
|
ref="tree"
|
:render-content="renderContent"
|
>
|
</el-tree>
|
<pagination
|
small
|
v-show="total1 > 0"
|
:total="total1"
|
:page.sync="queryParams1.page"
|
:limit.sync="queryParams1.pageSize"
|
@pagination="getDataList"
|
/>
|
</div>
|
</el-col>
|
<el-col>
|
<div class="grid-content bg-purple">
|
<div
|
style="
|
text-align: center;
|
margin-bottom: 10px;
|
margin-top: 10px;
|
margin-left: 8%;
|
"
|
>
|
已选项目列表
|
</div>
|
<el-table
|
:data="DataList"
|
border
|
style="width: 90%; margin-left: 20px"
|
height="400"
|
>
|
<el-table-column prop="proName" label="检查项目">
|
</el-table-column>
|
<el-table-column
|
prop="priceOrd"
|
label="原价"
|
align="center"
|
width="80px"
|
>
|
</el-table-column>
|
<el-table-column label="折扣" width="100px">
|
<template slot-scope="scope">
|
<el-input
|
v-model.number="scope.row.limits"
|
@input="calculateDiscount(scope.row)"
|
placeholder="输入折扣"
|
size="small"
|
type="number"
|
min="0"
|
step="0.1"
|
max="10"
|
/>
|
</template>
|
</el-table-column>
|
<el-table-column
|
prop="priceNow"
|
label="现价"
|
width="80px"
|
align="center"
|
>
|
</el-table-column>
|
<el-table-column label="操作" align="center" width="80px">
|
<template slot-scope="scope">
|
<el-button
|
size="mini"
|
type="text"
|
icon="el-icon-delete"
|
@click="handleDelete1(scope.row)"
|
title="删除"
|
>
|
</el-button>
|
</template>
|
</el-table-column>
|
</el-table>
|
</div>
|
</el-col>
|
</el-row>
|
|
<div slot="footer" class="dialog-footer">
|
<el-button type="primary" @click="submitForm">确 定</el-button>
|
<el-button @click="cancel">取 消</el-button>
|
</div>
|
</el-dialog>
|
|
<Packages ref="aaa" @add="handleChanges" />
|
</div>
|
</template>
|
|
<script>
|
import { Big } from 'big.js'
|
import Packages from "@/components/Packages"
|
import { listCategory } from "@/api/mall/category"
|
import { listKeyword } from "@/api/mall/keyword"
|
import { search } from "@/api/system/package"
|
import {
|
getPacList,
|
getPacInFo,
|
delPackage,
|
updateStatus,
|
getPacTjProjectList,
|
saveOreditTjPacNew,
|
} from "@/api/system/package"
|
import { Message } from "element-ui"
|
|
export default {
|
name: "Package",
|
dicts: ["sys_normal_disable", "sys_yes_no", "dict_tjtype"],
|
components: { Packages },
|
data() {
|
return {
|
pics: 0, // 原价总和
|
DataList: [], // 已选项目列表
|
Treedata: [], // 项目树数据
|
checkedkey: [], // 树默认选中项
|
checkedNodes: [], // 记录选中的节点
|
isCollapsed: true, // 折叠状态
|
categoryList: [], // 套餐类目
|
keywordList: [], // 关键字列表
|
keys: "", // 关键字字符串
|
loading: false, // 加载状态
|
single: true, // 是否单选禁用
|
multiple: true, // 是否多选禁用
|
showSearch: true, // 显示搜索条件
|
packageList: [], // 套餐列表
|
allList: [], // 所有体检项目
|
title: "", // 弹出层标题
|
open: false, // 是否显示弹出层
|
total: 0, // 主表格总条数
|
total1: 0, // 项目树总条数
|
queryParams: {
|
pageNum: 1,
|
pageSize: 10,
|
pacName: null,
|
pacRemark: null,
|
tjCategory: null,
|
},
|
queryParams1: {
|
page: 1,
|
pageSize: 30,
|
nr: "",
|
},
|
form: {
|
xianprice: 0, // 现价总和,可手动修改
|
limits: 10, // 总折扣
|
pacName: "",
|
pacStatus: "",
|
tjCategory: "",
|
isOnSale: "",
|
sort: null,
|
retailPrice: null,
|
keywords: [],
|
},
|
youhui: 10, // 上方折扣
|
defaultProps: {
|
children: [],
|
label: "proName",
|
},
|
rules: {
|
pacName: [{ required: true, message: "套餐名称不能为空", trigger: "blur" }],
|
pacStatus: [
|
{ required: true, message: "请选择套餐状态", trigger: "change" },
|
],
|
isOnSale: [
|
{ required: true, message: "请选择是否上架", trigger: "change" },
|
],
|
sort: [{ required: true, message: "排序不能为空", trigger: "blur" }],
|
retailPrice: [
|
{ required: true, message: "小程序价格不能为空", trigger: "blur" },
|
],
|
tjCategory: [
|
{ required: true, message: "请选择体检类别", trigger: "change" },
|
],
|
},
|
}
|
},
|
created() {
|
this.getList()
|
this.getKeyword()
|
this.getCategory()
|
},
|
methods: {
|
toggleCollapse() {
|
this.isCollapsed = !this.isCollapsed
|
},
|
filterNode(value, data) {
|
if (!value) return true
|
return (
|
data.proName.indexOf(value) !== -1 ||
|
(data.proEngName && data.proEngName.indexOf(value) !== -1)
|
)
|
},
|
getList() {
|
this.loading = true
|
getPacTjProjectList().then((response) => {
|
this.allList = response.data
|
this.loading = false
|
})
|
getPacList(this.queryParams).then((response) => {
|
response.rows.forEach((item, index) => {
|
item.newID =
|
(this.queryParams.pageNum - 1) * this.queryParams.pageSize +
|
index +
|
1
|
})
|
this.total = response.total
|
this.packageList = response.rows
|
this.loading = false
|
})
|
},
|
getKeyword() {
|
listKeyword(this.queryParams).then((response) => {
|
this.keywordList = response.rows
|
})
|
},
|
sel(val) {
|
this.keys = val.join(",")
|
},
|
getCategory() {
|
listCategory(this.queryParams).then((response) => {
|
this.categoryList = response.rows
|
})
|
},
|
cancel() {
|
this.open = false
|
this.reset()
|
},
|
reset() {
|
this.form = {
|
pacId: null,
|
pacName: "",
|
pacRemark: "",
|
pacStatus: "",
|
tjCategory: "",
|
isOnSale: "",
|
sort: null,
|
retailPrice: null,
|
xianprice: 0,
|
limits: 10,
|
keywords: [],
|
}
|
this.DataList = []
|
this.checkedkey = []
|
this.checkedNodes = []
|
this.youhui = 10
|
this.pics = 0
|
this.resetForm("form")
|
},
|
handleQuery() {
|
this.queryParams.pageNum = 1
|
this.getList()
|
},
|
handlePackage() {
|
this.$refs.aaa.open = true
|
this.$refs.aaa.getList()
|
this.$refs.aaa.title = "套餐字典"
|
},
|
handleChanges(param1) {
|
this.form.pacName = param1[0].pacName
|
this.form.hisPacId = param1[0].pacId
|
if (param1[0].price) {
|
this.form.counterPrice = param1[0].price
|
this.form.retailPrice = param1[0].price
|
}
|
},
|
resetQuery() {
|
this.resetForm("queryForm")
|
this.handleQuery()
|
},
|
handleSelectionChange(selection) {
|
if (!selection.length) {
|
this.forms = null
|
this.ids = []
|
this.single = true
|
this.multiple = true
|
return
|
}
|
this.forms = selection[0]
|
this.ids = selection.map((item) => item.pacId)
|
this.single = selection.length !== 1
|
this.multiple = false
|
},
|
handleAdd() {
|
this.reset()
|
this.open = true
|
this.title = "体检套餐信息维护"
|
this.getDataList()
|
},
|
handleStatusChange(row) {
|
let data = { pacId: row.pacId, pacStatus: row.pacStatus }
|
let text = row.pacStatus === "0" ? "启用" : "停用"
|
this.$confirm(`确认要${text}${row.pacName}套餐吗?`)
|
.then(() => updateStatus(data))
|
.then(() => this.msgSuccess(`${text}成功`))
|
.catch(() => {
|
row.pacStatus = row.pacStatus === "0" ? "1" : "0"
|
})
|
},
|
handleUp() {
|
this.title = "体检套餐信息维护"
|
this.open = true
|
getPacInFo(this.forms.pacId).then((response) => {
|
this.form = response.data
|
this.form.keywords = this.form.keywords
|
? this.form.keywords.slice(0, -1).split(",")
|
: []
|
this.DataList = response.data.packageProjects || []
|
this.checkedkey = this.DataList.map((item) => item.proId)
|
this.checkedNodes = [...this.checkedkey]
|
this.updateTotalPrice()
|
this.updateYouhui()
|
this.getDataList()
|
})
|
},
|
handleUpdate(row) {
|
this.title = "体检套餐信息维护"
|
this.open = true
|
getPacInFo(row.pacId).then((response) => {
|
this.form = response.data
|
this.form.keywords = this.form.keywords
|
? this.form.keywords.slice(0, -1).split(",")
|
: []
|
this.DataList = response.data.packageProjects || []
|
this.checkedkey = this.DataList.map((item) => item.proId)
|
this.checkedNodes = [...this.checkedkey]
|
this.updateTotalPrice()
|
this.updateYouhui()
|
this.getDataList()
|
})
|
},
|
handleDelete1(row) {
|
this.DataList = this.DataList.filter((item) => item.proId !== row.proId)
|
const index = this.checkedNodes.indexOf(row.proId)
|
if (index > -1) this.checkedNodes.splice(index, 1)
|
const tree = this.$refs.tree
|
const node = tree.getNode(row.proId)
|
if (node) node.setChecked(false)
|
this.updateTotalPrice()
|
this.updateYouhui()
|
},
|
numberChange(currentValue) {
|
this.youhui = currentValue
|
this.DataList.forEach((item) => {
|
item.limits = this.youhui
|
this.updateProPrice(item)
|
})
|
this.updateTotalPrice()
|
},
|
handleXianPriceInput(value) {
|
const numValue = Math.max(0, Number(value) || 0)
|
console.log("123")
|
this.form.xianprice = numValue
|
},
|
handleXianPriceChange(newValue) {
|
const value = Math.max(0, Number(newValue) || 0)
|
|
if (this.DataList.length === 0 || this.pics === 0) {
|
this.form.xianprice = 0
|
this.youhui = 10
|
return
|
}
|
|
// 使用Big.js处理精度
|
const totalOriginalPrice = new Big(this.pics)
|
const totalCurrentPrice = new Big(value)
|
let newYouhui = totalCurrentPrice
|
.div(totalOriginalPrice)
|
.times(10)
|
.toNumber()
|
|
// 限制折扣范围
|
newYouhui = Math.min(10, Math.max(0, newYouhui))
|
this.youhui = Number(newYouhui.toFixed(1))
|
|
// 更新所有项目的折扣和现价
|
this.DataList.forEach((item) => {
|
item.limits = this.youhui
|
this.updateProPrice(item)
|
})
|
|
// 重新计算确保精度
|
this.updateTotalPrice(true)
|
},
|
updateProPrice(row) {
|
if (!row.priceOrd) return
|
const proPrice = new Big(row.priceOrd)
|
const limits = new Big(row.limits || 10)
|
row.priceNow = parseFloat(proPrice.times(limits.div(10)).toFixed(2))
|
},
|
calculateDiscount(row) {
|
row.limits = Math.min(10, Math.max(0, row.limits))
|
this.updateProPrice(row)
|
this.updateTotalPrice()
|
this.updateYouhui()
|
},
|
updateTotalPrice(skipXianPrice = false) {
|
// 计算原价总和
|
this.pics = this.DataList.reduce(
|
(sum, item) => sum + (Number(item.priceOrd) || 0),
|
0
|
)
|
|
// 计算现价总和
|
if (!skipXianPrice) {
|
const totalCurrent = this.DataList.reduce(
|
(sum, item) => sum + (Number(item.priceNow) || 0),
|
0
|
)
|
console.log("1231")
|
|
this.form.xianprice = parseFloat(totalCurrent).toFixed(2)
|
}
|
},
|
updateYouhui() {
|
if (this.DataList.length === 0 || this.pics === 0) {
|
this.youhui = 10
|
return
|
}
|
const totalOriginal = new Big(this.pics)
|
const totalCurrent = new Big(this.form.xianprice || 0)
|
this.youhui = parseFloat(
|
totalCurrent
|
.div(totalOriginal)
|
.times(10)
|
.toFixed(1)
|
)
|
},
|
renderContent(h, { node, data }) {
|
return (
|
<span class="custom-tree-node">
|
<span>{node.label}</span>
|
<span>({data.proPrice}元)</span>
|
</span>
|
)
|
},
|
getDataList() {
|
this.loading = true
|
search(this.queryParams1).then((response) => {
|
this.Treedata = response.data.list
|
this.total1 = response.data.total
|
this.$nextTick(() => {
|
this.$refs.tree.setCheckedKeys(this.checkedNodes)
|
})
|
this.loading = false
|
})
|
},
|
handleFilterInput() {
|
this.queryParams1.page = 1
|
this.getDataList()
|
},
|
handleCurrentChecked(data, checked) {
|
if (checked) {
|
if (!this.DataList.some((item) => item.proId === data.proId)) {
|
const newItem = {
|
proId: data.proId,
|
proName: data.proName,
|
priceOrd: data.proPrice,
|
limits: this.youhui,
|
priceNow: 0,
|
}
|
this.updateProPrice(newItem)
|
this.DataList.push(newItem)
|
this.checkedNodes.push(data.proId)
|
}
|
} else {
|
this.DataList = this.DataList.filter((item) => item.proId !== data.proId)
|
const index = this.checkedNodes.indexOf(data.proId)
|
if (index > -1) this.checkedNodes.splice(index, 1)
|
}
|
this.updateTotalPrice()
|
this.updateYouhui()
|
},
|
submitForm() {
|
this.$refs.form.validate((valid) => {
|
if (valid) {
|
this.form.limits = this.youhui
|
this.form.price = this.pics
|
this.form.newPrice = this.form.xianprice
|
|
const packageProjects = this.DataList.map((item) => ({
|
proName: item.proName,
|
proId: item.proId,
|
priceNow: item.priceNow,
|
limits: item.limits,
|
priceOrd: item.priceOrd,
|
}))
|
|
const data = {
|
pacName: this.form.pacName,
|
limits: this.form.limits,
|
pacStatus: this.form.pacStatus,
|
packageProjects,
|
newPrice: this.form.xianprice,
|
price: this.pics,
|
pacId: this.form.pacId || null,
|
isOnSale: this.form.isOnSale,
|
sort: this.form.sort,
|
retailPrice: this.form.retailPrice,
|
tjCategory: this.form.tjCategory,
|
pacRemark: this.form.pacRemark,
|
detail: this.form.detail,
|
keywords: this.keys,
|
}
|
|
saveOreditTjPacNew(data).then(() => {
|
this.open = false
|
this.getList()
|
this.$modal.msgSuccess("保存成功")
|
})
|
}
|
})
|
},
|
handleDelete(row) {
|
const pacIds = row.pacId || this.ids
|
this.$modal
|
.confirm(`是否确认删除体检套餐编号为"${pacIds}"的数据项?`)
|
.then(() => delPackage(pacIds))
|
.then(() => {
|
this.getList()
|
this.$modal.msgSuccess("删除成功")
|
})
|
.catch(() => {})
|
},
|
handleExport() {
|
this.download(
|
"system/package/export",
|
{ ...this.queryParams },
|
`package_${new Date().getTime()}.xlsx`
|
)
|
},
|
},
|
}
|
</script>
|
|
<style>
|
.el-tooltip__popper {
|
max-width: 800px;
|
}
|
|
.showInline {
|
overflow: hidden;
|
text-overflow: ellipsis;
|
display: -webkit-box;
|
-webkit-line-clamp: 2;
|
line-clamp: 2;
|
-webkit-box-orient: vertical;
|
}
|
|
.pag {
|
width: 100%;
|
display: flex;
|
justify-content: center;
|
}
|
|
.pag1 {
|
width: 30%;
|
}
|
|
.dialog-footer {
|
position: absolute;
|
left: 40%;
|
bottom: 2%;
|
}
|
.tab3 {
|
max-height: 400px;
|
overflow-y: auto;
|
border: 1px solid #d9d9d9;
|
}
|
</style><template>
|
<div class="app-container">
|
<el-form
|
:model="queryParams"
|
ref="queryForm"
|
size="small"
|
:inline="true"
|
v-show="showSearch"
|
label-width="68px"
|
>
|
<el-form-item label="套餐名称" prop="pacName">
|
<el-input
|
v-model="queryParams.pacName"
|
placeholder="请输入套餐名称"
|
clearable
|
@keyup.enter.native="handleQuery"
|
/>
|
</el-form-item>
|
<el-form-item label="套餐描述" prop="pacRemark">
|
<el-input
|
v-model="queryParams.pacRemark"
|
placeholder="请输入套餐描述"
|
clearable
|
@keyup.enter.native="handleQuery"
|
/>
|
</el-form-item>
|
<el-form-item label="体检类别" prop="tjCategory">
|
<el-select
|
v-model="queryParams.tjCategory"
|
placeholder="请选择状态"
|
style="width: 200px"
|
filterable
|
clearable
|
>
|
<el-option
|
v-for="dict in dict.type.dict_tjtype"
|
:key="dict.id"
|
:label="dict.label"
|
:value="dict.value"
|
></el-option>
|
</el-select>
|
</el-form-item>
|
<el-form-item>
|
<el-button
|
type="primary"
|
icon="el-icon-search"
|
size="mini"
|
@click="handleQuery"
|
>搜索</el-button
|
>
|
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery"
|
>重置</el-button
|
>
|
</el-form-item>
|
</el-form>
|
|
<el-row :gutter="10" class="mb8">
|
<el-col :span="1.5">
|
<el-button
|
type="primary"
|
icon="el-icon-plus"
|
size="mini"
|
@click="handleAdd"
|
v-hasPermi="['system:package:add']"
|
>新增</el-button
|
>
|
</el-col>
|
<el-col :span="1.5">
|
<el-button
|
type="primary"
|
icon="el-icon-edit"
|
size="mini"
|
:disabled="single"
|
@click="handleUp"
|
v-hasPermi="['system:package:edit']"
|
>修改</el-button
|
>
|
</el-col>
|
<el-col :span="1.5">
|
<el-button
|
type="primary"
|
icon="el-icon-delete"
|
size="mini"
|
:disabled="multiple"
|
@click="handleDelete"
|
v-hasPermi="['system:package:remove']"
|
>删除</el-button
|
>
|
</el-col>
|
<el-col :span="1.5">
|
<el-button
|
type="primary"
|
icon="el-icon-download"
|
size="mini"
|
@click="handleExport"
|
v-hasPermi="['system:package:export']"
|
>导出</el-button
|
>
|
</el-col>
|
<right-toolbar
|
:showSearch.sync="showSearch"
|
@queryTable="getList"
|
></right-toolbar>
|
</el-row>
|
|
<template>
|
<el-table
|
v-loading="loading"
|
style="width: 100%"
|
:data="packageList"
|
@selection-change="handleSelectionChange"
|
border
|
>
|
<el-table-column
|
fixed
|
type="selection"
|
width="40"
|
align="center"
|
:show-overflow-tooltip="true"
|
/>
|
<el-table-column
|
label="序号"
|
align="center"
|
width="50"
|
prop="newID"
|
fixed
|
/>
|
<el-table-column
|
label="体检类别"
|
width="100px"
|
align="center"
|
prop="categoryNames"
|
fixed
|
>
|
<template slot-scope="scope">
|
<dict-tag
|
:options="dict.type.dict_tjtype"
|
:value="scope.row.tjCategory"
|
/>
|
</template>
|
</el-table-column>
|
<el-table-column
|
label="套餐名称"
|
align="center"
|
prop="pacName"
|
width="150px"
|
fixed
|
/>
|
<el-table-column
|
label="原价"
|
width="80px"
|
align="center"
|
prop="price"
|
fixed
|
></el-table-column>
|
<el-table-column
|
label="折扣"
|
width="80px"
|
align="center"
|
prop="limits"
|
fixed
|
></el-table-column>
|
<el-table-column
|
label="现价"
|
width="80px"
|
align="center"
|
prop="newPrice"
|
fixed
|
>
|
</el-table-column>
|
<el-table-column
|
label="单项列表"
|
align="center"
|
prop="allProName"
|
width="1200px"
|
>
|
</el-table-column>
|
<el-table-column
|
label="套餐描述"
|
align="center"
|
:show-overflow-tooltip="true"
|
width="120px"
|
>
|
<template slot-scope="scope">
|
<div class="showInline">{{ scope.row.pacRemark }}</div>
|
</template>
|
</el-table-column>
|
<el-table-column
|
label="关键字"
|
width="110px"
|
align="center"
|
prop="keyNames"
|
></el-table-column>
|
<el-table-column
|
label="是否上架"
|
width="94px"
|
align="center"
|
prop="isOnSale"
|
>
|
<template slot-scope="scope">
|
<dict-tag
|
:options="dict.type.sys_yes_no"
|
:value="scope.row.isOnSale"
|
/>
|
</template>
|
</el-table-column>
|
<el-table-column
|
label="排序"
|
width="50px"
|
align="center"
|
prop="sort"
|
></el-table-column>
|
<el-table-column
|
label="小程序价格"
|
width="90px"
|
align="center"
|
prop="retailPrice"
|
></el-table-column>
|
<el-table-column
|
label="已售数量"
|
width="90px"
|
align="center"
|
prop="saleNum"
|
></el-table-column>
|
<el-table-column
|
label="状态"
|
align="center"
|
prop="pacStatus"
|
fixed="right"
|
width="100px"
|
>
|
<template slot-scope="scope">
|
<el-switch
|
v-model="scope.row.pacStatus"
|
active-value="0"
|
inactive-value="1"
|
@change="handleStatusChange(scope.row)"
|
></el-switch>
|
</template>
|
</el-table-column>
|
<el-table-column
|
label="操作"
|
align="center"
|
width="80px"
|
fixed="right"
|
class-name="small-padding fixed-width"
|
>
|
<template slot-scope="scope">
|
<el-button
|
size="mini"
|
type="text"
|
icon="el-icon-edit"
|
@click="handleUpdate(scope.row)"
|
v-hasPermi="['system:package:edit']"
|
title="修改"
|
></el-button>
|
<el-button
|
size="mini"
|
type="text"
|
icon="el-icon-delete"
|
@click="handleDelete(scope.row)"
|
v-hasPermi="['system:package:remove']"
|
title="删除"
|
></el-button>
|
</template>
|
</el-table-column>
|
</el-table>
|
|
<div class="pag">
|
<div class="pag1">
|
<pagination
|
v-show="total > 0"
|
:total="total"
|
:page.sync="queryParams.pageNum"
|
:limit.sync="queryParams.pageSize"
|
@pagination="getList"
|
/>
|
</div>
|
</div>
|
</template>
|
|
<!-- 修改体检套餐对话框 -->
|
<el-dialog
|
:title="title"
|
:visible.sync="open"
|
width="1400px"
|
append-to-body
|
:close-on-click-modal="false"
|
>
|
<el-form
|
ref="form"
|
:model="form"
|
:rules="rules"
|
label-width="100px"
|
:inline="true"
|
>
|
<el-form-item label="套餐名称" prop="pacName">
|
<span
|
slot="label"
|
style="display: inline-block; border-bottom: 2px solid blue"
|
@click="handlePackage"
|
>
|
套餐名称
|
</span>
|
<el-input
|
v-model="form.pacName"
|
placeholder="请输入套餐名称"
|
style="width: 150px"
|
/>
|
</el-form-item>
|
<el-form-item label="套餐状态" prop="pacStatus">
|
<el-select
|
v-model="form.pacStatus"
|
placeholder="请选择状态"
|
style="width: 150px"
|
filterable
|
clearable
|
>
|
<el-option
|
v-for="dict in dict.type.sys_normal_disable"
|
:key="dict.value"
|
:label="dict.label"
|
:value="dict.value"
|
></el-option>
|
</el-select>
|
</el-form-item>
|
<el-form-item label="体检类别" prop="tjCategory">
|
<el-select
|
v-model="form.tjCategory"
|
placeholder="请选择体检类别"
|
style="width: 150px"
|
filterable
|
clearable
|
>
|
<el-option
|
v-for="dict in dict.type.dict_tjtype"
|
:key="dict.value"
|
:label="dict.label"
|
:value="dict.value"
|
></el-option>
|
</el-select>
|
</el-form-item>
|
<el-form-item label="是否上架" prop="isOnSale">
|
<el-select
|
v-model="form.isOnSale"
|
placeholder="请选择是否上架"
|
style="width: 140px"
|
filterable
|
clearable
|
>
|
<el-option
|
v-for="dict in dict.type.sys_yes_no"
|
:key="dict.value"
|
:label="dict.label"
|
:value="dict.value"
|
></el-option>
|
</el-select>
|
</el-form-item>
|
<el-form-item label="排序" prop="sort">
|
<el-input
|
v-model="form.sort"
|
placeholder="请输入排序"
|
style="width: 150px"
|
/>
|
</el-form-item>
|
<el-form-item label="小程序价格" prop="retailPrice">
|
<el-input
|
v-model="form.retailPrice"
|
placeholder="请输入小程序价格"
|
style="width: 150px"
|
/>
|
</el-form-item>
|
<el-form-item label="原价" prop="pics">
|
<el-input
|
v-model="pics"
|
placeholder="请输入原价"
|
style="width: 150px"
|
/>
|
</el-form-item>
|
<el-form-item label="折扣">
|
<el-input-number
|
ref="inputNumber"
|
style="width: 150px"
|
v-model="youhui"
|
:precision="2"
|
:step="0.1"
|
:max="10"
|
:min="1"
|
@change="numberChange"
|
></el-input-number>
|
</el-form-item>
|
<el-form-item label="现价">
|
<el-input
|
ref="inputName"
|
v-model="form.xianprice"
|
placeholder="请输入现价"
|
clearable
|
style="width: 140px"
|
type="number"
|
:min="0"
|
@change="handleXianPriceChange"
|
@input="handleXianPriceInput"
|
/>
|
</el-form-item>
|
<el-form-item label="关键字" prop="keywords">
|
<el-select
|
multiple
|
v-model="form.keywords"
|
placeholder="请选择关键字"
|
style="width: 160px"
|
@change="sel"
|
filterable
|
clearable
|
>
|
<el-option
|
v-for="item in keywordList"
|
:key="item.id"
|
:label="item.keyword"
|
:value="item.id"
|
></el-option>
|
</el-select>
|
</el-form-item>
|
|
<div v-if="!isCollapsed" style="display: flex">
|
<div>
|
<el-form-item label="套餐描述" prop="pacRemark">
|
<el-input
|
type="textarea"
|
v-model="form.pacRemark"
|
placeholder="请输入套餐描述"
|
style="width: 670px"
|
rows="2"
|
></el-input>
|
</el-form-item>
|
<el-form-item label="详细介绍" prop="detail">
|
<editor
|
v-model="form.detail"
|
:min-height="192"
|
style="width: 670px"
|
/>
|
</el-form-item>
|
</div>
|
<div class="dialo2">
|
<el-form-item label="图片">
|
<image-upload v-model="form.pacPhone" />
|
</el-form-item>
|
</div>
|
</div>
|
</el-form>
|
<el-button type="primary" plain size="mini" @click="toggleCollapse">{{
|
isCollapsed ? "展开" : "收起"
|
}}</el-button>
|
|
<el-row style="display: flex; width: 1300px">
|
<el-col>
|
<div
|
style="text-align: center; margin-bottom: 10px; margin-top: 10px"
|
>
|
项目列表
|
</div>
|
<el-input
|
placeholder="输入关键字进行过滤"
|
@input="handleFilterInput"
|
v-model="queryParams1.nr"
|
clearable
|
/>
|
<div class="tab3" style="height: 365px">
|
<el-tree
|
class="filter-tree"
|
v-loading="loading"
|
:data="Treedata"
|
:props="defaultProps"
|
show-checkbox
|
node-key="proId"
|
@check-change="handleCurrentChecked"
|
:default-checked-keys="checkedkey"
|
:filter-node-method="filterNode"
|
ref="tree"
|
:render-content="renderContent"
|
>
|
</el-tree>
|
<pagination
|
small
|
v-show="total1 > 0"
|
:total="total1"
|
:page.sync="queryParams1.page"
|
:limit.sync="queryParams1.pageSize"
|
@pagination="getDataList"
|
/>
|
</div>
|
</el-col>
|
<el-col>
|
<div class="grid-content bg-purple">
|
<div
|
style="
|
text-align: center;
|
margin-bottom: 10px;
|
margin-top: 10px;
|
margin-left: 8%;
|
"
|
>
|
已选项目列表
|
</div>
|
<el-table
|
:data="DataList"
|
border
|
style="width: 90%; margin-left: 20px"
|
height="400"
|
>
|
<el-table-column prop="proName" label="检查项目">
|
</el-table-column>
|
<el-table-column
|
prop="priceOrd"
|
label="原价"
|
align="center"
|
width="80px"
|
>
|
</el-table-column>
|
<el-table-column label="折扣" width="100px">
|
<template slot-scope="scope">
|
<el-input
|
v-model.number="scope.row.limits"
|
@input="calculateDiscount(scope.row)"
|
placeholder="输入折扣"
|
size="small"
|
type="number"
|
min="0"
|
step="0.1"
|
max="10"
|
/>
|
</template>
|
</el-table-column>
|
<el-table-column
|
prop="priceNow"
|
label="现价"
|
width="80px"
|
align="center"
|
>
|
</el-table-column>
|
<el-table-column label="操作" align="center" width="80px">
|
<template slot-scope="scope">
|
<el-button
|
size="mini"
|
type="text"
|
icon="el-icon-delete"
|
@click="handleDelete1(scope.row)"
|
title="删除"
|
>
|
</el-button>
|
</template>
|
</el-table-column>
|
</el-table>
|
</div>
|
</el-col>
|
</el-row>
|
|
<div slot="footer" class="dialog-footer">
|
<el-button type="primary" @click="submitForm">确 定</el-button>
|
<el-button @click="cancel">取 消</el-button>
|
</div>
|
</el-dialog>
|
|
<Packages ref="aaa" @add="handleChanges" />
|
</div>
|
</template>
|
|
<script>
|
import { Big } from 'big.js'
|
import Packages from "@/components/Packages"
|
import { listCategory } from "@/api/mall/category"
|
import { listKeyword } from "@/api/mall/keyword"
|
import { search } from "@/api/system/package"
|
import {
|
getPacList,
|
getPacInFo,
|
delPackage,
|
updateStatus,
|
getPacTjProjectList,
|
saveOreditTjPacNew,
|
} from "@/api/system/package"
|
import { Message } from "element-ui"
|
|
export default {
|
name: "Package",
|
dicts: ["sys_normal_disable", "sys_yes_no", "dict_tjtype"],
|
components: { Packages },
|
data() {
|
return {
|
pics: 0, // 原价总和
|
DataList: [], // 已选项目列表
|
Treedata: [], // 项目树数据
|
checkedkey: [], // 树默认选中项
|
checkedNodes: [], // 记录选中的节点
|
isCollapsed: true, // 折叠状态
|
categoryList: [], // 套餐类目
|
keywordList: [], // 关键字列表
|
keys: "", // 关键字字符串
|
loading: false, // 加载状态
|
single: true, // 是否单选禁用
|
multiple: true, // 是否多选禁用
|
showSearch: true, // 显示搜索条件
|
packageList: [], // 套餐列表
|
allList: [], // 所有体检项目
|
title: "", // 弹出层标题
|
open: false, // 是否显示弹出层
|
total: 0, // 主表格总条数
|
total1: 0, // 项目树总条数
|
queryParams: {
|
pageNum: 1,
|
pageSize: 10,
|
pacName: null,
|
pacRemark: null,
|
tjCategory: null,
|
},
|
queryParams1: {
|
page: 1,
|
pageSize: 30,
|
nr: "",
|
},
|
form: {
|
xianprice: 0, // 现价总和,可手动修改
|
limits: 10, // 总折扣
|
pacName: "",
|
pacStatus: "",
|
tjCategory: "",
|
isOnSale: "",
|
sort: null,
|
retailPrice: null,
|
keywords: [],
|
},
|
youhui: 10, // 上方折扣
|
defaultProps: {
|
children: [],
|
label: "proName",
|
},
|
rules: {
|
pacName: [{ required: true, message: "套餐名称不能为空", trigger: "blur" }],
|
pacStatus: [
|
{ required: true, message: "请选择套餐状态", trigger: "change" },
|
],
|
isOnSale: [
|
{ required: true, message: "请选择是否上架", trigger: "change" },
|
],
|
sort: [{ required: true, message: "排序不能为空", trigger: "blur" }],
|
retailPrice: [
|
{ required: true, message: "小程序价格不能为空", trigger: "blur" },
|
],
|
tjCategory: [
|
{ required: true, message: "请选择体检类别", trigger: "change" },
|
],
|
},
|
}
|
},
|
created() {
|
this.getList()
|
this.getKeyword()
|
this.getCategory()
|
},
|
methods: {
|
toggleCollapse() {
|
this.isCollapsed = !this.isCollapsed
|
},
|
filterNode(value, data) {
|
if (!value) return true
|
return (
|
data.proName.indexOf(value) !== -1 ||
|
(data.proEngName && data.proEngName.indexOf(value) !== -1)
|
)
|
},
|
getList() {
|
this.loading = true
|
getPacTjProjectList().then((response) => {
|
this.allList = response.data
|
this.loading = false
|
})
|
getPacList(this.queryParams).then((response) => {
|
response.rows.forEach((item, index) => {
|
item.newID =
|
(this.queryParams.pageNum - 1) * this.queryParams.pageSize +
|
index +
|
1
|
})
|
this.total = response.total
|
this.packageList = response.rows
|
this.loading = false
|
})
|
},
|
getKeyword() {
|
listKeyword(this.queryParams).then((response) => {
|
this.keywordList = response.rows
|
})
|
},
|
sel(val) {
|
this.keys = val.join(",")
|
},
|
getCategory() {
|
listCategory(this.queryParams).then((response) => {
|
this.categoryList = response.rows
|
})
|
},
|
cancel() {
|
this.open = false
|
this.reset()
|
},
|
reset() {
|
this.form = {
|
pacId: null,
|
pacName: "",
|
pacRemark: "",
|
pacStatus: "",
|
tjCategory: "",
|
isOnSale: "",
|
sort: null,
|
retailPrice: null,
|
xianprice: 0,
|
limits: 10,
|
keywords: [],
|
}
|
this.DataList = []
|
this.checkedkey = []
|
this.checkedNodes = []
|
this.youhui = 10
|
this.pics = 0
|
this.resetForm("form")
|
},
|
handleQuery() {
|
this.queryParams.pageNum = 1
|
this.getList()
|
},
|
handlePackage() {
|
this.$refs.aaa.open = true
|
this.$refs.aaa.getList()
|
this.$refs.aaa.title = "套餐字典"
|
},
|
handleChanges(param1) {
|
this.form.pacName = param1[0].pacName
|
this.form.hisPacId = param1[0].pacId
|
if (param1[0].price) {
|
this.form.counterPrice = param1[0].price
|
this.form.retailPrice = param1[0].price
|
}
|
},
|
resetQuery() {
|
this.resetForm("queryForm")
|
this.handleQuery()
|
},
|
handleSelectionChange(selection) {
|
if (!selection.length) {
|
this.forms = null
|
this.ids = []
|
this.single = true
|
this.multiple = true
|
return
|
}
|
this.forms = selection[0]
|
this.ids = selection.map((item) => item.pacId)
|
this.single = selection.length !== 1
|
this.multiple = false
|
},
|
handleAdd() {
|
this.reset()
|
this.open = true
|
this.title = "体检套餐信息维护"
|
this.getDataList()
|
},
|
handleStatusChange(row) {
|
let data = { pacId: row.pacId, pacStatus: row.pacStatus }
|
let text = row.pacStatus === "0" ? "启用" : "停用"
|
this.$confirm(`确认要${text}${row.pacName}套餐吗?`)
|
.then(() => updateStatus(data))
|
.then(() => this.msgSuccess(`${text}成功`))
|
.catch(() => {
|
row.pacStatus = row.pacStatus === "0" ? "1" : "0"
|
})
|
},
|
handleUp() {
|
this.title = "体检套餐信息维护"
|
this.open = true
|
getPacInFo(this.forms.pacId).then((response) => {
|
this.form = response.data
|
this.form.keywords = this.form.keywords
|
? this.form.keywords.slice(0, -1).split(",")
|
: []
|
this.DataList = response.data.packageProjects || []
|
this.checkedkey = this.DataList.map((item) => item.proId)
|
this.checkedNodes = [...this.checkedkey]
|
this.updateTotalPrice()
|
this.updateYouhui()
|
this.getDataList()
|
})
|
},
|
handleUpdate(row) {
|
this.title = "体检套餐信息维护"
|
this.open = true
|
getPacInFo(row.pacId).then((response) => {
|
this.form = response.data
|
this.form.keywords = this.form.keywords
|
? this.form.keywords.slice(0, -1).split(",")
|
: []
|
this.DataList = response.data.packageProjects || []
|
this.checkedkey = this.DataList.map((item) => item.proId)
|
this.checkedNodes = [...this.checkedkey]
|
this.updateTotalPrice()
|
this.updateYouhui()
|
this.getDataList()
|
})
|
},
|
handleDelete1(row) {
|
this.DataList = this.DataList.filter((item) => item.proId !== row.proId)
|
const index = this.checkedNodes.indexOf(row.proId)
|
if (index > -1) this.checkedNodes.splice(index, 1)
|
const tree = this.$refs.tree
|
const node = tree.getNode(row.proId)
|
if (node) node.setChecked(false)
|
this.updateTotalPrice()
|
this.updateYouhui()
|
},
|
numberChange(currentValue) {
|
this.youhui = currentValue
|
this.DataList.forEach((item) => {
|
item.limits = this.youhui
|
this.updateProPrice(item)
|
})
|
this.updateTotalPrice()
|
},
|
handleXianPriceInput(value) {
|
const numValue = Math.max(0, Number(value) || 0)
|
this.form.xianprice = numValue
|
},
|
handleXianPriceChange(newValue) {
|
const value = Math.max(0, Number(newValue) || 0)
|
|
if (this.DataList.length === 0 || this.pics === 0) {
|
this.form.xianprice = 0
|
this.youhui = 10
|
return
|
}
|
|
// 使用Big.js处理精度
|
const totalOriginalPrice = new Big(this.pics)
|
const totalCurrentPrice = new Big(value)
|
let newYouhui = totalCurrentPrice
|
.div(totalOriginalPrice)
|
.times(10)
|
.toNumber()
|
|
// 限制折扣范围
|
newYouhui = Math.min(10, Math.max(0, newYouhui))
|
this.youhui = Number(newYouhui.toFixed(1))
|
|
// 更新所有项目的折扣和现价
|
this.DataList.forEach((item) => {
|
item.limits = this.youhui
|
this.updateProPrice(item)
|
})
|
|
// 重新计算确保精度
|
this.updateTotalPrice(true)
|
},
|
updateProPrice(row) {
|
if (!row.priceOrd) return
|
const proPrice = new Big(row.priceOrd)
|
const limits = new Big(row.limits || 10)
|
row.priceNow = parseFloat(proPrice.times(limits.div(10)).toFixed(2))
|
},
|
calculateDiscount(row) {
|
row.limits = Math.min(10, Math.max(0, row.limits))
|
this.updateProPrice(row)
|
this.updateTotalPrice()
|
this.updateYouhui()
|
},
|
updateTotalPrice(skipXianPrice = false) {
|
// 计算原价总和
|
this.pics = this.DataList.reduce(
|
(sum, item) => sum + (Number(item.priceOrd) || 0),
|
0
|
)
|
|
// 计算现价总和
|
if (!skipXianPrice) {
|
const totalCurrent = this.DataList.reduce(
|
(sum, item) => sum + (Number(item.priceNow) || 0),
|
0
|
)
|
this.form.xianprice = parseFloat(totalCurrent).toFixed(2)
|
}
|
},
|
updateYouhui() {
|
if (this.DataList.length === 0 || this.pics === 0) {
|
this.youhui = 10
|
return
|
}
|
const totalOriginal = new Big(this.pics)
|
const totalCurrent = new Big(this.form.xianprice || 0)
|
this.youhui = parseFloat(
|
totalCurrent
|
.div(totalOriginal)
|
.times(10)
|
.toFixed(1)
|
)
|
},
|
renderContent(h, { node, data }) {
|
return (
|
<span class="custom-tree-node">
|
<span>{node.label}</span>
|
<span>({data.proPrice}元)</span>
|
</span>
|
)
|
},
|
getDataList() {
|
this.loading = true
|
search(this.queryParams1).then((response) => {
|
this.Treedata = response.data.list
|
this.total1 = response.data.total
|
this.$nextTick(() => {
|
this.$refs.tree.setCheckedKeys(this.checkedNodes)
|
})
|
this.loading = false
|
})
|
},
|
handleFilterInput() {
|
this.queryParams1.page = 1
|
this.getDataList()
|
},
|
handleCurrentChecked(data, checked) {
|
if (checked) {
|
if (!this.DataList.some((item) => item.proId === data.proId)) {
|
const newItem = {
|
proId: data.proId,
|
proName: data.proName,
|
priceOrd: data.proPrice,
|
limits: this.youhui,
|
priceNow: 0,
|
}
|
this.updateProPrice(newItem)
|
this.DataList.push(newItem)
|
this.checkedNodes.push(data.proId)
|
}
|
} else {
|
this.DataList = this.DataList.filter((item) => item.proId !== data.proId)
|
const index = this.checkedNodes.indexOf(data.proId)
|
if (index > -1) this.checkedNodes.splice(index, 1)
|
}
|
this.updateTotalPrice()
|
this.updateYouhui()
|
},
|
submitForm() {
|
this.$refs.form.validate((valid) => {
|
if (valid) {
|
this.form.limits = this.youhui
|
this.form.price = this.pics
|
this.form.newPrice = this.form.xianprice
|
|
const packageProjects = this.DataList.map((item) => ({
|
proName: item.proName,
|
proId: item.proId,
|
priceNow: item.priceNow,
|
limits: item.limits,
|
priceOrd: item.priceOrd,
|
}))
|
|
const data = {
|
pacName: this.form.pacName,
|
limits: this.form.limits,
|
pacStatus: this.form.pacStatus,
|
packageProjects,
|
newPrice: this.form.xianprice,
|
price: this.pics,
|
pacId: this.form.pacId || null,
|
isOnSale: this.form.isOnSale,
|
sort: this.form.sort,
|
retailPrice: this.form.retailPrice,
|
tjCategory: this.form.tjCategory,
|
pacRemark: this.form.pacRemark,
|
detail: this.form.detail,
|
keywords: this.keys,
|
}
|
|
saveOreditTjPacNew(data).then(() => {
|
this.open = false
|
this.getList()
|
this.$modal.msgSuccess("保存成功")
|
})
|
}
|
})
|
},
|
handleDelete(row) {
|
const pacIds = row.pacId || this.ids
|
this.$modal
|
.confirm(`是否确认删除体检套餐编号为"${pacIds}"的数据项?`)
|
.then(() => delPackage(pacIds))
|
.then(() => {
|
this.getList()
|
this.$modal.msgSuccess("删除成功")
|
})
|
.catch(() => {})
|
},
|
handleExport() {
|
this.download(
|
"system/package/export",
|
{ ...this.queryParams },
|
`package_${new Date().getTime()}.xlsx`
|
)
|
},
|
},
|
}
|
</script>
|
|
<style>
|
.el-tooltip__popper {
|
max-width: 800px;
|
}
|
|
.showInline {
|
overflow: hidden;
|
text-overflow: ellipsis;
|
display: -webkit-box;
|
-webkit-line-clamp: 2;
|
line-clamp: 2;
|
-webkit-box-orient: vertical;
|
}
|
|
.pag {
|
width: 100%;
|
display: flex;
|
justify-content: center;
|
}
|
|
.pag1 {
|
width: 30%;
|
}
|
|
.dialog-footer {
|
position: absolute;
|
left: 40%;
|
bottom: 2%;
|
}
|
.tab3 {
|
max-height: 400px;
|
overflow-y: auto;
|
border: 1px solid #d9d9d9;
|
}
|
</style>
|