Zory 1 天之前
父节点
当前提交
d052fcb1f2
共有 41 个文件被更改,包括 2750 次插入106 次删除
  1. 7 0
      src/api/model/mOrder.js
  2. 47 0
      src/api/model/mQrcode.js
  3. 26 0
      src/api/model/mUser.js
  4. 298 0
      src/views/manage/components/store.vue
  5. 79 40
      src/views/manage/dashboard/index.vue
  6. 86 0
      src/views/manage/finance/index/components/table.vue
  7. 138 1
      src/views/manage/finance/index/index.vue
  8. 50 0
      src/views/manage/member/index/components/option.vue
  9. 42 0
      src/views/manage/member/index/components/search.vue
  10. 90 0
      src/views/manage/member/index/components/table.vue
  11. 83 1
      src/views/manage/member/index/index.vue
  12. 49 0
      src/views/manage/member/record/components/search.vue
  13. 93 0
      src/views/manage/member/record/components/table.vue
  14. 82 1
      src/views/manage/member/record/index.vue
  15. 152 0
      src/views/manage/order/index/components/detail.vue
  16. 50 0
      src/views/manage/order/index/components/option.vue
  17. 81 0
      src/views/manage/order/index/components/search.vue
  18. 146 0
      src/views/manage/order/index/components/table.vue
  19. 120 1
      src/views/manage/order/index/index.vue
  20. 3 0
      src/views/manage/order/qrcode/components/detail.vue
  21. 50 0
      src/views/manage/order/qrcode/components/option.vue
  22. 70 0
      src/views/manage/order/qrcode/components/search.vue
  23. 80 0
      src/views/manage/order/qrcode/components/table.vue
  24. 69 1
      src/views/manage/order/qrcode/index.vue
  25. 1 1
      src/views/manage/shop/index/components/table.vue
  26. 3 2
      src/views/merchant/dashboard/index.vue
  27. 50 0
      src/views/merchant/member/index/components/option.vue
  28. 42 0
      src/views/merchant/member/index/components/search.vue
  29. 90 0
      src/views/merchant/member/index/components/table.vue
  30. 83 1
      src/views/merchant/member/index/index.vue
  31. 49 0
      src/views/merchant/member/record/components/search.vue
  32. 93 0
      src/views/merchant/member/record/components/table.vue
  33. 82 1
      src/views/merchant/member/record/index.vue
  34. 150 1
      src/views/merchant/order/index/components/detail.vue
  35. 29 18
      src/views/merchant/order/index/components/table.vue
  36. 28 12
      src/views/merchant/order/index/index.vue
  37. 0 7
      src/views/merchant/order/qrcode/components/search.vue
  38. 5 11
      src/views/merchant/order/qrcode/components/table.vue
  39. 16 0
      src/views/merchant/order/qrcode/index.vue
  40. 1 1
      src/views/merchant/print/discount/components/option.vue
  41. 37 6
      src/views/merchant/turnover/index/index.vue

+ 7 - 0
src/api/model/mOrder.js

@@ -9,6 +9,13 @@ export default {
             return await http.get(this.url, data);
         },
     },
+    total: {
+        url: `${config.API_URL}/mer/order/total`,
+        name: "-",
+        get: async function (data = {}) {
+            return await http.get(this.url, data);
+        },
+    },
     save: {
         url: `${config.API_URL}/mer/order/save`,
         name: "-",

+ 47 - 0
src/api/model/mQrcode.js

@@ -0,0 +1,47 @@
+import config from "@/config";
+import http from "@/utils/request";
+
+export default {
+    list: {
+        url: `${config.API_URL}/mer/qrcode/list`,
+        name: "-",
+        get: async function (data = {}) {
+            return await http.get(this.url, data);
+        },
+    },
+    total: {
+        url: `${config.API_URL}/mer/qrcode/total`,
+        name: "-",
+        get: async function (data = {}) {
+            return await http.get(this.url, data);
+        },
+    },
+    today: {
+        url: `${config.API_URL}/mer/turnover/today`,
+        name: "-",
+        get: async function (data = {}) {
+            return await http.get(this.url, data);
+        },
+    },
+    detail: {
+        url: `${config.API_URL}/mer/order/detail`,
+        name: "-",
+        post: async function (data = {}) {
+            return await http.post(this.url, data);
+        },
+    },
+    batch: {
+        url: `${config.API_URL}/mer/order/batch`,
+        name: "-",
+        post: async function (data = {}) {
+            return await http.post(this.url, data);
+        },
+    },
+    del: {
+        url: `${config.API_URL}/mer/order/del`,
+        name: "-",
+        post: async function (data = {}) {
+            return await http.post(this.url, data);
+        },
+    },
+}

+ 26 - 0
src/api/model/mUser.js

@@ -0,0 +1,26 @@
+import config from "@/config";
+import http from "@/utils/request";
+
+export default {
+    list: {
+        url: `${config.API_URL}/mer/user/list`,
+        name: "-",
+        get: async function (params) {
+            return await http.get(this.url, params);
+        },
+    },
+    log: {
+        url: `${config.API_URL}/mer/userLog/list`,
+        name: "-",
+        get: async function (params) {
+            return await http.get(this.url, params);
+        },
+    },
+    save: {
+        url: `${config.API_URL}/mer/user/save`,
+        name: "-",
+        post: async function (params) {
+            return await http.post(this.url, params);
+        },
+    },
+}

+ 298 - 0
src/views/manage/components/store.vue

@@ -0,0 +1,298 @@
+<!--
+ * @Descripttion: 用户选择器
+ * @version: 1.0
+ * @Author: Zory
+ * @Date: 2024年1月10日21:46:29
+-->
+<template>
+    <el-dialog :title="titleMap[mode]" v-model="visible" :width="800" destroy-on-close @closed="$emit('closed')">
+        <div class="main">
+            <div class="main-left">
+                <div class="main-top">
+                    <el-form class="lv-form-inline" ref="searchForm" :model="searchKey" label-position="right">
+                        <el-row :gutter="10">
+                            <el-col :span="18" :xs="12">
+                                <el-form-item label=" " prop="name">
+                                    <el-input v-model="searchKey.name" placeholder="请输入门店名称" clearable
+                                        :style="{width: '100%'}"></el-input>
+                                </el-form-item>
+                            </el-col>
+                            <el-col :span="6" :xs="12">
+                                <el-form-item>
+                                    <div class="search-btn">
+                                        <el-button type="primary" @click="searchForm">搜索</el-button>
+                                    </div>
+                                </el-form-item>
+                            </el-col>
+                        </el-row>
+                    </el-form>
+                </div>
+                <div class="main-body-wrap" v-if="!multiple">
+                    <scTable ref="table" :apiObj="list.apiObj" :hideSetting="true" paginationLayout="total, prev, pager, next" :params="searchKey" @current-change="handleCurrentChange" highlight-current-row :row-key="getRowKeys" @sortChange="sortChange">
+                        <el-table-column width="50" fixed="left">
+                            <div class="checkbox"></div>
+                        </el-table-column>
+                        <el-table-column label="店铺名称" width="200" fixed="left" prop="shop_name"></el-table-column>
+                        <el-table-column label="店铺编码" prop="shop_id" width="200"></el-table-column>
+                        <el-table-column label="营业时间" prop="agent" width="150">
+                            <template #default="scope">
+                                <span v-if="scope.row.start_at">{{ scope.row.start_at }}-{{ scope.row.end_at }}</span>
+                                <span class="status-danger" v-else>未设置</span>
+                            </template>
+                        </el-table-column>
+                        <el-table-column label="到期时间" prop="vip_end" width="180">
+                            <template #default="scope">
+                                <span v-if="scope.row.vip_end">{{ scope.row.vip_end }}</span>
+                                <span class="status-danger" v-else>未设置</span>
+                            </template>
+                        </el-table-column>
+                        <el-table-column label="收费规则" prop="rate_type" width="150">
+                            <template #default="scope">
+                                <div class="status-success" v-if="scope.row.rate_type==1"><sc-status-indicator type="success"></sc-status-indicator> 收取年费</div>
+                                <div class="status-danger" v-if="scope.row.rate_type==2"><sc-status-indicator type="danger"></sc-status-indicator> 订单金额抽佣</div>
+                                <div class="status-danger" v-if="scope.row.rate_type==0"><sc-status-indicator type="danger"></sc-status-indicator> 未设置</div>
+                            </template>
+                        </el-table-column>
+                        <el-table-column label="联系人" prop="shop_contact" width="150">
+                            <template #default="scope">
+                                <span v-if="scope.row.shop_contact">{{ scope.row.shop_contact }}</span>
+                                <span class="status-danger" v-else>未设置</span>
+                            </template>
+                        </el-table-column>
+                        <el-table-column label="联系电话" prop="shop_mobile" width="150">
+                            <template #default="scope">
+                                <span v-if="scope.row.shop_mobile">{{ scope.row.shop_mobile }}</span>
+                                <span class="status-danger" v-else>未设置</span>
+                            </template>
+                        </el-table-column>
+                        <el-table-column label="店铺地址" prop="shop_address" width="300">
+                            <template #default="scope">
+                                <span v-if="scope.row.shop_address">{{ scope.row.shop_address }}</span>
+                                <span class="status-danger" v-else>未设置</span>
+                            </template>
+                        </el-table-column>
+                        <el-table-column label="状态" prop="status" width="120" align="center">
+                            <template #default="scope">
+                                <div class="status-success" v-if="scope.row.status==0"><sc-status-indicator type="success"></sc-status-indicator> 正常</div>
+                                <div class="status-danger" v-if="scope.row.status==1"><sc-status-indicator type="danger"></sc-status-indicator> 已到期</div>
+                                <div class="status-danger" v-if="scope.row.status==2"><sc-status-indicator type="danger"></sc-status-indicator> 关店</div>
+                            </template>
+                        </el-table-column>
+                        <el-table-column label="创建时间" prop="create_at" width="180"></el-table-column>
+                    </scTable>
+                </div>
+                <div class="main-body-wrap" v-else>
+                    <scTable ref="table" :apiObj="list.apiObj" :hideSetting="true" paginationLayout="total, prev, pager, next" :params="searchKey" @selectionChange="selectionChange" row-key="id" @sortChange="sortChange">
+                        <el-table-column type="selection" width="50" fixed="left"></el-table-column>
+                        <el-table-column label="店铺编码" prop="shop_id" width="200"></el-table-column>
+                        <el-table-column label="营业时间" prop="agent" width="150">
+                            <template #default="scope">
+                                <span v-if="scope.row.start_at">{{ scope.row.start_at }}-{{ scope.row.end_at }}</span>
+                                <span class="status-danger" v-else>未设置</span>
+                            </template>
+                        </el-table-column>
+                        <el-table-column label="到期时间" prop="vip_end" width="180">
+                            <template #default="scope">
+                                <span v-if="scope.row.vip_end">{{ scope.row.vip_end }}</span>
+                                <span class="status-danger" v-else>未设置</span>
+                            </template>
+                        </el-table-column>
+                        <el-table-column label="收费规则" prop="rate_type" width="150">
+                            <template #default="scope">
+                                <div class="status-success" v-if="scope.row.rate_type==1"><sc-status-indicator type="success"></sc-status-indicator> 收取年费</div>
+                                <div class="status-danger" v-if="scope.row.rate_type==2"><sc-status-indicator type="danger"></sc-status-indicator> 订单金额抽佣</div>
+                                <div class="status-danger" v-if="scope.row.rate_type==0"><sc-status-indicator type="danger"></sc-status-indicator> 未设置</div>
+                            </template>
+                        </el-table-column>
+                        <el-table-column label="联系人" prop="shop_contact" width="150">
+                            <template #default="scope">
+                                <span v-if="scope.row.shop_contact">{{ scope.row.shop_contact }}</span>
+                                <span class="status-danger" v-else>未设置</span>
+                            </template>
+                        </el-table-column>
+                        <el-table-column label="联系电话" prop="shop_mobile" width="150">
+                            <template #default="scope">
+                                <span v-if="scope.row.shop_mobile">{{ scope.row.shop_mobile }}</span>
+                                <span class="status-danger" v-else>未设置</span>
+                            </template>
+                        </el-table-column>
+                        <el-table-column label="店铺地址" prop="shop_address" width="300">
+                            <template #default="scope">
+                                <span v-if="scope.row.shop_address">{{ scope.row.shop_address }}</span>
+                                <span class="status-danger" v-else>未设置</span>
+                            </template>
+                        </el-table-column>
+                        <el-table-column label="状态" prop="status" width="120" align="center">
+                            <template #default="scope">
+                                <div class="status-success" v-if="scope.row.status==0"><sc-status-indicator type="success"></sc-status-indicator> 正常</div>
+                                <div class="status-danger" v-if="scope.row.status==1"><sc-status-indicator type="danger"></sc-status-indicator> 已到期</div>
+                                <div class="status-danger" v-if="scope.row.status==2"><sc-status-indicator type="danger"></sc-status-indicator> 关店</div>
+                            </template>
+                        </el-table-column>
+                        <el-table-column label="创建时间" prop="create_at" width="180"></el-table-column>
+                    </scTable>
+                </div>
+            </div>
+        </div>
+		<template #footer>
+			<el-button @click="visible=false" >取 消</el-button>
+			<el-button v-if="mode!='show'" type="primary" :loading="isSaveing" @click="submit()">确 定</el-button>
+		</template>
+    </el-dialog>
+</template>
+
+<script>
+export default{
+    emits: ['success', 'closed'],
+    props: {
+        multiple: { type: Boolean, default: false },
+    },
+    data(){
+        return {
+            loading: false,
+            mode:"add",
+            titleMap:{
+                add:"选择店铺",
+                edit:"选择店铺"
+            },
+            list: {
+                apiObj: this.$API.shop.list
+            },
+            visible: false,
+            isSaveing: false,
+            formData:{},
+            searchKey:{},
+            selectData:[]
+        }
+    },
+    methods:{
+        sortChange(event){
+            if (event.order) {
+                var data = {
+                    "field":event.prop,
+                    "order":event.order
+                }
+                this.$refs.table.upData(data)
+            } else {
+                this.$refs.table.reload(this.searchKey)
+            }
+            return ;
+        },
+        submit(){
+            if (this.selectData.length == 0)
+            {
+                return this.$message.error("请选择数据");
+            }
+            this.isSaveing = false;
+            this.visible = false;
+            if (this.multiple){
+                this.$emit('success', this.selectData);
+            } else {
+                this.$emit('success', this.selectData[0]);
+            }
+        },
+        getRowKeys(data){
+            return data.id;
+        },
+        clearAll(){
+            this.selectData = [];
+        },
+        removeUser(index,name){
+            this.selectData.splice(index, 1);
+            console.log(name)
+        },
+        handleCurrentChange(data){
+            this.selectData = [data];
+        },
+        selectionChange(data){
+            this.selectData = data;
+        },
+        searchForm(){
+            this.$refs.table.upData(this.searchKey)
+        },
+        fristName(name){
+            return name.substring(0,1);
+        },
+        open(mode = 'add'){
+            this.mode = mode;
+            this.visible = true;
+            return this
+        },
+        //表单注入数据
+        setData(data){
+            this.formData = data;
+        },
+    }
+}
+</script>
+
+<style lang="scss" scoped>
+.main{
+    display: flex;
+    border: 1px solid #dfe1e6;
+}
+.main-left{
+    overflow: hidden;
+    flex: 1;
+    .main-body-wrap{
+        position: relative;
+        height: 380px;
+    }
+}
+.main-top{
+    position: relative;
+    padding: 10px 0;
+    border-bottom: 1px solid #dfe1e6;
+    &.is-right{
+        height:53px;
+        display:flex;
+        align-items:center;
+        padding:0 10px;
+        justify-content:space-between;
+    }
+}
+.main-body.is-right{
+    padding: 8px 16px;
+    overflow-y: auto;
+    position: relative;
+    height: calc(100% - 53px);
+    max-height: 380px;
+}
+.mx-1{
+    margin: 0 0.5rem 0.5rem 0;
+}
+.main-right{
+    flex: 0.4;
+}
+.el-form-item--default{
+    margin-bottom: 0;
+}
+.checkbox{
+    border:1px solid #dfe1e6;
+    width: 14px;
+    height: 14px;
+    border-radius: 2px;
+    background-color: #fff;
+    cursor: pointer;
+    position:relative
+}
+.current-row .checkbox{
+    background-color: var(--el-color-primary);
+    border-color: var(--el-color-primary);
+}
+.current-row .checkbox:after{
+    transform: rotate(45deg) scaleY(1);
+    box-sizing: content-box;
+    content: "";
+    border: 1px solid #fff;
+    border-left: 0;
+    border-top: 0;
+    height: 7px;
+    left: 4px;
+    position: absolute;
+    top: 1px;
+    width: 3px;
+    transition: transform .15s ease-in 50ms;
+    transform-origin: center;
+}
+</style>

+ 79 - 40
src/views/manage/dashboard/index.vue

@@ -11,14 +11,26 @@
 	</div>
     <el-main>
         <div class="card-news mt0">
-            <div class="news-title">经营数据</div>
+            <div class="news-title">经营数据
+                <div class="title-open">
+                    <div class="name">显示数据</div>
+                    <el-switch
+                        v-model="hideState"
+                        :active-value="1"
+                        :inactive-value="0"
+                        size="large"
+                        @change="getHide"
+                    />
+                </div>
+            </div>
             <div class="total-panel">
                 <div :class="this.$store.state.global.ismobile?'panel-item m':'panel-item'" style="background-color: rgb(235, 241, 255);">
                     <div class="item-warp">
                         <div class="left">
                             <div class="title">今日营业额(元)</div>
-                            <div class="number">{{ todayData.order_money ? todayData.order_money:'0' }}</div>
-                            <div class="desc">来客订单金额</div>
+                            <div class="number" v-if="hideState==1">{{ $TOOL.money(todayData.userNum) }}</div>
+                            <div class="number" v-else>0.00</div>
+                            <div class="desc"></div>
                         </div>
                         <div class="right"><img src="@/assets/image/wave-1-icon.png" /></div>
                     </div>
@@ -28,8 +40,8 @@
                     <div class="item-warp">
                         <div class="left">
                             <div class="title">今日订单数(单)</div>
-                            <div class="number">{{ todayData.order_num ? todayData.order_num:'0' }}</div>
-                            <div class="desc">来客订单</div>
+                            <div class="number">{{ todayData.rechargeNum ? todayData.rechargeNum:'0.00' }}</div>
+                            <div class="desc"></div>
                         </div>
                         <div class="right"><img src="@/assets/image/wave-2-icon.png" /></div>
                     </div>
@@ -38,46 +50,38 @@
                 <div :class="this.$store.state.global.ismobile?'panel-item m':'panel-item'" style="background-color: rgb(255, 241, 214);">
                     <div class="item-warp">
                         <div class="left">
-                            <div class="title">今日核销(单)</div>
-                            <div class="number">{{ todayData.order_done ? todayData.order_done:'0' }}</div>
-                            <div class="desc">已完成核销</div>
+                            <div class="title">手机自助打印待处理(单)</div>
+                            <div class="number">{{ todayData.rechargeMoney ? todayData.rechargeMoney:'0.00' }}</div>
+                            <div class="desc"></div>
                         </div>
                         <div class="right"><img src="@/assets/image/wave-3-icon.png" /></div>
                     </div>
                     <div class="item-wave"><img src="@/assets/image/wave-3.png" /></div>
                 </div>
-                <div :class="this.$store.state.global.ismobile?'panel-item m':'panel-item'" style="background-color: rgb(250, 230, 244);">
-                    <div class="item-warp">
-                        <div class="left">
-                            <div class="title">今日待发货(单)</div>
-                            <div class="number">{{ todayData.order_send ? todayData.order_send:'0' }}</div>
-                            <div class="desc">待发快递</div>
-                        </div>
-                        <div class="right"><img src="@/assets/image/wave-4-icon.png" /></div>
-                    </div>
-                    <div class="item-wave"><img src="@/assets/image/wave-4.png" /></div>
-                </div>
-                <div :class="this.$store.state.global.ismobile?'panel-item m':'panel-item'" style="background-color: rgb(235, 255, 248);">
-                    <div class="item-warp">
-                        <div class="left">
-                            <div class="title">店铺数量</div>
-                            <div class="number">{{ todayData.store_num ? todayData.store_num:'0' }}</div>
-                            <div class="desc">开通绑定店铺数量</div>
-                        </div>
-                        <div class="right"><img src="@/assets/image/wave-5-icon.png" /></div>
-                    </div>
-                    <div class="item-wave"><img src="@/assets/image/wave-5.png" /></div>
-                </div>
             </div>
         </div>
-        <el-row :gutter="10">
-            <el-col :span="this.$store.state.global.ismobile?24:12">
+        <el-row :gutter="20">
+            <el-col :span="this.$store.state.global.ismobile?24:24" :xs="24">
                 <div class="card-news mt10">
+                    <div class="date-check">
+                        <el-radio-group v-model="moneyDate" size="large" @change="getmoneyDate">
+                            <el-radio-button v-for="(city,indx) in dateData" :key="indx" :label="city.key">
+                                {{ city.name }}
+                            </el-radio-button>
+                        </el-radio-group>
+                    </div>
                     <scEcharts height="500px" :option="option2"></scEcharts>
                 </div>
             </el-col>
-            <el-col :span="this.$store.state.global.ismobile?24:12">
+            <el-col :span="this.$store.state.global.ismobile?24:24" :xs="24">
                 <div class="card-news mt10">
+                    <div class="date-check">
+                        <el-radio-group v-model="orderDate" size="large" @change="getorderDate">
+                            <el-radio-button v-for="(city,indx) in dateData" :key="indx" :label="city.key">
+                                {{ city.name }}
+                            </el-radio-button>
+                        </el-radio-group>
+                    </div>
                     <scEcharts height="500px" :option="option"></scEcharts>
                 </div>
             </el-col>
@@ -95,27 +99,42 @@ export default {
     },
     data(){
         return {
+            dateData:[{"name":"近7天","key":7},{"name":"近14天","key":14},{"name":"近30天","key":30}],
+            orderDate:7,
+            moneyDate:7,
+            hideState:0,
             pageLoading: false,
             dashboard: '0',
             todayData:{},
-            dataInfo:{},
             blueBg,
             baseData:{},
-            option: {},
             option2: {},
+            option: {},
         }
     },
     created(){
         var baseData = this.$TOOL.data.get("SERVICE");
         this.baseData = baseData;
-        // this.getData()
+        this.getData()
     },
     methods: {
+        getmoneyDate(data){
+            this.moneyDate = data;
+            this.getData()
+        },
+        getorderDate(data){
+            this.orderDate = data;
+            this.getData()
+        },
+        getHide(data){
+            this.hideState = (data==1?1:0)
+            this.getData()
+        },
         async getData(){
             var loading = this.$loading();
-            var resp = await this.$API.dash.manage.get();
+            var resp = await this.$API.dash.manage.get({"hide":this.hideState,"money":this.moneyDate,"order":this.orderDate});
             loading.close();
-            this.todayData = resp.data.today;
+            this.todayData = resp.data.data;
             let data = resp.data.moneys;
             let moneyDay = data.map(function (item) {
                 return item['当天日期'];
@@ -177,7 +196,7 @@ export default {
                         smooth: true, showBackground: true,
                         areaStyle: {color: 'rgba(180, 180, 180, 0.5)'},
                         type: 'line', showSymbol: true, xAxisIndex: 0, yAxisIndex: 0,
-                        label: {normal: {position: 'top', formatter: '{c} 元', show: true}},
+                        label: {normal: {position: 'top', formatter: '¥ {c} 元', show: true}},
                         data: data.map(function (item) {
                             return item['订单金额'];
                         }),
@@ -290,6 +309,12 @@ export default {
     display: flex;
     align-items: center;
 }
+.card-news .date-check{
+    position: absolute;
+    top: 10px;
+    right: 10px;
+    z-index: 99;
+}
 .total-panel-sub .sub-card .title.red::before{
     content: "";
     display: block;
@@ -357,7 +382,7 @@ export default {
     margin-bottom: 10px;
 }
 .total-panel .panel-item{
-    width: calc(20% - 9.6px);
+    width: calc(33.333333% - 9.6px);
     height: 130px;
     box-shadow: rgba(0, 0, 0, 0.05) 0px 0px 8px;
     position: relative;
@@ -390,6 +415,7 @@ export default {
     width: 100%;
     height: auto;
     z-index: 9;
+    top: 0;
 }
 .total-panel .panel-item .item-wave img {
     width: 100%;
@@ -431,6 +457,7 @@ export default {
     background-color: #fff;
     padding: 20px;
     border-radius: 5px;
+    position: relative;
 }
 .news-title{
     font-size: 16px;
@@ -440,6 +467,18 @@ export default {
     display: flex;
     align-items: center;
 }
+.news-title .title-open{
+    margin-left: auto;
+    margin-right: 0;
+    font-size: 12px;
+    font-weight: normal;
+    color: #666;
+    display: flex;
+    align-items: center;
+}
+.news-title .title-open .name{
+    margin-right: 10px;
+}
 .news-title::before{
     content: "";
     width: 4px;

+ 86 - 0
src/views/manage/finance/index/components/table.vue

@@ -0,0 +1,86 @@
+<template>
+    <scTable ref="table" :apiObj="list.apiObj" :params="searchKey" @selectionChange="selectionChange" row-key="id">
+        <el-table-column type="selection" width="50" fixed="left"></el-table-column>
+        
+        <el-table-column label="订单编号" prop="order_sn">
+            <template #default="scope">
+                {{scope.row.order_sn}}
+            </template>
+        </el-table-column>
+        <el-table-column label="套餐信息" prop="time">
+            <template #default="scope">
+                续费<span class="status-danger">{{scope.row.time}}天</span>
+            </template>
+        </el-table-column>
+        <el-table-column label="套餐金额" prop="money">
+            <template #default="scope">
+                {{ scope.row.money }}元
+            </template>
+        </el-table-column>
+        <el-table-column label="支付状态" prop="certificate_id">
+            <template #default="scope">
+                <div class="status-danger" v-if="scope.row.status==0"><sc-status-indicator type="danger"></sc-status-indicator> 待支付</div>
+                <div class="status-success" v-if="scope.row.status==1"><sc-status-indicator type="success"></sc-status-indicator>已完成</div>
+            </template>
+        </el-table-column>
+        <el-table-column label="支付时间" prop="pay_at">
+            <template #default="scope">
+                {{ scope.row.pay_at?scope.row.pay_at:'-' }}
+            </template>
+        </el-table-column>
+        <el-table-column label="创建时间" prop="create_at">
+            <template #default="scope">
+                {{ scope.row.create_at }}
+            </template>
+        </el-table-column>
+    </scTable>
+</template>
+
+<script>
+export default {
+    props: {
+        type: { type: String, default: "1" }
+    },
+    data(){
+        return {
+            colorData:['','彩色','黑白'],
+            duplexData:['','单面','双面'],
+            list: {
+                apiObj: this.$API.mRenew.list
+            },
+            visible:false,
+            dataSelect:[],
+            dataSelectFull:[],
+            searchKey:{
+                type:this.type
+            }
+        }
+    },
+    methods:{
+        table_edit(data){
+            this.$nextTick(() => {
+                this.$refs.formMain.open("edit",this.type).setData(data)
+            })
+        },
+        table_del(data){
+            this.$confirm("确定要删除该数据吗?","删除确认",{type: 'warning'}).then(async ()=>{
+                var resp = await this.$API.mPrice.del.post({"id":data.id,"type":""});
+                if (resp.code == 0) {
+                    return this.$message.error(resp.msg)
+                }
+                this.$message.success(resp.msg)
+                this.$refs.table.refresh()
+            }).catch(()=>{});
+        },
+        refresh(){
+            this.$refs.table.refresh()
+        },
+        upData(data){
+            this.$refs.table.upData(data)
+        },
+        handleSuccess(){
+            this.$refs.table.refresh()
+        },
+    }
+}
+</script>

+ 138 - 1
src/views/manage/finance/index/index.vue

@@ -1,3 +1,140 @@
 <template>
+    <el-container class="flex-column" v-loading="loading">
+        <div class="table-search" style="border-bottom: 0;">
+            <el-form class="lv-form-inline" ref="searchForm" :model="searchKey" label-position="right" label-width="100px">
+                <el-row :gutter="10">
+                    <el-col :xs="12" :sm="12" :md="12" :lg="12" :xl="6">
+                        <el-input v-model="searchKey.shop" placeholder="请选择店铺" clearbale readonly :style="{width:'100%'}" @click="selectStore">
+                            <template #append>
+                                <el-tooltip effect="dark" content="点这里,清除选择" placement="top-start">
+                                    <div class="remove-a" @click="clearStore">清除</div>
+                                </el-tooltip>
+                            </template>
+                            <template #prepend>选择店铺</template>
+                        </el-input>
+                    </el-col>
+                </el-row>
+            </el-form>
+            <el-card shadow="never" class="borderNone mt10">
+                <template #header>
+                    <div class="news-title">今日营业额</div>
+                </template>
+                <div class="user-card-body">
+                    <div class="card-item">
+                        <div class="card-num">{{todayData?$TOOL.money(todayData.money):'0.00'}}</div>
+                        <div class="card-tips">线上收款(元)
+                        </div>
+                    </div>
+                    <div class="card-item">
+                        <div class="card-num">{{todayData?$TOOL.money(todayData.user):'0.00'}}</div>
+                        <div class="card-tips">会员卡支付(元)
+                        </div>
+                    </div>
+                    <div class="card-item">
+                        <div class="card-num">{{todayData?$TOOL.money(todayData.qrcode):'0.00'}}</div>
+                        <div class="card-tips">其他支付(元)
+                            <el-tooltip effect="dark" content="收款码付款金额">
+                                <el-icon><el-icon-question-filled /></el-icon>
+                            </el-tooltip>
+                        </div>
+                    </div>
+                </div>
+            </el-card>
+            <div class="news-title mt10">线上支付总计(不涵盖会员卡支付和其他支付)</div>
+        </div>
+        <el-main class="nopadding">
+            <div class="table-container">
+                <el-table :data="tableData" style="width: 100%" border class="mt10">
+                    <el-table-column label="类型" prop="name"></el-table-column>
+                    <el-table-column label="支付类型" prop="type"></el-table-column>
+                    <el-table-column label="订单数" prop="order">
+                        <template #default="scope">
+                            {{ scope.row.order }}单
+                        </template>
+                    </el-table-column>
+                    <el-table-column label="订单金额" prop="money">
+                        <template #default="scope">
+                            {{ $TOOL.money(scope.row.money) }}
+                        </template>
+                    </el-table-column>
+                </el-table>
+                <!-- <tablePage ref="tablePage" @success="tableHandle" @successFull="tableHandleFull"></tablePage> -->
+            </div>
+        </el-main>
+    </el-container>
+    <storeData ref="storeData" :multiple="false" @success="handleStore"></storeData>
+</template>
 
-</template>
+<script>
+import tablePage from './components/table';
+import storeData from '@/views/manage/components/store';
+export default {
+    components: {
+        tablePage,storeData
+    },
+    data() {
+        return {
+            tableData:[],
+            todayData:null,
+            loading:true,
+            searchKey:{},
+            searchData:{}
+        }
+    },
+    mounted(){
+        this.getData()
+    },
+    methods:{
+        selectStore(){
+            this.$nextTick(()=>{
+                this.$refs.storeData.open()
+            })
+        },
+        handleStore(data){
+            this.searchKey.shop = data.shop_name;
+            this.searchData.shop = data.shop_id;
+            this.getData()
+        },
+        clearStore(){
+            this.searchKey.shop = "";
+            this.searchData.shop = "";
+        },
+        async getData() {
+            this.loading = true;
+            var resp = await this.$API.mQrcode.today.get(this.searchData);
+            this.loading = false;
+            if (resp.code == 0) {
+                return this.$message.error(resp.msg)
+            }
+            this.tableData = resp.data.total;
+            this.todayData = resp.data.today;
+        }
+    }
+}
+</script>
+
+<style>
+.user-card-body{display: flex;align-items: center;justify-content: space-around;padding: 10px 0;}
+.user-card-body .card-item{text-align: center;}
+.user-card-body .card-tips{font-size: 12px;color: #666;display: flex;align-items: center;}
+.user-card-body .card-tips i{font-style: normal;margin-left: 5px;}
+.user-card-body .card-num{font-size: 20px;font-weight: bold;}
+.mb10{margin-bottom: 15px;}
+.news-title{
+    font-size: 16px;
+    color: #000;
+    font-weight: bold;
+    margin-bottom: 10px;
+    display: flex;
+    align-items: center;
+}
+.news-title::before{
+    content: "";
+    width: 4px;
+    height: 16px;
+    display: block;
+    background-color: var(--el-color-primary);;
+    margin-right: 8px;
+}
+.remove-a{cursor: pointer;}
+</style>

+ 50 - 0
src/views/manage/member/index/components/option.vue

@@ -0,0 +1,50 @@
+<template>
+    <fieldset>
+        <legend>
+            <el-tag type="info">按需操作</el-tag>
+        </legend>
+        <div class="op-header">
+            <div class="left-panel">
+                <el-button type="primary" icon="el-icon-plus" @click="table_add(2)">新增员工账号</el-button>
+                <!-- <el-button type="primary" icon="el-icon-download" @click="table_export()">导出</el-button> -->
+            </div>
+        </div>
+    </fieldset>
+</template>
+
+<script>
+export default {
+    props: {
+        type: { type: String, default: "1" },
+        dataSelect: { type: Array, default: () => [] },
+        dataSelectFull: { type: Array, default: () => [] }
+    },
+    data(){
+        return {
+
+        }
+    },
+    methods: {
+        async table_batch_status(status){
+            if (this.dataSelect.length == 0) {
+                return this.$message.error("请选择修改数据")
+            }
+            let submitData = {"id":this.dataSelect,"value":status,"field":"status","type":"batch"};
+            var resp = await this.$API.mStaff.batch.post(submitData);
+            if (resp.code == 0) {
+                return this.$message.error(resp.msg);
+            }
+            this.$message.success(resp.msg);
+            this.$emit("success");
+        },
+        handleSuccess(){
+            this.$emit("success");
+        },
+        table_add(type){
+            this.$nextTick(() => {
+                this.$refs.formMain.open("add")
+            })
+        },
+    }
+}
+</script>

+ 42 - 0
src/views/manage/member/index/components/search.vue

@@ -0,0 +1,42 @@
+<template>
+    <fieldset>
+        <legend>
+            <el-tag type="info">条件筛选</el-tag>
+        </legend>
+        <el-form class="lv-form-inline" ref="searchForm" :model="searchKey" label-position="right" label-width="100px">
+            <div class="search-form">
+                <div class="form-left">
+                    <el-row :gutter="10">
+                        <el-col :xs="12" :sm="12" :md="12" :lg="6" :xl="4">
+                            <el-input v-model="searchKey.orderid" placeholder="会员卡号" clearable :style="{ width: '100%' }" @keyup.enter="searchForm()">
+                                <template #prepend>会员卡号</template>
+                            </el-input>
+                        </el-col>
+                        <el-col :xs="12" :sm="6" :md="6" :lg="6" :xl="4">
+                            <el-date-picker v-model="searchKey.create" :style="{width: '100%'}" placeholder="请选择创建时间" start-placeholder="开始时间" end-placeholder="结束时间" type="daterange" range-separator="至" @change="searchForm" />
+                        </el-col>
+                    </el-row>
+                </div>
+                <div class="form-line"></div>
+                <div class="form-right">
+                    <el-button type="primary" icon="el-icon-search" @click="searchForm">搜索</el-button>
+                </div>
+            </div>
+        </el-form>
+    </fieldset>
+</template>
+
+<script>
+export default {
+    data(){
+        return {
+            searchKey:{}
+        }
+    },
+    methods: {
+        searchForm(){
+            this.$emit("success",this.searchKey);
+        }
+    }
+}
+</script>

+ 90 - 0
src/views/manage/member/index/components/table.vue

@@ -0,0 +1,90 @@
+<template>
+    <scTable ref="table" :apiObj="list.apiObj" :params="searchKey" @selectionChange="selectionChange" row-key="id">
+        <el-table-column type="selection" width="50" fixed="left"></el-table-column>
+        <el-table-column label="会员ID" prop="openid" width="220" fixed="left"></el-table-column>
+        <el-table-column label="会员卡号" prop="card_no"></el-table-column>
+        <el-table-column label="总充值金额" prop="money">
+            <template #default="scope">
+                <el-tag>{{ $TOOL.money(scope.row.total_balance) }}</el-tag>
+            </template>
+        </el-table-column>
+        <el-table-column label="累计消费" prop="money">
+            <template #default="scope">
+                <el-tag>{{ $TOOL.money(scope.row.total_consume) }}</el-tag>
+            </template>
+        </el-table-column>
+        <el-table-column label="账户余额" prop="money">
+            <template #default="scope">
+                <el-tag>{{ $TOOL.money(scope.row.balance) }}</el-tag>
+            </template>
+        </el-table-column>
+        <el-table-column label="加入时间" prop="create_at" width="180"></el-table-column>
+        <el-table-column label="操作" width="160" align="right" fixed="right">
+            <template #default="scope">
+                <el-button-group>
+                    <el-button text type="warning" size="small" @click="table_edit(scope.row)">详情</el-button>
+                    <el-popconfirm title="确定要退款吗?" @confirm="table_del(scope.row, scope.$index)" v-if="scope.row.status > 0">
+                        <template #reference>
+                            <el-button text type="danger" size="small">退款</el-button>
+                        </template>
+                    </el-popconfirm>                    
+                </el-button-group>
+            </template>
+        </el-table-column>
+    </scTable>
+</template>
+
+<script>
+export default {
+    props: {
+        type: { type: String, default: "1" }
+    },
+    data(){
+        return {
+            colorData:['','彩色','黑白'],
+            duplexData:['','单面','双面'],
+            list: {
+                apiObj: this.$API.mUser.list
+            },
+            status: ['待支付','待打印', '打印失败', '已打印','申请退款','退款失败','已退款'],
+            ostatus: ['-','店内打印', '远程自取', '商家配送'],
+            payStatus:['-','微信','会员卡'],
+            visible:false,
+            dataSelect:[],
+            dataSelectFull:[],
+            searchKey:{}
+        }
+    },
+    methods:{
+        table_edit(data){
+            this.$nextTick(() => {
+                this.$refs.formMain.open("edit",this.type).setData(data)
+            })
+        },
+        table_del(data){
+            this.$confirm("确定要删除该数据吗?","删除确认",{type: 'warning'}).then(async ()=>{
+                var resp = await this.$API.mPrice.del.post({"id":data.id,"type":""});
+                if (resp.code == 0) {
+                    return this.$message.error(resp.msg)
+                }
+                this.$message.success(resp.msg)
+                this.$refs.table.refresh()
+            }).catch(()=>{});
+        },
+        refresh(){
+            this.$refs.table.refresh()
+        },
+        upData(data){
+            this.$refs.table.upData(data)
+        },
+        handleSuccess(){
+            this.$refs.table.refresh()
+        },
+    }
+}
+</script>
+
+<style>
+.price{display: flex;align-items: center;}
+.del{text-decoration: line-through;margin-left: 5px;color: #f00;}
+</style>

+ 83 - 1
src/views/manage/member/index/index.vue

@@ -1,3 +1,85 @@
 <template>
+    <el-container class="flex-column">
+        <div class="table-search" style="border-bottom: 0;">
+            <search @success="handleSuccess"></search>
+        </div>
+        <el-main class="nopadding">
+            <div class="table-container">
+                <tablePage ref="tablePage" @success="tableHandle" @successFull="tableHandleFull" @total="orderTotal"></tablePage>
+            </div>
+        </el-main>
+    </el-container>
+</template>
 
-</template>
+<script>
+import search from './components/search';
+import tablePage from './components/table';
+import scStatistic from '@/components/scStatistic';
+export default {
+    components: {
+        search,tablePage,scStatistic
+    },
+    data(){
+        return {
+            totalLoading:true,
+            searchKey:{},
+            dataSelect:[],
+            dataSelectFull:[],
+            totalData:{},
+            searchData:null
+        }
+    },
+    methods: {
+        orderTotal(data,searchKey){
+            this.totalLoading = false;
+            this.totalData = data;
+            if (searchKey.create) {
+                var start = this.$TOOL.dateFormat(searchKey.create[0], "yyyy-MM-dd");
+                var end = this.$TOOL.dateFormat(searchKey.create[1], "yyyy-MM-dd");
+                this.searchData = start+"-"+end;
+            }
+        },
+        tableHandle(data){
+            this.dataSelect = data;
+        },
+        tableHandleFull(data){
+            this.dataSelectFull = data;
+        },
+        handleSuccess(data){
+            this.$refs.tablePage.upData(data)
+        },
+        handleClick(name){
+            this.activeName = name;
+            this.searchKey.type = name;
+            this.$refs.tablePage.upData(this.searchKey)
+        }
+    }
+}
+</script>
+
+<style>
+.user-card-body{display: flex;align-items: center;justify-content: space-around;padding: 10px 0;}
+.user-card-body .card-item{text-align: center;}
+.user-card-body .card-item .card-num span{font-size: 12px;color: #666;font-weight: normal;}
+.user-card-body .card-tips{font-size: 12px;color: #666;display: flex;align-items: center;}
+.user-card-body .card-tips i{font-style: normal;margin-left: 5px;}
+.user-card-body .card-num{font-size: 20px;font-weight: bold;}
+.mb10{margin-bottom: 15px;}
+.news-title{
+    font-size: 16px;
+    color: #000;
+    font-weight: bold;
+    margin-bottom: 10px;
+    display: flex;
+    align-items: center;
+}
+.news-title::before{
+    content: "";
+    width: 4px;
+    height: 16px;
+    display: block;
+    background-color: var(--el-color-primary);;
+    margin-right: 8px;
+}
+.news-title span{margin-left: 10px;font-weight: normal;color: #666;font-size: 12px;}
+</style>

+ 49 - 0
src/views/manage/member/record/components/search.vue

@@ -0,0 +1,49 @@
+<template>
+    <fieldset>
+        <legend>
+            <el-tag type="info">条件筛选</el-tag>
+        </legend>
+        <el-form class="lv-form-inline" ref="searchForm" :model="searchKey" label-position="right" label-width="100px">
+            <div class="search-form">
+                <div class="form-left">
+                    <el-row :gutter="10">
+                        <el-col :xs="12" :sm="12" :md="12" :lg="6" :xl="4">
+                            <el-input v-model="searchKey.orderid" placeholder="会员卡号" clearable :style="{ width: '100%' }" @keyup.enter="searchForm()">
+                                <template #prepend>会员卡号</template>
+                            </el-input>
+                        </el-col>
+                        <el-col :xs="12" :sm="12" :md="12" :lg="6" :xl="4">
+                            <el-select v-model="searchKey.type" clearable placeholder="请选择类型" @change="searchForm" :style="{width: '100%'}" class="diy-select">
+                                <el-option value="1" label="支出"></el-option>
+                                <el-option value="2" label="收入"></el-option>
+                                <template #prefix>流水类型</template>
+                            </el-select>
+                        </el-col>
+                        <el-col :xs="12" :sm="6" :md="6" :lg="6" :xl="4">
+                            <el-date-picker v-model="searchKey.create" :style="{width: '100%'}" placeholder="请选择创建时间" start-placeholder="开始时间" end-placeholder="结束时间" type="daterange" range-separator="至" @change="searchForm" />
+                        </el-col>
+                    </el-row>
+                </div>
+                <div class="form-line"></div>
+                <div class="form-right">
+                    <el-button type="primary" icon="el-icon-search" @click="searchForm">搜索</el-button>
+                </div>
+            </div>
+        </el-form>
+    </fieldset>
+</template>
+
+<script>
+export default {
+    data(){
+        return {
+            searchKey:{}
+        }
+    },
+    methods: {
+        searchForm(){
+            this.$emit("success",this.searchKey);
+        }
+    }
+}
+</script>

+ 93 - 0
src/views/manage/member/record/components/table.vue

@@ -0,0 +1,93 @@
+<template>
+    <scTable ref="table" :apiObj="list.apiObj" :params="searchKey" @selectionChange="selectionChange" row-key="id">
+        <el-table-column type="selection" width="50" fixed="left"></el-table-column>
+        <el-table-column label="会员ID" prop="openid" width="220" fixed="left"></el-table-column>
+        <el-table-column label="会员卡号" prop="card_no">
+            <template #default="scope">
+                {{ scope.row.card_no?scope.row.card_no:'-' }}
+            </template>
+        </el-table-column>
+        <el-table-column label="订单编号" prop="order_sn">
+            <template #default="scope">
+                {{ scope.row.order_sn?scope.row.order_sn:'-' }}
+            </template>
+        </el-table-column>
+        <el-table-column label="类型" prop="type">
+            <template #default="scope">
+                <el-tag type="error" v-if="scope.row.type == 1">支出</el-tag>
+                <el-tag type="success" v-if="scope.row.type == 2">收入</el-tag>
+            </template>
+        </el-table-column>
+        <el-table-column label="金额" prop="money">
+            <template #default="scope">
+                ¥{{ scope.row.money }}
+            </template>
+        </el-table-column>
+        <el-table-column label="余额" prop="money">
+            <template #default="scope">
+                {{ $TOOL.money(scope.row.balance) }}
+            </template>
+        </el-table-column>
+        <el-table-column label="其他" prop="order_sn" width="220">
+            <template #default="scope">
+                {{ scope.row.remark?scope.row.remark:'-' }}
+            </template>
+        </el-table-column>
+        <el-table-column label="时间" prop="create_at" width="180"></el-table-column>
+    </scTable>
+</template>
+
+<script>
+export default {
+    props: {
+        type: { type: String, default: "1" }
+    },
+    data(){
+        return {
+            colorData:['','彩色','黑白'],
+            duplexData:['','单面','双面'],
+            list: {
+                apiObj: this.$API.mUser.log
+            },
+            status: ['待支付','待打印', '打印失败', '已打印','申请退款','退款失败','已退款'],
+            ostatus: ['-','店内打印', '远程自取', '商家配送'],
+            payStatus:['-','微信','会员卡'],
+            visible:false,
+            dataSelect:[],
+            dataSelectFull:[],
+            searchKey:{}
+        }
+    },
+    methods:{
+        table_edit(data){
+            this.$nextTick(() => {
+                this.$refs.formMain.open("edit",this.type).setData(data)
+            })
+        },
+        table_del(data){
+            this.$confirm("确定要删除该数据吗?","删除确认",{type: 'warning'}).then(async ()=>{
+                var resp = await this.$API.mPrice.del.post({"id":data.id,"type":""});
+                if (resp.code == 0) {
+                    return this.$message.error(resp.msg)
+                }
+                this.$message.success(resp.msg)
+                this.$refs.table.refresh()
+            }).catch(()=>{});
+        },
+        refresh(){
+            this.$refs.table.refresh()
+        },
+        upData(data){
+            this.$refs.table.upData(data)
+        },
+        handleSuccess(){
+            this.$refs.table.refresh()
+        },
+    }
+}
+</script>
+
+<style>
+.price{display: flex;align-items: center;}
+.del{text-decoration: line-through;margin-left: 5px;color: #f00;}
+</style>

+ 82 - 1
src/views/manage/member/record/index.vue

@@ -1,3 +1,84 @@
 <template>
+    <el-container class="flex-column">
+        <div class="table-search" style="border-bottom: 0;">
+            <search @success="handleSuccess"></search>
+        </div>
+        <el-main class="nopadding">
+            <div class="table-container">
+                <tablePage ref="tablePage" @success="tableHandle" @successFull="tableHandleFull" @total="orderTotal"></tablePage>
+            </div>
+        </el-main>
+    </el-container>
+</template>
 
-</template>
+<script>
+import search from './components/search';
+import tablePage from './components/table';
+export default {
+    components: {
+        search,tablePage
+    },
+    data(){
+        return {
+            totalLoading:true,
+            searchKey:{},
+            dataSelect:[],
+            dataSelectFull:[],
+            totalData:{},
+            searchData:null
+        }
+    },
+    methods: {
+        orderTotal(data,searchKey){
+            this.totalLoading = false;
+            this.totalData = data;
+            if (searchKey.create) {
+                var start = this.$TOOL.dateFormat(searchKey.create[0], "yyyy-MM-dd");
+                var end = this.$TOOL.dateFormat(searchKey.create[1], "yyyy-MM-dd");
+                this.searchData = start+"-"+end;
+            }
+        },
+        tableHandle(data){
+            this.dataSelect = data;
+        },
+        tableHandleFull(data){
+            this.dataSelectFull = data;
+        },
+        handleSuccess(data){
+            this.$refs.tablePage.upData(data)
+        },
+        handleClick(name){
+            this.activeName = name;
+            this.searchKey.type = name;
+            this.$refs.tablePage.upData(this.searchKey)
+        }
+    }
+}
+</script>
+
+<style>
+.user-card-body{display: flex;align-items: center;justify-content: space-around;padding: 10px 0;}
+.user-card-body .card-item{text-align: center;}
+.user-card-body .card-item .card-num span{font-size: 12px;color: #666;font-weight: normal;}
+.user-card-body .card-tips{font-size: 12px;color: #666;display: flex;align-items: center;}
+.user-card-body .card-tips i{font-style: normal;margin-left: 5px;}
+.user-card-body .card-num{font-size: 20px;font-weight: bold;}
+.mb10{margin-bottom: 15px;}
+.news-title{
+    font-size: 16px;
+    color: #000;
+    font-weight: bold;
+    margin-bottom: 10px;
+    display: flex;
+    align-items: center;
+}
+.news-title::before{
+    content: "";
+    width: 4px;
+    height: 16px;
+    display: block;
+    background-color: var(--el-color-primary);;
+    margin-right: 8px;
+}
+.news-title span{margin-left: 10px;font-weight: normal;color: #666;font-size: 12px;}
+</style>

+ 152 - 0
src/views/manage/order/index/components/detail.vue

@@ -0,0 +1,152 @@
+<template>
+    <el-drawer :title="titleMap[mode]" :append-to-body="true" v-model="visible" :size="1000" destroy-on-close :close-on-click-modal="false" @closed="$emit('closed')" :with-header="false">
+        <el-container class="flex-column" v-loading="loading">
+            <div class="drawer-detail-main">
+                <div class="drawer-detail-header">
+                    <div class="drawer-detail-header-body">
+                        <div class="drawer-detail-header-left">{{titleMap[mode]}} <span class="tips">{{ formData.order_sn }}</span></div>
+                        <div class="drawer-detail-header-left">
+                            <el-button type="default" icon="el-icon-close" @click="visible=false"></el-button>
+                        </div>
+                    </div>
+                </div>
+            </div>
+            <el-main>
+                <el-descriptions :column="3" size="large" direction="vertical" border>
+                    <el-descriptions-item>
+                        <template #label>订单编号</template>{{ formData.order_sn }}
+                    </el-descriptions-item>
+                    <el-descriptions-item>
+                        <template #label>下单用户</template>{{ formData.openid }}
+                    </el-descriptions-item>
+                    <el-descriptions-item>
+                        <template #label>取件号</template>{{ formData.package_sn }}
+                    </el-descriptions-item>
+                    <el-descriptions-item>
+                        <template #label>取件方式</template>{{ ostatus[formData.package] }}
+                    </el-descriptions-item>
+                    <el-descriptions-item>
+                        <template #label>订单状态</template>{{ status[formData.status] }}
+                    </el-descriptions-item>
+                    <el-descriptions-item>
+                        <template #label>打印机</template>{{ formData.print_name }}
+                    </el-descriptions-item>
+                    <el-descriptions-item>
+                        <template #label>下单时间</template>{{ formData.create_at }}
+                    </el-descriptions-item>
+                    <el-descriptions-item>
+                        <template #label>支付时间</template>{{ formData.pay_at?formData.pay_at:'-' }} <template v-if="formData.pay_at"><el-tag type="success">{{ payStatus[formData.pay_type] }}</el-tag></template>
+                    </el-descriptions-item>
+                    <el-descriptions-item>
+                        <template #label>失败原因</template>{{ formData.reason?formData.reason:'-' }}
+                    </el-descriptions-item>
+                </el-descriptions>
+                <el-descriptions :column="2" size="large" direction="vertical" class="mt10" border>
+                    <el-descriptions-item>
+                        <template #label>支付金额(元)</template> 
+                        <div class="price" v-if="formData.discount > 0">
+                            {{ $TOOL.money(formData.discount) }}
+                            <div class="del">{{ $TOOL.money(formData.money) }}</div>
+                        </div>
+                        <div class="price" v-else>
+                            {{ $TOOL.money(formData.money) }}
+                        </div>
+                    </el-descriptions-item>
+                    <el-descriptions-item>
+                        <template #label>含配送费(元)</template>{{ $TOOL.money(formData.express_money) }}
+                    </el-descriptions-item>
+                    <el-descriptions-item>
+                        <template #label>优惠券金额(元)</template>{{ $TOOL.money(formData.coupon_money) }}
+                    </el-descriptions-item>
+                    <el-descriptions-item>
+                        <template #label>整单装订总价(元)</template>{{ $TOOL.money(formData.staple_money) }}
+                    </el-descriptions-item>
+                </el-descriptions>
+                <el-table :data="tableData" style="width: 100%" border class="mt10">
+                    <el-table-column label="文件名" prop="name" width="260" fixed="left"></el-table-column>
+                    <el-table-column label="页数" prop="page" align="center"></el-table-column>
+                    <el-table-column label="纸张" prop="paper_size"></el-table-column>
+                    <el-table-column label="颜色" prop="name">
+                        <template #default="scope">
+                            <el-tag>{{ scope.row.color==1?'彩色':'黑白' }}</el-tag>
+                        </template>
+                    </el-table-column>
+                    <el-table-column label="单双面" prop="name">
+                        <template #default="scope">
+                            <el-tag>{{ scope.row.duplex==1?'单面':'双面' }}</el-tag>
+                        </template>
+                    </el-table-column>
+                    <el-table-column label="打印范围" prop="name" align="center">
+                        <template #default="scope">
+                            {{ scope.row.start_page }} - {{ scope.row.end_page }}
+                        </template>
+                    </el-table-column>
+                    <el-table-column label="份数" prop="number" align="center"></el-table-column>
+                    <el-table-column label="装订方式" prop="name">
+                        <template #default="scope">
+                            不装订
+                        </template>
+                    </el-table-column>
+                    <el-table-column label="订单金额" prop="name">
+                        <template #default="scope">
+                            {{ $TOOL.money(scope.row.money) }}
+                        </template>
+                    </el-table-column>
+                    <el-table-column label="操作" width="160" align="right" fixed="right">
+                        <template #default="scope">
+                            <el-button-group>
+                                <el-button text type="warning" size="small" @click="table_edit(scope.row)">预览/下载</el-button>
+                                <el-popconfirm title="确定要退款吗?" @confirm="table_del(scope.row, scope.$index)" v-if="scope.row.status > 0">
+                                    <template #reference>
+                                        <el-button text type="danger" size="small">退款</el-button>
+                                    </template>
+                                </el-popconfirm>                    
+                            </el-button-group>
+                        </template>
+                    </el-table-column>
+                </el-table>
+            </el-main>
+            <el-footer style="text-align: right;">
+                <el-button @click="visible=false" >关闭</el-button>
+            </el-footer>
+        </el-container>
+    </el-drawer>
+</template>
+
+<script>
+export default {
+    data() {
+        return {
+            loading: false,
+            mode: "add",
+            titleMap: {
+                add: "新增渠道",
+                edit: "订单详情"
+            },
+            status: ['待支付','待打印', '打印失败', '已打印','申请退款','退款失败','已退款'],
+            ostatus: ['-','店内打印', '远程自取', '商家配送'],
+            payStatus:['-','微信','会员卡'],
+            visible: false,
+            isSaveing: false,
+            formData: {},
+            rules: {},
+            tableData:[]
+        }
+    },
+    methods: {
+        open(mode = 'add') {
+            this.mode = mode;
+            this.visible = true;
+            return this;
+        },
+        //表单注入数据
+        setData(data) {
+            this.formData = data;
+            this.tableData = data.detail;
+        },
+    }
+}
+</script>
+<style>
+.mt10{margin-top: 10px;}
+</style>

+ 50 - 0
src/views/manage/order/index/components/option.vue

@@ -0,0 +1,50 @@
+<template>
+    <fieldset>
+        <legend>
+            <el-tag type="info">按需操作</el-tag>
+        </legend>
+        <div class="op-header">
+            <div class="left-panel">
+                <el-button type="primary" icon="el-icon-plus" @click="table_add(2)">新增员工账号</el-button>
+                <!-- <el-button type="primary" icon="el-icon-download" @click="table_export()">导出</el-button> -->
+            </div>
+        </div>
+    </fieldset>
+</template>
+
+<script>
+export default {
+    props: {
+        type: { type: String, default: "1" },
+        dataSelect: { type: Array, default: () => [] },
+        dataSelectFull: { type: Array, default: () => [] }
+    },
+    data(){
+        return {
+
+        }
+    },
+    methods: {
+        async table_batch_status(status){
+            if (this.dataSelect.length == 0) {
+                return this.$message.error("请选择修改数据")
+            }
+            let submitData = {"id":this.dataSelect,"value":status,"field":"status","type":"batch"};
+            var resp = await this.$API.mStaff.batch.post(submitData);
+            if (resp.code == 0) {
+                return this.$message.error(resp.msg);
+            }
+            this.$message.success(resp.msg);
+            this.$emit("success");
+        },
+        handleSuccess(){
+            this.$emit("success");
+        },
+        table_add(type){
+            this.$nextTick(() => {
+                this.$refs.formMain.open("add")
+            })
+        },
+    }
+}
+</script>

+ 81 - 0
src/views/manage/order/index/components/search.vue

@@ -0,0 +1,81 @@
+<template>
+    <fieldset>
+        <legend>
+            <el-tag type="info">条件筛选</el-tag>
+        </legend>
+        <el-form class="lv-form-inline" ref="searchForm" :model="searchKey" label-position="right" label-width="100px">
+            <div class="search-form">
+                <div class="form-left">
+                    <el-row :gutter="10">
+                        <el-col :xs="12" :sm="12" :md="12" :lg="6" :xl="6">
+                            <el-input v-model="searchKey.shop" placeholder="请选择店铺" clearbale readonly :style="{width:'100%'}" @click="selectStore">
+                                <template #append>
+                                    <el-tooltip effect="dark" content="点这里,清除选择" placement="top-start">
+                                        <div class="remove-a" @click="clearStore">清除</div>
+                                    </el-tooltip>
+                                </template>
+                                <template #prepend>选择店铺</template>
+                            </el-input>
+                        </el-col>
+                        <el-col :xs="12" :sm="12" :md="12" :lg="6" :xl="4">
+                            <el-input v-model="searchKey.orderid" placeholder="订单编号" clearable :style="{ width: '100%' }" @keyup.enter="searchForm()">
+                                <template #prepend>订单编号</template>
+                            </el-input>
+                        </el-col>
+                        <el-col :xs="12" :sm="12" :md="12" :lg="6" :xl="4">
+                            <el-select v-model="searchKey.status" clearable placeholder="请选择状态" @change="searchForm" :style="{width: '100%'}" class="diy-select">
+                                <el-option value="2" label="待打印"></el-option>
+                                <el-option value="3" label="打印失败"></el-option>
+                                <el-option value="4" label="已打印"></el-option>
+                                <el-option value="5" label="退款中"></el-option>
+                                <el-option value="6" label="退款失败"></el-option>
+                                <el-option value="7" label="已退款"></el-option>
+                                <template #prefix>状态</template>
+                            </el-select>
+                        </el-col>
+                        <el-col :xs="12" :sm="6" :md="6" :lg="6" :xl="4">
+                            <el-date-picker v-model="searchKey.create" :style="{width: '100%'}" placeholder="请选择创建时间" start-placeholder="开始时间" end-placeholder="结束时间" type="daterange" range-separator="至" @change="searchForm" />
+                        </el-col>
+                    </el-row>
+                </div>
+                <div class="form-line"></div>
+                <div class="form-right">
+                    <el-button type="primary" icon="el-icon-search" @click="searchForm">搜索</el-button>
+                </div>
+            </div>
+        </el-form>
+    </fieldset>
+    <storeData ref="storeData" :multiple="false" @success="handleStore"></storeData>
+</template>
+
+<script>
+import storeData from '@/views/manage/components/store';
+export default {
+    components: {
+        storeData
+    },
+    data(){
+        return {
+            searchKey:{}
+        }
+    },
+    methods: {
+        selectStore(){
+            this.$nextTick(()=>{
+                this.$refs.storeData.open()
+            })
+        },
+        handleStore(data){
+            this.searchKey.shop = data.shop_id;
+            this.$emit("success",this.searchKey);
+        },
+        clearStore(){
+            this.searchKey.shop = "";
+            this.$emit("success",this.searchKey);
+        },
+        searchForm(){
+            this.$emit("success",this.searchKey);
+        }
+    }
+}
+</script>

+ 146 - 0
src/views/manage/order/index/components/table.vue

@@ -0,0 +1,146 @@
+<template>
+    <scTable ref="table" :apiObj="list.apiObj" :params="searchKey" @selectionChange="selectionChange" row-key="id" @dataChange="getTotal">
+        <el-table-column type="selection" width="50" fixed="left"></el-table-column>
+        <el-table-column label="订单编号" width="200" prop="order_sn" fixed="left">
+            <template #default="scope">
+                {{scope.row.order_sn}}
+            </template>
+        </el-table-column>
+        <el-table-column label="下单用户" prop="openid" width="220"></el-table-column>
+        <el-table-column label="订单状态" prop="certificate_id" width="120">
+            <template #default="scope">
+                {{ status[scope.row.status] }}
+            </template>
+        </el-table-column>
+        <el-table-column label="订单金额" prop="money" width="120">
+            <template #default="scope">
+                <div class="price" v-if="scope.row.money > scope.row.discount">
+                    <el-tag>{{ $TOOL.money(scope.row.discount) }}</el-tag>
+                    <div class="del">{{ $TOOL.money(scope.row.money) }}</div>
+                </div>
+                <div class="price" v-else>
+                    <el-tag>{{ $TOOL.money(scope.row.money) }}</el-tag>
+                </div>
+            </template>
+        </el-table-column>
+        <el-table-column label="额外加价" prop="money" width="120">
+            <template #default="scope">
+                {{ $TOOL.money(scope.row.extra_money) }}
+            </template>
+        </el-table-column>
+        <el-table-column label="支付类型" prop="money" width="120">
+            <template #default="scope">
+                <el-tag>{{ payStatus[scope.row.status] }}</el-tag>
+            </template>
+        </el-table-column>
+        <el-table-column label="打印机" prop="money" width="180">
+            <template #default="scope">
+                {{ scope.row.print_name }}
+            </template>
+        </el-table-column>
+        <el-table-column label="取件方式" prop="money" width="120">
+            <template #default="scope">
+                {{ ostatus[scope.row.package] }}
+            </template>
+        </el-table-column>
+        <el-table-column label="取件号" prop="package_sn" width="120"></el-table-column>
+        <el-table-column label="失败原因" prop="money" width="220">
+            <template #default="scope">
+                {{ scope.row.reason?scope.row.reason:'-' }}
+            </template>
+        </el-table-column>
+        <el-table-column label="支付时间" prop="pay_at" width="180">
+            <template #default="scope">
+                {{ scope.row.pay_at?scope.row.pay_at:'-' }}
+            </template>
+        </el-table-column>
+        <el-table-column label="打印时间" prop="pay_at" width="180">
+            <template #default="scope">
+                {{ scope.row.print_at?scope.row.print_at:'-' }}
+            </template>
+        </el-table-column>
+        <el-table-column label="创建时间" prop="create_at" width="180">
+            <template #default="scope">
+                {{ scope.row.create_at }}
+            </template>
+        </el-table-column>
+        <el-table-column label="操作" width="160" align="right" fixed="right">
+            <template #default="scope">
+                <el-button-group>
+                    <el-button text type="warning" size="small" @click="table_edit(scope.row)">详情</el-button>
+                    <el-popconfirm title="确定要退款吗?" @confirm="table_del(scope.row, scope.$index)" v-if="scope.row.status > 0">
+                        <template #reference>
+                            <el-button text type="danger" size="small">退款</el-button>
+                        </template>
+                    </el-popconfirm>                    
+                </el-button-group>
+            </template>
+        </el-table-column>
+    </scTable>
+    <formMain ref="formMain" @success="handleSuccess"></formMain>
+</template>
+
+<script>
+import formMain from "./detail";
+export default {
+    props: {
+        type: { type: String, default: "1" }
+    },
+    components: {
+        formMain
+    },
+    data(){
+        return {
+            colorData:['','彩色','黑白'],
+            duplexData:['','单面','双面'],
+            list: {
+                apiObj: this.$API.mOrder.list
+            },
+            status: ['待支付','待打印', '打印失败', '已打印','申请退款','退款失败','已退款'],
+            ostatus: ['-','店内打印', '远程自取', '商家配送'],
+            payStatus:['-','微信','会员卡'],
+            visible:false,
+            dataSelect:[],
+            dataSelectFull:[],
+            searchKey:{}
+        }
+    },
+    methods:{
+        async getTotal(){
+            var resp = await this.$API.mOrder.total.get(this.searchKey);
+            if (resp.code == 1) {
+                this.$emit("total",resp.data.total,this.searchKey);
+            }
+        },
+        table_edit(data){
+            this.$nextTick(() => {
+                this.$refs.formMain.open("edit",this.type).setData(data)
+            })
+        },
+        table_del(data){
+            this.$confirm("确定要删除该数据吗?","删除确认",{type: 'warning'}).then(async ()=>{
+                var resp = await this.$API.mPrice.del.post({"id":data.id,"type":""});
+                if (resp.code == 0) {
+                    return this.$message.error(resp.msg)
+                }
+                this.$message.success(resp.msg)
+                this.$refs.table.refresh()
+            }).catch(()=>{});
+        },
+        refresh(){
+            this.$refs.table.refresh()
+        },
+        upData(data){
+            this.$refs.table.upData(data)
+        },
+        handleSuccess(){
+            this.$refs.table.refresh()
+        },
+    }
+}
+</script>
+
+<style>
+.price{display: flex;align-items: center;}
+.del{text-decoration: line-through;margin-left: 5px;color: #f00;}
+</style>

+ 120 - 1
src/views/manage/order/index/index.vue

@@ -1,3 +1,122 @@
 <template>
+    <el-container class="flex-column">
+        <div class="table-search" style="border-bottom: 0;" v-loading="totalLoading">
+            <el-card shadow="never" class="borderNone mb10">
+                <template #header>
+                    <div class="news-title">订单数统计
+                        <template v-if="searchData"><span>截止:{{ searchData }}</span></template>
+                    </div>
+                </template>
+                <div class="user-card-body">
+                    <div class="card-item">
+                        <div class="card-num">{{ totalData.ta?totalData.ta:'0' }} <span>单</span></div>
+                        <div class="card-tips">全部订单</div>
+                    </div>
+                    <div class="card-item">
+                        <div class="card-num">{{ totalData.t1?totalData.t1:'0' }} <span>单</span></div>
+                        <div class="card-tips">待打印</div>
+                    </div>
+                    <div class="card-item">
+                        <div class="card-num">{{ totalData.t2?totalData.t2:'0' }} <span>单</span></div>
+                        <div class="card-tips">打印失败</div>
+                    </div>
+                    <div class="card-item">
+                        <div class="card-num">{{ totalData.t3?totalData.t3:'0' }} <span>单</span></div>
+                        <div class="card-tips">已完成</div>
+                    </div>
+                    <div class="card-item">
+                        <div class="card-num">{{ totalData.t4?totalData.t4:'0' }} <span>单</span></div>
+                        <div class="card-tips">退款中</div>
+                    </div>
+                    <div class="card-item">
+                        <div class="card-num">{{ totalData.t5?totalData.t5:'0' }} <span>单</span></div>
+                        <div class="card-tips">退款失败</div>
+                    </div>
+                    <div class="card-item">
+                        <div class="card-num">{{ totalData.t6?totalData.t6:'0' }} <span>单</span></div>
+                        <div class="card-tips">已退款</div>
+                    </div>
+                </div>
+            </el-card>
+            <search @success="handleSuccess"></search>
+        </div>
+        <el-main class="nopadding">
+            <div class="table-container">
+                <tablePage ref="tablePage" @success="tableHandle" @successFull="tableHandleFull" @total="orderTotal"></tablePage>
+            </div>
+        </el-main>
+    </el-container>
+</template>
 
-</template>
+<script>
+import search from './components/search';
+import tablePage from './components/table';
+import scStatistic from '@/components/scStatistic';
+export default {
+    components: {
+        search,tablePage,scStatistic
+    },
+    data(){
+        return {
+            totalLoading:true,
+            searchKey:{},
+            dataSelect:[],
+            dataSelectFull:[],
+            totalData:{},
+            searchData:null
+        }
+    },
+    methods: {
+        orderTotal(data,searchKey){
+            this.totalLoading = false;
+            this.totalData = data;
+            if (searchKey.create) {
+                var start = this.$TOOL.dateFormat(searchKey.create[0], "yyyy-MM-dd");
+                var end = this.$TOOL.dateFormat(searchKey.create[1], "yyyy-MM-dd");
+                this.searchData = start+"-"+end;
+            }
+        },
+        tableHandle(data){
+            this.dataSelect = data;
+        },
+        tableHandleFull(data){
+            this.dataSelectFull = data;
+        },
+        handleSuccess(data){
+            this.$refs.tablePage.upData(data)
+        },
+        handleClick(name){
+            this.activeName = name;
+            this.searchKey.type = name;
+            this.$refs.tablePage.upData(this.searchKey)
+        }
+    }
+}
+</script>
+
+<style>
+.user-card-body{display: flex;align-items: center;justify-content: space-around;padding: 10px 0;}
+.user-card-body .card-item{text-align: center;}
+.user-card-body .card-item .card-num span{font-size: 12px;color: #666;font-weight: normal;}
+.user-card-body .card-tips{font-size: 12px;color: #666;display: flex;align-items: center;}
+.user-card-body .card-tips i{font-style: normal;margin-left: 5px;}
+.user-card-body .card-num{font-size: 20px;font-weight: bold;}
+.mb10{margin-bottom: 15px;}
+.news-title{
+    font-size: 16px;
+    color: #000;
+    font-weight: bold;
+    margin-bottom: 10px;
+    display: flex;
+    align-items: center;
+}
+.news-title::before{
+    content: "";
+    width: 4px;
+    height: 16px;
+    display: block;
+    background-color: var(--el-color-primary);;
+    margin-right: 8px;
+}
+.news-title span{margin-left: 10px;font-weight: normal;color: #666;font-size: 12px;}
+</style>

+ 3 - 0
src/views/manage/order/qrcode/components/detail.vue

@@ -0,0 +1,3 @@
+<template>
+
+</template>

+ 50 - 0
src/views/manage/order/qrcode/components/option.vue

@@ -0,0 +1,50 @@
+<template>
+    <fieldset>
+        <legend>
+            <el-tag type="info">按需操作</el-tag>
+        </legend>
+        <div class="op-header">
+            <div class="left-panel">
+                <el-button type="primary" icon="el-icon-plus" @click="table_add(2)">新增员工账号</el-button>
+                <!-- <el-button type="primary" icon="el-icon-download" @click="table_export()">导出</el-button> -->
+            </div>
+        </div>
+    </fieldset>
+</template>
+
+<script>
+export default {
+    props: {
+        type: { type: String, default: "1" },
+        dataSelect: { type: Array, default: () => [] },
+        dataSelectFull: { type: Array, default: () => [] }
+    },
+    data(){
+        return {
+
+        }
+    },
+    methods: {
+        async table_batch_status(status){
+            if (this.dataSelect.length == 0) {
+                return this.$message.error("请选择修改数据")
+            }
+            let submitData = {"id":this.dataSelect,"value":status,"field":"status","type":"batch"};
+            var resp = await this.$API.mStaff.batch.post(submitData);
+            if (resp.code == 0) {
+                return this.$message.error(resp.msg);
+            }
+            this.$message.success(resp.msg);
+            this.$emit("success");
+        },
+        handleSuccess(){
+            this.$emit("success");
+        },
+        table_add(type){
+            this.$nextTick(() => {
+                this.$refs.formMain.open("add")
+            })
+        },
+    }
+}
+</script>

+ 70 - 0
src/views/manage/order/qrcode/components/search.vue

@@ -0,0 +1,70 @@
+<template>
+    <fieldset>
+        <legend>
+            <el-tag type="info">条件筛选</el-tag>
+        </legend>
+        <el-form class="lv-form-inline" ref="searchForm" :model="searchKey" label-position="right" label-width="100px">
+            <div class="search-form">
+                <div class="form-left">
+                    <el-row :gutter="10">
+                        <el-col :xs="12" :sm="12" :md="12" :lg="6" :xl="6">
+                            <el-input v-model="searchKey.shop" placeholder="请选择店铺" clearbale readonly :style="{width:'100%'}" @click="selectStore">
+                                <template #append>
+                                    <el-tooltip effect="dark" content="点这里,清除选择" placement="top-start">
+                                        <div class="remove-a" @click="clearStore">清除</div>
+                                    </el-tooltip>
+                                </template>
+                                <template #prepend>选择店铺</template>
+                            </el-input>
+                        </el-col>
+                        <el-col :xs="12" :sm="12" :md="12" :lg="6" :xl="4">
+                            <el-input v-model="searchKey.name" placeholder="订单编号" clearable :style="{ width: '100%' }" @keyup.enter="searchForm()">
+                                <template #prepend>订单编号</template>
+                            </el-input>
+                        </el-col>
+                        <el-col :xs="12" :sm="6" :md="6" :lg="6" :xl="4">
+                            <el-date-picker v-model="searchKey.create" :style="{width: '100%'}" placeholder="请选择创建时间" start-placeholder="开始时间" end-placeholder="结束时间" type="daterange" range-separator="至" @change="searchForm" />
+                        </el-col>
+                    </el-row>
+                </div>
+                <div class="form-line"></div>
+                <div class="form-right">
+                    <el-button type="primary" icon="el-icon-search" @click="searchForm">搜索</el-button>
+                </div>
+            </div>
+        </el-form>
+    </fieldset>
+    <storeData ref="storeData" :multiple="false" @success="handleStore"></storeData>
+</template>
+
+<script>
+import storeData from '@/views/manage/components/store';
+export default {
+    components: {
+        storeData
+    },
+    data(){
+        return {
+            searchKey:{}
+        }
+    },
+    methods: {
+        selectStore(){
+            this.$nextTick(()=>{
+                this.$refs.storeData.open()
+            })
+        },
+        handleStore(data){
+            this.searchKey.shop = data.shop_id;
+            this.$emit("success",this.searchKey);
+        },
+        clearStore(){
+            this.searchKey.shop = "";
+            this.$emit("success",this.searchKey);
+        },
+        searchForm(){
+            this.$emit("success",this.searchKey);
+        }
+    }
+}
+</script>

+ 80 - 0
src/views/manage/order/qrcode/components/table.vue

@@ -0,0 +1,80 @@
+<template>
+    <scTable ref="table" :apiObj="list.apiObj" :params="searchKey" @selectionChange="selectionChange" row-key="id">
+        <el-table-column type="selection" width="50" fixed="left"></el-table-column>
+        
+        <el-table-column label="订单编号" prop="order_sn">
+            <template #default="scope">
+                {{scope.row.order_sn}}
+            </template>
+        </el-table-column>
+        <el-table-column label="订单金额" prop="time">
+            <template #default="scope">
+                {{ $TOOL.money(scope.row.money) }}
+            </template>
+        </el-table-column>
+        <el-table-column label="支付类型" prop="money">
+            <template #default="scope">
+                微信
+            </template>
+        </el-table-column>
+        <el-table-column label="支付时间" prop="pay_at">
+            <template #default="scope">
+                {{ scope.row.pay_at?scope.row.pay_at:'-' }}
+            </template>
+        </el-table-column>
+        <el-table-column label="创建时间" prop="create_at">
+            <template #default="scope">
+                {{ scope.row.create_at }}
+            </template>
+        </el-table-column>
+    </scTable>
+</template>
+
+<script>
+export default {
+    props: {
+        type: { type: String, default: "1" }
+    },
+    data(){
+        return {
+            colorData:['','彩色','黑白'],
+            duplexData:['','单面','双面'],
+            list: {
+                apiObj: this.$API.mQrcode.list
+            },
+            visible:false,
+            dataSelect:[],
+            dataSelectFull:[],
+            searchKey:{
+                type:this.type
+            }
+        }
+    },
+    methods:{
+        table_edit(data){
+            this.$nextTick(() => {
+                this.$refs.formMain.open("edit",this.type).setData(data)
+            })
+        },
+        table_del(data){
+            this.$confirm("确定要删除该数据吗?","删除确认",{type: 'warning'}).then(async ()=>{
+                var resp = await this.$API.mPrice.del.post({"id":data.id,"type":""});
+                if (resp.code == 0) {
+                    return this.$message.error(resp.msg)
+                }
+                this.$message.success(resp.msg)
+                this.$refs.table.refresh()
+            }).catch(()=>{});
+        },
+        refresh(){
+            this.$refs.table.refresh()
+        },
+        upData(data){
+            this.$refs.table.upData(data)
+        },
+        handleSuccess(){
+            this.$refs.table.refresh()
+        },
+    }
+}
+</script>

+ 69 - 1
src/views/manage/order/qrcode/index.vue

@@ -1,3 +1,71 @@
 <template>
+    <el-container class="flex-column">
+        <div class="table-search" style="border-bottom: 0;">
+            <search @success="handleSuccess"></search>
+            <!-- <optionBtn @success="handleSuccess" :dataSelect="dataSelect" :dataSelectFull="dataSelectFull" type="3"></optionBtn> -->
+        </div>
+        <el-main class="nopadding">
+            <div class="table-container">
+                <tablePage ref="tablePage" @success="tableHandle" @successFull="tableHandleFull"></tablePage>
+            </div>
+        </el-main>
+    </el-container>
+</template>
 
-</template>
+<script>
+import search from './components/search';
+import optionBtn from './components/option';
+import tablePage from './components/table';
+export default {
+    components: {
+        search,tablePage,optionBtn
+    },
+    data() {
+        return {
+            
+        }
+    },
+    methods: {
+        tableHandle(data){
+            this.dataSelect = data;
+        },
+        tableHandleFull(data){
+            this.dataSelectFull = data;
+        },
+        handleSuccess(data){
+            this.$refs.tablePage.upData(data)
+        },
+        handleClick(name){
+            this.activeName = name;
+            this.searchKey.type = name;
+            this.$refs.tablePage.upData(this.searchKey)
+        }
+    }
+}
+</script>
+
+<style>
+.user-card-body{display: flex;align-items: center;justify-content: space-around;padding: 10px 0;}
+.user-card-body .card-item{text-align: center;}
+.user-card-body .card-item .card-num span{font-size: 12px;color: #666;font-weight: normal;}
+.user-card-body .card-tips{font-size: 12px;color: #666;display: flex;align-items: center;}
+.user-card-body .card-tips i{font-style: normal;margin-left: 5px;}
+.user-card-body .card-num{font-size: 20px;font-weight: bold;}
+.mb10{margin-bottom: 15px;}
+.news-title{
+    font-size: 16px;
+    color: #000;
+    font-weight: bold;
+    margin-bottom: 10px;
+    display: flex;
+    align-items: center;
+}
+.news-title::before{
+    content: "";
+    width: 4px;
+    height: 16px;
+    display: block;
+    background-color: var(--el-color-primary);;
+    margin-right: 8px;
+}
+</style>

+ 1 - 1
src/views/manage/shop/index/components/table.vue

@@ -2,7 +2,7 @@
     <scTable ref="table" :apiObj="list.apiObj" :params="searchKey" @selectionChange="selectionChange" row-key="id">
         <el-table-column type="selection" width="50" fixed="left"></el-table-column>
         <el-table-column label="店铺名称" width="200" fixed="left" prop="shop_name"></el-table-column>
-        <el-table-column label="店铺编码" prop="agent_id" width="200"></el-table-column>
+        <el-table-column label="店铺编码" prop="shop_id" width="200"></el-table-column>
         <el-table-column label="营业时间" prop="agent" width="150">
             <template #default="scope">
                 <span v-if="scope.row.start_at">{{ scope.row.start_at }}-{{ scope.row.end_at }}</span>

+ 3 - 2
src/views/merchant/dashboard/index.vue

@@ -28,7 +28,8 @@
                     <div class="item-warp">
                         <div class="left">
                             <div class="title">今日营业额(元)</div>
-                            <div class="number">{{ todayData.userNum ? todayData.userNum:'0.00' }}</div>
+                            <div class="number" v-if="hideState==1">{{ $TOOL.money(todayData.userNum) }}</div>
+                            <div class="number" v-else>0.00</div>
                             <div class="desc"></div>
                         </div>
                         <div class="right"><img src="@/assets/image/wave-1-icon.png" /></div>
@@ -195,7 +196,7 @@ export default {
                         smooth: true, showBackground: true,
                         areaStyle: {color: 'rgba(180, 180, 180, 0.5)'},
                         type: 'line', showSymbol: true, xAxisIndex: 0, yAxisIndex: 0,
-                        label: {normal: {position: 'top', formatter: '{c} 元', show: true}},
+                        label: {normal: {position: 'top', formatter: '¥ {c} 元', show: true}},
                         data: data.map(function (item) {
                             return item['订单金额'];
                         }),

+ 50 - 0
src/views/merchant/member/index/components/option.vue

@@ -0,0 +1,50 @@
+<template>
+    <fieldset>
+        <legend>
+            <el-tag type="info">按需操作</el-tag>
+        </legend>
+        <div class="op-header">
+            <div class="left-panel">
+                <el-button type="primary" icon="el-icon-plus" @click="table_add(2)">新增员工账号</el-button>
+                <!-- <el-button type="primary" icon="el-icon-download" @click="table_export()">导出</el-button> -->
+            </div>
+        </div>
+    </fieldset>
+</template>
+
+<script>
+export default {
+    props: {
+        type: { type: String, default: "1" },
+        dataSelect: { type: Array, default: () => [] },
+        dataSelectFull: { type: Array, default: () => [] }
+    },
+    data(){
+        return {
+
+        }
+    },
+    methods: {
+        async table_batch_status(status){
+            if (this.dataSelect.length == 0) {
+                return this.$message.error("请选择修改数据")
+            }
+            let submitData = {"id":this.dataSelect,"value":status,"field":"status","type":"batch"};
+            var resp = await this.$API.mStaff.batch.post(submitData);
+            if (resp.code == 0) {
+                return this.$message.error(resp.msg);
+            }
+            this.$message.success(resp.msg);
+            this.$emit("success");
+        },
+        handleSuccess(){
+            this.$emit("success");
+        },
+        table_add(type){
+            this.$nextTick(() => {
+                this.$refs.formMain.open("add")
+            })
+        },
+    }
+}
+</script>

+ 42 - 0
src/views/merchant/member/index/components/search.vue

@@ -0,0 +1,42 @@
+<template>
+    <fieldset>
+        <legend>
+            <el-tag type="info">条件筛选</el-tag>
+        </legend>
+        <el-form class="lv-form-inline" ref="searchForm" :model="searchKey" label-position="right" label-width="100px">
+            <div class="search-form">
+                <div class="form-left">
+                    <el-row :gutter="10">
+                        <el-col :xs="12" :sm="12" :md="12" :lg="6" :xl="4">
+                            <el-input v-model="searchKey.orderid" placeholder="会员卡号" clearable :style="{ width: '100%' }" @keyup.enter="searchForm()">
+                                <template #prepend>会员卡号</template>
+                            </el-input>
+                        </el-col>
+                        <el-col :xs="12" :sm="6" :md="6" :lg="6" :xl="4">
+                            <el-date-picker v-model="searchKey.create" :style="{width: '100%'}" placeholder="请选择创建时间" start-placeholder="开始时间" end-placeholder="结束时间" type="daterange" range-separator="至" @change="searchForm" />
+                        </el-col>
+                    </el-row>
+                </div>
+                <div class="form-line"></div>
+                <div class="form-right">
+                    <el-button type="primary" icon="el-icon-search" @click="searchForm">搜索</el-button>
+                </div>
+            </div>
+        </el-form>
+    </fieldset>
+</template>
+
+<script>
+export default {
+    data(){
+        return {
+            searchKey:{}
+        }
+    },
+    methods: {
+        searchForm(){
+            this.$emit("success",this.searchKey);
+        }
+    }
+}
+</script>

+ 90 - 0
src/views/merchant/member/index/components/table.vue

@@ -0,0 +1,90 @@
+<template>
+    <scTable ref="table" :apiObj="list.apiObj" :params="searchKey" @selectionChange="selectionChange" row-key="id">
+        <el-table-column type="selection" width="50" fixed="left"></el-table-column>
+        <el-table-column label="会员ID" prop="openid" width="220" fixed="left"></el-table-column>
+        <el-table-column label="会员卡号" prop="card_no"></el-table-column>
+        <el-table-column label="总充值金额" prop="money">
+            <template #default="scope">
+                <el-tag>{{ $TOOL.money(scope.row.total_balance) }}</el-tag>
+            </template>
+        </el-table-column>
+        <el-table-column label="累计消费" prop="money">
+            <template #default="scope">
+                <el-tag>{{ $TOOL.money(scope.row.total_consume) }}</el-tag>
+            </template>
+        </el-table-column>
+        <el-table-column label="账户余额" prop="money">
+            <template #default="scope">
+                <el-tag>{{ $TOOL.money(scope.row.balance) }}</el-tag>
+            </template>
+        </el-table-column>
+        <el-table-column label="加入时间" prop="create_at" width="180"></el-table-column>
+        <el-table-column label="操作" width="160" align="right" fixed="right">
+            <template #default="scope">
+                <el-button-group>
+                    <el-button text type="warning" size="small" @click="table_edit(scope.row)">详情</el-button>
+                    <el-popconfirm title="确定要退款吗?" @confirm="table_del(scope.row, scope.$index)" v-if="scope.row.status > 0">
+                        <template #reference>
+                            <el-button text type="danger" size="small">退款</el-button>
+                        </template>
+                    </el-popconfirm>                    
+                </el-button-group>
+            </template>
+        </el-table-column>
+    </scTable>
+</template>
+
+<script>
+export default {
+    props: {
+        type: { type: String, default: "1" }
+    },
+    data(){
+        return {
+            colorData:['','彩色','黑白'],
+            duplexData:['','单面','双面'],
+            list: {
+                apiObj: this.$API.mUser.list
+            },
+            status: ['待支付','待打印', '打印失败', '已打印','申请退款','退款失败','已退款'],
+            ostatus: ['-','店内打印', '远程自取', '商家配送'],
+            payStatus:['-','微信','会员卡'],
+            visible:false,
+            dataSelect:[],
+            dataSelectFull:[],
+            searchKey:{}
+        }
+    },
+    methods:{
+        table_edit(data){
+            this.$nextTick(() => {
+                this.$refs.formMain.open("edit",this.type).setData(data)
+            })
+        },
+        table_del(data){
+            this.$confirm("确定要删除该数据吗?","删除确认",{type: 'warning'}).then(async ()=>{
+                var resp = await this.$API.mPrice.del.post({"id":data.id,"type":""});
+                if (resp.code == 0) {
+                    return this.$message.error(resp.msg)
+                }
+                this.$message.success(resp.msg)
+                this.$refs.table.refresh()
+            }).catch(()=>{});
+        },
+        refresh(){
+            this.$refs.table.refresh()
+        },
+        upData(data){
+            this.$refs.table.upData(data)
+        },
+        handleSuccess(){
+            this.$refs.table.refresh()
+        },
+    }
+}
+</script>
+
+<style>
+.price{display: flex;align-items: center;}
+.del{text-decoration: line-through;margin-left: 5px;color: #f00;}
+</style>

+ 83 - 1
src/views/merchant/member/index/index.vue

@@ -1,3 +1,85 @@
 <template>
+    <el-container class="flex-column">
+        <div class="table-search" style="border-bottom: 0;">
+            <search @success="handleSuccess"></search>
+        </div>
+        <el-main class="nopadding">
+            <div class="table-container">
+                <tablePage ref="tablePage" @success="tableHandle" @successFull="tableHandleFull" @total="orderTotal"></tablePage>
+            </div>
+        </el-main>
+    </el-container>
+</template>
 
-</template>
+<script>
+import search from './components/search';
+import tablePage from './components/table';
+import scStatistic from '@/components/scStatistic';
+export default {
+    components: {
+        search,tablePage,scStatistic
+    },
+    data(){
+        return {
+            totalLoading:true,
+            searchKey:{},
+            dataSelect:[],
+            dataSelectFull:[],
+            totalData:{},
+            searchData:null
+        }
+    },
+    methods: {
+        orderTotal(data,searchKey){
+            this.totalLoading = false;
+            this.totalData = data;
+            if (searchKey.create) {
+                var start = this.$TOOL.dateFormat(searchKey.create[0], "yyyy-MM-dd");
+                var end = this.$TOOL.dateFormat(searchKey.create[1], "yyyy-MM-dd");
+                this.searchData = start+"-"+end;
+            }
+        },
+        tableHandle(data){
+            this.dataSelect = data;
+        },
+        tableHandleFull(data){
+            this.dataSelectFull = data;
+        },
+        handleSuccess(data){
+            this.$refs.tablePage.upData(data)
+        },
+        handleClick(name){
+            this.activeName = name;
+            this.searchKey.type = name;
+            this.$refs.tablePage.upData(this.searchKey)
+        }
+    }
+}
+</script>
+
+<style>
+.user-card-body{display: flex;align-items: center;justify-content: space-around;padding: 10px 0;}
+.user-card-body .card-item{text-align: center;}
+.user-card-body .card-item .card-num span{font-size: 12px;color: #666;font-weight: normal;}
+.user-card-body .card-tips{font-size: 12px;color: #666;display: flex;align-items: center;}
+.user-card-body .card-tips i{font-style: normal;margin-left: 5px;}
+.user-card-body .card-num{font-size: 20px;font-weight: bold;}
+.mb10{margin-bottom: 15px;}
+.news-title{
+    font-size: 16px;
+    color: #000;
+    font-weight: bold;
+    margin-bottom: 10px;
+    display: flex;
+    align-items: center;
+}
+.news-title::before{
+    content: "";
+    width: 4px;
+    height: 16px;
+    display: block;
+    background-color: var(--el-color-primary);;
+    margin-right: 8px;
+}
+.news-title span{margin-left: 10px;font-weight: normal;color: #666;font-size: 12px;}
+</style>

+ 49 - 0
src/views/merchant/member/record/components/search.vue

@@ -0,0 +1,49 @@
+<template>
+    <fieldset>
+        <legend>
+            <el-tag type="info">条件筛选</el-tag>
+        </legend>
+        <el-form class="lv-form-inline" ref="searchForm" :model="searchKey" label-position="right" label-width="100px">
+            <div class="search-form">
+                <div class="form-left">
+                    <el-row :gutter="10">
+                        <el-col :xs="12" :sm="12" :md="12" :lg="6" :xl="4">
+                            <el-input v-model="searchKey.orderid" placeholder="会员卡号" clearable :style="{ width: '100%' }" @keyup.enter="searchForm()">
+                                <template #prepend>会员卡号</template>
+                            </el-input>
+                        </el-col>
+                        <el-col :xs="12" :sm="12" :md="12" :lg="6" :xl="4">
+                            <el-select v-model="searchKey.type" clearable placeholder="请选择类型" @change="searchForm" :style="{width: '100%'}" class="diy-select">
+                                <el-option value="1" label="支出"></el-option>
+                                <el-option value="2" label="收入"></el-option>
+                                <template #prefix>流水类型</template>
+                            </el-select>
+                        </el-col>
+                        <el-col :xs="12" :sm="6" :md="6" :lg="6" :xl="4">
+                            <el-date-picker v-model="searchKey.create" :style="{width: '100%'}" placeholder="请选择创建时间" start-placeholder="开始时间" end-placeholder="结束时间" type="daterange" range-separator="至" @change="searchForm" />
+                        </el-col>
+                    </el-row>
+                </div>
+                <div class="form-line"></div>
+                <div class="form-right">
+                    <el-button type="primary" icon="el-icon-search" @click="searchForm">搜索</el-button>
+                </div>
+            </div>
+        </el-form>
+    </fieldset>
+</template>
+
+<script>
+export default {
+    data(){
+        return {
+            searchKey:{}
+        }
+    },
+    methods: {
+        searchForm(){
+            this.$emit("success",this.searchKey);
+        }
+    }
+}
+</script>

+ 93 - 0
src/views/merchant/member/record/components/table.vue

@@ -0,0 +1,93 @@
+<template>
+    <scTable ref="table" :apiObj="list.apiObj" :params="searchKey" @selectionChange="selectionChange" row-key="id">
+        <el-table-column type="selection" width="50" fixed="left"></el-table-column>
+        <el-table-column label="会员ID" prop="openid" width="220" fixed="left"></el-table-column>
+        <el-table-column label="会员卡号" prop="card_no">
+            <template #default="scope">
+                {{ scope.row.card_no?scope.row.card_no:'-' }}
+            </template>
+        </el-table-column>
+        <el-table-column label="订单编号" prop="order_sn">
+            <template #default="scope">
+                {{ scope.row.order_sn?scope.row.order_sn:'-' }}
+            </template>
+        </el-table-column>
+        <el-table-column label="类型" prop="type">
+            <template #default="scope">
+                <el-tag type="error" v-if="scope.row.type == 1">支出</el-tag>
+                <el-tag type="success" v-if="scope.row.type == 2">收入</el-tag>
+            </template>
+        </el-table-column>
+        <el-table-column label="金额" prop="money">
+            <template #default="scope">
+                ¥{{ scope.row.money }}
+            </template>
+        </el-table-column>
+        <el-table-column label="余额" prop="money">
+            <template #default="scope">
+                {{ $TOOL.money(scope.row.balance) }}
+            </template>
+        </el-table-column>
+        <el-table-column label="其他" prop="order_sn" width="220">
+            <template #default="scope">
+                {{ scope.row.remark?scope.row.remark:'-' }}
+            </template>
+        </el-table-column>
+        <el-table-column label="时间" prop="create_at" width="180"></el-table-column>
+    </scTable>
+</template>
+
+<script>
+export default {
+    props: {
+        type: { type: String, default: "1" }
+    },
+    data(){
+        return {
+            colorData:['','彩色','黑白'],
+            duplexData:['','单面','双面'],
+            list: {
+                apiObj: this.$API.mUser.log
+            },
+            status: ['待支付','待打印', '打印失败', '已打印','申请退款','退款失败','已退款'],
+            ostatus: ['-','店内打印', '远程自取', '商家配送'],
+            payStatus:['-','微信','会员卡'],
+            visible:false,
+            dataSelect:[],
+            dataSelectFull:[],
+            searchKey:{}
+        }
+    },
+    methods:{
+        table_edit(data){
+            this.$nextTick(() => {
+                this.$refs.formMain.open("edit",this.type).setData(data)
+            })
+        },
+        table_del(data){
+            this.$confirm("确定要删除该数据吗?","删除确认",{type: 'warning'}).then(async ()=>{
+                var resp = await this.$API.mPrice.del.post({"id":data.id,"type":""});
+                if (resp.code == 0) {
+                    return this.$message.error(resp.msg)
+                }
+                this.$message.success(resp.msg)
+                this.$refs.table.refresh()
+            }).catch(()=>{});
+        },
+        refresh(){
+            this.$refs.table.refresh()
+        },
+        upData(data){
+            this.$refs.table.upData(data)
+        },
+        handleSuccess(){
+            this.$refs.table.refresh()
+        },
+    }
+}
+</script>
+
+<style>
+.price{display: flex;align-items: center;}
+.del{text-decoration: line-through;margin-left: 5px;color: #f00;}
+</style>

+ 82 - 1
src/views/merchant/member/record/index.vue

@@ -1,3 +1,84 @@
 <template>
+    <el-container class="flex-column">
+        <div class="table-search" style="border-bottom: 0;">
+            <search @success="handleSuccess"></search>
+        </div>
+        <el-main class="nopadding">
+            <div class="table-container">
+                <tablePage ref="tablePage" @success="tableHandle" @successFull="tableHandleFull" @total="orderTotal"></tablePage>
+            </div>
+        </el-main>
+    </el-container>
+</template>
 
-</template>
+<script>
+import search from './components/search';
+import tablePage from './components/table';
+export default {
+    components: {
+        search,tablePage
+    },
+    data(){
+        return {
+            totalLoading:true,
+            searchKey:{},
+            dataSelect:[],
+            dataSelectFull:[],
+            totalData:{},
+            searchData:null
+        }
+    },
+    methods: {
+        orderTotal(data,searchKey){
+            this.totalLoading = false;
+            this.totalData = data;
+            if (searchKey.create) {
+                var start = this.$TOOL.dateFormat(searchKey.create[0], "yyyy-MM-dd");
+                var end = this.$TOOL.dateFormat(searchKey.create[1], "yyyy-MM-dd");
+                this.searchData = start+"-"+end;
+            }
+        },
+        tableHandle(data){
+            this.dataSelect = data;
+        },
+        tableHandleFull(data){
+            this.dataSelectFull = data;
+        },
+        handleSuccess(data){
+            this.$refs.tablePage.upData(data)
+        },
+        handleClick(name){
+            this.activeName = name;
+            this.searchKey.type = name;
+            this.$refs.tablePage.upData(this.searchKey)
+        }
+    }
+}
+</script>
+
+<style>
+.user-card-body{display: flex;align-items: center;justify-content: space-around;padding: 10px 0;}
+.user-card-body .card-item{text-align: center;}
+.user-card-body .card-item .card-num span{font-size: 12px;color: #666;font-weight: normal;}
+.user-card-body .card-tips{font-size: 12px;color: #666;display: flex;align-items: center;}
+.user-card-body .card-tips i{font-style: normal;margin-left: 5px;}
+.user-card-body .card-num{font-size: 20px;font-weight: bold;}
+.mb10{margin-bottom: 15px;}
+.news-title{
+    font-size: 16px;
+    color: #000;
+    font-weight: bold;
+    margin-bottom: 10px;
+    display: flex;
+    align-items: center;
+}
+.news-title::before{
+    content: "";
+    width: 4px;
+    height: 16px;
+    display: block;
+    background-color: var(--el-color-primary);;
+    margin-right: 8px;
+}
+.news-title span{margin-left: 10px;font-weight: normal;color: #666;font-size: 12px;}
+</style>

+ 150 - 1
src/views/merchant/order/index/components/detail.vue

@@ -1,3 +1,152 @@
 <template>
+    <el-drawer :title="titleMap[mode]" :append-to-body="true" v-model="visible" :size="1000" destroy-on-close :close-on-click-modal="false" @closed="$emit('closed')" :with-header="false">
+        <el-container class="flex-column" v-loading="loading">
+            <div class="drawer-detail-main">
+                <div class="drawer-detail-header">
+                    <div class="drawer-detail-header-body">
+                        <div class="drawer-detail-header-left">{{titleMap[mode]}} <span class="tips">{{ formData.order_sn }}</span></div>
+                        <div class="drawer-detail-header-left">
+                            <el-button type="default" icon="el-icon-close" @click="visible=false"></el-button>
+                        </div>
+                    </div>
+                </div>
+            </div>
+            <el-main>
+                <el-descriptions :column="3" size="large" direction="vertical" border>
+                    <el-descriptions-item>
+                        <template #label>订单编号</template>{{ formData.order_sn }}
+                    </el-descriptions-item>
+                    <el-descriptions-item>
+                        <template #label>下单用户</template>{{ formData.openid }}
+                    </el-descriptions-item>
+                    <el-descriptions-item>
+                        <template #label>取件号</template>{{ formData.package_sn }}
+                    </el-descriptions-item>
+                    <el-descriptions-item>
+                        <template #label>取件方式</template>{{ ostatus[formData.package] }}
+                    </el-descriptions-item>
+                    <el-descriptions-item>
+                        <template #label>订单状态</template>{{ status[formData.status] }}
+                    </el-descriptions-item>
+                    <el-descriptions-item>
+                        <template #label>打印机</template>{{ formData.print_name }}
+                    </el-descriptions-item>
+                    <el-descriptions-item>
+                        <template #label>下单时间</template>{{ formData.create_at }}
+                    </el-descriptions-item>
+                    <el-descriptions-item>
+                        <template #label>支付时间</template>{{ formData.pay_at?formData.pay_at:'-' }} <template v-if="formData.pay_at"><el-tag type="success">{{ payStatus[formData.pay_type] }}</el-tag></template>
+                    </el-descriptions-item>
+                    <el-descriptions-item>
+                        <template #label>失败原因</template>{{ formData.reason?formData.reason:'-' }}
+                    </el-descriptions-item>
+                </el-descriptions>
+                <el-descriptions :column="2" size="large" direction="vertical" class="mt10" border>
+                    <el-descriptions-item>
+                        <template #label>支付金额(元)</template> 
+                        <div class="price" v-if="formData.discount > 0">
+                            {{ $TOOL.money(formData.discount) }}
+                            <div class="del">{{ $TOOL.money(formData.money) }}</div>
+                        </div>
+                        <div class="price" v-else>
+                            {{ $TOOL.money(formData.money) }}
+                        </div>
+                    </el-descriptions-item>
+                    <el-descriptions-item>
+                        <template #label>含配送费(元)</template>{{ $TOOL.money(formData.express_money) }}
+                    </el-descriptions-item>
+                    <el-descriptions-item>
+                        <template #label>优惠券金额(元)</template>{{ $TOOL.money(formData.coupon_money) }}
+                    </el-descriptions-item>
+                    <el-descriptions-item>
+                        <template #label>整单装订总价(元)</template>{{ $TOOL.money(formData.staple_money) }}
+                    </el-descriptions-item>
+                </el-descriptions>
+                <el-table :data="tableData" style="width: 100%" border class="mt10">
+                    <el-table-column label="文件名" prop="name" width="260" fixed="left"></el-table-column>
+                    <el-table-column label="页数" prop="page" align="center"></el-table-column>
+                    <el-table-column label="纸张" prop="paper_size"></el-table-column>
+                    <el-table-column label="颜色" prop="name">
+                        <template #default="scope">
+                            <el-tag>{{ scope.row.color==1?'彩色':'黑白' }}</el-tag>
+                        </template>
+                    </el-table-column>
+                    <el-table-column label="单双面" prop="name">
+                        <template #default="scope">
+                            <el-tag>{{ scope.row.duplex==1?'单面':'双面' }}</el-tag>
+                        </template>
+                    </el-table-column>
+                    <el-table-column label="打印范围" prop="name" align="center">
+                        <template #default="scope">
+                            {{ scope.row.start_page }} - {{ scope.row.end_page }}
+                        </template>
+                    </el-table-column>
+                    <el-table-column label="份数" prop="number" align="center"></el-table-column>
+                    <el-table-column label="装订方式" prop="name">
+                        <template #default="scope">
+                            不装订
+                        </template>
+                    </el-table-column>
+                    <el-table-column label="订单金额" prop="name">
+                        <template #default="scope">
+                            {{ $TOOL.money(scope.row.money) }}
+                        </template>
+                    </el-table-column>
+                    <el-table-column label="操作" width="160" align="right" fixed="right">
+                        <template #default="scope">
+                            <el-button-group>
+                                <el-button text type="warning" size="small" @click="table_edit(scope.row)">预览/下载</el-button>
+                                <el-popconfirm title="确定要退款吗?" @confirm="table_del(scope.row, scope.$index)" v-if="scope.row.status > 0">
+                                    <template #reference>
+                                        <el-button text type="danger" size="small">退款</el-button>
+                                    </template>
+                                </el-popconfirm>                    
+                            </el-button-group>
+                        </template>
+                    </el-table-column>
+                </el-table>
+            </el-main>
+            <el-footer style="text-align: right;">
+                <el-button @click="visible=false" >关闭</el-button>
+            </el-footer>
+        </el-container>
+    </el-drawer>
+</template>
 
-</template>
+<script>
+export default {
+    data() {
+        return {
+            loading: false,
+            mode: "add",
+            titleMap: {
+                add: "新增渠道",
+                edit: "订单详情"
+            },
+            status: ['待支付','待打印', '打印失败', '已打印','申请退款','退款失败','已退款'],
+            ostatus: ['-','店内打印', '远程自取', '商家配送'],
+            payStatus:['-','微信','会员卡'],
+            visible: false,
+            isSaveing: false,
+            formData: {},
+            rules: {},
+            tableData:[]
+        }
+    },
+    methods: {
+        open(mode = 'add') {
+            this.mode = mode;
+            this.visible = true;
+            return this;
+        },
+        //表单注入数据
+        setData(data) {
+            this.formData = data;
+            this.tableData = data.detail;
+        },
+    }
+}
+</script>
+<style>
+.mt10{margin-top: 10px;}
+</style>

+ 29 - 18
src/views/merchant/order/index/components/table.vue

@@ -1,5 +1,5 @@
 <template>
-    <scTable ref="table" :apiObj="list.apiObj" :params="searchKey" @selectionChange="selectionChange" row-key="id">
+    <scTable ref="table" :apiObj="list.apiObj" :params="searchKey" @selectionChange="selectionChange" row-key="id" @dataChange="getTotal">
         <el-table-column type="selection" width="50" fixed="left"></el-table-column>
         <el-table-column label="订单编号" width="200" prop="order_sn" fixed="left">
             <template #default="scope">
@@ -7,9 +7,14 @@
             </template>
         </el-table-column>
         <el-table-column label="下单用户" prop="openid" width="220"></el-table-column>
-        <el-table-column label="订单金额" prop="money">
+        <el-table-column label="订单状态" prop="certificate_id" width="120">
             <template #default="scope">
-                <div class="price" v-if="scope.row.discount > 0">
+                {{ status[scope.row.status] }}
+            </template>
+        </el-table-column>
+        <el-table-column label="订单金额" prop="money" width="120">
+            <template #default="scope">
+                <div class="price" v-if="scope.row.money > scope.row.discount">
                     <el-tag>{{ $TOOL.money(scope.row.discount) }}</el-tag>
                     <div class="del">{{ $TOOL.money(scope.row.money) }}</div>
                 </div>
@@ -18,48 +23,43 @@
                 </div>
             </template>
         </el-table-column>
-        <el-table-column label="额外加价" prop="money">
+        <el-table-column label="额外加价" prop="money" width="120">
             <template #default="scope">
                 {{ $TOOL.money(scope.row.extra_money) }}
             </template>
         </el-table-column>
-        <el-table-column label="支付类型" prop="money">
+        <el-table-column label="支付类型" prop="money" width="120">
             <template #default="scope">
                 <el-tag>{{ payStatus[scope.row.status] }}</el-tag>
             </template>
         </el-table-column>
-        <el-table-column label="打印机" prop="money">
+        <el-table-column label="打印机" prop="money" width="180">
             <template #default="scope">
                 {{ scope.row.print_name }}
             </template>
         </el-table-column>
-        <el-table-column label="取件方式" prop="money">
+        <el-table-column label="取件方式" prop="money" width="120">
             <template #default="scope">
                 {{ ostatus[scope.row.package] }}
             </template>
         </el-table-column>
-        <el-table-column label="取件号" prop="package_sn"></el-table-column>
-        <el-table-column label="失败原因" prop="money">
+        <el-table-column label="取件号" prop="package_sn" width="120"></el-table-column>
+        <el-table-column label="失败原因" prop="money" width="220">
             <template #default="scope">
                 {{ scope.row.reason?scope.row.reason:'-' }}
             </template>
         </el-table-column>
-        <el-table-column label="订单状态" prop="certificate_id">
-            <template #default="scope">
-                {{ status[scope.row.status] }}
-            </template>
-        </el-table-column>
-        <el-table-column label="支付时间" prop="pay_at">
+        <el-table-column label="支付时间" prop="pay_at" width="180">
             <template #default="scope">
                 {{ scope.row.pay_at?scope.row.pay_at:'-' }}
             </template>
         </el-table-column>
-        <el-table-column label="打印时间" prop="pay_at">
+        <el-table-column label="打印时间" prop="pay_at" width="180">
             <template #default="scope">
                 {{ scope.row.print_at?scope.row.print_at:'-' }}
             </template>
         </el-table-column>
-        <el-table-column label="创建时间" prop="create_at">
+        <el-table-column label="创建时间" prop="create_at" width="180">
             <template #default="scope">
                 {{ scope.row.create_at }}
             </template>
@@ -67,7 +67,7 @@
         <el-table-column label="操作" width="160" align="right" fixed="right">
             <template #default="scope">
                 <el-button-group>
-                    <el-button text type="warning" size="small" @click="table_passwd(scope.row)">详情</el-button>
+                    <el-button text type="warning" size="small" @click="table_edit(scope.row)">详情</el-button>
                     <el-popconfirm title="确定要退款吗?" @confirm="table_del(scope.row, scope.$index)" v-if="scope.row.status > 0">
                         <template #reference>
                             <el-button text type="danger" size="small">退款</el-button>
@@ -77,13 +77,18 @@
             </template>
         </el-table-column>
     </scTable>
+    <formMain ref="formMain" @success="handleSuccess"></formMain>
 </template>
 
 <script>
+import formMain from "./detail";
 export default {
     props: {
         type: { type: String, default: "1" }
     },
+    components: {
+        formMain
+    },
     data(){
         return {
             colorData:['','彩色','黑白'],
@@ -101,6 +106,12 @@ export default {
         }
     },
     methods:{
+        async getTotal(){
+            var resp = await this.$API.mOrder.total.get(this.searchKey);
+            if (resp.code == 1) {
+                this.$emit("total",resp.data.total,this.searchKey);
+            }
+        },
         table_edit(data){
             this.$nextTick(() => {
                 this.$refs.formMain.open("edit",this.type).setData(data)

+ 28 - 12
src/views/merchant/order/index/index.vue

@@ -1,37 +1,39 @@
 <template>
     <el-container class="flex-column">
-        <div class="table-search" style="border-bottom: 0;">
+        <div class="table-search" style="border-bottom: 0;" v-loading="totalLoading">
             <el-card shadow="never" class="borderNone mb10">
                 <template #header>
-                    <div class="news-title">订单数统计</div>
+                    <div class="news-title">订单数统计
+                        <template v-if="searchData"><span>截止:{{ searchData }}</span></template>
+                    </div>
                 </template>
                 <div class="user-card-body">
                     <div class="card-item">
-                        <div class="card-num">0 <span>单</span></div>
+                        <div class="card-num">{{ totalData.ta?totalData.ta:'0' }} <span>单</span></div>
                         <div class="card-tips">全部订单</div>
                     </div>
                     <div class="card-item">
-                        <div class="card-num">0 <span>单</span></div>
+                        <div class="card-num">{{ totalData.t1?totalData.t1:'0' }} <span>单</span></div>
                         <div class="card-tips">待打印</div>
                     </div>
                     <div class="card-item">
-                        <div class="card-num">0 <span>单</span></div>
+                        <div class="card-num">{{ totalData.t2?totalData.t2:'0' }} <span>单</span></div>
                         <div class="card-tips">打印失败</div>
                     </div>
                     <div class="card-item">
-                        <div class="card-num">0 <span>单</span></div>
+                        <div class="card-num">{{ totalData.t3?totalData.t3:'0' }} <span>单</span></div>
                         <div class="card-tips">已完成</div>
                     </div>
                     <div class="card-item">
-                        <div class="card-num">0 <span>单</span></div>
-                        <div class="card-tips">申请退款</div>
+                        <div class="card-num">{{ totalData.t4?totalData.t4:'0' }} <span>单</span></div>
+                        <div class="card-tips">退款</div>
                     </div>
                     <div class="card-item">
-                        <div class="card-num">0 <span>单</span></div>
+                        <div class="card-num">{{ totalData.t5?totalData.t5:'0' }} <span>单</span></div>
                         <div class="card-tips">退款失败</div>
                     </div>
                     <div class="card-item">
-                        <div class="card-num">0 <span>单</span></div>
+                        <div class="card-num">{{ totalData.t6?totalData.t6:'0' }} <span>单</span></div>
                         <div class="card-tips">已退款</div>
                     </div>
                 </div>
@@ -40,7 +42,7 @@
         </div>
         <el-main class="nopadding">
             <div class="table-container">
-                <tablePage ref="tablePage" @success="tableHandle" @successFull="tableHandleFull"></tablePage>
+                <tablePage ref="tablePage" @success="tableHandle" @successFull="tableHandleFull" @total="orderTotal"></tablePage>
             </div>
         </el-main>
     </el-container>
@@ -49,18 +51,31 @@
 <script>
 import search from './components/search';
 import tablePage from './components/table';
+import scStatistic from '@/components/scStatistic';
 export default {
     components: {
-        search,tablePage
+        search,tablePage,scStatistic
     },
     data(){
         return {
+            totalLoading:true,
             searchKey:{},
             dataSelect:[],
             dataSelectFull:[],
+            totalData:{},
+            searchData:null
         }
     },
     methods: {
+        orderTotal(data,searchKey){
+            this.totalLoading = false;
+            this.totalData = data;
+            if (searchKey.create) {
+                var start = this.$TOOL.dateFormat(searchKey.create[0], "yyyy-MM-dd");
+                var end = this.$TOOL.dateFormat(searchKey.create[1], "yyyy-MM-dd");
+                this.searchData = start+"-"+end;
+            }
+        },
         tableHandle(data){
             this.dataSelect = data;
         },
@@ -103,4 +118,5 @@ export default {
     background-color: var(--el-color-primary);;
     margin-right: 8px;
 }
+.news-title span{margin-left: 10px;font-weight: normal;color: #666;font-size: 12px;}
 </style>

+ 0 - 7
src/views/merchant/order/qrcode/components/search.vue

@@ -12,13 +12,6 @@
                                 <template #prepend>订单编号</template>
                             </el-input>
                         </el-col>
-                        <el-col :xs="12" :sm="12" :md="12" :lg="6" :xl="4">
-                            <el-select v-model="searchKey.status" clearable placeholder="请选择状态" @change="searchForm" :style="{width: '100%'}" class="diy-select">
-                                <el-option value="1" label="冻结"></el-option>
-                                <el-option value="2" label="正常"></el-option>
-                                <template #prefix>状态</template>
-                            </el-select>
-                        </el-col>
                         <el-col :xs="12" :sm="6" :md="6" :lg="6" :xl="4">
                             <el-date-picker v-model="searchKey.create" :style="{width: '100%'}" placeholder="请选择创建时间" start-placeholder="开始时间" end-placeholder="结束时间" type="daterange" range-separator="至" @change="searchForm" />
                         </el-col>

+ 5 - 11
src/views/merchant/order/qrcode/components/table.vue

@@ -7,20 +7,14 @@
                 {{scope.row.order_sn}}
             </template>
         </el-table-column>
-        <el-table-column label="套餐信息" prop="time">
+        <el-table-column label="订单金额" prop="time">
             <template #default="scope">
-                续费<span class="status-danger">{{scope.row.time}}天</span>
+                {{ $TOOL.money(scope.row.money) }}
             </template>
         </el-table-column>
-        <el-table-column label="套餐金额" prop="money">
+        <el-table-column label="支付类型" prop="money">
             <template #default="scope">
-                {{ scope.row.money }}元
-            </template>
-        </el-table-column>
-        <el-table-column label="支付状态" prop="certificate_id">
-            <template #default="scope">
-                <div class="status-danger" v-if="scope.row.status==0"><sc-status-indicator type="danger"></sc-status-indicator> 待支付</div>
-                <div class="status-success" v-if="scope.row.status==1"><sc-status-indicator type="success"></sc-status-indicator>已完成</div>
+                微信
             </template>
         </el-table-column>
         <el-table-column label="支付时间" prop="pay_at">
@@ -46,7 +40,7 @@ export default {
             colorData:['','彩色','黑白'],
             duplexData:['','单面','双面'],
             list: {
-                apiObj: this.$API.mRenew.list
+                apiObj: this.$API.mQrcode.list
             },
             visible:false,
             dataSelect:[],

+ 16 - 0
src/views/merchant/order/qrcode/index.vue

@@ -25,6 +25,22 @@ export default {
             
         }
     },
+    methods: {
+        tableHandle(data){
+            this.dataSelect = data;
+        },
+        tableHandleFull(data){
+            this.dataSelectFull = data;
+        },
+        handleSuccess(data){
+            this.$refs.tablePage.upData(data)
+        },
+        handleClick(name){
+            this.activeName = name;
+            this.searchKey.type = name;
+            this.$refs.tablePage.upData(this.searchKey)
+        }
+    }
 }
 </script>
 

+ 1 - 1
src/views/merchant/print/discount/components/option.vue

@@ -36,7 +36,7 @@ export default {
             }
             this.$confirm("确定要执行删除吗?","提示",{type:"warning"}).then(async ()=>{
                 let submitData = {"id":this.dataSelect,"type":"batch"};
-                var resp = await this.$mDiscount.del.post(submitData);
+                var resp = await this.$API.mDiscount.del.post(submitData);
                 if (resp.code == 0) {
                     return this.$message.error(resp.msg)
                 }

+ 37 - 6
src/views/merchant/turnover/index/index.vue

@@ -1,5 +1,5 @@
 <template>
-    <el-container class="flex-column">
+    <el-container class="flex-column" v-loading="loading">
         <div class="table-search" style="border-bottom: 0;">
             <el-card shadow="never" class="borderNone mb10">
                 <template #header>
@@ -7,17 +7,17 @@
                 </template>
                 <div class="user-card-body">
                     <div class="card-item">
-                        <div class="card-num">0.00</div>
+                        <div class="card-num">{{todayData?$TOOL.money(todayData.money):'0.00'}}</div>
                         <div class="card-tips">线上收款(元)
                         </div>
                     </div>
                     <div class="card-item">
-                        <div class="card-num">0.00</div>
+                        <div class="card-num">{{todayData?$TOOL.money(todayData.user):'0.00'}}</div>
                         <div class="card-tips">会员卡支付(元)
                         </div>
                     </div>
                     <div class="card-item">
-                        <div class="card-num">0.00</div>
+                        <div class="card-num">{{todayData?$TOOL.money(todayData.qrcode):'0.00'}}</div>
                         <div class="card-tips">其他支付(元)
                             <el-tooltip effect="dark" content="收款码付款金额">
                                 <el-icon><el-icon-question-filled /></el-icon>
@@ -30,7 +30,21 @@
         </div>
         <el-main class="nopadding">
             <div class="table-container">
-                <tablePage ref="tablePage" @success="tableHandle" @successFull="tableHandleFull"></tablePage>
+                <el-table :data="tableData" style="width: 100%" border class="mt10">
+                    <el-table-column label="类型" prop="name"></el-table-column>
+                    <el-table-column label="支付类型" prop="type"></el-table-column>
+                    <el-table-column label="订单数" prop="order">
+                        <template #default="scope">
+                            {{ scope.row.order }}单
+                        </template>
+                    </el-table-column>
+                    <el-table-column label="订单金额" prop="money">
+                        <template #default="scope">
+                            {{ $TOOL.money(scope.row.money) }}
+                        </template>
+                    </el-table-column>
+                </el-table>
+                <!-- <tablePage ref="tablePage" @success="tableHandle" @successFull="tableHandleFull"></tablePage> -->
             </div>
         </el-main>
     </el-container>
@@ -44,9 +58,26 @@ export default {
     },
     data() {
         return {
-            
+            tableData:[],
+            todayData:null,
+            loading:true
         }
     },
+    mounted(){
+        this.getData()
+    },
+    methods:{
+        async getData() {
+            this.loading = true;
+            var resp = await this.$API.mQrcode.today.get();
+            this.loading = false;
+            if (resp.code == 0) {
+                return this.$message.error(resp.msg)
+            }
+            this.tableData = resp.data.total;
+            this.todayData = resp.data.today;
+        }
+    }
 }
 </script>