north-glass-erp/northglass-erp/src/hook/mouseMove.ts
@@ -399,17 +399,17 @@ // //这里需要是visibleData // let tableData = getTablexGrid().getTableData().visibleData//获取处理条件之后的全量表体数据 // let rowStart = selectionStart.rowIndex//获取选中起始行索引 // let rowEnd = selectionEnd.rowIndex//获取选中结束行索引 // let selectRows = tableData.filter((col, index: number) => {//col参数不能改否则会获取不到数据 // //这里修改从右下往左上拖动的数据显示 // if (rowStart <= rowEnd) { // return rowStart <= index && rowEnd >= index // } else { // return rowStart >= index && rowEnd <= index // } // }) let tableData = getTablexGrid().getTableData().visibleData//获取处理条件之后的全量表体数据 let rowStart = selectionStart.rowIndex//获取选中起始行索引 let rowEnd = selectionEnd.rowIndex//获取选中结束行索引 let selectRows = tableData.filter((col, index: number) => {//col参数不能改否则会获取不到数据 //这里修改从右下往左上拖动的数据显示 if (rowStart <= rowEnd) { return rowStart <= index && rowEnd >= index } else { return rowStart >= index && rowEnd <= index } }) // console.log("鼠标选中行:", JSON.stringify(selectRows)) //这里需要是visibleColumn @@ -423,13 +423,26 @@ } else { return colStart >= index && colEnd <= index } }) return { start:selectionStart.rowIndex,//开始行 end : selectionEnd.rowIndex,//结束行 cell:selectCols[0].field//选中列 let result=null if(selectRows.length===0){ return false } result = { start:selectionStart.rowIndex,//开始行 end: selectionEnd.rowIndex,//结束行 cell:selectCols[0].field,//选中列, row:selectRows } selectionStart.rowIndex=-1 selectionStart.cellIndex=-1 selectionEnd.rowIndex=-1 selectionEnd.cellIndex=-1 return result //console.log("鼠标选中列:", JSON.stringify(selectCols)) north-glass-erp/northglass-erp/src/layout/MainErpView.vue
@@ -30,6 +30,9 @@ ElMessage.warning(res.msg) router.push("/login") } }).catch((e)=>{ ElMessage.warning("服务器连接异常,请稍后再试") router.push("/login") }) //获取菜单列表 north-glass-erp/northglass-erp/src/stores/userInfo.js
@@ -4,7 +4,10 @@ export default defineStore("userInfo",{ state: () =>{ let user=ref(null) let user=ref({ userName:null, id:null }) return { user } north-glass-erp/northglass-erp/src/views/pp/processCard/ProductionScheduling.vue
@@ -396,7 +396,7 @@ const type = await VXETable.modal.confirm('您确定要删除该数据?') if (type === 'confirm') { //保存排产数据 request.post("/productionScheduling/addScheduling").then((res) => { request.post("/productionScheduling/deleteScheduling").then((res) => { if (res.code == 200) { ElMessage.success("保存成功") location.reload(); north-glass-erp/northglass-erp/src/views/pp/reportingWorks/AddReportingWork.vue
@@ -1,27 +1,32 @@ <script setup> import {reactive, ref} from "vue"; import {computed, nextTick, onMounted, reactive, ref, toRefs} from "vue"; import {useRouter} from 'vue-router' import request from "@/utils/request"; import {ElMessage} from "element-plus"; import {changeFilterEvent, filterChanged} from "@/hook" import {indexOf} from "xe-utils"; import {addListener, toolbarButtonClickEvent} from "@/hook/mouseMove"; import userInfo from "@/stores/userInfo" let brokenVisible = ref(false) const xGrid = ref() const brokenGrid =ref() let router = useRouter() const user=userInfo() //定义表头数据 const titleUploadData = ref({ //流程卡号 processId: 'NG24030501A01/1', //销售单号 orderId: '', //生产单号 productionId: '', //设备类型 deviceType: '', //班组类型 teamsType: '', deviceName: '', //班组名称 teamsgroupsName: '', //生产日期 reportingWorkDate: '', reportingWorkTime: '', //报工工序 thisProcess: '', //上工序 @@ -53,6 +58,7 @@ }) let detail = ref([]) //定义接收加载表头下拉数据 const titleSelectJson = ref({ @@ -61,6 +67,12 @@ processType: [], thisProcessType: [], mateProcessType: [], historyDevice:[], historyTeams:[], historyProcess:[], breakageType:[], breakageReason:[] }) //表尾求和 @@ -72,9 +84,7 @@ return count.toFixed(2) } const form = reactive({ processId: 'NG24022302A01/1' }) const optionVal = ref('') const options = [ @@ -106,7 +116,6 @@ ] //子组件接收参数 const gridOptions = reactive({ border: "full",//表格加边框 keepSource: true,//保持源数据 @@ -206,7 +215,7 @@ }, { field: 'breakageNumber', title: '次破数量', field: 'breakageQuantity', title: '次破数量', }, // {field: 'available', width: 80, title: '可利用', editRender: {name: 'input', attrs: {placeholder: ''}}}, @@ -259,7 +268,7 @@ // {code: 'sameDamage', name: '次破相同'}, // {code: 'sameOneCompletion', name: '完工一列相同'}, // {code: 'sameOneDamage', name: '次破一列相同'}, {code: 'print_lck', name: '保存', status: 'primary', icon: 'vxe-icon-save'}, {code: 'saveReportingWork', name: '保存', status: 'primary', icon: 'vxe-icon-save'}, {code: 'print_lck', name: '保存并审核', status: 'primary', icon: 'vxe-icon-save'}, ], // import: false, @@ -268,7 +277,6 @@ zoom: true, custom: true }, data: [],//table body实际数据 //脚部求和 // footerMethod({columns, data}) {//页脚函数 // let footList = ['', '', '', '', ''] @@ -289,18 +297,33 @@ let brokenRow = ref() const gridEvents = { toolbarButtonClick({code}) { const $grid = xGrid.value if ($grid) { switch (code) { case 'saveReportingWork': { saveReportingWork() break } } } }, cellDblclick (params) {//表格内容双击打开产品界面 const { row } = params brokenRow = row console.log(row) //brokenGrid.value.reload() //brokenVisible.value = true brokenRow.value = row if(brokenRow.value.damageDetails=== undefined){ brokenRow.value.damageDetails=[] } //brokenGrid.value.reloadData(brokenRow.damageDetail) //改变brokenVisible的值触发openedBrokenTable()方法 brokenVisible.value = true //console.log(brokenGrid.value) } } const brokenGrid =ref() const brokenGridOptions = reactive({ border: "full",//表格加边框 keepSource: true,//保持源数据 @@ -308,11 +331,11 @@ stripe: true,//斑马纹 rowConfig: {isCurrent: true, isHover: true, height: 30},//鼠标移动或选择高亮 id: 'CustomerList', showFooter: true,//显示脚 //showFooter: true,//显示脚 printConfig: {}, importConfig: {}, exportConfig: {}, scrollY: {enabled: true},//开启虚拟滚动 //scrollY: {enabled: true},//开启虚拟滚动 showOverflow: true, columnConfig: { resizable: true, @@ -330,35 +353,39 @@ showStatus: true },//表头参数 columns: [ // {type:'expand',fixed:"left",slots: { content:'content' },width: 50}, { field: 'order_number', title: '序号', filters: [{data: ''}], slots: {filter: 'num1_filter'}, filterMethod: filterChanged }, {type: 'seq',fixed:"left", title: '自序', width: 80 }, // { // field: 'order_number', // title: '序号' // }, { field: 'breakageNumber', title: '次破数量', field: 'breakageQuantity', title: '次破数量', editRender: {name: 'input', attrs: {placeholder: ''}} }, {field: 'available', title: '可利用', editRender: {name: 'input', attrs: {placeholder: ''}}}, {field: 'returnProcess', title: '退回工序', editRender: {name: 'input', attrs: {placeholder: ''}}}, {field: 'available', title: '可利用', slots: {default: 'available'} }, {field: 'returnProcess', title: '退回工序', editRender: {}, slots: {default: 'returnProcess_default', edit: 'returnProcess'} }, { field: 'reasonType', title: '次破类型', editRender: {name: 'input', attrs: {placeholder: '', type: 'selected'}} editRender: {}, slots: {default: 'reasonType_default', edit: 'reasonType'} }, { field: 'reasonDamage', title: '次破原因', editRender: {name: 'input', attrs: {placeholder: ''}} editRender: {}, slots: {default: 'reasonDamage_default', edit: 'reasonDamage'} }, { field: 'responsibleProcess', title: '责任工序', editRender: {}, slots: {default: 'reportingWordSort_default', edit: 'reportingWordSort'} //editRender: {name: 'input', attrs: {placeholder: '',type: 'selected'}}, slots: {default: 'responsibleProcess_default', edit: 'responsibleProcess'} }, { field: 'responsibleEquipment', @@ -370,7 +397,8 @@ { field: 'responsibleTeam', title: '责任班组', editRender: {name: 'input', attrs: {placeholder: ''}} editRender: {}, slots: {default: 'responsibleTeam_default', edit: 'responsibleTeam'} }, { field: 'responsibilityPersonnel', @@ -381,10 +409,47 @@ ], //表单验证 editRules: {}, editRules: { breakageQuantity: [ { validator ({ cellValue }) { const regex = /^[1-9]\d*$/ if (!regex.test(cellValue)) { return new Error('输入大于0的整数') } } } ], returnProcess:[ { validator ({ row }) { const regex = /^\s*$/i if(row.available===true && (regex.test(row.returnProcess)==='' || row.returnProcess===null)){ return new Error('可利用已选择,请选择返回工序') } } } ], reasonType: [ { required: true, message: '请选择次破类型' } ], reasonDamage: [ { required: true, message: '请选择次破原因' } ], responsibleProcess: [ { required: true, message: '请选择责任工序' } ], responsibleEquipment: [ { required: true, message: '请选择责任设备' } ], responsibleTeam: [ { required: true, message: '责任班组' } ], }, toolbarConfig: {//表头按钮 buttons: [ {code: 'print_lck', name: '添加', status: 'primary', icon: 'vxe-icon-save'}, {code: 'addRow', name: '添加', status: 'primary', icon: 'vxe-icon-square-plus'}, {code: 'removeRow', name: '删除', status: 'primary', icon: 'vxe-icon-delete'}, ], // import: false, // export: true, @@ -393,45 +458,140 @@ custom: true }, }) const brokenGridEvents = { toolbarButtonClick({code}) { const $grid = brokenGrid.value if ($grid) { switch (code) { case 'addRow': { $grid.insertAt({}) break } case 'removeRow': { let result = toolbarButtonClickEvent() if(result){ $grid.remove(result.row) } break } } } } } const openedBrokenTable = () => { addListener(brokenGrid.value,brokenGridOptions) let damage =ref(brokenRow.value.damageDetails) brokenGrid.value.reloadData(damage.value) //console.log(brokenRow.value) } const checkClose = async (done) => { const errMap = await brokenGrid.value.validate(true) if (errMap) { ElMessage.error(`校验不通过!`) return false } let breakageQuantityCount = 0 brokenRow.value.breakageQuantity=0 brokenGrid.value.getTableData().fullData.forEach((row) =>{ breakageQuantityCount+=row.breakageQuantity*1 }) let reportingWorkNum = isNaN(brokenRow.value.completedQuantity*1)?0:brokenRow.value.completedQuantity*1 if(breakageQuantityCount+reportingWorkNum>brokenRow.value.quantity*1){ ElMessage.warning(`损耗数:'${breakageQuantityCount}' 完工数:'${reportingWorkNum}'之和${breakageQuantityCount+reportingWorkNum} 不能大于${brokenRow.value.quantity*1}`) return false } breakageQuantityCount = breakageQuantityCount === 0 ? null : breakageQuantityCount brokenRow.value.breakageQuantity = breakageQuantityCount brokenRow.value.damageDetails=brokenGrid.value.getTableData().fullData done() } //第一次加载数据 request.post(`/reportingWork/selectProcess`).then((res) => { if (res.code == 200) { titleSelectJson.value.processType = res.data.process; //console.log(titleSelectJson.value.processType) } else { ElMessage.warning(res.msg) } }) const saveReportingWork = () => { titleUploadData.value.creator = user.user.userName titleUploadData.value.creatorId = user.user.id const requestData = { title:titleUploadData.value, detail:xGrid.value.getTableData().fullData } console.log(xGrid.value.getTableData().fullData) request.post(`/reportingWork/saveReportingWork`,requestData).then(res =>{ if (res.code == 200){ ElMessage.success("报工成功") } }) } //查询责任设备 const computedDevice = computed((responsibleProcess) => { return function (responsibleProcess){ return titleSelectJson.value.historyDevice.filter((item) => { return item.basic_category === responsibleProcess }) } }) // 查询责任班组 const computedResponsibleTeam = computed((responsibleProcess) => { return function (responsibleProcess){ return titleSelectJson.value.historyTeams.filter((item) => { return item.process === responsibleProcess }) } }) //判断是否点击可利用 显示返回工序 const computedReturnProcess = computed((available) => { return function (available){ if(available){ return titleSelectJson.value.historyProcess } } }) //下拉款选择工序时查询 const getWork = () => { let processId = form.processId let processId = titleUploadData.value.processId if (processId.indexOf("/") < 0) { ElMessage.success("请输入正确格式流程卡") ElMessage.warning("请输入正确格式流程卡") return } let indexOfChar = processId.indexOf("/") let leftString = processId.slice(0, indexOfChar) if (leftString.length != 13) { ElMessage.success("请输入正确位数的流程卡") ElMessage.warning("请输入正确位数的流程卡") return } //工序 let process = titleUploadData.value.thisProcess if (process == "" || process == null) { ElMessage.success("请选择工序") ElMessage.warning("请选择工序") return } if (titleSelectJson.value.thisProcessType.indexOf(process) == -1 && process != "切割" && titleSelectJson.value.thisProcessType != "") { ElMessage.success("此工序不属于该流程卡") ElMessage.warning("此工序不属于该流程卡") return } //流程卡号 @@ -443,20 +603,31 @@ if (res.code == 200) { //表头赋值 titleUploadData.value = res.data.data titleUploadData.value.processId = processId //设备下拉框 titleSelectJson.value.deviceType = res.data.device //班组下拉框 titleSelectJson.value.teamsType = res.data.teams //当前流程卡工序 titleSelectJson.value.thisProcessType = res.data.thisProcess //报工时间默认当天 const today = new Date today.setTime(today.getTime()) titleUploadData.value.reportingWorkDate = today.getFullYear() + '-' + ("0" + (today.getMonth() + 1)).slice(-2) + '-' + ("0" + today.getDate()).slice(-2) //历史班组 titleSelectJson.value.historyTeams= res.data.historyTeams //历史设备 titleSelectJson.value.historyDevice = res.data.historyDevice //历史工序 titleSelectJson.value.historyProcess = res.data.historyProcess //次破类型 titleSelectJson.value.breakageType = res.data.breakageType //次破原因 titleSelectJson.value.breakageReason = res.data.breakageReason console.log(res.data) titleUploadData.value.reportingWorkTime = formatCurrentTime() //绑定下方表格 xGrid.value.reloadData(res.data.Detail) detail.value = res.data.Detail xGrid.value.reloadData(detail.value) } else { ElMessage.warning(res.msg) } @@ -467,34 +638,45 @@ const verifyNum = () => { const $grid = xGrid.value const table = $grid.getTableData().fullData //console.log(table) let sum = 0; let sumBreak = 0; table.forEach((item) => { if (item.completedQuantity == null || item.completedQuantity == "") { item.completedQuantity = 0; } if (item.breakageNumber == null || item.breakageNumber == "") { item.breakageNumber = 0; if (item.breakageQuantity == null || item.breakageQuantity == "") { item.breakageQuantity = 0; } if (item.quantity < item.completedQuantity) { ElMessage.success("序号" + item.order_number + "的数量不能大于上工序数量") } else if (item.breakageNumber * 1 + item.completedQuantity * 1 > item.quantity * 1) { } else if (item.breakageQuantity * 1 + item.completedQuantity * 1 > item.quantity * 1) { ElMessage.success("请输入序号" + item.order_number + "正确的完工或次破数量") } sum = item.completedQuantity * 1 + sum * 1 sumBreak = item.breakageNumber * 1 + sumBreak * 1 sumBreak = item.breakageQuantity * 1 + sumBreak * 1 }) titleUploadData.value.thisCompletedQuantity = sum titleUploadData.value.thisWornQuantity = sumBreak } //获取当前时间 function formatCurrentTime() { let dateObj = new Date(); // 创建一个表示当前时间的Date对象 let year = dateObj.getFullYear(); // 年份 let month = (dateObj.getMonth() + 1).toString().padStart(2, '0'); // 月份(注意需要加上1) let day = dateObj.getDate().toString().padStart(2, '0'); // 天数 let hours = dateObj.getHours().toString().padStart(2, '0'); // 小时 let minutes = dateObj.getMinutes().toString().padStart(2, '0'); // 分钟 let seconds = dateObj.getSeconds().toString().padStart(2, '0'); // 秒数 return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`; // 返回格式化后的时间字符串 } const ptypeChangeEvent = (row) => { // for (let i = 0; i < row.length; i++){ @@ -507,7 +689,7 @@ <template> <div style="height: 100%;width: 100%"> <div id="head" style="height: 5%;width: 100%;margin-bottom: 5px"> <el-input v-model="form.processId" placeholder="流程卡号" style="width: 200px" @keyup.enter.native="getWork"/> <el-input v-model="titleUploadData.processId" placeholder="流程卡号" style="width: 200px" @keyup.enter.native="getWork"/> <el-select v-model="titleUploadData.thisProcess" clearable placeholder="请选择工序" style="width: 120px" @change="getWork"> @@ -548,8 +730,7 @@ <el-text>客户名称:</el-text> </el-col> <el-col :span="3"> <el-text class="customClass">{{ titleUploadData.order.customerName }}</el-text> <el-text class="customClass"></el-text> </el-col> <el-col :span="2"> <el-text>项目名称:</el-text> @@ -564,7 +745,7 @@ <el-text>报工设备:</el-text> </el-col> <el-col :span="3"> <el-select v-model="titleUploadData.deviceType" clearable placeholder="请选择设备"> <el-select v-model="titleUploadData.deviceName" clearable placeholder="请选择设备"> <el-option v-for="item in titleSelectJson['deviceType']" :key="item.id" @@ -606,7 +787,7 @@ <el-text>报工班组:</el-text> </el-col> <el-col :span="3"> <el-select v-model="titleUploadData.teamsType" clearable placeholder="请选择班组"> <el-select v-model="titleUploadData.teamsgroupsName" clearable placeholder="请选择班组"> <el-option v-for="item in titleSelectJson['teamsType']" :key="item.id" @@ -619,7 +800,7 @@ <el-text>班次:</el-text> </el-col> <el-col :span="3"> <el-select v-model="classesVal" class="processesSt" placeholder=""> <el-select v-model="titleUploadData.classes" class="processesSt" placeholder=""> <el-option v-for="item in classesOption" :key="item.value" @@ -640,17 +821,19 @@ </el-col> <el-col :span="3"> <el-date-picker v-model="titleUploadData.reportingWorkDate" v-model="titleUploadData.reportingWorkTime" format="YYYY-MM-DD HH:mm:ss" value-format="YYYY-MM-DD HH:mm:ss" placeholder="" style="width: 100%" type="date" type="datetime" /> </el-col> <el-col :span="2"> <el-text>备注:</el-text> </el-col> <el-col :span="3"> <el-input v-model="titleUploadData.notes" placeholder="" /> </el-col> </el-row> @@ -667,24 +850,7 @@ @edit-closed="verifyNum" > <!-- 责任工序--> <template #reportingWordSort="{ row }"> <vxe-select v-model="row.responsibleProcess" transfer @change="ptypeChangeEvent(row)"> <vxe-option v-for="item in titleSelectJson.thisProcessType" :key="item" :label="item" :value="item"/> </vxe-select> </template> <template #reportingWordSort_default="{ row }"> <span>{{ row.responsibleProcess }}</span> </template> <!-- 责任设备 --> <template #reportingDeviceSort="{ row }"> <vxe-select v-model="row.responsibleEquipment" transfer> <vxe-option v-for="item in titleSelectJson.mateProcessType" :key="item" :label="item" :value="item"/> </vxe-select> </template> <template #reportingDeviceSort_default="{ row }"> <span>{{ row.responsibleEquipment }}</span> </template> <template #num1_filter="{ column, $panel }"> <div> @@ -696,8 +862,109 @@ </vxe-grid> <el-dialog v-model="brokenVisible" title="破损列表" style="width: 80%;height:75% "> <vxe-grid ref="brokenGrid" v-bind="brokenGridOptions"> <el-dialog @opened="openedBrokenTable" :before-close="checkClose" v-model="brokenVisible" :close-on-click-modal="false" :close-on-press-escape="false" title="破损列表" style="width: 80%;height:75% "> <vxe-grid height="400px" ref="brokenGrid" class="mytable-scrollbar" v-bind="brokenGridOptions" v-on="brokenGridEvents"> <!-- 返回工序--> <template #returnProcess="{ row }"> <vxe-select v-model="row.returnProcess" filterable clearable placeholder="" > <vxe-option v-for="item in computedReturnProcess(row.available)" :key="item.basic_category" :label="item.basic_category" :value="item.basic_category"/> </vxe-select> </template> <template #returnProcess_default="{ row }"> <span>{{ row.returnProcess }}</span> </template> <!-- 责任工序--> <template #responsibleProcess="{ row }"> <vxe-select v-model="row.responsibleProcess" filterable clearable placeholder="" > <vxe-option v-for="item in titleSelectJson.historyProcess" :key="item.basic_category" :label="item.basic_category" :value="item.basic_category"/> </vxe-select> </template> <template #responsibleProcess_default="{ row }"> <span>{{ row.responsibleProcess }}</span> </template> <!-- 刺破类型reasonType --> <template #reasonType="{ row }"> <vxe-select v-model="row.reasonType " filterable clearable placeholder=""> <vxe-option v-for="item in titleSelectJson.breakageType" :key="item.id" :label="item.basic_name" :value="item.basic_name"/> </vxe-select> </template> <template #reasonType_default="{ row }"> <span>{{ row.reasonType }}</span> </template> <!--次破原因--> <template #reasonDamage="{ row }"> <vxe-select v-model="row.reasonDamage " filterable clearable placeholder=""> <vxe-option v-for="item in titleSelectJson.breakageReason" :key="item.id" :label="item.basic_name" :value="item.basic_name"/> </vxe-select> </template> <template #reasonDamage_default="{ row }"> <span>{{ row.reasonDamage }}</span> </template> <!-- 责任设备 --> <template #reportingDeviceSort="{ row }"> <vxe-select v-model="row.responsibleEquipment" filterable clearable placeholder=""> <vxe-option v-for="item in computedDevice(row.responsibleProcess)" :key="item.id" :label="item.basic_name" :value="item.basic_name"/> </vxe-select> </template> <template #reportingDeviceSort_default="{ row }"> <span>{{ row.responsibleEquipment }}</span> </template> <!-- 责任设备 --> <template #responsibleTeam="{ row }"> <vxe-select v-model="row.responsibleTeam" filterable clearable placeholder=""> <vxe-option v-for="item in computedResponsibleTeam(row.responsibleProcess)" :key="item.id" :label="item.basic_name" :value="item.basic_name"/> </vxe-select> </template> <template #responsibleTeam_default="{ row }"> <span>{{ row.responsibleTeam }}</span> </template> <!-- 可利用 --> <template #available="{ row }"> <el-checkbox v-model="row.available" /> </template> </vxe-grid> </el-dialog> @@ -768,5 +1035,12 @@ text-align: center; border: #181818 1px solid; } .vxe-grid { /* 禁用浏览器默认选中 */ -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; } </style> north-glass-erp/northglass-erp/src/views/sd/order/CreateOrder.vue
@@ -141,7 +141,7 @@ price: [ { validator ({ cellValue }) { const regex = /^(0|[1-9][0-9]{0,4}([.][0-9]{1,2})?)$/ const regex = /^(0(\.\d{1,2})?|([1-9]\d{0,4})(\.\d{1,2})?|99999(\.9{1,2})?)$/ if ( !regex.test(cellValue) ) { return new Error('输入0.00~99999.99的数字') } @@ -151,7 +151,7 @@ computeArea: [ { validator ({ cellValue }) { const regex = /^(0|[1-9][0-9]{0,4}([.][0-9]{1,2})?)$/ const regex = /^(0(\.\d{1,2})?|([1-9]\d{0,4})(\.\d{1,2})?|99999(\.9{1,2})?)$/ if (!regex.test(cellValue)) { return new Error('输入0.00~99999.99的数字') } @@ -171,7 +171,7 @@ width:[ { validator ({ cellValue }) { const regex = /^(0|[1-9][0-9]{0,4}([.][0-9]{1,2})?)$/ const regex = /^(0(\.\d{1,2})?|([1-9]\d{0,4})(\.\d{1,2})?|99999(\.9{1,2})?)$/ if (!regex.test(cellValue)) { return new Error('输入0.00~99999.99的数字') } @@ -391,6 +391,11 @@ } //获取子页面产品方法 const getProductRow = (row) => { if(row.state!=1){ ElMessage.warning('该产品还未审核') return } rowIndex.productName = row.productName rowIndex.productId = row.id productVisible.value = false north-glass-erp/src/main/java/com/example/erp/controller/pp/ProductionSchedulingController.java
@@ -64,4 +64,16 @@ } } //添加排产数据 @PostMapping("/deleteScheduling") public Result DeleteScheduling( @RequestBody Map<String,Object> object){ if(productionSchedulingService.AddSchedulingSv(object)){ return Result.seccess(); }else { throw new ServiceException(Constants.Code_500,"保存失败"); } } } north-glass-erp/src/main/java/com/example/erp/controller/pp/ReportingWorkController.java
@@ -29,5 +29,10 @@ return Result.seccess(reportingWorkService.SelectProcessSv()); } @PostMapping ("/saveReportingWork") public Result SaveReportingWork(@RequestBody Map<String,Object> reportingWork) { return Result.seccess(reportingWorkService.SaveReportingWorkSv(reportingWork)); } } north-glass-erp/src/main/java/com/example/erp/entity/pp/ReportingWork.java
@@ -1,11 +1,14 @@ package com.example.erp.entity.pp; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.example.erp.entity.sd.Order; import lombok.Data; import java.time.LocalDate; import java.time.LocalDateTime; @Data public class ReportingWork { @TableId(type = IdType.AUTO) @@ -56,7 +59,7 @@ //包装方式 private String packagingMethod; //报工时间 private LocalDate reportingWorkTime; private LocalDateTime reportingWorkTime; //审核时间 private LocalDate examineTime; //质检时间 @@ -66,11 +69,18 @@ //修改时间 private LocalDate updateTime; //创建者 private String creatorId ; private String creator ; @TableField(select = false,exist= false) private Order order; //外键流程卡表 @TableField(select = false,exist= false) private FlowCard flowCard; private ReportingWork reportingWork; // @TableField(select = false,exist= false) // private ReportingWork reportingWork; @TableField(select = false,exist= false) private ReportingWorkDetail reportingWorkDetail; } north-glass-erp/src/main/java/com/example/erp/entity/pp/ReportingWorkDetail.java
@@ -1,14 +1,19 @@ package com.example.erp.entity.pp; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.example.erp.entity.sd.Order; import com.example.erp.entity.sd.OrderDetail; import com.example.erp.entity.sd.OrderGlassDetail; import lombok.Data; import java.time.LocalDate; import java.util.List; @Data public class ReportingWorkDetail { @TableId(type = IdType.AUTO) //自增ID private Integer id; //报工编号 @@ -62,13 +67,22 @@ //返工更新时间 private LocalDate reworkUpdateTime; //返工面积 private double reworkArea; // private double reworkArea; //次破列表 @TableField(select = false,exist= false) private List<DamageDetails> damageDetails; //外键报工主表 @TableField(select = false,exist= false) private ReportingWork reportingWork; @TableField(select = false,exist= false) private Order order; @TableField(select = false,exist= false) private OrderDetail orderDetail; @TableField(select = false,exist= false) private OrderGlassDetail orderGlassDetail; } north-glass-erp/src/main/java/com/example/erp/mapper/pp/DamageDetailsMapper.java
New file @@ -0,0 +1,9 @@ package com.example.erp.mapper.pp; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.example.erp.entity.pp.DamageDetails; import org.apache.ibatis.annotations.Mapper; @Mapper public interface DamageDetailsMapper extends BaseMapper<DamageDetails> { } north-glass-erp/src/main/java/com/example/erp/mapper/pp/ReportingWorkDetailMapper.java
@@ -1,6 +1,7 @@ package com.example.erp.mapper.pp; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.example.erp.entity.pp.ReportingWorkDetail; import com.example.erp.entity.pp.Rework; import org.apache.ibatis.annotations.Mapper; @@ -9,7 +10,7 @@ import java.util.List; @Mapper public interface ReportingWorkDetailMapper { public interface ReportingWorkDetailMapper extends BaseMapper<ReportingWorkDetail> { /*List<ReportingWorkDetail> getDetail();*/ /*查询返工新增数据*/ north-glass-erp/src/main/java/com/example/erp/mapper/pp/ReportingWorkMapper.java
@@ -1,4 +1,5 @@ package com.example.erp.mapper.pp; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.example.erp.entity.pp.BasicDataProduce; import com.example.erp.entity.pp.ReportingWork; import com.example.erp.entity.pp.ReportingWorkDetail; @@ -10,7 +11,7 @@ import java.util.Map; @Mapper public interface ReportingWorkMapper { public interface ReportingWorkMapper extends BaseMapper<ReportingWork> { ReportingWork AddSelectLastWorkMp(String processIdStr, String technologyStr,String previousProcess,String nextProcess,String process); @@ -28,4 +29,16 @@ List<Map<String,String>> SelectReworlDetailMp(String processIdStr, String technologyStr, String previousProcess); List<Map<String,String>> SelectProcessMp(); String historyProcessMp(String processIdStr); List<Map<String,String>> historyDeviceMp(String historyProcess, String process); List<Map<String,String>> historyTeamsMp(String processIdStr, String process); List<Map<String,String>> SelectHistoryProcessMp(String historyProcess, String process); List<Map<String,BasicDataProduce>> selectBasicNameByType(String type); Integer selectMaxReportingWorkId(); } north-glass-erp/src/main/java/com/example/erp/service/pp/ReportingWorkService.java
@@ -1,23 +1,47 @@ package com.example.erp.service.pp; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.example.erp.entity.pp.DamageDetails; import com.example.erp.entity.pp.ReportingWork; import com.example.erp.entity.pp.ReportingWorkDetail; import com.example.erp.entity.sd.Order; import com.example.erp.entity.sd.OrderDetail; import com.example.erp.entity.sd.OrderProcessDetail; import com.example.erp.mapper.pp.BasicDateProduceMapper; import com.example.erp.mapper.pp.DamageDetailsMapper; import com.example.erp.mapper.pp.ReportingWorkDetailMapper; import com.example.erp.mapper.pp.ReportingWorkMapper; import com.baomidou.dynamic.datasource.annotation.DS; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; @Service @DS("pp") public class ReportingWorkService { @Autowired final ReportingWorkMapper reportingWorkMapper; final BasicDateProduceMapper basicDateProduceMapper; final DamageDetailsMapper damageDetailsMapper; final ReportingWorkDetailMapper reportingWorkDetailMapper; public ReportingWorkService(ReportingWorkMapper reportingWorkMapper, BasicDateProduceMapper basicDateProduceMapper, DamageDetailsMapper damageDetailsMapper, ReportingWorkDetailMapper reportingWorkDetailMapper) { this.reportingWorkMapper = reportingWorkMapper; this.basicDateProduceMapper = basicDateProduceMapper; this.damageDetailsMapper = damageDetailsMapper; this.reportingWorkDetailMapper = reportingWorkDetailMapper; } public Map<String, Object> AddSelectLastWorkSv(String processIdStr, String technologyStr, String process) { Map<String, Object> map = new HashMap<>(); @@ -52,32 +76,31 @@ } //System.out.println("当前工序:" + process + " 上一道工序:" + previousProcess + " 下一道工序:" + nextProcess); //查询当前工序的表头数据 System.out.println(reportingWorkMapper.AddSelectLastWorkMp(processIdStr, technologyStr,previousProcess,nextProcess,process)); map.put("data", reportingWorkMapper.AddSelectLastWorkMp(processIdStr, technologyStr,previousProcess,nextProcess,process)); map.put("thisProcess", processList); break; } } //设备下拉框 map.put("device", reportingWorkMapper.SelectWorkBasicDeviceMp(process)); //班组下拉框 map.put("teams", reportingWorkMapper.SelectWorkBasicTeamsMp(process)); map.put("breakageType",reportingWorkMapper.selectBasicNameByType("breakagetype")); map.put("breakageReason",reportingWorkMapper.selectBasicNameByType("breakagereason")); //查询本工序报工需要哪几层,上工序是什么 String obtainTechnology = reportingWorkMapper.SelectWorkTechnologyMp(processIdStr); //判断本工序是不是第一道工序 if (interceptProcess.equals(process)) { //是第一道工序,查询流程卡数据 map.put("Detail", reportingWorkMapper.SelectTechnologicalNumMp(processIdStr,technologyStr)); } else { //不是第一道工序,查询报工数据 map.put("Detail", reportingWorkMapper.SelectReworlDetailMp(processIdStr,technologyStr,previousProcess)); } @@ -85,8 +108,18 @@ // 后续工序(上工序报工数-完工数-次破数-返工未完成数) return map; //获取该流程卡号历史报工工序 String historyProcess =reportingWorkMapper.historyProcessMp(processIdStr); //历史报工工序设备 map.put("historyDevice",reportingWorkMapper.historyDeviceMp(historyProcess,process)); //历史报工工序班组 map.put("historyTeams",reportingWorkMapper.historyTeamsMp(processIdStr,process)); //历史工序 map.put("historyProcess",reportingWorkMapper.SelectHistoryProcessMp(historyProcess,process)); return map; } public Map<String, Object> SelectProcessSv() { @@ -94,4 +127,41 @@ map.put("process", reportingWorkMapper.SelectProcessMp()); return map; } public boolean SaveReportingWorkSv(Map<String, Object> reportingWorkMap) { JSONObject reportingWorkJson = new JSONObject(reportingWorkMap); ReportingWork reportingWork = JSONObject.parseObject(JSONObject.toJSONString(reportingWorkJson.get("title")), ReportingWork.class); List<ReportingWorkDetail> reportingWorkDetails = JSONArray.parseArray(JSONObject.toJSONString(reportingWorkJson.get("detail")), ReportingWorkDetail.class); //System.out.println(reportingWork); String formattedNumber = String.format("%04d", reportingWorkMapper.selectMaxReportingWorkId()+1); //格式化当前日期 Date currentDate = new Date(); SimpleDateFormat dateFormat = new SimpleDateFormat("yyMMdd"); String formattedDate = dateFormat.format(currentDate); String reportingWorkId = "BG"+formattedDate+formattedNumber; reportingWork.setReportingWorkId(reportingWorkId); reportingWork.setProcessId(reportingWork.getProcessId().substring(0,13)); reportingWorkMapper.insert(reportingWork); reportingWorkDetails.forEach(reportingWorkDetail -> { reportingWorkDetail.setReportingWorkId(reportingWorkId); List<DamageDetails> damageDetails = reportingWorkDetail.getDamageDetails(); if(damageDetails!=null && !damageDetails.isEmpty()){ damageDetails.forEach(damageDetail ->{ damageDetail.setReportingWorkId(reportingWorkId); damageDetail.setOrderNumber(reportingWorkDetail.getOrderNumber()); damageDetail.setProcessId(reportingWork.getProcessId()); damageDetail.setTechnologyNumber(reportingWorkDetail.getTechnologyNumber()); damageDetailsMapper.insert(damageDetail); }); } //System.out.println(reportingWorkDetail); reportingWorkDetailMapper.insert(reportingWorkDetail); }); return false; } } north-glass-erp/src/main/resources/mapper/pp/ReportingWork.xml
@@ -135,4 +135,74 @@ </select> <select id="historyProcessMp"> select ifnull(GROUP_CONCAT(distinct rw.this_process),"") from reporting_work as rw where rw.process_id=#{processIdStr} </select> <select id="historyDeviceMp"> SELECT bdp.id, bdp.basic_type, bdp.basic_name, bd.basic_name AS basic_category FROM sd.basic_data AS bd LEFT JOIN `basic_data_produce` AS bdp ON bd.id = bdp.basic_category WHERE bd.basic_category = 'process' AND bdp.basic_type = 'device' AND POSITION(bd.basic_name in CONCAT(#{historyProcess},#{process})) </select> <select id="historyTeamsMp"> SELECT bdp.id, bdp.basic_type, bdp.basic_name, bd.basic_name,bd.id AS basic_category, rw.process FROM sd.basic_data AS bd LEFT JOIN `basic_data_produce` AS bdp ON bd.id = bdp.basic_category right join ( select distinct process from ( select distinct rw.this_process as process from reporting_work as rw where rw.process_id=#{processIdStr} UNION select #{process} ) as t ) as rw on rw.process=bd.basic_name WHERE bdp.basic_type = 'teamsgroups' </select> <select id="SelectHistoryProcessMp"> SELECT distinct bd.basic_name AS basic_category FROM sd.basic_data AS bd LEFT JOIN `basic_data_produce` AS bdp ON bd.id = bdp.basic_category WHERE bd.basic_category = "process" AND bdp.basic_type = "teamsgroups" AND POSITION(bd.basic_name in CONCAT(#{historyProcess},#{process})) </select> <select id="selectBasicNameByType"> select * from `basic_data_produce` as a where a.basic_type = #{type} </select> <select id="selectMaxReportingWorkId"> select ifnull(SUBSTR(max(reporting_work_id) from 9),0) from reporting_work as a where date(a.create_time) = curdate() order by id desc,reporting_work_id desc limit 1 </select> </mapper> north-glass-erp/src/main/resources/mapper/sd/OrderMapper.xml
@@ -5,11 +5,12 @@ <mapper namespace="com.example.erp.mapper.sd.OrderMapper"> <select id="selectMaxOrderId"> select COUNT(a.order_id) ifnull(SUBSTR(max(order_id) from 9),0) from `order` as a where date(a.create_time) = curdate() order by id desc,order_id desc limit 1 </select> north-glass-erp/target/classes/mapper/pp/ReportingWork.xml
@@ -135,4 +135,74 @@ </select> <select id="historyProcessMp"> select ifnull(GROUP_CONCAT(distinct rw.this_process),"") from reporting_work as rw where rw.process_id=#{processIdStr} </select> <select id="historyDeviceMp"> SELECT bdp.id, bdp.basic_type, bdp.basic_name, bd.basic_name AS basic_category FROM sd.basic_data AS bd LEFT JOIN `basic_data_produce` AS bdp ON bd.id = bdp.basic_category WHERE bd.basic_category = 'process' AND bdp.basic_type = 'device' AND POSITION(bd.basic_name in CONCAT(#{historyProcess},#{process})) </select> <select id="historyTeamsMp"> SELECT bdp.id, bdp.basic_type, bdp.basic_name, bd.basic_name,bd.id AS basic_category, rw.process FROM sd.basic_data AS bd LEFT JOIN `basic_data_produce` AS bdp ON bd.id = bdp.basic_category right join ( select distinct process from ( select distinct rw.this_process as process from reporting_work as rw where rw.process_id=#{processIdStr} UNION select #{process} ) as t ) as rw on rw.process=bd.basic_name WHERE bdp.basic_type = 'teamsgroups' </select> <select id="SelectHistoryProcessMp"> SELECT distinct bd.basic_name AS basic_category FROM sd.basic_data AS bd LEFT JOIN `basic_data_produce` AS bdp ON bd.id = bdp.basic_category WHERE bd.basic_category = "process" AND bdp.basic_type = "teamsgroups" AND POSITION(bd.basic_name in CONCAT(#{historyProcess},#{process})) </select> <select id="selectBasicNameByType"> select * from `basic_data_produce` as a where a.basic_type = #{type} </select> <select id="selectMaxReportingWorkId"> select ifnull(SUBSTR(max(reporting_work_id) from 9),0) from reporting_work as a where date(a.create_time) = curdate() order by id desc,reporting_work_id desc limit 1 </select> </mapper> north-glass-erp/target/classes/mapper/sd/OrderMapper.xml
@@ -5,11 +5,12 @@ <mapper namespace="com.example.erp.mapper.sd.OrderMapper"> <select id="selectMaxOrderId"> select COUNT(a.order_id) ifnull(SUBSTR(max(order_id) from 9),0) from `order` as a where date(a.create_time) = curdate() order by id desc,order_id desc limit 1 </select>