pyt
2025-03-21 6c5d362ed330510b27fb18203237d7271a55c699
feat
2个文件已删除
8个文件已修改
1个文件已添加
2047 ■■■■ 已修改文件
src/api/menu.js 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/payment-details/detail.js 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/store/modules/user.js 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/index.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/index.vue 56 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/payment-details/detail.vue 183 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/payment-details/index.vue 109 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/storing-data/components/ApprovalDialog.vue 872 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/storing-data/components/UploadDialog.vue 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/storing-data/detail.vue 787 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/storing-data/index.vue 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/menu.js
@@ -6,4 +6,12 @@
    url: '/getRouters',
    method: 'get'
  })
}
// 获取首页消息
export const getMessage = () => {
  return request({
    url: '/index/message',
    method: 'post'
  })
}
src/api/payment-details/detail.js
New file
@@ -0,0 +1,10 @@
import request from '@/utils/request'
// 详情
export function list(data) {
  return request({
    url: '/report/detail',
    method: 'post',
    data
  })
}
src/store/modules/user.js
@@ -10,6 +10,7 @@
    name: '',
    avatar: '',
    roles: [],
    street: localStorage.getItem('street') || '',
    permissions: []
  },
@@ -31,6 +32,10 @@
    },
    SET_PERMISSIONS: (state, permissions) => {
      state.permissions = permissions
    },
    SET_STREET: (state, street) => {
      state.street = street
      localStorage.setItem('street', street)
    }
  },
src/utils/index.js
@@ -392,13 +392,13 @@
export const exportExcell = (name, params, url) => {
  fetch(BASE_URL + url, {
  fetch(process.env.VUE_APP_BASE_API + url, {
    method: 'POST',
    body: JSON.stringify({
      ...params,
    }),
    headers: {
      Authorization:'Bearer ' +  localStorage.getItem('token'),
      Authorization:'Bearer ' + getToken(),
      'ConTent-Type': 'application/json;charset=UTF-8',
      timestamp: new Date().getTime(),
      client: localStorage.getItem('client')
src/views/index.vue
@@ -25,16 +25,28 @@
        <el-card class="notification-card">
          <div class="notification-header">预警通知</div>
          <div class="notification-list">
            <div v-for="(notification, index) in notifications"
            <div v-for="(notification, index) in alwaysMessages"
                 :key="index" 
                 class="notification-item">
              <div class="notification-item-header">
                <div class="notification-dot"></div>
                <span class="notification-time">{{ notification.time }}</span>
                <span class="notification-time">{{ notification.createTime }}</span>
              </div>
              <div class="notification-content">
                <div class="notification-text">{{ notification.content }}</div>
                <div class="notification-submitter">提交人:{{ notification.submitter }}</div>
                <div class="notification-text">{{ notification.noticeTitle }}</div>
                <div v-if="notification.createBy" class="notification-submitter">提交人:{{ notification.createBy }}</div>
              </div>
            </div>
            <div v-for="(notification, index) in noticeMessage"
                 :key="index"
                 class="notification-item">
              <div class="notification-item-header">
                <div class="notification-dot"></div>
                <span class="notification-time">{{ notification.createTime }}</span>
              </div>
              <div class="notification-content">
                <div class="notification-text">{{ notification.noticeTitle }}</div>
                <div v-if="notification.createBy" class="notification-submitter">提交人:{{ notification.createBy }}</div>
              </div>
            </div>
          </div>
@@ -45,6 +57,7 @@
</template>
<script>
import { getMessage } from "@/api/menu";
export default {
  name: "Index",
  data() {
@@ -53,32 +66,8 @@
      version: "3.8.9",
      currentDate: new Date(),
      selectedMonth: new Date(),
      notifications: [
        {
          content: '您有【1】条【自主购房安置申请批次】等待审批',
          submitter: '张三',
          time: '2025-1-15 15:48:30',
          isRead: false
        },
        {
          content: '您有【1】条【安置批次】等待审批',
          submitter: '张三',
          time: '2025-1-15 15:48:30',
          isRead: false
        },
        {
          content: '本月应支付补偿款合计为【323.0032万元】',
          submitter: '系统',
          time: '2025-1-15 15:48:30',
          isRead: false
        },
        {
          content: '您有【9】户自主购房安置人员需要付首付款',
          submitter: '系统',
          time: '2025-1-15 15:48:30',
          isRead: false
        }
      ]
      alwaysMessages: [],
      noticeMessage: []
    };
  },
  watch: {
@@ -86,6 +75,13 @@
      this.selectedMonth = new Date(newDate);
    }
  },
  created() {
    getMessage().then(res => {
      this.alwaysMessages = res.data.alwaysMessages
      this.noticeMessage = res.data.noticeMessage
      console.log(res);
    });
  },
  methods: {
    goTarget(href) {
      window.open(href, "_blank");
src/views/payment-details/detail.vue
@@ -3,16 +3,18 @@
    <!-- 搜索表单 -->
    <el-form :inline="true" :model="searchForm" class="search-form">
      <el-form-item label="镇街">
        <el-input v-model="searchForm.town" placeholder="请输入"></el-input>
        <el-select v-model="searchForm.street" @change="handleStreetChange" placeholder="请选择" clearable size="small">
          <el-option v-for="item in streetOptions" :key="item.dictCode" :label="item.dictLabel" :value="item.dictLabel"></el-option>
        </el-select>
      </el-form-item>
      <el-form-item label="所在村(社区)">
        <el-input v-model="searchForm.village" placeholder="请输入"></el-input>
        <el-input v-model="searchForm.community" placeholder="请输入"></el-input>
      </el-form-item>
      <el-form-item label="批次号">
        <el-input v-model="searchForm.batchNo" placeholder="请输入"></el-input>
        <el-input v-model="searchForm.batchNumber" placeholder="请输入"></el-input>
      </el-form-item>
      <el-form-item label="户主姓名">
        <el-input v-model="searchForm.ownerName" placeholder="请输入"></el-input>
        <el-input v-model="searchForm.householdHead" placeholder="请输入"></el-input>
      </el-form-item>
      <el-form-item>
        <el-button type="primary" @click="handleSearch">查询</el-button>
@@ -24,120 +26,157 @@
    <el-row :gutter="20" class="statistics-cards">
      <el-col :span="6">
        <el-card class="box-card">
          <div class="card-amount">2,183<span class="unit">万元</span></div>
          <div class="card-amount">{{ formatNumber(statistics.compensationSum) }}<span class="unit">万元</span></div>
          <div class="card-title">补偿资金总金额</div>
        </el-card>
      </el-col>
      <el-col :span="6">
        <el-card class="box-card">
          <div class="card-amount">2,183<span class="unit">万元</span></div>
          <div class="card-title">资付款总金额</div>
          <div class="card-amount">{{ formatNumber(statistics.downPaymentAmount) }}<span class="unit">万元</span></div>
          <div class="card-title">首付款总金额</div>
        </el-card>
      </el-col>
      <el-col :span="6">
        <el-card class="box-card">
          <div class="card-amount">2,183<span class="unit">万元</span></div>
          <div class="card-amount">{{ formatNumber(statistics.subsidyAmount) }}<span class="unit">万元</span></div>
          <div class="card-title">过渡补贴总金额</div>
        </el-card>
      </el-col>
      <el-col :span="6">
        <el-card class="box-card">
          <div class="card-amount">2,183<span class="unit">万元</span></div>
          <div class="card-title">子项资金总额</div>
          <div class="card-amount">{{ formatNumber(statistics.quarterPayAmount) }}<span class="unit">万元</span></div>
          <div class="card-title">季度款总金额</div>
        </el-card>
      </el-col>
    </el-row>
    <!-- 数据表格 -->
    <el-table :data="tableData" border style="width: 100%; margin-top: 20px">
    <el-table :data="tableData" border style="width: 100%; margin-top: 20px" v-loading="loading">
      <el-table-column type="index" label="序号" width="60"></el-table-column>
      <el-table-column prop="batchNo" label="批次号" width="120"></el-table-column>
      <el-table-column prop="town" label="镇(街道)" width="120"></el-table-column>
      <el-table-column prop="batchNumber" label="批次号" width="120"></el-table-column>
      <el-table-column prop="street" label="镇(街道)" width="120"></el-table-column>
      <el-table-column prop="projectName" label="拆迁项目名称"></el-table-column>
      <el-table-column prop="village" label="所在村(社区)" width="150"></el-table-column>
      <el-table-column prop="ownerName" label="户主姓名" width="120"></el-table-column>
      <el-table-column prop="community" label="所在村(社区)" width="150"></el-table-column>
      <el-table-column prop="householdHead" label="户主姓名" width="120"></el-table-column>
      <el-table-column prop="idCard" label="身份证号" width="180"></el-table-column>
      <el-table-column prop="familySize" label="应安置人数(人)" width="140"></el-table-column>
      <el-table-column prop="area" label="所有家庭人员应安置面积(㎡)" width="160"></el-table-column>
      <el-table-column prop="paymentDate" label="25%首付款支付时间" width="160"></el-table-column>
      <el-table-column prop="firstPayment" label="25%首付款(万元)" width="160"></el-table-column>
      <el-table-column prop="mortgageApproval" label="首笔季度款应付周期" width="160"></el-table-column>
      <el-table-column prop="mortgagePayment" label="每季度需支付款项(万元)" width="180"></el-table-column>
      <el-table-column prop="transitPayment" label="过渡补贴(万元)" width="160"></el-table-column>
      <el-table-column label="操作" width="180" fixed="right">
      <el-table-column prop="currentCount" label="应安置人数(人)" width="140"></el-table-column>
      <el-table-column prop="waitFamilyArea" label="所有家庭人员应安置面积(㎡)" width="160"></el-table-column>
      <el-table-column prop="compensationPayTime" label="25%首付款支付时间" width="160"></el-table-column>
      <el-table-column prop="downPaymentAmount" label="25%首付款(万元)" width="160"></el-table-column>
      <el-table-column prop="cycle" label="首笔季度款应付周期" width="160"></el-table-column>
      <el-table-column prop="quarterPayAmount" label="每季度需支付款项(万元)" width="180"></el-table-column>
      <el-table-column prop="subsidyAmount" label="过渡补贴(万元)" width="160"></el-table-column>
      <el-table-column label="操作" width="80" fixed="right" align="center">
        <template slot-scope="scope">
          <el-button type="text" @click="handleDetail(scope.row)">详情</el-button>
          <el-button type="text" @click="handleEdit(scope.row)">编辑</el-button>
          <el-button type="text" @click="handleDelete(scope.row)">删除</el-button>
        </template>
      </el-table-column>
    </el-table>
    <!-- 分页 -->
    <el-pagination
      @size-change="handleSizeChange"
      @current-change="handleCurrentChange"
      :current-page="pagination.currentPage"
      :page-sizes="[10, 20, 30, 50]"
      :page-size="pagination.pageSize"
      layout="total, sizes, prev, pager, next, jumper"
      :total="pagination.total"
      class="pagination">
    <el-pagination background @size-change="handleSizeChange" @current-change="handleCurrentChange"
      :current-page="searchForm.pageNum" :page-sizes="[10, 20, 30, 50]" :page-size="searchForm.pageSize"
      layout="total, sizes, prev, pager, next, jumper" :total="pagination.total" class="pagination">
    </el-pagination>
  </div>
</template>
<script>
import { list } from '@/api/payment-details/detail'
import { getDictData } from '@/api/placement'
export default {
  data() {
    return {
      searchForm: {
        town: '',
        village: '',
        batchNo: '',
        ownerName: ''
        street: '',
        community: '',
        batchNumber: '',
        householdHead: '',
        pageNum: 1,
        pageSize: 10,
      },
      statistics: {},
      loading: false,
      tableData: [],
      pagination: {
        currentPage: 1,
        pageSize: 10,
        total: 0
      }
    }
  },
  methods: {
    handleSearch() {
      // 实现搜索逻辑
    },
    handleReset() {
      this.searchForm = {
        town: '',
        village: '',
        batchNo: '',
        ownerName: ''
      }
    },
    handleSizeChange(val) {
      this.pagination.pageSize = val
      // 重新加载数据
    },
    handleCurrentChange(val) {
      this.pagination.currentPage = val
      // 重新加载数据
    },
    handleDetail(row) {
      // 查看详情
    },
    handleEdit(row) {
      // 编辑
    },
    handleDelete(row) {
      // 删除
      },
      streetOptions: []
    }
  },
  created() {
    // 初始化加载数据
  }
    this.searchForm.street = this.$store.state.user.street;
    this.getList()
    getDictData('street').then(res => {
      this.streetOptions = res.data;
    });
  },
  methods: {
    handleStreetChange(val) {
      this.$store.commit('SET_STREET', val);
    },
    // 格式化数字,添加千位符
    formatNumber(num) {
      if (!num && num !== 0) return '0';
      return num.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ',');
    },
    // 获取列表数据
    getList() {
      this.loading = true;
      list(this.searchForm).then(res => {
        this.loading = false;
        if (res.code === 200) {
          // 更新统计数据
          this.statistics = res.data.reportSumResponse;
          // 直接使用后端返回的数据
          this.tableData = res.data.records;
          this.pagination.total = res.data.total;
        }
      }).catch(() => {
        this.loading = false;
      });
    },
    // 查询按钮
    handleSearch() {
      this.searchForm.pageNum = 1;
      this.getList();
    },
    // 重置按钮
    handleReset() {
      this.searchForm = {
        pageNum: 1,
        pageSize: 10,
        street: this.$store.state.user.street,
        community: '',
        batchNumber: '',
        householdHead: ''
      };
      this.getList();
    },
    // 分页大小改变
    handleSizeChange(val) {
      this.searchForm.pageSize = val;
      this.getList();
    },
    // 分页页码改变
    handleCurrentChange(val) {
      this.searchForm.pageNum = val;
      this.getList();
    },
    handleDetail(row) {
      // 查看详情
      console.log(row);
      // this.$router.push({
      //   path: '/applicationBatchList/detailInfo',
      //   query: {
      //     id: row.id
      //   }
      // });
    },
  },
}
</script>
@@ -153,7 +192,7 @@
  .statistics-cards {
    margin: 20px 0;
    .box-card {
      text-align: center;
      background: #6c5ce7;
src/views/payment-details/index.vue
@@ -3,7 +3,9 @@
        <!-- 搜索区域 -->
        <el-form :inline="true" :model="queryParams" class="search-form">
            <el-form-item label="镇街">
                <el-input v-model="queryParams.street" placeholder="请输入" clearable size="small" />
                <el-select v-model="queryParams.street" placeholder="请选择" clearable size="small">
                    <el-option v-for="item in streetOptions" :key="item.dictCode" :label="item.dictLabel" :value="item.dictLabel"></el-option>
                </el-select>
            </el-form-item>
            <el-form-item>
                <el-button type="primary" icon="el-icon-search" @click="handleQuery">查询</el-button>
@@ -11,42 +13,34 @@
            </el-form-item>
        </el-form>
        <!-- 数据卡片 -->
        <el-row :gutter="20" class="card-row">
        <!-- 统计卡片 -->
        <el-row :gutter="20" class="statistics-cards">
            <el-col :span="6">
                <el-card shadow="hover" class="data-card">
                    <div class="card-content">
                        <div class="card-amount">{{ statistics.compensationSum }}</div>
                        <div class="card-unit">万元</div>
                        <div class="card-title">补偿资金总金额</div>
                <el-card class="box-card">
                    <div class="card-amount">{{ formatNumber(statistics.compensationSum) }}<span class="unit">万元</span>
                    </div>
                    <div class="card-title">补偿资金总金额</div>
                </el-card>
            </el-col>
            <el-col :span="6">
                <el-card shadow="hover" class="data-card">
                    <div class="card-content">
                        <div class="card-amount">{{ statistics.downPaymentAmount }}</div>
                        <div class="card-unit">万元</div>
                        <div class="card-title">累计拨款金额</div>
                    </div>
                <el-card class="box-card">
                    <div class="card-amount">{{ formatNumber(statistics.downPaymentAmount) }}<span
                            class="unit">万元</span></div>
                    <div class="card-title">首付款总金额</div>
                </el-card>
            </el-col>
            <el-col :span="6">
                <el-card shadow="hover" class="data-card">
                    <div class="card-content">
                        <div class="card-amount">{{ statistics.subsidyAmount }}</div>
                        <div class="card-unit">万元</div>
                        <div class="card-title">过渡补贴金额</div>
                <el-card class="box-card">
                    <div class="card-amount">{{ formatNumber(statistics.subsidyAmount) }}<span class="unit">万元</span>
                    </div>
                    <div class="card-title">过渡补贴总金额</div>
                </el-card>
            </el-col>
            <el-col :span="6">
                <el-card shadow="hover" class="data-card">
                    <div class="card-content">
                        <div class="card-amount">{{ statistics.quarterPayAmount }}</div>
                        <div class="card-unit">万元</div>
                        <div class="card-title">季度拨款金额</div>
                <el-card class="box-card">
                    <div class="card-amount">{{ formatNumber(statistics.quarterPayAmount) }}<span class="unit">万元</span>
                    </div>
                    <div class="card-title">季度款总金额</div>
                </el-card>
            </el-col>
        </el-row>
@@ -71,13 +65,8 @@
            </el-table-column>
            <el-table-column label="每季度需支付款项(万元)" min-width="100" align="center">
                <template v-for="(quarter, index) in quarters">
                    <el-table-column
                        :key="index"
                        :label="formatQuarterLabel(quarter)"
                        :prop="quarter"
                        min-width="100"
                        align="center"
                    />
                    <el-table-column :key="index" :label="formatQuarterLabel(quarter)" :prop="quarter" min-width="100"
                        align="center" />
                </template>
            </el-table-column>
@@ -90,14 +79,17 @@
        </el-table>
        <!-- 分页组件 -->
        <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange"
        <el-pagination background @size-change="handleSizeChange" @current-change="handleCurrentChange"
            :current-page="queryParams.pageNum" :page-sizes="[10, 20, 50, 100]" :page-size="queryParams.pageSize"
            layout="total, sizes, prev, pager, next, jumper" :total="total" class="pagination" />
    </div>
</template>
<script>
import { list, exportExcel } from '@/api/payment-details/list'
import { list } from '@/api/payment-details/list'
import { exportExcell } from '@/utils'
import { getDictData } from '@/api/placement'
export default {
    name: "PaymentDetails",
    data() {
@@ -123,12 +115,22 @@
            },
            // 表格数据
            tableData: [],
            // 镇街列表
            streetOptions: [],
        };
    },
    created() {
        this.getList();
        getDictData('street').then(res => {
            this.streetOptions = res.data;
        });
    },
    methods: {
        // 格式化数字,添加千位符
        formatNumber(num) {
            if (!num && num !== 0) return '0';
            return num.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ',');
        },
        // 格式化季度标签
        formatQuarterLabel(quarter) {
            const [year, month] = quarter.split('-');
@@ -154,7 +156,7 @@
                    // 直接使用后端返回的数据
                    this.tableData = res.data.records;
                    this.total = res.data.total;
                }
            }).catch(() => {
@@ -177,22 +179,15 @@
        },
        // 详情操作
        handleReview(row) {
            console.log(row);
            this.$store.commit('SET_STREET', row.street);
            this.$router.push({
                path: '/payment-details/detail',
                query: {
                    street: row.street,
                    id: row.id
                }
                path: '/payment-details/detail'
            });
        },
        // 导出Excel
        handleExport() {
            this.$message.success("导出Excel功能");
            exportExcel().then(res => {
                console.log(res);
            });
            exportExcell('各季度应付款明细表.xlsx', { street: this.queryParams.street }, '/report/exports');
        },
        // 分页大小改变
        handleSizeChange(val) {
@@ -265,6 +260,30 @@
    text-align: right;
}
.statistics-cards {
    margin: 20px 0;
    .box-card {
        text-align: center;
        background: #6c5ce7;
        color: white;
        .card-amount {
            font-size: 24px;
            font-weight: bold;
            margin-bottom: 8px;
            .unit {
                font-size: 14px;
                margin-left: 4px;
            }
        }
        .card-title {
            font-size: 14px;
        }
    }
}
// 固定右侧操作栏背景色
::v-deep .el-table__fixed-right {
src/views/storing-data/components/ApprovalDialog.vue
File was deleted
src/views/storing-data/components/UploadDialog.vue
@@ -20,7 +20,7 @@
          ref="upload"
          class="upload-demo"
          drag
          action="http://182.140.209.168:8888/api/common/upload"
          :action="baseUrl + '/common/upload'"
          :headers="{
            'Authorization': 'Bearer ' + token
          }"
@@ -77,6 +77,7 @@
        attachName: '',
        attachUrl: ''
      },
      baseUrl: process.env.VUE_APP_BASE_API,
      rules: {
        street: [
          { required: true, message: '请选择镇(街道)', trigger: 'change' }
src/views/storing-data/detail.vue
File was deleted
src/views/storing-data/index.vue
@@ -4,7 +4,9 @@
    <div class="search-area">
      <el-form :inline="true" :model="queryParams" class="search-form">
        <el-form-item label="镇街">
          <el-input v-model="queryParams.street" placeholder="请输入" clearable size="small" />
          <el-select v-model="queryParams.street" placeholder="请选择" clearable size="small">
            <el-option v-for="item in streetOptions" :key="item.dictCode" :label="item.dictLabel" :value="item.dictLabel"></el-option>
          </el-select>
        </el-form-item>
        <el-form-item label="资料名称">
          <el-input v-model="queryParams.name" placeholder="请输入" clearable size="small" />
@@ -53,9 +55,6 @@
      </el-pagination>
    </div>
    <!-- 审核对话框 -->
    <approval-dialog ref="approvalDialog" :visible.sync="approvalDialogVisible" :type="approvalType"
      :row-data="currentRow" @audit-submit="handleApprovalSubmit" />
    <!-- 上传组件 -->
    <upload-dialog ref="uploadDialog" :visible.sync="uploadDialogVisible" :type="uploadType" :streetOptions="streetOptions"
@@ -66,7 +65,6 @@
<script>
import Pagination from "@/components/Pagination";
import UploadDialog from "./components/UploadDialog";
import ApprovalDialog from "./components/ApprovalDialog";
import { list, add, del, update } from "@/api/storing-data";
import { getDictData } from '@/api/placement'
@@ -75,7 +73,6 @@
  components: {
    Pagination,
    UploadDialog,
    ApprovalDialog,
  },
  data() {
    return {
@@ -90,7 +87,6 @@
        { value: "已驳回", label: "已驳回" },
      ],
      // 审核相关
      approvalDialogVisible: false,
      approvalType: "audit", // 'audit' 或 'detail'
      currentRow: {},
      // 上传相关