new file: src/api/plan/productionschedul.js
modified: src/views/common/ztt-table.vue
modified: src/views/plan/customerorder/index.vue
modified: src/views/plan/manufacturingorder/index.vue
new file: src/views/plan/productionschedul/index.vue
new file: src/views/plan/productionschedul/template-form.vue
¶Ô±ÈÐÂÎļþ |
| | |
| | | import request from '@/router/axios' |
| | | |
| | | export function fetchScheduleList(query) { |
| | | return request({ |
| | | url: '/mes/productionSchedul/page', |
| | | method: 'get', |
| | | params: query |
| | | }) |
| | | } |
| | | |
| | | export function fetchScheduleById(id) { |
| | | return request({ |
| | | url: '/mes//productionSchedul/'+id, |
| | | method: 'get', |
| | | }) |
| | | } |
| | |
| | | v-bind="$attrs" |
| | | v-on="$listeners" |
| | | :highlight-current-row="true" |
| | | :row-key=" |
| | | (row) => { |
| | | return row.id |
| | | } |
| | | " |
| | | :row-key="rowKey" |
| | | @row-dblclick="dbClickRow" |
| | | @row-contextmenu="contextMenu" |
| | | @header-click="headClick" |
| | |
| | | name: 'TTable', |
| | | components: { exSlot, advancedSearchDialog, zttdraggable }, |
| | | props: { |
| | | rowKey: { |
| | | type: String, |
| | | default: ()=>{ |
| | | return 'id' |
| | | } |
| | | }, |
| | | // è¡¨æ ¼åå·ï¼mini,medium,small |
| | | tableSize: { type: String, default: 'small' }, |
| | | // æ°æ®è¯·æ±æ¹æ³ |
| | |
| | | > --> |
| | | </template> |
| | | </ttable> |
| | | |
| | | <!-- å¼¹çª, æ¥æéæ© --> |
| | | <ConfirmPullCustomerorder |
| | | v-if="showPullCustomerOrderVisible" |
| | |
| | | getByMoIds([this.orderPlan.id]).then((repsonse) => { |
| | | const resData = repsonse.data.data |
| | | const resCode = repsonse.data.code |
| | | console.log("resData-----",repsonse); |
| | | if (resCode === 0) { |
| | | const _that = this |
| | | for (const key in resData) { |
¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <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> |
| | | </div> |
| | | <div style="height:70vh;overflow-y: scroll;"> |
| | | <el-timeline reverse> |
| | | <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 0px;"> |
| | | <p style="font-weight: bold;">{{item.title}}</p> |
| | | <p>å®é
æ¶é´: {{ item.actualTime }}</p> |
| | | </el-card> |
| | | </el-timeline-item> |
| | | </el-timeline> |
| | | </div> |
| | | </el-card> |
| | | </div> |
| | | </el-col> |
| | | </el-row> |
| | | </basic-container> |
| | | </div> |
| | | </template> |
| | | |
| | | <script> |
| | | import { |
| | | fetchScheduleList, |
| | | fetchScheduleById, |
| | | } 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 { |
| | | scheduleList: [], |
| | | typeOptions: [], |
| | | multipleSelection: [], |
| | | loading: true, |
| | | tableData: [], |
| | | page: { |
| | | total: 10, |
| | | currentPage: 1, |
| | | pageSize: 10 |
| | | }, |
| | | option: { |
| | | height: 'auto', |
| | | selection: true, |
| | | columnBtn: false, |
| | | index: true, |
| | | rowKey: 'product', |
| | | indexLabel: 'åºå·', |
| | | menuAlign: 'center', |
| | | menuWidth: 100, |
| | | 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, |
| | | }, |
| | | { |
| | | 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, |
| | | } |
| | | ], |
| | | }, |
| | | spanArr: [{ |
| | | prop: 'projectName', |
| | | span: [] |
| | | }, { |
| | | prop: 'contractNo', |
| | | span: [] |
| | | }, |
| | | { |
| | | prop: 'orderTime', |
| | | span: [] |
| | | }, |
| | | { |
| | | prop: 'customerName', |
| | | span: [] |
| | | }, |
| | | { |
| | | prop: 'deliveryDate', |
| | | span: [] |
| | | }, |
| | | { |
| | | prop: 'productType', |
| | | span: [] |
| | | }, |
| | | ], |
| | | } |
| | | }, |
| | | components: { |
| | | ttable, |
| | | TableForm, |
| | | }, |
| | | computed: { |
| | | ...mapGetters(['permissions']) |
| | | }, |
| | | created(){ |
| | | this.loading = true |
| | | this.getData() |
| | | this.getParamType() |
| | | this.rowSort() |
| | | this.rowCalc() |
| | | }, |
| | | beforeUpdate() { |
| | | this.rowSort() |
| | | this.rowCalc() |
| | | }, |
| | | watch:{ |
| | | |
| | | }, |
| | | mounted() { |
| | | |
| | | }, |
| | | beforeDestroy() { |
| | | }, |
| | | methods: { |
| | | initTimeLine(data){ |
| | | this.scheduleList = [] |
| | | if(data){ |
| | | let arr = [ |
| | | { |
| | | title: 'æä»¶ç¾å', |
| | | actualTime: data.documentActualTime, |
| | | planTime: data.documentPlanTime, |
| | | }, |
| | | { |
| | | title: 'ä¸è¾¾ç©æéæ±', |
| | | actualTime: data.bomActualTime, |
| | | planTime: data.bomPlanTime, |
| | | }, |
| | | { |
| | | title: 'éè´è¯¢ä»·+ååç¾è®¢', |
| | | actualTime: data.contractActualTime, |
| | | planTime: data.contractPlanTime, |
| | | }, |
| | | { |
| | | title: 'ç©æéè´å°è´§', |
| | | actualTime: data.arrivalActualTime, |
| | | planTime: data.arrivalPlanTime, |
| | | }, |
| | | { |
| | | title: 'ç©æå°è´§æ£éª', |
| | | actualTime: data.checkActualTime, |
| | | planTime: data.checkPlanTime, |
| | | }, |
| | | { |
| | | title: '颿ãè£
ç®±å
¥åº', |
| | | actualTime: data.productActualTime, |
| | | planTime: data.productPlanTime, |
| | | }, |
| | | ] |
| | | this.scheduleList = arr |
| | | } |
| | | }, |
| | | getScheduleById(id){ |
| | | if(id){ |
| | | fetchScheduleById(id).then(res=>{ |
| | | this.initTimeLine(res.data.data) |
| | | }).catch(error=>{ |
| | | console.log(error); |
| | | }) |
| | | } |
| | | }, |
| | | selectionRow(val){ |
| | | if (val.length > 1) { |
| | | const preVal = val.shift(); |
| | | this.$refs.crud.toggleRowSelection(preVal, false); |
| | | } |
| | | this.getScheduleById(val[0].id) |
| | | }, |
| | | formatDate(row, cellValue){ |
| | | if (cellValue) { |
| | | const dutyDateList = /\d{4}-\d{1,2}-\d{1,2}/g.exec(cellValue) |
| | | if (dutyDateList && dutyDateList.length > 0) { |
| | | return dutyDateList[0] |
| | | } |
| | | } |
| | | return '' |
| | | }, |
| | | // è·åæ°æ®å表 |
| | | getData() { |
| | | this.loading = true |
| | | let param = { |
| | | size: 20, |
| | | current: 1, |
| | | } |
| | | fetchScheduleList(param).then((res) => { |
| | | this.tableData = res.data.data.records |
| | | this.page.total = res.data.data.total |
| | | this.page.currentPage = res.data.data.records.pages |
| | | }) |
| | | this.loading = false |
| | | |
| | | }, |
| | | handleCurrentChange(val) { |
| | | this.multipleSelection = val |
| | | }, |
| | | // å é¤ |
| | | deleteHandle(row,index) { |
| | | this.$confirm('æ¯å¦ç¡®è®¤å é¤', 'æç¤º', { |
| | | confirmButtonText: 'ç¡®å®', |
| | | cancelButtonText: 'åæ¶', |
| | | type: 'warning' |
| | | }).then(function() { |
| | | |
| | | }) |
| | | }, |
| | | //卿åå¹¶æ¹æ³ |
| | | rowCalc() { |
| | | this.spanArr.forEach((ele, index) => { |
| | | let parent |
| | | if (index !== 0) parent = this.spanArr[ele.parent || index - 1].span |
| | | ele.span = this.rowSpan(ele.prop, parent) |
| | | }) |
| | | }, |
| | | rowSort(list) { |
| | | let propList = this.spanArr.map(ele => ele.prop) |
| | | this.spanArr.forEach((ele, index) => { |
| | | let key = ele.prop |
| | | this.tableData = this.tableData.sort((a, b) => { |
| | | let flag = true; |
| | | for (let i = 0; i < index; i++) { |
| | | let prop = this.spanArr[i].prop |
| | | flag = flag && a[prop] == b[prop] |
| | | } |
| | | if (flag) { |
| | | if (a[key] < b[key]) { return 1; } |
| | | else if (a[key] > b[key]) { return -1; } |
| | | return 0; |
| | | } |
| | | return 0; |
| | | }) |
| | | }) |
| | | }, |
| | | rowSpan(key, parent) { |
| | | let list = []; |
| | | let position = 0; |
| | | this.tableData.forEach((item, index) => { |
| | | if (index === 0) { |
| | | list.push(1) |
| | | let position = 0; |
| | | } else { |
| | | if (this.tableData[index][key] === this.tableData[index - 1][key]) { |
| | | if (parent && parent[index] !== 0) { |
| | | list.push(1) |
| | | position = index |
| | | } else { |
| | | list[position] += 1; |
| | | list.push(0) |
| | | } |
| | | } else { |
| | | list.push(1) |
| | | position = index |
| | | } |
| | | } |
| | | }) |
| | | return list |
| | | }, |
| | | spanMethod({ row, column, rowIndex, columnIndex }) { |
| | | for (let i = 0; i < this.spanArr.length; i++) { |
| | | const ele = this.spanArr[i] |
| | | if (column.property == ele.prop) { |
| | | const _row = ele.span[rowIndex]; |
| | | const _col = _row > 0 ? 1 : 0; |
| | | return { |
| | | rowspan: _row, |
| | | colspan: _col |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | </script> |
| | | <style scoped> |
| | | .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; |
| | | display: none; |
| | | } |
| | | |
| | | .aufontAll { |
| | | font-family: aufontAll !important; |
| | | font-size: 14px; |
| | | font-style: normal; |
| | | -webkit-font-smoothing: antialiased; |
| | | -moz-osx-font-smoothing: grayscale; |
| | | } |
| | | |
| | | .h-icon-all-drag { |
| | | background: url('/img/tz.png') center center no-repeat; |
| | | background-size: cover; |
| | | font-size: 14px; |
| | | } |
| | | .h-icon-all-drag:before { |
| | | content: '\E63E'; |
| | | font-size: 14px; |
| | | visibility: hidden; |
| | | } |
| | | .avue-main .el-card__body{ |
| | | padding: 0px 20px; |
| | | } |
| | | </style> |
¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <el-dialog |
| | | v-diadrag |
| | | :title="!dataForm.id ? 'æ°å¢' : 'ä¿®æ¹'" |
| | | :close-on-click-modal="false" |
| | | :visible.sync="visible" |
| | | > |
| | | <el-form |
| | | :model="dataForm" |
| | | :rules="dataRule" |
| | | ref="dataForm" |
| | | label-width="100px" |
| | | class="l-mes" |
| | | > |
| | | <el-form-item label="模æ¿ç¼å·" prop="templateNo"> |
| | | <el-input |
| | | v-model="dataForm.templateNo" |
| | | placeholder="模æ¿ç¼å·" |
| | | ></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="模æ¿åç§°" prop="templateName"> |
| | | <el-input |
| | | v-model="dataForm.templateName" |
| | | placeholder="模æ¿åç§°" |
| | | ></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="模æ¿ç±»å" prop="templateType"> |
| | | <el-select |
| | | v-model="dataForm.templateType" |
| | | placeholder="模æ¿ç±»å" |
| | | filterable |
| | | style="width: 100%" |
| | | clearable |
| | | @change="templateTypeChange" |
| | | > |
| | | <el-option |
| | | v-for="item in templateTypeList" |
| | | :key="item.id" |
| | | :label="item.templateTypeName" |
| | | :value="item.templateTypeName" |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="夿³¨" prop="remark"> |
| | | <el-input v-model="dataForm.remark" placeholder="夿³¨"></el-input> |
| | | </el-form-item> |
| | | </el-form> |
| | | <span slot="footer" class="dialog-footer"> |
| | | <el-button @click="visible = false">åæ¶</el-button> |
| | | <el-button |
| | | type="primary" |
| | | :disabled="isSubmit" |
| | | v-thinclick="`dataFormSubmit`" |
| | | >ç¡®å®</el-button |
| | | > |
| | | </span> |
| | | </el-dialog> |
| | | </template> |
| | | |
| | | <script> |
| | | import { getObj, addObj, putObj, getTemplateTypes } from '@/api/basic/template' |
| | | |
| | | export default { |
| | | data() { |
| | | return { |
| | | templateTypeList: [], |
| | | visible: false, |
| | | dataForm: { |
| | | id: 0, |
| | | templateName: '', |
| | | templateNo: '', |
| | | templateType: '', |
| | | dataType: '', |
| | | remark: '' |
| | | }, |
| | | dataRule: { |
| | | templateName: [ |
| | | { required: true, message: '模æ¿åç§°ä¸è½ä¸ºç©º', trigger: 'blur' } |
| | | ], |
| | | templateType: [ |
| | | { required: true, message: '模æ¿ç±»åä¸è½ä¸ºç©º', trigger: 'blur' } |
| | | ] |
| | | }, |
| | | isSubmit: false |
| | | } |
| | | }, |
| | | methods: { |
| | | init(id) { |
| | | this.dataForm.id = id || 0 |
| | | this.visible = true |
| | | this.$nextTick(() => { |
| | | this.$refs.dataForm.resetFields() |
| | | Promise.all([this.getDict(), this.getDataForm(this.dataForm.id)]).then( |
| | | (res) => {} |
| | | ) |
| | | }) |
| | | }, |
| | | getDataForm(id) { |
| | | return new Promise((resolve, reject) => { |
| | | if (id) { |
| | | getObj(id) |
| | | .then((response) => { |
| | | if (response.data.code === 0) { |
| | | this.dataForm = response.data.data |
| | | resolve() |
| | | } else { |
| | | this.dataForm = {} |
| | | reject() |
| | | } |
| | | }) |
| | | .catch((error) => { |
| | | reject(error) |
| | | }) |
| | | } |
| | | }) |
| | | }, |
| | | getDict() { |
| | | return new Promise((resolve, reject) => { |
| | | getTemplateTypes() |
| | | .then((response) => { |
| | | if (response.data.code === 0) { |
| | | this.templateTypeList = response.data.data |
| | | resolve() |
| | | } else { |
| | | this.templateTypeList = [] |
| | | reject() |
| | | } |
| | | }) |
| | | .catch((error) => { |
| | | reject(error) |
| | | }) |
| | | }) |
| | | }, |
| | | templateTypeChange() { |
| | | const currOperationTemplateType = this.dataForm.templateType |
| | | const templateType = this.templateTypeList.find( |
| | | (item) => item.templateTypeName === currOperationTemplateType |
| | | ) |
| | | console.log(templateType) |
| | | if (templateType != undefined) { |
| | | this.dataForm.dataType = templateType.dataType |
| | | } else { |
| | | this.dataForm.dataType = '' |
| | | } |
| | | }, |
| | | // 表åæäº¤ |
| | | dataFormSubmit() { |
| | | this.isSubmit = true |
| | | this.$refs.dataForm.validate((valid) => { |
| | | if (valid) { |
| | | if (this.dataForm.id) { |
| | | putObj(this.dataForm).then((data) => { |
| | | this.$message.success('ä¿®æ¹æå') |
| | | this.visible = false |
| | | this.isSubmit = false |
| | | this.$emit('refreshDataList') |
| | | }) |
| | | } else { |
| | | addObj(this.dataForm).then((data) => { |
| | | this.$message.success('æ·»å æå') |
| | | this.visible = false |
| | | this.isSubmit = false |
| | | this.$emit('refreshDataList') |
| | | }) |
| | | } |
| | | } else { |
| | | this.isSubmit = false |
| | | } |
| | | }) |
| | | } |
| | | } |
| | | } |
| | | </script> |