<script setup>
|
import {computed, nextTick, onMounted, reactive, ref, toRefs} from "vue";
|
import {useRouter,useRoute} 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"
|
import { useI18n } from 'vue-i18n'
|
//语言获取
|
const { t } = useI18n()
|
let brokenVisible = ref(false)
|
const xGrid = ref()
|
const brokenGrid =ref()
|
const router = useRouter()
|
const route = useRoute()
|
const user=userInfo()
|
//定义表头数据
|
const titleUploadData = ref({
|
reportingWorkId: null,
|
//流程卡号
|
processId: '',
|
//销售单号
|
orderId: '',
|
reviewedState:0,
|
//生产单号
|
productionId: '',
|
//设备类型
|
deviceName: '',
|
//班组名称
|
teamsGroupsName: '',
|
//生产日期
|
reportingWorkTime: '',
|
//报工工序
|
thisProcess: '',
|
//上工序
|
previousProcess: '',
|
//下工序
|
nextProcess: '',
|
//备注
|
notes: '',
|
//本工序完工数
|
thisCompletedQuantity: '',
|
//本工序报废数
|
thisWornQuantity: '',
|
//班次
|
classes: '',
|
//责任工序
|
responsibleProcess: '',
|
order: {
|
//客户编号
|
customerId: '',
|
//客户名称
|
customerName: '',
|
//项目名称
|
project: '',
|
},
|
flowCard: {
|
//可报工数量
|
quantity: ''
|
},
|
|
|
})
|
let detail = ref([])
|
|
//定义接收加载表头下拉数据
|
const titleSelectJson = ref({
|
deviceType: [],
|
teamsType: [],
|
processType: [],
|
thisProcessType: [],
|
mateProcessType: [],
|
historyDevice:[],
|
historyTeams:[],
|
historyProcess:[],
|
breakageType:[],
|
breakageReason:[]
|
|
})
|
|
let inputDisabled = ref(false)
|
onMounted(() =>{
|
if(route.query.processId !== undefined && route.query.processId!=='' && route.query.processId!=null ){
|
titleUploadData.value.processId = route.query.processId
|
}
|
//route.query.reportingWorkId = 'BG2403150004'
|
//判断是否传入报工编号
|
if(route.query.reportingWorkId !== '' && route.query.reportingWorkId!=null){
|
request.post(`reportingWork/selectUpdateReportingWork/${route.query.reportingWorkId}`).then(res=>{
|
if(res.code === '200'){
|
titleUploadData.value = res.data.reportingWork
|
titleSelectJson.value = res.data.basic
|
xGrid.value.reloadData(res.data.reportingWorkDetails)
|
let button = {
|
code: 'update',
|
name: '修改',
|
status: 'primary',
|
}
|
if(route.query.reviewStatus === "1"){
|
button.name='审核'
|
titleUploadData.value.qualityInspector=user.user.userName
|
}
|
|
gridOptions.toolbarConfig.buttons.push(button)
|
}
|
inputDisabled.value = true
|
})
|
}
|
})
|
|
const data = [{id:1,num:2},{id:1,num:3},{id:2,num:2},{id:1,num:2}];
|
|
|
//表尾求和
|
const sumNum = (list, field) => {
|
let count = 0
|
list.forEach(item => {
|
count += Number(item[field])
|
})
|
return count.toFixed(2)
|
}
|
|
|
|
const optionVal = ref('')
|
|
//班次
|
const classesVal = ref('早班')
|
const classesOption = [
|
{
|
value: '早班',
|
label: '早班',
|
},
|
{
|
value: '晚班',
|
label: '晚班',
|
},
|
]
|
|
|
const gridOptions = reactive({
|
border: "full",//表格加边框
|
keepSource: true,//保持源数据
|
align: 'center',//文字居中
|
stripe: true,//斑马纹
|
rowConfig: {isCurrent: true, isHover: true, height: 30},//鼠标移动或选择高亮
|
id: 'CustomerList',
|
showFooter: true,//显示脚
|
printConfig: {},
|
importConfig: {},
|
exportConfig: {},
|
scrollY: {enabled: true},//开启虚拟滚动
|
showOverflow: true,
|
columnConfig: {
|
resizable: true,
|
useKey: true
|
},
|
filterConfig: { //筛选配置项
|
// remote: true
|
},
|
customConfig: {
|
storage: true
|
},
|
editConfig: {
|
trigger: 'click',
|
mode: 'row',
|
showStatus: true
|
},//表头参数
|
columns: [
|
// {type:'expand',fixed:"left",slots: { content:'content' },width: 50},
|
{
|
field: 'order_number',
|
title: t('order.OrderNum'),
|
filters: [{data: ''}],
|
slots: {filter: 'num1_filter'},
|
filterMethod: filterChanged
|
},
|
{
|
field: 'glass_child',
|
title: t('reportingWorks.glassChild'),
|
showOverflow: "ellipsis",
|
filters: [{data: ''}],
|
slots: {filter: 'num1_filter'},
|
filterMethod: filterChanged
|
},
|
{
|
field: 'technology_number',
|
title: t('processCard.technologyNumber'),
|
filters: [{data: ''}],
|
slots: {filter: 'num1_filter'},
|
filterMethod: filterChanged
|
},
|
{
|
field: 'glass_address',
|
title: t('reportingWorks.glassAddress'),
|
filters: [{data: ''}],
|
slots: {filter: 'num1_filter'},
|
filterMethod: filterChanged
|
},
|
{
|
field: 'quantity_card',
|
title: t('reportingWorks.numberProcessCards'),
|
filters: [{data: ''}],
|
slots: {filter: 'num1_filter'},
|
showOverflow: "ellipsis",
|
filterMethod: filterChanged
|
},
|
{
|
field: 'child_width',
|
title: t('order.width'),
|
filters: [{data: ''}],
|
slots: {filter: 'num1_filter'},
|
filterMethod: filterChanged
|
},
|
{
|
field: 'child_height',
|
title: t('order.height'),
|
filters: [{data: ''}],
|
slots: {filter: 'num1_filter'},
|
filterMethod: filterChanged
|
},
|
{
|
field: 'shape',
|
title: t('order.shape'),
|
filters: [{data: ''}],
|
slots: {filter: 'num1_filter'},
|
showOverflow: "ellipsis",
|
filterMethod: filterChanged
|
},
|
{field: 'quantity', title: t('reportingWorks.reportableQuantityOk'),},
|
{
|
field: 'completedQuantity', title: t('reportingWorks.completedQuantity'),width: 120,
|
editRender: {
|
name: 'input',
|
attrs: {placeholder: ''}
|
},
|
|
},
|
{
|
field: 'breakageQuantity', title: t('reportingWorks.quantityBroken'),
|
},
|
{field: 'completed', width: 90, title:t('reportingWorks.completed'),},
|
{field: 'onceBroken', width: 90, title: t('reportingWorks.onceBroken'),},
|
|
],
|
//表单验证
|
editRules: {
|
completedQuantity: [
|
{
|
validator ({ row }) {
|
const regex = /^[0-9]\d*$/
|
const brokenNum =
|
(row.breakageQuantity === undefined || row.breakageQuantity===null) ? 0 : row.breakageQuantity
|
if (row.completedQuantity && !regex.test(row.completedQuantity)) {
|
return new Error('请输入整数,并且大于等于0')
|
}else if((row.completedQuantity*1+brokenNum*1)>row.quantity*1){
|
return new Error((`${row.completedQuantity}+${brokenNum}>${row.quantity}`))
|
}
|
if(titleUploadData.value.reportingWorkId!=null && row.completedQuantity<row.minQuantity){
|
return new Error(`请输入大于等于${row.minQuantity}的数字`)
|
}
|
|
}
|
}
|
]
|
},
|
toolbarConfig: {//表头按钮
|
buttons: [
|
// {code: 'empty', name: '清空报工数量'},
|
// {code: 'sameCompletion', name: '完工相同'},
|
// {code: 'sameDamage', name: '次破相同'},
|
// {code: 'sameOneCompletion', name: '完工一列相同'},
|
// {code: 'sameOneDamage', name: '次破一列相同'},
|
{code: 'saveReportingWork', name: t('basicData.save'), status: 'primary', icon: 'vxe-icon-save',disabled:true},
|
{code: 'saveReportingWorkReview', name: t('reportingWorks.saveAndReview'), status: 'primary', icon: 'vxe-icon-save',disabled:true},
|
],
|
// import: false,
|
// export: true,
|
// print: true,
|
zoom: true,
|
custom: true
|
},
|
//脚部求和
|
footerMethod({columns, data}) {//页脚函数
|
let footList = ['', '', '', '', '']
|
return [
|
columns.map((column, columnIndex) => {
|
if (columnIndex === 0) {
|
return t('basicData.total')
|
}
|
return ''
|
})
|
]
|
}
|
|
})
|
|
let brokenRow = ref({
|
glass_child:'',
|
order_number:'',
|
technology_number:''
|
|
})
|
const gridEvents = {
|
async toolbarButtonClick({code}) {
|
const $grid = xGrid.value
|
if ($grid) {
|
switch (code) {
|
case 'saveReportingWork': {
|
const errMap = await $grid.validate(true)
|
if (errMap) {
|
ElMessage.error(`校验不通过!`)
|
return
|
}
|
saveReportingWork(0,'save')
|
break
|
}
|
case 'saveReportingWorkReview': {
|
const errMap = await $grid.validate(true)
|
if (errMap) {
|
ElMessage.error(`校验不通过!`)
|
return
|
}
|
saveReportingWork(1,'save')
|
break
|
}
|
case 'update': {
|
const errMap = await $grid.validate(true)
|
if (errMap) {
|
ElMessage.error(`校验不通过!`)
|
return
|
}
|
saveReportingWork(0,'update')
|
break
|
}
|
}
|
}
|
},
|
cellDblclick (params) {//表格内容双击打开产品界面
|
const { row } = params
|
brokenRow.value = row
|
if(brokenRow.value.damageDetails=== undefined){
|
brokenRow.value.damageDetails=[]
|
}
|
//brokenGrid.value.reloadData(brokenRow.damageDetail)
|
//改变brokenVisible的值触发openedBrokenTable()方法
|
brokenVisible.value = true
|
|
}
|
}
|
|
|
|
const brokenGridOptions = reactive({
|
border: "full",//表格加边框
|
keepSource: true,//保持源数据
|
align: 'center',//文字居中
|
stripe: true,//斑马纹
|
rowConfig: {isCurrent: true, isHover: true, height: 30},//鼠标移动或选择高亮
|
id: 'CustomerList',
|
//showFooter: true,//显示脚
|
printConfig: {},
|
importConfig: {},
|
exportConfig: {},
|
//scrollY: {enabled: true},//开启虚拟滚动
|
showOverflow: true,
|
columnConfig: {
|
resizable: true,
|
useKey: true
|
},
|
filterConfig: { //筛选配置项
|
// remote: true
|
},
|
customConfig: {
|
storage: true
|
},
|
editConfig: {
|
trigger: 'click',
|
mode: 'row',
|
showStatus: true
|
},//表头参数
|
columns: [
|
{type: 'seq',fixed:"left", title: t('basicData.Number'), width: 80 },
|
// {
|
// field: 'order_number',
|
// title: '序号'
|
// },
|
|
{
|
field: 'breakageQuantity',
|
title: t('reportingWorks.quantityBroken'),
|
editRender: {name: 'input', attrs: {placeholder: ''}}
|
},
|
{field: 'available',
|
title: t('reportingWorks.available'),
|
slots: {default: 'available'}
|
},
|
{field: 'returnProcess', title: t('reportingWorks.returnProcess'),
|
editRender: {},
|
slots: {default: 'returnProcess_default', edit: 'returnProcess'}
|
},
|
{
|
field: 'breakageType', title: t('reportingWorks.breakageType'),
|
editRender: {},
|
slots: {default: 'breakageType_default', edit: 'breakageType'}
|
},
|
{
|
field: 'breakageReason', title: t('reportingWorks.breakageReason'),
|
editRender: {},
|
slots: {default: 'breakageReason_default', edit: 'breakageReason'}
|
},
|
{
|
field: 'responsibleProcess', title: t('reportingWorks.responsibleProcess'),
|
editRender: {},
|
slots: {default: 'responsibleProcess_default', edit: 'responsibleProcess'}
|
},
|
{
|
field: 'responsibleEquipment',
|
title: t('reportingWorks.responsibleEquipment'),
|
editRender: {},
|
slots: {default: 'reportingDeviceSort_default', edit: 'reportingDeviceSort'}
|
// editRender: {name: 'input', attrs: {placeholder: ''}}
|
},
|
|
{
|
field: 'responsibleTeam', title: t('reportingWorks.responsibleTeam'),
|
editRender: {},
|
slots: {default: 'responsibleTeam_default', edit: 'responsibleTeam'}
|
},
|
{
|
field: 'responsiblePersonnel',
|
title: t('reportingWorks.responsiblePersonnel'),
|
editRender: {name: 'input', attrs: {placeholder: ''}}
|
|
},
|
|
],
|
//表单验证
|
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('可利用已选择,请选择返回工序')
|
}
|
}
|
}
|
],
|
breakageType: [
|
{ required: true, message: '请选择次破类型' }
|
],
|
breakageReason: [
|
{ required: true, message: '请选择次破原因' }
|
],
|
responsibleProcess: [
|
{ required: true, message: '请选择责任工序' }
|
],
|
responsibleEquipment: [
|
{ required: true, message: '请选择责任设备' }
|
],
|
responsibleTeam: [
|
{ required: true, message: '责任班组' }
|
],
|
},
|
toolbarConfig: {//表头按钮
|
buttons: [
|
{code: 'addRow', name: t('reportingWorks.increase'), status: 'primary', icon: 'vxe-icon-square-plus'},
|
{code: 'removeRow', name: t('basicData.delete'), status: 'primary', icon: 'vxe-icon-delete'},
|
],
|
// import: false,
|
// export: true,
|
// print: true,
|
zoom: true,
|
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)
|
}
|
|
|
const checkClose = async (done) => {
|
if(brokenGrid.value.getTableData().fullData.length===0){
|
done()
|
return true
|
}
|
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>brokenRow.value.quantity*1) ){
|
ElMessage.warning(`损耗数:'${breakageQuantityCount}'
|
不能大于${brokenRow.value.quantity*1}`)
|
return false
|
}
|
brokenRow.value.completedQuantity = brokenRow.value.quantity-breakageQuantityCount
|
breakageQuantityCount = breakageQuantityCount === 0 ? null : breakageQuantityCount
|
brokenRow.value.breakageQuantity = breakageQuantityCount
|
brokenRow.value.damageDetails=brokenGrid.value.getTableData().fullData
|
// xGrid.value.getTableData().fullData.forEach(
|
//
|
// )
|
const equalByOrderNum = xGrid.value.getTableData().fullData.filter((row) =>{
|
return row.order_number === brokenRow.value.order_number
|
})
|
const maxQuantity = Math.max(...equalByOrderNum.map(item =>item.breakageQuantity || 0))
|
equalByOrderNum.forEach((row) =>{
|
row.completedQuantity= brokenRow.value.quantity*1-maxQuantity
|
})
|
|
|
getQuantity()
|
|
done()
|
}
|
|
|
//第一次加载数据
|
|
request.post(`/reportingWork/selectProcess`).then((res) => {
|
if (res.code == 200) {
|
titleSelectJson.value.processType = res.data.process;
|
} else {
|
ElMessage.warning(res.msg)
|
}
|
})
|
|
function checkSameNumForId(data, targetId) {
|
// 初始化一个对象来存储遇到的id及其对应的num值
|
const idNums = {};
|
let firstNum = null;
|
|
for (const item of data) {
|
if (item.order_number === targetId) {
|
// 如果找到了目标id,检查num是否与第一个遇到的num相同
|
if (firstNum === null) {
|
// 如果是第一个遇到的,记录num值
|
firstNum = item.completedQuantity;
|
} else if (item.completedQuantity !== firstNum) {
|
// 如果num值与第一个遇到的num不同,返回false
|
return false;
|
}
|
}
|
}
|
|
// 如果遍历完数组后没有返回false,那么所有具有目标id的对象都具有相同的num值
|
return true;
|
}
|
|
|
|
|
|
|
const saveReportingWork = (state,saveType) => {
|
|
if(xGrid.value.getTableData().fullData.length===0){
|
ElMessage.warning(`请选择流程卡数据`)
|
return
|
}
|
const device = titleUploadData.value.deviceName
|
if(device === null || device === undefined || device === ''){
|
ElMessage.error('请选择报工设备!')
|
return
|
}
|
const teamsGroupsName = titleUploadData.value.teamsGroupsName
|
if(teamsGroupsName === null || teamsGroupsName === undefined || teamsGroupsName === ''){
|
ElMessage.error('请选择报工设备!')
|
return
|
}
|
|
const seenIds = {}
|
const uniqueByOrderNum = xGrid.value.getTableData().fullData.filter(item => {
|
// 检查item的id是否已经在seenIds中
|
if (!seenIds[item.order_number]) {
|
// 如果不在,添加它并返回true以保留这个对象
|
seenIds[item.order_number] = true;
|
return true;
|
}
|
// 如果已经在seenIds中,返回false以过滤掉这个对象
|
return false;
|
});
|
const notFinishList = xGrid.value.getTableData().fullData.filter(item =>{
|
return item.saveFlag === false
|
})
|
for(let item of uniqueByOrderNum){
|
if(!checkSameNumForId(notFinishList,item.order_number)){
|
ElMessage.error(`请检查订单序号: ${item.order_number} 报工数量是否相同!`)
|
return false
|
}
|
}
|
|
|
titleUploadData.value.creator = user.user.userName
|
titleUploadData.value.creatorId = user.user.userId
|
const requestDetailData = xGrid.value.getTableData().fullData.filter((row) => {
|
const a = (row.completedQuantity !== undefined && row.completedQuantity !== null && row.completedQuantity !== '' && row.completedQuantity*1!==0)
|
const b = (row.breakageQuantity !== undefined && row.breakageQuantity !== null && row.breakageQuantity !== '' && row.breakageQuantity*1!==0)
|
return (a || b)
|
})
|
if(requestDetailData.length === 0){
|
ElMessage.warning('请填写至少一条损耗数和完工数大于0')
|
return false
|
}
|
|
const requestData = {
|
title:titleUploadData.value,
|
detail:xGrid.value.getTableData().fullData,
|
type:state//审核状态
|
}
|
gridOptions.toolbarConfig.buttons[0].disabled=true
|
gridOptions.toolbarConfig.buttons[1].disabled=true
|
//判断保存还是修改
|
if(saveType==='save'){
|
saveReportingWorkRequest(requestData)
|
}else{
|
updateReportingWorkRequest(requestData)
|
}
|
|
}
|
|
const saveReportingWorkRequest = (requestData) =>{
|
request.post(`/reportingWork/saveReportingWork`,requestData).then(res =>{
|
if (res.code == 200){
|
ElMessage.success("报工成功")
|
router.push({path:'/main/reportingWorks/AddReportingWork',query:{processId:titleUploadData.value.processId,random:Math.random()}})
|
}else{
|
const errorObj = JSON.parse(res.msg)
|
const msg = "序号:"+errorObj.orderNumber+'\n'
|
+'小片顺序:'+errorObj.technologyNumber+'\n'
|
+"实际可报工数量:"+errorObj.processNum+'<'+
|
"报工数量:"+errorObj.sumNum+'\n'
|
+"请刷新界面重新报工"
|
|
ElMessage.error(msg)
|
}
|
}).catch(err =>{
|
ElMessage.error(err.message)
|
}).finally(()=>{
|
|
gridOptions.toolbarConfig.buttons[0].disabled=false
|
gridOptions.toolbarConfig.buttons[1].disabled=false
|
})
|
}
|
|
//更新报工数据
|
const updateReportingWorkRequest = (requestData) =>{
|
let reviewState = 'update'
|
if(route.query.reviewStatus==="1"){
|
reviewState = 'review'
|
}
|
request.post(`/reportingWork/updateReportingWork/${reviewState}`,requestData).then(res =>{
|
if (res.code == 200){
|
ElMessage.success("报工修改成功")
|
router.push({path:'/main/reportingWorks/AddReportingWork',
|
query:{
|
processId:titleUploadData.value.processId,
|
random:Math.random()}
|
})
|
}
|
})
|
}
|
|
|
//查询责任设备
|
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
|
}
|
}
|
})
|
|
let loadingFlag = ref(false)
|
let disabledFlag = ref(true)
|
const reviewReportingWork = () => {
|
const processId = titleUploadData.value.processId
|
if (processId.indexOf("/") < 0) {
|
ElMessage.warning("请输入正确格式流程卡")
|
return
|
}
|
let indexOfChar = processId.indexOf("/")
|
let leftString = processId.slice(0, indexOfChar)
|
if (leftString.length !== 14) {
|
ElMessage.warning("请输入正确位数的流程卡")
|
return
|
}
|
//工序
|
let process = titleUploadData.value.thisProcess
|
if (process === "" || process == null) {
|
ElMessage.warning("请选择工序")
|
return
|
}
|
if(titleUploadData.value.previousProcess===''){
|
ElMessage.warning("第一道工序不需要审核")
|
return
|
}
|
const reportWork = {
|
process: titleUploadData.value.previousProcess,
|
processId:processId
|
}
|
loadingFlag.value= true
|
request.post("/reportingWork/reviewReportingWork",reportWork).then((res) =>{
|
if(res.code === '200'){
|
ElMessage.success("审核成功")
|
router.push({path:'/main/reportingWorks/AddReportingWork',
|
query:{
|
processId:titleUploadData.value.processId,
|
random:Math.random()
|
}
|
})
|
}
|
}).finally(
|
loadingFlag.value= false
|
)
|
|
}
|
|
|
//下拉款选择工序时查询
|
const getWork = () => {
|
|
let processId = titleUploadData.value.processId
|
// if (processId.indexOf("/") < 0) {
|
//
|
// ElMessage.warning("请输入正确格式流程卡")
|
// return
|
// }
|
// let indexOfChar = processId.indexOf("/")
|
// let leftString = processId.slice(0, indexOfChar)
|
// if (leftString.length != 13) {
|
// ElMessage.warning("请输入正确位数的流程卡")
|
// return
|
// }
|
//工序
|
let process = titleUploadData.value.thisProcess
|
if (process == "" || process == null) {
|
ElMessage.warning("请选择工序")
|
return
|
}
|
|
if (titleSelectJson.value.thisProcessType.indexOf(process) == -1 && process != "切割" && titleSelectJson.value.thisProcessType != "") {
|
ElMessage.warning("此工序不属于该流程卡")
|
return
|
}
|
//匹配“/”前后字符串
|
const regex = /([^\/]+)\/([^\/]+)/;
|
//查找匹配的字符串
|
const result = processId.match(regex);
|
//流程卡号
|
let processIdStr = result[1];
|
//层号
|
let technologyStr = result[2];
|
|
request.post(`/reportingWork/addSelectLastWork/${processIdStr}/${technologyStr}/${process}`).then((res) => {
|
if (res.code == 200) {
|
if(res.data.data===null){
|
ElMessage.error("未查询到此流程卡数据")
|
return
|
}
|
//表头赋值
|
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
|
//历史班组
|
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
|
if(titleUploadData.value.reviewedState==1){
|
gridOptions.toolbarConfig.buttons[0].disabled=false
|
gridOptions.toolbarConfig.buttons[1].disabled=false
|
disabledFlag.value=true
|
}else {
|
gridOptions.toolbarConfig.buttons[0].disabled=true
|
gridOptions.toolbarConfig.buttons[1].disabled=true
|
disabledFlag.value=false
|
}
|
|
//判断早晚班
|
titleUploadData.value.classes=t('reportingWorks.early')
|
titleUploadData.value.reportingWorkTime = formatCurrentTime()
|
//绑定下方表格
|
detail.value = res.data.Detail
|
xGrid.value.reloadData(detail.value)
|
} else {
|
ElMessage.warning(res.msg)
|
}
|
})
|
}
|
|
//判断完工次破数量是否满足条件
|
const verifyNum = () => {
|
const $grid = xGrid.value
|
const table = $grid.getTableData().fullData
|
let sum = 0;
|
let sumBreak = 0;
|
table.forEach((item) => {
|
if (item.completedQuantity == null || item.completedQuantity == "") {
|
item.completedQuantity = 0;
|
}
|
if (item.breakageQuantity == null || item.breakageQuantity == "") {
|
item.breakageQuantity = 0;
|
}
|
|
if (item.quantity < item.completedQuantity) {
|
ElMessage.success("序号" + item.order_number + "的数量不能大于上工序数量")
|
|
|
} else if (item.breakageQuantity * 1 + item.completedQuantity * 1 > item.quantity * 1) {
|
ElMessage.success("请输入序号" + item.order_number + "正确的完工或次破数量")
|
}
|
|
sum = item.completedQuantity * 1 + sum * 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'); // 秒数
|
if(parseInt(hours)>=17 && parseInt(hours)<8)titleUploadData.value.classes='晚班'
|
return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`; // 返回格式化后的时间字符串
|
}
|
|
const editClosedEvent = ({ row, column }) => {
|
if (column.property==='completedQuantity') {
|
xGrid.value.getTableData().fullData.forEach((item, index) =>{
|
if(item.order_number===row.order_number){
|
item.completedQuantity=row.completedQuantity
|
}
|
})
|
getQuantity()
|
}
|
}
|
const getQuantity = () => {
|
const arr = xGrid.value.getTableData().fullData
|
const returnArr = arr.filter((obj, index, self) =>
|
self.findIndex((t) => t.order_number === obj.order_number) === index
|
)
|
|
|
let sumBreak = 0
|
let sumQuantity = 0
|
returnArr.forEach((item)=>{
|
sumQuantity+=Number(item.completedQuantity*1)
|
})
|
arr.forEach((item)=>{
|
sumBreak+=Number(item.breakageQuantity) || 0
|
})
|
titleUploadData.value.thisCompletedQuantity = sumQuantity
|
titleUploadData.value.thisWornQuantity = sumBreak
|
}
|
|
</script>
|
|
<template>
|
<div style="height: 100%;width: 100%">
|
<div id="head" style="height: 5%;width: 100%;margin-bottom: 5px">
|
<el-input :disabled="inputDisabled" v-if="titleUploadData.reportingWorkId" v-model="titleUploadData.reportingWorkId" placeholder="报工编号" style="width: 200px" />
|
<el-input :disabled="inputDisabled" v-model="titleUploadData.processId" placeholder="流程卡号" style="width: 200px" @keyup.enter.native="getWork"/>
|
|
<el-select :disabled="inputDisabled" v-model="titleUploadData.thisProcess" clearable placeholder="请选择工序" style="width: 120px"
|
@change="getWork">
|
<el-option
|
v-for="item in titleSelectJson['processType']"
|
:key="item.id"
|
:label="item.basic_name"
|
:value="item.basic_name"
|
/>
|
</el-select>
|
|
<el-button :disabled="disabledFlag" :loading="loadingFlag" @click="reviewReportingWork" type="primary">{{$t('reportingWorks.passAudit')}}
|
</el-button>
|
<!-- <el-button type="primary">审核不通过</el-button>-->
|
|
<label>{{$t('reportingWorks.processCardArea')}}:</label>
|
</div>
|
<div style="background-color: white;margin-bottom: 5px;height: 17%;width: 100%">
|
<el-row>
|
<el-col :span="2">
|
<el-text>{{$t('order.orderId')}}:</el-text>
|
</el-col>
|
<el-col :span="3">
|
<el-text>{{ titleUploadData.orderId }}</el-text>
|
</el-col>
|
<el-col :span="2">
|
<el-text>{{$t('workOrder.productionId')}}:</el-text>
|
</el-col>
|
<el-col :span="3">
|
<el-text>{{ titleUploadData.productionId }}</el-text>
|
</el-col>
|
<el-col :span="2">
|
<el-text>{{$t('processCard.customerId')}}:</el-text>
|
</el-col>
|
<el-col :span="2">
|
<el-text>{{ titleUploadData.order.customerId }}</el-text>
|
</el-col>
|
<el-col :span="2">
|
<el-text>{{$t('processCard.customerName')}}:</el-text>
|
</el-col>
|
<el-col :span="3">
|
<el-text class="customClass"></el-text>
|
</el-col>
|
<el-col :span="2">
|
<el-text>{{$t('order.project')}}:</el-text>
|
</el-col>
|
<el-col :span="3">
|
<el-text wrap-text="false">{{ titleUploadData.order.project }}</el-text>
|
</el-col>
|
|
</el-row>
|
<el-row>
|
<el-col :span="2">
|
<el-text>{{$t('reportingWorks.deviceType')}}:</el-text>
|
</el-col>
|
<el-col :span="3">
|
<el-select v-model="titleUploadData.deviceName" clearable :placeholder="$t('reportingWorks.pleaseDevice')">
|
<el-option
|
v-for="item in titleSelectJson['deviceType']"
|
:key="item.id"
|
:label="item.basicName"
|
:value="item.basicName"
|
/>
|
</el-select>
|
</el-col>
|
<el-col :span="2">
|
<el-text>{{$t('reportingWorks.previousProcess')}}:</el-text>
|
</el-col>
|
<el-col :span="3">
|
|
<el-text>{{ titleUploadData.previousProcess }}</el-text>
|
</el-col>
|
<el-col :span="2">
|
<el-text>{{$t('reportingWorks.numberReported')}}:</el-text>
|
</el-col>
|
<el-col :span="2">
|
<el-text>{{ titleUploadData.previousProcessQuantity }}</el-text>
|
|
</el-col>
|
<el-col :span="2">
|
<el-text>{{$t('reportingWorks.thisCompletedQuantity')}}:</el-text>
|
</el-col>
|
<el-col :span="3">
|
<el-text>{{ titleUploadData.thisCompletedQuantity }}</el-text>
|
</el-col>
|
<el-col :span="2">
|
<el-text>{{$t('reportingWorks.thisWornQuantity')}}:</el-text>
|
</el-col>
|
<el-col :span="3">
|
<el-text>{{ titleUploadData.thisWornQuantity }}</el-text>
|
</el-col>
|
|
</el-row>
|
<el-row>
|
<el-col :span="2">
|
<el-text>{{$t('reportingWorks.teamsType')}}:</el-text>
|
</el-col>
|
<el-col :span="3">
|
<el-select v-model="titleUploadData.teamsGroupsName" clearable :placeholder="$t('reportingWorks.selectTeam')">
|
<el-option
|
v-for="item in titleSelectJson['teamsType']"
|
:key="item.id"
|
:label="item.basicName"
|
:value="item.basicName"
|
/>
|
</el-select>
|
</el-col>
|
<el-col :span="2">
|
<el-text>{{$t('reportingWorks.classes')}}:</el-text>
|
</el-col>
|
<el-col :span="3">
|
<el-select v-model="titleUploadData.classes" class="processesSt" :placeholder="$t('reportingWorks.selectClasses')">
|
<el-option
|
v-for="item in classesOption"
|
:key="item.value"
|
:label="item.label"
|
:value="item.value"
|
/>
|
</el-select>
|
</el-col>
|
<el-col :span="2">
|
<el-text>{{$t('reportingWorks.nextProcess')}}:</el-text>
|
</el-col>
|
<el-col :span="2">
|
<el-text>{{ titleUploadData.nextProcess }}</el-text>
|
|
</el-col>
|
<el-col :span="2">
|
<el-text>{{$t('reportingWorks.reportingWorkTime')}}:</el-text>
|
</el-col>
|
<el-col :span="3">
|
<el-date-picker
|
v-model="titleUploadData.reportingWorkTime"
|
format="YYYY-MM-DD HH:mm:ss"
|
value-format="YYYY-MM-DD HH:mm:ss"
|
placeholder=""
|
style="width: 100%"
|
type="datetime"
|
/>
|
</el-col>
|
<el-col :span="2">
|
<el-text>{{$t('basicData.remarks')}}:</el-text>
|
</el-col>
|
<el-col :span="3">
|
<el-input v-model="titleUploadData.notes" placeholder="" />
|
</el-col>
|
|
</el-row>
|
</div>
|
<div class="main-div-customer" style="width: 100%;height: 70%">
|
<vxe-grid
|
ref="xGrid"
|
class="mytable-scrollbar"
|
max-height="100%"
|
size="small"
|
v-bind="gridOptions"
|
v-on="gridEvents"
|
@filter-change="filterChanged"
|
@edit-closed="editClosedEvent"
|
|
>
|
|
|
<template #num1_filter="{ column, $panel }">
|
<div>
|
<div v-for="(option, index) in column.filters" :key="index">
|
<input v-model="option.data" type="type" @input="changeFilterEvent($event, option, $panel)"/>
|
</div>
|
</div>
|
</template>
|
|
|
</vxe-grid>
|
<el-dialog
|
@opened="openedBrokenTable"
|
:before-close="checkClose"
|
v-model="brokenVisible"
|
:close-on-click-modal="false"
|
:close-on-press-escape="false"
|
:title="$t('reportingWorks.damageList')+':'
|
+brokenRow.glass_child+'.'+brokenRow.order_number+'.'+brokenRow.technology_number"
|
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>
|
<!-- 刺破类型breakageType -->
|
<template #breakageType="{ row }">
|
<vxe-select v-model="row.breakageType "
|
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 #breakageType_default="{ row }">
|
<span>{{ row.breakageType }}</span>
|
</template>
|
|
<!--次破原因-->
|
<template #breakageReason="{ row }">
|
<vxe-select v-model="row.breakageReason "
|
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 #breakageReason_default="{ row }">
|
<span>{{ row.breakageReason }}</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>
|
</div>
|
</div>
|
</template>
|
|
<style scoped>
|
|
|
.processCard {
|
width: 140px;
|
}
|
|
.processesSt {
|
height: 33px;
|
width: 120px;
|
background-color: #409eff;
|
color: white;
|
border: none;
|
border-radius: 5px;
|
}
|
|
#titleTable tr, #titleTable td {
|
border: 1px solid #000;
|
}
|
|
#titleTable {
|
border-collapse: collapse;
|
text-align: center;
|
width: 100%;
|
height: 100%;
|
}
|
|
#titleTable td {
|
width: 100px;
|
height: 30px;
|
}
|
|
#titleTable td:nth-child(1) {
|
width: 100px;
|
height: 30px;
|
}
|
|
#titleTable td:nth-child(2) {
|
width: 100px;
|
}
|
|
.chaxun {
|
background-color: #D5EAFF;
|
border: none;
|
}
|
|
.customClass {
|
white-space: nowrap; /* 不换行 */
|
}
|
|
.el-text {
|
|
}
|
|
.el-col .el-select {
|
width: 100%;
|
height: 100%;
|
}
|
|
.el-col {
|
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>
|