From 363678a54142e62fdd4ca39a0db5c54af1a704dc Mon Sep 17 00:00:00 2001 From: zouyu <2723363702@qq.com> Date: 星期四, 29 二月 2024 15:39:59 +0800 Subject: [PATCH] 生产调度修改 --- src/views/plan/productionschedul/index.vue | 652 ++++++++++++++++++++++++++++++++++++++++++++++++++--------- 1 files changed, 551 insertions(+), 101 deletions(-) diff --git a/src/views/plan/productionschedul/index.vue b/src/views/plan/productionschedul/index.vue index 0775072..fb8f678 100644 --- a/src/views/plan/productionschedul/index.vue +++ b/src/views/plan/productionschedul/index.vue @@ -2,45 +2,194 @@ <div class="mod-config"> <basic-container> <el-row> - <el-col :span="12"> - <div style="height:80vh"> - <avue-crud :data="tableData" ref="crud" :option="option" :span-method="spanMethod" - @refresh-change="getData" - :page="page" - @selection-change="selectionRow" - :table-loading="loading"> - <template #menu="{ row, index }"> - <el-button type="text" icon="el-icon-delete" size="small" @click="deleteHandle(row, index)">鍒犻櫎</el-button> - </template> - </avue-crud> - </div> - </el-col> - <el-col :span="12" style="padding-left: 10px"> - <div style=""> - <el-card> - <div slot="header" class="clearfix"> - <span>璋冨害鏃堕棿绾�</span> - <el-button style="float: right; padding: 3px 0" type="text">鎿嶄綔鎸夐挳</el-button> + <el-col :span="24"> + <el-row style="padding:0px 10px;"> + <el-col :span="24" style="margin: 0;"> + <div style="display:flex;height:36px;justify-content: space-between;align-items:center;"> + <div> + <el-dropdown @command="changeTable"> + <span :style="dropdownTitleStyle" class="el-dropdown-link"> + {{dropdownTitle}}<i class="el-icon-arrow-down el-icon--right"></i> + </span> + <el-dropdown-menu slot="dropdown"> + <el-dropdown-item command="undone">寰呭畬鎴愯皟搴�</el-dropdown-item> + <el-dropdown-item command="done">宸插畬鎴愯皟搴�</el-dropdown-item> + </el-dropdown-menu> + </el-dropdown> + </div> + <div> + <el-button @click="tagFinished" v-if="showUnDownTable" size="mini" round type="success">鏍囪宸插畬鎴�</el-button> + <el-button size="mini" round type="primary" + v-if="permissions.plan_productionschedul_edit_line && showUnDownTable" + @click="openEditDialog">缂栬緫鏃堕棿绾�</el-button> + <el-tooltip content="鍒锋柊"> + <el-button circle icon="el-icon-refresh" @click="getDataList"></el-button> + </el-tooltip> + </div> </div> - <div style="height:70vh;overflow-y: scroll;"> - <el-timeline> - <el-timeline-item - placement="top" - v-for="(item, index) in scheduleList" - :key="index" - :timestamp="item.planTime"> - <el-card style="width:95%;margin: 0;padding: 0px 10px;"> - <p style="font-weight: bold;">{{item.title}}</p> - <p>瀹為檯鏃堕棿: {{ item.actualTime }}</p> - </el-card> - </el-timeline-item> - </el-timeline> - </div> - </el-card> - </div> + <!-- 寰呭畬鎴愯皟搴﹁〃鏍� --> + <avue-crud + v-if="showUnDownTable" + class="unfinished-crud" + :data="tableData" + ref="unfinished" + :option="option" + :span-method="spanMethod" + @refresh-change="getDataList" + @current-change="handleCurrentChange" + @size-change="handleSizeChange" + @cell-click="handleClickCell" + :page="page" + @selection-change="selectionRow" + :table-loading="loading"> + <template slot="product" slot-scope="scope"> + <el-link type="primary">{{ scope.row.product }}</el-link> + </template> + <template #menu="{ row, index }"> + <el-button + v-if="permissions.plan_productionschedul_edit" + type="text" + icon="el-icon-edit" + size="small" + @click="editHandle(row, index)">缂栬緫</el-button> + <el-button + v-if="permissions.plan_productionschedul_del" + type="text" + icon="el-icon-delete" + size="small" + @click="deleteHandle(row, index)">鍒犻櫎</el-button> + </template> + </avue-crud> + <!-- 宸插畬鎴愯皟搴﹁〃鏍� --> + <avue-crud + v-else + class="finished-crud" + :data="finishedTableData" + ref="finished" + :option="finishedOption" + :span-method="spanMethod" + @refresh-change="getFinishedData" + @current-change="handleCurrentChange" + @cell-click="handleClickCell" + @size-change="handleSizeChange" + :page="finishedPage" + @selection-change="selectionFinishedRow"> + <template slot="product" slot-scope="scope"> + <el-link type="primary">{{ scope.row.product }}</el-link> + </template> + </avue-crud> + </el-col> + </el-row> </el-col> </el-row> </basic-container> + <!-- 缂栬緫鏃堕棿绾� --> + <el-dialog + title="缂栬緫鏃堕棿绾�" + :visible.sync="dialogVisible" + top="5vh" + width="50%"> + <div style="height:60vh;overflow-y: scroll;"> + <el-timeline> + <el-timeline-item + placement="top" + v-for="(item, index) in scheduleEditList" + :key="index" + :timestamp="item.title"> + <el-card shadow="hover" style="width:90%" :body-style="{padding:'20px 20px 5px 20px'}"> + <el-row> + <el-col :span="3"> + <p style="font-weight: bold;line-height: 50%;">璁″垝鏃堕棿: </p> + </el-col> + <el-col :span="21"> + <el-date-picker + style="width:100%" + v-model="item.planTime" + value-format="yyyy-MM-dd HH:mm:ss" + type="datetime" + placeholder="閫夋嫨璁″垝鏃堕棿"> + </el-date-picker> + </el-col> + </el-row> + <el-row> + <el-col :span="3"> + <p style="font-weight: bold;line-height: 50%;">瀹為檯鏃堕棿: </p> + </el-col> + <el-col :span="21"> + <el-date-picker + style="width:100%" + v-model="item.actualTime" + value-format="yyyy-MM-dd HH:mm:ss" + type="datetime" + placeholder="閫夋嫨瀹為檯鏃堕棿"> + </el-date-picker> + </el-col> + </el-row> + </el-card> + </el-timeline-item> + </el-timeline> + </div> + <span slot="footer" class="dialog-footer"> + <el-button @click="dialogVisible = false">鍙� 娑�</el-button> + <el-button type="primary" @click="confirmEditSchedul">纭� 瀹�</el-button> + </span> + </el-dialog> + <!-- 缂栬緫鐢熶骇杩囩▼鍜岀敓浜ф儏鍐� --> + <el-dialog + title="缂栬緫" + :visible.sync="editDialogVisible" + width="50%"> + <el-form :model="editForm" label-width="120px"> + <el-row> + <el-col :span="24"> + <el-form-item label="鐢熶骇鎯呭喌:"> + <el-input style="width:100%" placeholder="璇疯緭鍏ョ敓浜ф儏鍐�" type="textarea" :row="2" v-model="editForm.productionStatus"></el-input> + </el-form-item> + </el-col> + </el-row> + <el-row> + <el-col :span="24"> + <el-form-item label="鐢熶骇绋嬪害:"> + <el-input style="width:100%" placeholder="璇疯緭鍏ョ敓浜х▼搴�" type="textarea" :row="2" v-model="editForm.productionRoutine"></el-input> + </el-form-item> + </el-col> + </el-row> + </el-form> + <span slot="footer" class="dialog-footer"> + <el-button @click="editDialogVisible = false">鍙� 娑�</el-button> + <el-button type="primary" @click="confirmEdit()">纭� 瀹�</el-button> + </span> + </el-dialog> + <!-- 鏌ョ湅鏃堕棿绾� --> + <el-dialog + title="鏌ョ湅璋冨害鏃堕棿绾�" + top="5vh" + :visible.sync="showTimeLineDialog" + width="40%"> + <el-card> + <div style="height:500px;overflow-y: scroll;"> + <el-timeline> + <el-timeline-item + placement="top" + :color="(item.actualTime) ? '#34BD66' :null" + :icon="(item.actualTime) ? 'el-icon-circle-check' :null" + v-for="(item, index) in scheduleList" + :key="index" + :timestamp="item.title"> + <el-card shadow="hover" :body-style="{margin: '0',padding:'0px 20px 0px 20px'}" style="width:90%;"> + <p> + <span style="font-weight: bold;">璁″垝鏃堕棿: </span> + {{item.planTime}} + </p> + <p> + <span style="font-weight: bold;">瀹為檯鏃堕棿: </span> + {{ item.actualTime }}</p> + </el-card> + </el-timeline-item> + </el-timeline> + </div> + </el-card> + </el-dialog> </div> </template> @@ -48,32 +197,65 @@ import { fetchScheduleList, fetchScheduleById, + fillTime, + deleteSchedul, + updateState, + checkTimeLines, + updateSchedul } from '@/api//plan/productionschedul' -import TableForm from './template-form' import ttable from '@/views/common/ztt-table.vue' import { mapGetters } from 'vuex' export default { data() { return { + dropdownTitleStyle: { + color: '#E84738', + fontWeight: 'bold' + }, + showUnDownTable: true, + dropdownTitle: '寰呭畬鎴愯皟搴�', + showTimeLineDialog:false, + editForm:{ + id: null, + productionRoutine: null, + productionStatus: null, + }, + editDialogVisible: false, + dialogVisible: false, scheduleList: [], + scheduleEditList: [], typeOptions: [], multipleSelection: [], loading: true, tableData: [], + finishedTableData: [], page: { - total: 10, + total: 0, currentPage: 1, - pageSize: 10 + pageSize: 10, + pagerCount: 5 + }, + finishedPage: { + total: 0, + currentPage: 1, + pageSize: 10, + pagerCount: 5 }, option: { - height: 400, + defaultSort:{ + prop:'id', + order:'descending' + }, + height: 530, selection: true, columnBtn: false, index: true, - rowKey: 'product', + indexFixed: false, + selectionFixed: false, + rowKey: 'mid', indexLabel: '搴忓彿', menuAlign: 'center', - menuWidth: 100, + menuWidth: 130, editBtn: false, delBtn: false, addBtn: false, @@ -123,6 +305,119 @@ prop: 'product', label: '浜у搧鍚�', overHidden: true, + slot: true + }, + { + minWidth: 120, + prop: 'specs', + label: '瑙勬牸鍨嬪彿', + overHidden: true, + }, + { + minWidth: 120, + prop: 'unit', + label: '鍗曚綅', + overHidden: true, + }, + { + minWidth: 120, + prop: 'number', + label: '鏁伴噺', + overHidden: true, + }, + { + minWidth: 120, + prop: 'productionStatus', + label: '鐢熶骇鎯呭喌', + overHidden: true, + }, + { + minWidth: 120, + prop: 'productionRoutine', + label: '鐢熶骇绋嬪害', + overHidden: true, + }, + { + minWidth: 120, + prop: 'projectLeader', + label: '椤圭洰璐熻矗浜�', + overHidden: true, + }, + { + minWidth: 150, + prop: 'remark', + label: '澶囨敞', + overHidden: true, + } + ], + }, + finishedOption: { + refreshBtn: false, // 鏄惁鏄剧ず鍒锋柊鎸夐挳 + defaultSort:{ + prop:'id', + order:'descending' + }, + height: 230, + selection: true, + columnBtn: false, + index: true, + indexFixed: false, + selectionFixed: false, + rowKey: 'mid', + indexLabel: '搴忓彿', + menu: false, + menuAlign: 'center', + menuWidth: 130, + editBtn: false, + delBtn: false, + addBtn: false, + border: true, + align: 'center', + column: [ + { + minWidth: 120, + prop: 'projectName', + label: '椤圭洰鍚嶇О', + overHidden: true, + }, + { + minWidth: 100, + prop: 'contractNo', + label: '鍚堝悓鍙�', + overHidden: true, + }, + { + minWidth: 120, + prop: 'orderTime', + label: '鎺ュ崟鏃ユ湡', + overHidden: true, + formatter: (row,columnValue)=> this.formatDate(row,columnValue) + }, + { + minWidth: 120, + prop: 'customerName', + label: '瀹㈡埛鍚嶇О', + overHidden: true, + }, + { + minWidth: 120, + prop: 'deliveryDate', + label: '浜よ揣鏃ユ湡', + overHidden: true, + formatter: (row,columnValue)=> this.formatDate(row,columnValue) + }, + { + minWidth: 120, + prop: 'productType', + label: '浜у搧绫诲瀷', + overHidden: true, + }, + { + minWidth: 120, + prop: 'product', + label: '浜у搧鍚�', + overHidden: true, + slot: true }, { minWidth: 120, @@ -169,12 +464,15 @@ ], }, spanArr: [{ + prop: 'id', + span: [] + },{ prop: 'projectName', span: [] }, { prop: 'contractNo', span: [] - }, + }, { prop: 'orderTime', span: [] @@ -196,33 +494,154 @@ }, components: { ttable, - TableForm, }, computed: { ...mapGetters(['permissions']), }, created(){ + if(!this.permissions.plan_productionschedul_edit && !this.permissions.plan_productionschedul_del){ + this.option.menu = false + } this.loading = true - this.getData() + this.getUnFinishedData() + this.getFinishedData() this.getParamType() - this.rowSort() + // this.rowSort() this.rowCalc() }, beforeUpdate() { - this.rowSort() + // this.rowSort() this.rowCalc() }, watch:{ - + editDialogVisible(newVal){ + if(!newVal){ + this.editForm = { + id: null, + productionRoutine: null, + productionStatus: null, + } + } + }, + multipleSelection(newVal){ + if(newVal.length==0){ + this.scheduleList = [] + } + } }, - mounted() { - - }, - beforeDestroy() { - }, + mounted() {}, + beforeDestroy() {}, methods: { + handleClickCell(row, column, cell, event){ + if(column.label === '浜у搧鍚�'){ + this.getScheduleById(row.mid) + this.showTimeLineDialog = true + } + }, + changeTable(command){ + if(command === 'undone'){ + this.dropdownTitle = '寰呭畬鎴愯皟搴�' + this.dropdownTitleStyle = {color:'#E84738',fontWeight: 'bold'} + this.showUnDownTable = true + }else if(command === 'done'){ + this.dropdownTitle = '宸插畬鎴愯皟搴�' + this.dropdownTitleStyle = {color:'#34BD66',fontWeight: 'bold'} + this.showUnDownTable = false + } + }, + tagFinished(){ + if(this.multipleSelection.length < 1){ + this.$message.warning("璇疯嚦灏戦�夋嫨涓�鏉℃暟鎹�") + return + } + let ids = this.multipleSelection.map(ele=>{ + return ele.mid + }) + updateState(ids).then(res=>{ + if(res.status===200){ + this.$message.success("鏇存柊鎴愬姛") + this.getUnFinishedData() + this.getFinishedData() + } + }).catch(error=>{ + console.error(error); + }) + }, + confirmEdit(){ + const _than = this + updateSchedul(this.editForm).then(res=>{ + if(res.status===200){ + _than.$message.success("鏇存柊鎴愬姛") + _than.editDialogVisible = false + _than.getUnFinishedData() + } + }).catch(error=>{ + console.error(error); + }) + }, + editHandle(row,index){ + if(row){ + this.editForm.id = row.mid + this.editForm.productionRoutine = row.productionRoutine + this.editForm.productionStatus = row.productionStatus + this.editDialogVisible = true + } + }, + openEditDialog(){ + if(this.multipleSelection.length<1){ + this.$message.warning("璇疯嚦灏戦�夋嫨涓�鏉℃暟鎹�") + return + } + let mIds = this.multipleSelection.map(ele=>{ + return ele.mid + }) + checkTimeLines(mIds).then(res=>{ + if(res.data.data.length==1){ + let dataList = this.initTimeLine(res.data.data[0]) + this.scheduleEditList = dataList + this.dialogVisible = true + }else{ + this.$message.error("閫変腑鏁版嵁鐨勮皟搴︽椂闂寸嚎涓嶄竴鑷�!") + } + }).catch(error=>{ + console.error(error); + }) + }, + confirmEditSchedul(){ + const _than = this + let data = this.scheduleEditList + let mIds = this.multipleSelection.map(ele=>{ + return ele.mid + }) + let obj = { + "documentActualTime": data[0].actualTime, + "documentPlanTime": data[0].planTime, + "bomActualTime": data[1].actualTime, + "bomPlanTime": data[1].planTime, + "contractActualTime": data[2].actualTime, + "contractPlanTime": data[2].planTime, + "arrivalActualTime": data[3].actualTime, + "arrivalPlanTime": data[3].planTime, + "checkActualTime": data[4].actualTime, + "checkPlanTime": data[4].planTime, + "productActualTime": data[5].actualTime, + "productPlanTime": data[5].planTime, + "mids": mIds, + } + fillTime(obj).then(res=>{ + if(res.status===200){ + _than.$message.success("鏇存柊鎴愬姛") + }else{ + _than.$message.error("鏇存柊澶辫触") + } + // _than.getScheduleById(orderObj.id) + _than.dialogVisible = false + }).catch(error=>{ + console.error(error); + }) + }, initTimeLine(data){ - this.scheduleList = [] + let scheduleList = [] if(data){ let arr = [ { @@ -256,24 +675,35 @@ planTime: data.productPlanTime, }, ] - this.scheduleList = arr + scheduleList = arr + return scheduleList } }, getScheduleById(id){ if(id){ fetchScheduleById(id).then(res=>{ - this.initTimeLine(res.data.data) + this.scheduleList = this.initTimeLine(res.data.data) }).catch(error=>{ - console.log(error); + console.error(error); }) } }, selectionRow(val){ + this.multipleSelection = val + // if(this.multipleSelection.length>0){ + // this.getScheduleById(val[val.length-1].mid) + // this.showTimeLineDialog = true + // } + }, + selectionFinishedRow(val){ if (val.length > 1) { - const preVal = val.shift(); - this.$refs.crud.toggleRowSelection(preVal, false); - } - this.getScheduleById(val[0].id) + const preVal = val.shift(); + this.$refs.finished.toggleRowSelection(preVal, false); + } + else{ + this.scheduleList=[] + } + this.getScheduleById(val[0].mid) }, formatDate(row, cellValue){ if (cellValue) { @@ -284,12 +714,32 @@ } return '' }, + handleSizeChange(val){ + if(val){ + this.page.pageSize=val + this.getUnFinishedData() + } + }, + handleCurrentChange(val){ + if(val){ + this.page.currentPage=val + this.getUnFinishedData() + } + }, // 鑾峰彇鏁版嵁鍒楄〃 - getData() { + getDataList(){ + this.getUnFinishedData() + this.getFinishedData() + this.$nextTick(()=>{ + this.rowCalc() + }) + }, + getUnFinishedData() { this.loading = true let param = { - size: 20, - current: 1, + size: this.page.pageSize, + current: this.page.currentPage, + state: false } fetchScheduleList(param).then((res) => { this.tableData = res.data.data.records @@ -299,17 +749,37 @@ }) this.loading = false }, - handleCurrentChange(val) { - this.multipleSelection = val + getFinishedData() { + this.loading = true + let param = { + size: this.finishedPage.pageSize, + current: this.finishedPage.currentPage, + state: true + } + fetchScheduleList(param).then((res) => { + this.finishedTableData = res.data.data.records + this.finishedPage.total = res.data.data.total + this.finishedPage.currentPage = res.data.data.records.pages + this.scheduleList = [] + }) + this.loading = false }, // 鍒犻櫎 deleteHandle(row,index) { - this.$confirm('鏄惁纭鍒犻櫎', '鎻愮ず', { + const _than = this + _than.$confirm('鏄惁纭鍒犻櫎璇ョ敓浜ц皟搴︿俊鎭�', '鎻愮ず', { confirmButtonText: '纭畾', cancelButtonText: '鍙栨秷', type: 'warning' }).then(function() { - + deleteSchedul(row.mid).then(res=>{ + if(res.status===200){ + _than.$message.success("鍒犻櫎鎴愬姛") + _than.getDataList() + } + }).catch(error=>{ + console.error(error) + }) }) }, //鍔ㄦ�佸悎骞舵柟娉� @@ -320,7 +790,7 @@ ele.span = this.rowSpan(ele.prop, parent) }) }, - rowSort(list) { + rowSort() { let propList = this.spanArr.map(ele => ele.prop) this.spanArr.forEach((ele, index) => { let key = ele.prop @@ -380,42 +850,22 @@ } </script> <style> -.basic-template-table .el-table__body .el-table__row td:first-child .cell { - padding-left: 0px; - padding-right: 0px; -} - -.basic-template-table .el-table__body .el-table__row:hover { - cursor: move; -} - -.basic-template-table .el-table__body .el-table__row:hover .icon { - display: inline-block; -} - -.basic-template-table .el-table__body .el-table__row .icon { - color: rgba(0, 0, 0, 0.45); - font-size: 12px; - line-height: 18px; +.unfinished-crud .avue-crud__tip{ display: none; } - -.aufontAll { - font-family: aufontAll !important; - font-size: 14px; - font-style: normal; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; +.unfinished-crud .avue-crud__menu{ + display: none; } - -.h-icon-all-drag { - background: url('/img/tz.png') center center no-repeat; - background-size: cover; - font-size: 14px; +.finished-crud .avue-crud__tip{ + display: none; } -.h-icon-all-drag:before { - content: '\E63E'; - font-size: 14px; - visibility: hidden; +.finished-crud .avue-crud__menu{ + display: none; +} +.avue-crud__pagination { + position: relative; + padding: 0px 0 0px 20px; + text-align: right; + z-index: 10; } </style> -- Gitblit v1.9.3