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 |  328 +++++++++++++++++++++++++++++++++++++++++++++++-------
 1 files changed, 284 insertions(+), 44 deletions(-)

diff --git a/src/components/makepager/CommonFormTableView.vue b/src/components/makepager/CommonFormTableView.vue
index 01f734a..80520cc 100644
--- a/src/components/makepager/CommonFormTableView.vue
+++ b/src/components/makepager/CommonFormTableView.vue
@@ -1,21 +1,22 @@
 <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"
           :width="item.width"
           :min-width="item.min"
-          align="right"
+          align="center"
         >
           <!-- 琛ㄥご鏍峰紡 -->
           <template slot="header">
@@ -31,7 +32,45 @@
                 :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" disabled></el-input>
+                <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"
+              >
+                <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"
@@ -40,27 +79,70 @@
                 :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" disabled>
+                <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-form>
     <div v-if="!detailEnter" style="margin: 10px">
-      <el-button size="small" type="primary" disabled>鏂板</el-button>
-      <el-button size="small" type="primary" disabled>瀵煎叆鏄庣粏</el-button>
-      <el-button size="small" type="primary" disabled>娓呯┖</el-button>
-      <el-button size="small" type="primary" disabled>閲嶇畻</el-button>
+      <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">0.00</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>
@@ -68,12 +150,21 @@
         </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,
@@ -84,6 +175,7 @@
       default: () => {
         return {
           tableData: [], // 鎺ュ彛杩斿洖鏁版嵁
+          isReturn: false,
           tableColumn: [
             // table琛ㄥ崟
             { label: "", prop: "", min: 200, tooltip: true }
@@ -105,17 +197,46 @@
     }
   },
   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
     },
@@ -140,29 +261,41 @@
     },
     // 鍚堣
     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)
-            sums[index]
-          }
-        })
-        return sums
-      }
+      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) {
@@ -191,6 +324,101 @@
         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)
     }
   }
 }
@@ -201,6 +429,14 @@
 .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 {
@@ -209,7 +445,7 @@
   }
   .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 {
@@ -219,5 +455,9 @@
   .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