| | |
| | | import {ElDatePicker, ElMessage} from "element-plus" |
| | | import useProductGlassTypeStore from "@/stores/sd/product/productGlassType" |
| | | import {nextTick, onMounted, onUnmounted, reactive, ref, watch} from "vue" |
| | | import {Search} from "@element-plus/icons-vue" |
| | | import {ArrowLeftBold, Search} from "@element-plus/icons-vue" |
| | | import GlassType from "@/components/sd/product/GlassType.vue" |
| | | import {useRouter} from 'vue-router' |
| | | import Sortable from 'sortablejs' |
| | | import BasicTable from '@/components/basic/BasicTable.vue' |
| | | import BasicTable from '@/components/sd/product/BasicTable.vue' |
| | | import {VXETable} from "vxe-table"; |
| | | import useUserInfoStore from "@/stores/userInfo"; |
| | | |
| | | import {useI18n} from 'vue-i18n' |
| | | import footSum from "@/hook/footSum" |
| | | import {changeFilterEvent,filterChanged} from "@/hook" |
| | | import userInfo from "@/stores/userInfo" |
| | | //语言获取 |
| | | const {t} = useI18n() |
| | | let productGlassTypeStore = useProductGlassTypeStore() |
| | | let router = useRouter() |
| | | const userStore = useUserInfoStore() |
| | | const username = userStore.user.userName |
| | | const getTableRow = (row, type) => { |
| | | switch (type) { |
| | | case 'edit' : { |
| | | router.push({path: '/main/processCard/PrintFlowCard', query: {id: row.id}}) |
| | | break |
| | | } |
| | | case 'setType': { |
| | | alert('我接收到子组件传送的删除信息') |
| | | break |
| | | } |
| | | case 'delete': { |
| | | request.post(`/processCard/deleteFlowCard/${row.orderId}/${row.processId}`).then((res) => { |
| | | if (res.code == 200) { |
| | | ElMessage.success("删除成功") |
| | | location.reload(); |
| | | } else { |
| | | ElMessage.warning(res.msg) |
| | | router.push("/login") |
| | | } |
| | | }) |
| | | break |
| | | } |
| | | } |
| | | } |
| | | |
| | | const user=userInfo() |
| | | let flag = $ref(true) |
| | | function intoCreateProduct(){ |
| | | if(flag){ |
| | | |
| | | function intoCreateProduct() { |
| | | if (flag) { |
| | | router.push(`/main/processCard/SplittingDetails?orderId=${orderId}`) |
| | | }else { |
| | | } else { |
| | | router.push('/main/processCard/SplittingDetails?orderId=${orderId}') |
| | | } |
| | | flag=!flag |
| | | flag = !flag |
| | | } |
| | | |
| | | //定义时间 |
| | |
| | | clientHeight.value = row.$event.target.clientHeight |
| | | } |
| | | //筛选条件,有外键需要先定义明细里面的数据 |
| | | let filterData = ref({ |
| | | product: { |
| | | thickness: '', |
| | | totalThickness: '' |
| | | }, |
| | | orderDetail: { |
| | | orderNumber: '', |
| | | height: '', |
| | | computeGrossArea: '', |
| | | binningQuantity: '', |
| | | shape: '', |
| | | width: '', |
| | | weight: '' |
| | | } |
| | | |
| | | }) |
| | | let filterData = ref({}) |
| | | //定义页面总页数 |
| | | let pageTotal = ref('') |
| | | //定义数据返回结果 |
| | |
| | | |
| | | let orderId = route.query.orderId |
| | | let productionId = route.query.productionId |
| | | |
| | | const orderOtherMoney = ref(null) |
| | | |
| | | let maxProcseeId=null |
| | | //第一次加载数据 |
| | | |
| | | request.post(`/processCard/selectNoCard/${orderId}/${productionId}`, filterData.value).then((res) => { |
| | | |
| | | if (res.code == 200) { |
| | | console.log(res.data) |
| | | pageTotal.value = res.data.total |
| | | maxProcseeId=res.data.maxFlowCard[0].process_id |
| | | orderOtherMoney.value = res.data.orderOtherMoney |
| | | orderOtherMoney.value.forEach(item => { |
| | | let column = { |
| | | field: `${item.column}`, |
| | | width: 100, |
| | | title: item.alias, |
| | | filters: [{data: ''}], |
| | | slots: {filter: 'num1_filter'}, |
| | | filterMethod: filterChanged, |
| | | } |
| | | |
| | | gridOptions.columns.push(column) |
| | | |
| | | }) |
| | | produceList = produceList.value.concat(deepClone(res.data.data)) |
| | | xGrid.value.reloadData(produceList) |
| | | gridOptions.loading = false |
| | |
| | | } |
| | | }) |
| | | |
| | | /*使用筛选,后端获取数据*/ |
| | | const changeFilterEvent = (event, option, $panel,) => { |
| | | // 手动触发筛选 |
| | | $panel.changeOption(event, !!option.data, option) |
| | | } |
| | | |
| | | |
| | | function padLeftZero(str) { |
| | | return ('00' + str).substr(str.length) |
| | | } |
| | | |
| | | function filterChanged(column) { |
| | | gridOptions.loading = true |
| | | //筛选条件发生变化条件发生变化 |
| | | let value = column.datas[0] != undefined ? column.datas[0] : '' |
| | | value = value.trim() |
| | | //判断是否存在外键 |
| | | if (column.property.indexOf('.') > -1) { |
| | | const columnArr = column.property.split('.') |
| | | filterData.value[columnArr[0]] = { |
| | | [columnArr[1]]: value |
| | | } |
| | | } else { |
| | | filterData.value[column.property] = value |
| | | } |
| | | |
| | | |
| | | request.post(`/processCard/selectNoCard/${orderId}/${productionId}`, filterData.value).then((res) => { |
| | | if (res.code == 200) { |
| | | |
| | | pageTotal.value = res.data.total |
| | | produceList = deepClone(res.data.data) |
| | | xGrid.value.loadData(produceList) |
| | | gridOptions.loading = false |
| | | } else { |
| | | ElMessage.warning(res.msg) |
| | | } |
| | | }) |
| | | } |
| | | |
| | | /*后端返回结果多层嵌套展示*/ |
| | | const hasDecimal = (value) => { |
| | | const regex = /\./; // 定义正则表达式,查找小数点 |
| | | return regex.test(value); // 返回true/false |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | //右侧子组件接收参数 |
| | | const xGrid = ref() |
| | |
| | | keepSource: true,//保持源数据 |
| | | align: 'center',//文字居中 |
| | | stripe: true,//斑马纹 |
| | | rowConfig: {isCurrent: true, isHover: true, height: 30},//鼠标移动或选择高亮 |
| | | id: 'CustomerList', |
| | | rowConfig: {isCurrent: true, isHover: true, height: 30, useKey: false},//鼠标移动或选择高亮 |
| | | id: 'AddProcessCardRight', |
| | | showFooter: true,//显示脚 |
| | | printConfig: {}, |
| | | importConfig: {}, |
| | |
| | | useKey: true |
| | | }, |
| | | filterConfig: { //筛选配置项 |
| | | remote: true |
| | | //remote: true |
| | | }, |
| | | customConfig: { |
| | | storage: true |
| | | }, |
| | | sortConfig: { |
| | | multiple: true |
| | | }, |
| | | editConfig: { |
| | | trigger: 'click', |
| | |
| | | showStatus: true |
| | | },//表头参数 |
| | | columns: [ |
| | | {type: 'checkbox', fixed: "left", title: '选择'}, |
| | | {field: 'orderNumber', title: '订序', filters: [{data: ''}], slots: {filter: 'num1_filter'}}, |
| | | {field: 'shape', title: '形状', showOverflow: "ellipsis", filters: [{data: ''}], slots: {filter: 'num1_filter'}}, |
| | | {field: 'width', title: '宽', filters: [{data: ''}], slots: {filter: 'num1_filter'}}, |
| | | {field: 'height', title: '高', filters: [{data: ''}], slots: {filter: 'num1_filter'}}, |
| | | {field: 'baiscQuantity', title: '待分数量', showOverflow: "ellipsis"}, |
| | | {field: 'computeGrossArea', title: '待分面积'}, |
| | | {field: 'totalThickness', title: '总厚度'}, |
| | | {field: 'thickness', title: '玻璃厚度'}, |
| | | {field: 'weight', title: '重量'} |
| | | {type: 'checkbox', fixed: "left", title: t('basicData.check'), width: '80px'}, |
| | | { |
| | | field: 'orderNumber', |
| | | title: t('order.OrderNum'), |
| | | filters: [{data: ''}], |
| | | slots: {filter: 'num1_filter'}, |
| | | filterMethod: filterChanged, |
| | | width: '100px' |
| | | }, |
| | | { |
| | | field: 'shape', |
| | | title: t('order.shape'), |
| | | showOverflow: "ellipsis", |
| | | filters: [{data: ''}], |
| | | slots: {filter: 'num1_filter'}, |
| | | filterMethod: filterChanged, |
| | | width: '70px' |
| | | }, |
| | | { |
| | | field: 'width', |
| | | title: t('order.width'), |
| | | sortable: true, |
| | | filters: [{data: ''}], |
| | | slots: {filter: 'num1_filter'}, |
| | | filterMethod: filterChanged, |
| | | width: '78px' |
| | | }, |
| | | { |
| | | field: 'height', |
| | | title: t('order.height'), |
| | | sortable: true, |
| | | filters: [{data: ''}], |
| | | slots: {filter: 'num1_filter'}, |
| | | filterMethod: filterChanged, |
| | | width: '78px' |
| | | }, |
| | | {field: 'baiscQuantity', title: t('processCard.quantityToDivided'), showOverflow: "ellipsis", width: '80px'}, |
| | | {field: 'computeGrossArea', title: t('processCard.areaToDivided'), width: '80px'}, |
| | | {field: 'totalThickness', title: t('processCard.totalThickness'), width: '80px'}, |
| | | {field: 'thickness', title: t('processCard.glassThickness'), width: '80px'}, |
| | | {field: 'weight', title: t('processCard.weight'), slots: {default: 'weight_sum'}, width: '85px'}, |
| | | {field: 'remarks', title: t('processCard.notes'), width: '85px',filters: [{data: ''}], slots: {filter: 'num1_filter'},filterMethod: filterChanged}, |
| | | {field: 'processing_note', title: t('order.processingNote'), width: '85px',filters: [{data: ''}], slots: {filter: 'num1_filter'},filterMethod: filterChanged}, |
| | | {field: 'bend_radius', title: t('order.bendRadius'), width: '120px',filters: [{data: ''}], slots: {filter: 'num1_filter'},filterMethod: filterChanged,sortable: true,} |
| | | |
| | | ],//表头按钮 |
| | | |
| | | toolbarConfig: { |
| | |
| | | }, |
| | | data: [],//table body实际数据 |
| | | //脚部求和 |
| | | |
| | | footerMethod({columns, data}) {//页脚函数 |
| | | let footList = ['baiscQuantity', 'computeGrossArea', 'totalThickness','thickness', 'weight'] |
| | | let count = 0 |
| | | return [ |
| | | columns.map((column, columnIndex) => { |
| | | if (columnIndex === 0) { |
| | | return '合计:' |
| | | return t('basicData.total') |
| | | } |
| | | if (footList.includes(column.field)) { |
| | | return sumNum(data, column.field) |
| | | |
| | | const List = ["baiscQuantity", 'computeGrossArea'] |
| | | if (List.includes(column.field)) { |
| | | return footSum(data, column.field) |
| | | } |
| | | if (column.field === 'weight') { |
| | | data.forEach(row => { |
| | | count += weightSum(row) |
| | | }) |
| | | return parseFloat(count.toFixed(2)) |
| | | } |
| | | |
| | | return '' |
| | | }) |
| | | ] |
| | | } |
| | | }, |
| | | |
| | | }) |
| | | |
| | | |
| | | //左侧子组件接收参数 |
| | | const xGridLeft = ref() |
| | |
| | | keepSource: true,//保持源数据 |
| | | align: 'center',//文字居中 |
| | | stripe: true,//斑马纹 |
| | | rowConfig: {isCurrent: true, isHover: true, height: 30},//鼠标移动或选择高亮 |
| | | id: 'CustomerList', |
| | | rowConfig: {isCurrent: true, isHover: true, height: 30, useKey: false},//鼠标移动或选择高亮 |
| | | id: 'AddProcessCardLeft', |
| | | showFooter: true,//显示脚 |
| | | printConfig: {}, |
| | | importConfig: {}, |
| | |
| | | useKey: true |
| | | }, |
| | | filterConfig: { //筛选配置项 |
| | | remote: true |
| | | //remote: true |
| | | }, |
| | | customConfig: { |
| | | storage: true |
| | |
| | | showStatus: true |
| | | },//表头参数 |
| | | columns: [ |
| | | {type: 'checkbox', fixed: "left", title: '选择'}, |
| | | {field: 'processId', title: '流程卡号', filters: [{data: ''}], slots: {filter: 'num1_filter'}, width: 130}, |
| | | {type: 'checkbox', fixed: "left", title: t('basicData.check'),width: 78}, |
| | | { |
| | | field: 'processId', |
| | | title: t('processCard.processId'), |
| | | filters: [{data: ''}], |
| | | slots: {filter: 'num1_filter'}, |
| | | width: 135, |
| | | filterMethod: filterChanged, |
| | | }, |
| | | { |
| | | field: 'orderNumber', |
| | | title: '订序', |
| | | title: t('order.OrderNum'), |
| | | showOverflow: "ellipsis", |
| | | filters: [{data: ''}], |
| | | slots: {filter: 'num1_filter'} |
| | | , filterMethod: filterChanged, |
| | | width: 98 |
| | | }, |
| | | {field: 'landingSequence', title: '落架顺序', filters: [{data: ''}], slots: {filter: 'num1_filter'}}, |
| | | {field: 'shape', title: '形状', filters: [{data: ''}], slots: {filter: 'num1_filter'}}, |
| | | {field: 'width', title: '宽', showOverflow: "ellipsis"}, |
| | | {field: 'height', title: '高'}, |
| | | {field: 'quantity', title: '总数量'}, |
| | | {field: 'totalThickness', title: '总厚度'}, |
| | | { |
| | | field: 'landingSequence', |
| | | title: t('processCard.landingSequence'), |
| | | filters: [{data: ''}], |
| | | slots: {filter: 'num1_filter'}, |
| | | filterMethod: filterChanged, |
| | | width: 99 |
| | | }, |
| | | { |
| | | field: 'shape', |
| | | title: t('order.shape'), |
| | | filters: [{data: ''}], |
| | | slots: {filter: 'num1_filter'}, |
| | | filterMethod: filterChanged, |
| | | width:70 |
| | | }, |
| | | {field: 'width', title: t('order.width'), showOverflow: "ellipsis",width:70}, |
| | | {field: 'height', title: t('order.height'),width:70}, |
| | | {field: 'quantity', title: t('order.quantity'),width:70}, |
| | | {field: 'totalThickness', title: t('processCard.totalThickness'),width:70}, |
| | | ],//表头按钮 |
| | | |
| | | toolbarConfig: { |
| | | buttons: [ |
| | | {code: 'saveFlowCard', name: '保存', status: 'primary', icon: 'vxe-icon-save'}, |
| | | {code: 'saveFlowCard', name: t('basicData.save'), status: 'primary', icon: 'vxe-icon-save'}, |
| | | ], |
| | | import: false, |
| | | export: true, |
| | | print: true, |
| | | // import: false, |
| | | // export: true, |
| | | // print: true, |
| | | zoom: true, |
| | | custom: true |
| | | }, |
| | | data: [],//table body实际数据 |
| | | //脚部求和 |
| | | footerMethod({columns, data}) {//页脚函数 |
| | | let footList = ['总数量', '总面积', '分箱数'] |
| | | return [ |
| | | columns.map((column, columnIndex) => { |
| | | if (columnIndex === 0) { |
| | | return '合计:' |
| | | return t('basicData.total') |
| | | } |
| | | if (footList.includes(column.field)) { |
| | | return sumNum(data, column.field) |
| | | const List = ["quantity", 'goodsQuantity', 'area'] |
| | | if (List.includes(column.field)) { |
| | | return footSum(data, column.field) |
| | | } |
| | | return '' |
| | | }) |
| | |
| | | } |
| | | |
| | | }) |
| | | //定义输入数量 |
| | | let checkedNum = ref('') |
| | | //创建流程卡 |
| | | const createProcessCard = () => { |
| | | const $grid = xGrid.value |
| | | const checkedList = $grid.getCheckboxRecords() |
| | | |
| | | if (checkedList.length === 0) { |
| | | ElMessage.warning("请先选择右侧数据") |
| | | ElMessage.warning(t('processCard.schedulingOk')) |
| | | return |
| | | } |
| | | //productionId |
| | |
| | | index = leftData[0].landingSequence + 1 |
| | | //index = index.toString().padStart(2, '0') |
| | | } |
| | | const processId = productionId + index.toString().padStart(2, '0') |
| | | checkedList.forEach((item) => { |
| | | item.processId = processId |
| | | item.landingSequence = index |
| | | }) |
| | | $gridLeft.insertAt(checkedList) |
| | | $grid.remove(checkedList) |
| | | let processId= null |
| | | // if (leftData.length !== 0){ |
| | | // processId = productionId + index.toString().padStart(3, '0') |
| | | // } |
| | | // else { |
| | | if (maxProcseeId!== null || maxProcseeId!== undefined|| maxProcseeId!== ''){ |
| | | if (leftData.length !== 0){ |
| | | const str=leftData[0].processId |
| | | const lastThree = str.slice(-3); |
| | | const result = lastThree*1 + 1; |
| | | processId= productionId + result.toString().padStart(3, '0') |
| | | } |
| | | else { |
| | | // 截取后三位 |
| | | const lastThree = maxProcseeId.slice(-3); |
| | | const result = lastThree*1 + 1; |
| | | processId= productionId + result.toString().padStart(3, '0') |
| | | } |
| | | |
| | | } |
| | | else { |
| | | processId = productionId + index.toString().padStart(3, '0') |
| | | } |
| | | //} |
| | | |
| | | |
| | | const regex = /^(\d+|)$/; |
| | | if (!regex.test(checkedNum.value)) { |
| | | ElMessage.warning(t('processCard.schedulingNo')) |
| | | return |
| | | } |
| | | //判断正整数 |
| | | if (/^[1-9]\d*$/.test(checkedNum.value)) { |
| | | checkedList.forEach((item) => { |
| | | //定义key值保持 |
| | | //判断可用数量是否大于等于输入的数量,不满足则抛出异常 |
| | | if (item.baiscQuantity * 1 < checkedNum.value * 1) throw new Error(t('processCard.schedulingQuantity')); |
| | | item.quantity = checkedNum.value |
| | | item.processId = processId |
| | | item.landingSequence = index |
| | | item.baiscQuantity = item.baiscQuantity - checkedNum.value |
| | | item.computeGrossArea = (item.computeGrossArea - item.width * item.height * checkedNum.value / 1000000).toFixed(2) |
| | | |
| | | //删除key |
| | | let key = item._X_ROW_KEY |
| | | delete item._X_ROW_KEY |
| | | if (item.baiscQuantity === 0) { |
| | | $grid.remove(item) |
| | | } |
| | | $gridLeft.insertAt(item) |
| | | //重新赋值key |
| | | item._X_ROW_KEY = key |
| | | }) |
| | | |
| | | //清除两边复选框 |
| | | $gridLeft.clearCheckboxRow() |
| | | $grid.clearCheckboxRow() |
| | | } else if (checkedNum.value === '') {//判断数量输入框无输入数字 |
| | | |
| | | checkedList.forEach((item) => { |
| | | item.processId = processId |
| | | item.landingSequence = index |
| | | item.quantity = item.baiscQuantity |
| | | }) |
| | | //删除key |
| | | checkedList.forEach((item) => { |
| | | delete item._X_ROW_KEY |
| | | }) |
| | | $gridLeft.insertAt(checkedList) |
| | | $grid.remove(checkedList) |
| | | //清除两边复选框 |
| | | $gridLeft.clearCheckboxRow() |
| | | $grid.clearCheckboxRow() |
| | | } |
| | | } |
| | | |
| | | let checkedNum = ref('') |
| | | |
| | | //按编号创建流程卡 |
| | | const createProcessCardNo = () => { |
| | | const $grid = xGrid.value |
| | | const checkedList = $grid.getCheckboxRecords() |
| | | |
| | | if (checkedList.length === 0) { |
| | | ElMessage.warning(t('processCard.schedulingOk')) |
| | | return |
| | | } |
| | | //productionId |
| | | const $gridLeft = xGridLeft.value |
| | | const leftData = $gridLeft.getTableData().fullData |
| | | let index = 0 |
| | | if (leftData.length !== 0) { |
| | | index = leftData[0].landingSequence + 1 |
| | | //index = index.toString().padStart(2, '0') |
| | | } |
| | | |
| | | let processId= null |
| | | |
| | | if (maxProcseeId!== null || maxProcseeId!== undefined|| maxProcseeId!== ''){ |
| | | if (leftData.length !== 0){ |
| | | const str=leftData[0].processId |
| | | const lastThree = str.slice(-3); |
| | | const result = lastThree*1 + 1; |
| | | processId= productionId + result.toString().padStart(3, '0') |
| | | } |
| | | else { |
| | | // 截取后三位 |
| | | const lastThree = maxProcseeId.slice(-3); |
| | | const result = lastThree*1 + 1; |
| | | processId= productionId + result.toString().padStart(3, '0') |
| | | } |
| | | |
| | | } |
| | | else { |
| | | |
| | | processId = productionId + index.toString().padStart(3, '0') |
| | | |
| | | |
| | | } |
| | | |
| | | |
| | | const regex = /^(\d+|)$/; |
| | | if (!regex.test(checkedNum.value)) { |
| | | ElMessage.warning(t('processCard.schedulingNo')) |
| | | return |
| | | } |
| | | |
| | | checkedList.forEach((item) => { |
| | | index++ |
| | | processId = productionId + index.toString().padStart(3, '0') |
| | | item.processId = processId |
| | | item.landingSequence = index |
| | | item.quantity = item.baiscQuantity |
| | | }) |
| | | //删除key |
| | | checkedList.forEach((item) => { |
| | | delete item._X_ROW_KEY |
| | | }) |
| | | $gridLeft.insertAt(checkedList) |
| | | $grid.remove(checkedList) |
| | | //清除两边复选框 |
| | | $gridLeft.clearCheckboxRow() |
| | | $grid.clearCheckboxRow() |
| | | |
| | | } |
| | | |
| | | |
| | | //向右边表格添加数据 |
| | | const addRight = () => { |
| | |
| | | const checkedList = $gridLeft.getCheckboxRecords() |
| | | //判断左边表格是否有选中的数据 |
| | | if (checkedList.length === 0) { |
| | | ElMessage.warning("请先选择左侧数据") |
| | | ElMessage.warning(t('processCard.schedulingArea')) |
| | | return |
| | | } |
| | | const regex = /^(\d+|)$/; |
| | | if (!regex.test(checkedNum.value)) { |
| | | ElMessage.warning("请输入正整数") |
| | | ElMessage.warning(t('processCard.schedulingNo')) |
| | | return |
| | | } |
| | | //判断正整数 |
| | |
| | | //对选中的左边表格数据进行循环 |
| | | checkedList.forEach((item) => { |
| | | //判断可用数量是否大于等于输入的数量,不满足则抛出异常 |
| | | if (item.quantity < checkedNum.value) throw new Error("请输入小于等于可用数量的数字"); |
| | | // if (item.quantity < checkedNum.value*1) throw new Error(t('processCard.schedulingQuantity')); |
| | | if (item.quantity < checkedNum.value * 1) { |
| | | ElMessage.warning(t('processCard.schedulingQuantity')) |
| | | } |
| | | //左边表格可用数量减去输入的数量 |
| | | item.quantity = item.quantity - checkedNum.value |
| | | //右边表格数据 |
| | |
| | | let filterIndex = rightData.findIndex(item1 => item1.orderNumber === item.orderNumber) |
| | | //如果右边表格数据中存在当前数据则数量相加 |
| | | if (filterIndex >= 0) { |
| | | //数量 |
| | | rightData[filterIndex].baiscQuantity = rightData[filterIndex].baiscQuantity * 1 + checkedNum.value * 1 |
| | | //面积 |
| | | rightData[filterIndex].computeGrossArea = (rightData[filterIndex].width * rightData[filterIndex].height * rightData[filterIndex].baiscQuantity / 1000000).toFixed(2) |
| | | //如果左边数量为0时删除此条数据 |
| | | if (item.quantity === 0) { |
| | | $gridLeft.remove(item) |
| | | //删除key |
| | | let key = item._X_ROW_KEY |
| | | delete item._X_ROW_KEY |
| | | if (item.baiscQuantity === 0) { |
| | | $grid.remove(item) |
| | | } |
| | | item._X_ROW_KEY = key |
| | | } else { |
| | | //右边表格没有此条数据则往右边表格插入数据 |
| | | item.baiscQuantity = checkedNum.value |
| | | item.computeGrossArea = (item.width * item.height * checkedNum.value / 1000000).toFixed(2) |
| | | if (item.quantity === 0) { |
| | | $gridLeft.remove(item) |
| | | } |
| | | $grid.insert(item) |
| | | } |
| | | if (item.quantity === 0) { |
| | | $gridLeft.remove(item) |
| | | } |
| | | }) |
| | | } else if (checkedNum.value === '') {//判断数量输入框有无输入数字 |
| | | } else if (checkedNum.value === '') {//判断数量输入框无输入数字 |
| | | |
| | | checkedList.forEach((item) => { |
| | | //右侧表格 |
| | | let rightData = $grid.getTableData().fullData |
| | | let filterIndex = rightData.findIndex(item1 => item1.orderNumber === item.orderNumber) |
| | | //左侧表格 |
| | | let leftData = $gridLeft.getTableData().fullData |
| | | let leftfilterIndex = leftData.findIndex(item1 => item1.orderNumber === item.orderNumber) |
| | | //无输入并且如果右边表格数据中存在当前数据则数量相加 |
| | | if (filterIndex > -1) { |
| | | rightData[filterIndex].baiscQuantity = rightData[filterIndex].baiscQuantity * 1 + item.quantity * 1 |
| | | //面积 |
| | | rightData[filterIndex].computeGrossArea = (rightData[filterIndex].width * rightData[filterIndex].height * rightData[filterIndex].baiscQuantity / 1000000).toFixed(2) |
| | | |
| | | } else { |
| | | |
| | | |
| | | // item.baiscQuantity = item.baiscQuantity * 1 + leftData[leftfilterIndex].quantity * 1 |
| | | // item.computeGrossArea=(item.width*item.height*item.baiscQuantity/1000000).toFixed(2) |
| | | //item.computeGrossArea=(item.width*item.height*item.baiscQuantity/1000000).toFixed(2) |
| | | // for (let i = 0; i <checkedList.length ; i++) { |
| | | // |
| | | // if (checkedList[i].orderNumber === item.orderNumber){ |
| | | // console.log(item.baiscQuantity +"---"+ checkedList[i].quantity ) |
| | | // item.baiscQuantity = item.baiscQuantity * 1 + checkedList[i].quantity * 1 |
| | | // } |
| | | // } |
| | | |
| | | delete item._X_ROW_KEY |
| | | $grid.insert(item) |
| | | |
| | | |
| | | } |
| | | |
| | | $gridLeft.remove(item) |
| | | }) |
| | | } |
| | | |
| | | |
| | | } |
| | | //清除两边复选框 |
| | | $gridLeft.clearCheckboxRow() |
| | | $grid.clearCheckboxRow() |
| | | } catch (e) { |
| | | ElMessage.warning(e.message) |
| | | } |
| | |
| | | //获取左边表格checkbox选中的数据 |
| | | const checkedListLeft = $gridLeft.getCheckboxRecords() |
| | | //判断右边表格是否有选中的数据 |
| | | if (checkedList.length === 0) { |
| | | ElMessage.warning("请先选择右侧数据") |
| | | if (checkedList.length * 1 === 0) { |
| | | ElMessage.warning(t('processCard.schedulingOk')) |
| | | return |
| | | } |
| | | if (checkedListLeft.length !== 1) { |
| | | ElMessage.warning("请先选择左侧一条数据") |
| | | ElMessage.warning(t('processCard.schedulingTime')) |
| | | return |
| | | } |
| | | const regex = /^(\d+|)$/; |
| | | if (!regex.test(checkedNum.value)) { |
| | | ElMessage.warning("请输入正整数") |
| | | ElMessage.warning(t('processCard.schedulingNo')) |
| | | return |
| | | } |
| | | //判断正整数 |
| | | if (/^[1-9]\d*$/.test(checkedNum.value)) { |
| | | checkedList.forEach((item) => { |
| | | //判断可用数量是否大于等于输入的数量,不满足则抛出异常 |
| | | if (item.baiscQuantity < checkedNum.value) throw new Error("请输入小于等于可用数量的数字"); |
| | | if (item.baiscQuantity * 1 < checkedNum.value * 1) throw new Error("请输入小于等于待分数量的数字"); |
| | | item.baiscQuantity = item.baiscQuantity - checkedNum.value |
| | | item.computeGrossArea = (item.computeGrossArea - item.width * item.height * checkedNum.value / 1000000).toFixed(2) |
| | | //定义key值保持 |
| | | let key = item._X_ROW_KEY |
| | | //左边表格数据 |
| | | let leftData = $gridLeft.getTableData().fullData |
| | | //左边表格数据中查找当前数据下标 |
| | | let filterIndex = leftData.findIndex(item1 => item1.orderNumber === item.orderNumber) |
| | | //如果右边表格数据中存在当前数据则数量相加 |
| | | if (filterIndex >= 0) { |
| | | leftData[filterIndex].quantity = leftData[filterIndex].quantity * 1 + checkedNum.value * 1 |
| | | //判断右侧勾选值与左侧是否相同 |
| | | if (checkedListLeft[0].orderNumber === item.orderNumber) { |
| | | |
| | | if (item.baiscQuantity === 0) { |
| | | $grid.remove(checkedList) |
| | | //如果右边表格数据中存在当前数据则数量相加 |
| | | if (filterIndex >= 0) { |
| | | leftData[filterIndex].quantity = leftData[filterIndex].quantity * 1 + checkedNum.value * 1 |
| | | leftData[filterIndex].computeGrossArea = (leftData[filterIndex].computeGrossArea - leftData[filterIndex].width * leftData[filterIndex].height * leftData[filterIndex].baiscQuantity / 1000000).toFixed(2) |
| | | |
| | | if (item.baiscQuantity === 0) { |
| | | $grid.remove(item) |
| | | } |
| | | //delete item._X_ROW_KEY |
| | | } else { |
| | | item.quantity = checkedNum.value |
| | | item.processId = checkedListLeft[0].processId |
| | | item.landingSequence = checkedListLeft[0].landingSequence |
| | | item.computeGrossArea = (item.computeGrossArea - checkedListLeft[0].width * checkedListLeft[0].height * checkedNum.value / 1000000).toFixed(2) |
| | | delete item._X_ROW_KEY |
| | | $gridLeft.insert(item) |
| | | item._X_ROW_KEY = key |
| | | } |
| | | } else { |
| | | |
| | | //如果勾选两个值不同则插入同流程卡 |
| | | item.quantity = checkedNum.value |
| | | item.processId = checkedListLeft[0].processId |
| | | item.landingSequence = checkedListLeft[0].landingSequence |
| | | $gridLeft.insert(item) |
| | | // /item.computeGrossArea=item.computeGrossArea |
| | | if (item.baiscQuantity === 0) { |
| | | $grid.remove(item) |
| | | |
| | | } |
| | | for (let i = 0; i < leftData.length; i++) { |
| | | if (leftData[i].orderNumber === item.orderNumber && leftData[i].processId === item.processId) { |
| | | leftData[i].quantity = leftData[i].quantity * 1 + checkedNum.value * 1 |
| | | leftData[i].computeGrossArea = (leftData[i].computeGrossArea - leftData[i].width * leftData[i].height * leftData[i].baiscQuantity / 1000000).toFixed(2) |
| | | break |
| | | } else if (leftData[i].orderNumber === item.orderNumber && leftData[i].processId !== item.processId) { |
| | | delete item._X_ROW_KEY |
| | | $gridLeft.insert(item) |
| | | item._X_ROW_KEY = key |
| | | break |
| | | } else if (leftData[i].orderNumber !== item.orderNumber && leftData[i].processId !== item.processId) { |
| | | delete item._X_ROW_KEY |
| | | $gridLeft.insert(item) |
| | | item._X_ROW_KEY = key |
| | | break |
| | | } else if (leftData[i].orderNumber !== item.orderNumber && leftData[i].processId == item.processId) { |
| | | delete item._X_ROW_KEY |
| | | $gridLeft.insert(item) |
| | | item._X_ROW_KEY = key |
| | | break |
| | | } |
| | | |
| | | } |
| | | } |
| | | |
| | | }) |
| | | } else if (checkedNum.value === '') {//判断数量输入框有无输入数字 |
| | | } else if (checkedNum.value === '') {//判断数量输入框无输入数字 |
| | | checkedList.forEach((item) => { |
| | | item.processId = checkedListLeft[0].processId |
| | | item.landingSequence = checkedListLeft[0].landingSequence |
| | | item.quantity = checkedListLeft[0].baiscQuantity |
| | | item.computeGrossArea = (item.computeGrossArea - checkedListLeft[0].width * checkedListLeft[0].height * checkedListLeft[0].baiscQuantity / 1000000).toFixed(2) |
| | | |
| | | delete item._X_ROW_KEY |
| | | }) |
| | | $gridLeft.insertAt(checkedList) |
| | | $grid.remove(checkedList) |
| | | } |
| | | //清除两边复选框 |
| | | if ($gridLeft || $grid) { |
| | | $gridLeft.clearCheckboxRow() |
| | | $grid.clearCheckboxRow() |
| | | } |
| | | |
| | | } catch (e) { |
| | | ElMessage.warning(e.message) |
| | | } |
| | | } |
| | | |
| | | |
| | | //保存流程卡数据 |
| | | const gridEvents = { |
| | |
| | | if ($grid) { |
| | | switch (code) { |
| | | case 'saveFlowCard': { |
| | | gridLeftOptions.toolbarConfig.buttons[0].disabled=true |
| | | const $table = xGridLeft.value |
| | | const $tableRight = xGrid.value |
| | | if ($table) { |
| | | const selectRecords = $table.getCheckboxRecords() |
| | | const selectRight = $tableRight.getCheckboxRecords() |
| | | if (selectRecords.length === 0){ |
| | | ElMessage.warning("请先选择保存的数据") |
| | | // const selectRight = $tableRight.getCheckboxRecords() |
| | | let leftData = $tableRight.getTableData().fullData |
| | | if (selectRecords.length === 0) { |
| | | ElMessage.warning(t('processCard.pleaseSelectTheSavedDataFirst')) |
| | | return |
| | | } |
| | | if (selectRight.length > 0){ |
| | | ElMessage.warning("请先将右侧数据全部建立流程卡后保存") |
| | | |
| | | if (leftData.length > 0) { |
| | | ElMessage.warning(t('processCard.pleaseFirstCreateAProcessCardForAllTheDataOnTheRightSideAndSaveIt')) |
| | | return; |
| | | } |
| | | //console.log(selectRecords[0].quantity) |
| | | let flowCardData = ref({ |
| | | flowCard: selectRecords, |
| | | userName:username, |
| | | productionId:productionId |
| | | userName: username, |
| | | productionId: productionId, |
| | | userId:user.user.userId |
| | | }) |
| | | |
| | | console.log(flowCardData.value) |
| | | request.post("/processCard/addFlowCard", flowCardData.value).then((res) => { |
| | | if (res.code == 200) { |
| | | ElMessage.success("保存成功") |
| | | location.reload(); |
| | | ElMessage.success(t('basicData.msg.saveSuccess')) |
| | | //router.push('/main/processCard/SplittingDetails?orderId=${orderId}') |
| | | router.push({ |
| | | path: '/main/processCard/AddProcessCard', |
| | | query: {orderId: orderId, productionId: productionId, random: Math.random()} |
| | | }) |
| | | |
| | | //location.reload(); |
| | | } else { |
| | | ElMessage.warning(res.msg) |
| | | router.push("/login") |
| | | } |
| | | }) |
| | | |
| | |
| | | }, |
| | | |
| | | } |
| | | const weightSum = (row) => { |
| | | return parseFloat((row.baiscQuantity * row.thickness * row.width * row.height * 2.5 / 1000000).toFixed(2)) |
| | | } |
| | | |
| | | let quantit = ref('') |
| | | let weight = ref('') |
| | | const handleCheckboxChange = ({row}) => { |
| | | const $grid = xGrid.value |
| | | //获取右边表格checkbox选中的数据 |
| | | const checkedList = $grid.getCheckboxRecords() |
| | | let quantitySum = 0; |
| | | let weightsum = 0; |
| | | checkedList.forEach(item => { |
| | | quantitySum += item.baiscQuantity; |
| | | weightsum += weightSum(item); |
| | | }); |
| | | quantit.value = quantitySum; |
| | | weight.value = parseFloat(weightsum.toFixed(2)); |
| | | } |
| | | </script> |
| | | |
| | | <template> |
| | | <div> |
| | | <div style="width: 75%;height: 90%"> |
| | | <div class="common-layout"> |
| | | <el-button |
| | | id="searchButton1" |
| | | :icon="ArrowLeftBold" |
| | | round |
| | | style="float: left" |
| | | type="primary" |
| | | @click="intoCreateProduct"> |
| | | {{ flag ? t('processCard.return') : t('processCard.return') }} |
| | | </el-button> |
| | | <!-- <el-button type="primary">保存分架</el-button>--> |
| | | <!-- <el-button type="primary" :hidden="true">分架汇总</el-button>--> |
| | | |
| | | <div class="common-layout" style="height: 100%"> |
| | | <div class="header"> |
| | | |
| | | <el-button |
| | | style="float: left" |
| | | @click="intoCreateProduct" |
| | | id="searchButton1" |
| | | type="primary" |
| | | :icon="ArrowLeftBold" |
| | | round> |
| | | {{ flag ? '返回' : '返回' }} |
| | | </el-button> |
| | | <!-- <el-button type="primary">保存分架</el-button>--> |
| | | <!-- <el-button type="primary" :hidden="true">分架汇总</el-button>--> |
| | | <div style="width: 100px;"> |
| | | |
| | | </div> |
| | | </div> |
| | | <el-container height="600px"> |
| | | <el-aside width="44%" > |
| | | <el-container style="height: 100%;width: 100%"> |
| | | <el-aside style="width: 52%;height: 100%"> |
| | | <vxe-grid |
| | | max-height="100%" |
| | | @filter-change="filterChanged" |
| | | class="mytable-scrollbar" |
| | | ref="xGridLeft" |
| | | checkbox-config="{ reserve: true, strict: true }" |
| | | class="mytable-scrollbar" |
| | | height="100%" |
| | | v-bind="gridLeftOptions" |
| | | v-on="gridEvents" |
| | | > |
| | |
| | | </li> |
| | | </ul> |
| | | </template> |
| | | <!--左边固定显示的插槽--> |
| | | <template #button_slot="{ row }"> |
| | | <el-button @click="getTableRow(row,'edit')" link type="primary" size="small">打印</el-button> |
| | | <el-button @click="getTableRow(row,'setType')" link type="primary" size="small">排版</el-button> |
| | | <el-button @click="getTableRow(row,'delete')" link type="primary" size="small">删除</el-button> |
| | | </template> |
| | | <template #num1_filter="{ column, $panel }"> |
| | | <div> |
| | | <div v-for="(option, index) in column.filters" :key="index"> |
| | | <input type="type" v-model="option.data" @input="changeFilterEvent($event, option, $panel)"/> |
| | | </div> |
| | | </div> |
| | | </template> |
| | | |
| | | |
| | | </vxe-grid> |
| | | |
| | | </el-aside> |
| | | |
| | | <el-main width="12%" style=""> |
| | | <span>选中数量:<el-input type="number" v-model="checkedNum"></el-input></span><br> |
| | | <el-button type="primary" @click="addRight"> →</el-button> |
| | | <br> |
| | | <br> |
| | | <el-button type="primary" @click="addLeft"> ←</el-button> |
| | | <br> |
| | | <br> |
| | | <el-button @click="createProcessCard" type="primary">建立流程卡</el-button> |
| | | </el-main> |
| | | |
| | | <el-aside width="45%" height="500px" style=""> |
| | | <vxe-grid |
| | | |
| | | max-height="97%" |
| | | @filter-change="filterChanged" |
| | | class="mytable-scrollbar" |
| | | ref="xGrid" |
| | | v-bind="gridOptions" |
| | | > |
| | | <!-- @toolbar-button-click="toolbarButtonClickEvent"--> |
| | | <!-- 下拉显示所有信息插槽--> |
| | | <template #content="{ row }"> |
| | | <ul class="expand-wrapper"> |
| | | <li v-for="(item,index) in gridOptions.columns" v-show="item.field!=undefined "> |
| | | <span style="font-weight: bold">{{ item.title + ': ' }}</span> |
| | | <span v-if="hasDecimal(item.field)">{{ |
| | | row[item.field.split('.')[0]][item.field.split('.')[1]] |
| | | }}</span> |
| | | <span v-else>{{ row[item.field] }}</span> |
| | | </li> |
| | | </ul> |
| | | </template> |
| | | |
| | | <!--左边固定显示的插槽--> |
| | | <template #button_slot="{ row }"> |
| | | <el-button @click="getTableRow(row,'edit')" link type="primary" size="small">打印</el-button> |
| | | <el-button @click="getTableRow(row,'setType')" link type="primary" size="small">排版</el-button> |
| | | <el-button @click="getTableRow(row,'delete')" link type="primary" size="small">删除</el-button> |
| | | </template> |
| | | |
| | | <template #num1_filter="{ column, $panel }"> |
| | | <div> |
| | | <div v-for="(option, index) in column.filters" :key="index"> |
| | | <input type="type" v-model="option.data" @input="changeFilterEvent($event, option, $panel)"/> |
| | | <input v-model="option.data" |
| | | type="text" |
| | | @input="changeFilterEvent($event, option, $panel)"/> |
| | | </div> |
| | | </div> |
| | | </template> |
| | | </vxe-grid> |
| | | |
| | | </el-aside> |
| | | |
| | | <div height="100%" style="margin: 5px" width="11%"> |
| | | <el-main style=""> |
| | | <div> |
| | | <span><el-input v-model="quantit" style="width: 80px;"/></span> |
| | | <span><el-input v-model="weight" style="width: 80px;"/></span> |
| | | </div> |
| | | <span>{{ $t('processCard.selectedQuantity') }}:<el-input v-model="checkedNum" clearable |
| | | type="number"></el-input></span><br> |
| | | <el-button style="width: 40px;" type="primary" @click="addRight"> →</el-button> |
| | | <br> |
| | | <br> |
| | | <el-button style="width: 40px;" type="primary" @click="addLeft"> ←</el-button> |
| | | <br> |
| | | <br> |
| | | <el-button type="primary" @click="createProcessCard">{{ $t('processCard.establishProcessCards') }} |
| | | </el-button> |
| | | <br><br><br><br><br> |
| | | <el-button type="primary" @click="createProcessCardNo">按序号创建 |
| | | </el-button> |
| | | </el-main> |
| | | </div> |
| | | |
| | | |
| | | <!-- 右侧--> |
| | | <div style="height: 100%;width: 70%"> |
| | | |
| | | <el-aside style="width: 100%;height: 100%"> |
| | | <vxe-grid |
| | | id="rightTable" |
| | | ref="xGrid" |
| | | checkbox-config="{ reserve: true, strict: true }" |
| | | class="mytable-scrollbar" |
| | | height="100%" |
| | | v-bind="gridOptions" |
| | | @checkbox-change="handleCheckboxChange" |
| | | > |
| | | <!-- @toolbar-button-click="toolbarButtonClickEvent"--> |
| | | <!-- 下拉显示所有信息插槽--> |
| | | <template #content="{ row }"> |
| | | <ul class="expand-wrapper"> |
| | | <li v-for="(item,index) in gridOptions.columns" v-show="item.field!=undefined "> |
| | | <span style="font-weight: bold">{{ item.title + ': ' }}</span> |
| | | <span v-if="hasDecimal(item.field)">{{ |
| | | row[item.field.split('.')[0]][item.field.split('.')[1]] |
| | | }}</span> |
| | | <span v-else>{{ row[item.field] }}</span> |
| | | </li> |
| | | </ul> |
| | | </template> |
| | | <template #weight_sum="{ row }"> |
| | | <span>{{ weightSum(row) }} </span> |
| | | </template> |
| | | |
| | | <template #num1_filter="{ column, $panel }"> |
| | | <div> |
| | | <div v-for="(option, index) in column.filters" :key="index"> |
| | | <input v-model="option.data" |
| | | type="text" |
| | | @input="changeFilterEvent($event, option, $panel)"/> |
| | | </div> |
| | | </div> |
| | | </template> |
| | | </vxe-grid> |
| | | </el-aside> |
| | | </div> |
| | | </el-container> |
| | | </div> |
| | | </div> |
| | | </template> |
| | | |
| | | <style scoped> |
| | | .common-layout { |
| | | height: 100%; |
| | | * { |
| | | margin: 0; |
| | | padding: 0; |
| | | } |
| | | |
| | | .header{ |
| | | .common-layout { |
| | | width: 99%; |
| | | height: 96%; |
| | | } |
| | | |
| | | .header { |
| | | width: 100%; |
| | | height: 35px; |
| | | margin-top: -20px; |
| | |
| | | } |
| | | |
| | | |
| | | |
| | | </style> |