chenrui
7 天以前 b31d8c3e70b3bf9c37aa1e407e54c0a46bf3a3ab
src/views/salesManagement/salesLedger/index.vue
@@ -9,7 +9,7 @@
            placeholder="请输入"
            @change="handleQuery"
            clearable
            :prefix-icon="Search"
            prefix-icon="Search"
        />
        <el-button type="primary" @click="handleQuery" style="margin-left: 10px">搜索</el-button>
      </div>
@@ -53,7 +53,7 @@
        <el-table-column label="业务员" prop="salesman" show-overflow-tooltip/>
        <el-table-column label="项目名称" prop="projectName" show-overflow-tooltip/>
        <el-table-column label="合同金额(元)" prop="contractAmount" show-overflow-tooltip/>
        <el-table-column label="录入人" prop="entryPerson" show-overflow-tooltip/>
        <el-table-column label="录入人" prop="entryPersonName" show-overflow-tooltip/>
        <el-table-column label="录入日期" prop="entryDate" show-overflow-tooltip/>
        <el-table-column fixed="right" label="操作" min-width="60" align="center">
          <template #default="scope">
@@ -104,8 +104,8 @@
          </el-col>
          <el-col :span="12">
            <el-form-item label="录入人:" prop="entryPerson">
              <el-select v-model="form.entryPerson" placeholder="请选择" clearable>
                <el-option v-for="item in userList" :key="item.nickName" :label="item.nickName" :value="item.nickName"/>
              <el-select v-model="form.entryPerson" placeholder="请选择" clearable @change="changs">
                <el-option v-for="item in userList" :key="item.userId" :label="item.nickName" :value="item.userId"/>
              </el-select>
            </el-form-item>
          </el-col>
@@ -121,6 +121,7 @@
                  type="date"
                  placeholder="请选择"
                  clearable
                  disabled
              />
            </el-form-item>
          </el-col>
@@ -157,16 +158,18 @@
        </el-row>
        <el-row :gutter="30">
          <el-col :span="24">
            <el-form-item label="附件材料·:" prop="remark">
            <el-form-item label="附件材料:" prop="remark">
              <el-upload
                  :file-list="fileList"
                  action="https://run.mocky.io/v3/9d059bf9-4660-45f2-925d-ce80ad6c4d15"
                  v-model:file-list="fileList"
                  :action="upload.url"
                  multiple
                  ref="fileUpload"
                  :headers="proxy.uploadHeader"
                  auto-upload
                  :headers="upload.headers"
                  :before-upload="handleBeforeUpload"
                  :on-error="handleUploadError"
                  :on-success="handleUploadSuccess"
                  :on-remove="handleRemove"
              >
                <el-button type="primary">上传</el-button>
                <template #tip>
@@ -191,17 +194,27 @@
        <el-row :gutter="30">
          <el-col :span="24">
            <el-form-item label="产品大类:" prop="productCategory">
              <el-select v-model="productForm.productCategory" placeholder="请选择" clearable>
              <!-- <el-select v-model="productForm.productCategory" placeholder="请选择" clearable>
                <el-option v-for="item in userList" :key="item.nickName" :label="item.nickName" :value="item.nickName"/>
              </el-select>
              </el-select> -->
              <el-tree-select
                  v-model="productForm.productCategory"
                  placeholder="请选择" clearable
                  check-strictly
                  @change="getModels"
                  :data="productOptions"
                  :render-after-expand="false"
                  style="width: 100%"
              />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="30">
          <el-col :span="24">
            <el-form-item label="规格型号:" prop="specificationModel">
              <el-select v-model="productForm.specificationModel" placeholder="请选择" clearable>
                <el-option v-for="item in userList" :key="item.nickName" :label="item.nickName" :value="item.nickName"/>
            <el-form-item label="规格型号:" prop="productModelId">
              <el-select v-model="productForm.productModelId" placeholder="请选择" clearable @change="getProductModel">
                <el-option v-for="item in modelOptions" :key="item.id" :label="item.model" :value="item.id"/>
              </el-select>
            </el-form-item>
          </el-col>
@@ -268,18 +281,22 @@
</template>
<script setup>
import { getToken } from "@/utils/auth"
import pagination from '@/components/PIMTable/Pagination.vue'
import { ref } from 'vue'
import {Search} from "@element-plus/icons-vue";
import {ElMessageBox } from "element-plus";
import useUserStore from '@/store/modules/user'
import {userListNoPage} from "@/api/system/user.js";
import {
  ledgerList,
  productList,
  customerList,
  addOrUpdateSalesLedger,
  getSalesLedgerWithProducts, delLedger, addOrUpdateSalesLedgerProduct, delProduct
  getSalesLedgerWithProducts, delLedger, addOrUpdateSalesLedgerProduct, delProduct, delLedgerFile
} from "@/api/salesManagement/salesLedger.js";
import {modelList, productTreeList} from "@/api/basicData/product.js";
const userStore = useUserStore()
const { proxy } = getCurrentInstance()
const tableData = ref([])
const productData = ref([])
@@ -287,6 +304,8 @@
const productSelectedRows = ref([])
const userList = ref([])
const customerOption = ref([])
const productOptions = ref([])
const modelOptions = ref([])
const tableLoading = ref(false)
const page = reactive({
  current: 1,
@@ -294,7 +313,6 @@
})
const total = ref(0)
const fileList = ref([])
const uploadList = ref([])
// 用户信息表单弹框数据
const operationType = ref('')
@@ -353,6 +371,12 @@
  }
})
const { productForm, productRules } = toRefs(productFormData)
const upload = reactive({
  // 上传的地址
  url: import.meta.env.VITE_APP_BASE_API + "/file/upload",
  // 设置上传的请求头部
  headers: { Authorization: "Bearer " + getToken() },
})
// 查询列表
/** 搜索按钮操作 */
@@ -374,7 +398,58 @@
      item.children = []
    })
    total.value = res.total
  }).catch(() => {
    tableLoading.value = false
  })
}
// 获取产品大类tree数据
const getProductOptions = () => {
  productTreeList().then(res => {
    productOptions.value = convertIdToValue(res)
  })
}
// 获取tree子数据
const getModels =(value) => {
  productForm.value.productCategory = findNodeById(productOptions.value, value)
  modelList({id: value}).then(res => {
    modelOptions.value = res
  })
}
const getProductModel =(value) => {
  const index = modelOptions.value.findIndex(item => item.id === value);
  if (index !== -1) {
    productForm.value.specificationModel = modelOptions.value[index].model;
  } else {
    productForm.value.specificationModel = null;
  }
}
const findNodeById = (nodes, productId) => {
  for (let i = 0; i < nodes.length; i++) {
    if (nodes[i].value === productId) {
      return nodes[i].label; // 找到节点,返回该节点
    }
    if (nodes[i].children && nodes[i].children.length > 0) {
      const foundNode = findNodeById(nodes[i].children, productId);
      if (foundNode) {
        return foundNode.label; // 在子节点中找到,返回该节点
      }
    }
  }
  return null; // 没有找到节点,返回null
};
function convertIdToValue(data) {
  return data.map(item => {
    const { id, children, ...rest } = item;
    const newItem = {
      ...rest,
      value: id // 将 id 改为 value
    };
    if (children && children.length > 0) {
      newItem.children = convertIdToValue(children);
    }
    return newItem;
  });
}
// 表格选择数据
const handleSelectionChange = (selection) => {
@@ -389,10 +464,10 @@
  if (expandedRows.length > 0) {
    expandedRowKeys.value = []
    try {
      productList({salesLedgerId: row.id}).then(res => {
      productList({salesLedgerId: row.id, type: 1}).then(res => {
      const index = tableData.value.findIndex(item => item.id === row.id);
      if (index > -1) {
        tableData.value[index].children = res.rows;
        tableData.value[index].children = res;
      }
      expandedRowKeys.value.push(row.id)
    })
@@ -450,33 +525,41 @@
  return sums;
}
// 打开弹框
const openForm = (type, row) => {
const openForm = async (type, row) => {
  operationType.value = type
  form.value = {}
  productData.value = []
  userListNoPage().then(res => {
    userList.value = res.data
  })
  let userLists = await userListNoPage()
  userList.value = userLists.data
  customerList().then(res => {
    customerOption.value = res
  })
  if (type === 'edit') {
    currentId.value = row.id;
    getSalesLedgerWithProducts({id: row.id}).then(res => {
    getSalesLedgerWithProducts({id: row.id, type: 1}).then(res => {
      form.value = {...res}
      productData.value = form.value.productData
      fileList.value = form.value.salesLedgerFiles
    })
  }
  let userAll = await userStore.getInfo()
  userList.value.forEach(element => {
    if(userAll.user.nickName === element.nickName && userAll.user.userName === element.userName) {
      form.value.entryPerson = userAll.user.userId // 设置默认业务员为当前用户
    }
  });
  form.value.entryDate = getCurrentDate() // 设置默认录入日期为当前日期
  dialogFormVisible.value = true
}
function changs(val){
  console.log(val);
}
// 上传前校检
function handleBeforeUpload(file) {
  // 校检文件大小
  if (props.fileSize) {
    if (file.size > 1024 * 1024) {
      proxy.$modal.msgError('上传文件大小不能超过10MB!')
      return false
    }
  if (file.size > 1024 * 1024 * 10) {
    proxy.$modal.msgError('上传文件大小不能超过10MB!')
    return false
  }
  proxy.$modal.loading("正在上传文件,请稍候...")
  return true
@@ -487,15 +570,24 @@
  proxy.$modal.closeLoading()
}
// 上传成功回调
function handleUploadSuccess(res, file) {
function handleUploadSuccess(res, file, uploadFiles) {
  proxy.$modal.closeLoading()
  if (res.code === 200) {
    uploadList.value.push({ name: res.fileName, url: res.fileName })
    fileList.value = fileList.value.filter(f => f.url !== undefined).concat(uploadList.value)
    uploadList.value = []
    file.tempId = res.data.tempId
    proxy.$modal.msgSuccess("上传成功")
  } else {
    proxy.$modal.closeLoading()
    proxy.$modal.msgError(res.msg)
    proxy.$refs.fileUpload.handleRemove(file)
  }
}
// 移除文件
function handleRemove (file) {
  if (operationType.value === 'edit') {
    let ids = []
    ids.push(file.id)
    delLedgerFile(ids).then(res => {
      proxy.$modal.msgSuccess("删除成功")
    })
  }
}
// 提交表单
@@ -508,6 +600,12 @@
        proxy.$modal.msgWarning('请添加产品信息')
        return
      }
      let tempFileIds = []
      if (fileList.value.length > 0) {
        tempFileIds = fileList.value.map(item => item.tempId)
      }
      form.value.tempFileIds = tempFileIds
      form.value.type = 1
      addOrUpdateSalesLedger(form.value).then(res => {
        proxy.$modal.msgSuccess("提交成功")
        closeDia()
@@ -530,6 +628,7 @@
    productForm.value = {...row}
  }
  productFormVisible.value = true
  getProductOptions()
}
// 提交产品表单
const submitProduct = () => {
@@ -549,7 +648,7 @@
  addOrUpdateSalesLedgerProduct(productForm.value).then(res => {
    proxy.$modal.msgSuccess("提交成功")
    closeProductDia()
    getSalesLedgerWithProducts({id: currentId.value}).then(res => {
    getSalesLedgerWithProducts({id: currentId.value, type: 1}).then(res => {
      productData.value = res.productData
    })
  })
@@ -583,14 +682,14 @@
      delProduct(ids).then(res => {
        proxy.$modal.msgSuccess("删除成功")
        closeProductDia()
        getSalesLedgerWithProducts({id: currentId.value}).then(res => {
        getSalesLedgerWithProducts({id: currentId.value, type: 1}).then(res => {
          productData.value = res.productData
        })
      })
    }).catch(() => {
      proxy.$modal.msg("已取消")
    })
  }
}
// 关闭产品弹框
@@ -632,15 +731,26 @@
  ).then(() => {
    delLedger(ids).then(res => {
      proxy.$modal.msgSuccess("删除成功")
      getList()
    })
    getList()
  }).catch(() => {
    proxy.$modal.msg("已取消")
  })
}
// 获取当前日期并格式化为 YYYY-MM-DD
function getCurrentDate() {
  const today = new Date();
  const year = today.getFullYear();
  const month = String(today.getMonth() + 1).padStart(2, '0'); // 月份从0开始
  const day = String(today.getDate()).padStart(2, '0');
  return `${year}-${month}-${day}`;
}
const mathNum = (val) => {
  productForm.value.taxExclusiveTotalPrice = proxy.calculateTaxExclusiveTotalPrice(val, productForm.value.taxRate)
}
getList()
</script>
<style scoped lang="scss">
</style>
</style>