zory 2 тижнів тому
батько
коміт
d91fef43d0

+ 40 - 0
src/api/model/merGoods.js

@@ -0,0 +1,40 @@
+import config from "@/config";
+import http from "@/utils/request";
+
+export default {
+    list: {
+        url: `${config.API_URL}/merchant/goods/list`,
+        name: "-",
+        get: async function (params) {
+            return await http.get(this.url, params);
+        },
+    },
+    save: {
+        url: `${config.API_URL}/merchant/goods/save`,
+        name: "-",
+        post: async function (params) {
+            return await http.post(this.url, params);
+        },
+    },
+    edit: {
+        url: `${config.API_URL}/merchant/goods/edit`,
+        name: "-",
+        post: async function (params) {
+            return await http.post(this.url, params);
+        },
+    },
+    batch: {
+        url: `${config.API_URL}/merchant/goods/batch`,
+        name: "-",
+        post: async function (params) {
+            return await http.post(this.url, params);
+        },
+    },
+    del: {
+        url: `${config.API_URL}/merchant/goods/del`,
+        name: "-",
+        post: async function (params) {
+            return await http.post(this.url, params);
+        },
+    },
+}

+ 40 - 0
src/api/model/storeGoods.js

@@ -0,0 +1,40 @@
+import config from "@/config";
+import http from "@/utils/request";
+
+export default {
+    list: {
+        url: `${config.API_URL}/store/goods/list`,
+        name: "-",
+        get: async function (params) {
+            return await http.get(this.url, params);
+        },
+    },
+    save: {
+        url: `${config.API_URL}/store/goods/save`,
+        name: "-",
+        post: async function (params) {
+            return await http.post(this.url, params);
+        },
+    },
+    edit: {
+        url: `${config.API_URL}/store/goods/edit`,
+        name: "-",
+        post: async function (params) {
+            return await http.post(this.url, params);
+        },
+    },
+    batch: {
+        url: `${config.API_URL}/store/goods/batch`,
+        name: "-",
+        post: async function (params) {
+            return await http.post(this.url, params);
+        },
+    },
+    del: {
+        url: `${config.API_URL}/store/goods/del`,
+        name: "-",
+        post: async function (params) {
+            return await http.post(this.url, params);
+        },
+    },
+}

+ 0 - 9
src/layout/components/userbar.vue

@@ -1,14 +1,5 @@
 <template>
 	<div class="user-bar">
-		<div class="panel-item hidden-sm-and-down">
-			<el-icon><el-icon-phone /></el-icon> <span>咨询热线:{{ baseData ? baseData.tel : '17712883297' }}</span>
-		</div>
-		<div class="panel-item hidden-sm-and-down">
-			<el-icon><el-icon-service /></el-icon> <span>在线客服</span>
-		</div>
-		<div class="panel-item hidden-sm-and-down">
-			<el-icon><el-icon-monitor /></el-icon> <span>放到桌面</span>
-		</div>
 		<div class="screen panel-item hidden-sm-and-down" @click="screen">
 			<el-icon><el-icon-full-screen /></el-icon> <span>全屏</span>
 		</div>

+ 0 - 1
src/layout/index.vue

@@ -266,7 +266,6 @@ export default {
 		var menu = this.$router.sc_getMenu();
 		this.menu = this.filterUrl(menu);
 		var userInfo = this.$TOOL.data.get("USER_INFO");
-		console.log(userInfo)
 		this.userInfo = userInfo;
 
 		this.userName = userInfo.truename;

+ 11 - 0
src/views/manage/agent/components/form.vue

@@ -22,6 +22,14 @@
                             <div class="el-form-item-msg"></div>
                         </el-form-item>
                     </el-col>
+                    <el-col :span="12">
+                        <el-form-item label="可创建店铺数量" prop="open_num">
+                            <el-input type="number" v-model="formData.open_num" clearable placeholder="请输入">
+                                <template #append>个</template>
+                            </el-input>
+                            <div class="el-form-item-msg"></div>
+                        </el-form-item>
+                    </el-col>
                     <el-col :span="24">
                         <el-form-item label="到期时间" prop="vip_end">
                             <el-date-picker v-model="formData.vip_end" :style="{width: '100%'}" placeholder="请选择" />
@@ -84,6 +92,9 @@ export default{
                 name: [
                     {required: true, message: '请输入'}
                 ],
+                open_num: [
+                    {required: true, message: '请输入'}
+                ],
                 vip_end: [
                     {required: true, message: "请选择到期时间",trigger: 'blur'}
                 ],

+ 10 - 0
src/views/manage/agent/components/table.vue

@@ -16,6 +16,16 @@
                 <span class="status-danger" v-else>未设置</span>
             </template>
         </el-table-column>
+        <el-table-column label="可创建店铺" prop="status" width="120" align="center">
+            <template #default="scope">
+                <span>{{ scope.row.open_num }} 个</span>
+            </template>
+        </el-table-column>
+        <el-table-column label="已创建店铺" prop="status" width="120" align="center">
+            <template #default="scope">
+                <span>{{ scope.row.store }} 个</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==1"><sc-status-indicator type="success"></sc-status-indicator> 正常</div>

+ 5 - 2
src/views/manage/components/store.vue

@@ -133,6 +133,7 @@ export default{
     emits: ['success', 'closed'],
     props: {
         multiple: { type: Boolean, default: false },
+        agent: { type: String, default: "" },
     },
     data(){
         return {
@@ -186,7 +187,6 @@ export default{
         },
         removeUser(index,name){
             this.selectData.splice(index, 1);
-            console.log(name)
         },
         handleCurrentChange(data){
             this.selectData = [data];
@@ -200,9 +200,12 @@ export default{
         fristName(name){
             return name.substring(0,1);
         },
-        open(mode = 'add'){
+        open(mode = 'add',agentId = ""){
             this.mode = mode;
             this.visible = true;
+            if (agentId) {
+                this.searchKey.agent = agentId;
+            }
             return this
         },
         //表单注入数据

+ 148 - 50
src/views/manage/goods/components/form.vue

@@ -13,53 +13,99 @@
             </div>
             <el-main>
                 <el-form ref="dialogForm" :model="formData" :rules="rules" label-width="100px" label-position="top">
-                    <el-row :gutter="15">
-                        <el-col :span="24">
-                            <el-form-item label="所属店铺" prop="account_id">
-                                <el-input v-model="formData.account_id" placeholder="所属店铺" clearable readonly :style="{ width: '100%' }" @click="selectUser">
-                                    <template #append>
-                                        <el-tooltip
-                                            effect="dark"
-                                            content="点这里,清除选择"
-                                            placement="top-start"
-                                        >
-                                        <div class="remove-a" @click="clearUser">清除</div>
-                                        </el-tooltip>
-                                    </template>
-                                </el-input>
-                            </el-form-item>
-                        </el-col>
-                        <el-col :span="24">
-                            <el-form-item label="商品标题" prop="product_name">
-                                <el-input v-model="formData.product_name" clearable placeholder="请输入"></el-input>
-                                <div class="el-form-item-msg"></div>
-                            </el-form-item>
-                        </el-col>
-                        <el-col :span="24">
-                            <el-form-item label="快递面单名称" prop="express_name">
-                                <el-input v-model="formData.express_name" clearable placeholder="请输入"></el-input>
-                                <div class="el-form-item-msg">不填写默认使用商品标题名称</div>
-                            </el-form-item>
-                        </el-col>
-                        <el-col :span="12">
-                            <el-form-item label="商品价格" prop="product_price">
-                                <el-input v-model="formData.product_price" clearable placeholder="请输入"></el-input>
-                                <div class="el-form-item-msg"></div>
-                            </el-form-item>
-                        </el-col>
-                        <el-col :span="12">
-                            <el-form-item label="商品划线价格" prop="product_orgin">
-                                <el-input v-model="formData.product_orgin" clearable placeholder="请输入"></el-input>
-                                <div class="el-form-item-msg"></div>
-                            </el-form-item>
-                        </el-col>
-                        <el-col :span="24">
-                            <el-form-item label="商品图片" prop="product_img">
-                                <sc-upload v-model="formData.product_img" tip="最多上传100个文件,单个文件不要超过10M,请上传图像格式文件"></sc-upload>
-                                <div class="el-form-item-msg">选填</div>
-                            </el-form-item>
-                        </el-col>
-                    </el-row>
+                    <fieldset>
+                        <legend><el-tag>基础信息</el-tag></legend>
+                        <el-row :gutter="15">
+                            <el-col :span="24">
+                                <el-form-item label="所属店铺" prop="store_id">
+                                    <el-input v-model="formData.store_id" placeholder="所属店铺" clearable readonly :style="{ width: '100%' }" @click="selectUser">
+                                        <template #append>
+                                            <el-tooltip
+                                                effect="dark"
+                                                content="点这里,清除选择"
+                                                placement="top-start"
+                                            >
+                                            <div class="remove-a" @click="clearUser">清除</div>
+                                            </el-tooltip>
+                                        </template>
+                                    </el-input>
+                                </el-form-item>
+                            </el-col>
+                            <el-col :span="12">
+                                <el-form-item label="商品标题" prop="product_name">
+                                    <el-input v-model="formData.product_name" clearable placeholder="请输入"></el-input>
+                                    <div class="el-form-item-msg"></div>
+                                </el-form-item>
+                            </el-col>
+                            <el-col :span="12">
+                                <el-form-item label="快递面单名称" prop="express_name">
+                                    <el-input v-model="formData.express_name" clearable placeholder="请输入"></el-input>
+                                    <div class="el-form-item-msg">不填写默认使用商品标题名称</div>
+                                </el-form-item>
+                            </el-col>
+                            <el-col :span="8">
+                                <el-form-item label="来客团单ID" prop="out_id">
+                                    <el-input v-model="formData.out_id" clearable placeholder="请输入"></el-input>
+                                    <div class="el-form-item-msg"></div>
+                                </el-form-item>
+                            </el-col>
+                            <el-col :span="8">
+                                <el-form-item label="商品价格" prop="product_price">
+                                    <el-input v-model="formData.product_price" clearable placeholder="请输入">
+                                        <template #append>元</template>
+                                    </el-input>
+                                    <div class="el-form-item-msg"></div>
+                                </el-form-item>
+                            </el-col>
+                            <el-col :span="8">
+                                <el-form-item label="商品划线价格" prop="product_origin">
+                                    <el-input v-model="formData.product_origin" clearable placeholder="请输入">
+                                        <template #append>元</template>
+                                    </el-input>
+                                    <div class="el-form-item-msg"></div>
+                                </el-form-item>
+                            </el-col>
+                            <el-col :span="24">
+                                <el-form-item label="商品图片" prop="product_img">
+                                    <sc-upload v-model="formData.product_img" tip="最多上传100个文件,单个文件不要超过10M,请上传图像格式文件"></sc-upload>
+                                    <div class="el-form-item-msg">选填</div>
+                                </el-form-item>
+                            </el-col>
+                        </el-row>
+                    </fieldset>
+                    <fieldset>
+                        <legend><el-tag>商品附加规格</el-tag></legend>
+                        <el-button type="primary" size="small" @click="addSpecs" v-if="specs.length<5">添加规格分组</el-button>
+                        <div class="specs" v-for="(item,indx) in specs" :key="indx">
+                            <div class="specs-header">
+                                <div class="specs-left">
+                                    <el-input v-model="item.name" placeholder="组名称" clearable>
+                                        <template #prepend>组名称</template>
+                                    </el-input>
+                                    <el-select v-model="item.num" clearable placeholder="请选择数量" v-if="item.list.length > 1">
+                                        <el-option :value="len" :label="item.list.length+'选'+len" v-for="len in item.list.length"></el-option>
+                                    </el-select>
+                                </div>
+                                <div class="specs-right">
+                                    <el-button type="primary" @click="addItem(indx)">增加</el-button>
+                                    <el-button type="danger" @click="removeSpec(indx)">删除</el-button>
+                                </div>
+                            </div>
+                            <div class="specs-body">
+                                <div class="body-item" v-for="(its,ind) in item.list" :key="ind">
+                                    <el-input placeholder="输入规格属性名" v-model="its.name" clearable>
+                                        <template #append>
+                                            <el-popconfirm title="确定删除吗?" @click="removeItem(indx,ind)">
+                                                <template #reference>
+                                                    <el-button type="danger" icon="el-icon-delete" size="small"></el-button>
+                                                </template>
+                                            </el-popconfirm>
+                                        </template>
+                                    </el-input>
+                                </div>
+                            </div>
+                        </div>
+                    </fieldset>
                 </el-form>
             </el-main>
             <el-footer style="text-align: right;">
@@ -87,24 +133,46 @@ export default {
             },
             visible: false,
             isSaveing: false,
+            specs:[],
             formData:{},
             rules:{
-                account_id: [
+                store_id: [
                     {required: true, message: '请选择'}
                 ],
+                out_id: [
+                    {required: true, message: '请输入'}
+                ],
                 product_name: [
                     {required: true, message: '请输入'}
                 ],
                 product_price: [
                     {required: true, message: '请输入'}
                 ],
-                product_orgin: [
+                product_origin: [
                     {required: true, message: '请输入'}
                 ],
             }
         }
     },
     methods:{
+        addSpecs(){
+            if (this.specs.length >= 5) {
+                return this.$message.error("最多只能添加三组规格")
+            }
+            this.specs.push({"name":"","num":1,"list":[ {"name":"","check":true} ]});
+        },
+        addItem(index){
+            if (this.specs[index].list.length >= 20) {
+                return this.$message.error("最多只能添加20个")
+            }
+            this.specs[index].list.push({"name":"","check":true})
+        },
+        removeSpec(index){
+            this.specs.splice(index,1)
+        },
+        removeItem(index,sub){
+            this.specs[index].list.splice(sub,1)
+        },
         handleSuccess(data){
             this.formData.store_id = data.store_id;
         },
@@ -124,12 +192,18 @@ export default {
         //表单注入数据
         setData(data){
             this.formData = JSON.parse(JSON.stringify(data));
+            if (this.mode == 'edit') {
+                this.specs = data.data_specs;
+            }
         },
         async submit(){
             var validate = await this.$refs.dialogForm.validate().catch(()=>{});
             if(!validate){ return false }
             this.isSaveing = true;
             let submitData = JSON.parse(JSON.stringify(this.formData));
+            if (this.specs.length > 0) {
+                submitData.data_specs = JSON.stringify(this.specs);
+            }
             var resp = await this.$API.goods.save.post(submitData);
             this.isSaveing = false;
             if (resp.code == 0) {
@@ -138,9 +212,33 @@ export default {
             this.$message.success(resp.msg);
             this.visible = false;
             this.formData = {};
+            this.specs = [];
             this.submitState = false;
             this.$emit("success");
         }
     }
 }
-</script>
+</script>
+
+<style>
+.specs{margin-top: 15px;background-color: #f8f8f8;}
+.specs-header{
+    display: flex;
+    margin-bottom: 10px;
+    border-bottom: 1px solid #f8f8f8;
+    background-color: #ddd;
+    padding: 10px;
+}
+.specs-header .specs-left{
+    display: flex;
+    align-items: center;
+    gap: 10px;
+}
+.specs-header .specs-right{
+    display: flex;
+    margin-left: auto;
+    margin-right: 0;
+}
+.specs-body{display: flex;align-items: center;gap: 10px;padding: 10px;flex-direction: row;flex-wrap: wrap;}
+.specs-body .body-item{width: calc(25% - 10px);}
+</style>

+ 1 - 1
src/views/manage/goods/components/option.vue

@@ -41,7 +41,7 @@ export default {
                 return this.$message.error("请选择修改数据")
             }
             let submitData = {"id":this.dataSelect,"value":status,"field":"status","type":"batch"};
-            var resp = await this.$API.express.batch.post(submitData);
+            var resp = await this.$API.goods.batch.post(submitData);
             if (resp.code == 0) {
                 return this.$message.error(resp.msg);
             }

+ 1 - 3
src/views/manage/goods/components/search.vue

@@ -35,9 +35,7 @@
 export default {
     data(){
         return {
-            searchKey:{
-                status:7
-            }
+            searchKey:{}
         }
     },
     methods: {

+ 23 - 5
src/views/manage/goods/components/table.vue

@@ -1,15 +1,33 @@
 <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="code" width="220" fixed="left">
+        <el-table-column label="商品ID" prop="out_id" width="220" fixed="left">
             <template #default="scope">
-                <span v-if="scope.row.code">{{ scope.row.code }}</span>
+                <span v-if="scope.row.out_id">{{ scope.row.out_id }}</span>
                 <span class="status-danger" v-else>未设置</span>
             </template>
         </el-table-column>
-        <el-table-column label="类型描述/名称" prop="name" width="200">
+        <el-table-column label="所属代理" prop="agent" width="200">
             <template #default="scope">
-                <span v-if="scope.row.name">{{ scope.row.name }}</span>
+                <span v-if="scope.row.agent">{{ scope.row.agent.name }}</span>
+                <span class="status-danger" v-else>未设置</span>
+            </template>
+        </el-table-column>
+        <el-table-column label="所属店铺" prop="agent" width="200">
+            <template #default="scope">
+                <span v-if="scope.row.store">{{ scope.row.store.store_name }}</span>
+                <span class="status-danger" v-else>未设置</span>
+            </template>
+        </el-table-column>
+        <el-table-column label="商品标题" prop="product_name" width="200">
+            <template #default="scope">
+                <span v-if="scope.row.product_name">{{ scope.row.product_name }}</span>
+                <span class="status-danger" v-else>未设置</span>
+            </template>
+        </el-table-column>
+        <el-table-column label="金额" prop="product_price" width="200">
+            <template #default="scope">
+                <span v-if="scope.row.product_price">¥{{ scope.row.product_price }}</span>
                 <span class="status-danger" v-else>未设置</span>
             </template>
         </el-table-column>
@@ -54,7 +72,7 @@ export default {
     },
     methods: {
         async table_del(data){
-            var resp = await this.$API.express.del.post({"id":data.id});
+            var resp = await this.$API.goods.del.post({"id":data.id});
             if (resp.code == 0) {
                 return this.$message.error(resp.msg)
             }

+ 12 - 0
src/views/manage/setting/basic/index.vue

@@ -38,6 +38,18 @@
                                 </el-form-item>
                             </el-form>
                         </el-tab-pane>
+                        <el-tab-pane label="抖音小程序" name="dy" v-loading="isLoading">
+                            <el-form :model="sys" :rules="rules2" ref="form" label-position="top" @keyup.enter="saveForm" v-if="activeName=='dy'">
+                                <el-form-item label="应用ID(AppId)" prop="appid">
+                                    <el-input v-model="sys.appid" clearable placeholder="请输入AppId"></el-input>
+                                    <div class="el-form-item-msg">通过抖音小程序后台获取</div>
+                                </el-form-item>
+                                <el-form-item label="应用密钥(AppSecret)" prop="secret">
+                                    <el-input v-model="sys.secret" clearable placeholder="请输入AppSecret"></el-input>
+                                    <div class="el-form-item-msg">通过抖音小程序后台获取</div>
+                                </el-form-item>
+                            </el-form>
+                        </el-tab-pane>
                         <el-tab-pane label="短信设置(非代理)" name="sms" v-loading="isLoading">
                             <el-form :model="sys" :rules="rules2" ref="form" label-position="top" @keyup.enter="saveForm" v-if="activeName=='sms'">
                                 <el-form-item label="短信平台" prop="sms_type" class="label-item">

+ 12 - 1
src/views/manage/shop/store/components/form.vue

@@ -29,9 +29,17 @@
                         <div class="el-form-item-msg"></div>
                     </el-form-item>
                 </el-col>
+                <el-col :span="24">
+                    <el-form-item label="门店经纬度" prop="poi_location">
+                        <el-input v-model="formData.poi_location" clearable placeholder="门店经纬度">
+                            <template #append><a href="https://lbs.amap.com/tools/picker" target="_blank">点击查询坐标</a></template>
+                        </el-input>
+                        <div class="el-form-item-msg">经纬度必须是保留小数点后6位数</div>
+                    </el-form-item>
+                </el-col>
                 <el-col :span="24">
                     <el-form-item label="门店地址" prop="poi_address">
-                        <el-input v-model="formData.poi_address" clearable placeholder="门店地址"></el-input>
+                        <el-input type="textarea" :row="5" v-model="formData.poi_address" clearable placeholder="门店地址"></el-input>
                         <div class="el-form-item-msg"></div>
                     </el-form-item>
                 </el-col>
@@ -69,6 +77,9 @@ export default {
                 poi_id: [
                     {required: true, message: '请输入'}
                 ],
+                poi_localtion: [
+                    {required: true, message: '请输入'}
+                ],
                 poi_name: [
                     {required: true, message: "请输入"}
                 ],

+ 192 - 238
src/views/merchant/dashboard/index.vue

@@ -11,294 +11,236 @@
 	</div>
     <el-main>
         <div class="card-news mt0">
-            <div class="news-title">{{ $t('store.dashboard.orderTitle') }}</div>
+            <div class="news-title">经营数据</div>
             <div class="total-panel">
-                <div class="panel-item" style="background-color: rgb(235, 241, 255);">
+                <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">{{ dataInfo.customer ? dataInfo.customer:'0' }}</div>
-                            <div class="desc">{{ $t('store.dashboard.yestoday') }} 0</div>
+                            <div class="title">今日营业额(元)</div>
+                            <div class="number">{{ todayData.order_money ? todayData.order_money:'0' }}</div>
+                            <div class="desc">来客订单金额</div>
                         </div>
                         <div class="right"><img src="@/assets/image/wave-1-icon.png" /></div>
                     </div>
                     <div class="item-wave"><img src="@/assets/image/wave-1.png" /></div>
                 </div>
-                <div class="panel-item" style="background-color: rgb(240, 235, 255);">
+                <div :class="this.$store.state.global.ismobile?'panel-item m':'panel-item'" style="background-color: rgb(240, 235, 255);">
                     <div class="item-warp">
                         <div class="left">
-                            <div class="title">新增客户</div>
-                            <div class="number">{{ dataInfo.customer ? dataInfo.customer:'0' }}</div>
-                            <div class="desc">{{ $t('store.dashboard.yestoday') }} 0</div>
+                            <div class="title">今日订单数(单)</div>
+                            <div class="number">{{ todayData.order_num ? todayData.order_num:'0' }}</div>
+                            <div class="desc">来客订单</div>
                         </div>
                         <div class="right"><img src="@/assets/image/wave-2-icon.png" /></div>
                     </div>
                     <div class="item-wave"><img src="@/assets/image/wave-2.png" /></div>
                 </div>
-                <div class="panel-item" style="background-color: rgb(255, 241, 214);">
+                <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">{{ dataInfo.customer ? dataInfo.customer:'0' }}</div>
-                            <div class="desc">{{ $t('store.dashboard.yestoday') }} 0</div>
+                            <div class="title">今日核销(单)</div>
+                            <div class="number">{{ todayData.order_done ? todayData.order_done:'0' }}</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="panel-item" style="background-color: rgb(250, 230, 244);">
+                <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">{{ dataInfo.customer ? dataInfo.customer:'0' }}</div>
-                            <div class="desc">{{ $t('store.dashboard.yestoday') }} 0</div>
+                            <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>
-        </div>
-        <el-row :gutter="20">
-            <el-col :span="this.$store.state.global.ismobile?24:20" :xs="24">
-                <div class="card-news mt10">
-                    <div class="news-title">门店监控</div>
-                    <div class="total-panel-sub">
-                        <el-row :gutter="20">
-                            <el-col :span="this.$store.state.global.ismobile?24:12" :xs="24">
-                                <div class="sub-card mt10">
-                                    <div class="title">今日数据</div>
-                                    <div class="sub-content">
-                                        <div class="sub-box">
-                                            <div class="row1"><img src="@/assets/image/store1.png" /><span>今日收衣件数</span></div>
-                                            <div class="row2">0</div>
-                                            <div class="row3">{{ $t('store.dashboard.yestoday') }} 0</div>
-                                        </div>
-                                        <div class="sub-box">
-                                            <div class="row1"><img src="@/assets/image/store2.png" /><span>今日已支付(元)</span></div>
-                                            <div class="row2">0</div>
-                                            <div class="row3">{{ $t('store.dashboard.yestoday') }} 0</div>
-                                        </div>
-                                        <div class="sub-box">
-                                            <div class="row1"><img src="@/assets/image/store3.png" /><span>今日订单数</span></div>
-                                            <div class="row2">0</div>
-                                            <div class="row3">{{ $t('store.dashboard.yestoday') }} 0</div>
-                                        </div>
-                                    </div>
-                                </div>
-                            </el-col>
-                            <el-col :span="this.$store.state.global.ismobile?24:12" :xs="24">
-                                <div class="sub-card mt10">
-                                    <div class="title">过往数据</div>
-                                    <div class="sub-content">
-                                        <div class="sub-box" style="width: calc(50% - 12px);">
-                                            <div class="row1"><img src="@/assets/image/store4.png" /><span>本月订单数</span></div>
-                                            <div class="row2">0</div>
-                                            <div class="row3">{{ $t('store.dashboard.yestoday') }} 0</div>
-                                        </div>
-                                        <div class="sub-box" style="width: calc(50% - 12px);">
-                                            <div class="row1"><img src="@/assets/image/store5.png" /><span>累计订单数</span></div>
-                                            <div class="row2">0</div>
-                                            <div class="row3">{{ $t('store.dashboard.yestoday') }} 0</div>
-                                        </div>
-                                    </div>
-                                </div>
-                            </el-col>
-                        </el-row>
-                    </div>
-                </div>
-                <div class="card-news mt10">
-                    <div class="news-title">工厂监控</div>
-                    <div class="total-panel">
-                        <div class="panel-item bg-gray" :style="{backgroundImage:'url('+blueBg+')'}">
-                            <div class="item-warp img">
-                                <div class="left">
-                                    <div class="title">今日入厂</div>
-                                    <div class="number">{{ dataInfo.customer ? dataInfo.customer:'0' }}<span>单</span></div>
-                                    <div class="desc">总件数:0</div>
-                                </div>
-                            </div>
-                        </div>
-                        <div class="panel-item bg-gray">
-                            <div class="item-warp">
-                                <div class="left">
-                                    <div class="title">在厂量</div>
-                                    <div class="number">{{ dataInfo.customer ? dataInfo.customer:'0' }}<span>单</span></div>
-                                    <div class="desc">总件数:0</div>
-                                </div>
-                            </div>
-                        </div>
-                        <div class="panel-item bg-gray">
-                            <div class="item-warp">
-                                <div class="left">
-                                    <div class="title">近一个月待入厂量</div>
-                                    <div class="number">{{ dataInfo.customer ? dataInfo.customer:'0' }}<span>单</span></div>
-                                    <div class="desc">总件数:0</div>
-                                </div>
-                            </div>
-                        </div>
-                        <div class="panel-item bg-gray">
-                            <div class="item-warp">
-                                <div class="left">
-                                    <div class="title">待预检量</div>
-                                    <div class="number">{{ dataInfo.customer ? dataInfo.customer:'0' }}<span>单</span></div>
-                                    <div class="desc">总件数:0</div>
-                                </div>
-                            </div>
-                        </div>
-                        <div class="panel-item bg-gray">
-                            <div class="item-warp">
-                                <div class="left">
-                                    <div class="title">今日出厂</div>
-                                    <div class="number">{{ dataInfo.customer ? dataInfo.customer:'0' }}<span>单</span></div>
-                                    <div class="desc">总件数:0</div>
-                                </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>
-                <div class="card-news mt10">
-                    <div class="news-title">时效监控</div>
-                    <div class="total-panel-sub">
-                        <el-row :gutter="20">
-                            <el-col :span="this.$store.state.global.ismobile?12:6" :xs="12">
-                                <div class="sub-card mt10">
-                                    <div class="title red">未入厂</div>
-                                    <div class="sub-content">
-                                        <div class="sub-box" style="width: calc(50% - 12px);">
-                                            <div class="row1"><span>近30天超10H未入厂</span></div>
-                                            <div class="row2 red">0<span>单</span></div>
-                                        </div>
-                                        <div class="sub-box" style="width: calc(50% - 12px);">
-                                            <div class="row1"><span>近30天超18H未入厂</span></div>
-                                            <div class="row2 red">0<span>单</span></div>
-                                        </div>
-                                    </div>
-                                </div>
-                            </el-col>
-                            <el-col :span="this.$store.state.global.ismobile?12:6" :xs="12">
-                                <div class="sub-card mt10">
-                                    <div class="title red">未拆包</div>
-                                    <div class="sub-content">
-                                        <div class="sub-box" style="width: calc(50% - 12px);">
-                                            <div class="row1"><span>超24H未拆包</span></div>
-                                            <div class="row2 red">0<span>单</span></div>
-                                        </div>
-                                        <div class="sub-box" style="width: calc(50% - 12px);">
-                                            <div class="row1"><span>超72H未拆包</span></div>
-                                            <div class="row2 red">0<span>单</span></div>
-                                        </div>
-                                    </div>
-                                </div>
-                            </el-col>
-                            <el-col :span="this.$store.state.global.ismobile?12:6" :xs="12">
-                                <div class="sub-card mt10">
-                                    <div class="title red">在厂超时</div>
-                                    <div class="sub-content">
-                                        <div class="sub-box" style="width: calc(50% - 12px);">
-                                            <div class="row1"><span>在厂超4天</span></div>
-                                            <div class="row2 red">0<span>件</span></div>
-                                        </div>
-                                        <div class="sub-box" style="width: calc(50% - 12px);">
-                                            <div class="row1"><span>在厂超6天</span></div>
-                                            <div class="row2 red">0<span>件</span></div>
-                                        </div>
-                                    </div>
-                                </div>
-                            </el-col>
-                            <el-col :span="this.$store.state.global.ismobile?12:6" :xs="12">
-                                <div class="sub-card mt10">
-                                    <div class="title red">未取件</div>
-                                    <div class="sub-content">
-                                        <div class="sub-box" style="width: calc(100% - 24px);">
-                                            <div class="row1"><span>超24H未取件</span></div>
-                                            <div class="row2 red">0<span>单</span></div>
-                                        </div>
-                                    </div>
-                                </div>
-                            </el-col>
-                        </el-row>
-                    </div>
-                    <!--  -->
+                    <div class="item-wave"><img src="@/assets/image/wave-5.png" /></div>
                 </div>
+            </div>
+        </div>
+        <el-row :gutter="20">
+            <el-col :span="this.$store.state.global.ismobile?24:12" :xs="24">
                 <div class="card-news mt10">
-                    <div class="news-title">服务预警</div>
-                    <div class="total-panel-sub">
-                        <el-row :gutter="20">
-                            <el-col :span="12" :xs="24">
-                                <div class="service-item mt10">
-                                    <img src="@/assets/image/icon-duanxintixing.png" />
-                                    <div class="item-sub">
-                                        <h3>短信提醒</h3>
-                                        <p>剩余短信数量</p>
-                                    </div>
-                                    <div class="value">646</div>
-                                    <div class="right-btn"><el-button type="primary">立即购买</el-button></div>
-                                </div>
-                            </el-col>
-                            <el-col :span="12" :xs="24">
-                                <div class="service-item mt10">
-                                    <img src="@/assets/image/icon-duanxintixing.png" />
-                                    <div class="item-sub">
-                                        <h3>付费到期提醒</h3>
-                                        <p>剩余付费使用天数</p>
-                                    </div>
-                                    <div class="value">315天</div>
-                                    <div class="right-btn"><el-button type="primary">立即续费</el-button></div>
-                                </div>
-                            </el-col>
-                        </el-row>
-                    </div>
+                    <scEcharts height="500px" :option="option2"></scEcharts>
                 </div>
             </el-col>
-            <el-col :span="this.$store.state.global.ismobile?24:4" :xs="24">
+            <el-col :span="this.$store.state.global.ismobile?24:12" :xs="24">
                 <div class="card-news mt10">
-                    <div class="news-title">系统动态</div>
-                    <div class="card-news-sub">
-                        <div class="date-title">
-                            <el-link :underline="false">1月16日系统升级通知</el-link>
-                            <div class="date-time">01-16</div>
-                        </div>
-                        <div class="date-title">
-                            <el-link :underline="false">12月5日系统升级通知</el-link>
-                            <div class="date-time">12-05</div>
-                        </div>
-                        <div class="date-title">
-                            <el-link :underline="false">9.19日系统升级通知</el-link>
-                            <div class="date-time">09-19</div>
-                        </div>
-                    </div>
-                </div>
-                <div class="card-news mt10">
-                    <div class="news-title">客服热线</div>
-                    <div class="service-tel">
-                        <img src="@/assets/image/tel.png" />
-                        <span>{{baseData.tel?baseData.tel:'-'}}</span>
-                    </div>
+                    <scEcharts height="500px" :option="option"></scEcharts>
                 </div>
             </el-col>
         </el-row>
-
     </el-main>
 </template>
 
 <script>
 import blueBg from "@/assets/image/blue_bg.png";
+import scEcharts from '@/components/scEcharts';
 export default {
     name: "dashboard",
+    components: {
+        scEcharts
+    },
     data(){
         return {
             pageLoading: false,
             dashboard: '0',
-            dataInfo:{},
+            todayData:{},
             blueBg,
-            baseData:{}
+            baseData:{},
+            option2: {},
+            option: {
+                // title: {
+                //     left: 'left', 
+                //     text: '订单数据',
+                // },
+                // grid: {
+                //     top: '80px'
+                // },
+                // tooltip: {
+                //     trigger: 'axis'
+                // },
+                // legend: {
+                //     x: 'right',
+                //     data: ['呼出总数量', '接听总数量', '短信发送总数量', '添加微信总数量']
+                // },
+                // calculable: true,
+                // xAxis: {
+                //     type: 'category',
+                //     data: ['06-25', '06-26', '06-27', '06-28', '06-29', '06-30', '07-01', '07-02', '07-03', '07-04']
+                // },
+                // yAxis: [{
+                //     type: 'value'
+                // }],
+                // // yAxis: [{type: 'value', splitLine: {show: true}, gridIndex: 0, axisLabel: {formatter: '{value} 单'}}],
+                // series: [{
+                //     name: '呼出总数量',
+                //     data: [120, 200, 50, 80, 170, 210, 130,450,244,168],
+                //     smooth: true, showBackground: false,
+                //     areaStyle: {color: 'rgba(64, 158, 254, 0.6)'},
+                //     type: 'line', showSymbol: true, xAxisIndex: 0, yAxisIndex: 0,
+                //     emphasis:{focus: 'series'},
+                //     label: {position: 'top', formatter: '{c}', show: true},
+                // },{
+                //     name: '接听总数量',
+                //     data: [20, 210, 10, 180, 110, 100, 130,450,244,168],
+                //     smooth: true, showBackground: false,
+                //     areaStyle: {color: 'rgba(54, 206, 159, 0.6)'},
+                //     type: 'line', showSymbol: true, xAxisIndex: 0, yAxisIndex: 0,
+                //     emphasis:{focus: 'series'},
+                //     label: {position: 'top', formatter: '{c}', show: true},
+                // },{
+                //     name: '短信发送总数量',
+                //     data: [20, 210, 10, 80, 110, 100, 130,450,244,168],
+                //     smooth: true, showBackground: false,
+                //     areaStyle: {color: 'rgba(245, 110, 106, 0.6)'},
+                //     type: 'line', showSymbol: true, xAxisIndex: 0, yAxisIndex: 0,
+                //     emphasis:{focus: 'series'},
+                //     label: {position: 'top', formatter: '{c}', show: true},
+                // },{
+                //     name: '添加微信总数量',
+                //     data: [20, 210, 110, 180, 110, 100, 130,450,244,268],
+                //     smooth: true, showBackground: false,
+                //     areaStyle: {color: 'rgba(98, 108, 144, 0.6)'},
+                //     type: 'line', showSymbol: true, xAxisIndex: 0, yAxisIndex: 0,
+                //     emphasis:{focus: 'series'},
+                //     label: {position: 'top', formatter: '{c}', show: true},
+                // }]
+            },
         }
     },
     created(){
-        var baseData = this.$TOOL.data.get("AGENT_SERVICE");
+        var baseData = this.$TOOL.data.get("SERVICE");
         this.baseData = baseData;
+        // this.getData()
+    },
+    methods: {
+        async getData(){
+            var loading = this.$loading();
+            var resp = await this.$API.dash.store.get();
+            loading.close();
+            this.todayData = resp.data.today;
+            let data = resp.data.moneys;
+            let moneyDay = data.map(function (item) {
+                return item['当天日期'];
+            });
+            let data2 = resp.data.orders;
+            let orderDay = data2.map(function (item) {
+                return item['当天日期'];
+            });
+            this.option = {
+                title: {
+                    left: 'left', 
+                    text: '近15天订单数据',
+                },
+                grid: {
+                    top: '80px'
+                },
+                tooltip: {trigger: 'axis', show: true, axisPointer: {type: 'cross', label: {}}},
+                xAxis: [{data: orderDay, gridIndex: 0}],
+                yAxis: [
+                    {
+                        splitLine: {show: true}, gridIndex: 0, type: 'value', axisLabel: {
+                            formatter: '{value} 单'
+                        }
+                    }
+                ],
+                grid: [{left: '5%', right: '3%', top: '15%', bottom: '5%'}],
+                series: [
+                    {
+                        smooth: true, showBackground: true,
+                        areaStyle: {color: 'rgba(180, 180, 180, 0.5)'},
+                        type: 'bar', showSymbol: true, xAxisIndex: 0, yAxisIndex: 0,
+                        label: {normal: {position: 'top', formatter: '{c} 单', show: true}},
+                        data: data2.map(function (item) {
+                            return item['订单数量'];
+                        }),
+                    }
+                ]
+            };
+            this.option2 = {
+                title: {
+                    left: 'left', 
+                    text: '近15天订单金额',
+                },
+                grid: {
+                    top: '80px'
+                },
+                tooltip: {trigger: 'axis', show: true, axisPointer: {type: 'cross', label: {}}},
+                xAxis: [{data: moneyDay, gridIndex: 0}],
+                yAxis: [
+                    {
+                        splitLine: {show: true}, gridIndex: 0, type: 'value', axisLabel: {
+                            formatter: '{value} 元'
+                        }
+                    }
+                ],
+                grid: [{left: '5%', right: '3%', top: '15%', bottom: '5%'}],
+                series: [
+                    {
+                        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}},
+                        data: data.map(function (item) {
+                            return item['订单金额'];
+                        }),
+                    }
+                ]
+            };
+        }
     }
 }
 </script>
@@ -315,12 +257,15 @@ export default {
 }
 .service-item {
     border: 1px solid #EAE9F0;
-    padding: 12px 24px;
+    padding: 12px 14px;
     border-radius: 6px;
     display: flex;
     align-items: center;
     flex: 1;
 }
+.service-item .item-sub{
+    width: 40%;
+}
 .service-item .right-btn {
     margin-left: auto;
 }
@@ -339,10 +284,15 @@ export default {
     color: #333333d9;
 }
 .service-item .value{
-    font-size: 24px;
+    font-size: 18px;
     color: #f64945;
     font-weight: 700;
-    margin-left: 26px;
+    margin-left: auto;
+}
+.service-item .value span {
+    font-weight: normal;
+    color: #666;
+    font-size: 12px;
 }
 .service-tel {
     display: flex;
@@ -455,15 +405,19 @@ export default {
     display: flex;
     align-items: center;
     justify-content: space-between;
+    flex-wrap: wrap;
     margin-top: 16px;
 }
+.total-panel .panel-item.m{
+    width: calc(100% - 9.6px);
+    margin-bottom: 10px;
+}
 .total-panel .panel-item{
-    width: calc((100% - 88px)/4);
+    width: calc(20% - 9.6px);
     height: 130px;
     box-shadow: rgba(0, 0, 0, 0.05) 0px 0px 8px;
     position: relative;
     border-radius: 6px;
-    overflow: hidden;
 }
 .total-panel .panel-item .item-warp .left {
     padding:16px 0px 0px 23px;

+ 247 - 0
src/views/merchant/goods/components/form.vue

@@ -0,0 +1,247 @@
+<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] }}</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-form ref="dialogForm" :model="formData" :rules="rules" label-width="100px" label-position="top">
+                    <fieldset>
+                        <legend><el-tag>基础信息</el-tag></legend>
+                        <el-row :gutter="15">
+                            <el-col :span="24">
+                                <el-form-item label="所属店铺" prop="store_id">
+                                    <el-input v-model="formData.store_id" placeholder="所属店铺" clearable readonly :style="{ width: '100%' }" @click="selectUser">
+                                        <template #append>
+                                            <el-tooltip
+                                                effect="dark"
+                                                content="点这里,清除选择"
+                                                placement="top-start"
+                                            >
+                                            <div class="remove-a" @click="clearUser">清除</div>
+                                            </el-tooltip>
+                                        </template>
+                                    </el-input>
+                                </el-form-item>
+                            </el-col>
+                            <el-col :span="12">
+                                <el-form-item label="商品标题" prop="product_name">
+                                    <el-input v-model="formData.product_name" clearable placeholder="请输入"></el-input>
+                                    <div class="el-form-item-msg"></div>
+                                </el-form-item>
+                            </el-col>
+                            <el-col :span="12">
+                                <el-form-item label="快递面单名称" prop="express_name">
+                                    <el-input v-model="formData.express_name" clearable placeholder="请输入"></el-input>
+                                    <div class="el-form-item-msg">不填写默认使用商品标题名称</div>
+                                </el-form-item>
+                            </el-col>
+                            <el-col :span="8">
+                                <el-form-item label="来客团单ID" prop="out_id">
+                                    <el-input v-model="formData.out_id" clearable placeholder="请输入"></el-input>
+                                    <div class="el-form-item-msg"></div>
+                                </el-form-item>
+                            </el-col>
+                            <el-col :span="8">
+                                <el-form-item label="商品价格" prop="product_price">
+                                    <el-input v-model="formData.product_price" clearable placeholder="请输入">
+                                        <template #append>元</template>
+                                    </el-input>
+                                    <div class="el-form-item-msg"></div>
+                                </el-form-item>
+                            </el-col>
+                            <el-col :span="8">
+                                <el-form-item label="商品划线价格" prop="product_origin">
+                                    <el-input v-model="formData.product_origin" clearable placeholder="请输入">
+                                        <template #append>元</template>
+                                    </el-input>
+                                    <div class="el-form-item-msg"></div>
+                                </el-form-item>
+                            </el-col>
+                            <el-col :span="24">
+                                <el-form-item label="商品图片" prop="product_img">
+                                    <sc-upload v-model="formData.product_img" tip="最多上传100个文件,单个文件不要超过10M,请上传图像格式文件"></sc-upload>
+                                    <div class="el-form-item-msg">选填</div>
+                                </el-form-item>
+                            </el-col>
+                        </el-row>
+                    </fieldset>
+                    <fieldset>
+                        <legend><el-tag>商品附加规格</el-tag></legend>
+                        <el-button type="primary" size="small" @click="addSpecs" v-if="specs.length<5">添加规格分组</el-button>
+                        <div class="specs" v-for="(item,indx) in specs" :key="indx">
+                            <div class="specs-header">
+                                <div class="specs-left">
+                                    <el-input v-model="item.name" placeholder="组名称" clearable>
+                                        <template #prepend>组名称</template>
+                                    </el-input>
+                                    <el-select v-model="item.num" clearable placeholder="请选择数量" v-if="item.list.length > 1">
+                                        <el-option :value="len" :label="item.list.length+'选'+len" v-for="len in item.list.length"></el-option>
+                                    </el-select>
+                                </div>
+                                <div class="specs-right">
+                                    <el-button type="primary" @click="addItem(indx)">增加</el-button>
+                                    <el-button type="danger" @click="removeSpec(indx)">删除</el-button>
+                                </div>
+                            </div>
+                            <div class="specs-body">
+                                <div class="body-item" v-for="(its,ind) in item.list" :key="ind">
+                                    <el-input placeholder="输入规格属性名" v-model="its.name" clearable>
+                                        <template #append>
+                                            <el-popconfirm title="确定删除吗?" @click="removeItem(indx,ind)">
+                                                <template #reference>
+                                                    <el-button type="danger" icon="el-icon-delete" size="small"></el-button>
+                                                </template>
+                                            </el-popconfirm>
+                                        </template>
+                                    </el-input>
+                                </div>
+                            </div>
+                        </div>
+                    </fieldset>
+                </el-form>
+            </el-main>
+            <el-footer style="text-align: right;">
+                <el-button @click="visible=false" >取 消</el-button>
+                <el-button v-if="mode!='show'" type="primary" :loading="isSaveing" @click="submit()">保 存</el-button>
+            </el-footer>
+        </el-container>
+    </el-drawer>
+    <storeData ref="storeData" :multiple="false" @success="handleSuccess"></storeData>
+</template>
+
+<script>
+import storeData from "@/views/manage/components/store";
+export default {
+    components: {
+        storeData
+    },
+    data(){
+        return {
+            loading: false,
+            mode:"add",
+            titleMap:{
+                add:"新增商品",
+                edit:"编辑商品"
+            },
+            visible: false,
+            isSaveing: false,
+            specs:[],
+            formData:{},
+            userInfo:{},
+            rules:{
+                store_id: [
+                    {required: true, message: '请选择'}
+                ],
+                out_id: [
+                    {required: true, message: '请输入'}
+                ],
+                product_name: [
+                    {required: true, message: '请输入'}
+                ],
+                product_price: [
+                    {required: true, message: '请输入'}
+                ],
+                product_origin: [
+                    {required: true, message: '请输入'}
+                ],
+            }
+        }
+    },
+    methods:{
+        addSpecs(){
+            if (this.specs.length >= 5) {
+                return this.$message.error("最多只能添加三组规格")
+            }
+            this.specs.push({"name":"","num":1,"list":[ {"name":"","check":true} ]});
+        },
+        addItem(index){
+            if (this.specs[index].list.length >= 20) {
+                return this.$message.error("最多只能添加20个")
+            }
+            this.specs[index].list.push({"name":"","check":true})
+        },
+        removeSpec(index){
+            this.specs.splice(index,1)
+        },
+        removeItem(index,sub){
+            this.specs[index].list.splice(sub,1)
+        },
+        handleSuccess(data){
+            this.formData.store_id = data.store_id;
+        },
+        clearUser(){
+            this.formData.store_id = "";
+        },
+        selectUser(){
+            this.$nextTick(() => {
+                this.$refs.storeData.open("add",this.userInfo.agent_id)
+            })
+        },
+        open(mode = 'add'){
+            this.mode = mode;
+            this.visible = true;
+            var userInfo = this.$TOOL.data.get("USER_INFO");
+            this.userInfo = userInfo;
+            return this
+        },
+        //表单注入数据
+        setData(data){
+            this.formData = JSON.parse(JSON.stringify(data));
+            if (this.mode == 'edit') {
+                this.specs = data.data_specs;
+            }
+        },
+        async submit(){
+            var validate = await this.$refs.dialogForm.validate().catch(()=>{});
+            if(!validate){ return false }
+            this.isSaveing = true;
+            let submitData = JSON.parse(JSON.stringify(this.formData));
+            if (this.specs.length > 0) {
+                submitData.data_specs = JSON.stringify(this.specs);
+            }
+            var resp = await this.$API.goods.save.post(submitData);
+            this.isSaveing = false;
+            if (resp.code == 0) {
+                return this.$message.error(resp.msg);
+            }
+            this.$message.success(resp.msg);
+            this.visible = false;
+            this.formData = {};
+            this.specs = [];
+            this.submitState = false;
+            this.$emit("success");
+        }
+    }
+}
+</script>
+
+<style>
+.specs{margin-top: 15px;background-color: #f8f8f8;}
+.specs-header{
+    display: flex;
+    margin-bottom: 10px;
+    border-bottom: 1px solid #f8f8f8;
+    background-color: #ddd;
+    padding: 10px;
+}
+.specs-header .specs-left{
+    display: flex;
+    align-items: center;
+    gap: 10px;
+}
+.specs-header .specs-right{
+    display: flex;
+    margin-left: auto;
+    margin-right: 0;
+}
+.specs-body{display: flex;align-items: center;gap: 10px;padding: 10px;flex-direction: row;flex-wrap: wrap;}
+.specs-body .body-item{width: calc(25% - 10px);}
+</style>

+ 61 - 0
src/views/merchant/goods/components/option.vue

@@ -0,0 +1,61 @@
+<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()">新增商品</el-button>
+                <el-button icon="el-icon-document" @click="table_batch_status(1)" :disabled="dataSelect.length>0?false:true">启用</el-button>
+                <el-button icon="el-icon-lock" @click="table_batch_status(0)" :disabled="dataSelect.length>0?false:true">禁用</el-button>
+            </div>
+        </div>
+    </fieldset>
+    <formMain ref="formMain" @success="handleSuccess"></formMain>
+</template>
+
+<script>
+import formMain from './form';
+export default {
+    components: {
+        formMain
+    },
+    props: {
+        type: { type: String, default: "1" },
+        dataSelect: { type: Array, default: () => [] },
+        dataSelectFull: { type: Array, default: () => [] }
+    },
+    data(){
+        return {
+
+        }
+    },
+    methods: {
+        table_add(){
+            this.$nextTick(() => {
+                this.$refs.formMain.open()
+            })
+        },
+        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.goods.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(){
+            this.$nextTick(() => {
+                this.$refs.formMain.open("add")
+            })
+        },
+    }
+}
+</script>

+ 47 - 0
src/views/merchant/goods/components/search.vue

@@ -0,0 +1,47 @@
+<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 :span="this.$store.state.global.ismobile?12:4">
+                            <el-input v-model="searchKey.title" placeholder="商品标题" clearable :style="{ width: '100%' }" @keyup.enter="searchForm()">
+                                <template #prepend>商品标题</template>
+                            </el-input>
+                        </el-col>
+                        <el-col :span="this.$store.state.global.ismobile?12:4">
+                            <el-input v-model="searchKey.out_id" placeholder="来客ID" clearable :style="{ width: '100%' }" @keyup.enter="searchForm()">
+                                <template #prepend>来客ID</template>
+                            </el-input>
+                        </el-col>
+                        <el-col :span="this.$store.state.global.ismobile?12: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>

+ 111 - 0
src/views/merchant/goods/components/table.vue

@@ -0,0 +1,111 @@
+<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="out_id" width="220" fixed="left">
+            <template #default="scope">
+                <span v-if="scope.row.out_id">{{ scope.row.out_id }}</span>
+                <span class="status-danger" v-else>未设置</span>
+            </template>
+        </el-table-column>
+        <el-table-column label="商品标题" prop="product_name" width="200">
+            <template #default="scope">
+                <span v-if="scope.row.product_name">{{ scope.row.product_name }}</span>
+                <span class="status-danger" v-else>未设置</span>
+            </template>
+        </el-table-column>
+        <el-table-column label="金额" prop="product_price" width="200">
+            <template #default="scope">
+                <span v-if="scope.row.product_price">¥{{ scope.row.product_price }}</span>
+                <span class="status-danger" v-else>未设置</span>
+            </template>
+        </el-table-column>
+        <el-table-column label="状态" prop="status" width="120">
+            <template #default="scope">
+                <div class="status-success" v-if="scope.row.status==1"><sc-status-indicator type="success"></sc-status-indicator> 启用</div>
+                <div class="status-danger" v-else><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>
+        <el-table-column label="操作" width="200" 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-popconfirm title="确定删除吗?" @confirm="table_del(scope.row, scope.$index)">
+                        <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 './form';
+export default {
+    components: {
+        formMain
+    },
+    data(){
+        return {
+            list: {
+                apiObj: this.$API.merGoods.list
+            },
+            dataSelect:[],
+            dataSelectFull:[],
+            searchKey:{}
+        }
+    },
+    methods: {
+        async table_del(data){
+            var resp = await this.$API.goods.del.post({"id":data.id});
+            if (resp.code == 0) {
+                return this.$message.error(resp.msg)
+            }
+            this.$message.success(resp.msg)
+            this.$refs.table.refresh()
+        },
+        refresh(){
+            this.$refs.table.refresh()
+        },
+        upData(data){
+            this.$refs.table.upData(data)
+        },
+        handleSuccess(){
+            this.$refs.table.refresh()
+        },
+        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 ;
+        },
+        selectionChange(event){
+            this.dataSelect = [];
+            var arr = [];
+            var arrCompany = [];
+            event.forEach(function(val,index){
+                arr[index] = val.id;
+                arrCompany[index] = val;
+            });
+            this.dataSelectFull = arrCompany;
+            this.dataSelect = arr;
+            this.$emit("success",this.dataSelect);
+            this.$emit("successFull",this.dataSelectFull);
+        },
+        table_passwd(row){
+            this.$nextTick(() => {
+                this.$refs.formMain.open("edit").setData(row)
+            })
+        },
+    }
+}
+</script>

+ 49 - 0
src/views/merchant/goods/index.vue

@@ -0,0 +1,49 @@
+<template>
+    <el-container class="flex-column">
+        <div class="table-search">
+            <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" type="3"></tablePage>
+            </div>
+        </el-main>
+    </el-container>  
+</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 {
+            searchKey:{
+                status:7
+            },
+            dataSelect:[],
+            dataSelectFull:[],
+        }
+    },
+    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>

+ 181 - 157
src/views/store/dashboard/index.vue

@@ -11,47 +11,47 @@
 	</div>
     <el-main>
         <div class="card-news mt0">
-            <div class="news-title">{{ $t('manage.dashboard.orderTitle') }}</div>
+            <div class="news-title">经营数据</div>
             <div class="total-panel">
-                <div class="panel-item" style="background-color: rgb(235, 241, 255);">
+                <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">{{ dataInfo.customer ? dataInfo.customer:'0' }}</div>
-                            <div class="desc">{{ $t('store.dashboard.yestoday') }} 0</div>
+                            <div class="title">今日营业额(元)</div>
+                            <div class="number">{{ todayData.order_money ? todayData.order_money:'0' }}</div>
+                            <div class="desc">来客订单金额</div>
                         </div>
                         <div class="right"><img src="@/assets/image/wave-1-icon.png" /></div>
                     </div>
                     <div class="item-wave"><img src="@/assets/image/wave-1.png" /></div>
                 </div>
-                <div class="panel-item" style="background-color: rgb(240, 235, 255);">
+                <div :class="this.$store.state.global.ismobile?'panel-item m':'panel-item'" style="background-color: rgb(240, 235, 255);">
                     <div class="item-warp">
                         <div class="left">
-                            <div class="title">新增客户</div>
-                            <div class="number">{{ dataInfo.customer ? dataInfo.customer:'0' }}</div>
-                            <div class="desc">{{ $t('store.dashboard.yestoday') }} 0</div>
+                            <div class="title">今日订单数(单)</div>
+                            <div class="number">{{ todayData.order_num ? todayData.order_num:'0' }}</div>
+                            <div class="desc">来客订单</div>
                         </div>
                         <div class="right"><img src="@/assets/image/wave-2-icon.png" /></div>
                     </div>
                     <div class="item-wave"><img src="@/assets/image/wave-2.png" /></div>
                 </div>
-                <div class="panel-item" style="background-color: rgb(255, 241, 214);">
+                <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">{{ dataInfo.customer ? dataInfo.customer:'0' }}</div>
-                            <div class="desc">{{ $t('store.dashboard.yestoday') }} 0</div>
+                            <div class="title">今日核销(单)</div>
+                            <div class="number">{{ todayData.order_done ? todayData.order_done:'0' }}</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="panel-item" style="background-color: rgb(250, 230, 244);">
+                <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">{{ dataInfo.customer ? dataInfo.customer:'0' }}</div>
-                            <div class="desc">{{ $t('store.dashboard.yestoday') }} 0</div>
+                            <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>
@@ -60,153 +60,176 @@
             </div>
         </div>
         <el-row :gutter="20">
-            <el-col :span="this.$store.state.global.ismobile?24:20" :xs="24">
+            <el-col :span="this.$store.state.global.ismobile?24:12" :xs="24">
                 <div class="card-news mt10">
-                    <div class="news-title">门店监控</div>
-                    <div class="total-panel-sub">
-                        <el-row :gutter="20">
-                            <el-col :span="this.$store.state.global.ismobile?24:12" :xs="24">
-                                <div class="sub-card mt10">
-                                    <div class="title">今日数据</div>
-                                    <div class="sub-content">
-                                        <div class="sub-box">
-                                            <div class="row1"><img src="@/assets/image/store1.png" /><span>今日收衣件数</span></div>
-                                            <div class="row2">0</div>
-                                            <div class="row3">{{ $t('store.dashboard.yestoday') }} 0</div>
-                                        </div>
-                                        <div class="sub-box">
-                                            <div class="row1"><img src="@/assets/image/store2.png" /><span>今日已支付(元)</span></div>
-                                            <div class="row2">0</div>
-                                            <div class="row3">{{ $t('store.dashboard.yestoday') }} 0</div>
-                                        </div>
-                                        <div class="sub-box">
-                                            <div class="row1"><img src="@/assets/image/store3.png" /><span>今日订单数</span></div>
-                                            <div class="row2">0</div>
-                                            <div class="row3">{{ $t('store.dashboard.yestoday') }} 0</div>
-                                        </div>
-                                    </div>
-                                </div>
-                            </el-col>
-                            <el-col :span="this.$store.state.global.ismobile?24:12" :xs="24">
-                                <div class="sub-card mt10">
-                                    <div class="title">过往数据</div>
-                                    <div class="sub-content">
-                                        <div class="sub-box" style="width: calc(50% - 12px);">
-                                            <div class="row1"><img src="@/assets/image/store4.png" /><span>本月订单数</span></div>
-                                            <div class="row2">0</div>
-                                            <div class="row3">{{ $t('store.dashboard.yestoday') }} 0</div>
-                                        </div>
-                                        <div class="sub-box" style="width: calc(50% - 12px);">
-                                            <div class="row1"><img src="@/assets/image/store5.png" /><span>累计订单数</span></div>
-                                            <div class="row2">0</div>
-                                            <div class="row3">{{ $t('store.dashboard.yestoday') }} 0</div>
-                                        </div>
-                                    </div>
-                                </div>
-                            </el-col>
-                        </el-row>
-                    </div>
-                </div>
-                <div class="card-news mt10">
-                    <div class="news-title">洗衣地址监控</div>
-                    <div class="total-panel">
-                        <div class="panel-item bg-gray" :style="{backgroundImage:'url('+blueBg+')'}">
-                            <div class="item-warp img">
-                                <div class="left">
-                                    <div class="title">今日入库</div>
-                                    <div class="number">{{ dataInfo.customer ? dataInfo.customer:'0' }}<span>单</span></div>
-                                    <div class="desc">总件数:0</div>
-                                </div>
-                            </div>
-                        </div>
-                        <div class="panel-item bg-gray">
-                            <div class="item-warp">
-                                <div class="left">
-                                    <div class="title">在库量</div>
-                                    <div class="number">{{ dataInfo.customer ? dataInfo.customer:'0' }}<span>单</span></div>
-                                    <div class="desc">总件数:0</div>
-                                </div>
-                            </div>
-                        </div>
-                        <div class="panel-item bg-gray">
-                            <div class="item-warp">
-                                <div class="left">
-                                    <div class="title">近一个月待入库量</div>
-                                    <div class="number">{{ dataInfo.customer ? dataInfo.customer:'0' }}<span>单</span></div>
-                                    <div class="desc">总件数:0</div>
-                                </div>
-                            </div>
-                        </div>
-                        <div class="panel-item bg-gray">
-                            <div class="item-warp">
-                                <div class="left">
-                                    <div class="title">待预检量</div>
-                                    <div class="number">{{ dataInfo.customer ? dataInfo.customer:'0' }}<span>单</span></div>
-                                    <div class="desc">总件数:0</div>
-                                </div>
-                            </div>
-                        </div>
-                        <div class="panel-item bg-gray">
-                            <div class="item-warp">
-                                <div class="left">
-                                    <div class="title">今日出库</div>
-                                    <div class="number">{{ dataInfo.customer ? dataInfo.customer:'0' }}<span>单</span></div>
-                                    <div class="desc">总件数:0</div>
-                                </div>
-                            </div>
-                        </div>
-                    </div>
-                    <!--  -->
+                    <scEcharts height="500px" :option="option2"></scEcharts>
                 </div>
-                
             </el-col>
-            <el-col :span="this.$store.state.global.ismobile?24:4" :xs="24">
+            <el-col :span="this.$store.state.global.ismobile?24:12" :xs="24">
                 <div class="card-news mt10">
-                    <div class="news-title">系统动态</div>
-                    <div class="card-news-sub">
-                        <div class="date-title">
-                            <el-link :underline="false">1月16日系统升级通知</el-link>
-                            <div class="date-time">01-16</div>
-                        </div>
-                        <div class="date-title">
-                            <el-link :underline="false">12月5日系统升级通知</el-link>
-                            <div class="date-time">12-05</div>
-                        </div>
-                        <div class="date-title">
-                            <el-link :underline="false">9.19日系统升级通知</el-link>
-                            <div class="date-time">09-19</div>
-                        </div>
-                    </div>
-                </div>
-                <div class="card-news mt10">
-                    <div class="news-title">客服热线</div>
-                    <div class="service-tel">
-                        <img src="@/assets/image/tel.png" />
-                        <span>{{baseData?baseData.tel:'-'}}</span>
-                    </div>
+                    <scEcharts height="500px" :option="option"></scEcharts>
                 </div>
             </el-col>
         </el-row>
-
     </el-main>
 </template>
 
 <script>
 import blueBg from "@/assets/image/blue_bg.png";
+import scEcharts from '@/components/scEcharts';
 export default {
     name: "dashboard",
+    components: {
+        scEcharts
+    },
     data(){
         return {
             pageLoading: false,
             dashboard: '0',
-            dataInfo:{},
+            todayData:{},
             blueBg,
-            baseData:{}
+            baseData:{},
+            option2: {},
+            option: {
+                // title: {
+                //     left: 'left', 
+                //     text: '订单数据',
+                // },
+                // grid: {
+                //     top: '80px'
+                // },
+                // tooltip: {
+                //     trigger: 'axis'
+                // },
+                // legend: {
+                //     x: 'right',
+                //     data: ['呼出总数量', '接听总数量', '短信发送总数量', '添加微信总数量']
+                // },
+                // calculable: true,
+                // xAxis: {
+                //     type: 'category',
+                //     data: ['06-25', '06-26', '06-27', '06-28', '06-29', '06-30', '07-01', '07-02', '07-03', '07-04']
+                // },
+                // yAxis: [{
+                //     type: 'value'
+                // }],
+                // // yAxis: [{type: 'value', splitLine: {show: true}, gridIndex: 0, axisLabel: {formatter: '{value} 单'}}],
+                // series: [{
+                //     name: '呼出总数量',
+                //     data: [120, 200, 50, 80, 170, 210, 130,450,244,168],
+                //     smooth: true, showBackground: false,
+                //     areaStyle: {color: 'rgba(64, 158, 254, 0.6)'},
+                //     type: 'line', showSymbol: true, xAxisIndex: 0, yAxisIndex: 0,
+                //     emphasis:{focus: 'series'},
+                //     label: {position: 'top', formatter: '{c}', show: true},
+                // },{
+                //     name: '接听总数量',
+                //     data: [20, 210, 10, 180, 110, 100, 130,450,244,168],
+                //     smooth: true, showBackground: false,
+                //     areaStyle: {color: 'rgba(54, 206, 159, 0.6)'},
+                //     type: 'line', showSymbol: true, xAxisIndex: 0, yAxisIndex: 0,
+                //     emphasis:{focus: 'series'},
+                //     label: {position: 'top', formatter: '{c}', show: true},
+                // },{
+                //     name: '短信发送总数量',
+                //     data: [20, 210, 10, 80, 110, 100, 130,450,244,168],
+                //     smooth: true, showBackground: false,
+                //     areaStyle: {color: 'rgba(245, 110, 106, 0.6)'},
+                //     type: 'line', showSymbol: true, xAxisIndex: 0, yAxisIndex: 0,
+                //     emphasis:{focus: 'series'},
+                //     label: {position: 'top', formatter: '{c}', show: true},
+                // },{
+                //     name: '添加微信总数量',
+                //     data: [20, 210, 110, 180, 110, 100, 130,450,244,268],
+                //     smooth: true, showBackground: false,
+                //     areaStyle: {color: 'rgba(98, 108, 144, 0.6)'},
+                //     type: 'line', showSymbol: true, xAxisIndex: 0, yAxisIndex: 0,
+                //     emphasis:{focus: 'series'},
+                //     label: {position: 'top', formatter: '{c}', show: true},
+                // }]
+            },
         }
     },
     created(){
-        var baseData = this.$TOOL.data.get("AGENT_SERVICE");
+        var baseData = this.$TOOL.data.get("SERVICE");
         this.baseData = baseData;
+        // this.getData()
+    },
+    methods: {
+        async getData(){
+            var loading = this.$loading();
+            var resp = await this.$API.dash.shop.get();
+            loading.close();
+            this.todayData = resp.data.today;
+            let data = resp.data.moneys;
+            let moneyDay = data.map(function (item) {
+                return item['当天日期'];
+            });
+            let data2 = resp.data.orders;
+            let orderDay = data2.map(function (item) {
+                return item['当天日期'];
+            });
+            this.option = {
+                title: {
+                    left: 'left', 
+                    text: '近15天订单数据',
+                },
+                grid: {
+                    top: '80px'
+                },
+                tooltip: {trigger: 'axis', show: true, axisPointer: {type: 'cross', label: {}}},
+                xAxis: [{data: orderDay, gridIndex: 0}],
+                yAxis: [
+                    {
+                        splitLine: {show: true}, gridIndex: 0, type: 'value', axisLabel: {
+                            formatter: '{value} 单'
+                        }
+                    }
+                ],
+                grid: [{left: '5%', right: '3%', top: '15%', bottom: '5%'}],
+                series: [
+                    {
+                        smooth: true, showBackground: true,
+                        areaStyle: {color: 'rgba(180, 180, 180, 0.5)'},
+                        type: 'bar', showSymbol: true, xAxisIndex: 0, yAxisIndex: 0,
+                        label: {normal: {position: 'top', formatter: '{c} 单', show: true}},
+                        data: data2.map(function (item) {
+                            return item['订单数量'];
+                        }),
+                    }
+                ]
+            };
+            this.option2 = {
+                title: {
+                    left: 'left', 
+                    text: '近15天订单金额',
+                },
+                grid: {
+                    top: '80px'
+                },
+                tooltip: {trigger: 'axis', show: true, axisPointer: {type: 'cross', label: {}}},
+                xAxis: [{data: moneyDay, gridIndex: 0}],
+                yAxis: [
+                    {
+                        splitLine: {show: true}, gridIndex: 0, type: 'value', axisLabel: {
+                            formatter: '{value} 元'
+                        }
+                    }
+                ],
+                grid: [{left: '5%', right: '3%', top: '15%', bottom: '5%'}],
+                series: [
+                    {
+                        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}},
+                        data: data.map(function (item) {
+                            return item['订单金额'];
+                        }),
+                    }
+                ]
+            };
+        }
     }
 }
 </script>
@@ -223,12 +246,15 @@ export default {
 }
 .service-item {
     border: 1px solid #EAE9F0;
-    padding: 12px 24px;
+    padding: 12px 14px;
     border-radius: 6px;
     display: flex;
     align-items: center;
     flex: 1;
 }
+.service-item .item-sub{
+    width: 40%;
+}
 .service-item .right-btn {
     margin-left: auto;
 }
@@ -247,10 +273,15 @@ export default {
     color: #333333d9;
 }
 .service-item .value{
-    font-size: 24px;
+    font-size: 18px;
     color: #f64945;
     font-weight: 700;
-    margin-left: 26px;
+    margin-left: auto;
+}
+.service-item .value span {
+    font-weight: normal;
+    color: #666;
+    font-size: 12px;
 }
 .service-tel {
     display: flex;
@@ -363,17 +394,19 @@ export default {
     display: flex;
     align-items: center;
     justify-content: space-between;
+    flex-wrap: wrap;
     margin-top: 16px;
-    gap: 10px;
+}
+.total-panel .panel-item.m{
+    width: calc(100% - 9.6px);
+    margin-bottom: 10px;
 }
 .total-panel .panel-item{
-    width: calc((100% - 18px)/4);
+    width: calc(25% - 9.6px);
     height: 130px;
     box-shadow: rgba(0, 0, 0, 0.05) 0px 0px 8px;
     position: relative;
     border-radius: 6px;
-    overflow: hidden;
-    background-color: rgba(166, 166, 166, 0.5);
 }
 .total-panel .panel-item .item-warp .left {
     padding:16px 0px 0px 23px;
@@ -474,13 +507,4 @@ export default {
     margin-left: auto;
     margin-right: 0;
 }
-@media (max-width: 992px){
-    .total-panel {
-        display: block;
-    }
-    .total-panel .panel-item{
-        width: 100%;
-        margin-bottom: 10px;
-    }
-}
 </style>

+ 216 - 0
src/views/store/goods/components/form.vue

@@ -0,0 +1,216 @@
+<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] }}</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-form ref="dialogForm" :model="formData" :rules="rules" label-width="100px" label-position="top">
+                    <fieldset>
+                        <legend><el-tag>基础信息</el-tag></legend>
+                        <el-row :gutter="15">
+                            <el-col :span="12">
+                                <el-form-item label="商品标题" prop="product_name">
+                                    <el-input v-model="formData.product_name" clearable placeholder="请输入"></el-input>
+                                    <div class="el-form-item-msg"></div>
+                                </el-form-item>
+                            </el-col>
+                            <el-col :span="12">
+                                <el-form-item label="快递面单名称" prop="express_name">
+                                    <el-input v-model="formData.express_name" clearable placeholder="请输入"></el-input>
+                                    <div class="el-form-item-msg">不填写默认使用商品标题名称</div>
+                                </el-form-item>
+                            </el-col>
+                            <el-col :span="8">
+                                <el-form-item label="来客团单ID" prop="out_id">
+                                    <el-input v-model="formData.out_id" clearable placeholder="请输入"></el-input>
+                                    <div class="el-form-item-msg"></div>
+                                </el-form-item>
+                            </el-col>
+                            <el-col :span="8">
+                                <el-form-item label="商品价格" prop="product_price">
+                                    <el-input v-model="formData.product_price" clearable placeholder="请输入">
+                                        <template #append>元</template>
+                                    </el-input>
+                                    <div class="el-form-item-msg"></div>
+                                </el-form-item>
+                            </el-col>
+                            <el-col :span="8">
+                                <el-form-item label="商品划线价格" prop="product_origin">
+                                    <el-input v-model="formData.product_origin" clearable placeholder="请输入">
+                                        <template #append>元</template>
+                                    </el-input>
+                                    <div class="el-form-item-msg"></div>
+                                </el-form-item>
+                            </el-col>
+                            <el-col :span="24">
+                                <el-form-item label="商品图片" prop="product_img">
+                                    <sc-upload v-model="formData.product_img" tip="最多上传100个文件,单个文件不要超过10M,请上传图像格式文件"></sc-upload>
+                                    <div class="el-form-item-msg">选填</div>
+                                </el-form-item>
+                            </el-col>
+                        </el-row>
+                    </fieldset>
+                    <fieldset>
+                        <legend><el-tag>商品附加规格</el-tag></legend>
+                        <el-button type="primary" size="small" @click="addSpecs" v-if="specs.length<5">添加规格分组</el-button>
+                        <div class="specs" v-for="(item,indx) in specs" :key="indx">
+                            <div class="specs-header">
+                                <div class="specs-left">
+                                    <el-input v-model="item.name" placeholder="组名称" clearable>
+                                        <template #prepend>组名称</template>
+                                    </el-input>
+                                    <el-select v-model="item.num" clearable placeholder="请选择数量" v-if="item.list.length > 1">
+                                        <el-option :value="len" :label="item.list.length+'选'+len" v-for="len in item.list.length"></el-option>
+                                    </el-select>
+                                </div>
+                                <div class="specs-right">
+                                    <el-button type="primary" @click="addItem(indx)">增加</el-button>
+                                    <el-button type="danger" @click="removeSpec(indx)">删除</el-button>
+                                </div>
+                            </div>
+                            <div class="specs-body">
+                                <div class="body-item" v-for="(its,ind) in item.list" :key="ind">
+                                    <el-input placeholder="输入规格属性名" v-model="its.name" clearable>
+                                        <template #append>
+                                            <el-popconfirm title="确定删除吗?" @click="removeItem(indx,ind)">
+                                                <template #reference>
+                                                    <el-button type="danger" icon="el-icon-delete" size="small"></el-button>
+                                                </template>
+                                            </el-popconfirm>
+                                        </template>
+                                    </el-input>
+                                </div>
+                            </div>
+                        </div>
+                    </fieldset>
+                </el-form>
+            </el-main>
+            <el-footer style="text-align: right;">
+                <el-button @click="visible=false" >取 消</el-button>
+                <el-button v-if="mode!='show'" type="primary" :loading="isSaveing" @click="submit()">保 存</el-button>
+            </el-footer>
+        </el-container>
+    </el-drawer>
+</template>
+
+<script>
+export default {
+    data(){
+        return {
+            loading: false,
+            mode:"add",
+            titleMap:{
+                add:"新增商品",
+                edit:"编辑商品"
+            },
+            visible: false,
+            isSaveing: false,
+            specs:[],
+            formData:{},
+            userInfo:{},
+            rules:{
+                store_id: [
+                    {required: true, message: '请选择'}
+                ],
+                out_id: [
+                    {required: true, message: '请输入'}
+                ],
+                product_name: [
+                    {required: true, message: '请输入'}
+                ],
+                product_price: [
+                    {required: true, message: '请输入'}
+                ],
+                product_origin: [
+                    {required: true, message: '请输入'}
+                ],
+            }
+        }
+    },
+    methods:{
+        addSpecs(){
+            if (this.specs.length >= 5) {
+                return this.$message.error("最多只能添加三组规格")
+            }
+            this.specs.push({"name":"","num":1,"list":[ {"name":"","check":true} ]});
+        },
+        addItem(index){
+            if (this.specs[index].list.length >= 20) {
+                return this.$message.error("最多只能添加20个")
+            }
+            this.specs[index].list.push({"name":"","check":true})
+        },
+        removeSpec(index){
+            this.specs.splice(index,1)
+        },
+        removeItem(index,sub){
+            this.specs[index].list.splice(sub,1)
+        },
+        open(mode = 'add'){
+            this.mode = mode;
+            this.visible = true;
+            var userInfo = this.$TOOL.data.get("USER_INFO");
+            this.userInfo = userInfo;
+            return this
+        },
+        //表单注入数据
+        setData(data){
+            this.formData = JSON.parse(JSON.stringify(data));
+            if (this.mode == 'edit') {
+                this.specs = data.data_specs;
+            }
+        },
+        async submit(){
+            var validate = await this.$refs.dialogForm.validate().catch(()=>{});
+            if(!validate){ return false }
+            this.isSaveing = true;
+            let submitData = JSON.parse(JSON.stringify(this.formData));
+            if (this.specs.length > 0) {
+                submitData.data_specs = JSON.stringify(this.specs);
+            }
+            var resp = await this.$API.storeGoods.save.post(submitData);
+            this.isSaveing = false;
+            if (resp.code == 0) {
+                return this.$message.error(resp.msg);
+            }
+            this.$message.success(resp.msg);
+            this.visible = false;
+            this.formData = {};
+            this.specs = [];
+            this.submitState = false;
+            this.$emit("success");
+        }
+    }
+}
+</script>
+
+<style>
+.specs{margin-top: 15px;background-color: #f8f8f8;}
+.specs-header{
+    display: flex;
+    margin-bottom: 10px;
+    border-bottom: 1px solid #f8f8f8;
+    background-color: #ddd;
+    padding: 10px;
+}
+.specs-header .specs-left{
+    display: flex;
+    align-items: center;
+    gap: 10px;
+}
+.specs-header .specs-right{
+    display: flex;
+    margin-left: auto;
+    margin-right: 0;
+}
+.specs-body{display: flex;align-items: center;gap: 10px;padding: 10px;flex-direction: row;flex-wrap: wrap;}
+.specs-body .body-item{width: calc(25% - 10px);}
+</style>

+ 61 - 0
src/views/store/goods/components/option.vue

@@ -0,0 +1,61 @@
+<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()">新增商品</el-button>
+                <el-button icon="el-icon-document" @click="table_batch_status(1)" :disabled="dataSelect.length>0?false:true">启用</el-button>
+                <el-button icon="el-icon-lock" @click="table_batch_status(0)" :disabled="dataSelect.length>0?false:true">禁用</el-button>
+            </div>
+        </div>
+    </fieldset>
+    <formMain ref="formMain" @success="handleSuccess"></formMain>
+</template>
+
+<script>
+import formMain from './form';
+export default {
+    components: {
+        formMain
+    },
+    props: {
+        type: { type: String, default: "1" },
+        dataSelect: { type: Array, default: () => [] },
+        dataSelectFull: { type: Array, default: () => [] }
+    },
+    data(){
+        return {
+
+        }
+    },
+    methods: {
+        table_add(){
+            this.$nextTick(() => {
+                this.$refs.formMain.open()
+            })
+        },
+        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.goods.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(){
+            this.$nextTick(() => {
+                this.$refs.formMain.open("add")
+            })
+        },
+    }
+}
+</script>

+ 47 - 0
src/views/store/goods/components/search.vue

@@ -0,0 +1,47 @@
+<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 :span="this.$store.state.global.ismobile?12:4">
+                            <el-input v-model="searchKey.title" placeholder="商品标题" clearable :style="{ width: '100%' }" @keyup.enter="searchForm()">
+                                <template #prepend>商品标题</template>
+                            </el-input>
+                        </el-col>
+                        <el-col :span="this.$store.state.global.ismobile?12:4">
+                            <el-input v-model="searchKey.out_id" placeholder="来客ID" clearable :style="{ width: '100%' }" @keyup.enter="searchForm()">
+                                <template #prepend>来客ID</template>
+                            </el-input>
+                        </el-col>
+                        <el-col :span="this.$store.state.global.ismobile?12: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>

+ 111 - 0
src/views/store/goods/components/table.vue

@@ -0,0 +1,111 @@
+<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="out_id" width="220" fixed="left">
+            <template #default="scope">
+                <span v-if="scope.row.out_id">{{ scope.row.out_id }}</span>
+                <span class="status-danger" v-else>未设置</span>
+            </template>
+        </el-table-column>
+        <el-table-column label="商品标题" prop="product_name" width="200">
+            <template #default="scope">
+                <span v-if="scope.row.product_name">{{ scope.row.product_name }}</span>
+                <span class="status-danger" v-else>未设置</span>
+            </template>
+        </el-table-column>
+        <el-table-column label="金额" prop="product_price" width="200">
+            <template #default="scope">
+                <span v-if="scope.row.product_price">¥{{ scope.row.product_price }}</span>
+                <span class="status-danger" v-else>未设置</span>
+            </template>
+        </el-table-column>
+        <el-table-column label="状态" prop="status" width="120">
+            <template #default="scope">
+                <div class="status-success" v-if="scope.row.status==1"><sc-status-indicator type="success"></sc-status-indicator> 启用</div>
+                <div class="status-danger" v-else><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>
+        <el-table-column label="操作" width="200" 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-popconfirm title="确定删除吗?" @confirm="table_del(scope.row, scope.$index)">
+                        <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 './form';
+export default {
+    components: {
+        formMain
+    },
+    data(){
+        return {
+            list: {
+                apiObj: this.$API.storeGoods.list
+            },
+            dataSelect:[],
+            dataSelectFull:[],
+            searchKey:{}
+        }
+    },
+    methods: {
+        async table_del(data){
+            var resp = await this.$API.storeGoods.del.post({"id":data.id});
+            if (resp.code == 0) {
+                return this.$message.error(resp.msg)
+            }
+            this.$message.success(resp.msg)
+            this.$refs.table.refresh()
+        },
+        refresh(){
+            this.$refs.table.refresh()
+        },
+        upData(data){
+            this.$refs.table.upData(data)
+        },
+        handleSuccess(){
+            this.$refs.table.refresh()
+        },
+        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 ;
+        },
+        selectionChange(event){
+            this.dataSelect = [];
+            var arr = [];
+            var arrCompany = [];
+            event.forEach(function(val,index){
+                arr[index] = val.id;
+                arrCompany[index] = val;
+            });
+            this.dataSelectFull = arrCompany;
+            this.dataSelect = arr;
+            this.$emit("success",this.dataSelect);
+            this.$emit("successFull",this.dataSelectFull);
+        },
+        table_passwd(row){
+            this.$nextTick(() => {
+                this.$refs.formMain.open("edit").setData(row)
+            })
+        },
+    }
+}
+</script>

+ 49 - 0
src/views/store/goods/index.vue

@@ -0,0 +1,49 @@
+<template>
+    <el-container class="flex-column">
+        <div class="table-search">
+            <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" type="3"></tablePage>
+            </div>
+        </el-main>
+    </el-container>  
+</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 {
+            searchKey:{
+                status:7
+            },
+            dataSelect:[],
+            dataSelectFull:[],
+        }
+    },
+    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>