库存统计、采购统计、库存检验统计

This commit is contained in:
shijing 2024-03-21 09:41:23 +08:00
parent 69ed9b9d83
commit 1bce64dbbd
6 changed files with 363 additions and 116 deletions

View File

@ -96,6 +96,14 @@ export default {
data);
}
},
setWeekConsume: {
name: "更新周预估值",
req: async function(id, data){
return await http.put(
`${config.API_URL}/mtm/material/${id}/set_week_esitimate_consume/`,
data);
}
},
update: {
name: "更新",
req: async function(id, data){

View File

@ -2416,7 +2416,7 @@ const routes = [
"path": "/material_statistics",
"name": "material_statistics",
"meta": {
"title": "物料统计",
"title": "采购统计",
"icon": "el-icon-trend-charts",
"perms": ["statistic_material"],
},
@ -2444,6 +2444,17 @@ const routes = [
},
"component": "statistics/inm_statistics.vue"
},
//库存统计
{
"path": "/stock_statistics",
"name": "stock_statistics",
"meta": {
"title": "库存统计",
"icon": "el-icon-trend-charts",
"perms": ["statistic_stock"],
},
"component": "statistics/stock_statistics.vue"
},
],
// children:[
// {

View File

@ -62,7 +62,23 @@ export const drainTypeEnum = new EnumFactory({
'mtrans': '物料输送',
'mstore':'物料储存'
})
export const mioTypeEnum = new EnumFactory({
'do_out': '生产领料',
'sale_out': '销售发货',
'pur_in': '采购入库',
'do_in': '生产入库',
'other_in': '其他入库',
'other_out': '其他出库'
})
export const productTypeEnum = new EnumFactory({
10: '成品',
20: '半成品',
30: '主要原料',
40: '辅助材料',
50: '加工工具',
60: '辅助工装',
70: '办公用品',
})
export const eqTypeEnum = new EnumFactory({
10: { text: '生产设备', type: 'success' },
20: { text: '计量设备', type: 'primary' },

View File

@ -42,7 +42,7 @@
<el-col :lg="16">
<el-card shadow="never" style="position: relative;">
<el-button @click="handleExport('ZJ')" class="tables" type="primary">导出</el-button>
<el-table :data="tableData" id="exportDivZJ">
<el-table :data="tableData" id="exportDivZJ" :height="300">
<el-table-column type="index" width="50" />
<el-table-column label="批次号" prop="date">
</el-table-column>
@ -81,7 +81,7 @@
<el-col :lg="16">
<el-card shadow="never" style="position: relative;">
<el-button @click="handleExport('ZB')" class="tables" type="primary">导出</el-button>
<el-table :data="tableData" id="exportDivZB">
<el-table :data="tableData" id="exportDivZB" :height="300">
<el-table-column type="index" width="50" />
<el-table-column label="日期" prop="date">
</el-table-column>
@ -142,22 +142,21 @@
tooltip: {
trigger: 'item'
},
series: [
{
name: '访问来源',
series: {
name: '预制棒',
type: 'pie',
radius: ['40%', '70%'],
center: ['50%', '60%'],
label: false,
data: [
{value: 1048, name: '搜索引擎'},
{value: 735, name: '直接访问'},
{value: 580, name: '邮件营销'},
{value: 484, name: '联盟广告'},
{value: 300, name: '视频广告'}
{ value: 0, name: '炸纹' },
{ value: 0, name: '条纹' },
{ value: 0, name: '气泡' },
{ value: 0, name: '弯曲' },
{ value: 0, name: '其他' },
{ value: 0, name: '合格' },
]
}
]
},
option2: {
title: {
@ -167,22 +166,21 @@
tooltip: {
trigger: 'item'
},
series: [
{
name: '访问来源',
series: {
name: '预制管',
type: 'pie',
radius: ['40%', '70%'],
center: ['50%', '60%'],
label: false,
data: [
{value: 1048, name: '搜索引擎'},
{value: 735, name: '直接访问'},
{value: 580, name: '邮件营销'},
{value: 484, name: '联盟广告'},
{value: 300, name: '视频广告'}
{ value: 0, name: '椭圆弯曲' },
{ value: 0, name: '大小头' },
{ value: 0, name: '偏壁' },
{ value: 0, name: '结石' },
{ value: 0, name: '气线' },
{ value: 0, name: '合格' },
]
}
]
}
}
},
@ -208,7 +206,7 @@
}else{
this.xAxisData = ['一月','二月','三月','四月','五月','六月','七月','八月','九月','十月','十一月','十二月']
}
this.option.xAxis.data = this.xAxisData;
this.option1.xAxis.data = this.xAxisData;
this.option2.xAxis.data = this.xAxisData;
},
//
@ -218,9 +216,25 @@
query: { start_date: this.start_date, end_date: this.end_date, dept_name: "7车间" },
};
let exec = that.queryType=='月'?'lineWeek':'lineMonth';
that.$API.bi.dataset.exec.req(exec, obj).then((doInRes) => {
console.log('7生产车间统计:',doInRes);
debugger;
that.$API.bi.dataset.exec.req(exec, obj).then((res) => {
console.log('7生产车间统计:', res);
if (res.data2.ds0 && res.data2.ds0.length > 0) {
let item = res.data2.ds0[0];
that.yesterdayObjet = item;
that.option1.series.data[0].value = item.炸纹;
that.option1.series.data[1].value = item.条纹;
that.option1.series.data[2].value = item.气泡;
that.option1.series.data[3].value = item.弯曲;
that.option1.series.data[4].value = item.其他;
that.option1.series.data[5].value = item.合格数;
} else {
that.option1.series.data[0].value = 0;
that.option1.series.data[1].value = 0;
that.option1.series.data[2].value = 0;
that.option1.series.data[3].value = 0;
that.option1.series.data[4].value = 0;
that.option1.series.data[5].value = 0;
}
});
},
//
@ -230,15 +244,30 @@
query: { start_date: this.start_date, end_date: this.end_date, dept_name: "10·车间" },
};
let exec = that.queryType=='月'?'lineWeek':'lineMonth';
that.$API.bi.dataset.exec.req(exec, obj).then((doInRes) => {
console.log('10生产车间统计:',doInRes);
debugger;
that.$API.bi.dataset.exec.req(exec, obj).then((res) => {
console.log('10生产车间统计:',res);
if (res.data2.ds0 && res.data2.ds0.length > 0) {
let item = res.data2.ds0[0];
that.yesterdayObjet = item;
that.option2.series.data[0].value = item.弯曲;
that.option2.series.data[1].value = item.大小头;
that.option2.series.data[2].value = item.偏壁;
that.option2.series.data[3].value = item.结石;
that.option2.series.data[4].value = item.气线;
that.option2.series.data[5].value = item.合格数;
} else {
that.option2.series.data[0].value = 0;
that.option2.series.data[1].value = 0;
that.option2.series.data[2].value = 0;
that.option2.series.data[3].value = 0;
that.option2.series.data[4].value = 0;
that.option2.series.data[5].value = 0;
}
});
},
handleQuery(){
if(this.queryDate!==''){
if(this.queryType=='月'){
this.start_date =this.queryDate+'-01';
let arr = this.queryDate.split('-');
this.end_date = this.queryDate+'-'+new Date(arr[0], arr[1], 0).getDate();

View File

@ -51,7 +51,6 @@
<el-row>
<el-col>
<div id="bachart1" style="width:100%;height:300px;"></div>
<!-- <scEcharts height="300px" :option="option2"></scEcharts> -->
</el-col>
<el-card shadow="never" style="width: 100%;position: relative;margin-top: 20px;">
<el-button @click="handleExport('1')" class="tables" type="primary">导出</el-button>
@ -75,27 +74,16 @@
</el-col>
<el-col :lg="12">
<el-card shadow="never" style="margin-bottom: 8px;">
<el-container>
<el-header>
<div class="right-panel">
<h2>消耗统计</h2>
<el-select v-model="materialOut" clearable @change="materialOutChange">
<el-option v-for="item in outOption"
:key="item.id"
:label="item.full_name"
:value="item.id"
>
</el-option>
</el-select>
<h2>采购统计总表</h2>
</div>
</el-header>
<el-row>
<el-col>
<div id="bachart2" style="width:100%;height:300px;"></div>
<!-- <scEcharts height="300px" :option="option2"></scEcharts> -->
</el-col>
<el-card shadow="never" style="width: 100%;position: relative;margin-top: 20px;">
<el-main style="width: 100%;position: relative;">
<el-button @click="handleExport('2')" class="tables" type="primary">导出</el-button>
<el-table :data="tableData2" id="exportDiv2" :height="tableHeight">
<scTable :data="tableData2" id="exportDiv2" :height="rightHeight" hideDo>
<el-table-column type="index" width="50" />
<el-table-column label="日期" prop="date">
<template #default="scope">
@ -108,9 +96,9 @@
</el-table-column>
<el-table-column label="数量" prop="数量">
</el-table-column>
</el-table>
</el-card>
</el-row>
</scTable>
</el-main>
</el-container>
</el-card>
</el-col>
</el-row>
@ -168,7 +156,8 @@
barWidth: '15px',
}
},
tableHeight:0,
tableHeight: 0,
rightHeight:0,
tableData1:[],
tableData2:[],
materialIn:'',
@ -192,23 +181,22 @@
that.currentMonth = month;
that.start_date =year+'-'+month+'-01';
that.end_date = year+'-'+month+'-'+new Date(year, month, 0).getDate();
console.log('that.start_date',that.start_date)
console.log('that.end_date',that.end_date)
let month1 = month;
if(month1<10){month1='0'+month1}
that.queryDate = year+'-'+month1;
that.firstWeekNum = that.getWeekOfYear(new Date(that.start_date));
that.endWeekNum = that.getWeekOfYear(new Date(that.end_date));
console.log('that.firstWeekNum',that.firstWeekNum)
console.log('that.endWeekNum',that.endWeekNum)
// console.log('that.firstWeekNum',that.firstWeekNum)
// console.log('that.endWeekNum',that.endWeekNum)
let duration = that.endWeekNum - that.firstWeekNum + 1;
for(let i =1;i<=duration;i++ ){
that.xAxisOrigin.push('第'+i+'周');
}
that.xAxisData = that.xAxisOrigin;
let height= document.getElementById('elMain').clientHeight-140;
let chartheight= document.getElementById('bachart1').clientHeight;
that.tableHeight = height-chartheight;
let height= document.getElementById('elMain').clientHeight;
let chartheight = document.getElementById('bachart1').clientHeight;
that.rightHeight = height - 115;
that.tableHeight = height-140-chartheight;
this.getInmOption();
},
methods:{
@ -242,15 +230,11 @@
materialInChange(){
this.getInmData();
},
materialOutChange(){
this.getOutData();
},
//
getInmOption(){
let that = this;
let obj = {};
obj.page=0;
console.log('000000')
obj.type__in = '30,40,50,60,70';
that.$API.mtm.material.list.req( obj).then((res) => {
that.inmOption = res;
@ -264,7 +248,6 @@
that.outOption = arr;
that.materialOut = arr[1].id;
that.getInmData();
that.getOutData();
})
},
//
@ -292,46 +275,23 @@
seriesData[index]=item.数量;
}
})
debugger;
console.log('seriesData',seriesData)
option.series.data = seriesData;
that.setChart("bachart1", option);
}else{
that.setChart("bachart1", option);
}
})
},
//
getOutData(){
let that = this;
let option = deepCopy(that.basicOption);
option.xAxis.data = that.xAxisData;
let exec = that.queryType=='月'?'saleOutWeek':'saleOutMonth';
let obj = {
query: { start_date: that.start_date, end_date: that.end_date, mio_type: "do_out",material_id:that.materialOut },
};
that.$API.bi.dataset.exec.req(exec, obj).then((res) => {
debugger;
console.log('getOutData',res);
let obj2 = {
query: { start_date: that.start_date, end_date: that.end_date, mio_type: "pur_in"}
}
that.$API.bi.dataset.exec.req(exec, obj2).then((res) => {
if (res.data2.ds0) {
let data = res.data2.ds0;
that.tableData2 = data;
if(data.length>0){
option.series.data = [];
let seriesData = [];
data.forEach(item=>{
if(that.queryType=='月'){
let index = item.-that.firstWeekNum;
seriesData[index]=item.数量;
}else{
let index = item.-1;
seriesData[index]=item.数量;
}
})
option.series.data = seriesData;
that.setChart("bachart2", option);
}else{
that.setChart("bachart2", option);
} else {
that.tableData2 = [];
}
})
},
handleQuery(){
@ -367,12 +327,11 @@
that.xAxisData = that.monthList;
}
this.getInmData();
this.getOutData();
},
handleExport(val) {
this.exportLoading = true;
let id = '#exportDiv' + val;
let name = val == '1' ? '采购统计' : '消耗统计';
let name = val == '1' ? '采购统计' : '采购统计总表';
this.$XLSX(id, name);
this.exportLoading = false;
},

View File

@ -0,0 +1,224 @@
<template>
<el-container>
<el-aside style="width: 50%;background: #ffffff;">
<el-container>
<el-header>
<div class="left-panel">
<span style="font-size: 14px">库存统计</span>
</div>
<div class="right-panel">
<el-select v-model="params.type" clearable @change="materialTypeChange">
<el-option v-for="item in materialTypeOptions"
:key="item.id"
:label="item.name"
:value="item.id"
>
</el-option>
</el-select>
<el-button type="primary" icon="el-icon-search" @click="materialTypeChange"></el-button>
<el-button @click="handleExport('1')" type="primary">导出</el-button>
</div>
</el-header>
<el-main>
<scTable ref="tables1" :apiObj="apiObj" :params="params" id="exportDiv1" stripe hideDo>
<el-table-column type="index" width="50" />
<el-table-column label="物料名" prop="name"></el-table-column>
<el-table-column label="型号" prop="model"></el-table-column>
<el-table-column label="规格" prop="specification"></el-table-column>
<el-table-column label="库存总数" prop="count"></el-table-column>
<el-table-column label="周预估值" v-if="params.type==30">
<template #default="scope">
<el-input v-model="scope.row.week_esitimate_consume" @blur="weekcountChange(scope.row)"></el-input>
</template>
</el-table-column>
<el-table-column label="可用天数" v-if="params.type==30">
<template #default="scope">
<span v-if="scope.row.week_esitimate_consume&&scope.row.week_esitimate_consume!==null">
{{ Math.floor(scope.row.count/scope.row.week_esitimate_consume)}}
</span>
</template>
</el-table-column>
</scTable>
</el-main>
</el-container>
</el-aside>
<el-main class="nopadding">
<el-container>
<el-header>
<div class="left-panel">
<span style="font-size: 14px">库存出入库统计</span>
</div>
<div class="right-panel">
<el-select v-model="query.mio_type" clearable @change="mioTypeChange" style="width: 100px;">
<el-option v-for="e in mioTypeEnum.values" :key="e.key" :value="e.key"
:label="e.text"></el-option>
</el-select>
<el-select v-model="queryType" @change="queryTypeChange" style="width: 100px;">
<el-option v-for="item in typeOptions"
:key="item" :label="item" :value="item"></el-option>
</el-select>
<el-date-picker
v-if="queryType=='月'"
v-model="queryDate"
type="month"
placeholder="查询月"
value-format="YYYY-MM"
style="width: 100px;"
>
</el-date-picker>
<el-date-picker
v-if="queryType=='年'"
v-model="queryDate"
type="year"
placeholder="查询年"
value-format="YYYY"
style="width: 100px;"
>
</el-date-picker>
<el-button type="primary" icon="el-icon-search" @click="handleQuery"></el-button>
<el-button @click="handleExport('2')" type="primary">导出</el-button>
</div>
</el-header>
<el-main>
<scTable ref="tables2" :data="tableData" id="exportDiv2" stripe hideDo hidePagination>
<el-table-column label="物料名" prop="material"></el-table-column>
<el-table-column label="型号" prop="model"></el-table-column>
<el-table-column label="规格" prop="specification"></el-table-column>
<el-table-column label="出入库类型" prop="model">
<template>
<span></span>
</template>
</el-table-column>
<template v-if="queryType=='月'&&(query.mio_type=='pur_in'||query.mio_type=='do_in'||query.mio_type=='other_in')">
<el-table-column label="月入库总数" prop="count"></el-table-column>
</template>
<template v-if="queryType=='月'&&(query.mio_type=='do_out'||query.mio_type=='sale_out'||query.mio_type=='other_out')">
<el-table-column label="月出库数量" prop="batch"> </el-table-column>
</template>
<template v-if="queryType=='年'&&(query.mio_type=='pur_in'||query.mio_type=='do_in'||query.mio_type=='other_in')">
<el-table-column label="年入库总数" prop="count"></el-table-column>
</template>
<template v-if="queryType=='年'&&(query.mio_type=='do_out'||query.mio_type=='sale_out'||query.mio_type=='other_out')">
<el-table-column label="年出库总数" prop="count"></el-table-column>
</template>
</scTable>
</el-main>
</el-container>
</el-main>
</el-container>
</template>
<script>
import { mioTypeEnum } from "@/utils/enum.js";
function deepCopy(obj) {
return JSON.parse(JSON.stringify(obj));
}
export default {
name: 'chart',
data() {
return {
mioTypeEnum,
apiObj: this.$API.mtm.material.list,
materialType: '',
params: { is_hidden: false, type: 10 ,count__gte:1},
query: {
mio_type:mioTypeEnum.values[0].key
},
queryType:'月',
queryDate: '',
start_date:'',
end_date: '',
currentYear:'',
currentMonth: '',
currentLastDay:'',
tableData: [],
typeOptions: ['月', '年'],
materialTypeOptions: [
{id:10,name:'成品'},
{id:20,name:'半成品'},
{id:30,name:'主要原料'},
{id:40,name:'辅助材料'},
{id:70,name:'办公用品'},
],
}
},
mounted(){
let that = this;
let date = new Date();
let year = date.getFullYear();
let month = date.getMonth() + 1;
let lastDay = new Date(year, month, 0).getDate();
that.currentYear = year;
that.currentMonth = month > 9 ? month : '0' + month;
that.currentLastDay = lastDay;
that.queryDate = that.currentYear + '-' + that.currentMonth;
that.start_date = that.currentYear + '-'+ that.currentMonth + '-01';
that.end_date = that.currentYear + '-'+ that.currentMonth + '-'+lastDay;
that.getInmData();
},
methods: {
materialTypeChange() {
this.$refs.tables1.refresh();
},
//
weekcountChange(row) {
let obj = { week_esitimate_consume: row.week_esitimate_consume };
this.$API.mtm.material.setWeekConsume.req(row.id, obj).then(res => {
console.log(res);
this.$refs.tables1.refresh();
})
},
//
getInmData(){
let that = this;
let exec = that.queryType=='月'?'saleOutMonth':'saleOutYear';
let obj = {
query: { start_date: that.start_date, end_date: that.end_date, mio_type: that.query.mio_type},
};
that.$API.bi.dataset.exec.req(exec, obj).then((res) => {
if (res.data2.ds0) {
let data = res.data2.ds0;
that.tableData = data;
}
})
},
handleQuery(){
let that = this;
if(that.queryType=='月'){
if(that.queryDate!==''&&that.queryDate!==null){
that.start_date =that.queryDate+'-01';
let arr = that.queryDate.split('-');
that.end_date = that.queryDate+'-'+new Date(arr[0], arr[1], 0).getDate();
}else{
that.start_date =that.currentYear+'-'+this.currentMonth+'-01';
that.end_date = that.currentYear+'-'+this.currentMonth+'-'+that.currentLastDay;
}
}else{
if(this.queryDate!==''&&this.queryDate!==null){
this.start_date = this.queryDate+'-01-01';
this.end_date = this.queryDate+'-12-31';
}else{
this.start_date = this.currentYear+'-01-01';
this.end_date = this.currentYear+'-12-31';
}
}
this.getInmData();
},
handleExport(val) {
this.exportLoading = true;
let id = '#exportDiv' + val;
let name = val == '1' ? '库存统计' : '库存出入库统计';
this.$XLSX(id, name);
this.exportLoading = false;
},
},
}
</script>
<style scoped>
.tables {
position: absolute;
top: 4px;
right: 6px;
z-index: 10;
}
</style>