chenlu
2024-03-29 6c17e1f3da486ffd16b7237d9bc35a9bcbef5348
north-glass-erp/northglass-erp/src/views/mm/mainIngredientStock/ReturnToStorageCreate.vue
@@ -1,8 +1,430 @@
<script setup>
import {reactive, ref} from "vue"
import {VXETable} from "vxe-table"
import {useRouter} from "vue-router"
import {onMounted, reactive, ref} from "vue";
import {Search} from "@element-plus/icons-vue";
import {useRoute, useRouter} from "vue-router"
import request from "@/utils/request"
import deepClone from "@/utils/deepClone"
import VXETable from "vxe-table";
import useUserInfoStore from "@/stores/userInfo";
import {ElMessage} from "element-plus";
import {addListener,toolbarButtonClickEvent} from "@/hook/mouseMove";
import { useI18n } from 'vue-i18n'
import {changeFilterEvent,filterChanged} from "@/hook"
const { t } = useI18n()
const router = useRouter()
const route = useRoute()
const userStore = useUserInfoStore()
const username = userStore.user.userName
const userid = userStore.user.userId
let produceList = ref([])
let cellArea = ref()
const hasDecimal=(value)=>{
  const regex=/\./ // 定义正则表达式,查找小数点
  return regex.test(value) //返回true/false
}
const hasDecimalhtml=(item,row)=>{
  let aa=item.split('.').length
  if (aa===2){
    return row[item.split('.')[0]][item.split('.')[1]]
  }else if(aa===3){
    return row[item.split('.')[0]][item.split('.')[1]][item.split('.')[2]]
  }
}
//定义接收加载表头下拉数据
const titleSelectJson = ref({
  returningType:"",
  inventoryOrganization:""
})
// 定义表头上传数据
let titleUploadData = ref({
  returningType:'',
  returningId:'',
  materialRequisitionPersonnel:'',
  materialRequisitionTeam:'',
  orderId:'',
  batch:'',
  project:'',
  reviewedState:'',
  reviewed:'',
  createTime:'',
  warehouseManager:userStore.user.userName
})
//筛选条件,有外键需要先定义明细里面的数据
let filterData = ref({
})
let BasicData = ref([])
let materialStore= ref([])
const value = ref('')
const options = [
  {
    value: '原片',
    label: '原片'
  },
  {
    value: '辅料',
    label: '辅料',
  }
]
let arr = [
  {field: 'select',type: 'checkbox',fixed:"left", title: '选择', width: '80' },
  { type: 'seq',fixed:"left", title: '自序', width: '80' },
  {field: 'returnQuantity', width:'150', title: '返库数量', sortable: true,editRender: { name: 'input', attrs: { placeholder: '' } }},
  {field: 'dateOfManufacture', width:'150', title: '生产日期', sortable: true,editRender: {name: 'input', attrs: {placeholder: '', type: 'date'}},},
  {field: 'inventoryOrganization', width:'150', title: '库存组织', sortable: true,folding: true,slots: { edit: 'inventoryOrganization'},editRender: { name: '$select', attrs: { placeholder: '' } }},
  {field: 'producer', width:'150', title: '产地', sortable: true,editRender: { name: 'input', attrs: { placeholder: '' } }},
  {field: 'qualityGuaranteePeriod', width:'150', title: '保质期', sortable: true,editRender: { name: 'input', attrs: { placeholder: '' } }},
  {field: 'inventoryArea', width:'150', title: '库存区域',sortable: true,editRender: { name: 'input', attrs: { placeholder: '' } }},
  {field: 'remarks',width: '80', title: '备注', sortable: true,editRender: { name: 'input', attrs: { placeholder: '' } }},
  {field: 'id', width: '150',title: '物料编码', sortable: true,showOverflow:'ellipsis' ,filters:[{ data: '' }],slots: { filter: 'num1_filter' },filterMethod:filterChanged}
]
//页面第一次加载
request.get(`/BasicWarehouse/BasicWarehouseTypes/材料返库类型`).then((res) => {
  if(res.code==200){
    titleSelectJson.value=deepClone(res.data)
    const today = new Date
    today.setTime(today.getTime() + (15 * 24 * 60 * 60 * 1000))
    titleUploadData.value.createTime = today.getFullYear() +
        '-' + ("0" + (today.getMonth() + 1)).slice(-2)
        + '-' + ("0" + today.getDate()).slice(-2)
  }else{
    ElMessage.warning(res.msg)
  }
})
const  number = ref();
onMounted(()=>{
  //启用表格拖动选中
  addListener(xGrid.value,gridOptions,cellArea.value)
  //返库编辑
  const str = route.query.returningId
  if (typeof str != 'undefined' && str != null && str !== '' && str !== '\n' && str !== '\r'){
    filterData.value.returningId=str
    console.log(filterData.value)
    //第一次调用
    request.post("/MaterialInventory/getSelectReturningWarehouse/1/100",filterData.value).then((res) => {
      if(res.code==200){
        titleUploadData.value=deepClone(res.data.returningWarehouse)
        //根据审核状态显示审核按钮或者是反审按钮
        value.value='原片|辅料'
        getStoreWork()
        console.log(res.data)
        if(titleUploadData.value.reviewedState!==0){
          gridOptions.toolbarConfig.buttons[1].disabled = true
          gridOptions.toolbarConfig.buttons[0].disabled = true
        }
        if(titleUploadData.value.reviewedState===0){
          gridOptions.toolbarConfig.buttons[2].disabled = true
        }
        materialStore.value=[]
        for (let i=0;i<res.data.data.length;i++){
          materialStore.value[i]=(res.data.data[i])
          materialStore.value[i].json=(JSON.parse(res.data.data[i].json))
        }
        produceList = deepClone(materialStore.value)
        xGrid.value.loadData(produceList)
        //隐藏复选框
        /*xGrid.value.hideColumn("select")
        gridOptions.loading=false*/
        xGrid.value.showColumn("select")
        gridOptions.loading=false
      }else{
        ElMessage.warning(res.msg)
      }
    })
  }else{
    //返库新增
    request.post(`/MaterialStore/getSelectMaterialStore/1/100`,filterData.value).then((res) => {
      if(res.code==200){
        console.log(res.data.data)
        titleUploadData.value.warehouseManager=userStore.user.userName
        titleUploadData.value.returningType = titleSelectJson.value.returningType[0].operateTypeName
        //禁用按钮
        gridOptions.toolbarConfig.buttons[1].disabled  = true
        gridOptions.toolbarConfig.buttons[2].disabled = true
        //显示复选框
        xGrid.value.showColumn("select")
        value.value='原片'
        getStoreWork()
        getStoreWorks()
        getInventoryOrganization()
      }else{
        ElMessage.warning(res.msg)
      }
    })
  }
})
//库存组织
const getInventoryOrganization=()=>{
  //页面第一次加载
  request.get(`/BasicWarehouse/BasicWarehouseTypes/库存组织`).then((res) => {
    if(res.code==200){
      titleSelectJson.value=deepClone(res.data)
      // for(let i=0;i<titleSelectJson.value.inventoryOrganization.length;i++){
      //   this.$set(this.produceList[i], "inventoryOrganization", titleSelectJson.value["inventoryOrganization"][i].operateTypeName);
      // }
    }else{
      ElMessage.warning(res.msg)
    }
  })
}
//列查询
const getStoreWork = () => {
  filterData.value.type=value.value
  request.get(`/BasicWarehouse/BasicWarehouseType/${value.value}`).then((res) => {
    if(res.code==200){
      gridOptions.columns=[]
      BasicData.value = res.data
      //添加列
      gridOptions.columns=arr.slice()
      for (let i=0;i<BasicData.value.length;i++){
        let column={field: "json."+BasicData.value[i].OperateType,
          width: '150',title: BasicData.value[i].OperateTypeName,
          sortable: true,showOverflow:'ellipsis' ,
          filters:[{ data: '' }],
          slots: { filter: 'num1_filter' },
          filterMethod:filterChanged}
        gridOptions.columns.push(column)
      }
    }else{
      ElMessage.warning(res.msg)
    }
  })
}
//数据绑定
const getStoreWorks = () => {
  console.log(filterData.value)
  request.post(`/MaterialStore/getSelectMaterialStore/1/100`,filterData.value).then((res) => {
    if(res.code==200){
      console.log(res.data)
      materialStore.value=[]
      for (let i=0;i<res.data.data.length;i++){
        materialStore.value[i]=(res.data.data[i])
        materialStore.value[i].json=(JSON.parse(res.data.data[i].json))
      }
      materialStore.value.forEach(item => {
        item['inventoryOrganization'] = titleSelectJson.value["inventoryOrganization"][0].operateTypeName
      })
      produceList = deepClone(materialStore.value)
      xGrid.value.loadData(produceList)
      gridOptions.loading=false
    }else{
      ElMessage.warning(res.msg)
      router.push("/login")
    }
  })
}
const gridEvents = {
  async toolbarButtonClick({code}) {
    const $grid = xGrid.value
    if ($grid) {
      switch (code) {
        case 'add': {
          const selectRecords = $grid.getCheckboxRecords()
          console.log(selectRecords)
          if (selectRecords.length === 0) {
            ElMessage.warning(t('productStock.unselectedData'))
            return
          }
          const errMap = await $grid.validate(selectRecords)
          if (errMap) {
            ElMessage.warning(t('productStock.dataVerificationFailed'))
            return
          }
          //表头数据校验
          const returningType = titleUploadData.value.returningType
          if(returningType === null || returningType === undefined || returningType === ''){
            ElMessage.error("请选择返库类型")
            return
          }
          const materialRequisitionPersonnel = titleUploadData.value.materialRequisitionPersonnel
          if(materialRequisitionPersonnel === null || materialRequisitionPersonnel === undefined || materialRequisitionPersonnel === ''){
            ElMessage.error("请输入领料员")
            return
          }
          const materialRequisitionTeam = titleUploadData.value.materialRequisitionTeam
          if(materialRequisitionTeam === null || materialRequisitionTeam === undefined || materialRequisitionTeam === ''){
            ElMessage.error("请输入领料班组")
            return
          }
          const orderId = titleUploadData.value.orderId
          if(orderId === null || orderId === undefined || orderId === ''){
            ElMessage.error("请输入销售单号")
            return
          }
          const project = titleUploadData.value.project
          if(project === null || project === undefined || project === ''){
            ElMessage.error("请输入项目名称")
            return
          }
          const batch = titleUploadData.value.batch
          if(batch === null || batch === undefined || batch === ''){
            ElMessage.error("请输入批次")
            return
          }
          let flowData = ref({
            returningWarehouseDetail: selectRecords,
            title: titleUploadData.value,
            returningId: route.query.returningId
          })
          console.log(flowData)
          request.post("/MaterialInventory/saveReturningWarehouse", flowData.value).then((res) => {
            if(res.code==200){
              ElMessage.success('保存成功')
              router.push({path: '/main/ingredientsStock/MaterialOutbound', query:{random:Math.random()}})
            }else{
              ElMessage.warning(res.msg)
              router.push("/login")
            }
          })
          break
        }
        case 'toExamine': {
          let flowData = ref({
            returningId: route.query.returningId,
            reviewed:userStore.user.userName,
            type: 1
          })
          console.log(flowData.value)
          request.post("/MaterialInventory/updateReturningWarehouseToExamine", flowData.value).then((res) => {
            if (res.code == 200) {
              ElMessage.success(t('basicData.msg.ReviewSuccess'))
              router.push({path: '/main/ingredientsStock/MaterialOutbound', query:{random:Math.random()}})
            } else {
              ElMessage.warning(res.msg)
              router.push("/login")
            }
          })
          break
        }
        case 'CounterExamination': {
          let flowData = ref({
            returningId: route.query.returningId,
            type: 0
          })
          console.log(flowData.value)
          request.post("/MaterialInventory/updateReturningWarehouseToExamine", flowData.value).then((res) => {
            if (res.code == 200) {
              ElMessage.success(t('basicData.msg.cancelReviewSuccess'))
              router.push({path: '/main/ingredientsStock/MaterialOutbound', query:{random:Math.random()}})
            } else {
              ElMessage.warning(res.msg)
              router.push("/login")
            }
          })
          break
        }
      }
    }
  },
  menuClick ({ menu, row, column }) {
    const $grid = xGrid.value
    if ($grid) {
      switch (menu.code) {
        case 'copyChecked' :{
          let result = toolbarButtonClickEvent()
          if(result){
            const dataList = xGrid.value.getTableData().visibleData
            let firstVal=null;
            if(result.cell.indexOf('.')>-1){
              firstVal = eval("dataList["+result.start +"]."+result.cell)
            }else {
              firstVal=dataList[result.start][result.cell];
            }
            dataList.forEach((item,index) =>{
              if(index>=result.start && index<=result.end){
                if(result.cell.indexOf('.')>-1){
                  const  columnArr = result.cell.split('.')
                  item[columnArr[0]][columnArr[1]]  = firstVal
                }else{
                  item[result.cell]  = firstVal
                }
              }
            })
          }
          break
        }
      }
    }
  }
}
const xGrid = ref()
const gridOptions = reactive({
@@ -23,7 +445,7 @@
    useKey: true
  },
  filterConfig: {   //筛选配置项
    remote: true
    //remote: true
  },
  customConfig: {
    storage: true
@@ -34,32 +456,17 @@
    showStatus: true
  },//表头参数
  columns:[
    {type: 'seq',fixed:"left", title: '自序', width: 80 },
    {field: 'orderID',width:120,  title: '物料编码',filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: true},
    {field: 'orderID',width:120,  title: '物料名称',filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: true},
    {field: 'orderID',width:120,  title: '产地',filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: true},
    {field: 'orderID',width:120,  title: '宽度',filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: true},
    {field: 'orderID',width:120,  title: '高度',filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: true},
    {field: 'orderID',width:120,  title: '厚度',filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: true},
    {field: 'orderID',width:120,  title: '库存编号',filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: true},
    {field: 'orderID',width:120,  title: '等级',filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: true},
    {field: 'orderID',width:120,  title: '面积',filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: true},
    {field: 'orderID',width:120,  title: '换算率',filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: true},
    {field: 'orderID',width:120,  title: '未领数量',filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: true},
    {field: 'orderID',width:120,  title: '返库数量',filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: true},
    {field: 'orderID',width:120,  title: '总数量',filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: true},
    {field: 'orderID',width:120,  title: '库区',filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: true},
    {field: 'orderID',width:120,  title: '库位',filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: true},
    {field: 'orderID',width:120,  title: '工程单号',filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: true},
    {field: 'orderID',width:120,  title: '生产日期',filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: true},
    {field: 'orderID',width:120,  title: '备注',filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: true},
  ],//表头按钮
  toolbarConfig: {
    buttons: [
      {'code': 'add', 'name': t('basicData.save'),status: 'primary',icon: 'vxe-icon-save'},
      {'code': 'toExamine', 'name': t('basicData.review'),status: 'primary'},
      {'code': 'CounterExamination', 'name': t('basicData.cancelReview'),status: 'primary'}
    ],
    import: false,
    /*import: false,
    export: true,
    print: true,
    print: true,*/
    zoom: true,
    custom: true
  },
@@ -81,19 +488,23 @@
})
const gridEvents = {
  toolbarButtonClick ({ code }) {
    const $grid = xGrid.value
    if ($grid) {
      switch (code) {
        case 'Craft': {
          router.push({path: '/main/order/updateOrderCraft', query: { orderID: 12123 }})
          break
        }
const validRules = ref({
  returnQuantity: [{
    validator (e) {
     if (e.row.returnQuantity ==="") {
        return new Error("返库数量不能为空或者是等于0")
      }
      const regex = /^[1-9]\d*$/g
      if ( !regex.test(e.row.returnQuantity) ) {
        return new Error(t('productStock.pleaseEnterAPositiveInteger'))
      }
    }
  }
}
  }]
})
</script>
@@ -102,52 +513,60 @@
    <div class="order-primary" style="background-color: white">
      <el-row>
        <el-col  :span="2"><el-text>交货日期:</el-text></el-col>
        <el-col  :span="4">
          <el-date-picker
              type="week"
              format="[Week] ww"
              placeholder="选择日期"/>
        </el-col>
        <el-col  :span="2"><el-text>*退料员/供应商:</el-text></el-col>
        <el-col  :span="4"><el-input/></el-col>
        <el-col  :span="2"><el-text>*退料班组:</el-text></el-col>
        <el-col  :span="4">
          <el-select  clearable placeholder=" " >
            <el-option/>
          </el-select>
        </el-col>
        <el-col  :span="2"><el-text>*制单员:</el-text></el-col>
        <el-col  :span="4">
          <el-select  clearable placeholder=" " >
            <el-option />
          </el-select>
        </el-col>
        <!--      <el-col :span="2"><el-text  /></el-col>-->
        <el-col  :span="2"><el-text>返库日期:</el-text></el-col>
        <el-col  :span="3"><el-input  v-model="titleUploadData.createTime" :readonly="true" ></el-input></el-col>
        <el-col  :span="2"><el-text>领料员/供应商:</el-text></el-col>
        <el-col  :span="3"><el-input v-model="titleUploadData.materialRequisitionPersonnel" /></el-col>
        <el-col  :span="2"><el-text>领料班组/供应商:</el-text></el-col>
        <el-col  :span="3"><el-input v-model="titleUploadData.materialRequisitionTeam" /></el-col>
        <el-col  :span="2"><el-text>仓管员:</el-text></el-col>
        <el-col  :span="3"><el-input v-model="titleUploadData.warehouseManager" :readonly="true" /></el-col>
      </el-row>
      <el-row>
        <el-col  :span="2"><el-text>*出库类型:</el-text></el-col>
        <el-col  :span="4">
          <el-select  clearable placeholder=" " >
            <el-option/>
        <el-col  :span="2"><el-text>返库类型:</el-text></el-col>
        <el-col  :span="3">
          <el-select v-model="titleUploadData.returningType"  clearable placeholder=""  >
            <el-option
                v-for="item in titleSelectJson['returningType']"
                :key="item.id"
                :label="item.operateTypeName"
                :value="item.operateTypeName"
            />
          </el-select>
        </el-col>
        <el-col  :span="2"><el-text>订单编号:</el-text></el-col>
        <el-col  :span="4"><el-text /></el-col>
        <el-col  :span="2"><el-text>项目名称:</el-text></el-col>
        <el-col  :span="4"><el-text /></el-col>
        <el-col  :span="2"><el-text>批次号:</el-text></el-col>
        <el-col  :span="4"><el-text /></el-col>
        <el-col  :span="2"><el-text>销售单号:</el-text></el-col>
        <el-col  :span="3"><el-input v-model="titleUploadData.orderId" /></el-col>
        <el-col  :span="2"><el-text>项目名称:</el-text></el-col>
        <el-col  :span="3"><el-input v-model="titleUploadData.project" /></el-col>
        <el-col  :span="2"><el-text>批次:</el-text></el-col>
        <el-col  :span="3"><el-input v-model="titleUploadData.batch" /></el-col>
      </el-row>
      <el-row>
        <el-select v-model="value" placeholder="请选择类别" @change="getStoreWork" style="margin-top: 10px;border: #181818 1px solid;">
          <el-option
              v-for="item in options"
              :key="item.value"
              :label="item.label"
              :value="item.value"
          />
        </el-select>
      </el-row>
    </div>
    <div class="order-detail">
      <vxe-grid
          max-height="97%"
          class="mytable-scrollbar"
          ref="xGrid"
          v-bind="gridOptions"
          v-on="gridEvents"
          :edit-rules="validRules"
      >
        <template #num1_filter="{ column, $panel }">
          <div>
@@ -157,12 +576,14 @@
          </div>
        </template>
        <template #inventoryOrganization="{ row }">
          <vxe-select v-model="row.inventoryOrganization" transfer >
            <vxe-option v-for="item in titleSelectJson['inventoryOrganization']"  :key="item.ID" :label="item.operateTypeName" :value="item.operateTypeName"/>
          </vxe-select>
        </template>
      </vxe-grid>
      <el-row justify="center">
          <el-button  id="searchButton" type="primary" :icon="Search" style="margin-right:20px;">清除</el-button>
          <el-button  id="searchButton" type="primary" :icon="save" style="margin-left:20px;">确定</el-button>
      </el-row>
    </div>
  </div>
</template>