廖井涛
2024-02-27 926a1e8b90381c7aa085d5462d78de9d2cc6034d
north-glass-erp/northglass-erp/src/views/pp/processCard/AddProcessCard.vue
@@ -11,9 +11,12 @@
import Sortable from 'sortablejs'
import BasicTable from '@/components/basic/BasicTable.vue'
import {VXETable} from "vxe-table";
import useUserInfoStore from "@/stores/userInfo";
let productGlassTypeStore = useProductGlassTypeStore()
let router = useRouter()
const userStore = useUserInfoStore()
const username = userStore.user.userName
const getTableRow = (row, type) => {
  switch (type) {
    case 'edit' : {
@@ -39,6 +42,15 @@
  }
}
let flag = $ref(true)
function intoCreateProduct(){
  if(flag){
    router.push(`/main/processCard/SplittingDetails?orderId=${orderId}`)
  }else {
    router.push('/main/processCard/SplittingDetails?orderId=${orderId}')
  }
  flag=!flag
}
//定义时间
const form = reactive({
@@ -68,16 +80,16 @@
let filterData = ref({
  product: {
    thickness: '',
    totalThickness:''
    totalThickness: ''
  },
  orderDetail: {
    orderNumber: '',
    height: '',
    computeGrossArea: '',
    quantity: '',
    shape:'',
    width:'',
    weight:''
    binningQuantity: '',
    shape: '',
    width: '',
    weight: ''
  }
})
@@ -99,7 +111,7 @@
request.post(`/processCard/selectNoCard/${orderId}/${productionId}`, filterData.value).then((res) => {
  if (res.code == 200) {
    console.log(res.data.data)
    console.log(res.data)
    pageTotal.value = res.data.total
    produceList = produceList.value.concat(deepClone(res.data.data))
    xGrid.value.reloadData(produceList)
@@ -114,9 +126,11 @@
  // 手动触发筛选
  $panel.changeOption(event, !!option.data, option)
}
function padLeftZero(str) {
  return ('00' + str).substr(str.length)
}
function filterChanged(column) {
  gridOptions.loading = true
  //筛选条件发生变化条件发生变化
@@ -134,12 +148,13 @@
  request.post(`/processCard/selectNoCard/${orderId}/${productionId}`, filterData.value).then((res) => {
    if(res.code==200){
      pageTotal.value=res.data.total
    if (res.code == 200) {
      pageTotal.value = res.data.total
      produceList = deepClone(res.data.data)
      xGrid.value.loadData(produceList)
      gridOptions.loading=false
    }else{
      gridOptions.loading = false
    } else {
      ElMessage.warning(res.msg)
    }
  })
@@ -151,21 +166,21 @@
  return regex.test(value); // 返回true/false
}
//子组件接收参数
//右侧子组件接收参数
const xGrid = ref()
const gridOptions = reactive({
  border:  "full",//表格加边框
  border: "full",//表格加边框
  keepSource: true,//保持源数据
  align: 'center',//文字居中
  stripe:true,//斑马纹
  rowConfig: {isCurrent: true, isHover: true,height: 30},//鼠标移动或选择高亮
  stripe: true,//斑马纹
  rowConfig: {isCurrent: true, isHover: true, height: 30},//鼠标移动或选择高亮
  id: 'CustomerList',
  showFooter: true,//显示脚
  printConfig: {},
  importConfig: {},
  exportConfig: {},
  scrollY:{ enabled: true },//开启虚拟滚动
  showOverflow:true,
  scrollY: {enabled: true},//开启虚拟滚动
  showOverflow: true,
  columnConfig: {
    resizable: true,
    useKey: true
@@ -181,36 +196,34 @@
    mode: 'row',
    showStatus: true
  },//表头参数
  columns:[
  columns: [
    {type: 'checkbox', fixed: "left", title: '选择'},
    {field: 'orderDetail.orderNumber', title: '订序',filters:[{ data: '' }],slots: { filter: 'num1_filter' } },
    {field: 'orderDetail.shape',  title: '形状', showOverflow:"ellipsis" ,filters:[{ data: '' }],slots: { filter: 'num1_filter' }},
    {field: 'orderDetail.width', title: '宽', filters:[{ data: '' }],slots: { filter: 'num1_filter' }},
    {field: 'orderDetail.height', title: '高',filters:[{ data: '' }],slots: { filter: 'num1_filter' }},
    {field: 'orderDetail.quantity', title: '数量', showOverflow:"ellipsis"},
    {field: 'orderDetail.computeGrossArea', title: '面积'},
    {field: 'product.totalThickness', title: '总厚度'},
    {field: 'product.thickness', title: '玻璃厚度'},
    {field: 'orderDetail.weight', title: '重量'}
    {field: 'orderNumber', title: '订序', filters: [{data: ''}], slots: {filter: 'num1_filter'}},
    {field: 'shape', title: '形状', showOverflow: "ellipsis", filters: [{data: ''}], slots: {filter: 'num1_filter'}},
    {field: 'width', title: '宽', filters: [{data: ''}], slots: {filter: 'num1_filter'}},
    {field: 'height', title: '高', filters: [{data: ''}], slots: {filter: 'num1_filter'}},
    {field: 'baiscQuantity', title: '待分数量', showOverflow: "ellipsis"},
    {field: 'computeGrossArea', title: '待分面积'},
    {field: 'totalThickness', title: '总厚度'},
    {field: 'thickness', title: '玻璃厚度'},
    {field: 'weight', title: '重量'}
  ],//表头按钮
  toolbarConfig: {
    // buttons: [{
    //
    // }],
    import: false,
    export: true,
    print: true,
    // import: false,
    // export: true,
    // print: true,
    zoom: true,
    custom: true
  },
  data:  [
  ],//table body实际数据
  data: [],//table body实际数据
  //脚部求和
  footerMethod ({ columns, data }) {//页脚函数
    let footList=['总数量','总面积','分箱数']
    return[
  footerMethod({columns, data}) {//页脚函数
    let footList = ['baiscQuantity', 'computeGrossArea', 'totalThickness','thickness', 'weight']
    return [
      columns.map((column, columnIndex) => {
        if (columnIndex === 0) {
          return '合计:'
@@ -226,65 +239,316 @@
})
//左侧子组件接收参数
const xGridLeft = ref()
const gridLeftOptions = 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: 'checkbox', fixed: "left", title: '选择'},
    {field: 'processId', title: '流程卡号', filters: [{data: ''}], slots: {filter: 'num1_filter'}, width: 130},
    {
      field: 'orderNumber',
      title: '订序',
      showOverflow: "ellipsis",
      filters: [{data: ''}],
      slots: {filter: 'num1_filter'}
    },
    {field: 'landingSequence', title: '落架顺序', filters: [{data: ''}], slots: {filter: 'num1_filter'}},
    {field: 'shape', title: '形状', filters: [{data: ''}], slots: {filter: 'num1_filter'}},
    {field: 'width', title: '宽', showOverflow: "ellipsis"},
    {field: 'height', title: '高'},
    {field: 'quantity', title: '总数量'},
    {field: 'totalThickness', title: '总厚度'},
  ],//表头按钮
  toolbarConfig: {
    buttons: [
      {code: 'saveFlowCard', name: '保存', status: 'primary', icon: 'vxe-icon-save'},
    ],
    import: false,
    export: true,
    print: true,
    zoom: true,
    custom: true
  },
  data: [],//table body实际数据
  //脚部求和
  footerMethod({columns, data}) {//页脚函数
    let footList = ['总数量', '总面积', '分箱数']
    return [
      columns.map((column, columnIndex) => {
        if (columnIndex === 0) {
          return '合计:'
        }
        if (footList.includes(column.field)) {
          return sumNum(data, column.field)
        }
        return ''
      })
    ]
  }
})
//创建流程卡
const createProcessCard = () => {
  const $grid = xGrid.value
  const checkedList = $grid.getCheckboxRecords()
  if (checkedList.length === 0) {
    ElMessage.warning("请先选择右侧数据")
    return
  }
  //productionId
  const $gridLeft = xGridLeft.value
  const leftData = $gridLeft.getTableData().fullData
  let index = 1
  if (leftData.length !== 0) {
    index = leftData[0].landingSequence + 1
    //index = index.toString().padStart(2, '0')
  }
  const processId = productionId + index.toString().padStart(2, '0')
  checkedList.forEach((item) => {
    item.processId = processId
    item.landingSequence = index
  })
  $gridLeft.insertAt(checkedList)
  $grid.remove(checkedList)
}
let checkedNum = ref('')
//向右边表格添加数据
const addRight = () => {
  try {
    //左边表格定义
    const $gridLeft = xGridLeft.value
    //右边表格定义
    const $grid = xGrid.value
    //获取左边表格checkbox选中的数据
    const checkedList = $gridLeft.getCheckboxRecords()
    //判断左边表格是否有选中的数据
    if (checkedList.length === 0) {
      ElMessage.warning("请先选择左侧数据")
      return
    }
    const regex = /^(\d+|)$/;
    if (!regex.test(checkedNum.value)) {
      ElMessage.warning("请输入正整数")
      return
    }
    //判断正整数
    if (/^[1-9]\d*$/.test(checkedNum.value)) {
      //对选中的左边表格数据进行循环
      checkedList.forEach((item) => {
        //判断可用数量是否大于等于输入的数量,不满足则抛出异常
        if (item.quantity < checkedNum.value) throw new Error("请输入小于等于可用数量的数字");
        //左边表格可用数量减去输入的数量
        item.quantity = item.quantity - checkedNum.value
        //右边表格数据
        let rightData = $grid.getTableData().fullData
        //右边表格数据中查找当前数据下标
        let filterIndex = rightData.findIndex(item1 => item1.orderNumber === item.orderNumber)
        //如果右边表格数据中存在当前数据则数量相加
        if (filterIndex >= 0) {
          rightData[filterIndex].baiscQuantity = rightData[filterIndex].baiscQuantity * 1 + checkedNum.value * 1
          //如果左边数量为0时删除此条数据
          if (item.quantity === 0) {
            $gridLeft.remove(item)
          }
        } else {
          //右边表格没有此条数据则往右边表格插入数据
          item.baiscQuantity = checkedNum.value
          $grid.insert(item)
        }
      })
    } else if (checkedNum.value === '') {//判断数量输入框有无输入数字
      checkedList.forEach((item) => {
        let rightData = $grid.getTableData().fullData
        let filterIndex = rightData.findIndex(item1 => item1.orderNumber === item.orderNumber)
        //无输入并且如果右边表格数据中存在当前数据则数量相加
        if (filterIndex > -1) {
          rightData[filterIndex].baiscQuantity = rightData[filterIndex].baiscQuantity * 1 + item.quantity * 1
        } else {
          $grid.insert(item)
        }
        $gridLeft.remove(item)
      })
    }
  } catch (e) {
    ElMessage.warning(e.message)
  }
}
//向左边表格添加数据
const addLeft = () => {
  try {
    //左边表格定义
    const $gridLeft = xGridLeft.value
    //右边表格定义
    const $grid = xGrid.value
    //获取右边表格checkbox选中的数据
    const checkedList = $grid.getCheckboxRecords()
    //获取左边表格checkbox选中的数据
    const checkedListLeft = $gridLeft.getCheckboxRecords()
    //判断右边表格是否有选中的数据
    if (checkedList.length === 0) {
      ElMessage.warning("请先选择右侧数据")
      return
    }
    if (checkedListLeft.length !== 1) {
      ElMessage.warning("请先选择左侧一条数据")
      return
    }
    const regex = /^(\d+|)$/;
    if (!regex.test(checkedNum.value)) {
      ElMessage.warning("请输入正整数")
      return
    }
    //判断正整数
    if (/^[1-9]\d*$/.test(checkedNum.value)) {
      checkedList.forEach((item) => {
        //判断可用数量是否大于等于输入的数量,不满足则抛出异常
        if (item.baiscQuantity < checkedNum.value) throw new Error("请输入小于等于可用数量的数字");
        item.baiscQuantity = item.baiscQuantity - checkedNum.value
        //左边表格数据
        let leftData = $gridLeft.getTableData().fullData
        //左边表格数据中查找当前数据下标
        let filterIndex = leftData.findIndex(item1 => item1.orderNumber === item.orderNumber)
        //如果右边表格数据中存在当前数据则数量相加
        if (filterIndex >= 0) {
          leftData[filterIndex].quantity = leftData[filterIndex].quantity * 1 + checkedNum.value * 1
          if (item.baiscQuantity === 0) {
            $grid.remove(checkedList)
          }
        } else {
          item.quantity = checkedNum.value
          item.processId = checkedListLeft[0].processId
          item.landingSequence = checkedListLeft[0].landingSequence
          $gridLeft.insert(item)
        }
      })
    } else if (checkedNum.value === '') {//判断数量输入框有无输入数字
      checkedList.forEach((item) => {
        item.processId = checkedListLeft[0].processId
        item.landingSequence = checkedListLeft[0].landingSequence
      })
      $gridLeft.insertAt(checkedList)
      $grid.remove(checkedList)
    }
  } catch (e) {
    ElMessage.warning(e.message)
  }
}
//保存流程卡数据
const gridEvents = {
  toolbarButtonClick({code}) {
    const $grid = xGridLeft.value
    if ($grid) {
      switch (code) {
        case 'saveFlowCard': {
          const $table = xGridLeft.value
          const $tableRight = xGrid.value
          if ($table) {
            const selectRecords = $table.getCheckboxRecords()
            const selectRight = $tableRight.getCheckboxRecords()
            if (selectRecords.length === 0){
              ElMessage.warning("请先选择保存的数据")
              return
            }
            if (selectRight.length > 0){
              ElMessage.warning("请先将右侧数据全部建立流程卡后保存")
              return;
            }
            //console.log(selectRecords[0].quantity)
            let flowCardData = ref({
              flowCard: selectRecords,
              userName:username,
              productionId:productionId
            })
           console.log(flowCardData.value)
            request.post("/processCard/addFlowCard", flowCardData.value).then((res) => {
              if (res.code == 200) {
                ElMessage.success("保存成功")
                location.reload();
              } else {
                ElMessage.warning(res.msg)
                router.push("/login")
              }
            })
          }
          return;
        }
      }
    }
  },
}
</script>
<template>
  <div>
    <div class="header">
      <el-button
          style="float: left"
          @click="intoCreateProduct"
          id="searchButton1"
          type="primary"
          :icon="ArrowLeftBold"
          round >
        {{flag?'返回':'返回'}}
      </el-button>
      <el-button type="primary">保存分架</el-button>
      <el-button type="primary">分架汇总</el-button>
      <el-button type="primary">左侧全选</el-button>
      <el-button type="primary">右侧全选</el-button>
    </div>
    <div class="common-layout">
      <el-container height="100%">
        <el-aside width="44%" style="">
          <el-table :data="tableData" border style="width: 100%" height="100%">
            <el-table-column sortable prop="processCard" label="流程卡号" width="120" />
            <el-table-column prop="orderSequence" label="订序" width="60" />
            <el-table-column prop="landingSequence" label="落架顺序" width="85" />
            <el-table-column prop="floorNumber" label="楼层编号" :show-overflow-tooltip='true' width="120" />
            <el-table-column prop="shape" label="形状" width="65" />
            <el-table-column prop="longSide" label="长边" width="65" />
            <el-table-column prop="shortSide" label="短边" width="65" />
            <el-table-column prop="total" label="总数量" width="75" />
            <el-table-column prop="totalThickness" label="总厚度" width="75" />
          </el-table><!-- <h1>{{msg}}</h1> -->
        </el-aside>
    <div class="common-layout" style="height: 100%">
      <div class="header">
        <el-main width="12%" style="">
          <span>未分数量:45</span><br>
          <span>未分重量:333</span><br>
          <span>选中数量:<el-input></el-input></span><br>
          <el-button type="primary"> → </el-button>
          <br>
          <br>
          <el-button type="primary">  ← </el-button>
          <br>
          <br>
          <el-button type="primary">建立流程卡</el-button>
        </el-main>
        <el-button
            style="float: left"
            @click="intoCreateProduct"
            id="searchButton1"
            type="primary"
            :icon="ArrowLeftBold"
            round>
          {{ flag ? '返回' : '返回' }}
        </el-button>
        <!--      <el-button  type="primary">保存分架</el-button>-->
<!--              <el-button type="primary" :hidden="true">分架汇总</el-button>-->
        <div style="width: 100px;">
        <el-aside width="44%" style="">
        </div>
      </div>
      <el-container height="600px">
        <el-aside width="44%" >
          <vxe-grid
              max-height="100%"
              @filter-change="filterChanged"
              class="mytable-scrollbar"
              ref="xGrid"
              v-bind="gridOptions"
              ref="xGridLeft"
              v-bind="gridLeftOptions"
              v-on="gridEvents"
          >
            <!--      @toolbar-button-click="toolbarButtonClickEvent"-->
            <!--      下拉显示所有信息插槽-->
@@ -292,9 +556,62 @@
              <ul class="expand-wrapper">
                <li v-for="(item,index) in gridOptions.columns" v-show="item.field!=undefined ">
                  <span style="font-weight: bold">{{ item.title + ':  ' }}</span>
                  <span v-if="hasDecimal(item.field)">{{ row[item.field.split('.')[0]][item.field.split('.')[1]] }}</span>
                  <span v-if="hasDecimal(item.field)">{{
                      row[item.field.split('.')[0]][item.field.split('.')[1]]
                    }}</span>
                  <span v-else>{{ row[item.field] }}</span>
                </li>
              </ul>
            </template>
            <!--左边固定显示的插槽-->
            <template #button_slot="{ row }">
              <el-button @click="getTableRow(row,'edit')" link type="primary" size="small">打印</el-button>
              <el-button @click="getTableRow(row,'setType')" link type="primary" size="small">排版</el-button>
              <el-button @click="getTableRow(row,'delete')" link type="primary" size="small">删除</el-button>
            </template>
            <template #num1_filter="{ column, $panel }">
              <div>
                <div v-for="(option, index) in column.filters" :key="index">
                  <input type="type" v-model="option.data" @input="changeFilterEvent($event, option, $panel)"/>
                </div>
              </div>
            </template>
          </vxe-grid>
        </el-aside>
        <el-main width="12%" style="">
          <span>选中数量:<el-input type="number" v-model="checkedNum"></el-input></span><br>
          <el-button type="primary" @click="addRight"> →</el-button>
          <br>
          <br>
          <el-button type="primary" @click="addLeft"> ←</el-button>
          <br>
          <br>
          <el-button @click="createProcessCard" type="primary">建立流程卡</el-button>
        </el-main>
        <el-aside width="45%" height="500px" style="">
          <vxe-grid
              max-height="97%"
              @filter-change="filterChanged"
              class="mytable-scrollbar"
              ref="xGrid"
              v-bind="gridOptions"
          >
            <!--      @toolbar-button-click="toolbarButtonClickEvent"-->
            <!--      下拉显示所有信息插槽-->
            <template #content="{ row }">
              <ul class="expand-wrapper">
                <li v-for="(item,index) in gridOptions.columns" v-show="item.field!=undefined ">
                  <span style="font-weight: bold">{{ item.title + ':  ' }}</span>
                  <span v-if="hasDecimal(item.field)">{{
                      row[item.field.split('.')[0]][item.field.split('.')[1]]
                    }}</span>
                  <span v-else>{{ row[item.field] }}</span>
                </li>
              </ul>
            </template>
@@ -313,8 +630,6 @@
                </div>
              </div>
            </template>
          </vxe-grid>
        </el-aside>
      </el-container>
@@ -323,19 +638,24 @@
</template>
<style scoped>
.common-layout{
.common-layout {
  height: 100%;
}
.el-aside{
.header{
  width: 100%;
  height: 35px;
  margin-top: -20px;
}
.el-aside {
  height: 100%;
}
.el-main{
.el-main {
  height: 100%;
  text-align: center;
}
</style>