From 5d0120d2e8a6e5cd2e1e95d4c5ffeecf5fc1c4a6 Mon Sep 17 00:00:00 2001 From: songshankun <songshankun@foxmail.com> Date: 星期二, 10 十月 2023 15:35:58 +0800 Subject: [PATCH] Merge branch 'dev' into songshankun/adjust-style --- src/components/makepager/CommonFormTableView.vue | 477 +++++++++++++++++++++++++++++++++++++++++++++++++++-------- 1 files changed, 410 insertions(+), 67 deletions(-) diff --git a/src/components/makepager/CommonFormTableView.vue b/src/components/makepager/CommonFormTableView.vue index 125520c..80520cc 100644 --- a/src/components/makepager/CommonFormTableView.vue +++ b/src/components/makepager/CommonFormTableView.vue @@ -1,110 +1,424 @@ <template> <div class="page-view"> - <el-form ref="form" :model="productTableList" :show-message="false" label-position="right"> - <el-table :data="productTableList.tableData" style="width: 100%"> - <el-table-column prop="id" label="#" width="30"></el-table-column> - <el-table-column prop="productName" label="浜у搧鍚嶇О"> - <template slot-scope="scope"> - <el-form-item - label=" " - :prop="'tableData.' + scope.$index + '.productName'" - :rules="[{ required: true, message: '杈撳叆涓嶈兘涓虹┖' }]" - > - <el-input v-model.trim="scope.row.productName" maxlength="50" size="mini" style="width: 70px"></el-input> - </el-form-item> + <el-form ref="form" :model="tableList" :show-message="false" label-position="right"> + <el-table + :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 tableList.tableColumn" + :key="i" + :prop="item.prop" + :label="item.label" + :width="item.width" + :min-width="item.min" + align="center" + > + <!-- 琛ㄥご鏍峰紡 --> + <template slot="header"> + <span v-if="item.isRequird" style="color: #f56c6c">*</span> + <span>{{ item.label }}</span> </template> - </el-table-column> - <el-table-column prop="productNumber" label="浜у搧缂栧彿"></el-table-column> - <el-table-column prop="startDate" label="鏈嶅姟寮�濮嬫棩" width="140"> + <!-- column鏍峰紡 --> <template slot-scope="scope"> - <el-form-item - label=" " - :prop="'tableData.' + scope.$index + '.startDate'" - :rules="[{ required: true, message: '杈撳叆涓嶈兘涓虹┖' }]" - > - <el-date-picker - v-model="scope.row.startDate" - size="mini" - type="date" - placeholder="閫夋嫨鏃ユ湡" - style="width: 90px" + <template v-if="!detailEnter"> + <el-form-item + v-if="item.input" + label=" " + :prop="'tableData.' + scope.$index + '.' + item.prop" + :rules="[{ required: item.isRequird ? true : false, message: '杈撳叆涓嶈兘涓虹┖' }]" > - </el-date-picker> - </el-form-item> - </template> - </el-table-column> - <el-table-column prop="endDate" label="鏈嶅姟鍒版湡鏃�" width="140"> - <template slot-scope="scope"> - <el-form-item - label=" " - :prop="'tableData.' + scope.$index + '.endDate'" - :rules="[{ required: true, message: '杈撳叆涓嶈兘涓虹┖' }]" - > - <el-date-picker - v-model="scope.row.endDate" - size="mini" - type="date" - placeholder="閫夋嫨鏃ユ湡" - style="width: 90px" + <el-input + v-model.trim="scope.row[item.prop]" + maxlength="50" + size="mini" + @change=" + (val) => { + commonInputChange(val, item.prop, scope.row) + } + " + ></el-input> + </el-form-item> + <el-form-item + v-else-if="item.productName" + label=" " + :prop="'tableData.' + scope.$index + '.' + item.prop" > - </el-date-picker> - </el-form-item> + <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" + :rules="[{ required: item.isRequird ? true : false, message: '杈撳叆涓嶈兘涓虹┖' }]" + > + <!-- <el-input v-model.trim="scope.row[item.prop]" maxlength="50" size="mini"></el-input> --> + <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 style="text-align: right">{{ scope.row[item.prop] }}</span> </template> </el-table-column> - <el-table-column prop="number" label="鏁伴噺"></el-table-column> - <el-table-column prop="" label="鍚◣鍗曚环"> </el-table-column> - <el-table-column prop="" label="涓嶅惈绋庡崟浠�"> </el-table-column> - <el-table-column prop="" label="鎶樻墸鐜�(%)"></el-table-column> - <el-table-column prop="" label="鎶樻墸棰�"> </el-table-column> - <el-table-column prop="" label="绋�(閿�鍞�)"> </el-table-column> - <el-table-column prop="" label="瀹為檯鍚◣鍗曚环"></el-table-column> - <el-table-column prop="" label="浠风◣鍚堣"> </el-table-column> - <el-table-column prop="" label="鎻忚堪"> </el-table-column> </el-table> </el-form> - <div style="margin: 10px"> - <el-button size="small" type="primary">鏂板</el-button> - <el-button size="small" type="primary">瀵煎叆鏄庣粏</el-button> - <el-button size="small" type="primary">娓呯┖</el-button> - <el-button size="small" type="primary">閲嶇畻</el-button> + <div v-if="!detailEnter" style="margin: 10px"> + <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" :disabled="isRecalculate ? false : true" + >閲嶇畻</el-button + > </div> + <div v-if="showSummary.total || showSummary.refundable" style="height: 42px; line-height: 42px"> + <el-row :gutter="10"> + <el-col v-if="showSummary.total" :span="2" :offset="22"> + <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"> + <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: false + }, productTableList: { type: Object, default: () => { return { tableData: [], // 鎺ュ彛杩斿洖鏁版嵁 + isReturn: false, tableColumn: [ // table琛ㄥ崟 { label: "", prop: "", min: 200, tooltip: true } ] } } + }, + showSummary: { + type: Object, + default: () => { + return { + show: false, + total: false, + refundable: false, + sumProp: [], + mergeNumber: 1 + } + } } }, data() { - return {} - }, - computed: { - maxHeight() { - if (this.productTableList.height) { - return `calc(100vh - ${this.productTableList.height})` - } - return undefined + return { + 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.data) + if (res.data.code === 200) { + if (res.data.data.data && res.data.data.data.length > 0) { + this.productList = res.data.data.data + } + } + }) + }, handleReserve(row) { return row._id ? row._id : row.id }, handleSelectionChange(val) { this.$emit("getSelectArray", val) + }, + // 琛屽悎骞� + arraySpanMethod() { + if (this.showSummary.show) { + this.$nextTick(() => { + if (this.$refs.table) { + var current = this.$refs.table.querySelector(".el-table__footer-wrapper").querySelector(".el-table__footer") + var cell = current.rows[0].cells + for (let i = 0; i < this.showSummary.mergeNumber; i++) { + cell[i].style.display = "none" + } + cell[this.showSummary.mergeNumber].classList.remove("is-left") + cell[this.showSummary.mergeNumber].colSpan = this.showSummary.mergeNumber.toString() + } + }) + } + }, + // 鍚堣 + getSummaries(param) { + 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)) + } + }, 0)}` + } else { + sums[index] = "" + } + if (column.property === "total") { + this.total = sums[index] + } + }) + return sums + }, + // 鏁板瓧鎹㈣涓洪噾棰濇樉绀烘牸寮� + number_format(number, decimals, dec_point, thousands_sep) { + decimals = 2 //杩欓噷榛樿璁剧疆淇濈暀涓や綅灏忔暟锛屼篃鍙互娉ㄩ噴杩欏彞閲囩敤浼犲叆鐨勫弬鏁� + /* + * 鍙傛暟璇存槑锛� + * number锛氳鏍煎紡鍖栫殑鏁板瓧 + * decimals锛氫繚鐣欏嚑浣嶅皬鏁� + * dec_point锛氬皬鏁扮偣绗﹀彿 + * thousands_sep锛氬崈鍒嗕綅绗﹀彿 + * */ + number = (number + "").replace(/[^0-9+-Ee.]/g, "") + var n = !isFinite(+number) ? 0 : +number, + prec = !isFinite(+decimals) ? 0 : Math.abs(decimals), + sep = typeof thousands_sep === "undefined" ? "," : thousands_sep, + dec = typeof dec_point === "undefined" ? "." : dec_point + var s = n.toString().split(".") + var re = /(-?\d+)(\d{3})/ + while (re.test(s[0])) { + s[0] = s[0].replace(re, "$1" + sep + "$2") + } + if ((s[1] || "").length < prec) { + s[1] = s[1] || "" + s[1] += new Array(prec - s[1].length + 1).join("0") + } else { + s[1] = s[1].substring(0, prec) //灏忔暟鐐逛綅鏁拌秴鍑洪暱搴︽椂鎴彇鍓嶉潰鐨勪綅鏁� + } + return s.join(dec) + }, + // 鏂板 + add() { + this.$emit("addProductClick") + }, + 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") + }, + // 閲嶇畻 + recalculate() { + this.$confirm("纭畾瑕侀噸绠楁槑缁嗘墍鏈夎?", "鎻愮ず", { + confirmButtonText: "纭畾", + cancelButtonText: "鍙栨秷", + type: "warning" + }) + .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) } } } @@ -115,6 +429,35 @@ .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-form-item__label { + display: none; + } + .el-table__footer-wrapper tbody td.el-table__cell { + background-color: #fff; + // text-align: right; + font-weight: bold; + } + .el-input--suffix .el-input__inner { + padding-right: 0px; + } + .el-table .cell, + .el-table th.el-table__cell > .cell { + padding: 0 5px; + } + .el-input__inner { + // text-align: left; + text-align: center !important; } } </style> -- Gitblit v1.8.0