Browse Source

2024-02-20 测试申请产品结构,工艺路线,属性

master
zelian_wu 2 years ago
parent
commit
391044ae9d
  1. 2
      src/api/base/properties.js
  2. 1
      src/api/part/umInformation.js
  3. 2
      src/views/modules/quotation/sellForQuotation/quotationDetail.vue
  4. 49
      src/views/modules/test/requestForTest.vue
  5. 354
      src/views/modules/test/testSoAttribute/testAttribute.vue
  6. 152
      src/views/modules/test/testSoBom/testTable.vue
  7. 278
      src/views/modules/test/testSoRouting/testRoutingTable.vue

2
src/api/base/properties.js

@ -2,6 +2,7 @@ import { createAPI } from "@/utils/httpRequest.js";
export const propertiesItemSearch = data => createAPI(`/properties/propertiesItemSearch`,'post',data)
export const propertiesItemList = data => createAPI(`/properties/propertiesItemList`,'get',data)
export const propertiesList = data => createAPI(`/properties/propertiesList`,'get',data)
export const propertiesAvailableList = data => createAPI(`/properties/propertiesAvailableList`,'get',data)
export const propertiesItemSave = data => createAPI(`/properties/propertiesItemSave`,'post',data)
export const propertiesItemEdit = data => createAPI(`/properties/propertiesItemEdit`,'post',data)
@ -12,6 +13,7 @@ export const propertiesModelSave = data => createAPI(`/properties/propertiesMode
export const propertiesModelEdit = data => createAPI(`/properties/propertiesModelEdit`,'post',data)
export const propertiesModelDelete = data => createAPI(`/properties/propertiesModelDelete`,'post',data)
export const searchModalDetails = data => createAPI(`/properties/searchModalDetails`,'post',data)
export const partPropertiesList = data => createAPI(`/properties/partPropertiesList`,'get',data)
export const saveModalDetails = data => createAPI(`/properties/saveModalDetails`,'post',data)
export const deleteModalDetails = data => createAPI(`/properties/deleteModalDetails`,'post',data) // 多选删除
export const getItemLists = data => createAPI(`/properties/getItemLists`,'post',data)

1
src/api/part/umInformation.js

@ -13,6 +13,7 @@ export const umInformationSearch = data => createAPI(`/plm/umInformation/umInfor
* @returns {*}
*/
export const searchUmInformationList = data =>createAPI(`/plm/umInformation/searchUmInformationList`,'get',data);
export const searchAllUmInformationList = data =>createAPI(`/plm/umInformation/searchAllUmInformationList`,'get',data);
/**
* 单位信息新增
* @param data

2
src/views/modules/quotation/sellForQuotation/quotationDetail.vue

@ -1350,6 +1350,8 @@
<el-option label="全部" value=""></el-option>
<el-option label="A" value="A"></el-option>
<el-option label="B" value="B"></el-option>
<el-option label="IP" value="IP"></el-option>
<el-option label="MP" value="MP"></el-option>
<el-option label="BM" value="BM"></el-option>
</el-select>
</el-form-item>

49
src/views/modules/test/requestForTest.vue

@ -121,7 +121,7 @@
width="100"
label="操作">
<template slot-scope="scope">
<a type="text" size="small" @click="updateModal(scope.row)">编辑</a>
<a type="text" size="small" style="cursor:pointer;" @click="updateModal(scope.row)">编辑</a>
</template>
</el-table-column>
</el-table>
@ -304,11 +304,14 @@
</el-table>
</el-tab-pane>
<el-tab-pane label="产品结构" :disabled="!activeTabList.includes('product')" name="product">
<test-table v-if="clickTestRow" ref="dialogSoBom" v-model:data-list="testSoBomList" :test-no="modalData.testNo"></test-table>
<test-table v-if="clickTestRow" :test-number="modalData.testNumber" ref="dialogSoBom" v-model:data-list="testSoBomList" :test-no="modalData.testNo"></test-table>
</el-tab-pane>
<el-tab-pane label="工艺路线" :disabled="!activeTabList.includes('process')" name="process">
<test-routing-table v-if="clickTestRow" ref="dialogSoRouting" v-model:data-list="testSoRoutingList" :test-no="modalData.testNo"></test-routing-table>
</el-tab-pane>
<el-tab-pane label="属性" :disabled="!activeTabList.includes('attribute')" name="attribute">
<test-attribute v-if="modalFlag" :attribute-list="attributeList" ref="dialogAttribute" :test-no="modalData.testNo"></test-attribute>
</el-tab-pane>
</el-tabs>
</div>
<el-footer style="height:30px;text-align:center;margin-top: 8px">
@ -583,11 +586,14 @@
</el-form>
</el-tab-pane>
<el-tab-pane label="产品结构" name="test_so_bom" style="padding: 5px">
<test-table ref="tabSoBom" :data-list="testSoBomList" :test-no="testCurrentRow.testNo" :height="500" v-model:data-list="testSoBomList"></test-table>
<test-table ref="tabSoBom" :test-number="testCurrentRow.testNumber" :data-list="testSoBomList" :test-no="testCurrentRow.testNo" :height="500" v-model:data-list="testSoBomList"></test-table>
</el-tab-pane>
<el-tab-pane label="工艺路线" name="test_so_routing" style="padding: 5px">
<test-routing-table ref="tabSoBom" :test-no="testCurrentRow.testNo" v-model:data-list="testSoRoutingList" :height="500" ></test-routing-table>
</el-tab-pane>
<el-tab-pane label="属性" name="test_attribute" style="padding: 5px">
<test-attribute ref="tabAttribute" :attribute-list="attributeList" :test-no="testCurrentRow.testNo" :height="500"></test-attribute>
</el-tab-pane>
<!-- 项目信息页签 -->
<el-tab-pane label="项目信息" name="project_information">
<el-form label-position="top" :model="projectInformationData" style="margin-left: 10px;margin-top: 5px;margin-right: 10px">
@ -863,7 +869,7 @@
</el-tabs>
<!-- chooseList模态框 -->
<Chooselist ref="baseList" @getBaseData="getBaseData"></Chooselist>
<choose-list ref="baseList" @getBaseData="getBaseData"></choose-list>
<!-- 上传文件的modal -->
<testUploadFile ref="testUploadFile" @refreshPageTables="getFileContentData()" v-drag></testUploadFile>
@ -890,7 +896,7 @@
downLoadQuotationFile, //
searchProjectInfoList
} from '@/api/quotation/quotationInformation.js'
import Chooselist from '@/views/modules/common/Chooselist'
import ChooseList from '@/views/modules/common/Chooselist'
import testUploadFile from "./test_upload_file"
import DictDataSelect from "../sys/dict-data-select.vue";
import {
@ -902,12 +908,16 @@
import TestTable from "./testSoBom/testTable.vue";
import TestRoutingTable from "./testSoRouting/testRoutingTable.vue";
import {selectTestSoRoutingList} from "../../../api/test/testSoRouting";
import TestAttribute from "./testSoAttribute/testAttribute.vue";
import {partPropertiesList} from "../../../api/base/properties";
export default {
name:"test",
components: {
TestAttribute,
TestRoutingTable,
TestTable,
DictDataSelect,
Chooselist,
ChooseList,
testUploadFile
},
watch: {
@ -929,6 +939,7 @@
},
data () {
return {
attributeList:[],
testSoRoutingList:[],
testSoBomList:[],
activeTab:'part',
@ -973,7 +984,7 @@
// ======== ========
modalData: {
flag: '1',
title: '测试新增',
title: '测试申请',
site: this.$store.state.user.site,
testNo: '',
customerNo: '',
@ -1966,7 +1977,7 @@
updateModal (row) {
this.modalData = {
flag: '2',
title: '测试编辑',
title: '测试申请',
site: row.site,
testNo: row.testNo,
customerNo: row.customerNo,
@ -2003,7 +2014,7 @@
nextToDo: row.nextToDo,
updateBy: this.$store.state.user.name
}
this.activeTabList = ['part','product','process']
this.activeTabList = ['part','product','process','attribute']
this.$nextTick(()=>{
this.$refs.dialogSoBom.clearTable();
})
@ -2138,7 +2149,7 @@
testInformationSave(this.modalData).then(({data}) => {
if (data && data.code === 0) {
this.getDataList();
this.activeTabList = ['part','product','process']
this.activeTabList = ['part','product','process','attribute']
this.activeTab = 'product'
this.modalData.testNo = data.row
// this.modalFlag = false
@ -2219,6 +2230,7 @@
if (row){
this.selectTestSoBom()
this.selectTestSoRoutingList()
this.getPartPropertiesList();
}
},
/**
@ -2583,7 +2595,7 @@
this.$refs.modalForm.resetFields();
this.modalData = {
flag: '1',
title: '测试新增',
title: '测试申请',
site: this.$store.state.user.site,
testNo: '',
customerNo: '',
@ -2690,6 +2702,21 @@
}
})
},
getPartPropertiesList(){
let params = {
site:this.$store.state.user.site,
testPartNo: this.testCurrentRow.testPartNo
}
partPropertiesList(params).then(({data})=>{
if (data && data.code === 0){
this.attributeList = data.rows
}else {
this.$message.warning(data.msg)
}
}).catch((error)=>{
this.$message.error(error)
})
}
}
}
</script>

354
src/views/modules/test/testSoAttribute/testAttribute.vue

@ -0,0 +1,354 @@
<script>
import {propertiesList,searchModalDetails,partPropertiesList} from "../../../../api/base/properties";
export default {
name: "testAttribute",
props:{
testNo:{
type:String,
},
height:{
type: Number,
default:300
},
attributeList:{
type:Array
}
},
data(){
return{
propertiesDialog:false,//
attributeDialog:false,//
templateSearchData:{
site:this.$store.state.user.site,
codeNo:undefined,
codeDesc:undefined,
functionType:'IP',
},//
currentRow:{},
templateList:[],//
propertiesList:[], //
attributeColumnList: [
{
userId: this.$store.state.user.name,
functionId: 100002001,
serialNumber: '100002001TableValueType',
tableId: "100002001Table",
tableName: "模板表",
columnProp: 'codeNo',
headerAlign: "center",
align: "center",
columnLabel: '模板编码',
columnHidden: false,
columnImage: false,
columnSortable: false,
sortLv: 0,
status: true,
fixed: '',
}, {
userId: this.$store.state.user.name,
functionId: 100002001,
serialNumber: '100002001TableValueType',
tableId: "100002001Table",
tableName: "模板表",
columnProp: 'codeDesc',
headerAlign: "center",
align: "center",
columnLabel: '模板名称',
columnHidden: false,
columnImage: false,
columnSortable: false,
sortLv: 0,
status: true,
fixed: '',
}, {
userId: this.$store.state.user.name,
functionId: 100002001,
serialNumber: '100002001TableValueType',
tableId: "100002001Table",
tableName: "模板表",
columnProp: 'functionType',
headerAlign: "center",
align: "center",
columnLabel: '模板类型',
columnHidden: false,
columnImage: false,
columnSortable: false,
sortLv: 0,
status: true,
fixed: '',
},
],
productColumnList: [
{
userId: this.$store.state.user.name,
functionId: 100002001,
serialNumber: '100002001TableValueType',
tableId: "100002001Table",
tableName: "属性表",
columnProp: 'itemNo',
headerAlign: "center",
align: "center",
columnLabel: '属性编码',
columnHidden: false,
columnImage: false,
columnSortable: false,
sortLv: 0,
status: true,
fixed: '',
},
{
userId: this.$store.state.user.name,
functionId: 100002001,
serialNumber: '100002001TableValueType',
tableId: "100002001Table",
tableName: "属性表",
columnProp: 'itemDesc',
headerAlign: "center",
align: "center",
columnLabel: '属性名称',
columnHidden: false,
columnImage: false,
columnSortable: false,
sortLv: 0,
status: true,
fixed: '',
},
{
userId: this.$store.state.user.name,
functionId: 100002001,
serialNumber: '100002001TableValueType',
tableId: "100002001Table",
tableName: "属性表",
columnProp: 'valueType',
headerAlign: "center",
align: "center",
columnLabel: '值类型',
columnHidden: false,
columnImage: false,
columnSortable: false,
sortLv: 0,
status: true,
fixed: '',
},
{
userId: this.$store.state.user.name,
functionId: 100002001,
serialNumber: '100002001TableDefaultValue',
tableId: "100002001Table",
tableName: "属性表",
columnProp: 'defaultValue',
headerAlign: "center",
align: "right",
columnLabel: '参照值',
columnHidden: false,
columnImage: false,
columnSortable: false,
sortLv: 0,
status: true,
fixed: '',
},
{
userId: this.$store.state.user.name,
functionId: 100002001,
serialNumber: '100002001TableMaxValue',
tableId: "100002001Table",
tableName: "属性表",
columnProp: 'maxValue',
headerAlign: "center",
align: "right",
columnLabel: '最大值',
columnHidden: false,
columnImage: false,
columnSortable: false,
sortLv: 0,
status: true,
fixed: '',
},
{
userId: this.$store.state.user.name,
functionId: 100002001,
serialNumber: '100002001TableMinValue',
tableId: "100002001Table",
tableName: "属性表",
columnProp: 'minValue',
headerAlign: "center",
align: "right",
columnLabel: '最小值',
columnHidden: false,
columnImage: false,
columnSortable: false,
sortLv: 0,
status: true,
fixed: '',
},
{
userId: this.$store.state.user.name,
functionId: 100002001,
serialNumber: '100002001TableValueChooseFlag',
tableId: "100002001Table",
tableName: "属性表",
columnProp: 'valueChooseFlag',
headerAlign: "center",
align: "center",
columnLabel: '是否值可选',
columnHidden: false,
columnImage: false,
columnSortable: false,
sortLv: 0,
status: true,
fixed: '',
},
],
}
},
methods:{
attributeSearch(){
this.templateList = [];
this.currentRow = {};
propertiesList(this.templateSearchData).then(({data})=>{
if (data && data.code === 0){
this.templateList = data.data;
}else {
this.$message.warning(data.msg)
}
}).catch((error)=>{
this.$message.error(error)
})
},
openAttribute(row){
this.propertiesList = [];
this.propertiesDialog = true;
searchModalDetails(row).then(({data})=>{
if (data && data.code === 0){
this.propertiesList = data.rows
}else {
this.$message.warning(data.msg)
}
}).catch((error)=>{
this.$message.error(error)
})
},
openAttributeDialog(){
this.attributeSearch()
},
rowStyle({row}){
if (this.currentRow.codeNo === row.codeNo) {
return { 'background-color': '#84f5e9', cursor: 'pointer' };
}
return { 'background-color': '#ffffff', cursor: 'pointer' };
},
clickRow(row){
this.currentRow = {...row}
this.attributeDialog = false
},
closeAttributeDialog(){
this.currentRow = {}
this.propertiesList = [];
this.templateList = [];
this.propertiesDialog = false;
this.templateSearchData={
site:this.$store.state.user.site,
codeNo:undefined,
codeDesc:undefined,
functionType:'IP',
};
},
},
}
</script>
<template>
<div>
<el-button type="primary" @click="attributeDialog = true" v-if="false">选择模板</el-button>
<el-table
:height="height"
:data="attributeList"
border
style="width: 100%;margin-top: 5px">
<el-table-column
v-for="(item,index) in productColumnList" :key="index"
:sortable="item.columnSortable"
:prop="item.columnProp"
:header-align="item.headerAlign"
:show-overflow-tooltip="item.showOverflowTooltip"
:align="item.align"
:fixed="item.fixed===''?false:item.fixed"
:min-width="item.columnWidth"
:label="item.columnLabel">
<template slot-scope="scope">
<span v-if="!item.columnHidden">{{ scope.row[item.columnProp] }}</span>
<span v-if="item.columnImage"><img :src="scope.row[item.columnProp]" style="width: 100px; height: 80px"/></span>
</template>
</el-table-column>
</el-table>
<el-dialog title="模板列表" append-to-body v-drag :visible.sync="attributeDialog" @open="openAttributeDialog" @close="closeAttributeDialog" width="40%">
<el-form :inline="true" label-position="top" ref="searchTemplateForm" :model="templateSearchData">
<el-form-item label="模板编码">
<el-input v-model="templateSearchData.codeNo" clearable></el-input>
</el-form-item>
<el-form-item label="模板名称">
<el-input v-model="templateSearchData.codeDesc" clearable></el-input>
</el-form-item>
<el-form-item label=" ">
<el-button type="primary" @click="attributeSearch"> </el-button>
</el-form-item>
</el-form>
<el-table
height="400"
:data="templateList"
border :row-style="{cursor:'pointer'}"
@row-dblclick="clickRow"
style="width: 100%;margin-top: 10px">
<el-table-column
v-for="(item,index) in attributeColumnList" :key="index"
:sortable="item.columnSortable"
:prop="item.columnProp"
:header-align="item.headerAlign"
:show-overflow-tooltip="item.showOverflowTooltip"
:align="item.align"
:fixed="item.fixed===''?false:item.fixed"
:min-width="item.columnWidth"
:label="item.columnLabel">
<template slot-scope="scope">
<span v-if="!item.columnHidden">{{ scope.row[item.columnProp] }}</span>
<span v-if="item.columnImage"><img :src="scope.row[item.columnProp]" style="width: 100px; height: 80px"/></span>
</template>
</el-table-column>
<el-table-column label="操作" align="center">
<template slot-scope="{row,$index}">
<el-link style="cursor:pointer;" @click="openAttribute(row)">详情</el-link>
</template>
</el-table-column>
</el-table>
</el-dialog>
<el-dialog title="属性列表" append-to-body top="17vh" v-drag :visible.sync="propertiesDialog" width="40%">
<el-table
height="400"
:data="propertiesList"
border
style="width: 100%;margin-top: 10px">
<el-table-column
v-for="(item,index) in productColumnList" :key="index"
:sortable="item.columnSortable"
:prop="item.columnProp"
:header-align="item.headerAlign"
:show-overflow-tooltip="item.showOverflowTooltip"
:align="item.align"
:fixed="item.fixed==''?false:item.fixed"
:min-width="item.columnWidth"
:label="item.columnLabel">
<template slot-scope="scope">
<span v-if="!item.columnHidden">{{ scope.row[item.columnProp] }}</span>
<span v-if="item.columnImage"><img :src="scope.row[item.columnProp]" style="width: 100px; height: 80px"/></span>
</template>
</el-table-column>
</el-table>
<div style="width: 100%;height: 20px"></div>
</el-dialog>
</div>
</template>
<style scoped>
</style>

152
src/views/modules/test/testSoBom/testTable.vue

@ -8,6 +8,8 @@ import {
} from "../../../../api/test/testSoBom";
import {searchPart, searchPartList} from '@/api/part/partInformation.js';
import numberInput from "../../common/numberInput.vue";
import {searchAllUmInformationList} from "../../../../api/part/umInformation";
import {Decimal} from "decimal.js";
export default {
name: "testTable",
components:{
@ -20,7 +22,9 @@ export default {
},
testNo:{
type:String,
required:true
},
testNumber:{
type:[String,Number],
},
columnList:{
type: Array,
@ -66,6 +70,7 @@ export default {
itemNo:undefined,
componentPartNo:undefined,
partDesc:undefined,
umId:undefined,
assemblyQty:0,
fixedScrapQty:0,
scrapFactor:0,
@ -208,7 +213,7 @@ export default {
columnProp: 'scrapFactor',
headerAlign: 'center',
align: 'left',
columnLabel: '报废率',
columnLabel: '报废率%',
columnHidden: false,
columnImage: false,
columnSortable: false,
@ -233,27 +238,28 @@ export default {
status: true,
fixed: '',
columnWidth: 100
},{
userId: this.$store.state.user.name,
functionId: 102001,
serialNumber: '102001Table3ReserveQty',
tableId: '102001Table3',
tableName: '测试产品结构',
columnProp: 'reserveQty',
headerAlign: 'center',
align: 'left',
columnLabel: '预留数量',
columnHidden: false,
columnImage: false,
columnSortable: false,
sortLv: 0,
status: true,
fixed: '',
columnWidth: 100
},
// {
// userId: this.$store.state.user.name,
// functionId: 102001,
// serialNumber: '102001Table3ReserveQty',
// tableId: '102001Table3',
// tableName: '',
// columnProp: 'reserveQty',
// headerAlign: 'center',
// align: 'left',
// columnLabel: '',
// columnHidden: false,
// columnImage: false,
// columnSortable: false,
// sortLv: 0,
// status: true,
// fixed: '',
// columnWidth: 100
// },
// {
// userId: this.$store.state.user.name,
// functionId: 102001,
// serialNumber: '102001Table3IssuedDate',
// tableId: '102001Table3',
// tableName: '',
@ -286,25 +292,28 @@ export default {
status: true,
fixed: '',
columnWidth: 100
},{
userId: this.$store.state.user.name,
functionId: 102001,
serialNumber: '102001Table3rmTypeDb',
tableId: '102001Table3',
tableName: '测试产品结构',
columnProp: 'rmTypeDb',
headerAlign: 'center',
align: 'left',
columnLabel: '是否主物料',
columnHidden: false,
columnImage: false,
columnSortable: false,
sortLv: 0,
status: true,
fixed: '',
columnWidth: 100
},],
},
// {
// userId: this.$store.state.user.name,
// functionId: 102001,
// serialNumber: '102001Table3rmTypeDb',
// tableId: '102001Table3',
// tableName: '',
// columnProp: 'rmTypeDb',
// headerAlign: 'center',
// align: 'left',
// columnLabel: '',
// columnHidden: false,
// columnImage: false,
// columnSortable: false,
// sortLv: 0,
// status: true,
// fixed: '',
// columnWidth: 100
// },
],
saveOrUpdateFlag:false,
umList:[],
}
},
created() {
@ -331,6 +340,7 @@ export default {
dblClickPartTable(row){
this.testSoBom.componentPartNo = row.partNo;
this.testSoBom.partDesc = row.partDesc;
this.testSoBom.umId = row.umId;
this.partDialogFlag = false;
},
testSoBomClickRow(row,column){
@ -345,6 +355,7 @@ export default {
if (row){
this.testSoBom = JSON.parse(JSON.stringify(row))
}
this.getAllUm()
this.saveOrUpdateFlag = true
},
removeBatchTestSoBom(){
@ -381,6 +392,8 @@ export default {
testNo:undefined,
itemNo:undefined,
componentPartNo:undefined,
partDesc:undefined,
umId:undefined,
assemblyQty:0,
fixedScrapQty:0,
scrapFactor:0,
@ -416,7 +429,8 @@ export default {
this.$message.error(error)
})
},
saveTestSoBomBtn(){
saveTestSoBomBtn(isClose){
console.log(isClose)
this.$refs.saveForm.validate((validate,objects)=>{
if (validate){
if (this.testSoBom.itemNo !== undefined && this.testSoBom.itemNo !== null && this.testSoBom.itemNo !== ''){
@ -437,7 +451,9 @@ export default {
if (data && data.code === 0){
this.$message.success(data.msg)
this.selectTestSoBom()
this.saveOrUpdateFlag = false
if (!isClose){
this.saveOrUpdateFlag = false
}
}else {
this.$message.error(data.msg)
}
@ -451,6 +467,24 @@ export default {
}
}
})
},
getAllUm(){
let params = {
site:this.$store.state.user.site
}
searchAllUmInformationList(params).then(({data})=>{
if (data && data.code === 0){
this.umList = data.rows
}else {
this.$message.warning(data.msg)
}
}).catch((error)=>{
this.$message.error(error)
})
},
computeQuantityRequired(){
let total = new Decimal(this.testNumber).mul(new Decimal(this.testSoBom.assemblyQty)).div((new Decimal(100).sub(new Decimal(this.testSoBom.scrapFactor))).div(new Decimal(100)))
this.testSoBom.requiredQty = new Decimal(total.toFixed(3,Decimal.ROUND_FLOOR)).toSignificantDigits().toNumber();
}
},
@ -497,42 +531,44 @@ export default {
</el-table-column>
</el-table>
<el-dialog :title="testSoBom.itemNo?'编辑':'新增'+'-产品结构'" v-drag width="35vw" append-to-body :visible.sync="saveOrUpdateFlag" @close="closeTestSoBom">
<el-dialog :title="(testSoBom.itemNo?'编辑':'新增')+'-产品结构'" v-drag width="40vw" append-to-body :visible.sync="saveOrUpdateFlag" @close="closeTestSoBom">
<el-form ref="saveForm" label-position="top" :model="testSoBom" :rules="testSoBomRule">
<el-row :gutter="15">
<el-col :span="16">
<el-col :span="24">
<el-row :gutter="15">
<el-col :span="12">
<el-col :span="8">
<el-form-item label="物料编码" prop="componentPartNo">
<span slot="label" @click="partDialogFlag = true"><a>物料编码</a></span>
<el-input readonly v-model="testSoBom.componentPartNo"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-col :span="11">
<el-form-item label="物料名称" prop="partDesc">
<el-input disabled v-model="testSoBom.partDesc"></el-input>
</el-form-item>
</el-col>
<el-col :span="5">
<el-form-item label="单位" prop="umId">
<el-select v-model="testSoBom.umId">
<el-option v-for="v in umList" :value="v.umId" :label="v.umName" :key="v.umId"></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
</el-col>
<el-col :span="8">
<el-form-item label="需求数量" prop="requiredQty">
<el-input-number style="width: 100%;margin-top: -5px;" :min="0" v-model="testSoBom.requiredQty" :controls="false"></el-input-number>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="单位用量" prop="assemblyQty">
<el-input-number style="width: 100%;margin-top: -5px;" :min="0" v-model="testSoBom.assemblyQty" :controls="false"></el-input-number>
<el-input-number style="width: 100%;margin-top: -5px;" @input="computeQuantityRequired" :min="0" v-model="testSoBom.assemblyQty" :controls="false"></el-input-number>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="固定损耗" prop="fixedScrapQty">
<el-input-number style="width: 100%;margin-top: -5px;" :min="0" v-model="testSoBom.fixedScrapQty" :controls="false"></el-input-number>
<el-input-number style="width: 100%;margin-top: -5px;" @input="computeQuantityRequired" :min="0" v-model="testSoBom.fixedScrapQty" :controls="false"></el-input-number>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="报废率%" prop="scrapFactor">
<el-input-number style="width: 100%;margin-top: -5px;" :max="100" :min="0" v-model="testSoBom.scrapFactor" :controls="false"></el-input-number>
<el-input-number @input="computeQuantityRequired" style="width: 100%;margin-top: -5px;" :max="100" :min="0" v-model="testSoBom.scrapFactor" :controls="false"></el-input-number>
</el-form-item>
</el-col>
<el-col :span="8" v-if="false">
@ -545,16 +581,21 @@ export default {
<el-input v-model="testSoBom.issuedDate"></el-input>
</el-form-item>
</el-col>
<el-col :span="8">
<el-col :span="8" v-if="false">
<el-form-item label="预留数量" prop="reserveQty">
<el-input-number style="width: 100%;margin-top: -5px;" :min="0" v-model="testSoBom.reserveQty" :controls="false"></el-input-number>
</el-form-item>
</el-col>
<el-col :span="8">
<el-col :span="8" v-if="false">
<el-form-item label=" " prop="rmTypeDb">
<el-checkbox :true-label="1" :false-label="0" v-model="testSoBom.rmTypeDb">是否主物料</el-checkbox>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="需求数量" prop="requiredQty">
<el-input-number disabled style="width: 100%;margin-top: -5px;" :min="0" v-model="testSoBom.requiredQty" :controls="false"></el-input-number>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="备注" prop="remark" style="height: 90px">
<el-input type="textarea" resize='none' :autosize="{ minRows: 3, maxRows: 3 }" v-model="testSoBom.remark"></el-input>
@ -563,12 +604,13 @@ export default {
</el-row>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button type="primary" @click="saveTestSoBomBtn"> </el-button>
<el-button type="primary" v-if="!testSoBom.itemNo" @click="saveTestSoBomBtn(true)"> </el-button>
<el-button type="primary" @click="saveTestSoBomBtn(false)"> </el-button>
<el-button @click="saveOrUpdateFlag = false"> </el-button>
</span>
</el-dialog>
<el-dialog title="物料列表" width="30%" append-to-body
<el-dialog title="物料列表" width="35%" append-to-body
@close="closePartDialog" v-drag
:visible.sync="partDialogFlag">
<!--搜索条件-->

278
src/views/modules/test/testSoRouting/testRoutingTable.vue

@ -6,6 +6,7 @@ import {
updateTestSoRouting
} from "../../../../api/test/testSoRouting";
import {searchWorkCenter} from "../../../../api/part/workCenter";
import {Decimal} from "decimal.js";
export default {
name:"testRoutingTable",
@ -44,12 +45,14 @@ export default {
saveFlag:false,
testSoRoutingLabel:{
itemNo:"工序号",
itemDesc:"工序名称",
workCenterNo:"加工中心",
workCenterDesc:"加工中心名称",
workCenterType:"加工中心类别",
machSetupTime:"准备时间",
factorUnit:'产出单位',
machRunFactor:'单位产出量',
efficiency:'效率',
requiredTime:'需求时间',
requiredQty:'需求数量',
reportedQty:'报告数量',
@ -59,6 +62,7 @@ export default {
},
testSoRouting:{
itemNo:0,
itemDesc:undefined,
site:this.$store.state.user.site,
testNo:undefined,
workCenterNo:undefined,
@ -67,6 +71,7 @@ export default {
machSetupTime:0,
factorUnit:'单位/小时',
machRunFactor:0,
efficiency:100,
requiredTime:0,
requiredQty:0,
reportedQty:0,
@ -77,12 +82,14 @@ export default {
},
testSoRoutingRule:{
itemNo:[{required: true,message: ' ',trigger: ['change','blur']}],
itemDesc:[{required: true,message: ' ',trigger: ['change','blur']}],
workCenterNo:[{required: true,message: ' ',trigger: ['change','blur']}],
workCenterDesc:[{required: true,message: ' ',trigger: ['change','blur']}],
workCenterType:[{required: true,message: ' ',trigger: ['change','blur']}],
machSetupTime:[{required: true,message: ' ',trigger: ['change','blur']}],
factorUnit:[{required: true,message: ' ',trigger: ['change','blur']}],
machRunFactor:[{required: true,message: ' ',trigger: ['change','blur']}],
efficiency:[{required: true,message: ' ',trigger: ['change','blur']}],
requiredTime:[{required: true,message: ' ',trigger: ['change','blur']}],
requiredQty:[{required: true,message: ' ',trigger: ['change','blur']}],
reportedQty:[{required: true,message: ' ',trigger: ['change','blur']}],
@ -109,6 +116,23 @@ export default {
status: true,
fixed: '',
columnWidth: 100
},{
userId: this.$store.state.user.name,
functionId: 102001,
serialNumber: '102001Table3ItemDesc',
tableId: '102001Table3',
tableName: '测试工艺路线',
columnProp: 'itemDesc',
headerAlign: 'center',
align: 'center',
columnLabel: '工序号',
columnHidden: false,
columnImage: false,
columnSortable: false,
sortLv: 0,
status: true,
fixed: '',
columnWidth: 100
},
{
userId: this.$store.state.user.name,
@ -203,13 +227,13 @@ export default {
{
userId: this.$store.state.user.name,
functionId: 102001,
serialNumber: '102001Table3FactorUnit',
serialNumber: '102001Table3Efficiency',
tableId: '102001Table3',
tableName: '测试工艺路线',
columnProp: 'factorUnit',
columnProp: 'efficiency',
headerAlign: 'center',
align: 'center',
columnLabel: '产出单位',
columnLabel: '效率%',
columnHidden: false,
columnImage: false,
columnSortable: false,
@ -221,85 +245,13 @@ export default {
{
userId: this.$store.state.user.name,
functionId: 102001,
serialNumber: '102001Table3RequiredTime',
tableId: '102001Table3',
tableName: '测试工艺路线',
columnProp: 'requiredTime',
headerAlign: 'center',
align: 'center',
columnLabel: '需求时间',
columnHidden: false,
columnImage: false,
columnSortable: false,
sortLv: 0,
status: true,
fixed: '',
columnWidth: 100
},
{
userId: this.$store.state.user.name,
functionId: 102001,
serialNumber: '102001Table3RequiredQty',
tableId: '102001Table3',
tableName: '测试工艺路线',
columnProp: 'requiredQty',
headerAlign: 'center',
align: 'center',
columnLabel: '需求数量',
columnHidden: false,
columnImage: false,
columnSortable: false,
sortLv: 0,
status: true,
fixed: '',
columnWidth: 100
},
{
userId: this.$store.state.user.name,
functionId: 102001,
serialNumber: '102001Table3ReportedQty',
tableId: '102001Table3',
tableName: '测试工艺路线',
columnProp: 'reportedQty',
headerAlign: 'center',
align: 'center',
columnLabel: '报告数量',
columnHidden: false,
columnImage: false,
columnSortable: false,
sortLv: 0,
status: true,
fixed: '',
columnWidth: 100
},
{
userId: this.$store.state.user.name,
functionId: 102001,
serialNumber: '102001Table3ApproveQty',
tableId: '102001Table3',
tableName: '测试工艺路线',
columnProp: 'approveQty',
headerAlign: 'center',
align: 'center',
columnLabel: '合格数量',
columnHidden: false,
columnImage: false,
columnSortable: false,
sortLv: 0,
status: true,
fixed: '',
columnWidth: 100
},
{
userId: this.$store.state.user.name,
functionId: 102001,
serialNumber: '102001Table3PlanStartTime',
serialNumber: '102001Table3FactorUnit',
tableId: '102001Table3',
tableName: '测试工艺路线',
columnProp: 'planStartTime',
columnProp: 'factorUnit',
headerAlign: 'center',
align: 'center',
columnLabel: '计划开工时间',
columnLabel: '产出单位',
columnHidden: false,
columnImage: false,
columnSortable: false,
@ -311,13 +263,13 @@ export default {
{
userId: this.$store.state.user.name,
functionId: 102001,
serialNumber: '102001Table3PlanFinishTime',
serialNumber: '102001Table3RequiredTime',
tableId: '102001Table3',
tableName: '测试工艺路线',
columnProp: 'planFinishTime',
columnProp: 'requiredTime',
headerAlign: 'center',
align: 'center',
columnLabel: '计划完工时间',
columnLabel: '需求时间',
columnHidden: false,
columnImage: false,
columnSortable: false,
@ -326,6 +278,96 @@ export default {
fixed: '',
columnWidth: 100
},
// {
// userId: this.$store.state.user.name,
// functionId: 102001,
// serialNumber: '102001Table3RequiredQty',
// tableId: '102001Table3',
// tableName: '线',
// columnProp: 'requiredQty',
// headerAlign: 'center',
// align: 'center',
// columnLabel: '',
// columnHidden: false,
// columnImage: false,
// columnSortable: false,
// sortLv: 0,
// status: true,
// fixed: '',
// columnWidth: 100
// },
// {
// userId: this.$store.state.user.name,
// functionId: 102001,
// serialNumber: '102001Table3ReportedQty',
// tableId: '102001Table3',
// tableName: '线',
// columnProp: 'reportedQty',
// headerAlign: 'center',
// align: 'center',
// columnLabel: '',
// columnHidden: false,
// columnImage: false,
// columnSortable: false,
// sortLv: 0,
// status: true,
// fixed: '',
// columnWidth: 100
// },
// {
// userId: this.$store.state.user.name,
// functionId: 102001,
// serialNumber: '102001Table3ApproveQty',
// tableId: '102001Table3',
// tableName: '线',
// columnProp: 'approveQty',
// headerAlign: 'center',
// align: 'center',
// columnLabel: '',
// columnHidden: false,
// columnImage: false,
// columnSortable: false,
// sortLv: 0,
// status: true,
// fixed: '',
// columnWidth: 100
// },
// {
// userId: this.$store.state.user.name,
// functionId: 102001,
// serialNumber: '102001Table3PlanStartTime',
// tableId: '102001Table3',
// tableName: '线',
// columnProp: 'planStartTime',
// headerAlign: 'center',
// align: 'center',
// columnLabel: '',
// columnHidden: false,
// columnImage: false,
// columnSortable: false,
// sortLv: 0,
// status: true,
// fixed: '',
// columnWidth: 100
// },
// {
// userId: this.$store.state.user.name,
// functionId: 102001,
// serialNumber: '102001Table3PlanFinishTime',
// tableId: '102001Table3',
// tableName: '线',
// columnProp: 'planFinishTime',
// headerAlign: 'center',
// align: 'center',
// columnLabel: '',
// columnHidden: false,
// columnImage: false,
// columnSortable: false,
// sortLv: 0,
// status: true,
// fixed: '',
// columnWidth: 100
// },
{
userId: this.$store.state.user.name,
functionId: 102001,
@ -396,6 +438,7 @@ export default {
this.$refs.saveForm.resetFields();
this.testSoRouting = {
itemNo:0,
itemDesc:undefined,
site:this.$store.state.user.site,
testNo: this.testNo,
workCenterNo:undefined,
@ -404,6 +447,7 @@ export default {
machSetupTime:0,
factorUnit:'单位/小时',
machRunFactor:0,
efficiency:100,
requiredTime:0,
requiredQty:0,
reportedQty:0,
@ -424,13 +468,13 @@ export default {
}
})
},
saveTestSoRouting(){
saveTestSoRouting(isClose){
this.$refs.saveForm.validate((validate,objects)=>{
if (validate){
this.testSoRouting.planStartTime = this.dayjs(new Date(this.testSoRouting.planStartTime)).format("YYYY-MM-DD HH:mm:ss")
this.testSoRouting.planFinishTime = this.dayjs(new Date(this.testSoRouting.planFinishTime)).format("YYYY-MM-DD HH:mm:ss")
if (!this.saveStatus){
//
this.testSoRouting.planStartTime = this.dayjs(new Date(this.testSoRouting.planStartTime)).format("YYYY-MM-DD HH:mm:ss")
this.testSoRouting.planFinishTime = this.dayjs(new Date(this.testSoRouting.planFinishTime)).format("YYYY-MM-DD HH:mm:ss")
updateTestSoRouting(this.testSoRouting).then(({data})=>{
if (data && data.code === 0){
this.selectTestSoRoutingList();
@ -444,13 +488,13 @@ export default {
})
}else {
//
this.testSoRouting.planStartTime = this.dayjs(new Date(this.testSoRouting.planStartTime)).format("YYYY-MM-DD HH:mm:ss")
this.testSoRouting.planFinishTime = this.dayjs(new Date(this.testSoRouting.planFinishTime)).format("YYYY-MM-DD HH:mm:ss")
saveTestSoRouting(this.testSoRouting).then(({data})=>{
if (data && data.code === 0){
this.selectTestSoRoutingList();
this.$message.success(data.msg)
this.saveFlag = false
if (!isClose){
this.saveFlag = false
}
}else {
this.$message.warning(data.msg)
}
@ -495,6 +539,31 @@ export default {
this.$message.error(error)
})
}).catch(()=>{})
},
computeRequiredTime(){
// 1
let total = new Decimal(this.testSoRouting.efficiency).div(new Decimal(100))
// 2
let time = new Decimal(0);
switch (this.testSoRouting.factorUnit){
case "小时":
time = new Decimal(this.testSoRouting.machRunFactor)
break
case "单位/小时":
if (new Decimal(this.testSoRouting.machRunFactor).toNumber() !== 0){
time = new Decimal(1).div(new Decimal(this.testSoRouting.machRunFactor))
}
break
case "小时/单位":
time = new Decimal(this.testSoRouting.machRunFactor).mul(new Decimal(1))
break
}
total = total.mul(time)
total = Decimal.add(new Decimal(this.testSoRouting.machSetupTime),total)
this.testSoRouting.requiredTime = total;
if (this.testSoRouting.requiredTime.toNumber !== 0){
this.testSoRouting.requiredTime = new Decimal(total.toFixed(3,Decimal.ROUND_FLOOR)).toSignificantDigits().toNumber();
}
}
},
}
@ -547,9 +616,9 @@ export default {
<el-input-number style="width: 100%;margin-top: -5px;" :disabled="!saveStatus" :min="0" v-model="testSoRouting.itemNo" :controls="false"></el-input-number>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="准备时间" prop="machSetupTime">
<el-input-number style="width: 100%;margin-top: -5px;" :min="0" v-model="testSoRouting.machSetupTime" :controls="false"></el-input-number>
<el-col :span="12">
<el-form-item label="工序名称" prop="itemDesc">
<el-input v-model="testSoRouting.itemDesc"></el-input>
</el-form-item>
</el-col>
</el-row>
@ -570,14 +639,24 @@ export default {
<el-input disabled v-model="testSoRouting.workCenterType"></el-input>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="准备时间" prop="machSetupTime">
<el-input-number @input="computeRequiredTime" style="width: 100%;margin-top: -5px;" :min="0" v-model="testSoRouting.machSetupTime" :controls="false"></el-input-number>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="单位产出量" prop="machRunFactor">
<el-input-number style="width: 100%;margin-top: -5px;" :min="0" v-model="testSoRouting.machRunFactor" :controls="false"></el-input-number>
<el-input-number @input="computeRequiredTime" style="width: 100%;margin-top: -5px;" :min="0" v-model="testSoRouting.machRunFactor" :controls="false"></el-input-number>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="效率%" prop="efficiency">
<el-input-number @input="computeRequiredTime" style="width: 100%;margin-top: -5px;" :min="0" v-model="testSoRouting.efficiency" :controls="false"></el-input-number>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="产出单位" prop="factorUnit">
<el-select v-model="testSoRouting.factorUnit"
<el-select v-model="testSoRouting.factorUnit" @change="computeRequiredTime"
style="width: 100%" placeholder="请选择" default-first-option>
<el-option label="单位/小时" :value="'单位/小时'"></el-option>
<el-option label="小时/单位" :value="'小时/单位'"></el-option>
@ -589,29 +668,29 @@ export default {
<el-row :gutter="10">
<el-col :span="8">
<el-form-item label="需求时间" prop="requiredTime">
<el-input-number style="width: 100%;margin-top: -5px;" :min="0" v-model="testSoRouting.requiredTime" :controls="false"></el-input-number>
<el-input-number disabled style="width: 100%;margin-top: -5px;" :min="0" v-model="testSoRouting.requiredTime" :controls="false"></el-input-number>
</el-form-item>
</el-col>
<el-col :span="8">
<el-col :span="8" v-if="false">
<el-form-item label="需求数量" prop="requiredQty">
<el-input-number style="width: 100%;margin-top: -5px;" :min="0" v-model="testSoRouting.requiredQty" :controls="false"></el-input-number>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="10">
<el-row :gutter="10" v-if="false">
<el-col :span="8">
<el-form-item label="报告数量" prop="reportedQty">
<el-input-number style="width: 100%;margin-top: -5px;" :min="0" v-model="testSoRouting.reportedQty" :controls="false"></el-input-number>
</el-form-item>
</el-col>
<el-col :span="8">
<el-col :span="8" v-if="false">
<el-form-item label="合格数量" prop="approveQty">
<el-input-number style="width: 100%;margin-top: -5px;" :min="0" v-model="testSoRouting.approveQty" :controls="false"></el-input-number>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="10">
<el-col :span="8">
<el-col :span="8" v-if="false">
<el-form-item label="计划开工时间" prop="planStartTime">
<el-date-picker
style="width: 100%"
@ -621,7 +700,7 @@ export default {
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="8">
<el-col :span="8" v-if="false">
<el-form-item label="计划完工时间" prop="planFinishTime">
<el-date-picker
style="width: 100%"
@ -639,7 +718,8 @@ export default {
</el-row>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button type="primary" @click="saveTestSoRouting"> </el-button>
<el-button v-if="saveStatus" type="primary" @click="saveTestSoRouting(true)"> </el-button>
<el-button type="primary" @click="saveTestSoRouting(false)"> </el-button>
<el-button @click="saveFlag = false"> </el-button>
</span>
</el-dialog>

Loading…
Cancel
Save