From f7a2fcdda7f1120498c5c5f75c5a99955fc54b43 Mon Sep 17 00:00:00 2001
From: 廖井涛 <2265517004@qq.com>
Date: 星期二, 16 十二月 2025 16:54:09 +0800
Subject: [PATCH] Merge branch 'master' of http://10.153.19.25:10105/r/ERP_override
---
north-glass-erp/northglass-erp/src/views/pp/glassOptimize/ProjectCreate.vue | 403 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 403 insertions(+), 0 deletions(-)
diff --git a/north-glass-erp/northglass-erp/src/views/pp/glassOptimize/ProjectCreate.vue b/north-glass-erp/northglass-erp/src/views/pp/glassOptimize/ProjectCreate.vue
new file mode 100644
index 0000000..eda7c83
--- /dev/null
+++ b/north-glass-erp/northglass-erp/src/views/pp/glassOptimize/ProjectCreate.vue
@@ -0,0 +1,403 @@
+<script setup>
+import ProcessCard from "@/views/pp/glassOptimize/page/ProcessCard.vue";
+import ProcessCardDetail from "@/views/pp/glassOptimize/page/ProcessCardDetail.vue";
+import ProjectList from "@/views/pp/glassOptimize/page/ProjectList.vue";
+
+import {defineEmits, nextTick, onMounted, reactive, ref} from "vue";
+import {useI18n} from "vue-i18n";
+import GlassComputed from "@/views/pp/glassOptimize/GlassComputed.vue";
+import ProjectMange from "@/views/pp/glassOptimize/ProjectMange.vue";
+import request from "@/utils/request";
+import {ElMessage, ElMessageBox} from "element-plus";
+import deepClone from "@/utils/deepClone";
+import {useRouter} from "vue-router";
+import {changeFilterEvent, filterChanged} from "@/hook";
+
+const router = useRouter();
+let projectRow = ref({
+ processId:null,
+ technologyNumber:null
+})
+
+const processCardRef=ref(null)
+
+const handleProcessIdUpdate = newProcessId => {
+ projectRow.value.processId = newProcessId;
+
+};
+
+const handleTechnologyNumberUpdate = newTechnologyNumber => {
+ projectRow.value.technologyNumber = newTechnologyNumber;
+};
+
+const updateState = state => {
+ getProject();
+
+};
+
+
+const { t } = useI18n()
+
+const xGrid = ref()
+
+
+const gridOptions = reactive({
+ height:'100%',
+ loading: false,
+ border: "full",//琛ㄦ牸鍔犺竟妗�
+ keepSource: true,//淇濇寔婧愭暟鎹�
+ align: 'center',//鏂囧瓧灞呬腑
+ stripe:true,//鏂戦┈绾�
+ rowConfig: {isCurrent: true, isHover: true,height: 30, useKey: true},//榧犳爣绉诲姩鎴栭�夋嫨楂樹寒
+ id: 'ProjectList',
+ scrollX:{enabled: true},
+ scrollY:{ enabled: true ,gt:0},//寮�鍚櫄鎷熸粴鍔�
+ showOverflow:true,
+ columnConfig: {
+ resizable: true,
+ useKey: true
+ },
+ filterConfig: { //绛涢�夐厤缃」
+ //remote: true
+ },
+ customConfig: {
+ storage: true
+ },
+ editConfig: {
+ trigger: 'click',
+ mode: 'row',
+ showStatus: true
+ },
+ columns:[
+ {field: 'id',width: 150, title: 'ID'},
+ {field: 'projectNumber',width: 150, title: '宸ョ▼鍙�',filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: true,filterMethod:filterChanged},
+ {field: 'project_name',width: 150, title: '椤圭洰鍚嶇О',filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: true,filterMethod:filterChanged},
+ {field: 'glass_type',width: 150, title: '鑶滅郴',filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: true,filterMethod:filterChanged},
+ {field: 'glass_thickness',width: 150, title: '鍘氬害',filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: true,filterMethod:filterChanged},
+ {field: 'type',width: 150, title: '绫诲瀷',filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: true,filterMethod:filterChanged},
+ {field: 'state',width: 150, title: '鐘舵��',filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: true,filterMethod:filterChanged},
+ {field: 'quantity',width: 150, title: t('order.quantity')},
+ {field: 'glass_total_area',width: 150, title: t('order.grossArea'),filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: true,filterMethod:filterChanged},
+ {field: 'process_qty',width: 150, title: '娴佺▼鏁伴噺',filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: true,filterMethod:filterChanged},
+ {field: 'process_cards',width: 150, title: '娴佺▼鍗″彿',filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: true,filterMethod:filterChanged},
+
+ ],//琛ㄥご鍙傛暟
+ data:null,//琛ㄦ牸鏁版嵁
+ toolbarConfig: {
+ buttons: [
+ ],
+ import: false,
+ // export: true,
+ // print: true,
+ zoom: true,
+ custom: true
+ },
+ //鍙抽敭鑿滃崟閫夐」
+ menuConfig: {
+ body: {
+ options: [
+ [
+ {code: 'openProject', name: '鎵撳紑宸ョ▼', prefixIcon: 'vxe-icon-folder-open'},
+ {code: 'updateProject', name: '淇敼宸ョ▼', prefixIcon: 'vxe-icon-folder-open'},
+ {code: 'compute', name: '妯℃嫙璁$畻', prefixIcon: 'vxe-icon-subtable'},
+ {code: 'delProject', name: '鍒犻櫎宸ョ▼', prefixIcon: 'vxe-icon-delete'},
+ ],
+ []
+ ]
+ }
+ }
+
+})
+
+// 瀹氫箟鎿嶄綔閰嶇疆瀵硅薄鏁扮粍锛岄泦涓鐞嗕笉鍚屾搷浣滈�夐」瀵瑰簲鐨勫弬鏁�
+const operationConfigs = [
+ {
+ code: 'openProject', // 鎵撳紑宸ョ▼
+ initialState: ['1'], //
+ targetState: null,
+ successMsg: '宸叉墦寮�锛�',
+ checkMessage: '褰撳墠宸ョ▼鐘舵�佷笉绗﹀悎鏉′欢锛岃纭宸ョ▼鐘舵�佸悗鍐嶆搷浣滐紒',
+ requiresRow: true,
+ openFile: async ({row}) => {
+ const projectNumber = row.projectNumber;
+ const thickness = row.glass_thickness;
+ const glassType = row.glass_type;
+ const quantity = row.quantity;
+ const area = row.glass_total_area;
+ const optimizeState = row.optimize_state;
+ await router.push({
+ name: 'optimizeInfo',
+ params: {
+ projectNo: projectNumber,
+ thickNess: thickness,
+ model: glassType,
+ quantity: quantity,
+ area: area,
+ optimizeState:optimizeState
+ }
+ });
+ }
+ },
+ {
+ code: 'compute', // 鎵撳紑妯℃嫙璁$畻鎿嶄綔
+ initialState: ['1'], //
+ targetState: null,
+ successMsg: '妯℃嫙璁$畻宸插惎鍔紒',
+ checkMessage: '褰撳墠宸ョ▼鐘舵�佷笉绗﹀悎妯℃嫙璁$畻鏉′欢锛岃纭宸ョ▼鐘舵�佸悗鍐嶆搷浣滐紒',
+ requiresRow: true,
+ actionFunction: async ({row}) => {
+ const projectNo = row.projectNumber;
+ emit('switch-dialog', row);
+ }
+ },
+ {
+ code: 'delProject',
+ initialState: ['1'],
+ targetState: null,
+ successMsg: '宸ョ▼鍒犻櫎鎴愬姛锛�',
+ checkMessage: '褰撳墠宸ョ▼鐘舵�佷笉绗﹀悎鍒犻櫎鏉′欢锛岃纭宸ョ▼鐘舵�佸悗鍐嶆搷浣滐紒',
+ },
+ {
+ code: 'updateProject',
+ initialState: ['1'],
+ targetState: null,
+ successMsg: '',
+ checkMessage: '褰撳墠宸ョ▼鐘舵�佷笉绗﹀悎鍒犻櫎鏉′欢锛岃纭宸ョ▼鐘舵�佸悗鍐嶆搷浣滐紒',
+ }
+
+];
+
+//瀹氫箟鍒囨崲妯℃嫙璁$畻寮圭獥
+const emit = defineEmits(['switch-dialog']);
+
+onMounted(async () => {
+ getProject();
+})
+
+// 瀹氫箟鏁版嵁杩斿洖缁撴灉锛屼娇鐢╮ef鍒涘缓鍝嶅簲寮忔暟鎹紝鍒濆鍖栦负绌烘暟缁�
+let produceList = ref([])
+
+const getProject = ()=>{
+ request.post(`/glassOptimize/getProjectList`).then((res) => {
+ if(res.code==200){
+ produceList.value = deepClone(res.data.data);
+ xGrid.value.loadData(produceList.value)
+ }else{
+ ElMessage.warning(res.msg)
+ }
+ })
+}
+
+// 鍏叡澶勭悊鍑芥暟锛屽鐞嗙浉鍚屾暟鎹椂鐨勬搷浣滐紝骞惰繑鍥瀟argetRoute瀵硅薄锛堝彸閿彍鍗曞拰鍙屽嚮鎵撳紑锛�
+const handleSameDataOperation = async ({projectNumber, thickness, glassType,quantity,glass_total_area,optimize_state}) => {
+ const targetRoute = {
+ name: 'optimizeInfo',
+ params: {
+ projectNo: projectNumber,
+ thickNess: thickness,
+ model: glassType,
+ quantity: quantity,
+ area: glass_total_area,
+ optimizeState:optimize_state
+ }
+ };
+ const currentRoute = router.currentRoute.value;
+ const isRoutesEqual = currentRoute.name === targetRoute.name &&
+ currentRoute.params.projectNo === targetRoute.params.projectNo &&
+ currentRoute.params.thickNess === targetRoute.params.thickNess &&
+ currentRoute.params.model === targetRoute.params.model;
+ if (isRoutesEqual) {
+ handleConfirm();
+ }
+ return {isRoutesEqual};
+};
+
+//閫変腑鐩稿悓鏁版嵁鏃跺脊绐楁彁绀�
+const handleConfirm = () => {
+ const currentRoute = router.currentRoute.value;
+ const projectNumber = currentRoute.params.projectNo;
+ ElMessageBox.confirm(`褰撳墠宸ョ▼锛堝伐绋嬪彿锛�${projectNumber}锛夊凡鎵撳紑锛屾槸鍚﹂噸鏂版墦寮�锛焋, '纭鎿嶄綔', {
+ confirmButtonText: '纭畾',
+ cancelButtonText: '鍙栨秷',
+ type: 'warning'
+ })
+ .then(() => {
+ emit('close-detail-page');
+ ElMessage.success('宸叉墦寮�锛�');
+ })
+ .catch(() => {
+ ElMessage.info('宸插彇娑堟搷浣�');
+ });
+};
+
+const gridEvents = {
+ menuClick({menu, row}) {
+ const $grid = xGrid.value;
+ if ($grid) {
+ const config = operationConfigs.find(c => c.code === menu.code);
+ if (config) {
+ if (config.requiresRow && !row) {
+ ElMessage.warning('鏈�変腑宸ョ▼锛岃閫変腑宸ョ▼鍚庡啀杩涜褰撳墠鎿嶄綔锛�');
+ return;
+ }
+ if (config.code === 'compute') {
+ config.actionFunction({row});
+ return;
+ }
+ if (config.code === 'updateProject') {
+ if (!row) {
+ ElMessage.warning(config.checkMessage);
+ return;
+ }
+ nextTick(() => {
+ processCardRef.value.getUpdateFlowCardList(row.projectNumber, row.glass_type, row.glass_thickness);
+ });
+ return;
+ }
+ if (config.code === 'openProject') {
+ handleSameDataOperation(row).then(({isRoutesEqual}) => {
+ if (!isRoutesEqual) {
+ config.openFile({row});
+ ElMessage.success(config.successMsg);
+ }
+ });
+ return;
+ }
+ // 娣诲姞纭鎻愮ず寮圭獥锛岃闂敤鎴锋槸鍚﹁繘琛屽綋鍓嶆搷浣�
+ ElMessageBox.confirm('鏄惁杩涜褰撳墠鎿嶄綔锛�', '纭鎿嶄綔', {
+ confirmButtonText: '纭畾',
+ cancelButtonText: '鍙栨秷',
+ type: 'warning'
+ }).then(() => {
+ if (config.code === 'delProject') {
+ if (!row) {
+ ElMessage.warning(config.checkMessage);
+ return;
+ }
+ const isInitialStateMatched = config.initialState.includes(String(row.state));
+ if (!isInitialStateMatched) {
+ ElMessage.warning(config.checkMessage);
+ return;
+ }
+ deleteProject(row.projectNumber, config);
+ }
+ }).catch(() => {
+ // 鐢ㄦ埛鐐瑰嚮鍙栨秷鍚庢墽琛岀殑閫昏緫
+ ElMessage.info('宸插彇娑堟搷浣�');
+ });
+ } else {
+ console.error(`鏈壘鍒版搷浣滈�夐」 ${menu.code} 瀵瑰簲鐨勯厤缃紝璇锋鏌ラ厤缃」`);
+ }
+ }
+ }
+};
+
+
+function deleteProject(projectNumber, config) {
+ request.post(`/glassOptimize/deleteProject/${projectNumber}`, {
+ headers: {
+ 'Content-Type': 'application/json'
+ }
+ }).then((res) => {
+ if (res.code==200 && res.data===true) {
+ ElMessage.success(config.successMsg);
+ // 浠庡垪琛ㄤ腑绉婚櫎宸插垹闄ょ殑宸ョ▼鏁版嵁
+ const index = produceList.value.findIndex(item => item.projectNumber === projectNumber);
+ if (index !== -1) {
+ produceList.value.splice(index, 1);
+ xGrid.value.reloadData(produceList.value);
+ }
+ //鍒锋柊宸ョ▼鍙�
+ processCardRef.value.getProjectId();
+ processCardRef.value.selectGlassType();
+ processCardRef.value.selectFlowCardList();
+ } else {
+ console.log('res.code 鐨勫��:', res.code, ', 绫诲瀷:', typeof res.code);
+ console.log('res.msg 鐨勫��:', res.msg, ', 绫诲瀷:', typeof res.msg);
+ const errorMsg = res.data ? res.data.errorMessage : config.failureMsg;
+ ElMessage.error(`鎿嶄綔澶辫触锛屽師鍥�: ${errorMsg}`);
+ }
+ }).catch((error) => {
+ console.error('璇锋眰鍑洪敊锛屽伐绋嬪垹闄ゆ湭瀹屾垚锛岃缁嗛敊璇俊鎭�:', error);
+ ElMessage.error(`璇锋眰鍑洪敊锛屽伐绋嬪垹闄ゆ湭瀹屾垚锛屽師鍥�: ${errorMsg}`);
+ });
+}
+
+</script>
+
+<template>
+ <div style="width: 100%; height: 100%;">
+
+ <div id="processCard">
+ <process-card ref="processCardRef" :process-id="projectRow.processId===null?null:projectRow.processId"
+ :technology-number="projectRow.technologyNumber===null?null:projectRow.technologyNumber"
+ @updateProcessId="handleProcessIdUpdate"
+ @updateTechnologyNumber="handleTechnologyNumberUpdate"
+ @updateState="updateState"
+ />
+ </div>
+
+ <div id="processCard-detail" >
+ <process-card-detail :process-id="projectRow.processId===null?null:projectRow.processId"
+ :technology-number="projectRow.technologyNumber===null?null:projectRow.technologyNumber"/>
+ </div>
+
+ <div id="project-list">
+ <div style="width: 100%;height: 100%">
+ <h2>宸ョ▼鍒楄〃</h2>
+ <vxe-grid
+ size="small"
+ height="100%"
+ class="mytable-scrollbar"
+ ref="xGrid"
+ v-bind="gridOptions"
+ v-on="gridEvents"
+ >
+
+ <template #num2_filter="{ column, $panel }">
+ <div>
+ <div v-for="(option, index) in column.filters" :key="index">
+ <vxe-select v-model="option.data" :placeholder="$t('processCard.pleaseSelect')" @change="changeFilterEvent($event, option, $panel)">
+ <vxe-option value="0" :label="$t('basicData.unchecked')"></vxe-option>
+ <vxe-option value="1" :label="$t('basicData.selected')"></vxe-option>
+ </vxe-select>
+ </div>
+ </div>
+ </template>
+
+ <template #num1_filter="{ column, $panel }">
+ <div>
+ <div v-for="(option, index) in column.filters" :key="index">
+ <input type="type" v-model="option.data" @keyup.enter.native="$panel.confirmFilter()" @input="changeFilterEvent($event, option, $panel)"/>
+ </div>
+ </div>
+ </template>
+ </vxe-grid>
+ </div>
+ </div>
+
+
+
+ </div>
+</template>
+
+
+<style scoped>
+#processCard{
+ width: 64%;
+ height: 55%;
+ float: left;
+}
+#processCard-detail{
+ margin-left: 1%;
+ float: left;
+ width: 35%;
+ height: 55%;
+}
+#project-list{
+ float: left;
+ margin-top: 2%;
+ width: 100%;
+ height: 30%;
+}
+</style>
\ No newline at end of file
--
Gitblit v1.8.0