From 2fb4239e828bcfa9711ce4cecc4b942767621d62 Mon Sep 17 00:00:00 2001 From: zuozhengqing <a13193816592@163.com> Date: 星期一, 06 十一月 2023 17:20:20 +0800 Subject: [PATCH] Merge branch 'dev' of ssh://192.168.5.5:29418/web/crm-web into dev --- src/components/makepager/TableCommonView.vue | 392 ++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 files changed, 369 insertions(+), 23 deletions(-) diff --git a/src/components/makepager/TableCommonView.vue b/src/components/makepager/TableCommonView.vue index 9db25d6..4beb7f3 100644 --- a/src/components/makepager/TableCommonView.vue +++ b/src/components/makepager/TableCommonView.vue @@ -1,19 +1,25 @@ +<!-- eslint-disable vue/no-use-v-if-with-v-for --> <template> - <div class="page-view"> + <div class="table-view"> <el-table ref="table" border :data="tableList.tableInfomation" tooltip-effect="dark" + :height="'calc(100% - 0px)'" style="width: 100%" :lazy="tableList.lazy" :show-summary="showSummary.show" :summary-method="getSummaries" :span-method="arraySpanMethod" @selection-change="handleSelectionChange" - :header-cell-style="{ background: '#ECF4FF', color: '#666' }" + :header-cell-style="{ background: '#f1f3f8', color: '#000009', 'font-size': '12px', 'font-family': 'PingFangSC' }" + size="mini" + @row-click="tableRowClick" + :row-class-name="tableRowClassName" > - <el-table-column type="selection" width="40"> </el-table-column> + <el-table-column v-if="tableList.selectIndex" type="index" label="搴忓彿" width="50"></el-table-column> + <el-table-column v-if="selectBox" type="selection" width="40"> </el-table-column> <el-table-column v-for="(item, i) in tableList.tableColumn" :key="i" @@ -21,17 +27,120 @@ :label="item.label" :width="item.width" :min-width="item.min" - show-overflow-tooltip="true" - sortable + show-overflow-tooltip + :sortable="item.sortable" + v-if="item.isShowColumn" > <template slot-scope="scope"> <span v-if="item.price">{{ "锟�" + number_format(scope.row[item.prop], 2, ".", ",") }}</span> - <span v-else-if="item.status" :class="scope.row.status">{{ scope.row[item.prop] }}</span> - <span v-else>{{ scope.row[item.prop] }}</span> + <div v-else-if="item.status" :class="scope.row.status">{{ scope.row[item.prop] }}</div> + <span v-else-if="item.isTime">{{ + dateFormat("YYYY-mm-dd HH:MM:SS", scope.row[item.prop]) === "1900-01-01 00:06:26" + ? "--" + : dateFormat("YYYY-mm-dd HH:MM:SS", scope.row[item.prop]) + }}</span> + <span v-else-if="item.isClick && scope.row[item.prop]" class="sel-name" @click="selNameClick(scope.row)">{{ + scope.row[item.prop] + }}</span> + <span v-else-if="item.isFirst">{{ scope.row[item.prop] ? "鏄�" : "鍚�" }}</span> + <span + v-else-if="item.isSalesLeadClick && scope.row[item.prop]" + class="sel-name" + @click="selSalesLeadClick(scope.row)" + >{{ scope.row[item.prop] }}</span + > + <span + v-else-if="item.isClientClick && scope.row[item.prop]" + class="sel-name" + @click="selClientClick(scope.row)" + >{{ scope.row[item.prop] ? scope.row[item.prop] : "--" }}</span + > + <span + v-else-if="item.isContactClick && scope.row[item.prop]" + class="sel-name" + @click="selContactsClick(scope.row)" + >{{ scope.row[item.prop] }}</span + > + <span + v-else-if="item.isMasterClick && scope.row[item.prop]" + class="sel-name" + @click="selMasterClick(scope.row)" + >{{ scope.row[item.prop] }}</span + > + <span + v-else-if="item.isServiceOrder && scope.row[item.prop]" + class="sel-name" + @click="selServiceOrderClick(scope.row)" + >{{ scope.row[item.prop] }}</span + > + <span + v-else-if="item.isCommonClick && scope.row[item.prop]" + class="sel-name" + @click="selCommonClick(scope.row)" + >{{ scope.row[item.prop] }}</span + > + <div v-else-if="item.isProductName" class="product-view"> + <ul v-if="scope.row.products && scope.row.products.length > 0"> + <li v-for="(item, index) in scope.row.products" :key="index"> + <div class="name-view"> + {{ item.name }} + </div> + </li> + </ul> + <div v-else class="no-product">{{ "--" }}</div> + </div> + <div v-else-if="item.isProductAmount" class="product-view"> + <ul v-if="scope.row.products && scope.row.products.length > 0"> + <li v-for="(item, index) in scope.row.products" :key="index"> + <div class="name-view"> + {{ item.amount }} + </div> + </li> + </ul> + <div v-else class="no-product">{{ "--" }}</div> + </div> + <div v-else-if="item.isProductPrice" class="product-view"> + <ul v-if="scope.row.products && scope.row.products.length > 0"> + <li v-for="(item, index) in scope.row.products" :key="index"> + <div class="name-view"> + {{ item.price }} + </div> + </li> + </ul> + <div v-else class="no-product">{{ "--" }}</div> + </div> + <div v-else-if="item.isProductTotal" class="product-view"> + <ul v-if="scope.row.products && scope.row.products.length > 0"> + <li v-for="(item, index) in scope.row.products" :key="index"> + <div class="name-view"> + {{ item.total }} + </div> + </li> + </ul> + <div v-else class="no-product">{{ "--" }}</div> + </div> + <!-- 璋冪敤鏂规硶鏄剧ず鏂囧瓧 --> + <div v-else-if="item.isCallMethod"> + <span :class="item.isClass ? item.getClassName(scope.row[item.prop], scope.row) : ''">{{ + item.getCallMethod(scope.row[item.prop], scope.row) + }}</span> + </div> + <span v-else>{{ scope.row[item.prop] ? scope.row[item.prop] : "--" }}</span> </template> </el-table-column> <slot name="tableButton" /> + <div slot="empty"> + <el-empty description="鏆傛棤鏁版嵁"></el-empty> + </div> </el-table> + + <div class="overSpread1" v-show="iscolopen" @click="onMaskClick"></div> + <div class="styleBtn"> + <i @click="checkCol()" class="label">...</i> + <el-checkbox-group v-model="showcol" v-show="iscolopen" class="checkbox-group" @change="selectCheckBoxList"> + <el-checkbox v-for="item in tableList.allcol" :label="item" :key="item">{{ item }} </el-checkbox> + </el-checkbox-group> + </div> </div> </template> @@ -39,11 +148,18 @@ export default { name: "TableCommonView", props: { + selectBox: { + type: Boolean, + default: false + }, tableList: { type: Object, default: () => { return { + selectIndex: true, tableInfomation: [], // 鎺ュ彛杩斿洖鏁版嵁 + showcol: [], + allcol: [], tableColumn: [ // table琛ㄥ崟 { label: "", prop: "", min: 200, tooltip: true } @@ -60,13 +176,40 @@ mergeNumber: 1 } } + }, + // 閫変腑鐨勬牱寮� + selectClassRow: { + type: Object, + default: () => { + return {} + } } }, data() { - return {} + return { + iscolopen: false, + showcol: [] + } }, computed: {}, + watch: { + "tableList.showcol": { + handler(newVal) { + this.showcol = newVal + }, + immediate: true + } + }, methods: { + onMaskClick() { + this.iscolopen = false + }, + checkCol() { + this.iscolopen = !this.iscolopen + }, + selectCheckBoxList(val) { + this.$emit("selTableCol", val) + }, handleReserve(row) { return row._id ? row._id : row.id }, @@ -83,10 +226,16 @@ .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[i] && cell[i].style && (cell[i].style.display = "none") } - cell[this.showSummary.mergeNumber].classList.remove("is-left") - cell[this.showSummary.mergeNumber].colSpan = this.showSummary.mergeNumber.toString() + if (cell[this.showSummary.mergeNumber]) { + if (cell[this.showSummary.mergeNumber].classList) { + cell[this.showSummary.mergeNumber].classList.remove("is-left") + } + if (cell[this.showSummary.mergeNumber].colSpan) { + cell[this.showSummary.mergeNumber].colSpan = this.showSummary.mergeNumber.toString() + } + } } }) } @@ -101,19 +250,50 @@ 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 + 1] = values.reduce((prev, curr) => { const value = Number(curr) if (!isNaN(value)) { - return this.number_format(prev + curr, 2, ".", ",") + return prev + curr } else { - return this.number_format(prev, 2, ".", ",") + return prev } }, 0) sums[index + 1] + if (column.property === "taxUnitPrice") { + let sumPrice = 0 + this.tableList.tableInfomation.map((item) => { + item.products.map((val) => { + console.log(val.price) + sumPrice += parseFloat(val.price) + }) + }) + console.log((sums[index + 1] = sumPrice)) + console.log(sumPrice) + } + if (column.property === "priceTax") { + let sumPrice = 0 + this.tableList.tableInfomation.map((item) => { + item.products.map((val) => { + console.log(val.price) + sumPrice += parseFloat(val.total) + }) + }) + sums[index + 1] = sumPrice + } + if (column.property === "productAmount") { + let sumPrice = 0 + this.tableList.tableInfomation.map((item) => { + item.products.map((val) => { + console.log(val.price) + sumPrice += parseFloat(val.amount) + }) + }) + sums[index + 1] = sumPrice + } } }) + // console.log(sums) return sums } }, @@ -144,6 +324,68 @@ s[1] = s[1].substring(0, prec) //灏忔暟鐐逛綅鏁拌秴鍑洪暱搴︽椂鎴彇鍓嶉潰鐨勪綅鏁� } return s.join(dec) + }, + // 鏃堕棿鏄剧ず + dateFormat(fmt, date) { + let ret = "" + date = new Date(date) + const opt = { + "Y+": date.getFullYear().toString(), // 骞� + "m+": (date.getMonth() + 1).toString(), // 鏈� + "d+": date.getDate().toString(), // 鏃� + "H+": date.getHours().toString(), // 鏃� + "M+": date.getMinutes().toString(), // 鍒� + "S+": date.getSeconds().toString() // 绉� + // 鏈夊叾浠栨牸寮忓寲瀛楃闇�姹傚彲浠ョ户缁坊鍔狅紝蹇呴』杞寲鎴愬瓧绗︿覆 + } + for (let k in opt) { + ret = new RegExp("(" + k + ")").exec(fmt) + if (ret) { + fmt = fmt.replace(ret[1], ret[1].length == 1 ? opt[k] : opt[k].padStart(ret[1].length, "0")) + } + } + return fmt + }, + // 鏂板缓缂栬緫閫夋嫨寮圭獥 + selNameClick(row) { + this.$emit("selCommonClick", row) + }, + // 閿�鍞嚎绱� + selSalesLeadClick(row) { + this.$emit("selSalesLeadClick", row) + }, + // 瀹㈡埛鍚嶇О + selClientClick(row) { + this.$emit("selClientClick", row) + }, + // 鑱旂郴浜哄鍚� + selContactsClick(row) { + this.$emit("selContactsClick", row) + }, + // 閿�鍞�诲崟 + selMasterClick(row) { + this.$emit("selMasterClick", row) + }, + // 瀹㈡埛鏈嶅姟鍗� + selServiceOrderClick(row) { + this.$emit("selServiceOrderClick", row) + }, + // 鍏叡锛堥攢鍞満浼氥�佹姤浠峰崟銆侀攢鍞�诲崟銆侀攢鍞瓙鍗曘�傘�傘�傦級 + selCommonClick(row) { + this.$emit("selCommonClick", row) + }, + // 琛岀偣鍑� + tableRowClick(row, column, event) { + this.$emit("tableRowClick", row, column, event) + }, + // 鍗曢�夎鐩稿叧 + tableRowClassName({ row }) { + if (Object.keys(this.selectClassRow).length > 0) { + if (row.id == this.selectClassRow.id) { + return "onSelect" + } + } + this.$emit("tableRowClassName", row) } } } @@ -151,21 +393,125 @@ <!-- Add "scoped" attribute to limit CSS to this component only --> <style lang="scss" scoped> -.page-view { - margin-top: 20px; - margin-right: 10px; - margin-bottom: 40px; +.table-view { + position: relative; + height: 100%; .blue { - padding: 10px; + width: 70px; + text-align: center; color: #fff; - background-color: blue; + background-color: $color-primary; border-radius: 4px; + } + .sel-name { + color: $color-primary; + cursor: pointer; + } + .product-view { + // background: #cc7d7d; + margin-left: -10px; + margin-right: -11px; + li { + height: 22px; + line-height: 22px; + .name-view { + padding-left: 10px; + border-bottom: 1px solid #ebeef5; + } + .no-bottom { + border-bottom: 0; + } + } + li:last-child .name-view { + border-bottom: none; + } + .no-product { + height: 22px; + line-height: 22px; + } } } ::v-deep { - .el-table__footer-wrapper tbody td.el-table__cell { - background-color: #fff; - text-align: right; + .el-table__footer-wrapper { + tbody td.el-table__cell { + background-color: #fff; + font-weight: bold; + } + } +} + +::v-deep .el-table .cell { + font-size: 12px; + line-height: 17px; + font-family: PingFangSC; + color: rgba(0, 0, 0, 0.9); + .el-button--text { + width: auto; + height: auto; + font-family: PingFangSC-Medium, sans-serif; + } +} +::v-deep .el-table .el-table__cell { + padding: 6px 0 !important; + height: 35px; + text-align: center; +} + +::v-deep { + .el-table .cell .el-button--text.el-button--small { + padding: 4px 0; + } +} + +::v-deep .el-table .el-table__cell { + padding: 6px 0 !important; + height: 35px; + text-align: center; +} + +.overSpread1 { + width: 100%; + height: 100%; + position: fixed; + top: 0; + left: 0; + background: rgba(0, 0, 0, 0); + z-index: 10; +} + +.styleBtn { + position: absolute; + width: 30px; + height: 36px; + // line-height: 26px; + // background: #06c062; + top: 0; + right: -6px; + z-index: 11; + .label { + position: absolute; + top: 6px; + font-size: 20px; + // line-height: 5px; + cursor: pointer; + color: #000; + transform: rotate(-90deg); + } + .checkbox-group { + width: 160px; + height: 300px; + overflow: auto; + display: flex; + flex-direction: column; + line-height: 25px; + background: #ffffff; + border-radius: 16px; + padding: 12px; + position: absolute; + right: 0; + top: 30px; + z-index: 99; + box-shadow: 0 0 2px 2px #f8f8f8; } } </style> -- Gitblit v1.8.0