廖井涛
2024-04-23 2f894921e5cf74910805f08a5e3180b68ac09e18
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,12 +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(['普形','异形'])
const shapeList = ref([
    {name:'普形',value:1}, {name:'异形',value: 2}
])
// 定义表头上传数据
const titleUploadData = ref({
@@ -53,6 +59,7 @@
})
//定义接收加载表头下拉数据
const titleSelectJson = ref({
  orderOtherMoney:[],
  orderType:[],
  alType:[],
  icon:[],
@@ -64,19 +71,23 @@
let filterData = ref({})
let rowIndex = ref(null)
let rowClickIndex = ref(null)
let otherMoney = ref(null)
const gridOptions = reactive({
  loading: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:15 },//开启虚拟滚动
  scrollX:{ enabled: true,gt:30 },//开启虚拟滚动
  showOverflow:true,
  menuConfig: {
    body: {
@@ -88,6 +99,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 }
        ]
      ]
    }
@@ -105,7 +118,8 @@
  editConfig: {
    trigger: 'click',
    mode: 'cell',
    showStatus: true
    showStatus: true,
    showIcon:false
  },//表头参数
  columns:[
    {type: 'seq',fixed:"left", title: t('basicData.Number'), width: 80 },
@@ -129,7 +143,8 @@
    {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},
  ],
  //表单验证
@@ -297,7 +312,8 @@
            }
            let order ={
              title:titleUploadData.value,
              detail:$grid.getTableData().tableData
              detail:$grid.getTableData().tableData,
              otherMoney:otherMoney.value
            }
            saveOrder(order)
          }
@@ -305,7 +321,8 @@
        }
      }
    }
  },//右键按钮事件
  },
  //右键按钮事件
  menuClick ({ menu, row, column }) {
    const $grid = xGrid.value
    if ($grid) {
@@ -385,6 +402,14 @@
          gridOptions.menuConfig.body.options[0][5].disabled=true
          break
        }
        case 'errorArea' :{
          errorAreaVisible.value=true
          break
        }
        case 'otherMoney' :{
          otherMoneyVisible.value=true
          break
        }
      }
    }
  },
@@ -415,6 +440,7 @@
//初始化判断是否有id传入
onMounted(()=>{
  //启用表格拖动选中
  addListener(xGrid.value,gridOptions)
  const str = route.query.orderId || history.state.orderId
@@ -470,17 +496,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){
@@ -495,9 +525,17 @@
//页面第一次加载执行
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'}}
      //columns.push(column)
      gridOptions.columns.push(column)
    })
    //进入页面下拉框设置默认值
    titleUploadData.value.orderType = titleSelectJson.value.orderType[0].basicName
    titleUploadData.value.orderClassify = titleSelectJson.value.orderClassify[0].basicName
@@ -595,6 +633,9 @@
  list.forEach((item)=>{
    countMoney += parseFloat(item.grossAmount)
  })
  // otherMoney.value.forEach(item => {
  //   countMoney+=item.quantity*item.price
  // })
  return parseFloat((countMoney).toFixed(2))
}
//导入功能
@@ -636,6 +677,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 }) => {
  //判断修改相应的数值修改面积与金额
@@ -649,10 +700,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>
@@ -765,7 +865,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>
@@ -808,7 +908,7 @@
        </template>
        <template #shape_edit="{ row }">
          <vxe-select v-model="row.shape" transfer>
            <vxe-option v-for="item in shapeList" :key="item" :value="item" :label="item" />
            <vxe-option v-for="item in shapeList" :key="item" :value="item.value" :label="item.name" />
          </vxe-select>
        </template>
@@ -823,9 +923,33 @@
      />
    </el-dialog>
    <el-dialog v-model="productVisible"  style="width: 80%;height:75% ">
      <select-product :rowIndex="rowIndex" @getProductRow="getProductRow" style="width: 100%;height: 100%" />
      <select-product :rowIndex="rowIndex" @getProductRow="getProductRow" style="width: 1188px;height: 500px" />
    </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>