1、采购管理拆分为商品采购和质检入库

This commit is contained in:
DESKTOP-8FGKA8Q\chunfen 2024-09-03 17:34:54 +08:00
parent fb52234ee5
commit cb56e5a227
13 changed files with 832 additions and 66 deletions

View File

@ -39,6 +39,14 @@ export function getPurchaseLog(params) {
}) })
} }
export function examinePurchase(data) {
return http({
url: "/api/purchase_record/purchase_batch_check",
method: "post",
data
})
}
export function addPurchaseLog(data) { export function addPurchaseLog(data) {
return http({ return http({
url: "/api/supplier/purchase_record", url: "/api/supplier/purchase_record",

View File

@ -0,0 +1,198 @@
<template>
<el-dialog :visible.sync="show" title="新增商品" width="900px" @close="closeDialog" :close-on-click-modal="false">
<el-form label-width="120px" :inline="true">
<el-form-item label="商品品种/品类:">
<treeselect
:options="treeList"
style="width: 200px;"
:disable-branch-nodes="true"
:show-count="true"
:normalizer="normalizer"
placeholder="请选择品种"
v-model="type_id">
<div slot="value-label" slot-scope="{ node }">{{ parseLabel(node) }}</div>
</treeselect>
</el-form-item>
<div v-for="(item, i) in skus" :key="i" class="skuBox">
<div class="tit">规格{{ i + 1 }}</div>
<el-form-item label="规格名称:">
<el-input placeholder="规格名称" v-model="item.title"></el-input>
</el-form-item>
<el-form-item label="颜色/特性:">
<el-input placeholder="颜色/特性" v-model="item.attribute"></el-input>
</el-form-item>
<el-form-item label="商品状态:">
<el-select v-model="item.status" placeholder="下架(默认)" style="width: 200px;">
<el-option v-for="it in options" :key="it.id" :label="it.label" :value="it.id">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="商品成本:">
<el-input v-model="item.cost" placeholder="商品成本">
</el-input>
</el-form-item>
<div>
<el-form-item label="可售库存:">
<el-input v-model="item.sale_stock" placeholder="可售库存">
</el-input>
</el-form-item>
<el-form-item label="最终编码:">
<el-input v-model="item.external_sku_id" placeholder="不输入自动生成"></el-input>
</el-form-item>
<el-form-item label="">
<el-button type="danger" @click="handleDelete(i)" size="mini" icon="el-icon-delete">删除</el-button>
</el-form-item>
</div>
</div>
<div>
<el-form-item>
<el-button type="success" @click="toAddSku()" icon="el-icon-plus">增加规格</el-button>
</el-form-item>
</div>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button type="primary" @click="handleSave()" :loading="loading">保存</el-button>
<el-button plain @click="cancel()">取消</el-button>
</span>
</el-dialog>
</template>
<script>
import { addGoods } from '@/api/goods.js'
import { goods_types } from '@/api/rankingData.js'
import Treeselect from '@riophae/vue-treeselect'
import '@riophae/vue-treeselect/dist/vue-treeselect.css'
export default {
components: { Treeselect },
props: {
show: {
type: Boolean,
default: () => {
return false
}
}
},
data() {
return {
showDialog: false,
treeList: [],
skus: [],
type_id: null,
options: [
{ id: 0, label: "下架" },
{ id: 1, label: "在售" }
],
loading: false
}
},
methods: {
getGoodsTypes() {
let params = {
parent_id: 0
}
goods_types(params).then((res) => {
this.treeList = JSON.parse(JSON.stringify(res.data.data).replace(/name/g, "label"))
})
},
//
handleSave() {
this.loading = true
let skus = this.skus
let params = {
type_id: this.type_id || '',
goods_id: '',
skus: skus
}
addGoods(params).then((res) => {
this.$message({ message: '商品添加成功!', type: 'success' })
this.loading = false
this.closeDialog()
this.$emit('complete')
}).catch(() => {
this.loading = false
})
},
toAddSku() {
if(!this.type_id) {
this.$message({ message: "请选择商品品种/品类", type: "error" })
return
}
this.handleAdd()
},
handleAdd() {
let sku = {
title: '',
external_sku_id: '',
status: 0,
num: 0,
cost: 0,
sale_stock: 9999,
reserve: 0,
attribute: ''
}
this.skus.push(sku)
},
handleDelete(index) {
this.skus.splice(index, 1)
},
cancel() {
this.closeDialog()
},
normalizer(node) {
if ((!node.children || (node.children && node.children.length == 0)) && node.level == 1) {
node.isDisabled = true
}
return node
},
parseLabel(node) {
let text = ''
text += node.parentNode ? node.parentNode.label + ' / ' : ''
text += node.raw ? node.raw.label : ''
return text
},
closeDialog() {
this.showDialog = false
this.$emit('close')
}
},
watch: {
show: {
handler(newVal, oldVal) {
if (newVal) {
this.skus = []
this.showDialog = true
this.handleAdd()
this.getGoodsTypes()
}
},
deep: true,
immediate: true
}
}
}
</script>
<style scoped lang="scss">
.skuBox{
border: 1px solid #e5e5e5;
border-radius: 5px;
padding: 15px 0;
margin-bottom: 15px;
background-color: #f3f3f3;
.tit{
padding-left: 40px;
font-weight: 600;
font-size: 15px;
margin-bottom: 15px;
}
}
</style>

View File

@ -0,0 +1,194 @@
<template>
<el-dialog :visible.sync="show" title="编辑商品" width="900px" @close="closeDialog" :close-on-click-modal="false">
<el-form label-width="120px" :inline="true">
<el-form-item label="商品品种/品类:">
<treeselect
:options="treeList"
style="width: 200px;"
:disable-branch-nodes="true"
:show-count="true"
:normalizer="normalizer"
placeholder="请选择品种"
v-model="goodsInfo.goods.type_id">
<div slot="value-label" slot-scope="{ node }">{{ parseLabel(node) }}</div>
</treeselect>
</el-form-item>
<el-form-item label="规格名称:">
<el-input placeholder="规格名称" v-model="goodsInfo.title"></el-input>
</el-form-item>
<el-form-item label="最终编码:">
<el-input v-model="goodsInfo.external_sku_id" placeholder="不输入自动生成" disabled></el-input>
</el-form-item>
<el-form-item label="颜色/特性:">
<el-input placeholder="颜色/特性" v-model="goodsInfo.attribute"></el-input>
</el-form-item>
<el-form-item label="商品状态:">
<el-select v-model="goodsInfo.status" placeholder="下架(默认)" style="width: 200px;">
<el-option v-for="it in options" :key="it.id" :label="it.label" :value="it.id">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="商品成本:">
<el-input v-model="goodsInfo.cost" placeholder="商品成本">
</el-input>
</el-form-item>
<el-form-item label="在售库存:">
<el-input v-model="goodsInfo.sale_stock" placeholder="可售库存"></el-input>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button type="primary" @click="handleSave()" :loading="loading">保存</el-button>
<el-button plain @click="cancel()">取消</el-button>
</span>
</el-dialog>
</template>
<script>
import { updateGoods, checkGoods } from '@/api/goods.js'
import { goods_types } from '@/api/rankingData.js'
import Treeselect from '@riophae/vue-treeselect'
import '@riophae/vue-treeselect/dist/vue-treeselect.css'
export default {
components: { Treeselect },
props: {
show: {
type: Boolean,
default: () => {
return false
}
},
id: {
type: Number,
default: () => {
return 0
}
}
},
data() {
return {
goods_id: 0,
showDialog: false,
treeList: [],
skus: [],
type_id: null,
options: [
{ id: '下架', label: '下架' },
{ id: '在售', label: '在售' }
],
loading: false,
goodsInfo: {
goods: {
type_id: null
}
}
}
},
methods: {
getGoodsTypes() {
let params = {
parent_id: 0
}
goods_types(params).then((res) => {
this.treeList = JSON.parse(JSON.stringify(res.data.data).replace(/name/g, "label"))
})
},
//
handleSave() {
this.loading = true
let goods = {
title: this.goodsInfo.goods.title,
img_url: this.goodsInfo.goods.img_url,
type_id: this.goodsInfo.goods.type_id || '',
brand_id: this.goodsInfo.goods.brand_id,
goods_code: this.goodsInfo.goods.goods_code
}
let sku = {
title: this.goodsInfo.title,
external_sku_id: this.goodsInfo.external_sku_id,
status: this.goodsInfo.status,
num: this.goodsInfo.num,
cost: this.goodsInfo.cost,
sale_stock: this.goodsInfo.sale_stock,
thumb_url: this.goodsInfo.thumb_url,
attribute: this.goodsInfo.attribute
}
if (sku.status == '下架') {
sku.status = 0
} else if (sku.status == '在售') {
sku.status = 1
}
let params = {
goods_id: this.goodsInfo.goods_id,
goods,
sku
}
updateGoods(this.goods_id, params).then((res) => {
this.$message({ type: 'success', message: '编辑成功' })
this.loading = false
this.closeDialog()
this.$emit('complete')
}).catch(() => {
this.loading = false
})
},
getGoodsInfo() {
checkGoods(this.goods_id).then((res) => {
this.goodsInfo = res.data.data
this.goodsInfo.goods.type_id = this.goodsInfo.goods.type_id || null
})
},
cancel() {
this.closeDialog()
},
normalizer(node) {
if ((!node.children || (node.children && node.children.length == 0)) && node.level == 1) {
node.isDisabled = true
}
return node
},
parseLabel(node) {
let text = ''
text += node.parentNode ? node.parentNode.label + ' / ' : ''
text += node.raw ? node.raw.label : ''
return text
},
closeDialog() {
this.showDialog = false
this.$emit('close')
}
},
watch: {
id(newVal, oldVal) {
this.goods_id = newVal
},
show(newVal, oldVal) {
if (newVal) {
this.showDialog = true
this.getGoodsInfo()
this.getGoodsTypes()
}
}
}
}
</script>
<style scoped lang="scss">
.skuBox{
border: 1px solid #e5e5e5;
border-radius: 5px;
padding: 15px 0;
margin-bottom: 15px;
background-color: #f3f3f3;
.tit{
padding-left: 40px;
font-weight: 600;
font-size: 15px;
margin-bottom: 15px;
}
}
</style>

View File

@ -142,17 +142,22 @@ const list = [
}, },
{ {
path: "PURCHASE_RECORD", path: "PURCHASE_RECORD",
name: "入库采购", name: "商品采购",
component: () => import("../views/supplyChain/procureLog.vue") component: () => import("../views/supplyChain/procureLog.vue")
}, },
{
path: "PURCHASE_RECORD_CHECK",
name: "质检入库",
component: () => import("../views/supplyChain/procureCheck.vue")
},
{ {
path: "LOSS_RECORD", path: "LOSS_RECORD",
name: "报损记录", name: "仓库报损",
component: () => import("../views/supplyChain/lossRecord.vue") component: () => import("../views/supplyChain/lossRecord.vue")
}, },
{ {
path: "DAILY_STOCK_RECORD", path: "DAILY_STOCK_RECORD",
name: "每日盘点记录", name: "库存盘点",
component: () => import("../views/supplyChain/dailyStock.vue") component: () => import("../views/supplyChain/dailyStock.vue")
} }
] ]

View File

@ -76,6 +76,7 @@
console.log(res.data.roles) console.log(res.data.roles)
if(res.data.roles && res.data.roles[0]) { if(res.data.roles && res.data.roles[0]) {
localStorage.setItem("roleName", res.data.roles[0].name) localStorage.setItem("roleName", res.data.roles[0].name)
localStorage.setItem("userId", res.data.id)
this.$message({ this.$message({
message: "成功登录,欢迎来到后台管理系统", message: "成功登录,欢迎来到后台管理系统",
type: "success" type: "success"

View File

@ -40,6 +40,7 @@
<div slot="value-label" slot-scope="{ node }">{{ parseLabel(node) }}</div> <div slot="value-label" slot-scope="{ node }">{{ parseLabel(node) }}</div>
</treeselect> </treeselect>
</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 brandList" :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">
@ -52,6 +53,9 @@
<el-form-item label="规格名称:"> <el-form-item label="规格名称:">
<el-input placeholder="规格名称" v-model="item.title"></el-input> <el-input placeholder="规格名称" v-model="item.title"></el-input>
</el-form-item> </el-form-item>
<el-form-item label="颜色/特性:">
<el-input placeholder="颜色/特性" v-model="item.attribute"></el-input>
</el-form-item>
<el-form-item label="商品状态:"> <el-form-item label="商品状态:">
<el-select v-model="item.status" placeholder="下架(默认)"> <el-select v-model="item.status" placeholder="下架(默认)">
<el-option v-for="it in options" :key="it.id" :label="it.label" :value="it.id"> <el-option v-for="it in options" :key="it.id" :label="it.label" :value="it.id">
@ -117,7 +121,7 @@
img_url: "", img_url: "",
type_id: null, // Treeselectnull type_id: null, // Treeselectnull
brand_id: "", brand_id: "",
goods_code: "", goods_code: ""
}, },
// //
options: [ options: [
@ -227,7 +231,8 @@
num: 0, num: 0,
cost: 0, cost: 0,
sale_stock: 9999, sale_stock: 9999,
reserve: 0 reserve: 0,
attribute: ''
}; };
this.skus.push(sku); this.skus.push(sku);
}, },

View File

@ -96,24 +96,24 @@
<el-form-item label="商品编码" prop="external_sku_id"> <el-form-item label="商品编码" prop="external_sku_id">
<el-input v-model="dynamicValidateForm.external_sku_id"></el-input> <el-input v-model="dynamicValidateForm.external_sku_id"></el-input>
</el-form-item> </el-form-item>
<el-form-item v-for="(item, index) in dynamicValidateForm.combination_goods" :label="'子商品' + index" <el-form-item v-for="(item, index) in dynamicValidateForm.combination_goods" :label="'花材' + (index + 1)"
:key="item.item_id" :prop="'combination_goods.' + index + '.item_id'" :rules="{ :key="item.item_id" :prop="'combination_goods.' + index + '.item_id'" :rules="{
required: true, message: '子商品不能为空', trigger: 'blur' required: true, message: '子商品不能为空', trigger: 'blur'
}"> }">
<el-col :span="8"> <div style="display: flex;align-items: center;">
<el-select v-model="item.item_id" filterable remote reserve-keyword placeholder="请选择子商品" <el-select v-model="item.item_id" filterable remote reserve-keyword placeholder="请选择子商品"
:remote-method="remoteMethod" :loading="remoteLoading"> :remote-method="remoteMethod" :loading="remoteLoading" style="width: 240px;">
<el-option v-for="sku in skus" :key="sku.id" :label="sku.title" :value="sku.id"></el-option> <el-option v-for="sku in skus" :key="sku.id" :label="sku.title" :value="sku.id"></el-option>
</el-select> </el-select>
</el-col> <el-input v-model="item.item_num" placeholder="数量" style="width: 120px;margin: 0 10px"></el-input>
<el-col :span="2"> <el-button type="danger" size="mini" @click.prevent="removeItem(index)">删除</el-button>
<el-input v-model="item.item_num" placeholder="数量"></el-input> </div>
</el-col> </el-form-item>
<el-button type="danger" @click.prevent="removeItem(index)">删除</el-button> <el-form-item label=" ">
<el-button @click="addItem" icon="el-icon-plus">添加花材</el-button>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" @click="submitForm('dynamicValidateForm')">提交</el-button> <el-button type="primary" @click="submitForm('dynamicValidateForm')">提交</el-button>
<el-button @click="addItem">添加子商品</el-button>
<el-button @click="resetForm('dynamicValidateForm')">重置</el-button> <el-button @click="resetForm('dynamicValidateForm')">重置</el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>

View File

@ -38,6 +38,7 @@
<div slot="value-label" slot-scope="{ node }">{{ parseLabel(node) }}</div> <div slot="value-label" slot-scope="{ node }">{{ parseLabel(node) }}</div>
</treeselect> </treeselect>
</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">
@ -52,6 +53,9 @@
<el-form-item label="最终编码:"> <el-form-item label="最终编码:">
<el-input v-model="goodsData.external_sku_id" placeholder="规格编码" disabled></el-input> <el-input v-model="goodsData.external_sku_id" placeholder="规格编码" disabled></el-input>
</el-form-item> </el-form-item>
<el-form-item label="颜色/特性:">
<el-input placeholder="颜色/特性" v-model="goodsData.attribute"></el-input>
</el-form-item>
<el-form-item label="商品状态:"> <el-form-item label="商品状态:">
<el-select v-model="goodsData.status"> <el-select v-model="goodsData.status">
<el-option v-for="item in options" :key="item.id" :label="item.label" :value="item.id"> <el-option v-for="item in options" :key="item.id" :label="item.label" :value="item.id">
@ -126,6 +130,7 @@ export default {
sale_stock: '', sale_stock: '',
external_sku_id: "", external_sku_id: "",
thumb_url: [], thumb_url: [],
attribute: '',
goods: { goods: {
img_url: "", img_url: "",
title: "", title: "",
@ -243,7 +248,8 @@ export default {
num: this.goodsData.num, num: this.goodsData.num,
cost: this.goodsData.cost, cost: this.goodsData.cost,
sale_stock: this.goodsData.sale_stock, sale_stock: this.goodsData.sale_stock,
thumb_url: this.goodsData.thumb_url thumb_url: this.goodsData.thumb_url,
attribute: this.goodsData.attribute
}; };
if (sku.status == "下架") { if (sku.status == "下架") {
sku.status = 0; sku.status = 0;

View File

@ -84,7 +84,7 @@
<!-- 表格 --> <!-- 表格 -->
<el-table v-loading="loading" ref="multipleTable" border :data="tableData" class="table" tooltip-effect="dark" <el-table v-loading="loading" ref="multipleTable" border :data="tableData" class="table" tooltip-effect="dark"
style="width: 100%" @selection-change="handleSelectionChange" max-height="1500"> style="width: 100%" @selection-change="handleSelectionChange">
<!-- 多选框 --> <!-- 多选框 -->
<el-table-column type="selection" align="center"></el-table-column> <el-table-column type="selection" align="center"></el-table-column>
<el-table-column label="商品信息" width="300"> <el-table-column label="商品信息" width="300">
@ -94,19 +94,19 @@
<div> <div>
<div class="tit">{{ scope.row.name }}</div> <div class="tit">{{ scope.row.name }}</div>
<p>{{ scope.row.external_sku_id }}</p> <p>{{ scope.row.external_sku_id }}</p>
<p>{{ scope.row.goods && scope.row.goods.updated_at }}</p> <p>{{ scope.row.updated_at }}</p>
</div> </div>
</div> </div>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="品类/品种" align="center"> <!-- <el-table-column label="品类/品种" align="center">
<template slot-scope="scope"> <template slot-scope="scope">
<div v-if="scope.row.goods && scope.row.goods.type"> <div v-if="scope.row.goods && scope.row.goods.type">
<span>{{ scope.row.goods.type.parent_type ? scope.row.goods.type.parent_type.name : '-' }} / </span> <span>{{ scope.row.goods.type.parent_type ? scope.row.goods.type.parent_type.name : '-' }} / </span>
<span>{{ scope.row.goods.type.name || '-' }}</span> <span>{{ scope.row.goods.type.name || '-' }}</span>
</div> </div>
</template> </template>
</el-table-column> </el-table-column> -->
<!-- <el-table-column label="规格" prop="title"></el-table-column> --> <!-- <el-table-column label="规格" prop="title"></el-table-column> -->
<!-- <el-table-column label="品牌"> <!-- <el-table-column label="品牌">
<template slot-scope="scope"> <template slot-scope="scope">
@ -126,9 +126,9 @@
</template> </template>
</el-table-column> --> </el-table-column> -->
<el-table-column prop="cost" sortable label="成本" align="center"> <el-table-column prop="cost" label="成本" align="center">
<template slot-scope="scope"> <template slot-scope="scope">
<div class="flex"> <div class="flex" style="justify-content: center;">
<div v-if="isShow"> <div v-if="isShow">
<el-input v-model="scope.row.cost"></el-input> <el-input v-model="scope.row.cost"></el-input>
</div> </div>
@ -227,7 +227,7 @@
</template> </template>
</el-table-column> --> </el-table-column> -->
<el-table-column prop="stock" sortable label="当前实际库存" align="center"></el-table-column> <el-table-column prop="yesterday_num" label="实际库存" align="center"></el-table-column>
<el-table-column prop="sale_stock" label="可售库存"> <el-table-column prop="sale_stock" label="可售库存">
<template slot-scope="scope"> <template slot-scope="scope">
<div class="titBox" v-if="scope.row.edit"> <div class="titBox" v-if="scope.row.edit">
@ -237,14 +237,18 @@
</div> </div>
<div v-else>{{scope.row.sale_stock}} <div v-else>{{scope.row.sale_stock}}
<span style="color: #409eff;margin-left: 5px;cursor: pointer;font-size: 15px;" <span style="color: #409eff;margin-left: 5px;cursor: pointer;font-size: 15px;"
@click="showEdit(scope.row, scope.$index)"> @click="openSaleEdit(scope.row, scope.$index)">
<i class="el-icon-edit"></i> <i class="el-icon-edit"></i>
</span> </span>
</div> </div>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="剩余库存" sortable align="center" prop="stock">
<el-table-column align="center"> <template slot-scope="scope">
<span :class="scope.row.stock * 1 < 0 ? 'red' : ''">{{ scope.row.stock }}</span>
</template>
</el-table-column>
<!-- <el-table-column align="center">
<template slot="header" slot-scope="scope"> <template slot="header" slot-scope="scope">
<span>销存比例</span> <span>销存比例</span>
<el-tooltip class="item" effect="dark" content="当前库存/当天7点盘点的库存" placement="top"> <el-tooltip class="item" effect="dark" content="当前库存/当天7点盘点的库存" placement="top">
@ -254,7 +258,7 @@
<template slot-scope="scope"> <template slot-scope="scope">
<span :class="scope.row.sale_ratio * 1 < 20 ? 'red' : ''">{{ scope.row.sale_ratio }}%</span> <span :class="scope.row.sale_ratio * 1 < 20 ? 'red' : ''">{{ scope.row.sale_ratio }}%</span>
</template> </template>
</el-table-column> </el-table-column> -->
<!-- <el-table-column prop="address" sortable label="盘点"> <!-- <el-table-column prop="address" sortable label="盘点">
<template slot-scope="scope"> <template slot-scope="scope">
@ -272,12 +276,10 @@
<el-table-column prop="status" label="状态" align="center"></el-table-column> <el-table-column prop="status" label="状态" align="center"></el-table-column>
<el-table-column label="操作" align="center" width="120" v-if="is_admin"> <el-table-column label="操作" align="center" width="120" v-if="is_admin">
<template slot-scope="scope"> <template slot-scope="scope">
<div style="text-align: center;width: 100%;"> <!-- <el-button type="text" @click="ejectstock(scope.row)">库存</el-button> -->
<!-- <el-button type="text" @click="ejectstock(scope.row)">库存</el-button> --> <el-button type="text" @click="handleEdit(scope.row.id)">编辑</el-button>
<el-button type="text" @click="handleEdit(scope.row.id)">编辑</el-button> <!-- <el-button type="text" @click="goodslog(scope.row)">记录</el-button> -->
<!-- <el-button type="text" @click="goodslog(scope.row)">记录</el-button> --> <!-- <el-button type="text" @click="deleteSku(scope.row)">删除</el-button> -->
<!-- <el-button type="text" @click="deleteSku(scope.row)">删除</el-button> -->
</div>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
@ -285,16 +287,21 @@
<!-- 底部按钮 --> <!-- 底部按钮 -->
<div class="footerBtn" v-show="isShow || stock"> <div class="footerBtn" v-show="isShow || stock">
<el-button type="primary" class="confirmbtn" @click="cancel()">取消</el-button> <el-button type="primary" class="confirmbtn" @click="cancel()">取消</el-button>
<el-button type="primary" class="confirmbtn" @click="onSubmit()">保存</el-button> <el-button type="primary" class="confirmbtn" @click="onSubmit()">保存</el-button>
</div> </div>
<!-- 分页功能 --> <!-- 分页功能 -->
<div class="page-pagination"> <div class="page-pagination">
<el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange" <el-pagination
:current-page="current_page" :page-sizes="[10, 30, 50, 100, 200]" :page-size="per_page" @size-change="handleSizeChange"
layout="total, sizes, prev, pager, next, jumper" :total="Paginationdata.total"> @current-change="handleCurrentChange"
</el-pagination> :current-page="current_page"
:page-sizes="[10, 30, 50, 100, 200]"
:page-size="per_page"
layout="total, sizes, prev, pager, next, jumper"
:total="Paginationdata.total">
</el-pagination>
</div> </div>
</el-card> </el-card>
@ -302,13 +309,12 @@
<el-dialog title="库存修改" :visible.sync="ejectstock1" width="30%" :close-on-click-modal="false"> <el-dialog title="库存修改" :visible.sync="ejectstock1" width="30%" :close-on-click-modal="false">
<el-table :data="ommodityInventory" tooltip-effect="dark" style="width: 100%"> <el-table :data="ommodityInventory" tooltip-effect="dark" style="width: 100%">
<el-table-column prop="two_days_ago_num" label="2天前库存"> <el-table-column prop="two_days_ago_num" label="2天前库存">
<template slot-scope="scope"> <template slot-scope="scope">
<div> <div>
<el-input v-model="scope.row.two_days_ago_num" :disabled="true"> <el-input v-model="scope.row.two_days_ago_num" :disabled="true"></el-input>
</el-input> <el-input v-model="scope.row.two_days_ago_num"></el-input>
<el-input v-model="scope.row.two_days_ago_num"></el-input> </div>
</div> </template>
</template>
</el-table-column> </el-table-column>
<el-table-column prop="yesterday_num" label="1天前库存"> <el-table-column prop="yesterday_num" label="1天前库存">
<template slot-scope="scope"> <template slot-scope="scope">
@ -432,6 +438,12 @@
</span> </span>
</el-dialog> </el-dialog>
<!-- 新增商品 -->
<add-goods :show="showAdd" @close="showAdd = false" @complete="refreshList"></add-goods>
<!-- 编辑商品 -->
<edit-goods :show="showEdit" :id="curId" @close="showEdit = false" @complete="refreshList"></edit-goods>
</div> </div>
</template> </template>
@ -442,9 +454,11 @@
import { orderRest } from "@/api/shop" import { orderRest } from "@/api/shop"
import Treeselect from '@riophae/vue-treeselect' import Treeselect from '@riophae/vue-treeselect'
import '@riophae/vue-treeselect/dist/vue-treeselect.css' import '@riophae/vue-treeselect/dist/vue-treeselect.css'
import addGoods from "@/components/Goods/add.vue"
import editGoods from "@/components/Goods/edit.vue"
export default { export default {
components: { Treeselect }, components: { Treeselect, addGoods, editGoods },
data() { data() {
return { return {
editPriceId: '', //id editPriceId: '', //id
@ -540,7 +554,10 @@
chooseList: [], chooseList: [],
showUpdate: false, showUpdate: false,
commitLoading: false, commitLoading: false,
is_admin: localStorage.getItem('roleName') == '超级管理员' || localStorage.getItem('roleName') == '系统管理员' is_admin: localStorage.getItem('roleName') == '超级管理员' || localStorage.getItem('roleName') == '系统管理员',
showAdd: false,
showEdit: false,
curId: 0
} }
}, },
methods: { methods: {
@ -553,7 +570,9 @@
}, },
// //
handleEdit(id) { handleEdit(id) {
this.$router.push({ path: "EDIT_GOODS", query: { id: id } }) // this.$router.push({ path: "EDIT_GOODS", query: { id: id } })
this.curId = id
this.showEdit = true
}, },
// //
@ -675,7 +694,11 @@
}, },
// //
addNewgoods() { addNewgoods() {
this.$router.push("/ADDGOODS") // this.$router.push("/ADDGOODS")
this.showAdd = true
},
refreshList() {
this.handleChoose(this.current_page)
}, },
// //
@ -1088,7 +1111,7 @@
this.commitLoading = false this.commitLoading = false
}) })
}, },
showEdit(row, index) { openSaleEdit(row, index) {
this.$set(this.tableData[index], 'edit', true) this.$set(this.tableData[index], 'edit', true)
this.$set(this.tableData[index], 'sale_stock_old', row.sale_stock) this.$set(this.tableData[index], 'sale_stock_old', row.sale_stock)
}, },

View File

@ -66,7 +66,7 @@
</el-form-item> </el-form-item>
</el-form> </el-form>
</div> </div>
<div class="btn" @click="addItem()"><i class="el-icon-plus"></i>添加标签</div> <div class="btn" @click="addItem()"><i class="el-icon-plus"></i>添加记录</div>
<span slot="footer" class="dialog-footer"> <span slot="footer" class="dialog-footer">
<el-button @click="dialogVisible = false"> </el-button> <el-button @click="dialogVisible = false"> </el-button>
<el-button type="primary" @click="commitSupplier" :loading="commitloading"> </el-button> <el-button type="primary" @click="commitSupplier" :loading="commitloading"> </el-button>

View File

@ -78,10 +78,17 @@
<el-input v-model="item.external_sku_id" clearable></el-input> <el-input v-model="item.external_sku_id" clearable></el-input>
</el-form-item> </el-form-item>
<el-form-item label="数量"> <el-form-item label="数量">
<el-input v-model="item.num" clearable></el-input> <el-input v-model="item.num" clearable @input="changeInput(index, item)"></el-input>
</el-form-item> </el-form-item>
<el-form-item label="成本"> <el-form-item label="成本">
<el-input v-model="item.cost" clearable></el-input> <el-input v-model="item.cost" clearable @input="changeInput(index, item)">
<template slot="append"></template>
</el-input>
</el-form-item>
<el-form-item label="商品总价">
<el-input v-model="item.total_price">
<template slot="append"></template>
</el-input>
</el-form-item> </el-form-item>
<el-form-item label="报损原因"> <el-form-item label="报损原因">
<el-input v-model="item.reason" clearable></el-input> <el-input v-model="item.reason" clearable></el-input>
@ -91,7 +98,7 @@
</el-form-item> </el-form-item>
</el-form> </el-form>
</div> </div>
<div class="btn" @click="addItem()"><i class="el-icon-plus"></i>添加标签</div> <div class="btn" @click="addItem()"><i class="el-icon-plus"></i>添加记录</div>
<span slot="footer" class="dialog-footer"> <span slot="footer" class="dialog-footer">
<el-button @click="dialogVisible = false"> </el-button> <el-button @click="dialogVisible = false"> </el-button>
<el-button type="primary" @click="commitBatchLoss" :loading="commitloading"> </el-button> <el-button type="primary" @click="commitBatchLoss" :loading="commitloading"> </el-button>
@ -107,7 +114,14 @@
<el-input v-model="curInfo.num" disabled></el-input> <el-input v-model="curInfo.num" disabled></el-input>
</el-form-item> </el-form-item>
<el-form-item label="成本"> <el-form-item label="成本">
<el-input v-model="curInfo.cost" clearable></el-input> <el-input v-model="curInfo.cost" clearable>
<template slot="append"></template>
</el-input>
</el-form-item>
<el-form-item label="商品总价">
<el-input v-model="curInfo.total_price" disabled>
<template slot="append"></template>
</el-input>
</el-form-item> </el-form-item>
<el-form-item label="采购人"> <el-form-item label="采购人">
<el-select v-model="curInfo.buyer_id" clearable filterable ref="userRef"> <el-select v-model="curInfo.buyer_id" clearable filterable ref="userRef">
@ -213,6 +227,7 @@ export default {
external_sku_id: '', external_sku_id: '',
num: '', num: '',
cost: '', cost: '',
total_price: '',
reason: '', reason: '',
phenomenon: '' phenomenon: ''
}] }]
@ -226,6 +241,7 @@ export default {
external_sku_id: '', external_sku_id: '',
num: '', num: '',
cost: '', cost: '',
total_price: '',
reason: '', reason: '',
phenomenon: '' phenomenon: ''
}) })
@ -325,6 +341,9 @@ export default {
userList(params).then((res) => { userList(params).then((res) => {
this.usersList = res.data.data this.usersList = res.data.data
}) })
},
changeInput(index, row) {
this.$set(this.lossOrders[index], 'total_price', ((row.num * 1) * (row.cost * 1)))
} }
}, },
mounted() { mounted() {

View File

@ -0,0 +1,224 @@
<template>
<div class="pageBox">
<div class="cardBox">
<div class="searchBox">
<div class="row">
<span>商品名称</span>
<el-input v-model="filter.title" clearable></el-input>
</div>
<div class="row">
<span>商品编码</span>
<el-input v-model="filter.external_sku_id" clearable></el-input>
</div>
<div class="row">
<span>创建时间</span>
<el-date-picker
v-model="addTime"
type="datetimerange"
range-separator="-"
start-placeholder="开始时间"
end-placeholder="结束时间"
value-format="yyyy-MM-dd HH:mm:ss"
style="width: 340px">
</el-date-picker>
</div>
<div class="row">
<span>审核状态</span>
<el-select v-model="filter.status" placeholder="请选择" clearable>
<el-option v-for="item in statusList" :key="item.id" :label="item.name" :value="item.id">
</el-option>
</el-select>
</div>
<div class="row">
<el-button type="primary" icon="el-icon-search" @click="handleSearch">筛选</el-button>
</div>
</div>
</div>
<el-card>
<el-table v-loading="loading" :data="procureList" style="width: 100%" border>
<el-table-column prop="goods_sku.id" label="商品id" width="80" align="center" />
<el-table-column prop="goods_sku.name" label="商品名称" />
<el-table-column prop="external_sku_id" label="商品编码" />
<el-table-column prop="num" label="采购数量" />
<el-table-column prop="cost" label="采购成本" />
<el-table-column prop="buyer_name" label="采购人名称" />
<!-- <el-table-column prop="status" label="状态" /> -->
<el-table-column prop="expire_time" label="保质期时间" />
<el-table-column prop="supplier_name" label="供应商">
<template slot-scope="scope">
<span v-if="scope.row.supplier_name">{{ scope.row.supplier_name }}{{scope.row.supplier_id}}</span>
</template>
</el-table-column>
<el-table-column label="状态">
<template slot-scope="scope">
<span v-if="scope.row.status == 0">待审核</span>
<span v-else-if="scope.row.status == 1" style="color: #6DD230;">审核通过</span>
<span v-else-if="scope.row.status == 2" style="color: #f00;">审核不通过</span>
</template>
</el-table-column>
<el-table-column prop="date" label="采购时间" align="center" />
<el-table-column label="操作" width="120" align="center">
<template slot-scope="scope">
<el-button type="primary" v-if="scope.row.status != 1" plain @click="toExamine(scope.row)" icon="el-icon-s-check" size="mini">审核</el-button>
</template>
</el-table-column>
</el-table>
<div class="page-pagination">
<el-pagination
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="page"
:page-sizes="[15, 30, 50, 100]"
:page-size="pageSize"
layout="prev, pager, next, jumper, sizes, total"
:total="total">
</el-pagination>
</div>
</el-card>
<el-dialog title="审核" :visible.sync="dialogVisible" width="500px">
<el-form label-width="90px">
<el-form-item label="审核状态:">
<el-radio-group v-model="curInfo.status">
<el-radio :label="1">审核通过</el-radio>
<el-radio :label="2">审核不通过</el-radio>
</el-radio-group>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="dialogVisible = false"> </el-button>
<el-button type="primary" @click="commitCheck" :loading="commitloading"> </el-button>
</span>
</el-dialog>
</div>
</template>
<script>
import { getPurchaseLog, examinePurchase } from "@/api/supplyChain"
export default {
data() {
return {
loading: false,
page: 1,
pageSize: 15,
total: 0,
procureList: [],
filter: {
title: '',
external_sku_id: '',
status: ''
},
addTime: [],
curInfo: {},
commitloading: false,
dialogVisible: false,
statusList: [
{ id: 0, name: '待审核' },
{ id: 1, name: '审核通过' },
{ id: 2, name: '审核不通过' }
]
}
},
methods: {
fetchList() {
this.loading = true
let params = {
page: this.page,
per_page: this.pageSize,
...this.filter,
start_time: this.addTime ? this.addTime[0] : '',
end_time: this.addTime ? this.addTime[1] : ''
}
getPurchaseLog(params).then((res) => {
this.procureList = res.data.data
this.total = res.data.meta.total
this.loading = false
}).catch(() => {
this.loading = false
})
},
handleSizeChange(val) {
this.page = 1
this.pageSize = val
this.fetchList()
},
handleCurrentChange(val) {
this.page = val
this.fetchList()
},
handleSearch() {
this.page = 1
this.fetchList()
},
toExamine(row) {
this.curInfo = JSON.parse(JSON.stringify(row))
this.dialogVisible = true
},
commitCheck() {
if(!this.curInfo.status) {
this.$message({ type: "error", message: "请选择审核状态" })
return
}
this.commitloading = true
let params = {
purchaseOrders: [{
id: this.curInfo.id,
status: this.curInfo.status
}]
}
examinePurchase(params).then((res) => {
this.$message({ type: "success", message: "操作成功!" })
this.commitloading = false
this.dialogVisible = false
this.fetchList()
}).catch(() => {
this.commitloading = false
})
}
},
mounted() {
this.fetchList()
}
}
</script>
<style lang="scss" scoped>
.searchBox{
display: flex;
align-items: center;
flex-wrap: wrap;
white-space: nowrap;
.row{
font-size: 14px;
margin-bottom: 20px;
margin-right: 15px;
display: flex;
align-items: center;
}
}
.bgBox{
position: relative;
border-radius: 5px;
background-color: #f5f2f2;
margin-bottom: 15px;
padding: 15px 30px 15px 0;
.close{
color: #f00;
position: absolute;
right: 5px;
top: 5px;
font-size: 20px;
cursor: pointer;
}
}
.btn{
display: flex;
align-items: center;
font-size: 14px;
color: #409eff;
cursor: pointer;
width: fit-content;
}
</style>

View File

@ -22,6 +22,13 @@
style="width: 340px"> style="width: 340px">
</el-date-picker> </el-date-picker>
</div> </div>
<div class="row">
<span>审核状态</span>
<el-select v-model="filter.status" placeholder="请选择" clearable>
<el-option v-for="item in statusList" :key="item.id" :label="item.name" :value="item.id">
</el-option>
</el-select>
</div>
<div class="row"> <div class="row">
<el-button type="primary" icon="el-icon-search" @click="handleSearch">筛选</el-button> <el-button type="primary" icon="el-icon-search" @click="handleSearch">筛选</el-button>
</div> </div>
@ -47,6 +54,13 @@
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="date" label="采购时间" align="center" /> <el-table-column prop="date" label="采购时间" align="center" />
<el-table-column label="状态">
<template slot-scope="scope">
<span v-if="scope.row.status == 0">待审核</span>
<span v-else-if="scope.row.status == 1" style="color: #6DD230;">审核通过</span>
<span v-else-if="scope.row.status == 2" style="color: #f00;">审核不通过</span>
</template>
</el-table-column>
<el-table-column label="操作" width="120" align="center"> <el-table-column label="操作" width="120" align="center">
<template slot-scope="scope"> <template slot-scope="scope">
<el-button type="primary" @click="handleEdit(scope.row)" icon="el-icon-edit" size="mini">编辑</el-button> <el-button type="primary" @click="handleEdit(scope.row)" icon="el-icon-edit" size="mini">编辑</el-button>
@ -69,7 +83,7 @@
<el-dialog title="新增" :visible.sync="dialogVisible" width="500px"> <el-dialog title="新增" :visible.sync="dialogVisible" width="500px">
<el-form label-width="90px"> <el-form label-width="90px">
<el-form-item label="采购人"> <el-form-item label="采购人">
<el-select v-model="curInfo.buyer_user_id" clearable filterable ref="userBatchRef"> <el-select v-model="curInfo.buyer_user_id" clearable filterable ref="userBatchRef" disabled>
<el-option v-for="item in usersList" :key="item.id" :label="item.name" :value="item.id"> <el-option v-for="item in usersList" :key="item.id" :label="item.name" :value="item.id">
</el-option> </el-option>
</el-select> </el-select>
@ -84,14 +98,28 @@
<div v-for="(item, index) in purchaseOrders" :key="index" class="bgBox"> <div v-for="(item, index) in purchaseOrders" :key="index" class="bgBox">
<div class="close" @click="delItem(index)"><i class="el-icon-delete-solid"></i></div> <div class="close" @click="delItem(index)"><i class="el-icon-delete-solid"></i></div>
<el-form label-width="90px"> <el-form label-width="90px">
<el-form-item label="商品名称">
<el-select v-model="item.external_sku_id" filterable remote reserve-keyword placeholder="商品名称"
:remote-method="remoteMethod" :loading="searchLoading">
<el-option v-for="it in goodsList" :key="it.external_sku_id" :label="it.title" :value="it.external_sku_id">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="商品编码"> <el-form-item label="商品编码">
<el-input v-model="item.external_sku_id" clearable></el-input> <el-input v-model="item.external_sku_id" disabled></el-input>
</el-form-item> </el-form-item>
<el-form-item label="数量"> <el-form-item label="数量">
<el-input v-model="item.num" clearable></el-input> <el-input v-model="item.num" clearable @input="changeInput(index, item)"></el-input>
</el-form-item> </el-form-item>
<el-form-item label="成本"> <el-form-item label="成本">
<el-input v-model="item.cost" clearable></el-input> <el-input v-model="item.cost" clearable @input="changeInput(index, item)">
<template slot="append"></template>
</el-input>
</el-form-item>
<el-form-item label="商品总价">
<el-input v-model="item.total_price">
<template slot="append"></template>
</el-input>
</el-form-item> </el-form-item>
<el-form-item label="采购日期"> <el-form-item label="采购日期">
<el-date-picker <el-date-picker
@ -102,9 +130,18 @@
value-format="yyyy-MM-dd"> value-format="yyyy-MM-dd">
</el-date-picker> </el-date-picker>
</el-form-item> </el-form-item>
<el-form-item label="到货时间">
<el-date-picker
v-model="item.arrived_time"
type="datetime"
placeholder="到货时间"
format="yyyy-MM-dd hh"
value-format="yyyy-MM-dd hh">
</el-date-picker>
</el-form-item>
</el-form> </el-form>
</div> </div>
<div class="btn" @click="addItem()"><i class="el-icon-plus"></i>添加标签</div> <div class="btn" @click="addItem()"><i class="el-icon-plus"></i>添加采购商品</div>
<span slot="footer" class="dialog-footer"> <span slot="footer" class="dialog-footer">
<el-button @click="dialogVisible = false"> </el-button> <el-button @click="dialogVisible = false"> </el-button>
<el-button type="primary" @click="commitAddPurchase" :loading="commitloading"> </el-button> <el-button type="primary" @click="commitAddPurchase" :loading="commitloading"> </el-button>
@ -122,8 +159,13 @@
<el-form-item label="成本"> <el-form-item label="成本">
<el-input v-model="curInfo.cost" disabled></el-input> <el-input v-model="curInfo.cost" disabled></el-input>
</el-form-item> </el-form-item>
<el-form-item label="商品总价">
<el-input v-model="curInfo.total_price" disabled>
<template slot="append"></template>
</el-input>
</el-form-item>
<el-form-item label="采购人"> <el-form-item label="采购人">
<el-select v-model="curInfo.buyer_user_id" clearable filterable ref="userRef"> <el-select v-model="curInfo.buyer_user_id" clearable filterable ref="userRef" disabled>
<el-option v-for="item in usersList" :key="item.id" :label="item.name" :value="item.id"> <el-option v-for="item in usersList" :key="item.id" :label="item.name" :value="item.id">
</el-option> </el-option>
</el-select> </el-select>
@ -143,6 +185,15 @@
value-format="yyyy-MM-dd"> value-format="yyyy-MM-dd">
</el-date-picker> </el-date-picker>
</el-form-item> </el-form-item>
<el-form-item label="到期时间">
<el-date-picker
v-model="curInfo.arrived_time"
type="datetime"
placeholder="到期时间"
format="yyyy-MM-dd hh"
value-format="yyyy-MM-dd hh">
</el-date-picker>
</el-form-item>
</el-form> </el-form>
<span slot="footer" class="dialog-footer"> <span slot="footer" class="dialog-footer">
<el-button @click="editDialog = false"> </el-button> <el-button @click="editDialog = false"> </el-button>
@ -172,6 +223,8 @@
import { getPurchaseLog, updatePurchaseLog, getSupplier, batchAddPurchaseLog } from "@/api/supplyChain" import { getPurchaseLog, updatePurchaseLog, getSupplier, batchAddPurchaseLog } from "@/api/supplyChain"
import axios from "axios" import axios from "axios"
import { userList } from "@/api/user" import { userList } from "@/api/user"
import { goodsSkusList } from "@/api/goods"
import dayjs from 'dayjs'
export default { export default {
data() { data() {
@ -183,7 +236,8 @@ export default {
procureList: [], procureList: [],
filter: { filter: {
title: '', title: '',
external_sku_id: '' external_sku_id: '',
status: ''
}, },
addTime: [], addTime: [],
commitloading: false, commitloading: false,
@ -194,7 +248,14 @@ export default {
usersList: [], usersList: [],
supplierList: [], supplierList: [],
purchaseOrders: [], purchaseOrders: [],
editDialog: false editDialog: false,
goodsList: [],
searchLoading: false,
statusList: [
{ id: 0, name: '待审核' },
{ id: 1, name: '审核通过' },
{ id: 2, name: '审核不通过' }
]
} }
}, },
methods: { methods: {
@ -231,14 +292,16 @@ export default {
// //
handleAdd() { handleAdd() {
this.curInfo = { this.curInfo = {
buyer_user_id: '', buyer_user_id: localStorage.getItem("userId"),
supplier_id: '' supplier_id: ''
} }
this.purchaseOrders = [{ this.purchaseOrders = [{
external_sku_id: '', external_sku_id: '',
num: '', num: '',
cost: '', cost: '',
date: '' total_price: '',
date: dayjs().format('YYYY-MM-DD'),
arrived_time: ''
}] }]
this.dialogVisible = true this.dialogVisible = true
}, },
@ -250,7 +313,9 @@ export default {
external_sku_id: '', external_sku_id: '',
num: '', num: '',
cost: '', cost: '',
date: '' total_price: '',
date: dayjs().format('YYYY-MM-DD'),
arrived_time: ''
}) })
}, },
handleEdit(row) { handleEdit(row) {
@ -367,6 +432,24 @@ export default {
getSupplier(params).then((res) => { getSupplier(params).then((res) => {
this.supplierList = res.data.data this.supplierList = res.data.data
}) })
},
remoteMethod(query) {
if (query !== '') {
this.searchLoading = true
setTimeout(() => {
this.searchLoading = false
goodsSkusList(query).then((res) => {
this.goodsList = res.data.filter(item => {
return item.title.toLowerCase().indexOf(query.toLowerCase()) > -1
})
})
}, 200)
} else {
this.goodsList = []
}
},
changeInput(index, row) {
this.$set(this.purchaseOrders[index], 'total_price', ((row.num * 1) * (row.cost * 1)))
} }
}, },
mounted() { mounted() {