소스 검색

Merge branch 'master' of http://49.4.53.36:3000/hotel/hotel-saas-tenant-frontend

覃浩 2 년 전
부모
커밋
b9a06a1ddf

+ 54 - 1
src/views/pos/diandan.vue

@@ -61,7 +61,7 @@
           <a-button :disabled="btnDisabled" type="danger" @click="handlePayment"
             >结账¥{{ amount.toFixed(2) }}</a-button
           >
-          <a-button :disabled="btnDisabled">退货</a-button>
+          <a-button :disabled="btnDisabled" @click="refundChange">退货</a-button>
         </div>
       </a-card>
       <a-card style="width: 75%; position: relative">
@@ -144,10 +144,12 @@
       @ok="modalSelectCheckInRoomOrderFormOk"
     ></select-check-in-room-order-modal>
 
+    <!-- 整单备注弹窗 -->
     <a-modal
       @cancel="isRemarkModal = false"
       :visible="isRemarkModal"
       title="添加备注"
+      @ok="remarkModalOk"
     >
       <a-form-model>
         <a-form-model-item label="备注">
@@ -155,6 +157,20 @@
         </a-form-model-item>
       </a-form-model>
     </a-modal>
+
+    <!-- 退货弹窗 -->
+    <a-modal
+      @cancel="isRefund = false"
+      :visible="isRefund"
+      title="退货"
+      @ok="refundModalOk"
+    >
+      <a-form-model>
+        <a-form-model-item label="备注">
+          <a-input v-model="refundRemark" />
+        </a-form-model-item>
+      </a-form-model>
+    </a-modal>
   </a-card>
 </template>
 
@@ -201,6 +217,8 @@ export default {
       isSaoma: false,
       remark: "",
       columns,
+      isRefund: false,
+      refundRemark: "",
       sellClear: 0,
       queryParam: {},
       // 分页参数
@@ -225,6 +243,7 @@ export default {
       dictOptions: {},
       superFieldList: [],
       selectedRowKeys: [],
+      selectedRows: [],
       isorter: {
         column: "createTime",
         order: "desc",
@@ -257,6 +276,8 @@ export default {
             "selectedRows: ",
             selectedRows
           );
+          this.selectedRowKeys = selectedRowKeys;
+          this.selectedRows = selectedRows;
         },
         getCheckboxProps: (record) => ({
           props: {
@@ -303,9 +324,38 @@ export default {
   },
   methods: {
     remarkModal() {
+      if (!this.selectGoodsList || this.selectGoodsList.length <= 0) {
+        this.$message.warning("请先选择商品");
+        return;
+      }
       this.isRemarkModal = true;
     },
+    refundModalOk(){
+
+    },
+
+    /**
+     * 退货
+     */
+    refundChange(){
+      this.$message.warning("未下单餐品不支持退菜,请重新选择");
+      return
+      if(this.selectedRows.length == 0){
+        this.$message.warning("请先选择菜品");
+        return;
+      }
+      this.isRefund = true;
+    },
 
+    remarkModalOk() {
+      this.handleAdd()
+      this.remark = "";
+      this.isRemarkModal = false;
+    },
+    onClearSelected() {
+      this.selectedRowKeys = [];
+      this.selectionRows = [];
+    },
     loadTree() {
       var that = this;
       tree().then((res) => {
@@ -466,6 +516,9 @@ export default {
       model.id = this.selectOrderInfo.id;
       model.toRoomFeeOrderId = this.selectRoomOrder.livingOrderId;
       model.posType = this.tabPosTypeId;
+      if (this.remark) {
+        model.remarks = this.remark;
+      }
       var posOrderGoodsDetailList = [];
       this.selectGoodsList.forEach((t) => {
         posOrderGoodsDetailList.push({

+ 29 - 1
src/views/room/modules/checkIn/BillRoomForm.vue

@@ -935,7 +935,7 @@ const columns = [
   {
     title: "优惠价",
     dataIndex: "prefPrice",
-    width: 120,
+    width: 100,
     scopedSlots: { customRender: "prefPrice" },
   },
   {
@@ -1892,6 +1892,16 @@ export default {
       console.log("editTabs", e);
       var index = this.model.roomIds.findIndex((t) => t.id == e);
       this.model.roomIds.splice(index, 1);
+      console.log("this.canUserRooms", this.canUserRooms);
+      this.canUserRooms.forEach((t) => {
+        t.buildingRooms.forEach((b) => {
+          b.floorRooms.forEach((f) => {
+            if (f.id == e) {
+              f.check = 0;
+            }
+          });
+        });
+      });
       this.model.roomPrices = this.model.roomPrices.filter(
         (t) => t.roomId != e
       );
@@ -1959,6 +1969,15 @@ export default {
           }
         }
       }
+      if (this.modelDefault.roomIds && this.modelDefault.roomIds.length > 2) {
+        var mainRoom = this.modelDefault.roomIds[0];
+        var sortRooms = this.modelDefault.roomIds
+          .filter((t) => t.id != mainRoom.id)
+          .sort(function (a, b) {
+            return a.name.toUpperCase() > b.name.toUpperCase() ? 1 : -1;
+          });
+        this.modelDefault.roomIds = [...[mainRoom], ...sortRooms];
+      }
       console.log(" this.modelDefault.roomIds", this.modelDefault.roomIds);
       this.edit(this.modelDefault);
     },
@@ -2073,6 +2092,15 @@ export default {
           }
         });
         this.model.roomPrices = [...this.model.roomPrices, ...roomPrices];
+        if (this.model.roomPrices && this.model.roomPrices.length > 2) {
+          var mainRoom = this.model.roomPrices[0];
+          var sortRooms = this.model.roomPrices
+            .filter((t) => t.roomId != mainRoom.roomId)
+            .sort(function (a, b) {
+              return a.roomNo.toUpperCase() > b.roomNo.toUpperCase() ? 1 : -1;
+            });
+          this.model.roomPrices = [...[mainRoom], ...sortRooms];
+        }
         var sum = 0;
         this.model.roomPrices.forEach(function (item) {
           sum += item.roomFee + item.deposit;

+ 29 - 5
src/views/settings/components/BusMarketMemberLableList.vue

@@ -1,6 +1,18 @@
 <template>
   <a-card :bordered="false">
-    <h4 style="margin-bottom: 16px">会员分组设置</h4>
+    <h4 style="margin-bottom: 16px">
+      会员分组设置
+      <a-tooltip
+        placement="right"
+        title="将具有相同特征的会员放在一个分组,您可以更有针对性地营销。列如:5月1日发过短信、有欠款、可总换积分 "
+      >
+        <a-icon
+          style="margin-left: 15px"
+          type="question-circle"
+          theme="filled"
+        />
+      </a-tooltip>
+    </h4>
     <a-tag
       closable
       :visible="visible"
@@ -13,7 +25,19 @@
 
     <a-button @click="handleAdd" icon="plus">新分组</a-button>
     <a-divider />
-    <h4 style="margin-bottom: 16px">会员标签设置</h4>
+    <h4 style="margin-bottom: 16px">
+      会员标签设置
+      <a-tooltip
+        placement="right"
+        title="帮您迅速锁定顾客喜好,投其所好地推荐商品,提高成交的可能性。例如:土豪、大方、注重质量、爱还价、苛刻等  "
+      >
+        <a-icon
+          style="margin-left: 15px"
+          type="question-circle"
+          theme="filled"
+        />
+      </a-tooltip>
+    </h4>
     <a-tag
       closable
       :visible="visible2"
@@ -131,14 +155,14 @@ export default {
         },
       });
     },
-    handleEditGroup (item) {
-      console.log(1)
+    handleEditGroup(item) {
+      console.log(1);
       this.$refs.modalForm.edit(item);
       this.$refs.modalForm.title = "编辑";
       this.$refs.modalForm.disableSubmit = false;
     },
     handleEditLabel(item) {
-      console.log(1)
+      console.log(1);
       this.$refs.modalForm2.edit(item);
       this.$refs.modalForm2.title = "编辑";
       this.$refs.modalForm2.disableSubmit = false;

+ 30 - 26
src/views/settings/components/modules/BusMarketMemberForm.vue

@@ -18,7 +18,7 @@
               <a-input v-model="model.hotelId" placeholder="请输入关联酒店"  ></a-input>
             </a-form-model-item>
           </a-col> -->
-          <a-col :span="24">
+          <a-col :span="12">
             <a-form-model-item
               label="会员名称"
               :labelCol="labelCol"
@@ -31,7 +31,7 @@
               ></a-input>
             </a-form-model-item>
           </a-col>
-          <a-col :span="24">
+          <a-col :span="12">
             <a-form-model-item
               label="选择类型"
               :labelCol="labelCol"
@@ -44,7 +44,7 @@
               </a-radio-group>
             </a-form-model-item>
           </a-col>
-          <a-col :span="24" v-show="model.type == 0">
+          <a-col :span="12" v-show="model.type == 0">
             <a-form-model-item
               label="会员折扣"
               :labelCol="labelCol"
@@ -60,7 +60,7 @@
               />%
             </a-form-model-item>
           </a-col>
-          <a-col :span="24" v-show="model.type == 1">
+          <a-col :span="12" v-show="model.type == 1">
             <a-form-model-item
               label="房价方案"
               :labelCol="labelCol"
@@ -82,7 +82,7 @@
               </a-select>
             </a-form-model-item>
           </a-col>
-          <a-col :span="24">
+          <!-- <a-col :span="24">
             <a-form-model-item
               label="是否需要支付"
               :labelCol="labelCol"
@@ -111,8 +111,8 @@
                 style="width: 100%"
               />
             </a-form-model-item>
-          </a-col>
-          <a-col :span="24">
+          </a-col> -->
+          <!-- <a-col :span="24">
             <a-form-model-item
               label="积分购买"
               :labelCol="labelCol"
@@ -125,8 +125,8 @@
                 style="width: 100%"
               />
             </a-form-model-item>
-          </a-col>
-          <a-col :span="24">
+          </a-col> -->
+          <!-- <a-col :span="24">
             <a-form-model-item
               label="是否可以储值"
               :labelCol="labelCol"
@@ -138,8 +138,8 @@
                 <a-radio :value="1">是</a-radio>
               </a-radio-group>
             </a-form-model-item>
-          </a-col>
-          <a-col :span="24">
+          </a-col> -->
+          <a-col :span="12">
             <a-form-model-item
               label="等级"
               :labelCol="labelCol"
@@ -149,12 +149,11 @@
               <a-input-number
                 v-model="model.level"
                 placeholder="请输入等级"
-                style="width: 20%"
                 :precision="0"
               />
             </a-form-model-item>
           </a-col>
-          <a-col :span="24">
+          <a-col :span="12">
             <a-form-model-item
               label="会员优惠"
               :labelCol="labelCol"
@@ -169,7 +168,7 @@
               />元
             </a-form-model-item>
           </a-col>
-          <a-col :span="24">
+          <a-col :span="12">
             <a-form-model-item
               label="自动续期"
               :labelCol="labelCol"
@@ -194,7 +193,10 @@
           <a-col :span="24">
             <a-form-model-item
               label="积分设置"
-              :labelCol="labelCol"
+              :labelCol="{
+                xs: { span: 24 },
+                sm: { span: 3},
+              }"
               :wrapperCol="wrapperCol"
               prop="tenantPointsChecked"
             >
@@ -314,12 +316,12 @@
                   style="width: 120px"
                   :allowClear="true"
                 >
-                <a-select-option
-                  :value="item.value"
-                  v-for="(item, index) in members"
-                  :key="index"
-                  >{{ item.label }}</a-select-option
-                >
+                  <a-select-option
+                    :value="item.value"
+                    v-for="(item, index) in members"
+                    :key="index"
+                    >{{ item.label }}</a-select-option
+                  >
                 </a-select></block
               ><br />
               <a-checkbox
@@ -339,7 +341,7 @@
               /></block>
             </a-form-model-item>
           </a-col>
-          <a-col :span="24">
+          <a-col :span="12">
             <a-form-model-item
               label="会员图标"
               :labelCol="labelCol"
@@ -359,7 +361,7 @@
               </a-input>
             </a-form-model-item>
           </a-col>
-          <a-col :span="24">
+          <a-col :span="12">
             <a-form-model-item
               label="卡片背景"
               :labelCol="labelCol"
@@ -376,7 +378,10 @@
           <a-col :span="24">
             <a-form-model-item
               label="卡片描述"
-              :labelCol="labelCol"
+              :labelCol="{
+                xs: { span: 24 },
+                sm: { span: 3},
+              }"
               :wrapperCol="wrapperCol"
               prop="content"
             >
@@ -400,7 +405,7 @@
 </template>
 
 <script>
-import { getRoomPlans,getSelectList } from "@/api/api";
+import { getRoomPlans, getSelectList } from "@/api/api";
 import { httpAction, getAction } from "@/api/manage";
 import { validateDuplicateValue } from "@/utils/util";
 import Icons from "./icon/Icons";
@@ -480,7 +485,6 @@ export default {
           this.roomPlans = res.result;
         }
       });
-
     },
     selectIcons() {
       this.iconChooseVisible = true;

+ 1 - 1
src/views/settings/components/modules/roomPayTypeForm.vue

@@ -34,7 +34,7 @@
           </a-col>
           <a-col :span="24">
             <a-form-model-item label="排序" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="orderBy">
-              <a-input-number v-model="model.orderBy" placeholder="请输入排序" style="width: 100%" />
+              <a-input-number v-model="model.orderBy" placeholder="请输入排序" style="width: 20%" />
             </a-form-model-item>
           </a-col>
           <a-col :span="24">

+ 14 - 14
src/views/settings/components/paySettings.vue

@@ -111,21 +111,21 @@
 
                 <span slot="action" slot-scope="text, record">
           <a @click="handleEdit(record)">编辑</a>
-
           <a-divider type="vertical" />
-          <a-dropdown>
-            <a class="ant-dropdown-link">更多 <a-icon type="down" /></a>
-            <a-menu slot="overlay">
-              <a-menu-item>
-                <a @click="handleDetail(record)">详情</a>
-              </a-menu-item>
-              <a-menu-item>
-                <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
-                  <a>删除</a>
-                </a-popconfirm>
-              </a-menu-item>
-            </a-menu>
-          </a-dropdown>
+           <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
+              <a>删除</a>
+            </a-popconfirm>
+<!--          <a-dropdown>-->
+<!--            <a class="ant-dropdown-link">更多 <a-icon type="down" /></a>-->
+<!--            <a-menu slot="overlay">-->
+<!--              <a-menu-item>-->
+<!--                <a @click="handleDetail(record)">详情</a>-->
+<!--              </a-menu-item>-->
+<!--              <a-menu-item>-->
+<!--                -->
+<!--              </a-menu-item>-->
+<!--            </a-menu>-->
+<!--          </a-dropdown>-->
         </span>
 
             </a-table>

+ 366 - 0
src/views/settings/components/pos/feedingSet.vue

@@ -0,0 +1,366 @@
+<template>
+  <a-card :bordered="false">
+    <!-- 查询区域 -->
+    <div class="table-page-search-wrapper">
+      <a-form layout="inline" @keyup.enter.native="searchQuery">
+        <a-row :gutter="24">
+          <a-col :span="3">
+            <a-form-item label="">
+              <j-input
+                placeholder="加料名称"
+                v-model="queryParam.name"
+              ></j-input>
+            </a-form-item>
+          </a-col>
+          <a-col :md="6" :sm="8">
+            <span
+              style="float: left; overflow: hidden"
+              class="table-page-search-submitButtons"
+            >
+              <a-button type="primary" @click="searchQuery" icon="search"
+                >查询</a-button
+              >
+              <a-button
+                type="primary"
+                @click="searchReset"
+                icon="reload"
+                style="margin-left: 8px"
+                >重置</a-button
+              >
+            </span>
+          </a-col>
+        </a-row>
+      </a-form>
+    </div>
+    <!-- 查询区域-END -->
+
+    <!-- 操作按钮区域 -->
+    <div class="table-operator">
+      <a-button @click="handleAdd" type="primary" icon="plus">新增</a-button>
+      <!-- <a-button :disabled="selectedRowKeys.length == 0" @click="downloadQRcode" type="primary">下载二维码</a-button> -->
+      <a-button @click="batchDel" :disabled="selectedRowKeys.length == 0" icon="stop" type="danger" >批量删除</a-button>
+    </div>
+
+    <!-- table区域-begin -->
+    <div>
+      <a-table
+        ref="table"
+        size="middle"
+        :scroll="{ x: true }"
+        bordered
+        rowKey="id"
+        :columns="columns"
+        :dataSource="dataSource"
+        :pagination="ipagination"
+        :loading="loading"
+        :rowSelection="{
+          selectedRowKeys: selectedRowKeys,
+          onChange: onSelectChange,
+        }"
+        class="j-table-force-nowrap"
+        @change="handleTableChange"
+      >
+        <template slot="payFlagslot" slot-scope="text, record">
+          {{ record.payFlag == 1 ? "是" : "否" }}
+        </template>
+        <template slot="iconslot" slot-scope="text, record">
+          <a-icon :type="record.icon" theme="filled" />
+        </template>
+        <template slot="htmlSlot" slot-scope="text">
+          <div v-html="text"></div>
+        </template>
+        <template slot="imgSlot" slot-scope="text, record">
+          <span v-if="!text" style="font-size: 12px; font-style: italic"
+            >无图片</span
+          >
+          <img
+            v-else
+            :src="getImgView(text)"
+            :preview="record.id"
+            height="25px"
+            alt=""
+            style="max-width: 80px; font-size: 12px; font-style: italic"
+          />
+        </template>
+        <template slot="fileSlot" slot-scope="text">
+          <span v-if="!text" style="font-size: 12px; font-style: italic"
+            >无文件</span
+          >
+          <a-button
+            v-else
+            :ghost="true"
+            type="primary"
+            icon="download"
+            size="small"
+            @click="downloadFile(text)"
+          >
+            下载
+          </a-button>
+        </template>
+
+        <span slot="action" slot-scope="text, record">
+
+          <!-- <a @click="QRcode(record)">二维码</a>
+          <a-divider type="vertical" /> -->
+          <a @click="handleEdit(record)">编辑</a>
+
+          <a-divider type="vertical" />
+          <a-popconfirm
+            title="确定删除吗?"
+            @confirm="() => handleDelete(record.id)"
+          >
+            <a>删除</a>
+          </a-popconfirm>
+          <a-divider type="vertical" />
+          <a @click="handleAdd(record)">关联商品</a>
+        </span>
+      </a-table>
+    </div>
+
+    <a-modal title="二维码" :visible="QRcodeVisible" @cancel="QRcodeVisible = false" @ok="QRcodeVisible = false">
+      <div style="text-align:center;">
+        <a-avatar :size="264" shape="square" :src="selectQRcode" alt="暂无二维码" />
+      </div>
+    </a-modal>
+    <select-goods-modal ref="modalForm2" @ok="modalFormOks"></select-goods-modal>
+    <PosFeedingSetModal ref="modalForm" @ok="modalFormOk"></PosFeedingSetModal>
+  </a-card>
+</template>
+  
+  <script>
+import { JeecgListMixin } from "@/mixins/JeecgListMixin";
+import SelectGoodsModal from "./modules/SelectGoodsModal.vue";
+import PosFeedingSetModal from "./modules/posFeedingSetModal.vue";
+import { filterObj } from "@/utils/util";
+import { getAction, downloadFileZIP, httpAction } from "@/api/manage";
+export default {
+  name: "memberList",
+  mixins: [JeecgListMixin],
+  components: {
+    PosFeedingSetModal,
+    SelectGoodsModal
+  },
+  data() {
+    return {
+      QRcodeVisible: false,
+      selectQRcode: "",
+      queryParam: {},
+      // 分页参数
+      ipagination: {
+        current: 1,
+        pageSize: 10,
+        pageSizeOptions: ["10", "20", "30"],
+        showTotal: (total, range) => {
+          return range[0] + "-" + range[1] + " 共" + total + "条";
+        },
+        showQuickJumper: true,
+        showSizeChanger: true,
+        total: 0,
+      },
+      // 表头
+      columns: [
+        {
+          title: "加料名称",
+          align: "center",
+          dataIndex: "name",
+        },
+        {
+          title: "加料金额",
+          align: "center",
+          dataIndex: "money",
+        },
+        {
+          title: "状态",
+          align: "center",
+          dataIndex: "state",
+          customRender: function (text) {
+            return text == true ? "启用" : "禁用";
+          },
+        },
+        // {
+        //   title: "应用范围",
+        //   align: "center",
+        //   dataIndex: "type",
+        //   customRender: function (text) {
+        //     return text == 0 ? "全部菜品" : text == 1? '菜品分类' : '菜品';
+        //   },
+        // },
+        // {
+        //   title: "备注",
+        //   align: "center",
+        //   dataIndex: "remark",
+        // },
+        // {
+        //   title: "创建时间",
+        //   align: "center",
+        //   dataIndex: "regionName",
+        // },
+        {
+          title: "操作",
+          dataIndex: "action",
+          align: "center",
+          fixed: "right",
+          width: 147,
+          scopedSlots: { customRender: "action" },
+        },
+      ],
+      url: {
+        list: "/pos/posJialiaoConfig/list",
+        delete: "/pos/posJialiaoConfig/delete",
+        deleteBatch: "/pos/posJialiaoConfig/deleteBatch",
+        exportXlsUrl: "/pos/posTable/exportXls",
+        importExcelUrl: "pos/posTable/importExcel",
+      },
+      dictOptions: {},
+      superFieldList: [],
+      selectedRowKeys: [],
+      isorter: {
+        column: "createTime",
+        order: "desc",
+      },
+      selectDate: {},
+    };
+  },
+  created() {
+  },
+  methods: {
+    QRcode(record){
+      console.log(record.qrCode);
+      this.selectQRcode = record.qrCode;
+      this.QRcodeVisible = true;
+    },
+    modalFormOks(e){
+      console.log(e);
+      this.selectDate.detailList = e.map(item=>({
+                            goodsId:item.id
+                        }))
+                        this.confirmLoading = true
+      httpAction('/pos/posJialiaoConfig/edit', this.selectDate, 'post')
+                        .then((res) => {
+                            if (res.success) {
+                                this.$message.success(res.message);
+                                // that.$emit("ok");
+                                this.loadData()
+                            } else {
+                                this.$message.warning(res.message);
+                            }
+                        })
+                        .finally(() => {
+                            this.confirmLoading = false;
+                        });
+
+    },
+    handleAdd(data) {
+      this.selectDate = data;
+            this.$refs.modalForm2.edit({
+                formThali: true,
+            });
+            this.$refs.modalForm2.title = "商品选择";
+            this.$refs.modalForm2.disableSubmit = false;
+        },
+    downloadQRcode(){
+      if (this.selectedRowKeys.length <= 0) {
+        this.$message.warning('请选择一条记录!');
+        return;
+      } else {
+        var ids = "";
+        for (var a = 0; a < this.selectedRowKeys.length; a++) {
+          ids += this.selectedRowKeys[a] + ",";
+        }
+        var that = this;
+        console.log(ids);
+        downloadFileZIP('/pos/posTable/makeQRCode?ids=' + ids, '二维码', {}).then((res) => {
+          console.log(res);
+          that.onClearSelected();
+        });
+      }
+    },
+
+    handleAssociation(){
+
+    },
+
+    getAvatarView: function (avatar) {
+      return getFileAccessHttpUrl(avatar);
+    },
+
+    batchFrozen: function (status) {
+      if (this.selectedRowKeys.length <= 0) {
+        this.$message.warning("请选择一条记录!");
+        return false;
+      } else {
+        let ids = "";
+        let that = this;
+        let isAdmin = false;
+        that.selectionRows.forEach(function (row) {
+          if (row.username == "admin") {
+            isAdmin = true;
+          }
+        });
+        if (isAdmin) {
+          that.$message.warning("管理员账号不允许此操作,请重新选择!");
+          return;
+        }
+        that.selectedRowKeys.forEach(function (val) {
+          ids += val + ",";
+        });
+        that.$confirm({
+          title: "确认操作",
+          content: "是否" + (status == 1 ? "解冻" : "冻结") + "选中账号?",
+          onOk: function () {
+            frozenBatch({ ids: ids, status: status }).then((res) => {
+              if (res.success) {
+                that.$message.success(res.message);
+                that.loadData();
+                that.onClearSelected();
+              } else {
+                that.$message.warning(res.message);
+              }
+            });
+          },
+        });
+      }
+    },
+    handleMenuClick(e) {
+      if (e.key == 1) {
+        this.batchDel();
+      } else if (e.key == 2) {
+        this.batchFrozen(2);
+      } else if (e.key == 3) {
+        this.batchFrozen(1);
+      }
+    },
+    handleFrozen: function (id, status, username) {
+      let that = this;
+      //TODO 后台校验管理员角色
+      if ("admin" == username) {
+        that.$message.warning("管理员账号不允许此操作!");
+        return;
+      }
+      frozenBatch({ ids: id, status: status }).then((res) => {
+        if (res.success) {
+          that.$message.success(res.message);
+          that.loadData();
+        } else {
+          that.$message.warning(res.message);
+        }
+      });
+    },
+    handleChangePassword(username) {
+      this.$refs.passwordmodal.show(username);
+    },
+    passwordModalOk() {
+      //TODO 密码修改完成 不需要刷新页面,可以把datasource中的数据更新一下
+    },
+    onSyncFinally({ isToLocal }) {
+      // 同步到本地时刷新下数据
+      if (isToLocal) {
+        this.loadData();
+      }
+    },
+  },
+};
+</script>
+  <style scoped>
+@import "~@assets/less/common.less";
+</style>

+ 274 - 0
src/views/settings/components/pos/modules/batchAddForm.vue

@@ -0,0 +1,274 @@
+<template>
+<a-spin :spinning="confirmLoading">
+    <j-form-container :disabled="formDisabled">
+        <a-form-model ref="form" :model="model" :rules="validatorRules" slot="detail">
+            <a-row>
+                <!-- <a-col :span="24">
+            <a-form-model-item
+              label="餐桌名称"
+              :labelCol="labelCol"
+              :wrapperCol="wrapperCol"
+              prop="name"
+            >
+              <a-input
+                v-model="model.name"
+                placeholder="请输入餐桌名称"
+              ></a-input>
+            </a-form-model-item>
+          </a-col> -->
+                <a-col :span="24">
+                    <a-form-model-item label="pos类型" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="posTypeId">
+                        <a-select disabled v-model="model.posTypeId" placeholder="请选择pos类型">
+                            <a-select-option :value="item.id" v-for="item in posTypeList" :key="item.id">
+                                {{ item.name }}
+                            </a-select-option>
+                        </a-select>
+                    </a-form-model-item>
+                </a-col>
+                <a-col :span="24">
+                    <a-form-model-item label="桌型" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="posTableTypeId">
+                        <a-select v-model="model.posTableTypeId" placeholder="请选择pos类型">
+                            <a-select-option :value="item.id" v-for="item in tableTypeList" :key="item.id">
+                                {{ item.name }}
+                            </a-select-option>
+                        </a-select>
+                    </a-form-model-item>
+                </a-col>
+                <a-col :span="24">
+                    <a-form-model-item label="餐桌区域" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="posRegionId">
+
+                        <a-select v-model="model.posRegionId" placeholder="请选择pos类型">
+                            <a-select-option :value="item.id" v-for="item in regionList" :key="item.id">
+                                {{ item.name }}
+                            </a-select-option>
+                        </a-select>
+                    </a-form-model-item>
+                </a-col>
+                <a-col :span="24">
+                    <a-form-model-item label="餐桌名前缀" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="qz">
+                        <a-input v-model="model.qz" placeholder="请输入餐桌名前缀" style="width: 100%" />
+                    </a-form-model-item>
+                </a-col>
+                <a-col :span="24">
+                    <a-form-model-item label="座位数" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="num">
+                        <a-input-number v-model="model.num" placeholder="请输入座位数" style="width: 100%" />
+                    </a-form-model-item>
+                </a-col>
+                <a-col :span="24">
+                    <a-form-model-item label="餐桌序号" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="tableNo">
+                        <a-row>
+                            <a-col :span="10">
+                                <a-input v-model="model.tableNo" placeholder="开始序号"></a-input>
+                            </a-col>
+                            <a-col :span="2">
+                                至
+                            </a-col>
+                            <a-col :span="10">
+                                <a-input v-model="model.tableNoEnd" placeholder="结束序号"></a-input>
+                            </a-col>
+                        </a-row>
+                        
+                    </a-form-model-item>
+                </a-col>
+
+            </a-row>
+        </a-form-model>
+    </j-form-container>
+</a-spin>
+</template>
+
+<script>
+import {
+    httpAction,
+    getAction
+} from "@/api/manage";
+import {
+    validateDuplicateValue
+} from "@/utils/util";
+
+export default {
+    name: "PosTableForm",
+    components: {},
+    props: {
+        //表单禁用
+        disabled: {
+            type: Boolean,
+            default: false,
+            required: false,
+        },
+    },
+    data() {
+        return {
+            model: {},
+            labelCol: {
+                xs: {
+                    span: 24
+                },
+                sm: {
+                    span: 5
+                },
+            },
+            wrapperCol: {
+                xs: {
+                    span: 24
+                },
+                sm: {
+                    span: 16
+                },
+            },
+            confirmLoading: false,
+            validatorRules: {
+                tenantId: [{
+                    required: true,
+                    message: "请输入关联租户!"
+                }],
+                qz: [{
+                    required: true,
+                    message: "请输入餐桌名前缀!"
+                }],
+                hotelId: [{
+                    required: true,
+                    message: "请输入关联酒店!"
+                }],
+                name: [{
+                    required: true,
+                    message: "请输入餐桌名称!"
+                }],
+                posTypeId: [{
+                    required: true,
+                    message: "请输入pos类型id!"
+                }],
+                posTableTypeId: [{
+                    required: true,
+                    message: "请输入pos桌型id!"
+                }],
+                posRegionId: [{
+                    required: true,
+                    message: "请输入pos餐桌区域id!"
+                }],
+                num: [{
+                    required: true,
+                    message: "请输入座位数!"
+                }],
+                tableNo: [{
+                    required: true,
+                    message: "请输入餐桌序号!"
+                }],
+                state: [{
+                    required: true,
+                    message: "请输入状态!"
+                }],
+            },
+            url: {
+                add: "/pos/posTable/add",
+                edit: "/pos/posTable/edit",
+                queryById: "/pos/posTable/queryById",
+            },
+            posTypeList: [],
+            tableTypeList: [],
+            regionList: []
+        };
+    },
+    computed: {
+        formDisabled() {
+            return this.disabled;
+        },
+    },
+    created() {
+        var _info = JSON.parse(localStorage.getItem("storeInfo"));
+        if (_info) {
+            this.model.hotelId = _info.id;
+        }
+        //备份model原始值
+        this.modelDefault = JSON.parse(JSON.stringify(this.model));
+        getAction("/pos/posType/list", {
+            hotelId: _info.id,
+            pageNo: 1,
+            pageSize: 100,
+        }).then((res) => {
+            if (res.success) {
+                this.posTypeList = res.result.records;
+                this.model.posTypeId = this.posTypeList[0].id;
+            }
+        });
+        getAction("/pos/posTableType/list", {
+            hotelId: _info.id,
+            pageNo: 1,
+            pageSize: 100,
+        }).then((res) => {
+            if (res.success) {
+                this.tableTypeList = res.result.records;
+            }
+        });
+        getAction("/pos/posRegion/list", {
+            hotelId: _info.id,
+            pageNo: 1,
+            pageSize: 100,
+        }).then((res) => {
+            if (res.success) {
+                this.regionList = res.result.records;
+            }
+        });
+    },
+    methods: {
+        add() {
+            this.edit(this.modelDefault);
+        },
+        edit(record) {
+            this.model = Object.assign({}, record);
+            this.visible = true;
+        },
+        submitForm() {
+            const that = this;
+            // 触发表单验证
+            this.$refs.form.validate((valid) => {
+                if (valid) {
+                    // that.confirmLoading = true;
+                    let httpurl = "";
+                    let method = "";
+                    if (!this.model.id) {
+                        httpurl += this.url.add;
+                        method = "post";
+                    } else {
+                        httpurl += this.url.edit;
+                        method = "put";
+                    }
+                    let arr = [];
+                    let num = parseInt(this.model.tableNoEnd)
+                    this.model.tableNo = parseInt(this.model.tableNo)
+                    this.model.tableNoEnd = parseInt(this.model.tableNoEnd)
+
+                    console.log(typeof num);
+                    for(let i=0; i<num; i++){
+                        // console.log(i);
+                        arr.push({
+                            hotelId: this.model.hotelId,
+                            num: this.model.num,
+                            posRegionId: this.model.posRegionId,
+                            posTableTypeId: this.model.posTableTypeId,
+                            posTypeId: this.model.posTypeId,
+                            name: this.model.qz + (this.model.tableNo*1 + i*1),
+                            tableNo: (this.model.tableNo*1 + i*1),
+                        })
+                    }
+                    console.log(this.model);
+                    console.log(arr);
+                    // this.$emit("ok", arr);
+                    httpAction('/pos/posTable/addBatch', arr, 'post')
+                        .then((res) => {
+                            if (res.success) {
+                                that.$message.success(res.message);
+                                that.$emit("ok");
+                            } else {
+                                that.$message.warning(res.message);
+                            }
+                        })
+                        .finally(() => {
+                            that.confirmLoading = false;
+                        });
+                }
+            });
+        },
+    },
+};
+</script>

+ 60 - 0
src/views/settings/components/pos/modules/batchAddModal.vue

@@ -0,0 +1,60 @@
+<template>
+  <j-modal
+    :title="title"
+    :width="width"
+    :visible="visible"
+    switchFullscreen
+    @ok="handleOk"
+    :okButtonProps="{ class:{'jee-hidden': disableSubmit} }"
+    @cancel="handleCancel"
+    cancelText="关闭">
+    <pos-table-form ref="realForm" @ok="submitCallback" :disabled="disableSubmit"></pos-table-form>
+  </j-modal>
+</template>
+
+<script>
+
+  import PosTableForm from './batchAddForm.vue'
+  export default {
+    name: 'PosTableModal',
+    components: {
+      PosTableForm
+    },
+    data () {
+      return {
+        title:'',
+        width:800,
+        visible: false,
+        disableSubmit: false
+      }
+    },
+    methods: {
+      add () {
+        this.visible=true
+        this.$nextTick(()=>{
+          this.$refs.realForm.add();
+        })
+      },
+      edit (record) {
+        this.visible=true
+        this.$nextTick(()=>{
+          this.$refs.realForm.edit(record);
+        })
+      },
+      close () {
+        this.$emit('close');
+        this.visible = false;
+      },
+      handleOk () {
+        this.$refs.realForm.submitForm();
+      },
+      submitCallback(e){
+        this.$emit('ok', e);
+        this.visible = false;
+      },
+      handleCancel () {
+        this.close()
+      }
+    }
+  }
+</script>

+ 350 - 0
src/views/settings/components/pos/modules/classificationForm.vue

@@ -0,0 +1,350 @@
+<template>
+<div class="back">
+    <div class="back-right">
+        <a-card :bordered="false">
+            <!-- 查询区域 -->
+            <div class="table-page-search-wrapper">
+                <a-form layout="inline" @keyup.enter.native="searchQuery">
+                    <a-row :gutter="24">
+                        <a-col :span="4">
+                            <a-form-item label="">
+                                <j-input placeholder="商品名称" v-model="queryParam.name" style="width: 200px"></j-input>
+                            </a-form-item>
+                        </a-col>
+                        <a-col :md="13" :sm="8" style="display: flex; justify-content: space-around">
+                            <span style="float: left; overflow: hidden" class="table-page-search-submitButtons">
+                                <a-button type="primary" @click="searchQuery" icon="search">查询</a-button>
+                            </span>
+                        </a-col>
+                    </a-row>
+                </a-form>
+            </div>
+            <!-- 查询区域-END -->
+            <div>
+                <a-table ref="table" size="middle" bordered rowKey="id" :columns="columns" :dataSource="treeData" :pagination="ipagination" :loading="loading" :rowSelection="{
+              selectedRowKeys: selectedRowKeys,
+              onChange: onSelectChange,
+            }" class="j-table-force-nowrap" @change="handleTableChange">
+                    <span slot="state" slot-scope="record">
+                        {{ record ? "启用" : "停用" }}
+                        <!-- {{record}} -->
+                    </span>
+                    <span slot="action" slot-scope="text, record">
+                        <a @click="handleEdit(record)">修改</a>
+                        <a-divider type="vertical" />
+                        <a @click="moreSet(record)">更多设置</a>
+                        <a-divider type="vertical" />
+                        <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
+                            <a>删除</a>
+                        </a-popconfirm>
+                    </span>
+                </a-table>
+            </div>
+        </a-card>
+    </div>
+</div>
+</template>
+
+<script>
+import {
+    tree,
+    delTree,
+    goodBatchDel,
+    goodSet
+} from "@/api/good";
+import {
+    JeecgListMixin
+} from "@/mixins/JeecgListMixin";
+import {
+    computed
+} from "vue";
+import {
+    httpAction,
+    getAction,
+    postAction
+} from "@/api/manage";
+const tabListNoTitle = [{
+        key: "commodity",
+        tab: "商品小程序设置",
+    },
+    {
+        key: "goodImg",
+        tab: "商品图片",
+    },
+    {
+        key: "project",
+        tab: "餐饮设置",
+    },
+    {
+        key: "game",
+        tab: "娱乐设置",
+    },
+];
+export default {
+    name: "goodList",
+    mixins: [JeecgListMixin],
+    components: {
+    },
+    data() {
+        return {
+            treeData: [],
+            key: "tab1",
+            noTitleKey: "commodity",
+
+            checkedKeys: [""],
+            tabListNoTitle,
+            selectedKeys: [],
+            queryParam: {},
+            //单位对话框
+            unitVisible: false,
+            // 分页参数
+            ipagination: {
+                current: 1,
+                pageSize: 10,
+                pageSizeOptions: ["10", "20", "30"],
+                showTotal: (total, range) => {
+                    return range[0] + "-" + range[1] + " 共" + total + "条";
+                },
+                showQuickJumper: true,
+                showSizeChanger: true,
+                total: 0,
+            },
+            // 表头
+            columns: [{
+                    title: "分类名称",
+                    align: "center",
+                    dataIndex: "name",
+                },
+                {
+                    title: "分类编码",
+                    align: "center",
+                    dataIndex: "id",
+                },
+                // {
+                //     title: "售价",
+                //     align: "center",
+                //     dataIndex: "sellingPrice",
+                // },
+                // {
+                //     title: "库存量",
+                //     align: "center",
+                //     dataIndex: "inventory",
+                // },
+            ],
+            url: {
+                // list: 'org.jeecg.modules.business/busMarketMember/list',
+                list: "/rooms/cesGoods/list",
+                // list: "/rooms/cesRoomLayout/list?hotelId",
+                // delete: "/rooms/cesRoomLayout/remove",
+                delete: "/rooms/cesGoods/delete",
+                // deleteBatch: "/rooms/cesRoomLayout/deleteBatch",
+                deleteBatch: "/rooms/cesGoods/delBatch",
+                exportXlsUrl: "/rooms/cesRoomLayout/exportXls",
+                importExcelUrl: "rooms/cesRoomLayout/importExcel",
+            },
+            dictOptions: {},
+            superFieldList: [],
+            selectedRowKeys: [],
+            isorter: {
+                column: "createTime",
+                order: "desc",
+            },
+            stockTypeVisible: false,
+            // 选中的数据
+            beforeTree: null,
+            goodsSetVisible: false, //进退货弹窗
+            moreSetVisible: false, //更多设置弹窗
+            goodsSetData: {
+                number: 0,
+                type: 1,
+            },
+            model: {
+                hotelId: ""
+            },
+        };
+    },
+    computed: {},
+    watch: {},
+    created() {
+        this.loadTree();
+    },
+    // provide() {
+    //     return {
+    //         beforeTree: computed(() =>
+    //             this.beforeTree ? this.beforeTree : {
+    //                 id: "0"
+    //             }
+    //         ),
+    //         treeData: computed(() => this.treeData),
+    //         dataSource: computed(() => this.dataSource),
+    //     };
+    // },
+    methods: {
+        submitForm() {
+            this.$emit("ok", this.selectionRows);
+        },
+        edit(record) {
+            this.model = Object.assign({}, record);
+            this.visible = true;
+        },
+        loadTree() {
+            var that = this;
+            tree().then((res) => {
+                if (res.success) {
+                    this.treeData = res.result;
+                }
+            });
+        },
+        onExpand(expandedKeys) {
+            console.log("onExpand", expandedKeys);
+            // if not set autoExpandParent to false, if children expanded, parent can not collapse.
+            // or, you can remove all expanded children keys.
+        },
+        onSelect(selectedKeys, info) {
+            console.log("onSelect", info);
+            this.selectedKeys = selectedKeys;
+        },
+        /**
+         * 保存成功
+         */
+        onSave() {
+            this.loadTree();
+        },
+        /**
+         * 删除
+         */
+        confirmDel(id) {
+            delTree({
+                id: id
+            }).then((res) => {
+                if (res.code && res.code == 200) {
+                    this.$message.success("删除成功");
+                    this.loadTree();
+                }
+            });
+        },
+        //批量删除
+        goodBatchDel() {
+            console.log(this.selectedRowKeys);
+            if (this.selectedRowKeys.length == 0) {
+                this.$message.info("请先选择要删除的数据");
+                return;
+            }
+            this.$confirm({
+                title: "提示",
+                content: "确认要删除吗",
+                okText: "确认",
+                cancelText: "取消",
+                onOk: (e) => {
+                    return goodBatchDel({
+                        idStr: this.selectedRowKeys.toString()
+                    }).then(
+                        (res) => {
+                            if (res.code && res.code == 200) {
+                                this.$message.success(res.message);
+                                this.loadData();
+                            } else {
+                                this.$message.error(res.message);
+                            }
+                        }
+                    );
+                },
+            });
+        },
+        //单位设置区域
+        handleOk(e) {
+            // this.confirmLoading = true;
+            // setTimeout(() => {
+            //     this.visible = false;
+            //     this.confirmLoading = false;
+            // }, 2000);
+            this.unitVisible = false;
+        },
+        handleCancel(e) {
+            console.log("Clicked cancel button", e);
+            this.unitVisible = false;
+        },
+        /**
+         * 进退货
+         */
+        goodsSet() {
+            this.goodsSetData = this.dataSource.filter(
+                (item) => item.id == this.selectedRowKeys.toString()
+            )[0];
+            console.log(this.goodsSetData);
+            this.goodsSetVisible = true;
+        },
+        goodChange(e) {
+            console.log(e);
+            this.goodsSetData.type = e.target.value;
+        },
+        //更多设置
+        moreSet(record) {
+            console.log(this.$refs.modalSet);
+            this.$refs.modalSet.edit(record);
+            this.$refs.modalForm.disableSubmit = false;
+            // this.moreSetVisible = true
+        },
+        //更多设置确认
+        handleMoreSetOk() {},
+        //更多设置切换卡片
+        onTabChange(key, type) {
+            console.log(key, type);
+            this[type] = key;
+        },
+
+        //进退货确认事件
+        handleGoodOk() {
+            console.log(this.goodsSetData);
+            if (!this.goodsSetData.type) {
+                this.goodsSetData.type = 1;
+            }
+            let obj = {
+                hotelId: this.goodsSetData.hotelId,
+                goodId: this.goodsSetData.id,
+                type: this.goodsSetData.type,
+                goodNum: this.goodsSetData.goodNum,
+                remark: this.goodsSetData.remark ? this.goodsSetData.remark : "",
+            };
+            // this.goodsSetData.goodId = this.goodsSetData.id
+            goodSet(obj).then((res) => {
+                if (res.code && res.code == 200) {
+                    this.$message.success(res.message);
+                    this.goodsSetVisible = false;
+                    // this.goodsSetData = {}
+                    this.loadData();
+                } else {
+                    this.$message.error(res.message);
+                }
+            });
+        },
+        //进退货取消
+        handleGoodCancel() {
+            this.goodsSetVisible = false;
+        },
+    },
+};
+</script>
+
+<style scoped>
+.back {
+    display: flex;
+    justify-content: space-between;
+}
+
+.back-left {
+    /* flex: 1 */
+}
+
+.back-right {
+    flex: 1;
+}
+
+.ant-tree li .ant-tree-node-content-wrapper {
+    height: auto !important;
+}
+
+.ant-tree li .ant-tree-node-content-wrapper.ant-tree-node-selected {
+    background-color: #bae7ff33;
+}
+</style>

+ 65 - 0
src/views/settings/components/pos/modules/classificationModal.vue

@@ -0,0 +1,65 @@
+<template>
+  <j-modal
+    :title="title"
+    :width="width"
+    :visible="visible"
+    switchFullscreen
+    @ok="handleOk"
+    :okButtonProps="{ class: { 'jee-hidden': disableSubmit } }"
+    @cancel="handleCancel"
+    cancelText="关闭"
+  >
+    <stock-type-form
+      ref="realForm"
+      @ok="submitCallback"
+      :disabled="disableSubmit"
+    ></stock-type-form>
+  </j-modal>
+</template>
+
+  
+<script>
+import stockTypeForm from "./classificationForm.vue";
+export default {
+  name: "stockTypeModel",
+  components: {
+    stockTypeForm,
+  },
+  data() {
+    return {
+      title: "",
+      width: 1200,
+      visible: false,
+      disableSubmit: false,
+    };
+  },
+  methods: {
+    add() {
+      this.visible = true;
+      this.$nextTick(() => {
+        this.$refs.realForm.add();
+      });
+    },
+    edit(record) {
+      this.visible = true;
+      this.$nextTick(() => {
+        this.$refs.realForm.edit(record);
+      });
+    },
+    close() {
+      this.$emit("close");
+      this.visible = false;
+    },
+    handleOk() {
+      this.$refs.realForm.submitForm();
+    },
+    submitCallback(e) {
+      this.$emit("ok", e);
+      this.visible = false;
+    },
+    handleCancel() {
+      this.close();
+    },
+  },
+};
+</script>

+ 214 - 0
src/views/settings/components/pos/modules/posFeedingSetForm.vue

@@ -0,0 +1,214 @@
+<template>
+<a-spin :spinning="confirmLoading">
+    <j-form-container :disabled="formDisabled">
+        <a-form-model ref="form" :model="model" :rules="validatorRules" slot="detail">
+            <a-row>
+                <a-col :span="24">
+                    <a-form-model-item label="加料名称" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="name">
+                        <a-input v-model="model.name" placeholder="请输入加料名称"></a-input>
+                    </a-form-model-item>
+                </a-col>
+                <a-col :span="24">
+                    <a-form-model-item label="加料金额" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="money">
+                        <a-input-number v-model="model.money" placeholder="请输入加料金额" style="width: 100%" />
+                    </a-form-model-item>
+                </a-col>
+                <!-- <a-col :span="24">
+                    <a-form-model-item label="备注" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="">
+                        <a-input v-model="model.remark" placeholder="请输入备注"></a-input>
+                    </a-form-model-item>
+                </a-col> -->
+
+                <a-col :span="24">
+                    <a-form-model-item label="是否启用" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="state">
+                        <a-switch v-model="model.state" checked-children="启用" un-checked-children="禁用" />
+                    </a-form-model-item>
+                </a-col>
+
+                <!-- <a-col :span="24">
+                    <a-form-model-item label="应用范围" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="type">
+                        <a-radio-group :options="options" v-model="model.type" @change="onChange" />
+                    </a-form-model-item>
+                </a-col> -->
+            </a-row>
+        </a-form-model>
+    </j-form-container>
+</a-spin>
+</template>
+
+<script>
+import {
+    httpAction,
+    getAction
+} from "@/api/manage";
+import {
+    validateDuplicateValue
+} from "@/utils/util";
+
+export default {
+    name: "PosTableForm",
+    components: {},
+    props: {
+        //表单禁用
+        disabled: {
+            type: Boolean,
+            default: false,
+            required: false,
+        },
+    },
+    data() {
+        return {
+            options: [{
+                    label: '全部菜品',
+                    value: 0
+                },
+                {
+                    label: '菜品分类',
+                    value: 1
+                },
+                {
+                    label: '菜品',
+                    value: 2
+                },
+            ],
+            value: 1,
+            model: {
+                state:false,
+                type:0,
+                // detailList:[],
+                // remark:"",
+                // id:''
+            },
+            labelCol: {
+                xs: {
+                    span: 24
+                },
+                sm: {
+                    span: 5
+                },
+            },
+            wrapperCol: {
+                xs: {
+                    span: 24
+                },
+                sm: {
+                    span: 16
+                },
+            },
+            confirmLoading: false,
+            validatorRules: {
+                name: [{
+                    required: true,
+                    message: "请输入口味名称!"
+                }],
+                money: [{
+                    required: true,
+                    message: "请输入金额!"
+                }],
+                state: [{
+                    required: true,
+                    message: "请选择是否开启!"
+                }],
+                type: [{
+                    required: true,
+                    message: "请选择应用范围!"
+                }],
+            },
+            url: {
+                add: "/pos/posJialiaoConfig/add",
+                edit: "/pos/posJialiaoConfig/edit",
+                queryById: "/pos/posTable/queryById",
+            },
+            posTypeList: [],
+            tableTypeList: [],
+            regionList: []
+        };
+    },
+    computed: {
+        formDisabled() {
+            return this.disabled;
+        },
+    },
+    created() {
+        var _info = JSON.parse(localStorage.getItem("storeInfo"));
+        if (_info) {
+            this.model.hotelId = _info.id;
+        }
+        //备份model原始值
+        this.modelDefault = JSON.parse(JSON.stringify(this.model));
+        getAction("/pos/posType/list", {
+            hotelId: _info.id,
+            pageNo: 1,
+            pageSize: 100,
+        }).then((res) => {
+            if (res.success) {
+                this.posTypeList = res.result.records;
+            }
+        });
+        getAction("/pos/posTableType/list", {
+            hotelId: _info.id,
+            pageNo: 1,
+            pageSize: 100,
+        }).then((res) => {
+            if (res.success) {
+                this.tableTypeList = res.result.records;
+            }
+        });
+        getAction("/pos/posRegion/list", {
+            hotelId: _info.id,
+            pageNo: 1,
+            pageSize: 100,
+        }).then((res) => {
+            if (res.success) {
+                this.regionList = res.result.records;
+            }
+        });
+    },
+    methods: {
+        onChange(e){
+            console.log(e);
+        },
+        add() {
+            this.edit(this.modelDefault);
+        },
+        edit(record) {
+            console.log(record);
+            this.model = Object.assign({}, record);
+            this.visible = true;
+        },
+        submitForm() {
+            const that = this;
+            // 触发表单验证
+            this.$refs.form.validate((valid) => {
+                if (valid) {
+                    that.confirmLoading = true;
+                    let httpurl = "";
+                    let method = "";
+                    if (!this.model.id) {
+                        httpurl += this.url.add;
+                        method = "post";
+                    } else {
+                        httpurl += this.url.edit;
+                        method = "put";
+                    }
+                    // this.model.state = this.model.status ? 1 : 0;
+                    this.model.money = parseInt(this.model.money)
+                    console.log(this.model);
+                    httpAction(httpurl, this.model, method)
+                        .then((res) => {
+                            if (res.success) {
+                                that.$message.success(res.message);
+                                that.$emit("ok");
+                            } else {
+                                that.$message.warning(res.message);
+                            }
+                        })
+                        .finally(() => {
+                            that.confirmLoading = false;
+                        });
+                }
+            });
+        },
+    },
+};
+</script>

+ 60 - 0
src/views/settings/components/pos/modules/posFeedingSetModal.vue

@@ -0,0 +1,60 @@
+<template>
+  <j-modal
+    :title="title"
+    :width="width"
+    :visible="visible"
+    switchFullscreen
+    @ok="handleOk"
+    :okButtonProps="{ class:{'jee-hidden': disableSubmit} }"
+    @cancel="handleCancel"
+    cancelText="关闭">
+    <posFeedingSetForm ref="realForm" @ok="submitCallback" :disabled="disableSubmit"></posFeedingSetForm>
+  </j-modal>
+</template>
+
+<script>
+
+  import posFeedingSetForm from './posFeedingSetForm.vue'
+  export default {
+    name: 'PosTableTypeModal',
+    components: {
+      posFeedingSetForm
+    },
+    data () {
+      return {
+        title:'',
+        width:800,
+        visible: false,
+        disableSubmit: false
+      }
+    },
+    methods: {
+      add () {
+        this.visible=true
+        this.$nextTick(()=>{
+          this.$refs.realForm.add();
+        })
+      },
+      edit (record) {
+        this.visible=true
+        this.$nextTick(()=>{
+          this.$refs.realForm.edit(record);
+        })
+      },
+      close () {
+        this.$emit('close');
+        this.visible = false;
+      },
+      handleOk () {
+        this.$refs.realForm.submitForm();
+      },
+      submitCallback(){
+        this.$emit('ok');
+        this.visible = false;
+      },
+      handleCancel () {
+        this.close()
+      }
+    }
+  }
+</script>

+ 367 - 0
src/views/settings/components/pos/modules/posTasteForm.vue

@@ -0,0 +1,367 @@
+<template>
+<a-spin :spinning="confirmLoading">
+    <j-form-container :disabled="formDisabled">
+        <a-form-model ref="form" :model="model" :rules="validatorRules" slot="detail">
+            <a-row>
+                <a-col :span="24">
+                    <a-form-model-item label="口味名称" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="name">
+                        <a-input v-model="model.name" placeholder="请输入口味名称"></a-input>
+                    </a-form-model-item>
+                </a-col>
+                <a-col :span="24">
+                    <a-form-model-item label="加价金额" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="money">
+                        <a-input-number v-model="model.money" placeholder="请输入加价金额" style="width: 100%" />
+                    </a-form-model-item>
+                </a-col>
+                <a-col :span="24">
+                    <a-form-model-item label="备注" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="">
+                        <a-input v-model="model.remark" placeholder="请输入备注"></a-input>
+                    </a-form-model-item>
+                </a-col>
+
+                <a-col :span="24">
+                    <a-form-model-item label="是否开启" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="state">
+                        <a-switch v-model="model.state" checked-children="启用" un-checked-children="禁用" />
+                    </a-form-model-item>
+                </a-col>
+
+                <a-col :span="24">
+                    <a-form-model-item label="应用范围" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="type">
+                        <a-radio-group :options="options" v-model="model.type" @change="onChange" />
+                    </a-form-model-item>
+                </a-col>
+            </a-row>
+
+            <a-col :span="24" v-if="model.type==1">
+                <a-button @click="handleAddClass" type="primary" icon="plus">选择分类</a-button>
+                <a-table :columns="columnsTwo" :data-source="model.detailListClass || []" :pagination="false" rowKey="id">
+                    <template slot="num" slot-scope="text, record, index">
+                        <div>
+                            <a-input-number v-model="record.num" :min="1" :max="99" />
+                        </div>
+                    </template>
+                    <template slot="required" slot-scope="text, record, index">
+                        <div>
+                            <a-switch v-model="record.required" />
+                        </div>
+                    </template>
+
+                    <span slot="action" slot-scope="text, record, index">
+                        <a @click="handleDeleteClass(index)">删除</a>
+                    </span>
+                </a-table>
+            </a-col>
+
+            <a-col :span="24" v-if="model.type==2">
+                <a-button @click="handleAdd" type="primary" icon="plus">选择商品</a-button>
+                <a-table :columns="columns" :data-source="model.detailList || []" :pagination="false" rowKey="id">
+                    <template slot="num" slot-scope="text, record, index">
+                        <div>
+                            <a-input-number v-model="record.num" :min="1" :max="99" />
+                        </div>
+                    </template>
+                    <template slot="required" slot-scope="text, record, index">
+                        <div>
+                            <a-switch v-model="record.required" />
+                        </div>
+                    </template>
+
+                    <span slot="action" slot-scope="text, record, index">
+                        <a @click="handleDelete(index)">删除</a>
+                    </span>
+                </a-table>
+            </a-col>
+        </a-form-model>
+    </j-form-container>
+    <select-goods-modal ref="modalForm2" @ok="modalFormOk"></select-goods-modal>
+    <classificationModal ref="modalForm3" @ok="modalFormOkClass" />
+</a-spin>
+</template>
+
+<script>
+import {
+    httpAction,
+    getAction
+} from "@/api/manage";
+import {
+    validateDuplicateValue
+} from "@/utils/util";
+import SelectGoodsModal from "./SelectGoodsModal";
+import classificationModal from './classificationModal.vue';
+const columns = [{
+        title: "商品名称",
+        dataIndex: "name",
+    },
+    {
+        title: "商品条码",
+        dataIndex: "barCode",
+    },
+    {
+        title: "库存",
+        dataIndex: "inventory",
+    },
+    {
+        title: "操作",
+        dataIndex: "action",
+        align: "center",
+        fixed: "right",
+        width: 70,
+        scopedSlots: {
+            customRender: "action"
+        },
+    },
+];
+
+const columnsTwo = [{
+        title: "分类名称",
+        dataIndex: "name",
+    },
+    {
+        title: "分类编号",
+        dataIndex: "id",
+    },
+    {
+        title: "操作",
+        dataIndex: "action",
+        align: "center",
+        fixed: "right",
+        width: 70,
+        scopedSlots: {
+            customRender: "action"
+        },
+    },
+]
+export default {
+    name: "PosTableForm",
+    components: {
+        SelectGoodsModal,
+        classificationModal
+    },
+    props: {
+        //表单禁用
+        disabled: {
+            type: Boolean,
+            default: false,
+            required: false,
+        },
+    },
+    data() {
+        return {
+            //分类弹窗
+            classification: false,
+
+            columns,
+            columnsTwo,
+            options: [{
+                    label: '全部菜品',
+                    value: 0
+                },
+                {
+                    label: '菜品分类',
+                    value: 1
+                },
+                {
+                    label: '菜品',
+                    value: 2
+                },
+            ],
+            value: 1,
+            model: {
+                state: false,
+                type: 0,
+                detailList: [],
+                detailListClass:[],
+                remark: "",
+                id: ''
+            },
+            labelCol: {
+                xs: {
+                    span: 24
+                },
+                sm: {
+                    span: 5
+                },
+            },
+            wrapperCol: {
+                xs: {
+                    span: 24
+                },
+                sm: {
+                    span: 16
+                },
+            },
+            confirmLoading: false,
+            validatorRules: {
+                name: [{
+                    required: true,
+                    message: "请输入口味名称!"
+                }],
+                money: [{
+                    required: true,
+                    message: "请输入金额!"
+                }],
+                state: [{
+                    required: true,
+                    message: "请选择是否开启!"
+                }],
+                type: [{
+                    required: true,
+                    message: "请选择应用范围!"
+                }],
+            },
+            url: {
+                add: "/pos/posKwConfig/add",
+                edit: "/pos/posKwConfig/edit",
+                queryById: "/pos/posTable/queryById",
+            },
+            posTypeList: [],
+            tableTypeList: [],
+            regionList: []
+        };
+    },
+    computed: {
+        formDisabled() {
+            return this.disabled;
+        },
+    },
+    created() {
+        var _info = JSON.parse(localStorage.getItem("storeInfo"));
+        if (_info) {
+            this.model.hotelId = _info.id;
+        }
+        //备份model原始值
+        this.modelDefault = JSON.parse(JSON.stringify(this.model));
+        // getAction("/pos/posType/list", {
+        //     hotelId: _info.id,
+        //     pageNo: 1,
+        //     pageSize: 100,
+        // }).then((res) => {
+        //     if (res.success) {
+        //         this.posTypeList = res.result.records;
+        //     }
+        // });
+        // getAction("/pos/posTableType/list", {
+        //     hotelId: _info.id,
+        //     pageNo: 1,
+        //     pageSize: 100,
+        // }).then((res) => {
+        //     if (res.success) {
+        //         this.tableTypeList = res.result.records;
+        //     }
+        // });
+        // getAction("/pos/posRegion/list", {
+        //     hotelId: _info.id,
+        //     pageNo: 1,
+        //     pageSize: 100,
+        // }).then((res) => {
+        //     if (res.success) {
+        //         this.regionList = res.result.records;
+        //     }
+        // });
+    },
+    methods: {
+
+        handleAddClass() {
+            this.$refs.modalForm3.edit({
+                formThali: true,
+            });
+            this.$refs.modalForm2.title = "分类选择";
+            this.$refs.modalForm2.disableSubmit = false;
+        },
+        modalFormOkClass(e){
+            console.log("e", e);
+            //判断两个数组中是否有id相同的元素
+            if (this.model.detailListClass.some((t) => e.some((ele) => ele.id == t.id))) {
+                this.$message.warning("请勿重复添加");
+                return;
+            }
+            this.model.detailListClass = this.model.detailListClass.concat(e);
+        },
+
+        onChange(e) {
+            console.log(e);
+        },
+        add() {
+            this.edit(this.modelDefault);
+        },
+        edit(record) {
+            console.log(record);
+            this.model = Object.assign({}, record);
+            this.visible = true;
+        },
+        submitForm() {
+            const that = this;
+            // 触发表单验证
+            this.$refs.form.validate((valid) => {
+                if (valid) {
+                    that.confirmLoading = true;
+                    let httpurl = "";
+                    let method = "";
+                    if (!this.model.id) {
+                        httpurl += this.url.add;
+                        method = "post";
+                    } else {
+                        httpurl += this.url.edit;
+                        method = "put";
+                    }
+                    // this.model.state = this.model.status ? 1 : 0;
+                    this.model.money = parseInt(this.model.money)
+                    if (this.model.type==0) {
+                        this.model.detailList = []
+                    }
+                    if (this.model.type==1) {
+                        this.model.detailList = this.model.detailListClass.map(item=>({
+                            goodsId:item.id
+                        }))
+                    }
+                    if (this.model.type==2) {
+                        this.model.detailList = this.model.detailList.map(item=>({
+                            goodsId:item.id
+                        }))
+                    }
+                    console.log(this.model);
+                    httpAction(httpurl, this.model, method)
+                        .then((res) => {
+                            if (res.success) {
+                                that.$message.success(res.message);
+                                that.$emit("ok");
+                            } else {
+                                that.$message.warning(res.message);
+                            }
+                        })
+                        .finally(() => {
+                            that.confirmLoading = false;
+                        });
+                }
+            });
+        },
+
+        handleAdd() {
+            this.$refs.modalForm2.edit({
+                formThali: true,
+            });
+            this.$refs.modalForm2.title = "商品选择";
+            this.$refs.modalForm2.disableSubmit = false;
+        },
+        modalFormOk(e) {
+            console.log("e", e);
+            e.forEach((t) => {
+                this.$set(t, "required", false);
+                this.$set(t, "num", 1);
+            });
+            //判断两个数组中是否有id相同的元素
+            if (this.model.detailList.some((t) => e.some((ele) => ele.id == t.id))) {
+                this.$message.warning("请勿重复添加");
+                return;
+            }
+            this.model.detailList = this.model.detailList.concat(e);
+        },
+        handleDelete(index) {
+            this.model.detailList.splice(index, 1);
+        },
+        handleDeleteClass(index){
+            this.model.detailListClass.splice(index, 1);
+        }
+    },
+};
+</script>

+ 60 - 0
src/views/settings/components/pos/modules/posTasteModal.vue

@@ -0,0 +1,60 @@
+<template>
+  <j-modal
+    :title="title"
+    :width="width"
+    :visible="visible"
+    switchFullscreen
+    @ok="handleOk"
+    :okButtonProps="{ class:{'jee-hidden': disableSubmit} }"
+    @cancel="handleCancel"
+    cancelText="关闭">
+    <PosTasteForm ref="realForm" @ok="submitCallback" :disabled="disableSubmit"></PosTasteForm>
+  </j-modal>
+</template>
+
+<script>
+
+  import PosTasteForm from './posTasteForm.vue'
+  export default {
+    name: 'PosTableTypeModal',
+    components: {
+      PosTasteForm
+    },
+    data () {
+      return {
+        title:'',
+        width:800,
+        visible: false,
+        disableSubmit: false
+      }
+    },
+    methods: {
+      add () {
+        this.visible=true
+        this.$nextTick(()=>{
+          this.$refs.realForm.add();
+        })
+      },
+      edit (record) {
+        this.visible=true
+        this.$nextTick(()=>{
+          this.$refs.realForm.edit(record);
+        })
+      },
+      close () {
+        this.$emit('close');
+        this.visible = false;
+      },
+      handleOk () {
+        this.$refs.realForm.submitForm();
+      },
+      submitCallback(){
+        this.$emit('ok');
+        this.visible = false;
+      },
+      handleCancel () {
+        this.close()
+      }
+    }
+  }
+</script>

+ 297 - 229
src/views/settings/components/pos/posSellClearGoods.vue

@@ -1,255 +1,323 @@
 <template>
-  <a-card :bordered="false">
-    <!-- 查询区域 -->
-    <div class="table-page-search-wrapper">
-      <a-form layout="inline" @keyup.enter.native="searchQuery">
-        <a-row :gutter="24">
-          <a-col :span="6">
-            <a-tree-select
-              v-model="queryParam.goodType"
-              :tree-data="treeData"
-              :replaceFields="{
+<a-card :bordered="false">
+    <a-row type="flex" :gutter="16" class="container">
+        <a-col :md="5" :sm="24">
+            <!-- <dictionary-info-left v-model="currentOrgCode" /> -->
+            <div v-if="selectGoods">
+                <div class="sell-clear-top">
+                    <div>
+                        {{selectGoods.name}}
+                    </div>
+                    <div>
+                        <a-button v-if="!selectGoods.isSellClear" @click="handleAdd">立即沽清</a-button>
+                        <a-button v-else @click="handleDelete">取消沽清</a-button>
+                    </div>
+                </div>
+
+                <a-space direction="vertical" size="large">
+                    <a-checkbox v-model="isSellClear" @change="isOnChange">
+                        启用自动沽清
+                    </a-checkbox>
+                    <template v-if="isSellClear">
+                        <a-radio-group v-model="value" @change="onChangeKC">
+                            <a-radio :style="radioStyle" :value="1">
+                                按库存沽清
+                            </a-radio>
+                            <a-radio :style="radioStyle" :value="2">
+                                按数量沽清
+                            </a-radio>
+                        </a-radio-group>
+                        <div>
+                            数量:
+                            <a-input-number v-model="selectGoods.num" :min="1" :max="100" />
+                        </div>
+                        <div>
+                            当前剩余: {{selectGoods.inventory}}份
+                        </div>
+                        <a-radio-group v-model="values" @change="onChangeDay">
+                            <a-radio :value="1">
+                                每天有效
+                            </a-radio>
+                            <a-radio :value="2">
+                                总数量有效
+                            </a-radio>
+                        </a-radio-group>
+                        <a-button type="primary" @click="()=>{ this.$message.success('成功'); this.selectGoods = null;this.isSellClear = false }">启用</a-button>
+                    </template>
+
+                </a-space>
+            </div>
+        </a-col>
+        <a-col :md="24-5" :sm="24">
+            <!-- 查询区域 -->
+            <div class="table-page-search-wrapper">
+                <a-form layout="inline" @keyup.enter.native="searchQuery">
+                    <a-row :gutter="24">
+                        <a-col :span="6">
+                            <a-tree-select v-model="queryParam.goodType" :tree-data="treeData" :replaceFields="{
                 children: 'children',
                 title: 'name',
                 key: 'id',
                 value: 'id',
-              }"
-              placeholder="商品分类"
-            />
-          </a-col>
-          <a-col :md="6" :sm="8">
-            <span
-              style="float: left; overflow: hidden"
-              class="table-page-search-submitButtons"
-            >
-              <a-button type="primary" @click="searchQuery" icon="search"
-                >查询</a-button
-              >
-              <a-button
-                type="primary"
-                @click="searchReset"
-                icon="reload"
-                style="margin-left: 8px"
-                >重置</a-button
-              >
-            </span>
-          </a-col>
-        </a-row>
-      </a-form>
-    </div>
-    <!-- 查询区域-END -->
-
-    <!-- 操作按钮区域 -->
-    <div class="table-operator">
-      <a-button @click="handleAdd">立即沽清</a-button>
-      <a-button @click="handleDelete">取消沽清</a-button>
-    </div>
+              }" placeholder="商品分类" />
+                        </a-col>
+                        <a-col :md="6" :sm="8">
+                            <span style="float: left; overflow: hidden" class="table-page-search-submitButtons">
+                                <a-button type="primary" @click="searchQuery" icon="search">查询</a-button>
+                                <a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">重置</a-button>
+                            </span>
+                        </a-col>
+                    </a-row>
+                </a-form>
+            </div>
+            <!-- 查询区域-END -->
 
-    <div>
-      <a-row :gutter="[5, 5]">
-        <a-col
-          v-for="item in dataSource"
-          :key="item.id"
-          :span="2"
-          @click.stop="itemClick(item)"
-        >
-          <div
-            class="room-item"
-            :class="item.sort == 888888 ? 'check' : ''"
-            :style="{
-              background: item.isSellClear ? 'grey' : 'goldenrod',
-            }"
-          >
-            <div>{{ item.name }}</div>
-            <div style="margin-top: 20px">
-              ¥{{ item.sellingPrice.toFixed(2) }}
+            <!-- 操作按钮区域 -->
+            <div class="table-operator">
+                <a-button @click="handleAdd">立即沽清</a-button>
+                <a-button @click="handleDelete">取消沽清</a-button>
             </div>
-            <div
-              v-if="item.isSellClear"
-              style="display: flex; justify-content: right"
-            >
-              <a-tag color="#f50"> 沽清 </a-tag>
+
+            <div>
+                <a-row :gutter="[5, 5]">
+                    <a-col v-for="item in dataSource" :key="item.id" :span="2" @click.stop="itemClick(item)">
+                        <div class="room-item" :class="item.sort == 888888 ? 'check' : ''" :style="{background: item.isSellClear ? 'grey' : 'goldenrod',}">
+                            <div>{{ item.name }}</div>
+                            <div style="margin-top: 20px">
+                                ¥{{ item.sellingPrice.toFixed(2) }}
+                            </div>
+                            <div v-if="item.isSellClear" style="display: flex; justify-content: right">
+                                <a-tag color="#f50"> 沽清 </a-tag>
+                            </div>
+                        </div>
+                    </a-col>
+                </a-row>
             </div>
-          </div>
         </a-col>
-      </a-row>
-    </div>
+    </a-row>
 
     <pos-region-modal ref="modalForm" @ok="modalFormOk"></pos-region-modal>
-  </a-card>
+</a-card>
 </template>
-  
-  <script>
-import { JeecgListMixin } from "@/mixins/JeecgListMixin";
+
+<script>
+import {
+    JeecgListMixin
+} from "@/mixins/JeecgListMixin";
 import PosRegionModal from "./modules/PosRegionModal";
-import { filterObj } from "@/utils/util";
-import { getAction, postAction, deleteAction } from "@/api/manage";
-import { tree } from "@/api/good";
+import {
+    filterObj
+} from "@/utils/util";
+import {
+    getAction,
+    postAction,
+    deleteAction
+} from "@/api/manage";
+import {
+    tree
+} from "@/api/good";
 export default {
-  name: "memberList",
-  mixins: [JeecgListMixin],
-  components: {
-    PosRegionModal,
-  },
-  data() {
-    return {
-      sellClear: 0,
-      queryParam: {},
-      // 分页参数
-      ipagination: {
-        current: 1,
-        pageSize: 99999,
-        pageSizeOptions: ["10", "20", "30"],
-        showTotal: (total, range) => {
-          return range[0] + "-" + range[1] + " 共" + total + "条";
+    name: "memberList",
+    mixins: [JeecgListMixin],
+    components: {
+        PosRegionModal,
+    },
+    data() {
+        return {
+            isSellClear: false,
+            sellClear: 0,
+            sellClearNum: 10,
+            value: 1,
+            values: 1,
+            radioStyle: {
+                display: 'block',
+                height: '30px',
+                lineHeight: '30px',
+            },
+            queryParam: {},
+            // 分页参数
+            ipagination: {
+                current: 1,
+                pageSize: 99999,
+                pageSizeOptions: ["10", "20", "30"],
+                showTotal: (total, range) => {
+                    return range[0] + "-" + range[1] + " 共" + total + "条";
+                },
+                showQuickJumper: true,
+                showSizeChanger: true,
+                total: 0,
+            },
+            // 表头
+            columns: [{
+                    title: "pos类型",
+                    align: "center",
+                    dataIndex: "typeName",
+                },
+                {
+                    title: "区域名称",
+                    align: "center",
+                    dataIndex: "name",
+                },
+                {
+                    title: "操作",
+                    dataIndex: "action",
+                    align: "center",
+                    fixed: "right",
+                    width: 147,
+                    scopedSlots: {
+                        customRender: "action"
+                    },
+                },
+            ],
+            url: {
+                list: "/pos/posSellClearGoods/list2",
+                delete: "/pos/posSellClearGoods/delete",
+                deleteBatch: "/pos/posSellClearGoods/deleteBatch",
+                exportXlsUrl: "/pos/posSellClearGoods/exportXls",
+                importExcelUrl: "pos/posSellClearGoods/importExcel",
+            },
+            dictOptions: {},
+            superFieldList: [],
+            selectedRowKeys: [],
+            isorter: {
+                column: "createTime",
+                order: "desc",
+            },
+            treeData: [],
+            selectGoods: null,
+        };
+    },
+    created() {
+        this.loadTree();
+    },
+    methods: {
+
+        isOnChange(e) {
+            console.log(e);
         },
-        showQuickJumper: true,
-        showSizeChanger: true,
-        total: 0,
-      },
-      // 表头
-      columns: [
-        {
-          title: "pos类型",
-          align: "center",
-          dataIndex: "typeName",
+        onChangeKC() {},
+        onChangeDay() {},
+
+        handleDelete() {
+
+            let selectArr = this.dataSource.filter((t) => t.sort == 888888)
+            if (!selectArr.length) {
+                this.$message.warning("请选择取消沽清商品");
+                return
+            }
+            if (selectArr.some(ele => !ele.isSellClear)) {
+                this.$message.warning("未沽清商品不能取消沽清");
+                return
+            }
+            let modelArr = selectArr.map(ele => ele.id)
+            console.log(modelArr);
+            deleteAction("/pos/posSellClearGoods/delete", {
+                    goodsId: modelArr.join(",")
+                })
+                .then((res) => {
+                    if (res.success) {
+                        this.$message.success(res.message);
+                        this.loadData();
+                        this.sellClear = 0;
+                        this.selectGoods = null
+                        this.isSellClear = false
+                    } else {
+                        this.$message.warning(res.message);
+                    }
+                })
+                .finally(() => {});
         },
-        {
-          title: "区域名称",
-          align: "center",
-          dataIndex: "name",
+        handleAdd() {
+            var _info = JSON.parse(localStorage.getItem("storeInfo"));
+            var model = {
+                goodsId: this.selectGoods.id
+            };
+            if (_info) {
+                model.hotelId = _info.id;
+            }
+            console.log(model, this.dataSource);
+            let selectArr = this.dataSource.filter((t) => t.sort == 888888)
+            if (!selectArr.length) {
+                this.$message.warning("请选择沽清商品");
+                return
+            }
+            if (selectArr.some(ele => ele.isSellClear)) {
+                this.$message.warning("已沽清商品不能重复沽清");
+                return
+            }
+            let modelArr = selectArr.map(ele => ({
+                goodsId: ele.id,
+                hotelId: _info.id
+            }))
+            console.log(modelArr);
+            postAction("/pos/posSellClearGoods/add", modelArr)
+                .then((res) => {
+                    if (res.success) {
+                        this.$message.success(res.message);
+                        this.loadData();
+                        this.sellClear = 0;
+                        this.selectGoods = null
+                        this.isSellClear = false
+                    } else {
+                        this.$message.warning(res.message);
+                    }
+                })
+                .finally(() => {});
         },
-        {
-          title: "操作",
-          dataIndex: "action",
-          align: "center",
-          fixed: "right",
-          width: 147,
-          scopedSlots: { customRender: "action" },
+        itemClick(row) {
+            console.log(row);
+            if (row.sort != 888888) {
+                this.selectGoods = row;
+                // var list = this.dataSource.filter((t) => (t) => t.sort == 888888);
+                // list.forEach((t) => {
+                //   t.sort = 0;
+                // });
+                row.sort = 888888;
+                if (row.isSellClear) {
+                    this.sellClear = 2;
+                } else {
+                    this.sellClear = 1;
+                }
+            } else {
+                row.sort = 0;
+                this.sellClear = 0;
+                this.selectGoods = null
+            }
+        },
+        loadTree() {
+            var that = this;
+            tree().then((res) => {
+                if (res.success) {
+                    this.treeData = res.result;
+                }
+            });
         },
-      ],
-      url: {
-        list: "/pos/posSellClearGoods/list2",
-        delete: "/pos/posSellClearGoods/delete",
-        deleteBatch: "/pos/posSellClearGoods/deleteBatch",
-        exportXlsUrl: "/pos/posSellClearGoods/exportXls",
-        importExcelUrl: "pos/posSellClearGoods/importExcel",
-      },
-      dictOptions: {},
-      superFieldList: [],
-      selectedRowKeys: [],
-      isorter: {
-        column: "createTime",
-        order: "desc",
-      },
-      treeData: [],
-      selectGoods: {},
-    };
-  },
-  created() {
-    this.loadTree();
-  },
-  methods: {
-    handleDelete() {
-
-      let selectArr = this.dataSource.filter((t) => t.sort == 888888)
-      if (!selectArr.length) {
-        this.$message.warning("请选择取消沽清商品");
-        return
-      }
-      if (selectArr.some(ele=>!ele.isSellClear)) {
-        this.$message.warning("未沽清商品不能取消沽清");
-        return
-      }
-      let modelArr = selectArr.map(ele=>ele.id)
-      console.log(modelArr);
-      deleteAction("/pos/posSellClearGoods/delete", {
-        goodsId: modelArr.join(",")
-      })
-        .then((res) => {
-          if (res.success) {
-            this.$message.success(res.message);
-            this.loadData();
-            this.sellClear = 0;
-          } else {
-            this.$message.warning(res.message);
-          }
-        })
-        .finally(() => {});
-    },
-    handleAdd() {
-      var _info = JSON.parse(localStorage.getItem("storeInfo"));
-      var model = { goodsId: this.selectGoods.id };
-      if (_info) {
-        model.hotelId = _info.id;
-      }
-      console.log(model,this.dataSource);
-      let selectArr = this.dataSource.filter((t) => t.sort == 888888)
-      if (!selectArr.length) {
-        this.$message.warning("请选择沽清商品");
-        return
-      }
-      if (selectArr.some(ele=>ele.isSellClear)) {
-        this.$message.warning("已沽清商品不能重复沽清");
-        return
-      }
-      let modelArr = selectArr.map(ele=>({ goodsId: ele.id,hotelId:_info.id }))
-      console.log(modelArr);
-      postAction("/pos/posSellClearGoods/add", modelArr)
-        .then((res) => {
-          if (res.success) {
-            this.$message.success(res.message);
-            this.loadData();
-            this.sellClear = 0;
-          } else {
-            this.$message.warning(res.message);
-          }
-        })
-        .finally(() => {});
-    },
-    itemClick(row) {
-      console.log(row);
-      if (row.sort != 888888) {
-        this.selectGoods = row;
-        // var list = this.dataSource.filter((t) => (t) => t.sort == 888888);
-        // list.forEach((t) => {
-        //   t.sort = 0;
-        // });
-        row.sort = 888888;
-        if (row.isSellClear) {
-          this.sellClear = 2;
-        } else {
-          this.sellClear = 1;
-        }
-      } else {
-        row.sort = 0;
-        this.sellClear = 0;
-      }
-    },
-    loadTree() {
-      var that = this;
-      tree().then((res) => {
-        if (res.success) {
-          this.treeData = res.result;
-        }
-      });
     },
-  },
 };
 </script>
-  <style scoped>
+
+<style scoped>
 @import "~@assets/less/common.less";
+
 .room-item {
-  height: 110px;
-  /* line-height: 200px; */
-  font-size: 13px;
-  color: #f9f9f9;
-  padding: 20px 10px;
-  border-radius: 5px;
-  cursor: pointer;
-  position: relative;
+    height: 110px;
+    /* line-height: 200px; */
+    font-size: 13px;
+    color: #f9f9f9;
+    padding: 20px 10px;
+    border-radius: 5px;
+    cursor: pointer;
+    position: relative;
 }
+
 .check {
-  border: #000 solid 3px;
+    border: #000 solid 3px;
+}
+.sell-clear-top{
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  justify-content: space-between;
+  height: 100px;
 }
-</style>
+</style>

+ 11 - 0
src/views/settings/components/pos/posTable.vue

@@ -39,6 +39,7 @@
       <a-button @click="handleAdd" type="primary" icon="plus">新增</a-button>
       <a-button :disabled="selectedRowKeys.length == 0" @click="downloadQRcode" type="primary">下载二维码</a-button>
       <a-button @click="batchDel" :disabled="selectedRowKeys.length == 0" icon="stop" type="danger" >批量删除</a-button>
+      <a-button @click="batchAdd" type="primary">批量新增</a-button>
     </div>
 
     <!-- table区域-begin -->
@@ -129,6 +130,7 @@
     </a-modal>
 
     <pos-table-modal ref="modalForm" @ok="modalFormOk"></pos-table-modal>
+    <batchAddModal ref="modalFormBatch" @ok="modalFormBatchOk" />
   </a-card>
 </template>
   
@@ -137,11 +139,14 @@ import { JeecgListMixin } from "@/mixins/JeecgListMixin";
 import PosTableModal from "./modules/PosTableModal";
 import { filterObj } from "@/utils/util";
 import { getAction, downloadFileZIP } from "@/api/manage";
+import batchAddModal from './modules/batchAddModal.vue';
+
 export default {
   name: "memberList",
   mixins: [JeecgListMixin],
   components: {
     PosTableModal,
+    batchAddModal
   },
   data() {
     return {
@@ -233,6 +238,12 @@ export default {
       this.selectQRcode = record.qrCode;
       this.QRcodeVisible = true;
     },
+    batchAdd(){
+      this.$refs.modalFormBatch.add();
+    },
+    modalFormBatchOk(e){
+      console.log(e);
+    },
     downloadQRcode(){
       if (this.selectedRowKeys.length <= 0) {
         this.$message.warning('请选择一条记录!');

+ 199 - 0
src/views/settings/components/pos/tabletOrdering.vue

@@ -0,0 +1,199 @@
+<template>
+<!-- <a-spin :spinning="confirmLoading"> -->
+    <j-form-container :disabled="false">
+        <a-form-model ref="form" :model="model" layout="horizontal" slot="detail">
+            <!-- 1 -->
+            <div class="item-wrapper">
+                <div class="wrapper-content">结账模式:</div>
+                <div class="wrapper-form-item">
+                    <a-form-model-item label="" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="">
+                        <a-radio-group :options="options" v-model="model.type" @change="onChangeType" />
+                    </a-form-model-item>
+                </div>
+                <div class="wrapper-content">
+
+                </div>
+            </div>
+
+            <!-- 2 -->
+            <div class="item-wrapper">
+                <div class="wrapper-content">验证场景:</div>
+                <div class="wrapper-form-item">
+                    <a-form-model-item label="" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="leaveTime">
+                        <a-checkbox-group v-model="model.value" name="checkboxgroup" :options="plainOptions" @change="onChangeCJ" />
+                    </a-form-model-item>
+                </div>
+            </div>
+
+            <!-- 3 -->
+            <div class="item-wrapper">
+                <div class="wrapper-content">验证方式:动态码验证</div>
+            </div>
+            <div class="buttons">
+                <a-button style="margin-right: 10px" @click="reload">刷新</a-button>
+                <a-button type="primary" @click="save">保存</a-button>
+            </div>
+        </a-form-model>
+    </j-form-container>
+<!-- </a-spin> -->
+</template>
+
+<script>
+import {
+    fetch,
+    save
+} from "@/api/allDaysPriceRuleApi";
+import {
+    getAllLayouts
+} from "@/api/roomLayout";
+import moment from 'moment'
+
+let hotelInfo = JSON.parse(localStorage.getItem("storeInfo"))
+export default {
+    data() {
+        return {
+            labelCol: {
+                xs: {
+                    span: 0
+                },
+                sm: {
+                    span: 0
+                },
+            },
+            wrapperCol: {
+                xs: {
+                    span: 24
+                },
+                sm: {
+                    span: 24
+                },
+            },
+            options: [{
+                    label: '前台结账',
+                    value: 0
+                },
+                {
+                    label: '平板结账',
+                    value: 1
+                }
+            ],
+            plainOptions: ['顾客切换至服务员', '顾客下单需服务员确认'],
+            model: {
+                type: 0,
+            },
+            confirmLoading:true,
+        };
+    },
+    mounted() {
+
+    },
+    methods: {
+        onChangeType(e){
+            console.log(e);
+        },
+        onChangeCJ(e){
+            console.log(e);
+        },
+        reload() {
+            this.confirmLoading = true
+            this.loadLayouts()
+            setTimeout(_ => {
+                this.$message.success('刷新成功')
+                this.confirmLoading = false
+            }, 800)
+
+        },
+        save() {
+            return
+            const that = this;
+            // 触发表单验证
+            this.$refs.form.validate((valid) => {
+                if (valid) {
+                    that.confirmLoading = true;
+                    let layoutRules = []
+                    if (this.model.timeOutRule == 1 && this.model.ruleType == 2) {
+                        this.layouts.forEach(s => {
+                            let pushItem = {
+                                hotelId: hotelInfo.id,
+                                roomLayoutId: s.id,
+                                minute: s.minute,
+                                price: s.price,
+                                moreThenMinute: s.moreThenMinute,
+                                moreThenPrice: s.moreThenPrice,
+                            }
+                            if (s.mId) {
+                                pushItem['id'] = s.mId
+                            }
+                            layoutRules.push(pushItem)
+                        })
+                    }
+                    let param = {
+                        hotelId: hotelInfo.id,
+                        enterTime: moment(this.model.enterTime, "HH:mm").utcOffset(8).format("HH:mm"),
+                        leaveTime: moment(this.model.leaveTime, "HH:mm").utcOffset(8).format("HH:mm"),
+                        timeOutRule: this.model.timeOutRule,
+                        ruleType: this.model.ruleType,
+                        minute: this.model.minute,
+                        price: this.model.price,
+                        moreThenMinute: this.model.moreThenMinute,
+                        moreThenPrice: this.model.moreThenPrice,
+                        endTime: moment(this.model.endTime, "HH:mm").utcOffset(8).format("HH:mm"),
+                        dayTime: this.model.dayTime,
+                        roomLayoutRules: layoutRules
+                    }
+                    if (this.model.id) {
+                        param['id'] = this.model.id
+                    }
+                    save(param).then(res => {
+                        if (res.code == 200) {
+                            this.$message.success("保存成功")
+                            this.loadRules()
+                        }
+                    }).finally(_ => {
+                        that.confirmLoading = false;
+                    })
+                }
+            });
+        },
+    },
+};
+</script>
+
+<style lang="css" scoped>
+/deep/ .ant-form-explain {
+    width: 300% !important;
+}
+
+.item-wrapper {
+    display: flex;
+    align-items: center;
+    height: 50px;
+    margin-top: 22px;
+    margin-bottom: 22px;
+}
+
+.wrapper-form-item {
+    height: 38px;
+    /* margin-top: 22px; */
+}
+
+.item-data-wrapper {
+    margin-top: 0 !important;
+    border-top: 2px solid #1890ff;
+    width: fit-content;
+    padding: 0 40px;
+    background-color: #1890ff;
+    border-top-right-radius: 4px;
+    color: white;
+}
+
+.header-title {
+    font-weight: 600;
+    width: fit-content;
+    padding: 10px 20px;
+    background-color: #1890ff;
+    color: white;
+    border-top-left-radius: 4px;
+    border-top-right-radius: 4px;
+}
+</style>

+ 328 - 0
src/views/settings/components/pos/taste.vue

@@ -0,0 +1,328 @@
+<template>
+  <a-card :bordered="false">
+    <!-- 查询区域 -->
+    <div class="table-page-search-wrapper">
+      <a-form layout="inline" @keyup.enter.native="searchQuery">
+        <a-row :gutter="24">
+          <a-col :span="3">
+            <a-form-item label="">
+              <j-input
+                placeholder="口味名称"
+                v-model="queryParam.name"
+              ></j-input>
+            </a-form-item>
+          </a-col>
+          <a-col :md="6" :sm="8">
+            <span
+              style="float: left; overflow: hidden"
+              class="table-page-search-submitButtons"
+            >
+              <a-button type="primary" @click="searchQuery" icon="search"
+                >查询</a-button
+              >
+              <a-button
+                type="primary"
+                @click="searchReset"
+                icon="reload"
+                style="margin-left: 8px"
+                >重置</a-button
+              >
+            </span>
+          </a-col>
+        </a-row>
+      </a-form>
+    </div>
+    <!-- 查询区域-END -->
+
+    <!-- 操作按钮区域 -->
+    <div class="table-operator">
+      <a-button @click="handleAdd" type="primary" icon="plus">新增</a-button>
+      <!-- <a-button :disabled="selectedRowKeys.length == 0" @click="downloadQRcode" type="primary">下载二维码</a-button> -->
+      <a-button @click="batchDel" :disabled="selectedRowKeys.length == 0" icon="stop" type="danger" >批量删除</a-button>
+    </div>
+
+    <!-- table区域-begin -->
+    <div>
+      <a-table
+        ref="table"
+        size="middle"
+        :scroll="{ x: true }"
+        bordered
+        rowKey="id"
+        :columns="columns"
+        :dataSource="dataSource"
+        :pagination="ipagination"
+        :loading="loading"
+        :rowSelection="{
+          selectedRowKeys: selectedRowKeys,
+          onChange: onSelectChange,
+        }"
+        class="j-table-force-nowrap"
+        @change="handleTableChange"
+      >
+        <template slot="payFlagslot" slot-scope="text, record">
+          {{ record.payFlag == 1 ? "是" : "否" }}
+        </template>
+        <template slot="iconslot" slot-scope="text, record">
+          <a-icon :type="record.icon" theme="filled" />
+        </template>
+        <template slot="htmlSlot" slot-scope="text">
+          <div v-html="text"></div>
+        </template>
+        <template slot="imgSlot" slot-scope="text, record">
+          <span v-if="!text" style="font-size: 12px; font-style: italic"
+            >无图片</span
+          >
+          <img
+            v-else
+            :src="getImgView(text)"
+            :preview="record.id"
+            height="25px"
+            alt=""
+            style="max-width: 80px; font-size: 12px; font-style: italic"
+          />
+        </template>
+        <template slot="fileSlot" slot-scope="text">
+          <span v-if="!text" style="font-size: 12px; font-style: italic"
+            >无文件</span
+          >
+          <a-button
+            v-else
+            :ghost="true"
+            type="primary"
+            icon="download"
+            size="small"
+            @click="downloadFile(text)"
+          >
+            下载
+          </a-button>
+        </template>
+
+        <span slot="action" slot-scope="text, record">
+
+          <!-- <a @click="QRcode(record)">二维码</a>
+          <a-divider type="vertical" /> -->
+          <a @click="handleEdit(record)">编辑</a>
+
+          <a-divider type="vertical" />
+          <a-popconfirm
+            title="确定删除吗?"
+            @confirm="() => handleDelete(record.id)"
+          >
+            <a>删除</a>
+          </a-popconfirm>
+        </span>
+      </a-table>
+    </div>
+
+    <a-modal title="二维码" :visible="QRcodeVisible" @cancel="QRcodeVisible = false" @ok="QRcodeVisible = false">
+      <div style="text-align:center;">
+        <a-avatar :size="264" shape="square" :src="selectQRcode" alt="暂无二维码" />
+      </div>
+    </a-modal>
+
+    <pos-table-modal ref="modalForm" @ok="modalFormOk"></pos-table-modal>
+  </a-card>
+</template>
+  
+  <script>
+import { JeecgListMixin } from "@/mixins/JeecgListMixin";
+import PosTableModal from "./modules/posTasteModal.vue";
+import { filterObj } from "@/utils/util";
+import { getAction, downloadFileZIP } from "@/api/manage";
+export default {
+  name: "memberList",
+  mixins: [JeecgListMixin],
+  components: {
+    PosTableModal,
+  },
+  data() {
+    return {
+      QRcodeVisible: false,
+      selectQRcode: "",
+      queryParam: {},
+      // 分页参数
+      ipagination: {
+        current: 1,
+        pageSize: 10,
+        pageSizeOptions: ["10", "20", "30"],
+        showTotal: (total, range) => {
+          return range[0] + "-" + range[1] + " 共" + total + "条";
+        },
+        showQuickJumper: true,
+        showSizeChanger: true,
+        total: 0,
+      },
+      // 表头
+      columns: [
+        {
+          title: "口味名称",
+          align: "center",
+          dataIndex: "name",
+        },
+        {
+          title: "加价金额",
+          align: "center",
+          dataIndex: "money",
+        },
+        {
+          title: "状态",
+          align: "center",
+          dataIndex: "state",
+          customRender: function (text) {
+            return text == true ? "启用" : "禁用";
+          },
+        },
+        {
+          title: "应用范围",
+          align: "center",
+          dataIndex: "type",
+          customRender: function (text) {
+            return text == 0 ? "全部菜品" : text == 1? '菜品分类' : '菜品';
+          },
+        },
+        {
+          title: "备注",
+          align: "center",
+          dataIndex: "remark",
+        },
+        // {
+        //   title: "创建时间",
+        //   align: "center",
+        //   dataIndex: "regionName",
+        // },
+        {
+          title: "操作",
+          dataIndex: "action",
+          align: "center",
+          fixed: "right",
+          width: 147,
+          scopedSlots: { customRender: "action" },
+        },
+      ],
+      url: {
+        list: "/pos/posKwConfig/list",
+        delete: "/pos/posKwConfig/delete",
+        deleteBatch: "/pos/posKwConfig/deleteBatch",
+        exportXlsUrl: "/pos/posTable/exportXls",
+        importExcelUrl: "pos/posTable/importExcel",
+      },
+      dictOptions: {},
+      superFieldList: [],
+      selectedRowKeys: [],
+      isorter: {
+        column: "createTime",
+        order: "desc",
+      },
+    };
+  },
+  created() {
+  },
+  methods: {
+    QRcode(record){
+      console.log(record.qrCode);
+      this.selectQRcode = record.qrCode;
+      this.QRcodeVisible = true;
+    },
+    downloadQRcode(){
+      if (this.selectedRowKeys.length <= 0) {
+        this.$message.warning('请选择一条记录!');
+        return;
+      } else {
+        var ids = "";
+        for (var a = 0; a < this.selectedRowKeys.length; a++) {
+          ids += this.selectedRowKeys[a] + ",";
+        }
+        var that = this;
+        console.log(ids);
+        downloadFileZIP('/pos/posTable/makeQRCode?ids=' + ids, '二维码', {}).then((res) => {
+          console.log(res);
+          that.onClearSelected();
+        });
+      }
+    },
+
+    getAvatarView: function (avatar) {
+      return getFileAccessHttpUrl(avatar);
+    },
+
+    batchFrozen: function (status) {
+      if (this.selectedRowKeys.length <= 0) {
+        this.$message.warning("请选择一条记录!");
+        return false;
+      } else {
+        let ids = "";
+        let that = this;
+        let isAdmin = false;
+        that.selectionRows.forEach(function (row) {
+          if (row.username == "admin") {
+            isAdmin = true;
+          }
+        });
+        if (isAdmin) {
+          that.$message.warning("管理员账号不允许此操作,请重新选择!");
+          return;
+        }
+        that.selectedRowKeys.forEach(function (val) {
+          ids += val + ",";
+        });
+        that.$confirm({
+          title: "确认操作",
+          content: "是否" + (status == 1 ? "解冻" : "冻结") + "选中账号?",
+          onOk: function () {
+            frozenBatch({ ids: ids, status: status }).then((res) => {
+              if (res.success) {
+                that.$message.success(res.message);
+                that.loadData();
+                that.onClearSelected();
+              } else {
+                that.$message.warning(res.message);
+              }
+            });
+          },
+        });
+      }
+    },
+    handleMenuClick(e) {
+      if (e.key == 1) {
+        this.batchDel();
+      } else if (e.key == 2) {
+        this.batchFrozen(2);
+      } else if (e.key == 3) {
+        this.batchFrozen(1);
+      }
+    },
+    handleFrozen: function (id, status, username) {
+      let that = this;
+      //TODO 后台校验管理员角色
+      if ("admin" == username) {
+        that.$message.warning("管理员账号不允许此操作!");
+        return;
+      }
+      frozenBatch({ ids: id, status: status }).then((res) => {
+        if (res.success) {
+          that.$message.success(res.message);
+          that.loadData();
+        } else {
+          that.$message.warning(res.message);
+        }
+      });
+    },
+    handleChangePassword(username) {
+      this.$refs.passwordmodal.show(username);
+    },
+    passwordModalOk() {
+      //TODO 密码修改完成 不需要刷新页面,可以把datasource中的数据更新一下
+    },
+    onSyncFinally({ isToLocal }) {
+      // 同步到本地时刷新下数据
+      if (isToLocal) {
+        this.loadData();
+      }
+    },
+  },
+};
+</script>
+  <style scoped>
+@import "~@assets/less/common.less";
+</style>

+ 22 - 4
src/views/settings/posInfo.vue

@@ -6,25 +6,37 @@
         <pos-table></pos-table>
       </a-tab-pane>
       <a-tab-pane key="2">
+        <span slot="tab"> 口味设置 </span>
+        <posTaste></posTaste>
+      </a-tab-pane>
+      <a-tab-pane key="3">
+        <span slot="tab"> 加料设置 </span>
+        <posFeedingSet></posFeedingSet>
+      </a-tab-pane>
+      <a-tab-pane key="4">
         <span slot="tab"> 桌台区域设置 </span>
         <pos-region></pos-region>
       </a-tab-pane>
-      <a-tab-pane key="3">
+      <a-tab-pane key="5">
         <span slot="tab"> 桌台桌型设置 </span>
         <pos-table-type></pos-table-type>
       </a-tab-pane>
-      <a-tab-pane key="4">
+      <a-tab-pane key="6">
         <span slot="tab"> 沽清设置 </span>
         <pos-sell-clear-goods></pos-sell-clear-goods>
       </a-tab-pane>
-      <a-tab-pane key="5">
+      <a-tab-pane key="7">
         <span slot="tab"> 套餐管理 </span>
         <pos-thali></pos-thali>
       </a-tab-pane>
-      <a-tab-pane key="6">
+      <a-tab-pane key="8">
         <span slot="tab"> 餐段设置 </span>
         <pos-meal-section></pos-meal-section>
       </a-tab-pane>
+      <a-tab-pane key="9">
+        <span slot="tab"> 平板点餐设置 </span>
+        <tabletOrdering></tabletOrdering>
+      </a-tab-pane>
     </a-tabs>
   </a-card>
 </template>
@@ -36,6 +48,9 @@ import posTableType from "./components/pos/posTableType.vue";
 import posSellClearGoods from "./components/pos/posSellClearGoods.vue";
 import posThali from "./components/pos/posThali.vue";
 import posMealSection from "./components/pos/posMealSection.vue";
+import posTaste from "./components/pos/taste.vue";
+import posFeedingSet from "./components/pos/feedingSet.vue";
+import tabletOrdering from './components/pos/tabletOrdering.vue';
 
 export default {
   components: {
@@ -45,6 +60,9 @@ export default {
     posSellClearGoods,
     posThali,
     posMealSection,
+    posTaste,
+    posFeedingSet,
+    tabletOrdering
   },
   data() {
     return {};