金蝶工序计划

This commit is contained in:
tzy 2026-04-15 19:43:16 +08:00
parent dcd221f21b
commit c23718c42a
5 changed files with 133 additions and 89 deletions

View File

@ -58,3 +58,19 @@ export function updateOperationPlanningMainOperators(data) {
data: data
})
}
export function syncOperationPlanningMain(data) {
return request({
url: '/system/operationPlanningMain/sync',
method: 'post',
data: data
})
}
export function queryFromK3OperationPlanningMain(query) {
return request({
url: '/system/operationPlanningMain/queryFromK3',
method: 'get',
params: query
})
}

View File

@ -34,13 +34,13 @@ export const constantRoutes = [
path: '/',
component: Layout,
hidden: false,
redirect: '/home'
redirect: '/workbench/index'
},
{
path: '/home',
component: Layout,
hidden: true,
redirect: '/system/productionPlan',
redirect: '/workbench/index',
children: [
{
path: '/system/productionPlan',
@ -48,20 +48,6 @@ export const constantRoutes = [
}
]
},
{
path: '/system/operationPlanningMain',
component: Layout,
hidden: false,
redirect: to => ({ path: '/system/operationPlanningMain/index', query: to.query }),
children: [
{
path: 'index',
component: () => import('@/views/system/operationPlanningMain'),
name: 'OperationPlanningMain',
meta: { title: '生产计划', icon: 'table' }
}
]
},
{
path: '/workbench',
component: Layout,

View File

@ -72,7 +72,7 @@ export default {
return {
codeUrl: "",
loginForm: {
username: "admin",
username: "",
password: "",
rememberMe: false,
code: "",
@ -121,11 +121,17 @@ export default {
const username = Cookies.get("username");
const password = Cookies.get("password");
const rememberMe = Cookies.get('rememberMe')
this.loginForm = {
username: username === undefined ? this.loginForm.username : username,
password: password === undefined ? this.loginForm.password : decrypt(password),
rememberMe: rememberMe === undefined ? false : Boolean(rememberMe)
};
const remember = rememberMe === true || rememberMe === 'true'
if (!remember) {
Cookies.remove("username");
Cookies.remove("password");
Cookies.remove('rememberMe');
}
this.loginForm.username = remember ? (username || '') : ''
this.loginForm.password = remember ? (password ? decrypt(password) : '') : ''
this.loginForm.rememberMe = remember
},
handleLogin() {
this.$refs.loginForm.validate(valid => {

View File

@ -49,6 +49,8 @@
</el-form-item>
</el-form>
<!-- <el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
@ -148,7 +150,14 @@
<span>{{ parseTime(scope.row.planFinishTime, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="状态" width="100" align="center">
<el-table-column
label="状态"
width="100"
align="center"
:filters="statusFilters"
:filter-multiple="false"
:filter-method="filterOrderStatus"
>
<template slot-scope="scope">
<el-tag size="mini" :class="statusTagClass(scope.row)">{{ statusText(scope.row) }}</el-tag>
</template>
@ -205,19 +214,7 @@
</div>
</template>
</el-table-column>
<el-table-column label="操作" width="170" align="center" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button size="mini" type="text" @click="handleDispatch(scope.row)">下发</el-button>
<el-button size="mini" type="text" @click="handleUpdate(scope.row)" v-hasPermi="['system:operationPlanningMain:edit']">编辑</el-button>
<el-dropdown @command="cmd => handleMoreCommand(cmd, scope.row)">
<span class="more-trigger">更多<i class="el-icon-arrow-down el-icon--right"></i></span>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item command="viewProcess">查看工序</el-dropdown-item>
<el-dropdown-item command="delete" divided>删除</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</template>
</el-table-column>
</el-table>
<pagination
@ -239,9 +236,9 @@
<template slot="title">
<div class="process-drawer__title-line">
<span class="process-drawer__title-main">工序详情</span>
<span v-if="processDialogBillNo" class="process-drawer__title-kv">工序单号{{ processDialogBillNo }}</span>
<span v-if="processDialogBatchNo" class="process-drawer__title-kv">生产{{ processDialogBatchNo }}</span>
<span v-if="processDialogProduct" class="process-drawer__title-kv process-drawer__title-product">产品{{ processDialogProduct }}</span>
<span v-if="processDialogBillNo" class="process-drawer__title-kv">单据编码{{ processDialogBillNo }}</span>
<span v-if="processDialogBatchNo" class="process-drawer__title-kv">生产执行单{{ processDialogBatchNo }}</span>
<span v-if="processDialogProduct" class="process-drawer__title-kv process-drawer__title-product">物料编码{{ processDialogProduct }}</span>
</div>
</template>
<div class="process-drawer__toolbar">
@ -255,6 +252,7 @@
:loading="processDialogSaving"
:disabled="!processDialogDirtyCount"
@click="submitOperatorUpdates"
v-hasPermi="['system:operationPlanningMain:updateOperators']"
>保存</el-button>
</div>
</div>
@ -410,7 +408,7 @@
</template>
<script>
import { listOperationPlanningMain, cascadeListOperationPlanningMain, getOperationPlanningMain, delOperationPlanningMain, addOperationPlanningMain, updateOperationPlanningMain, updateOperationPlanningMainOperators, getEquipmentOptions } from "@/api/system/operationPlanningMain";
import { listOperationPlanningMain, cascadeListOperationPlanningMain, getOperationPlanningMain, delOperationPlanningMain, addOperationPlanningMain, updateOperationPlanningMain, updateOperationPlanningMainOperators, syncOperationPlanningMain, queryFromK3OperationPlanningMain, getEquipmentOptions } from "@/api/system/operationPlanningMain";
export default {
name: "OperationPlanningMain",
@ -429,6 +427,8 @@ export default {
processDialogList: [],
processDialogOrder: null,
processDialogSaving: false,
k3SyncLoading: false,
k3QueryLoading: false,
//
single: true,
//
@ -437,6 +437,13 @@ export default {
showSearch: true,
//
total: 0,
statusFilters: [
{ text: '未开始', value: '未开始' },
{ text: '进行中', value: '进行中' },
{ text: '预警', value: '预警' },
{ text: '延期', value: '延期' },
{ text: '已完成', value: '已完成' }
],
//
operationPlanningMainList: [],
//
@ -469,6 +476,24 @@ export default {
'铆焊工段': [
'数控激光下料', '数控火焰下料', '数控切管下料', '铆工', '焊工',
'激光焊工', '机器人焊接', '打磨', '抛丸', '校形'
],
'委外中心': [
'勤润','泰美','南浦','德宝','圣田','盛懋','智创'
],
'电钳工段': [
'组装线(电气组装配线配盘)','伺服(三相异步)电气测试调试'
],
'装一工段': [
'产品二班 | 一单元', '产品二班 | 二单元', '产品二班 | 三单元', '产品二班 | 四单元',
'产品二班 | 五单元', '产品二班 | 六单元', '产品二班 | 七单元', '产品二班 | 八单元',
'产品一班 | 一单元', '产品一班 | 二单元', '产品一班 | 三单元', '产品一班 | 四单元',
'链条班 | 一单元', '链条班 | 二单元', '链条班 | 三单元', '链条班 | 四单元', '链条班 | 五单元',
'测试班 | 一单元', '测试班 | 二单元', '测试班 | 三单元'
],
'装二工段': [
'集成产品组 | 一单元', '集成产品组 | 二单元', '集成产品组 | 三单元', '集成产品组 | 四单元',
'减速机班 | 一单元', '减速机班 | 二单元',
'装配一组 | 一单元', '装配一组 | 二单元', '装配一组 | 三单元', '装配一组 | 四单元'
]
},
staticOperatorData: {
@ -492,6 +517,26 @@ export default {
'石泽明', '王晓凡', '郝亮', '耿利刚', '魏辰强', '李永文', '吴海庆', '范会雨',
'贾会涛', '吴凯亮', '赵兰争', '董亚军', '王晓军', '代程翼', '魏佳蕊', '齐乐芳',
'康坤兰', '赵锦泽', '游梦皓', '牛立革', '宋金娜', '赵科飞'
],
'电钳工段': [
'乔克俭', '乔鑫磊', '贾江涛', '魏兴宁', '韩巍', '温玉博',
'王宁', '李士荷', '李卓航', '王烁', '孙涵', '赵泽龙'
],
'装一工段': [
'位会然', '李飞飞', '孙红霞', '王恩静', '宋瑞彦', '胡建泛', '常静肖', '宋丽花',
'刘世普', '马宇航', '王欢欢', '韦隆香', '高领琪', '梁红霞', '张晓帅',
'姚少鹏', '王晓田', '任泽钊', '牛泽鹏', '胡韶倩', '史傲磊', '于金赐', '孙畅',
'宋少然', '李丽哲', '刘翠娟', '李丽彦', '董静柳', '高肖欣', '康文娟', '高丽月',
'徐燕', '茹彩肖',
'何许娜', '侯乐辉', '李少杰', '李江花', '梅彦恒', '何旭冉'
],
'装二工段': [
'尹哲辉', '李博博', '李建霞', '丁小丽', '周晓冲', '曹海勃', '董永军', '周文茹',
'王硕', '王玉博', '任泽寒', '宁素丽',
'董士杰', '张佳迅', '边敬辉', '谷飞博', '王东坡', '王玉霞', '刘倚辰', '孙玉凯'
],
'委外中心': [
'刘冉', '吕松林', '王旭得', '张浩宇', '李欣'
]
},
//
@ -560,6 +605,40 @@ export default {
const opts = this.staticOperatorData[workCenter] || [];
return opts;
},
buildK3Query() {
const q = this.queryParams || {};
const { pageNum, pageSize, ...filters } = q;
return { ...filters };
},
handleSyncK3() {
if (this.k3SyncLoading) return;
const payload = this.buildK3Query();
this.$modal.confirm('确认同步K3数据').then(() => {
this.k3SyncLoading = true;
return syncOperationPlanningMain(payload);
}).then(() => {
this.$modal.msgSuccess('同步成功');
this.getList();
}).catch(() => {
}).finally(() => {
this.k3SyncLoading = false;
});
},
handleQueryFromK3() {
if (this.k3QueryLoading) return;
const query = this.buildK3Query();
this.k3QueryLoading = true;
queryFromK3OperationPlanningMain(query)
.then(response => {
const { rows, total, hasTotal } = this.normalizeListResponse(response);
this.operationPlanningMainList = (rows || []).map(row => this.decorateRow(row));
this.total = hasTotal ? total : this.inferTotalFromPage(rows);
this.$modal.msgSuccess('已从K3查询');
})
.finally(() => {
this.k3QueryLoading = false;
});
},
initFromRoute() {
const q = (this.$route && this.$route.query) || {};
const batchNo = q.batchNo || q.hbytSclh || q.productionOrderNo;
@ -726,6 +805,9 @@ export default {
if (!row) return '-';
return this.calcOrderStatus(row) || '-';
},
filterOrderStatus(value, row) {
return this.statusText(row) === value;
},
statusTagClass(row) {
const text = this.statusText(row);
if (text === '未开始') return 'tag-gray';

View File

@ -41,23 +41,6 @@
</div>
</div>
</el-col>
<!-- 右侧出货订单数据 -->
<el-col :xs="24" :sm="24" :lg="10">
<div class="workbench-panel">
<div class="workbench-panel-header" style="display: flex; justify-content: space-between; align-items: center;">
<span class="workbench-panel-title">出货订单数据</span>
<el-radio-group v-model="shipOrderTimeRange" size="mini" @change="fetchShipOrderData">
<el-radio-button label="lastMonth">上月</el-radio-button>
<el-radio-button label="thisMonth">本月</el-radio-button>
<el-radio-button label="halfYear">近6个月</el-radio-button>
</el-radio-group>
</div>
<div class="workbench-panel-body">
<ship-order-data :list="shipOrderList" />
</div>
</div>
</el-col>
</el-row>
</div>
</template>
@ -67,14 +50,12 @@ import OverviewCards from './components/OverviewCards'
import WorkOrderBar from './components/WorkOrderBar'
import ProcessDefectRank from './components/ProcessDefectRank'
import WorkOrderProgress from './components/WorkOrderProgress'
import ShipOrderData from './components/ShipOrderData'
import {
getOverview,
getWorkOrderBar,
getProcessDefectRank,
getWorkOrderProgress,
getShipOrderData
getWorkOrderProgress
} from '@/api/system/workbench'
export default {
@ -83,8 +64,7 @@ export default {
OverviewCards,
WorkOrderBar,
ProcessDefectRank,
WorkOrderProgress,
ShipOrderData
WorkOrderProgress
},
data() {
return {
@ -96,9 +76,7 @@ export default {
],
workOrderData: { xAxis: [], series: [] },
defectRankList: [],
workOrderProgressList: [],
shipOrderTimeRange: 'lastMonth',
shipOrderList: []
workOrderProgressList: []
}
},
created() {
@ -149,20 +127,6 @@ export default {
}).catch(() => {
this.mockWorkOrderProgress()
})
//
this.fetchShipOrderData()
},
fetchShipOrderData() {
getShipOrderData({ range: this.shipOrderTimeRange }).then(res => {
if (res && res.data && res.data.items) {
this.shipOrderList = res.data.items
} else {
this.mockShipOrderData()
}
}).catch(() => {
this.mockShipOrderData()
})
},
mockOverview() {
this.overviewList = [
@ -203,16 +167,6 @@ export default {
{ workOrderNo: 'MO202112160004', status: '已开工', progress: 67, totalQty: 233 },
{ workOrderNo: 'MO202112160005', status: '已开工', progress: 55, totalQty: 983 }
]
},
mockShipOrderData() {
this.shipOrderList = [
{ customerName: '松下电器(中国)有限公司', yoy: 0.61, orderQty: 3261 },
{ customerName: '苹果科技有限公司', yoy: -0.38, orderQty: 3664 },
{ customerName: '华为技术有限公司', yoy: 0.47, orderQty: 2735 },
{ customerName: '小米科技有限责任公司', yoy: 0.05, orderQty: 3718 },
{ customerName: '联想集团', yoy: -0.62, orderQty: 3299 },
{ customerName: '广东移动通信有限公司', yoy: -0.18, orderQty: 7058 }
]
}
}
}