<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"
|
type="number"
|
/>
|
</el-form-item>
|
<el-form-item label="折扣">
|
<el-input-number
|
style="width: 150px"
|
v-model="youhui"
|
:precision="2"
|
:step="0.1"
|
:max="10"
|
:min="0.1"
|
@change="debounceNumberChange"
|
:debounce="3000"
|
></el-input-number>
|
</el-form-item>
|
<el-form-item label="现价" prop="xianprice">
|
<el-input
|
v-model="form.xianprice"
|
placeholder="现价"
|
clearable
|
style="width: 140px"
|
@input="changeXianjia"
|
type="number"
|
:debounce="3000"
|
min="0"
|
/>
|
</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"
|
:span-method="objectSpanMethod"
|
>
|
<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"
|
>
|
</el-input>
|
</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>
|
<h4 style="font-weight: 600; padding-left: 20px">
|
一共选中{{ DataList.length }}项,合计:{{ form.xianprice }}元
|
</h4>
|
</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 Packages from "@/components/Packages";
|
import { listCategory } from "@/api/mall/category";
|
import { listKeyword } from "@/api/mall/keyword";
|
import {
|
getProParentIdDxList,
|
search,
|
getProSonDxList,
|
} from "@/api/system/package";
|
import {
|
getPacList,
|
getPacInFo,
|
listPackage,
|
getPackage,
|
delPackage,
|
addPackage,
|
updatePackage,
|
getAllPackage,
|
updateStatus,
|
getAllList,
|
updateProject,
|
getPacTjProjectList,
|
saveOreditTjPacNew,
|
} from "@/api/system/package";
|
import { Message } from "element-ui";
|
import Big from "big.js";
|
|
export default {
|
name: "Package",
|
dicts: ["sys_normal_disable", "sys_yes_no", "dict_tjtype"],
|
components: { Packages },
|
data() {
|
return {
|
pics: 0,
|
filterText: "",
|
DataList: [],
|
list1: true,
|
activeName: "1",
|
num: 1,
|
checkedObj: {},
|
dataObj: {},
|
Treedata: [],
|
TreedataList: [],
|
treedataList: [],
|
checkedkey: [],
|
checkedListkey: [],
|
defaultProps: {
|
children: [],
|
label: "proName",
|
},
|
isCollapsed: true,
|
categoryList: [],
|
keys: "",
|
keywordList: [],
|
dataListAll: [],
|
priceNow: "",
|
checkAll: false,
|
isIndeterminate: true,
|
loading: false,
|
radio: 3,
|
ids: [],
|
single: true,
|
multiple: true,
|
showSearch: true,
|
packageList: [],
|
allpackageList: [],
|
newproName: [],
|
allList: [],
|
treeList: [],
|
title: "",
|
lastXianPrice: 0,
|
open: false,
|
Seachopen: false,
|
checkedNodes: [],
|
pacId: "",
|
total: 0,
|
total1: 0,
|
queryParams: {
|
pageNum: 1,
|
pageSize: 10,
|
pacName: null,
|
pacRemark: null,
|
},
|
queryParams1: {
|
page: 1,
|
pageSize: 30,
|
nr: "",
|
xb: "",
|
},
|
form: {
|
xianprice: null,
|
counterPrice: null,
|
limits: 10,
|
keywords: [],
|
},
|
forms: {},
|
youhui: 10,
|
initializing: true,
|
debounceTimer: null,
|
rules: {
|
pacName: [
|
{ required: true, message: "请输入套餐名称", trigger: "blur" },
|
],
|
// pics: [{ required: true, message: "请输入原价", trigger: "change" }],
|
xianprice: [{ required: true, message: "请输入现价", trigger: "blur" }],
|
},
|
};
|
},
|
created() {
|
this.getList();
|
this.getKeyword();
|
this.getCategory();
|
},
|
methods: {
|
debounceNumberChange(currentValue, oldValue) {
|
clearTimeout(this.debounceTimer);
|
this.debounceTimer = setTimeout(() => {
|
this.numberChange(currentValue, oldValue);
|
}, 300);
|
},
|
numberChange(currentValue, oldValue) {
|
// 实现折扣变化的逻辑(如果需要)
|
},
|
updateProPrice(row) {
|
const proPrice = new Big(row.priceOrd || 0);
|
const limits = new Big(row.limits || 10);
|
const result = proPrice.times(limits.div(10));
|
row.priceNow = result.toNumber();
|
this.form.xianprice = this.DataList.reduce((sum, item) => {
|
return sum.plus(new Big(item.priceNow || 0));
|
}, new Big(0)).toNumber();
|
this.youhui = this.pics
|
? (Math.floor((this.form.xianprice / this.pics) * 100) / 100) * 10
|
: 10;
|
},
|
calculateDiscount(row) {
|
if (row.limits > 10) {
|
row.limits = 10;
|
} else if (row.limits < 0) {
|
row.limits = 0;
|
}
|
this.updateProPrice(row);
|
},
|
toggleCollapse() {
|
this.isCollapsed = !this.isCollapsed;
|
},
|
filterNode(value, data) {
|
if (!value) return true;
|
console.log(value, 6666);
|
|
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 || 0;
|
this.packageList = response.rows || [];
|
this.loading = false;
|
})
|
.catch(() => {
|
this.loading = false;
|
this.$message.error("获取套餐列表失败");
|
});
|
},
|
getKeyword() {
|
this.loading = true;
|
listKeyword(this.queryParams)
|
.then((response) => {
|
this.keywordList = response.rows || [];
|
this.loading = false;
|
})
|
.catch(() => {
|
this.loading = false;
|
this.$message.error("获取关键字列表失败");
|
});
|
},
|
sel(val) {
|
const maleId = "4"; // “男”的 ID
|
const femaleId = "5"; // “女”的 ID
|
let selectedIds = [...val]; // 复制当前选中的 ID 数组
|
|
// 实现“男”和“女”互斥逻辑
|
if (selectedIds.includes(maleId) && selectedIds.includes(femaleId)) {
|
selectedIds = selectedIds.slice(-1); // 保留最后选中的一个
|
this.$message.warning("“男”和“女”关键字互斥,只能选择一个!");
|
}
|
|
// 更新 form.keywords 和 keys
|
this.form.keywords = selectedIds;
|
this.keys = selectedIds.join(",");
|
|
// 调用 getDataList,传递所有选中的关键字 ID(逗号分隔)
|
// this.getDataList({ xb: this.keys });
|
this.queryParams1.xb = this.keys; // 👈 更新查询参数
|
this.queryParams1.page = 1; // 👈 切换条件时重置页码
|
this.getDataList(); // 不需要再传参了
|
},
|
getCategory() {
|
this.loading = true;
|
listCategory(this.queryParams)
|
.then((response) => {
|
this.categoryList = response.rows || [];
|
this.loading = false;
|
})
|
.catch(() => {
|
this.loading = false;
|
this.$message.error("获取套餐类目失败");
|
});
|
},
|
getDataList(params = {}) {
|
this.loading = true;
|
const query = { ...this.queryParams1, ...params };
|
search(query)
|
.then((response) => {
|
this.Treedata = response.data.list || [];
|
this.total1 = response.data.total || 0;
|
this.pics = this.DataList.reduce(
|
(total, item) => total + (item.priceOrd || 0),
|
0
|
);
|
this.$nextTick(() => {
|
this.$refs.tree.setCheckedKeys(this.checkedNodes);
|
this.initializing = false;
|
});
|
this.loading = false;
|
})
|
.catch(() => {
|
this.loading = false;
|
this.$message.error("获取项目列表失败");
|
});
|
},
|
shangpin(vals) {},
|
cancel() {
|
this.open = false;
|
this.Seachopen = false;
|
this.reset();
|
},
|
reset() {
|
this.form = {
|
pacId: null,
|
pacName: null,
|
pacRemark: null,
|
createBy: null,
|
createTime: null,
|
updateBy: null,
|
updateTime: null,
|
deleted: null,
|
allSonName: null,
|
allProName: null,
|
priceNow: null,
|
proId: null,
|
xianprice: null,
|
counterPrice: null,
|
limits: 10,
|
keywords: [],
|
};
|
this.initializing = true;
|
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[0]) return;
|
this.forms = selection[0];
|
this.ids = selection.map((item) => item.pacId);
|
this.single = selection.length !== 1;
|
this.multiple = !selection.length;
|
},
|
handleAdd() {
|
this.reset();
|
this.open = true;
|
this.title = "体检套餐信息维护";
|
this.DataList = [];
|
this.checkedkey = [];
|
this.queryParams1.nr = "";
|
this.queryParams1.page = 1;
|
this.checkedListkey = [];
|
this.checkedNodes = [];
|
this.getDataList();
|
this.youhui = 10;
|
},
|
handleStatusChange(row) {
|
let data = {
|
pacId: row.pacId,
|
pacStatus: row.pacStatus,
|
};
|
let text = row.pacStatus === "0" ? "启用" : "停用";
|
this.$modal
|
.confirm("确认要" + text + row.pacName + "套餐吗?")
|
.then(() => updateStatus(data))
|
.then(() => {
|
this.$modal.msgSuccess(text + "成功");
|
})
|
.catch(() => {
|
row.pacStatus = row.pacStatus === "0" ? "0" : "1";
|
});
|
},
|
handleUp() {
|
this.reset();
|
this.title = "体检套餐信息维护";
|
this.open = true;
|
getPacInFo(this.forms.pacId).then((response) => {
|
Object.keys(response.data).forEach((key) => {
|
this.$set(this.form, key, response.data[key]);
|
});
|
this.youhui = response.data.limits || 10;
|
this.pics = response.data.price || 0;
|
this.form.xianprice = response.data.newPrice || 0;
|
this.lastXianPrice = this.form.xianprice;
|
this.form.keywords =
|
response.data.keywords && response.data.keywords.length > 0
|
? response.data.keywords.slice(0, -1).split(",")
|
: [];
|
this.DataList = response.data.packageProjects || [];
|
this.checkedkey = this.DataList.map((item) => item.proId || "");
|
this.checkedListkey = [...this.checkedkey];
|
this.checkedNodes = [...this.checkedkey];
|
this.getDataList();
|
});
|
},
|
handleUpdate(row) {
|
this.reset();
|
this.title = "体检套餐信息维护";
|
this.open = true;
|
this.loading = true;
|
getPacInFo(row.pacId)
|
.then((response) => {
|
const data = response.data || {};
|
Object.keys(data).forEach((key) => {
|
this.$set(this.form, key, data[key]);
|
});
|
this.youhui = data.limits || 10;
|
this.pics = data.price || 0;
|
this.form.xianprice = data.newPrice || 0;
|
this.lastXianPrice = this.form.xianprice;
|
this.form.keywords =
|
data.keywords && data.keywords.length > 0
|
? data.keywords.slice(0, -1).split(",")
|
: [];
|
this.DataList = data.packageProjects || [];
|
this.checkedkey = this.DataList.map((item) => item.proId || "");
|
this.checkedListkey = [...this.checkedkey];
|
this.checkedNodes = [...this.checkedkey];
|
return this.getDataList();
|
})
|
.then(() => {
|
this.loading = false;
|
this.$nextTick(() => {
|
this.$refs.form.validate();
|
});
|
})
|
.catch((error) => {
|
this.loading = false;
|
this.$message.error("加载数据失败");
|
});
|
},
|
addmembers() {
|
if (this.form.pacName) {
|
if (!this.form.tjProjectList) {
|
this.form.tjProjectList = [];
|
}
|
this.form.tjProjectList.push({
|
id: this.form.tjProjectList.length + 1,
|
proName: "",
|
allSonProName: "",
|
proPrice: "",
|
priceNow: "",
|
proId: "",
|
});
|
} else {
|
this.$modal.msgWarning("请先填写套餐名称");
|
}
|
this.$forceUpdate();
|
},
|
Delete(index) {
|
if (this.form.tjProjectList.length === 0) {
|
this.$modal.alert("请先选择要删除的数据", "提示", {
|
confirmButtonText: "确定",
|
});
|
} else {
|
this.form.tjProjectList.splice(index, 1);
|
}
|
},
|
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();
|
},
|
getSelectValue(val) {
|
this.form.tjProjectList.forEach((formitem) => {
|
if (formitem.proName === val) {
|
formitem.allSonProName = "";
|
this.allList.find((item) => {
|
if (item.proName === val) {
|
formitem.proId = item.proId;
|
formitem.proPrice = item.proPrice;
|
formitem.priceNow = item.proPrice;
|
formitem.allSonProName = item.allSonProName;
|
}
|
});
|
}
|
});
|
for (let i = 0; i < this.form.tjProjectList.length; i++) {
|
for (let j = i + 1; j < this.form.tjProjectList.length; j++) {
|
if (
|
this.form.tjProjectList[i].proId ===
|
this.form.tjProjectList[j].proId
|
) {
|
this.form.tjProjectList.splice(j, 1);
|
j--;
|
this.$modal.msgError("此项目已录入,不可重复录入");
|
}
|
}
|
}
|
return this.form.tjProjectList;
|
},
|
objectSpanMethod({ row, column, rowIndex, columnIndex }) {
|
let fields = ["propinName"];
|
let cellValue = row[column.property];
|
if (cellValue && fields.includes(column.property)) {
|
let prevRow = this.DataList[rowIndex - 1];
|
let nextRow = this.DataList[rowIndex + 1];
|
if (prevRow && prevRow[column.property] === cellValue) {
|
return { rowspan: 0, colspan: 0 };
|
} else {
|
let countRowspan = 1;
|
while (nextRow && nextRow[column.property] === cellValue) {
|
nextRow = this.DataList[++countRowspan + rowIndex];
|
}
|
if (countRowspan > 1) {
|
return { rowspan: countRowspan, colspan: 1 };
|
}
|
}
|
}
|
},
|
renderContent(h, { node, data, store }) {
|
return (
|
<span class="custom-tree-node">
|
<span>{node.label}</span>
|
<span>({data.proPrice}元)</span>
|
</span>
|
);
|
},
|
handleFilterInput() {
|
this.queryParams1.page = 1;
|
this.getDataList();
|
// this.getDataList({ xb: this.keys });
|
|
this.$nextTick(() => {
|
this.$refs.tree.setCheckedKeys(this.checkedNodes);
|
});
|
},
|
handleCurrentChecked(data, checked, indeterminate) {
|
if (this.initializing) {
|
return;
|
}
|
if (checked) {
|
if (!this.DataList.some((item) => item.proId === data.proId)) {
|
this.DataList.push({
|
proId: data.proId,
|
proName: data.proName,
|
priceOrd: data.proPrice,
|
limits: 10,
|
priceNow: data.proPrice,
|
});
|
}
|
if (!this.checkedNodes.includes(data.proId)) {
|
this.checkedNodes.push(data.proId);
|
}
|
this.updateTotalPrice();
|
} 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();
|
}
|
},
|
updateTotalPrice() {
|
this.form.xianprice = this.DataList.reduce((sum, item) => {
|
return sum.plus(new Big(item.priceNow || 0));
|
}, new Big(0)).toNumber();
|
this.pics = this.DataList.reduce(
|
(total, item) => total + (item.priceOrd || 0),
|
0
|
);
|
},
|
changeXianjia() {
|
if (this.form.xianprice !== 0 && this.pics) {
|
this.youhui =
|
(Math.floor((this.form.xianprice / this.pics) * 100) / 100) * 10;
|
}
|
},
|
spliceData() {
|
for (let i = 0; i < this.DataList.length; i++) {
|
for (let j = i + 1; j < this.DataList.length; j++) {
|
if (this.DataList[i].proId === this.DataList[j].proId) {
|
this.DataList.splice(j, 1);
|
j--;
|
}
|
}
|
}
|
return this.DataList;
|
},
|
handleCurrentChecked1(data, checked, checkedNodes) {
|
if (!checked) {
|
this.DataList = this.DataList.filter(
|
(item) => item.proId !== data.proId
|
);
|
this.TotalPrice1 = this.DataList.reduce(
|
(sum, item) => sum + (item.priceOrd || 0),
|
0
|
);
|
this.pics = this.TotalPrice1;
|
} else {
|
this.DataList.push(data);
|
this.pics = this.DataList.reduce(
|
(sum, item) => sum + (item.priceOrd || 0),
|
0
|
);
|
this.spliceData();
|
this.TotalPrice1 = this.pics;
|
}
|
},
|
handleDeletes(row) {
|
this.DataList = this.DataList.filter(
|
(item) => item.proParentId !== row.proParentId
|
);
|
this.TotalPrice1 = this.DataList.reduce(
|
(sum, item) => sum + (item.priceOrd || 0),
|
0
|
);
|
},
|
submitForm() {
|
this.$refs.form.validate((valid) => {
|
if (valid) {
|
if (this.form.xianprice !== this.lastXianPrice) {
|
this.$modal
|
.confirm("确定修改所有子项的折扣吗?", "提示", {
|
confirmButtonText: "确定",
|
cancelButtonText: "取消",
|
type: "warning",
|
})
|
.then(() => {
|
this.youhui =
|
(Math.floor((this.form.xianprice / this.pics) * 100) / 100) *
|
10;
|
let totalYsprice = new Big(0);
|
this.DataList.forEach((item) => {
|
item.limits = this.youhui;
|
const ordPrice = new Big(item.priceOrd || 0);
|
const discount = new Big(item.limits);
|
const result = ordPrice.times(discount.div(10));
|
item.priceNow = result.toNumber();
|
totalYsprice = totalYsprice.plus(new Big(item.priceNow));
|
});
|
if (!totalYsprice.eq(this.form.xianprice)) {
|
const diff = new Big(this.form.xianprice).minus(totalYsprice);
|
if (this.DataList.length > 0) {
|
const lastItem = this.DataList[this.DataList.length - 1];
|
const newYsPrice = new Big(lastItem.priceNow)
|
.plus(diff)
|
.toNumber();
|
this.$set(
|
this.DataList[this.DataList.length - 1],
|
"priceNow",
|
newYsPrice
|
);
|
}
|
}
|
return this.saveData();
|
})
|
.catch(() => {
|
this.form.xianprice = this.lastXianPrice;
|
});
|
} else {
|
this.saveData();
|
}
|
}
|
});
|
},
|
saveData() {
|
this.form.limits = this.youhui;
|
this.form.price = this.pics;
|
this.form.priceNow = this.form.xianprice;
|
if (this.keys) {
|
this.form.keywords = this.keys;
|
}
|
let packageProjects = [];
|
this.DataList.forEach((item) => {
|
packageProjects.push({
|
proName: item.proName,
|
proId: item.proId,
|
priceNow: item.priceNow,
|
limits: item.limits,
|
priceOrd: item.priceOrd,
|
});
|
});
|
let data = {
|
pacName: this.form.pacName,
|
limits: this.form.limits,
|
pacStatus: this.form.pacStatus,
|
packageProjects: 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,
|
};
|
return saveOreditTjPacNew(data)
|
.then((res) => {
|
this.$modal.msgSuccess("保存成功");
|
this.open = false;
|
this.getList();
|
})
|
.catch(() => {
|
this.$message.error("保存失败");
|
});
|
},
|
handleDelete(row) {
|
const pacIds = row.pacId || this.ids;
|
this.$modal
|
.confirm('是否确认删除体检套餐编号为"' + pacIds + '"的数据项?')
|
.then(() => delPackage(pacIds))
|
.then(() => {
|
this.getList();
|
this.$modal.msgSuccess("删除成功");
|
})
|
.catch(() => {});
|
},
|
handleProject(row) {
|
const pacId = row.pacId;
|
this.$router.push("/system/user-auth/role/" + pacId);
|
},
|
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>
|