<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: "",
|
},
|
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: "blur" }],
|
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;
|
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 });
|
},
|
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.$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>
|