This commit is contained in:
shilixia 2022-02-18 15:31:10 +08:00
commit 497b47b227
35 changed files with 1793 additions and 1533 deletions

View File

@ -13,6 +13,7 @@ export function clockRecord(data) {
data data
}) })
} }
<<<<<<< HEAD
//员工离岗说明 //员工离岗说明
export function notWork(id, data) { export function notWork(id, data) {
return request({ return request({
@ -22,3 +23,12 @@ export function notWork(id, data) {
}) })
} }
=======
export function getEmployee(data) {
return request({
url: '/hrm/employee/',
method: 'get',
data
})
}
>>>>>>> 802cd214bef263b51b08f9299e5a7bd9ec93b8ef

View File

@ -98,6 +98,7 @@
import center from './center' import center from './center'
import bottomLeft from './bottomLeft' import bottomLeft from './bottomLeft'
import bottomRight from './bottomRight' import bottomRight from './bottomRight'
import { getPlanGantt } from "@/api/srm";
export default { export default {
mixins: [ drawMixin ], mixins: [ drawMixin ],
@ -108,6 +109,7 @@
dateDay: null, dateDay: null,
dateYear: null, dateYear: null,
dateWeek: null, dateWeek: null,
planGanttList:[],
weekday: ['周日', '周一', '周二', '周三', '周四', '周五', '周六'] weekday: ['周日', '周一', '周二', '周三', '周四', '周五', '周六']
} }
}, },
@ -122,6 +124,7 @@
mounted() { mounted() {
this.timeFn(); this.timeFn();
this.cancelLoading(); this.cancelLoading();
this.getPageData();
let bigHeight = document.getElementsByClassName('host-body')[0].clientHeight; let bigHeight = document.getElementsByClassName('host-body')[0].clientHeight;
let firstHeight = document.getElementById('firstLine').clientHeight; let firstHeight = document.getElementById('firstLine').clientHeight;
let secondHeight = document.getElementsByClassName('jc-between')[0].clientHeight; let secondHeight = document.getElementsByClassName('jc-between')[0].clientHeight;
@ -139,6 +142,16 @@
this.dateWeek = this.weekday[new Date().getDay()] this.dateWeek = this.weekday[new Date().getDay()]
}, 1000) }, 1000)
}, },
getPageData(){
let that = this;
getPlanGantt({Authorization:'big_screen'}).then(res => {
if (res.code === 200) {
this.planGanttList = res.data.results;
} else {
that.$message.error(res.msg);
}
})
},
cancelLoading() { cancelLoading() {
setTimeout(() => { setTimeout(() => {
this.loading = false this.loading = false

View File

@ -240,7 +240,8 @@
</el-tag> </el-tag>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="部门" prop="dept_name"> <el-table-column label="部门" prop="dept_">
<template slot-scope="scope">{{scope.row.dept_.name}}</template>
</el-table-column> </el-table-column>
</el-table> </el-table>
</div> </div>
@ -338,7 +339,8 @@
<script> <script>
import echarts from 'echarts' import echarts from 'echarts'
import {mapGetters} from 'vuex'; import {mapGetters} from 'vuex';
import {getUserList} from "@/api/user"; // import {getUserList} from "@/api/user";
import {getEmployee} from "@/api/hrm";
import {getMaterialList} from "@/api/mtm"; import {getMaterialList} from "@/api/mtm";
import {getProductionplanList} from "@/api/pm"; import {getProductionplanList} from "@/api/pm";
import {getmaterialbatchList} from "@/api/inm"; import {getmaterialbatchList} from "@/api/inm";
@ -586,7 +588,7 @@
let that = this; let that = this;
that.listLoadingUser = true; that.listLoadingUser = true;
that.userPage =1; that.userPage =1;
getUserList({page: that.userPage, page_size: that.userPageSize, fields: 'id,name,dept_name,is_atwork'}).then((response) => { getEmployee({page: that.userPage, page_size: that.userPageSize}).then((response) => {
if (response.data) { if (response.data) {
that.userList = response.data.results; that.userList = response.data.results;
that.userTotal = response.data.count; that.userTotal = response.data.count;
@ -600,7 +602,7 @@
let that = this; let that = this;
that.listLoadingUser = true; that.listLoadingUser = true;
that.userPage = val; that.userPage = val;
getUserList({page: val, page_size: that.userPageSize, fields: 'id,name,dept_name,is_atwork'}).then((response) => { getEmployee({page: val, page_size: that.userPageSize, fields: 'id,name,dept_name,is_atwork'}).then((response) => {
if (response.data) { if (response.data) {
that.userList = response.data.results; that.userList = response.data.results;
that.userTotal = response.data.count; that.userTotal = response.data.count;

View File

@ -15,8 +15,8 @@
height="100" height="100"
v-el-height-adaptive-table="{bottomOffset: 42}" v-el-height-adaptive-table="{bottomOffset: 42}"
> >
<el-table-column type="selection" width="55"> </el-table-column> <el-table-column type="selection" width="55"></el-table-column>
<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>
@ -24,25 +24,18 @@
<el-table-column label="成品批次"> <el-table-column label="成品批次">
<template slot-scope="scope">{{ scope.row.batch }}</template> <template slot-scope="scope">{{ scope.row.batch }}</template>
</el-table-column> </el-table-column>
<el-table-column label="成品名称"> <el-table-column label="成品名称" min-width="100" show-overflow-tooltip>
<template slot-scope="scope">{{ scope.row.material_.name }}</template> <template slot-scope="scope">{{ scope.row.material_.name }}</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.warehouse_.name}}</template>
scope.row.warehouse_.name
}}</template>
</el-table-column> </el-table-column>
<el-table-column label="订单"> <el-table-column label="订单">
<template slot-scope="scope"> <template slot-scope="scope">
<span v-if="scope.row.to_order_">{{ <span v-if="scope.row.to_order_">{{scope.row.to_order_.number}}</span>
scope.row.to_order_.number
}}</span>
<el-tag <el-tag
v-else-if=" v-else-if="scope.row.to_order_ == null && scope.row.need_to_order == true"
scope.row.to_order_ == null && scope.row.need_to_order == true
"
> >
需要确定订单 需要确定订单
</el-tag> </el-tag>
@ -51,13 +44,9 @@
</el-table-column> </el-table-column>
<el-table-column label="合同"> <el-table-column label="合同">
<template slot-scope="scope"> <template slot-scope="scope">
<span v-if="scope.row.to_order_">{{ <span v-if="scope.row.to_order_">{{scope.row.to_order_.contract_.name}}</span>
scope.row.to_order_.contract_.name
}}</span>
<span <span
v-else-if=" v-else-if="scope.row.to_order_ == null && scope.row.need_to_order == true"
scope.row.to_order_ == null && scope.row.need_to_order == true
"
> >
</span> </span>
<span v-else></span> <span v-else></span>
@ -65,25 +54,20 @@
</el-table-column> </el-table-column>
<el-table-column label="客户"> <el-table-column label="客户">
<template slot-scope="scope"> <template slot-scope="scope">
<span v-if="scope.row.to_order_">{{ <span v-if="scope.row.to_order_">{{scope.row.to_order_.customer_.name}}</span>
scope.row.to_order_.customer_.name
}}</span>
<span <span
v-else-if=" v-else-if="scope.row.to_order_ == null && scope.row.need_to_order == true"
scope.row.to_order_ == null && scope.row.need_to_order == true
"
> >
</span> </span>
<span v-else></span> <span v-else></span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="军检"> <el-table-column label="军检">
<template slot-scope="scope"> <template slot-scope="scope">
<el-tag v-if="scope.row.is_mtestok == false">不合格</el-tag> <el-tag v-if="scope.row.is_mtestok == false">不合格</el-tag>
<el-tag v-else-if="scope.row.is_mtestok == true">合格</el-tag> <el-tag v-else-if="scope.row.is_mtestok == true">合格</el-tag>
<span v-else></span <span v-else></span>
></template> </template>
</el-table-column> </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">
@ -112,8 +96,8 @@
</el-form-item> </el-form-item>
<el-form-item label="军检备注" prop="name"> <el-form-item label="军检备注" prop="name">
<el-input <el-input
type="textarea"
v-model="mtestform.remark_mtest" v-model="mtestform.remark_mtest"
type="textarea"
></el-input> ></el-input>
</el-form-item> </el-form-item>
</el-form> </el-form>
@ -130,9 +114,8 @@
<el-descriptions :column="5" border style="margin-bottom: 20px"> <el-descriptions :column="5" border style="margin-bottom: 20px">
<el-descriptions-item label="原订单">{{ this.ordershow }}</el-descriptions-item> <el-descriptions-item label="原订单">{{ this.ordershow }}</el-descriptions-item>
<el-descriptions-item label="原客户">{{ this.customershow }}</el-descriptions-item> <el-descriptions-item label="原客户">{{ this.customershow }}</el-descriptions-item>
<el-descriptions-item label="原合同" >{{ this.contractshow }}</el-descriptions-item> <el-descriptions-item label="原合同">{{ this.contractshow }}</el-descriptions-item>
</el-descriptions> </el-descriptions>
<el-table <el-table
v-loading="listLoading" v-loading="listLoading"
:data="orderList" :data="orderList"
@ -143,20 +126,17 @@
height="100" height="100"
v-el-height-adaptive-table="{ bottomOffset: 42 }" v-el-height-adaptive-table="{ bottomOffset: 42 }"
> >
<el-table-column type="index" width="50" /> <el-table-column type="index" width="50"/>
<el-table-column label="订单编号" width="160" show-overflow-tooltip> <el-table-column label="订单编号" width="160" show-overflow-tooltip>
<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="客户" width="200" show-overflow-tooltip> <el-table-column label="客户" width="200" show-overflow-tooltip>
<template slot-scope="scope">{{ <template slot-scope="scope">{{scope.row.customer_.name}}
scope.row.customer_.name </template>
}}</template>
</el-table-column> </el-table-column>
<el-table-column label="所属合同" width="200" show-overflow-tooltip> <el-table-column label="所属合同" width="200" show-overflow-tooltip>
<template slot-scope="scope" v-if="scope.row.contract">{{ <template slot-scope="scope" v-if="scope.row.contract">{{scope.row.contract_.name}}
scope.row.contract_.name </template>
}}</template>
</el-table-column> </el-table-column>
<el-table-column align="center" label="操作" width="120"> <el-table-column align="center" label="操作" width="120">
<template slot-scope="scope"> <template slot-scope="scope">
@ -168,7 +148,6 @@
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<div slot="footer" class="dialog-footer"> <div slot="footer" class="dialog-footer">
<el-button @click="dialogFormVisibleorder = false"> </el-button> <el-button @click="dialogFormVisibleorder = false"> </el-button>
</div> </div>
@ -177,15 +156,15 @@
</div> </div>
</template> </template>
<script> <script>
import { getiproductList } from "@/api/inm"; import {getiproductList} from "@/api/inm";
import checkPermission from "@/utils/permission"; import checkPermission from "@/utils/permission";
import { getOrderList } from "@/api/sam"; import {getOrderList} from "@/api/sam";
import { mtest, toorder } from "@/api/wpm"; import {mtest, toorder} from "@/api/wpm";
import { genTree } from "@/utils"; import {genTree} from "@/utils";
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},
data() { data() {
return { return {
iproductData: { iproductData: {
@ -209,8 +188,8 @@ export default {
mutipID: [], mutipID: [],
mtmId: [], mtmId: [],
ordershow: "", ordershow: "",
customershow:"", customershow: "",
contractshow:"", contractshow: "",
materialshow: [], materialshow: [],
}; };
}, },
@ -258,9 +237,9 @@ export default {
_this.materialshow.push(item); _this.materialshow.push(item);
}); });
this.ordershow = _this.materialshow[0].order_.number; this.ordershow = _this.materialshow[0].order_.number;
this.customershow=_this.materialshow[0].order_.customer_.name; this.customershow = _this.materialshow[0].order_.customer_.name;
this.contractshow=_this.materialshow[0].order_.contract_.name; this.contractshow = _this.materialshow[0].order_.contract_.name;
getOrderList({ page: 0, material: _this.mtmId[0], tag:'not_done' }).then( getOrderList({page: 0, material: _this.mtmId[0], tag: 'not_done'}).then(
(response) => { (response) => {
if (response.data) { if (response.data) {
this.orderList = response.data; this.orderList = response.data;
@ -283,5 +262,5 @@ export default {
}); });
}, },
}, },
}; };
</script> </script>

View File

@ -79,26 +79,13 @@
<el-form-item label="表格名称" prop="name"> <el-form-item label="表格名称" prop="name">
<el-input v-model="recordform.name" placeholder="表格名称"/> <el-input v-model="recordform.name" placeholder="表格名称"/>
</el-form-item> </el-form-item>
<!--<el-form-item label="引用表单" prop="field_type">
<el-select
style="width: 100%"
v-model="recordform.number"
placeholder="请选择"
>
<el-option
v-for="item in fieldtypeoptions"
:key="item.value"
:label="item.label"
:value="item.value"
>
</el-option>
</el-select>
</el-form-item>-->
<el-form-item label="表格类型" prop="formUsed"> <el-form-item label="表格类型" prop="formUsed">
<el-select <el-select
style="width: 100%"
v-model="recordform.type" v-model="recordform.type"
clearable
style="width: 100%"
placeholder="请选择" placeholder="请选择"
@change="formTypeChange"
> >
<el-option <el-option
v-for="item in typeOptions" v-for="item in typeOptions"
@ -109,6 +96,22 @@
</el-option> </el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="引用表单" prop="field_type">
<el-select
v-model="recordform.form"
style="width: 100%"
clearable
placeholder="请选择"
>
<el-option
v-for="item in formList"
:key="item.id"
:label="item.name"
:value="item.id"
>
</el-option>
</el-select>
</el-form-item>
<el-form-item label="是否启用" prop="name"> <el-form-item label="是否启用" prop="name">
<el-switch v-model="recordform.enabled"></el-switch> <el-switch v-model="recordform.enabled"></el-switch>
</el-form-item> </el-form-item>
@ -576,6 +579,7 @@
recordformList: { recordformList: {
count: 0, count: 0,
}, },
formList:[],
fieldList: { fieldList: {
count: 0, count: 0,
}, },
@ -696,6 +700,13 @@
this.material = this.$route.params.id; this.material = this.$route.params.id;
this.recordformLists(); this.recordformLists();
}, },
mounted(){
getrecordformList({page:0}).then((response) => {
if (response.data) {
this.formList = response.data;
}
});
},
methods: { methods: {
formFunc(value) { formFunc(value) {
this.dialogVisibleForm = value; this.dialogVisibleForm = value;
@ -882,6 +893,13 @@
// this.$refs["Forms"].resetFields(); // this.$refs["Forms"].resetFields();
// }); // });
}, },
formTypeChange(){
getrecordformList({type:this.recordform.type,page:0}).then((response) => {
if (response.data) {
this.formList = response.data;
}
});
},
//新增字段 //新增字段
handlefieldCreate() { handlefieldCreate() {
this.field_choice = [""]; this.field_choice = [""];
@ -903,6 +921,8 @@
}); });
}, },
handleEdit(scope) { handleEdit(scope) {
debugger;
console.log( scope.row);
this.recordform = Object.assign({}, scope.row); // copy obj this.recordform = Object.assign({}, scope.row); // copy obj
this.dialogType = "edit"; this.dialogType = "edit";
this.dialogVisible = true; this.dialogVisible = true;
@ -959,6 +979,7 @@
obj.type=this.recordform.type; obj.type=this.recordform.type;
obj.enabled=this.recordform.enabled; obj.enabled=this.recordform.enabled;
if (isEdit) { if (isEdit) {
obj.form=this.recordform.form?this.recordform.form:null;
updaterecordform(this.recordform.id, obj).then( updaterecordform(this.recordform.id, obj).then(
(res) => { (res) => {
if (res.code >= 200) { if (res.code >= 200) {
@ -970,6 +991,7 @@
); );
} else { } else {
obj.material=parseInt(this.material); obj.material=parseInt(this.material);
obj.form=this.recordform.form!==''?this.recordform.form:null;
createrecordform(obj).then((res) => { createrecordform(obj).then((res) => {
if (res.code >= 200) { if (res.code >= 200) {
this.recordformLists(); this.recordformLists();

View File

@ -1,11 +1,10 @@
<template> <template>
<div class="app-container"> <div class="app-container">
<el-card> <el-card>
<div style="margin-top: 2px"> <div style="margin-top: 2px">
<el-button type="primary" icon="el-icon-plus" @click="handleCreate" <el-button type="primary" icon="el-icon-plus" @click="handleCreate">
>新增工序</el-button 新增工序
> </el-button>
</div> </div>
</el-card> </el-card>
<el-card style="margin-top: 2px"> <el-card style="margin-top: 2px">
@ -19,7 +18,7 @@
height="100" height="100"
v-el-height-adaptive-table="{bottomOffset: 10}" v-el-height-adaptive-table="{bottomOffset: 10}"
> >
<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>
@ -29,12 +28,12 @@
<el-table-column label="工序类别"> <el-table-column label="工序类别">
<template slot-scope="scope">{{ type_[scope.row.type] }}</template> <template slot-scope="scope">{{ type_[scope.row.type] }}</template>
</el-table-column> </el-table-column>
<el-table-column label="生产车间" > <el-table-column label="生产车间">
<template slot-scope="scope" v-if="scope.row.workshop_">{{ scope.row.workshop_.name }}</template> <template slot-scope="scope" v-if="scope.row.workshop_">{{ scope.row.workshop_.name }}</template>
</el-table-column> </el-table-column>
<el-table-column align="center" label="指导书"> <el-table-column align="center" label="指导书" show-overflow-tooltip min-width="110">
<template slot-scope="scope" v-if="scope.row.instruction_"> <template slot-scope="scope" v-if="scope.row.instruction_">
<el-link :href="scope.row.instruction_.path" >{{scope.row.instruction_.name}}</el-link> <el-link :href="scope.row.instruction_.path">{{scope.row.instruction_.name}}</el-link>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="创建时间"> <el-table-column label="创建时间">
@ -46,25 +45,26 @@
width="220px" width="220px"
> >
<template slot-scope="scope"> <template slot-scope="scope">
<el-link <el-link
type="primary" type="primary"
@click="handleAdd(scope)" @click="handleAdd(scope)"
>添加子工序</el-link
> >
添加子工序
</el-link>
<el-link <el-link
v-if="checkPermission(['process_update'])" v-if="checkPermission(['process_update'])"
type="primary" type="primary"
@click="handleEdit(scope)" @click="handleEdit(scope)"
>编辑</el-link
> >
编辑
</el-link>
<el-link <el-link
v-if="checkPermission(['process_delete'])" v-if="checkPermission(['process_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>
@ -89,13 +89,13 @@
:rules="rule1" :rules="rule1"
> >
<el-form-item label="工序名称" prop="name"> <el-form-item label="工序名称" prop="name">
<el-input v-model="process.name" placeholder="工序名称" /> <el-input v-model="process.name" placeholder="工序名称"/>
</el-form-item> </el-form-item>
<el-form-item label="工序编号" prop="number"> <el-form-item label="工序编号" prop="number">
<el-input v-model="process.number" placeholder="工序编号" /> <el-input v-model="process.number" placeholder="工序编号"/>
</el-form-item> </el-form-item>
<el-form-item label="工序编号" prop="type"> <el-form-item label="工序编号" prop="type">
<el-select style="width: 100%" v-model="process.type" placeholder="请选择" > <el-select style="width: 100%" v-model="process.type" placeholder="请选择">
<el-option <el-option
v-for="item in option" v-for="item in option"
:key="item.value" :key="item.value"
@ -108,7 +108,7 @@
<treeselect v-model="process.workshop" :options="workoptions" placeholder="所属部门"/> <treeselect v-model="process.workshop" :options="workoptions" placeholder="所属部门"/>
</el-form-item> </el-form-item>
<el-form-item label="指导书内容" prop="instruction_content"> <el-form-item label="指导书内容" prop="instruction_content">
<el-input type="textarea" :rows="3" v-model="process.instruction_content" placeholder="指导书内容" /> <el-input type="textarea" :rows="3" v-model="process.instruction_content" placeholder="指导书内容"/>
</el-form-item> </el-form-item>
<el-form-item label="指导书" prop="template" v-if="dialogVisible"> <el-form-item label="指导书" prop="template" v-if="dialogVisible">
<el-upload <el-upload
@ -125,7 +125,6 @@
<el-button size="small" type="primary">上传文件</el-button> <el-button size="small" type="primary">上传文件</el-button>
</el-upload> </el-upload>
</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> <el-button type="danger" @click="dialogVisible = false">取消</el-button>
@ -135,21 +134,21 @@
</div> </div>
</template> </template>
<script> <script>
import { getProcessList, createProcess,updateProcess,deleteProcess } from "@/api/mtm"; import {getProcessList, createProcess, updateProcess, deleteProcess} from "@/api/mtm";
import checkPermission from "@/utils/permission"; import checkPermission from "@/utils/permission";
import { getOrgAll } from "@/api/org" import {getOrgAll} from "@/api/org"
import { upUrl, upHeaders } from "@/api/file"; import {upUrl, upHeaders} from "@/api/file";
import Treeselect from '@riophae/vue-treeselect' import Treeselect from '@riophae/vue-treeselect'
import '@riophae/vue-treeselect/dist/vue-treeselect.css' import '@riophae/vue-treeselect/dist/vue-treeselect.css'
import { genTree } from "@/utils"; import {genTree} from "@/utils";
import Pagination from "@/components/Pagination"; // secondary package based on el-pagination import Pagination from "@/components/Pagination"; // secondary package based on el-pagination
const defaultprocess = { const defaultprocess = {
name: "", name: "",
number: "", number: "",
}; };
export default { export default {
components: { Pagination,Treeselect }, components: {Pagination, Treeselect},
data() { data() {
return { return {
process: defaultprocess, process: defaultprocess,
@ -158,16 +157,16 @@ export default {
}, },
upHeaders: upHeaders(), upHeaders: upHeaders(),
upUrl: upUrl(), upUrl: upUrl(),
fileList:[], fileList: [],
workoptions:[], workoptions: [],
listQuery: { listQuery: {
page: 1, page: 1,
page_size: 20, page_size: 20,
}, },
type_:{ type_: {
10:'特殊', 10: '特殊',
20:'关键', 20: '关键',
30:'普通', 30: '普通',
}, },
option: [{ option: [{
@ -184,8 +183,8 @@ export default {
dialogVisible: false, dialogVisible: false,
dialogType: "new", dialogType: "new",
rule1: { rule1: {
name: [{ required: true, message: "请输入", trigger: "blur" }], name: [{required: true, message: "请输入", trigger: "blur"}],
number: [{ required: true, message: "请输入", trigger: "blur" }], number: [{required: true, message: "请输入", trigger: "blur"}],
}, },
}; };
@ -195,7 +194,6 @@ export default {
created() { created() {
this.getList(); this.getList();
this.getOrgAll(); this.getOrgAll();
}, },
methods: { methods: {
checkPermission, checkPermission,
@ -227,17 +225,14 @@ export default {
handleUpSuccess(res, file, filelist) { handleUpSuccess(res, file, filelist) {
this.process.instruction = res.data.id; this.process.instruction = res.data.id;
}, },
handleRemove(file, filelist){ handleRemove(file, filelist) {
this.process.instruction = null; this.process.instruction = null;
}, },
//添加子工序 //添加子工序
handleAdd(scope) handleAdd(scope) {
{ this.$router.push({name: "Step", params: {id: scope.row.id},})
this.$router.push({name: "Step", params: { id: scope.row.id }, })
}, },
handleFilter() { handleFilter() {
this.listQuery.page = 1; this.listQuery.page = 1;
this.getList(); this.getList();
@ -253,7 +248,7 @@ export default {
this.process = Object.assign({}, defaultprocess); this.process = Object.assign({}, defaultprocess);
this.dialogType = "new"; this.dialogType = "new";
this.dialogVisible = true; this.dialogVisible = true;
this.fileList=[]; this.fileList = [];
this.$nextTick(() => { this.$nextTick(() => {
this.$refs["Form"].clearValidate(); this.$refs["Form"].clearValidate();
}); });
@ -266,7 +261,7 @@ export default {
if (this.process.instruction) { if (this.process.instruction) {
this.fileList = [ this.fileList = [
{ {
name:this.process.instruction_.name, name: this.process.instruction_.name,
url: this.process.instruction_.path, url: this.process.instruction_.path,
}, },
]; ];
@ -319,5 +314,5 @@ export default {
}); });
}, },
}, },
}; };
</script> </script>

View File

@ -142,62 +142,47 @@
style="width: 100%" style="width: 100%"
height="250" height="250"
> >
<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>
<el-table-column label="客户名称" width="110"> <el-table-column label="客户名称" show-overflow-tooltip min-width="110">
<template slot-scope="scope" show-overflow-tooltip>{{ <template slot-scope="scope" show-overflow-tooltip>{{ scope.row.customer_.name }}</template>
scope.row.customer_.name
}}</template>
</el-table-column> </el-table-column>
<el-table-column label="合同编号" show-overflow-tooltip min-width="110">
<el-table-column label="合同编号" width="110"> <template slot-scope="scope" v-if="scope.row.contract">{{ scope.row.contract_.number }}</template>
<template slot-scope="scope" v-if="scope.row.contract">{{
scope.row.contract_.number
}}</template>
</el-table-column> </el-table-column>
<el-table-column label="合同名称" show-overflow-tooltip width="110"> <el-table-column label="合同名称" show-overflow-tooltip min-width="110">
<template slot-scope="scope" v-if="scope.row.contract">{{ <template slot-scope="scope" v-if="scope.row.contract">{{ scope.row.contract_.name }}</template>
scope.row.contract_.name
}}</template>
</el-table-column> </el-table-column>
<el-table-column label="所需产品" show-overflow-tooltip width="150"> <el-table-column label="所需产品" show-overflow-tooltip min-width="150">
<template slot-scope="scope">{{ <template slot-scope="scope">{{ scope.row.product_.name }}</template>
scope.row.product_.name
}}</template>
</el-table-column> </el-table-column>
<el-table-column label="产品型号" width="110"> <el-table-column label="产品型号" width="110">
<template slot-scope="scope">{{ <template slot-scope="scope">{{
scope.row.product_.specification scope.row.product_.specification
}}</template> }}</template>
</el-table-column> </el-table-column>
<el-table-column label="产品数量" width="110"> <el-table-column label="产品数量">
<template slot-scope="scope">{{ scope.row.count }}</template> <template slot-scope="scope">{{ scope.row.count }}</template>
</el-table-column> </el-table-column>
<el-table-column label="已派数量" width="110"> <el-table-column label="已派数量">
<template slot-scope="scope">{{ scope.row.planed_count }}</template> <template slot-scope="scope">{{ scope.row.planed_count }}</template>
</el-table-column> </el-table-column>
<el-table-column label="交货日期" width="100">
<el-table-column label="交货日期" width="110"> <template slot-scope="scope">{{ scope.row.delivery_date }}</template>
<template slot-scope="scope">{{
scope.row.delivery_date
}}</template>
</el-table-column> </el-table-column>
<el-table-column label="创建时间" show-overflow-tooltip min-width="110">
<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="操作"
fixed="right" fixed="right"
width="150px" width="80px"
> >
<template slot-scope="scope"> <template slot-scope="scope">
<el-link <el-link type="primary"
type="primary"
v-if="checkPermission(['warehouse_update'])" v-if="checkPermission(['warehouse_update'])"
@click="handleclick(scope)" @click="handleclick(scope)"
>排产 >排产

View File

@ -2,10 +2,9 @@
<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="供应商名称"
@ -18,17 +17,18 @@
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-table <el-table
@ -42,7 +42,7 @@
height="100" height="100"
v-el-height-adaptive-table="{bottomOffset: 50}" v-el-height-adaptive-table="{bottomOffset: 50}"
> >
<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.name }}</template> <template slot-scope="scope">{{ scope.row.name }}</template>
</el-table-column> </el-table-column>
@ -53,17 +53,16 @@
<el-table-column label="联系电话"> <el-table-column label="联系电话">
<template slot-scope="scope">{{ scope.row.contact_phone }}</template> <template slot-scope="scope">{{ scope.row.contact_phone }}</template>
</el-table-column> </el-table-column>
<el-table-column label="地址"> <el-table-column label="地址" min-width="120" show-overflow-tooltip>
<template slot-scope="scope">{{ scope.row.address }}</template> <template slot-scope="scope">{{ scope.row.address }}</template>
</el-table-column> </el-table-column>
<el-table-column label="供应物料"> <el-table-column label="供应物料">
<template slot-scope="scope">{{ scope.row.material }}</template> <template slot-scope="scope">{{ scope.row.material }}</template>
</el-table-column> </el-table-column>
<el-table-column label="备注"> <el-table-column label="备注">
<template slot-scope="scope">{{ scope.row.description }}</template> <template slot-scope="scope">{{ scope.row.description }}</template>
</el-table-column> </el-table-column>
<el-table-column label="创建时间"> <el-table-column label="创建时间" width="160">
<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
@ -72,19 +71,20 @@
width="220px" width="220px"
> >
<template slot-scope="scope"> <template slot-scope="scope">
<el-link <el-link
v-if="checkPermission(['vendor_update'])" v-if="checkPermission(['vendor_update'])"
type="primary" type="primary"
@click="handleEdit(scope)" @click="handleEdit(scope)"
>编辑</el-link
> >
编辑
</el-link>
<el-link <el-link
v-if="checkPermission(['vendor_delete'])" v-if="checkPermission(['vendor_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>
@ -108,22 +108,20 @@
:rules="rule1" :rules="rule1"
> >
<el-form-item label="供应商名称" prop="name"> <el-form-item label="供应商名称" prop="name">
<el-input v-model="vendor.name" placeholder="供应商名称" /> <el-input v-model="vendor.name" placeholder="供应商名称"/>
</el-form-item> </el-form-item>
<el-form-item label="联系人" prop="contact"> <el-form-item label="联系人" prop="contact">
<el-input v-model="vendor.contact" placeholder="联系人" /> <el-input v-model="vendor.contact" placeholder="联系人"/>
</el-form-item> </el-form-item>
<el-form-item label="联系电话" prop="contact_phone"> <el-form-item label="联系电话" prop="contact_phone">
<el-input v-model="vendor.contact_phone" placeholder="联系电话" /> <el-input v-model="vendor.contact_phone" placeholder="联系电话"/>
</el-form-item> </el-form-item>
<el-form-item label="地址" prop="address"> <el-form-item label="地址" prop="address">
<el-input v-model="vendor.address" placeholder="地址" /> <el-input v-model="vendor.address" placeholder="地址"/>
</el-form-item> </el-form-item>
<el-form-item label="供应物料" prop="material"> <el-form-item label="供应物料" prop="material">
<el-input v-model="vendor.material" placeholder="供应物料" /> <el-input v-model="vendor.material" placeholder="供应物料"/>
</el-form-item> </el-form-item>
<el-form-item label="备注" prop="description"> <el-form-item label="备注" prop="description">
<el-input <el-input
type="textarea" type="textarea"
@ -141,18 +139,18 @@
</div> </div>
</template> </template>
<script> <script>
import { getpVendorList, createVendor,updateVendor,deleteVendor } from "@/api/vendor"; import {getpVendorList, createVendor, updateVendor, deleteVendor} from "@/api/vendor";
import { getUserList } from "@/api/user"; import {getUserList} from "@/api/user";
import checkPermission from "@/utils/permission"; import checkPermission from "@/utils/permission";
import { genTree } from "@/utils"; import {genTree} from "@/utils";
import Pagination from "@/components/Pagination"; // secondary package based on el-pagination import Pagination from "@/components/Pagination"; // secondary package based on el-pagination
const defaultvendor = { const defaultvendor = {
name: "", name: "",
number: "", number: "",
}; };
export default { export default {
components: { Pagination }, components: {Pagination},
data() { data() {
return { return {
vendor: defaultvendor, vendor: defaultvendor,
@ -173,15 +171,15 @@ export default {
page: 1, page: 1,
page_size: 20, page_size: 20,
}, },
keeperOptions:[], keeperOptions: [],
listLoading: true, listLoading: true,
dialogVisible: false, dialogVisible: false,
dialogType: "new", dialogType: "new",
rule1: { rule1: {
name: [{ required: true, message: "请输入", trigger: "blur" }], name: [{required: true, message: "请输入", trigger: "blur"}],
number: [{ required: true, message: "请输入", trigger: "blur" }], number: [{required: true, message: "请输入", trigger: "blur"}],
model: [{ required: true, message: "请输入", trigger: "blur" }], model: [{required: true, message: "请输入", trigger: "blur"}],
state: [{ required: true, message: "请选择", trigger: "blur" }], state: [{required: true, message: "请选择", trigger: "blur"}],
}, },
}; };
}, },
@ -274,5 +272,5 @@ export default {
}); });
}, },
}, },
}; };
</script> </script>

View File

@ -15,56 +15,56 @@
<el-table-column label="任务编号" align="center"> <el-table-column label="任务编号" align="center">
<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="产品名称" align="center"> <el-table-column label="产品名称" align="center" min-width="120" show-overflow-tooltip>
<template slot-scope="scope"> <template slot-scope="scope">
{{scope.row.product_.name }}</template> {{scope.row.product_.name }}</template>
</el-table-column> </el-table-column>
<el-table-column label="规格型号" align="center"> <el-table-column label="规格型号" align="center">
<template slot-scope="scope">{{ <template slot-scope="scope">
scope.row.product_.specification {{scope.row.product_.specification }}
}}</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="合格率" align="center"> <el-table-column label="合格率" align="center">
<el-table-column label="冷加工" align="center"> <el-table-column label="冷加工" align="center">
<template slot-scope="scope" v-if="scope.row.process_json['01']" <template slot-scope="scope" v-if="scope.row.process_json['01']">
>{{ scope.row.process_json["01"].rate }}%</template {{ scope.row.process_json["01"].rate }}%
> </template>
</el-table-column> </el-table-column>
<el-table-column label="热弯" align="center"> <el-table-column label="热弯" align="center">
<template slot-scope="scope" v-if="scope.row.process_json['02']" <template slot-scope="scope" v-if="scope.row.process_json['02']">
>{{ scope.row.process_json["02"].rate }}%</template {{ scope.row.process_json["02"].rate }}%
> </template>
</el-table-column> </el-table-column>
<el-table-column label="化学钢化" align="center"> <el-table-column label="化学钢化" align="center">
<template slot-scope="scope" v-if="scope.row.process_json['03']" <template slot-scope="scope" v-if="scope.row.process_json['03']">
>{{ scope.row.process_json["03"].rate }}%</template {{ scope.row.process_json["03"].rate }}%
> </template>
</el-table-column> </el-table-column>
<el-table-column label="镀膜" align="center"> <el-table-column label="镀膜" align="center">
<template slot-scope="scope" v-if="scope.row.process_json['05']" <template slot-scope="scope" v-if="scope.row.process_json['05']">
>{{ scope.row.process_json["05"].rate }}%</template {{ scope.row.process_json["05"].rate }}%
> </template>
</el-table-column> </el-table-column>
<el-table-column label="夹层" align="center"> <el-table-column label="夹层" align="center">
<template slot-scope="scope" v-if="scope.row.process_json['06']" <template slot-scope="scope" v-if="scope.row.process_json['06']">
>{{ scope.row.process_json["06"].rate }}%</template {{ scope.row.process_json["06"].rate }}%
> </template>
</el-table-column> </el-table-column>
<el-table-column label="包边" align="center"> <el-table-column label="包边" align="center">
<template slot-scope="scope" v-if="scope.row.process_json['07']" <template slot-scope="scope" v-if="scope.row.process_json['07']">
>{{ scope.row.process_json["07"].rate }}%</template {{ scope.row.process_json["07"].rate }}%
> </template>
</el-table-column> </el-table-column>
<el-table-column label="装框" align="center"> <el-table-column label="装框" align="center">
<template slot-scope="scope" v-if="scope.row.process_json['08']" <template slot-scope="scope" v-if="scope.row.process_json['08']">
>{{ scope.row.process_json["08"].rate }}%</template {{ scope.row.process_json["08"].rate }}%
> </template>
</el-table-column> </el-table-column>
</el-table-column> </el-table-column>
<el-table-column label="创建时间" align="center"> <el-table-column label="创建时间" align="center" min-width="150" show-overflow-tooltip>
<template slot-scope="scope">{{ <template slot-scope="scope">
scope.row.create_time {{scope.row.create_time }}
}}</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="操作" align="center"> <el-table-column label="操作" align="center">
<template slot-scope="scope"> <template slot-scope="scope">
@ -72,8 +72,9 @@
v-if="checkPermission(['material_update'])" v-if="checkPermission(['material_update'])"
type="primary" type="primary"
@click="handledetail(scope)" @click="handledetail(scope)"
>详情</el-link
> >
详情
</el-link>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
@ -100,34 +101,34 @@
<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" v-if="scope.row.order_">{{ <template slot-scope="scope" v-if="scope.row.order_">
scope.row.order_.number {{scope.row.order_.number}}
}}</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="产品名称"> <el-table-column label="产品名称" min-width="110" show-overflow-tooltip>
<template slot-scope="scope" v-if="scope.row.product_">{{ <template slot-scope="scope" v-if="scope.row.product_">
scope.row.product_.name {{scope.row.product_.name}}
}}</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="规格型号"> <el-table-column label="规格型号">
<template slot-scope="scope" v-if="scope.row.product_">{{ <template slot-scope="scope" v-if="scope.row.product_">
scope.row.product_.specification {{scope.row.product_.specification}}
}}</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="责任工序"> <el-table-column label="责任工序">
<template slot-scope="scope" v-if="scope.row.resp_process_">{{ <template slot-scope="scope" v-if="scope.row.resp_process_">
scope.row.resp_process_.name {{scope.row.resp_process_.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">
decision_[scope.row.decision] {{decision_[scope.row.decision]}}
}}</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="创建时间"> <el-table-column label="创建时间" min-width="150" show-overflow-tooltip>
<template slot-scope="scope">{{ <template slot-scope="scope">
scope.row.create_time {{scope.row.create_time}}
}}</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="操作"> <el-table-column label="操作">
<template slot-scope="scope"> <template slot-scope="scope">
@ -135,8 +136,9 @@
v-if="checkPermission(['material_update'])" v-if="checkPermission(['material_update'])"
type="primary" type="primary"
@click="handledetailbhg(scope)" @click="handledetailbhg(scope)"
>查看</el-link
> >
查看
</el-link>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
@ -147,7 +149,6 @@
:limit.sync="listQuery2.page_size" :limit.sync="listQuery2.page_size"
@pagination="getList2" @pagination="getList2"
/> />
</el-tab-pane> </el-tab-pane>
</el-tabs> </el-tabs>
</el-card> </el-card>

View File

@ -17,7 +17,7 @@
<template slot-scope="scope" v-if="scope.row.subproduction_plan_">{{ scope.row.subproduction_plan_.number }} <template slot-scope="scope" v-if="scope.row.subproduction_plan_">{{ scope.row.subproduction_plan_.number }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="产品名称"> <el-table-column label="产品名称" min-width="120" show-overflow-tooltip>
<template slot-scope="scope" v-if="scope.row.material_">{{ scope.row.material_.name }}</template> <template slot-scope="scope" v-if="scope.row.material_">{{ scope.row.material_.name }}</template>
</el-table-column> </el-table-column>
<el-table-column label="型号规格"> <el-table-column label="型号规格">

View File

@ -16,16 +16,16 @@
<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" v-if="scope.row.subproduction_plan_">{{ scope.row.subproduction_plan_.number }} <template slot-scope="scope" v-if="scope.row.subproduction_plan_">
{{ scope.row.subproduction_plan_.number}}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="产品名称"> <el-table-column label="产品名称" min-width="100" show-overflow-tooltip>
<template slot-scope="scope" v-if="scope.row.material_">{{ scope.row.material_.name }}</template> <template slot-scope="scope" v-if="scope.row.material_">{{ scope.row.material_.name }}</template>
</el-table-column> </el-table-column>
<el-table-column label="型号规格"> <el-table-column label="型号规格">
<template slot-scope="scope" v-if="scope.row.material_">{{ scope.row.material_.specification }}</template> <template slot-scope="scope" v-if="scope.row.material_">{{ scope.row.material_.specification }}</template>
</el-table-column> </el-table-column>
<el-table-column label="军检结论"> <el-table-column label="军检结论">
<template slot-scope="scope"> <template slot-scope="scope">
<el-tag v-if="scope.row.is_mtestok==false">不合格</el-tag> <el-tag v-if="scope.row.is_mtestok==false">不合格</el-tag>
@ -73,39 +73,39 @@
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" v-if="scope.row.order_">{{ <template slot-scope="scope" v-if="scope.row.order_">
scope.row.order_.number {{scope.row.order_.number}}
}}</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="产品名称"> <el-table-column label="产品名称" min-width="120" show-overflow-tooltip>
<template slot-scope="scope" v-if="scope.row.product_">{{ <template slot-scope="scope" v-if="scope.row.product_">
scope.row.product_.name {{scope.row.product_.name}}
}}</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="规格型号"> <el-table-column label="规格型号">
<template slot-scope="scope" v-if="scope.row.product_">{{ <template slot-scope="scope" v-if="scope.row.product_">
scope.row.product_.specification {{scope.row.product_.specification}}
}}</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="责任工序"> <el-table-column label="责任工序">
<template slot-scope="scope" v-if="scope.row.resp_process_">{{ <template slot-scope="scope" v-if="scope.row.resp_process_">
scope.row.resp_process_.name {{scope.row.resp_process_.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">
decision_[scope.row.decision] {{decision_[scope.row.decision]}}
}}</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.create_time {{scope.row.create_time}}
}}</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="操作"> <el-table-column label="操作">
<template slot-scope="scope"> <template slot-scope="scope">
@ -113,8 +113,9 @@
v-if="checkPermission(['material_update'])" v-if="checkPermission(['material_update'])"
type="primary" type="primary"
@click="handledetailbhg(scope)" @click="handledetailbhg(scope)"
>查看</el-link
> >
查看
</el-link>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
@ -125,7 +126,6 @@
:limit.sync="listQuery2.page_size" :limit.sync="listQuery2.page_size"
@pagination="getList2" @pagination="getList2"
/> />
</el-tab-pane> </el-tab-pane>
<el-tab-pane label="入厂不合格" name="4"> <el-tab-pane label="入厂不合格" name="4">
<el-table <el-table
@ -138,7 +138,7 @@
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.batch }}</template> <template slot-scope="scope">{{ scope.row.batch }}</template>
</el-table-column> </el-table-column>
@ -148,7 +148,8 @@
<el-table-column label="规格型号"> <el-table-column label="规格型号">
<template slot-scope="scope">{{ <template slot-scope="scope">{{
scope.row.material_.specification scope.row.material_.specification
}}</template> }}
</template>
</el-table-column> </el-table-column>
<el-table-column label="物料单位"> <el-table-column label="物料单位">
<template slot-scope="scope">{{ scope.row.material_.unit }}</template> <template slot-scope="scope">{{ scope.row.material_.unit }}</template>
@ -172,15 +173,15 @@
</div> </div>
</template> </template>
<script> <script>
import { getProductionplanList } from "@/api/pm"; import {getProductionplanList} from "@/api/pm";
import { getwproductticketList,getwproductList } from "@/api/wpm"; import {getwproductticketList, getwproductList} from "@/api/wpm";
import { ticketread } from "@/api/workflow"; import {ticketread} from "@/api/workflow";
import { getfifodetailList} from "@/api/inm"; import {getfifodetailList} from "@/api/inm";
import checkPermission from "@/utils/permission"; import checkPermission from "@/utils/permission";
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},
data() { data() {
return { return {
wproductList: { wproductList: {
@ -226,7 +227,7 @@ export default {
page: 1, page: 1,
page_size: 20, page_size: 20,
}, },
fifodetailList4:{ fifodetailList4: {
count: 0, count: 0,
}, },
}; };
@ -247,7 +248,7 @@ export default {
this.listQuery.material__type = 1; this.listQuery.material__type = 1;
this.listQuery.tag='notok'; this.listQuery.tag = 'notok';
getwproductList(this.listQuery).then((response) => { getwproductList(this.listQuery).then((response) => {
if (response.data) { if (response.data) {
this.wproductList = response.data; this.wproductList = response.data;
@ -265,10 +266,9 @@ export default {
}); });
}, },
//不合格玻璃审理单查看 //不合格玻璃审理单查看
handledetailbhg(scope) handledetailbhg(scope) {
{
this.$router.push({name:"ticketDetail",params:{ticketId:scope.row.ticket}}) this.$router.push({name: "ticketDetail", params: {ticketId: scope.row.ticket}})
}, },
//入场检验不合格 //入场检验不合格
//不合格物料 //不合格物料
@ -286,5 +286,5 @@ export default {
}, },
}, },
}; };
</script> </script>

View File

@ -9,14 +9,14 @@
<Echart <Echart
:options="pieOptions" :options="pieOptions"
id="pieChart" id="pieChart"
height="400px" height="45vh"
></Echart> ></Echart>
</el-card> </el-card>
</el-col> </el-col>
<el-col :span="16"> <el-col :span="16">
<el-card> <el-card>
<div class="chartsTitle">废料原因统计</div> <div class="chartsTitle">废料原因统计</div>
<div id="barChart" style="width:100%;height: 400px;"></div> <div id="barChart" style="width:100%;height: 45vh"></div>
</el-card> </el-card>
</el-col> </el-col>
</el-row> </el-row>
@ -56,7 +56,7 @@
:id="chartId1" :id="chartId1"
:options="barOptions" :options="barOptions"
:className="chartsName" :className="chartsName"
height="400px" height="45vh"
width="600px" width="600px"
> >
</charts> </charts>
@ -69,7 +69,7 @@
:id="chartId2" :id="chartId2"
:options="barOptions" :options="barOptions"
:className="chartsName" :className="chartsName"
height="400px" height="45vh"
width="600px" width="600px"
> >
</charts> </charts>
@ -111,7 +111,7 @@
:id="chartId3" :id="chartId3"
:options="barOptions" :options="barOptions"
:className="chartsName" :className="chartsName"
height="400px" height="45vh"
> >
</charts> </charts>
</el-card> </el-card>

View File

@ -7,7 +7,7 @@
<Echart <Echart
:options="pieOptions" :options="pieOptions"
id="pieChart" id="pieChart"
height="400px" height="45vh"
></Echart> ></Echart>
</el-card> </el-card>
</el-col> </el-col>
@ -18,7 +18,7 @@
:id="chartId1" :id="chartId1"
:options="barOptions" :options="barOptions"
:className="chartsName" :className="chartsName"
height="400px" height="45vh"
width="100%" width="100%"
> >
</charts> </charts>
@ -31,7 +31,7 @@
:id="chartId2" :id="chartId2"
:options="barOptions1" :options="barOptions1"
:className="chartsName" :className="chartsName"
height="400px" height="45vh"
width="100%" width="100%"
> >
</charts> </charts>
@ -55,10 +55,10 @@
> >
<el-table-column type="index" width="50" /> <el-table-column type="index" width="50" />
<el-table-column label="订单编号" width="160" show-overflow-tooltip> <el-table-column label="订单编号" width="120" show-overflow-tooltip>
<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="产品名称" width="200" show-overflow-tooltip> <el-table-column label="产品名称" width="160" 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>
<el-table-column label="产品数量"> <el-table-column label="产品数量">

View File

@ -17,92 +17,96 @@
highlight-current-row highlight-current-row
@current-change="handleCurrentChange" @current-change="handleCurrentChange"
> >
<el-table-column type="index" width="50" /> <el-table-column type="index" width="50"/>
<el-table-column label="子计划编号" min-width="100" show-overflow-tooltip>
<el-table-column label="子计划编号" width="100">
<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="产品名称" min-width="120" show-overflow-tooltip>
<template slot-scope="scope">{{ <template slot-scope="scope">
scope.row.plan_product_.name {{scope.row.plan_product_.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">
scope.row.product_.specification {{scope.row.product_.specification}}
}}</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="生产主产品" width="140"> <el-table-column label="生产主产品" min-width="130" show-overflow-tooltip>
<template slot-scope="scope">{{ <template slot-scope="scope">
scope.row.product_.name {{scope.row.product_.name}}
}}</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="名称"> <el-table-column label="名称" min-width="100" show-overflow-tooltip>
<template slot-scope="scope">{{ <template slot-scope="scope">
scope.row.subproduction_.name {{scope.row.subproduction_.name}}
}}</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="生产车间" min-width="100" show-overflow-tooltip>
<el-table-column label="生产车间"> <template slot-scope="scope">
<template slot-scope="scope">{{ {{scope.row.workshop_.name}}
scope.row.workshop_.name </template>
}}</template>
</el-table-column> </el-table-column>
<el-table-column label="子工序" min-width="160">
<el-table-column label="子工序" width="160">
<template slot-scope="scope" v-if="scope.row.steps"> <template slot-scope="scope" v-if="scope.row.steps">
<el-tag <el-tag
v-for="item in scope.row.steps" v-for="item in scope.row.steps"
:key="item.number" :key="item.number"
:label="item.name" :label="item.name"
:value="item.number" :value="item.number"
>{{ item.name }}</el-tag
> >
{{ item.name }}
</el-tag>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="开工时间"> <el-table-column label="开工时间" width="100">
<template slot-scope="scope">{{ scope.row.start_date }}</template> <template slot-scope="scope">{{ scope.row.start_date }}</template>
</el-table-column> </el-table-column>
<el-table-column label="完工时间"> <el-table-column label="完工时间" width="100">
<template slot-scope="scope">{{ scope.row.end_date }}</template> <template slot-scope="scope">{{ scope.row.end_date }}</template>
</el-table-column> </el-table-column>
<el-table-column label="状态"> <el-table-column label="状态">
<template slot-scope="scope"> <template slot-scope="scope">
{{ state_[scope.row.state] }}</template {{ state_[scope.row.state] }}
> </template>
</el-table-column> </el-table-column>
<el-table-column label="领料状态" width="100"> <el-table-column label="领料状态" width="80">
<template slot-scope="scope"> <template slot-scope="scope">
<el-tag v-if="scope.row.is_picked == false">未领料</el-tag> <el-tag v-if="scope.row.is_picked == false">未领料</el-tag>
<el-tag v-else>已领料</el-tag> <el-tag v-else>已领料</el-tag>
</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.count }}/{{ scope.row.count_real }}/{{ {{ scope.row.count }}/{{ scope.row.count_real }}/{{scope.row.count_ok}}
scope.row.count_ok </template>
}}</template
>
</el-table-column> </el-table-column>
<el-table-column
<el-table-column align="center" label="操作" width="130px"> align="center"
label="操作"
width="80px"
fixed="right"
>
<template slot-scope="scope"> <template slot-scope="scope">
<el-link <el-link
type="success" type="success"
v-if="scope.row.is_picked == false" v-if="scope.row.is_picked == false"
@click="handleNeed(scope)" @click="handleNeed(scope)"
>领料</el-link
> >
领料
</el-link>
<el-link <el-link
type="success" type="success"
v-if="scope.row.is_picked" v-if="scope.row.is_picked"
@click="handleNeed(scope)" @click="handleNeed(scope)"
>继续领料</el-link
> >
<el-link type="primary" @click="handlepick(scope)" 继续领料
>领半成品</el-link </el-link>
<el-link
type="primary"
@click="handlepick(scope)"
> >
领半成品
</el-link>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
@ -127,79 +131,74 @@
:label="item.name" :label="item.name"
:value="item.number" :value="item.number"
@click="handlework(item)" @click="handlework(item)"
>{{ item.name }}</el-button
> >
{{ item.name }}
</el-button>
<el-button <el-button
type="primary" type="primary"
@click="handleScrapbcp()" @click="handleScrapbcp()"
id="scrap" id="scrap"
style="float: right; display: none" style="float: right; display: none"
>报废</el-button
> >
报废
</el-button>
<el-badge :value="count" class="item" style="float:right"> <el-badge :value="count" class="item" style="float:right">
<el-button <el-button
type="primary" type="primary"
@click="handleAll()" @click="handleAll()"
>显示全部</el-button
> >
</el-badge> 显示全部
</el-button>
</el-badge>
<el-table <el-table
:data="wproductData"
@selection-change="handleSelectionChange"
border border
fit fit
stripe stripe
style="width: 100%" style="width: 100%"
max-height="300" max-height="300"
:data="wproductData"
@selection-change="handleSelectionChange"
> >
<el-table-column type="selection" width="55"> </el-table-column> <el-table-column type="selection" width="40"></el-table-column>
<el-table-column type="index" width="50" /> <el-table-column type="index" width="50"/>
<el-table-column label="子计划编号" width="100"> <el-table-column label="子计划编号" width="100" show-overflow-tooltip>
<template slot-scope="scope">{{ <template slot-scope="scope">{{ scope.row.number }}</template>>
scope.row.subproduction_plan_.number <template slot-scope="scope">
}}</template> {{scope.row.subproduction_plan_.number}}
</template>
</el-table-column> </el-table-column>
<el-table-column label="玻璃编号" width="100" show-overflow-tooltip>
<el-table-column label="玻璃编号"> <template slot-scope="scope">
<template slot-scope="scope">{{ scope.row.number }}</template> {{ scope.row.number }}
</template>
</el-table-column> </el-table-column>
<el-table-column label="玻璃状态" width="100" show-overflow-tooltip>
<el-table-column label="玻璃状态"> <template slot-scope="scope">
<template slot-scope="scope">{{ {{scope.row.material_.name}}
scope.row.material_.name </template>
}}</template>
</el-table-column> </el-table-column>
<el-table-column label="所在子工序" width="100" show-overflow-tooltip>
<el-table-column label="所在子工序"> <template slot-scope="scope">
<template slot-scope="scope">{{ {{scope.row.step_.name}}
scope.row.step_.name </template>
}}</template>
</el-table-column> </el-table-column>
<el-table-column label="进行状态"> <el-table-column label="进行状态" width="100" show-overflow-tooltip>
<template slot-scope="scope">{{ <template slot-scope="scope">
actstate_[scope.row.act_state] {{actstate_[scope.row.act_state]}}
}}</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="不合格标记"> <el-table-column label="不合格标记" width="100">
<template slot-scope="scope"> <template slot-scope="scope">
{{ ng_sign_[scope.row.ng_sign] }} {{ ng_sign_[scope.row.ng_sign] }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="更新时间"> <el-table-column label="更新时间" width="160">
<template slot-scope="scope">{{ <template slot-scope="scope">
scope.row.update_time {{scope.row.update_time}}
}}</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
</el-card> </el-card>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-card class="box-card"> <el-card class="box-card">
@ -214,21 +213,21 @@
style="width: 100%" style="width: 100%"
max-height="300" max-height="300"
> >
<el-table-column type="index" width="50" /> <el-table-column type="index" width="50"/>
<el-table-column label="子计划编号" width="100"> <el-table-column label="子计划编号" min-width="100" show-overflow-tooltip>
<template slot-scope="scope">{{ <template slot-scope="scope">
scope.row.subproduction_plan_.number {{scope.row.subproduction_plan_.number }}
}}</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="物料名称"> <el-table-column label="物料名称" min-width="130" show-overflow-tooltip>
<template slot-scope="scope">{{ <template slot-scope="scope">
scope.row.material_.name {{scope.row.material_.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">
scope.row.material_.unit {{scope.row.material_.unit}}
}}</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="物料批次"> <el-table-column label="物料批次">
<template slot-scope="scope">{{ scope.row.batch }}</template> <template slot-scope="scope">{{ scope.row.batch }}</template>
@ -248,7 +247,7 @@
:visible.sync="dialogFormVisiblebcp" :visible.sync="dialogFormVisiblebcp"
> >
<el-form :model="formbcp"> <el-form :model="formbcp">
<el-form-item label="甩片原因" > <el-form-item label="甩片原因">
<el-select <el-select
style="width: 80%" style="width: 80%"
v-model="formbcp.scrap_reason" v-model="formbcp.scrap_reason"
@ -283,7 +282,7 @@
</el-table-column> </el-table-column>
<el-table-column prop="material_.unit" label="物料单位"> <el-table-column prop="material_.unit" label="物料单位">
</el-table-column> </el-table-column>
<el-table-column prop="count" label="所需物料数量"> </el-table-column> <el-table-column prop="count" label="所需物料数量"></el-table-column>
<el-table-column prop="count_pick" label="已领物料数量"> <el-table-column prop="count_pick" label="已领物料数量">
</el-table-column> </el-table-column>
<el-table-column prop="count_real" label="实际产出/消耗"> <el-table-column prop="count_real" label="实际产出/消耗">
@ -293,8 +292,9 @@
<el-link <el-link
v-if="checkPermission(['material_update'])" v-if="checkPermission(['material_update'])"
@click="handleReceive(scope)" @click="handleReceive(scope)"
>领半成品</el-link
> >
领半成品
</el-link>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
@ -303,7 +303,6 @@
<el-button type="primary" @click="bcpllSubmit"> </el-button> <el-button type="primary" @click="bcpllSubmit"> </el-button>
</div> </div>
</el-dialog> </el-dialog>
<el-dialog <el-dialog
title="半成品列表" title="半成品列表"
:close-on-click-modal="false" :close-on-click-modal="false"
@ -318,17 +317,14 @@
max-height="300" max-height="300"
@selection-change="handleSelectionChangess" @selection-change="handleSelectionChangess"
> >
<el-table-column type="selection" width="55"> </el-table-column> <el-table-column type="selection" width="55"></el-table-column>
<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">{{ scope.row.material_.name }}</template> <template slot-scope="scope">{{ scope.row.material_.name }}</template>
</el-table-column> </el-table-column>
<el-table-column label="子计划编号"> <el-table-column label="子计划编号">
<template slot-scope="scope">{{ scope.row.subproduction_plan_.number }}</template> <template slot-scope="scope">{{ scope.row.subproduction_plan_.number }}</template>
</el-table-column> </el-table-column>
@ -341,7 +337,6 @@
<el-button type="primary" @click="wproductSubmit"> </el-button> <el-button type="primary" @click="wproductSubmit"> </el-button>
</div> </div>
</el-dialog> </el-dialog>
<el-dialog <el-dialog
:visible.sync="dialogVisiblenw" :visible.sync="dialogVisiblenw"
:close-on-click-modal="false" :close-on-click-modal="false"
@ -381,8 +376,9 @@
style="float: right; padding: 3px 0" style="float: right; padding: 3px 0"
@click="handlePick" @click="handlePick"
type="text" type="text"
>确认领料</el-button
> >
确认领料
</el-button>
</div> </div>
<template> <template>
<el-table <el-table
@ -391,17 +387,17 @@
height="300" height="300"
style="width: 100%" style="width: 100%"
> >
<el-table-column prop="batch" label="物料批次"> </el-table-column> <el-table-column prop="batch" label="物料批次"></el-table-column>
<el-table-column prop="material_.name" label="物料名称"> <el-table-column prop="material_.name" label="物料名称">
</el-table-column> </el-table-column>
<el-table-column prop="warehouse_.name" label="物料所在仓库"> <el-table-column prop="warehouse_.name" label="物料所在仓库">
</el-table-column> </el-table-column>
<el-table-column prop="count" label="物料总数量"> </el-table-column> <el-table-column prop="count" label="物料总数量"></el-table-column>
<el-table-column label="输入领料数量" width="140px"> <el-table-column label="输入领料数量" width="140px">
<template slot-scope="scope"> <template slot-scope="scope">
<el-form <el-form
:model="scope.row"
v-if="scope.row.material_.type != 2" v-if="scope.row.material_.type != 2"
:model="scope.row"
widht="100px" widht="100px"
> >
<el-form-item size="mini"> <el-form-item size="mini">
@ -415,7 +411,6 @@
</el-form> </el-form>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="count_pick" label="已领物料数量"> <el-table-column prop="count_pick" label="已领物料数量">
</el-table-column> </el-table-column>
<el-table-column prop="material_.specification" label="物料规格"> <el-table-column prop="material_.specification" label="物料规格">
@ -427,8 +422,9 @@
<el-link <el-link
v-if="scope.row.material_.type == 2" v-if="scope.row.material_.type == 2"
@click="handlewproduct(scope)" @click="handlewproduct(scope)"
>选择半成品</el-link
> >
选择半成品
</el-link>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
@ -449,23 +445,20 @@
max-height="600" max-height="600"
@selection-change="handleSelectionChanges" @selection-change="handleSelectionChanges"
> >
<el-table-column type="selection" width="55"> </el-table-column> <el-table-column type="selection" width="55"></el-table-column>
<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">{{ scope.row.batch }}</template> <template slot-scope="scope">{{ scope.row.batch}}</template>
</el-table-column> </el-table-column>
<el-table-column label="玻璃状态"> <el-table-column label="玻璃状态">
<template slot-scope="scope">{{ scope.row.material_.name }}</template> <template slot-scope="scope">{{ scope.row.material_.name}}</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.warehouse_.name}}
scope.row.warehouse_.name </template>
}}</template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<div slot="footer" class="dialog-footer"> <div slot="footer" class="dialog-footer">
@ -499,7 +492,6 @@
<el-card class="box-card" v-if="showPrise1 && values === 0"> <el-card class="box-card" v-if="showPrise1 && values === 0">
<div slot="header" class="clearfix"> <div slot="header" class="clearfix">
<span>消耗物料表</span> <span>消耗物料表</span>
<el-table :data="input" border style="width: 100%"> <el-table :data="input" border style="width: 100%">
<el-table-column <el-table-column
prop="subproduction_plan" prop="subproduction_plan"
@ -556,7 +548,6 @@
width="180" width="180"
> >
</el-table-column> </el-table-column>
<el-table-column <el-table-column
prop="count_output" prop="count_output"
label="产出数量" label="产出数量"
@ -589,34 +580,35 @@
</el-form-item> </el-form-item>
</el-form> </el-form>
<el-button style="margin-top: 12px" @click="next" v-if="values == 0" <el-button style="margin-top: 12px" @click="next" v-if="values == 0"
>下一步</el-button
> >
下一步
</el-button>
</el-card> </el-card>
<el-card <el-card
class="box-card"
v-for="(itemf, $index) in otherforms" v-for="(itemf, $index) in otherforms"
:key="$index" :key="$index"
class="box-card"
> >
<el-form <el-form
v-if="values === $index + 1"
label-width="80px" label-width="80px"
label-position="right" label-position="right"
v-if="values === $index + 1"
> >
<el-row v-for="(item, $index) in itemf.form_fields" :key="$index"> <el-row v-for="(item, $index) in itemf.form_fields" :key="$index">
<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"
> >
<el-input placeholder="请输入" v-model="item.sort" /> <el-input placeholder="请输入" v-model="item.sort"/>
</el-form-item> </el-form-item>
<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"
> >
<el-input <el-input
v-model="item.sort"
type="number" type="number"
placeholder="请输入" placeholder="请输入"
v-model="item.sort"
/> />
</el-form-item> </el-form-item>
<el-form-item <el-form-item
@ -624,9 +616,9 @@
:label="item.field_name" :label="item.field_name"
> >
<el-input <el-input
v-model="item.sort"
type="number" type="number"
placeholder="请输入" placeholder="请输入"
v-model="item.sort"
/> />
</el-form-item> </el-form-item>
<el-form-item <el-form-item
@ -660,8 +652,8 @@
:label="item.field_name" :label="item.field_name"
> >
<el-select <el-select
style="width: 100%"
v-model="item.sort" v-model="item.sort"
style="width: 100%"
placeholder="请选择" placeholder="请选择"
> >
<el-option <el-option
@ -695,40 +687,40 @@
</el-row> </el-row>
</el-form> </el-form>
<el-button <el-button
v-if="values == $index + 2"
style="margin-top: 12px" style="margin-top: 12px"
@click="next" @click="next"
v-if="values == $index + 2" >下一步
>下一步</el-button </el-button>
>
<el-button <el-button
style="margin-top: 12px" style="margin-top: 12px"
@click="prev" @click="prev"
v-if="values == $index + 1" v-if="values == $index + 1"
>上一步</el-button >上一步
> </el-button>
</el-card> </el-card>
<div style="text-align: right; position: sticky"> <div style="text-align: right; position: sticky">
<el-button type="danger" @click="dialogVisiblework = false" <el-button
>取消</el-button type="danger"
@click="dialogVisiblework = false"
> >
取消
</el-button>
<el-button type="primary" @click="submint()">确认</el-button> <el-button type="primary" @click="submint()">确认</el-button>
</div> </div>
</el-dialog> </el-dialog>
</div> </div>
</template> </template>
<style> <style>
.item { .item {
margin-right: 20px; margin-right: 20px;
} }
</style> </style>
<script> <script>
import { getsubproductionplanList, createPick_need } from "@/api/pm"; import {getsubproductionplanList, createPick_need} from "@/api/pm";
import checkPermission from "@/utils/permission"; import checkPermission from "@/utils/permission";
import { getProcessList, getStepLists } from "@/api/mtm"; import {getProcessList, getStepLists} from "@/api/mtm";
import { import {
createPick, createPick,
getwmaterialList, getwmaterialList,
submitWork, submitWork,
@ -738,12 +730,12 @@ import {
createpickhalf, createpickhalf,
createOperation, createOperation,
scrap scrap
} from "@/api/wpm"; } from "@/api/wpm";
import { getiproductList } from "@/api/inm"; import {getiproductList} 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
const defaulteneed = {}; const defaulteneed = {};
export default { export default {
components: { Pagination }, components: {Pagination},
data() { data() {
return { return {
@ -837,12 +829,12 @@ export default {
formbcp: {}, formbcp: {},
dialogFormVisiblebcp: false, dialogFormVisiblebcp: false,
scrapreason: [ scrapreason: [
{ lable: "气泡", value: 10 }, {lable: "气泡", value: 10},
{ lable: "破点", value: 20 }, {lable: "破点", value: 20},
{ lable: "划伤", value: 30 }, {lable: "划伤", value: 30},
{ lable: "其他", value: 40 }, {lable: "其他", value: 40},
], ],
count:null, count: null,
}; };
}, },
process: "", process: "",
@ -903,7 +895,7 @@ export default {
scrapesubmit() { scrapesubmit() {
console.log(this.formbcp); console.log(this.formbcp);
scrap(this.wpID, this.formbcp).then((response) => { scrap(this.wpID, this.formbcp).then((response) => {
if (response.code==200) { if (response.code == 200) {
this.$message.success("该半成品已报废!"); this.$message.success("该半成品已报废!");
this.dialogFormVisiblebcp = false; this.dialogFormVisiblebcp = false;
// 半成品表 // 半成品表
@ -930,7 +922,7 @@ export default {
}, },
//大工序工序渲染 //大工序工序渲染
getProcessList() { getProcessList() {
getProcessList({ page: 0 }).then((response) => { getProcessList({page: 0}).then((response) => {
if (response.data) { if (response.data) {
this.processOption = response.data; this.processOption = response.data;
} }
@ -1031,7 +1023,7 @@ export default {
} }
}); });
//半成品 //半成品
getwproductList({ page: 0, step__process: this.process }).then( getwproductList({page: 0, step__process: this.process}).then(
(response) => { (response) => {
if (response.data) { if (response.data) {
this.wproductData = response.data; this.wproductData = response.data;
@ -1111,7 +1103,7 @@ export default {
if (this.values++ > this.forms.length) this.values = 0; if (this.values++ > this.forms.length) this.values = 0;
}, },
handleSelectionChange(val) { handleSelectionChange(val) {
this.count=val.length; this.count = val.length;
console.log(this.count); console.log(this.count);
let _this = this; let _this = this;
@ -1131,7 +1123,7 @@ export default {
createOperation(this.Operation).then((res) => { createOperation(this.Operation).then((res) => {
if (res.code >= 200) { if (res.code >= 200) {
this.$message.success("操作记录创建成功!"); this.$message.success("操作记录创建成功!");
this.$router.push({ name: "operation", params: { id: item.id } }); this.$router.push({name: "operation", params: {id: item.id}});
} }
}); });
}, },
@ -1175,5 +1167,5 @@ export default {
}); });
}, },
}, },
}; };
</script> </script>

View File

@ -0,0 +1,23 @@
# Generated by Django 3.2.9 on 2022-02-17 13:55
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('hrm', '0005_auto_20220126_1351'),
]
operations = [
migrations.AddField(
model_name='employee',
name='is_atwork',
field=models.BooleanField(default=False, verbose_name='当前在岗'),
),
migrations.AddField(
model_name='employee',
name='last_check_time',
field=models.DateTimeField(blank=True, null=True, verbose_name='打卡时间'),
),
]

View File

@ -0,0 +1,41 @@
# Generated by Django 3.2.9 on 2022-02-18 00:43
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
import django.utils.timezone
class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('hrm', '0006_auto_20220217_2155'),
]
operations = [
migrations.AddField(
model_name='employee',
name='not_work_remark',
field=models.CharField(blank=True, max_length=200, null=True, verbose_name='当前未打卡说明'),
),
migrations.CreateModel(
name='NotWorkRemark',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('create_time', models.DateTimeField(default=django.utils.timezone.now, help_text='创建时间', verbose_name='创建时间')),
('update_time', models.DateTimeField(auto_now=True, help_text='修改时间', verbose_name='修改时间')),
('is_deleted', models.BooleanField(default=False, help_text='删除标记', verbose_name='删除标记')),
('year', models.PositiveSmallIntegerField(default=2022, verbose_name='')),
('month', models.PositiveSmallIntegerField(default=2, verbose_name='')),
('day', models.PositiveSmallIntegerField(default=1, verbose_name='')),
('remark', models.CharField(blank=True, max_length=200, null=True, verbose_name='未打卡说明')),
('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='notworkremark_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')),
('update_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='notworkremark_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')),
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='用户')),
],
options={
'abstract': False,
},
),
]

View File

@ -30,6 +30,9 @@ class Employee(CommonAModel):
qualification = models.CharField('学历', max_length=50, null=True, blank=True) qualification = models.CharField('学历', max_length=50, null=True, blank=True)
job_state = models.IntegerField('在职状态', choices=jobstate_choices, default=1) job_state = models.IntegerField('在职状态', choices=jobstate_choices, default=1)
face_data = models.JSONField('人脸识别数据', null=True, blank=True) face_data = models.JSONField('人脸识别数据', null=True, blank=True)
is_atwork = models.BooleanField('当前在岗', default=False)
last_check_time = models.DateTimeField('打卡时间', null=True, blank=True)
not_work_remark = models.CharField('当前未打卡说明', null=True, blank=True, max_length=200)
class Meta: class Meta:
verbose_name = '员工补充信息' verbose_name = '员工补充信息'
verbose_name_plural = verbose_name verbose_name_plural = verbose_name
@ -37,6 +40,16 @@ class Employee(CommonAModel):
def __str__(self): def __str__(self):
return self.name return self.name
class NotWorkRemark(CommonAModel):
"""
离岗说明
"""
year = models.PositiveSmallIntegerField('', default=2022)
month = models.PositiveSmallIntegerField('', default=2)
day = models.PositiveSmallIntegerField('', default=1)
user = models.ForeignKey(User, verbose_name='用户', on_delete=models.CASCADE)
remark = models.CharField('未打卡说明', null=True, blank=True, max_length=200)
class ClockRecord(CommonADModel): class ClockRecord(CommonADModel):
""" """
打卡记录 打卡记录

View File

@ -10,12 +10,14 @@ from django.db.models.query import Prefetch
class EmployeeSerializer(DynamicFieldsSerializerMixin, ModelSerializer): class EmployeeSerializer(DynamicFieldsSerializerMixin, ModelSerializer):
name = serializers.CharField(source='user.name', read_only=True) name = serializers.CharField(source='user.name', read_only=True)
dept_ = OrganizationSimpleSerializer(source='user.dept', read_only=True) dept_ = OrganizationSimpleSerializer(source='user.dept', read_only=True)
is_atwork = serializers.BooleanField(source='user.is_atwork', read_only=True)
last_check_time = serializers.DateTimeField(source='user.last_check_time', read_only=True)
class Meta: class Meta:
model = Employee model = Employee
exclude = ['face_data'] exclude = ['face_data']
class EmployeeNotWorkRemarkSerializer(ModelSerializer):
class Meta:
model = Employee
fields = ['not_work_remark']
class FaceLoginSerializer(serializers.Serializer): class FaceLoginSerializer(serializers.Serializer):
base64 = serializers.CharField() base64 = serializers.CharField()

View File

@ -2,16 +2,15 @@ from __future__ import absolute_import, unicode_literals
from celery import shared_task from celery import shared_task
from apps.hrm.models import Employee from apps.hrm.models import Employee
from apps.system.models import User
from django.core.cache import cache from django.core.cache import cache
@shared_task @shared_task
def update_all_user_not_atwork(): def update_all_employee_not_atwork():
""" """
将所有员工设为非在岗状态 将所有员工设为非在岗状态
""" """
User.objects.all().update(is_atwork=False, last_check_time = None) Employee.objects.all().update(is_atwork=False, last_check_time = None)
@shared_task @shared_task
def update_all_user_facedata_cache(): def update_all_user_facedata_cache():

View File

@ -1,4 +1,5 @@
from functools import update_wrapper from functools import update_wrapper
from venv import create
from django.shortcuts import render from django.shortcuts import render
from django.utils import timezone from django.utils import timezone
from rest_framework.response import Response from rest_framework.response import Response
@ -8,8 +9,8 @@ from apps.hrm.filters import ClockRecordFilterSet, EmployeeFilterSet
from apps.hrm.services import HRMService from apps.hrm.services import HRMService
from apps.hrm.tasks import update_all_user_facedata_cache from apps.hrm.tasks import update_all_user_facedata_cache
from apps.system.mixins import CreateUpdateModelAMixin, OptimizationMixin from apps.system.mixins import CreateUpdateModelAMixin, OptimizationMixin
from apps.hrm.models import ClockRecord, Employee from apps.hrm.models import ClockRecord, Employee, NotWorkRemark
from apps.hrm.serializers import ClockRecordListSerializer, EmployeeSerializer, FaceClockCreateSerializer, FaceLoginSerializer from apps.hrm.serializers import ClockRecordListSerializer, EmployeeNotWorkRemarkSerializer, EmployeeSerializer, FaceClockCreateSerializer, FaceLoginSerializer
@ -53,6 +54,41 @@ class EmployeeViewSet(CreateUpdateModelAMixin, OptimizationMixin, UpdateModelMix
serializer.save(update_by=request.user) serializer.save(update_by=request.user)
return Response() return Response()
@action(methods=['post'], detail=True, perms_map={'post': 'employee_notworkremark'}
, serializer_class=EmployeeNotWorkRemarkSerializer)
def not_work_remark(self, request, pk=None):
"""
填写离岗说明
"""
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
obj = self.get_object()
if not obj.is_atwork:
remark = request.data.get('not_work_remark', '')
obj.not_work_remark = remark
obj.save()
now_local = timezone.localtime()
instance, created = NotWorkRemark.objects.get_or_create(
year = now_local.year,
month = now_local.month,
day = now_local.day,
user = obj.user,
defaults={
"year":now_local.year,
"month":now_local.month,
"day":now_local.day,
"user":obj.user,
"remark":remark,
"create_by":request.user,
}
)
if not created:
instance.remark = remark
instance.update_by = request.user
instance.save()
return Response()
return Response('无需填写离岗说明', status=status.HTTP_400_BAD_REQUEST)
class ClockRecordViewSet(CreateModelMixin, ListModelMixin, GenericViewSet): class ClockRecordViewSet(CreateModelMixin, ListModelMixin, GenericViewSet):
""" """
@ -92,9 +128,7 @@ class ClockRecordViewSet(CreateModelMixin, ListModelMixin, GenericViewSet):
ins.update_time = now ins.update_time = now
ins.save() ins.save()
# 设为在岗 # 设为在岗
user.is_atwork = True Employee.objects.filter(user=user).update(is_atwork=True, last_check_time=now)
user.last_check_time = now
user.save()
return Response(UserSimpleSerializer(instance=user).data) return Response(UserSimpleSerializer(instance=user).data)
return Response(msg, status=status.HTTP_400_BAD_REQUEST) return Response(msg, status=status.HTTP_400_BAD_REQUEST)
return Response('非打卡时间范围', status=status.HTTP_400_BAD_REQUEST) return Response('非打卡时间范围', status=status.HTTP_400_BAD_REQUEST)
@ -140,9 +174,7 @@ class FaceLogin(CreateAPIView):
}) })
# 设为在岗 # 设为在岗
if created: if created:
user.is_atwork = True Employee.objects.filter(user=user).update(is_atwork=True, last_check_time=now)
user.last_check_time = now
user.save()
return Response({ return Response({
'refresh': str(refresh), 'refresh': str(refresh),

View File

@ -0,0 +1,37 @@
# Generated by Django 3.2.9 on 2022-02-18 07:20
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
import django.utils.timezone
class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('mtm', '0046_alter_recordform_type'),
]
operations = [
migrations.CreateModel(
name='PackItem',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('create_time', models.DateTimeField(default=django.utils.timezone.now, help_text='创建时间', verbose_name='创建时间')),
('update_time', models.DateTimeField(auto_now=True, help_text='修改时间', verbose_name='修改时间')),
('is_deleted', models.BooleanField(default=False, help_text='删除标记', verbose_name='删除标记')),
('name', models.CharField(max_length=100, verbose_name='名称')),
('specification', models.CharField(blank=True, max_length=100, null=True, verbose_name='型号')),
('unit', models.CharField(max_length=10, verbose_name='单位')),
('count', models.PositiveIntegerField(default=1, verbose_name='数量')),
('sort', models.PositiveIntegerField(default=1, verbose_name='序号')),
('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='packitem_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')),
('material', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='mtm.material', verbose_name='关联成品')),
('update_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='packitem_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')),
],
options={
'abstract': False,
},
),
]

View File

@ -1,3 +1,4 @@
from cv2 import meanStdDev
from django.db import models from django.db import models
from django.db.models.base import Model from django.db.models.base import Model
import django.utils.timezone as timezone import django.utils.timezone as timezone
@ -49,6 +50,18 @@ class Material(CommonAModel):
def __str__(self): def __str__(self):
return self.name return self.name
class PackItem(CommonAModel):
"""
装箱项目
"""
material = models.ForeignKey(Material, verbose_name='关联成品',
on_delete=models.CASCADE)
name = models.CharField('名称', max_length=100)
specification = models.CharField('型号', max_length=100, null=True, blank=True)
unit = models.CharField('单位', max_length=10)
count = models.PositiveIntegerField('数量', default=1)
sort = models.PositiveIntegerField('序号', default=1)
class Process(CommonAModel): class Process(CommonAModel):
""" """
工序 工序

View File

@ -3,7 +3,7 @@ from rest_framework import serializers
from rest_framework.exceptions import ParseError, ValidationError from rest_framework.exceptions import ParseError, ValidationError
from utils.mixins import DynamicFieldsSerializerMixin from utils.mixins import DynamicFieldsSerializerMixin
from .models import Material, Process, RecordForm, RecordFormField, Step, SubprodctionMaterial, TechDoc, UsedStep, SubProduction from .models import Material, PackItem, Process, RecordForm, RecordFormField, Step, SubprodctionMaterial, TechDoc, UsedStep, SubProduction
from apps.system.serializers import FileSimpleSerializer, OrganizationSimpleSerializer from apps.system.serializers import FileSimpleSerializer, OrganizationSimpleSerializer
@ -24,6 +24,20 @@ class MaterialDetailSerializer(serializers.ModelSerializer):
objs = Process.objects.filter(subproduction_process__product=obj, subproduction_process__is_deleted=False, is_deleted=False).distinct().order_by('number') objs = Process.objects.filter(subproduction_process__product=obj, subproduction_process__is_deleted=False, is_deleted=False).distinct().order_by('number')
return ProcessSimpleSerializer(instance=objs, many=True).data return ProcessSimpleSerializer(instance=objs, many=True).data
class PackItemSerializer(serializers.ModelSerializer):
class Meta:
model = PackItem
fields = '__all__'
class PackItemCreateSerializer(serializers.ModelSerializer):
class Meta:
model = PackItem
fields = ['material', 'name', 'specification', 'unit', 'count', 'sort']
class PackItemUpdateSerializer(serializers.ModelSerializer):
class Meta:
model = PackItem
fields = ['count', 'sort']
class MaterialSimpleSerializer(serializers.ModelSerializer): class MaterialSimpleSerializer(serializers.ModelSerializer):
class Meta: class Meta:
@ -186,16 +200,32 @@ class RecordFormSerializer(serializers.ModelSerializer):
return queryset return queryset
class RecordFormCreateSerializer(serializers.ModelSerializer): class RecordFormCreateSerializer(serializers.ModelSerializer):
form = serializers.PrimaryKeyRelatedField(
queryset=RecordForm.objects.all(), label="复制表ID", required=False)
class Meta: class Meta:
model = RecordForm model = RecordForm
fields = ['name', 'type', 'step', 'material', 'number', 'enabled'] fields = ['name', 'type', 'step', 'material', 'number', 'enabled', 'form']
# def validate(self, attrs):
# if attrs['enabled']:
# if RecordForm.objects.filter(type=attrs['type'],
# enabled=True).exists():
# raise ValidationError('已存在启用的同类检查表')
# return super().validate(attrs)
class RecordFormUpdateSerializer(serializers.ModelSerializer): class RecordFormUpdateSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = RecordForm model = RecordForm
fields = ['name', 'type', 'number', 'enabled'] fields = ['name', 'type', 'number', 'enabled']
# def validate(self, attrs):
# if attrs['enabled']:
# if RecordForm.objects.filter(type=attrs['type'],
# enabled=True).exists():
# raise ValidationError('已存在启用的同类检查表')
# return super().validate(attrs)
class RecordFormFieldSerializer(serializers.ModelSerializer): class RecordFormFieldSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = RecordFormField model = RecordFormField

View File

@ -1,11 +1,12 @@
from django.db.models import base from django.db.models import base
from rest_framework import urlpatterns from rest_framework import urlpatterns
from apps.mtm.views import InputMaterialViewSet, MaterialViewSet, OtherMaterialViewSet, OutputMaterialViewSet, ProcessViewSet, RecordFormFieldViewSet, RecordFormViewSet, StepViewSet, SubProductionViewSet, TechDocViewSet, UsedStepViewSet from apps.mtm.views import InputMaterialViewSet, MaterialViewSet, OtherMaterialViewSet, OutputMaterialViewSet, PackItemViewSet, ProcessViewSet, RecordFormFieldViewSet, RecordFormViewSet, StepViewSet, SubProductionViewSet, TechDocViewSet, UsedStepViewSet
from django.urls import path, include from django.urls import path, include
from rest_framework.routers import DefaultRouter from rest_framework.routers import DefaultRouter
router = DefaultRouter() router = DefaultRouter()
router.register('material', MaterialViewSet, basename='material') router.register('material', MaterialViewSet, basename='material')
router.register('packitem', PackItemViewSet, basename='packitem')
router.register('process', ProcessViewSet, basename='process') router.register('process', ProcessViewSet, basename='process')
router.register('step', StepViewSet, basename='step') router.register('step', StepViewSet, basename='step')
router.register('subproducation', SubProductionViewSet, basename='subproducation') router.register('subproducation', SubProductionViewSet, basename='subproducation')

View File

@ -3,14 +3,14 @@ from rest_framework.viewsets import ModelViewSet, GenericViewSet
from rest_framework.mixins import CreateModelMixin, ListModelMixin, UpdateModelMixin, RetrieveModelMixin, DestroyModelMixin from rest_framework.mixins import CreateModelMixin, ListModelMixin, UpdateModelMixin, RetrieveModelMixin, DestroyModelMixin
from apps.mtm.filters import MaterialFilterSet, TechDocFilterset from apps.mtm.filters import MaterialFilterSet, TechDocFilterset
from apps.mtm.models import Material, Process, RecordForm, RecordFormField, Step, SubprodctionMaterial, TechDoc, UsedStep, SubProduction from apps.mtm.models import Material, PackItem, Process, RecordForm, RecordFormField, Step, SubprodctionMaterial, TechDoc, UsedStep, SubProduction
from apps.mtm.serializers import InputMaterialSerializer, InputMaterialUpdateSerializer, MaterialDetailSerializer, MaterialSerializer, MaterialSimpleSerializer, OtherMaterialSerializer, OutputMaterialSerializer, OutputMaterialUpdateSerializer, ProcessSerializer, RecordFormCreateSerializer, RecordFormDetailSerializer, RecordFormFieldCreateSerializer, RecordFormFieldSerializer, RecordFormFieldUpdateSerializer, RecordFormSerializer, RecordFormUpdateSerializer, StepDetailSerializer, StepSerializer, SubProductionCreateUpdateSerializer, SubProductionSerializer, SubprodctionMaterialListSerializer, TechDocCreateSerializer, TechDocListSerializer, TechDocUpdateSerializer, UsedStepCreateSerializer, UsedStepListSerializer, UsedStepUpdateSerializer from apps.mtm.serializers import InputMaterialSerializer, InputMaterialUpdateSerializer, MaterialDetailSerializer, MaterialSerializer, MaterialSimpleSerializer, OtherMaterialSerializer, OutputMaterialSerializer, OutputMaterialUpdateSerializer, PackItemCreateSerializer, PackItemUpdateSerializer, ProcessSerializer, RecordFormCreateSerializer, RecordFormDetailSerializer, RecordFormFieldCreateSerializer, RecordFormFieldSerializer, RecordFormFieldUpdateSerializer, RecordFormSerializer, RecordFormUpdateSerializer, StepDetailSerializer, StepSerializer, SubProductionCreateUpdateSerializer, SubProductionSerializer, SubprodctionMaterialListSerializer, TechDocCreateSerializer, TechDocListSerializer, TechDocUpdateSerializer, UsedStepCreateSerializer, UsedStepListSerializer, UsedStepUpdateSerializer
from apps.system.mixins import CreateUpdateModelAMixin, OptimizationMixin from apps.system.mixins import CreateUpdateModelAMixin, OptimizationMixin
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 utils.pagination import PageOrNot from utils.pagination import PageOrNot
from rest_framework.exceptions import APIException from rest_framework.exceptions import APIException
from django.db import transaction
# Create your views here. # Create your views here.
class MaterialViewSet(PageOrNot, CreateUpdateModelAMixin, ModelViewSet): class MaterialViewSet(PageOrNot, CreateUpdateModelAMixin, ModelViewSet):
@ -31,6 +31,25 @@ class MaterialViewSet(PageOrNot, CreateUpdateModelAMixin, ModelViewSet):
return MaterialDetailSerializer return MaterialDetailSerializer
return MaterialSerializer return MaterialSerializer
class PackItemViewSet(CreateUpdateModelAMixin, ModelViewSet):
"""
装箱项目-增删改查
"""
perms_map = {'get': '*', 'post': 'packitem_create',
'put': 'packitem_update', 'delete': 'packitem_delete'}
queryset = PackItem.objects.all()
serializer_class = MaterialSerializer
search_fields = ['name', 'number']
filterset_fields = ['material']
ordering = ['sort']
def get_serializer_class(self):
if self.action == 'create':
return PackItemCreateSerializer
elif self.action == 'update':
return PackItemUpdateSerializer
return super().get_serializer_class()
class ProcessViewSet(PageOrNot, CreateUpdateModelAMixin, ModelViewSet): class ProcessViewSet(PageOrNot, CreateUpdateModelAMixin, ModelViewSet):
""" """
@ -186,6 +205,23 @@ class RecordFormViewSet(OptimizationMixin, CreateUpdateModelAMixin, ModelViewSet
serializer = self.serializer_class(instance=RecordFormField.objects.filter(form=instance, is_deleted=False), many=True) serializer = self.serializer_class(instance=RecordFormField.objects.filter(form=instance, is_deleted=False), many=True)
return Response(serializer.data) return Response(serializer.data)
@transaction.atomic
def create(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
vdata = serializer.validated_data
form = vdata.pop('form', None)
instance = RecordForm(**vdata)
instance.create_by = request.user
instance.save()
if form:
for i in RecordFormField.objects.filter(form=form, is_deleted=False):
i.pk = None
i.form = instance
i.parent = None
i.save()
return Response()

View File

@ -0,0 +1,23 @@
# Generated by Django 3.2.9 on 2022-02-17 07:24
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('pm', '0023_alter_productionplan_order'),
]
operations = [
migrations.AddField(
model_name='productionplan',
name='old_state',
field=models.PositiveIntegerField(blank=True, choices=[(10, '制定中'), (20, '已下达'), (30, '已接收'), (40, '生产中'), (50, '生产完成'), (60, '军检完成'), (70, '暂停'), (80, '终止')], null=True, verbose_name='原状态'),
),
migrations.AlterField(
model_name='productionplan',
name='state',
field=models.PositiveIntegerField(choices=[(10, '制定中'), (20, '已下达'), (30, '已接收'), (40, '生产中'), (50, '生产完成'), (60, '军检完成'), (70, '暂停'), (80, '终止')], default=10, verbose_name='状态'),
),
]

View File

@ -20,13 +20,17 @@ class ProductionPlan(CommonAModel):
PLAN_STATE_WORKING = 40 PLAN_STATE_WORKING = 40
PLAN_STATE_DONE = 50 PLAN_STATE_DONE = 50
PLAN_MTEST_DONE = 60 PLAN_MTEST_DONE = 60
PLAN_STATE_PAUSE = 70
PLAN_STATE_STOP = 80
state_choices=( state_choices=(
(PLAN_STATE_PLANING, '制定中'), (PLAN_STATE_PLANING, '制定中'),
(PLAN_STATE_ASSGINED, '已下达'), (PLAN_STATE_ASSGINED, '已下达'),
(PLAN_STATE_ACCEPTED, '已接收'), (PLAN_STATE_ACCEPTED, '已接收'),
(PLAN_STATE_WORKING, '生产中'), (PLAN_STATE_WORKING, '生产中'),
(PLAN_STATE_DONE, '生产完成'), (PLAN_STATE_DONE, '生产完成'),
(PLAN_MTEST_DONE, '军检完成') (PLAN_MTEST_DONE, '军检完成'),
(PLAN_STATE_PAUSE, '暂停'),
(PLAN_STATE_STOP, '终止')
) )
number = models.CharField('编号', max_length=50, unique=True) number = models.CharField('编号', max_length=50, unique=True)
order = models.ForeignKey(Order, verbose_name='关联订单', null=True, blank=True, on_delete=models.SET_NULL, related_name='plan_order') order = models.ForeignKey(Order, verbose_name='关联订单', null=True, blank=True, on_delete=models.SET_NULL, related_name='plan_order')
@ -41,6 +45,7 @@ class ProductionPlan(CommonAModel):
end_date = models.DateField('计划完工日期') end_date = models.DateField('计划完工日期')
process_json = models.JSONField('按工序的统计数', default=dict, null=True, blank=True) process_json = models.JSONField('按工序的统计数', default=dict, null=True, blank=True)
is_planed = models.BooleanField('是否已排产', default=False) is_planed = models.BooleanField('是否已排产', default=False)
old_state = models.PositiveIntegerField('原状态', choices=state_choices, null=True, blank=True)
class Meta: class Meta:
verbose_name = '生产计划' verbose_name = '生产计划'
verbose_name_plural = verbose_name verbose_name_plural = verbose_name
@ -62,7 +67,7 @@ class SubProductionPlan(CommonAModel):
(SUBPLAN_STATE_ASSGINED, '已下达'), (SUBPLAN_STATE_ASSGINED, '已下达'),
(SUBPLAN_STATE_ACCEPTED, '已接收'), (SUBPLAN_STATE_ACCEPTED, '已接收'),
(SUBPLAN_STATE_WORKING, '生产中'), (SUBPLAN_STATE_WORKING, '生产中'),
(SUBPLAN_STATE_DONE, '已完成') (SUBPLAN_STATE_DONE, '已完成'),
) )
number = models.CharField('子计划编号', max_length=50, unique=True, null=True, blank=True) number = models.CharField('子计划编号', max_length=50, unique=True, null=True, blank=True)
production_plan = models.ForeignKey(ProductionPlan, verbose_name='关联主生产计划', on_delete=models.CASCADE, related_name='subplan_plan') production_plan = models.ForeignKey(ProductionPlan, verbose_name='关联主生产计划', on_delete=models.CASCADE, related_name='subplan_plan')
@ -91,15 +96,15 @@ class SubProductionPlan(CommonAModel):
verbose_name = '子生产计划' verbose_name = '子生产计划'
verbose_name_plural = verbose_name verbose_name_plural = verbose_name
class FirstItem(BaseModel): # class FirstItem(BaseModel):
""" # """
首件确认表记录条目 # 首件确认表记录条目
""" # """
form_field = models.ForeignKey(RecordFormField, verbose_name='关联自定义表格字段', on_delete=models.CASCADE) # form_field = models.ForeignKey(RecordFormField, verbose_name='关联自定义表格字段', on_delete=models.CASCADE)
field_value = models.JSONField('录入值', null=True, blank=True) # field_value = models.JSONField('录入值', null=True, blank=True)
is_hidden = models.BooleanField('是否隐藏', default=False) # is_hidden = models.BooleanField('是否隐藏', default=False)
is_testok = models.BooleanField('是否合格', null=True, blank=True) # is_testok = models.BooleanField('是否合格', null=True, blank=True)
subproduction_plan = models.ForeignKey(SubProductionPlan, verbose_name='关联的子计划', on_delete=models.CASCADE, related_name='item_test_record') # subproduction_plan = models.ForeignKey(SubProductionPlan, verbose_name='关联的子计划', on_delete=models.CASCADE, related_name='item_test_record')
class SubProductionProgress(BaseModel): class SubProductionProgress(BaseModel):
""" """

View File

@ -16,7 +16,7 @@ from apps.pm.models import ProductionPlan, SubProductionProgress, SubProductionP
from rest_framework.viewsets import GenericViewSet, ModelViewSet from rest_framework.viewsets import GenericViewSet, ModelViewSet
from django.shortcuts import render from django.shortcuts import render
from apps.sam.models import Order from apps.sam.models import Order
from rest_framework.exceptions import APIException from rest_framework.exceptions import APIException, ParseError
from rest_framework.response import Response from rest_framework.response import Response
from rest_framework.decorators import action from rest_framework.decorators import action
from django.db.models import F from django.db.models import F
@ -86,6 +86,8 @@ class ProductionPlanViewSet(CreateUpdateModelAMixin, ListModelMixin, CreateModel
production_plan=self.get_object() production_plan=self.get_object()
if production_plan.is_planed: if production_plan.is_planed:
raise APIException('已生成子计划') raise APIException('已生成子计划')
if production_plan.state != ProductionPlan.PLAN_STATE_PLANING:
raise APIException('不可操作')
subps = SubProduction.objects.filter(product=production_plan.product).order_by('process__number') subps = SubProduction.objects.filter(product=production_plan.product).order_by('process__number')
for index, i in enumerate(subps): for index, i in enumerate(subps):
steps = Step.objects.filter(usedstep__subproduction=i, usedstep__subproduction__is_deleted=False, steps = Step.objects.filter(usedstep__subproduction=i, usedstep__subproduction__is_deleted=False,
@ -101,10 +103,43 @@ class ProductionPlanViewSet(CreateUpdateModelAMixin, ListModelMixin, CreateModel
is_main=m.is_main, is_main=m.is_main,
count=m.count*production_plan.count, subproduction_plan=instance) count=m.count*production_plan.count, subproduction_plan=instance)
production_plan.is_planed=True production_plan.is_planed=True
production_plan.state = ProductionPlan.PLAN_STATE_PLANING
production_plan.save() production_plan.save()
return Response() return Response()
@action(methods=['put'], detail=True, perms_map={'post':'plan_toggle'}, serializer_class=serializers.Serializer)
@transaction.atomic
def toggle(self, request, pk=None):
"""
计划暂停或启动
"""
plan = self.get_object()
if plan.state == ProductionPlan.PLAN_STATE_PAUSE:
plan.state = plan.old_state
plan.old_state = None
plan.save()
return Response()
elif plan.state <= ProductionPlan.PLAN_STATE_WORKING:
plan.old_state = plan.state
plan.state = ProductionPlan.PLAN_STATE_PAUSE
plan.save()
return Response()
raise APIException('不可操作')
@action(methods=['put'], detail=True, perms_map={'post':'plan_stop'}, serializer_class=serializers.Serializer)
@transaction.atomic
def stop(self, request, pk=None):
"""
计划终止
"""
plan = self.get_object()
if plan.state == ProductionPlan.PLAN_STATE_PAUSE:
plan.state = ProductionPlan.PLAN_STATE_STOP
plan.save()
return Response()
raise APIException('不可操作')
class SubProductionPlanViewSet(CreateUpdateModelAMixin, ListModelMixin, UpdateModelMixin, GenericViewSet): class SubProductionPlanViewSet(CreateUpdateModelAMixin, ListModelMixin, UpdateModelMixin, GenericViewSet):
""" """
子生产计划-列表/修改 子生产计划-列表/修改
@ -167,6 +202,7 @@ class SubProductionPlanViewSet(CreateUpdateModelAMixin, ListModelMixin, UpdateMo
return Response() return Response()
raise APIException('计划状态有误') raise APIException('计划状态有误')
@action(methods=['get'], detail=True, perms_map={'get':'*'}, serializer_class=serializers.Serializer) @action(methods=['get'], detail=True, perms_map={'get':'*'}, serializer_class=serializers.Serializer)
def pick_need_(self, request, pk=None): def pick_need_(self, request, pk=None):
""" """

View File

@ -7,4 +7,4 @@ class UserFilter(DynamicFieldsFilterMixin, filters.FilterSet):
name = filters.CharFilter(field_name='name', lookup_expr='contains') name = filters.CharFilter(field_name='name', lookup_expr='contains')
class Meta: class Meta:
model = User model = User
fields = ['name', 'is_active', 'is_atwork'] fields = ['name', 'is_active']

View File

@ -1,18 +0,0 @@
# Generated by Django 3.2.9 on 2022-01-21 05:41
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('system', '0003_auto_20210812_0909'),
]
operations = [
migrations.AddField(
model_name='user',
name='is_atwork',
field=models.BooleanField(default=False, verbose_name='当前在岗'),
),
]

View File

@ -1,18 +0,0 @@
# Generated by Django 3.2.9 on 2022-01-25 08:51
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('system', '0004_user_is_atwork'),
]
operations = [
migrations.AddField(
model_name='user',
name='last_check_time',
field=models.DateTimeField(blank=True, null=True, verbose_name='打卡时间'),
),
]

View File

@ -116,8 +116,6 @@ class User(AbstractUser):
superior = models.ForeignKey( superior = models.ForeignKey(
'self', null=True, blank=True, on_delete=models.SET_NULL, verbose_name='上级主管') 'self', null=True, blank=True, on_delete=models.SET_NULL, verbose_name='上级主管')
roles = models.ManyToManyField(Role, blank=True, verbose_name='角色') roles = models.ManyToManyField(Role, blank=True, verbose_name='角色')
is_atwork = models.BooleanField('当前在岗', default=False)
last_check_time = models.DateTimeField('打卡时间', null=True, blank=True)
class Meta: class Meta:
verbose_name = '用户信息' verbose_name = '用户信息'

View File

@ -144,7 +144,7 @@ class UserListSerializer(DynamicFieldsSerializerMixin, serializers.ModelSerializ
fields = ['id', 'name', 'phone', 'email', 'position', fields = ['id', 'name', 'phone', 'email', 'position',
'username', 'is_active', 'date_joined', 'username', 'is_active', 'date_joined',
'dept_', 'dept', 'roles', 'avatar', 'dept_', 'dept', 'roles', 'avatar',
'roles_', 'is_atwork', 'last_check_time'] 'roles_']
@staticmethod @staticmethod
def setup_eager_loading(queryset): def setup_eager_loading(queryset):

View File

@ -6,7 +6,7 @@ from apps.inm.models import FIFO, FIFOItem, FIFOItemProduct
from apps.inm.services import InmService from apps.inm.services import InmService
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 ProductionPlan, SubProductionPlan, SubProductionProgress
from apps.pm.serializers import SubProductionPlanListSerializer, 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
@ -35,7 +35,7 @@ from rest_framework import exceptions, serializers
from apps.wpm.services import WpmService from apps.wpm.services import WpmService
from django.utils import timezone from django.utils import timezone
from rest_framework import status from rest_framework import status
from django.db.models import Count from django.db.models import Count, Q
from utils.tools import ranstr from utils.tools import ranstr
@ -49,7 +49,11 @@ class WPlanViewSet(ListModelMixin, GenericViewSet):
""" """
perms_map = {'get': '*'} perms_map = {'get': '*'}
queryset = SubProductionPlan.objects.select_related( queryset = SubProductionPlan.objects.select_related(
'process', 'workshop', 'subproduction', 'product').exclude(state=0) 'process', 'workshop', 'subproduction', 'product').filter(
production_plan__state__in =[
ProductionPlan.PLAN_STATE_WORKING, ProductionPlan.PLAN_STATE_ASSGINED
]
)
search_fields = [] search_fields = []
serializer_class = SubProductionPlanListSerializer serializer_class = SubProductionPlanListSerializer
filterset_fields = ['production_plan', filterset_fields = ['production_plan',
@ -57,6 +61,7 @@ class WPlanViewSet(ListModelMixin, GenericViewSet):
ordering_fields = [] ordering_fields = []
ordering = ['-update_time'] ordering = ['-update_time']
@action(methods=['post', 'get'], detail=True, perms_map={'post': 'pick_half', 'get': '*'}, serializer_class=PickHalfsSerializer) @action(methods=['post', 'get'], detail=True, perms_map={'post': 'pick_half', 'get': '*'}, serializer_class=PickHalfsSerializer)
@transaction.atomic @transaction.atomic
def pick_half(self, request, pk=None): def pick_half(self, request, pk=None):
@ -116,6 +121,10 @@ class WPlanViewSet(ListModelMixin, GenericViewSet):
pw.save() pw.save()
sp.is_picked = True sp.is_picked = True
sp.save() sp.save()
if sp.production_plan.state in \
[ProductionPlan.PLAN_STATE_ASSGINED, ProductionPlan.PLAN_STATE_ACCEPTED]:
sp.production_plan.state = ProductionPlan.PLAN_STATE_WORKING
sp.production_plan.save()
return Response() return Response()

View File

@ -59,8 +59,9 @@ class FitJSONRenderer(JSONRenderer):
if isinstance(data, dict): if isinstance(data, dict):
prefix = list(data.keys())[0] prefix = list(data.keys())[0]
data = data[prefix] data = data[prefix]
elif isinstance(data, list): if isinstance(data, list):
data = data[0] data = data[0]
response_body.msg = prefix + ":" + str(data) # 取一部分放入msg,方便前端alert response_body.msg = prefix + ":" + str(data) # 取一部分放入msg,方便前端alert
else: else:
response_body.data = data response_body.data = data