Zory 4 дней назад
Родитель
Сommit
9ff10118a1

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

@@ -9,6 +9,13 @@ export default {
             return await http.get(this.url, params);
         },
     },
+    category: {
+        url: `${config.API_URL}/merchant/category/list`,
+        name: "-",
+        get: async function (params) {
+            return await http.get(this.url, params);
+        },
+    },
     detail: {
         url: `${config.API_URL}/merchant/goods/detail`,
         name: "-",

+ 33 - 0
src/api/model/merStar.js

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

+ 10 - 0
src/api/model/store.js

@@ -43,6 +43,16 @@ export default {
         get: async function (data = {}) {
             return await http.get(this.url, data);
         },
+        post: async function (data = {}) {
+            return await http.post(this.url, data);
+        },
+    },
+    cateDel: {
+        url: `${config.API_URL}/store/cate/del`,
+        name: "-",
+        post: async function (data = {}) {
+            return await http.post(this.url, data);
+        },
     },
     del: {
         url: `${config.API_URL}/store/del`,

+ 3 - 1
src/components/imFloat/order.vue

@@ -11,7 +11,7 @@
                     </div>
                 </div>
             </div>
-            <el-main class="nopadding" v-if="orderData">
+            <el-main class="nopadding" v-if="orderData" v-loading="loading">
                 <div class="order-detail">
                     <div class="order-status">
                         <div class="status-name" v-if="orderData.status == 0 && orderTime">
@@ -178,7 +178,9 @@ export default {
             }).catch(()=>{})
         },
         async getOrderDetail(){
+            this.loading = true;
             var resp = await this.$API.merOrder.detail.get({"order":this.formData.order});
+            this.loading = false;
             if (resp.code == 0) {
                 this.$message.error(resp.msg);
                 this.visible = false;

+ 17 - 1
src/utils/tool.js

@@ -225,7 +225,7 @@ tool.crypto = {
 	AES: {
 		encrypt(data, secretKey, config={}){
 			if(secretKey.length % 8 != 0){
-				console.warn("[SCUI error]: 秘钥长度需为8的倍数,否则解密将会失败。")
+				console.warn("秘钥长度需为8的倍数,否则解密将会失败。")
 			}
 			const result = CryptoJS.AES.encrypt(data, CryptoJS.enc.Utf8.parse(secretKey), {
 				iv: CryptoJS.enc.Utf8.parse(config.iv || ""),
@@ -275,4 +275,20 @@ tool.disMoney = function (num) {
 	var total = (num/100)
 	return total.toFixed(2)
 };
+tool.findNodeById = function(tree, targetId, childKey = 'children') {
+	if (!Array.isArray(tree)) return null;
+
+	for (const item of tree) {
+		// 匹配成功
+		if (item.category_id === targetId) {
+			return item;
+		}
+		// 如果有子节点,递归查找
+		if (item[childKey] && Array.isArray(item[childKey])) {
+			const found = this.findNodeById(item[childKey], targetId, childKey);
+			if (found) return found;
+		}
+	}
+	return null; // 未找到
+};
 export default tool

+ 2 - 10
src/views/manage/goods/category/components/table.vue

@@ -1,5 +1,5 @@
 <template>
-    <scTable ref="table" :apiObj="list.apiObj" :params="searchKey" @selectionChange="selectionChange" row-key="id" hidePagination>
+    <scTable ref="table" :apiObj="list.apiObj" :params="searchKey" @selectionChange="selectionChange" row-key="id" hidePagination  default-expand-all>
         <el-table-column type="selection" width="50" fixed="left"></el-table-column>
         <el-table-column label="品类名称" width="200" fixed="left" prop="name"></el-table-column>
         <el-table-column label="序号" width="120" prop="id"></el-table-column>
@@ -10,15 +10,7 @@
                 <div class="status-danger" v-if="scope.row.enable==2"><sc-status-indicator type="danger"></sc-status-indicator> 禁用</div>
             </template>
         </el-table-column>
-        <el-table-column label="创建时间" prop="create_at" width="180"></el-table-column>
-        <el-table-column label="操作" width="140" align="left" fixed="right">
-            <template #default="scope">
-                <el-button-group>
-                    <el-button size="small" @click="table_view(scope.row)">编辑</el-button>
-                    <el-button type="danger" size="small" @click="table_del(scope.row)">删除</el-button>
-                </el-button-group>
-            </template>
-        </el-table-column>
+        <el-table-column label="创建时间" prop="create_at" width="180" fixed="right"></el-table-column>
     </scTable>
     <formMain ref="formMain" @success="handleSuccess"></formMain>
 </template>

+ 27 - 6
src/views/manage/shop/index/components/category.vue

@@ -1,13 +1,13 @@
 <template>
     <el-dialog :title="titleMap[mode]" v-model="visible" :width="800" destroy-on-close @closed="$emit('closed')">
         <div style="margin-bottom: 10px;">
-            <el-button type="primary">新增品类</el-button>
+            <el-button type="primary" @click="addCategory">新增品类</el-button>
         </div>
         <div style="height: 500px;">
-            <scTable ref="table" :data="categoryData" @selectionChange="selectionChange" row-key="id" hidePagination>
+            <scTable ref="table" :data="categoryData" @selectionChange="selectionChange" row-key="id" hidePagination default-expand-all>
                 <el-table-column label="品类名称" width="200" fixed="left" prop="name"></el-table-column>
                 <el-table-column label="品类ID" prop="category_id" width="200"></el-table-column>
-                <el-table-column label="开通类型" prop="category_id" width="200">
+                <el-table-column label="开通商品类型" prop="category_id" width="200">
                     <template #default="scope">
                         <div class="flex-types" v-if="scope.row.types">
                             <el-tag v-for="(item,indx) in scope.row.types" :key="indx">{{ item.name }}</el-tag>
@@ -26,15 +26,17 @@
             </scTable>
         </div>
     </el-dialog>
+    <categoryAdd ref="categoryAdd" @success="getCate"></categoryAdd>
 </template>
 
 <script>
+import categoryAdd from './categoryAdd';
 export default {
+    components: {
+        categoryAdd
+    },
     data(){
         return {
-            list: {
-                apiObj: this.$API.category.list
-            },
             loading: false,
             isSaveing: false,
             mode:"add",
@@ -56,6 +58,25 @@ export default {
             this.formData = JSON.parse(JSON.stringify(data));
             this.getCate()
         },
+        addCategory(){
+            this.$nextTick(() => {
+                this.$refs.categoryAdd.open("add").setData(this.formData)
+            })
+        },
+        table_del(data){
+            this.$confirm(`确定删除【${data.name} 】项吗?删除后可重新添加!`, '提示', {
+                type: 'warning'
+            }).then(async () => {
+                var resp = await this.$API.store.cateDel.post({"id":data.category_id,"poi_id":this.formData.poi_id});
+                if (resp.code == 0) {
+                    return this.$message.error(resp.msg);
+                }
+                this.$message.success(resp.msg);
+                this.getCate();
+            }).catch(() => {
+
+            })
+        },
         async getCate(){
             var resp = await this.$API.storeCate.list.get({"poi":this.formData.poi_id})
             if (resp.code == 0) {

+ 108 - 0
src/views/manage/shop/index/components/categoryAdd.vue

@@ -0,0 +1,108 @@
+
+<template>
+    <el-dialog :title="titleMap[mode]" v-model="visible" :width="500" destroy-on-close @closed="$emit('closed')">
+        <el-form ref="dialogForm" :model="formData" :rules="rules" label-width="100px" label-position="top">
+            <el-form-item label="店铺名称">
+                <el-input v-model="parentData.poi_name" disabled readonly clearable placeholder="请输入"></el-input>
+                <div class="el-form-item-msg"></div>
+            </el-form-item>
+            <el-form-item label="开通品类" prop="category" v-loading="categoryLoad">
+                <el-cascader style="width: 100%;" v-model="formData.category" :options="categoryData" :props="props" clearable placeholder="请选择"></el-cascader>
+                <div class="el-form-item-msg"></div>
+            </el-form-item>
+            <el-form-item label="可发布商品类型" prop="product_type" v-loading="channelLoad">
+                <el-checkbox-group v-model="formData.product_type">
+                    <el-checkbox-button border :value="item.key" :label="item.key" v-for="(item,indx) in cateData" :key="indx">{{ item.name }}</el-checkbox-button>
+                </el-checkbox-group>
+                <div class="el-form-item-msg"></div>
+            </el-form-item>
+        </el-form>
+		<template #footer>
+            <el-button @click="visible=false" size="large">取 消</el-button>
+            <el-button size="large" type="primary" :loading="isSaveing" @click="submit()">保 存</el-button>
+		</template>
+    </el-dialog>
+</template>
+
+<script>
+export default {
+    data() {
+        return {
+            loading: false,
+            visible: false,
+            isSaveing: false,
+            categoryLoad:true,
+            mode:"add",
+            titleMap:{
+                add:"开通新品类"
+            },
+            formData:{},
+            parentData:{},
+            props:{
+                multiple: true,
+                value:"category_id",
+                label:"name"
+            },
+            categoryData:[],
+            rules:{
+                category: [
+                    {required: true, message: '请选择'}
+                ],
+                product_type: [
+                    {required: true, message: '请选择'}
+                ],
+            },
+            cateData:[],
+            channelLoad:true,
+        }
+    },
+    methods:{
+        open(mode = 'add'){
+            this.mode = mode;
+            this.visible = true;
+            return this
+        },
+        //表单注入数据
+        setData(data){
+            this.parentData = JSON.parse(JSON.stringify(data));
+            this.getCate()
+        },
+        async getProductType(){
+            this.channelLoad = true;
+            var resp = await this.$API.store.cate.get();
+            this.channelLoad = false;
+            if (resp.code == 0 ) {
+                return this.$message.error(resp.message)
+            }
+            this.cateData = resp.data.data;
+        },
+        async getCate(){
+            this.categoryLoad = true;
+            var resp = await this.$API.category.list.get()
+            this.categoryLoad = false;
+            if (resp.code == 0) {
+                this.$message.error(resp.msg)
+                this.visible = false;
+                return ;
+            }
+            this.categoryData = resp.data;
+            this.getProductType()
+        },
+        async submit(){
+            var validate = await this.$refs.dialogForm.validate().catch(()=>{});
+            if(!validate){ return false }
+            this.isSaveing = true;
+            this.formData.poi_id = this.parentData.poi_id;
+            var resp = await this.$API.store.cate.post(this.formData);
+            this.isSaveing = false;
+            if (resp.code == 0) {
+                return this.$message.error(resp.msg);
+            }
+            this.$message.success(resp.msg);
+            this.visible = false;
+            this.formData = {};
+            this.$emit("success");
+        }
+    }
+}
+</script>

+ 15 - 0
src/views/merchant/cps/index/index.vue

@@ -0,0 +1,15 @@
+<template>
+    <el-container class="flex-column">
+
+    </el-container>
+</template>
+
+<script>
+export default {
+    data() {
+        return {
+
+        }
+    }
+}
+</script>

+ 80 - 0
src/views/merchant/cps/star/components/form.vue

@@ -0,0 +1,80 @@
+<template>
+    <el-dialog :title="titleMap[mode]" v-model="visible" :width="500" destroy-on-close @closed="$emit('closed')">
+        <el-form ref="dialogForm" :model="formData" :rules="rules" label-width="100px" label-position="top">
+            <el-form-item label="达人抖音号" prop="name">
+                <el-input v-model="formData.name" clearable placeholder="请输入"></el-input>
+                <div class="el-form-item-msg">输入抖音号后,点击保存,系统自动获取达人基础信息</div>
+            </el-form-item>
+            <el-form-item label="状态" prop="status">
+                <el-radio-group v-model="formData.status">
+                    <el-radio-button :label="1">正常</el-radio-button>
+                    <el-radio-button :label="2">禁用</el-radio-button>
+                </el-radio-group>
+                <div class="el-form-item-msg">禁用后的达人不可绑定直播计划</div>
+            </el-form-item>
+        </el-form>
+		<template #footer>
+            <el-button @click="visible=false" size="large">取 消</el-button>
+            <el-button v-if="mode!='show'" size="large" type="primary" :loading="isSaveing" @click="submit()">保 存</el-button>
+		</template>
+    </el-dialog>
+    
+</template>
+
+<script>
+export default {
+    data(){
+        return {
+            loading: false,
+            isSaveing: false,
+            mode:"add",
+            titleMap:{
+                add:"绑定达人",
+                edit:"绑定达人"
+            },
+            visible:false,
+            formData:{
+                status:1
+            },
+            rules:{
+                enable: [
+                    {required: true, message: '请选择'}
+                ],
+                name: [
+                    {required: true, message: '请输入'}
+                ]
+            }
+        }
+    },
+    methods:{
+        open(mode = 'add'){
+            this.mode = mode;
+            this.visible = true;
+            return this
+        },
+        //表单注入数据
+        setData(data){
+            this.formData = JSON.parse(JSON.stringify(data));
+        },
+        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));
+            var resp = await this.$API.merStar.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 = {status:1};
+            this.$emit("success");
+        }
+    }
+}
+</script>
+
+<style>
+.text-center{text-align: center;}
+</style>

+ 75 - 0
src/views/merchant/cps/star/components/option.vue

@@ -0,0 +1,75 @@
+<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>
+            </div>
+        </div>
+    </fieldset>
+    <formMain ref="formMain" @success="handleSuccess"></formMain>
+</template>
+
+<script>
+import formMain from './form';
+export default {
+    components: {
+        formMain
+    },
+    props: {
+        dataSelect: { type: Array, default: () => [] },
+        dataSelectFull: { type: Array, default: () => [] }
+    },
+    data(){
+        return {
+
+        }
+    },
+    methods: {
+        table_add(){
+            this.$nextTick(() => {
+                this.$refs.formMain.open("add")
+            })
+        },
+        table_sync(){
+            this.$confirm(`发起同步后,请耐心等待1-2分钟后再刷新当前数据列表`, '提示', {
+                type: 'warning'
+            }).then(async () => {
+                var resp = await this.$API.category.sync.get();
+                if (resp.code == 0) {
+                    return this.$message.error(resp.msg);
+                }
+                this.$message.success(resp.msg);
+                this.$emit("success");
+            }).catch(() => {
+
+            })
+        },
+        table_batch_status(status){
+            if (this.dataSelect.length == 0) {
+                return this.$message.error("请选择修改数据")
+            }
+            this.$confirm(`审核中的商品不支持该操作,请确认是否有勾选审核中的商品`, '提示', {
+                type: 'warning'
+            }).then(async () => {
+                var loading = this.$loading()
+                let submitData = {"id":this.dataSelect,"value":status,"field":"status","type":"batch"};
+                loading.close()
+                var resp = await this.$API.merGoods.batch.post(submitData);
+                if (resp.code == 0) {
+                    return this.$message.error(resp.msg);
+                }
+                this.$message.success(resp.msg);
+                this.$emit("success");
+            }).catch(() => {
+
+            })
+        },
+        handleSuccess(){
+            this.$emit("success");
+        }
+    }
+}
+</script>

+ 42 - 0
src/views/merchant/cps/star/components/search.vue

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

+ 208 - 0
src/views/merchant/cps/star/components/table.vue

@@ -0,0 +1,208 @@
+<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="达人" width="340" prop="name" fixed="left">
+            <template #default="scope">
+                <div class="goods-img">
+                    <div class="img">
+                        <el-image 
+                        style="width: 54px; height: 54px"
+                        :src="scope.row.avatar_url"
+                        :zoom-rate="1.2"
+                        :max-scale="7"
+                        :min-scale="0.2"
+                        :preview-src-list="[scope.row.avatar_url]"
+                        preview-teleported
+                        z-index="999"
+                        fit="cover"></el-image>
+                    </div>
+                    <div class="name">
+                        <span>{{ scope.row.show_nickname }}</span>
+                        <span class="dec">抖音号:{{ scope.row.unique_id }}</span>
+                    </div>
+                </div>
+            </template>
+        </el-table-column>
+        <el-table-column label="粉丝数" width="200" prop="id">
+            <template #default="scope">
+                <div class="price">{{ scope.row.fans_count }}</div>
+                <div class="goods-price">
+                    <span v-for="value in scope.row.fans_tag_list">{{ value }}</span></div>
+            </template>
+        </el-table-column>
+        <el-table-column label="本地粉丝数" width="120" prop="id">
+            <template #default="scope">
+                <div class="price">{{ scope.row.local_fans_count }}</div>
+            </template>
+        </el-table-column>
+        <el-table-column label="视频带货力" prop="category_id" width="120">
+            <template #default="scope">
+                <span v-if="scope.row.talent_item_level_display">{{ scope.row.talent_item_level_display }}</span>
+                <span v-else>-</span>
+            </template>
+        </el-table-column>
+        <el-table-column label="直播带货力" prop="talent_live_level_display" width="120">
+            <template #default="scope">
+                <span v-if="scope.row.talent_live_level_display">{{ scope.row.talent_live_level_display }}</span>
+                <span v-else>-</span>
+            </template>
+        </el-table-column>
+        <el-table-column label="内容力" prop="category_id" width="120">
+            <template #default="scope">
+                <span v-if="scope.row.content_level_display">{{ scope.row.content_level_display }}</span>
+                <span v-else>-</span>
+            </template>
+        </el-table-column>
+        <el-table-column label="信用分" prop="category_id" width="120">
+            <template #default="scope">
+                <span v-if="scope.row.credit_score_display">{{ scope.row.credit_score_display }}</span>
+                <span v-else>-</span>
+            </template>
+        </el-table-column>
+        <el-table-column label="视频榜" prop="category_id" width="120">
+            <template #default="scope">
+                <span v-if="scope.row.rank_display">{{ scope.row.city_name }} 第{{ scope.row.rank_display }}名</span>
+                <span v-else>-</span>
+            </template>
+        </el-table-column>
+        <el-table-column label="状态" prop="enable" 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>
+                <div class="status-danger" v-if="scope.row.status==2"><sc-status-indicator type="danger"></sc-status-indicator> 禁用</div>
+            </template>
+        </el-table-column>
+        <el-table-column label="创建时间" prop="create_at" width="180"></el-table-column>
+        <el-table-column label="操作" width="180" align="left" fixed="right">
+            <template #default="scope">
+                <el-button-group>
+                    <el-button size="small" text @click="table_update(scope.row)" v-if="scope.row.status == 1">更新</el-button>
+                    <el-button type="danger" text size="small" @click="table_del(scope.row)">删除</el-button>
+                </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.merStar.list
+            },
+            dataSelect:[],
+            dataSelectFull:[],
+            searchKey:{}
+        }
+    },
+    
+    methods: {
+        table_auth(data){
+            this.$nextTick(() => {
+                this.$refs.comboMain.open("edit").setData(data)
+            })
+        },
+        table_update(data){
+            this.$confirm(`更新后可能数据没有变化,确定更新该达人的基础数据吗?`, '提示', {
+                type: 'warning'
+            }).then(async ()=>{
+                var resp = await this.$API.merStar.update.post({"id":data.id});
+                if (resp.code == 0) {
+                    return this.$message.error(resp.msg);
+                }
+                this.$message.success(resp.msg);
+                this.$refs.table.refresh()
+            }).catch(()=>{})
+        },
+        table_life(data){
+            this.$confirm(`来客下架成功后,在小程序中将不展示该商品,同时也将无法二次上架`, '提示', {
+                type: 'warning'
+            }).then(async ()=>{
+                var resp = await this.$API.merGoods.off.post({"id":data.id});
+                if (resp.code == 0) {
+                    return this.$message.error(resp.msg);
+                }
+                this.$message.success(resp.msg);
+                this.$emit("success");
+            }).catch(()=>{})
+        },
+        table_view(data){
+            this.$router.push({path:"/merchant/goods/edit",query:{"product_id":data.product_id,"id":data.id,"spm":(new Date()).getTime()}})
+        },
+        table_del(data){
+            this.$confirm(`删除店铺后,所有有关该店铺的门店、订单等信息都将删除,不可恢复,确定要执行删除吗`, '提示', {
+                type: 'warning'
+            }).then(async ()=>{
+                var resp = await this.$API.shop.del.post({"id":data.id});
+                if (resp.code == 0) {
+                    return this.$message.error(resp.msg);
+                }
+                this.$message.success(resp.msg);
+                this.$emit("success");
+            }).catch(()=>{})
+        },
+        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.userPasswd.open("edit").setData(row)
+            })
+        }
+    }
+}
+</script>
+
+<style>
+.goods-img{display: flex;gap: 5px;}
+.goods-img .name span{display: block;}
+.goods-img .name span.dec{color: #999;font-size: 12px;}
+.goods-price,.price{display: flex;align-items: center;gap: 5px;font-size: 14px;}
+.goods-price .del{text-decoration: line-through;}
+.goods-price span{background-color: #fff !important;
+    border: 1px solid #d3d9e0 !important;
+    border-radius: 4px;
+    box-sizing: border-box;
+    color: #6c737a !important;
+    display: inline-flex;
+    flex: none;
+    font-size: 12px;
+    line-height: 18px !important;
+    padding: 1px 6px !important;text-decoration: none;}
+</style>

+ 47 - 0
src/views/merchant/cps/star/index.vue

@@ -0,0 +1,47 @@
+<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:{},
+            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>

+ 11 - 1
src/views/merchant/finance/index/index.vue

@@ -1,3 +1,13 @@
 <template>
+    
+</template>
 
-</template>
+<script>
+export default {
+    data(){
+        return {
+
+        }
+    }
+}
+</script>

+ 25 - 19
src/views/merchant/goods/add.vue

@@ -4,12 +4,12 @@
             <el-row :gutter="20">
                 <el-col :span="18">
                     <el-form ref="dialogForm" :model="formData" :rules="rules" label-width="140px" label-position="right">
-                        <el-card shadow="never" header="商品类型">
+                        <el-card shadow="never" header="商品类型" v-loading="channelLoad">
                             <el-form-item label="商品品类" prop="category">
-                                <el-cascader v-model="formData.category" :options="categoryData" :props="deptsProps" @change="getTemplate" clearable style="width: 50%;" />
+                                <el-cascader ref="cascaderRef" v-model="formData.category" :options="categoryData" :props="deptsProps" @change="getTemplate" clearable style="width: 50%;" />
                                 <div class="el-form-item-msg"></div>
                             </el-form-item>
-                            <el-form-item label="商品类型" prop="product_type" @change="getTemplate" v-loading="channelLoad">
+                            <el-form-item label="商品类型" prop="product_type" v-if="typeData">
                                 <el-radio-group v-model="formData.product_type">
                                     <el-radio border :label="item.key" v-for="(item,index) in typeData" :key="index">{{item.name}}</el-radio>
                                 </el-radio-group>
@@ -17,7 +17,7 @@
                             </el-form-item>
                         </el-card>
                         <template v-if="showNext">
-                        <el-card shadow="never" header="商家信息">
+                        <!-- <el-card shadow="never" header="商家信息">
                             <el-form-item label="收款方式" prop="settle_type">
                                 <el-radio-group v-model="formData.settle_type">
                                     <el-radio border :label="1">总店结算</el-radio>
@@ -30,7 +30,7 @@
                                     <span v-if="formData.settle_type==3">区域账户统一接收关联门店产生的所有账款,如分店未关联区域收款账户,该分店的款项自动结算给总店账户  </span>
                                 </div>
                             </el-form-item>
-                        </el-card>
+                        </el-card> -->
                         <el-card shadow="never" header="商品信息">
                             <el-form-item label="商品名称" prop="product_name">
                                 <el-input v-model="formData.product_name" maxlength="40" show-word-limit clearable placeholder="请输入"></el-input>
@@ -374,13 +374,13 @@
                                     </div>
                                 </template>
                             </el-form-item>
-                            <el-form-item label="券码类型" prop="code_source_type">
+                            <!-- <el-form-item label="券码类型" prop="code_source_type">
                                 <el-radio-group v-model="formData.code_source_type">
                                     <el-radio :label="1">抖音码</el-radio>
                                     <el-radio :label="2">三方码</el-radio>
                                 </el-radio-group>
                                 <div class="el-form-item-msg"></div>
-                            </el-form-item>
+                            </el-form-item> -->
                             
                         </el-card>
                         <el-card shadow="never" header="消费规则">
@@ -556,7 +556,7 @@ export default {
             isSaveing:false,
             showNext:false,
             formData:{
-                settle_type:1,
+                settle_type:2,
                 show_channel:1,
                 limit_use_rule:2,
                 customer_reserved_info:2,
@@ -577,7 +577,7 @@ export default {
             },
             holiday:[{'key':1,"name":"元旦"},{'key':2,"name":"春节"},{'key':3,"name":"清明"},{'key':4,"name":"劳动节"},{'key':5,"name":"端午节"},{'key':6,"name":"中秋节"},{'key':7,"name":"国庆节"},{'key':8,"name":"情人节"},{'key':9,"name":"圣诞节"},{'key':10,"name":"元宵节"},{'key':11,"name":"520"},{'key':12,"name":"儿童节"},{'key':13,"name":"七夕节"},{'key':14,"name":"二月二"},{'key':15,"name":"母亲节"},{'key':16,"name":"父亲节"},{'key':17,"name":"教师节"}],
             weeksData:[{'key':1,"name":"星期一"},{'key':2,"name":"星期二"},{'key':3,"name":"星期三"},{'key':4,"name":"星期四"},{'key':5,"name":"星期五"},{'key':6,"name":"星期六"},{'key':7,"name":"星期天"},],
-            notificationData:[],
+            notificationData:[{"title":"","content":""}],
             specs:[{"name":"","num":0,"list":[ {"name":"","price":1,"weight":"1","weight_unit":'kg',"number":1} ]}],
             skuSpecs:[],
             channelLoad:false,
@@ -647,7 +647,7 @@ export default {
                 value: "category_id",
                 label: "name"
             },
-            typeData:[],
+            typeData:null,
             categoryData:[]
         }
     },
@@ -719,22 +719,28 @@ export default {
             const nextYearDate = now.add(1, 'year').format('YYYY-MM-DD HH:mm:ss');
             return [currentDate,nextYearDate];
         },
-        async getTemplate(){
-            var { formData, $message } = this;
-            if (formData.product_type && formData.category) {
-                // var resp = await this.$API.merGoods.template.post({"product_type":formData.product_type,"category":formData.category});
-                this.showNext = true;
-                return ;
-            }
+        async getTemplate(v){
+            const nodes = this.$refs.cascaderRef.getCheckedNodes()
+            var typeData = this.$TOOL.findNodeById(this.categoryData,nodes[0].value);
+            if (!typeData) return this.$message.error("获取商品类型失败")
+            this.typeData = typeData.types;
+            this.showNext = true;
+            // var { formData, $message } = this;
+            // if (formData.product_type && formData.category) {
+            //     // var resp = await this.$API.merGoods.template.post({"product_type":formData.product_type,"category":formData.category});
+            //     this.showNext = true;
+            //     return ;
+            // }
         },
         async getData(){
             this.channelLoad = true;
-            var resp = await this.$API.category.list.get();
+            var resp = await this.$API.merGoods.category.get();
+            this.channelLoad = false;
             if (resp.code == 0) {
                 return this.$message.error(resp.msg)
             }
             this.categoryData = resp.data;
-            this.getCate()
+            // this.getCate()
         },
         async getCate(){
             var resp = await this.$API.merGoods.type.get();

+ 24 - 33
src/views/merchant/goods/edit.vue

@@ -5,11 +5,11 @@
                 <el-col :span="18">
                     <el-form ref="dialogForm" :model="formData" :rules="rules" label-width="140px" label-position="right">
                         <el-card shadow="never" header="商品类型">
-                            <el-form-item label="商品品类" prop="category">
-                                <el-cascader v-model="formData.category" :options="categoryData" :props="deptsProps" @change="getTemplate" clearable style="width: 50%;" />
+                            <el-form-item label="商品品类" prop="category" v-loading="channelLoad">
+                                <el-cascader ref="cascaderRef" v-model="formData.category" :options="categoryData" :props="deptsProps" @change="getTemplate" clearable style="width: 50%;" />
                                 <div class="el-form-item-msg"></div>
                             </el-form-item>
-                            <el-form-item label="商品类型" prop="product_type" @change="getTemplate" v-loading="channelLoad">
+                            <el-form-item label="商品类型" prop="product_type" v-if="typeData">
                                 <el-radio-group v-model="formData.product_type">
                                     <el-radio border :label="item.key" v-for="(item,index) in typeData" :key="index">{{item.name}}</el-radio>
                                 </el-radio-group>
@@ -17,20 +17,6 @@
                             </el-form-item>
                         </el-card>
                         <template v-if="showNext">
-                        <el-card shadow="never" header="商家信息">
-                            <el-form-item label="收款方式" prop="settle_type">
-                                <el-radio-group v-model="formData.settle_type">
-                                    <el-radio border :label="1">总店结算</el-radio>
-                                    <el-radio border :label="2">分店结算</el-radio>
-                                    <el-radio border :label="3">区域结算</el-radio>
-                                </el-radio-group>
-                                <div class="el-form-item-msg">
-                                    <span v-if="formData.settle_type==1">现有支付账户统一接收该团购产生的所有账款 </span>
-                                    <span v-if="formData.settle_type==2">若分店在消费者核销时未开通收款账户或未授权管理门店,则分店款项对应结算给公司账户或被授权的公司账户  </span>
-                                    <span v-if="formData.settle_type==3">区域账户统一接收关联门店产生的所有账款,如分店未关联区域收款账户,该分店的款项自动结算给总店账户  </span>
-                                </div>
-                            </el-form-item>
-                        </el-card>
                         <el-card shadow="never" header="商品信息">
                             <el-form-item label="商品名称" prop="product_name">
                                 <el-input v-model="formData.product_name" maxlength="40" show-word-limit clearable placeholder="请输入"></el-input>
@@ -374,13 +360,7 @@
                                     </div>
                                 </template>
                             </el-form-item>
-                            <el-form-item label="券码类型" prop="code_source_type">
-                                <el-radio-group v-model="formData.code_source_type" disabled>
-                                    <el-radio :label="1">抖音码</el-radio>
-                                    <el-radio :label="2">三方码</el-radio>
-                                </el-radio-group>
-                                <div class="el-form-item-msg"></div>
-                            </el-form-item>
+                            
                             
                         </el-card>
                         <el-card shadow="never" header="消费规则">
@@ -648,7 +628,7 @@ export default {
                 value: "category_id",
                 label: "name"
             },
-            typeData:[],
+            typeData:null,
             categoryData:[]
         }
     },
@@ -681,6 +661,11 @@ export default {
             this.specs = resp.data.specs;
             this.skuSpecs = resp.data.skuSpecs;
             this.notificationData = resp.data.notification
+            
+            var typeData = this.$TOOL.findNodeById(this.categoryData,parseInt(this.formData.category_id));
+            if (!typeData) return this.$message.error("获取商品类型失败")
+            this.typeData = typeData.types;
+            this.showNext = true;
         },
         skuResp(data){
             this.skuSpecs[data.index] = data.data;
@@ -737,21 +722,27 @@ export default {
             return [currentDate,nextYearDate];
         },
         async getTemplate(){
-            var { formData, $message } = this;
-            if (formData.product_type && formData.category) {
-                // var resp = await this.$API.merGoods.template.post({"product_type":formData.product_type,"category":formData.category});
-                this.showNext = true;
-                return ;
-            }
+            const nodes = this.$refs.cascaderRef.getCheckedNodes()
+            var typeData = this.$TOOL.findNodeById(this.categoryData,nodes[0].value);
+            if (!typeData) return this.$message.error("获取商品类型失败")
+            this.typeData = typeData.types;
+            this.showNext = true;
+            // var { formData, $message } = this;
+            // if (formData.product_type && formData.category) {
+            //     // var resp = await this.$API.merGoods.template.post({"product_type":formData.product_type,"category":formData.category});
+            //     this.showNext = true;
+            //     return ;
+            // }
         },
         async getData(){
             this.channelLoad = true;
-            var resp = await this.$API.category.list.get();
+            var resp = await this.$API.merGoods.category.get();
+            this.channelLoad = false;
             if (resp.code == 0) {
                 return this.$message.error(resp.msg)
             }
             this.categoryData = resp.data;
-            this.getCate()
+            // this.getCate()
         },
         async getCate(){
             var resp = await this.$API.merGoods.type.get();

+ 2 - 2
src/views/merchant/goods/index/components/table.vue

@@ -54,10 +54,10 @@
         <el-table-column label="操作" width="180" align="left" fixed="right">
             <template #default="scope">
                 <el-button-group>
-                    <el-button size="warning" text @click="table_life(scope.row)">来客下架</el-button>
+                    <el-button size="small" type="warning" text @click="table_life(scope.row)" v-if="scope.row.status == 1">来客下架</el-button>
                 </el-button-group>
                 <el-button-group>
-                    <el-button size="small" text @click="table_view(scope.row)">编辑</el-button>
+                    <el-button size="small" text @click="table_view(scope.row)" v-if="scope.row.status == 1">编辑</el-button>
                     <el-button type="danger" text size="small" @click="table_del(scope.row)">删除</el-button>
                 </el-button-group>
             </template>

+ 12 - 1
src/views/merchant/order/index/components/table.vue

@@ -91,10 +91,15 @@
             </template>
         </el-table-column>
     </scTable>
+    <orderDetail ref="orderDetail" @success="orderSuccess"></orderDetail>
 </template>
 
 <script>
+import orderDetail from "@/components/imFloat/order";
 export default {
+    components:{
+        orderDetail
+    },
     data(){
         return {
             list: {
@@ -106,8 +111,14 @@ export default {
         }
     },
     methods: {
+        orderSuccess(){
+            this.$refs.table.refresh()
+        },
         table_view(data){
-
+            this.$nextTick(() => {
+                data.order = data.out_order_no
+                this.$refs.orderDetail.open("edit").setData(data)
+            })
         },
         table_del(data){