廖井涛
2024-04-25 ed6f35069824d71ee6da599a328d865eb0c58550
north-glass-erp/northglass-erp/src/views/sd/order/CreateOrder.vue
@@ -7,6 +7,7 @@
import deepClone from "@/utils/deepClone"
import  useUserInfoStore from '@/stores/userInfo'
import SelectProduct from "@/views/sd/product/SelectProduct.vue"
import OrderOtherMoney from "@/components/sd/order/OrderOtherMoney.vue"
import {changeFilterEvent,filterChanged} from "@/hook"
import {addListener,toolbarButtonClickEvent} from "@/hook/mouseMove"
import downLoadFile from "@/hook/downLoadFile"
@@ -15,11 +16,17 @@
let dialogTableVisible = ref(false)
let productVisible = ref(false)
let errorAreaVisible = ref(false)
let otherMoneyVisible = ref(false)
let errorArea = ref(null)
const userStore = useUserInfoStore()
const router = useRouter()
const route = useRoute()
const xGrid = ref()
let cellArea = ref()
const shapeList = ref([
    {name:'普形',value:1}, {name:'异形',value: 2}
])
// 定义表头上传数据
const titleUploadData = ref({
@@ -52,6 +59,7 @@
})
//定义接收加载表头下拉数据
const titleSelectJson = ref({
  orderOtherMoney:[],
  orderType:[],
  alType:[],
  icon:[],
@@ -63,19 +71,25 @@
let filterData = ref({})
let rowIndex = ref(null)
let rowClickIndex = ref(null)
let otherMoney = ref(null)
const gridOptions = reactive({
  loading:false,
  showHeaderOverflow: false,
  showFooterOverflow: false,
  border:  "full",//表格加边框
  keepSource: true,//保持源数据
  align: 'center',//文字居中
  stripe:true,//斑马纹
  rowConfig: {isCurrent: true, isHover: true,height: 30},//鼠标移动或选择高亮
  //virtualScroll: true, // 开启虚拟滚动功能
  id: 'OrderList',
  showFooter: true,//显示脚
  printConfig: {},
  importConfig: {},
  exportConfig: {},
  scrollY:{ enabled: true },//开启虚拟滚动
  scrollY:{ enabled: true,gt:13 },//开启虚拟滚动
  //scrollX:{ enabled: true,gt:15 },//开启虚拟滚动
  showOverflow:true,
  menuConfig: {
    body: {
@@ -87,6 +101,8 @@
          { code: 'copyAll', name: t('basicData.sameAfterwards'), prefixIcon: 'vxe-icon-feedback', visible: true, disabled: false },
          { code: 'clearChecked', name: t('basicData.clearSelection'), prefixIcon: 'vxe-icon-indicator', visible: true, disabled: false },
          { code: 'computedMoney', name: t('basicData.calculateAmount'), prefixIcon: 'vxe-icon-chart-bar-x', visible: true, disabled: true },
          { code: 'errorArea', name: '误差结算面积', prefixIcon: 'vxe-icon-chart-bar-x', visible: true, disabled: false },
          { code: 'otherMoney', name: '其他金额', prefixIcon: 'vxe-icon-chart-bar-x', visible: true, disabled: false }
        ]
      ]
    }
@@ -104,7 +120,8 @@
  editConfig: {
    trigger: 'click',
    mode: 'cell',
    showStatus: true
    showStatus: true,
    showIcon:false
  },//表头参数
  columns:[
    {type: 'seq',fixed:"left", title: t('basicData.Number'), width: 80 },
@@ -120,11 +137,16 @@
    {field: 'grossArea',width:160,  title: t('order.trueGrossArea'),filters:[{ data: '' }],slots: { filter: 'num1_filter'}, sortable: true,filterMethod:filterChanged},
    {field: 'computeArea',width:180,  title: t('order.computeArea'),editRender: { name: 'input'},filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: true,filterMethod:filterChanged},
    {field: 'computeGrossArea',width:200,  title: t('order.computeGrossArea'),filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: true,filterMethod:filterChanged},
    {field: 'shape',width:120,  title: t('order.shape'),editRender: { name: 'input'},filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: true,filterMethod:filterChanged},
    {field: 'shape',width:120,
      title: t('order.shape'),
      editRender: { name: 'input'},
      filters:[{ data: '' }],
      slots: { filter: 'num1_filter',edit:'shape_edit' }, sortable: true,filterMethod:filterChanged},
    {field: 'bendRadius',width:160,  title: t('order.bendRadius'),editRender: { name: 'input'},filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: true,filterMethod:filterChanged},
    {field: 'edgingType',width:160,  title: t('order.edgingType'),editRender: { name: 'input'},filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: true,filterMethod:filterChanged},
    {field: 'processingNote',width:200,  title: t('order.processingNote'),editRender: { name: 'input'},filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: true,filterMethod:filterChanged},
    {field: 'remarks',width:140,  title: t('basicData.remarks'),editRender: { name: 'input'},filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: true,filterMethod:filterChanged}
    {field: 'remarks',width:140,  title: t('basicData.remarks'),editRender: { name: 'input'},filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: true,filterMethod:filterChanged},
  ],
  //表单验证
@@ -188,7 +210,7 @@
          }
        }
      }
    ]
    ],
  },
  toolbarConfig: {
    buttons: [
@@ -292,7 +314,8 @@
            }
            let order ={
              title:titleUploadData.value,
              detail:$grid.getTableData().tableData
              detail:$grid.getTableData().tableData,
              otherMoney:otherMoney.value
            }
            saveOrder(order)
          }
@@ -300,7 +323,8 @@
        }
      }
    }
  },//右键按钮事件
  },
  //右键按钮事件
  menuClick ({ menu, row, column }) {
    const $grid = xGrid.value
    if ($grid) {
@@ -380,6 +404,14 @@
          gridOptions.menuConfig.body.options[0][5].disabled=true
          break
        }
        case 'errorArea' :{
          errorAreaVisible.value=true
          break
        }
        case 'otherMoney' :{
          otherMoneyVisible.value=true
          break
        }
      }
    }
  },
@@ -410,6 +442,7 @@
//初始化判断是否有id传入
onMounted(()=>{
  //启用表格拖动选中
  addListener(xGrid.value,gridOptions)
  const str = route.query.orderId || history.state.orderId
@@ -465,17 +498,21 @@
      }
      if(res.data.order.productionOrder !==0 ){
        gridOptions.toolbarConfig.buttons[2].disabled = true
      }
      //加载副表数据
      xGrid.value.reloadData(res.data.orderDetails)
      const orderDetails = res.data.orderDetails
      orderDetails.forEach(item => {
        item.otherColumns = JSON.parse(item.otherColumns)
      })
      otherMoney.value =res.data.orderOtherMoneyList
          //加载副表数据
      xGrid.value.reloadData(orderDetails)
    }else{
      ElMessage.error(res.msg)
    }
  })
})
//作废订单
const cancelOrder = () => {
  request.post(`/order/cancelOrder/${titleUploadData.value.orderId}`).then((res) =>{
    if (res.code== 200){
@@ -490,9 +527,36 @@
//页面第一次加载执行
request.get(`/basicData/orderBasicData`).then((res) => {
  if(res.code==200){
    titleSelectJson.value=deepClone(res.data)
    //其他金额
    otherMoney.value = titleSelectJson.value.orderOtherMoney[0]
    //let columns = []
    otherMoney.value.forEach(item => {
      let column = {
        field: `otherColumns.${item.column}`,
        width:50,  title: item.alias,
        editRender: {
          name: 'input',
        }
      }
      gridOptions.editRules[`otherColumns.${item.column}`] = [
        {
          validator ({ cellValue }) {
            const regex = /^(0|[1-9][0-9]{0,4}([.][0-9]{1,2})?)$/
            if (cellValue && !regex.test(cellValue)) {
              return new Error(t('basicData.msg.range99999Dec2'))
            }
          }
        }
      ]
      //columns.push(column)
      gridOptions.columns.push(column)
    })
    //进入页面下拉框设置默认值
    titleUploadData.value.orderType = titleSelectJson.value.orderType[0].basicName
    titleUploadData.value.orderClassify = titleSelectJson.value.orderClassify[0].basicName
    titleUploadData.value.icon = titleSelectJson.value.icon[0].basicName
@@ -530,7 +594,12 @@
  request.post(`/order/updateOrderMoney`,updateData).then(res => {
    if (res.code == 200){
      ElMessage.success( t('order.msg.updateAmountSuccessfully') )
      router.push({path:'/main/order/createOrder',query:{orderId:titleUploadData.value.orderId,random:Math.random()}})
      router.push({path:'/main/order/createOrder',
        query:{
          orderId:titleUploadData.value.orderId,
          random:Math.random()
        }
      })
    }
  })
@@ -584,6 +653,9 @@
  list.forEach((item)=>{
    countMoney += parseFloat(item.grossAmount)
  })
  // otherMoney.value.forEach(item => {
  //   countMoney+=item.quantity*item.price
  // })
  return parseFloat((countMoney).toFixed(2))
}
//导入功能
@@ -625,6 +697,16 @@
  downLoadFile('/importTemplate.xlsx','importTemplate.xlsx')
}
//字符串转object
function getNestedProperty(obj, path) {
  return path.split('.').reduce(function(o, p) {
    if(o && o.hasOwnProperty(p)) {
      return o[p];
    }
  }, obj);
}
//行单元格修改修改触发此事件
const editClosedEvent = ({ row, column }) => {
  //判断修改相应的数值修改面积与金额
@@ -638,10 +720,59 @@
     row.computeGrossArea=parseFloat((row.computeArea*row.quantity).toFixed(2))
     row.grossAmount=parseFloat((row.price * row.computeGrossArea).toFixed(2))
   }
   // else if(column.property.indexOf('otherColumns.M')>-1){
   //   let quantity = 0
   //   xGrid.value.getTableData().fullData.forEach(item => {
   //     let orderQuantity = isNaN(item.quantity) ? 0 : item.quantity
   //     let value = isNaN((getNestedProperty(item,column.property)*1)) ? 0 : (getNestedProperty(item,column.property)*1)
   //     quantity += orderQuantity*value
   //   })
   //   if(!isNaN(quantity)){
   //     otherMoney.value.forEach(item => {
   //       if(item.column===column.property.split('.')[1]){
   //         item.quantity = quantity
   //       }
   //     })
   //   }
   // }
  titleUploadData.value.money=countMoney(xGrid.value.getTableData().fullData).toString()
    titleUploadData.value.money=countMoney(xGrid.value.getTableData().fullData).toString()
}
//误差面积计算方法
const errorAreaComputed = () => {
  const regex = /^(0(\.\d{1,2})?|([1-9]\d{0,4})(\.\d{1,2})?|99999(\.9{1,2})?)$/
  if (!regex.test(errorArea.value)) {
    ElMessage.warning(t('basicData.msg.range99999Dec2'))
    return
  }
  const fullData = xGrid.value.getTableData().fullData
  if (!fullData.length){
    ElMessage.warning("表格中无产品数据")
  }
  fullData.forEach((item,index) => {
    if( !isNaN(item.computeArea*1) && item.computeArea != null && item.computeArea*1 < errorArea.value){
      item.computeArea = errorArea.value
      item.computeGrossArea = parseFloat((item.computeArea*item.quantity).toFixed(2))
      item.grossAmount=parseFloat((item.price * item.computeGrossArea).toFixed(2))
    }
  })
  titleUploadData.value.money=countMoney(xGrid.value.getTableData().fullData).toString()
  errorAreaVisible.value= false
}
//关闭其他金额界面
const refOtherMoney = ref()
const closeOtherMoneyDialog = async (done) => {
  const flag = await refOtherMoney.value.validate()
  if(flag){
    done()
    titleUploadData.value.money=countMoney(xGrid.value.getTableData().fullData).toString()
  }
}
</script>
@@ -754,7 +885,7 @@
      <el-row>
        <el-col  :span="2"><el-text>{{$t('order.money')}}:</el-text></el-col>
        <el-col  :span="2"><el-text >{{titleUploadData.money}}</el-text></el-col>
        <el-col  :span="2"><el-text>{{$t('order.customers')}}:</el-text></el-col>
        <el-col  :span="2"><el-text>{{$t('order.contractId')}}:</el-text></el-col>
        <el-col  :span="2"><el-input v-model="titleUploadData.contractId"/></el-col>
        <el-col  :span="2"><el-text>{{$t('order.customerBatch')}}:</el-text></el-col>
        <el-col  :span="2"><el-input v-model="titleUploadData.customerBatch"/></el-col>
@@ -795,6 +926,11 @@
          <vxe-button  @click="importTemplate">{{$t('order.template')}}</vxe-button>
          <vxe-button  @click="importEvent">{{$t('order.import')}}</vxe-button>
        </template>
        <template #shape_edit="{ row }">
          <vxe-select v-model="row.shape" transfer>
            <vxe-option v-for="item in shapeList" :key="item" :value="item.value" :label="item.name" />
          </vxe-select>
        </template>
      </vxe-grid>
@@ -806,10 +942,34 @@
          :autosize="{ minRows: 2, maxRows: 20 }"
      />
    </el-dialog>
    <el-dialog v-model="productVisible"  style="width: 80%;height:75% ">
    <el-dialog id="product" v-model="productVisible"  style="width: 80%;height:75% ">
      <select-product :rowIndex="rowIndex" @getProductRow="getProductRow" style="width: 100%;height: 100%" />
    </el-dialog>
<!--误差结算-->
    <el-dialog v-model="errorAreaVisible"  style="width: 300px;height:150px ">
      <el-row>
        <el-col :span="10">
          <el-input
              v-model="errorArea"
              :placeholder="'误差值'"
          />
        </el-col>
        <el-col :span="6">
          <el-button @click="errorAreaComputed">确认</el-button>
        </el-col>
      </el-row>
    </el-dialog>
    <el-dialog v-model="otherMoneyVisible"
               :title="'其他金额'"
               :close-on-click-modal="false"
               :close-on-press-escape="false"
               :before-close="closeOtherMoneyDialog"
               style="width: 614px;height:445px ">
      <order-other-money
          ref="refOtherMoney"
          :otherMoney="otherMoney"
          style="width: 100%;height: 100%" />
    </el-dialog>
  </div>
</template>
@@ -843,5 +1003,9 @@
    -ms-user-select: none;
    user-select: none;
  }
  :deep(#product .el-dialog__body){
    height: 90%;
    width: 100%;
  }
</style>