chenlu
2025-07-30 e9f8d23f55f64903d834308f9f167aaf3195c20d
north-glass-erp/northglass-erp/src/views/pp/reportingWorks/AddReportingWork.vue
@@ -55,6 +55,8 @@
  classes: '',
  //责任工序
  responsibleProcess: '',
  //包装方式
  packagingMethod:'',
  order: {
    //客户编号
    customerId: '',
@@ -90,6 +92,39 @@
})
let btnValue=company.storageBtn
let teamsTypeValue=company.teamsType
//是否点击报工入库
let storageBtn = ref(false)
//箱号 库位 备注
const storageRegion = ref(null);
const container = ref(null);
const remark = ref(null);
//包装方式
const mannerPacking = ref(null)
const mannerPackingOp = [
  // {
  //   value: t('reportingWorks.early'),
  //   label: t('reportingWorks.early'),
  // },
  // {
  //   value: t('reportingWorks.nightShift'),
  //   label: t('reportingWorks.nightShift'),
  // },
   {
    value: '木箱',
    label: '木箱',
  },
  {
    value: '铁架',
    label: '铁架',
  },
  {
    value: '倒架',
    label: '倒架',
  },
]
let inputDisabled = ref(false)
@@ -104,6 +139,7 @@
          && titleUploadData.value.thisProcess!=null){
        getWork()
        getQuantity()
      }
    }
  }
@@ -390,17 +426,10 @@
  },
  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},
      {code: 'saveWorkStorage', name: t('reportingWorks.saveWorkStorage'), status: 'primary', icon: 'vxe-icon-save'},
    ],
    // import: false,
    // export: true,
    // print: true,
    zoom: true,
    custom: true
  },
@@ -473,6 +502,46 @@
          // })
          break
        }
        case 'saveWorkStorage':{
          if(xGrid.value.getTableData().fullData.length===0){
            ElMessage.warning(t('reportingWorks.selectProcessCardData'))
            return
          }
          const device = titleUploadData.value.deviceName
          if(device === null || device === undefined || device === ''){
            ElMessage.error(t('reportingWorks.selectWorkReportingEquipment'))
            return
          }
          const teamsGroupsName = titleUploadData.value.teamsGroupsName
          if(teamsGroupsName === null || teamsGroupsName === undefined || teamsGroupsName === ''){
            ElMessage.error(t('reportingWorks.selectWorkReportingTeam'))
            return
          }
          if (mannerPacking.value === null || mannerPacking.value === undefined || mannerPacking.value === ''){
            ElMessage.error(t('reportingWorks.msgMannerPacking'))
            return
          }
          const parts = technologicalProcess.split('->');
          const last = parts[parts.length - 1];
          let processId = titleUploadData.value.processId
          //匹配“/”前后字符串
          const regex =  /([^\/]+)\/([^\/]+)/;
          //查找匹配的字符串
          const resultProcessId = processId.match(regex);
          //流程卡号
          let processIdStr = resultProcessId[1];
          //层号
          let technologyStr = resultProcessId[2];
          if (last != titleUploadData.value.thisProcess){
            ElMessage.error('请选择最后工序报工入库')
            return
          }
          storageBtn.value = true
          //报工新增
          saveReportingWork(0,'save')
        }
      }
    }
@@ -816,6 +885,7 @@
//第一次加载数据
let groupChangeProcess = ref(false)//用于本班组显示问题
const initTiltle = async () => {
  hideButton()
  await request.post(`/reportingWork/selectProcess/${user.user.userId}`).then((res) => {
    if (res.code == 200) {
      titleSelectJson.value.processType = res.data.process
@@ -907,7 +977,8 @@
      return false
    }
  }
//包装方式
  titleUploadData.value.packagingMethod = mannerPacking.value
  titleUploadData.value.creator = user.user.userName
  titleUploadData.value.creatorId = user.user.userId
  const requestDetailData = xGrid.value.getTableData().fullData.filter((row) => {
@@ -943,6 +1014,10 @@
  request.post(`/reportingWork/saveReportingWork`,requestData).then(res =>{
    if (res.code == 200){
      ElMessage.success(t('reportingWorks.successfulJobApplication'))
      //报工入库
      if(storageBtn.value == true){
        getStorageWork();
      }
      router.push({path:'/main/reportingWorks/AddReportingWork',query:{processId:titleUploadData.value.processId,random:Math.random()}})
    }else{
      const errorObj = JSON.parse(res.msg)
@@ -1071,7 +1146,6 @@
//下拉款选择工序时查询
const getWork = () => {
  let processId = titleUploadData.value.processId
  if (processId == "" || processId == null) {
    ElMessage.warning(t('reportingWorks.theProcessCardNumberCannotBeEmpty'))
@@ -1127,7 +1201,10 @@
      //设备下拉框
      titleSelectJson.value.deviceType = res.data.device
      //班组下拉框
      //titleSelectJson.value.teamsType = res.data.teams
      if (teamsTypeValue==true){
        titleSelectJson.value.teamsType = res.data.teams
      }
      //当前流程卡工序
      titleSelectJson.value.thisProcessType = res.data.thisProcess
      //历史班组
@@ -1192,6 +1269,7 @@
        }
      });
      xGrid.value.reloadData(modifiedCollection)
      hideButton()
    } else {
      ElMessage.warning(res.msg)
    }
@@ -1360,6 +1438,126 @@
  }
})
//报工入库方法
const getStorageWork = () => {
  let processId = titleUploadData.value.processId
  //匹配“/”前后字符串
  const regex =  /([^\/]+)\/([^\/]+)/;
  //查找匹配的字符串
  const resultProcessId = processId.match(regex);
  //流程卡号
  let processIdStr = resultProcessId[1];
  //层号
  let technologyStr = resultProcessId[2];
  //开始处理入库需要的数据
  let rawData  = xGrid.value.getTableData().fullData
  const seen = new Set();
  const result = rawData.filter(item => {
    // 1. 先把 completedQuantity 为 0 的剔除
    if (item.completedQuantity === 0) {
      return false;
    }
    // 2. 遇到相同 order_number,只保留第一次,后面都丢弃
    if (seen.has(item.order_number)) {
      return false;
    }
    seen.add(item.order_number);
    return true;
  });
  // 给每条记录追加 order 字段
  const resultData = result.map(item => ({
    ...item,
    order: {
      orderId: titleUploadData.value.orderId
    },
    processId:processIdStr,
    orderNumber:item.order_number
  }));
  let flowData = ref({
    decValue:company.decValue,
    userId: user.user.userId,
    userName: user.user.userName,
    storageRegion: storageRegion.value,
    remark: remark.value,
    container: container.value,
    flowCard: resultData,
  })
  //调用入库接口
  request.post("/finishedGoodsInventory/addSelectWarehousing",flowData.value).then((res) => {
    if(res.code==200 && res.data==="true"){
      ElMessage.success(t('productStock.receivedSuccessfully'))
     // router.push({path:'/maiggn/productStock/CreateProductStock',query:{random:Math.random()}})
    }else if(res.data==="false1"){
      ElMessage.warning(t('basicData.msg.quantityError'))
    }else if(res.data==="false2"){
      ElMessage.warning(t('basicData.msg.dataDoesNotExist'))
    }else{
      ElMessage.warning(t('productStock.entryFailure'))
    }
  }).catch((err)=>{
    ElMessage.error(t('basicData.msg.ServerConnectionError'))
    router.push("/login")
  })
}
const hideButton = () => {
  // 获取最后一道工序
  const parts = technologicalProcess.split('->');
  let last = parts[parts.length - 1];
  if (last === '') {
    last = null;
  }
  const els = document.querySelectorAll('.inventory_content');
  // 是否显示报工入库相关按钮内容
  if (btnValue == false || last != titleUploadData.value.thisProcess) {
    els.forEach(el => {
      el.style.display = 'none';
    });
  } else {
    els.forEach(el => {
      el.style.display = '';
    });
    // 避免重复添加按钮
    const exists = gridOptions.toolbarConfig.buttons.some(btn => btn.code === 'saveWorkStorage');
    if (!exists) {
      let buttons = {
        code: 'saveWorkStorage',
        name: t('reportingWorks.saveWorkStorage'),
        status: 'primary',
        icon: 'vxe-icon-save'
      };
      gridOptions.toolbarConfig.buttons.push(buttons);
    }
  }
  // 过滤按钮,隐藏 saveWorkStorage 按钮时机
  gridOptions.toolbarConfig.buttons = gridOptions.toolbarConfig.buttons.filter(button => {
    if ((btnValue == false || last != titleUploadData.value.thisProcess) && button.code === 'saveWorkStorage') {
      return false;
    }
    return true;
  });
};
const changeGroup = (value)=> {
  //判断历史班组是否有此班组信息
  const exists = titleSelectJson.value.historyTeams.some(item => item.basic_name === value)
  if(! exists){
    titleSelectJson.value.historyTeams.push({
      basic_name: value,
      process: titleUploadData.value.thisProcess,
      basic_type: 'teamsgroups',
      id: 555
    })
  }
}
</script>
<template>
@@ -1384,6 +1582,23 @@
      &nbsp;
      <el-button :disabled="disabledFlag" :loading="loadingFlag" @click="reviewReportingWork" type="primary">{{$t('reportingWorks.passAudit')}}
      </el-button>
      &nbsp;
      <span class="inventory_content">
        <el-select style="width: 100px" v-model="mannerPacking" class="processesSt" :placeholder="$t('reportingWorks.mannerPacking')">
          <el-option
              v-for="item in mannerPackingOp"
              :key="item.value"
              :label="item.label"
              :value="item.value"
          />
        </el-select>&nbsp;
        <el-input style="width: 100px" v-model="container" class="m-2" :placeholder="$t('productStock.pleaseEnterTheBoxNumber')">
      </el-input>&nbsp;
        <el-input style="width: 100px" v-model="storageRegion" class="m-2" :placeholder="$t('productStock.pleaseEnterTheStorageLocation')">
      </el-input>&nbsp;
        <el-input style="width: 200px" v-model="remark" class="m-2" :placeholder="$t('productStock.pleaseEnterANote')">
        </el-input>
      </span>
<!--      <el-button type="primary">审核不通过</el-button>-->
      &nbsp;
      <label>{{technologicalProcess}}</label>
@@ -1472,13 +1687,14 @@
        <el-col :span="3">
          <el-select :disabled="groupChangeProcess"
                     v-model="titleUploadData.teamsGroupsName"
                     @change="changeGroup"
                     clearable
                     :placeholder="$t('reportingWorks.selectTeam')">
            <el-option
                v-for="item in titleSelectJson['teamsType']"
                :key="item.id"
                :label="item.basicName"
                :value="item.basicName"
                :label="item.user_name"
                :value="item.user_name"
            />
          </el-select>
        </el-col>