Compare commits

...

7 Commits

Author SHA1 Message Date
916f99a852 Merge pull request 'projects/mes-zhp' (#395) from projects/mes-zhp into projects/mes-test
Reviewed-on: #395
2024-09-11 14:28:11 +08:00
‘937886381’
9581d91c52 生产 2024-09-11 14:26:39 +08:00
‘937886381’
c847ba1595 生产管理 2024-09-11 10:36:47 +08:00
‘937886381’
2ab8a99ff5 Merge branch 'projects/mes-test' into projects/mes-zhp 2024-09-05 11:18:44 +08:00
‘937886381’
d65dcb8712 修改 2024-09-05 11:18:03 +08:00
‘937886381’
2213b93f0a Merge branch 'projects/mes-test' into projects/mes-zhp 2024-08-13 08:36:54 +08:00
‘937886381’
d6acfa4fd7 新增 2024-08-13 08:36:23 +08:00
18 changed files with 1378 additions and 631 deletions

View File

@ -1,7 +1,7 @@
### ###
# @Author: Do not edit # @Author: Do not edit
# @Date: 2023-08-29 09:40:39 # @Date: 2023-08-29 09:40:39
# @LastEditTime: 2024-07-31 14:57:31 # @LastEditTime: 2024-09-02 09:07:05
# @LastEditors: zhp # @LastEditors: zhp
# @Description: # @Description:
### ###
@ -22,7 +22,7 @@ VUE_APP_TITLE = MES系统
# VUE_APP_BASE_API = 'http://192.168.1.56:48082' # VUE_APP_BASE_API = 'http://192.168.1.56:48082'
# VUE_APP_BASE_API = 'http://192.168.4.159:48080' # VUE_APP_BASE_API = 'http://192.168.4.159:48080'
# VUE_APP_BASE_API = 'http://192.168.1.64:48082' # VUE_APP_BASE_API = 'http://192.168.1.64:48082'
VUE_APP_BASE_API = 'http://192.168.1.99:48082' VUE_APP_BASE_API = 'http://192.168.1.20:48082'

View File

@ -165,3 +165,34 @@ export function orderVoid(data) {
data data
}) })
} }
export function orderSplit(data) {
return request({
url: '/base/order/split',
method: 'post',
data
})
}
export function getDetailTree(data) {
return request({
url: 'base/order/getDetailTree',
method: 'get',
params: data
})
}
export function getDetailTreeInfo(data) {
return request({
url: 'base/order/getDetailTreeInfoById',
method: 'get',
params: data
})
}
export function orderStop(data) {
return request({
url: 'base/order/stop',
method: 'post',
params: data
})
}

View File

@ -0,0 +1,27 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="72px" height="72px" viewBox="0 0 40 40" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>rollback</title>
<defs>
<filter x="-1.1%" y="-5.8%" width="102.1%" height="115.3%" filterUnits="objectBoundingBox" id="filter-1">
<feOffset dx="0" dy="5" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
<feGaussianBlur stdDeviation="6" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
<feColorMatrix values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.0926573427 0" type="matrix" in="shadowBlurOuter1" result="shadowMatrixOuter1"></feColorMatrix>
<feMerge>
<feMergeNode in="shadowMatrixOuter1"></feMergeNode>
<feMergeNode in="SourceGraphic"></feMergeNode>
</feMerge>
</filter>
</defs>
<g id="页面" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="页内多种导航方式" transform="translate(-1914.000000, -745.000000)" fill-rule="nonzero">
<g id="编组-16" filter="url(#filter-1)" transform="translate(94.000000, 641.000000)">
<g id="编组-3备份" transform="translate(1816.000000, 96.000000)">
<g id="rollback" transform="translate(16.000000, 15.000000)">
<rect id="矩形" fill="#000000" opacity="0" x="0" y="0" width="20" height="20"></rect>
<path d="M11.390625,3.78125 L5.71875,3.78125 L5.71875,2.625 C5.71875,2.5203125 5.5984375,2.4625 5.5171875,2.5265625 L3.2984375,4.2765625 C3.234375,4.3265625 3.234375,4.4234375 3.2984375,4.4734375 L5.5171875,6.2234375 C5.5984375,6.2875 5.71875,6.2296875 5.71875,6.125 L5.71875,4.96875 L11.203125,4.96875 C11.7554097,4.96875 12.203125,5.41646525 12.203125,5.96875 L12.203125,11.3125 C12.203125,11.8647847 11.7554097,12.3125 11.203125,12.3125 L2.93775156,12.3125 L2.93775156,12.3125 C2.55569144,12.3125 2.36466138,12.4938859 2.36466138,12.8566576 C2.36466138,13.5 2.93775156,13.5 2.93775156,13.5 C2.93775156,13.5 5.75537604,13.5 11.390625,13.5 C13,13.5 13.390625,12.8986083 13.390625,11.9909216 L13.390625,4.96875 C13.390625,4.06071182 13,3.78125 11.390625,3.78125 Z" id="路径" fill="#0B58FF"></path>
</g>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.4 KiB

View File

@ -1,41 +1,23 @@
<!-- <!--
* @Date: 2020-12-14 09:07:03 * @Date: 2020-12-14 09:07:03
* @LastEditors: zhp * @LastEditors: zhp
* @LastEditTime: 2023-11-14 10:11:09 * @LastEditTime: 2024-09-05 09:50:14
* @FilePath: \mt-bus-fe\src\views\OperationalOverview\components\baseTable.vue * @FilePath: \mt-bus-fe\src\views\OperationalOverview\components\baseTable.vue
* @Description: * @Description:
--> -->
<template> <template>
<div class="visual-base-table-container"> <div class="visual-base-table-container">
<el-table <el-table v-loading="isLoading"
v-loading="isLoading" :header-cell-style="{background:'rgba(4, 74, 132, .19)',color:'#fff'}" :row-style="setRowStyle" :data="renderData"
:header-cell-style="{background:'rgba(4, 74, 132, .19)',color:'#fff'}" border style="width: 100%; background: transparent">
:row-style="setRowStyle" <el-table-column v-if="page && limit && showIndex" prop="_pageIndex" :label="'tableHeader.index' | i18nFilter"
:data="renderData" :width="70" align="center" />
border <el-table-column v-for="item in renderTableHeadList" :key="item.prop" :show-overflow-tooltip="showOverflow"
style="width: 100%; background: transparent" v-bind="item">
>
<el-table-column
v-if="page && limit && showIndex"
prop="_pageIndex"
:label="'tableHeader.index' | i18nFilter"
:width="70"
align="center"
/>
<el-table-column
v-for="item in renderTableHeadList"
:key="item.prop"
:show-overflow-tooltip="showOverflow"
v-bind="item"
>
<template slot-scope="scope"> <template slot-scope="scope">
<component <component :is="item.subcomponent" v-if="item.subcomponent" :inject-data="{...scope.row, ...item}"
:is="item.subcomponent" @emitData="emitData" />
v-if="item.subcomponent"
:inject-data="{...scope.row, ...item}"
@emitData="emitData"
/>
<span v-else>{{ scope.row[item.prop] | commonFilter(item.filter) }}</span> <span v-else>{{ scope.row[item.prop] | commonFilter(item.filter) }}</span>
</template> </template>

View File

@ -5,13 +5,10 @@
<el-form-item label="工单名称" prop="name" v-if='!isBind'> <el-form-item label="工单名称" prop="name" v-if='!isBind'>
<el-input v-model="form.name"></el-input> <el-input v-model="form.name"></el-input>
</el-form-item> </el-form-item>
<el-form-item label="工单名称" prop="workOrderId" v-if='isBind'> <el-form-item label="工单名称" prop="workOrderId" v-if='isBind'>
<el-select v-model="form.workOrderId" placeholder="请选择" style="width: 100%;" filterable @change="getWorkOrderMsg"> <el-select v-model="form.workOrderId" placeholder="请选择" style="width: 100%;" filterable
<el-option @change="getWorkOrderMsg">
v-for="item in workOrderList" <el-option v-for="item in workOrderList" :key="item.id" :label="item.name" :value="item.id">
:key="item.id"
:label="item.name"
:value="item.id">
</el-option> </el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
@ -23,11 +20,8 @@
</el-col> </el-col>
<el-col :span='6'> <el-col :span='6'>
<el-form-item label="产品名称" prop="planProductId"> <el-form-item label="产品名称" prop="planProductId">
<el-select v-model="form.planProductId" placeholder="请选择" disabled style="width: 100%;"> <el-select v-model="form.planProductId" placeholder="请选择" disabled style="width: 100%;">
<el-option <el-option v-for="item in productList" :key="item.id" :label="item.name+' | '+item.specifications"
v-for="item in productList"
:key="item.id"
:label="item.name+' | '+item.specifications"
:value="item.id"> :value="item.id">
<span style="float: left">{{ item.name }}</span> <span style="float: left">{{ item.name }}</span>
<span style="float: right; color: #8492a6; font-size: 13px">{{ item.specifications }}</span> <span style="float: right; color: #8492a6; font-size: 13px">{{ item.specifications }}</span>
@ -37,13 +31,8 @@
</el-col> </el-col>
<el-col :span='6'> <el-col :span='6'>
<el-form-item label="计划开始时间"> <el-form-item label="计划开始时间">
<el-date-picker <el-date-picker v-model="planStartTime" type="datetime" value-format="yyyy-MM-dd HH:mm:ss"
v-model="planStartTime" style="width: 100%;" placeholder="选择日期" :disabled="isBind">
type="datetime"
value-format="yyyy-MM-dd HH:mm:ss"
style="width: 100%;"
placeholder="选择日期"
:disabled="isBind">
</el-date-picker> </el-date-picker>
</el-form-item> </el-form-item>
</el-col> </el-col>
@ -51,34 +40,27 @@
<el-row :gutter="20"> <el-row :gutter="20">
<el-col :span='6'> <el-col :span='6'>
<el-form-item label="计划完成时间"> <el-form-item label="计划完成时间">
<el-date-picker <el-date-picker v-model="planFinishTime" type="datetime" value-format="yyyy-MM-dd HH:mm:ss"
v-model="planFinishTime" style="width: 100%;" placeholder="选择日期" :disabled="isBind">
type="datetime"
value-format="yyyy-MM-dd HH:mm:ss"
style="width: 100%;"
placeholder="选择日期"
:disabled="isBind">
</el-date-picker> </el-date-picker>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span='6'> <el-col :span='6'>
<el-form-item label="计划投入数量" prop="planAssignQuantity"> <el-form-item label="计划投入数量" prop="planAssignQuantity">
<el-input-number v-model="form.planAssignQuantity" :min="0" :max="9999999999999" :disabled="isBind" style="width: 100%;"></el-input-number> <el-input-number v-model="form.planAssignQuantity" :min="0" :max="9999999999999" :disabled="isBind"
style="width: 100%;"></el-input-number>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span='6'> <el-col :span='6'>
<el-form-item label="计划生产数量" prop="planQuantity"> <el-form-item label="计划生产数量" prop="planQuantity">
<el-input-number v-model="form.planQuantity" :min="0" :max="9999999999999" :disabled="isBind" style="width: 100%;"></el-input-number> <el-input-number v-model="form.planQuantity" :min="0" :max="9999999999999" :disabled="isBind"
style="width: 100%;"></el-input-number>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span='6'> <el-col :span='6'>
<el-form-item label="关联工艺" prop="processFlowId"> <el-form-item label="关联工艺" prop="processFlowId">
<el-select v-model="form.processFlowId" placeholder="请选择" disabled style="width: 100%;"> <el-select v-model="form.processFlowId" placeholder="请选择" disabled style="width: 100%;">
<el-option <el-option v-for="item in processFlowList" :key="item.id" :label="item.name" :value="item.id">
v-for="item in processFlowList"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option> </el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
@ -96,10 +78,7 @@
<el-col :span='6'> <el-col :span='6'>
<el-form-item label="优先级" prop="priority"> <el-form-item label="优先级" prop="priority">
<el-select v-model="form.priority" placeholder="请选择" style="width: 100%;" :disabled="isBind"> <el-select v-model="form.priority" placeholder="请选择" style="width: 100%;" :disabled="isBind">
<el-option <el-option v-for="item in getDictDatas(DICT_TYPE.ORDER_PRIORITY)" :key="item.value" :label="item.label"
v-for="item in getDictDatas(DICT_TYPE.ORDER_PRIORITY)"
:key="item.value"
:label="item.label"
:value="item.value"> :value="item.value">
</el-option> </el-option>
</el-select> </el-select>
@ -108,11 +87,7 @@
<el-col :span='6'> <el-col :span='6'>
<el-form-item label="工单类型" prop="type"> <el-form-item label="工单类型" prop="type">
<el-select v-model="form.type" placeholder="请选择" style="width: 100%;" :disabled="isBind"> <el-select v-model="form.type" placeholder="请选择" style="width: 100%;" :disabled="isBind">
<el-option <el-option v-for="item in workOrderTypeList" :key="item.id" :label="item.name" :value="item.id">
v-for="item in workOrderTypeList"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option> </el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
@ -120,11 +95,7 @@
<el-col :span='6'> <el-col :span='6'>
<el-form-item label="关联产线" prop="productLineId"> <el-form-item label="关联产线" prop="productLineId">
<el-select v-model="form.productLineId" placeholder="请选择" multiple style="width: 100%;" :disabled="isBind"> <el-select v-model="form.productLineId" placeholder="请选择" multiple style="width: 100%;" :disabled="isBind">
<el-option <el-option v-for="item in productLineList" :key="item.id" :label="item.name" :value="item.id">
v-for="item in productLineList"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option> </el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
@ -136,9 +107,18 @@
<el-input v-model="form.workers" :disabled="isBind"></el-input> <el-input v-model="form.workers" :disabled="isBind"></el-input>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span='6'>
<el-form-item label="负责部门" prop="deptId">
<el-select v-model="form.deptId" placeholder="请选择关联产线" style="width: 100%;">
<el-option v-for="item in deptList" :key="item.id" :label="item.name" :value="item.id">
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span='6'> <el-col :span='6'>
<el-form-item label="计划分配订单量" prop="planAssignmentQuantity"> <el-form-item label="计划分配订单量" prop="planAssignmentQuantity">
<el-input-number v-model="form.planAssignmentQuantity" :min="0" :max="9999999999999" style="width: 100%;"></el-input-number> <el-input-number v-model="form.planAssignmentQuantity" :min="0" :max="9999999999999" style="width: 100%;">
</el-input-number>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
@ -148,6 +128,7 @@
import { getProductAll } from '@/api/base/product' import { getProductAll } from '@/api/base/product'
import { getProcessFlowList, getWorkOrderCode, orderIssue, workOrderList, getWorkOrderById } from '@/api/base/orderManage' import { getProcessFlowList, getWorkOrderCode, orderIssue, workOrderList, getWorkOrderById } from '@/api/base/orderManage'
import { getLineAll } from '@/api/base/productionLine' import { getLineAll } from '@/api/base/productionLine'
import { listDept } from '@/api/system/dept';
import moment from 'moment' import moment from 'moment'
export default { export default {
name: 'AddWorkOrder', name: 'AddWorkOrder',
@ -162,6 +143,7 @@ export default {
planStartTime: '', planStartTime: '',
planFinishTime: '', planFinishTime: '',
planAssignQuantity: 0, planAssignQuantity: 0,
deptId:undefined,
planQuantity: 0, planQuantity: 0,
processFlowId: '', processFlowId: '',
materialMethod: 1, materialMethod: 1,
@ -171,6 +153,7 @@ export default {
workers: '', workers: '',
planAssignmentQuantity: '' planAssignmentQuantity: ''
}, },
deptList:[],
rules: { rules: {
name: [{ required: true, message: "工单名称不能为空", trigger: "blur" }], name: [{ required: true, message: "工单名称不能为空", trigger: "blur" }],
planProductId: [{ required: true, message: "产品名称不能为空", trigger: "change" }], planProductId: [{ required: true, message: "产品名称不能为空", trigger: "change" }],
@ -209,6 +192,9 @@ export default {
} }
}, },
getList() { getList() {
listDept().then(res => {
this.deptList = res.data || []
})
// //
getProductAll().then(res => { getProductAll().then(res => {
this.productList = res.data || [] this.productList = res.data || []
@ -254,11 +240,11 @@ export default {
let name = this.form.name let name = this.form.name
_this.$emit('addWorkOrderSubmit') _this.$emit('addWorkOrderSubmit')
// 使 // 使
_this.$modal.confirm('是否添加预使用主原料信息?').then(function() { // _this.$modal.confirm('使?').then(function() {
_this.$router.push({ // _this.$router.push({
path: '/core/core-work-order?workOrderName='+encodeURI(name) // path: '/core/core-work-order?workOrderName='+encodeURI(name)
}) // })
}) // })
} }
}) })
} }

View File

@ -0,0 +1,37 @@
<template>
<div class="tableInner">
<el-input v-model="list[itemProp]" @blur="changeInput" />
</div>
</template>
<script>
export default {
name: 'InputArea',
props: {
injectData: {
type: Object,
default: () => ({})
},
itemProp: {
type: String
}
},
data() {
return {
list: this.injectData
}
},
methods: {
changeInput() {
console.log(this.list)
this.$emit('emitData', this.list)
}
}
}
</script>
<style>
.tableInner .el-input__inner {
border: none;
padding: 0;
height: 33px;
}
</style>

View File

@ -19,7 +19,7 @@
</el-col> </el-col>
<el-col :span='6'> <el-col :span='6'>
<el-form-item label="产品名称" prop="planProductId"> <el-form-item label="产品名称" prop="planProductId">
<el-select v-model="form.planProductId" placeholder="请选择" style="width: 100%;" filterable> <el-select @change="getSpec" v-model="form.planProductId" placeholder="请选择" style="width: 100%;" filterable>
<el-option v-for="item in productList" :key="item.id" :label="item.name+' | '+(item.specifications || '')" <el-option v-for="item in productList" :key="item.id" :label="item.name+' | '+(item.specifications || '')"
:value="item.id"> :value="item.id">
<span style="float: left">{{ item.name }}</span> <span style="float: left">{{ item.name }}</span>
@ -64,6 +64,11 @@
<el-row :gutter="20"> <el-row :gutter="20">
</el-row> </el-row>
<el-row :gutter="20"> <el-row :gutter="20">
<el-col :span='6'>
<el-form-item label="产品规格" prop="specifications">
<el-input v-model="form.specifications"></el-input>
</el-form-item>
</el-col>
<el-col :span='12'> <el-col :span='12'>
<el-form-item label="备注" prop="remark"> <el-form-item label="备注" prop="remark">
<el-input v-model="form.remark"></el-input> <el-input v-model="form.remark"></el-input>
@ -84,8 +89,10 @@ export default {
id: '', id: '',
name: '', name: '',
code: '', code: '',
grade:1,
planQuantity: '', planQuantity: '',
planProductId: '', planProductId: '',
specifications:undefined,
price: '', price: '',
customerId: '', customerId: '',
priority: '', priority: '',
@ -110,6 +117,14 @@ export default {
} }
}, },
methods: { methods: {
getSpec(val) {
console.log(val)
this.productList.forEach((ele) => {
if (ele.id === val) {
this.form.specifications = ele.specifications
}
})
},
init(id) { init(id) {
this.getList() this.getList()
if (id) { if (id) {

View File

@ -0,0 +1,37 @@
<!--
* @Author: zhp
* @Date: 2024-09-06 14:44:06
* @LastEditTime: 2024-09-09 16:31:04
* @LastEditors: zhp
* @Description:
-->
<template>
<el-button @click="handleRoute" type="text"> {{ injectData.workOrderNum }} </el-button>
</template>
<script>
import { orderAssignmentList } from '@/api/base/orderManage'
export default {
props: {
injectData: {
type: Object,
default: () => ({}),
},
},
methods: {
async handleRoute() {
const res = await orderAssignmentList({ orderIdList: [this.injectData.id] })
console.log(res.data);
let arr = []
res.data[this.injectData.id].forEach((ele) => {
arr.push(ele.workOrderId)
});
let woIdString = arr.join(',')
console.log(woIdString);
this.$router.push({
path: '/produce/core-work-order-detail?woIdString=' + woIdString
})
}
},
};
</script>

View File

@ -1,29 +1,102 @@
<!-- <!--
* @Author: zhp * @Author: zhp
* @Date: 2024-08-01 16:27:30 * @Date: 2024-08-01 16:27:30
* @LastEditTime: 2024-08-01 16:29:31 * @LastEditTime: 2024-09-04 15:56:53
* @LastEditors: zhp * @LastEditors: zhp
* @Description: * @Description:
--> -->
<template> <template>
<el-form ref="orderAddForm" :rules="rules" label-width="130px" :model="form" label-position='top'> <el-form ref="orderAddForm" :rules="rules" :model="form" :inline="true" class="demo-form-inline">
<el-row :gutter="20"> <!-- <el-row :gutter="20"> -->
<el-col :span='6'> <!-- <el-col :span='6'> -->
<el-form-item label="订单名称" prop="name"> <el-form-item label="拆分数量" prop="attr3">
<el-input v-model="form.name"></el-input> <el-input v-model.number="form.attr3" oninput="value=value.replace(/[^\d]/g,'')"></el-input>
</el-form-item> </el-form-item>
</el-col> <el-form-item>
</el-row> <el-button type="primary" @click="handleSplit">确定</el-button>
</el-form-item>
<!-- </el-col> -->
<!-- </el-row> -->
<base-table :table-props="tableProps" :table-data="list" :max-height="tableH">
<!-- <method-btn v-if="tableBtn.length" slot="handleBtn" :width="240" label="操作" :method-list="tableBtn"
@clickBtn="handleClick" /> -->
</base-table>
</el-form> </el-form>
</template> </template>
<script> <script>
import { getOrderCode, getOrderById, getProcessFlowList, orderUpdate, orderCreate } from '@/api/base/orderManage' import { getOrderCode, getOrderById, getProcessFlowList, orderUpdate, orderCreate, orderSplit } from '@/api/base/orderManage'
import { getProductAll } from '@/api/base/product' import { parseTime } from '@/utils/ruoyi'
import { getCustomerList } from '@/api/base/customer' import inputArea from './inputArea.vue'
const tableProps = [
{
prop: 'name',
label: '订单名称',
minWidth: 120,
showOverflowtooltip: true,
subcomponent: inputArea
},
{
prop: 'code',
label: '订单编码',
minWidth: 180,
subcomponent: inputArea
},
{
prop: 'productName',
label: '产品',
showOverflowtooltip: true,
subcomponent: inputArea
},
// {
// prop: 'priority',
// label: '',
// filter: publicFormatter('order_priority')
// },
{
prop: 'planQuantity',
label: '计划加工量',
width: 100,
subcomponent: inputArea
},
{
prop: 'deliveTime',
label: '交货日期',
filter: parseTime,
minWidth: 160,
subcomponent: inputArea
},
{
prop: 'customerId',
label: '客户',
showOverflowtooltip: true,
subcomponent: inputArea
},
{
prop: 'price',
label: '单价',
width: 100,
subcomponent: inputArea
},
{
prop: 'packSpec',
label: '包装规格',
width: 100,
subcomponent: inputArea
},
{
prop: 'remark',
label: '备注',
width: 100,
subcomponent: inputArea
},
]
export default { export default {
name: 'OrderAdd', name: 'OrderAdd',
data() { data() {
return { return {
tableProps,
list: [],
tableH: this.tableHeight(260),
form: { form: {
id: '', id: '',
name: '', name: '',
@ -32,6 +105,7 @@ export default {
planProductId: '', planProductId: '',
price: '', price: '',
customerId: '', customerId: '',
attr3:undefined,
priority: '', priority: '',
packSpec: '', packSpec: '',
workers: '', workers: '',
@ -42,10 +116,7 @@ export default {
planStartTime: '', planStartTime: '',
}, },
rules: { rules: {
name: [{ required: true, message: "订单名称不能为空", trigger: "blur" }], attr3: [{ required: true, message: "拆分数量不能为空", trigger: "blur" }],
code: [{ required: true, message: "订单号不能为空", trigger: "blur" }],
planQuantity: [{ required: true, message: "计划加工数量不能为空", trigger: "blur" }],
planProductId: [{ required: true, message: "产品名称不能为空", trigger: "change" }]
}, },
productList: [], productList: [],
customerList: [], customerList: [],
@ -53,114 +124,133 @@ export default {
isEdit: false // isEdit: false //
} }
}, },
created () {
window.addEventListener('resize', () => {
this.tableH = this.tableHeight(260)
})
},
methods: { methods: {
init(id) { handleSplit() {
this.getList() let obj = {
if (id) { attr3: this.form.attr3,
this.isEdit = true id:this.form.id
this.form.id = id
getOrderById({id: this.form.id}).then(res => {
if (res.code === 0) {
this.form.name = res.data.name
this.form.code = res.data.code
this.form.planQuantity = res.data.planQuantity
this.form.planProductId = res.data.planProductId
this.form.price = res.data.price
this.form.customerId = res.data.customerId
this.form.priority = res.data.priority ? res.data.priority + '' : ''
this.form.planStartTime = res.data.planStartTime ? res.data.planStartTime : null
this.form.packSpec = res.data.packSpec ? res.data.packSpec+'' : ''
this.form.workers = res.data.workers
this.form.processFlowId = res.data.processFlowId
this.form.materialMethod = res.data.materialMethod
this.form.planFinishTime = res.data.planFinishTime ? res.data.planFinishTime : null
this.form.remark = res.data.remark
// this.form.description = res.data.description
}
})
} else {
this.isEdit = false
this.form.id = ''
//
getOrderCode().then(res => {
this.form.code = res.data || ''
})
} }
}, orderSplit(obj).then((res) => {
getList() { this.list = res.data
//
getProductAll().then(res => {
this.productList = res.data || []
})
//
getCustomerList().then(res => {
this.customerList = res.data || []
})
//
getProcessFlowList().then(res => {
this.processFlowList = res.data || []
}) })
}, },
timeChange() { init(obj) {
if (this.form.planStartTime && this.form.planFinishTime) { // this.getList()
if (this.form.planStartTime > this.form.planFinishTime) { // if (obj) {
this.$modal.msgError('计划开始时间不能大于结束时间') this.isEdit = true
} this.form = {}
} this.list = []
}, this.form.id = obj.id
// // getOrderById({id: this.form.id}).then(res => {
materialMethodChange(val) { // if (res.code === 0) {
if (val === 2 && !this.form.processFlowId) { // this.form.name = res.data.name
this.form.materialMethod = 1 // this.form.code = res.data.code
this.$modal.msgError("请先选择关联工艺"); // this.form.planQuantity = res.data.planQuantity
} // this.form.planProductId = res.data.planProductId
}, // this.form.price = res.data.price
// // this.form.customerId = res.data.customerId
processFlowIdChange(val) { // this.form.priority = res.data.priority ? res.data.priority + '' : ''
console.log(val) // this.form.planStartTime = res.data.planStartTime ? res.data.planStartTime : null
if (!val) { // this.form.packSpec = res.data.packSpec ? res.data.packSpec+'' : ''
this.form.materialMethod = 1 // this.form.workers = res.data.workers
} // this.form.processFlowId = res.data.processFlowId
// this.form.materialMethod = res.data.materialMethod
// this.form.planFinishTime = res.data.planFinishTime ? res.data.planFinishTime : null
// this.form.remark = res.data.remark
// // this.form.description = res.data.description
// }
// })
// } else {
// this.isEdit = false
// this.form.id = ''
// //
// getOrderCode().then(res => {
// this.form.code = res.data || ''
// })
// }
}, },
// getList() {
// //
// getProductAll().then(res => {
// this.productList = res.data || []
// })
// //
// getCustomerList().then(res => {
// this.customerList = res.data || []
// })
// //
// getProcessFlowList().then(res => {
// this.processFlowList = res.data || []
// })
// },
// timeChange() {
// if (this.form.planStartTime && this.form.planFinishTime) {
// if (this.form.planStartTime > this.form.planFinishTime) {
// this.$modal.msgError('')
// }
// }
// },
// //
// materialMethodChange(val) {
// if (val === 2 && !this.form.processFlowId) {
// this.form.materialMethod = 1
// this.$modal.msgError("");
// }
// },
// //
// processFlowIdChange(val) {
// console.log(val)
// if (!val) {
// this.form.materialMethod = 1
// }
// },
submitForm() { submitForm() {
this.$refs['orderAddForm'].validate((valid) => { Promise.all(this.list.map((ele) => {
if (valid) { return orderCreate(ele);
if (this.form.planStartTime && this.form.planFinishTime) { })).then((res) => {
if (this.form.planStartTime > this.form.planFinishTime) { this.$modal.msgSuccess("操作成功");
this.$modal.msgError('计划开始时间不能大于结束时间') this.$emit('splitWorkOrderSubmit');
return false });
}
} // this.$refs['orderAddForm'].validate((valid) => {
// console.log(this.form) // if (valid) {
if (this.isEdit) { // if (this.form.planStartTime && this.form.planFinishTime) {
// // if (this.form.planStartTime > this.form.planFinishTime) {
orderUpdate({ ...this.form }).then((res) => { // this.$modal.msgError('')
if (res.code === 0) { // return false
this.$modal.msgSuccess("操作成功"); // }
this.$emit('successSubmit') // }
} // // console.log(this.form)
}) // if (this.isEdit) {
} else { // //
this.form.status = 1 // orderUpdate({ ...this.form }).then((res) => {
this.form.triggerOrigin = 1 // if (res.code === 0) {
orderCreate({ ...this.form }).then((res) => { // this.$modal.msgSuccess("");
if (res.code === 0) { // this.$emit('successSubmit')
this.$modal.msgSuccess("操作成功"); // }
this.$emit('successSubmit') // })
} // } else {
}) // this.form.status = 1
} // this.form.triggerOrigin = 1
} else { // orderCreate({ ...this.form }).then((res) => {
return false // if (res.code === 0) {
} // this.$modal.msgSuccess("");
}) // this.$emit('successSubmit')
// }
// })
// }
// } else {
// return false
// }
// })
}, },
formClear() { formClear() {
this.$refs.orderAddForm.resetFields() this.$refs.orderAddForm.resetFields()
this.form.materialMethod = 1
this.form.price = 0.00
this.form.planQuantity = 0
this.isEdit = false
} }
} }
} }

View File

@ -1,64 +1,40 @@
<template> <template>
<div class="app-container"> <div class="app-container">
<!-- 搜索工作栏 --> <!-- 搜索工作栏 -->
<search-bar <search-bar :formConfigs="formConfig" ref="searchBarForm" @headBtnClick="buttonClick" />
:formConfigs="formConfig"
ref="searchBarForm"
@headBtnClick="buttonClick"
/>
<!-- 列表 --> <!-- 列表 -->
<base-table <base-table ref="table" @row-click="handleRowClick" row-key="id"
:page="queryParams.pageNo" :tree-props="{ children: 'children'}"
:limit="queryParams.pageSize" :page="queryParams.pageNo" :limit="queryParams.pageSize" :table-props="tableProps" :table-data="list"
:table-props="tableProps" :max-height="tableH">
:table-data="list" <method-btn v-if="tableBtn.length" slot="handleBtn" :width="240" label="操作" :method-list="tableBtn"
:max-height="tableH" @clickBtn="handleClick" />
>
<method-btn
v-if="tableBtn.length"
slot="handleBtn"
:width="240"
label="操作"
:method-list="tableBtn"
@clickBtn="handleClick"
/>
</base-table> </base-table>
<pagination <pagination :page.sync="queryParams.pageNo" :limit.sync="queryParams.pageSize" :total="total"
:page.sync="queryParams.pageNo" @pagination="getList" />
:limit.sync="queryParams.pageSize"
:total="total"
@pagination="getList"
/>
<!-- 新增&编辑 --> <!-- 新增&编辑 -->
<base-dialog <base-dialog :dialogTitle="addOrEditTitle" :dialogVisible="centervisible" @cancel="handleCancel"
:dialogTitle="addOrEditTitle" @confirm="handleConfirm" :before-close="handleCancel" width='60%'>
:dialogVisible="centervisible"
@cancel="handleCancel"
@confirm="handleConfirm"
:before-close="handleCancel"
width='60%'
>
<order-add ref="orderAdd" @successSubmit="successSubmit" /> <order-add ref="orderAdd" @successSubmit="successSubmit" />
</base-dialog> </base-dialog>
<!-- 查看详情 --> <!-- 查看详情 -->
<!-- 新增工单 --> <!-- 新增工单 -->
<base-dialog <base-dialog :dialogTitle="workIssueTitle" :dialogVisible="addWorkOrdervisible" @cancel="addWorkOrderCancel"
:dialogTitle="workIssueTitle" @confirm="addWorkOrderConfirm" :before-close="addWorkOrderCancel" width='70%'>
:dialogVisible="addWorkOrdervisible"
@cancel="addWorkOrderCancel"
@confirm="addWorkOrderConfirm"
:before-close="addWorkOrderCancel"
width='70%'
>
<add-work-order ref="addWorkOrder" @addWorkOrderSubmit="addWorkOrderSubmit" /> <add-work-order ref="addWorkOrder" @addWorkOrderSubmit="addWorkOrderSubmit" />
</base-dialog> </base-dialog>
<base-dialog :dialogTitle="splitTitle" :dialogVisible="splitWorkOrdervisible" @cancel="splitWorkOrderCancel"
@confirm="splitWorkOrderConfirm" :before-close="splitWorkOrderCancel" width='70%'>
<order-split ref="splitWorkOrder" @splitWorkOrderSubmit="splitWorkOrderSubmit" />
</base-dialog>
</div> </div>
</template> </template>
<script> <script>
import { parseTime } from '@/utils/ruoyi' import { parseTime } from '@/utils/ruoyi'
import { getOrderPage, orderDelete, customerList, orderFinish, orderVoid } from '@/api/base/orderManage' import { getOrderPage, orderDelete, customerList, orderFinish, orderVoid, orderStop } from '@/api/base/orderManage'
import OrderAdd from './components/orderAdd' import OrderAdd from './components/orderAdd'
import orderSplit from './components/orderSplit' import orderSplit from './components/orderSplit'
import orderNum from './components/orderNum.vue'
import AddWorkOrder from './components/addWorkOrder' import AddWorkOrder from './components/addWorkOrder'
import { publicFormatter } from '@/utils/dict' import { publicFormatter } from '@/utils/dict'
@ -123,7 +99,8 @@ const tableProps = [
}, },
{ {
prop: 'workOrderNum', prop: 'workOrderNum',
label: '工单数量' label: '工单数量',
subcomponent: orderNum,
} }
] ]
export default { export default {
@ -175,6 +152,8 @@ export default {
plain: true plain: true
} }
], ],
splitTitle: '拆分订单',
splitWorkOrdervisible:false,
// //
queryParams: { queryParams: {
pageNo: 1, pageNo: 1,
@ -328,17 +307,34 @@ export default {
] ]
} }
} }
: undefined,
this.$auth.hasPermi('base:order-manage:stop')
? {
type: 'stop',
btnName: '终止',
// showParam: {
// type: '&',
// data: [
// {
// type: 'equal',
// name: 'status',
// value: 1
// }
// ]
// }
}
: undefined : undefined
].filter((v) => v), ].filter((v) => v),
addOrEditTitle: '', addOrEditTitle: '',
centervisible: false, centervisible: false,
expandedRowKeys:[],
priorityList: this.getDictDatas(this.DICT_TYPE.ORDER_PRIORITY), priorityList: this.getDictDatas(this.DICT_TYPE.ORDER_PRIORITY),
workIssueTitle: '', workIssueTitle: '',
addWorkOrdervisible: false, addWorkOrdervisible: false,
orderDetailVisible: false orderDetailVisible: false
} }
}, },
components: { OrderAdd, AddWorkOrder }, components: { OrderAdd, AddWorkOrder,orderSplit },
created() { created() {
window.addEventListener('resize', () => { window.addEventListener('resize', () => {
this.tableH = this.tableHeight(260) this.tableH = this.tableHeight(260)
@ -346,11 +342,38 @@ export default {
this.getList() this.getList()
}, },
methods: { methods: {
async handleRowClick(row) {
console.log(row)
if (!row.children) {
const queryParams = {
pageNo: this.queryParams.pageNo,
pageSize: this.queryParams.pageSize,
name: this.queryParams.name,
status: this.queryParams.status,
lastIssuedTime: this.queryParams.lastIssuedTime,
parentId: row.id
}
const response = await getOrderPage(queryParams)
// row.children = response.data.records
this.list.forEach((ele) => {
if (ele.id === row.id) {
this.$set(this.list[row._pageIndex-1], 'children', response.data.records); //
}
})
row.hasChildren = true;
this.$set(row, 'expanded', true); //
} else {
row.expanded = !row.expanded; // /
}
// this.$nextTick(() => {
// const tableInstance = this.$refs.table.getTableRef();
// tableInstance.toggleRowExpansion(row);
// })
},
getList() { getList() {
getOrderPage({...this.queryParams}).then(res => { getOrderPage({...this.queryParams}).then(res => {
let arr = res.data.records || [] let arr = res.data.records || []
this.total = res.data.total || 0 this.total = res.data.total || 0
console.log(11111);
// if (arr.length > 0) { // if (arr.length > 0) {
// customerList().then(result => { // customerList().then(result => {
// let tempData = result.data || [] // let tempData = result.data || []
@ -405,7 +428,7 @@ export default {
this.handleDelete(val.data) this.handleDelete(val.data)
break break
case 'detail': case 'detail':
this.$router.push({path: '/order/base/order-manage/order-detail-data?orderId='+ val.data.id}) this.$router.push({path: 'order-detail-data?orderId='+ val.data.id})
break break
case 'add': case 'add':
this.workIssueTitle = '新增工单' this.workIssueTitle = '新增工单'
@ -419,6 +442,16 @@ export default {
console.log(res) console.log(res)
}) })
break break
case 'split':
this.splitTitle = '拆分订单'
this.splitWorkOrdervisible = true
this.$nextTick(() => {
this.$refs.splitWorkOrder.init(val.data)
})
// orderVoid({ id: val.data.id }).then((res) => {
// console.log(res)
// })
break
case 'bind': case 'bind':
this.workIssueTitle = '绑定工单' this.workIssueTitle = '绑定工单'
this.addWorkOrdervisible = true this.addWorkOrdervisible = true
@ -429,6 +462,11 @@ export default {
case 'complete': case 'complete':
this.handleComplete(val.data) this.handleComplete(val.data)
break break
case 'stop':
orderStop({ id: val.data.id }).then((res) => {
this.getList()
})
break
default: default:
} }
}, },
@ -474,6 +512,17 @@ export default {
addWorkOrderSubmit() { addWorkOrderSubmit() {
this.addWorkOrderCancel() this.addWorkOrderCancel()
this.getList() this.getList()
},
splitWorkOrderCancel() {
this.$refs.splitWorkOrder.formClear()
this.splitWorkOrdervisible = false
},
splitWorkOrderConfirm() {
this.$refs.splitWorkOrder.submitForm()
},
splitWorkOrderSubmit() {
this.splitWorkOrderCancel()
this.getList()
} }
// bindWorkOrderCancel() { // bindWorkOrderCancel() {
// this.$refs.bindWorkOrder.formClear() // this.$refs.bindWorkOrder.formClear()

View File

@ -5,7 +5,9 @@
<span class="blueTitle"></span> <span class="blueTitle"></span>
<span>订单编码: {{orderMsg.code}}</span> <span>订单编码: {{orderMsg.code}}</span>
</div> </div>
<el-button type="primary" plain size="small" style="float: right;" @click="returnOrderManage"><svg-icon icon-class="return"/> 返回</el-button> <el-button type="primary" plain size="small" style="float: right;" @click="returnOrderManage">
<svg-icon icon-class="return" /> 返回
</el-button>
<div style="padding-left: 14px;"> <div style="padding-left: 14px;">
<el-row> <el-row>
<el-col :span='3'> <el-col :span='3'>
@ -28,10 +30,11 @@
<div class="blodTip">包装规格</div> <div class="blodTip">包装规格</div>
<div class="lightTip">{{ getDictDataLabel(DICT_TYPE.PACK_SPEC, orderMsg.packSpec)}}</div> <div class="lightTip">{{ getDictDataLabel(DICT_TYPE.PACK_SPEC, orderMsg.packSpec)}}</div>
</el-col> </el-col>
<el-col :span='3'> <!-- <el-col :span='3'>
<div class="blodTip">物料计算方式</div> <div class="blodTip">物料计算方式</div>
<div class="lightTip">{{orderMsg.materialMethod ? (orderMsg.materialMethod === 1 ? '产品基础' : '工艺扩展') : ''}}</div> <div class="lightTip">{{orderMsg.materialMethod ? (orderMsg.materialMethod === 1 ? '产品基础' : '工艺扩展') : ''}}
</el-col> </div>
</el-col> -->
<el-col :span='3'> <el-col :span='3'>
<div class="blodTip">创建时间</div> <div class="blodTip">创建时间</div>
<div class="lightTip">{{ parseTime(orderMsg.createTime) }}</div> <div class="lightTip">{{ parseTime(orderMsg.createTime) }}</div>
@ -72,7 +75,7 @@
</el-col> </el-col>
<el-col :span='3'> <el-col :span='3'>
<div class="blodTip">实际生产数量</div> <div class="blodTip">实际生产数量</div>
<div class="lightTip">{{orderMsg.actualQuantity }}</div> <div class="lightTip">{{orderMsg.actualQuantity }}</div>
</el-col> </el-col>
</el-row> </el-row>
<el-row> <el-row>
@ -88,40 +91,34 @@
<div class="blodTip">负责人</div> <div class="blodTip">负责人</div>
<div class="lightTip">{{orderMsg.workers}}</div> <div class="lightTip">{{orderMsg.workers}}</div>
</el-col> </el-col>
<el-col :span='3'> <!-- <el-col :span='3'>
<div class="blodTip">关联工艺</div> <div class="blodTip">关联工艺</div>
<div class="lightTip">{{processFlowName}}</div> <div class="lightTip">{{processFlowName}}</div>
</el-col> </el-col> -->
</el-row> </el-row>
</div> </div>
</div> </div>
<div class="box2"> <div class="box2">
<div class="boxTitle"> <!-- <div class="boxTitle">
<span class="blueTitle"></span> <span class="blueTitle"></span>
<span>工单信息</span> <span>工单信息</span>
</div> -->
<div class="toggleTabBox">
<div :class="{ active: activeModule === 'orderInfo' }" @click="toggleTab('orderInfo')">子订单信息</div>
<!-- <div :class="{ active: activeModule === 'useInfo' }" @click="toggleTab('useInfo')">用料信息</div> -->
</div> </div>
<!-- 列表 --> <!-- 列表 -->
<base-table <el-row v-show="activeModule === 'orderInfo'">
:page="queryParams.pageNo" <el-col :span="6">
:limit="queryParams.pageSize" <el-tree :data="treeData" :props="defaultProps" @node-click="handleNodeClick"></el-tree>
:table-props="tableProps1" </el-col>
:table-data="list1" <el-col :span="18">
:max-height="tableH" <base-table :page="queryParams.pageNo" :limit="queryParams.pageSize" :table-props="tableProps1"
/> :table-data="list1" :max-height="tableH" />
</div> </el-col>
<div class="box3"> </el-row>
<div class="boxTitle"> <!-- <base-table v-show="activeModule === 'useInfo'" :page="queryParams.pageNo" :limit="queryParams.pageSize"
<span class="blueTitle"></span> :table-props="tableProps2" :table-data="list2" :max-height="tableH" /> -->
<span>预计用料信息</span>
</div>
<!-- 列表 -->
<base-table
:page="queryParams.pageNo"
:limit="queryParams.pageSize"
:table-props="tableProps2"
:table-data="list2"
:max-height="tableH"
/>
</div> </div>
</div> </div>
</template> </template>
@ -129,6 +126,7 @@
import { parseTime } from '@/utils/ruoyi' import { parseTime } from '@/utils/ruoyi'
import { publicFormatter } from '@/utils/dict' import { publicFormatter } from '@/utils/dict'
import { getProcessFlowList } from '@/api/base/orderManage' import { getProcessFlowList } from '@/api/base/orderManage'
import { orderDetail, bomUseNum, getDetailTree, getDetailTreeInfo } from '@/api/base/orderManage'
const tableProps1 = [ const tableProps1 = [
{ {
prop: 'issueTime', prop: 'issueTime',
@ -209,13 +207,14 @@ const tableProps2 = [
label: '剩余生产预计消耗' label: '剩余生产预计消耗'
} }
] ]
import { orderDetail, bomUseNum } from '@/api/base/orderManage'
export default { export default {
name: 'OrderDetailData', name: 'OrderDetailData',
data() { data() {
return { return {
orderId: '', orderId: '',
tableProps1, tableProps1,
treeData:undefined,
activeModule:'orderInfo',
tableProps2, tableProps2,
list1: [], list1: [],
list2: [], list2: [],
@ -225,6 +224,10 @@ export default {
pageNo: 1, pageNo: 1,
pageSize: 500 pageSize: 500
}, },
defaultProps: {
children: 'children',
label: 'name'
},
orderMsg: {}, orderMsg: {},
processFlowName: '' processFlowName: ''
} }
@ -240,6 +243,18 @@ export default {
$route: 'initData' $route: 'initData'
}, },
methods: { methods: {
toggleTab(val) {
this.activeModule = val
},
handleNodeClick(val) {
console.log(val)
getDetailTreeInfo({
id: val.id
}).then(res => {
this.list1 = res.data.order
console.log(res)
})
},
initData(to) { initData(to) {
if (to.name === 'OrderDetailData') { if (to.name === 'OrderDetailData') {
this.orderId = location.href.split('?')[1].split('=')[1] this.orderId = location.href.split('?')[1].split('=')[1]
@ -268,6 +283,12 @@ export default {
this.list2 = [] this.list2 = []
} }
}) })
getDetailTree({
id: this.orderId
}).then(res => {
console.log(res)
this.treeData =res.data
})
// //
getProcessFlowList().then(res => { getProcessFlowList().then(res => {
let arr = res.data || [] let arr = res.data || []
@ -283,7 +304,7 @@ export default {
}, },
// //
returnOrderManage() { returnOrderManage() {
this.$router.push({path: '/order/base/order-manage'}) this.$router.go(-1);
} }
} }
} }
@ -296,9 +317,23 @@ export default {
border-radius: 9px; border-radius: 9px;
} }
.box2 { .box2 {
height: calc((100vh - 360px) / 2); height: calc((100vh - 360px));
padding: 12px 16px 0; padding: 12px 16px 0;
margin: 8px 0; margin: 8px 0;
.toggleTabBox {
display: inline-block;
div {
display: inline-block;
padding: 0 8px 4px;
color: rgba(102, 102, 102, 0.5);
border-bottom: 2px solid rgba(242, 244, 249, 1);
cursor: pointer;
}
.active {
color: rgba(0, 0, 0, 0.85);
border-bottom-color: #0B58FF;
}
}
} }
.box1 { .box1 {
height: 215px; height: 215px;
@ -318,26 +353,5 @@ export default {
margin-bottom: 12px; margin-bottom: 12px;
} }
} }
.box3 {
padding: 16px;
height: calc((100vh - 360px) / 2);
}
.boxTitle {
display: inline-block;
font-size: 16px;
font-weight: 400;
color: #000000;
margin:0 10px 20px 0;
}
.blueTitle {
content: '';
display: inline-block;
width: 4px;
height: 18px;
background-color: #0B58FF;
border-radius: 1px;
margin-right: 8px;
vertical-align: bottom;
}
} }
</style> </style>

View File

@ -174,40 +174,40 @@ export default {
} }
} }
: undefined, : undefined,
this.$auth.hasPermi('base:order-completion-monitoring:qualityDet') // this.$auth.hasPermi('base:order-completion-monitoring:qualityDet')
? { // ? {
type: 'qualityDetail', // type: 'qualityDetail',
btnName: '质量', // btnName: '',
showTip: '质量详情', // showTip: '',
showParam: { // showParam: {
type: '&', // type: '&',
data: [ // data: [
{ // {
type: 'more', // type: 'more',
name: 'workOrderNum', // name: 'workOrderNum',
value: 1 // value: 1
} // }
] // ]
} // }
} // }
: undefined, // : undefined,
this.$auth.hasPermi('base:order-completion-monitoring:sendOut') // this.$auth.hasPermi('base:order-completion-monitoring:sendOut')
? { // ? {
type: 'sendOutDetail', // type: 'sendOutDetail',
btnName: '发货', // btnName: '',
showTip: '发货详情', // showTip: '',
showParam: { // showParam: {
type: '&', // type: '&',
data: [ // data: [
{ // {
type: 'more', // type: 'more',
name: 'workOrderNum', // name: 'workOrderNum',
value: 1 // value: 1
} // }
] // ]
} // }
} // }
: undefined // : undefined
].filter((v) => v), ].filter((v) => v),
chartList: [] chartList: []
} }
@ -297,7 +297,7 @@ export default {
switch (val.type) { switch (val.type) {
case 'orderDetail': case 'orderDetail':
this.$router.push({ this.$router.push({
path: '/core/core-work-order-detail?woIdString='+val.data.woIdString path: '/produce/core-work-order-detail?woIdString='+val.data.woIdString
}) })
break break
case 'qualityDetail': case 'qualityDetail':

View File

@ -13,12 +13,9 @@
</el-col> </el-col>
<el-col :span='8'> <el-col :span='8'>
<el-form-item label="产品名称" prop="planProductId"> <el-form-item label="产品名称" prop="planProductId">
<el-select v-model="dataForm.planProductId" placeholder="请选择产品" style="width: 100%;" filterable @change="selectProduct"> <el-select v-model="dataForm.planProductId" placeholder="请选择产品" style="width: 100%;" filterable
<el-option @change="selectProduct">
v-for="item in productList" <el-option v-for="item in productList" :key="item.id" :label="item.name" :value="item.id">
:key="item.id"
:label="item.name"
:value="item.id">
</el-option> </el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
@ -32,23 +29,15 @@
</el-col> </el-col>
<el-col :span='8'> <el-col :span='8'>
<el-form-item label="计划开始时间"> <el-form-item label="计划开始时间">
<el-date-picker <el-date-picker v-model="dataForm.planStartTime" type="datetime" value-format="timestamp" style="width: 100%;"
v-model="dataForm.planStartTime"
type="datetime"
value-format="timestamp"
style="width: 100%;"
placeholder="请选择计划开始时间"> placeholder="请选择计划开始时间">
</el-date-picker> </el-date-picker>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span='8'> <el-col :span='8'>
<el-form-item label="计划完成时间"> <el-form-item label="计划完成时间">
<el-date-picker <el-date-picker v-model="dataForm.planFinishTime" type="datetime" value-format="timestamp"
v-model="dataForm.planFinishTime" style="width: 100%;" placeholder="请选择计划完成时间">
type="datetime"
value-format="timestamp"
style="width: 100%;"
placeholder="请选择计划完成时间">
</el-date-picker> </el-date-picker>
</el-form-item> </el-form-item>
</el-col> </el-col>
@ -56,22 +45,21 @@
<el-row :gutter="20"> <el-row :gutter="20">
<el-col :span='8'> <el-col :span='8'>
<el-form-item label="计划投入数量" prop="planAssignQuantity"> <el-form-item label="计划投入数量" prop="planAssignQuantity">
<el-input-number v-model="dataForm.planAssignQuantity" :min="0" :max="9999999999999" style="width: 100%;" placeholder="请输入计划投入数量"></el-input-number> <el-input-number v-model="dataForm.planAssignQuantity" :min="0" :max="9999999999999" style="width: 100%;"
placeholder="请输入计划投入数量"></el-input-number>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span='8'> <el-col :span='8'>
<el-form-item label="计划生产数量" prop="planQuantity"> <el-form-item label="计划生产数量" prop="planQuantity">
<el-input-number v-model="dataForm.planQuantity" :min="0" :max="9999999999999" style="width: 100%;" placeholder="请输入计划生产数量"></el-input-number> <el-input-number v-model="dataForm.planQuantity" :min="0" :max="9999999999999" style="width: 100%;"
placeholder="请输入计划生产数量"></el-input-number>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span='8'> <el-col :span='8'>
<el-form-item label="关联工艺" prop="processFlowId"> <el-form-item label="关联工艺" prop="processFlowId">
<el-select v-model="dataForm.processFlowId" placeholder="请选择关联工艺" clearable filterable style="width: 100%;" @change="processFlowIdChange"> <el-select v-model="dataForm.processFlowId" placeholder="请选择关联工艺" clearable filterable style="width: 100%;"
<el-option @change="processFlowIdChange">
v-for="item in processFlowList" <el-option v-for="item in processFlowList" :key="item.id" :label="item.name" :value="item.id">
:key="item.id"
:label="item.name"
:value="item.id">
</el-option> </el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
@ -84,7 +72,8 @@
<el-radio :label="1">产品基础BOM</el-radio> <el-radio :label="1">产品基础BOM</el-radio>
<el-radio :label="2">工艺扩展BOM</el-radio> <el-radio :label="2">工艺扩展BOM</el-radio>
</el-radio-group> --> </el-radio-group> -->
<el-select v-model="dataForm.materialMethod" placeholder="请选择物料计算方式" style="width: 100%;" @change="materialMethodChange"> <el-select v-model="dataForm.materialMethod" placeholder="请选择物料计算方式" style="width: 100%;"
@change="materialMethodChange">
<el-option key="1" label="产品基础BOM" :value="1" /> <el-option key="1" label="产品基础BOM" :value="1" />
<el-option key="2" label="工艺扩展BOM" :value="2" /> <el-option key="2" label="工艺扩展BOM" :value="2" />
</el-select> </el-select>
@ -93,10 +82,7 @@
<el-col :span='8'> <el-col :span='8'>
<el-form-item label="优先级" prop="priority"> <el-form-item label="优先级" prop="priority">
<el-select v-model="dataForm.priority" placeholder="请选择优先级" style="width: 100%;"> <el-select v-model="dataForm.priority" placeholder="请选择优先级" style="width: 100%;">
<el-option <el-option v-for="item in getDictDatas(DICT_TYPE.ORDER_PRIORITY)" :key="item.value" :label="item.label"
v-for="item in getDictDatas(DICT_TYPE.ORDER_PRIORITY)"
:key="item.value"
:label="item.label"
:value="item.value"> :value="item.value">
</el-option> </el-option>
</el-select> </el-select>
@ -105,11 +91,7 @@
<el-col :span='8'> <el-col :span='8'>
<el-form-item label="工单类型" prop="type"> <el-form-item label="工单类型" prop="type">
<el-select v-model="dataForm.type" placeholder="请选择工单类型" style="width: 100%;"> <el-select v-model="dataForm.type" placeholder="请选择工单类型" style="width: 100%;">
<el-option <el-option v-for="item in workOrderTypeList" :key="item.id" :label="item.name" :value="item.id">
v-for="item in workOrderTypeList"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option> </el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
@ -119,11 +101,15 @@
<el-col :span='8'> <el-col :span='8'>
<el-form-item label="关联产线" prop="productLineIds"> <el-form-item label="关联产线" prop="productLineIds">
<el-select v-model="dataForm.productLineIds" placeholder="请选择关联产线" multiple style="width: 100%;"> <el-select v-model="dataForm.productLineIds" placeholder="请选择关联产线" multiple style="width: 100%;">
<el-option <el-option v-for="item in productLineList" :key="item.id" :label="item.name" :value="item.id">
v-for="item in productLineList" </el-option>
:key="item.id" </el-select>
:label="item.name" </el-form-item>
:value="item.id"> </el-col>
<el-col :span='8'>
<el-form-item label="负责部门" prop="deptId">
<el-select v-model="dataForm.deptId" placeholder="请选择关联产线" style="width: 100%;">
<el-option v-for="item in deptList" :key="item.id" :label="item.name" :value="item.id">
</el-option> </el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
@ -149,7 +135,7 @@ import { getProcessFlowList, workOrderList } from '@/api/base/orderManage'
import { createCoreWO, updateCoreWO, getCode, getCoreWO } from '@/api/base/coreWorkOrder' import { createCoreWO, updateCoreWO, getCode, getCoreWO } from '@/api/base/coreWorkOrder'
import { getLineAll } from '@/api/base/productionLine' import { getLineAll } from '@/api/base/productionLine'
import basicAdd from '../../core/mixins/basic-add'; import basicAdd from '../../core/mixins/basic-add';
import { listDept } from '@/api/system/dept';
export default { export default {
name: 'AddWorkOrder', name: 'AddWorkOrder',
mixins: [basicAdd], mixins: [basicAdd],
@ -167,6 +153,7 @@ export default {
workOrderId: '', workOrderId: '',
name: '', name: '',
code: '', code: '',
deptId:undefined,
planProductId: '', planProductId: '',
specifications: '', specifications: '',
planStartTime: '', planStartTime: '',
@ -192,6 +179,7 @@ export default {
productList: [], productList: [],
processFlowList: [], processFlowList: [],
productLineList: [], productLineList: [],
deptList:[],
workOrderTypeList: [ workOrderTypeList: [
{id: 1,name:'普通'}, {id: 1,name:'普通'},
{id: 2, name:'特殊'} {id: 2, name:'特殊'}
@ -296,6 +284,9 @@ export default {
getLineAll().then(res => { getLineAll().then(res => {
this.productLineList = res.data || [] this.productLineList = res.data || []
}) })
listDept().then(res => {
this.deptList = res.data || []
})
// //
getProcessFlowList().then(res => { getProcessFlowList().then(res => {
this.processFlowList = res.data || [] this.processFlowList = res.data || []

View File

@ -0,0 +1,100 @@
<!--
* @Author: zhp
* @Date: 2024-09-11 10:07:42
* @LastEditTime: 2024-09-11 10:07:43
* @LastEditors: zhp
* @Description:
-->
<template>
<div
id="orderEnergyChart"
style="width: 100%"
:style="{ height: chartHeight + 'px' }"
></div>
</template>
<script>
import * as echarts from 'echarts'
import resize from '@/utils/chartMixins/resize'
export default {
name: "BarChart",
mixins: [resize],
data() {
return {
chartDom: '',
chart: '',
chartHeight: this.tableHeight(430)
}
},
props: {
chartData: {
type: Array,
required: true,
default: () => {
return []
}
}
},
watch: {
chartData: function () {
this.getChart()
}
},
mounted() {
window.addEventListener('resize', () => {
this.chartHeight = this.tableHeight(430)
})
},
methods: {
getChart() {
if (
this.chart !== null &&
this.chart !== '' &&
this.chart !== undefined
) {
this.chart.dispose() // Dom
}
this.chartDom = document.getElementById('orderEnergyChart')
this.chart = echarts.init(this.chartDom)
console.log(this.chartData)
let xData = []
let yData = []
this.chartData && this.chartData.map(item =>{
xData.push(item.objName)
yData.push(item.useNum)
})
var option = {
color:['#288AFF'],
grid: {
left: '2%',
right: '1%',
bottom: '1%',
containLabel: true
},
xAxis: {
type: 'category',
data: xData,
axisLabel: {
rotate: "45"
}
},
yAxis: {
type: 'value'
},
series: [
{
data: yData,
type: 'bar',
barMaxWidth: 20,
label: {
show: true,
position: 'top'
}
}
]
};
option && this.chart.setOption(option);
}
}
}
</script>

View File

@ -1,155 +1,175 @@
<!-- <!--
* @Author: zwq * @Author: zwq
* @Date: 2021-11-18 14:16:25 * @Date: 2021-11-18 14:16:25
* @LastEditors: DY * @LastEditors: zhp
* @LastEditTime: 2023-11-23 18:45:15 * @LastEditTime: 2024-09-11 10:27:13
* @Description: * @Description:
--> -->
<template> <template>
<!-- <el-drawer <!-- <el-drawer
:visible.sync="visible" :visible.sync="visible"
:show-close="false" :show-close="false"
:wrapper-closable="false" :wrapper-closable="false"
class="drawer" class="drawer"
size="50%"> --> size="50%"> -->
<div class="app-container">
<!-- <small-title slot="title" :no-padding="true">
{{ isdetail ? '详情' : !dataForm.id ? '新增' : '编辑' }}
</small-title> -->
<el-button style="float: right" type="primary" @click="goback()">返回</el-button>
<div v-show="workOrderButton.length">
<el-button v-for="(work, index) in workOrderButton" :key="index" type="primary" @click="init(work.id, true)">{{ work.name }}</el-button>
</div>
<div class="content">
<div>
<h1>工单编码{{ dataForm.code }}</h1>
</div>
<small-title
style="margin: 16px 0; padding-left: 8px"
:no-padding="true">
基本信息
</small-title>
<div class="formContent">
<el-row :gutter="20">
<el-col :span="8">工单名称:{{ dataForm.name }}</el-col>
<el-col :span="8">工单来源:{{ dataForm.triggerOrigin === 1 ? 'MES' : dataForm.triggerOrigin === 2 ? 'ERP' : ''}}</el-col>
<el-col :span="8">所属订单:
<span v-for="(item, index) in orderList" :key="index" style="margin-right: 10px">{{ item.orderName }}</span>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="8">产品名称:{{ dataForm.productName }}</el-col>
<el-col :span="8"> :{{ dataForm.specifications }}</el-col>
<el-col :span="8">计划生产数量:{{ dataForm.planQuantity }}</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="8">预计用时(小时):{{ dataForm.remainingTime }}</el-col>
<el-col :span="8">计划投入数量:{{ dataForm.planAssignQuantity }}</el-col>
<el-col :span="8">优先级:{{ fitlerP(dataForm.priority) }}</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="8">负责人:{{ dataForm.workers }}</el-col>
<el-col :span="8">关联产线:
<span v-for="(item, index) in dataForm.productLineNames" :key="index" style="margin-right: 10px">{{ item }}</span>
</el-col>
<el-col :span="8">物料计算方式:{{ dataForm.materialMethod === 1 ? '产品基础' : dataForm.materialMethod === 2 ? '工艺扩展' : '' }}</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="8">关联工艺:{{ dataForm.processFlowName }}</el-col>
</el-row>
</div>
<small-title <div class="status-timegraph-container" style="background: #f2f4f9; flex: 1; display: flex; flex-direction: column">
style="margin: 16px 0; padding-left: 8px" <el-row v-show="workOrderButton.length !== 0" class="" style="
:no-padding="true"> margin-bottom: 4px;
生产信息 border-radius: 8px;
</small-title> ">
<div class="formContent"> <workOrderNav :id-list="workOrderButton" @getWorkOrderId="getId">
<el-row :gutter="20"> </workOrderNav>
<el-col :span="8">工单创建时间:{{ parseTime(dataForm.createTime) }}</el-col> </el-row>
<el-col :span="8">计划开始时间:{{ parseTime(dataForm.planStartTime) }}</el-col> <el-row class="" style="
<el-col :span="8">计划完成时间:{{ parseTime(dataForm.planFinishTime) }}</el-col> height: 1px;
</el-row> flex: .3;
<el-row :gutter="20"> margin-bottom: 12px;
<el-col :span="8">预计结束时间:{{ parseTime(dataForm.computeFinishTime) }}</el-col> background: #fff;
<el-col :span="8">实际开始时间:{{ parseTime(dataForm.startProduceTime) }}</el-col> padding: 16px 16px px;
<el-col :span="8">实际完成时间:{{ parseTime(dataForm.finishProduceTime) }}</el-col> border-radius: 8px;
</el-row> display: flex;
<el-row :gutter="20"> flex-direction: column;
<el-col :span="8">工单状态:{{ fitlerS(dataForm.status) }}</el-col> ">
<el-col :span="8">实际投入数量:{{ dataForm.assignQuantity }}</el-col> <div class="content">
<el-col :span="8">实际生产数量:{{ dataForm.actualQuantity }}</el-col> <div>
</el-row> <h1>工单编码{{ dataForm.code }}</h1>
<el-row :gutter="20"> </div>
<el-col :span="8">废片数量:{{ dataForm.nokQuantity }}</el-col> <small-title style="margin: 16px 0; padding-left: 8px" :no-padding="true">
<el-col :span="8">检测瑕疵数:{{ }}</el-col> 基本信息
</el-row> </small-title>
</div> <div class="formContent">
<el-row :gutter="20">
<el-col :span="8">工单名称:{{ dataForm.name }}</el-col>
<el-col :span="8">工单来源:{{ dataForm.triggerOrigin === 1 ? 'MES' : dataForm.triggerOrigin === 2 ? 'ERP' : ''}}
</el-col>
<el-col :span="8">所属订单:
<span v-for="(item, index) in orderList" :key="index" style="margin-right: 10px">{{ item.orderName
}}</span>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="8">产品名称:{{ dataForm.productName }}</el-col>
<el-col :span="8"> :{{ dataForm.specifications }}</el-col>
<el-col :span="8">计划生产数量:{{ dataForm.planQuantity }}</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="8">预计用时(小时):{{ dataForm.remainingTime }}</el-col>
<el-col :span="8">计划投入数量:{{ dataForm.planAssignQuantity }}</el-col>
<el-col :span="8">优先级:{{ fitlerP(dataForm.priority) }}</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="8">负责人:{{ dataForm.workers }}</el-col>
<el-col :span="8">关联产线:
<span v-for="(item, index) in dataForm.productLineNames" :key="index" style="margin-right: 10px">{{ item
}}</span>
</el-col>
<el-col :span="8">物料计算方式:{{ dataForm.materialMethod === 1 ? '产品基础' : dataForm.materialMethod === 2 ? '工艺扩展'
:
'' }}</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="8">关联工艺:{{ dataForm.processFlowName }}</el-col>
</el-row>
</div>
</div>
</el-row>
<el-row class="" style="
height: 1px;
flex: 1;
margin-bottom: 12px;
background: #fff;
padding: 16px 16px 32px;
border-radius: 8px;
display: flex;
flex-direction: column;
">
<el-tabs v-model="activeName" @tab-click="switchTab">
<el-tab-pane label="生产信息" name="produce">
<div class="formContent">
<el-row :gutter="20">
<el-col :span="8">工单创建时间:{{ parseTime(dataForm.createTime) }}</el-col>
<el-col :span="8">计划开始时间:{{ parseTime(dataForm.planStartTime) }}</el-col>
<el-col :span="8">计划完成时间:{{ parseTime(dataForm.planFinishTime) }}</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="8">预计结束时间:{{ parseTime(dataForm.computeFinishTime) }}</el-col>
<el-col :span="8">实际开始时间:{{ parseTime(dataForm.startProduceTime) }}</el-col>
<el-col :span="8">实际完成时间:{{ parseTime(dataForm.finishProduceTime) }}</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="8">工单状态:{{ fitlerS(dataForm.status) }}</el-col>
<el-col :span="8">实际投入数量:{{ dataForm.assignQuantity }}</el-col>
<el-col :span="8">实际生产数量:{{ dataForm.actualQuantity }}</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="8">废片数量:{{ dataForm.nokQuantity }}</el-col>
<el-col :span="8">检测瑕疵数:{{ }}</el-col>
</el-row>
</div>
</el-tab-pane>
<el-tab-pane label="订单信息" name="order">
<base-table :max-height="tableH" :table-props="tableProps" :page="listQuery.pageNo"
:limit="listQuery.pageSize" :table-data="orderList">
<method-btn v-if="!isdetail" slot="handleBtn" :width="120" label="操作" :method-list="tableBtn"
@clickBtn="handleClick" />
</base-table>
</el-tab-pane>
<el-tab-pane label="预计用料信息" name="material">
<base-table :max-height="tableH" :table-props="tableProps1" :page="listQuery1.pageNo"
:limit="listQuery1.pageSize" :table-data="materialList" />
</el-tab-pane>
<el-tab-pane label="质量信息" name="quality">
<base-table :max-height="tableH" :table-props="tablePropsQuality" :table-data="qualityList" :page="1"
:limit="10" />
</el-tab-pane>
<el-tab-pane label="能源信息" name="energy">
<div class="toggleTabBox">
<div :class="{ active: activeModule === 'dataList' }" @click="toggleTab('dataList')">数据列表</div>
<div :class="{ active: activeModule === 'barChart' }" @click="toggleTab('barChart')">柱状图</div>
</div>
<div>
<div v-show="activeModule === 'dataList'">
<!-- 表格 -->
<base-table :max-height="tableH" :table-props="tablePropsEnergy" :page="listQueryEnergy.pageNo"
:limit="listQueryEnergy.pageSize" :table-data="energyList" />
</div>
<!-- 图形 -->
<div v-show="activeModule === 'barChart'">
<bar-chart ref="orderEnergyChart" :chartData="chartData" />
</div>
</div>
</el-tab-pane>
</el-tabs>
<div class="attr-list"> </el-row>
<small-title
style="margin: 16px 0; padding-left: 8px"
:no-padding="true">
订单相关信息
</small-title>
<base-table
:table-props="tableProps"
:page="listQuery.pageNo"
:limit="listQuery.pageSize"
:table-data="orderList">
<method-btn
v-if="!isdetail"
slot="handleBtn"
:width="120"
label="操作"
:method-list="tableBtn"
@clickBtn="handleClick" />
</base-table>
<!-- <pagination
v-show="listQuery.total > 0"
:total="listQuery.total"
:page.sync="listQuery.pageNo"
:limit.sync="listQuery.pageSize"
:page-sizes="[5, 10, 15]"
@pagination="getList" /> -->
</div>
<div class="attr-list"> <!-- 对话框(添加 / 修改) -->
<small-title <!-- <base-dialog dialogTitle="添加设备" :dialogVisible="open" width="500px" @close="open = false" @cancel="open = false"
style="margin: 16px 0; padding-left: 8px" @confirm="submitForm">
:no-padding="true"> <el-select v-if="open" style="width: 100%" filterable clearable v-model="queryParams.equipmentId"
预计用料信息 placeholder="请选择一个设备">
</small-title> <el-option v-for="eq in eqList" :key="eq.id" :value="eq.id" :label="eq.name"></el-option>
<base-table </el-select>
:table-props="tableProps1" </base-dialog> -->
:page="listQuery1.pageNo" </div>
:limit="listQuery1.pageSize"
:table-data="materialList" />
<!-- <pagination
v-show="listQuery1.total > 0"
:total="listQuery1.total"
:page.sync="listQuery1.pageNo"
:limit.sync="listQuery1.pageSize"
:page-sizes="[5, 10, 15]"
@pagination="getList" /> -->
</div>
<!-- <div class="drawer-body__footer">
<el-button type="primary" @click="goback()">关闭</el-button>
</div> -->
</div>
</div>
</template> </template>
<script> <script>
// import basicAdd from '../../core/mixins/basic-add'; // import basicAdd from '../../core/mixins/basic-add';
import { getCoreWO, getMaterialBomPage, getConOrderList, getCoreWOListById } from "@/api/base/coreWorkOrder"; import { getCoreWO, getMaterialBomPage, getConOrderList, getCoreWOListById } from "@/api/base/coreWorkOrder";
import tableHeightMixin from '@/mixins/tableHeightMixin';
import { getOrderEnergyData } from "@/api/monitoring/orderEnergy";
// import { orderList } from "@/api/base/orderManage"; // import { orderList } from "@/api/base/orderManage";
import {
getStatisticalDataPage,
} from '@/api/monitoring/statisticalData';
import { getProcessFlowList } from '@/api/base/orderManage' import { getProcessFlowList } from '@/api/base/orderManage'
import SmallTitle from './SmallTitle'; import SmallTitle from './SmallTitle';
import { publicFormatter } from "@/utils/dict"; import { publicFormatter } from "@/utils/dict";
import { parseTime } from '@/utils/ruoyi' import { parseTime } from '@/utils/ruoyi'
import workOrderNav from './workOrderNav.vue'
import BarChart from "./barChart"
const tableBtn = [ const tableBtn = [
{ {
type: 'edit', type: 'edit',
@ -199,14 +219,101 @@ const tableProps1 = [
label: '剩余生产预计消耗' label: '剩余生产预计消耗'
}, },
]; ];
const tablePropsEnergy = [
{
prop: 'objName',
label: '对象名称'
},
{
prop: 'objCode',
label: '对象编码',
// filter: publicFormatter('unit_dict')
},
{
prop: 'energyType',
label: '能源类型',
// filter: publicFormatter('unit_dict')
},
{
prop: 'startNum',
label: '工单开始值',
// filter: publicFormatter('unit_dict')
},
{
prop: 'endNum',
label: '工单结束值/当前值'
},
{
prop: 'useNum',
label: '使用量'
},
];
export default { export default {
components: { SmallTitle }, mixins: [tableHeightMixin],
components: { SmallTitle, workOrderNav, BarChart },
computed: {
tablePropsQuality() {
return [
{
// width: 128,
prop: 'workOrderName',
label: '工单名称',
},
{
// width: 128,
prop: 'productionName',
label: '产品',
},
{
// width: 160,
prop: 'inspectionContent',
label: '检测内容',
},
...this.dynamicProps,
{
// width: 128,
prop: 'sumScrap',
label: '未检测总数',
},
{
// width: 128,
prop: 'scrapRatio',
label: '比例(%)',
// subcomponent: {
// name: 'TextOnly',
// props: {
// injectData: {
// type: Object,
// default: () => ({}),
// },
// },
// data() {
// return {
// text: '',
// };
// },
// methods: {
// handleEmit(payload) {
// console.log('handleEmit', payload);
// },
// },
// render(h) {
// return h('el-button', { props: { type: 'text' } }, this.text);
// },
// },
},
];
},
},
data() { data() {
return { return {
tableBtn, tableBtn,
tableProps, tableProps,
tableProps1, heightNum: 236,
tablePropsEnergy,
tableProps1,
activeModule:'dataList',
workOrderId:undefined,
addOrUpdateVisible: false, addOrUpdateVisible: false,
urlOptions: { urlOptions: {
infoURL: getCoreWO infoURL: getCoreWO
@ -215,7 +322,13 @@ export default {
pageSize: 10, pageSize: 10,
pageNo: 1, pageNo: 1,
total: 0, total: 0,
}, },
listQueryEnergy: {
pageSize: 10,
pageNo: 1,
total: 0,
},
activeName:'produce',
listQuery1: { listQuery1: {
pageSize: 10, pageSize: 10,
pageNo: 1, pageNo: 1,
@ -223,40 +336,120 @@ export default {
}, },
dataForm: {}, dataForm: {},
orderList: [], orderList: [],
materialList: [], materialList: [],
energyList: [],
qualityList: [],
chartData:[],
dynamicProps:[],
// orderArray: [], // orderArray: [],
visible: false, visible: false,
isdetail: false, isdetail: false,
workOrderButton: [], workOrderButton: [],
processFlowList: [] processFlowList: []
}; };
}, },
watch: {
workOrderId(newValue, oldValue) {
this.activeName = 'produce'
this.init(newValue)
this.dataForm.id = newValue
}
},
created() { created() {
this.getDict() this.getDict()
}, },
mounted() { mounted() {
if (this.$route.query.woIdString && this.$route.query.woIdString !== 'undefined') { if (this.$route.query.woIdString && this.$route.query.woIdString !== 'undefined') {
const idList = this.$route.query.woIdString.split(',') const idList = this.$route.query.woIdString.split(',')
console.log(idList);
getCoreWOListById(idList).then(res => { getCoreWOListById(idList).then(res => {
this.workOrderButton = res.data.map(work => { this.workOrderButton = res.data.map(work => {
return { return {
id: work.id, id: work.id,
name: work.name name: work.name
} }
}) })
// console.log(this.workOrderButton);
this.init(this.workOrderButton[0].id, true) this.init(this.workOrderButton[0].id, true)
}) })
} else { } else {
this.init(this.$route.query.id, true) this.init(this.$route.query.id, true)
} }
}, },
methods: { methods: {
getId(val) {
this.workOrderId = val
},
async switchTab(val) {
if (this.activeName === 'order') {
getConOrderList({
workOrderId: this.dataForm.id,
}).then((response) => {
this.orderList = response.data;
// this.listQuery.total = response.data.total;
});
}else if (this.activeName === 'material') {
getConOrderList({
workOrderId: this.dataForm.id,
}).then((response) => {
this.materialList = response.data;
// this.listQuery.total = response.data.total;
});
} else if (this.activeName === 'energy') {
getOrderEnergyData({
workOrderId: this.dataForm.id,
}).then((response) => {
this.energyList = response.data
this.chartData = response.data
// this.listQuery.total = response.data.total;
});
} else if (this.activeName === 'quality') {
const {
data: { data, otherList, otherMap, nameData },
} = await getStatisticalDataPage({
workOrderIdList:[this.dataForm,id]
})
// console.log(this.queryParams);
this.dynamicProps = this.filterNameData(nameData)
this.qualityList = this.filterData(data);
}
},
getDict() { getDict() {
// //
getProcessFlowList().then(res => { getProcessFlowList().then(res => {
this.processFlowList = res.data || [] this.processFlowList = res.data || []
}) })
}, },
filterNameData(nameData) {
const ndSet = new Set();
nameData.forEach((nd) => {
ndSet.add(nd.name);
});
return Array.from(ndSet.values())
.sort()
.map((name) => ({
prop: name,
label: name,
}));
},
filterData(data) {
return data.map((item) => {
const { data: innerData } = item;
const keyValuePairs = {};
innerData.map((d) => {
keyValuePairs[d.dynamicName] = d.dynamicValue;
});
return {
inspectionContent: item.inspectionContent,
...keyValuePairs,
sumInput: item.sumInput,
productionName: item.productionName,
workOrderId: item.workOrderId,
scrapRatio: item.scrapRatio,
};
});
},
fitlerP(val) { fitlerP(val) {
if (val) { if (val) {
if (val === 1) { if (val === 1) {
@ -318,24 +511,26 @@ export default {
} else { } else {
this.addNew(raw.data.id); this.addNew(raw.data.id);
} }
}, },
toggleTab(val) {
this.activeModule = val
if (this.activeModule === 'barChart') {
this.$nextTick((res) => {
this.$refs.orderEnergyChart.getChart()
})
}
},
getList() { getList() {
// //
getConOrderList({
workOrderId: this.dataForm.id,
}).then((response) => {
this.orderList = response.data;
// this.listQuery.total = response.data.total;
});
// 使 // 使
if (this.dataForm.planProductId) { // if (this.dataForm.planProductId) {
getMaterialBomPage({ // getMaterialBomPage({
productId: this.dataForm.planProductId, // productId: this.dataForm.planProductId,
}).then((response) => { // }).then((response) => {
this.materialList = response.data; // this.materialList = response.data;
// this.listQuery.total = response.data.length; // // this.listQuery.total = response.data.length;
}); // });
} // }
// //
// orderList({ // orderList({
// workOrderId: this.dataForm.id // workOrderId: this.dataForm.id
@ -364,7 +559,7 @@ export default {
}) })
} }
// //
this.getList(); // this.getList();
}); });
} else { } else {
if (this.urlOptions.isGetCode) { if (this.urlOptions.isGetCode) {
@ -373,10 +568,6 @@ export default {
} }
}); });
}, },
goback() {
this.$router.go(-1);
// this.initData();
},
goEdit() { goEdit() {
this.isdetail = false; this.isdetail = false;
}, },
@ -390,7 +581,7 @@ export default {
} }
}; };
</script> </script>
<style scoped> <style lang="scss" scoped>
.drawer >>> .el-drawer { .drawer >>> .el-drawer {
border-radius: 8px 0 0 8px; border-radius: 8px 0 0 8px;
display: flex; display: flex;
@ -453,4 +644,26 @@ export default {
.add { .add {
color: #0b58ff; color: #0b58ff;
} }
.container{
/* background-color: #fff; */
border-radius: 8px;
padding: 16px 16px 0 16px;
margin: 8px 0 8px 0px;
}
.toggleTabBox {
display: inline-block;
div {
display: inline-block;
padding: 0 8px 4px;
color: rgba(102, 102, 102, 0.5);
border-bottom: 2px solid rgba(242, 244, 249, 1);
cursor: pointer;
}
.active {
color: rgba(0, 0, 0, 0.85);
border-bottom-color: #0B58FF;
}
}
</style> </style>

View File

@ -60,68 +60,9 @@ import {
getConOrderList, getConOrderList,
getCoreWOList getCoreWOList
} from '@/api/base/coreWorkOrder'; } from '@/api/base/coreWorkOrder';
import { listDept } from '@/api/system/dept';
const tableProps = [
{
prop: 'createTime',
label: '创建时间',
filter: parseTime,
minWidth: 150,
showOverflowtooltip: true
},
{
prop: 'name',
label: '工单名称',
minWidth: 120,
showOverflowtooltip: true
},
{
prop: 'code',
label: '工单编码',
minWidth: 150,
showOverflowtooltip: true
},
{
prop: 'workers',
label: '负责人',
minWidth: 100,
showOverflowtooltip: true
},
{
prop: 'priority',
label: '优先级',
filter: (val) => ['', '低', '正常', '高'][val]
},
{
prop: 'triggerOrigin',
label: '来源',
filter: (val) => ['', 'MES-手动', 'MES-订单下发', 'ERP'][val]
},
{
prop: 'status',
label: '工单状态',
filter: (val) => ['', '等待', '激活', '暂停', '完成', '', '', '', '', '作废'][val]
},
{
prop: 'planFinishTime',
label: '计划完成时间',
filter: parseTime,
minWidth: 150,
showOverflowtooltip: true
},
{
prop: 'planQuantity',
label: '计划生产数量',
minWidth: 120,
},
{
prop: 'actualQuantity',
label: '实际生产数量',
minWidth: 120,
}
];
export default { export default {
mixins: [basicPage], mixins: [basicPage],
components: { components: {
@ -134,37 +75,38 @@ export default {
urlOptions: { urlOptions: {
getDataListURL: getCoreWOPage, getDataListURL: getCoreWOPage,
deleteURL: deleteCoreWO deleteURL: deleteCoreWO
}, },
detailVisible: false, departments:[],
detailVisible: false,
departmentsLoaded: false,
materialVisible: false, materialVisible: false,
allocationVisible: false, allocationVisible: false,
tableProps,
tableBtn: [ tableBtn: [
this.$auth.hasPermi(`base:core-work-order:material`) // this.$auth.hasPermi(`base:core-work-order:material`)
? { // ? {
type: 'material', // type: 'material',
btnName: '原料信息', // btnName: '',
} // }
: undefined, // : undefined,
{ // {
type: 'active', // type: 'active',
btnName: '激活', // btnName: '',
showParam: { // showParam: {
type: '|', // type: '|',
data: [ // data: [
{ // {
name: 'status', // name: 'status',
type: 'equal', // type: 'equal',
value: 1 // value: 1
}, // },
{ // {
name: 'status', // name: 'status',
type: 'equal', // type: 'equal',
value: 3 // value: 3
} // }
] // ]
} // }
}, // },
{ {
type: 'pause', type: 'pause',
btnName: '暂停', btnName: '暂停',
@ -323,13 +265,88 @@ export default {
}, },
], ],
}; };
}, },
mounted() { computed: {
tableProps() {
return [
{
prop: 'createTime',
label: '创建时间',
filter: parseTime,
minWidth: 150,
showOverflowtooltip: true
},
{
prop: 'name',
label: '工单名称',
minWidth: 120,
showOverflowtooltip: true
},
{
prop: 'code',
label: '工单编码',
minWidth: 150,
showOverflowtooltip: true
},
{
prop: 'deptId',
label: '负责部门',
minWidth: 100,
showOverflowtooltip: true,
filter: (val) => {
if (this.departmentsLoaded) {
const department = this.departments.find((dept) => dept.id === val);
return department ? department.name : '';
} else {
return '';
}
},
},
{
prop: 'priority',
label: '优先级',
filter: (val) => ['', '低', '正常', '高'][val]
},
{
prop: 'triggerOrigin',
label: '来源',
filter: (val) => ['', 'MES-手动', 'MES-订单下发', 'ERP'][val]
},
{
prop: 'status',
label: '工单状态',
filter: (val) => ['', '等待', '激活', '暂停', '完成', '', '', '', '', '作废'][val]
},
{
prop: 'planFinishTime',
label: '计划完成时间',
filter: parseTime,
minWidth: 150,
showOverflowtooltip: true
},
{
prop: 'planQuantity',
label: '计划生产数量',
minWidth: 120,
},
{
prop: 'actualQuantity',
label: '实际生产数量',
minWidth: 120,
}
];
}
},
mounted() {
console.log(this.$route.query.workOrderName) console.log(this.$route.query.workOrderName)
if (this.$route.query.workOrderName) { if (this.$route.query.workOrderName) {
this.listQuery.name = this.$route.query.workOrderName; this.listQuery.name = this.$route.query.workOrderName;
this.formConfig[0].defaultSelect = this.$route.query.workOrderName; this.formConfig[0].defaultSelect = this.$route.query.workOrderName;
} }
listDept().then(res => {
this.departments = res.data || []
this.departmentsLoaded = true;
})
// this.getWorkOrder() // this.getWorkOrder()
this.getDataList() this.getDataList()
}, },

View File

@ -0,0 +1,151 @@
<!--
* @Author: zhp
* @Date: 2024-09-09 15:39:08
* @LastEditTime: 2024-09-11 10:25:54
* @LastEditors: zhp
* @Description:
-->
<template>
<div>
<div class="button-nav">
<!-- <div class="text-carousel"> -->
<el-button style="flex: .1" type="text" @click="prevText" icon="el-icon-caret-left"></el-button>
<button @click="handleChange(item.id)" v-for="(item,index) in idList" :key="item.id"
:class="[item.id === currentMenu ? 'active' : '']">{{ item.name }}
</button>
<el-button style="flex: .1" type="text" @click="nextText" icon="el-icon-caret-right"></el-button>
<button style="flex: .2;display: inline-block;" @click="goback()">
<svg-icon style="width: 20px; height: 20px" :icon-class=" 'back' " />
<span>返回</span>
</button>
</div>
<!-- </div> -->
</div>
</template>
<script>
export default {
props: {
idList: {
type: Array,
default:[]
}
},
data() {
return {
currentMenu: undefined
};
},
watch: {
currentMenu(newValue,oldValue) {
this.$emit('getWorkOrderId', newValue)
},
idList(newValue, oldValue) {
console.log(newValue);
this.currentMenu = newValue[0].id
}
},
// created() {
// if (this.currentMenu === undefined) {
// console.log(this.idList);
// this.$nextTick(() => {
// this.currentMenu = this.idList[0]?.id
// })
// }
// },
// mounted() {
// },
methods: {
goback() {
this.$router.go(-1);
// this.initData();
},
handleChange(val) {
this.currentMenu = val
// this.$emit('getWorkOrderId',val)
},
prevText() {
const currentIndex = this.idList.findIndex((item) => item.id === this.currentMenu);
const newIndex = (currentIndex - 1 + this.idList.length) % this.idList.length;
this.currentMenu = this.idList[newIndex].id;
// this.$emit('getWorkOrderId', val)
},
nextText() {
const currentIndex = this.idList.findIndex((item) => item.id === this.currentMenu);
const newIndex = (currentIndex + 1) % this.idList.length;
this.currentMenu = this.idList[newIndex].id;
// this.$emit('getWorkOrderId', val)
},
},
};
</script>
<style scoped lang="scss">
.button-nav {
width: 100%;
padding: 12px 0;
display: flex;
// justify-content: space-around;
gap: 12px;
* {
user-select: none;
}
button {
cursor: pointer;
appearance: none;
outline: none;
border: none;
background: #fff;
border-radius: 8px;
border-bottom-left-radius: 5px;
border-bottom-right-radius: 5px;
padding: 20px;
color: #888;
letter-spacing: 2px;
flex: 1;
box-sizing: padding-box;
position: relative;
&::after {
content: attr(data-text);
position: absolute;
top: 10px;
left: 50%;
font-size: 18px;
font-weight: 500;
transform: translate(-50%);
}
&.active {
color: #111;
border-bottom: 4px solid #0b58ff;
}
}
}
</style>
<style scoped>
.custom-tabs >>> .el-tabs__header {
margin-bottom: 8px;
display: inline-block;
/* transform: translateY(-12px); */
}
.custom-tabs >>> .el-tabs__item {
padding-left: 0px !important;
padding-right: 0px !important;
line-height: 36px !important;
height: 36px;
}
.custom-tabs >>> .el-tabs__content {
height: calc(100% - 42px);
}
.custom-tabs >>> .el-tab-pane {
box-sizing: border-box;
height: 100%;
padding: 20px;
border: 10px solid #f002;
}
</style>

View File

@ -1,3 +1,10 @@
<!--
* @Author: zhp
* @Date: 2024-08-13 08:36:54
* @LastEditTime: 2024-09-11 09:35:12
* @LastEditors: zhp
* @Description:
-->
<template> <template>
<base-table <base-table
:table-props="tableProps" :table-props="tableProps"