Merge branch 'develop' of https://e.coding.net/ctcdevteam/hberp/hberp into develop

This commit is contained in:
shijing 2021-12-31 13:20:53 +08:00
commit 801b41221e
16 changed files with 905 additions and 187 deletions

View File

@ -2,8 +2,8 @@
ENV = 'development' ENV = 'development'
# base api # base api
VUE_APP_BASE_API = 'http://127.0.0.1:8000/api' #VUE_APP_BASE_API = 'http://127.0.0.1:8000/api'
#VUE_APP_BASE_API = 'http://47.95.0.242:2222/api' VUE_APP_BASE_API = 'http://47.95.0.242:2222/api'
# vue-cli uses the VUE_CLI_BABEL_TRANSPILE_MODULES environment variable, # vue-cli uses the VUE_CLI_BABEL_TRANSPILE_MODULES environment variable,

View File

@ -153,6 +153,15 @@ export function createTicket(data) {
method: 'post', method: 'post',
data data
}) })
}
//详情
export function ticketread(id) {
return request({
url: `/wf/ticket/${id}/`,
method: 'get',
})
} }
//接单 //接单
export function ticketAccpet(id,data) { export function ticketAccpet(id,data) {

View File

@ -313,6 +313,14 @@ export function getRetrial(id) {
method: 'GET', method: 'GET',
}) })
} }
//玻璃审批工单
export function getwproductticketList(query) {
return request({
url: '/wpm/wproduct_ticket/',
method: 'get',
params: query
})
}

View File

@ -360,6 +360,14 @@ export const asyncRoutes = [
hidden: true hidden: true
} }
, ,
{
path: 'wproduct/:id',
name: 'wproduct',
component: () => import('@/views/qm/wproduct'),
meta: { title: '工序玻璃', perms: ['vendor_manage'] },
hidden: true
}
,
{ {
path: 'taskrecordfrom/:id', path: 'taskrecordfrom/:id',
name: 'taskrecordfrom', name: 'taskrecordfrom',

View File

@ -1,91 +1,244 @@
<template> <template>
<div class="app-container"> <div class="app-container">
<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">
<el-tab-pane label="总览" name="1" > <el-tab-pane label="总览" name="1">
<el-table <el-table
v-loading="listLoading" :data="productionplan.results"
:data="productionplan.results" border
border fit
fit stripe
stripe highlight-current-row
highlight-current-row height="620"
height="620" v-el-height-adaptive-table="{ bottomOffset: 40 }"
v-el-height-adaptive-table="{bottomOffset: 40}" >
> <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">{{ scope.row.number }}</template>
<template slot-scope="scope">{{ scope.row.number }}</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.product_.name }}</template> scope.row.product_.name
</el-table-column> }}</template>
<el-table-column label="规格型号"> </el-table-column>
<template slot-scope="scope">{{ <el-table-column label="规格型号">
scope.row.product_.specification <template slot-scope="scope">{{
}}</template> scope.row.product_.specification
</el-table-column> }}</template>
<el-table-column label="合格率" > </el-table-column>
<el-table-column label="冷加工"> <el-table-column label="合格率">
<template slot-scope="scope" v-if="scope.row.process_json['01']">{{ scope.row.process_json['01'].rate }}%</template> <el-table-column label="冷加工">
</el-table-column> <template slot-scope="scope" v-if="scope.row.process_json['01']"
<el-table-column label="热弯"> >{{ scope.row.process_json["01"].rate }}%</template
<template slot-scope="scope" v-if="scope.row.process_json['02']">{{ scope.row.process_json['02'].rate }}%</template> >
</el-table-column> </el-table-column>
<el-table-column label="化学钢化"> <el-table-column label="热弯">
<template slot-scope="scope" v-if="scope.row.process_json['03']">{{ scope.row.process_json['03'].rate }}%</template> <template slot-scope="scope" v-if="scope.row.process_json['02']"
</el-table-column> >{{ scope.row.process_json["02"].rate }}%</template
<el-table-column label="镀膜"> >
<template slot-scope="scope" v-if="scope.row.process_json['04']">{{ scope.row.process_json['04'].rate }}%</template> </el-table-column>
</el-table-column> <el-table-column label="化学钢化">
<el-table-column label="夹层"> <template slot-scope="scope" v-if="scope.row.process_json['03']"
<template slot-scope="scope" v-if="scope.row.process_json['05']">{{ scope.row.process_json['05'].rate }}%</template> >{{ scope.row.process_json["03"].rate }}%</template
</el-table-column> >
<el-table-column label="包边"> </el-table-column>
<template slot-scope="scope" v-if="scope.row.process_json['06']">{{ scope.row.process_json['06'].rate }}%</template> <el-table-column label="镀膜">
</el-table-column> <template slot-scope="scope" v-if="scope.row.process_json['04']"
<el-table-column label="装框"> >{{ scope.row.process_json["04"].rate }}%</template
<template slot-scope="scope" v-if="scope.row.process_json['07']">{{ scope.row.process_json['07'].rate }}%</template> >
</el-table-column> </el-table-column>
</el-table-column> <el-table-column label="夹层">
<el-table-column label="创建时间"> <template slot-scope="scope" v-if="scope.row.process_json['05']"
<template slot-scope="scope">{{ scope.row.create_time }}</template> >{{ scope.row.process_json["05"].rate }}%</template
</el-table-column> >
<el-table-column label="操作"> </el-table-column>
<template slot-scope="scope"> <el-table-column label="包边">
<template slot-scope="scope" v-if="scope.row.process_json['06']"
<el-link >{{ scope.row.process_json["06"].rate }}%</template
v-if="checkPermission(['material_update'])" >
type="primary" </el-table-column>
@click="handledetail(scope)" <el-table-column label="装框">
>详情</el-link <template slot-scope="scope" v-if="scope.row.process_json['07']"
> >{{ scope.row.process_json["07"].rate }}%</template
>
</el-table-column>
</el-table-column>
<el-table-column label="创建时间">
<template slot-scope="scope">{{
scope.row.create_time
}}</template>
</el-table-column>
<el-table-column label="操作">
<template slot-scope="scope">
<el-link
v-if="checkPermission(['material_update'])"
type="primary"
@click="handledetail(scope)"
>详情</el-link
>
</template>
</el-table-column>
</el-table>
<pagination
v-show="productionplan.count > 0"
:total="productionplan.count"
:page.sync="listQuery.page"
:limit.sync="listQuery.page_size"
@pagination="getList"
/>
</el-tab-pane>
<el-tab-pane label="不合格玻璃" name="2">
<el-table
:data="wproductticket.results"
border
fit
stripe
highlight-current-row
height="620"
v-el-height-adaptive-table="{ bottomOffset: 40 }"
>
<el-table-column type="index" width="50" />
<el-table-column label="玻璃编号">
<template slot-scope="scope">{{ scope.row.number }}</template>
</el-table-column>
<el-table-column label="订单编号">
<template slot-scope="scope" v-if="scope.row.order_">{{
scope.row.order_.number
}}</template>
</el-table-column>
<el-table-column label="产品名称">
<template slot-scope="scope" v-if="scope.row.product_">{{
scope.row.product_.name
}}</template>
</el-table-column>
<el-table-column label="规格型号">
<template slot-scope="scope" v-if="scope.row.product_">{{
scope.row.product_.specification
}}</template>
</el-table-column>
<el-table-column label="责任工序">
<template slot-scope="scope" v-if="scope.row.resp_process_">{{
scope.row.resp_process_.name
}}</template>
</el-table-column>
<el-table-column label="处理结果">
<template slot-scope="scope">{{
decision_[scope.row.decision]
}}</template>
</el-table-column>
<el-table-column label="创建时间">
<template slot-scope="scope">{{
scope.row.create_time
}}</template>
</el-table-column>
<el-table-column label="操作">
<template slot-scope="scope">
<el-link
v-if="checkPermission(['material_update'])"
type="primary"
@click="handledetailbhg(scope)"
>查看</el-link
>
</template>
</el-table-column>
</el-table>
<pagination
v-show="wproductticket.count > 0"
:total="wproductticket.count"
:page.sync="listQuery2.page"
:limit.sync="listQuery2.page_size"
@pagination="getList2"
/>
<!--不合格半成品重审-->
<el-dialog title="不合格半成品重审" :close-on-click-modal="false" :visible.sync="limitedRetrial">
<el-form label-width="130px" label-position="right">
<el-form-item :label="item.field_name" v-for="item in customfieldList.ticket_data_" :key="item.id" v-show="!item.is_hidden">
<template v-if="item.field_type=='string'">
<el-input v-model="item.default_value" :placeholder="item.description" />
</template> </template>
</el-table-column> <template v-if="item.field_type==='int'">
</el-table> <el-input v-model="item.default_value" type="number" :placeholder="item.description" oninput="value=value.replace(/[^\d]/g,'')" />
<pagination </template>
v-show="productionplan.count > 0" <template v-if="item.field_type==='float'">
:total="productionplan.count" <el-input v-model="item.default_value" type="number" :placeholder="item.description" />
:page.sync="listQuery.page" </template>
:limit.sync="listQuery.page_size" <template v-if="item.field_type==='date'">
@pagination="getList" <el-date-picker
/> v-model="item.default_value"
</el-tab-pane> type="date"
<el-tab-pane label="不合格物料" name="2"> placeholder="选择日期"
value-format="yyyy-MM-dd"
</el-tab-pane> style="width: 100%"
</el-tabs> >
</el-date-picker>
</template>
<template v-if="item.field_type==='datetime'">
<el-date-picker
v-model="item.default_value"
type="datetime"
placeholder="选择日期"
value-format="yyyy-MM-dd HH:mm:ss"
style="width: 100%"
>
</el-date-picker>
</template>
<template v-if="item.field_type==='select'">
<el-select style="width: 100%" v-model="item.default_value" placeholder="请选择">
<el-option
v-for="item1 in item.field_choice"
:key="item1.id"
:label="item1.name"
:value="item1.id"
>
</el-option>
</el-select>
</template>
<template v-if="item.field_type==='selects'">
<el-select style="width: 100%" multiple v-model="item.default_value" placeholder="请选择">
<el-option
v-for="item1 in item.field_choice"
:key="item1.id"
:label="item1.name"
:value="item1.id"
>
</el-option>
</el-select>
</template>
<template v-if="item.field_type==='textarea'">
<el-input type="textarea" :rows="3" v-model="item.default_value" placeholder="内容" />
</template>
<template v-if="item.field_type==='file'">
<el-upload
ref="upload"
:action="upUrl"
:on-preview="handlePreview"
:on-success="handleUpSuccess"
:on-remove="handleRemove"
:headers="upHeaders"
:file-list="fileList"
:limit="1"
accept=".doc,.docx,.xls,.xlsx,.ppt,.pptx"
>
<el-button size="small" type="primary">上传文件</el-button>
</el-upload>
</template>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="limitedRetrial = false"> </el-button>
</div>
</el-dialog>
</el-tab-pane>
</el-tabs>
</el-card> </el-card>
</div> </div>
</template> </template>
<script> <script>
import { getProductionplanList } from "@/api/pm"; import { getProductionplanList } from "@/api/pm";
import { getwproductticketList } from "@/api/wpm";
import { ticketread } from "@/api/workflow";
import checkPermission from "@/utils/permission"; import checkPermission from "@/utils/permission";
import { createTestrecord } from "@/api/inm"; import { createTestrecord } from "@/api/inm";
import Pagination from "@/components/Pagination"; // secondary package based on el-pagination import Pagination from "@/components/Pagination"; // secondary package based on el-pagination
@ -94,49 +247,82 @@ export default {
components: { Pagination }, components: { Pagination },
data() { data() {
return { return {
process_json_: {
process_json_:{ "01": "冷加工",
"02": "热弯",
"01":'冷加工', "03": "化学钢化",
"02":'热弯', "04": "镀膜",
"03":'化学钢化', "05": "夹层",
"04":'镀膜', "06": "包边",
"05":'夹层', "07": "装框",
"06":'包边',
"07":'装框',
}, },
productionplan:{ decision_: {
10: "返工",
20: "返修",
30: "报废",
40: "让步接受",
50: "偏离许可",
60: "降级使用",
70: "退回供方",
80: "召回",
},
productionplan: {
count: 0, count: 0,
}, },
activeName:"1", wproductticket: {
listQuery: { count: 0,
},
activeName: "1",
listQuery: {
page: 1, page: 1,
page_size: 20, page_size: 20,
}, },
listQuery2: {
page: 1,
page_size: 20,
},
limitedRetrial:false,
customfieldList: [],
}; };
}, },
computed: {}, computed: {},
watch: {}, watch: {},
created() { created() {
this.getList(); this.getList(); //总览列表
this.getList2(); //不合格玻璃审批工单列表
}, },
methods: { methods: {
checkPermission, checkPermission,
//总览列表
getList() { getList() {
getProductionplanList(this.listQuery).then((response) => { getProductionplanList(this.listQuery).then((response) => {
if (response.data) { if (response.data) {
this.productionplan = response.data; this.productionplan = response.data;
} }
}); });
}, },
handledetail(scope) handledetail(scope) {
{ this.$router.push({ name: "taskdetails", params: { id: scope.row.id } });
this.$router.push({name: "taskdetails", params: { id: scope.row.id }, }) },
}
//不合格玻璃审批工单列表
getList2() {
getwproductticketList(this.listQuery2).then((response) => {
if (response.data) {
this.wproductticket = response.data;
}
});
},
//不合格玻璃审理单查看
handledetailbhg(scope)
{
this.limitedRetrial=true;
ticketread(scope.row.ticket).then((response) => {
if (response.data) {
this.customfieldList = response.data;
}
});
}
}, },
}; };

View File

@ -1,11 +1,11 @@
<template> <template>
<div class="app-container"> <div class="app-container">
<el-card style="margin-top: 2px"> <el-card style="margin-top: 2px">
<el-descriptions title="任务详情" :column="5" border> <el-descriptions title="任务详情" :column="5" border style="margin-bottom: 20px">
<el-descriptions-item label="任务编号">{{productionplan.number}}</el-descriptions-item> <el-descriptions-item label="任务编号">{{productionplan.number}}</el-descriptions-item>
<el-descriptions-item label="产品名称">{{productionplan.product_.name}}</el-descriptions-item> <el-descriptions-item label="产品名称" v-if="productionplan.product_">{{productionplan.product_.name}}</el-descriptions-item>
<el-descriptions-item label="规格型号">{{productionplan.product_.specification}}</el-descriptions-item> <el-descriptions-item label="规格型号" v-if="productionplan.product_">{{productionplan.product_.specification}}</el-descriptions-item>
<el-descriptions-item label="生产状态">生产状态没有</el-descriptions-item> <el-descriptions-item label="生产状态">{{state_[productionplan.state]}}</el-descriptions-item>
<el-descriptions-item label="不合格品数量">不合格数没有</el-descriptions-item> <el-descriptions-item label="不合格品数量">不合格数没有</el-descriptions-item>
</el-descriptions> </el-descriptions>
@ -17,7 +17,7 @@
fit fit
stripe stripe
style="width: 100%" style="width: 100%"
height="300" height="500"
> >
<el-table-column type="index" width="50" /> <el-table-column type="index" width="50" />
@ -58,6 +58,52 @@
</el-tab-pane> </el-tab-pane>
<el-tab-pane label="工序" name="2" > <el-tab-pane label="工序" name="2" >
<el-table
:data="process_json"
border
fit
stripe
style="width: 100%"
height="500"
>
<el-table-column type="index" width="50" />
<el-table-column label="工序名称" >
<template slot-scope="scope" >{{ scope.row.process_name }}</template>
</el-table-column>
<el-table-column label="玻璃数量" >
<template slot-scope="scope" >{{ scope.row.count_real }}</template>
</el-table-column>
<el-table-column label="合格数量" >
<template slot-scope="scope" >{{ scope.row.count_ok }}</template>
</el-table-column>
<el-table-column label="不合格数量" >
<template slot-scope="scope" >{{ scope.row.count_notok }}</template>
</el-table-column>
<el-table-column
align="center"
label="过程记录"
width="220px"
>
<template slot-scope="scope">
<el-link
v-if="checkPermission(['material_delete'])"
type="primary"
@click="handleprocess(scope)"
>查看</el-link
>
</template>
</el-table-column>
</el-table>
</el-tab-pane> </el-tab-pane>
</el-tabs> </el-tabs>
</el-card> </el-card>
@ -69,7 +115,7 @@
</template> </template>
<script> <script>
import { getProductionplan } from "@/api/pm"; import { getProductionplan,getsubproductionplanList } from "@/api/pm";
import { getwproductList} from "@/api/wpm"; import { getwproductList} from "@/api/wpm";
import checkPermission from "@/utils/permission"; import checkPermission from "@/utils/permission";
@ -80,9 +126,23 @@ export default {
components: { Pagination }, components: { Pagination },
data() { data() {
return { return {
productionplan:"", productionplan:{
number:""
},
activeName:"1", activeName:"1",
wproduct:"", wproduct:[],
subproductionplanList: "",
listQuery: {
page: 1,
page_size: 20,
},
state_:{
10:'制定中',
20:'已下达',
30:'已接受',
40:'生产中',
50:'已完成',
60:'军检完成'},
actstate_: { actstate_: {
6: "待复检", 6: "待复检",
10: "操作进行中", 10: "操作进行中",
@ -95,6 +155,8 @@ export default {
26: "待夹层检验", 26: "待夹层检验",
70: "报废", 70: "报废",
}, },
process_json:null,
productionplanID:null,
}; };
}, },
computed: {}, computed: {},
@ -102,7 +164,9 @@ export default {
created() { created() {
this.id = this.$route.params.id; this.id = this.$route.params.id;
this.getList(); this.getList();
this.getspList();
this.getwproductList(); this.getwproductList();
}, },
methods: { methods: {
checkPermission, checkPermission,
@ -111,9 +175,30 @@ export default {
getProductionplan(this.id).then((response) => { getProductionplan(this.id).then((response) => {
if (response.data) { if (response.data) {
this.productionplan = response.data; this.productionplan = response.data;
this.productionplanID=response.data.id;
let process_json = [];
for(let item in response.data.process_json){
let obj = new Object();
obj = response.data.process_json[item];
process_json.push(obj)
}
this.process_json= process_json;
} }
}); });
},
getspList() {
getsubproductionplanList({page:0,production_plan:this.id}).then((response) => {
if (response.data) {
this.subproductionplanList = response.data;
}
});
}, },
getwproductList() getwproductList()
{ {
@ -127,7 +212,13 @@ export default {
//查看该玻璃检验记录表 //查看该玻璃检验记录表
handleoption(scope){ handleoption(scope){
this.$router.push({name: "taskrecordfrom", params: { id: scope.row.id }, }) this.$router.push({name: "taskrecordfrom", params: { id: scope.row.id ,productionplanid:this.id ,number:scope.row.number,process:scope.row.step_.name}, })
},
//查看工序对应的玻璃
handleprocess (scope){
this.$router.push({name: "wproduct", params: { id: scope.row.process,productionplanid:this.id} })
} }
}, },

View File

@ -1,24 +1,34 @@
<template> <template>
<div class="app-container"> <div class="app-container">
<el-card style="margin-top: 2px"> <el-card style="margin-top: 2px">
<el-descriptions title="任务详情" :column="5" border style="margin-bottom: 20px">
<el-descriptions-item label="任务编号">{{productionplan.number}}</el-descriptions-item>
<el-descriptions-item label="产品名称" v-if="productionplan.product_">{{productionplan.product_.name}}</el-descriptions-item>
<el-descriptions-item label="规格型号" v-if="productionplan.product_">{{productionplan.product_.specification}}</el-descriptions-item>
<el-descriptions-item label="生产状态">{{state_[productionplan.state]}}</el-descriptions-item>
<el-descriptions-item label="不合格品数量">不合格数没有</el-descriptions-item>
<el-descriptions-item label="玻璃编号">{{wproductnumber}}</el-descriptions-item>
<el-descriptions-item label="玻璃所在子工序">{{process}}</el-descriptions-item>
</el-descriptions>
<el-table <el-table
:data="recordList.results" :data="recordList.results"
border border
fit fit
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="表单名称"> <el-table-column label="表单名称">
<template slot-scope="scope">{{ scope.row.form_.name }}</template> <template slot-scope="scope">{{ scope.row.form_.name }}</template>
</el-table-column> </el-table-column>
<el-table-column label="检查类型"> <el-table-column label="检查类型">
<template slot-scope="scope">{{ checkTypes[scope.row.type] }}</template> <template slot-scope="scope">{{
checkTypes[scope.row.type]
}}</template>
</el-table-column> </el-table-column>
<el-table-column label="是否提交"> <el-table-column label="是否提交">
<template slot-scope="scope"> <template slot-scope="scope">
@ -26,69 +36,155 @@
<span v-else>未提交</span> <span v-else>未提交</span>
</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 @click="handleRecordDetail(scope)">查看 </el-link>
<el-link
@click="handleRecordDetail(scope)"
>查看
</el-link>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<!--非检查表显示-->
<el-dialog
width="60%"
:title="formName"
:visible.sync="recordVisible"
:close-on-click-modal="false"
@close="recordCancel"
>
<customForm
v-if="recordVisible"
:results="fieldList"
:hasPicture="hasPicture"
:formID="recordform"
:wproduct="wproduct"
:recordId="recordId"
:isDisabled="isDisabled"
@recordSubmit="recordSubmit"
@recordSave="recordSave"
@recordCancel="recordCancel"
/>
</el-dialog>
</el-card> </el-card>
</div> </div>
</template> </template>
<script> <script>
import checkPermission from "@/utils/permission"; import checkPermission from "@/utils/permission";
import { getProductionplan,getsubproductionplanList } from "@/api/pm";
import {getTestRecord} from "@/api/qm"; import { getMaterialList, getrecordformList, getrffieldList } from "@/api/mtm";
import customForm from "@/components/customForm/index";
import { getTestRecord ,getTestRecordItem} from "@/api/qm";
import Pagination from "@/components/Pagination"; // secondary package based on el-pagination import Pagination from "@/components/Pagination"; // secondary package based on el-pagination
export default { export default {
components: { Pagination }, components: { Pagination, customForm },
data() { data() {
return { return {
recordList:"", recordList: "",
checkTypes:{ checkTypes: {
10:"子工序检验", 10: "子工序检验",
20:"工序检验", 20: "工序检验",
30:"工序复检", 30: "工序复检",
36:"夹层检验", 36: "夹层检验",
40:"成品检验", 40: "成品检验",
}, },
state_:{
10:'制定中',
20:'已下达',
30:'已接受',
40:'生产中',
50:'已完成',
60:'军检完成'},
recordVisible: false,
customfieldList: [],
recordform: null,
recordId: null,
fifo_detail: "",
formName: "项目检查表",
hasPicture: false,
fieldList: [],
isDisabled: false,
productionplan:{
number:""
},
wproductnumber:null,
process:null,
}; };
}, },
computed: {}, computed: {},
watch: {}, watch: {},
created() { created() {
this.id = this.$route.params.id; this.id = this.$route.params.id;
this.getList(); this.productionplanid = this.$route.params.productionplanid;
this.wproductnumber=this.$route.params.number;
this.process=this.$route.params.process;
this.getListp();
this.getList();
}, },
methods: { methods: {
checkPermission, checkPermission,
getListp() {
getList() { getProductionplan(this.productionplanid).then((response) => {
getTestRecord({wproduct: this.id}).then(res=>{ if (response.data) {
if(res.code==200){ this.productionplan = response.data;
}
this.recordList = res.data; });
}else{ },
this.$message.error(res.msg); getList() {
} getTestRecord({ wproduct: this.id }).then((res) => {
}) if (res.code == 200) {
this.recordList = res.data;
} else {
this.$message.error(res.msg);
}
});
},
//点击记录里的查看
handleRecordDetail(scope) {
let that = this;
that.recordVisible = false;
that.recordId = scope.row.id;
that.recordform = scope.row.form;
that.formName = scope.row.form_.name;
getrffieldList({ form: this.recordform, page: 1, page_size: 100 }).then(
(response) => {
if (response.data) {
that.hasPicture = false;
let fieldList = response.data.results;
that.fieldList = [...fieldList];
let arr = fieldList.filter((item) => {
return item.field_type === "draw";
});
if (arr.length > 0) {
that.hasPicture = true;
}
getTestRecordItem(scope.row.id).then((res) => {
let arr = [];
let fieldList = res.data.record_data;
for (let i = 0; i < that.fieldList.length; i++) {
let obj = that.fieldList[i];
obj.is_testok = null;
for (let j = 0; j < fieldList.length; j++) {
if (that.fieldList[i].field_key === fieldList[j].field_key) {
obj.id = fieldList[j].id;
obj.is_testok = fieldList[j].is_testok;
obj.field_value = fieldList[j].field_value;
}
}
arr.push(obj);
}
that.fieldList = arr;
that.$nextTick(() => {
that.isDisabled = true;
that.recordVisible = true;
});
});
}
}
);
}, },
}, },
}; };
</script> </script>

View File

@ -0,0 +1,139 @@
<template>
<div class="app-container">
<el-card>
<el-descriptions title="任务详情" :column="5" border style="margin-bottom: 20px">
<el-descriptions-item label="任务编号">{{productionplans.number}}</el-descriptions-item>
<el-descriptions-item label="产品名称" v-if="productionplans.product_">{{productionplans.product_.name}}</el-descriptions-item>
<el-descriptions-item label="规格型号" v-if="productionplans.product_">{{productionplans.product_.specification}}</el-descriptions-item>
<el-descriptions-item label="生产状态">{{state_[productionplans.state]}}</el-descriptions-item>
<el-descriptions-item label="不合格品数量">不合格数没有</el-descriptions-item>
</el-descriptions>
<el-table
:data="wproduct"
border
fit
stripe
style="width: 100%"
height="500"
>
<el-table-column type="index" width="50" />
<el-table-column label="玻璃编号" >
<template slot-scope="scope" >{{ scope.row.number }}</template>
</el-table-column>
<el-table-column label="所在子工序">
<template slot-scope="scope" >{{
scope.row.step_.name
}}</template>
</el-table-column>
<el-table-column label="状态" >
<template slot-scope="scope">{{
actstate_[scope.row.act_state]
}}</template>
</el-table-column>
<el-table-column
align="center"
label="过程记录"
width="220px"
>
<template slot-scope="scope">
<el-link
v-if="checkPermission(['material_delete'])"
type="primary"
@click="handleoption(scope)"
>查看</el-link
>
</template>
</el-table-column>
</el-table>
</el-card>
</div>
</template>
<script>
import { getwproductList} from "@/api/wpm";
import checkPermission from "@/utils/permission";
import { getProductionplan,getsubproductionplanList } from "@/api/pm";
import { genTree } from "@/utils";
import Pagination from "@/components/Pagination"; // secondary package based on el-pagination
export default {
components: { Pagination },
data() {
return {
productionplans:{
number:""
},
wproduct: "",
state_:{
10:'制定中',
20:'已下达',
30:'已接受',
40:'生产中',
50:'已完成',
60:'军检完成'},
actstate_: {
6: "待复检",
10: "操作进行中",
20: "待检验",
30: "已合格",
40: "库存中",
50: "不合格",
60: "待成品检验",
8: "操作准备中",
26: "待夹层检验",
70: "报废",
},
};
},
computed: {},
watch: {},
created() {
this.id = this.$route.params.id;
this.productionplan = this.$route.params.productionplanid;
this.getList();
this.getpList();
console.log(this.productionplan);
},
methods: {
checkPermission,
getpList() {
getProductionplan(this.productionplan).then((response) => {
if (response.data) {
this.productionplans = response.data;
}
});
},
//半成品列表
getList() {
getwproductList({production_plan:this.productionplan,step__process:this.id,page:0}).then((response) => {
if (response.data) {
this.wproduct= response.data;
}
});
},
//查看该玻璃检验记录表
handleoption(scope){
console.log(this.productionplan);
this.$router.push({name: "taskrecordfrom", params: { id:scope.row.id,productionplanid:this.productionplan,number:scope.row.number,process:scope.row.step_.name} })
},
},
};
</script>

View File

@ -27,6 +27,7 @@
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="所在子工序"> <el-table-column label="所在子工序">
<template slot-scope="scope">{{ scope.row.step_.name }}</template> <template slot-scope="scope">{{ scope.row.step_.name }}</template>
</el-table-column> </el-table-column>
@ -237,15 +238,19 @@
<el-table-column label="所在子工序"> <el-table-column label="所在子工序">
<template slot-scope="scope">{{ scope.row.step_.name }}</template> <template slot-scope="scope">{{ scope.row.step_.name }}</template>
</el-table-column> </el-table-column>
<el-table-column label="不合格标记">
<template slot-scope="scope">
{{ ng_sign_[scope.row.ng_sign] }}
</template>
</el-table-column>
<el-table-column align="center" label="操作" width="220px"> <el-table-column align="center" label="操作" width="220px">
<template slot-scope="scope"> <template slot-scope="scope">
<!-- <el-link <el-link
type="danger" type="danger"
v-if="checkPermission(['warehouse_update'])" v-if="checkPermission(['warehouse_update'])"
@click="handleScrap(scope)" @click="handleScrap(scope)"
>报废 >报废
</el-link>!--> </el-link>
<el-link type="primary" <el-link type="primary"
v-if="!scope.row.ticket" v-if="!scope.row.ticket"
@click="handleRetrial(scope)" @click="handleRetrial(scope)"
@ -653,13 +658,15 @@
formLabelWidthL:'', formLabelWidthL:'',
actstate_: { actstate_: {
6: "待复检", 6: "待复检",
10: "生产中", 10: "操作进行中",
20: "待检验", 20: "待检验",
30: "已合格", 30: "已合格",
40: "库存中", 40: "库存中",
50: "不合格", 50: "不合格",
60: "待成品检验", 60: "待成品检验",
26:"待夹层检验", 8: "操作准备中",
26: "待夹层检验",
70: "报废",
}, },
checkTypes:{ checkTypes:{
10:"子工序检验", 10:"子工序检验",
@ -668,6 +675,17 @@
36:"夹层检验", 36:"夹层检验",
40:"成品检验", 40:"成品检验",
}, },
ng_sign_: {
10: "返工",
20: "返修",
30: "报废",
40: "让步接受",
50: "偏离许可",
60: "降级使用",
70: "退回供方",
80: "召回",
},
choice: [ choice: [
{ {
value: true, value: true,

View File

@ -180,7 +180,11 @@
actstate_[scope.row.act_state] actstate_[scope.row.act_state]
}}</template> }}</template>
</el-table-column> </el-table-column>
<el-table-column label="不合格标记">
<template slot-scope="scope">
{{ ng_sign_[scope.row.ng_sign] }}
</template>
</el-table-column>
<el-table-column label="更新时间"> <el-table-column label="更新时间">
<template slot-scope="scope">{{ <template slot-scope="scope">{{
scope.row.update_time scope.row.update_time
@ -765,6 +769,17 @@ export default {
26: "待夹层检验", 26: "待夹层检验",
70: "报废", 70: "报废",
}, },
ng_sign_: {
10: "返工",
20: "返修",
30: "报废",
40: "让步接受",
50: "偏离许可",
60: "降级使用",
70: "退回供方",
80: "召回",
},
state_: { state_: {
0: "制定中", 0: "制定中",
1: "已下达", 1: "已下达",

View File

@ -0,0 +1,57 @@
# Generated by Django 3.2.9 on 2021-12-31 03:30
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('mtm', '0042_alter_recordformfield_field_type'),
('wpm', '0042_wprouctticket_resp_process'),
]
operations = [
migrations.AddField(
model_name='operationmaterial',
name='count_cut',
field=models.PositiveIntegerField(default=0, verbose_name='切裁片数'),
),
migrations.AddField(
model_name='operationmaterial',
name='count_hua',
field=models.PositiveIntegerField(default=0, verbose_name='划伤甩片'),
),
migrations.AddField(
model_name='operationmaterial',
name='count_ok',
field=models.PositiveIntegerField(default=0, verbose_name='成品数量'),
),
migrations.AddField(
model_name='operationmaterial',
name='count_other',
field=models.PositiveIntegerField(default=0, verbose_name='其他甩片'),
),
migrations.AddField(
model_name='operationmaterial',
name='count_podian',
field=models.PositiveIntegerField(default=0, verbose_name='破点甩片'),
),
migrations.AddField(
model_name='operationmaterial',
name='count_qipao',
field=models.PositiveIntegerField(default=0, verbose_name='气泡甩片'),
),
migrations.AddField(
model_name='operationmaterial',
name='count_real',
field=models.PositiveIntegerField(default=0, verbose_name='生产片数'),
),
migrations.AlterUniqueTogether(
name='operationmaterial',
unique_together={('operation', 'material', 'batch')},
),
migrations.AlterUniqueTogether(
name='operationwproduct',
unique_together={('operation', 'wproduct')},
),
]

View File

@ -197,6 +197,10 @@ class OperationWproduct(BaseModel):
material = models.ForeignKey(Material, verbose_name='操作时的物料状态', on_delete=models.CASCADE) material = models.ForeignKey(Material, verbose_name='操作时的物料状态', on_delete=models.CASCADE)
subproduction_plan = models.ForeignKey(SubProductionPlan, verbose_name='当前子生产计划', on_delete=models.CASCADE, related_name='ow_subplan') subproduction_plan = models.ForeignKey(SubProductionPlan, verbose_name='当前子生产计划', on_delete=models.CASCADE, related_name='ow_subplan')
class Meta:
unique_together = (
('operation','wproduct')
)
class OperationMaterial(BaseModel): class OperationMaterial(BaseModel):
""" """
@ -214,6 +218,19 @@ class OperationMaterial(BaseModel):
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)
#以下为冷加工下料清单所用字段
count_cut = models.PositiveIntegerField('切裁片数', default=0)
count_real = models.PositiveIntegerField('生产片数', default=0)
count_ok = models.PositiveIntegerField('成品数量', default=0)
count_qipao = models.PositiveIntegerField('气泡甩片', default=0)
count_podian = models.PositiveIntegerField('破点甩片', default=0)
count_hua = models.PositiveIntegerField('划伤甩片', default=0)
count_other = models.PositiveIntegerField('其他甩片', default=0)
class Meta:
unique_together = (
('operation','material', 'batch')
)
class OperationRecord(BaseModel): class OperationRecord(BaseModel):
""" """
记录表格 记录表格

View File

@ -12,6 +12,8 @@ from django.utils import timezone
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from apps.pm.serializers import SubproductionPlanSimpleSerializer from apps.pm.serializers import SubproductionPlanSimpleSerializer
from apps.qm.models import TestRecord, TestRecordItem from apps.qm.models import TestRecord, TestRecordItem
from apps.sam.serializers import OrderSimpleSerializer
from apps.system.models import User
from apps.system.serializers import UserSimpleSerializer from apps.system.serializers import UserSimpleSerializer
from apps.wpm.models import Operation, OperationEquip, OperationMaterial, OperationWproduct, Pick, WMaterial, WProduct, OperationRecord, OperationRecordItem, WprouctTicket from apps.wpm.models import Operation, OperationEquip, OperationMaterial, OperationWproduct, Pick, WMaterial, WProduct, OperationRecord, OperationRecordItem, WprouctTicket
from django.db import transaction from django.db import transaction
@ -437,7 +439,17 @@ class WproductTicketListSerializer(serializers.ModelSerializer):
step_ = StepSimpleSerializer(source='step', read_only=True) step_ = StepSimpleSerializer(source='step', read_only=True)
subproduction_plan_ = SubproductionPlanSimpleSerializer(source='subproduction_plan', read_only=True) subproduction_plan_ = SubproductionPlanSimpleSerializer(source='subproduction_plan', read_only=True)
resp_process_ = ProcessSimpleSerializer(source='resp_process', read_only=True) resp_process_ = ProcessSimpleSerializer(source='resp_process', read_only=True)
order_ = OrderSimpleSerializer(source='subproduction_plan.production_plan.order', read_only=True)
product_ = MaterialSimpleSerializer(source='subproduction_plan.production_plan.product', read_only=True)
class Meta: class Meta:
model = WprouctTicket model = WprouctTicket
fields = '__all__' fields = '__all__'
class CuttingListSerializer(serializers.ModelSerializer):
subproduction_plan_ = SubproductionPlanSimpleSerializer(source='subproduction_plan', read_only=True)
material_ = MaterialSimpleSerializer(source='material', read_only=True)
create_by_ = UserSimpleSerializer(source='create_by', read_only=True)
class Meta:
model = OperationMaterial
fields = '__all__'

View File

@ -7,7 +7,7 @@ from apps.mtm.models import Material, Step, SubprodctionMaterial
from apps.qm.models import TestRecord from apps.qm.models import TestRecord
from apps.system.models import User from apps.system.models import User
from apps.wf.models import State, TicketFlow, Transition from apps.wf.models import State, TicketFlow, Transition
from apps.wpm.models import WProduct, WproductFlow, WprouctTicket from apps.wpm.models import Operation, OperationMaterial, WProduct, WproductFlow, WprouctTicket
from utils.tools import ranstr from utils.tools import ranstr
class WpmServies(object): class WpmServies(object):
@ -146,3 +146,38 @@ class WpmServies(object):
setattr(ins, f.name, getattr(instance, f.name, None)) setattr(ins, f.name, getattr(instance, f.name, None))
ins.change_str = change_str ins.change_str = change_str
ins.save() ins.save()
@classmethod
def update_cutting_list_with_operation(cls, op:Operation):
"""
根据车间操作更新下料清单
"""
inputs = OperationMaterial.objects.filter(operation=op, type=SubprodctionMaterial.SUB_MA_TYPE_IN)
outputs = OperationMaterial.objects.filter(operation=op, type=SubprodctionMaterial.SUB_MA_TYPE_OUT)
for i in inputs:
sp = i.subproduction_plan
i.count_cut = outputs.filter(subproduction_plan=sp).first().count
i.count_real = sp.count_real
i.count_ok = sp.count_ok
wpfs = WproductFlow.objects.filter(subproduction_plan=sp, is_lastlog=True)
i.count_qipao = wpfs.filter(scrap_reason=WProduct.SCRAP_REASON_QIPAO).count()
i.count_podian = wpfs.filter(scrap_reason=WProduct.SCRAP_REASON_PODIAN).count()
i.count_hua = wpfs.filter(scrap_reason=WProduct.SCRAP_REASON_HUA).count()
i.count_other = wpfs.filter(scrap_reason=WProduct.SCRAP_REASON_OTHER).count()
i.is_cutting = True
i.save()
@classmethod
def update_cutting_list_with_sp(cls, sp:SubProductionPlan):
"""
根据子计划更新下料清单
"""
wpfs = WproductFlow.objects.filter(subproduction_plan=sp, is_lastlog=True)
for i in OperationMaterial.objects.filter(subproduction_plan=sp, is_cutting=True):
i.count_real = sp.count_real
i.count_ok = sp.count_ok
i.count_qipao = wpfs.filter(scrap_reason=WProduct.SCRAP_REASON_QIPAO).count()
i.count_podian = wpfs.filter(scrap_reason=WProduct.SCRAP_REASON_PODIAN).count()
i.count_hua = wpfs.filter(scrap_reason=WProduct.SCRAP_REASON_HUA).count()
i.count_other = wpfs.filter(scrap_reason=WProduct.SCRAP_REASON_OTHER).count()
i.save()

View File

@ -3,7 +3,7 @@ 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.wpm.views import DoFormInit, DoFormSubmit, OperationEquipViewSet, OperationMaterialInputViewSet, OperationMaterialOutputViewSet, OperationMaterialToolViewSet, OperationRecordViewSet, OperationViewSet, OperationWproductViewSet, WMaterialViewSet, WPlanViewSet, WProductViewSet, WproductTicketViewSet from apps.wpm.views import CuttingListViewSet, DoFormInit, DoFormSubmit, OperationEquipViewSet, OperationMaterialInputViewSet, OperationMaterialOutputViewSet, OperationMaterialToolViewSet, OperationRecordViewSet, OperationViewSet, OperationWproductViewSet, WMaterialViewSet, WPlanViewSet, WProductViewSet, WproductTicketViewSet
router = DefaultRouter() router = DefaultRouter()
router.register('wmaterial', WMaterialViewSet, basename='wmaterial') router.register('wmaterial', WMaterialViewSet, basename='wmaterial')
@ -17,6 +17,7 @@ router.register('operation_input', OperationMaterialInputViewSet, basename='oper
router.register('operation_output', OperationMaterialOutputViewSet, basename='operation_output') router.register('operation_output', OperationMaterialOutputViewSet, basename='operation_output')
router.register('operation_tool', OperationMaterialToolViewSet, basename='operation_tool') router.register('operation_tool', OperationMaterialToolViewSet, basename='operation_tool')
router.register('subplan', WPlanViewSet, basename='wplan') router.register('subplan', WPlanViewSet, basename='wplan')
router.register('cutting_list', CuttingListViewSet, basename='cutting_list')
urlpatterns = [ urlpatterns = [
path('do/init/', DoFormInit.as_view()), path('do/init/', DoFormInit.as_view()),
path('do/submit/', DoFormSubmit.as_view()), path('do/submit/', DoFormSubmit.as_view()),

View File

@ -22,7 +22,7 @@ from apps.wf.serializers import WorkflowSimpleSerializer
from apps.wpm.filters import WMaterialFilterSet, WProductFilterSet from apps.wpm.filters import 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 OperationEquipListSerializer, OperationEquipUpdateSerializer, OperationMaterialCreate1ListSerailizer, OperationMaterialCreate1Serailizer, OperationMaterialCreate2ListSerailizer, OperationMaterialCreate2Serailizer, OperationMaterialCreate3Serializer, OperationMaterialListSerializer, OperationRecordDetailSerializer, OperationRecordListSerializer, OperationRecordSubmitSerializer, OperationUpdateSerializer, OperationWproductListSerializer, OperationCreateSerializer, OperationDetailSerializer, OperationListSerializer, PickHalfSerializer, PickHalfsSerializer, PickSerializer, OperationInitSerializer, OperationSubmitSerializer, ScrapSerializer, WMaterialListSerializer, WProductListSerializer, WplanPutInSerializer, WpmTestFormInitSerializer, WpmTestRecordCreateSerializer, 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, PickHalfSerializer, PickHalfsSerializer, PickSerializer, OperationInitSerializer, OperationSubmitSerializer, ScrapSerializer, WMaterialListSerializer, WProductListSerializer, WplanPutInSerializer, WpmTestFormInitSerializer, WpmTestRecordCreateSerializer, 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
@ -385,6 +385,8 @@ class WProductViewSet(ListModelMixin, GenericViewSet):
obj.update_time = timezone.now() obj.update_time = timezone.now()
obj.save() obj.save()
WpmServies.add_wproduct_flow_log(obj, 'scrap') WpmServies.add_wproduct_flow_log(obj, 'scrap')
if obj.step.process.id == 1: #如果是冷加工
WpmServies.update_cutting_list_with_sp(obj.subproduction_plan)
return Response() return Response()
# @action(methods=['get'], detail=False, perms_map={'get':'*'}) # @action(methods=['get'], detail=False, perms_map={'get':'*'})
@ -429,7 +431,8 @@ class WproductTicketViewSet(ListModelMixin, GenericViewSet):
玻璃审批工单 玻璃审批工单
""" """
perms_map={'*':'*'} perms_map={'*':'*'}
queryset = WprouctTicket.objects.select_related('step', 'material', 'subproduction_plan', 'resp_process') queryset = WprouctTicket.objects.select_related('step', 'material', 'subproduction_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']
@ -579,9 +582,11 @@ class OperationViewSet(ListModelMixin, RetrieveModelMixin, CreateModelMixin, Upd
spp.save() spp.save()
# 更新动态产品表 # 更新动态产品表
if step.type == Step.STEP_TYPE_NOM: if step.type == Step.STEP_TYPE_NOM:
for i in OperationWproduct.objects.filter(operation=op): ows = OperationWproduct.objects.filter(operation=op)
for i in ows:
wp = i.wproduct wp = i.wproduct
wsp = i.subproduction_plan wsp = i.subproduction_plan
# 获取下一步子工序 # 获取下一步子工序
newstep, hasNext = WpmServies.get_next_step(wsp, step) newstep, hasNext = WpmServies.get_next_step(wsp, step)
wp.step = newstep wp.step = newstep
@ -591,17 +596,21 @@ class OperationViewSet(ListModelMixin, RetrieveModelMixin, CreateModelMixin, Upd
else: else:
wp.act_state = WProduct.WPR_ACT_STATE_TOTEST wp.act_state = WProduct.WPR_ACT_STATE_TOTEST
wp.material = wsp.product wp.material = wsp.product
# 更新子计划生产进度
# 如果产品有返工标记不做计算
if wp.ng_sign not in [WProduct.NG_BACK_FIX, WProduct.NG_BACK_WORK]:
WpmServies.update_subproduction_progress_main(sp=wsp)
wp.operation = None wp.operation = None
wp.update_by = request.user wp.update_by = request.user
wp.save() wp.save()
WpmServies.add_wproduct_flow_log(wp, 'operation_submit') WpmServies.add_wproduct_flow_log(wp, 'operation_submit')
for i in ows.values('subproduction_plan').distinct():
# 更新进度
WpmServies.update_subproduction_progress_main(sp=wsp)
elif step.type == Step.STEP_TYPE_DIV: elif step.type == Step.STEP_TYPE_DIV:
# 更新物料产出情况 # 更新物料产出情况
for i in OperationMaterial.objects.filter(operation=op, type=SubprodctionMaterial.SUB_MA_TYPE_OUT): outputs = OperationMaterial.objects.filter(operation=op, type=SubprodctionMaterial.SUB_MA_TYPE_OUT)
if not outputs.exists():
raise exceptions.APIException('请选择物料产出')
for i in outputs:
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,
@ -640,6 +649,10 @@ class OperationViewSet(ListModelMixin, RetrieveModelMixin, CreateModelMixin, Upd
raise exceptions.APIException('产出物料未填写或填写错误') raise exceptions.APIException('产出物料未填写或填写错误')
op.is_submited = True op.is_submited = True
op.save() op.save()
# 如果是冷加工
if step.process.id==1:
WpmServies.update_cutting_list_with_operation(op=op)
return Response() return Response()
@ -774,6 +787,19 @@ class OperationMaterialInputViewSet(ListModelMixin, CreateModelMixin, DestroyMod
instance.delete() instance.delete()
return Response() return Response()
class CuttingListViewSet(ListModelMixin, GenericViewSet):
"""
下料清单
"""
perms_map={'*':'*'}
queryset = OperationMaterial.objects.select_related('operation',
'subproduction_plan', 'material', 'create_by').filter(operation__step__process__id=1)
serializer_class = CuttingListSerializer
filterset_fields = ['operation', 'subproduction_plan', 'material']
ordering_fields = ['id']
ordering = ['-id']
class OperationMaterialOutputViewSet(ListModelMixin, CreateModelMixin, DestroyModelMixin, GenericViewSet): class OperationMaterialOutputViewSet(ListModelMixin, CreateModelMixin, DestroyModelMixin, GenericViewSet):
""" """
产出物料 产出物料