|  |  |  | 
|---|
|  |  |  | <template> | 
|---|
|  |  |  | <div class="page-view"> | 
|---|
|  |  |  | <el-form ref="form" :model="productTableList" :show-message="false" label-position="right"> | 
|---|
|  |  |  | <el-form ref="form" :model="tableList" :show-message="false" label-position="right"> | 
|---|
|  |  |  | <el-table | 
|---|
|  |  |  | :data="productTableList.tableData" | 
|---|
|  |  |  | :data="tableList.tableData" | 
|---|
|  |  |  | :show-summary="showSummary.show" | 
|---|
|  |  |  | :summary-method="getSummaries" | 
|---|
|  |  |  | :span-method="arraySpanMethod" | 
|---|
|  |  |  | style="width: 100%" | 
|---|
|  |  |  | > | 
|---|
|  |  |  | <el-table-column v-if="tableList.isReturn" type="index" label="#" width="50" align="center"></el-table-column> | 
|---|
|  |  |  | <el-table-column | 
|---|
|  |  |  | v-for="(item, i) in productTableList.tableColumn" | 
|---|
|  |  |  | v-for="(item, i) in tableList.tableColumn" | 
|---|
|  |  |  | :key="i" | 
|---|
|  |  |  | :prop="item.prop" | 
|---|
|  |  |  | :label="item.label" | 
|---|
|  |  |  | 
|---|
|  |  |  | ></el-input> | 
|---|
|  |  |  | </el-form-item> | 
|---|
|  |  |  | <el-form-item | 
|---|
|  |  |  | v-else-if="item.productName" | 
|---|
|  |  |  | label=" " | 
|---|
|  |  |  | :prop="'tableData.' + scope.$index + '.' + item.prop" | 
|---|
|  |  |  | > | 
|---|
|  |  |  | <div class="custom-name"> | 
|---|
|  |  |  | <el-autocomplete | 
|---|
|  |  |  | v-model="scope.row[item.prop]" | 
|---|
|  |  |  | :fetch-suggestions="querySearchAsync" | 
|---|
|  |  |  | value-key="name" | 
|---|
|  |  |  | size="mini" | 
|---|
|  |  |  | @select=" | 
|---|
|  |  |  | (val) => { | 
|---|
|  |  |  | handleSelectClient(val, item.prop, scope.row) | 
|---|
|  |  |  | } | 
|---|
|  |  |  | " | 
|---|
|  |  |  | ></el-autocomplete> | 
|---|
|  |  |  | <div class="common-select-btn" @click="selClientClick(scope.row, item.prop)"> | 
|---|
|  |  |  | <i class="el-icon-circle-plus-outline" title="选择"></i> | 
|---|
|  |  |  | </div> | 
|---|
|  |  |  | <div | 
|---|
|  |  |  | v-if="scope.row[item.prop] && scope.row[item.prop].length > 0" | 
|---|
|  |  |  | class="common-select-btn" | 
|---|
|  |  |  | @click="clearupClient(scope.row)" | 
|---|
|  |  |  | > | 
|---|
|  |  |  | <i class="el-icon-remove-outline" title="清除"></i> | 
|---|
|  |  |  | </div> | 
|---|
|  |  |  | </div> | 
|---|
|  |  |  | </el-form-item> | 
|---|
|  |  |  | <el-form-item | 
|---|
|  |  |  | v-else-if="item.date" | 
|---|
|  |  |  | label=" " | 
|---|
|  |  |  | :prop="'tableData.' + scope.$index + '.' + item.prop" | 
|---|
|  |  |  | 
|---|
|  |  |  | <el-date-picker v-model="scope.row[item.prop]" type="date" size="mini" style="width: 110px"> | 
|---|
|  |  |  | </el-date-picker> | 
|---|
|  |  |  | </el-form-item> | 
|---|
|  |  |  | <el-form-item | 
|---|
|  |  |  | v-else-if="item.inputNumber" | 
|---|
|  |  |  | label=" " | 
|---|
|  |  |  | :prop="'tableData.' + scope.$index + '.' + item.prop" | 
|---|
|  |  |  | :rules="[{ required: item.isRequird ? true : false, message: '输入不能为空' }]" | 
|---|
|  |  |  | > | 
|---|
|  |  |  | <el-input-number | 
|---|
|  |  |  | v-model="scope.row[item.prop]" | 
|---|
|  |  |  | placeholder="" | 
|---|
|  |  |  | :min="0" | 
|---|
|  |  |  | :controls="false" | 
|---|
|  |  |  | size="mini" | 
|---|
|  |  |  | style="width: 100%; margin-right: 5px" | 
|---|
|  |  |  | @change=" | 
|---|
|  |  |  | (val) => { | 
|---|
|  |  |  | commonInputChange(val, item.prop, scope.row) | 
|---|
|  |  |  | } | 
|---|
|  |  |  | " | 
|---|
|  |  |  | ></el-input-number> | 
|---|
|  |  |  | </el-form-item> | 
|---|
|  |  |  | <el-form-item | 
|---|
|  |  |  | v-else-if="item.inputFloat" | 
|---|
|  |  |  | label=" " | 
|---|
|  |  |  | :prop="'tableData.' + scope.$index + '.' + item.prop" | 
|---|
|  |  |  | :rules="[{ required: item.isRequird ? true : false, message: '输入不能为空' }]" | 
|---|
|  |  |  | > | 
|---|
|  |  |  | <el-input-number | 
|---|
|  |  |  | v-model="scope.row[item.prop]" | 
|---|
|  |  |  | placeholder="" | 
|---|
|  |  |  | :min="0" | 
|---|
|  |  |  | :precision="2" | 
|---|
|  |  |  | :controls="false" | 
|---|
|  |  |  | size="mini" | 
|---|
|  |  |  | style="width: 100%; margin-right: 5px" | 
|---|
|  |  |  | @change=" | 
|---|
|  |  |  | (val) => { | 
|---|
|  |  |  | commonInputChange(val, item.prop, scope.row) | 
|---|
|  |  |  | } | 
|---|
|  |  |  | " | 
|---|
|  |  |  | ></el-input-number> | 
|---|
|  |  |  | </el-form-item> | 
|---|
|  |  |  | <span v-else>{{ scope.row[item.prop] }}</span> | 
|---|
|  |  |  | </template> | 
|---|
|  |  |  | <span v-else>{{ scope.row[item.prop] }}</span> | 
|---|
|  |  |  | <span v-else style="text-align: right">{{ scope.row[item.prop] }}</span> | 
|---|
|  |  |  | </template> | 
|---|
|  |  |  | </el-table-column> | 
|---|
|  |  |  | </el-table> | 
|---|
|  |  |  | 
|---|
|  |  |  | <el-button size="small" type="primary" @click="add">新增</el-button> | 
|---|
|  |  |  | <!-- <el-button size="small" type="primary" disabled>导入明细</el-button> --> | 
|---|
|  |  |  | <el-button size="small" type="primary" @click="empty">清空</el-button> | 
|---|
|  |  |  | <el-button size="small" type="primary" @click="recalculate">重算</el-button> | 
|---|
|  |  |  | <el-button size="small" type="primary" @click="recalculate" :disabled="isRecalculate ? false : true" | 
|---|
|  |  |  | >重算</el-button | 
|---|
|  |  |  | > | 
|---|
|  |  |  | </div> | 
|---|
|  |  |  | <div v-if="showSummary.total || showSummary.refundable" style="height: 42px; line-height: 42px"> | 
|---|
|  |  |  | <div v-if="false && (showSummary.total || showSummary.refundable)" style="height: 42px; line-height: 42px" > | 
|---|
|  |  |  | <el-row :gutter="10"> | 
|---|
|  |  |  | <el-col v-if="showSummary.total" :span="2" :offset="22"> | 
|---|
|  |  |  | <el-col v-if="showSummary.total" :span="3" :offset="21"> | 
|---|
|  |  |  | <span style="font-weight: bold">合计</span> | 
|---|
|  |  |  | <span style="margin-left: 10px">{{ total }}</span> | 
|---|
|  |  |  | </el-col> | 
|---|
|  |  |  | <el-col v-if="showSummary.refundable" :span="2" :offset="22"> | 
|---|
|  |  |  | <el-col v-if="showSummary.refundable" :span="3" :offset="21"> | 
|---|
|  |  |  | <span style="font-weight: bold">应退款</span> | 
|---|
|  |  |  | <span style="margin-left: 10px">0.00</span> | 
|---|
|  |  |  | </el-col> | 
|---|
|  |  |  | </el-row> | 
|---|
|  |  |  | </div> | 
|---|
|  |  |  | <!-- 合同订单 --> | 
|---|
|  |  |  | <SelectCommonDialog | 
|---|
|  |  |  | v-if="editSelCommonConfig.editVisible" | 
|---|
|  |  |  | :edit-common-config="editSelCommonConfig" | 
|---|
|  |  |  | @selClient="selClient" | 
|---|
|  |  |  | /> | 
|---|
|  |  |  | </div> | 
|---|
|  |  |  | </template> | 
|---|
|  |  |  |  | 
|---|
|  |  |  | <script> | 
|---|
|  |  |  | import { getProductList } from "@/api/common/other" | 
|---|
|  |  |  | import SelectCommonDialog from "@/views/other/commonDialog/SelectCommonDialog" | 
|---|
|  |  |  | export default { | 
|---|
|  |  |  | name: "CommmonFormTableView", | 
|---|
|  |  |  | components: { SelectCommonDialog }, | 
|---|
|  |  |  | props: { | 
|---|
|  |  |  | detailEnter: { | 
|---|
|  |  |  | type: Boolean, | 
|---|
|  |  |  | 
|---|
|  |  |  | default: () => { | 
|---|
|  |  |  | return { | 
|---|
|  |  |  | tableData: [], // 接口返回数据 | 
|---|
|  |  |  | isReturn: false, | 
|---|
|  |  |  | tableColumn: [ | 
|---|
|  |  |  | // table表单 | 
|---|
|  |  |  | { label: "", prop: "", min: 200, tooltip: true } | 
|---|
|  |  |  | 
|---|
|  |  |  | }, | 
|---|
|  |  |  | data() { | 
|---|
|  |  |  | return { | 
|---|
|  |  |  | total: 0 | 
|---|
|  |  |  | total: 0, | 
|---|
|  |  |  | productList: [], | 
|---|
|  |  |  | tableList: [], | 
|---|
|  |  |  | editSelCommonConfig: { | 
|---|
|  |  |  | editVisible: false, | 
|---|
|  |  |  | title: "", | 
|---|
|  |  |  | infomation: {} | 
|---|
|  |  |  | }, | 
|---|
|  |  |  | productIndex: 0, | 
|---|
|  |  |  | isRecalculate: true | 
|---|
|  |  |  | } | 
|---|
|  |  |  | }, | 
|---|
|  |  |  | created() { | 
|---|
|  |  |  | this.getProductList() | 
|---|
|  |  |  | this.tableList = this.productTableList | 
|---|
|  |  |  | if (this.tableList.tableData.length === 1 && this.tableList.tableData[0].name === "") { | 
|---|
|  |  |  | this.isRecalculate = false | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | this.isRecalculate = true | 
|---|
|  |  |  | } | 
|---|
|  |  |  | }, | 
|---|
|  |  |  | computed: {}, | 
|---|
|  |  |  | methods: { | 
|---|
|  |  |  | // 产品名称 | 
|---|
|  |  |  | async getProductList() { | 
|---|
|  |  |  | await getProductList({ | 
|---|
|  |  |  | productName: "", | 
|---|
|  |  |  | productNumber: "", | 
|---|
|  |  |  | page: 1, | 
|---|
|  |  |  | pageSize: 5 | 
|---|
|  |  |  | }).then((res) => { | 
|---|
|  |  |  | console.log(res,"产品名称") | 
|---|
|  |  |  | if (res.code === 200) { | 
|---|
|  |  |  | if (res.data.data && res.data.data.length > 0) { | 
|---|
|  |  |  | this.productList = res.data.data | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | }) | 
|---|
|  |  |  | }, | 
|---|
|  |  |  | handleReserve(row) { | 
|---|
|  |  |  | return row._id ? row._id : row.id | 
|---|
|  |  |  | }, | 
|---|
|  |  |  | 
|---|
|  |  |  | }, | 
|---|
|  |  |  | // 合计 | 
|---|
|  |  |  | getSummaries(param) { | 
|---|
|  |  |  | if (this.showSummary.show) { | 
|---|
|  |  |  | const { columns, data } = param | 
|---|
|  |  |  | const sums = [] | 
|---|
|  |  |  | columns.forEach((column, index) => { | 
|---|
|  |  |  | if (index === this.showSummary.mergeNumber) { | 
|---|
|  |  |  | sums[index] = "小计" | 
|---|
|  |  |  | } | 
|---|
|  |  |  | const values = data.map((item) => Number(item[column.property])) | 
|---|
|  |  |  | // if (column.property === this.showSummary.sumProp) { | 
|---|
|  |  |  | if (this.showSummary.sumProp.includes(column.property)) { | 
|---|
|  |  |  | sums[index] = values.reduce((prev, curr) => { | 
|---|
|  |  |  | const value = Number(curr) | 
|---|
|  |  |  | if (!isNaN(value)) { | 
|---|
|  |  |  | return this.number_format(prev + curr, 2, ".", ",") | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | return this.number_format(prev, 2, ".", ",") | 
|---|
|  |  |  | } | 
|---|
|  |  |  | }, 0) | 
|---|
|  |  |  | if (column.property === "total") { | 
|---|
|  |  |  | this.total = sums[index] | 
|---|
|  |  |  | const { columns, data } = param | 
|---|
|  |  |  | const sums = [] | 
|---|
|  |  |  | columns.forEach((column, index) => { | 
|---|
|  |  |  | // // 更改行名称 | 
|---|
|  |  |  | if (index === this.showSummary.mergeNumber) { | 
|---|
|  |  |  | sums[index] = "小计:" | 
|---|
|  |  |  | return | 
|---|
|  |  |  | } | 
|---|
|  |  |  | const title = ["#", "产品名称"] | 
|---|
|  |  |  | // 去除某些不需要计算的数据 | 
|---|
|  |  |  | if (title.includes(column.label)) { | 
|---|
|  |  |  | sums[index] = "" | 
|---|
|  |  |  | return | 
|---|
|  |  |  | } | 
|---|
|  |  |  | // 把当前表格数据中同个分类的数据收集起来 | 
|---|
|  |  |  | const values = data.map((item) => Number(item[column.property])) | 
|---|
|  |  |  | // 过滤掉 | 
|---|
|  |  |  | if (!values.every((value) => Number.isNaN(value))) { | 
|---|
|  |  |  | sums[index] = ` ${values.reduce((prev, curr) => { | 
|---|
|  |  |  | const value = Number(curr) | 
|---|
|  |  |  | if (!Number.isNaN(value)) { | 
|---|
|  |  |  | const num = prev + curr | 
|---|
|  |  |  | return Number(num.toFixed(2)) | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | return Number(prev.toFixed(2)) | 
|---|
|  |  |  | } | 
|---|
|  |  |  | sums[index] | 
|---|
|  |  |  | } | 
|---|
|  |  |  | }) | 
|---|
|  |  |  | return sums | 
|---|
|  |  |  | } | 
|---|
|  |  |  | }, 0)}` | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | sums[index] = "" | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if (column.property === "total") { | 
|---|
|  |  |  | this.total = sums[index] | 
|---|
|  |  |  | } | 
|---|
|  |  |  | }) | 
|---|
|  |  |  | return sums | 
|---|
|  |  |  | }, | 
|---|
|  |  |  | // 数字换行为金额显示格式 | 
|---|
|  |  |  | number_format(number, decimals, dec_point, thousands_sep) { | 
|---|
|  |  |  | 
|---|
|  |  |  | commonInputChange(val, prop, row) { | 
|---|
|  |  |  | console.log(val, prop) | 
|---|
|  |  |  | console.log(row) | 
|---|
|  |  |  | if (prop === "amount") { | 
|---|
|  |  |  | this.tableList.tableData.map((ite) => { | 
|---|
|  |  |  | if (ite.name === row.name) { | 
|---|
|  |  |  | ite.total = row.amount * row.price | 
|---|
|  |  |  | } | 
|---|
|  |  |  | }) | 
|---|
|  |  |  | } | 
|---|
|  |  |  | this.$emit("inputContent", val, prop, row) | 
|---|
|  |  |  | }, | 
|---|
|  |  |  | // 清空 | 
|---|
|  |  |  | empty() { | 
|---|
|  |  |  | this.isRecalculate = false | 
|---|
|  |  |  | this.$emit("emptyProductClick") | 
|---|
|  |  |  | }, | 
|---|
|  |  |  | // 重算 | 
|---|
|  |  |  | 
|---|
|  |  |  | }) | 
|---|
|  |  |  | .then(() => { | 
|---|
|  |  |  | this.$emit("recalculateProductClick") | 
|---|
|  |  |  | this.tableList.tableData.map((ite) => { | 
|---|
|  |  |  | ite.total = ite.amount ? ite.amount * ite.price : 1 * ite.price | 
|---|
|  |  |  | }) | 
|---|
|  |  |  | }) | 
|---|
|  |  |  | .catch(() => {}) | 
|---|
|  |  |  | }, | 
|---|
|  |  |  | // 选择产品名称相关方法 | 
|---|
|  |  |  | querySearchAsync(queryString, cb) { | 
|---|
|  |  |  | var restaurants = this.productList | 
|---|
|  |  |  | var results = queryString ? restaurants.filter(this.createStateFilter(queryString)) : restaurants | 
|---|
|  |  |  | cb(results) | 
|---|
|  |  |  | }, | 
|---|
|  |  |  | createStateFilter(queryString) { | 
|---|
|  |  |  | return (state) => { | 
|---|
|  |  |  | return state.name.toLowerCase().indexOf(queryString.toLowerCase()) === 0 | 
|---|
|  |  |  | } | 
|---|
|  |  |  | }, | 
|---|
|  |  |  | handleSelectClient(item, prop, row) { | 
|---|
|  |  |  | // this.clientId = item.id | 
|---|
|  |  |  | this.isRecalculate = true | 
|---|
|  |  |  | console.log(item, prop, row) | 
|---|
|  |  |  | this.tableList.tableData.map((ite) => { | 
|---|
|  |  |  | if (ite.name === item.name) { | 
|---|
|  |  |  | ite.amount = item.amount || 1 | 
|---|
|  |  |  | ite.number = item.number | 
|---|
|  |  |  | ite.price = item.price | 
|---|
|  |  |  | ite.total = item.amount ? item.amount * item.price : 1 * item.price | 
|---|
|  |  |  | } | 
|---|
|  |  |  | }) | 
|---|
|  |  |  | }, | 
|---|
|  |  |  | selClientClick(row, prop) { | 
|---|
|  |  |  | console.log(row, prop) | 
|---|
|  |  |  | this.productIndex = row.productId - 1 | 
|---|
|  |  |  | this.editSelCommonConfig.title = "产品名称" | 
|---|
|  |  |  | this.editSelCommonConfig.editVisible = true | 
|---|
|  |  |  | }, | 
|---|
|  |  |  | selClient(item) { | 
|---|
|  |  |  | console.log(item) | 
|---|
|  |  |  | console.log(this.tableList.tableData) | 
|---|
|  |  |  | this.isRecalculate = true | 
|---|
|  |  |  | // this.editConfig.infomation.client_name = row.name | 
|---|
|  |  |  | this.tableList.tableData.map((ite, index) => { | 
|---|
|  |  |  | if (index === this.productIndex) { | 
|---|
|  |  |  | ite.name = item.name | 
|---|
|  |  |  | ite.amount = item.amount || 1 | 
|---|
|  |  |  | ite.number = item.number | 
|---|
|  |  |  | ite.price = item.price | 
|---|
|  |  |  | ite.total = item.amount ? item.amount * item.price : 1 * item.price | 
|---|
|  |  |  | } | 
|---|
|  |  |  | }) | 
|---|
|  |  |  | }, | 
|---|
|  |  |  | // 清除已选择用户 | 
|---|
|  |  |  | clearupClient(row) { | 
|---|
|  |  |  | this.productIndex = row.productId - 1 | 
|---|
|  |  |  | this.tableList.tableData.map((ite, index) => { | 
|---|
|  |  |  | if (index === this.productIndex) { | 
|---|
|  |  |  | ite.name = "" | 
|---|
|  |  |  | ite.amount = 1 | 
|---|
|  |  |  | ite.number = "" | 
|---|
|  |  |  | ite.price = 0 | 
|---|
|  |  |  | ite.total = 0 | 
|---|
|  |  |  | } | 
|---|
|  |  |  | }) | 
|---|
|  |  |  | this.$emit("clearupProduct", this.tableList.tableData) | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | 
|---|
|  |  |  | .page-view { | 
|---|
|  |  |  | .el-form-item { | 
|---|
|  |  |  | margin-bottom: 0; | 
|---|
|  |  |  | .custom-name { | 
|---|
|  |  |  | display: flex; | 
|---|
|  |  |  | .common-select-btn { | 
|---|
|  |  |  | margin-left: 5px; | 
|---|
|  |  |  | font-size: 18px; | 
|---|
|  |  |  | cursor: pointer; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | ::v-deep { | 
|---|
|  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  | .el-table__footer-wrapper tbody td.el-table__cell { | 
|---|
|  |  |  | background-color: #fff; | 
|---|
|  |  |  | text-align: right; | 
|---|
|  |  |  | // text-align: right; | 
|---|
|  |  |  | font-weight: bold; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | .el-input--suffix .el-input__inner { | 
|---|
|  |  |  | 
|---|
|  |  |  | .el-table th.el-table__cell > .cell { | 
|---|
|  |  |  | padding: 0 5px; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | .el-input__inner { | 
|---|
|  |  |  | // text-align: left; | 
|---|
|  |  |  | text-align: center !important; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | </style> | 
|---|