From e55486041c7d948f0c9ca6d77d568a5c26f13267 Mon Sep 17 00:00:00 2001 From: XiaoRuby <3114200645@qq.com> Date: 星期一, 11 九月 2023 18:02:18 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/master' --- src/components/view/standard-box/bomClickAdd.vue | 15 + src/components/view/standard.vue | 328 ++++++++++++++++++++++++++++++++++-- src/components/view/standard-table/target.vue | 105 +++++++++++ src/components/view/standard-table/technology.vue | 10 src/assets/api/controller.js | 3 src/components/view/standard-table/material.vue | 33 ++- 6 files changed, 459 insertions(+), 35 deletions(-) diff --git a/src/assets/api/controller.js b/src/assets/api/controller.js index 1ad83e6..7e8b69f 100644 --- a/src/assets/api/controller.js +++ b/src/assets/api/controller.js @@ -6,6 +6,9 @@ selectProductByMaterial: "product/selectTreeByMaterial", //鏍规嵁鐗╂枡鏌ヨ椤圭洰琛ㄦ牸 selectTechnologyByMaterial: "technology/select", selectAll:"/material/selectAll",//鍙充晶鏁版嵁 + leftAddOneTwo: "/material/add",//宸︿晶鏂板1锛�2绾� + leftAddThree: "/standard/add",//宸︿晶涓夌骇鏂板 + leftAddFour: "/specifications/add",//宸︿晶鍥涚骇鏂板 // 鎶�鏈鐞�-鎶�鏈枃浠� selectAllOrder: "/orders/selectAllOrder", //鏌ヨ鎵�鏈夎鍗曞垪琛� selectOrderById: "/orders/selectOrderById", //鏍规嵁璁㈠崟id鏌ヨ璁㈠崟璇︽儏 diff --git a/src/components/view/standard-box/bomClickAdd.vue b/src/components/view/standard-box/bomClickAdd.vue new file mode 100644 index 0000000..a8f9b6d --- /dev/null +++ b/src/components/view/standard-box/bomClickAdd.vue @@ -0,0 +1,15 @@ +<template> + <div> + 1 + </div> +</template> + +<script> +export default { + +} +</script> + +<style> + +</style> \ No newline at end of file diff --git a/src/components/view/standard-table/material.vue b/src/components/view/standard-table/material.vue index 0e8af0b..7ae1a84 100644 --- a/src/components/view/standard-table/material.vue +++ b/src/components/view/standard-table/material.vue @@ -1,8 +1,8 @@ <template> <div class="standard"> <div> - <el-table :data="tableData" style="width: 100%;margin-bottom: 20px;" row-key="id" border - @selection-change="handleSelectionChange" default-expand-all + <el-table :data="tableData" max-height="675" style="width: 100%;margin-bottom: 20px;" row-key="rowId" border + @selection-change="handleSelectionChange" default-expand-all :tree-props="{ children: 'children', hasChildren: 'hasChildren' }"> <el-table-column type="selection" width="55"> </el-table-column> @@ -10,21 +10,29 @@ </el-table-column> <el-table-column prop="father" label="宸ュ簭" sortable width="200px"> <template slot-scope="scope"> - <el-tag v-if="scope.row.children" type="primary">01</el-tag> - <span style="color: #000000"> - {{ scope.row.father }} - </span> + <el-tag v-if="scope.row.father != null" type="primary">01</el-tag> + <span style="color: #000000"> + {{ scope.row.father }} + </span> </template> </el-table-column> - <el-table-column prop="name" sortable label="宸ヨ壓鍚嶇О"> + <el-table-column prop="tname" sortable label="宸ヨ壓鍚嶇О"> <template slot-scope="scope"> - <el-tag type="success" v-if="!scope.row.children">02</el-tag> - <span style="color: black"> - {{ scope.row.name }} - </span> - </template> + <el-tag type="success" v-if="scope.row.tname != null">02</el-tag> + <span style="color: black"> + {{ scope.row.tname }} + </span> + </template> </el-table-column> <el-table-column prop="mname" label="鏉愭枡鍚嶇О"> + <template slot-scope="scope"> + <el-tag type="info" color="#faf2ff" v-if="scope.row.mname != null"> + <span style="color: #e1affb">03</span> + </el-tag> + <span> + {{scope.row.mname}} + </span> + </template> </el-table-column> <el-table-column prop="specifications" label="瑙勬牸"> </el-table-column> @@ -41,6 +49,7 @@ export default { data() { return { + hasChildren:true, selects: [] } }, diff --git a/src/components/view/standard-table/target.vue b/src/components/view/standard-table/target.vue new file mode 100644 index 0000000..7dcfe2a --- /dev/null +++ b/src/components/view/standard-table/target.vue @@ -0,0 +1,105 @@ +<template> + <div class="standard"> + <div> + <el-table ref="table" :data="tableData" row-key="rowId" border max-height="675" + @selection-change="handleSelectionChange" default-expand-all + :tree-props="{children: 'children', hasChildren: 'hasChildren'}"> + <el-table-column type="selection" width="55"></el-table-column> + <el-table-column type="index" width="60" label="搴忓彿"></el-table-column> + <el-table-column prop="tfather" label="宸ュ簭"> + <template slot-scope="scope"> + <el-tag type="primay" v-if="scope.row.tfather != null">01</el-tag> + <span>{{scope.row.tfather}}</span> + </template> + </el-table-column> + <el-table-column prop="tname" label="宸ヨ壓鍚嶇О"> + <template slot-scope="scope"> + <el-tag type="success" v-if="scope.row.tname != null">02</el-tag> + <span>{{scope.row.tname}}</span> + </template> + </el-table-column> + <el-table-column prop="pname" label="鎸囨爣鍚嶇О"> + <template slot-scope="scope"> + <el-tag type="info" color="#faf2ff" v-if="scope.row.pname != null"> + <span style="color: #e1affb">03</span> + </el-tag> + <span>{{scope.row.pname}}</span> + </template> + </el-table-column> + <el-table-column prop="unit" label="鍗曚綅"></el-table-column> + <el-table-column prop="internal" label="鍐呮帶鍊�"></el-table-column> + <el-table-column prop="required" label="鏍囧噯鍊�"></el-table-column> + </el-table> + </div> + </div> + </template> + + <script> + export default { + data() { + return { + selects: [], + } + }, + props:['tableData','tableType'], + created() {}, + mounted() {}, + methods: { + handleSelectionChange(val) { + this.selects = val; + }, + aaaa(){ + console.log("aaaaa----",this.targetData); + } + } + } + </script> + + <style scoped> + .expand-button { + cursor: pointer; + color: #1890ff; +} + .standard { + width: 100%; + height: 100%; + } + </style> + <style> + .standard * { + font-size: 14px; + } + + .standard .has-gutter .el-table__cell { + background-color: #F0F1F5 !important; + color: #333; + } + + .standard .has-gutter .el-table__cell .cell { + font-size: 16px; + font-weight: 500; + } + + .standard .cell { + color: #333; + padding-left: 17px !important; + } + + .standard { + width: 100%; + height: 100%; + overflow: auto; + } + + /* .standard .el-table__body-wrapper { + height: 100%; + } */ + + /* .standard .el-table__body { + height: 100%; + } */ + .standard .el-table .el-table__row:not([class*="el-table__row--level-"]) td:nth-child(3){ + padding-left: 23px !important; + } + </style> + \ No newline at end of file diff --git a/src/components/view/standard-table/technology.vue b/src/components/view/standard-table/technology.vue index a8f67ba..99aa0dd 100644 --- a/src/components/view/standard-table/technology.vue +++ b/src/components/view/standard-table/technology.vue @@ -1,7 +1,7 @@ <template> <div class="standard"> <div> - <el-table :data="tableData" height="800" row-key="id" border + <el-table :data="tableData" max-height="675" row-key="rowId" border :header-cell-style="{border:'0px',background:'#f5f7fa',color:'#606266',boxShadow: 'inset 0 1px 0 #ebeef5',textAlign: 'left'}" @selection-change="handleSelectionChange" default-expand-all :tree-props="{ children: 'children', hasChildren: 'hasChildren' }"> @@ -89,13 +89,13 @@ overflow: auto; } - .standard .el-table__body-wrapper { + /* .standard .el-table__body-wrapper { height: 100%; - } + } */ - .standard .el-table__body { + /* .standard .el-table__body { height: 100%; - } + } */ .standard .el-table .el-table__row:not([class*="el-table__row--level-"]) td:nth-child(3){ padding-left: 23px !important; } diff --git a/src/components/view/standard.vue b/src/components/view/standard.vue index 0b372ee..0a0bdc6 100644 --- a/src/components/view/standard.vue +++ b/src/components/view/standard.vue @@ -7,16 +7,22 @@ <el-button type="primary" icon="el-icon-plus" style="background: #004EA2;" @click="bomAddModelVisible = true">鏂板</el-button> <el-button icon="el-icon-plus">鏂板鐗堟湰</el-button> - <el-button icon="el-icon-edit-outline">淇敼</el-button> - <el-button icon="el-icon-delete">鍒犻櫎</el-button> + <el-button @click="bomRightUp=true" icon="el-icon-edit-outline">淇敼</el-button> + <el-button @click="bomRightDl=true" icon="el-icon-delete">鍒犻櫎</el-button> </el-col> </el-row> </div> <div class="thing"> <div class="left"> - <el-input v-model="search" suffix-icon="el-icon-search" placeholder="璇疯緭鍏ユ悳绱㈠唴瀹�" size="small" clearable></el-input> - - <el-tree :data="list" ref="tree" default-expand-all :props="{ children: 'children', label: 'name' }" + <el-row> + <el-col :span="21"> + <el-input v-model="search" suffix-icon="el-icon-search" placeholder="璇疯緭鍏ユ悳绱㈠唴瀹�" size="small" clearable></el-input> + </el-col> + <el-col :span="2"> + <el-button size="mini" icon="el-icon-plus" @click="bomLeftAdd=true"></el-button> + </el-col> + </el-row> + <el-tree style="width: ;" :data="list" ref="tree" default-expand-all :props="{ children: 'children', label: 'name' }" node-key="id" :filter-node-method="filterNode" @node-click="handleNodeClick" highlight-current> <div class="custom-tree-node" slot-scope="{ node, data }"> <span><i :class="`node_i ${data.code != '[5]' ? 'el-icon-folder-opened' : 'el-icon-tickets'}`"></i> @@ -55,7 +61,9 @@ <div class="contentTable" v-if="this.typeselect == 0"> <technology :tableType="tableType" :tableData="tableData"></technology> </div> - <div v-if="this.typeselect == 1">鎶�鏈寚鏍�</div> + <div v-if="this.typeselect == 1"> + <target :tableType="tableType" :tableData="tableData"></target> + </div> <div v-if="this.typeselect == 2"> <bom :tableType="tableType" :tableData="tableData"></bom> </div> @@ -67,12 +75,57 @@ <div class="bom-add-model"> <el-dialog title="BOM鏂板" :visible.sync="bomAddModelVisible" width="30%"> - <el-form> - - </el-form> + <div> + <!-- 鐗╂枡娓呭崟鏂板 --> + <bomClickAdd v-if="typeselect===2"/> + </div> <span slot="footer" class="dialog-footer"> <el-button @click="bomAddModelVisible = false">鍙� 娑�</el-button> <el-button type="primary" @click="bomAddModelVisible = false">纭� 瀹�</el-button> + </span> + </el-dialog> + <!-- 宸︿晶鐐瑰嚮+鎸夐挳 --> + <el-dialog title="BOM鏂板" :visible.sync="bomLeftAdd" width="29%"> + <el-form ref="leftAdd" :model="leftAdd"> + <el-form-item :rules="[{ required: true, message: '璇烽�夋嫨浜у搧绫诲瀷', trigger: 'blur' }]" label="浜у搧绫诲瀷" prop="type"> + <el-cascader @change="changeLeftAdd" v-model="leftAdd.type" style="width: 86%;" :options="formTypeOptions" :props="{ checkStrictly: true }" clearable></el-cascader> + </el-form-item> + <el-form-item v-if="leftAdd.type.length<2" label="浜у搧澶х被" prop="father"> + <el-autocomplete class="inline-input" style="width: 88%;" v-model="leftAdd.father" :fetch-suggestions="querySearch" placeholder="璇烽�夋嫨浜у搧澶х被" @select="handleSelect"></el-autocomplete> + </el-form-item> + <el-form-item v-if="leftAdd.type.length<3" label="浜у搧鍚嶇О" prop="name"> + <el-autocomplete class="inline-input" style="width: 88%;" v-model="leftAdd.name" :fetch-suggestions="querySearchName" placeholder="璇烽�夋嫨浜у搧鍚嶇О" @select="handleSelect"></el-autocomplete> + </el-form-item> + <el-form-item v-if="leftAdd.type.length<4" label="浜у搧鏍囧噯" prop="standard"> + <el-autocomplete class="inline-input" style="width: 88%;" v-model="leftAdd.standard" :fetch-suggestions="querySearchStandar" placeholder="璇烽�夋嫨浜у搧鏍囧噯" @select="handleSelect"></el-autocomplete> + </el-form-item> + <el-form-item label="浜у搧鍨嬪彿" prop="specifications"> + <el-input v-model="leftAdd.specifications" style="width: 88%;" placeholder="璇疯緭鍏ヤ骇鍝佸瀷鍙�"></el-input> + </el-form-item> + </el-form> + <span slot="footer" class="dialog-footer"> + <el-button @click="resetForm('leftAdd')">鍙� 娑�</el-button> + <el-button type="primary" @click="submitForm('leftAdd')">纭� 瀹�</el-button> + </span> + </el-dialog> + <!-- 鍙充笂渚х偣鍑讳慨鏀规寜閽� --> + <el-dialog title="BOM淇敼" :visible.sync="bomRightUp" width="30%"> + <el-form> + 淇敼 + </el-form> + <span slot="footer" class="dialog-footer"> + <el-button @click="bomRightUp = false">鍙� 娑�</el-button> + <el-button type="primary" @click="bomRightUp = false">纭� 瀹�</el-button> + </span> + </el-dialog> + <!-- 鍙充笂渚х偣鍑诲垹闄ゆ寜閽� --> + <el-dialog title="BOM鍒犻櫎" :visible.sync="bomRightDl" width="30%"> + <el-form> + 鍒犻櫎 + </el-form> + <span slot="footer" class="dialog-footer"> + <el-button @click="bomRightDl=false">鍙� 娑�</el-button> + <el-button type="primary" @click="bomRightDl = false">纭� 瀹�</el-button> </span> </el-dialog> </div> @@ -83,8 +136,9 @@ import technology from "./standard-table/technology.vue" import material from "./standard-table/material.vue" import bom from "./standard-table/bom.vue" +import bomClickAdd from '@/components/view/standard-box/bomClickAdd' export default { - components: { technology,material,bom }, + components: { technology,material,bom,bomClickAdd }, data() { return { @@ -96,14 +150,29 @@ checkTreeNode: {},// 鐐瑰嚮閫変腑鏍戣妭鐐� tableData: [], bomAddModelVisible: false,// 鎺у埗bom鏂板妯℃�佹鏄惁鏄剧ず + bomLeftAdd: false, + bomRightUp: false, + bomRightDl: false, + formTypeOptions: null, typeselect: 0, returntree: { id:28, }, version: {}, + leftAdd:{ + type: [], + father: null, + standard: null, + name: null, + specifications: null + }, VER: {}, verdata: {}, character: 0, + restaurants: [], + bomName:[], + bomStandard:[], + isLeftAdd: true } }, // watch: { @@ -120,6 +189,148 @@ this.selectVersion() }, methods: { + changeLeftAdd(){ + if(this.leftAdd.type.length===2){ + this.leftAdd.father=null + this.leftAdd.father=this.leftAdd.type[1] + } + if(this.leftAdd.type.length===3){ + this.leftAdd.name=null + this.leftAdd.father=this.leftAdd.type[1] + this.leftAdd.name=this.leftAdd.type[2] + } + if(this.leftAdd.type.length===4){ + this.leftAdd.standard=null + this.leftAdd.father=this.leftAdd.type[1] + this.leftAdd.name=this.leftAdd.type[2] + this.leftAdd.standard=this.leftAdd.type[3] + } + }, + submitForm(formName) { + this.$refs[formName].validate((valid) => { + if (valid) { + let obj=JSON.parse(JSON.stringify(this.leftAdd)) + console.log(obj); + let one=this.list.filter(item=>{ + return item.name===obj.type[0] + })[0] + let two=one.children.filter(item=>{ + return item.name===obj.father + })[0] + console.log("two",two); + //鎵ц涓�浜岀骇鏂板 + if(two===undefined||two===null){ + obj.type=this.getType(obj.type[0]) + this.$axios.post(this.$api.url.leftAddOneTwo,obj,{ + headers: { "Content-Type": "application/json" } + }).then(res=>{ + this.$message({ + message: res.message, + type: 'success' + }); + this.selectMaterialTree() + }) + }else{ + let three=two.children.filter(item=>{ + return item.name===obj.name + })[0] + console.log("three",three); + if(three===undefined||three===null){ + obj.type=this.getType(obj.type[0]) + this.$axios.post(this.$api.url.leftAddOneTwo,obj,{ + headers: { "Content-Type": "application/json" } + }).then(res=>{ + this.$message({ + message: res.message, + type: 'success' + }); + this.selectMaterialTree() + }) + }else{ + //鏂板鏍囧噯鍨嬪彿 + let four=three.children.filter(item=>{ + return item.name===obj.standard + })[0] + if(four===undefined||four===null){ + let StandardDto={ + "id": three.id, + "specifications": obj.specifications, + "standard": obj.standard + } + this.$axios.post(this.$api.url.leftAddThree,StandardDto,{ + headers: { "Content-Type": "application/json" } + }).then(res=>{ + this.$message({ + message: res.message, + type: 'success' + }); + this.selectMaterialTree() + }) + }else{ + let specificationsDto={ + "id": four.id, + "specifications": obj.specifications + } + this.$axios.post(this.$api.url.leftAddFour,specificationsDto,{ + headers: { "Content-Type": "application/json" } + }).then(res=>{ + this.$message({ + message: res.message, + type: 'success' + }); + this.selectMaterialTree() + this.selectVersion() + }) + } + } + } + this.resetForm('leftAdd') + } else { + console.log('error submit!!'); + return false; + } + }); + }, + resetForm(formName) { + this.bomLeftAdd=false + this.$refs[formName].resetFields(); + }, + leftAddBom(){ + + }, + getType(typeName){ + return typeName==="鎴愬搧"?1:2 + }, + handleSelect(item) { + console.log(item); + }, + querySearch(queryString, cb) { + var restaurants = this.restaurants; + var results = queryString ? restaurants.filter(this.createFilter(queryString)) : restaurants; + // 璋冪敤 callback 杩斿洖寤鸿鍒楄〃鐨勬暟鎹� + cb(results); + }, + querySearchName(queryString, cb) { + var restaurants = this.bomName; + var results = queryString ? restaurants.filter(this.createFilter(queryString)) : restaurants; + // 璋冪敤 callback 杩斿洖寤鸿鍒楄〃鐨勬暟鎹� + cb(results); + }, + querySearchStandar(queryString, cb) { + var restaurants = this.bomStandard; + var results = queryString ? restaurants.filter(this.createFilter(queryString)) : restaurants; + // 璋冪敤 callback 杩斿洖寤鸿鍒楄〃鐨勬暟鎹� + cb(results); + }, + loadFatherType(){ + return [{label:"姗¤兌杩炴帴鍣�",value: "姗¤兌杩炴帴鍣�"},{label:"閲戝睘杩炴帴鍣�",value: "閲戝睘杩炴帴鍣�"}, + {label:"婀挎彃鎷旂數杩炴帴鍣�",value: "婀挎彃鎷旂數杩炴帴鍣�"},{label:"鍒嗘敮缁勪欢",value: "鍒嗘敮缁勪欢"}] + }, + createFilter(queryString) { + return (restaurant) => { + return (restaurant.value.toLowerCase().indexOf(queryString.toLowerCase()) === 0); + }; + }, selectDataList() { this.list.forEach(a => { a.code = '[1]' @@ -152,12 +363,16 @@ // console.log(val); this.typeselect = val - console.log(this.typeselect); + // console.log(this.typeselect); this.selectVersion() }, handleNodeClick(val) {//鏍戠殑鍊� - // console.log(val); - this.returntree = val + if(val.code==='[5]'&&val.children===undefined){ + console.log(val); + this.returntree = val + this.typeselect=0 + this.selectVersion() + } }, async selectVersion() {//鐗堟湰 let v=await this.$axios.get(this.$api.url.selectVersion, { @@ -187,12 +402,18 @@ } }).then(res => { let arr = res.data; - console.log(arr); - for(var i=0;i<arr.length;i++){ - arr[i].id = "0" + i; - } + this.formatData(arr) this.tableData = arr; }) + }, + formatData(data){ + let arr = data; + for(var i=0;i<arr.length;i++){ + arr[i].rowId = Math.random(); + if(arr[i].children != undefined){ + this.formatData(arr[i].children); + } + } }, verevent(val) { // console.log(val); @@ -283,14 +504,84 @@ this.tableData = productList break; } + }, + // 閫掑綊鏇存敼娣诲姞绾ц仈鎵�闇�灞炴�� + replaceProp(arr){ + for (let index = 0; index < arr.length; index++) { + let element = arr[index]; + element.label=element.name + element.value=element.name + if(element.children!=undefined){ + if(element.code==='[4]'){ + delete element['children'] + continue + } + this.replaceProp(element.children) + } + } } + }, + watch:{ + leftAdd: { + handler(newVal, oldVal) { + if(this.isLeftAdd){ + let tree=JSON.parse(JSON.stringify(this.list)) + let father=null; + if(newVal.father!=null&&newVal.father!=''&&newVal.type.length>0){ + let one=tree.filter(item=>{ + return item.name===newVal.type[0] + })[0] + console.log(one); + let two=one.children.filter(item=>{ + return item.name===newVal.father + })[0] + if(two!=undefined){ + this.bomName=[] + father=JSON.parse(JSON.stringify(two)) + two.children.forEach(item=>{ + let obj={label: item.name,value: item.name} + this.bomName.push(obj) + }) + } + } + if(newVal.name!=null&&newVal!=''&&newVal.father!=null&&newVal.father!=''&&newVal.type.length>0){ + let three=null + if(father!=undefined&&father!=null){ + three=father.children.filter(item=>{ + return item.name===newVal.name + })[0] + } + if(three!=undefined&&three!=null){ + this.bomStandard=[] + three.children.forEach(item=>{ + let obj={label: item.name,value: item.name} + this.bomStandard.push(obj) + }) + } + } + } + }, + deep: true // 娣卞害鐩戝惉瀵硅薄鍐呴儴灞炴�х殑鍙樺寲锛屽彲閫夌殑 + }, + bomLeftAdd:{ + handler(newval,oldVal){ + if(newval){ + let treeOptions = JSON.parse(JSON.stringify(this.list)); + this.replaceProp(treeOptions) + this.formTypeOptions=treeOptions + this.restaurants=this.loadFatherType() + } + } + } } } </script> <style scoped> -.standard {} +.standard { + +} .standard .contentTable{ } @@ -321,6 +612,7 @@ .thing .left { width: 295px; height: calc(100% - 32px); + overflow-y: auto; border-right: 3px solid rgb(245, 247, 251); padding: 16px; } -- Gitblit v1.9.3