spring
9 天以前 42a1a434f77154746038c476ef70ca9be0b8e4e0
fix: 完成资金管理,财务对账
已添加6个文件
已修改2个文件
916 ■■■■■ 文件已修改
src/api/collaborativeApproval/knowledgeBase.js 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/collaborativeApproval/sealManagement.js 116 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/financialManagement/financialReconciliation.js 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/financialManagement/fundsManagement.js 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/collaborativeApproval/rulesRegulationsManagement/index.vue 80 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/financialManagement/financialReconciliation/index.vue 291 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/financialManagement/fundsManagement/index.vue 298 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/inventoryManagement/stockManagement/components/FormDiaManual.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/collaborativeApproval/knowledgeBase.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,55 @@
import request from "@/utils/request";
// æŸ¥è¯¢çŸ¥è¯†åº“列表
export function listKnowledgeBase(query) {
  return request({
    url: "/knowledgeBase/getList",
    method: "get",
    params: query,
  });
}
// æŸ¥è¯¢çŸ¥è¯†åº“详细
// export function getKnowledgeBase(knowledgeBaseId) {
//   return request({
//     url: "/collaborativeApproval/knowledgeBase/" + knowledgeBaseId,
//     method: "get",
//   });
// }
// æ–°å¢žçŸ¥è¯†åº“
export function addKnowledgeBase(data) {
  return request({
    url: "/knowledgeBase/add",
    method: "post",
    data: data,
  });
}
// ä¿®æ”¹çŸ¥è¯†åº“
export function updateKnowledgeBase(data) {
  return request({
    url: "/knowledgeBase/update",
    method: "post",
    data: data,
  });
}
// åˆ é™¤çŸ¥è¯†åº“
export function delKnowledgeBase(query) {
  return request({
    url: "/knowledgeBase/delete",
    method: "delete",
    data: query,
  });
}
// æ‰¹é‡åˆ é™¤çŸ¥è¯†åº“
export function delKnowledgeBaseBatch(knowledgeBaseIds) {
  return request({
    url: "/knowledgeBase/batch",
    method: "delete",
    data: knowledgeBaseIds,
  });
}
src/api/collaborativeApproval/sealManagement.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,116 @@
import request from "@/utils/request";
// æŸ¥è¯¢å°ç« ç”³è¯·åˆ—表
export function listSealApplication(page,query) {
  return request({
    url: "/sealApplicationManagement/getList",
    method: "get",
    params: {
      ...page,
      ...query},
  });
}
// æŸ¥è¯¢è§„章制度列表
export function listRuleManagement(page,query) {
  return request({
    url: "/rulesRegulationsManagement/getList",
    method: "get",
    params: {
      ...page,
      ...query},
  });
}
// æŸ¥è¯¢é˜…读状态列表
export function getReadingStatusList(page,query) {
  return request({
    url: "/rulesRegulationsManagement/getReadingStatusList",
    method: "get",
    params: {
      ...page,
      ...query},
  });
}
// æ ¹æ®è§„则id查询阅读状态列表
export function getReadingStatusByRuleId(id) {
  return request({
    url: "/rulesRegulationsManagement/getReadingStatusByRuleId/"+id,
    method: "get"
  });
}
// æ–°å¢žå°ç« ç”³è¯·
export function addSealApplication(data) {
  return request({
    url: "/sealApplicationManagement/add",
    method: "post",
    data: data,
  });
}
// æ–°å¢žè§„章制度
export function addRuleManagement(data) {
  return request({
    url: "/rulesRegulationsManagement/add",
    method: "post",
    data: data,
  });
}
// æ–°å¢žé˜…读状态
export function addReadingStatus(data) {
  return request({
    url: "/rulesRegulationsManagement/addReadingStatus",
    method: "post",
    data: data,
  });
}
// ä¿®æ”¹å°ç« ç”³è¯·
export function updateSealApplication(data) {
  return request({
    url: "/sealApplicationManagement/update",
    method: "post",
    data: data,
  });
}
// ä¿®æ”¹è§„章制度
export function updateRuleManagement(data) {
  return request({
    url: "/rulesRegulationsManagement/update",
    method: "post",
    data: data,
  });
}
// ä¿®æ”¹é˜…读状态
export function updateReadingStatus(data) {
  return request({
    url: "/rulesRegulationsManagement/updateReadingStatus",
    method: "post",
    data: data,
  });
}
// åˆ é™¤å°ç« ç”³è¯·
export function delSealApplication(query) {
  return request({
    url: "/sealApplicationManagement/delete",
    method: "delete",
    data: query,
  });
}
// åˆ é™¤è§„章制度
export function delRuleManagement(query) {
  return request({
    url: "/rulesRegulationsManagement/delete",
    method: "delete",
    data: query,
  });
}
// æ‰¹é‡åˆ é™¤çŸ¥è¯†åº“
export function delKnowledgeBaseBatch(knowledgeBaseIds) {
  return request({
    url: "/knowledgeBase/batch",
    method: "delete",
    data: knowledgeBaseIds,
  });
}
src/api/financialManagement/financialReconciliation.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,37 @@
import request from "@/utils/request";
// åˆ†é¡µæŸ¥è¯¢è´¢åŠ¡å¯¹è´¦å°è´¦
export const getReconciliationPage = (params) => {
  return request({
    url: "/finance/reconciliation/page",
    method: "get",
    params,
  });
};
// æ–°å¢žå¯¹è´¦è®°å½•
export const addReconciliation = (data) => {
  return request({
    url: "/finance/reconciliation",
    method: "post",
    data,
  });
};
// æ›´æ–°å¯¹è´¦è®°å½•
export const updateReconciliation = (data) => {
  return request({
    url: "/finance/reconciliation",
    method: "put",
    data,
  });
};
// åˆ é™¤å¯¹è´¦è®°å½•(支持批量)
export const deleteReconciliation = (ids) => {
  return request({
    url: "/finance/reconciliation",
    method: "delete",
    data: ids,
  });
};
src/api/financialManagement/fundsManagement.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,37 @@
import request from "@/utils/request";
// åˆ†é¡µæŸ¥è¯¢èµ„金管理台账
export const getFundsPage = (params) => {
  return request({
    url: "/finance/funds/page",
    method: "get",
    params,
  });
};
// æ–°å¢žèµ„金记录
export const addFunds = (data) => {
  return request({
    url: "/finance/funds",
    method: "post",
    data,
  });
};
// æ›´æ–°èµ„金记录
export const updateFunds = (data) => {
  return request({
    url: "/finance/funds",
    method: "put",
    data,
  });
};
// åˆ é™¤èµ„金记录(支持批量)
export const deleteFunds = (ids) => {
  return request({
    url: "/finance/funds",
    method: "delete",
    data: ids,
  });
};
src/views/collaborativeApproval/rulesRegulationsManagement/index.vue
@@ -59,7 +59,6 @@
                    <el-button link type="danger" @click="repealEdit(scope.row)">废弃</el-button>
                    <el-button link type="success" @click="viewVersionHistory(scope.row)">版本历史</el-button>
                    <el-button link type="warning" @click="viewReadStatus(scope.row)">阅读状态</el-button>
                    <el-button link type="primary" @click="openFileDialog(scope.row)">附件</el-button>
                  </template>
                </el-table-column>
              </el-table>
@@ -174,16 +173,6 @@
      </el-table>
    </el-dialog>
    <FileListDialog
      ref="fileListDialogRef"
      v-model="fileDialogVisible"
      :show-upload-button="true"
      :show-delete-button="true"
      :delete-method="handleAttachmentDelete"
      :rules-regulations-management-id="currentFileRuleId"
      :name-column-label="'附件名称'"
      @upload="handleAttachmentUpload"
    />
  </div>
</template>
@@ -191,8 +180,6 @@
import { ref, reactive, onMounted, getCurrentInstance } from 'vue'
import { ElMessage, ElMessageBox } from 'element-plus'
import { listRuleManagement,addRuleManagement,updateRuleManagement,delRuleManagement,getReadingStatusByRuleId,addReadingStatus,updateReadingStatus  } from '@/api/collaborativeApproval/sealManagement.js'
import FileListDialog from '@/components/Dialog/FileListDialog.vue'
import { listRuleFiles, delRuleFile, addRuleFile } from '@/api/collaborativeApproval/rulesRegulationsManagementFile.js'
// å“åº”式数据
const operationType = ref('add')
@@ -200,15 +187,6 @@
const tableLoading = ref(false)
// åˆ†é¡µå‚æ•°
const page = reactive({
  current: 1,
  size: 10,
  total: 0
})
// é™„件弹窗
const fileDialogVisible = ref(false)
const fileListDialogRef = ref(null)
const currentFileRuleId = ref(null)
const filePage = reactive({
  current: 1,
  size: 10,
  total: 0
@@ -457,64 +435,6 @@
const { proxy } = getCurrentInstance()
const handleExport = () => {
  proxy.download('/rulesRegulationsManagement/export', { ...regulationSearchForm }, '规章制度.xlsx')
}
// é™„件:查询
const fetchRuleFiles = async (rulesRegulationsManagementId) => {
  const params = {
    current: filePage.current,
    size: filePage.size,
    rulesRegulationsManagementId
  }
  const res = await listRuleFiles(params)
  const records = res?.data?.records || []
  filePage.total = res?.data?.total || records.length
  const mapped = records.map(item => ({
    id: item.id,
    name: item.fileName || item.name,
    url: item.fileUrl || item.url,
    raw: item
  }))
  fileListDialogRef.value?.setList(mapped)
}
// æ‰“开附件弹窗
const openFileDialog = async (row) => {
  currentFileRuleId.value = row.id
  fileDialogVisible.value = true
  await fetchRuleFiles(row.id)
}
// åˆ·æ–°é™„件列表
const refreshFileList = async () => {
  if (!currentFileRuleId.value) return
  await fetchRuleFiles(currentFileRuleId.value)
}
// ä¸Šä¼ é™„件(由子组件触发)
const handleAttachmentUpload = async (filePayload) => {
  if (!currentFileRuleId.value) return
  const payload = {
    name: filePayload?.fileName || filePayload?.name,
    url: filePayload?.fileUrl || filePayload?.url,
    rulesRegulationsManagementId: currentFileRuleId.value
  }
  await addRuleFile(payload)
  ElMessage.success('文件上传成功')
  await refreshFileList()
}
// åˆ é™¤é™„ä»¶
const handleAttachmentDelete = async (row) => {
  if (!row?.id) return false
  try {
    await ElMessageBox.confirm('确认删除该附件?', '提示', { type: 'warning' })
  } catch {
    return false
  }
  await delRuleFile([row.id])
  ElMessage.success('删除成功')
  await refreshFileList()
}
// èŽ·å–è§„ç« åˆ¶åº¦åˆ—è¡¨æ•°æ®
src/views/financialManagement/financialReconciliation/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,291 @@
<template>
  <div class="app-container">
    <!-- æœç´¢åŒº -->
    <div class="search_form">
      <el-form :inline="true" :model="searchForm">
        <el-form-item label="往来单位:">
          <el-input v-model="searchForm.counterparty" placeholder="请输入往来单位" clearable style="width: 180px" />
        </el-form-item>
        <el-form-item label="对账状态:">
          <el-select v-model="searchForm.status" placeholder="请选择" clearable style="width: 150px">
            <el-option label="未对账" value="pending" />
            <el-option label="对账中" value="processing" />
            <el-option label="已完成" value="done" />
          </el-select>
        </el-form-item>
        <!-- <el-form-item label="日期:">
          <el-date-picker
            v-model="searchForm.dateRange"
            type="daterange"
            range-separator="至"
            start-placeholder="开始日期"
            end-placeholder="结束日期"
            value-format="YYYY-MM-DD"
            format="YYYY-MM-DD"
            clearable
          />
        </el-form-item> -->
        <el-form-item>
          <el-button type="primary" @click="handleQuery">搜索</el-button>
          <el-button @click="resetQuery">重置</el-button>
        </el-form-item>
      </el-form>
    </div>
    <!-- æ“ä½œåŒº -->
    <div class="actions">
      <el-button type="primary" @click="openDialog('add')">新增</el-button>
      <el-button type="danger" plain @click="handleDelete">删除</el-button>
    </div>
    <!-- è¡¨æ ¼ -->
    <el-table
      :data="tableData"
      border
      v-loading="tableLoading"
      @selection-change="handleSelectionChange"
      style="width: 100%"
      height="calc(100vh - 280px)"
      :row-key="row => row.id"
    >
      <el-table-column type="selection" width="55" align="center" />
      <el-table-column type="index" label="序号" width="60" align="center" />
      <el-table-column prop="accountDate" label="对账日期" width="130" show-overflow-tooltip />
      <el-table-column prop="counterparty" label="往来单位" width="180" show-overflow-tooltip />
      <el-table-column prop="amount" label="对账金额(元)" width="140" show-overflow-tooltip />
      <el-table-column prop="statusText" label="状态" width="120" show-overflow-tooltip />
      <el-table-column prop="remark" label="备注" show-overflow-tooltip />
      <el-table-column fixed="right" label="操作" width="150" align="center">
        <template #default="scope">
          <el-button link type="primary" size="small" @click="openDialog('edit', scope.row)">编辑</el-button>
        </template>
      </el-table-column>
    </el-table>
    <pagination
      v-show="total > 0"
      :total="total"
      layout="total, sizes, prev, pager, next, jumper"
      :page="page.current"
      :limit="page.size"
      @pagination="paginationChange"
    />
    <!-- å¼¹çª— -->
    <el-dialog v-model="dialogVisible" :title="dialogTitle" width="520px" @close="resetForm">
      <el-form :model="form" :rules="rules" ref="formRef" label-width="120px">
        <el-form-item label="对账日期:" prop="accountDate">
          <el-date-picker v-model="form.accountDate" type="date" value-format="YYYY-MM-DD" format="YYYY-MM-DD" style="width: 100%" />
        </el-form-item>
        <el-form-item label="往来单位:" prop="counterparty">
          <el-input v-model="form.counterparty" placeholder="请输入往来单位" />
        </el-form-item>
        <el-form-item label="对账金额(元):" prop="amount">
          <el-input-number v-model="form.amount" :min="0" :precision="2" :step="100" style="width: 100%" />
        </el-form-item>
        <el-form-item label="状态:" prop="status">
          <el-select v-model="form.status" placeholder="请选择" style="width: 100%">
            <el-option label="未对账" value="pending" />
            <el-option label="对账中" value="processing" />
            <el-option label="已完成" value="done" />
          </el-select>
        </el-form-item>
        <el-form-item label="备注:">
          <el-input v-model="form.remark" type="textarea" :rows="3" placeholder="请输入备注" />
        </el-form-item>
      </el-form>
      <template #footer>
        <div class="dialog-footer">
          <el-button @click="dialogVisible = false">取消</el-button>
          <el-button type="primary" @click="submitForm">确认</el-button>
        </div>
      </template>
    </el-dialog>
  </div>
</template>
<script setup>
import { ref, reactive, onMounted } from 'vue'
import { ElMessage, ElMessageBox } from 'element-plus'
import pagination from '@/components/PIMTable/Pagination.vue'
import {
  getReconciliationPage,
  addReconciliation,
  updateReconciliation,
  deleteReconciliation
} from '@/api/financialManagement/financialReconciliation.js'
const tableData = ref([])
const tableLoading = ref(false)
const selectedRows = ref([])
const dialogVisible = ref(false)
const dialogTitle = ref('新增')
const formRef = ref(null)
const page = reactive({
  current: 1,
  size: 100
})
const total = ref(0)
const searchForm = reactive({
  counterparty: '',
  status: '',
  dateRange: []
})
const form = reactive({
  id: null,
  accountDate: '',
  counterparty: '',
  amount: null,
  status: '',
  remark: ''
})
const rules = {
  accountDate: [{ required: true, message: '请选择对账日期', trigger: 'change' }],
  counterparty: [{ required: true, message: '请输入往来单位', trigger: 'blur' }],
  amount: [{ required: true, message: '请输入对账金额', trigger: 'blur' }],
  status: [{ required: true, message: '请选择状态', trigger: 'change' }]
}
const statusTextMap = {
  pending: '未对账',
  processing: '对账中',
  done: '已完成'
}
// èŽ·å–åˆ—è¡¨
const getList = () => {
  tableLoading.value = true
  const params = {
    ...searchForm,
    current: page.current,
    size: page.size
  }
  if (params.dateRange && params.dateRange.length === 2) {
    params.beginDate = params.dateRange[0]
    params.endDate = params.dateRange[1]
  }
  delete params.dateRange
  getReconciliationPage(params)
    .then(res => {
      if (res.code === 200) {
        tableData.value = (res.data?.records || []).map(item => ({
          ...item,
          statusText: statusTextMap[item.status] || item.status
        }))
        total.value = res.data?.total || 0
      }
    })
    .finally(() => {
      tableLoading.value = false
    })
}
const handleQuery = () => {
  page.current = 1
  getList()
}
const resetQuery = () => {
  searchForm.counterparty = ''
  searchForm.status = ''
  searchForm.dateRange = []
  handleQuery()
}
const paginationChange = (obj) => {
  page.current = obj.page
  page.size = obj.limit
  getList()
}
const handleSelectionChange = (rows) => {
  selectedRows.value = rows
}
const openDialog = (type, row) => {
  dialogTitle.value = type === 'add' ? '新增对账记录' : '编辑对账记录'
  if (type === 'edit' && row) {
    Object.assign(form, row)
  } else {
    resetForm()
  }
  dialogVisible.value = true
}
const resetForm = () => {
  Object.assign(form, {
    id: null,
    date: '',
    counterparty: '',
    amount: null,
    status: '',
    remark: ''
  })
}
const submitForm = () => {
  formRef.value?.validate(valid => {
    if (!valid) return
    const payload = { ...form }
    const request = payload.id ? updateReconciliation(payload) : addReconciliation(payload)
    request
      .then(res => {
        if (res.code === 200) {
          ElMessage.success('提交成功')
          dialogVisible.value = false
          getList()
        }
      })
      .catch(err => {
        ElMessage.error(err.msg || '提交失败')
      })
  })
}
const handleDelete = () => {
  if (!selectedRows.value.length) {
    ElMessage.warning('请选择要删除的记录')
    return
  }
  ElMessageBox.confirm('确认删除选中记录吗?', '提示', {
    confirmButtonText: '确认',
    cancelButtonText: '取消',
    type: 'warning'
  }).then(() => {
    const ids = selectedRows.value.map(r => r.id)
    deleteReconciliation(ids).then(res => {
      if (res.code === 200) {
        ElMessage.success('删除成功')
        getList()
        selectedRows.value = []
      }
    }).catch(err => {
      ElMessage.error(err.msg || '删除失败')
    })
  }).catch(() => {})
}
onMounted(() => {
  getList()
})
</script>
<style scoped lang="scss">
.app-container {
  padding: 20px;
  .search_form {
    background: #fff;
    padding: 16px;
    border-radius: 6px;
    margin-bottom: 16px;
  }
  .actions {
    margin-bottom: 12px;
  }
}
</style>
src/views/financialManagement/fundsManagement/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,298 @@
<template>
  <div class="app-container">
    <!-- æœç´¢åŒº -->
    <div class="search_form">
      <el-form :inline="true" :model="searchForm">
        <el-form-item label="资金类型:">
          <el-select v-model="searchForm.typeText" placeholder="请选择" clearable style="width: 150px">
            <el-option label="收入" value="收入" />
            <el-option label="支出" value="支出" />
            <el-option label="内部转账" value="内部转账" />
          </el-select>
        </el-form-item>
        <el-form-item label="账户:">
          <el-input v-model="searchForm.account" placeholder="请输入账户" clearable style="width: 160px" />
        </el-form-item>
        <!-- <el-form-item label="日期:">
          <el-date-picker
            v-model="searchForm.dateRange"
            type="daterange"
            range-separator="至"
            start-placeholder="开始日期"
            end-placeholder="结束日期"
            value-format="YYYY-MM-DD"
            format="YYYY-MM-DD"
            clearable
          />
        </el-form-item> -->
        <el-form-item>
          <el-button type="primary" @click="handleQuery">搜索</el-button>
          <el-button @click="resetQuery">重置</el-button>
        </el-form-item>
      </el-form>
    </div>
    <!-- æ“ä½œåŒº -->
    <div class="actions">
      <el-button type="primary" @click="openDialog('add')">新增</el-button>
      <el-button type="danger" plain @click="handleDelete">删除</el-button>
    </div>
    <!-- è¡¨æ ¼ -->
    <el-table
      :data="tableData"
      border
      v-loading="tableLoading"
      @selection-change="handleSelectionChange"
      style="width: 100%"
      height="calc(100vh - 280px)"
      :row-key="row => row.id"
    >
      <el-table-column type="selection" width="55" align="center" />
      <el-table-column type="index" label="序号" width="60" align="center" />
      <el-table-column prop="accountDate" label="日期" width="130" show-overflow-tooltip />
      <el-table-column prop="typeText" label="资金类型" width="120" show-overflow-tooltip />
      <el-table-column prop="amount" label="金额(元)" width="120" show-overflow-tooltip />
      <el-table-column prop="account" label="账户" width="160" show-overflow-tooltip />
      <el-table-column prop="counterparty" label="往来单位" width="180" show-overflow-tooltip />
      <el-table-column prop="remark" label="备注" show-overflow-tooltip />
      <el-table-column fixed="right" label="操作" width="150" align="center">
        <template #default="scope">
          <el-button link type="primary" size="small" @click="openDialog('edit', scope.row)">编辑</el-button>
        </template>
      </el-table-column>
    </el-table>
    <pagination
      v-show="total > 0"
      :total="total"
      layout="total, sizes, prev, pager, next, jumper"
      :page="page.current"
      :limit="page.size"
      @pagination="paginationChange"
    />
    <!-- å¼¹çª— -->
    <el-dialog v-model="dialogVisible" :title="dialogTitle" width="520px" @close="resetForm">
      <el-form :model="form" :rules="rules" ref="formRef" label-width="120px">
        <el-form-item label="日期:" prop="accountDate">
          <el-date-picker v-model="form.accountDate" type="date" value-format="YYYY-MM-DD" format="YYYY-MM-DD" style="width: 100%" />
        </el-form-item>
        <el-form-item label="资金类型:" prop="typeText">
          <el-select v-model="form.typeText" placeholder="请选择" style="width: 100%">
            <el-option label="收入" value="收入" />
            <el-option label="支出" value="支出" />
            <el-option label="内部转账" value="内部转账" />
          </el-select>
        </el-form-item>
        <el-form-item label="金额(元):" prop="amount">
          <el-input-number v-model="form.amount" :min="0" :precision="2" :step="100" style="width: 100%" />
        </el-form-item>
        <el-form-item label="账户:" prop="account">
          <el-input v-model="form.account" placeholder="请输入账户" />
        </el-form-item>
        <el-form-item label="往来单位:" prop="counterparty">
          <el-input v-model="form.counterparty" placeholder="请输入往来单位" />
        </el-form-item>
        <el-form-item label="备注:">
          <el-input v-model="form.remark" type="textarea" :rows="3" placeholder="请输入备注" />
        </el-form-item>
      </el-form>
      <template #footer>
        <div class="dialog-footer">
          <el-button @click="dialogVisible = false">取消</el-button>
          <el-button type="primary" @click="submitForm">确认</el-button>
        </div>
      </template>
    </el-dialog>
  </div>
</template>
<script setup>
import { ref, reactive, onMounted } from 'vue'
import { ElMessage, ElMessageBox } from 'element-plus'
import pagination from '@/components/PIMTable/Pagination.vue'
import {
  getFundsPage,
  addFunds,
  updateFunds,
  deleteFunds
} from '@/api/financialManagement/fundsManagement.js'
const tableData = ref([])
const tableLoading = ref(false)
const selectedRows = ref([])
const dialogVisible = ref(false)
const dialogTitle = ref('新增')
const formRef = ref(null)
const page = reactive({
  current: 1,
  size: 100
})
const total = ref(0)
const searchForm = reactive({
  typeText: '',
  account: '',
  dateRange: []
})
const form = reactive({
  id: null,
  accountDate: '',
  typeText: '',
  amount: null,
  account: '',
  counterparty: '',
  remark: ''
})
const rules = {
  accountDate: [{ required: true, message: '请选择日期', trigger: 'change' }],
  typeText: [{ required: true, message: '请选择资金类型', trigger: 'change' }],
  amount: [{ required: true, message: '请输入金额', trigger: 'blur' }],
  account: [{ required: true, message: '请输入账户', trigger: 'blur' }]
}
const typeTextMap = {
  income: '收入',
  expense: '支出',
  transfer: '内部转账'
}
// èŽ·å–åˆ—è¡¨
const getList = () => {
  tableLoading.value = true
  const params = {
    ...searchForm,
    current: page.current,
    size: page.size
  }
  // å…¼å®¹åŽç«¯å­—段:若后端使用 typeText,请直接传递;若使用 type,请与后端对齐
  if (params.dateRange && params.dateRange.length === 2) {
    params.beginDate = params.dateRange[0]
    params.endDate = params.dateRange[1]
  }
  delete params.dateRange
  getFundsPage(params)
    .then(res => {
      if (res.code === 200) {
        tableData.value = (res.data?.records || []).map(item => ({
          ...item,
          typeText: item.typeText || typeTextMap[item.typeText] || item.typeText
        }))
        total.value = res.data?.total || 0
      }
    })
    .finally(() => {
      tableLoading.value = false
    })
}
const handleQuery = () => {
  page.current = 1
  getList()
}
const resetQuery = () => {
  searchForm.typeText = ''
  searchForm.account = ''
  searchForm.dateRange = []
  handleQuery()
}
const paginationChange = (obj) => {
  page.current = obj.page
  page.size = obj.limit
  getList()
}
const handleSelectionChange = (rows) => {
  selectedRows.value = rows
}
const openDialog = (type, row) => {
  dialogTitle.value = type === 'add' ? '新增资金记录' : '编辑资金记录'
  if (type === 'edit' && row) {
    Object.assign(form, row)
  } else {
    resetForm()
  }
  dialogVisible.value = true
}
const resetForm = () => {
  Object.assign(form, {
    id: null,
    accountDate: '',
    typeText: '',
    amount: null,
    account: '',
    counterparty: '',
    remark: ''
  })
}
const submitForm = () => {
  formRef.value?.validate(valid => {
    if (!valid) return
    const payload = { ...form }
    const request = payload.id ? updateFunds(payload) : addFunds(payload)
    request
      .then(res => {
        if (res.code === 200) {
          ElMessage.success('提交成功')
          dialogVisible.value = false
          getList()
        }
      })
      .catch(err => {
        ElMessage.error(err.msg || '提交失败')
      })
  })
}
const handleDelete = () => {
  if (!selectedRows.value.length) {
    ElMessage.warning('请选择要删除的记录')
    return
  }
  ElMessageBox.confirm('确认删除选中记录吗?', '提示', {
    confirmButtonText: '确认',
    cancelButtonText: '取消',
    type: 'warning'
  }).then(() => {
    const ids = selectedRows.value.map(r => r.id)
    deleteFunds(ids).then(res => {
      if (res.code === 200) {
        ElMessage.success('删除成功')
        getList()
        selectedRows.value = []
      }
    }).catch(err => {
      ElMessage.error(err.msg || '删除失败')
    })
  }).catch(() => {})
}
onMounted(() => {
  getList()
})
</script>
<style scoped lang="scss">
.app-container {
  padding: 20px;
  .search_form {
    background: #fff;
    padding: 16px;
    border-radius: 6px;
    margin-bottom: 16px;
  }
  .actions {
    margin-bottom: 12px;
  }
}
</style>
src/views/inventoryManagement/stockManagement/components/FormDiaManual.vue
@@ -42,7 +42,7 @@
      <el-row :gutter="30">
        <el-col :span="12">
          <el-form-item label="预警值:" prop="warnNum">
            <el-input v-model="form.warnNum" placeholder="请输入预警值" clearable />
            <el-input-number v-model="form.warnNum" placeholder="请输入预警值" clearable min="0" />
          </el-form-item>
        </el-col>
      </el-row>