Merge branch 'develop' of https://e.coding.net/ctcdevteam/hberp/hberp into develop
This commit is contained in:
commit
aa76888a57
|
|
@ -19,19 +19,13 @@
|
||||||
@expand-change="handlerExpand"
|
@expand-change="handlerExpand"
|
||||||
:tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
|
:tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
|
||||||
>
|
>
|
||||||
<el-table-column label="任务编号" width="150">
|
<el-table-column label="任务编号" prop="name">
|
||||||
<template slot-scope="scope">{{ scope.row.name }}</template>
|
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="产品名称">
|
<el-table-column label="产品名称" prop="productName" width="120" show-overflow-tooltip>
|
||||||
<template slot-scope="scope">
|
|
||||||
<div style="overflow: hidden; text-overflow:ellipsis; white-space: nowrap;">{{ scope.row.productName }}</div>
|
|
||||||
</template>
|
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="产品型号">
|
<el-table-column label="产品型号" prop="productNum">
|
||||||
<template slot-scope="scope">{{ scope.row.productNum }}</template>
|
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="生产数量">
|
<el-table-column label="生产数量" prop="per">
|
||||||
<template slot-scope="scope">{{ scope.row.per }}</template>
|
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
</el-table>
|
</el-table>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -1,19 +1,18 @@
|
||||||
<template>
|
<template>
|
||||||
<div
|
<div
|
||||||
class="slider"
|
|
||||||
ref="slider"
|
ref="slider"
|
||||||
|
class="slider"
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="process"
|
class="process"
|
||||||
:style="{ width }"
|
:style="{ width }"
|
||||||
style="font-size: 12px;color: #ffffff;text-align: right"
|
|
||||||
>
|
>
|
||||||
<span v-if="per">{{ per }}</span>
|
<span v-if="per">{{ per }}</span>
|
||||||
<span v-else>{{ per }}</span>
|
<span v-else>{{ per }}</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="process1"
|
<div
|
||||||
|
class="process1"
|
||||||
:style="{width:process1Width}"
|
:style="{width:process1Width}"
|
||||||
style="font-size: 12px;color: #ffffff;text-align: right"
|
|
||||||
>
|
>
|
||||||
<span v-if="per1"> {{ per1 }}</span>
|
<span v-if="per1"> {{ per1 }}</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -122,6 +121,10 @@ export default {
|
||||||
top: 0;
|
top: 0;
|
||||||
width: 112px;
|
width: 112px;
|
||||||
height: 20px;
|
height: 20px;
|
||||||
|
font-size: 12px;
|
||||||
|
color: #ffffff;
|
||||||
|
text-align: right;
|
||||||
|
line-height: 20px;
|
||||||
border-radius: 3px;
|
border-radius: 3px;
|
||||||
background: #409eff;
|
background: #409eff;
|
||||||
}
|
}
|
||||||
|
|
@ -131,10 +134,16 @@ export default {
|
||||||
top: 0;
|
top: 0;
|
||||||
width: 10px;
|
width: 10px;
|
||||||
height: 20px;
|
height: 20px;
|
||||||
|
font-size: 12px;
|
||||||
|
color: #ffffff;
|
||||||
|
text-align: right;
|
||||||
|
line-height: 20px;
|
||||||
border-radius: 3px;
|
border-radius: 3px;
|
||||||
background: #11c750;
|
background: #11c750;
|
||||||
}
|
}
|
||||||
|
.slider .process span{
|
||||||
|
margin-right: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
.slider .block i {
|
.slider .block i {
|
||||||
font-size: 25px;
|
font-size: 25px;
|
||||||
|
|
|
||||||
|
|
@ -18,6 +18,7 @@
|
||||||
<el-form-item
|
<el-form-item
|
||||||
v-if="item.field_type === 'string'"
|
v-if="item.field_type === 'string'"
|
||||||
:label="item.field_name"
|
:label="item.field_name"
|
||||||
|
:required="require"
|
||||||
>
|
>
|
||||||
<el-input
|
<el-input
|
||||||
v-model="checkForm[item.field_key]"
|
v-model="checkForm[item.field_key]"
|
||||||
|
|
@ -28,21 +29,27 @@
|
||||||
<el-form-item
|
<el-form-item
|
||||||
v-else-if="item.field_type === 'int'"
|
v-else-if="item.field_type === 'int'"
|
||||||
:label="item.field_name"
|
:label="item.field_name"
|
||||||
|
:required="require"
|
||||||
>
|
>
|
||||||
<el-input
|
<el-input-number
|
||||||
|
style="width: 100%;"
|
||||||
v-model="checkForm[item.field_key]"
|
v-model="checkForm[item.field_key]"
|
||||||
type="number"
|
step-strictly
|
||||||
placeholder="请输入"
|
placeholder="请输入"
|
||||||
|
:min="0"
|
||||||
@input="keyChange($index,item.field_key)"
|
@input="keyChange($index,item.field_key)"
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item
|
<el-form-item
|
||||||
v-else-if="item.field_type === 'float'"
|
v-else-if="item.field_type === 'float'"
|
||||||
:label="item.field_name"
|
:label="item.field_name"
|
||||||
|
:required="require"
|
||||||
>
|
>
|
||||||
<el-input
|
<el-input-number
|
||||||
|
style="width: 100%;"
|
||||||
v-model="checkForm[item.field_key]"
|
v-model="checkForm[item.field_key]"
|
||||||
type="number"
|
:precision="2"
|
||||||
|
:step="0.1"
|
||||||
placeholder="请输入"
|
placeholder="请输入"
|
||||||
@input="keyChange($index,item.field_key)"
|
@input="keyChange($index,item.field_key)"
|
||||||
/>
|
/>
|
||||||
|
|
@ -50,6 +57,7 @@
|
||||||
<el-form-item
|
<el-form-item
|
||||||
v-else-if="item.field_type === 'date'"
|
v-else-if="item.field_type === 'date'"
|
||||||
:label="item.field_name"
|
:label="item.field_name"
|
||||||
|
:required="require"
|
||||||
>
|
>
|
||||||
<el-date-picker
|
<el-date-picker
|
||||||
v-model="checkForm[item.field_key]"
|
v-model="checkForm[item.field_key]"
|
||||||
|
|
@ -63,6 +71,7 @@
|
||||||
<el-form-item
|
<el-form-item
|
||||||
v-else-if="item.field_type === 'datetime'"
|
v-else-if="item.field_type === 'datetime'"
|
||||||
:label="item.field_name"
|
:label="item.field_name"
|
||||||
|
:required="require"
|
||||||
>
|
>
|
||||||
<el-date-picker
|
<el-date-picker
|
||||||
v-model="checkForm[item.field_key]"
|
v-model="checkForm[item.field_key]"
|
||||||
|
|
@ -76,6 +85,7 @@
|
||||||
<el-form-item
|
<el-form-item
|
||||||
v-else-if="item.field_type === 'select'"
|
v-else-if="item.field_type === 'select'"
|
||||||
:label="item.field_name"
|
:label="item.field_name"
|
||||||
|
:required="require"
|
||||||
>
|
>
|
||||||
<el-select
|
<el-select
|
||||||
v-model="checkForm[item.field_key]"
|
v-model="checkForm[item.field_key]"
|
||||||
|
|
@ -94,6 +104,7 @@
|
||||||
<el-form-item
|
<el-form-item
|
||||||
v-else-if="item.field_type === 'selects'"
|
v-else-if="item.field_type === 'selects'"
|
||||||
:label="item.field_name"
|
:label="item.field_name"
|
||||||
|
:required="require"
|
||||||
>
|
>
|
||||||
<el-select
|
<el-select
|
||||||
v-model="checkForm[item.field_key]"
|
v-model="checkForm[item.field_key]"
|
||||||
|
|
@ -120,8 +131,8 @@
|
||||||
<el-row v-show="hasPicture">
|
<el-row v-show="hasPicture">
|
||||||
<el-form-item label="图表">
|
<el-form-item label="图表">
|
||||||
<div>
|
<div>
|
||||||
<!--<img id="canvasImg" :src="img" style="width:500px;height: 300px;display: none">-->
|
<img id="canvasImg" :src="img" style="width:500px;height: 300px;display: none">
|
||||||
<img id="canvasImg" src="./../../assets/glass.png" style="width:500px;height: 300px;display: none">
|
<!--<img id="canvasImg" src="./../../assets/glass.png" style="width:500px;height: 300px;display: none">-->
|
||||||
<div style="position: relative;display: flex;flex-direction: column;
|
<div style="position: relative;display: flex;flex-direction: column;
|
||||||
border: 1px solid #DCDFE6;">
|
border: 1px solid #DCDFE6;">
|
||||||
<canvas id="canvas" width="500" height="300">
|
<canvas id="canvas" width="500" height="300">
|
||||||
|
|
@ -229,9 +240,9 @@
|
||||||
let imag= this.formData.filter(item => {
|
let imag= this.formData.filter(item => {
|
||||||
return item.field_type === 'draw';
|
return item.field_type === 'draw';
|
||||||
});
|
});
|
||||||
/* that.img = new Image();
|
that.img = new Image();
|
||||||
that.img.crossOrigin = '';
|
that.img.crossOrigin = '';
|
||||||
that.img = 'http://47.95.0.242:2222'+imag[0].draw_template;*/
|
that.img = 'http://47.95.0.242:2222'+imag[0].draw_template;
|
||||||
setTimeout(function(){
|
setTimeout(function(){
|
||||||
that.canvasInit();
|
that.canvasInit();
|
||||||
},500);
|
},500);
|
||||||
|
|
@ -265,6 +276,7 @@
|
||||||
is_testok:true,
|
is_testok:true,
|
||||||
testokTrue:true,
|
testokTrue:true,
|
||||||
is_save:false,
|
is_save:false,
|
||||||
|
require:false,
|
||||||
testokFalse:false,
|
testokFalse:false,
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -18,6 +18,7 @@
|
||||||
<el-form-item
|
<el-form-item
|
||||||
v-if="item.field_type === 'string'"
|
v-if="item.field_type === 'string'"
|
||||||
:label="item.field_name"
|
:label="item.field_name"
|
||||||
|
:required="require"
|
||||||
>
|
>
|
||||||
<el-input
|
<el-input
|
||||||
disabled
|
disabled
|
||||||
|
|
@ -36,6 +37,7 @@
|
||||||
<el-form-item
|
<el-form-item
|
||||||
v-else-if="item.field_type === 'int'"
|
v-else-if="item.field_type === 'int'"
|
||||||
:label="item.field_name"
|
:label="item.field_name"
|
||||||
|
:required="require"
|
||||||
>
|
>
|
||||||
<el-input
|
<el-input
|
||||||
disabled
|
disabled
|
||||||
|
|
@ -45,17 +47,19 @@
|
||||||
placeholder="请输入"
|
placeholder="请输入"
|
||||||
@input="keyChange($index,item.field_key)"
|
@input="keyChange($index,item.field_key)"
|
||||||
/>
|
/>
|
||||||
<el-input
|
<el-input-number
|
||||||
class="halfWidth"
|
class="halfWidth"
|
||||||
v-model="checkForm[item.field_key]"
|
v-model="checkForm[item.field_key]"
|
||||||
type="number"
|
step-strictly
|
||||||
placeholder="请输入"
|
placeholder="请输入"
|
||||||
|
:min="0"
|
||||||
@input="keyChange($index,item.field_key)"
|
@input="keyChange($index,item.field_key)"
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item
|
<el-form-item
|
||||||
v-else-if="item.field_type === 'float'"
|
v-else-if="item.field_type === 'float'"
|
||||||
:label="item.field_name"
|
:label="item.field_name"
|
||||||
|
:required="require"
|
||||||
>
|
>
|
||||||
<el-input
|
<el-input
|
||||||
disabled
|
disabled
|
||||||
|
|
@ -65,17 +69,26 @@
|
||||||
placeholder="请输入"
|
placeholder="请输入"
|
||||||
@input="keyChange($index,item.field_key)"
|
@input="keyChange($index,item.field_key)"
|
||||||
/>
|
/>
|
||||||
<el-input
|
<el-input-number
|
||||||
|
class="halfWidth"
|
||||||
|
v-model="checkForm[item.field_key]"
|
||||||
|
:precision="2"
|
||||||
|
:step="0.1"
|
||||||
|
placeholder="请输入"
|
||||||
|
@input="keyChange($index,item.field_key)"
|
||||||
|
/>
|
||||||
|
<!-- <el-input
|
||||||
class="halfWidth"
|
class="halfWidth"
|
||||||
v-model="checkForm[item.field_key]"
|
v-model="checkForm[item.field_key]"
|
||||||
type="number"
|
type="number"
|
||||||
placeholder="请输入"
|
placeholder="请输入"
|
||||||
@input="keyChange($index,item.field_key)"
|
@input="keyChange($index,item.field_key)"
|
||||||
/>
|
/>-->
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item
|
<el-form-item
|
||||||
v-else-if="item.field_type === 'date'"
|
v-else-if="item.field_type === 'date'"
|
||||||
:label="item.field_name"
|
:label="item.field_name"
|
||||||
|
:required="require"
|
||||||
>
|
>
|
||||||
<el-date-picker
|
<el-date-picker
|
||||||
disabled
|
disabled
|
||||||
|
|
@ -98,6 +111,7 @@
|
||||||
<el-form-item
|
<el-form-item
|
||||||
v-else-if="item.field_type === 'datetime'"
|
v-else-if="item.field_type === 'datetime'"
|
||||||
:label="item.field_name"
|
:label="item.field_name"
|
||||||
|
:required="require"
|
||||||
>
|
>
|
||||||
<el-date-picker
|
<el-date-picker
|
||||||
disabled
|
disabled
|
||||||
|
|
@ -120,6 +134,7 @@
|
||||||
<el-form-item
|
<el-form-item
|
||||||
v-else-if="item.field_type === 'select'"
|
v-else-if="item.field_type === 'select'"
|
||||||
:label="item.field_name"
|
:label="item.field_name"
|
||||||
|
:required="require"
|
||||||
>
|
>
|
||||||
<el-select
|
<el-select
|
||||||
disabled
|
disabled
|
||||||
|
|
@ -152,6 +167,7 @@
|
||||||
<el-form-item
|
<el-form-item
|
||||||
v-else-if="item.field_type === 'selects'"
|
v-else-if="item.field_type === 'selects'"
|
||||||
:label="item.field_name"
|
:label="item.field_name"
|
||||||
|
:required="require"
|
||||||
>
|
>
|
||||||
<el-select
|
<el-select
|
||||||
disabled
|
disabled
|
||||||
|
|
@ -300,25 +316,15 @@
|
||||||
obj = item;
|
obj = item;
|
||||||
that.judgeList.push(obj)
|
that.judgeList.push(obj)
|
||||||
});
|
});
|
||||||
//原始表的数据
|
debugger;
|
||||||
/*for(let i=0;i<this.origins.length;i++){
|
|
||||||
let key = this.origins[i].field_key;
|
|
||||||
that.originForm[key]=this.origins[i].field_key;
|
|
||||||
that.$set(that.originForm,key,this.origins[i].field_value)
|
|
||||||
}*/
|
|
||||||
//图片地址
|
//图片地址
|
||||||
let imag= this.formData.filter(item => {
|
let imag= this.formData.filter(item => {
|
||||||
return item.field_type === 'draw';
|
return item.field_type === 'draw';
|
||||||
});
|
});
|
||||||
// that.img = 'http://47.95.0.242:2222'+imag[0].draw_template;
|
that.img = new Image();
|
||||||
|
that.img.crossOrigin = '';
|
||||||
/*let originImag= this.origins.filter(item => {
|
that.img = 'http://47.95.0.242:2222'+imag[0].field_value;
|
||||||
return item.field_type === 'draw';
|
that.originImg = 'http://47.95.0.242:2222'+imag[0].origin_value;
|
||||||
});*/
|
|
||||||
/*that.originImg = new Image();
|
|
||||||
that.originImg.crossOrigin = '';
|
|
||||||
that.originImg = imag[0].origin_value;
|
|
||||||
*/
|
|
||||||
listJudge.forEach(item => {
|
listJudge.forEach(item => {
|
||||||
let obj = new Object();
|
let obj = new Object();
|
||||||
obj = item;
|
obj = item;
|
||||||
|
|
|
||||||
|
|
@ -10,12 +10,23 @@
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<script>
|
<script>
|
||||||
|
import tracking from '@/assets/tracking/build/tracking-min.js';
|
||||||
import {faceLogin} from "@/api/testModel";
|
import {faceLogin} from "@/api/testModel";
|
||||||
import { getTickets } from "@/api/workflow";
|
import { getTickets } from "@/api/workflow";
|
||||||
import tracking from '@/assets/tracking/build/tracking-min.js';
|
|
||||||
import '@/assets/tracking/build/data/face-min.js';
|
import '@/assets/tracking/build/data/face-min.js';
|
||||||
|
import {createrecordform,updaterecordform} from "@/api/mtm";
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
|
props: {
|
||||||
|
dialogType: {
|
||||||
|
type:String,
|
||||||
|
default:"new"
|
||||||
|
},
|
||||||
|
recordform: {
|
||||||
|
type:Object,
|
||||||
|
default:null
|
||||||
|
}
|
||||||
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
video: null,
|
video: null,
|
||||||
|
|
@ -77,16 +88,26 @@
|
||||||
let imgData = {base64:img};
|
let imgData = {base64:img};
|
||||||
faceLogin(imgData).then((res) => {
|
faceLogin(imgData).then((res) => {
|
||||||
if (res.code >= 200) {
|
if (res.code >= 200) {
|
||||||
debugger;
|
const isEdit = that.dialogType === "edit";
|
||||||
console.log(res.data);
|
if (isEdit) {
|
||||||
getTickets( {token:res.data.access,page:1,page_size:10,category:'duty'}).then((resp)=>{
|
updaterecordform(that.recordform.id, that.recordform).then(
|
||||||
if(resp.code>=200){
|
(res) => {
|
||||||
debugger;
|
if (res.code >= 200) {
|
||||||
console.log(resp.data);
|
that.$emit('func',false);
|
||||||
|
that.$message.success("成功");
|
||||||
}
|
}
|
||||||
})
|
}
|
||||||
that.uploadLock = false;
|
);
|
||||||
this.$message.success(res.data.username+'签到成功!');
|
} else {
|
||||||
|
createrecordform(that.recordform).then((res) => {
|
||||||
|
if (res.code >= 200) {
|
||||||
|
that.$emit('func',false);
|
||||||
|
that.$message.success("成功");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// this.$message.success(res.data.username+'签到成功!');
|
||||||
/*that.$confirm("是否提交?", "提示", {
|
/*that.$confirm("是否提交?", "提示", {
|
||||||
confirmButtonText: "确认",
|
confirmButtonText: "确认",
|
||||||
cancelButtonText: "取消",
|
cancelButtonText: "取消",
|
||||||
|
|
|
||||||
|
|
@ -20,7 +20,7 @@
|
||||||
<li @click="refreshSelectedTag(selectedTag)">刷新</li>
|
<li @click="refreshSelectedTag(selectedTag)">刷新</li>
|
||||||
<li v-if="!isAffix(selectedTag)" @click="closeSelectedTag(selectedTag)">关闭</li>
|
<li v-if="!isAffix(selectedTag)" @click="closeSelectedTag(selectedTag)">关闭</li>
|
||||||
<li @click="closeOthersTags">关闭其他</li>
|
<li @click="closeOthersTags">关闭其他</li>
|
||||||
<li @click="closeAllTags(selectedTag)">关闭多有</li>
|
<li @click="closeAllTags(selectedTag)">关闭所有</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
|
||||||
|
|
@ -1,32 +1,30 @@
|
||||||
<template>
|
<template>
|
||||||
<div class="dashboard-container">
|
<div class="dashboard-container">
|
||||||
<el-card class="dashboardTopCard">
|
<el-card class="dashboardTopCard">
|
||||||
<div @click="openWord">wendanag</div>
|
|
||||||
<a href="http://www.xdocin.com/xdoc?_func=to&_format=html&_cache=1&_xdoc=http://47.95.0.242:2222/media/2021/09/07/004-%E8%AF%B7%E5%81%87%E5%8D%95_LL8uZdx.docx" target="_blank">XDOC</a>
|
|
||||||
<div class="CardTitleWrap">
|
<div class="CardTitleWrap">
|
||||||
<span class="verticalLine"></span><span class="dashboardCardTitle">数据统计</span>
|
<span class="verticalLine"></span><span class="dashboardCardTitle">数据统计</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="cards">
|
<div class="cards" @click="toDetail('1')">
|
||||||
<div class="cardCurrentText">本月:{{contractTotalCurrent}}</div>
|
<div class="cardCurrentText">本月:{{contractTotalCurrent}}</div>
|
||||||
<div class="cardTotalText">{{contractTotalCount}}</div>
|
<div class="cardTotalText">{{contractTotalCount}}</div>
|
||||||
<div>合同总数</div>
|
<div>合同总数</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="cards">
|
<div class="cards" @click="toDetail('2')">
|
||||||
<div class="cardCurrentText">本月:{{orderTotalCurrent}}</div>
|
<div class="cardCurrentText">本月:{{orderTotalCurrent}}</div>
|
||||||
<div class="cardTotalText">{{orderTotalCount}}</div>
|
<div class="cardTotalText">{{orderTotalCount}}</div>
|
||||||
<div>生产订单总数</div>
|
<div>生产订单总数</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="cards">
|
<div class="cards" @click="toDetail('3')">
|
||||||
<div class="cardCurrentText">在制:{{planTotalCurrent}}</div>
|
<div class="cardCurrentText">在制:{{planTotalCurrent}}</div>
|
||||||
<div class="cardTotalText">{{planTotalCount}}</div>
|
<div class="cardTotalText">{{planTotalCount}}</div>
|
||||||
<div>已排产生产任务</div>
|
<div>已排产生产任务</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="cards">
|
<div class="cards" @click="toDetail('4')">
|
||||||
<div class="cardCurrentText">本月:4</div>
|
<div class="cardCurrentText">本月:4</div>
|
||||||
<div class="cardTotalText">20</div>
|
<div class="cardTotalText">20</div>
|
||||||
<div>累计交付产品数</div>
|
<div>累计交付产品数</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="cards">
|
<div class="cards" @click="toDetail('5')">
|
||||||
<div class="cardCurrentText">本月:2</div>
|
<div class="cardCurrentText">本月:2</div>
|
||||||
<div class="cardTotalText">2</div>
|
<div class="cardTotalText">2</div>
|
||||||
<div>累计不合格产品数</div>
|
<div>累计不合格产品数</div>
|
||||||
|
|
@ -179,19 +177,20 @@
|
||||||
</el-pagination>
|
</el-pagination>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div :style="{height:cardTabelHeight+'px'}">
|
<el-tabs type="card" :style="{height:cardTabelHeight+'px'}" v-model="activeName" @tab-click="activeNameClick">
|
||||||
|
<el-tab-pane label="库存警告" name="库存警告">
|
||||||
<ul class="lists">
|
<ul class="lists">
|
||||||
<li class="listItem">
|
<li class="listItem">
|
||||||
<div class="itemText">
|
<div class="itemText">
|
||||||
<span>玻璃低于安全库存</span><span>2021-12-30</span>
|
<span>玻璃低于安全库存</span><span>2021-12-30</span>
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
<li class="listItem">
|
<li class="listItem" v-for="item in warningList" :key="item.id">
|
||||||
<div class="itemText">
|
<div class="itemText">
|
||||||
<span>某某批货临近交货日期</span><span>2021-12-20</span>
|
<span>{{item}}</span><span>2021-12-20</span>
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
<li class="listItem">
|
<!--<li class="listItem">
|
||||||
<div class="itemText">
|
<div class="itemText">
|
||||||
<span>玻璃低于安全库存</span><span>2021-11-30</span>
|
<span>玻璃低于安全库存</span><span>2021-11-30</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -200,17 +199,38 @@
|
||||||
<div class="itemText">
|
<div class="itemText">
|
||||||
<span>某某批货临近交货日期</span><span>2021-11-20</span>
|
<span>某某批货临近交货日期</span><span>2021-11-20</span>
|
||||||
</div>
|
</div>
|
||||||
|
</li>-->
|
||||||
|
</ul>
|
||||||
|
</el-tab-pane>
|
||||||
|
<el-tab-pane label="临近交货" name="临近交货">
|
||||||
|
<ul class="lists">
|
||||||
|
<li class="listItem">
|
||||||
|
<div class="itemText">
|
||||||
|
<span>某某批货临近交货日期</span><span>2021-12-20</span>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
<li class="listItem" v-for="item in warningList" :key="item.id">
|
||||||
|
<div class="itemText">
|
||||||
|
<span>{{item}}</span><span>2021-12-20</span>
|
||||||
|
</div>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
</el-tab-pane>
|
||||||
|
<el-tab-pane label="过期提醒" name="过期提醒">
|
||||||
|
<ul class="lists">
|
||||||
|
<li class="listItem">
|
||||||
|
<div class="itemText">
|
||||||
|
<span>某某批货临近过期</span><span>2021-11-20</span>
|
||||||
</div>
|
</div>
|
||||||
<!--<el-badge :value="count.total_count" class="item" @click.native="gotoTicketPage">
|
</li>
|
||||||
<el-icon class="el-icon-s-management" style="font-size: 70px;color: #d29898"></el-icon>
|
<li class="listItem" v-for="item in warningList" :key="item.id">
|
||||||
</el-badge>
|
<div class="itemText">
|
||||||
<div></div>
|
<span>{{item}}</span><span>2021-12-20</span>
|
||||||
<div class="dashboard-text">name: {{ name }}</div>
|
</div>
|
||||||
<div class="dashboard-text">perms:
|
</li>
|
||||||
<span v-for="perm in perms" :key="perm">{{ perm }}</span>
|
</ul>
|
||||||
</div>-->
|
</el-tab-pane>
|
||||||
|
</el-tabs>
|
||||||
</el-card>
|
</el-card>
|
||||||
</el-col>
|
</el-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
|
|
@ -220,8 +240,10 @@
|
||||||
<script>
|
<script>
|
||||||
import echarts from 'echarts'
|
import echarts from 'echarts'
|
||||||
import { mapGetters } from 'vuex';
|
import { mapGetters } from 'vuex';
|
||||||
|
import { getMaterialList } from "@/api/mtm";
|
||||||
import { getInventoryList } from "@/api/inm";
|
import { getInventoryList } from "@/api/inm";
|
||||||
import { getProductionplanList} from "@/api/pm";
|
import { getProductionplanList} from "@/api/pm";
|
||||||
|
import { getmaterialbatchList } from "@/api/inm";
|
||||||
import { getContractList , getOrderList } from "@/api/sam";
|
import { getContractList , getOrderList } from "@/api/sam";
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
|
|
@ -247,6 +269,7 @@ export default {
|
||||||
planList:[],
|
planList:[],
|
||||||
stockList:[],
|
stockList:[],
|
||||||
remindList:[],
|
remindList:[],
|
||||||
|
warningList:[],
|
||||||
list:[
|
list:[
|
||||||
{id:1,name:'HIehd9',card:'3337',sco:'REF-32'},
|
{id:1,name:'HIehd9',card:'3337',sco:'REF-32'},
|
||||||
{id:1,name:'HIehd9',card:'3337',sco:'REF-32'},
|
{id:1,name:'HIehd9',card:'3337',sco:'REF-32'},
|
||||||
|
|
@ -260,6 +283,7 @@ export default {
|
||||||
"5":'加工工具',
|
"5":'加工工具',
|
||||||
"6":'辅助工装',
|
"6":'辅助工装',
|
||||||
},
|
},
|
||||||
|
activeName:'库存警告',
|
||||||
seriesData:[80,95,96, 96, 96, 98, 99,100],
|
seriesData:[80,95,96, 96, 96, 98, 99,100],
|
||||||
contractTotalCount:null,//合同总数
|
contractTotalCount:null,//合同总数
|
||||||
contractTotalCurrent:null,
|
contractTotalCurrent:null,
|
||||||
|
|
@ -286,49 +310,56 @@ export default {
|
||||||
window.open("http://47.95.0.242:2222/media/2021/09/07/004-%E8%AF%B7%E5%81%87%E5%8D%95_LL8uZdx.docx");
|
window.open("http://47.95.0.242:2222/media/2021/09/07/004-%E8%AF%B7%E5%81%87%E5%8D%95_LL8uZdx.docx");
|
||||||
},
|
},
|
||||||
getStatisticsData(){
|
getStatisticsData(){
|
||||||
|
let that = this;
|
||||||
let dat = new Date();
|
let dat = new Date();
|
||||||
this.week = dat.getDay();
|
that.week = dat.getDay();
|
||||||
this.currentTime = dat.getTime();
|
that.currentTime = dat.getTime();
|
||||||
this.currentYear = dat.getFullYear();
|
that.currentYear = dat.getFullYear();
|
||||||
let month = dat.getMonth() + 1;
|
let month = dat.getMonth() + 1;
|
||||||
this.currentMonth = month>9?month:'0'+month ;
|
that.currentMonth = month>9?month:'0'+month ;
|
||||||
this.currentDay = dat.getDate();
|
that.currentDay = dat.getDate();
|
||||||
let create_time_start = this.currentYear+'-'+this.currentMonth+'-01';
|
let create_time_start = that.currentYear+'-'+that.currentMonth+'-01';
|
||||||
//获取合同数
|
//获取合同数
|
||||||
getContractList({page:1,page_size:1}).then((response) => {
|
getContractList({page:1,page_size:1}).then((response) => {
|
||||||
if (response.data) {
|
if (response.data) {
|
||||||
this.contractTotalCount = response.data.count;
|
that.contractTotalCount = response.data.count;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
getContractList({page:1,page_size:1,create_time_start:create_time_start}).then((response) => {
|
getContractList({page:1,page_size:1,create_time_start:create_time_start}).then((response) => {
|
||||||
if (response.data) {
|
if (response.data) {
|
||||||
this.contractTotalCurrent = response.data.count;
|
that.contractTotalCurrent = response.data.count;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
//获取生产订单数
|
//获取生产订单数
|
||||||
getOrderList({page:1,page_size:1}).then((response) => {
|
getOrderList({page:1,page_size:1}).then((response) => {
|
||||||
if (response.data) {
|
if (response.data) {
|
||||||
this.orderTotalCount = response.data.count;
|
that.orderTotalCount = response.data.count;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
getOrderList({page:1,page_size:1,create_time_start:create_time_start}).then((response) => {
|
getOrderList({page:1,page_size:1,create_time_start:create_time_start}).then((response) => {
|
||||||
if (response.data) {
|
if (response.data) {
|
||||||
this.orderTotalCurrent = response.data.count;
|
that.orderTotalCurrent = response.data.count;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
//获取已排产任务
|
//获取已排产任务
|
||||||
getProductionplanList({page:1,page_size:1}).then((response) => {
|
getProductionplanList({page:1,page_size:1}).then((response) => {
|
||||||
if (response.data) {
|
if (response.data) {
|
||||||
this.planTotalCount = response.data.count;
|
that.planTotalCount = response.data.count;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
getProductionplanList({page:1,page_size:1,tag:'working'}).then((response) => {
|
getProductionplanList({page:1,page_size:1,tag:'working'}).then((response) => {
|
||||||
if (response.data) {
|
if (response.data) {
|
||||||
this.planTotalCurrent = response.data.count;
|
that.planTotalCurrent = response.data.count;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
//获取交付产品
|
//获取交付产品
|
||||||
//获取不合格产品
|
//获取不合格产品
|
||||||
|
|
||||||
|
getMaterialList({page:0,tag:'low_inm'}).then((response) => {
|
||||||
|
if (response.data) {
|
||||||
|
that.warningList = response.data;
|
||||||
|
}
|
||||||
|
});
|
||||||
},
|
},
|
||||||
gotoTicketPage(){
|
gotoTicketPage(){
|
||||||
let path = this.$route.path;
|
let path = this.$route.path;
|
||||||
|
|
@ -476,16 +507,30 @@ export default {
|
||||||
stockMore(){
|
stockMore(){
|
||||||
this.$router.push({name:'warehouse',params:{}})
|
this.$router.push({name:'warehouse',params:{}})
|
||||||
},
|
},
|
||||||
|
toDetail(index){
|
||||||
|
if(index==='1'){
|
||||||
|
this.$router.push({name:'contract',params:{page:1,page_size:20}})
|
||||||
|
}else if(index==='2'){
|
||||||
|
this.$router.push({name:'order',params:{page:1,page_size:20}})
|
||||||
|
}else if(index==='3'){
|
||||||
|
this.$router.push({name:'plan',params:{page:1,page_size:20}})
|
||||||
|
}else if(index==='4'){
|
||||||
|
this.$router.push({name:'product',params:{page:1,page_size:20,material__type:1}})
|
||||||
|
}else if(index==='5'){
|
||||||
|
this.$router.push({name:'product',params:{page:1,page_size:20,material__type:1}})
|
||||||
|
}
|
||||||
|
},
|
||||||
//便捷查询按钮
|
//便捷查询按钮
|
||||||
convenientClick(index,type){
|
convenientClick(index,type){
|
||||||
let startTime = '',endTime = '',url='',activeIndex = '1',obj = new Object();
|
let that = this;
|
||||||
|
let startTime = '',endTime = '',activeIndex = '1';
|
||||||
let dat = new Date();
|
let dat = new Date();
|
||||||
let week = dat.getDay();//0-6
|
let week = dat.getDay();//0-6
|
||||||
let currentTime = dat.getTime();
|
let currentTime = dat.getTime();
|
||||||
let currentYear = dat.getFullYear();
|
let currentYear = dat.getFullYear();
|
||||||
let currentMonth = dat.getMonth() + 1;
|
let currentMonth = dat.getMonth() + 1;
|
||||||
let currentDay = dat.getDate();
|
let currentDay = dat.getDate();
|
||||||
endTime = currentYear+'-'+currentMonth+''+currentDay;
|
endTime = currentYear+'-'+currentMonth+'-'+currentDay;
|
||||||
if(type==='week'){
|
if(type==='week'){
|
||||||
activeIndex = '1';
|
activeIndex = '1';
|
||||||
let num = week===0?6:week-1;
|
let num = week===0?6:week-1;
|
||||||
|
|
@ -510,11 +555,16 @@ export default {
|
||||||
}
|
}
|
||||||
startTime = yea+'-'+mon+'-01';
|
startTime = yea+'-'+mon+'-01';
|
||||||
}
|
}
|
||||||
obj.startTime = startTime;
|
|
||||||
obj.endTime = endTime;
|
|
||||||
if(index==='1'){
|
if(index==='1'){
|
||||||
this.tableDate = null;
|
this.tableDate = null;
|
||||||
this.tableIndex = activeIndex;
|
this.tableIndex = activeIndex;
|
||||||
|
this.listLoadingPlan = true;
|
||||||
|
getProductionplanList({page:0,create_time_start:startTime,create_time_end:endTime}).then((response) => {
|
||||||
|
if (response.data) {
|
||||||
|
that.planList = response.data;
|
||||||
|
}
|
||||||
|
this.listLoadingPlan = false;
|
||||||
|
});
|
||||||
}else{
|
}else{
|
||||||
this.chartDate = null;
|
this.chartDate = null;
|
||||||
this.chartIndex = activeIndex;
|
this.chartIndex = activeIndex;
|
||||||
|
|
@ -523,6 +573,7 @@ export default {
|
||||||
},
|
},
|
||||||
//选择月份
|
//选择月份
|
||||||
searchTimeChange(index){
|
searchTimeChange(index){
|
||||||
|
let that = this;
|
||||||
let startDate = '',endDate = '';
|
let startDate = '',endDate = '';
|
||||||
let year = null,month = null,days = null;
|
let year = null,month = null,days = null;
|
||||||
if(index==='1'){
|
if(index==='1'){
|
||||||
|
|
@ -532,16 +583,23 @@ export default {
|
||||||
month = this.tableDate.split("-")[1];
|
month = this.tableDate.split("-")[1];
|
||||||
let d = new Date(year, month, 0);
|
let d = new Date(year, month, 0);
|
||||||
days = d.getDate();
|
days = d.getDate();
|
||||||
|
endDate = this.tableDate + '-'+days;
|
||||||
|
this.listLoadingPlan = true;
|
||||||
|
getProductionplanList({page:0,create_time_start:startDate,create_time_end:endDate}).then((response) => {
|
||||||
|
if (response.data) {
|
||||||
|
that.planList = response.data;
|
||||||
|
}
|
||||||
|
this.listLoadingPlan = false;
|
||||||
|
});
|
||||||
}else{
|
}else{
|
||||||
this.chartIndex = null;
|
this.chartIndex = null;
|
||||||
startDate = this.chartDate+'-01';
|
startDate = this.chartDate+'-01';
|
||||||
year = this.tableDate.split("-")[0];
|
year = this.chartDate.split("-")[0];
|
||||||
month = this.tableDate.split("-")[1];
|
month = this.chartDate.split("-")[1];
|
||||||
let d = new Date(year, month, 0);
|
let d = new Date(year, month, 0);
|
||||||
days = d.getDate();
|
days = d.getDate();
|
||||||
}
|
|
||||||
endDate = this.chartDate + '-'+days;
|
endDate = this.chartDate + '-'+days;
|
||||||
console.log(startDate,endDate);
|
}
|
||||||
},
|
},
|
||||||
handleStockSizeChange(val){
|
handleStockSizeChange(val){
|
||||||
this.stockPageSize = val;
|
this.stockPageSize = val;
|
||||||
|
|
@ -559,6 +617,36 @@ export default {
|
||||||
this.listLoading = false;
|
this.listLoading = false;
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
activeNameClick(tab, event) {
|
||||||
|
let that = this;
|
||||||
|
// debugger;
|
||||||
|
// console.log(tab, event);
|
||||||
|
if (tab.label === '库存警告') {
|
||||||
|
getMaterialList({page:0,tag:'low_inm'}).then((response) => {
|
||||||
|
if (response.data) {
|
||||||
|
that.warningList = response.data;
|
||||||
|
that.remindTotal = response.data.length;
|
||||||
|
}
|
||||||
|
this.listLoadingPlan = false;
|
||||||
|
});
|
||||||
|
}else if(tab.label === '临近交货') {
|
||||||
|
getmaterialbatchList({page:0,tag:'expired'}).then((response) => {
|
||||||
|
if (response.data) {
|
||||||
|
that.warningList = response.data;
|
||||||
|
that.remindTotal = response.data.length;
|
||||||
|
}
|
||||||
|
this.listLoadingPlan = false;
|
||||||
|
});
|
||||||
|
} else if(tab.label === '过期提醒'){
|
||||||
|
getmaterialbatchList({page:0,tag:'expired'}).then((response) => {
|
||||||
|
if (response.data) {
|
||||||
|
that.warningList = response.data;
|
||||||
|
that.remindTotal = response.data.length;
|
||||||
|
}
|
||||||
|
this.listLoadingPlan = false;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
},
|
||||||
handleRemindSizeChange(val){
|
handleRemindSizeChange(val){
|
||||||
this.remindPageSize = val;
|
this.remindPageSize = val;
|
||||||
this.remindPage = 1;
|
this.remindPage = 1;
|
||||||
|
|
@ -572,7 +660,7 @@ export default {
|
||||||
// let he = document.documentElement.clientHeight || document.body.clientHeight;
|
// let he = document.documentElement.clientHeight || document.body.clientHeight;
|
||||||
let hei = document.getElementsByClassName('app-main')[0].clientHeight;
|
let hei = document.getElementsByClassName('app-main')[0].clientHeight;
|
||||||
let heig = document.getElementsByClassName('dashboardTopCard')[0].clientHeight;
|
let heig = document.getElementsByClassName('dashboardTopCard')[0].clientHeight;
|
||||||
this.cardTabelHeight = ((hei-heig)/2-80);
|
this.cardTabelHeight = ((hei-heig-130)/2);
|
||||||
document.getElementById('chartColumn').style.height = this.cardTabelHeight+'px';
|
document.getElementById('chartColumn').style.height = this.cardTabelHeight+'px';
|
||||||
this.drawChart();
|
this.drawChart();
|
||||||
this.getPlanList();
|
this.getPlanList();
|
||||||
|
|
@ -711,7 +799,7 @@ export default {
|
||||||
.listItem{
|
.listItem{
|
||||||
height: 40px;
|
height: 40px;
|
||||||
line-height: 40px;
|
line-height: 40px;
|
||||||
font-size: 18px;
|
font-size: 16px;
|
||||||
.itemText{
|
.itemText{
|
||||||
display: flex;
|
display: flex;
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
|
|
|
||||||
|
|
@ -1,12 +1,10 @@
|
||||||
<template>
|
<template>
|
||||||
|
|
||||||
<div class="app-container">
|
<div class="app-container">
|
||||||
<el-card>
|
<el-card>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<el-button type="primary" icon="el-icon-plus" @click="handleCreate"
|
<el-button type="primary" icon="el-icon-plus" @click="handleCreate">
|
||||||
>新增物料</el-button
|
新增物料
|
||||||
>
|
</el-button>
|
||||||
<el-input
|
<el-input
|
||||||
v-model="listQuery.search"
|
v-model="listQuery.search"
|
||||||
placeholder="物料名称/物料编号"
|
placeholder="物料名称/物料编号"
|
||||||
|
|
@ -19,17 +17,16 @@
|
||||||
type="primary"
|
type="primary"
|
||||||
icon="el-icon-search"
|
icon="el-icon-search"
|
||||||
@click="handleFilter"
|
@click="handleFilter"
|
||||||
>搜索</el-button
|
>搜索
|
||||||
>
|
</el-button>
|
||||||
<el-button
|
<el-button
|
||||||
class="filter-item"
|
class="filter-item"
|
||||||
type="primary"
|
type="primary"
|
||||||
icon="el-icon-refresh-left"
|
icon="el-icon-refresh-left"
|
||||||
@click="resetFilter"
|
@click="resetFilter"
|
||||||
>重置</el-button
|
>重置
|
||||||
>
|
</el-button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</el-card>
|
</el-card>
|
||||||
<el-card style="margin-top: 2px">
|
<el-card style="margin-top: 2px">
|
||||||
<el-tabs v-model="activeName" type="card" @tab-click="handleClick">
|
<el-tabs v-model="activeName" type="card" @tab-click="handleClick">
|
||||||
|
|
@ -54,33 +51,27 @@
|
||||||
<el-table-column type="index" width="50"/>
|
<el-table-column type="index" width="50"/>
|
||||||
<el-table-column label="物料编号">
|
<el-table-column label="物料编号">
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
|
|
||||||
{{ scope.row.number }}
|
{{ scope.row.number }}
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
|
|
||||||
<el-table-column label="物料类别">
|
<el-table-column label="物料类别">
|
||||||
<template slot-scope="scope"> {{options_[scope.row.type]}}</template>
|
<template slot-scope="scope"> {{options_[scope.row.type]}}</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
|
|
||||||
<el-table-column label="物料名称">
|
<el-table-column label="物料名称">
|
||||||
<template slot-scope="scope">{{ scope.row.name }}</template>
|
<template slot-scope="scope">{{ scope.row.name }}</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
|
|
||||||
<el-table-column label="规格型号">
|
<el-table-column label="规格型号">
|
||||||
<template slot-scope="scope">{{ scope.row.specification }}</template>
|
<template slot-scope="scope">{{ scope.row.specification }}</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="单片玻璃数量" v-if="materialList.results[0].type==1">
|
<el-table-column label="单片玻璃数量" v-if="materialList.results[0].type==1">
|
||||||
<template slot-scope="scope">{{ scope.row.piece_count }}</template>
|
<template slot-scope="scope">{{ scope.row.piece_count }}</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
|
|
||||||
<el-table-column label="计量单位">
|
<el-table-column label="计量单位">
|
||||||
<template slot-scope="scope">{{ scope.row.unit }}</template>
|
<template slot-scope="scope">{{ scope.row.unit }}</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="创建时间">
|
<el-table-column label="创建时间">
|
||||||
<template slot-scope="scope">{{ scope.row.create_time }}</template>
|
<template slot-scope="scope">{{ scope.row.create_time }}</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
|
|
||||||
<el-table-column
|
<el-table-column
|
||||||
align="center"
|
align="center"
|
||||||
label="操作"
|
label="操作"
|
||||||
|
|
@ -91,27 +82,26 @@
|
||||||
v-if="checkPermission(['material_update'])&&scope.row.type!=5&&scope.row.type!=6"
|
v-if="checkPermission(['material_update'])&&scope.row.type!=5&&scope.row.type!=6"
|
||||||
type="primary"
|
type="primary"
|
||||||
@click="handlebind(scope)"
|
@click="handlebind(scope)"
|
||||||
>检查表</el-link
|
>检查表
|
||||||
>
|
</el-link>
|
||||||
|
|
||||||
<el-link
|
<el-link
|
||||||
v-if="checkPermission(['material_update'])"
|
v-if="checkPermission(['material_update'])"
|
||||||
type="primary"
|
type="primary"
|
||||||
@click="handleEdit(scope)"
|
@click="handleEdit(scope)"
|
||||||
>编辑</el-link
|
>编辑
|
||||||
>
|
</el-link>
|
||||||
<el-link
|
<el-link
|
||||||
v-if="checkPermission(['material_update'])"
|
v-if="checkPermission(['material_update'])"
|
||||||
type="primary"
|
type="primary"
|
||||||
@click="handledetail(scope)"
|
@click="handledetail(scope)"
|
||||||
>详情</el-link
|
>详情
|
||||||
>
|
</el-link>
|
||||||
<el-link
|
<el-link
|
||||||
v-if="checkPermission(['material_delete'])"
|
v-if="checkPermission(['material_delete'])"
|
||||||
type="danger"
|
type="danger"
|
||||||
@click="handleDelete(scope)"
|
@click="handleDelete(scope)"
|
||||||
>删除</el-link
|
>删除
|
||||||
>
|
</el-link>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
</el-table>
|
</el-table>
|
||||||
|
|
@ -185,7 +175,14 @@
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<script>
|
<script>
|
||||||
import { getMaterialList,getMaterial, createMaterial,updateMaterial,deleteMaterial,getProcessList } from "@/api/mtm";
|
import {
|
||||||
|
getMaterialList,
|
||||||
|
getMaterial,
|
||||||
|
createMaterial,
|
||||||
|
updateMaterial,
|
||||||
|
deleteMaterial,
|
||||||
|
getProcessList
|
||||||
|
} from "@/api/mtm";
|
||||||
import checkPermission from "@/utils/permission";
|
import checkPermission from "@/utils/permission";
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -258,7 +255,6 @@ export default {
|
||||||
page_size: 20,
|
page_size: 20,
|
||||||
},
|
},
|
||||||
activeName: "",
|
activeName: "",
|
||||||
|
|
||||||
listLoading: true,
|
listLoading: true,
|
||||||
dialogVisible: false,
|
dialogVisible: false,
|
||||||
dialogType: "new",
|
dialogType: "new",
|
||||||
|
|
@ -314,8 +310,7 @@ export default {
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
//绑定工序
|
//绑定工序
|
||||||
handlebind(scope)
|
handlebind(scope) {
|
||||||
{
|
|
||||||
|
|
||||||
this.$router.push({name: "MaterialDO", params: {id: scope.row.id},})
|
this.$router.push({name: "MaterialDO", params: {id: scope.row.id},})
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -20,7 +20,6 @@
|
||||||
</el-button>
|
</el-button>
|
||||||
<!--表格列表-->
|
<!--表格列表-->
|
||||||
<el-table
|
<el-table
|
||||||
|
|
||||||
:data="recordformList.results"
|
:data="recordformList.results"
|
||||||
border
|
border
|
||||||
fit
|
fit
|
||||||
|
|
@ -38,31 +37,26 @@
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
<el-tag v-if="scope.row.enabled==false">否</el-tag>
|
<el-tag v-if="scope.row.enabled==false">否</el-tag>
|
||||||
<el-tag v-if="scope.row.enabled==true">是</el-tag>
|
<el-tag v-if="scope.row.enabled==true">是</el-tag>
|
||||||
|
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
|
|
||||||
<el-table-column align="center" label="操作">
|
<el-table-column align="center" label="操作">
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
<el-link
|
<el-link
|
||||||
v-if="checkPermission(['material_update'])"
|
v-if="checkPermission(['material_update'])"
|
||||||
@click="handleLook(scope)"
|
@click="handleLook(scope)"
|
||||||
>查看
|
>查看
|
||||||
</el-link
|
</el-link>
|
||||||
>
|
|
||||||
<el-link
|
<el-link
|
||||||
v-if="checkPermission(['material_update'])"
|
v-if="checkPermission(['material_update'])"
|
||||||
@click="handleEdit(scope)"
|
@click="handleEdit(scope)"
|
||||||
>编辑
|
>编辑
|
||||||
</el-link
|
</el-link>
|
||||||
>
|
|
||||||
<el-link
|
<el-link
|
||||||
v-if="checkPermission(['material_delete'])"
|
v-if="checkPermission(['material_delete'])"
|
||||||
type="danger"
|
type="danger"
|
||||||
@click="handleDelete(scope)"
|
@click="handleDelete(scope)"
|
||||||
>删除
|
>删除
|
||||||
</el-link
|
</el-link>
|
||||||
>
|
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
</el-table>
|
</el-table>
|
||||||
|
|
@ -86,12 +80,10 @@
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-form>
|
</el-form>
|
||||||
<div style="text-align: right">
|
<div style="text-align: right">
|
||||||
<el-button type="danger" @click="dialogVisible = false"
|
<el-button type="danger" @click="dialogVisible = false">取消
|
||||||
>取消
|
|
||||||
</el-button>
|
|
||||||
<el-button type="primary" @click="recordformconfirm('Forms')"
|
|
||||||
>确认
|
|
||||||
</el-button>
|
</el-button>
|
||||||
|
<!--<el-button type="primary" @click="recordformconfirm('Forms')">确认</el-button>-->
|
||||||
|
<el-button type="primary" @click="recordformcon">管理员授权</el-button>
|
||||||
</div>
|
</div>
|
||||||
</el-dialog>
|
</el-dialog>
|
||||||
<!--表格展示-->
|
<!--表格展示-->
|
||||||
|
|
@ -256,8 +248,7 @@
|
||||||
icon="el-icon-plus"
|
icon="el-icon-plus"
|
||||||
@click="handlefieldCreate"
|
@click="handlefieldCreate"
|
||||||
>新增
|
>新增
|
||||||
</el-button
|
</el-button>
|
||||||
>
|
|
||||||
<!--表格字段列表-->
|
<!--表格字段列表-->
|
||||||
<el-table
|
<el-table
|
||||||
:data="fieldList.results"
|
:data="fieldList.results"
|
||||||
|
|
@ -270,23 +261,18 @@
|
||||||
>
|
>
|
||||||
<el-table-column type="index" width="50"/>
|
<el-table-column type="index" width="50"/>
|
||||||
<el-table-column label="字段名称">
|
<el-table-column label="字段名称">
|
||||||
<template slot-scope="scope">{{
|
<template slot-scope="scope">
|
||||||
scope.row.field_name
|
{{scope.row.field_name}}
|
||||||
}}
|
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
|
|
||||||
<el-table-column label="字段类型">
|
<el-table-column label="字段类型">
|
||||||
<template slot-scope="scope">{{
|
<template slot-scope="scope">
|
||||||
options_[scope.row.field_type]
|
{{options_[scope.row.field_type]}}
|
||||||
}}
|
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
|
|
||||||
<el-table-column label="字段标识">
|
<el-table-column label="字段标识">
|
||||||
<template slot-scope="scope">{{
|
<template slot-scope="scope">
|
||||||
scope.row.field_key
|
{{scope.row.field_key}}
|
||||||
}}
|
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<!--
|
<!--
|
||||||
|
|
@ -317,7 +303,6 @@
|
||||||
<el-tag v-else>否</el-tag>
|
<el-tag v-else>否</el-tag>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
|
|
||||||
<el-table-column align="center" label="操作">
|
<el-table-column align="center" label="操作">
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
<el-link
|
<el-link
|
||||||
|
|
@ -325,15 +310,13 @@
|
||||||
type="primary"
|
type="primary"
|
||||||
@click="handlefieldEdit(scope)"
|
@click="handlefieldEdit(scope)"
|
||||||
>编辑
|
>编辑
|
||||||
</el-link
|
</el-link>
|
||||||
>
|
|
||||||
<el-link
|
<el-link
|
||||||
v-if="checkPermission(['material_delete'])"
|
v-if="checkPermission(['material_delete'])"
|
||||||
type="danger"
|
type="danger"
|
||||||
@click="handlefieldDelete(scope)"
|
@click="handlefieldDelete(scope)"
|
||||||
>删除
|
>删除
|
||||||
</el-link
|
</el-link>
|
||||||
>
|
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
</el-table>
|
</el-table>
|
||||||
|
|
@ -383,8 +366,7 @@
|
||||||
field.field_type == 'radio' ||
|
field.field_type == 'radio' ||
|
||||||
field.field_type == 'checkbox' ||
|
field.field_type == 'checkbox' ||
|
||||||
field.field_type == 'select' ||
|
field.field_type == 'select' ||
|
||||||
field.field_type == 'selects'
|
field.field_type == 'selects'"
|
||||||
"
|
|
||||||
>
|
>
|
||||||
<el-button @click.prevent="addDomain" style="border: none">
|
<el-button @click.prevent="addDomain" style="border: none">
|
||||||
<i class="el-icon-circle-plus-outline"></i>
|
<i class="el-icon-circle-plus-outline"></i>
|
||||||
|
|
@ -527,6 +509,17 @@
|
||||||
</el-col>
|
</el-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
</el-card>
|
</el-card>
|
||||||
|
<el-dialog :visible.sync="limitedPhoto">
|
||||||
|
<div style="font-size: 28px;color: #333333;text-align: center;font-weight: bold;margin-bottom: 15px;">权限验证</div>
|
||||||
|
<div class="testTracking">
|
||||||
|
<faceLogin
|
||||||
|
name="faceLogin"
|
||||||
|
:dialogType="dialogType"
|
||||||
|
:recordform="recordform"
|
||||||
|
@func="getMsgFormSon"
|
||||||
|
></faceLogin>
|
||||||
|
</div>
|
||||||
|
</el-dialog>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
|
@ -536,6 +529,7 @@
|
||||||
import {getEquipmentAll} from "@/api/equipment";
|
import {getEquipmentAll} from "@/api/equipment";
|
||||||
import vueJsonEditor from "vue-json-editor";
|
import vueJsonEditor from "vue-json-editor";
|
||||||
import {upUrl, upHeaders} from "@/api/file";
|
import {upUrl, upHeaders} from "@/api/file";
|
||||||
|
import faceLogin from '@/components/faceLogin/faceLogin.vue'
|
||||||
import {
|
import {
|
||||||
getrecordformList,
|
getrecordformList,
|
||||||
createrecordform,
|
createrecordform,
|
||||||
|
|
@ -561,7 +555,7 @@
|
||||||
const defaultfield = {};
|
const defaultfield = {};
|
||||||
let preDrawAry = [];
|
let preDrawAry = [];
|
||||||
export default {
|
export default {
|
||||||
components: {Pagination, vueJsonEditor, Treeselect, customForm},
|
components: {Pagination, vueJsonEditor, Treeselect, customForm,faceLogin},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
step: defaultstep,
|
step: defaultstep,
|
||||||
|
|
@ -576,13 +570,15 @@
|
||||||
dialogVisibleForm: false,
|
dialogVisibleForm: false,
|
||||||
dialogTypes: "new",
|
dialogTypes: "new",
|
||||||
field: {
|
field: {
|
||||||
field_type: "",
|
field_type: null,
|
||||||
field_key: "",
|
field_key: "",
|
||||||
field_name: "",
|
field_name: null,
|
||||||
sort: "",
|
sort: null,
|
||||||
parent: "",
|
parent: null,
|
||||||
help_text: "",
|
help_text: null,
|
||||||
draw_template: "",//图片模板
|
rule_expression: null,
|
||||||
|
display_expression: null,
|
||||||
|
draw_template: null,//图片模板
|
||||||
field_choice: [""],
|
field_choice: [""],
|
||||||
},
|
},
|
||||||
field_choice: [""],
|
field_choice: [""],
|
||||||
|
|
@ -699,6 +695,7 @@
|
||||||
imgData: '',
|
imgData: '',
|
||||||
canvasImg: '',
|
canvasImg: '',
|
||||||
judgeList: [],
|
judgeList: [],
|
||||||
|
limitedPhoto:false
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
computed: {},
|
computed: {},
|
||||||
|
|
@ -888,9 +885,10 @@
|
||||||
this.recordform = Object.assign({}, defaultrecordform);
|
this.recordform = Object.assign({}, defaultrecordform);
|
||||||
this.dialogType = "new";
|
this.dialogType = "new";
|
||||||
this.dialogVisible = true;
|
this.dialogVisible = true;
|
||||||
this.$nextTick(() => {
|
this.$refs["Forms"].resetFields();
|
||||||
this.$refs["Forms"].clearValidate();
|
// this.$nextTick(() => {
|
||||||
});
|
// this.$refs["Forms"].resetFields();
|
||||||
|
// });
|
||||||
},
|
},
|
||||||
//新增字段
|
//新增字段
|
||||||
handlefieldCreate() {
|
handlefieldCreate() {
|
||||||
|
|
@ -898,7 +896,18 @@
|
||||||
// this.field = Object.assign({}, defaultfield);
|
// this.field = Object.assign({}, defaultfield);
|
||||||
this.dialogType1 = "new";
|
this.dialogType1 = "new";
|
||||||
this.dialogVisible1 = true;
|
this.dialogVisible1 = true;
|
||||||
|
// this.$refs["Form"].resetFields();
|
||||||
this.$nextTick(() => {
|
this.$nextTick(() => {
|
||||||
|
this.field.field_type= null;
|
||||||
|
this.field.field_key= null;
|
||||||
|
this.field.field_name= null;
|
||||||
|
this.field.sort= null;
|
||||||
|
this.field.parent= null;
|
||||||
|
this.field.help_text= null;
|
||||||
|
this.field.draw_template= null;
|
||||||
|
this.field.field_choice= null;
|
||||||
|
this.field.rule_expression= null;
|
||||||
|
this.field.display_expression= null;
|
||||||
this.$refs["Form"].clearValidate();
|
this.$refs["Form"].clearValidate();
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
@ -1016,6 +1025,16 @@
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
recordformcon(){
|
||||||
|
this.recordform.material = this.material;
|
||||||
|
this.recordform.type = 2;
|
||||||
|
this.limitedPhoto = true;
|
||||||
|
},
|
||||||
|
getMsgFormSon(data){
|
||||||
|
this.limitedPhoto = data;
|
||||||
|
this.recordformLists();
|
||||||
|
this.dialogVisible = false;
|
||||||
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,6 @@
|
||||||
<el-card class="box-card">
|
<el-card class="box-card">
|
||||||
<div slot="header" class="clearfix">
|
<div slot="header" class="clearfix">
|
||||||
<span>生产任务列表</span>
|
<span>生产任务列表</span>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<el-input
|
<el-input
|
||||||
v-model="listQuery1.search"
|
v-model="listQuery1.search"
|
||||||
|
|
@ -17,15 +16,15 @@
|
||||||
type="primary"
|
type="primary"
|
||||||
icon="el-icon-search"
|
icon="el-icon-search"
|
||||||
@click="handleFilter"
|
@click="handleFilter"
|
||||||
>搜索</el-button
|
>搜索
|
||||||
>
|
</el-button>
|
||||||
<el-button
|
<el-button
|
||||||
class="filter-item"
|
class="filter-item"
|
||||||
type="primary"
|
type="primary"
|
||||||
icon="el-icon-refresh-left"
|
icon="el-icon-refresh-left"
|
||||||
@click="resetFilter"
|
@click="resetFilter"
|
||||||
>重置</el-button
|
>重置
|
||||||
>
|
</el-button>
|
||||||
<el-table
|
<el-table
|
||||||
:data="productionplanList.results"
|
:data="productionplanList.results"
|
||||||
border
|
border
|
||||||
|
|
@ -33,11 +32,8 @@
|
||||||
stripe
|
stripe
|
||||||
style="width: 100%"
|
style="width: 100%"
|
||||||
height="300"
|
height="300"
|
||||||
|
|
||||||
>
|
>
|
||||||
<el-table-column type="index" width="50"/>
|
<el-table-column type="index" width="50"/>
|
||||||
|
|
||||||
|
|
||||||
<el-table-column label="任务编号" width="110">
|
<el-table-column label="任务编号" width="110">
|
||||||
<template slot-scope="scope">{{ scope.row.number }}</template>
|
<template slot-scope="scope">{{ scope.row.number }}</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
|
|
@ -47,7 +43,6 @@
|
||||||
<el-table-column label="合同编号" width="110">
|
<el-table-column label="合同编号" width="110">
|
||||||
<template slot-scope="scope" v-if="scope.row.contract">{{ scope.row.order_.contract_.number }}</template>
|
<template slot-scope="scope" v-if="scope.row.contract">{{ scope.row.order_.contract_.number }}</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
|
|
||||||
<el-table-column label="产品名称" width="150" show-overflow-tooltip>
|
<el-table-column label="产品名称" width="150" show-overflow-tooltip>
|
||||||
<template slot-scope="scope">{{ scope.row.product_.name }}</template>
|
<template slot-scope="scope">{{ scope.row.product_.name }}</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
|
|
@ -255,7 +250,8 @@
|
||||||
30: '已接受',
|
30: '已接受',
|
||||||
40: '生产中',
|
40: '生产中',
|
||||||
50: '已完成',
|
50: '已完成',
|
||||||
60:'军检完成'},
|
60: '军检完成'
|
||||||
|
},
|
||||||
listQuery: {
|
listQuery: {
|
||||||
page: 1,
|
page: 1,
|
||||||
page_size: 20,
|
page_size: 20,
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
.vscode/
|
.vscode/
|
||||||
.vs/
|
.vs/
|
||||||
|
.idea/
|
||||||
venv/
|
venv/
|
||||||
__pycache__/
|
__pycache__/
|
||||||
*.pyc
|
*.pyc
|
||||||
|
|
|
||||||
|
|
@ -2,11 +2,13 @@ from django.db.models import base
|
||||||
from rest_framework import urlpatterns
|
from rest_framework import urlpatterns
|
||||||
from django.urls import path, include
|
from django.urls import path, include
|
||||||
from rest_framework.routers import DefaultRouter
|
from rest_framework.routers import DefaultRouter
|
||||||
from apps.develop.views import CleanDataView, UpdateCuttingView, UpdateLastTestResult
|
from apps.develop.views import CleanDataView, UpdateCuttingView, UpdateFIFOItem, UpdateLastTestResult
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
path('cleandata/', CleanDataView.as_view()),
|
path('cleandata/', CleanDataView.as_view()),
|
||||||
path('update_cutting/', UpdateCuttingView.as_view()),
|
path('update_cutting/', UpdateCuttingView.as_view()),
|
||||||
path('update_last_result/', UpdateLastTestResult.as_view())
|
path('update_last_result/', UpdateLastTestResult.as_view()),
|
||||||
|
path('update_last_result/', UpdateLastTestResult.as_view()),
|
||||||
|
path('update_fifoitem/', UpdateFIFOItem.as_view())
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@ from rest_framework.decorators import permission_classes
|
||||||
from rest_framework.views import APIView
|
from rest_framework.views import APIView
|
||||||
from rest_framework.permissions import IsAdminUser
|
from rest_framework.permissions import IsAdminUser
|
||||||
from rest_framework.response import Response
|
from rest_framework.response import Response
|
||||||
from apps.inm.models import FIFO, Inventory, MaterialBatch
|
from apps.inm.models import FIFO, FIFOItem, Inventory, MaterialBatch
|
||||||
from apps.mtm.models import Material
|
from apps.mtm.models import Material
|
||||||
from apps.pm.models import ProductionPlan
|
from apps.pm.models import ProductionPlan
|
||||||
from apps.sam.models import Order
|
from apps.sam.models import Order
|
||||||
|
|
@ -62,3 +62,21 @@ class UpdateLastTestResult(APIView):
|
||||||
i.last_test_result = tr.is_testok
|
i.last_test_result = tr.is_testok
|
||||||
i.save()
|
i.save()
|
||||||
return Response()
|
return Response()
|
||||||
|
|
||||||
|
class UpdateFIFOItem(APIView):
|
||||||
|
|
||||||
|
permission_classes = [IsAdminUser]
|
||||||
|
@transaction.atomic
|
||||||
|
def post(self, request, format=None):
|
||||||
|
"""
|
||||||
|
更新出入库结果
|
||||||
|
"""
|
||||||
|
for i in FIFOItem.objects.all():
|
||||||
|
if i.fifo.type == FIFO.FIFO_TYPE_PUR_IN:
|
||||||
|
if i.is_testok:
|
||||||
|
i.need_test = True
|
||||||
|
i.save()
|
||||||
|
else:
|
||||||
|
i.is_testok = None
|
||||||
|
i.save()
|
||||||
|
return Response()
|
||||||
|
|
|
||||||
|
|
@ -27,7 +27,7 @@ class EquipmentSerializer(ModelSerializer):
|
||||||
class EquipmentSimpleSerializer(ModelSerializer):
|
class EquipmentSimpleSerializer(ModelSerializer):
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Equipment
|
model = Equipment
|
||||||
fields = ['id', 'number', 'name']
|
fields = ['id', 'number', 'name', 'state']
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -3,9 +3,12 @@ from django_filters import rest_framework as filters
|
||||||
from apps.mtm.models import Material
|
from apps.mtm.models import Material
|
||||||
from .models import IProduct, MaterialBatch
|
from .models import IProduct, MaterialBatch
|
||||||
from django.utils import timezone
|
from django.utils import timezone
|
||||||
|
|
||||||
|
|
||||||
class MbFilterSet(filters.FilterSet):
|
class MbFilterSet(filters.FilterSet):
|
||||||
material = filters.ModelMultipleChoiceFilter(field_name="material", queryset=Material.objects.all())
|
material = filters.ModelMultipleChoiceFilter(field_name="material", queryset=Material.objects.all())
|
||||||
tag = filters.CharFilter(method="filter_tag")
|
tag = filters.CharFilter(method="filter_tag")
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = MaterialBatch
|
model = MaterialBatch
|
||||||
fields = ['material', 'warehouse']
|
fields = ['material', 'warehouse']
|
||||||
|
|
@ -17,8 +20,8 @@ class MbFilterSet(filters.FilterSet):
|
||||||
|
|
||||||
|
|
||||||
class IProductFilterSet(filters.FilterSet):
|
class IProductFilterSet(filters.FilterSet):
|
||||||
|
|
||||||
order = filters.NumberFilter(field_name="wproduct__subproduction_plan__production_plan__order")
|
order = filters.NumberFilter(field_name="wproduct__subproduction_plan__production_plan__order")
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = IProduct
|
model = IProduct
|
||||||
fields = ['material', 'warehouse', 'batch', 'order', 'material__type']
|
fields = ['material', 'warehouse', 'batch', 'order', 'material__type']
|
||||||
|
|
@ -0,0 +1,18 @@
|
||||||
|
# Generated by Django 3.2.9 on 2022-01-14 07:32
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('inm', '0025_auto_20220113_0932'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='fifo',
|
||||||
|
name='inout_date',
|
||||||
|
field=models.DateField(blank=True, null=True, verbose_name='出入库日期'),
|
||||||
|
),
|
||||||
|
]
|
||||||
|
|
@ -0,0 +1,33 @@
|
||||||
|
# Generated by Django 3.2.9 on 2022-01-14 07:51
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('system', '0003_auto_20210812_0909'),
|
||||||
|
('inm', '0026_alter_fifo_inout_date'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='fifoitem',
|
||||||
|
name='is_tested',
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='fifoitem',
|
||||||
|
name='files',
|
||||||
|
field=models.ManyToManyField(to='system.File', verbose_name='上传材料'),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='fifoitem',
|
||||||
|
name='need_test',
|
||||||
|
field=models.BooleanField(default=False, verbose_name='是否需要复验'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='fifoitem',
|
||||||
|
name='is_testok',
|
||||||
|
field=models.BooleanField(blank=True, null=True, verbose_name='是否复验合格'),
|
||||||
|
),
|
||||||
|
]
|
||||||
|
|
@ -0,0 +1,19 @@
|
||||||
|
# Generated by Django 3.2.9 on 2022-01-14 08:28
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('system', '0003_auto_20210812_0909'),
|
||||||
|
('inm', '0027_auto_20220114_1551'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='fifoitem',
|
||||||
|
name='files',
|
||||||
|
field=models.ManyToManyField(blank=True, to='system.File', verbose_name='上传材料'),
|
||||||
|
),
|
||||||
|
]
|
||||||
|
|
@ -17,6 +17,7 @@ class WareHouse(CommonAModel):
|
||||||
number = models.CharField('仓库编号', max_length=20, unique=True)
|
number = models.CharField('仓库编号', max_length=20, unique=True)
|
||||||
name = models.CharField('仓库名称', max_length=20, unique=True)
|
name = models.CharField('仓库名称', max_length=20, unique=True)
|
||||||
place = models.CharField('具体地点', max_length=50)
|
place = models.CharField('具体地点', max_length=50)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
verbose_name = '仓库信息'
|
verbose_name = '仓库信息'
|
||||||
verbose_name_plural = verbose_name
|
verbose_name_plural = verbose_name
|
||||||
|
|
@ -24,32 +25,39 @@ class WareHouse(CommonAModel):
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return self.name
|
return self.name
|
||||||
|
|
||||||
|
|
||||||
class Inventory(BaseModel):
|
class Inventory(BaseModel):
|
||||||
"""
|
"""
|
||||||
库存物料
|
库存物料
|
||||||
"""
|
"""
|
||||||
material = models.ForeignKey(Material, on_delete=models.CASCADE, verbose_name='物料信息')
|
material = models.ForeignKey(
|
||||||
|
Material, on_delete=models.CASCADE, verbose_name='物料信息')
|
||||||
count = models.PositiveIntegerField('仓库物料存量', default=0)
|
count = models.PositiveIntegerField('仓库物料存量', default=0)
|
||||||
warehouse = models.ForeignKey(WareHouse, on_delete=models.CASCADE, verbose_name='所在仓库')
|
warehouse = models.ForeignKey(
|
||||||
|
WareHouse, on_delete=models.CASCADE, verbose_name='所在仓库')
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
verbose_name = '库存表'
|
verbose_name = '库存表'
|
||||||
verbose_name_plural = verbose_name
|
verbose_name_plural = verbose_name
|
||||||
|
|
||||||
|
|
||||||
class MaterialBatch(BaseModel):
|
class MaterialBatch(BaseModel):
|
||||||
"""
|
"""
|
||||||
物料批次
|
物料批次
|
||||||
"""
|
"""
|
||||||
material = models.ForeignKey(Material, on_delete=models.CASCADE, verbose_name='物料信息')
|
material = models.ForeignKey(
|
||||||
warehouse = models.ForeignKey(WareHouse, on_delete=models.CASCADE, verbose_name='所在仓库')
|
Material, on_delete=models.CASCADE, verbose_name='物料信息')
|
||||||
|
warehouse = models.ForeignKey(
|
||||||
|
WareHouse, on_delete=models.CASCADE, verbose_name='所在仓库')
|
||||||
count = models.PositiveIntegerField('存量', default=0)
|
count = models.PositiveIntegerField('存量', default=0)
|
||||||
batch = models.CharField('批次号', max_length=100, default='')
|
batch = models.CharField('批次号', max_length=100, default='')
|
||||||
expiration_date = models.DateField('有效期', null=True, blank=True)
|
expiration_date = models.DateField('有效期', null=True, blank=True)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
verbose_name = '库存表'
|
verbose_name = '库存表'
|
||||||
verbose_name_plural = verbose_name
|
verbose_name_plural = verbose_name
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class FIFO(CommonADModel):
|
class FIFO(CommonADModel):
|
||||||
"""
|
"""
|
||||||
出入库记录
|
出入库记录
|
||||||
|
|
@ -66,8 +74,9 @@ class FIFO(CommonADModel):
|
||||||
)
|
)
|
||||||
type = models.IntegerField('出入库类型', default=1)
|
type = models.IntegerField('出入库类型', default=1)
|
||||||
is_audited = models.BooleanField('是否审核', default=False)
|
is_audited = models.BooleanField('是否审核', default=False)
|
||||||
auditor = models.ForeignKey(User, verbose_name='审核人', on_delete=models.CASCADE, null=True, blank=True)
|
auditor = models.ForeignKey(
|
||||||
inout_date = models.DateField('出入库日期')
|
User, verbose_name='审核人', on_delete=models.CASCADE, null=True, blank=True)
|
||||||
|
inout_date = models.DateField('出入库日期', null=True, blank=True)
|
||||||
remark = models.CharField('备注', max_length=1000, default='')
|
remark = models.CharField('备注', max_length=1000, default='')
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -75,38 +84,46 @@ class FIFOItem(BaseModel):
|
||||||
"""
|
"""
|
||||||
出入库详细条目
|
出入库详细条目
|
||||||
"""
|
"""
|
||||||
is_tested = models.BooleanField('是否已检验', default=False)
|
need_test = models.BooleanField('是否需要复验', default=False)
|
||||||
is_testok = models.BooleanField('是否检验合格', default=False)
|
is_testok = models.BooleanField('是否复验合格', null=True, blank=True)
|
||||||
warehouse = models.ForeignKey(WareHouse, on_delete=models.CASCADE, verbose_name='仓库')
|
warehouse = models.ForeignKey(
|
||||||
material = models.ForeignKey(Material, verbose_name='物料类型', on_delete=models.CASCADE)
|
WareHouse, on_delete=models.CASCADE, verbose_name='仓库')
|
||||||
|
material = models.ForeignKey(
|
||||||
|
Material, verbose_name='物料类型', on_delete=models.CASCADE)
|
||||||
count = models.PositiveIntegerField('数量', default=0)
|
count = models.PositiveIntegerField('数量', default=0)
|
||||||
batch = models.CharField('批次号', max_length=100, default='')
|
batch = models.CharField('批次号', max_length=100, default='')
|
||||||
fifo = models.ForeignKey(FIFO, verbose_name='关联出入库', on_delete=models.CASCADE)
|
fifo = models.ForeignKey(FIFO, verbose_name='关联出入库',
|
||||||
subproduction_plan = models.ForeignKey(SubProductionPlan, verbose_name='关联子生产计划', on_delete=models.CASCADE, null=True, blank=True)
|
on_delete=models.CASCADE)
|
||||||
|
subproduction_plan = models.ForeignKey(
|
||||||
|
SubProductionPlan, verbose_name='关联子生产计划', on_delete=models.CASCADE, null=True, blank=True)
|
||||||
|
files = models.ManyToManyField(File, verbose_name='上传材料', blank=True)
|
||||||
|
|
||||||
|
|
||||||
class IProduct(BaseModel):
|
class IProduct(BaseModel):
|
||||||
"""
|
"""
|
||||||
具体产品条目
|
具体产品条目
|
||||||
"""
|
"""
|
||||||
number = models.CharField('物品编号', unique=True, max_length=50)
|
number = models.CharField('物品编号', unique=True, max_length=50)
|
||||||
material = models.ForeignKey(Material, verbose_name='物料类型', on_delete=models.CASCADE)
|
material = models.ForeignKey(
|
||||||
warehouse = models.ForeignKey(WareHouse, on_delete=models.CASCADE, verbose_name='所在仓库')
|
Material, verbose_name='物料类型', on_delete=models.CASCADE)
|
||||||
|
warehouse = models.ForeignKey(
|
||||||
|
WareHouse, on_delete=models.CASCADE, verbose_name='所在仓库')
|
||||||
batch = models.CharField('所属批次号', max_length=100, default='')
|
batch = models.CharField('所属批次号', max_length=100, default='')
|
||||||
wproduct = models.ForeignKey('wpm.wproduct', on_delete=models.CASCADE, verbose_name='关联的动态产品', db_constraint=False,
|
wproduct = models.ForeignKey('wpm.wproduct', on_delete=models.CASCADE, verbose_name='关联的动态产品', db_constraint=False,
|
||||||
null=True, blank=True, related_name='iproduct_wproduct')
|
null=True, blank=True, related_name='iproduct_wproduct')
|
||||||
is_saled = models.BooleanField('是否售出', default=False)
|
is_saled = models.BooleanField('是否售出', default=False)
|
||||||
|
|
||||||
|
|
||||||
class FIFOItemProduct(BaseModel):
|
class FIFOItemProduct(BaseModel):
|
||||||
"""
|
"""
|
||||||
出入库产品
|
出入库产品
|
||||||
"""
|
"""
|
||||||
fifoitem = models.ForeignKey(FIFOItem, verbose_name='关联出入库具体产品', on_delete=models.CASCADE)
|
fifoitem = models.ForeignKey(
|
||||||
|
FIFOItem, verbose_name='关联出入库具体产品', on_delete=models.CASCADE)
|
||||||
wproduct = models.ForeignKey('wpm.wproduct', on_delete=models.CASCADE, verbose_name='关联的动态产品', db_constraint=False, null=True, blank=True,
|
wproduct = models.ForeignKey('wpm.wproduct', on_delete=models.CASCADE, verbose_name='关联的动态产品', db_constraint=False, null=True, blank=True,
|
||||||
related_name='fifoitem_wproduct')
|
related_name='fifoitem_wproduct')
|
||||||
number = models.CharField('物品编号', max_length=50)
|
number = models.CharField('物品编号', max_length=50)
|
||||||
material = models.ForeignKey(Material, verbose_name='物料类型', on_delete=models.CASCADE)
|
material = models.ForeignKey(
|
||||||
iproduct = models.ForeignKey(IProduct, verbose_name='关联库存产品', null=True, blank=True, on_delete=models.SET_NULL)
|
Material, verbose_name='物料类型', on_delete=models.CASCADE)
|
||||||
|
iproduct = models.ForeignKey(
|
||||||
|
IProduct, verbose_name='关联库存产品', null=True, blank=True, on_delete=models.SET_NULL)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,4 @@
|
||||||
|
from rest_framework import exceptions
|
||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
|
|
||||||
from apps.inm.models import FIFO, FIFOItem, FIFOItemProduct, IProduct, MaterialBatch, WareHouse, Inventory
|
from apps.inm.models import FIFO, FIFOItem, FIFOItemProduct, IProduct, MaterialBatch, WareHouse, Inventory
|
||||||
|
|
@ -7,42 +8,52 @@ from apps.system.serializers import UserSimpleSerializer
|
||||||
from apps.mtm.serializers import MaterialSimpleSerializer
|
from apps.mtm.serializers import MaterialSimpleSerializer
|
||||||
from django.db import transaction
|
from django.db import transaction
|
||||||
|
|
||||||
|
|
||||||
class WareHouseSerializer(serializers.ModelSerializer):
|
class WareHouseSerializer(serializers.ModelSerializer):
|
||||||
create_by_ = UserSimpleSerializer('create_by', read_only=True)
|
create_by_ = UserSimpleSerializer('create_by', read_only=True)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = WareHouse
|
model = WareHouse
|
||||||
fields = '__all__'
|
fields = '__all__'
|
||||||
|
|
||||||
|
|
||||||
class WareHouseCreateUpdateSerializer(serializers.ModelSerializer):
|
class WareHouseCreateUpdateSerializer(serializers.ModelSerializer):
|
||||||
class Meta:
|
class Meta:
|
||||||
model = WareHouse
|
model = WareHouse
|
||||||
fields = ['name', 'number', 'place']
|
fields = ['name', 'number', 'place']
|
||||||
|
|
||||||
|
|
||||||
class WareHouseSimpleSerializer(serializers.ModelSerializer):
|
class WareHouseSimpleSerializer(serializers.ModelSerializer):
|
||||||
class Meta:
|
class Meta:
|
||||||
model = WareHouse
|
model = WareHouse
|
||||||
fields = ['name', 'number', 'place']
|
fields = ['name', 'number', 'place']
|
||||||
|
|
||||||
|
|
||||||
class InventorySerializer(serializers.ModelSerializer):
|
class InventorySerializer(serializers.ModelSerializer):
|
||||||
material_ = MaterialSimpleSerializer(source='material', read_only=True)
|
material_ = MaterialSimpleSerializer(source='material', read_only=True)
|
||||||
warehouse_ = WareHouseSimpleSerializer(source='warehouse', read_only=True)
|
warehouse_ = WareHouseSimpleSerializer(source='warehouse', read_only=True)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Inventory
|
model = Inventory
|
||||||
fields = '__all__'
|
fields = '__all__'
|
||||||
|
|
||||||
|
|
||||||
class MaterialBatchSerializer(serializers.ModelSerializer):
|
class MaterialBatchSerializer(serializers.ModelSerializer):
|
||||||
material_ = MaterialSimpleSerializer(source='material', read_only=True)
|
material_ = MaterialSimpleSerializer(source='material', read_only=True)
|
||||||
warehouse_ = WareHouseSimpleSerializer(source='warehouse', read_only=True)
|
warehouse_ = WareHouseSimpleSerializer(source='warehouse', read_only=True)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = MaterialBatch
|
model = MaterialBatch
|
||||||
fields = '__all__'
|
fields = '__all__'
|
||||||
|
|
||||||
|
|
||||||
class IProductListSerializer(serializers.ModelSerializer):
|
class IProductListSerializer(serializers.ModelSerializer):
|
||||||
material_ = MaterialSimpleSerializer(source='material', read_only=True)
|
material_ = MaterialSimpleSerializer(source='material', read_only=True)
|
||||||
warehouse_ = WareHouseSimpleSerializer(source='warehouse', read_only=True)
|
warehouse_ = WareHouseSimpleSerializer(source='warehouse', read_only=True)
|
||||||
is_mtested = serializers.BooleanField(source='wproduct.is_mtested', read_only=True)
|
is_mtested = serializers.BooleanField(source='wproduct.is_mtested', read_only=True)
|
||||||
is_mtestok = serializers.BooleanField(source='wproduct.is_mtestok', read_only=True)
|
is_mtestok = serializers.BooleanField(source='wproduct.is_mtestok', read_only=True)
|
||||||
remark_mtest = serializers.CharField(source='wproduct.remark_mtest', read_only=True)
|
remark_mtest = serializers.CharField(source='wproduct.remark_mtest', read_only=True)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = IProduct
|
model = IProduct
|
||||||
fields = '__all__'
|
fields = '__all__'
|
||||||
|
|
@ -51,28 +62,35 @@ class IProductListSerializer(serializers.ModelSerializer):
|
||||||
class FIFOListSerializer(serializers.ModelSerializer):
|
class FIFOListSerializer(serializers.ModelSerializer):
|
||||||
auditor_ = UserSimpleSerializer(source='auditor', read_only=True)
|
auditor_ = UserSimpleSerializer(source='auditor', read_only=True)
|
||||||
create_by_ = UserSimpleSerializer(source='create_by', read_only=True)
|
create_by_ = UserSimpleSerializer(source='create_by', read_only=True)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = FIFO
|
model = FIFO
|
||||||
fields = '__all__'
|
fields = '__all__'
|
||||||
|
|
||||||
|
|
||||||
class FIFOItemSerializer(serializers.ModelSerializer):
|
class FIFOItemSerializer(serializers.ModelSerializer):
|
||||||
warehouse_ = WareHouseSimpleSerializer(source='warehouse', read_only=True)
|
warehouse_ = WareHouseSimpleSerializer(source='warehouse', read_only=True)
|
||||||
material_ = MaterialSimpleSerializer(source='material', read_only=True)
|
material_ = MaterialSimpleSerializer(source='material', read_only=True)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = FIFOItem
|
model = FIFOItem
|
||||||
fields = '__all__'
|
fields = '__all__'
|
||||||
|
|
||||||
|
|
||||||
class IProductInPurSerializer(serializers.ModelSerializer):
|
class IProductInPurSerializer(serializers.ModelSerializer):
|
||||||
class Meta:
|
class Meta:
|
||||||
model = IProduct
|
model = IProduct
|
||||||
fields = ['number']
|
fields = ['number']
|
||||||
|
|
||||||
|
|
||||||
class FIFODetailInPurSerializer(serializers.ModelSerializer):
|
class FIFODetailInPurSerializer(serializers.ModelSerializer):
|
||||||
details = IProductInPurSerializer(many=True, required=False)
|
details = IProductInPurSerializer(many=True, required=False)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = FIFOItem
|
model = FIFOItem
|
||||||
fields = ['material', 'count', 'batch', 'details', 'warehouse']
|
fields = ['material', 'count', 'batch', 'details', 'warehouse']
|
||||||
|
|
||||||
|
|
||||||
class MaterialBatchQuerySerializer(serializers.Serializer):
|
class MaterialBatchQuerySerializer(serializers.Serializer):
|
||||||
warehouse = serializers.IntegerField(label="仓库ID", required=False)
|
warehouse = serializers.IntegerField(label="仓库ID", required=False)
|
||||||
materials = serializers.ListField(child=serializers.IntegerField(label="物料ID"), required=False)
|
materials = serializers.ListField(child=serializers.IntegerField(label="物料ID"), required=False)
|
||||||
|
|
@ -83,9 +101,10 @@ class FIFOInPurSerializer(serializers.ModelSerializer):
|
||||||
采购入库序列化
|
采购入库序列化
|
||||||
"""
|
"""
|
||||||
details = FIFODetailInPurSerializer(many=True)
|
details = FIFODetailInPurSerializer(many=True)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = FIFO
|
model = FIFO
|
||||||
fields = ['details', 'inout_date']
|
fields = ['details']
|
||||||
|
|
||||||
def create(self, validated_data):
|
def create(self, validated_data):
|
||||||
details = validated_data.pop('details')
|
details = validated_data.pop('details')
|
||||||
|
|
@ -137,17 +156,33 @@ class FIFOInPurSerializer(serializers.ModelSerializer):
|
||||||
return obj
|
return obj
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class InmTestRecordItemCreateSerializer(serializers.ModelSerializer):
|
class InmTestRecordItemCreateSerializer(serializers.ModelSerializer):
|
||||||
class Meta:
|
class Meta:
|
||||||
model = TestRecordItem
|
model = TestRecordItem
|
||||||
fields = ['form_field', 'field_value', 'is_testok']
|
fields = ['form_field', 'field_value', 'is_testok']
|
||||||
|
|
||||||
|
|
||||||
class InmTestRecordCreateSerializer(serializers.ModelSerializer):
|
class InmTestRecordCreateSerializer(serializers.ModelSerializer):
|
||||||
record_data = InmTestRecordItemCreateSerializer(many=True)
|
record_data = InmTestRecordItemCreateSerializer(many=True)
|
||||||
fifo_item = serializers.PrimaryKeyRelatedField(queryset=FIFOItem.objects.all(), required=True)
|
fifo_item = serializers.PrimaryKeyRelatedField(queryset=FIFOItem.objects.all(), required=True)
|
||||||
is_testok = serializers.BooleanField()
|
is_testok = serializers.BooleanField()
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = TestRecord
|
model = TestRecord
|
||||||
fields = ['form', 'record_data', 'is_testok', 'fifo_item']
|
fields = ['form', 'record_data', 'is_testok', 'fifo_item']
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class FIFOItemUpdateSerializer(serializers.ModelSerializer):
|
||||||
|
class Meta:
|
||||||
|
model = FIFOItem
|
||||||
|
fields = ['need_test', 'files']
|
||||||
|
|
||||||
|
def validate(self, attrs):
|
||||||
|
ins = self.instance
|
||||||
|
fifo = ins.fifo
|
||||||
|
if fifo.is_audited:
|
||||||
|
raise exceptions.APIException('该记录已审核')
|
||||||
|
if ins.is_testok is not None:
|
||||||
|
attrs.pop('need_test')
|
||||||
|
return super().validate(attrs)
|
||||||
|
|
@ -1,25 +1,26 @@
|
||||||
from django.shortcuts import render
|
|
||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
from rest_framework import exceptions
|
from rest_framework import exceptions
|
||||||
from rest_framework.exceptions import APIException
|
from rest_framework.exceptions import APIException
|
||||||
from rest_framework.mixins import DestroyModelMixin, ListModelMixin, RetrieveModelMixin
|
from rest_framework.mixins import DestroyModelMixin, ListModelMixin, UpdateModelMixin
|
||||||
from rest_framework.viewsets import GenericViewSet, ModelViewSet
|
from rest_framework.viewsets import GenericViewSet, ModelViewSet
|
||||||
from apps.inm.filters import IProductFilterSet, MbFilterSet
|
from apps.inm.filters import IProductFilterSet, MbFilterSet
|
||||||
|
|
||||||
from apps.inm.models import FIFO, FIFOItem, IProduct, MaterialBatch, WareHouse, Inventory
|
from apps.inm.models import FIFO, FIFOItem, IProduct, MaterialBatch, WareHouse, Inventory
|
||||||
from apps.inm.serializers import FIFOItemSerializer, FIFOInPurSerializer, FIFOListSerializer, IProductListSerializer, InmTestRecordCreateSerializer, MaterialBatchQuerySerializer, MaterialBatchSerializer, WareHouseSerializer, WareHouseCreateUpdateSerializer,InventorySerializer
|
from apps.inm.serializers import FIFOItemSerializer, FIFOInPurSerializer, FIFOItemUpdateSerializer, FIFOListSerializer, IProductListSerializer, \
|
||||||
|
InmTestRecordCreateSerializer, MaterialBatchQuerySerializer, MaterialBatchSerializer, WareHouseSerializer, \
|
||||||
|
WareHouseCreateUpdateSerializer, InventorySerializer
|
||||||
from apps.inm.signals import update_inm
|
from apps.inm.signals import update_inm
|
||||||
from apps.mtm.models import Material
|
|
||||||
from apps.pm.services import PmService
|
|
||||||
from apps.qm.models import TestRecordItem
|
from apps.qm.models import TestRecordItem
|
||||||
from apps.system.mixins import CreateUpdateModelAMixin, OptimizationMixin
|
from apps.system.mixins import CreateUpdateModelAMixin
|
||||||
from rest_framework.decorators import action
|
from rest_framework.decorators import action
|
||||||
from rest_framework.response import Response
|
from rest_framework.response import Response
|
||||||
from django.db import transaction
|
from django.db import transaction
|
||||||
|
from django.utils import timezone
|
||||||
|
|
||||||
from apps.wpm.services import WpmServies
|
|
||||||
|
|
||||||
# Create your views here.
|
# Create your views here.
|
||||||
|
|
||||||
|
|
||||||
class WarehouseViewSet(CreateUpdateModelAMixin, ModelViewSet):
|
class WarehouseViewSet(CreateUpdateModelAMixin, ModelViewSet):
|
||||||
"""
|
"""
|
||||||
仓库-增删改查
|
仓库-增删改查
|
||||||
|
|
@ -37,21 +38,25 @@ class WarehouseViewSet(CreateUpdateModelAMixin, ModelViewSet):
|
||||||
return WareHouseCreateUpdateSerializer
|
return WareHouseCreateUpdateSerializer
|
||||||
return WareHouseSerializer
|
return WareHouseSerializer
|
||||||
|
|
||||||
|
|
||||||
class InventoryViewSet(ListModelMixin, GenericViewSet):
|
class InventoryViewSet(ListModelMixin, GenericViewSet):
|
||||||
"""
|
"""
|
||||||
仓库物料表
|
仓库物料表
|
||||||
"""
|
"""
|
||||||
perms_map = {'*': '*'}
|
perms_map = {'*': '*'}
|
||||||
queryset = Inventory.objects.select_related('material', 'warehouse').filter(count__gt=0).all()
|
queryset = Inventory.objects.select_related(
|
||||||
|
'material', 'warehouse').filter(count__gt=0).all()
|
||||||
serializer_class = InventorySerializer
|
serializer_class = InventorySerializer
|
||||||
filterset_fields = ['material', 'warehouse']
|
filterset_fields = ['material', 'warehouse']
|
||||||
search_fields = []
|
search_fields = []
|
||||||
ordering_fields = ['create_time']
|
ordering_fields = ['create_time']
|
||||||
ordering = ['-create_time']
|
ordering = ['-create_time']
|
||||||
|
|
||||||
|
|
||||||
class MaterialBatchViewSet(ListModelMixin, GenericViewSet):
|
class MaterialBatchViewSet(ListModelMixin, GenericViewSet):
|
||||||
perms_map = {'*': '*'}
|
perms_map = {'*': '*'}
|
||||||
queryset = MaterialBatch.objects.select_related('material', 'warehouse').filter(count__gt=0).all()
|
queryset = MaterialBatch.objects.select_related(
|
||||||
|
'material', 'warehouse').filter(count__gt=0).all()
|
||||||
serializer_class = MaterialBatchSerializer
|
serializer_class = MaterialBatchSerializer
|
||||||
# filterset_fields = ['material', 'warehouse']
|
# filterset_fields = ['material', 'warehouse']
|
||||||
filterset_class = MbFilterSet
|
filterset_class = MbFilterSet
|
||||||
|
|
@ -67,21 +72,29 @@ class MaterialBatchViewSet(ListModelMixin, GenericViewSet):
|
||||||
data = request.data
|
data = request.data
|
||||||
serializer = MaterialBatchQuerySerializer(data=data)
|
serializer = MaterialBatchQuerySerializer(data=data)
|
||||||
serializer.is_valid(raise_exception=True)
|
serializer.is_valid(raise_exception=True)
|
||||||
queryset = self.queryset.filter(warehouse__id=data['warehouse'], material__id__in=data['materials'])
|
queryset = self.queryset.filter(
|
||||||
|
warehouse__id=data['warehouse'], material__id__in=data['materials'])
|
||||||
return Response(MaterialBatchSerializer(instance=queryset, many=True).data)
|
return Response(MaterialBatchSerializer(instance=queryset, many=True).data)
|
||||||
|
|
||||||
class FIFOItemViewSet(ListModelMixin, DestroyModelMixin, GenericViewSet):
|
|
||||||
|
class FIFOItemViewSet(ListModelMixin, DestroyModelMixin, UpdateModelMixin, GenericViewSet):
|
||||||
"""
|
"""
|
||||||
出入库记录详情表
|
出入库记录详情表
|
||||||
"""
|
"""
|
||||||
perms_map = {'*': '*'}
|
perms_map = {'*': '*'}
|
||||||
queryset = FIFOItem.objects.select_related('material', 'fifo').all()
|
queryset = FIFOItem.objects.select_related('material', 'fifo').all()
|
||||||
serializer_class = FIFOItemSerializer
|
serializer_class = FIFOItemSerializer
|
||||||
filterset_fields = ['material', 'fifo', 'fifo__type', 'is_tested', 'is_testok']
|
filterset_fields = ['material', 'fifo',
|
||||||
|
'fifo__type', 'need_test', 'is_testok']
|
||||||
search_fields = []
|
search_fields = []
|
||||||
ordering_fields = ['create_time']
|
ordering_fields = ['create_time']
|
||||||
ordering = ['-create_time']
|
ordering = ['-create_time']
|
||||||
|
|
||||||
|
def get_serializer_class(self):
|
||||||
|
if self.action == 'update':
|
||||||
|
return FIFOItemUpdateSerializer
|
||||||
|
return super().get_serializer_class()
|
||||||
|
|
||||||
def perform_destroy(self, instance):
|
def perform_destroy(self, instance):
|
||||||
if instance.fifo.is_audited:
|
if instance.fifo.is_audited:
|
||||||
raise APIException('该出入库记录已通过审核, 无法删除')
|
raise APIException('该出入库记录已通过审核, 无法删除')
|
||||||
|
|
@ -111,10 +124,10 @@ class FIFOItemViewSet(ListModelMixin, DestroyModelMixin, GenericViewSet):
|
||||||
# 如果检验合格
|
# 如果检验合格
|
||||||
if obj.fifo_item:
|
if obj.fifo_item:
|
||||||
obj.fifo_item.is_testok = True if obj.is_testok else False
|
obj.fifo_item.is_testok = True if obj.is_testok else False
|
||||||
obj.fifo_item.is_tested = True
|
|
||||||
obj.fifo_item.save()
|
obj.fifo_item.save()
|
||||||
return Response()
|
return Response()
|
||||||
|
|
||||||
|
|
||||||
class FIFOViewSet(ListModelMixin, DestroyModelMixin, GenericViewSet):
|
class FIFOViewSet(ListModelMixin, DestroyModelMixin, GenericViewSet):
|
||||||
"""
|
"""
|
||||||
出入库记录
|
出入库记录
|
||||||
|
|
@ -154,7 +167,7 @@ class FIFOViewSet(ListModelMixin, DestroyModelMixin, GenericViewSet):
|
||||||
审核通过
|
审核通过
|
||||||
"""
|
"""
|
||||||
obj = self.get_object()
|
obj = self.get_object()
|
||||||
for i in FIFOItem.objects.filter(fifo=obj):
|
for i in FIFOItem.objects.filter(fifo=obj, need_test=True):
|
||||||
if not i.is_testok:
|
if not i.is_testok:
|
||||||
raise APIException('未检验通过, 不可审核')
|
raise APIException('未检验通过, 不可审核')
|
||||||
if obj.is_audited:
|
if obj.is_audited:
|
||||||
|
|
@ -162,6 +175,7 @@ class FIFOViewSet(ListModelMixin, DestroyModelMixin, GenericViewSet):
|
||||||
with transaction.atomic():
|
with transaction.atomic():
|
||||||
obj.is_audited = True
|
obj.is_audited = True
|
||||||
obj.auditor = request.user
|
obj.auditor = request.user
|
||||||
|
obj.inout_date = timezone.now() # 也是审核日期
|
||||||
obj.save()
|
obj.save()
|
||||||
update_inm(obj) # 更新库存
|
update_inm(obj) # 更新库存
|
||||||
return Response()
|
return Response()
|
||||||
|
|
@ -172,7 +186,8 @@ class IProductViewSet(ListModelMixin, GenericViewSet):
|
||||||
半成品库存表
|
半成品库存表
|
||||||
"""
|
"""
|
||||||
perms_map = {'*': '*'}
|
perms_map = {'*': '*'}
|
||||||
queryset = IProduct.objects.select_related('material', 'warehouse', 'wproduct__subproduction_plan__production_plan__order')
|
queryset = IProduct.objects.select_related(
|
||||||
|
'material', 'warehouse', 'wproduct__subproduction_plan__production_plan__order')
|
||||||
serializer_class = IProductListSerializer
|
serializer_class = IProductListSerializer
|
||||||
filterset_class = IProductFilterSet
|
filterset_class = IProductFilterSet
|
||||||
search_fields = []
|
search_fields = []
|
||||||
|
|
|
||||||
|
|
@ -150,8 +150,7 @@ class SaleViewSet(CreateUpdateCustomMixin, ListModelMixin, RetrieveModelMixin, C
|
||||||
warehouse = WareHouse.objects.get(id=i['warehouse'])
|
warehouse = WareHouse.objects.get(id=i['warehouse'])
|
||||||
material = Material.objects.get(id=i['material'])
|
material = Material.objects.get(id=i['material'])
|
||||||
fifoitem = FIFOItem()
|
fifoitem = FIFOItem()
|
||||||
fifoitem.is_tested = True
|
fifoitem.need_test = False
|
||||||
fifoitem.is_testok = True
|
|
||||||
fifoitem.warehouse = warehouse
|
fifoitem.warehouse = warehouse
|
||||||
fifoitem.material = material
|
fifoitem.material = material
|
||||||
fifoitem.count = i['total']
|
fifoitem.count = i['total']
|
||||||
|
|
|
||||||
|
|
@ -4,39 +4,50 @@ from apps.mtm.models import Material, Step
|
||||||
from apps.wpm.services import WpmServies
|
from apps.wpm.services import WpmServies
|
||||||
from .models import Operation, OperationMaterial, OperationRecord, WMaterial, WProduct
|
from .models import Operation, OperationMaterial, OperationRecord, WMaterial, WProduct
|
||||||
|
|
||||||
|
|
||||||
class WMaterialFilterSet(filters.FilterSet):
|
class WMaterialFilterSet(filters.FilterSet):
|
||||||
|
|
||||||
operation = filters.NumberFilter(method='filter_operation')
|
operation = filters.NumberFilter(method='filter_operation')
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = WMaterial
|
model = WMaterial
|
||||||
fields = ['material', 'subproduction_plan', 'subproduction_plan__process', 'subproduction_plan__workshop', 'operation']
|
fields = ['material', 'subproduction_plan', 'subproduction_plan__process',
|
||||||
|
'subproduction_plan__workshop', 'operation']
|
||||||
|
|
||||||
def filter_operation(self, queryset, name, value):
|
def filter_operation(self, queryset, name, value):
|
||||||
operation = Operation.objects.get(pk=value)
|
operation = Operation.objects.get(pk=value)
|
||||||
wproducts = WProduct.objects.filter(ow_wproduct__operation=value)
|
wproducts = WProduct.objects.filter(ow_wproduct__operation=value)
|
||||||
step = operation.step
|
step = operation.step
|
||||||
if wproducts.exists():
|
if wproducts.exists():
|
||||||
subplans = WpmServies.get_subplans_queryset_from_wproducts(wproducts)
|
subplans = WpmServies.get_subplans_queryset_from_wproducts(
|
||||||
|
wproducts)
|
||||||
else:
|
else:
|
||||||
subplans = WpmServies.get_subplans_queyset_from_step(step)
|
subplans = WpmServies.get_subplans_queyset_from_step(step)
|
||||||
queryset = queryset.filter(subproduction_plan__in=subplans).exclude(material__type=Material.MA_TYPE_HALFGOOD)
|
queryset = queryset.filter(subproduction_plan__in=subplans).exclude(
|
||||||
|
material__type=Material.MA_TYPE_HALFGOOD)
|
||||||
return queryset
|
return queryset
|
||||||
|
|
||||||
|
|
||||||
class WProductFilterSet(filters.FilterSet):
|
class WProductFilterSet(filters.FilterSet):
|
||||||
tag = filters.CharFilter(method='filter_tag')
|
tag = filters.CharFilter(method='filter_tag')
|
||||||
production_plan = filters.NumberFilter(field_name='subproduction_plan__production_plan')
|
production_plan = filters.NumberFilter(
|
||||||
|
field_name='subproduction_plan__production_plan')
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = WProduct
|
model = WProduct
|
||||||
fields = ['step', 'subproduction_plan', 'material', 'step__process', 'act_state', 'material__type']
|
fields = ['step', 'subproduction_plan', 'material',
|
||||||
|
'step__process', 'act_state', 'material__type']
|
||||||
|
|
||||||
def filter_tag(self, queryset, name, value):
|
def filter_tag(self, queryset, name, value):
|
||||||
if value == 'no_scrap':
|
if value == 'no_scrap':
|
||||||
queryset = queryset.exclude(act_state=WProduct.WPR_ACT_STATE_SCRAP)
|
queryset = queryset.exclude(act_state=WProduct.WPR_ACT_STATE_SCRAP)
|
||||||
return queryset
|
return queryset
|
||||||
|
|
||||||
|
|
||||||
class CuttingFilterSet(filters.FilterSet):
|
class CuttingFilterSet(filters.FilterSet):
|
||||||
production_plan = filters.NumberFilter(field_name='subproduction_plan__production_plan')
|
production_plan = filters.NumberFilter(
|
||||||
|
field_name='subproduction_plan__production_plan')
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = OperationMaterial
|
model = OperationMaterial
|
||||||
fields = ['operation', 'subproduction_plan', 'material']
|
fields = ['operation', 'subproduction_plan', 'material']
|
||||||
|
|
@ -44,6 +55,7 @@ class CuttingFilterSet(filters.FilterSet):
|
||||||
|
|
||||||
class OperationRecordFilterSet(filters.FilterSet):
|
class OperationRecordFilterSet(filters.FilterSet):
|
||||||
wproduct = filters.NumberFilter(method='filter_wproduct')
|
wproduct = filters.NumberFilter(method='filter_wproduct')
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = OperationRecord
|
model = OperationRecord
|
||||||
fields = ['operation', 'form']
|
fields = ['operation', 'form']
|
||||||
|
|
|
||||||
|
|
@ -13,15 +13,20 @@ from utils.model import SoftModel, BaseModel
|
||||||
from simple_history.models import HistoricalRecords
|
from simple_history.models import HistoricalRecords
|
||||||
from apps.mtm.models import Material, Process, RecordFormField, Step, RecordForm, SubprodctionMaterial
|
from apps.mtm.models import Material, Process, RecordFormField, Step, RecordForm, SubprodctionMaterial
|
||||||
from apps.em.models import Equipment
|
from apps.em.models import Equipment
|
||||||
|
|
||||||
|
|
||||||
class WMaterial(BaseModel):
|
class WMaterial(BaseModel):
|
||||||
"""
|
"""
|
||||||
车间生产物料
|
车间生产物料
|
||||||
"""
|
"""
|
||||||
subproduction_plan = models.ForeignKey(SubProductionPlan, verbose_name='关联子计划', on_delete=models.CASCADE)
|
subproduction_plan = models.ForeignKey(
|
||||||
material = models.ForeignKey(Material, verbose_name='关联物料', on_delete=models.CASCADE)
|
SubProductionPlan, verbose_name='关联子计划', on_delete=models.CASCADE)
|
||||||
|
material = models.ForeignKey(
|
||||||
|
Material, verbose_name='关联物料', on_delete=models.CASCADE)
|
||||||
batch = models.CharField('批次号', max_length=100, null=True, blank=True)
|
batch = models.CharField('批次号', max_length=100, null=True, blank=True)
|
||||||
count = models.PositiveIntegerField('当前数量', default=0)
|
count = models.PositiveIntegerField('当前数量', default=0)
|
||||||
|
|
||||||
|
|
||||||
class WProduct(CommonAModel):
|
class WProduct(CommonAModel):
|
||||||
"""
|
"""
|
||||||
动态半成品/成品表
|
动态半成品/成品表
|
||||||
|
|
@ -80,20 +85,30 @@ class WProduct(CommonAModel):
|
||||||
(NG_BACK_FROM, '退回供方'),
|
(NG_BACK_FROM, '退回供方'),
|
||||||
(NG_RECALL, '召回')
|
(NG_RECALL, '召回')
|
||||||
)
|
)
|
||||||
number = models.CharField('物品编号', unique=True, null=True, blank=True, max_length=50)
|
number = models.CharField(
|
||||||
material = models.ForeignKey(Material, verbose_name='所属物料状态', on_delete=models.CASCADE)
|
'物品编号', unique=True, null=True, blank=True, max_length=50)
|
||||||
pre_step = models.ForeignKey(Step, verbose_name='已执行到', help_text='已执行完的步骤', null=True, blank=True, on_delete=models.CASCADE, related_name='w_pre_step')
|
material = models.ForeignKey(
|
||||||
step = models.ForeignKey(Step, verbose_name='所在步骤', on_delete=models.CASCADE, null=True, blank=True, related_name='w_step')
|
Material, verbose_name='所属物料状态', on_delete=models.CASCADE)
|
||||||
act_state = models.IntegerField('进行状态', default=0, choices=act_state_choices)
|
pre_step = models.ForeignKey(Step, verbose_name='已执行到', help_text='已执行完的步骤', null=True, blank=True,
|
||||||
|
on_delete=models.CASCADE, related_name='w_pre_step')
|
||||||
|
step = models.ForeignKey(Step, verbose_name='所在步骤', on_delete=models.CASCADE, null=True, blank=True,
|
||||||
|
related_name='w_step')
|
||||||
|
act_state = models.IntegerField(
|
||||||
|
'进行状态', default=0, choices=act_state_choices)
|
||||||
is_hidden = models.BooleanField('是否隐藏', default=False)
|
is_hidden = models.BooleanField('是否隐藏', default=False)
|
||||||
child = models.ForeignKey('self', blank=True, null=True, on_delete=models.CASCADE, related_name='wproduct_child')
|
child = models.ForeignKey('self', blank=True, null=True,
|
||||||
|
on_delete=models.CASCADE, related_name='wproduct_child')
|
||||||
remark = models.CharField('备注', max_length=200, null=True, blank=True)
|
remark = models.CharField('备注', max_length=200, null=True, blank=True)
|
||||||
subproduction_plan = models.ForeignKey(SubProductionPlan, verbose_name='当前子生产计划', on_delete=models.CASCADE, related_name='wproduct_subplan')
|
subproduction_plan = models.ForeignKey(SubProductionPlan, verbose_name='当前子生产计划', on_delete=models.CASCADE,
|
||||||
|
related_name='wproduct_subplan')
|
||||||
|
|
||||||
scrap_reason = models.IntegerField('报废原因', choices=scrap_reason_choices, null=True, blank=True)
|
scrap_reason = models.IntegerField(
|
||||||
ng_sign = models.PositiveSmallIntegerField('不合格标记', choices=ng_choices, null=True, blank=True)
|
'报废原因', choices=scrap_reason_choices, null=True, blank=True)
|
||||||
|
ng_sign = models.PositiveSmallIntegerField(
|
||||||
|
'不合格标记', choices=ng_choices, null=True, blank=True)
|
||||||
|
|
||||||
warehouse = models.ForeignKey(WareHouse, verbose_name='所在仓库', on_delete=models.SET_NULL, null=True, blank=True)
|
warehouse = models.ForeignKey(
|
||||||
|
WareHouse, verbose_name='所在仓库', on_delete=models.SET_NULL, null=True, blank=True)
|
||||||
|
|
||||||
operation = models.ForeignKey('wpm.operation', verbose_name='当前操作',
|
operation = models.ForeignKey('wpm.operation', verbose_name='当前操作',
|
||||||
on_delete=models.SET_NULL, null=True, blank=True, related_name='wp_operation')
|
on_delete=models.SET_NULL, null=True, blank=True, related_name='wp_operation')
|
||||||
|
|
@ -123,34 +138,52 @@ class WprouctTicket(CommonAModel):
|
||||||
"""
|
"""
|
||||||
|
|
||||||
number = models.CharField('物品编号', null=True, blank=True, max_length=50)
|
number = models.CharField('物品编号', null=True, blank=True, max_length=50)
|
||||||
wproduct = models.ForeignKey(WProduct, verbose_name='关联产品', on_delete=models.CASCADE)
|
wproduct = models.ForeignKey(
|
||||||
material = models.ForeignKey(Material, verbose_name='所在物料状态', on_delete=models.CASCADE)
|
WProduct, verbose_name='关联产品', on_delete=models.CASCADE)
|
||||||
step = models.ForeignKey(Step, verbose_name='所在步骤/发现步骤', on_delete=models.CASCADE)
|
material = models.ForeignKey(
|
||||||
subproduction_plan = models.ForeignKey(SubProductionPlan, verbose_name='所在子生产计划', on_delete=models.CASCADE)
|
Material, verbose_name='所在物料状态', on_delete=models.CASCADE)
|
||||||
|
step = models.ForeignKey(
|
||||||
|
Step, verbose_name='所在步骤/发现步骤', on_delete=models.CASCADE)
|
||||||
|
subproduction_plan = models.ForeignKey(
|
||||||
|
SubProductionPlan, verbose_name='所在子生产计划', on_delete=models.CASCADE)
|
||||||
|
|
||||||
|
resp_process = models.ForeignKey(
|
||||||
|
Process, verbose_name='责任工序', on_delete=models.CASCADE, null=True, blank=True)
|
||||||
|
ticket = models.ForeignKey(
|
||||||
|
'wf.ticket', verbose_name='关联工单', on_delete=models.CASCADE, related_name='wt_ticket')
|
||||||
|
decision = models.PositiveSmallIntegerField(
|
||||||
|
'最终决定', choices=WProduct.ng_choices, null=True, blank=True)
|
||||||
|
|
||||||
resp_process = models.ForeignKey(Process, verbose_name='责任工序', on_delete=models.CASCADE, null=True, blank=True)
|
|
||||||
ticket = models.ForeignKey('wf.ticket', verbose_name='关联工单', on_delete=models.CASCADE, related_name='wt_ticket')
|
|
||||||
decision = models.PositiveSmallIntegerField('最终决定', choices=WProduct.ng_choices, null=True, blank=True)
|
|
||||||
|
|
||||||
class WproductFlow(CommonAModel):
|
class WproductFlow(CommonAModel):
|
||||||
"""
|
"""
|
||||||
动态产品表日志
|
动态产品表日志
|
||||||
"""
|
"""
|
||||||
wproduct = models.ForeignKey(WProduct, on_delete=models.CASCADE, verbose_name='关联产品', null=True, blank=True)
|
wproduct = models.ForeignKey(
|
||||||
|
WProduct, on_delete=models.CASCADE, verbose_name='关联产品', null=True, blank=True)
|
||||||
number = models.CharField('物品编号', null=True, blank=True, max_length=50)
|
number = models.CharField('物品编号', null=True, blank=True, max_length=50)
|
||||||
material = models.ForeignKey(Material, verbose_name='所属物料状态', on_delete=models.CASCADE)
|
material = models.ForeignKey(
|
||||||
pre_step = models.ForeignKey(Step, verbose_name='已执行到', help_text='已执行完的步骤', null=True, blank=True, on_delete=models.CASCADE, related_name='wl_pre_step')
|
Material, verbose_name='所属物料状态', on_delete=models.CASCADE)
|
||||||
step = models.ForeignKey(Step, verbose_name='所在步骤', on_delete=models.CASCADE, null=True, blank=True, related_name='wl_step')
|
pre_step = models.ForeignKey(Step, verbose_name='已执行到', help_text='已执行完的步骤', null=True, blank=True,
|
||||||
act_state = models.IntegerField('进行状态', default=0, choices=WProduct.act_state_choices)
|
on_delete=models.CASCADE, related_name='wl_pre_step')
|
||||||
|
step = models.ForeignKey(Step, verbose_name='所在步骤', on_delete=models.CASCADE, null=True, blank=True,
|
||||||
|
related_name='wl_step')
|
||||||
|
act_state = models.IntegerField(
|
||||||
|
'进行状态', default=0, choices=WProduct.act_state_choices)
|
||||||
is_hidden = models.BooleanField('是否隐藏', default=False)
|
is_hidden = models.BooleanField('是否隐藏', default=False)
|
||||||
child = models.ForeignKey('self', blank=True, null=True, on_delete=models.CASCADE, related_name='wproduct_child')
|
child = models.ForeignKey('self', blank=True, null=True,
|
||||||
|
on_delete=models.CASCADE, related_name='wproduct_child')
|
||||||
remark = models.CharField('备注', max_length=200, null=True, blank=True)
|
remark = models.CharField('备注', max_length=200, null=True, blank=True)
|
||||||
subproduction_plan = models.ForeignKey(SubProductionPlan, verbose_name='当前子生产计划', on_delete=models.CASCADE)
|
subproduction_plan = models.ForeignKey(
|
||||||
|
SubProductionPlan, verbose_name='当前子生产计划', on_delete=models.CASCADE)
|
||||||
|
|
||||||
scrap_reason = models.IntegerField('报废原因', choices= WProduct.scrap_reason_choices, null=True, blank=True)
|
scrap_reason = models.IntegerField(
|
||||||
ng_sign = models.PositiveSmallIntegerField('不合格标记', choices= WProduct.ng_choices, null=True, blank=True)
|
'报废原因', choices=WProduct.scrap_reason_choices, null=True, blank=True)
|
||||||
|
ng_sign = models.PositiveSmallIntegerField(
|
||||||
|
'不合格标记', choices=WProduct.ng_choices, null=True, blank=True)
|
||||||
|
|
||||||
warehouse = models.ForeignKey(WareHouse, verbose_name='所在仓库', on_delete=models.SET_NULL, null=True, blank=True)
|
warehouse = models.ForeignKey(
|
||||||
|
WareHouse, verbose_name='所在仓库', on_delete=models.SET_NULL, null=True, blank=True)
|
||||||
operation = models.ForeignKey('wpm.operation', verbose_name='当前操作',
|
operation = models.ForeignKey('wpm.operation', verbose_name='当前操作',
|
||||||
on_delete=models.SET_NULL, null=True, blank=True, related_name='wpf_operation')
|
on_delete=models.SET_NULL, null=True, blank=True, related_name='wpf_operation')
|
||||||
coperation = models.ForeignKey('wpm.operation', verbose_name='创建所关联操作',
|
coperation = models.ForeignKey('wpm.operation', verbose_name='创建所关联操作',
|
||||||
|
|
@ -179,59 +212,82 @@ class Pick(CommonADModel):
|
||||||
(PICK_FROM_WAREHOUSE, '仓库领取'),
|
(PICK_FROM_WAREHOUSE, '仓库领取'),
|
||||||
(PICK_FROM_WPRODUCT, '半成品领取'),
|
(PICK_FROM_WPRODUCT, '半成品领取'),
|
||||||
)
|
)
|
||||||
subproduction_plan = models.ForeignKey(SubProductionPlan, verbose_name='关联子生产计划', on_delete=models.CASCADE)
|
subproduction_plan = models.ForeignKey(
|
||||||
type = models.PositiveSmallIntegerField(choices=type_choice, default=PICK_FROM_WAREHOUSE)
|
SubProductionPlan, verbose_name='关联子生产计划', on_delete=models.CASCADE)
|
||||||
fifo = models.ForeignKey(FIFO, verbose_name='关联的出入库记录', on_delete=models.CASCADE, null=True, blank=True)
|
type = models.PositiveSmallIntegerField(
|
||||||
|
choices=type_choice, default=PICK_FROM_WAREHOUSE)
|
||||||
|
fifo = models.ForeignKey(
|
||||||
|
FIFO, verbose_name='关联的出入库记录', on_delete=models.CASCADE, null=True, blank=True)
|
||||||
|
|
||||||
|
|
||||||
class PickWproduct(BaseModel):
|
class PickWproduct(BaseModel):
|
||||||
"""
|
"""
|
||||||
领取半成品时详情
|
领取半成品时详情
|
||||||
"""
|
"""
|
||||||
pick = models.ForeignKey(Pick, verbose_name='关联领料', on_delete=models.CASCADE)
|
pick = models.ForeignKey(Pick, verbose_name='关联领料',
|
||||||
wproduct = models.ForeignKey(WProduct, verbose_name='关联半成品', on_delete=models.CASCADE, related_name='pw_wproduct')
|
on_delete=models.CASCADE)
|
||||||
|
wproduct = models.ForeignKey(
|
||||||
|
WProduct, verbose_name='关联半成品', on_delete=models.CASCADE, related_name='pw_wproduct')
|
||||||
number = models.CharField('物品编号', null=True, blank=True, max_length=50)
|
number = models.CharField('物品编号', null=True, blank=True, max_length=50)
|
||||||
material = models.ForeignKey(Material, verbose_name='领取时的物料状态', on_delete=models.CASCADE)
|
material = models.ForeignKey(
|
||||||
subproduction_plan = models.ForeignKey(SubProductionPlan, verbose_name='领取时所属子生产计划', on_delete=models.CASCADE)
|
Material, verbose_name='领取时的物料状态', on_delete=models.CASCADE)
|
||||||
|
subproduction_plan = models.ForeignKey(
|
||||||
|
SubProductionPlan, verbose_name='领取时所属子生产计划', on_delete=models.CASCADE)
|
||||||
|
|
||||||
|
|
||||||
class Operation(CommonADModel):
|
class Operation(CommonADModel):
|
||||||
"""
|
"""
|
||||||
生产操作
|
生产操作
|
||||||
"""
|
"""
|
||||||
step = models.ForeignKey(Step, verbose_name='操作步骤', on_delete=models.CASCADE, null=True, blank=True)
|
step = models.ForeignKey(Step, verbose_name='操作步骤',
|
||||||
|
on_delete=models.CASCADE, null=True, blank=True)
|
||||||
remark = models.CharField('操作备注', max_length=200, null=True, blank=True)
|
remark = models.CharField('操作备注', max_length=200, null=True, blank=True)
|
||||||
is_submited = models.BooleanField('是否提交', default=False)
|
is_submited = models.BooleanField('是否提交', default=False)
|
||||||
|
|
||||||
|
|
||||||
class OperationWproduct(BaseModel):
|
class OperationWproduct(BaseModel):
|
||||||
"""
|
"""
|
||||||
生产操作半成品关联表
|
生产操作半成品关联表
|
||||||
"""
|
"""
|
||||||
operation = models.ForeignKey(Operation, verbose_name='关联操作', on_delete=models.CASCADE, related_name='ow_operation')
|
operation = models.ForeignKey(
|
||||||
wproduct = models.ForeignKey(WProduct, verbose_name='关联半成品', on_delete=models.CASCADE, related_name='ow_wproduct')
|
Operation, verbose_name='关联操作', on_delete=models.CASCADE, related_name='ow_operation')
|
||||||
|
wproduct = models.ForeignKey(
|
||||||
|
WProduct, verbose_name='关联半成品', on_delete=models.CASCADE, related_name='ow_wproduct')
|
||||||
number = models.CharField('物品编号', null=True, blank=True, max_length=50)
|
number = models.CharField('物品编号', null=True, blank=True, max_length=50)
|
||||||
material = models.ForeignKey(Material, verbose_name='操作时的物料状态', on_delete=models.CASCADE)
|
material = models.ForeignKey(
|
||||||
subproduction_plan = models.ForeignKey(SubProductionPlan, verbose_name='当前子生产计划', on_delete=models.CASCADE, related_name='ow_subplan')
|
Material, verbose_name='操作时的物料状态', on_delete=models.CASCADE)
|
||||||
ng_sign = models.PositiveSmallIntegerField('当时的不合格标记', choices= WProduct.ng_choices, null=True, blank=True)
|
subproduction_plan = models.ForeignKey(SubProductionPlan, verbose_name='当前子生产计划', on_delete=models.CASCADE,
|
||||||
|
related_name='ow_subplan')
|
||||||
|
ng_sign = models.PositiveSmallIntegerField(
|
||||||
|
'当时的不合格标记', choices=WProduct.ng_choices, null=True, blank=True)
|
||||||
place = models.CharField('摆放位置', null=True, blank=True, max_length=200)
|
place = models.CharField('摆放位置', null=True, blank=True, max_length=200)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
unique_together = (
|
unique_together = (
|
||||||
('operation', 'wproduct')
|
('operation', 'wproduct')
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
class OperationMaterial(BaseModel):
|
class OperationMaterial(BaseModel):
|
||||||
"""
|
"""
|
||||||
生产操作物料消耗产出表
|
生产操作物料消耗产出表
|
||||||
"""
|
"""
|
||||||
type = models.IntegerField('类型', default=0, choices=SubprodctionMaterial.type_choices)
|
type = models.IntegerField(
|
||||||
operation = models.ForeignKey(Operation, verbose_name='关联的生产操作', on_delete=models.CASCADE, related_name='om_operation')
|
'类型', default=0, choices=SubprodctionMaterial.type_choices)
|
||||||
|
operation = models.ForeignKey(Operation, verbose_name='关联的生产操作', on_delete=models.CASCADE,
|
||||||
|
related_name='om_operation')
|
||||||
|
|
||||||
material = models.ForeignKey(Material, verbose_name='可能产出的产品', on_delete=models.CASCADE,
|
material = models.ForeignKey(Material, verbose_name='可能产出的产品', on_delete=models.CASCADE,
|
||||||
null=True, blank=True, related_name='om_material')
|
null=True, blank=True, related_name='om_material')
|
||||||
count = models.PositiveSmallIntegerField('消耗或产出数量', null=True, blank=True)
|
count = models.PositiveSmallIntegerField('消耗或产出数量', null=True, blank=True)
|
||||||
|
|
||||||
wmaterial = models.ForeignKey(WMaterial, verbose_name='关联的车间物料', on_delete=models.CASCADE, null=True, blank=True)
|
wmaterial = models.ForeignKey(
|
||||||
subproduction_progress = models.ForeignKey(SubProductionProgress, verbose_name='关联的生产进度', on_delete=models.CASCADE, null=True, blank=True)
|
WMaterial, verbose_name='关联的车间物料', on_delete=models.CASCADE, null=True, blank=True)
|
||||||
|
subproduction_progress = models.ForeignKey(SubProductionProgress, verbose_name='关联的生产进度', on_delete=models.CASCADE,
|
||||||
|
null=True, blank=True)
|
||||||
|
|
||||||
subproduction_plan = models.ForeignKey(SubProductionPlan, verbose_name='关联的子计划', on_delete=models.CASCADE, null=True, blank=True)
|
subproduction_plan = models.ForeignKey(SubProductionPlan, verbose_name='关联的子计划', on_delete=models.CASCADE,
|
||||||
|
null=True, blank=True)
|
||||||
batch = models.CharField('批次号', max_length=100, null=True, blank=True)
|
batch = models.CharField('批次号', max_length=100, null=True, blank=True)
|
||||||
use_scrap = models.BooleanField('是否使用的边角料', default=False)
|
use_scrap = models.BooleanField('是否使用的边角料', default=False)
|
||||||
|
|
||||||
|
|
@ -252,23 +308,32 @@ class OperationMaterial(BaseModel):
|
||||||
('operation', 'material', 'batch')
|
('operation', 'material', 'batch')
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
class OperationRecord(BaseModel):
|
class OperationRecord(BaseModel):
|
||||||
"""
|
"""
|
||||||
记录表格
|
记录表格
|
||||||
"""
|
"""
|
||||||
form = models.ForeignKey(RecordForm, verbose_name='所用的生产记录表格', on_delete=models.CASCADE, related_name='or_form')
|
form = models.ForeignKey(RecordForm, verbose_name='所用的生产记录表格',
|
||||||
operation = models.ForeignKey(Operation, verbose_name='关联的生产操作', on_delete=models.CASCADE, related_name='or_operation')
|
on_delete=models.CASCADE, related_name='or_form')
|
||||||
|
operation = models.ForeignKey(Operation, verbose_name='关联的生产操作', on_delete=models.CASCADE,
|
||||||
|
related_name='or_operation')
|
||||||
is_filled = models.BooleanField('是否填写', default=True)
|
is_filled = models.BooleanField('是否填写', default=True)
|
||||||
|
|
||||||
|
|
||||||
class OperationRecordItem(BaseModel):
|
class OperationRecordItem(BaseModel):
|
||||||
"""
|
"""
|
||||||
记录表格字段值
|
记录表格字段值
|
||||||
"""
|
"""
|
||||||
form_field = models.ForeignKey(RecordFormField, verbose_name='关联字段', on_delete=models.CASCADE, related_name='ori_form_field')
|
form_field = models.ForeignKey(RecordFormField, verbose_name='关联字段', on_delete=models.CASCADE,
|
||||||
|
related_name='ori_form_field')
|
||||||
field_value = models.JSONField('录入值', null=True, blank=True)
|
field_value = models.JSONField('录入值', null=True, blank=True)
|
||||||
operation_record = models.ForeignKey(OperationRecord, verbose_name='关联的生产记录', on_delete=models.CASCADE, related_name='item_operation_record')
|
operation_record = models.ForeignKey(OperationRecord, verbose_name='关联的生产记录', on_delete=models.CASCADE,
|
||||||
|
related_name='item_operation_record')
|
||||||
|
|
||||||
|
|
||||||
class OperationEquip(BaseModel):
|
class OperationEquip(BaseModel):
|
||||||
operation = models.ForeignKey(Operation, verbose_name='关联操作', on_delete=models.CASCADE, related_name='oe_operation')
|
operation = models.ForeignKey(
|
||||||
equip = models.ForeignKey(Equipment, verbose_name='生产设备', on_delete=models.CASCADE, related_name='oe_equip')
|
Operation, verbose_name='关联操作', on_delete=models.CASCADE, related_name='oe_operation')
|
||||||
|
equip = models.ForeignKey(Equipment, verbose_name='生产设备',
|
||||||
|
on_delete=models.CASCADE, related_name='oe_equip')
|
||||||
remark = models.TextField('备注', null=True, blank=True)
|
remark = models.TextField('备注', null=True, blank=True)
|
||||||
|
|
@ -69,7 +69,6 @@ class PickSerializer(serializers.Serializer):
|
||||||
if isLowLevel:
|
if isLowLevel:
|
||||||
iproducts = i.pop('iproducts')
|
iproducts = i.pop('iproducts')
|
||||||
i['fifo'] = fifo
|
i['fifo'] = fifo
|
||||||
i['is_testok'] = True # 默认检验合格
|
|
||||||
i['subproduction_plan'] = sp
|
i['subproduction_plan'] = sp
|
||||||
fifoitem = FIFOItem.objects.create(**i)
|
fifoitem = FIFOItem.objects.create(**i)
|
||||||
# 创建再下一个层级
|
# 创建再下一个层级
|
||||||
|
|
@ -418,12 +417,12 @@ class WplanPutInSerializer(serializers.Serializer):
|
||||||
|
|
||||||
class WproductPutInSerializer(serializers.Serializer):
|
class WproductPutInSerializer(serializers.Serializer):
|
||||||
warehouse = serializers.PrimaryKeyRelatedField(queryset=WareHouse.objects.all(), label="仓库ID")
|
warehouse = serializers.PrimaryKeyRelatedField(queryset=WareHouse.objects.all(), label="仓库ID")
|
||||||
remark = serializers.CharField(label="入库备注", required =False)
|
remark = serializers.CharField(label="入库备注", required=False, allow_blank=True)
|
||||||
|
|
||||||
class WproductPutInsSerializer(serializers.Serializer):
|
class WproductPutInsSerializer(serializers.Serializer):
|
||||||
warehouse = serializers.PrimaryKeyRelatedField(queryset=WareHouse.objects.all(), label="仓库ID")
|
warehouse = serializers.PrimaryKeyRelatedField(queryset=WareHouse.objects.all(), label="仓库ID")
|
||||||
wproducts = serializers.PrimaryKeyRelatedField(queryset=WProduct.objects.all(), label='半成品ID', many=True)
|
wproducts = serializers.PrimaryKeyRelatedField(queryset=WProduct.objects.all(), label='半成品ID', many=True)
|
||||||
remark = serializers.CharField(label="入库备注", required =False)
|
remark = serializers.CharField(label="入库备注", required=False, allow_blank=True)
|
||||||
|
|
||||||
|
|
||||||
class OperationEquipListSerializer(serializers.Serializer):
|
class OperationEquipListSerializer(serializers.Serializer):
|
||||||
|
|
|
||||||
|
|
@ -53,6 +53,9 @@ class WpmServies(object):
|
||||||
|
|
||||||
elif wproduct.act_state == WProduct.WPR_ACT_STATE_TOTEST and wproduct.material.type == Material.MA_TYPE_GOOD: # 成品检验
|
elif wproduct.act_state == WProduct.WPR_ACT_STATE_TOTEST and wproduct.material.type == Material.MA_TYPE_GOOD: # 成品检验
|
||||||
wproduct.act_state = WProduct.WPR_ACT_STATE_TOFINALTEST
|
wproduct.act_state = WProduct.WPR_ACT_STATE_TOFINALTEST
|
||||||
|
|
||||||
|
elif wproduct.act_state == WProduct.WPR_ACT_STATE_TOTEST and wproduct.step.type == Step.STEP_TYPE_COMB: # 夹层检验
|
||||||
|
wproduct.act_state = WProduct.WPR_ACT_STATE_TOCOMBTEST
|
||||||
else:
|
else:
|
||||||
wproduct.act_state = WProduct.WPR_ACT_STATE_OK
|
wproduct.act_state = WProduct.WPR_ACT_STATE_OK
|
||||||
if wproduct.number is None: # 产生半成品编号
|
if wproduct.number is None: # 产生半成品编号
|
||||||
|
|
|
||||||
|
|
@ -1,47 +1,57 @@
|
||||||
from django.db.models.expressions import F
|
|
||||||
from django.shortcuts import render
|
|
||||||
from rest_framework.generics import CreateAPIView, GenericAPIView
|
from rest_framework.generics import CreateAPIView, GenericAPIView
|
||||||
from rest_framework.mixins import CreateModelMixin, DestroyModelMixin, ListModelMixin, RetrieveModelMixin, UpdateModelMixin
|
from rest_framework.mixins import CreateModelMixin, DestroyModelMixin, \
|
||||||
from rest_framework.utils import serializer_helpers
|
ListModelMixin, RetrieveModelMixin, UpdateModelMixin
|
||||||
from rest_framework.utils.field_mapping import get_relation_kwargs
|
from rest_framework.viewsets import GenericViewSet
|
||||||
from rest_framework.views import APIView
|
from apps.inm.models import FIFO, FIFOItem, FIFOItemProduct
|
||||||
from rest_framework.viewsets import GenericViewSet, ModelViewSet
|
|
||||||
from apps.inm.models import FIFO, FIFOItem, FIFOItemProduct, IProduct, WareHouse
|
|
||||||
from apps.inm.signals import update_inm
|
from apps.inm.signals import update_inm
|
||||||
from apps.mtm.models import Material, RecordForm, RecordFormField, Step, SubprodctionMaterial, TechDoc
|
from apps.mtm.models import Material, RecordForm, RecordFormField, Step, SubprodctionMaterial, TechDoc
|
||||||
from apps.mtm.serializers import RecordFormDetailSerializer, SubprodctionMaterialListSerializer, TechDocListSerializer
|
from apps.mtm.serializers import RecordFormDetailSerializer, SubprodctionMaterialListSerializer, TechDocListSerializer
|
||||||
from apps.pm.models import SubProductionPlan, SubProductionProgress
|
from apps.pm.models import SubProductionPlan, SubProductionProgress
|
||||||
from apps.pm.serializers import SubProductionPlanListSerializer, SubProductionPlanUpdateSerializer, SubProductionProgressSerializer
|
from apps.pm.serializers import SubProductionPlanListSerializer, SubProductionProgressSerializer
|
||||||
from apps.qm.models import TestRecord, TestRecordItem
|
from apps.qm.models import TestRecord, TestRecordItem
|
||||||
from apps.qm.serializers import TestRecordDetailSerializer
|
from apps.qm.serializers import TestRecordDetailSerializer
|
||||||
|
|
||||||
from apps.system.mixins import CreateUpdateModelAMixin, OptimizationMixin
|
from apps.system.mixins import CreateUpdateModelAMixin
|
||||||
from rest_framework.decorators import action
|
from rest_framework.decorators import action
|
||||||
from apps.wf.models import Workflow
|
from apps.wf.models import Workflow
|
||||||
from apps.wf.serializers import WorkflowSimpleSerializer
|
|
||||||
from apps.wpm.filters import CuttingFilterSet, OperationRecordFilterSet, WMaterialFilterSet, WProductFilterSet
|
from apps.wpm.filters import CuttingFilterSet, OperationRecordFilterSet, WMaterialFilterSet, WProductFilterSet
|
||||||
from apps.wpm.models import OperationEquip, OperationWproduct, Pick, PickWproduct, WMaterial, WProduct, Operation, OperationMaterial, OperationRecord, OperationRecordItem, WprouctTicket
|
from apps.wpm.models import OperationEquip, OperationWproduct, Pick, PickWproduct, WMaterial, WProduct, Operation, \
|
||||||
|
OperationMaterial, OperationRecord, OperationRecordItem, WprouctTicket
|
||||||
|
|
||||||
|
from apps.wpm.serializers import CuttingListSerializer, OperationEquipListSerializer, OperationEquipUpdateSerializer, \
|
||||||
|
OperationMaterialCreate1ListSerailizer, OperationMaterialCreate1Serailizer, OperationMaterialCreate2ListSerailizer, \
|
||||||
|
OperationMaterialCreate2Serailizer, OperationMaterialCreate3Serializer, OperationMaterialListSerializer, \
|
||||||
|
OperationRecordDetailSerializer, OperationRecordListSerializer, OperationRecordSubmitSerializer, \
|
||||||
|
OperationUpdateSerializer, OperationWproductListSerializer, OperationCreateSerializer, OperationDetailSerializer, \
|
||||||
|
OperationListSerializer, OperationWproductUpdateSerializer, PickHalfsSerializer, \
|
||||||
|
PickSerializer, OperationInitSerializer, OperationSubmitSerializer, ScrapSerializer, WMaterialListSerializer, \
|
||||||
|
WProductCardSerializer, WProductDetailSerializer, WProductListSerializer, \
|
||||||
|
WpmTestFormInitSerializer, WproductMtestSerializer, WproductPutInSerializer, \
|
||||||
|
WproductPutInsSerializer, WproductTicketListSerializer
|
||||||
|
|
||||||
from apps.wpm.serializers import CuttingListSerializer, OperationEquipListSerializer, OperationEquipUpdateSerializer, OperationMaterialCreate1ListSerailizer, OperationMaterialCreate1Serailizer, OperationMaterialCreate2ListSerailizer, OperationMaterialCreate2Serailizer, OperationMaterialCreate3Serializer, OperationMaterialListSerializer, OperationRecordDetailSerializer, OperationRecordListSerializer, OperationRecordSubmitSerializer, OperationUpdateSerializer, OperationWproductListSerializer, OperationCreateSerializer, OperationDetailSerializer, OperationListSerializer, OperationWproductUpdateSerializer, PickHalfSerializer, PickHalfsSerializer, PickSerializer, OperationInitSerializer, OperationSubmitSerializer, ScrapSerializer, WMaterialListSerializer, WProductCardSerializer, WProductDetailSerializer, WProductListSerializer, WplanPutInSerializer, WpmTestFormInitSerializer, WpmTestRecordCreateSerializer, WproductMtestSerializer, WproductPutInSerializer, WproductPutInsSerializer, WproductTicketListSerializer
|
|
||||||
from rest_framework.response import Response
|
from rest_framework.response import Response
|
||||||
from django.db import transaction
|
from django.db import transaction
|
||||||
from rest_framework import exceptions, serializers
|
from rest_framework import exceptions, serializers
|
||||||
|
|
||||||
from apps.wpm.services import WpmServies
|
from apps.wpm.services import WpmServies
|
||||||
from django.utils import timezone
|
from django.utils import timezone
|
||||||
from utils.tools import ranstr
|
|
||||||
from rest_framework import status
|
from rest_framework import status
|
||||||
from django.db.models import Count
|
from django.db.models import Count
|
||||||
|
|
||||||
|
|
||||||
# Create your views here.
|
# Create your views here.
|
||||||
|
|
||||||
|
|
||||||
class WPlanViewSet(ListModelMixin, GenericViewSet):
|
class WPlanViewSet(ListModelMixin, GenericViewSet):
|
||||||
"""
|
"""
|
||||||
车间生产计划
|
车间生产计划
|
||||||
"""
|
"""
|
||||||
perms_map = {'*': '*'}
|
perms_map = {'*': '*'}
|
||||||
queryset = SubProductionPlan.objects.select_related('process', 'workshop', 'subproduction', 'product').exclude(state=0)
|
queryset = SubProductionPlan.objects.select_related(
|
||||||
|
'process', 'workshop', 'subproduction', 'product').exclude(state=0)
|
||||||
search_fields = []
|
search_fields = []
|
||||||
serializer_class = SubProductionPlanListSerializer
|
serializer_class = SubProductionPlanListSerializer
|
||||||
filterset_fields = ['production_plan', 'process', 'state', 'product', 'workshop']
|
filterset_fields = ['production_plan',
|
||||||
|
'process', 'state', 'product', 'workshop']
|
||||||
ordering_fields = []
|
ordering_fields = []
|
||||||
ordering = ['-update_time']
|
ordering = ['-update_time']
|
||||||
|
|
||||||
|
|
@ -57,7 +67,8 @@ class WPlanViewSet(ListModelMixin, GenericViewSet):
|
||||||
领半成品
|
领半成品
|
||||||
"""
|
"""
|
||||||
spps = SubProductionProgress.objects.filter(type=SubprodctionMaterial.SUB_MA_TYPE_IN,
|
spps = SubProductionProgress.objects.filter(type=SubprodctionMaterial.SUB_MA_TYPE_IN,
|
||||||
material__type=Material.MA_TYPE_HALFGOOD, subproduction_plan=sp).select_related('material')
|
material__type=Material.MA_TYPE_HALFGOOD,
|
||||||
|
subproduction_plan=sp).select_related('material')
|
||||||
return Response(SubProductionProgressSerializer(instance=spps, many=True).data)
|
return Response(SubProductionProgressSerializer(instance=spps, many=True).data)
|
||||||
elif request.method == 'POST':
|
elif request.method == 'POST':
|
||||||
serializer = PickHalfsSerializer(data=request.data)
|
serializer = PickHalfsSerializer(data=request.data)
|
||||||
|
|
@ -77,7 +88,8 @@ class WPlanViewSet(ListModelMixin, GenericViewSet):
|
||||||
# if spp.count_pick > spp.count:
|
# if spp.count_pick > spp.count:
|
||||||
# raise exceptions.APIException('超过计划数')
|
# raise exceptions.APIException('超过计划数')
|
||||||
spp.save()
|
spp.save()
|
||||||
wps = WProduct.objects.filter(pk__in=[x.id for x in i['wproducts']], act_state=WProduct.WPR_ACT_STATE_OK)
|
wps = WProduct.objects.filter(
|
||||||
|
pk__in=[x.id for x in i['wproducts']], act_state=WProduct.WPR_ACT_STATE_OK)
|
||||||
wps.update(step=first_step,
|
wps.update(step=first_step,
|
||||||
act_state=WProduct.WPR_ACT_STATE_TORETEST, is_hidden=False, warehouse=None,
|
act_state=WProduct.WPR_ACT_STATE_TORETEST, is_hidden=False, warehouse=None,
|
||||||
subproduction_plan=sp, update_by=request.user, update_time=timezone.now())
|
subproduction_plan=sp, update_by=request.user, update_time=timezone.now())
|
||||||
|
|
@ -91,7 +103,8 @@ class WPlanViewSet(ListModelMixin, GenericViewSet):
|
||||||
m.update_by = request.user
|
m.update_by = request.user
|
||||||
m.update_time = timezone.now()
|
m.update_time = timezone.now()
|
||||||
m.save()
|
m.save()
|
||||||
WpmServies.add_wproduct_flow_log(instance=m, change_str='pick_half')
|
WpmServies.add_wproduct_flow_log(
|
||||||
|
instance=m, change_str='pick_half')
|
||||||
pw = PickWproduct()
|
pw = PickWproduct()
|
||||||
pw.pick = pick
|
pw.pick = pick
|
||||||
pw.wproduct = m
|
pw.wproduct = m
|
||||||
|
|
@ -105,71 +118,13 @@ class WPlanViewSet(ListModelMixin, GenericViewSet):
|
||||||
return Response()
|
return Response()
|
||||||
|
|
||||||
|
|
||||||
# @action(methods=['post'], detail=True, perms_map={'post':'*'}, serializer_class=WplanPutInSerializer)
|
|
||||||
# @transaction.atomic
|
|
||||||
# def putin(self, request, pk=None):
|
|
||||||
# """
|
|
||||||
# 半成品入库
|
|
||||||
# """
|
|
||||||
# serializer= WplanPutInSerializer(data=request.data)
|
|
||||||
# serializer.is_valid(raise_exception=True)
|
|
||||||
# vdata = serializer.validated_data
|
|
||||||
# subplan = self.get_object()
|
|
||||||
# material = subplan.product
|
|
||||||
# batch = subplan.number
|
|
||||||
# warehouse = vdata['warehouse']
|
|
||||||
# wproducts = WProduct.objects.filter(subproduction_plan=subplan,
|
|
||||||
# act_state=WProduct.WPR_ACT_STATE_OK, material=material, is_deleted=False)
|
|
||||||
# if wproducts.exists():
|
|
||||||
# # 创建入库记录
|
|
||||||
# remark = vdata.get('remark', '')
|
|
||||||
# fifo = FIFO.objects.create(type=FIFO.FIFO_TYPE_DO_IN,
|
|
||||||
# is_audited=True, auditor=request.user, inout_date=timezone.now(), create_by=request.user, remark=remark)
|
|
||||||
# # 创建入库明细
|
|
||||||
# fifoitem = FIFOItem()
|
|
||||||
# fifoitem.is_tested = True
|
|
||||||
# fifoitem.is_testok = True
|
|
||||||
# fifoitem.warehouse = warehouse
|
|
||||||
# fifoitem.material = material
|
|
||||||
# fifoitem.count = wproducts.count()
|
|
||||||
# fifoitem.batch = batch
|
|
||||||
# fifoitem.fifo = fifo
|
|
||||||
# fifoitem.subproduction_plan = subplan
|
|
||||||
# fifoitem.save()
|
|
||||||
# # 创建入库明细半成品
|
|
||||||
# ips = []
|
|
||||||
# for i in wproducts:
|
|
||||||
# ip = {}
|
|
||||||
# ip['fifoitem'] = fifoitem
|
|
||||||
# ip['wproduct'] = i
|
|
||||||
# ip['number'] = i.number
|
|
||||||
# ip['material'] = material
|
|
||||||
# ips.append(FIFOItemProduct(**ip))
|
|
||||||
# FIFOItemProduct.objects.bulk_create(ips)
|
|
||||||
# # 创建IProduct
|
|
||||||
# ips2 = []
|
|
||||||
# for i in wproducts:
|
|
||||||
# ip = {}
|
|
||||||
# ip['warehouse'] = warehouse
|
|
||||||
# ip['batch'] = batch
|
|
||||||
# ip['wproduct'] = i
|
|
||||||
# ip['number'] = i.number
|
|
||||||
# ip['material'] = material
|
|
||||||
# ips2.append(IProduct(**ip))
|
|
||||||
# IProduct.objects.bulk_create(ips2)
|
|
||||||
# # 更新库存并修改半成品进行状态
|
|
||||||
# update_inm(fifo)
|
|
||||||
# wproducts.update(act_sate=WProduct.WPR_ACT_STATE_INM, warehouse=warehouse, update_by=request.user, update_time=timezone.now())
|
|
||||||
|
|
||||||
# return Response()
|
|
||||||
|
|
||||||
|
|
||||||
class WMaterialViewSet(CreateUpdateModelAMixin, ListModelMixin, GenericViewSet):
|
class WMaterialViewSet(CreateUpdateModelAMixin, ListModelMixin, GenericViewSet):
|
||||||
"""
|
"""
|
||||||
车间物料表
|
车间物料表
|
||||||
"""
|
"""
|
||||||
perms_map = {'*': '*'}
|
perms_map = {'*': '*'}
|
||||||
queryset = WMaterial.objects.select_related('material', 'subproduction_plan').filter(count__gt=0)
|
queryset = WMaterial.objects.select_related(
|
||||||
|
'material', 'subproduction_plan').filter(count__gt=0)
|
||||||
serializer_class = WMaterialListSerializer
|
serializer_class = WMaterialListSerializer
|
||||||
filterset_class = WMaterialFilterSet
|
filterset_class = WMaterialFilterSet
|
||||||
ordering_fields = ['material__number']
|
ordering_fields = ['material__number']
|
||||||
|
|
@ -180,11 +135,13 @@ class WMaterialViewSet(CreateUpdateModelAMixin, ListModelMixin, GenericViewSet):
|
||||||
"""
|
"""
|
||||||
领料
|
领料
|
||||||
"""
|
"""
|
||||||
serializer= PickSerializer(data=request.data, context={'request': request})
|
serializer = PickSerializer(
|
||||||
|
data=request.data, context={'request': request})
|
||||||
serializer.is_valid(raise_exception=True)
|
serializer.is_valid(raise_exception=True)
|
||||||
serializer.save()
|
serializer.save()
|
||||||
return Response()
|
return Response()
|
||||||
|
|
||||||
|
|
||||||
class WProductViewSet(ListModelMixin, RetrieveModelMixin, GenericViewSet):
|
class WProductViewSet(ListModelMixin, RetrieveModelMixin, GenericViewSet):
|
||||||
"""
|
"""
|
||||||
半成品
|
半成品
|
||||||
|
|
@ -225,7 +182,8 @@ class WProductViewSet(ListModelMixin, RetrieveModelMixin, GenericViewSet):
|
||||||
|
|
||||||
# 根据情况创建一条检验记录
|
# 根据情况创建一条检验记录
|
||||||
if wproduct.act_state not in [WProduct.WPR_ACT_STATE_TOTEST,
|
if wproduct.act_state not in [WProduct.WPR_ACT_STATE_TOTEST,
|
||||||
WProduct.WPR_ACT_STATE_TORETEST, WProduct.WPR_ACT_STATE_TOFINALTEST, WProduct.WPR_ACT_STATE_TOCOMBTEST]:
|
WProduct.WPR_ACT_STATE_TORETEST, WProduct.WPR_ACT_STATE_TOFINALTEST,
|
||||||
|
WProduct.WPR_ACT_STATE_TOCOMBTEST]:
|
||||||
raise exceptions.APIException('该产品当前状态不可检验')
|
raise exceptions.APIException('该产品当前状态不可检验')
|
||||||
|
|
||||||
savedict = dict(
|
savedict = dict(
|
||||||
|
|
@ -272,23 +230,24 @@ class WProductViewSet(ListModelMixin, RetrieveModelMixin, GenericViewSet):
|
||||||
serializer = WproductPutInsSerializer(data=request.data)
|
serializer = WproductPutInsSerializer(data=request.data)
|
||||||
serializer.is_valid(raise_exception=True)
|
serializer.is_valid(raise_exception=True)
|
||||||
vdata = serializer.validated_data
|
vdata = serializer.validated_data
|
||||||
wproducts = WProduct.objects.filter(pk__in=[x.id for x in vdata['wproducts']])
|
wproducts = WProduct.objects.filter(
|
||||||
|
pk__in=[x.id for x in vdata['wproducts']])
|
||||||
warehouse = vdata['warehouse']
|
warehouse = vdata['warehouse']
|
||||||
for i in wproducts:
|
for i in wproducts:
|
||||||
if i.act_state is not WProduct.WPR_ACT_STATE_OK:
|
if i.act_state is not WProduct.WPR_ACT_STATE_OK:
|
||||||
raise exceptions.APIException('存在不可入库半成品')
|
raise exceptions.APIException('存在不可入库半成品')
|
||||||
# 聚合一下
|
# 聚合一下
|
||||||
wproducts_a = wproducts.values('subproduction_plan', 'material', 'subproduction_plan__number').annotate(total=Count('id'))
|
wproducts_a = wproducts.values(
|
||||||
|
'subproduction_plan', 'material', 'subproduction_plan__number').annotate(total=Count('id'))
|
||||||
# 创建入库记录
|
# 创建入库记录
|
||||||
remark = vdata.get('remark', '')
|
remark = vdata.get('remark', '')
|
||||||
fifo = FIFO.objects.create(type=FIFO.FIFO_TYPE_DO_IN,
|
fifo = FIFO.objects.create(type=FIFO.FIFO_TYPE_DO_IN,
|
||||||
is_audited=True, auditor=request.user, inout_date=timezone.now(), create_by=request.user, remark=remark)
|
is_audited=True, auditor=request.user, inout_date=timezone.now(),
|
||||||
|
create_by=request.user, remark=remark)
|
||||||
# 创建入库明细
|
# 创建入库明细
|
||||||
for i in wproducts_a:
|
for i in wproducts_a:
|
||||||
spi = SubProductionPlan.objects.get(pk=i['subproduction_plan'])
|
spi = SubProductionPlan.objects.get(pk=i['subproduction_plan'])
|
||||||
fifoitem = FIFOItem()
|
fifoitem = FIFOItem()
|
||||||
fifoitem.is_tested = True
|
|
||||||
fifoitem.is_testok = True
|
|
||||||
fifoitem.warehouse = warehouse
|
fifoitem.warehouse = warehouse
|
||||||
fifoitem.material = Material.objects.get(pk=i['material'])
|
fifoitem.material = Material.objects.get(pk=i['material'])
|
||||||
fifoitem.count = i['total']
|
fifoitem.count = i['total']
|
||||||
|
|
@ -297,7 +256,8 @@ class WProductViewSet(ListModelMixin, RetrieveModelMixin, GenericViewSet):
|
||||||
fifoitem.subproduction_plan = spi
|
fifoitem.subproduction_plan = spi
|
||||||
fifoitem.save()
|
fifoitem.save()
|
||||||
|
|
||||||
wproducts_items = wproducts.filter(subproduction_plan=i['subproduction_plan'], material=i['material'])
|
wproducts_items = wproducts.filter(
|
||||||
|
subproduction_plan=i['subproduction_plan'], material=i['material'])
|
||||||
ips = []
|
ips = []
|
||||||
for i in wproducts_items:
|
for i in wproducts_items:
|
||||||
# 创建入库明细半成品
|
# 创建入库明细半成品
|
||||||
|
|
@ -337,11 +297,10 @@ class WProductViewSet(ListModelMixin, RetrieveModelMixin, GenericViewSet):
|
||||||
# 创建入库记录
|
# 创建入库记录
|
||||||
remark = vdata.get('remark', '')
|
remark = vdata.get('remark', '')
|
||||||
fifo = FIFO.objects.create(type=FIFO.FIFO_TYPE_DO_IN,
|
fifo = FIFO.objects.create(type=FIFO.FIFO_TYPE_DO_IN,
|
||||||
is_audited=True, auditor=request.user, inout_date=timezone.now(), create_by=request.user, remark=remark)
|
is_audited=True, auditor=request.user, inout_date=timezone.now(),
|
||||||
|
create_by=request.user, remark=remark)
|
||||||
# 创建入库明细
|
# 创建入库明细
|
||||||
fifoitem = FIFOItem()
|
fifoitem = FIFOItem()
|
||||||
fifoitem.is_tested = True
|
|
||||||
fifoitem.is_testok = True
|
|
||||||
fifoitem.warehouse = warehouse
|
fifoitem.warehouse = warehouse
|
||||||
fifoitem.material = material
|
fifoitem.material = material
|
||||||
fifoitem.count = 1 # 单个半成品入库
|
fifoitem.count = 1 # 单个半成品入库
|
||||||
|
|
@ -412,9 +371,11 @@ class WProductViewSet(ListModelMixin, RetrieveModelMixin, GenericViewSet):
|
||||||
if obj.act_state != WProduct.WPR_ACT_STATE_NOTOK or obj.ng_sign is not None \
|
if obj.act_state != WProduct.WPR_ACT_STATE_NOTOK or obj.ng_sign is not None \
|
||||||
or obj.ticket is not None:
|
or obj.ticket is not None:
|
||||||
raise exceptions.APIException('该产品不可发起不合格审理')
|
raise exceptions.APIException('该产品不可发起不合格审理')
|
||||||
workflow = Workflow.objects.filter(name='不合格品审理单', is_deleted=False).first()
|
workflow = Workflow.objects.filter(
|
||||||
|
name='不合格品审理单', is_deleted=False).first()
|
||||||
if workflow:
|
if workflow:
|
||||||
test_record = TestRecord.objects.filter(wproduct=obj, is_deleted=False, is_testok=False).order_by('-id').first()
|
test_record = TestRecord.objects.filter(
|
||||||
|
wproduct=obj, is_deleted=False, is_testok=False).order_by('-id').first()
|
||||||
exist_data = {
|
exist_data = {
|
||||||
'wproduct': obj.id,
|
'wproduct': obj.id,
|
||||||
'wproduct_number': obj.number,
|
'wproduct_number': obj.number,
|
||||||
|
|
@ -446,7 +407,8 @@ class WProductViewSet(ListModelMixin, RetrieveModelMixin, GenericViewSet):
|
||||||
is_mtestok = request.data.get('is_mtestok')
|
is_mtestok = request.data.get('is_mtestok')
|
||||||
obj.is_mtestok = is_mtestok
|
obj.is_mtestok = is_mtestok
|
||||||
if is_mtestok:
|
if is_mtestok:
|
||||||
WpmServies.update_plan_state_by_mtestok(obj.subproduction_plan.production_plan)
|
WpmServies.update_plan_state_by_mtestok(
|
||||||
|
obj.subproduction_plan.production_plan)
|
||||||
obj.save()
|
obj.save()
|
||||||
change_str = 'mtest_notok'
|
change_str = 'mtest_notok'
|
||||||
if is_mtestok:
|
if is_mtestok:
|
||||||
|
|
@ -479,25 +441,30 @@ class WProductViewSet(ListModelMixin, RetrieveModelMixin, GenericViewSet):
|
||||||
ret.append([str(index + 1), item['step_name'], item['actions']])
|
ret.append([str(index + 1), item['step_name'], item['actions']])
|
||||||
return Response(ret)
|
return Response(ret)
|
||||||
|
|
||||||
|
|
||||||
class WproductTicketViewSet(ListModelMixin, GenericViewSet):
|
class WproductTicketViewSet(ListModelMixin, GenericViewSet):
|
||||||
"""
|
"""
|
||||||
玻璃审批工单
|
玻璃审批工单
|
||||||
"""
|
"""
|
||||||
perms_map = {'*': '*'}
|
perms_map = {'*': '*'}
|
||||||
queryset = WprouctTicket.objects.select_related('step', 'material', 'subproduction_plan',
|
queryset = WprouctTicket.objects.select_related('step', 'material', 'subproduction_plan',
|
||||||
'resp_process', 'subproduction_plan__production_plan__order', 'subproduction_plan__production_plan')
|
'resp_process', 'subproduction_plan__production_plan__order',
|
||||||
|
'subproduction_plan__production_plan')
|
||||||
serializer_class = WproductTicketListSerializer
|
serializer_class = WproductTicketListSerializer
|
||||||
filterset_fields = ['step', 'material', 'subproduction_plan', 'resp_process']
|
filterset_fields = ['step', 'material',
|
||||||
|
'subproduction_plan', 'resp_process']
|
||||||
ordering_fields = ['id']
|
ordering_fields = ['id']
|
||||||
ordering = ['-id']
|
ordering = ['-id']
|
||||||
|
|
||||||
|
|
||||||
class OperationViewSet(ListModelMixin, RetrieveModelMixin, CreateModelMixin, UpdateModelMixin, DestroyModelMixin, GenericViewSet):
|
class OperationViewSet(ListModelMixin, RetrieveModelMixin, CreateModelMixin, UpdateModelMixin, DestroyModelMixin,
|
||||||
|
GenericViewSet):
|
||||||
"""
|
"""
|
||||||
生产操作记录
|
生产操作记录
|
||||||
"""
|
"""
|
||||||
perms_map = {'*': '*'}
|
perms_map = {'*': '*'}
|
||||||
queryset = Operation.objects.select_related('step').prefetch_related('ow_operation', 'oe_operation', 'or_operation').all()
|
queryset = Operation.objects.select_related('step').prefetch_related(
|
||||||
|
'ow_operation', 'oe_operation', 'or_operation').all()
|
||||||
serializer_class = OperationListSerializer
|
serializer_class = OperationListSerializer
|
||||||
filterset_fields = ['step', 'step__process', 'is_submited']
|
filterset_fields = ['step', 'step__process', 'is_submited']
|
||||||
ordering_fields = ['id']
|
ordering_fields = ['id']
|
||||||
|
|
@ -537,7 +504,8 @@ class OperationViewSet(ListModelMixin, RetrieveModelMixin, CreateModelMixin, Upd
|
||||||
@transaction.atomic
|
@transaction.atomic
|
||||||
def create(self, request, *args, **kwargs):
|
def create(self, request, *args, **kwargs):
|
||||||
data = request.data
|
data = request.data
|
||||||
serializer = OperationCreateSerializer(data=data, context={'request':self.request})
|
serializer = OperationCreateSerializer(
|
||||||
|
data=data, context={'request': self.request})
|
||||||
serializer.is_valid(raise_exception=True)
|
serializer.is_valid(raise_exception=True)
|
||||||
vdata = serializer.validated_data # 校验之后的数据
|
vdata = serializer.validated_data # 校验之后的数据
|
||||||
step = vdata['step']
|
step = vdata['step']
|
||||||
|
|
@ -550,7 +518,8 @@ class OperationViewSet(ListModelMixin, RetrieveModelMixin, CreateModelMixin, Upd
|
||||||
# 创建操作所用半成品关联记录
|
# 创建操作所用半成品关联记录
|
||||||
if 'wproducts' in vdata:
|
if 'wproducts' in vdata:
|
||||||
owps = []
|
owps = []
|
||||||
splans = WpmServies.get_subplans_queryset_from_wproducts(vdata['wproducts'])
|
splans = WpmServies.get_subplans_queryset_from_wproducts(
|
||||||
|
vdata['wproducts'])
|
||||||
for wpd in vdata['wproducts']:
|
for wpd in vdata['wproducts']:
|
||||||
wpd.operation = op
|
wpd.operation = op
|
||||||
wpd.act_state = WProduct.WPR_ACT_STATE_DOING
|
wpd.act_state = WProduct.WPR_ACT_STATE_DOING
|
||||||
|
|
@ -567,9 +536,11 @@ class OperationViewSet(ListModelMixin, RetrieveModelMixin, CreateModelMixin, Upd
|
||||||
owps.append(OperationWproduct(**owp))
|
owps.append(OperationWproduct(**owp))
|
||||||
OperationWproduct.objects.bulk_create(owps)
|
OperationWproduct.objects.bulk_create(owps)
|
||||||
else:
|
else:
|
||||||
splans = WpmServies.get_subplans_queryset_from_wproducts(vdata['wproducts'])
|
splans = WpmServies.get_subplans_queryset_from_wproducts(
|
||||||
|
vdata['wproducts'])
|
||||||
# 查询需要填写的自定义表格
|
# 查询需要填写的自定义表格
|
||||||
forms = RecordForm.objects.filter(step=step, type=RecordForm.RF_TYPE_DO, enabled=True)
|
forms = RecordForm.objects.filter(
|
||||||
|
step=step, type=RecordForm.RF_TYPE_DO, enabled=True)
|
||||||
for i in forms:
|
for i in forms:
|
||||||
opr = OperationRecord()
|
opr = OperationRecord()
|
||||||
opr.operation = op
|
opr.operation = op
|
||||||
|
|
@ -591,7 +562,8 @@ class OperationViewSet(ListModelMixin, RetrieveModelMixin, CreateModelMixin, Upd
|
||||||
ope.save()
|
ope.save()
|
||||||
# 查询所需的工具工装
|
# 查询所需的工具工装
|
||||||
for i in SubprodctionMaterial.objects.filter(type=SubprodctionMaterial.SUB_MA_TYPE_TOOL,
|
for i in SubprodctionMaterial.objects.filter(type=SubprodctionMaterial.SUB_MA_TYPE_TOOL,
|
||||||
subproduction__subplan_subprod__in = splans, is_deleted=False).distinct():
|
subproduction__subplan_subprod__in=splans,
|
||||||
|
is_deleted=False).distinct():
|
||||||
opm = OperationMaterial()
|
opm = OperationMaterial()
|
||||||
opm.operation = op
|
opm.operation = op
|
||||||
opm.material = i.material
|
opm.material = i.material
|
||||||
|
|
@ -609,15 +581,18 @@ class OperationViewSet(ListModelMixin, RetrieveModelMixin, CreateModelMixin, Upd
|
||||||
step = op.step
|
step = op.step
|
||||||
if op.is_submited:
|
if op.is_submited:
|
||||||
raise exceptions.APIException('该操作已提交')
|
raise exceptions.APIException('该操作已提交')
|
||||||
# 校验消耗产出是否正确填写
|
|
||||||
omis = OperationMaterial.objects.filter(operation=op,
|
omis = OperationMaterial.objects.filter(operation=op,
|
||||||
type=SubprodctionMaterial.SUB_MA_TYPE_IN)
|
type=SubprodctionMaterial.SUB_MA_TYPE_IN)
|
||||||
sps_omi_l = omis.values_list('subproduction_plan', flat=True)
|
|
||||||
omos = OperationMaterial.objects.filter(operation=op,
|
omos = OperationMaterial.objects.filter(operation=op,
|
||||||
type=SubprodctionMaterial.SUB_MA_TYPE_OUT)
|
type=SubprodctionMaterial.SUB_MA_TYPE_OUT)
|
||||||
sps_omo_l = omos.filter(use_scrap=False).values_list('subproduction_plan', flat=True)
|
# 校验消耗产出是否正确填写
|
||||||
if not (set(list(sps_omi_l)) == set(list(sps_omo_l)) and op.step.type == Step.STEP_TYPE_DIV):
|
if op.step.type == Step.STEP_TYPE_DIV:
|
||||||
|
sps_omi_l = omis.values_list('subproduction_plan', flat=True)
|
||||||
|
sps_omo_l = omos.filter(use_scrap=False).values_list(
|
||||||
|
'subproduction_plan', flat=True)
|
||||||
|
if set(list(sps_omi_l)) != set(list(sps_omo_l)):
|
||||||
raise exceptions.APIException('消耗与产出不一致')
|
raise exceptions.APIException('消耗与产出不一致')
|
||||||
|
|
||||||
# 实际消耗物料校验
|
# 实际消耗物料校验
|
||||||
|
|
||||||
# 检查自定义表单填写
|
# 检查自定义表单填写
|
||||||
|
|
@ -638,7 +613,8 @@ class OperationViewSet(ListModelMixin, RetrieveModelMixin, CreateModelMixin, Upd
|
||||||
for i in omos:
|
for i in omos:
|
||||||
if not i.subproduction_progress.is_main:
|
if not i.subproduction_progress.is_main:
|
||||||
# 更新车间物料产出情况
|
# 更新车间物料产出情况
|
||||||
ins, _ = WMaterial.objects.get_or_create(subproduction_plan=i.subproduction_plan, material=i.material)
|
ins, _ = WMaterial.objects.get_or_create(
|
||||||
|
subproduction_plan=i.subproduction_plan, material=i.material)
|
||||||
ins.count = ins.count + i.count
|
ins.count = ins.count + i.count
|
||||||
ins.save()
|
ins.save()
|
||||||
# 更新子计划物料产出情况
|
# 更新子计划物料产出情况
|
||||||
|
|
@ -676,7 +652,8 @@ class OperationViewSet(ListModelMixin, RetrieveModelMixin, CreateModelMixin, Upd
|
||||||
raise exceptions.APIException('请选择物料产出')
|
raise exceptions.APIException('请选择物料产出')
|
||||||
for i in omos:
|
for i in omos:
|
||||||
if i.subproduction_progress.is_main:
|
if i.subproduction_progress.is_main:
|
||||||
newstep, _ = WpmServies.get_next_step(i.subproduction_plan, step)
|
newstep, _ = WpmServies.get_next_step(
|
||||||
|
i.subproduction_plan, step)
|
||||||
wpr = dict(material=i.material, step=newstep,
|
wpr = dict(material=i.material, step=newstep,
|
||||||
act_state=WProduct.WPR_ACT_STATE_DOWAIT, remark='',
|
act_state=WProduct.WPR_ACT_STATE_DOWAIT, remark='',
|
||||||
subproduction_plan=i.subproduction_plan,
|
subproduction_plan=i.subproduction_plan,
|
||||||
|
|
@ -684,15 +661,18 @@ class OperationViewSet(ListModelMixin, RetrieveModelMixin, CreateModelMixin, Upd
|
||||||
for x in range(i.count):
|
for x in range(i.count):
|
||||||
ins = WProduct.objects.create(**wpr)
|
ins = WProduct.objects.create(**wpr)
|
||||||
# 添加日志
|
# 添加日志
|
||||||
WpmServies.add_wproduct_flow_log(ins, 'wproduct_create')
|
WpmServies.add_wproduct_flow_log(
|
||||||
|
ins, 'wproduct_create')
|
||||||
# 更新进度
|
# 更新进度
|
||||||
WpmServies.update_subproduction_progress_main(sp=i.subproduction_plan)
|
WpmServies.update_subproduction_progress_main(
|
||||||
|
sp=i.subproduction_plan)
|
||||||
elif step.type == Step.STEP_TYPE_COMB:
|
elif step.type == Step.STEP_TYPE_COMB:
|
||||||
oms_w = omos.filter(subproduction_progress__is_main=True)
|
oms_w = omos.filter(subproduction_progress__is_main=True)
|
||||||
if len(oms_w) == 1:
|
if len(oms_w) == 1:
|
||||||
oms_w = oms_w[0]
|
oms_w = oms_w[0]
|
||||||
# 校验单片数量是否正确, 暂时未写
|
# 校验单片数量是否正确, 暂时未写
|
||||||
newstep, hasNext = WpmServies.get_next_step(oms_w.subproduction_plan, step)
|
newstep, hasNext = WpmServies.get_next_step(
|
||||||
|
oms_w.subproduction_plan, step)
|
||||||
wproduct = WProduct()
|
wproduct = WProduct()
|
||||||
wproduct.material = oms_w.material
|
wproduct.material = oms_w.material
|
||||||
wproduct.step = newstep
|
wproduct.step = newstep
|
||||||
|
|
@ -702,14 +682,16 @@ class OperationViewSet(ListModelMixin, RetrieveModelMixin, CreateModelMixin, Upd
|
||||||
else:
|
else:
|
||||||
wproduct.act_state = WProduct.WPR_ACT_STATE_TOTEST
|
wproduct.act_state = WProduct.WPR_ACT_STATE_TOTEST
|
||||||
# 更新子计划进度
|
# 更新子计划进度
|
||||||
WpmServies.update_subproduction_progress_main(sp=oms_w.subproduction_plan)
|
WpmServies.update_subproduction_progress_main(
|
||||||
|
sp=oms_w.subproduction_plan)
|
||||||
wproduct.create_by = request.user
|
wproduct.create_by = request.user
|
||||||
wproduct.coperation = op
|
wproduct.coperation = op
|
||||||
wproduct.save()
|
wproduct.save()
|
||||||
WpmServies.add_wproduct_flow_log(wproduct, 'wproduct_create')
|
WpmServies.add_wproduct_flow_log(wproduct, 'wproduct_create')
|
||||||
# 隐藏原半成品
|
# 隐藏原半成品
|
||||||
wps = WProduct.objects.filter(ow_wproduct__operation=op)
|
wps = WProduct.objects.filter(ow_wproduct__operation=op)
|
||||||
wps.update(is_hidden=True, child=wproduct, update_by=request.user, update_time=timezone.now())
|
wps.update(is_hidden=True, child=wproduct,
|
||||||
|
update_by=request.user, update_time=timezone.now())
|
||||||
else:
|
else:
|
||||||
raise exceptions.APIException('产出物料未填写或填写错误')
|
raise exceptions.APIException('产出物料未填写或填写错误')
|
||||||
op.is_submited = True
|
op.is_submited = True
|
||||||
|
|
@ -721,13 +703,13 @@ class OperationViewSet(ListModelMixin, RetrieveModelMixin, CreateModelMixin, Upd
|
||||||
return Response()
|
return Response()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class OperationWproductViewSet(ListModelMixin, DestroyModelMixin, UpdateModelMixin, GenericViewSet):
|
class OperationWproductViewSet(ListModelMixin, DestroyModelMixin, UpdateModelMixin, GenericViewSet):
|
||||||
"""
|
"""
|
||||||
操作使用的半成品
|
操作使用的半成品
|
||||||
"""
|
"""
|
||||||
perms_map = {'*': '*'}
|
perms_map = {'*': '*'}
|
||||||
queryset = OperationWproduct.objects.select_related('subproduction_plan', 'material').all()
|
queryset = OperationWproduct.objects.select_related(
|
||||||
|
'subproduction_plan', 'material').all()
|
||||||
serializer_class = OperationWproductListSerializer
|
serializer_class = OperationWproductListSerializer
|
||||||
filterset_fields = ['material', 'subproduction_plan', 'operation']
|
filterset_fields = ['material', 'subproduction_plan', 'operation']
|
||||||
ordering_fields = ['id']
|
ordering_fields = ['id']
|
||||||
|
|
@ -749,12 +731,14 @@ class OperationWproductViewSet(ListModelMixin, DestroyModelMixin, UpdateModelMix
|
||||||
wp.save()
|
wp.save()
|
||||||
return Response()
|
return Response()
|
||||||
|
|
||||||
|
|
||||||
class OperationEquipViewSet(ListModelMixin, DestroyModelMixin, UpdateModelMixin, GenericViewSet):
|
class OperationEquipViewSet(ListModelMixin, DestroyModelMixin, UpdateModelMixin, GenericViewSet):
|
||||||
"""
|
"""
|
||||||
操作使用的设备
|
操作使用的设备
|
||||||
"""
|
"""
|
||||||
perms_map = {'*': '*'}
|
perms_map = {'*': '*'}
|
||||||
queryset = OperationEquip.objects.select_related('operation', 'equip').all()
|
queryset = OperationEquip.objects.select_related(
|
||||||
|
'operation', 'equip').all()
|
||||||
serializer_class = OperationEquipListSerializer
|
serializer_class = OperationEquipListSerializer
|
||||||
filterset_fields = ['operation', 'equip']
|
filterset_fields = ['operation', 'equip']
|
||||||
ordering_fields = ['id']
|
ordering_fields = ['id']
|
||||||
|
|
@ -779,12 +763,14 @@ class OperationEquipViewSet(ListModelMixin, DestroyModelMixin, UpdateModelMixin,
|
||||||
instance.delete()
|
instance.delete()
|
||||||
return Response()
|
return Response()
|
||||||
|
|
||||||
|
|
||||||
class OperationRecordViewSet(ListModelMixin, DestroyModelMixin, UpdateModelMixin, RetrieveModelMixin, GenericViewSet):
|
class OperationRecordViewSet(ListModelMixin, DestroyModelMixin, UpdateModelMixin, RetrieveModelMixin, GenericViewSet):
|
||||||
"""
|
"""
|
||||||
操作使用的自定义表格
|
操作使用的自定义表格
|
||||||
"""
|
"""
|
||||||
perms_map = {'*': '*'}
|
perms_map = {'*': '*'}
|
||||||
queryset = OperationRecord.objects.select_related('operation', 'form').all()
|
queryset = OperationRecord.objects.select_related(
|
||||||
|
'operation', 'form').all()
|
||||||
serializer_class = OperationRecordListSerializer
|
serializer_class = OperationRecordListSerializer
|
||||||
filterset_class = OperationRecordFilterSet
|
filterset_class = OperationRecordFilterSet
|
||||||
ordering_fields = ['id']
|
ordering_fields = ['id']
|
||||||
|
|
@ -796,6 +782,7 @@ class OperationRecordViewSet(ListModelMixin, DestroyModelMixin, UpdateModelMixin
|
||||||
elif self.action == 'retrieve':
|
elif self.action == 'retrieve':
|
||||||
return OperationRecordDetailSerializer
|
return OperationRecordDetailSerializer
|
||||||
return super().get_serializer_class()
|
return super().get_serializer_class()
|
||||||
|
|
||||||
@transaction.atomic()
|
@transaction.atomic()
|
||||||
def destroy(self, request, *args, **kwargs):
|
def destroy(self, request, *args, **kwargs):
|
||||||
instance = self.get_object()
|
instance = self.get_object()
|
||||||
|
|
@ -804,7 +791,6 @@ class OperationRecordViewSet(ListModelMixin, DestroyModelMixin, UpdateModelMixin
|
||||||
instance.delete()
|
instance.delete()
|
||||||
return Response()
|
return Response()
|
||||||
|
|
||||||
|
|
||||||
def update(self, request, *args, **kwargs):
|
def update(self, request, *args, **kwargs):
|
||||||
serializer = OperationRecordSubmitSerializer(data=request.data)
|
serializer = OperationRecordSubmitSerializer(data=request.data)
|
||||||
serializer.is_valid(raise_exception=True)
|
serializer.is_valid(raise_exception=True)
|
||||||
|
|
@ -827,7 +813,8 @@ class OperationMaterialInputViewSet(ListModelMixin, CreateModelMixin, DestroyMod
|
||||||
消耗物料
|
消耗物料
|
||||||
"""
|
"""
|
||||||
perms_map = {'*': '*'}
|
perms_map = {'*': '*'}
|
||||||
queryset = OperationMaterial.objects.select_related('operation', 'subproduction_plan').filter(type=SubprodctionMaterial.SUB_MA_TYPE_IN)
|
queryset = OperationMaterial.objects.select_related(
|
||||||
|
'operation', 'subproduction_plan').filter(type=SubprodctionMaterial.SUB_MA_TYPE_IN)
|
||||||
serializer_class = OperationMaterialListSerializer
|
serializer_class = OperationMaterialListSerializer
|
||||||
filterset_fields = ['operation', 'subproduction_plan']
|
filterset_fields = ['operation', 'subproduction_plan']
|
||||||
ordering_fields = ['id']
|
ordering_fields = ['id']
|
||||||
|
|
@ -838,7 +825,8 @@ class OperationMaterialInputViewSet(ListModelMixin, CreateModelMixin, DestroyMod
|
||||||
return OperationMaterialCreate1Serailizer
|
return OperationMaterialCreate1Serailizer
|
||||||
return super().get_serializer_class()
|
return super().get_serializer_class()
|
||||||
|
|
||||||
@action(methods=['post'], detail=False, perms_map={'post':'*'}, serializer_class=OperationMaterialCreate1ListSerailizer)
|
@action(methods=['post'], detail=False, perms_map={'post': '*'},
|
||||||
|
serializer_class=OperationMaterialCreate1ListSerailizer)
|
||||||
def creates(self, request, pk=None):
|
def creates(self, request, pk=None):
|
||||||
"""
|
"""
|
||||||
批量创建消耗物料
|
批量创建消耗物料
|
||||||
|
|
@ -848,7 +836,6 @@ class OperationMaterialInputViewSet(ListModelMixin, CreateModelMixin, DestroyMod
|
||||||
serializer.save()
|
serializer.save()
|
||||||
return Response()
|
return Response()
|
||||||
|
|
||||||
|
|
||||||
@transaction.atomic()
|
@transaction.atomic()
|
||||||
def destroy(self, request, *args, **kwargs):
|
def destroy(self, request, *args, **kwargs):
|
||||||
instance = self.get_object()
|
instance = self.get_object()
|
||||||
|
|
@ -857,13 +844,16 @@ class OperationMaterialInputViewSet(ListModelMixin, CreateModelMixin, DestroyMod
|
||||||
instance.delete()
|
instance.delete()
|
||||||
return Response()
|
return Response()
|
||||||
|
|
||||||
|
|
||||||
class CuttingListViewSet(ListModelMixin, GenericViewSet):
|
class CuttingListViewSet(ListModelMixin, GenericViewSet):
|
||||||
"""
|
"""
|
||||||
下料清单
|
下料清单
|
||||||
"""
|
"""
|
||||||
perms_map = {'*': '*'}
|
perms_map = {'*': '*'}
|
||||||
queryset = OperationMaterial.objects.select_related('operation',
|
queryset = OperationMaterial.objects.select_related('operation',
|
||||||
'subproduction_plan', 'material', 'operation__create_by').filter(operation__step__id=1, type=SubprodctionMaterial.SUB_MA_TYPE_OUT)
|
'subproduction_plan', 'material',
|
||||||
|
'operation__create_by').filter(operation__step__id=1,
|
||||||
|
type=SubprodctionMaterial.SUB_MA_TYPE_OUT)
|
||||||
serializer_class = CuttingListSerializer
|
serializer_class = CuttingListSerializer
|
||||||
filterset_class = CuttingFilterSet
|
filterset_class = CuttingFilterSet
|
||||||
ordering_fields = ['id']
|
ordering_fields = ['id']
|
||||||
|
|
@ -875,7 +865,8 @@ class OperationMaterialOutputViewSet(ListModelMixin, CreateModelMixin, DestroyMo
|
||||||
产出物料
|
产出物料
|
||||||
"""
|
"""
|
||||||
perms_map = {'*': '*'}
|
perms_map = {'*': '*'}
|
||||||
queryset = OperationMaterial.objects.select_related('operation', 'subproduction_plan').filter(type=SubprodctionMaterial.SUB_MA_TYPE_OUT)
|
queryset = OperationMaterial.objects.select_related(
|
||||||
|
'operation', 'subproduction_plan').filter(type=SubprodctionMaterial.SUB_MA_TYPE_OUT)
|
||||||
serializer_class = OperationMaterialListSerializer
|
serializer_class = OperationMaterialListSerializer
|
||||||
filterset_fields = ['operation', 'subproduction_plan']
|
filterset_fields = ['operation', 'subproduction_plan']
|
||||||
ordering_fields = ['id']
|
ordering_fields = ['id']
|
||||||
|
|
@ -886,7 +877,8 @@ class OperationMaterialOutputViewSet(ListModelMixin, CreateModelMixin, DestroyMo
|
||||||
return OperationMaterialCreate2Serailizer
|
return OperationMaterialCreate2Serailizer
|
||||||
return super().get_serializer_class()
|
return super().get_serializer_class()
|
||||||
|
|
||||||
@action(methods=['post'], detail=False, perms_map={'post':'*'}, serializer_class=OperationMaterialCreate2ListSerailizer)
|
@action(methods=['post'], detail=False, perms_map={'post': '*'},
|
||||||
|
serializer_class=OperationMaterialCreate2ListSerailizer)
|
||||||
def creates(self, request, pk=None):
|
def creates(self, request, pk=None):
|
||||||
"""
|
"""
|
||||||
批量创建产出物料
|
批量创建产出物料
|
||||||
|
|
@ -904,12 +896,14 @@ class OperationMaterialOutputViewSet(ListModelMixin, CreateModelMixin, DestroyMo
|
||||||
instance.delete()
|
instance.delete()
|
||||||
return Response()
|
return Response()
|
||||||
|
|
||||||
|
|
||||||
class OperationMaterialToolViewSet(ListModelMixin, CreateModelMixin, DestroyModelMixin, GenericViewSet):
|
class OperationMaterialToolViewSet(ListModelMixin, CreateModelMixin, DestroyModelMixin, GenericViewSet):
|
||||||
"""
|
"""
|
||||||
工具工装
|
工具工装
|
||||||
"""
|
"""
|
||||||
perms_map = {'*': '*'}
|
perms_map = {'*': '*'}
|
||||||
queryset = OperationMaterial.objects.select_related('operation', 'subproduction_plan').filter(type=SubprodctionMaterial.SUB_MA_TYPE_TOOL)
|
queryset = OperationMaterial.objects.select_related(
|
||||||
|
'operation', 'subproduction_plan').filter(type=SubprodctionMaterial.SUB_MA_TYPE_TOOL)
|
||||||
serializer_class = OperationMaterialListSerializer
|
serializer_class = OperationMaterialListSerializer
|
||||||
filterset_fields = ['operation', 'subproduction_plan']
|
filterset_fields = ['operation', 'subproduction_plan']
|
||||||
ordering_fields = ['id']
|
ordering_fields = ['id']
|
||||||
|
|
@ -928,9 +922,11 @@ class OperationMaterialToolViewSet(ListModelMixin, CreateModelMixin, DestroyMode
|
||||||
instance.delete()
|
instance.delete()
|
||||||
return Response()
|
return Response()
|
||||||
|
|
||||||
|
|
||||||
class DoFormInit(CreateAPIView, GenericAPIView):
|
class DoFormInit(CreateAPIView, GenericAPIView):
|
||||||
perms_map = {'*': '*'}
|
perms_map = {'*': '*'}
|
||||||
serializer_class = OperationInitSerializer
|
serializer_class = OperationInitSerializer
|
||||||
|
|
||||||
def post(self, request, format=None):
|
def post(self, request, format=None):
|
||||||
"""
|
"""
|
||||||
调用操作表单
|
调用操作表单
|
||||||
|
|
@ -947,18 +943,22 @@ class DoFormInit(CreateAPIView, GenericAPIView):
|
||||||
# ret_0['subproduction_plan'] = data['subproduction_plan']
|
# ret_0['subproduction_plan'] = data['subproduction_plan']
|
||||||
if 'wproducts' in data and data['wproducts']:
|
if 'wproducts' in data and data['wproducts']:
|
||||||
ret_0['wproducts'] = data['wproducts']
|
ret_0['wproducts'] = data['wproducts']
|
||||||
splans = WProduct.objects.filter(id__in=data['wproducts']).values_list('subproduction_plan', flat=True)
|
splans = WProduct.objects.filter(id__in=data['wproducts']).values_list(
|
||||||
|
'subproduction_plan', flat=True)
|
||||||
# 调出所属子计划现有物料
|
# 调出所属子计划现有物料
|
||||||
ret_0['input'] = WMaterialListSerializer(instance=WMaterial.objects.filter(subproduction_plan__in=splans), many=True).data
|
ret_0['input'] = WMaterialListSerializer(instance=WMaterial.objects.filter(
|
||||||
|
subproduction_plan__in=splans), many=True).data
|
||||||
else:
|
else:
|
||||||
if 'subproduction_plan' in vdata:
|
if 'subproduction_plan' in vdata:
|
||||||
splans = [vdata['subproduction_plan']]
|
splans = [vdata['subproduction_plan']]
|
||||||
else:
|
else:
|
||||||
splans = SubProductionPlan.objects.filter(is_deleted=False,
|
splans = SubProductionPlan.objects.filter(is_deleted=False,
|
||||||
subproduction__usedstep_subproduction__step=vdata['step'], state=3)
|
subproduction__usedstep_subproduction__step=vdata[
|
||||||
|
'step'],
|
||||||
|
state=3)
|
||||||
ret_0['wproducts'] = []
|
ret_0['wproducts'] = []
|
||||||
ret_0['input'] = WMaterialListSerializer(instance=WMaterial.objects.filter(subproduction_plan__in=splans), many=True).data
|
ret_0['input'] = WMaterialListSerializer(instance=WMaterial.objects.filter(
|
||||||
|
subproduction_plan__in=splans), many=True).data
|
||||||
|
|
||||||
for i in ret_0['input']:
|
for i in ret_0['input']:
|
||||||
i['count_input'] = 0
|
i['count_input'] = 0
|
||||||
|
|
@ -972,25 +972,29 @@ class DoFormInit(CreateAPIView, GenericAPIView):
|
||||||
# 此时显示所有子计划需要输出的物料
|
# 此时显示所有子计划需要输出的物料
|
||||||
o_objs = SubProductionProgress.objects.filter(
|
o_objs = SubProductionProgress.objects.filter(
|
||||||
subproduction_plan__in=splans, type=SubprodctionMaterial.SUB_MA_TYPE_OUT)
|
subproduction_plan__in=splans, type=SubprodctionMaterial.SUB_MA_TYPE_OUT)
|
||||||
ret_0['output'] = list(o_objs.values('subproduction_plan', 'material', 'material__name', 'material__number'))
|
ret_0['output'] = list(o_objs.values(
|
||||||
|
'subproduction_plan', 'material', 'material__name', 'material__number'))
|
||||||
for i in ret_0['output']:
|
for i in ret_0['output']:
|
||||||
i['count_output'] = 0
|
i['count_output'] = 0
|
||||||
ret['forms'] = []
|
ret['forms'] = []
|
||||||
ret_0['id'] = 0
|
ret_0['id'] = 0
|
||||||
ret_0['name'] = '基本信息'
|
ret_0['name'] = '基本信息'
|
||||||
# 查询工具工装
|
# 查询工具工装
|
||||||
ret_0['tools'] = SubprodctionMaterialListSerializer(instance=
|
ret_0['tools'] = SubprodctionMaterialListSerializer(
|
||||||
SubprodctionMaterial.objects.filter(type=SubprodctionMaterial.SUB_MA_TYPE_TOOL,
|
instance=SubprodctionMaterial.objects.filter(type=SubprodctionMaterial.SUB_MA_TYPE_TOOL,
|
||||||
subproduction__subplan_subprod__in=splans), many=True).data
|
subproduction__subplan_subprod__in=splans), many=True).data
|
||||||
# 查询技术文档
|
# 查询技术文档
|
||||||
ret_0['techdocs'] = TechDocListSerializer(instance =
|
ret_0['techdocs'] = TechDocListSerializer(
|
||||||
TechDoc.objects.filter(subproduction__subplan_subprod__in = splans, enabled=True)\
|
instance=TechDoc.objects.filter(
|
||||||
|
subproduction__subplan_subprod__in=splans, enabled=True)
|
||||||
.distinct(), many=True).data
|
.distinct(), many=True).data
|
||||||
|
|
||||||
ret['forms'].append(ret_0)
|
ret['forms'].append(ret_0)
|
||||||
forms = RecordForm.objects.filter(step=vdata['step'], type=RecordForm.RF_TYPE_DO)
|
forms = RecordForm.objects.filter(
|
||||||
|
step=vdata['step'], type=RecordForm.RF_TYPE_DO)
|
||||||
if forms.exists():
|
if forms.exists():
|
||||||
ret['forms'].extend(RecordFormDetailSerializer(instance=forms, many=True).data)
|
ret['forms'].extend(RecordFormDetailSerializer(
|
||||||
|
instance=forms, many=True).data)
|
||||||
return Response(ret)
|
return Response(ret)
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1004,7 +1008,8 @@ class DoFormSubmit(CreateAPIView, GenericAPIView):
|
||||||
提交操作表单
|
提交操作表单
|
||||||
"""
|
"""
|
||||||
data = request.data
|
data = request.data
|
||||||
serializer = OperationSubmitSerializer(data=data, context={'request':self.request})
|
serializer = OperationSubmitSerializer(
|
||||||
|
data=data, context={'request': self.request})
|
||||||
serializer.is_valid(raise_exception=True)
|
serializer.is_valid(raise_exception=True)
|
||||||
vdata = serializer.validated_data # 校验之后的数据
|
vdata = serializer.validated_data # 校验之后的数据
|
||||||
|
|
||||||
|
|
@ -1053,7 +1058,8 @@ class DoFormSubmit(CreateAPIView, GenericAPIView):
|
||||||
# 如果是切割
|
# 如果是切割
|
||||||
# 获取下一步子工序
|
# 获取下一步子工序
|
||||||
if vdata['step'].type == Step.STEP_TYPE_DIV:
|
if vdata['step'].type == Step.STEP_TYPE_DIV:
|
||||||
newstep, _ = WpmServies.get_next_step(i['subproduction_plan'], vdata['step'])
|
newstep, _ = WpmServies.get_next_step(
|
||||||
|
i['subproduction_plan'], vdata['step'])
|
||||||
wpr = dict(material=ma, step=newstep,
|
wpr = dict(material=ma, step=newstep,
|
||||||
act_state=WProduct.WPR_ACT_STATE_DOWAIT, remark='',
|
act_state=WProduct.WPR_ACT_STATE_DOWAIT, remark='',
|
||||||
subproduction_plan=i['subproduction_plan'])
|
subproduction_plan=i['subproduction_plan'])
|
||||||
|
|
@ -1080,7 +1086,8 @@ class DoFormSubmit(CreateAPIView, GenericAPIView):
|
||||||
wproducts = vdata['wproducts']
|
wproducts = vdata['wproducts']
|
||||||
if 'suproduction_plan' in vdata:
|
if 'suproduction_plan' in vdata:
|
||||||
wproducts.update(is_hidden=True) # 隐藏
|
wproducts.update(is_hidden=True) # 隐藏
|
||||||
newstep, hasNext = WpmServies.get_next_step(i['subproduction_plan'], vdata['step'])
|
newstep, hasNext = WpmServies.get_next_step(
|
||||||
|
i['subproduction_plan'], vdata['step'])
|
||||||
wproduct = WProduct()
|
wproduct = WProduct()
|
||||||
wproduct.material = vdata['subproduction_plan'].product
|
wproduct.material = vdata['subproduction_plan'].product
|
||||||
wproduct.step = newstep
|
wproduct.step = newstep
|
||||||
|
|
@ -1096,7 +1103,8 @@ class DoFormSubmit(CreateAPIView, GenericAPIView):
|
||||||
else:
|
else:
|
||||||
for wproduct in vdata['wproducts']:
|
for wproduct in vdata['wproducts']:
|
||||||
# 获取下一步子工序
|
# 获取下一步子工序
|
||||||
newstep, hasNext = WpmServies.get_next_step(wproduct.subproduction_plan, vdata['step'])
|
newstep, hasNext = WpmServies.get_next_step(
|
||||||
|
wproduct.subproduction_plan, vdata['step'])
|
||||||
wproduct.step = newstep
|
wproduct.step = newstep
|
||||||
wproduct.pre_step = vdata['step']
|
wproduct.pre_step = vdata['step']
|
||||||
if hasNext:
|
if hasNext:
|
||||||
|
|
@ -1125,5 +1133,3 @@ class DoFormSubmit(CreateAPIView, GenericAPIView):
|
||||||
wrds.append(OperationRecordItem(**m))
|
wrds.append(OperationRecordItem(**m))
|
||||||
OperationRecordItem.objects.bulk_create(wrds)
|
OperationRecordItem.objects.bulk_create(wrds)
|
||||||
return Response()
|
return Response()
|
||||||
|
|
||||||
|
|
||||||
Loading…
Reference in New Issue