yyw提交

This commit is contained in:
DESKTOP-8FGKA8Q\chunfen 2024-08-07 18:17:56 +08:00
parent 7e3a5fed04
commit cfc9870314
21 changed files with 788 additions and 482 deletions

View File

@ -1203,7 +1203,6 @@
"version": "7.23.9", "version": "7.23.9",
"resolved": "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.23.9.tgz", "resolved": "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.23.9.tgz",
"integrity": "sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==", "integrity": "sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==",
"dev": true,
"requires": { "requires": {
"regenerator-runtime": "^0.14.0" "regenerator-runtime": "^0.14.0"
}, },
@ -1211,8 +1210,7 @@
"regenerator-runtime": { "regenerator-runtime": {
"version": "0.14.1", "version": "0.14.1",
"resolved": "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", "resolved": "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
"integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw=="
"dev": true
} }
} }
}, },
@ -1390,6 +1388,21 @@
"integrity": "sha512-2LuNTFBIO0m7kKIQvvPHN6UE63VjpmL9rnEEaOOaiSPbZK+zUOYIzBAWcED+3XYzhYsd/0mD57VdxAEqqV52CQ==", "integrity": "sha512-2LuNTFBIO0m7kKIQvvPHN6UE63VjpmL9rnEEaOOaiSPbZK+zUOYIzBAWcED+3XYzhYsd/0mD57VdxAEqqV52CQ==",
"dev": true "dev": true
}, },
"@riophae/vue-treeselect": {
"version": "0.4.0",
"resolved": "https://registry.npmmirror.com/@riophae/vue-treeselect/-/vue-treeselect-0.4.0.tgz",
"integrity": "sha512-J4atYmBqXQmiPFK/0B5sXKjtnGc21mBJEiyKIDZwk0Q9XuynVFX6IJ4EpaLmUgL5Tve7HAS7wkiGGSti6Uaxcg==",
"requires": {
"@babel/runtime": "^7.3.1",
"babel-helper-vue-jsx-merge-props": "^2.0.3",
"easings-css": "^1.0.0",
"fuzzysearch": "^1.0.3",
"is-promise": "^2.1.0",
"lodash": "^4.0.0",
"material-colors": "^1.2.6",
"watch-size": "^2.0.0"
}
},
"@samverschueren/stream-to-observable": { "@samverschueren/stream-to-observable": {
"version": "0.3.1", "version": "0.3.1",
"resolved": "https://registry.npmmirror.com/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.1.tgz", "resolved": "https://registry.npmmirror.com/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.1.tgz",
@ -4278,6 +4291,11 @@
"integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==",
"dev": true "dev": true
}, },
"easings-css": {
"version": "1.0.0",
"resolved": "https://registry.npmmirror.com/easings-css/-/easings-css-1.0.0.tgz",
"integrity": "sha512-7Uq7NdazNfVtr0RNmPAys8it0zKCuaqxJStYKEl72D3j4gbvXhhaM7iWNbqhA4C94ygCye6VuyhzBRQC4szeBg=="
},
"easy-stack": { "easy-stack": {
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmmirror.com/easy-stack/-/easy-stack-1.0.1.tgz", "resolved": "https://registry.npmmirror.com/easy-stack/-/easy-stack-1.0.1.tgz",
@ -5448,6 +5466,11 @@
"integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==",
"dev": true "dev": true
}, },
"fuzzysearch": {
"version": "1.0.3",
"resolved": "https://registry.npmmirror.com/fuzzysearch/-/fuzzysearch-1.0.3.tgz",
"integrity": "sha512-s+kNWQuI3mo9OALw0HJ6YGmMbLqEufCh2nX/zzV5CrICQ/y4AwPxM+6TIiF9ItFCHXFCyM/BfCCmN57NTIJuPg=="
},
"gensync": { "gensync": {
"version": "1.0.0-beta.2", "version": "1.0.0-beta.2",
"resolved": "https://registry.npmmirror.com/gensync/-/gensync-1.0.0-beta.2.tgz", "resolved": "https://registry.npmmirror.com/gensync/-/gensync-1.0.0-beta.2.tgz",
@ -6247,8 +6270,7 @@
"is-promise": { "is-promise": {
"version": "2.2.2", "version": "2.2.2",
"resolved": "https://registry.npmmirror.com/is-promise/-/is-promise-2.2.2.tgz", "resolved": "https://registry.npmmirror.com/is-promise/-/is-promise-2.2.2.tgz",
"integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ=="
"dev": true
}, },
"is-regex": { "is-regex": {
"version": "1.1.4", "version": "1.1.4",
@ -6882,8 +6904,7 @@
"lodash": { "lodash": {
"version": "4.17.21", "version": "4.17.21",
"resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz", "resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz",
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
"dev": true
}, },
"lodash.debounce": { "lodash.debounce": {
"version": "4.0.8", "version": "4.0.8",
@ -7111,6 +7132,11 @@
"semver": "^6.0.0" "semver": "^6.0.0"
} }
}, },
"material-colors": {
"version": "1.2.6",
"resolved": "https://registry.npmmirror.com/material-colors/-/material-colors-1.2.6.tgz",
"integrity": "sha512-6qE4B9deFBIa9YSpOc9O0Sgc43zTeVYbgDT5veRKSlB2+ZuHNoVVxA1L/ckMUayV9Ay9y7Z/SZCLcGteW9i7bg=="
},
"mdn-data": { "mdn-data": {
"version": "2.0.14", "version": "2.0.14",
"resolved": "https://registry.npmmirror.com/mdn-data/-/mdn-data-2.0.14.tgz", "resolved": "https://registry.npmmirror.com/mdn-data/-/mdn-data-2.0.14.tgz",
@ -9996,6 +10022,11 @@
"resolved": "https://registry.npmmirror.com/vuex/-/vuex-3.6.2.tgz", "resolved": "https://registry.npmmirror.com/vuex/-/vuex-3.6.2.tgz",
"integrity": "sha512-ETW44IqCgBpVomy520DT5jf8n0zoCac+sxWnn+hMe/CzaSejb/eVw2YToiXYX+Ex/AuHHia28vWTq4goAexFbw==" "integrity": "sha512-ETW44IqCgBpVomy520DT5jf8n0zoCac+sxWnn+hMe/CzaSejb/eVw2YToiXYX+Ex/AuHHia28vWTq4goAexFbw=="
}, },
"watch-size": {
"version": "2.0.0",
"resolved": "https://registry.npmmirror.com/watch-size/-/watch-size-2.0.0.tgz",
"integrity": "sha512-M92R89dNoTPWyCD+HuUEDdhaDnh9jxPGOwlDc0u51jAgmjUvzqaEMynXSr3BaWs+QdHYk4KzibPy1TFtjLmOZQ=="
},
"watchpack": { "watchpack": {
"version": "2.4.0", "version": "2.4.0",
"resolved": "https://registry.npmmirror.com/watchpack/-/watchpack-2.4.0.tgz", "resolved": "https://registry.npmmirror.com/watchpack/-/watchpack-2.4.0.tgz",

View File

@ -8,6 +8,7 @@
"lint": "vue-cli-service lint" "lint": "vue-cli-service lint"
}, },
"dependencies": { "dependencies": {
"@riophae/vue-treeselect": "^0.4.0",
"axios": "^0.21.1", "axios": "^0.21.1",
"core-js": "^3.6.5", "core-js": "^3.6.5",
"dayjs": "^1.11.12", "dayjs": "^1.11.12",

View File

@ -29,11 +29,17 @@ export function storeDetail(params) {
// 商品种类列表 // 商品种类列表
export function goods_types(params) { export function goods_types(params) {
return http({ return http({
url: "/api/goods_types", url: "/api/goodsTypes/tree",
method: "get", method: "get",
params, params,
}); });
} }
export function goods_types_detail(id) {
return http({
url: `/api/goods_types/${id}`,
method: "get",
});
}
// 商品种类列表删除 // 商品种类列表删除
export function Delgoods_types(id) { export function Delgoods_types(id) {
return http({ return http({

View File

@ -0,0 +1,193 @@
<template>
<div class="tree_select">
<el-select
v-model="valueId"
ref="selectEl"
:filterable="filterable"
:clearable="clearable"
@clear="clearHandle"
:filter-method="selectFilterData"
:size="size">
<el-option :value="valueId" :label="valueTitle">
<el-tree
id="tree-option"
ref="selectTree"
:accordion="accordion"
:data="options"
:props="props"
:node-key="props.value"
:expand-on-click-node="false"
:default-expanded-keys="defaultExpandedKey"
:filter-node-method="filterNode"
@node-click="handleNodeClick">
</el-tree>
</el-option>
</el-select>
</div>
</template>
<script>
export default {
name: 'SelectTree',
props: {
/* 配置项 */
props: {
type: Object,
default: () => {
return {
value: 'id', // ID
label: 'title', //
children: 'children' //
}
}
},
/* 选项列表数据(树形结构的对象数组) */
options: {
type: Array,
default: () => {
return []
}
},
/* 初始值 */
value: {
type: [Number, String],
default: () => {
return null
}
},
/* 可清空选项 */
clearable: {
type: Boolean,
default: () => {
return true
}
},
/* 自动收起 */
accordion: {
type: Boolean,
default: () => {
return false
}
},
/**
* 下拉选项框的大小默认最小
*/
size: {
type: String,
default: () => {
return 'small'
}
},
//
filterable: Boolean
},
data () {
return {
valueId: this.value, //
valueTitle: '',
defaultExpandedKey: []
}
},
mounted () {
this.$nextTick(function () {
this.initHandle()
})
},
methods: {
//
initHandle () {
if (this.valueId) {
this.valueTitle = this.$refs.selectTree.getNode(this.valueId).data[this.props.label] //
this.$refs.selectTree.setCurrentKey(this.valueId) //
this.defaultExpandedKey = [this.valueId] //
console.log(this.valueTitle)
}
this.$nextTick(() => {
const scrollWrap = document.querySelectorAll('.el-scrollbar .el-select-dropdown__wrap')[0]
const scrollBar = document.querySelectorAll('.el-scrollbar .el-scrollbar__bar')
scrollWrap.style.cssText = 'margin: 0px; max-height: none; overflow: hidden;'
scrollBar.forEach(ele => {
ele.style.width = 0
})
})
},
//
handleNodeClick (node) {
this.valueTitle = node[this.props.label]
this.valueId = node[this.props.value]
this.$emit('getValue', this.valueId)
this.defaultExpandedKey = []
//
this.$refs.selectEl.blur()
//
this.selectFilterData('')
},
/**
* 下拉框搜索
*/
selectFilterData (val) {
this.$refs.selectTree.filter(val)
},
/**
* 过滤节点
*/
filterNode (value, data) {
if (!value) return true
return data.label.indexOf(value) !== -1
},
//
clearHandle () {
this.valueTitle = ''
this.valueId = null
this.defaultExpandedKey = []
this.clearSelected()
this.$emit('getValue', null)
},
/* 清空选中样式 */
clearSelected () {
const allNode = document.querySelectorAll('#tree-option .el-tree-node')
allNode.forEach((element) => element.classList.remove('is-current'))
}
},
watch: {
/**
* 监听绑定的值变化
*/
value () {
this.valueId = this.value
this.initHandle()
}
}
}
</script>
<style lang="scss" scoped>
::v-deep .el-select .el-input .el-input__inner {
color: #fff !important;
}
.el-scrollbar .el-scrollbar__view .el-select-dropdown__item {
height: auto;
max-height: 274px;
padding: 0;
overflow: hidden;
overflow-y: auto;
}
.el-select-dropdown__item.selected {
font-weight: normal;
}
ul li >>> .el-tree .el-tree-node__content {
height: auto;
padding: 0 20px;
}
::v-deep .el-tree-node__content:hover,
::v-deep .el-tree-node__content:active,
::v-deep .is-current > div:first-child,
::v-deep .el-tree-node__content:focus {
background-color: #F5F7FA;
color: #409EFF;
}
</style>

View File

@ -1,185 +1,181 @@
<template> <template>
<div class="conent"> <div class="pageBox">
<!-- 新增按钮 --> <el-card>
<el-button type="primary" @click="handAdd">新增</el-button> <div class="opaBox">
<el-button type="primary" icon="el-icon-plus" @click="handAdd">新增</el-button>
</div>
<el-table border ref="multipleTable" :data="tableData" tooltip-effect="dark" style="width: 100%"
@selection-change="handleSelectionChange">
<el-table-column prop="name" label="商品品牌"> </el-table-column>
<el-table-column prop="" label="操作">
<template slot-scope="scope">
<el-button type="primary" @click="handEdit(scope.row.id, scope.row)">编辑</el-button>
<el-button type="danger" @click="handdel(scope.row.id)">删除</el-button>
</template>
</el-table-column>
</el-table>
<div class="page-pagination">
<el-pagination
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="current_page"
:page-sizes="[15, 50, 100]"
:page-size="per_page"
layout="total, sizes, prev, pager, next, jumper"
:total="Paginationdata.total">
</el-pagination>
</div>
</el-card>
<!-- 列表 --> <!-- 新增品牌对话框 -->
<div class="table" style="margin-top: 10px"> <el-dialog title="新增品牌" :visible.sync="dialogFormVisible" :close-on-click-modal="false">
<el-table ref="multipleTable" :data="tableData" tooltip-effect="dark" style="width: 100%" <el-form :model="form">
@selection-change="handleSelectionChange"> <el-form-item label="商品品牌" :label-width="formLabelWidth">
<el-table-column prop="name" label="商品品牌"> </el-table-column> <el-input v-model="form.kindName"></el-input>
<el-table-column prop="" label="操作"> </el-form-item>
<template slot-scope="scope"> </el-form>
<el-button type="primary" @click="handEdit(scope.row.id, scope.row)">编辑</el-button> <div slot="footer" class="dialog-footer">
<el-button type="danger" @click="handdel(scope.row.id)">删除</el-button> <el-button @click="dialogFormVisible = false"> </el-button>
</template> <el-button type="primary" @click="addSubmit"> </el-button>
</el-table-column> </div>
</el-table> </el-dialog>
</div>
<!-- 分页功能 --> <!-- 编辑 -->
<div class="block"> <el-dialog title="编辑" :visible.sync="dialogFormVisible1" :close-on-click-modal="false">
<el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange" <el-form :model="form1">
:current-page="current_page" :page-sizes="[15, 50, 100]" :page-size="per_page" <el-form-item label="编辑品牌" :label-width="formLabelWidth1">
layout="total, sizes, prev, pager, next, jumper" :total="Paginationdata.total"> <el-input v-model="form1.kindName1"></el-input>
</el-pagination> </el-form-item>
</div> </el-form>
<div slot="footer" class="dialog-footer">
<!-- 新增品牌对话框 --> <el-button @click="dialogFormVisible1 = false"> </el-button>
<el-dialog title="新增品牌" :visible.sync="dialogFormVisible" :close-on-click-modal="false"> <el-button type="primary" @click="EditSubmit"> </el-button>
<el-form :model="form"> </div>
<el-form-item label="商品品牌" :label-width="formLabelWidth"> </el-dialog>
<el-input v-model="form.kindName"></el-input> </div>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="dialogFormVisible = false"> </el-button>
<el-button type="primary" @click="addSubmit"> </el-button>
</div>
</el-dialog>
<!-- 编辑 -->
<el-dialog title="编辑" :visible.sync="dialogFormVisible1" :close-on-click-modal="false">
<el-form :model="form1">
<el-form-item label="编辑品牌" :label-width="formLabelWidth1">
<el-input v-model="form1.kindName1"></el-input>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="dialogFormVisible1 = false"> </el-button>
<el-button type="primary" @click="EditSubmit"> </el-button>
</div>
</el-dialog>
</div>
</template> </template>
<script> <script>
import { import { Brand_goods_types, DelBrand_goods_types, AddBrandgoods_types, editBrand_types } from "@/api/rankingData"
Brand_goods_types,
DelBrand_goods_types,
AddBrandgoods_types,
editBrand_types,
} from "../../api/rankingData";
export default { export default {
data() { data() {
return { return {
id: "", //id id: '', //id
tableData: [], tableData: [],
multipleSelection: [], multipleSelection: [],
dialogFormVisible: false, dialogFormVisible: false,
dialogFormVisible1: false, dialogFormVisible1: false,
form: { form: {
kindName: "", // kindName: '', //
}, },
form1: { form1: {
kindName1: "", // kindName1: '', //
}, },
formLabelWidth: "120px", formLabelWidth: '120px',
formLabelWidth1: "120px", formLabelWidth1: '120px',
newKind: [], newKind: [],
Paginationdata: {}, // Paginationdata: {}, //
current_page: 1, // current_page: 1, //
per_page: 15, // per_page: 15 //
}; }
},
created() {
this.getGoods_types()
},
methods: {
//
handleSelectionChange(val) {
this.multipleSelection = val
}, },
created() { //
this.getGoods_types(); handleSizeChange(val) {
//
this.per_page = val
this.getGoods_types()
}, },
methods: { handleCurrentChange(val) {
// //
handleSelectionChange(val) { this.current_page = val
this.multipleSelection = val; this.getGoods_types()
},
//
handleSizeChange(val) {
//
this.per_page = val;
this.getGoods_types();
},
handleCurrentChange(val) {
//
this.current_page = val;
this.getGoods_types();
},
//
handAdd() {
this.form.kindName = "";
this.dialogFormVisible = true;
},
//
addSubmit() {
var string;
string = this.form.kindName.replace(/\s/g, ",").split(",");
AddBrandgoods_types({
names: string,
}).then((res) => {
this.$message({
type: "success",
message: "添加成功",
});
this.getGoods_types();
});
this.dialogFormVisible = false;
},
//
handEdit(id, item) {
this.id = id;
this.form1.kindName1 = item.name;
this.dialogFormVisible1 = true;
},
//
EditSubmit() {
editBrand_types(this.id, {
name: this.form1.kindName1,
}).then((res) => {
this.$message({
type: "success",
message: "编辑成功",
});
this.getGoods_types();
});
this.dialogFormVisible1 = false;
},
//
handdel(id) {
this.$confirm("确定删除此条商品品牌吗?", "确认删除", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
})
.then(() => {
DelBrand_goods_types(id).then((res) => {
this.getGoods_types();
});
this.$message({
type: "success",
message: "删除成功!",
});
})
.catch(() => {
this.$message({
type: "info",
message: "已取消删除",
});
});
},
//
getGoods_types() {
let page = {
page: this.current_page,
per_page: this.per_page,
};
Brand_goods_types(page).then((res) => {
this.tableData = res.data.data;
this.Paginationdata = res.data.meta;
});
},
}, },
}; //
handAdd() {
this.form.kindName = ""
this.dialogFormVisible = true
},
//
addSubmit() {
var string;
string = this.form.kindName.replace(/\s/g, ",").split(",")
AddBrandgoods_types({
names: string
}).then((res) => {
this.$message({
type: "success",
message: "添加成功"
})
this.getGoods_types()
})
this.dialogFormVisible = false
},
//
handEdit(id, item) {
this.id = id
this.form1.kindName1 = item.name
this.dialogFormVisible1 = true
},
//
EditSubmit() {
editBrand_types(this.id, {
name: this.form1.kindName1
}).then((res) => {
this.$message({
type: "success",
message: "编辑成功"
})
this.getGoods_types()
})
this.dialogFormVisible1 = false
},
//
handdel(id) {
this.$confirm("确定删除此条商品品牌吗?", "确认删除", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
DelBrand_goods_types(id).then((res) => {
this.getGoods_types()
})
this.$message({
type: "success",
message: "删除成功!"
})
}).catch(() => {
this.$message({
type: "info",
message: "已取消删除"
})
})
},
//
getGoods_types() {
let page = {
page: this.current_page,
per_page: this.per_page
}
Brand_goods_types(page).then((res) => {
this.tableData = res.data.data
this.Paginationdata = res.data.meta
})
}
}
}
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.block { .opaBox{
margin-top: 20px; margin-bottom: 15px;
} }
</style> </style>

View File

@ -54,9 +54,7 @@
</div> </div>
<el-card> <el-card>
<div class="echartBox" id="myEchart"> <div class="echartBox" id="myEchart"></div>
</div>
</el-card> </el-card>
</div> </div>
</template> </template>
@ -70,7 +68,7 @@ export default {
data() { data() {
return { return {
loading: false, loading: false,
time_type: 'day', time_type: 'thirty',
timeTypeList: [ timeTypeList: [
{ label: '自然日', value: 'day' }, { label: '自然日', value: 'day' },
{ label: '自然周', value: 'week' }, { label: '自然周', value: 'week' },
@ -100,8 +98,8 @@ export default {
}, },
methods: { methods: {
getInitList() { getInitList() {
let time = this.getDayTime() this.dayValue = this.endTime = dayjs().format('YYYY-MM-DD')
this.dayValue = this.startTime = this.endTime = time this.startTime = dayjs().subtract(30, 'day').format('YYYY-MM-DD')
this.fetchData() this.fetchData()
}, },
changeTimeType() { changeTimeType() {

View File

@ -106,6 +106,14 @@ export default {
{ label: '近30天', value: 'thirty' }, { label: '近30天', value: 'thirty' },
{ label: '自定义', value: 'custom' } { label: '自定义', value: 'custom' }
], ],
TIMETYPE: {
'day': '自然日',
'week': '自然周',
'month': '自然月',
'seven': '近7天',
'thirty': '近30天',
'custom': '自定义'
},
dayValue: '', dayValue: '',
monthValue: '', monthValue: '',
customValue: [], customValue: [],
@ -239,6 +247,7 @@ export default {
message: '暂无数据', message: '暂无数据',
type: 'error' type: 'error'
}) })
this.downloadLoading = false
return return
} }
import('@/util/Export2Excel').then(excel => { import('@/util/Export2Excel').then(excel => {
@ -246,10 +255,11 @@ export default {
const filterVal = ['name', 'title', 'external_sku_id', 'goods_total', 'goods_total_amount'] const filterVal = ['name', 'title', 'external_sku_id', 'goods_total', 'goods_total_amount']
const list = res.data.data.data const list = res.data.data.data
const data = this.formatJson(filterVal, list) const data = this.formatJson(filterVal, list)
let date = this.startTime == this.endTime ? this.startTime : this.startTime + '-' + this.endTime
excel.export_json_to_excel({ excel.export_json_to_excel({
header: tHeader, header: tHeader,
data, data,
filename: 'sku销售统计数据', filename: 'sku销售统计数据【' + this.TIMETYPE[this.time_type] + date + '】',
autoWidth: this.autoWidth, autoWidth: this.autoWidth,
bookType: this.bookType bookType: this.bookType
}) })

View File

@ -91,6 +91,14 @@ export default {
{ label: '近30天', value: 'thirty' }, { label: '近30天', value: 'thirty' },
{ label: '自定义', value: 'custom' } { label: '自定义', value: 'custom' }
], ],
TIMETYPE: {
'day': '自然日',
'week': '自然周',
'month': '自然月',
'seven': '近7天',
'thirty': '近30天',
'custom': '自定义'
},
dayValue: '', dayValue: '',
monthValue: '', monthValue: '',
customValue: [], customValue: [],
@ -203,11 +211,12 @@ export default {
const tHeader = ['类型名称', '库存', '可售库存', '未发货数', '未发货数', '总销量', '总销售金额'] const tHeader = ['类型名称', '库存', '可售库存', '未发货数', '未发货数', '总销量', '总销售金额']
const filterVal = ['type_name', 'stock', 'sale_stock', 'shipping_num', 'unshipping_num', 'goods_total', 'goods_total_amount'] const filterVal = ['type_name', 'stock', 'sale_stock', 'shipping_num', 'unshipping_num', 'goods_total', 'goods_total_amount']
const list = this.saleList const list = this.saleList
let date = this.startTime == this.endTime ? this.startTime : this.startTime + '-' + this.endTime
const data = this.formatJson(filterVal, list) const data = this.formatJson(filterVal, list)
excel.export_json_to_excel({ excel.export_json_to_excel({
header: tHeader, header: tHeader,
data, data,
filename: 'sku销售统计数据', filename: 'sku销售统计数据【' + this.TIMETYPE[this.time_type] + date + '】',
autoWidth: this.autoWidth, autoWidth: this.autoWidth,
bookType: this.bookType bookType: this.bookType
}) })

View File

@ -30,17 +30,22 @@
<el-input placeholder="商品编码" v-model="form.goods_code" :disabled="disabled"></el-input> <el-input placeholder="商品编码" v-model="form.goods_code" :disabled="disabled"></el-input>
</el-form-item> </el-form-item>
<el-form-item label="商品种类:"> <el-form-item label="商品种类:">
<el-select v-model="form.type_id" placeholder="商品种类" filterable :disabled="disabled"> <!-- <el-select v-model="form.type_id" placeholder="商品种类" filterable :disabled="disabled">
<el-option v-for="item in cate" :key="item.id" :label="item.name" :value="item.id"> <el-option v-for="item in cate" :key="item.id" :label="item.name" :value="item.id">
</el-option> </el-option>
</el-select> </el-select> -->
<treeselect
:options="treeList"
placeholder="请选择分类"
style="width: 250px;"
v-model="form.type_id" />
</el-form-item> </el-form-item>
<el-form-item label="商品品牌:"> <!-- <el-form-item label="商品品牌:">
<el-select v-model="form.brand_id" placeholder="商品品牌" filterable :disabled="disabled"> <el-select v-model="form.brand_id" placeholder="商品品牌" filterable :disabled="disabled">
<el-option v-for="item in brand" :key="item.id" :label="item.name" :value="item.id"> <el-option v-for="item in brandList" :key="item.id" :label="item.name" :value="item.id">
</el-option> </el-option>
</el-select> </el-select>
</el-form-item> </el-form-item> -->
</div> </div>
<div v-for="(item, i) in skus" :key="i" class="skuBox"> <div v-for="(item, i) in skus" :key="i" class="skuBox">
<div class="tit">规格{{ i + 1 }}</div> <div class="tit">规格{{ i + 1 }}</div>
@ -90,16 +95,20 @@
</template> </template>
<script> <script>
import { addGoods, goodsList, imgUpload } from "../../../api/goods.js"; import { addGoods, goodsList, imgUpload } from '@/api/goods.js'
import { goods_types, Brand_goods_types } from "../../../api/rankingData.js"; import { goods_types, Brand_goods_types } from '@/api/rankingData.js'
import Treeselect from '@riophae/vue-treeselect'
import '@riophae/vue-treeselect/dist/vue-treeselect.css'
export default { export default {
components: { Treeselect },
data() { data() {
return { return {
lid: "", // id lid: "",
gid: "", // id gid: "",
brand: [], // brandList: [],
cate: [], // treeList: [],
goodschoose: [], // goodschoose: [],
// //
skus: [], skus: [],
// //
@ -107,7 +116,7 @@ export default {
goods_id: "", goods_id: "",
title: "", title: "",
img_url: "", img_url: "",
type_id: "", type_id: null, // Treeselectnull
brand_id: "", brand_id: "",
goods_code: "", goods_code: "",
}, },
@ -127,23 +136,14 @@ export default {
}, },
], ],
file: [], file: [],
disabled: false, disabled: false
}; }
}, },
mounted() { mounted() {
let page = { this.getGoods_types()
per_page: 999, this.getGoodsBrand()
}; this.handleList()
// this.handleAdd()
goods_types(page).then((res) => {
this.cate = res.data.data;
});
//
Brand_goods_types(page).then((res) => {
this.brand = res.data.data;
});
this.handleList();
this.handleAdd();
}, },
watch: { watch: {
lid: { lid: {
@ -161,6 +161,19 @@ export default {
}, },
}, },
methods: { methods: {
getGoods_types() {
let params = {
parent_id: 0
}
goods_types(params).then((res) => {
this.treeList = JSON.parse(JSON.stringify(res.data.data).replace(/name/g, "label"))
})
},
getGoodsBrand() {
Brand_goods_types({per_page: 999}).then((res) => {
this.brandList = res.data.data
})
},
// //
handleAvatarSuccess(res, files) { handleAvatarSuccess(res, files) {
let formData = new FormData(); let formData = new FormData();
@ -196,8 +209,9 @@ export default {
const updata = { const updata = {
...goods, ...goods,
goods_id: this.lid, goods_id: this.lid,
skus: skus, skus: skus
}; }
updata.type_id = updata.type_id || ''
addGoods(updata).then((res) => { addGoods(updata).then((res) => {
if (res.statusText === "OK") { if (res.statusText === "OK") {
this.$message({ this.$message({
@ -206,7 +220,7 @@ export default {
}); });
this.$router.push("/GOODS_LIST"); this.$router.push("/GOODS_LIST");
} }
}); })
}, },
// //
handleAdd() { handleAdd() {

View File

@ -143,10 +143,7 @@ export default {
item_num: 1, item_num: 1,
}], }],
}, },
skus: [{ skus: [],
'id': '',
'title': ''
}],
remoteLoading: false remoteLoading: false
}; };
}, },

View File

@ -27,17 +27,18 @@
<el-input placeholder="商品编码" v-model="goodsData.goods.goods_code"></el-input> <el-input placeholder="商品编码" v-model="goodsData.goods.goods_code"></el-input>
</el-form-item> </el-form-item>
<el-form-item label="商品种类:"> <el-form-item label="商品种类:">
<el-select v-model="goodsData.goods.type_id" placeholder="商品种类" filterable> <treeselect
<el-option v-for="item in cate" :key="item.id" :label="item.name" :value="item.id"> :options="treeList"
</el-option> placeholder="请选择分类"
</el-select> style="width: 216px;"
v-model="goodsData.goods.type_id" />
</el-form-item> </el-form-item>
<el-form-item label="商品品牌:"> <!-- <el-form-item label="商品品牌:">
<el-select v-model="goodsData.goods.brand_id" placeholder="商品品牌" filterable> <el-select v-model="goodsData.goods.brand_id" placeholder="商品品牌" filterable>
<el-option v-for="item in brand" :key="item.id" :label="item.name" :value="item.id"> <el-option v-for="item in brand" :key="item.id" :label="item.name" :value="item.id">
</el-option> </el-option>
</el-select> </el-select>
</el-form-item> </el-form-item> -->
</div> </div>
<div> <div>
<el-form-item label="商品规格:"> <el-form-item label="商品规格:">
@ -98,13 +99,17 @@
</template> </template>
<script> <script>
import { checkGoods, goodsList, updateGoods, imgUpload } from "../../api/goods.js"; import { checkGoods, goodsList, updateGoods, imgUpload } from '@/api/goods.js'
import { goods_types, Brand_goods_types } from "../../api/rankingData.js"; import { goods_types, Brand_goods_types } from '@/api/rankingData.js'
import Treeselect from '@riophae/vue-treeselect'
import '@riophae/vue-treeselect/dist/vue-treeselect.css'
export default { export default {
components: { Treeselect },
data() { data() {
return { return {
brand: [], // brand: [], //
cate: [], // treeList: [], //
goodschoose: [], // goodschoose: [], //
skuId: 0, // id skuId: 0, // id
// //
@ -120,7 +125,7 @@ export default {
goods: { goods: {
img_url: "", img_url: "",
title: "", title: "",
type_id: "", type_id: null,
brand_id: "", brand_id: "",
goods_code: "", goods_code: "",
} }
@ -145,6 +150,19 @@ export default {
}; };
}, },
methods: { methods: {
getGoods_types() {
let params = {
parent_id: 0
}
goods_types(params).then((res) => {
this.treeList = JSON.parse(JSON.stringify(res.data.data).replace(/name/g, "label"))
})
},
getGoodsBrand() {
Brand_goods_types({per_page: 999}).then((res) => {
this.brandList = res.data.data
})
},
// //
handleAvatarSuccess(res, files) { handleAvatarSuccess(res, files) {
let formData = new FormData(); let formData = new FormData();
@ -201,7 +219,8 @@ export default {
// //
getGoodsSkuData() { getGoodsSkuData() {
checkGoods(this.skuId).then((res) => { checkGoods(this.skuId).then((res) => {
this.goodsData = res.data.data; this.goodsData = res.data.data
this.goodsData.goods.type_id = this.goodsData.goods.type_id || null
}); });
}, },
// //
@ -209,7 +228,7 @@ export default {
let goods = { let goods = {
title: this.goodsData.goods.title, title: this.goodsData.goods.title,
img_url: this.goodsData.goods.img_url, img_url: this.goodsData.goods.img_url,
type_id: this.goodsData.goods.type_id, type_id: this.goodsData.goods.type_id || '',
brand_id: this.goodsData.goods.brand_id, brand_id: this.goodsData.goods.brand_id,
goods_code: this.goodsData.goods.goods_code, goods_code: this.goodsData.goods.goods_code,
}; };
@ -251,17 +270,8 @@ export default {
this.skuId = parseInt(this.$route.query.id); this.skuId = parseInt(this.$route.query.id);
}, },
mounted() { mounted() {
let page = { this.getGoods_types()
per_page: 999, this.getGoodsBrand()
};
//
goods_types(page).then((res) => {
this.cate = res.data.data;
});
//
Brand_goods_types(page).then((res) => {
this.brand = res.data.data;
});
this.handleList(); this.handleList();
this.getGoodsSkuData(); this.getGoodsSkuData();
} }

View File

@ -9,10 +9,11 @@
</div> </div>
<div class="row"> <div class="row">
<span>商品种类</span> <span>商品种类</span>
<el-select v-model="form.type_id" placeholder="商品种类" clearable> <treeselect
<el-option v-for="item in cate" :key="item.id" :label="item.name" :value="item.id"> :options="treeList"
</el-option> placeholder="请选择分类"
</el-select> style="width: 220px;"
v-model="form.type_id" />
</div> </div>
<div class="row"> <div class="row">
<span>商品品牌</span> <span>商品品牌</span>
@ -375,12 +376,15 @@
</template> </template>
<script> <script>
import axios from "axios"; import axios from 'axios'
import { goods_types, Brand_goods_types } from "../../api/rankingData.js" import { goods_types, Brand_goods_types } from '@/api/rankingData.js'
import { goods, update, singleUpdate, getStockNum } from "../../api/goods" import { goods, update, singleUpdate, getStockNum } from '@/api/goods'
import { orderRest } from "../../api/shop" import { orderRest } from "@/api/shop"
import Treeselect from '@riophae/vue-treeselect'
import '@riophae/vue-treeselect/dist/vue-treeselect.css'
export default { export default {
components: { Treeselect },
data() { data() {
return { return {
editPriceId: '', //id editPriceId: '', //id
@ -392,7 +396,7 @@
other_num: 0, // other_num: 0, //
radio: '', // radio: '', //
brand: [], // brand: [], //
cate: [], // treeList: [], //
loading: true, loading: true,
tableData: [], // tableData: [], //
shopsData: [], // shopsData: [], //
@ -418,7 +422,7 @@
form: { form: {
external_sku_id: '', external_sku_id: '',
goods_title: '', // goods_title: '', //
type_id: '', // id type_id: null, // id
brand_id: '', // id brand_id: '', // id
sku_title: '', // sku_title: '', //
status: '', // status: '', //
@ -542,6 +546,7 @@
// //
return _newPar return _newPar
} }
newObj.type_id = newObj.type_id || ''
goods(newObj).then((res) => { goods(newObj).then((res) => {
this.tableData = res.data.data this.tableData = res.data.data
this.tableData = this.tableData.map((item) => { this.tableData = this.tableData.map((item) => {
@ -561,7 +566,7 @@
this.form = { this.form = {
external_sku_id: '', external_sku_id: '',
goods_title: '', // goods_title: '', //
type_id: '', // id type_id: null, // id
brand_id: '', // id brand_id: '', // id
sku_title: '', // sku_title: '', //
status: '' // status: '' //
@ -958,7 +963,7 @@
per_page: 99999 per_page: 99999
} }
goods_types(param).then((res) => { goods_types(param).then((res) => {
this.cate = res.data.data this.treeList = JSON.parse(JSON.stringify(res.data.data).replace(/name/g, "label"))
}) })
}, },

View File

@ -1,188 +1,202 @@
<template> <template>
<div class="conent"> <div class="pageBox">
<!-- 新增按钮 --> <el-card>
<el-button type="primary" @click="handAdd">新增</el-button> <div class="opaBox">
<el-button type="primary" icon="el-icon-plus" @click="handleAdd">新增</el-button>
</div>
<el-table :data="tableData" border v-loading="loading" row-key="id" :tree-props="{children: 'children', hasChildren: 'hasChildren'}" style="width: 100%">
<el-table-column prop="name" label="商品种类"></el-table-column>
<el-table-column prop="" label="是否显示">
<template slot-scope="scope">
<el-switch v-model="scope.row.show" active-text="是" inactive-text="否" :active-value="1" :inactive-value="0" disabled></el-switch>
</template>
</el-table-column>
<el-table-column prop="" label="操作">
<template slot-scope="scope">
<el-button icon="el-icon-plus" @click="addSubType(scope.row)">添加子分类</el-button>
<el-button type="primary" @click="handleEdit(scope.row.id, scope.row)">编辑</el-button>
<el-button type="danger" @click="handleDel(scope.row.id)">删除</el-button>
</template>
</el-table-column>
</el-table>
</el-card>
<!-- 列表 --> <!-- 编辑 -->
<div class="table" style="margin-top: 10px"> <el-dialog :title="curId ? '编辑' : '新增'" :visible.sync="dialogVisible" width="500px">
<el-table v-loading="loading" ref="multipleTable" :data="tableData" tooltip-effect="dark" style="width: 100%" <el-form label-width="100px">
@selection-change="handleSelectionChange"> <!-- <el-form-item label="父级分类:">
<el-table-column prop="name" label="商品种类"> </el-table-column> <el-select v-model="curInfo.parent_name" placeholder="请选择父级分类" clearable @change="changeSelect">
<el-table-column prop="" label="操作"> <el-option style="height: auto;" :value="curInfo.parent_id">
<template slot-scope="scope"> <el-tree
<el-button type="primary" @click="handEdit(scope.row.id, scope.row)">编辑</el-button> :data="tableData"
<el-button type="danger" @click="handdel(scope.row.id)">删除</el-button> :props="defaultProps"
</template> @node-click="handleNodeClick">
</el-table-column> </el-tree>
</el-table> </el-option>
</div> </el-select>
</el-form-item> -->
<!-- 分页功能 --> <el-form-item label="父级分类:">
<div class="block"> <!-- <select-tree
<el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange" :value="curInfo.parent_id"
:current-page="current_page" :page-sizes="[15, 50, 100]" :page-size="per_page" :options="tableData"
layout="total, sizes, prev, pager, next, jumper" :total="Paginationdata.total"> :props="defaultProps"
</el-pagination> @getValue="getValue">
</div> </select-tree> -->
<treeselect
<!-- 新增种类对话框 --> :options="treeList"
<el-dialog title="新增" :visible.sync="dialogFormVisible" :close-on-click-modal="false"> placeholder="请选择分类"
<el-form :model="form"> v-model="curInfo.parent_id" />
<el-form-item label="商品种类" :label-width="formLabelWidth"> </el-form-item>
<el-input v-model="form.kindName" autocomplete="off"></el-input> <el-form-item label="分类名称:">
</el-form-item> <el-input v-model="curInfo.name" clearable style="width: 300px;"></el-input>
</el-form> </el-form-item>
<div slot="footer" class="dialog-footer"> <el-form-item label="是否显示:">
<el-button @click="dialogFormVisible = false"> </el-button> <el-switch v-model="curInfo.show" active-text="是" inactive-text="否" :active-value="1" :inactive-value="0"></el-switch>
<el-button type="primary" @click="addSubmit"> </el-button> </el-form-item>
</div> </el-form>
</el-dialog> <div slot="footer" class="dialog-footer">
<el-button @click="dialogVisible = false"> </el-button>
<!-- 编辑 --> <el-button type="primary" @click="commitType" :loading="btnLoading"> </el-button>
<el-dialog title="编辑" :visible.sync="dialogFormVisible1" :close-on-click-modal="false"> </div>
<el-form :model="form1"> </el-dialog>
<el-form-item label="编辑种类" :label-width="formLabelWidth1"> </div>
<el-input v-model="form1.kindName1" autocomplete="off"></el-input>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="dialogFormVisible1 = false"> </el-button>
<el-button type="primary" @click="EditSubmit"> </el-button>
</div>
</el-dialog>
</div>
</template> </template>
<script> <script>
import { import { goods_types, Delgoods_types, Addgoods_types, editGoods_types, goods_types_detail } from "@/api/rankingData"
goods_types, // import selectTree from '@/components/selectTree'
Delgoods_types, import Treeselect from '@riophae/vue-treeselect'
Addgoods_types, import '@riophae/vue-treeselect/dist/vue-treeselect.css'
editGoods_types,
} from "../../api/rankingData";
export default {
data() {
return {
id: "", //id
loading: true,
tableData: [],
multipleSelection: [],
dialogFormVisible: false,
dialogFormVisible1: false,
form: {
kindName: "", //
},
form1: {
kindName1: "", //
},
formLabelWidth: "120px",
formLabelWidth1: "120px",
newKind: [],
Paginationdata: {}, //
current_page: 1, //
per_page: 15, //
};
},
mounted() {
this.getGoods_types();
},
methods: {
//
handleSelectionChange(val) {
this.multipleSelection = val;
},
// export default {
handleSizeChange(val) { components: { Treeselect },
// data() {
this.per_page = val; return {
this.getGoods_types(); loading: true,
}, btnLoading: false,
handleCurrentChange(val) { tableData: [],
// dialogVisible: false,
this.current_page = val; curInfo: {
this.getGoods_types(); parent_id: null,
}, name: '',
// show: 1
handAdd() { },
this.form.kindName = ""; curId: 0,
this.dialogFormVisible = true; defaultProps: {
}, value: 'id',
// label: 'name',
addSubmit() { children: 'children'
var string; },
string = this.form.kindName.replace(/\s/g, ",").split(","); treeList: []
Addgoods_types({ }
names: string, },
}).then((res) => { mounted() {
this.$message({ this.getGoods_types()
type: "success", },
message: "添加成功", methods: {
}); //
this.getGoods_types(); handleAdd() {
}); this.curInfo = {
this.dialogFormVisible = false; id: 0,
}, parent_id: null,
// name: '',
handEdit(id, item) { show: 1
this.id = id; }
this.form1.kindName1 = item.name; this.dialogVisible = true
this.dialogFormVisible1 = true;
},
//
EditSubmit() {
editGoods_types(this.id, {
name: this.form1.kindName1,
}).then((res) => {
this.$message({
type: "success",
message: "编辑成功",
});
this.getGoods_types();
});
this.dialogFormVisible1 = false;
},
//
handdel(id) {
this.$confirm("确定删除此条商品种类吗?", "确认删除", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
})
.then(() => {
Delgoods_types(id).then((res) => {
this.getGoods_types();
});
this.$message({
type: "success",
message: "删除成功!",
});
})
.catch(() => {
this.$message({
type: "info",
message: "已取消删除",
});
});
},
//
getGoods_types() {
let page = {
page: this.current_page,
per_page: this.per_page,
};
goods_types(page).then((res) => {
this.tableData = res.data.data;
this.Paginationdata = res.data.meta;
});
this.loading = false;
},
}, },
}; addSubType(row) {
this.curInfo = {
id: 0,
parent_id: row.id,
name: '',
show: 1
}
this.dialogVisible = true
},
//
handleEdit(id, item) {
this.id = id
this.curInfo = JSON.parse(JSON.stringify(item))
if(item.parent_id) {
goods_types_detail(item.parent_id).then((res) => {
this.dialogVisible = true
})
} else {
this.curInfo.parent_id = null
this.dialogVisible = true
}
},
//
commitType() {
this.btnLoading = true
let params = {
...this.curInfo
}
params.parent_id = params.parent_id || 0
if(this.curInfo.id) {
editGoods_types(this.curInfo.id, params).then((res) => {
this.btnLoading = false
this.$message({ type: 'success', message: '编辑成功' })
this.getGoods_types()
this.dialogVisible = false
}).catch(() => {
this.btnLoading = false
})
} else {
Addgoods_types(params).then((res) => {
this.btnLoading = false
this.$message({ type: 'success', message: '添加成功' })
this.getGoods_types()
this.dialogVisible = false
}).catch(() => {
this.btnLoading = false
})
}
},
handleDel(id) {
this.$confirm("确定删除此条商品种类吗?", "确认删除", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
Delgoods_types(id).then((res) => {
this.$message({ type: 'success', message: '删除成功!' })
this.getGoods_types()
})
})
},
//
getGoods_types() {
let page = {
parent_id: 0
}
goods_types(page).then((res) => {
this.tableData = res.data.data
this.treeList = JSON.parse(JSON.stringify(res.data.data).replace(/name/g, "label"))
console.log(this.treeList)
})
this.loading = false
},
handleNodeClick(row) {
this.curInfo.parent_name = row.name
this.curInfo.parent_id = row.id
},
changeSelect(row) {
if(!row) {
this.curInfo.parent_name = ''
this.curInfo.parent_id = ''
}
},
getValue(row) {
console.log(row)
this.curInfo.parent_id = row ? row : ''
}
}
}
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.block { .opaBox{
margin-top: 20px; margin-bottom: 15px;
} }
</style> </style>

View File

@ -53,6 +53,14 @@
<el-table-column prop="refund_amount" label="退款金额" /> <el-table-column prop="refund_amount" label="退款金额" />
<el-table-column prop="refund_shipping_amount" label="用户申请退运费金额" /> <el-table-column prop="refund_shipping_amount" label="用户申请退运费金额" />
<el-table-column prop="reason" label="退款原因" /> <el-table-column prop="reason" label="退款原因" />
<el-table-column prop="description" label="描述" />
<el-table-column label="退款图片" width="220">
<template slot-scope="scope">
<div class="imgBox" v-if="scope.row.image_list">
<el-image v-for="(it, i) in scope.row.image_list" :key="i" :src="it" :preview-src-list="scope.row.image_list" class="img"></el-image>
</div>
</template>
</el-table-column>
<el-table-column prop="apply_type" label="申请类型" /> <el-table-column prop="apply_type" label="申请类型" />
<el-table-column label="售后单状态"> <el-table-column label="售后单状态">
<template slot-scope="scope"> <template slot-scope="scope">
@ -187,4 +195,12 @@ export default {
align-items: center; align-items: center;
} }
} }
.imgBox{
.img{
width: 55px;
height: 55px;
border-radius: 4px;
margin: 3px;
}
}
</style> </style>

View File

@ -1,7 +1,7 @@
<template> <template>
<div class="conent"> <div class="pageBox">
<div class="table" style="margin-top: 10px"> <el-card>
<el-table v-loading="loading" :data="tableData" style="width: 100%"> <el-table border v-loading="loading" :data="tableData" style="width: 100%">
<el-table-column prop="name" label="店铺名称"></el-table-column> <el-table-column prop="name" label="店铺名称"></el-table-column>
<el-table-column prop="ship.expires_at" label="授权过期时间点"></el-table-column> <el-table-column prop="ship.expires_at" label="授权过期时间点"></el-table-column>
<el-table-column prop="ship.owner_id" label="商家店铺id"></el-table-column> <el-table-column prop="ship.owner_id" label="商家店铺id"></el-table-column>
@ -26,7 +26,7 @@
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
</div> </el-card>
<!-- 发货信息 --> <!-- 发货信息 -->

View File

@ -1,11 +1,12 @@
<template> <template>
<div class="conent"> <div class="pageBox">
<!-- 新增按钮 --> <el-card>
<el-button type="success" @click="handAdd">新增</el-button> <div class="opaBox">
<el-button type="primary" @click="syncShopStock('all')">同步所有店铺库存</el-button> <el-button type="primary" icon="el-icon-plus" @click="handAdd">新增</el-button>
<el-button type="primary" icon="el-icon-refresh" @click="syncShopStock('all')">同步所有店铺库存</el-button>
</div>
<div class="table" style="margin-top: 10px"> <el-table border v-loading="loading" :data="tableData" style="width: 100%">
<el-table v-loading="loading" :data="tableData" style="width: 100%">
<el-table-column prop="name" label="店铺名称"> <el-table-column prop="name" label="店铺名称">
</el-table-column> </el-table-column>
<el-table-column prop="plat_id" label="所属平台"></el-table-column> <el-table-column prop="plat_id" label="所属平台"></el-table-column>
@ -17,40 +18,38 @@
</el-input> </el-input>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="操作"> <el-table-column label="操作" width="280">
<template slot-scope="scope"> <template slot-scope="scope">
<el-button type="danger" v-if="scope.row.status === '未授权'" size="small"><a :href="scope.row.authUrl" <el-button type="danger" v-if="scope.row.status === '未授权'" size="mini"><a :href="scope.row.authUrl"
target="_blank" rel="noopener noreferrer">授权</a> target="_blank" rel="noopener noreferrer">授权</a>
</el-button> </el-button>
<div v-if="scope.row.status === '已授权'"> <div v-if="scope.row.status === '已授权'">
<el-button type="success" :disabled="true" size="small">{{ scope.row.status }}</el-button> <el-button type="success" :disabled="true" size="mini">{{ scope.row.status }}</el-button>
<el-button @click="download(scope.row)" size="small">下载商品</el-button> <el-button @click="download(scope.row)" size="mini">下载商品</el-button>
<el-button type="primary" v-if="scope.row.status === '已授权'" size="small" <el-button type="primary" v-if="scope.row.status === '已授权'" size="mini"
@click="syncShopStock(scope.row.id)">同步库存</el-button> @click="syncShopStock(scope.row.id)">同步库存</el-button>
</div> </div>
<div v-if="scope.row.status === '重新授权'"> <div v-if="scope.row.status === '重新授权'">
<el-button type="danger" target="_blank" size="small"> <el-button type="danger" target="_blank" size="mini">
<a :href="scope.row.authUrl" rel="noopener noreferrer">重新授权</a> <a :href="scope.row.authUrl" rel="noopener noreferrer">重新授权</a>
</el-button> </el-button>
<el-button @click="download(scope.row)" size="small">下载商品</el-button> <el-button @click="download(scope.row)" size="mini">下载商品</el-button>
</div> </div>
<div v-if="scope.row.status === '无需授权'"> <div v-if="scope.row.status === '无需授权'">
<el-button type="success" :disabled="true" size="small">{{ scope.row.status }}</el-button> <el-button type="success" :disabled="true" size="mini">{{ scope.row.status }}</el-button>
</div> </div>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
</div> <div class="page-pagination">
<el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange"
<!-- 分页功能 --> :current-page="current_page" :page-sizes="[15, 50, 100]" :page-size="per_page"
<div class="block"> layout="total, sizes, prev, pager, next, jumper" :total="Paginationdata.total">
<el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange" </el-pagination>
:current-page="current_page" :page-sizes="[15, 50, 100]" :page-size="per_page" </div>
layout="total, sizes, prev, pager, next, jumper" :total="Paginationdata.total"> </el-card>
</el-pagination>
</div>
<!-- 新增店铺 --> <!-- 新增店铺 -->
<el-dialog title="新增店铺" :visible.sync="dialogFormVisible" :close-on-click-modal="false" width="20%"> <el-dialog title="新增店铺" :visible.sync="dialogFormVisible" :close-on-click-modal="false" width="20%">
@ -217,12 +216,12 @@ export default {
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
a { a {
text-decoration: none; text-decoration: none;
color: white; color: white;
} }
.block { .opaBox{
margin-top: 20px; margin-bottom: 15px;
} }
</style> </style>

View File

@ -7,7 +7,7 @@
<el-input v-model="filter.title" clearable></el-input> <el-input v-model="filter.title" clearable></el-input>
</div> </div>
<div class="row"> <div class="row">
<span>商品编号</span> <span>规格编码</span>
<el-input v-model="filter.external_sku_id" clearable></el-input> <el-input v-model="filter.external_sku_id" clearable></el-input>
</div> </div>
<div class="row"> <div class="row">
@ -34,7 +34,8 @@
</div> </div>
<el-table v-loading="loading" :data="supplierList" style="width: 100%" border> <el-table v-loading="loading" :data="supplierList" style="width: 100%" border>
<el-table-column prop="id" label="ID" width="80" align="center" /> <el-table-column prop="id" label="ID" width="80" align="center" />
<el-table-column prop="goods_sku.title" label="商品标题" /> <el-table-column prop="goods_sku.name" label="商品标题" />
<el-table-column prop="goods_sku.external_sku_id" label="规格编码" />
<el-table-column prop="sku_id" label="skuID" /> <el-table-column prop="sku_id" label="skuID" />
<el-table-column prop="day" label="日期" /> <el-table-column prop="day" label="日期" />
<el-table-column prop="inventory" label="盘点库存" /> <el-table-column prop="inventory" label="盘点库存" />

View File

@ -7,7 +7,7 @@
<el-input v-model="filter.title" clearable></el-input> <el-input v-model="filter.title" clearable></el-input>
</div> </div>
<div class="row"> <div class="row">
<span>商品编号</span> <span>规格编码</span>
<el-input v-model="filter.external_sku_id" clearable></el-input> <el-input v-model="filter.external_sku_id" clearable></el-input>
</div> </div>
<div class="row"> <div class="row">
@ -34,9 +34,9 @@
</div> </div>
<el-table v-loading="loading" :data="supplierList" style="width: 100%" border> <el-table v-loading="loading" :data="supplierList" style="width: 100%" border>
<el-table-column prop="id" label="ID" width="80" align="center" /> <el-table-column prop="id" label="ID" width="80" align="center" />
<el-table-column prop="goods_sku.title" label="商品标题" /> <el-table-column prop="goods_sku.name" label="商品标题" />
<el-table-column prop="sku_id" label="skuID" />
<el-table-column prop="external_sku_id" label="规格编码" /> <el-table-column prop="external_sku_id" label="规格编码" />
<el-table-column prop="sku_id" label="skuID" />
<el-table-column prop="num" label="数量" /> <el-table-column prop="num" label="数量" />
<el-table-column prop="cost" label="成本" /> <el-table-column prop="cost" label="成本" />
<el-table-column prop="buyer_name" label="采购人姓名" /> <el-table-column prop="buyer_name" label="采购人姓名" />

View File

@ -7,7 +7,7 @@
<el-input v-model="filter.title" clearable></el-input> <el-input v-model="filter.title" clearable></el-input>
</div> </div>
<div class="row"> <div class="row">
<span>商品编号</span> <span>规格编码</span>
<el-input v-model="filter.external_sku_id" clearable></el-input> <el-input v-model="filter.external_sku_id" clearable></el-input>
</div> </div>
<div class="row"> <div class="row">
@ -34,12 +34,12 @@
</div> </div>
<el-table v-loading="loading" :data="procureList" style="width: 100%" border> <el-table v-loading="loading" :data="procureList" style="width: 100%" border>
<el-table-column prop="sku_id" label="商品id" width="80" align="center" /> <el-table-column prop="sku_id" label="商品id" width="80" align="center" />
<el-table-column prop="goods_sku.title" label="商品标题" /> <el-table-column prop="goods_sku.name" label="商品标题" />
<el-table-column prop="external_sku_id" label="商品编号" /> <el-table-column prop="external_sku_id" label="规格编码" />
<el-table-column prop="num" label="采购数量" /> <el-table-column prop="num" label="采购数量" />
<el-table-column prop="cost" label="采购成本" /> <el-table-column prop="cost" label="采购成本" />
<el-table-column prop="buyer_name" label="采购人名称" /> <el-table-column prop="buyer_name" label="采购人名称" />
<el-table-column prop="status" label="状态" /> <!-- <el-table-column prop="status" label="状态" /> -->
<el-table-column prop="expire_time" label="保质期时间" /> <el-table-column prop="expire_time" label="保质期时间" />
<el-table-column prop="supplier_name" label="供应商"> <el-table-column prop="supplier_name" label="供应商">
<template slot-scope="scope"> <template slot-scope="scope">
@ -119,6 +119,8 @@
<script> <script>
import { getPurchaseLog, addPurchaseLog, updatePurchaseLog } from "@/api/supplyChain" import { getPurchaseLog, addPurchaseLog, updatePurchaseLog } from "@/api/supplyChain"
import axios from "axios"
export default { export default {
data() { data() {
return { return {
@ -217,7 +219,7 @@ export default {
if(this.fileList.length) { if(this.fileList.length) {
this.commitloading = true this.commitloading = true
const params = new FormData(); const params = new FormData();
params.append("lossFile", this.fileList[0].raw) params.append("purchaseFile", this.fileList[0].raw)
let token = localStorage.getItem("token") let token = localStorage.getItem("token")
axios.post("/api/purchase_record/purchase_import", params, { axios.post("/api/purchase_record/purchase_import", params, {
headers: { headers: {

View File

@ -10,9 +10,10 @@
<el-table-column prop="company_name" label="供应商ID" /> <el-table-column prop="company_name" label="供应商ID" />
<el-table-column prop="address" label="地址" /> <el-table-column prop="address" label="地址" />
<el-table-column prop="link_tel" label="联系方式" align="center" /> <el-table-column prop="link_tel" label="联系方式" align="center" />
<el-table-column prop="supply_type" label="供应品类" />
<el-table-column prop="payment_account" label="支付账户" /> <el-table-column prop="payment_account" label="支付账户" />
<el-table-column prop="agent_name" label="代理名称" /> <el-table-column prop="agent_name" label="开发维护人" />
<el-table-column prop="agent_id" label="代理人id" /> <!-- <el-table-column prop="agent_id" label="代理人id" /> -->
<el-table-column prop="created_at" label="创建时间" align="center" /> <el-table-column prop="created_at" label="创建时间" align="center" />
<el-table-column label="操作" width="180" align="center"> <el-table-column label="操作" width="180" align="center">
<template slot-scope="scope"> <template slot-scope="scope">
@ -34,7 +35,7 @@
</div> </div>
</el-card> </el-card>
<el-dialog :title="gysInfo.id ? '编辑' : '新增供应商'" :visible.sync="dialogVisible" width="500px"> <el-dialog :title="gysInfo.id ? '编辑' : '新增'" :visible.sync="dialogVisible" width="500px">
<el-form label-width="100px"> <el-form label-width="100px">
<el-form-item label="供应商名称"> <el-form-item label="供应商名称">
<el-input v-model="gysInfo.supplier_name" clearable></el-input> <el-input v-model="gysInfo.supplier_name" clearable></el-input>
@ -48,6 +49,9 @@
<el-form-item label="联系方式"> <el-form-item label="联系方式">
<el-input v-model="gysInfo.link_tel" clearable></el-input> <el-input v-model="gysInfo.link_tel" clearable></el-input>
</el-form-item> </el-form-item>
<el-form-item label="供应品类">
<el-input v-model="gysInfo.supply_type" clearable></el-input>
</el-form-item>
<el-form-item label="支付方式"> <el-form-item label="支付方式">
<el-input v-model="gysInfo.payment_account" clearable></el-input> <el-input v-model="gysInfo.payment_account" clearable></el-input>
</el-form-item> </el-form-item>