| <!-- eslint-disable vue/no-use-v-if-with-v-for --> | 
| <template> | 
|   <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: '#f1f3f8', color: '#000009', 'font-size': '12px', 'font-family': 'PingFangSC' }" | 
|       size="mini" | 
|     > | 
|       <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" | 
|         :prop="item.prop" | 
|         :label="item.label" | 
|         :width="item.width" | 
|         :min-width="item.min" | 
|         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> | 
|           <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> | 
|           <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> | 
|   | 
| <script> | 
| 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 } | 
|           ] | 
|         } | 
|       } | 
|     }, | 
|     showSummary: { | 
|       type: Object, | 
|       default: () => { | 
|         return { | 
|           show: false, | 
|           sumProp: [], | 
|           mergeNumber: 1 | 
|         } | 
|       } | 
|     } | 
|   }, | 
|   data() { | 
|     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 | 
|     }, | 
|     handleSelectionChange(val) { | 
|       this.$emit("getSelectArray", val) | 
|     }, | 
|     // 行合并 | 
|     arraySpanMethod() { | 
|       if (this.showSummary.show) { | 
|         this.$nextTick(() => { | 
|           if (this.$refs.table.$el) { | 
|             var current = this.$refs.table.$el | 
|               .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] && cell[i].style && (cell[i].style.display = "none") | 
|             } | 
|             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() | 
|               } | 
|             } | 
|           } | 
|         }) | 
|       } | 
|     }, | 
|     // 金额合计 | 
|     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 (this.showSummary.sumProp.includes(column.property)) { | 
|             sums[index + 1] = values.reduce((prev, curr) => { | 
|               const value = Number(curr) | 
|               if (!isNaN(value)) { | 
|                 return prev + curr | 
|               } else { | 
|                 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 | 
|       } | 
|     }, | 
|     // 数字换行为金额显示格式 | 
|     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) | 
|     }, | 
|     // 时间显示 | 
|     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) | 
|     } | 
|   } | 
| } | 
| </script> | 
|   | 
| <!-- Add "scoped" attribute to limit CSS to this component only --> | 
| <style lang="scss" scoped> | 
| .table-view { | 
|   position: relative; | 
|   height: 100%; | 
|   .blue { | 
|     width: 70px; | 
|     text-align: center; | 
|     color: #fff; | 
|     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; | 
|       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> |