Merge branch 'master' of http://10.153.19.25:10101/r/ERP_override
| | |
| | | flowCardCount=produceList.value.length |
| | | |
| | | handleSummary() |
| | | handleGetQRCode() |
| | | if (name=='天津北玻玻璃工业技术有限公司(TJBB-QR7.1-01)'){ |
| | | handleGetQRCodeTj()//天津扫码枪报工需要合并层号二维码 |
| | | }else{ |
| | | handleGetQRCode()//拆分层号二维码 |
| | | } |
| | | } else { |
| | | ElMessage.warning(res.msg) |
| | | router.push("/login") |
| | |
| | | |
| | | } |
| | | ) |
| | | |
| | | const handleGetQRCode = async () => { |
| | | for (let i = 0; i < produceList.value.length; i++) { |
| | | const detail = produceList.value[i].detail[0]; |
| | | const processId = detail.process_id; |
| | | const mergeStr = detail.mergeTechnologyNumber?.toString() || ''; |
| | | const detailItem = produceList.value[i].detail[0]; |
| | | const detailList = produceList.value[i].detailList; |
| | | |
| | | detail.qrcodeList = []; // 初始化 |
| | | const mergeTechNumber = detailItem.mergeTechnologyNumber.toString(); |
| | | const processId = detailItem.process_id; |
| | | const url = `${processId}/${mergeTechNumber}`; |
| | | |
| | | for (let j = 0; j < mergeStr.length; j++) { |
| | | const singleTech = mergeStr[j]; // 取出每一位字符 |
| | | const url = `${processId}/${singleTech}`; |
| | | const qrcodeData = await QRCode.toDataURL(url); |
| | | detail.qrcodeList.push({ |
| | | detailItem.qrcodeList = []; |
| | | |
| | | //储存层号 |
| | | const seenTechNumbers = new Set(); |
| | | |
| | | for (let j = 0; j < detailList.length; j++) { |
| | | const techNum = detailList[j].technology_number; |
| | | //有则跳过 |
| | | if (seenTechNumbers.has(techNum)) continue; |
| | | detailItem.qrcodeList.push({ |
| | | qrcode: qrcodeData, |
| | | technologyNumber: singleTech |
| | | technologyNumber: techNum |
| | | }); |
| | | |
| | | seenTechNumbers.add(techNum); |
| | | } |
| | | } |
| | | }; |
| | | |
| | | |
| | | // const handleGetQRCode = async () => { |
| | | // let technologyNumber='' |
| | | // for (let i = 0; i < produceList.value.length; i++) { |
| | | // |
| | | // const technologyNumber = produceList.value[i].detail[0].technologyNumber.toString(); // 转换为字符串以便处理每个字符 |
| | | // produceList.value[i].detail[0]["qrcodeList"] = []; // 初始化一个空数组用来存储 QR Code |
| | | // const merge = produceList.value[i].detail[0].mergeTechnologyNumber.toString(); |
| | | // const processId = produceList.value[i].detail[0].process_id; |
| | | // const url = `${processId}/${technologyNumber}`; |
| | | // // 生成 QR Code 并存储到数组中 |
| | | // const qrcodeData = await QRCode.toDataURL(url); |
| | | // produceList.value[i].detail[0]["qrcodeList"].push({ |
| | | // qrcode: qrcodeData, |
| | | // technologyNumber: technologyNumber |
| | | // }); |
| | | // } |
| | | // }; |
| | | |
| | | const handleGetQRCodeTj = async () => { |
| | | let technologyNumber='' |
| | | for (let i = 0; i < produceList.value.length; i++) { |
| | | const technologyNumber = produceList.value[i].detail[0].mergeTechnologyNumber.toString(); // 转换为字符串以便处理每个字符 |
| | | produceList.value[i].detail[0]["qrcodeList"] = []; // 初始化一个空数组用来存储 QR Code |
| | | |
| | | const processId = produceList.value[i].detail[0].process_id; |
| | | const url = `${processId}/${technologyNumber}`; |
| | | // 生成 QR Code 并存储到数组中 |
| | | const qrcodeData = await QRCode.toDataURL(url); |
| | | produceList.value[i].detail[0]["qrcodeList"].push({ |
| | | qrcode: qrcodeData, |
| | | technologyNumber: technologyNumber |
| | | }); |
| | | } |
| | | }; |
| | | |
| | | |
| | | //根据输入的数量重新汇总 |
| | |
| | | }, |
| | | |
| | | |
| | | columns:[ |
| | | |
| | | ], |
| | | mergeCells:[], |
| | | toolbarConfig: { |
| | | slots:{ |
| | | buttons: "title" |
| | | }, |
| | | zoom: true, |
| | | /*custom: true*/ |
| | | // custom: true |
| | | }, |
| | | cellClassName ({ row, column,columnIndex}) { |
| | | if (columnIndex>10 && row.thisQuantity*1 === row.reportWorkQuantity[column.title]*1){ |
| | |
| | | const list = ref([]) |
| | | |
| | | let props = defineProps({ |
| | | orderId:null |
| | | orderId:null, |
| | | row: {} |
| | | }) |
| | | const columns = [ |
| | | {field: 'order_number',fixed:"left", width: 90,title: t('order.OrderNum'),showOverflow:"ellipsis"}, |
| | |
| | | {field: 'glass_child',width: 130, title: t('reportingWorks.glassChild') ,filters:[{ data: '' }],slots: { filter: 'num1_filter' }}, |
| | | {field: 'order_type', width: 120,title: t('order.orderType'),filters:[{ data: '' }],slots: { filter: 'num1_filter' }}, |
| | | {field: 'process_id',width: 110, title: t('processCard.processId'),filters:[{ data: '' }],slots: { filter: 'num1_filter' }}, |
| | | {field: 'technology_number', width: 90,title: t('processCard.technologyNumber'),showOverflow:"ellipsis"}, |
| | | {field: 'child_width', width: 90,title: t('order.width'),showOverflow:"ellipsis"}, |
| | | {field: 'child_height', width: 90,title: t('order.height'),showOverflow:"ellipsis"}, |
| | | {field: 'technology_number', width: 90,title: t('processCard.technologyNumber'),showOverflow:"ellipsis",filters:[{ data: '' }],slots: { filter: 'num1_filter' }}, |
| | | {field: 'child_width', width: 90,title: t('order.width'),showOverflow:"ellipsis",filters:[{ data: '' }],slots: { filter: 'num1_filter' }}, |
| | | {field: 'child_height', width: 90,title: t('order.height'),showOverflow:"ellipsis",filters:[{ data: '' }],slots: { filter: 'num1_filter' }}, |
| | | {field: 'quantity', width: 90,title: t('order.quantity')}, |
| | | {field: 'glassQuantity', width: 90,title: t('order.glassQuantity')}, |
| | | {field: 'gross_area', width: 90,title: t('order.area')}, |
| | |
| | | {field: 'inventoryArea',width: 120, title: t('report.inventoryArea')}, |
| | | {field: 'broken_num',width: 90, title: t('reportingWorks.quantityBroken')}, |
| | | ] |
| | | let column = [0,1,3,6,7,8,10,11,12,13] |
| | | let column = [0,1,3,8,10,11,12,13] |
| | | |
| | | |
| | | onMounted(()=>{ |
| | |
| | | await xGrid.value.setMergeCells(res.data.mergeCells) |
| | | mergeCells.value = res.data.mergeCells |
| | | gridOptions.loading = false |
| | | xGrid.value.commitProxy('reset_custom') |
| | | |
| | | } else { |
| | | ElMessage.warning(res.msg) |
| | |
| | | +')' ) |
| | | //return |
| | | } |
| | | let showTitle = ref(false) |
| | | const changeZoom = ()=> { |
| | | showTitle.value = !showTitle.value |
| | | } |
| | | </script> |
| | | |
| | | <template> |
| | | <div style="width: 100%;height: 100%"> |
| | | <vxe-grid |
| | | @filter-change ='filterChange' |
| | | @zoom="changeZoom" |
| | | height="100%" |
| | | size="mini" |
| | | class="mytable-scrollbar" |
| | |
| | | <span>{{ quantitySum(row,column) }} </span> |
| | | </template> |
| | | |
| | | <template #title> |
| | | <span style="font-weight: bold" v-show="showTitle"> |
| | | {{ row.orderId }} |
| | | {{ row.project?'--':'' }} |
| | | {{row.project}} |
| | | {{ row.batch?'--':'' }} |
| | | {{row.batch}} |
| | | </span> |
| | | </template> |
| | | </vxe-grid> |
| | | </div> |
| | | </template> |
| | |
| | | pleaseNumber8:'الرجاء إدخال الرقم التسلسلي', |
| | | pleaseNumber9:'تصحيح الكمية النهائية أو المعلقة', |
| | | pleaseNumber10:'完工数不能大于流程卡数量', |
| | | pleaseNumber11:'完工+次破数量不能大于可完工数量', |
| | | pleaseNumber12:'本工序报工数:', |
| | | pleaseNumber13:'下工序报工数:', |
| | | pleaseNumber14:'本工序修改数不能小于下工序报工数', |
| | | }, |
| | | productStock:{ |
| | | page:{ |
| | |
| | | pleaseNumber8:'Please enter serial number', |
| | | pleaseNumber9:'Correct number of completions or breakdowns', |
| | | pleaseNumber10:'The number of completions cannot be greater than the number of process cards', |
| | | pleaseNumber11:'完工+次破数量不能大于可完工数量', |
| | | pleaseNumber12:'本工序报工数:', |
| | | pleaseNumber13:'下工序报工数:', |
| | | pleaseNumber14:'本工序修改数不能小于下工序报工数', |
| | | |
| | | }, |
| | | productStock:{ |
| | |
| | | pleaseNumber8:'일련번호를 입력해 주세요', |
| | | pleaseNumber9:'정확한 양품 혹은 불량 수량', |
| | | pleaseNumber10:'양품 수량은 프로세스 카드 총량을 초과할 수 없습니다.', |
| | | pleaseNumber11:'完工+次破数量不能大于可完工数量', |
| | | pleaseNumber12:'本工序报工数:', |
| | | pleaseNumber13:'下工序报工数:', |
| | | pleaseNumber14:'本工序修改数不能小于下工序报工数', |
| | | }, |
| | | productStock:{ |
| | | page:{ |
| | |
| | | pleaseNumber8:'Введите серийный номер.', |
| | | pleaseNumber9:'Правильное завершение и количество поврежденных', |
| | | pleaseNumber10:'完工数不能大于流程卡数量', |
| | | pleaseNumber11:'完工+次破数量不能大于可完工数量', |
| | | pleaseNumber12:'本工序报工数:', |
| | | pleaseNumber13:'下工序报工数:', |
| | | pleaseNumber14:'本工序修改数不能小于下工序报工数', |
| | | }, |
| | | productStock:{ |
| | | page:{ |
| | |
| | | passAudit:'审核通过', |
| | | patchCondition:'补片状态', |
| | | changeFailed:'修改失败,请检查是否为报工转移订单', |
| | | hiddenVal:'隐藏', |
| | | |
| | | |
| | | selectResponsibleTeam:'请选择责任班组', |
| | |
| | | pleaseNumber8:'请输入序号', |
| | | pleaseNumber9:'正确的完工或次破数量', |
| | | pleaseNumber10:'完工数不能大于流程卡数量', |
| | | pleaseNumber11:'可修改数量不足', |
| | | pleaseNumber11:'完工+次破数量不能大于可完工数量', |
| | | pleaseNumber12:'本工序报工数:', |
| | | pleaseNumber13:'下工序报工数:', |
| | | pleaseNumber14:'本工序修改数不能小于下工序报工数', |
| | | }, |
| | | productStock:{ |
| | | page:{ |
| | |
| | | userName:null, |
| | | userId:null, |
| | | address:null, |
| | | permissions:[] |
| | | permissions:[], |
| | | token:null |
| | | }), |
| | | responseCode:null, |
| | | msg:null |
| | |
| | | request.interceptors.request.use(config => { |
| | | config.headers['Content-Type'] = 'application/json;charset=utf-8'; |
| | | if(userStore.user){ |
| | | config.headers['satoken'] = userStore.user.token; |
| | | config.headers['satoken'] = localStorage.getItem('saToken'); |
| | | } |
| | | // 设置请求头 |
| | | return config |
| | |
| | | request.interceptors.request.use(config => { |
| | | config.headers['Content-Type'] = 'application/json;charset=utf-8'; |
| | | if(userStore.user){ |
| | | config.headers['satoken'] = userStore.user.token; |
| | | config.headers['satoken'] = localStorage.getItem('saToken'); |
| | | } |
| | | // 设置请求头 |
| | | return config |
| | |
| | | request.interceptors.request.use(config => { |
| | | config.headers['Content-Type'] = 'application/json;charset=utf-8'; |
| | | if(userStore.user){ |
| | | config.headers['satoken'] = userStore.user.token; |
| | | config.headers['satoken'] = localStorage.getItem('saToken'); |
| | | } |
| | | // 设置请求头 |
| | | return config |
| | |
| | | userForm).then((res) => { |
| | | if(res['code']==200 && res['data']){ |
| | | store.$patch({user:res.data}) |
| | | localStorage.setItem('saToken', store.user.token) |
| | | orderInfo.clearSelectDate() |
| | | router.push('/main') |
| | | ElMessage.success(t('login.loginSuccessful')) |
| | |
| | | <template> |
| | | <div> |
| | | <el-button id="button" type="primary" @click="handlePrint">打印</el-button> |
| | | <el-button id="button" type="primary" @click="handlePrint" style="position: fixed; top: 90px; right: 20px; padding: 20px; background: #4CAF50; color: white; border: none; border-radius: 5px; cursor: pointer;"> |
| | | 打印 |
| | | </el-button> |
| | | |
| | | <div ref="printContainer" style="position: relative;"> |
| | | <RectRenderer |
| | |
| | |
|
| | |
|
| | | </div>
|
| | | <button @click="submitLayouts" style="position: fixed; bottom: 20px; right: 20px; padding: 10px; background: #4CAF50; color: white; border: none; border-radius: 5px; cursor: pointer;">
|
| | | <button @click="submitLayouts" style="position: fixed; top: 90px; right: 20px; padding: 10px; background: #4CAF50; color: white; border: none; border-radius: 5px; cursor: pointer;">
|
| | | 保存OPT
|
| | | </button>
|
| | | </template>
|
| | |
| | | </div>
|
| | |
|
| | | <!-- 提交按钮 -->
|
| | | <button @click="submitLayouts" style="position: fixed; bottom: 20px; right: 20px; padding: 10px; background: #4CAF50; color: white; border: none; border-radius: 5px; cursor: pointer;">
|
| | | <button @click="submitLayouts" style="position: fixed; top: 90px; right: 20px; padding: 10px; background: #4CAF50; color: white; border: none; border-radius: 5px; cursor: pointer;">
|
| | | 保存调整
|
| | | </button>
|
| | | </div>
|
| | |
| | | return; |
| | | } |
| | | emit('getSmallPieceData', 1); |
| | | optimizeData.value.glassDetails = []; |
| | | xGrid.value.getTableData().fullData.forEach(items=>{ |
| | | let rackNoValue = 0; |
| | | if (items.rackNo !== undefined && items.rackNo !== null && items.rackNo !== '') { |
| | |
| | | dialogVisible.value[3] = newValue; |
| | | } |
| | | if (props.CheckboxChangeData!=null && props.CheckboxChangeData.length>0){ |
| | | optimizeData.value.materialDetails = []; |
| | | props.CheckboxChangeData.forEach(items=>{ |
| | | const detail={ |
| | | width :null, |
| | |
| | | const grindingTrimming = res.data.grindingTrimming; |
| | | optimizeState.value=res.data.optimizeState; |
| | | |
| | | // 加载磨量配置 |
| | | loadGrindingConfiguration().then((grindConfig) => { |
| | | console.log("加载的磨量配置:", grindConfig); |
| | | |
| | | data = data.map(item => { |
| | | // 保留从后端返回的原始磨量值,如果存在的话 |
| | | const originalLongGrind1 = item.longGrind1; |
| | | const originalLongGrind2 = item.longGrind2; |
| | | const originalShortGrind1 = item.shortGrind1; |
| | | const originalShortGrind2 = item.shortGrind2; |
| | | |
| | | // 如果没有原始磨量值,则初始化为0 |
| | | item.longGrind1 = originalLongGrind1 !== undefined && originalLongGrind1 !== null ? |
| | | parseFloat(originalLongGrind1) : 0; |
| | | item.longGrind2 = originalLongGrind2 !== undefined && originalLongGrind2 !== null ? |
| | | parseFloat(originalLongGrind2) : 0; |
| | | item.shortGrind1 = originalShortGrind1 !== undefined && originalShortGrind1 !== null ? |
| | | parseFloat(originalShortGrind1) : 0; |
| | | item.shortGrind2 = originalShortGrind2 !== undefined && originalShortGrind2 !== null ? |
| | | parseFloat(originalShortGrind2) : 0; |
| | | |
| | | // 处理 grindingTrimming 数据(如果存在) |
| | | let processedGrindConfig = null; |
| | | if(grindingTrimming!==null && grindingTrimming.length > 0){ |
| | | // 处理 grindingTrimming 数据,去除双引号 |
| | | const formattedData = grindingTrimming.map(item => { |
| | | const formattedItem = {}; |
| | | for (const key in item) { |
| | |
| | | } |
| | | return formattedItem; |
| | | }); |
| | | processedGrindConfig = formattedData[0]; |
| | | } |
| | | |
| | | // 如果有自动填充配置,使用它来设置磨量 |
| | | if(formattedData[0].autoFillEdge==="true"){ |
| | | const minAutoLenght = parseFloat(formattedData[0].minAutoLenght) || 0; |
| | | const leftEdge = parseFloat(formattedData[0].leftEdge) || 0; |
| | | const rightEdge = parseFloat(formattedData[0].rightEdge) || 0; |
| | | const upEdge = parseFloat(formattedData[0].upEdge) || 0; |
| | | const downEdge = parseFloat(formattedData[0].downEdge) || 0; |
| | | data = data.map(item => { |
| | | // 直接将 grindingTrimming 中的磨量信息写到表中 |
| | | if (processedGrindConfig) { |
| | | // 使用 grindingTrimming 中的配置设置磨量 |
| | | const leftEdge = parseFloat(processedGrindConfig.leftEdge) || 0; |
| | | const rightEdge = parseFloat(processedGrindConfig.rightEdge) || 0; |
| | | const upEdge = parseFloat(processedGrindConfig.upEdge) || 0; |
| | | const downEdge = parseFloat(processedGrindConfig.downEdge) || 0; |
| | | |
| | | if(item.width >= minAutoLenght){ |
| | | item.longGrind1 = leftEdge; |
| | | item.longGrind2 = rightEdge; |
| | | } |
| | | if(item.height >= minAutoLenght){ |
| | | item.shortGrind1 = upEdge; |
| | | item.shortGrind2 = downEdge; |
| | | } |
| | | } |
| | | } else if(grindConfig) { |
| | | // 使用从 getConfiguration 接口加载的配置 |
| | | if(grindConfig.autoFillEdge==="true"){ |
| | | const minAutoLenght = parseFloat(grindConfig.minAutoLenght) || 0; |
| | | const leftEdge = parseFloat(grindConfig.leftEdge) || 0; |
| | | const rightEdge = parseFloat(grindConfig.rightEdge) || 0; |
| | | const upEdge = parseFloat(grindConfig.upEdge) || 0; |
| | | const downEdge = parseFloat(grindConfig.downEdge) || 0; |
| | | item.longGrind1 = leftEdge; // 长磨1 |
| | | item.longGrind2 = rightEdge; // 长磨2 |
| | | item.shortGrind1 = upEdge; // 短磨1 |
| | | item.shortGrind2 = downEdge; // 短磨2 |
| | | |
| | | if(item.width >= minAutoLenght){ |
| | | item.longGrind1 = leftEdge; |
| | | item.longGrind2 = rightEdge; |
| | | // 如果启用了自动填充功能,根据尺寸判断是否应用磨量 |
| | | if(processedGrindConfig.autoFillEdge === "true"){ |
| | | const minAutoLength = parseFloat(processedGrindConfig.minAutoLenght) || 0; |
| | | |
| | | // 如果宽度小于最小自动长度,不应用左右磨量 |
| | | if(item.width < minAutoLength){ |
| | | item.longGrind1 = 0; |
| | | item.longGrind2 = 0; |
| | | } |
| | | if(item.height >= minAutoLenght){ |
| | | item.shortGrind1 = upEdge; |
| | | item.shortGrind2 = downEdge; |
| | | |
| | | // 如果高度小于最小自动长度,不应用上下磨量 |
| | | if(item.height < minAutoLength){ |
| | | item.shortGrind1 = 0; |
| | | item.shortGrind2 = 0; |
| | | } |
| | | } |
| | | }else { |
| | | // 即使没有启用自动填充,也应该应用默认的磨量值 |
| | | item.longGrind1 = parseFloat(grindConfig.leftEdge) || 0; |
| | | item.longGrind2 = parseFloat(grindConfig.rightEdge) || 0; |
| | | item.shortGrind1 = parseFloat(grindConfig.upEdge) || 0; |
| | | item.shortGrind2 = parseFloat(grindConfig.downEdge) || 0; |
| | | } |
| | | // 如果没有 grindingTrimming 数据,初始化为0 |
| | | item.longGrind1 = item.longGrind1 !== undefined && item.longGrind1 !== null ? |
| | | parseFloat(item.longGrind1) : 0; |
| | | item.longGrind2 = item.longGrind2 !== undefined && item.longGrind2 !== null ? |
| | | parseFloat(item.longGrind2) : 0; |
| | | item.shortGrind1 = item.shortGrind1 !== undefined && item.shortGrind1 !== null ? |
| | | parseFloat(item.shortGrind1) : 0; |
| | | item.shortGrind2 = item.shortGrind2 !== undefined && item.shortGrind2 !== null ? |
| | | parseFloat(item.shortGrind2) : 0; |
| | | } |
| | | |
| | | item.height=parseFloat(item.height.toFixed(2)) |
| | |
| | | return item; |
| | | }); |
| | | |
| | | console.log("处理后的数据:", data); |
| | | |
| | | xGrid.value.loadData(data); |
| | | gridOptions.data = data; |
| | | projectName.value = data[0].project_name; |
| | | quantitys.value=res.data.project.glass_total |
| | | areas.value=res.data.project.glass_total_area |
| | | }); |
| | | |
| | | // 更新 optimizeData 中的磨量配置 |
| | | updateOptimizeDataWithGrindingConfig(processedGrindConfig); |
| | | } else { |
| | | ElMessage.warning(res.msg); |
| | | } |
| | |
| | | }); |
| | | }; |
| | | |
| | | const updateOptimizeDataWithGrindingConfig = (grindConfig) => { |
| | | if (grindConfig) { |
| | | // 更新 optimizeData 中的磨量配置 |
| | | optimizeData.value.grindingConfig = { |
| | | leftEdge: parseFloat(grindConfig.leftEdge) || 0, |
| | | upEdge: parseFloat(grindConfig.upEdge) || 0, |
| | | rightEdge: parseFloat(grindConfig.rightEdge) || 0, |
| | | downEdge: parseFloat(grindConfig.downEdge) || 0, |
| | | autoFillEdge: grindConfig.autoFillEdge === "true", |
| | | minAutoLength: parseFloat(grindConfig.minAutoLenght) || 0 |
| | | }; |
| | | } |
| | | }; |
| | | |
| | | const firstLoading = async() => { |
| | | request.post(`/glassOptimize/selectOptimizeParms/${username}`).then((res) => { |
| | |
| | | });*/ |
| | | }; |
| | | |
| | | const grindingConfig = ref(null); |
| | | |
| | | const loadGrindingConfiguration = async () => { |
| | | return new Promise((resolve) => { |
| | |
| | | } |
| | | return formattedItem; |
| | | }); |
| | | // 保存磨量配置 |
| | | grindingConfig.value = formattedData[0]; |
| | | resolve(formattedData[0]); |
| | | } else { |
| | | // 提供默认配置 |
| | | resolve({ |
| | | const defaultConfig = { |
| | | leftEdge: '0', |
| | | upEdge: '0', |
| | | rightEdge: '0', |
| | |
| | | quickEdge: '1', |
| | | autoFillEdge: 'false', |
| | | minAutoLenght: '0' |
| | | }); |
| | | }; |
| | | grindingConfig.value = defaultConfig; |
| | | resolve(defaultConfig); |
| | | } |
| | | } else { |
| | | ElMessage.warning(res.msg); |
| | | // 提供默认配置 |
| | | resolve({ |
| | | const defaultConfig = { |
| | | leftEdge: '0', |
| | | upEdge: '0', |
| | | rightEdge: '0', |
| | |
| | | quickEdge: '1', |
| | | autoFillEdge: 'false', |
| | | minAutoLenght: '0' |
| | | }); |
| | | }; |
| | | grindingConfig.value = defaultConfig; |
| | | resolve(defaultConfig); |
| | | } |
| | | }).catch(() => { |
| | | // 提供默认配置 |
| | | resolve({ |
| | | const defaultConfig = { |
| | | leftEdge: '0', |
| | | upEdge: '0', |
| | | rightEdge: '0', |
| | |
| | | quickEdge: '1', |
| | | autoFillEdge: 'false', |
| | | minAutoLenght: '0' |
| | | }); |
| | | }; |
| | | grindingConfig.value = defaultConfig; |
| | | resolve(defaultConfig); |
| | | }); |
| | | }); |
| | | }; |
| | |
| | | storage: true |
| | | }, |
| | | sortConfig: { |
| | | multiple: true |
| | | multiple: true, |
| | | chronological: true |
| | | }, |
| | | editConfig: { |
| | | trigger: 'click', |
| | |
| | | ],//表头按钮 |
| | | |
| | | toolbarConfig: { |
| | | slots:{ |
| | | buttons: "toolbar_buttons" |
| | | }, |
| | | buttons: [{ |
| | | |
| | | }], |
| | | // import: false, |
| | | // export: true, |
| | | // print: true, |
| | |
| | | |
| | | }) |
| | | const gridEventsRight = { |
| | | toolbarButtonClick({code}) { |
| | | const $grid = xGridLeft.value |
| | | if ($grid) { |
| | | switch (code) { |
| | | case 'sorting': { |
| | | request.post(`/processCard/selectSortingCard/${orderId}/${productionId}/${flashback.value}/${optionVal.value}`, filterData.value).then((res) => { |
| | | if (res.code == 200) { |
| | | pageTotal.value = res.data.total |
| | | maxProcseeId = res.data.maxFlowCard[0].process_id |
| | | orderOtherMoney.value = res.data.orderOtherMoney |
| | | |
| | | //已有的不添加 |
| | | const dynamicFields = orderOtherMoney.value.map(item => item.column) |
| | | gridOptions.columns = gridOptions.columns.filter(col => !dynamicFields.includes(col.field)) |
| | | |
| | | // 添加新的动态列 |
| | | orderOtherMoney.value.forEach(item => { |
| | | let column = { |
| | | field: `${item.column}`, |
| | | width: 100, |
| | | title: item.alias, |
| | | filters: [{data: ''}], |
| | | slots: {filter: 'num1_filter'}, |
| | | filterMethod: filterChanged, |
| | | sortable: true |
| | | } |
| | | |
| | | gridOptions.columns.push(column) |
| | | |
| | | }) |
| | | produceList = res.data.data |
| | | produceList.forEach(item => { |
| | | |
| | | item.shape = (item.shape == 2) ? t('order.alien') : t('order.universalShape'); |
| | | }) |
| | | xGrid.value.reloadData(produceList) |
| | | gridOptions.loading = false |
| | | } else { |
| | | ElMessage.warning(res.msg) |
| | | } |
| | | }) |
| | | return; |
| | | |
| | | } |
| | | |
| | | } |
| | | } |
| | | }, |
| | | formSubmit () { |
| | | let form = gridOptions.formConfig.data |
| | | form.orderId =orderId |
| | |
| | | @checkbox-all="handleCheckboxChange" |
| | | @checkbox-range-end="handleCheckboxChange" |
| | | > |
| | | |
| | | <!-- 自定义 toolbar_buttons 插槽 --> |
| | | <template #toolbar_buttons="{ $grid }"> |
| | | |
| | | |
| | | <!-- 手动写出所有按钮 --> |
| | | |
| | | <el-select |
| | | :default-first-option="true" |
| | | ref="getSelect" style="width: 80px" |
| | | v-model="optionVal" |
| | | class="m-2" |
| | | > |
| | | <el-option |
| | | v-for="item in options" |
| | | :key="item.value" |
| | | :label="item.label" |
| | | :value="item.value" |
| | | /> |
| | | </el-select> |
| | | |
| | | <el-button |
| | | type="primary" |
| | | style="margin-right:8px;width: 50px" |
| | | @click="$grid.dispatchEvent('toolbar-button-click', { code: 'sorting' })" |
| | | > |
| | | {{ t('processCard.sorting') }} |
| | | </el-button> |
| | | |
| | | <el-checkbox |
| | | :model-value="flashback === 0" |
| | | @change="onFlashbackChange" |
| | | > |
| | | {{ t('processCard.flashback') }} |
| | | </el-checkbox> |
| | | |
| | | |
| | | </template> |
| | | |
| | | |
| | | |
| | | <!-- @toolbar-button-click="toolbarButtonClickEvent"--> |
| | | <!-- 下拉显示所有信息插槽--> |
| | |
| | | import {computed, nextTick, onMounted, onUnmounted, reactive, ref, toRefs} from "vue"; |
| | | import {useRouter,useRoute} from 'vue-router' |
| | | import request from "@/utils/request"; |
| | | import {ElMessage} from "element-plus"; |
| | | import {ElCheckbox, ElMessage} from "element-plus"; |
| | | import {changeFilterEvent, filterChanged} from "@/hook" |
| | | import domZIndex from 'dom-zindex' |
| | | import {indexOf} from "xe-utils"; |
| | |
| | | const router = useRouter() |
| | | const route = useRoute() |
| | | const user=userInfo() |
| | | //是否复合工序 |
| | | const laminating = ref(null) |
| | | |
| | | //定义表头数据 |
| | | const titleUploadData = ref({ |
| | | //是否合片工序 |
| | |
| | | let layer='' |
| | | let technologicalProcess='' |
| | | let processName = ref([]) |
| | | |
| | | //隐藏全部完工序号 |
| | | let hiddenVal = ref(1) |
| | | |
| | | //定义接收加载表头下拉数据 |
| | | const titleSelectJson = ref({ |
| | |
| | | return new Error(t('reportingWorks.enterIntegerGreaterThanEqualTo')) |
| | | //完工+次破数量不能大于可完工数量 |
| | | }else if((row.completedQuantity*1+brokenNum*1)>row.quantity*1){ |
| | | return new Error((`完工+次破数量不能大于可完工数量`)) |
| | | return new Error(t('reportingWorks.pleaseNumber11')) |
| | | //本次完工数量不能大于完工数量 |
| | | }else if(row.quantity_card<row.completedQuantity){ |
| | | return new Error(t('reportingWorks.pleaseNumber10')) |
| | |
| | | |
| | | //当可操作数量为0,并且完工数量不等于可完工数量时 |
| | | if(row.minQuantity===0 && val!==totalQuantity ){ |
| | | return new Error(`本工序报工数:${okVal}+${val}=${okVal+val}\n |
| | | 下工序报工数:${nextQuantitySum}\n |
| | | 本工序修改数不能小于下工序报工数 |
| | | return new Error(`${t('reportingWorks.pleaseNumber12')} ${okVal}+${val}=${okVal+val}\n |
| | | ${t('reportingWorks.pleaseNumber13')} ${nextQuantitySum}\n |
| | | ${t('reportingWorks.pleaseNumber14')} |
| | | `) |
| | | } |
| | | if(titleUploadData.value.reportingWorkId!=null && (val>totalQuantity || val<(row.quantity-row.minQuantity) )){ |
| | |
| | | {code: 'saveReportingWorkReview', name: t('reportingWorks.saveAndReview'), status: 'primary', icon: 'vxe-icon-save',disabled:true}, |
| | | {code: 'saveWorkStorage', name: t('reportingWorks.saveWorkStorage'), status: 'primary', icon: 'vxe-icon-save'}, |
| | | ], |
| | | // slots: { |
| | | // tools: 'toolbar_buttons' |
| | | // }, |
| | | zoom: true, |
| | | custom: true |
| | | }, |
| | |
| | | |
| | | |
| | | //绑定下方表格 |
| | | detail.value = res.data.Detail |
| | | |
| | | // 使用map方法来处理每个对象 |
| | | let modifiedCollection = detail.value.map(item => { |
| | | let modifiedCollection = res.data.Detail.map(item => { |
| | | if (item.reviewed_state === 1) { |
| | | return { ...item, reviewed_state: "已审核" }; |
| | | } |
| | |
| | | return item; |
| | | } |
| | | }); |
| | | xGrid.value.reloadData(modifiedCollection) |
| | | detail.value = modifiedCollection |
| | | xGrid.value.reloadData(detail.value) |
| | | hideButton() |
| | | // nextTick(() => { |
| | | // hiddenCompletedOk() |
| | | // }) |
| | | } else { |
| | | ElMessage.warning(res.msg) |
| | | } |
| | |
| | | const seen = new Set(); |
| | | const result = rawData.filter(item => { |
| | | // 1. 先把 completedQuantity 为 0 的剔除 |
| | | if (item.completedQuantity === 0) { |
| | | if (item.completedQuantity === 0 || item.completedQuantity =="0" || item.completedQuantity =="") { |
| | | return false; |
| | | } |
| | | // 2. 遇到相同 order_number,只保留第一次,后面都丢弃 |
| | |
| | | } |
| | | |
| | | |
| | | } |
| | | |
| | | const onHiddenChange = (checked) => { |
| | | hiddenVal.value = checked ? 1 : 0 |
| | | hiddenCompletedOk() |
| | | } |
| | | |
| | | const hiddenCompletedOk = () => { |
| | | const $grid = xGrid.value |
| | | const data = $grid.getTableData().fullData |
| | | const laminating = titleUploadData.value.laminating |
| | | const filteredData = data.filter(row => { |
| | | return row.completedQuantity>0 //过滤可完工数量为0的 |
| | | }) |
| | | if (laminating == ''){ |
| | | if (hiddenVal.value == 1){ |
| | | // 重新加载过滤后的数据 |
| | | $grid.loadData(filteredData) |
| | | }else { |
| | | //原始数据 |
| | | $grid.loadData(detail.value); |
| | | } |
| | | } |
| | | } |
| | | </script> |
| | | |
| | |
| | | </div> |
| | | </div> |
| | | </template> |
| | | |
| | | <template #toolbar_buttons> |
| | | <el-checkbox |
| | | :model-value="hiddenVal === 1" |
| | | @change="onHiddenChange" |
| | | > |
| | | {{ t('reportingWorks.hiddenVal') }} |
| | | </el-checkbox> |
| | | |
| | | </template> |
| | | |
| | | </vxe-grid> |
| | | </div> |
| | |
| | | <el-option :label="$t('orderBasicData.laminatingProcessB')" value="stepB" /> |
| | | <el-option :label="$t('orderBasicData.laminatingProcessC')" value="stepC" /> |
| | | <el-option :label="$t('orderBasicData.laminatingProcessD')" value="stepD" /> |
| | | |
| | | <!-- <el-option :label="$t('orderBasicData.laminatingProcessC')" value="stepA" />夹胶工序--> |
| | | <!-- <el-option :label="$t('orderBasicData.laminatingProcessA')" value="stepB" />--> |
| | | <!-- <el-option :label="$t('orderBasicData.laminatingProcessD')" value="stepC" />--> |
| | | <!-- <el-option :label="$t('orderBasicData.laminatingProcessB')" value="stepD" />--> |
| | | </el-select> |
| | | </el-col> |
| | | </el-row> |
| | |
| | | <order-process |
| | | v-if="tabsValue==='3'" |
| | | :orderId="rowClickIndex===null?null:rowClickIndex.orderId" |
| | | :row="rowClickIndex===null?{}:rowClickIndex" |
| | | /> |
| | | </el-tab-pane> |
| | | </el-tabs> |
| | |
| | | public Map<String, Object> projectInfoSv(String projectNo,String username) { |
| | | Map<String, Object> stringObjectMap = glassOptimizeMapper.selectProjectCount(projectNo); |
| | | Map<String, Object> map = new HashMap<>(); |
| | | if(Integer.parseInt(stringObjectMap.get("optimize_state").toString())==1){ |
| | | map.put("optimizeState", Integer.parseInt(stringObjectMap.get("optimize_state").toString())); |
| | | map.put("data", glassOptimizeMapper.getOptimizeDetail(projectNo)); |
| | | map.put("project", glassOptimizeMapper.selectProjectCount(projectNo)); |
| | | map.put("grindingTrimming", null); |
| | | } else if (Integer.parseInt(stringObjectMap.get("tempering_state").toString())==1) { |
| | | map.put("optimizeState", Integer.parseInt(stringObjectMap.get("optimize_state").toString())); |
| | | map.put("data", glassOptimizeMapper.analogComputationOptimization(projectNo)); |
| | | map.put("project", glassOptimizeMapper.selectProjectCount(projectNo)); |
| | | map.put("grindingTrimming", glassOptimizeMapper.getGrindingTrimming(username)); |
| | | } else{ |
| | | // if(Integer.parseInt(stringObjectMap.get("optimize_state").toString())==1){ |
| | | // map.put("optimizeState", Integer.parseInt(stringObjectMap.get("optimize_state").toString())); |
| | | // map.put("data", glassOptimizeMapper.getOptimizeDetail(projectNo)); |
| | | // map.put("project", glassOptimizeMapper.selectProjectCount(projectNo)); |
| | | // map.put("grindingTrimming", null); |
| | | // } else if (Integer.parseInt(stringObjectMap.get("tempering_state").toString())==1) { |
| | | // map.put("optimizeState", Integer.parseInt(stringObjectMap.get("optimize_state").toString())); |
| | | // map.put("data", glassOptimizeMapper.analogComputationOptimization(projectNo)); |
| | | // map.put("project", glassOptimizeMapper.selectProjectCount(projectNo)); |
| | | // map.put("grindingTrimming", glassOptimizeMapper.getGrindingTrimming(username)); |
| | | // } else{ |
| | | // map.put("optimizeState", Integer.parseInt(stringObjectMap.get("optimize_state").toString())); |
| | | // map.put("data", glassOptimizeMapper.firstOptimization(projectNo)); |
| | | // map.put("project", glassOptimizeMapper.selectProjectCount(projectNo)); |
| | | // map.put("grindingTrimming", glassOptimizeMapper.getGrindingTrimming(username)); |
| | | // } |
| | | map.put("optimizeState", Integer.parseInt(stringObjectMap.get("optimize_state").toString())); |
| | | map.put("data", glassOptimizeMapper.firstOptimization(projectNo)); |
| | | map.put("project", glassOptimizeMapper.selectProjectCount(projectNo)); |
| | | map.put("grindingTrimming", glassOptimizeMapper.getGrindingTrimming(username)); |
| | | } |
| | | return map; |
| | | } |
| | | |
| | |
| | | <select id="getOptimizeDetail"> |
| | | SELECT |
| | | h.project_no, |
| | | h.heat_layout_id as rackNo, |
| | | h.rack_no as rackNo, |
| | | h.o_width AS width, |
| | | h.o_height AS height, |
| | | (h.height-h.o_height)/2 as shortGrind1, |
| | |
| | | h.project_no =#{projectNo} |
| | | GROUP BY |
| | | h.project_no, |
| | | h.heat_layout_id, |
| | | h.rack_no, |
| | | h.width, |
| | | h.height, |
| | | h.process_id, |
| | | h.layer, |
| | | c.order_number |
| | | ORDER BY |
| | | h.heat_layout_id; |
| | | h.rack_no; |
| | | </select> |
| | | |
| | | <!--工程信息流程卡--> |
| | |
| | | x_axis, |
| | | y_axis, |
| | | patch_state, |
| | | mark_icon |
| | | mark_icon, |
| | | rack_no |
| | | ) VALUES ( |
| | | #{projectId}, |
| | | #{glass.processId}, |
| | |
| | | #{glass.x}, |
| | | #{glass.y}, |
| | | #{glass.patchState}, |
| | | #{glass.markIcon} |
| | | #{glass.markIcon}, |
| | | #{glass.rackNo} |
| | | ); |
| | | </foreach> |
| | | </insert> |
| | |
| | | and g.technology_number = a.technology_number |
| | | </if> |
| | | where b.reporting_work_id = #{reportingWorkId} |
| | | GROUP BY c.order_number,c.technology_number) as result |
| | | GROUP BY c.order_number,c.technology_number |
| | | order BY c.order_number,c.technology_number) as result |
| | | </select> |
| | | <select id="selectReportingWorkMp" resultMap="reportingWorkMap"> |
| | | select rw.reporting_work_id, |