liukangdong
2024-11-26 bc46f9370b6ea7a4592eed2827f4f0368e4ba3b5
Merge branch 'master' of http://139.186.142.91:10010/r/productDev/funingyunwei
已添加9个文件
已修改14个文件
2672 ■■■■ 文件已修改
admin/.env.test 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/bill.js 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/finance/bull.vue 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/finance/components/bullDetail.vue 227 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/finance/components/bullEdit.vue 267 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/finance/components/flowingWater.vue 373 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/core/utils/Constants.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/AreasCloudController.java 115 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwContractRevenueCloudController.java 30 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/AreasMapper.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/dto/AreasDto.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/Areas.java 109 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwContract.java 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwContractBill.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwContractRevenue.java 77 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/EditRecordDataVO.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/AreasService.java 124 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwContractRevenueService.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/AreasServiceImpl.java 458 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwContractBillServiceImpl.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwContractRevenueServiceImpl.java 372 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwContractServiceImpl.java 257 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwWorkorderServiceImpl.java 41 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/.env.test
@@ -2,3 +2,5 @@
NODE_ENV = 'production'
# VUE_APP_API_URL  = 'http://192.168.5.13/gateway_interface'
VUE_APP_API_URL  = 'http://192.168.0.162:10010/'
admin/src/api/bill.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,13 @@
import request from '@/utils/request'
// æŸ¥è¯¢
export function fetchList (data) {
  return request.post('/visitsAdmin/cloudService/business/ywContractBill/page', data, {
    trim: true
  })
}
// åˆ›å»º
export function create (data) {
  return request.post('/visitsAdmin/cloudService/business/ywContractBill/create', data)
}
admin/src/views/finance/bull.vue
@@ -7,9 +7,9 @@
        <div class="tab" :class="{ active: activeTabs == 1 }" @click="tabsClick(1)">付款账单</div>
      </div>
      <div class="btns">
        <el-button type="primary" @click="handleEdit()" icon="el-icon-plus"
        <el-button type="primary" @click="$refs.EditRef.open('创建收款账单')" icon="el-icon-plus"
          v-permissions="['business:ywpatrolline:create']">新建</el-button>
        <el-button @click="handleEx" v-permissions="['business:ywpatrolline:create']">导出</el-button>
        <el-button @click="handleDetail" v-permissions="['business:ywpatrolline:create']">导出</el-button>
      </div>
    </div>
    <el-table v-loading="loading" :data="list" stripe>
@@ -20,19 +20,25 @@
      <el-table-column prop="remark" label="结清状态" min-width="100" show-overflow-tooltip />
      <el-table-column prop="createTime" label="账单金额" min-width="100" show-overflow-tooltip />
      <el-table-column prop="createTime" label="应收金额" min-width="100" show-overflow-tooltip />
      <el-table-column prop="createTime" label="合同状态" min-width="100" show-overflow-tooltip />
      <el-table-column prop="createTime" label="实收金额" min-width="100" show-overflow-tooltip />
      <el-table-column prop="createTime" label="需收金额" min-width="100" show-overflow-tooltip />
      <el-table-column prop="createTime" label="费用类型" min-width="100" show-overflow-tooltip />
      <el-table-column prop="createTime" label="是否逾期" min-width="100" show-overflow-tooltip />
      <el-table-column prop="createTime" label="计费周期" min-width="100" show-overflow-tooltip />
      <el-table-column prop="createTime" label="应收日期" min-width="100" show-overflow-tooltip />
      <el-table-column prop="createTime" label="账单来源" min-width="100" show-overflow-tooltip />
      <el-table-column prop="statusName" label="合同状态" min-width="100" fixed="right" show-overflow-tooltip />
      <el-table-column label="操作" min-width="120" fixed="right">
        <template slot-scope="{row}">
          <el-button type="text" @click="handleDetail(row)" icon="el-icon-edit"
            v-permissions="['business:category:update']">查看详情</el-button>
          <el-button type="text" @click="handleDetail(row)" icon="el-icon-edit" v-permissions="['business:category:update']">查看详情</el-button>
        </template>
      </el-table-column>
    </el-table>
    <div class="mt20">
      <Pagination @size-change="handleSizeChange" @current-change="getList" :pagination="pagination" />
    </div>
    <Edit v-if="showEdit" ref="EditRef" @success="getList" @close="showEdit = false" />
    <Detail ref="DetailRef" @success="getList" @close="showEdit = false" />
    <Edit ref="EditRef" @success="getList" />
    <Detail ref="DetailRef" @success="getList" />
  </div>
</template>
@@ -41,7 +47,7 @@
import QueryForm from '@/components/common/QueryForm'
import Edit from './components/bullEdit.vue'
import Detail from './components/bullDetail.vue'
import { fetchList, deleteById } from '@/api/Inspection/device'
import { fetchList } from '@/api/bill'
export default {
  components: {
    Pagination,
@@ -52,7 +58,6 @@
  data() {
    return {
      loading: false,
      showEdit: false,
      pagination: {
        pageSize: 10,
        page: 1,
@@ -105,57 +110,32 @@
    this.getList()
  },
  methods: {
    getList(page) {
    getList (page) {
      const { pagination, filters } = this
      this.loading = true
      fetchList({
        model: {
          ...filters,
          ...filters
        },
        capacity: pagination.pageSize,
        page: page || pagination.page,
        page: page || pagination.page
      }).then(res => {
        console.log(res)
        this.loading = false
        this.list = res.records || []
        this.list.forEach(item => {
          item.stautsName = item.status == 0 ? '正常' : item.status == 1 ? '损坏' : '报废'
          item.statusName = item.status === 1 ? '损坏' : item.status === 2 ? '报废' : '正常'
        })
        this.pagination.total = res.total || 0
      }, () => {
        this.loading = false
      })
    },
    handleEx() {
    },
    tabsClick(val) {
      this.activeTabs = val
    },
    handleEdit(row) {
      this.showEdit = true
      this.$nextTick(() => {
        this.$refs.EditRef.isShowModal = true
        if (row && row.id) {
          this.$refs.EditRef.getDetail(row.id)
        }
      })
    },
    handleDetail() {
    },
    handleDel(row) {
      let message = `确认删除该记录吗?`
      this.$dialog.deleteConfirm(message)
        .then(() => {
          this.isWorking.delete = true
          deleteById(row.id)
            .then(() => {
              this.$tip.apiSuccess('删除成功')
              this.getList()
            })
        })
        .catch(() => { })
    handleDetail(row) {
      this.$refs.DetailRef.open()
    },
    clear() {
      this.filters = {}
@@ -175,7 +155,6 @@
@import '@/assets/style/variables.scss';
.tabs {
  border-bottom: 1px solid #DFE2E8;
  display: flex;
  margin-bottom: 20px;
  display: flex;
admin/src/views/finance/components/bullDetail.vue
@@ -4,134 +4,205 @@
    <div class="home_title">
      <div class="left">
        <span class="mr10">付款方:xxx</span>
        <span class="status">status</span>
        <el-tag type="success">status</el-tag>
      </div>
      <el-button plain type="primary">新建收支流水</el-button>
      <el-button plain type="primary" @click="$refs.flowingWater.open('创建收支流水')">新建收支流水</el-button>
    </div>
    <div class="remark">
      <div class="item">
        <div class="la">账单状态</div>
        <div class="val">已结清</div>
    <div class="line"></div>
    <div class="main">
      <div class="list" style="background: rgba(0,0,0,0); padding: 0; margin-bottom: 0;">
        <div class="item" style="flex: 1;">
          <div class="la">结清状态</div>
          <div class="val" style="margin-top: 10px;">已结清</div>
        </div>
        <div class="item" style="flex: 1;">
          <div class="la">应收金额(元)</div>
          <div class="val" style="margin-top: 10px;">1,000.00</div>
        </div>
        <div class="item" style="flex: 1;">
          <div class="la">实收金额(元)</div>
          <div class="val" style="margin-top: 10px;">1,000.00</div>
        </div>
        <div class="item" style="flex: 1;">
          <div class="la">需付金额(元)</div>
          <div class="val" style="margin-top: 10px;">1,000.00</div>
        </div>
        <div class="item" style="flex: 1;">
          <div class="la">应收日期</div>
          <div class="val" style="margin-top: 10px;">2024-11-16</div>
        </div>
      </div>
    </div>
    <div class="tabs">
      <div class="tab" :class="{ active: activeTabs == 0 }" @click="tabsClick(0)">合同信息</div>
      <div class="tab" :class="{ active: activeTabs == 1 }" @click="tabsClick(1)">关联账单</div>
      <div class="tab" :class="{ active: activeTabs == 2 }" @click="tabsClick(2)">操作记录</div>
      <div class="tab" :class="{ active: activeTabs == 0 }" @click="tabsClick(0)">基础信息</div>
      <div class="tab" :class="{ active: activeTabs == 1 }" @click="tabsClick(1)">账单明细</div>
      <div class="tab" :class="{ active: activeTabs == 2 }" @click="tabsClick(2)">收支流水</div>
    </div>
    <div class="main">
      <div class="title">基础信息</div>
      <div class="list">
      <div class="list" style="background: rgba(0,0,0,0); padding: 0;">
        <div class="item">
          <div class="la">账单类型</div>
          <div class="val">{{ info.aaa }}</div>
          <div class="val">租金</div>
        </div>
        <div class="item">
          <div class="la">计费周期</div>
          <div class="val">{{ info.aaa }}</div>
          <div class="val">2024-11-17 ~ 2025-11-17</div>
        </div>
        <div class="item">
          <div class="la">账单金额(元)</div>
          <div class="val">{{ info.aaa }}</div>
          <div class="val">10000.00</div>
        </div>
        <div class="item">
          <div class="la">账单编号</div>
          <div class="val">{{ info.aaa }}</div>
          <div class="val">ZD20241117-0002</div>
        </div>
        <div class="item">
          <div class="la">合同编号</div>
          <div class="val">{{ info.aaa }}</div>
          <div class="val">202411-0017</div>
        </div>
        <div class="item">
          <div class="la">创建时间</div>
          <div class="val">{{ info.aaa }}</div>
          <div class="val">2024-11-16 15:17:01</div>
        </div>
        <div class="item">
          <div class="la">付款方</div>
          <div class="val">{{ info.aaa }}</div>
          <div class="val">XX公司</div>
        </div>
        <div class="item">
          <div class="la">经办人</div>
          <div class="val">{{ info.aaa }}</div>
          <div class="val">张三</div>
        </div>
        <div class="item">
          <div class="la">所属公司</div>
          <div class="val">{{ info.aaa }}</div>
          <div class="val">XXX有限公司</div>
        </div>
        <div class="item">
          <div class="la">账单备注</div>
          <div class="val">{{ info.aaa }}</div>
          <div class="val">这是备注内容</div>
        </div>
        <div class="item"></div>
        <div class="item"></div>
      </div>
      <div class="title">房源信息</div>
      <div class="list">
        <div class="item">
          <div class="la">项目名称</div>
          <div class="val">{{ info.aaa }}</div>
        </div>
        <div class="item">
          <div class="la">楼宇名称</div>
          <div class="val">{{ info.aaa }}</div>
        </div>
        <div class="item">
          <div class="la">楼层/房号</div>
          <div class="val">{{ info.aaa }}</div>
        </div>
        <div class="item">
          <div class="la">面积</div>
          <div class="val">{{ info.aaa }}</div>
        </div>
      <div class="list" style="background: rgba(0,0,0,0); padding: 0;">
        <el-table
          :data="tableData"
          border
          style="width: 100%">
          <el-table-column
            prop="date"
            label="项目名称">
          </el-table-column>
          <el-table-column
            prop="name"
            label="楼宇名称">
          </el-table-column>
          <el-table-column
            prop="address"
            label="楼层/房号">
          </el-table-column>
          <el-table-column
            prop="address"
            label="面积">
          </el-table-column>
        </el-table>
      </div>
      <div class="title">租客信息</div>
      <div class="list">
        <div class="item">
          <div class="la">租客</div>
          <div class="val">{{ info.aaa }}</div>
        </div>
        <div class="item">
          <div class="la">经办人</div>
          <div class="val">{{ info.aaa }}</div>
        </div>
      <div class="title">账单明细</div>
      <div class="list" style="background: rgba(0,0,0,0); padding: 0;">
        <el-table
          :data="tableData"
          border
          style="width: 100%">
          <el-table-column
            prop="date"
            label="费用类型">
          </el-table-column>
          <el-table-column
            prop="name"
            label="应收/付金额">
          </el-table-column>
          <el-table-column
            prop="address"
            label="实收金额">
          </el-table-column>
          <el-table-column
            prop="address"
            label="需收金额">
          </el-table-column>
          <el-table-column
            prop="address"
            label="计费周期">
          </el-table-column>
          <el-table-column
            prop="address"
            label="应收/付日期">
          </el-table-column>
          <el-table-column
            prop="address"
            label="备注">
          </el-table-column>
        </el-table>
      </div>
      <div class="title">租赁条款</div>
      <div class="list">
        <div class="item">
          <div class="la">押金金额</div>
          <div class="val">{{ info.aaa }}</div>
        </div>
        <div class="item">
          <div class="la">付款方式</div>
          <div class="val">{{ info.aaa }}</div>
        </div>
        <div class="item">
          <div class="la">免租期</div>
          <div class="val">{{ info.aaa }}</div>
        </div>
      <div class="title">收支流水</div>
      <div class="list" style="background: rgba(0,0,0,0); padding: 0;">
        <el-table
          :data="tableData"
          border
          style="width: 100%">
          <el-table-column
            prop="date"
            label="流水类型">
          </el-table-column>
          <el-table-column
            prop="name"
            label="对方单位名称">
          </el-table-column>
          <el-table-column
            prop="address"
            label="费用类型">
          </el-table-column>
          <el-table-column
            prop="address"
            label="入账日期">
          </el-table-column>
          <el-table-column
            prop="address"
            label="发生额">
          </el-table-column>
          <el-table-column
            prop="address"
            label="创建时间">
          </el-table-column>
          <el-table-column
            prop="address"
            label="备注">
          </el-table-column>
        </el-table>
      </div>
      <el-table :data="info.list" stripe>
        <el-table-column prop="" label="开始日期" min-width="100" show-overflow-tooltip />
        <el-table-column prop="" label="结束日期" min-width="100" show-overflow-tooltip />
        <el-table-column prop="" label="合同单价" min-width="100" show-overflow-tooltip />
        <el-table-column prop="" label="付款提前天数" min-width="100" show-overflow-tooltip />
      </el-table>
    </div>
    <!--  åˆ›å»ºæµæ°´  -->
    <FlowingWater ref="flowingWater" />
  </GlobalWindow>
</template>
<script>
import GlobalWindow from '@/components/common/GlobalWindow'
import BaseOpera from '@/components/base/BaseOpera'
import FlowingWater from './flowingWater'
export default {
  components: {
    GlobalWindow
    GlobalWindow,
    FlowingWater
  },
  extends: BaseOpera,
  data() {
    return {
      id: '',
      visible: true,
      visible: false,
      activeTabs: '',
      info: {}
      info: {},
      tableData: []
    }
  },
  methods: {
@@ -201,6 +272,12 @@
  }
}
.line {
  width: 100%;
  margin: 15px 0;
  border-bottom: 1px dashed #eaeaea;
}
.main {
  .title {
    font-weight: 500;
@@ -212,18 +289,18 @@
  .list {
    display: flex;
    flex-wrap: wrap;
    background: #F7F7F7;
    /*background: #F7F7F7;*/
    border-radius: 2px;
    padding: 15px 20px;
    padding: 0 20px;
    margin-bottom: 20px;
    .item {
      width: 25%;
      margin-bottom: 16px;
      flex: 25%;
      margin-bottom: 20px;
      .la {
        color: #7f7f7f;
        margin-top: 2px;
        margin-bottom: 5px;
      }
    }
  }
admin/src/views/finance/components/bullEdit.vue
@@ -1,77 +1,106 @@
<template>
  <GlobalWindow width="1100px" :title="title" :visible.sync="isShowModal" :confirm-working="isWorking" @close="close"
  <GlobalWindow width="100%" :title="title" :visible.sync="visible" :confirm-working="isWorking" @close="close"
    @confirm="confirm">
    <template v-if="activeTabs == 0">
      <div class="main">
        <div class="main_content">
          <el-form :model="param" label-position="top" ref="paramRef" :rules="rules">
            <div class="head">
              <div class="m_title">基础信息</div>
              <div class="tabs">
                <div class="tab" :class="{ active: timeTab == 0 }" @click="timeTabClick('0')">周期费用</div>
                <div class="tab" :class="{ active: timeTab == 1 }" @click="timeTabClick('1')">一次性费用</div>
              </div>
    <div class="main">
      <div class="main_content">
        <el-form :model="param" label-position="top" ref="form" :rules="rules">
          <div class="head">
            <div class="m_title">基础信息</div>
            <div class="tabs">
              <div class="tab" :class="{ active: form.feeType === 0 }" @click="timeTabClick(0)">周期费用</div>
              <div class="tab" :class="{ active: form.feeType === 1 }" @click="timeTabClick(1)">一次性费用</div>
            </div>
            <div class="list">
              <el-form-item label="关联合同" prop="type">
                <el-select v-model="param.type" placeholder="请选择" clearable>
                  <el-option v-for="item in types" :value="item.value" :label="item.name"></el-option>
                </el-select>
              </el-form-item>
              <el-form-item label="付款方" prop="code">
                <el-input v-model="param.code" placeholder="请输入合同编号" v-trim />
              </el-form-item>
              <el-form-item label="费用类型" prop="aaa">
                <el-select v-model="param.aaa" placeholder="请选择" clearable>
                  <el-option v-for="item in agentList" :value="item.id" :label="item.name"></el-option>
                </el-select>
              </el-form-item>
              <el-form-item label="计费周期" prop="">
                <el-date-picker type="date" v-model="param.getDate" value-format="yyyy-MM-dd" placeholder="请选择" />
              </el-form-item>
              <el-form-item label="应收金额" prop="">
                <el-date-picker type="date" v-model="param.getDate" value-format="yyyy-MM-dd" placeholder="请选择" />
              </el-form-item>
              <el-form-item label="应收日期" prop="">
                <el-date-picker type="date" v-model="param.getDate" value-format="yyyy-MM-dd" placeholder="请选择" />
              </el-form-item>
              <el-form-item label="所属公司" prop="">
                <el-select v-model="param.aaa" placeholder="请选择" clearable>
                  <el-option v-for="item in comparyList" :value="item.id" :label="item.name"></el-option>
                </el-select>
              </el-form-item>
              <el-form-item style="width: 100%;" label="账单备注" prop="">
                <el-input type="textarea" :rows="4" v-model="param.content" placeholder="请输入" />
              </el-form-item>
            </div>
          </el-form>
        </div>
        <div class="main_house">
          <div class="title">请选择房源</div>
          <el-cascader style="width: 300px" v-model="value" @change="houseChange" :options="options"
            :props="{ multiple: true }" collapse-tags clearable />
        </div>
          </div>
          <div class="list">
            <el-form-item label="关联合同" prop="contractId">
              <el-select v-model="form.contractId" placeholder="请选择" clearable>
                <el-option v-for="(item, index) in contract" :key="index" :value="item.value" :label="item.name"></el-option>
              </el-select>
            </el-form-item>
            <el-form-item label="付款方" prop="customerName">
              <el-select v-model="form.customerName" filterable placeholder="请选择">
                <el-option
                  v-for="(item, index) in payerList"
                  :key="index"
                  :label="item.label"
                  :value="item.value">
                </el-option>
              </el-select>
            </el-form-item>
            <el-form-item label="费用类型" prop="costType">
              <el-select v-model="form.costType" placeholder="请选择">
                <el-option :value="0" label="租赁费"></el-option>
                <el-option :value="1" label="物业费"></el-option>
                <el-option :value="2" label="租赁押金"></el-option>
                <el-option :value="3" label="物业证金"></el-option>
                <el-option :value="4" label="水电费"></el-option>
                <el-option :value="5" label="杂项费"></el-option>
                <el-option :value="6" label="其他"></el-option>
              </el-select>
            </el-form-item>
            <el-form-item label="计费周期" prop="startDate" v-if="form.feeType !== 1">
              <el-date-picker
                type="daterange"
                range-separator="至"
                v-model="date"
                @change="changeDate"
                start-placeholder="开始日期"
                end-placeholder="结束日期"
                value-format="yyyy-MM-dd"
                placeholder="请选择" />
            </el-form-item>
            <el-form-item label="应收金额" prop="receivableFee">
              <el-input v-model="form.receivableFee" placeholder="请输入应收金额" v-trim />
            </el-form-item>
            <el-form-item label="应收日期" prop="planPayDate">
              <el-date-picker type="date" v-model="form.planPayDate" value-format="yyyy-MM-dd" placeholder="请选择" />
            </el-form-item>
            <el-form-item label="所属公司" prop="companyId">
              <el-select v-model="form.companyId" placeholder="请选择" clearable>
                <el-option
                  v-for="(item, index) in comparyList"
                  :key="index"
                  :value="item.id"
                  :label="item.name" />
              </el-select>
            </el-form-item>
            <el-form-item style="width: 100%;" label="账单备注" prop="remark">
              <el-input type="textarea" :rows="5" v-model="param.remark" placeholder="请输入" />
            </el-form-item>
          </div>
        </el-form>
      </div>
      <div class="file_wrap">
        <div class="head">
          <div>账单附件</div>
          <el-upload class="upload-demo" :show-file-list="false" :data="uploadData" :action="uploadImgUrl"
            :on-success="uploadAvatarSuccess" :before-upload="beforeUpload" :on-error="uploadError">
            <el-button icon="el-icon-plus" plain>添加附件</el-button>
          </el-upload>
        </div>
        <el-table :data="param.list" stripe>
          <el-table-column prop="" label="附件名称" align="center" min-width="100" show-overflow-tooltip />
          <el-table-column prop="" label="操作人" align="center" min-width="100" show-overflow-tooltip />
          <el-table-column prop="" label="操作时间" align="center" min-width="100" show-overflow-tooltip />
          <el-table-column prop="" label="操作" align="center" min-width="100">
            <template v-slot="scope">
              <span class="cu red">删除</span>
            </template>
          </el-table-column>
        </el-table>
      <div class="main_house">
        <div class="title">请选择房源</div>
        <el-tree
          :data="houseList"
          show-checkbox
          node-key="id"
          :default-expanded-keys="[2, 3]"
          :default-checked-keys="[5]"
          :props="defaultProps">
        </el-tree>
      </div>
    </template>
    </div>
    <div class="file_wrap">
      <div class="head">
        <div>账单附件</div>
        <el-upload class="upload-demo" :show-file-list="false" :data="uploadData" :action="uploadImgUrl"
          :on-success="uploadAvatarSuccess" :before-upload="beforeUpload" :on-error="uploadError">
          <el-button icon="el-icon-plus" plain>添加附件</el-button>
        </el-upload>
      </div>
      <el-table :data="param.list" stripe>
        <el-table-column prop="" label="附件名称" align="center" min-width="100" show-overflow-tooltip />
        <el-table-column prop="" label="操作人" align="center" min-width="100" show-overflow-tooltip />
        <el-table-column prop="" label="操作时间" align="center" min-width="100" show-overflow-tooltip />
        <el-table-column prop="" label="操作" align="center" min-width="100">
          <template v-slot="{ scope }">
            <span class="cu red">删除</span>
          </template>
        </el-table-column>
      </el-table>
    </div>
    <!--  -->
    <MemberSearch ref="MemberSearchRef" />
  </GlobalWindow>
@@ -82,6 +111,7 @@
import BaseOpera from '@/components/base/BaseOpera'
import MemberSearch from '@/components/common/MemberSearch'
import { rules } from './config'
import { create } from '@/api/bill'
import { Message, Loading } from 'element-ui'
export default {
  components: {
@@ -91,9 +121,21 @@
  extends: BaseOpera,
  data() {
    return {
      isShowModal: false,
      title: '',
      activeTabs: '0',
      form: {
        contractId: '',
        customerName: '',
        costType: '',
        type: '',
        companyId: '',
        remark: '',
        startDate: '',
        endDate: '',
        receivableFee: '',
        feeType: 0,
        planPayDate: ''
      },
      date: [],
      param: {},
      rules,
      timeTab: '0',
@@ -104,13 +146,9 @@
      uploadData: {
        folder: 'HIDDEN_DANGER_FILE'
      },
      types: [
        { name: '物业+租赁合同', value: 0 },
        { name: '租赁合同', value: 1 },
        { name: '物业合同', value: 2 },
      ],
      agentList: [], //经办人
      contract: [],
      payerList: [],
      projectList: [],
      comparyList: [], // å…¬å¸
      renterList: [], // ç§Ÿå®¢
@@ -183,35 +221,68 @@
        { name: '元/m²·年', value: 5 },
        { name: '元/场', value: 6 },
      ],
      houseList: [{
        id: 1,
        label: '一级 1',
        children: [{
          id: 4,
          label: '二级 1-1',
          children: [{
            id: 9,
            label: '三级 1-1-1'
          }, {
            id: 10,
            label: '三级 1-1-2'
          }]
        }]
      }, {
        id: 2,
        label: '一级 2',
        children: [{
          id: 5,
          label: '二级 2-1'
        }, {
          id: 6,
          label: '二级 2-2'
        }]
      }, {
        id: 3,
        label: '一级 3',
        children: [{
          id: 7,
          label: '二级 3-1'
        }, {
          id: 8,
          label: '二级 3-2'
        }]
      }],
      defaultProps: {
        children: 'children',
        label: 'label'
      }
    }
  },
  created() {
    const { param } = this
    this.title = param.id ? '编辑收款账单' : '创建收款账单'
  },
  methods: {
    tabsClick(val) {
      this.activeTabs = val
    },
    timeTabClick(val) {
      this.timeTab = val
      this.form.feeType = val
      if (val === 1) {
        this.form.startDate = ''
        this.form.endDate = ''
      }
    },
    getDetail() {
    changeDate(e) {
      if (!e || e.length === 0) {
        this.form.startDate = ''
        this.form.endDate = ''
      } else {
        this.form.startDate = e[0]
        this.form.endDate = e[1]
      }
    },
    handleRent() {
      this.$refs.MemberSearchRef.openModal()
    },
    houseChange(e) {
      console.log(e)
      console.log(this.value)
    },
    beforeUpload(file) {
      // if (['video/mp4', 'video/ogg', 'video/flv', 'video/avi', 'video/wmv', 'video/rmvb', 'image/jpeg', 'image/jpg', 'image/png', 'image/gif'].indexOf(file.type) == -1) {
      //   this.$message.error('请上传正确的视频/图片格式')
      //   return false
      // }
      this.loadingInstance = Loading.service({
        lock: true,
        text: 'Loading',
admin/src/views/finance/components/flowingWater.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,373 @@
<template>
    <GlobalWindow width="100%" :title="title" :visible.sync="isShowModal" :confirm-working="isWorking" @close="close"
      @confirm="confirm">
        <div class="main">
            <div class="main_content">
                <el-form :model="param" label-position="top" ref="paramRef" :rules="rules">
                    <div class="head">
                        <div class="m_title">流水信息</div>
                    </div>
                    <div class="list">
                        <el-form-item label="关联合同" prop="type">
                            <el-select v-model="param.type" placeholder="请选择" clearable>
                                <el-option v-for="item in types" :value="item.value" :label="item.name"></el-option>
                            </el-select>
                        </el-form-item>
                        <el-form-item label="费用类型" prop="code">
                            <el-input v-model="param.code" placeholder="请输入合同编号" v-trim />
                        </el-form-item>
                        <el-form-item label="费单周期" prop="aaa">
                            <el-select v-model="param.code" placeholder="请选择" clearable>
                                <el-option v-for="item in agentList" :value="item.id" :label="item.name"></el-option>
                            </el-select>
                        </el-form-item>
                        <el-form-item label="应收金额" prop="">
                            <el-input v-model="param.code" placeholder="请输入实收金额" v-trim />
                        </el-form-item>
                        <el-form-item label="实收金额" prop="">
                            <el-input v-model="param.code" placeholder="请输入实收金额" v-trim />
                        </el-form-item>
                        <el-form-item label="入账日期" prop="">
                            <el-date-picker type="date" v-model="param.getDate" value-format="yyyy-MM-dd" placeholder="请选择" />
                        </el-form-item>
                        <el-form-item label="收款方式" prop="">
                            <el-select v-model="param.content" placeholder="请选择">
                                <el-option label="现金" :value="1"></el-option>
                                <el-option label="网银转账" :value="2"></el-option>
                                <el-option label="POS机" :value="3"></el-option>
                                <el-option label="支付宝" :value="4"></el-option>
                                <el-option label="微信" :value="5"></el-option>
                                <el-option label="转账支票" :value="6"></el-option>
                                <el-option label="其它方式" :value="7"></el-option>
                            </el-select>
                        </el-form-item>
                        <el-form-item label="所属公司" prop="">
                            <el-select v-model="param.code" placeholder="请选择" clearable>
                                <el-option v-for="item in agentList" :value="item.id" :label="item.name"></el-option>
                            </el-select>
                        </el-form-item>
                        <el-form-item label="收支账户" prop="">
                            <el-select v-model="param.code" placeholder="请选择" clearable>
                                <el-option v-for="item in agentList" :value="item.id" :label="item.name"></el-option>
                            </el-select>
                        </el-form-item>
                        <el-form-item label="备注" prop="" style="width: 100%;">
                            <el-input type="textarea" :rows="6" v-model="param.content" placeholder="请输入" />
                        </el-form-item>
                    </div>
                </el-form>
            </div>
        </div>
        <div class="file_wrap">
            <div class="head">
                <div>账单附件</div>
                <el-upload class="upload-demo" :show-file-list="false" :data="uploadData" :action="uploadImgUrl"
                           :on-success="uploadAvatarSuccess" :before-upload="beforeUpload" :on-error="uploadError">
                    <el-button icon="el-icon-plus" plain>添加附件</el-button>
                </el-upload>
            </div>
            <el-table :data="param.list" stripe>
                <el-table-column prop="" label="附件名称" align="center" min-width="100" show-overflow-tooltip />
                <el-table-column prop="" label="操作人" align="center" min-width="100" show-overflow-tooltip />
                <el-table-column prop="" label="操作时间" align="center" min-width="100" show-overflow-tooltip />
                <el-table-column prop="" label="操作" align="center" min-width="100">
                    <template v-slot="scope">
                        <span class="cu red">删除</span>
                    </template>
                </el-table-column>
            </el-table>
        </div>
    </GlobalWindow>
</template>
<script>
  import GlobalWindow from '@/components/common/GlobalWindow'
  import BaseOpera from '@/components/base/BaseOpera'
  import { rules } from './config'
  import { Message, Loading } from 'element-ui'
  export default {
    name: "flowingWater",
    components: {
      GlobalWindow
    },
    extends: BaseOpera,
    data() {
      return {
        isShowModal: false,
        title: '',
        activeTabs: '0',
        param: {},
        rules,
        timeTab: '0',
        loadingInstance: null,
        uploadImgUrl: process.env.VUE_APP_API_PREFIX + '/visitsAdmin/cloudService/public/uploadBatch',
        fileList: [],
        uploadData: {
          folder: 'HIDDEN_DANGER_FILE'
        },
        types: [
          { name: '物业+租赁合同', value: 0 },
          { name: '租赁合同', value: 1 },
          { name: '物业合同', value: 2 },
        ],
        agentList: [], //经办人
        projectList: [],
        comparyList: [], // å…¬å¸
        renterList: [], // ç§Ÿå®¢
        contacts: [], // è”系人
        value: [],
        options: [
          {
            value: 1,
            label: '东南',
            children: [{
              value: 2,
              label: '上海',
              children: [
                { value: 3, label: '普陀' },
                { value: 4, label: '黄埔' },
                { value: 5, label: '徐汇' }
              ]
            }, {
              value: 7,
              label: '江苏',
              children: [
                { value: 8, label: '南京' },
                { value: 9, label: '苏州' },
                { value: 10, label: '无锡' }
              ]
            }, {
              value: 12,
              label: '浙江',
              children: [
                { value: 13, label: '杭州' },
                { value: 14, label: '宁波' },
                { value: 15, label: '嘉兴' }
              ]
            }]
          },
          {
            value: 17,
            label: '西北',
            children: [{
              value: 18,
              label: '陕西',
              children: [
                { value: 19, label: '西安' },
                { value: 20, label: '延安' }
              ]
            }, {
              value: 21,
              label: '新疆维吾尔族自治区',
              children: [
                { value: 22, label: '乌鲁木齐' },
                { value: 23, label: '克拉玛依' }
              ]
            }]
          }
        ],
        cactiveTabs: 0,
        paramCost: {},
        payMethods: [
          { name: '一次性付款', value: 0 },
          { name: '3个月一付', value: 1 },
          { name: '6个月一付', value: 2 },
          { name: '1年一付', value: 2 },
        ],
        unitOps: [
          { name: '元/m²·天', value: 0 },
          { name: '元/m²·月', value: 1 },
          { name: '元/天', value: 2 },
          { name: '元/月', value: 3 },
          { name: '元/å¹´', value: 4 },
          { name: '元/m²·年', value: 5 },
          { name: '元/场', value: 6 },
        ],
      }
    },
    created() {
      const { param } = this
      this.title = param.id ? '编辑收款账单' : '创建收款账单'
    },
    methods: {
      tabsClick(val) {
        this.activeTabs = val
      },
      timeTabClick(val) {
        this.timeTab = val
      },
      getDetail() {
      },
      handleRent() {
        this.$refs.MemberSearchRef.openModal()
      },
      houseChange(e) {
        console.log(e)
        console.log(this.value)
      },
      beforeUpload(file) {
        // if (['video/mp4', 'video/ogg', 'video/flv', 'video/avi', 'video/wmv', 'video/rmvb', 'image/jpeg', 'image/jpg', 'image/png', 'image/gif'].indexOf(file.type) == -1) {
        //   this.$message.error('请上传正确的视频/图片格式')
        //   return false
        // }
        this.loadingInstance = Loading.service({
          lock: true,
          text: 'Loading',
          spinner: 'el-icon-loading',
          background: 'rgba(0, 0, 0, 0.7)'
        })
      },
      uploadError() {
        this.$nextTick(() => { // ä»¥æœåŠ¡çš„æ–¹å¼è°ƒç”¨çš„ Loading éœ€è¦å¼‚步关闭
          if (this.loadingInstance) {
            this.loadingInstance.close()
          }
        })
      },
      uploadAvatarSuccess(file) {
        this.$nextTick(() => { // ä»¥æœåŠ¡çš„æ–¹å¼è°ƒç”¨çš„ Loading éœ€è¦å¼‚步关闭
          if (this.loadingInstance) {
            this.loadingInstance.close()
          }
        })
        console.log('file', file)
        const item = file.data[0]
        if (['.mp4', '.avi', '.flv', '.wmv'].some(char => item.imgaddr.includes(char))) {
          this.fileList.push({
            type: 1,
            fileurl: item.imgaddr,
            fileurlFull: item.url
          })
        } else {
          this.fileList.push({
            type: 0,
            fileurl: item.imgaddr,
            fileurlFull: item.url
          })
        }
        console.log('file', this.fileList)
        // this.$set(this.param, 'faceImg', file.imgurl)
        // this.$set(this.param, 'faceImgUrl', file.imgurlfull)
      },
      close() {
        this.isShowModal = false
        this.$emit('close')
      },
      open(title, target) {
        this.title = title
        this.isShowModal = true
      }
    }
  }
</script>
<style lang="scss" scoped>
    @import '@/assets/style/variables.scss';
    .cost_tabs {
        justify-content: flex-start;
        border: none;
        .tab {
            height: 36px;
            line-height: 36px;
            font-size: 14px;
        }
    }
    .main {
        display: flex;
        margin-bottom: 20px;
        .main_content {
            flex: 1;
            margin-right: 20px;
            .head {
                display: flex;
                align-items: center;
                justify-content: space-between;
                .tabs {
                    display: flex;
                    margin-bottom: 20px;
                    display: flex;
                    justify-content: center;
                    .tab {
                        height: 14px;
                        line-height: 14px;
                        cursor: pointer;
                        border: 1px solid #ebebeb;
                        padding: 12px 24px;
                    }
                    .active {
                        font-weight: 500;
                        color: $primary-color;
                        border: 1px solid $primary-color;
                    }
                }
            }
            .list {
                display: flex;
                flex-wrap: wrap;
                .el-form-item {
                    width: 33.33%;
                    box-sizing: border-box;
                    padding: 0 12px;
                }
            }
        }
        .main_house {
            width: 320px;
            padding: 24px 12px;
            border: 1px solid #c3c6cd;
            border-radius: 2px;
            .title {
                font-size: 16px;
                font-weight: 500;
                margin-bottom: 30px;
            }
        }
    }
    .total {
        display: flex;
        justify-content: space-between;
        align-items: center;
        height: 32px;
        background-color: #e7e9f5;
        span {
            width: 160px;
            text-align: center;
        }
    }
    .file_wrap {
        .head {
            display: flex;
            justify-content: space-between;
            align-items: center;
        }
    }
    .m_title {
        font-weight: 500;
        font-size: 14px;
        margin-bottom: 15px;
        margin-top: 10px;
    }
</style>
server/system_service/src/main/java/com/doumee/core/utils/Constants.java
@@ -118,6 +118,7 @@
    public static final String ERP ="ERP" ;
    public static final Integer THREE =3 ;
    public static final Integer FOUR =4 ;
    public static final Integer SEVEN =7 ;
    public static final Integer FIVE =5 ;
    public static final String ORG_USER_ORIGIN = "ORG_USER_ORIGIN";
    public static final String VIRTUAL_CARD_INDEX = "02098469790";
@@ -1251,7 +1252,8 @@
        FN_DEVICE_RECORD_FILE(6, "阜宁服务平台运维记录图片 ", "阜宁服务平台运维记录图片 "),
        FN_PATROL_POINT_FILE(7, "巡检点附件 ", "巡检点附件 "),
        FN_CONTRACT_BILL_FILE(8, "合同账单附件 ", "合同账单附件 "),
        YW_CONTRACT_FILE(9, "合同附件 ", "合同附件 ")
        YW_CONTRACT_FILE(9, "合同附件 ", "合同附件 "),
        FN_CONTRACT_REVENUE_FILE(10, "收支流水附件 ", "合同账单附件 "),
        ;
        // æˆå‘˜å˜é‡
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/AreasCloudController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,115 @@
package com.doumee.cloud.admin;
import com.doumee.api.BaseController;
import com.doumee.core.annotation.excel.ExcelExporter;
import com.doumee.core.annotation.pr.PreventRepeat;
import com.doumee.core.model.ApiResponse;
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.core.utils.Constants;
import com.doumee.dao.business.dto.AreasDto;
import com.doumee.dao.business.model.Areas;
import com.doumee.service.business.AreasService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.List;
/**
 * @author æ±Ÿè¹„蹄
 * @date 2023/02/15 08:55
 */
@Api(tags = "省市区信息表")
@RestController
@RequestMapping(Constants.CLOUD_SERVICE_URL_INDEX+"/business/areas")
public class AreasCloudController extends BaseController {
    @Autowired
    private AreasService areasService;
    @PreventRepeat
    @ApiOperation("新建")
    @PostMapping("/create")
    @RequiresPermissions("business:areas:create")
    public ApiResponse create(@RequestBody Areas areas,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        areas.setLoginUserInfo(getLoginUser(token));
        return ApiResponse.success(areasService.create(areas));
    }
    @ApiOperation("根据ID删除")
    @GetMapping("/delete/{id}")
    @RequiresPermissions("business:areas:delete")
    public ApiResponse deleteById(@PathVariable Integer id,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        areasService.deleteById(id);
        return ApiResponse.success(null);
    }
    @ApiOperation("批量删除")
    @GetMapping("/delete/batch")
    @RequiresPermissions("business:areas:delete")
    public ApiResponse deleteByIdInBatch(@RequestParam String ids,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        String [] idArray = ids.split(",");
        List<Integer> idList = new ArrayList<>();
        for (String id : idArray) {
            idList.add(Integer.valueOf(id));
        }
        areasService.deleteByIdInBatch(idList);
        return ApiResponse.success(null);
    }
    @ApiOperation("根据ID修改")
    @PostMapping("/updateById")
    @RequiresPermissions("business:areas:update")
    public ApiResponse updateById(@RequestBody Areas areas,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        areas.setLoginUserInfo(getLoginUser(token));
        areasService.updateById(areas);
        return ApiResponse.success(null);
    }
    @ApiOperation("分页查询")
    @PostMapping("/page")
//    @RequiresPermissions("business:areas:query")
    public ApiResponse<PageData<Areas>> findPage (@RequestBody PageWrap<Areas> pageWrap,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        return ApiResponse.success(areasService.findPage(pageWrap));
    }
    @ApiOperation("全部树形查询")
    @PostMapping("/treeList")
//    @RequiresPermissions("business:areas:query")
    public ApiResponse<List<Areas>> treeList (@RequestBody AreasDto pageWrap,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        Areas a = new Areas();
        BeanUtils.copyProperties(pageWrap,a);
        return ApiResponse.success(areasService.findList(a));
    }
    @ApiOperation("根据父节点查下")
    @PostMapping("/listByParentId")
//    @RequiresPermissions("business:areas:query")
    public ApiResponse<List<Areas>> listByParentId (@RequestBody AreasDto pageWrap,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        Areas a = new Areas();
        BeanUtils.copyProperties(pageWrap,a);
//        PageWrap<Areas> wrap = new PageWrap<>();
//        wrap.setPage(Constants.ONE);
//        wrap.setCapacity(9999);
//        wrap.setModel(a);
        return ApiResponse.success(areasService.listByParentId(a));
    }
    @ApiOperation("导出Excel")
    @PostMapping("/exportExcel")
    @RequiresPermissions("business:areas:exportExcel")
    public void exportExcel (@RequestBody PageWrap<Areas> pageWrap, HttpServletResponse response,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        ExcelExporter.build(Areas.class).export(areasService.findPage(pageWrap).getRecords(), "省市区信息表", response);
    }
    @ApiOperation("根据ID查询")
    @GetMapping("/{id}")
    @RequiresPermissions("business:areas:query")
    public ApiResponse findById(@PathVariable Integer id,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        return ApiResponse.success(areasService.findById(id));
    }
}
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwContractRevenueCloudController.java
@@ -43,7 +43,7 @@
    @ApiOperation("根据ID删除")
    @GetMapping("/delete/{id}")
    @CloudRequiredPermission("business:ywcontractrevenue:delete")
    public ApiResponse deleteById(@PathVariable Integer id) {
    public ApiResponse deleteById(@PathVariable Integer id,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        ywContractRevenueService.deleteById(id);
        return ApiResponse.success(null);
    }
@@ -51,7 +51,7 @@
    @ApiOperation("批量删除")
    @GetMapping("/delete/batch")
    @CloudRequiredPermission("business:ywcontractrevenue:delete")
    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
    public ApiResponse deleteByIdInBatch(@RequestParam String ids,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        String [] idArray = ids.split(",");
        List<Integer> idList = new ArrayList<>();
        for (String id : idArray) {
@@ -64,29 +64,45 @@
    @ApiOperation("根据ID修改")
    @PostMapping("/updateById")
    @CloudRequiredPermission("business:ywcontractrevenue:update")
    public ApiResponse updateById(@RequestBody YwContractRevenue ywContractRevenue) {
    public ApiResponse updateById(@RequestBody YwContractRevenue ywContractRevenue,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        ywContractRevenueService.updateById(ywContractRevenue);
        return ApiResponse.success(null);
    }
    @ApiOperation("关闭流水")
    @GetMapping("/close")
    @CloudRequiredPermission("business:ywcontractrevenue:update")
    public ApiResponse close(@RequestParam Integer id,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        ywContractRevenueService.closeRevenue(id,getLoginUser(token));
        return ApiResponse.success(null);
    }
    @ApiOperation("分页查询")
    @PostMapping("/page")
    @CloudRequiredPermission("business:ywcontractrevenue:query")
    public ApiResponse<PageData<YwContractRevenue>> findPage (@RequestBody PageWrap<YwContractRevenue> pageWrap) {
    public ApiResponse<PageData<YwContractRevenue>> findPage (@RequestBody PageWrap<YwContractRevenue> pageWrap,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        return ApiResponse.success(ywContractRevenueService.findPage(pageWrap));
    }
    @ApiOperation("收支列表")
    @PostMapping("/list")
    @CloudRequiredPermission("business:ywcontractrevenue:query")
    public ApiResponse<List<YwContractRevenue>> list (@RequestBody YwContractRevenue ywContractRevenue,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        return ApiResponse.success(ywContractRevenueService.findList(ywContractRevenue));
    }
    @ApiOperation("导出Excel")
    @PostMapping("/exportExcel")
    @CloudRequiredPermission("business:ywcontractrevenue:exportExcel")
    public void exportExcel (@RequestBody PageWrap<YwContractRevenue> pageWrap, HttpServletResponse response) {
    public void exportExcel (@RequestBody PageWrap<YwContractRevenue> pageWrap, HttpServletResponse response,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        ExcelExporter.build(YwContractRevenue.class).export(ywContractRevenueService.findPage(pageWrap).getRecords(), "运维合同收支流水", response);
    }
    @ApiOperation("根据ID查询")
    @GetMapping("/{id}")
    @CloudRequiredPermission("business:ywcontractrevenue:query")
    public ApiResponse findById(@PathVariable Integer id) {
        return ApiResponse.success(ywContractRevenueService.findById(id));
    public ApiResponse findById(@PathVariable Integer id,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        return ApiResponse.success(ywContractRevenueService.getDetail(id));
    }
}
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/AreasMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,12 @@
package com.doumee.dao.business;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.doumee.dao.business.model.Areas;
/**
 * @author æ±Ÿè¹„蹄
 * @date 2023/02/15 08:55
 */
public interface AreasMapper extends BaseMapper<Areas> {
}
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/dto/AreasDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
package com.doumee.dao.business.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
/**
 * @author Eva.Caesar Liu
 * @date 2023/02/14 11:14
 */
@Data
@ApiModel("省市区查询参数")
public class AreasDto implements Serializable {
    @ApiModelProperty(value = "名称" )
    private String name;
    @ApiModelProperty(value = "类型 0省 1市 2区县", example = "1")
    private Integer type;
    @ApiModelProperty(value = "父节点编码", example = "1")
    private Integer parentId;
}
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/Areas.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,109 @@
package com.doumee.dao.business.model;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.doumee.core.annotation.excel.ExcelColumn;
import com.doumee.core.model.LoginUserModel;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
import java.util.List;
/**
 * çœå¸‚区信息表
 * @author æ±Ÿè¹„蹄
 * @date 2023/02/15 08:55
 */
@Data
@ApiModel("省市区信息表")
@TableName("`areas`")
public class Areas extends LoginUserModel implements Cloneable{
    @ApiModelProperty(value = "主键", example = "1")
    @ExcelColumn(name="主键")
    @TableId(value = "id",type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty(value = "创建人编码", example = "1")
    @ExcelColumn(name="创建人编码")
    private Integer creator;
    @ApiModelProperty(value = "创建时间")
    @ExcelColumn(name="创建时间")
    private Date createDate;
    @ApiModelProperty(value = "更新人编码", example = "1")
    @ExcelColumn(name="更新人编码")
    private Integer editor;
    @ApiModelProperty(value = "更新时间")
    @ExcelColumn(name="更新时间")
    private Date editDate;
    @ApiModelProperty(value = "是否删除0否 1是", example = "1")
    @ExcelColumn(name="是否删除0否 1是")
    private Integer isdeleted;
    @ApiModelProperty(value = "名称")
    @ExcelColumn(name="名称")
    private String name;
    @ApiModelProperty(value = "备注")
    @ExcelColumn(name="备注")
    private String info;
    @ApiModelProperty(value = "行政区代码")
    @ExcelColumn(name="行政区代码")
    private String code;
    @ApiModelProperty(value = "父级编码(关联areas表)", example = "1")
    @ExcelColumn(name="父级编码(关联areas表)")
    private Integer parentId;
    @ApiModelProperty(value = "类型 0省 1市 2区县", example = "1")
    @ExcelColumn(name="类型 0省 1市 2区县")
    private Integer type;
    @ApiModelProperty(value = "排序码", example = "1")
    @ExcelColumn(name="排序码")
    private Integer sortnum;
    @TableField(exist = false)
    private List<Areas> childList;
    @TableField(exist = false)
    private Integer provinceId;
    @TableField(exist = false)
    private String provinceName;
    @TableField(exist = false)
    private Integer cityId;
    @TableField(exist = false)
    private String cityName;
    //实现Cloneable的clone方法,将clone定义为public
    public Areas clone()   {
        try {
            return (Areas) super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return null;
    }
    @Override
    public String toString() {
        return "Areas{" +
            "id=" + id +
            ", creator=" + creator +
            ", createDate=" + createDate +
            ", editor=" + editor +
            ", editDate=" + editDate +
            ", isdeleted=" + isdeleted +
            ", name='" + name + '\'' +
            ", info='" + info + '\'' +
            ", code='" + code + '\'' +
            ", parentId=" + parentId +
            ", type=" + type +
            '}';
    }
}
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwContract.java
@@ -50,8 +50,8 @@
    @ExcelColumn(name="是否删除0否 1是")
    private Integer isdeleted;
    @ApiModelProperty(value = "备注")
    @ExcelColumn(name="备注")
    @ApiModelProperty(value = "合同摘要")
    @ExcelColumn(name="合同摘要")
    private String remark;
    @ApiModelProperty(value = "状态 0待执行 1执行中 2已到期 3已退租", example = "1")
@@ -119,6 +119,10 @@
    @ApiModelProperty(value = "退租原因")
    @ExcelColumn(name="退租原因")
    private String btInfo;
    @ApiModelProperty(value = "退租摘要")
    @ExcelColumn(name="退租摘要")
    private String btRemark;
    @ApiModelProperty(value = "退租日期")
    @ExcelColumn(name="退租日期")
@@ -222,8 +226,17 @@
    @ApiModelProperty(value = "查询结束时间")
    @TableField(exist = false)
    private Date queryEndTime;
    @ApiModelProperty(value = "退款关闭账单数")
    @TableField(exist = false)
    private int btCLoseBill;
    @ApiModelProperty(value = "退款未结清账单数")
    @TableField(exist = false)
    private int btWaitBill;
    @ApiModelProperty(value = "退租时新增的收付款账单")
    @TableField(exist = false)
    private List<YwContractBill> addBillList;
    @ApiModelProperty(value = "当前支持退款修改金额的账单集合")
    @TableField(exist = false)
    private List<YwContractBill> canBackRentBills;
}
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwContractBill.java
@@ -90,8 +90,8 @@
    @ExcelColumn(name="应收金额",index = 5,width = 6)
    private BigDecimal receivableFee;
    @ApiModelProperty(value = "费用类型:0=租赁费;1=物业费;2=租赁押金;3=物业证金;4=水电费;5=杂项费;6=其他 ", example = "1")
    @ExcelColumn(name="费用类型",index = 8,width = 6,valueMapping = "0=租赁费;1=物业费;2=租赁押金;3=物业证金;4=水电费;5=杂项费;6=其他;")
    @ApiModelProperty(value = "费用类型:0=租赁费;1=物业费;2=租赁押金;3=物业押金;4=水电费;5=杂项费;6=其他; 7=保证金", example = "1")
    @ExcelColumn(name="费用类型",index = 8,width = 6,valueMapping = "0=租赁费;1=物业费;2=租赁押金;3=物业押金;4=水电费;5=杂项费;6=其他;7=保证金;")
    private Integer costType;
    @ApiModelProperty(value = "账单类型:0=收款;1=付款", example = "1")
@@ -107,6 +107,7 @@
    @ApiModelProperty(value = "付款状态:0=待收款;1=已结清;2=部分结清;3=待付款;4=待退款;5=已关闭")
    @ExcelColumn(name="结清状态",index = 3,width = 6,valueMapping = "0=待收款;1=已结清;2=部分结清;3=待付款;4=待退款;5=已关闭;")
    private Integer payStatus;
    @ApiModelProperty(value = "退租类型 0到期退租 1换房退租 2违约退租 3协商退租", example = "1")
    @ExcelColumn(name="退租类型 0到期退租 1换房退租 2违约退租 3协商退租")
    private Integer btType;
@@ -162,11 +163,6 @@
    @TableField(exist = false)
    private String roomPathName;
    @ApiModelProperty(value = "房间数据", example = "1")
    @TableField(exist = false)
    private List<YwRoom> ywRoomList ;
    @ApiModelProperty(value = "计划付款日 - å¼€å§‹")
    @TableField(exist = false)
    @JsonFormat(pattern = "yyyy-MM-dd")
@@ -191,7 +187,7 @@
    @ApiModelProperty(value = "是否逾期:0=否;1=是")
    @TableField(exist = false)
    @ExcelColumn(name="是否逾期",index = 9,width = 6,valueMapping = "0=未逾期;1=已逾期")
    private BigDecimal isOverdue;
    private Integer isOverdue;
    @ApiModelProperty(value = "附件信息", example = "1")
    @TableField(exist = false)
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwContractRevenue.java
@@ -2,7 +2,10 @@
import com.baomidou.mybatisplus.annotation.TableField;
import com.doumee.core.annotation.excel.ExcelColumn;
import com.doumee.core.constants.OperaType;
import com.doumee.core.model.LoginUserModel;
import com.doumee.dao.business.vo.EditRecordDataVO;
import com.doumee.dao.system.model.Multifile;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import com.baomidou.mybatisplus.annotation.IdType;
@@ -10,8 +13,11 @@
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import com.fasterxml.jackson.annotation.JsonFormat;
import javax.validation.constraints.NotBlank;
import java.util.Date;
import java.math.BigDecimal;
import java.util.List;
/**
 * è¿ç»´åˆåŒæ”¶æ”¯æµæ°´
@@ -25,77 +31,114 @@
    @TableId(type = IdType.AUTO)
    @ApiModelProperty(value = "主键", example = "1")
    @ExcelColumn(name="主键")
    private Integer id;
    @ApiModelProperty(value = "创建人编码", example = "1")
    @ExcelColumn(name="创建人编码")
    private Integer creator;
    @ApiModelProperty(value = "创建时间")
    @ExcelColumn(name="创建时间")
    @ExcelColumn(name="创建日期",index = 8,width = 10,dateFormat = "yyyy-MM-dd HH:mm:ss")
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date createDate;
    @ApiModelProperty(value = "更新人编码", example = "1")
    @ExcelColumn(name="更新人编码")
    private Integer editor;
    @ApiModelProperty(value = "更新时间")
    @ExcelColumn(name="更新时间")
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date editDate;
    @ApiModelProperty(value = "是否删除0否 1是", example = "1")
    @ExcelColumn(name="是否删除0否 1是")
    private Integer isdeleted;
    @ApiModelProperty(value = "备注")
    @ExcelColumn(name="备注")
    private String remark;
    @ApiModelProperty(value = "状态 0=开启;1=关闭", example = "1")
    @ExcelColumn(name="状态 0=开启;1=关闭")
    @ExcelColumn(name="状态",index = 10,width = 10,valueMapping = "0=开启;1=关闭")
    private Integer status;
    @ApiModelProperty(value = "实收金额", example = "1")
    @ExcelColumn(name="实收金额")
    @ApiModelProperty(value = "发生金额", example = "1")
    @ExcelColumn(name="发生金额",index = 5,width = 10)
    private BigDecimal actReceivableFee;
    @ApiModelProperty(value = "实际付款日")
    @ExcelColumn(name="实际付款日")
    @ExcelColumn(name="入账日期",index = 7,width = 10,dateFormat = "yyyy-MM-dd")
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date actPayDate;
    @ApiModelProperty(value = "付款类型:0=现金;1=网银转账;2=POS机;3=支付宝;4=微信;5=转账支票;6=其他", example = "1")
    @ExcelColumn(name="付款类型:0=现金;1=网银转账;2=POS机;3=支付宝;4=微信;5=转账支票;6=其他")
    @ExcelColumn(name="收款方式",index = 6,width = 10,valueMapping = "0=现金;1=网银转账;2=POS机;3=支付宝;4=微信;5=转账支票;6=其他;")
    private Integer payType;
    @ApiModelProperty(value = "所属公司(关联 company)", example = "1")
    @ExcelColumn(name="所属公司(关联 company)")
    private Integer companyId;
    @ApiModelProperty(value = "收支账户(关联yw_account)", example = "1")
    @ExcelColumn(name="收支账户(关联yw_account)")
    private Integer accountId;
    @ApiModelProperty(value = "合同主键(关联yw_contract)", example = "1")
    @ExcelColumn(name="合同主键(关联yw_contract)")
    private Integer contractId;
    @ApiModelProperty(value = "账单主键(关联yw_contract_bill)", example = "1")
    @ExcelColumn(name="账单主键(关联yw_contract_bill)")
    private Integer billId;
    @ApiModelProperty(value = "收支类型:0=收入;1=支出", example = "1")
    @ExcelColumn(name="收支类型:0=收入;1=支出")
    @ExcelColumn(name="收支类型",index = 4,width = 10,valueMapping = "0=收入;1=支出")
    private Integer revenueType;
    @ApiModelProperty(value = "合同编号", example = "1")
    @ExcelColumn(name="合同编号",index = 1,width = 10)
    @TableField(exist = false)
    private String contractCode;
    @ApiModelProperty(value = "客户名称")
    @TableField(exist = false)
    private String customerNme;
    @ApiModelProperty(value = "客户名称(付款方)", example = "1")
    @ExcelColumn(name="客户名称",index = 0,width = 10)
    @TableField(exist = false)
    private String customerName;
    @ApiModelProperty(value = "创建人名称")
    @ExcelColumn(name="创建人",index = 9,width = 10)
    private String realname;
    @ApiModelProperty(value = "关联房间数据", example = "1")
    @TableField(exist = false)
    private List<YwContractRoom> ywContractRoomList;
    @ApiModelProperty(value = "附件信息", example = "1")
    @TableField(exist = false)
    private List<Multifile> multifileList;
    @ApiModelProperty(value = "入账日期 - å¼€å§‹")
    @TableField(exist = false)
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date payDateStart;
    @ApiModelProperty(value = "入账日期 - ç»“束")
    @TableField(exist = false)
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date payDateEnd;
    @ApiModelProperty(value = "楼宇房间", example = "1")
    @ExcelColumn(name="房号",index = 2,width = 10)
    @TableField(exist = false)
    private String roomPathName;
    @ApiModelProperty(value = "账单编号", example = "1")
    @ExcelColumn(name="账单编号",index = 3,width = 16)
    @TableField(exist = false)
    private String billCode;
    @ApiModelProperty(value = "操作记录", example = "1")
    @TableField(exist = false)
    private List<EditRecordDataVO> editRecordDataVOList;
}
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/EditRecordDataVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,28 @@
package com.doumee.dao.business.vo;
import com.doumee.dao.business.model.Approve;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
import java.util.List;
/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Rk
 * @create 2024/5/23 14:56
 */
@Data
public class EditRecordDataVO {
    @ApiModelProperty(value = "操作时间")
    private Date editTime;
    @ApiModelProperty(value = "操作人")
    private String editUserName;
    @ApiModelProperty(value = "操作备注")
    private String editRemark;
}
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/AreasService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,124 @@
package com.doumee.service.business;
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.dao.business.model.Areas;
import java.util.List;
/**
 * çœå¸‚区信息表Service定义
 * @author æ±Ÿè¹„蹄
 * @date 2023/02/15 08:55
 */
public interface AreasService {
    /**
     * åˆ›å»º
     *
     * @param areas å®žä½“对象
     * @return Integer
     */
    Integer create(Areas areas);
    /**
     * ä¸»é”®åˆ é™¤
     *
     * @param id ä¸»é”®
     */
    void deleteById(Integer id);
    /**
     * åˆ é™¤
     *
     * @param areas å®žä½“对象
     */
    void delete(Areas areas);
    /**
     * æ‰¹é‡ä¸»é”®åˆ é™¤
     *
     * @param ids ä¸»é”®é›†
     */
    void deleteByIdInBatch(List<Integer> ids);
    /**
     * ä¸»é”®æ›´æ–°
     *
     * @param areas å®žä½“对象
     */
    void updateById(Areas areas);
    /**
     * æ‰¹é‡ä¸»é”®æ›´æ–°
     *
     * @param areass å®žä½“集
     */
    void updateByIdInBatch(List<Areas> areass);
    /**
     * ä¸»é”®æŸ¥è¯¢
     *
     * @param id ä¸»é”®
     * @return Areas
     */
    Areas findById(Integer id);
    /**
     * æ ¹æ®id和type查询对象信息
     * @param id
     * @param type null æŸ¥è¯¢å…¨éƒ¨ 0省份 1城市 2区域
     * @return
     */
    Areas findById(Integer id,Integer type);
    Areas findByName(String name,Integer type);
    Areas findByNameAndParentId(String name,Integer type,Integer parentId);
    List<Areas> findByParentId(Integer type,Integer parentId);
    List<Areas> findChildByParentId(Integer id,List<Areas>  list);
    boolean isAreaValid(String proName,String cityName,String areaName);
    /**
     * æ¡ä»¶æŸ¥è¯¢å•条记录
     *
     * @param areas å®žä½“对象
     * @return Areas
     */
    Areas findOne(Areas areas);
    /**
     * æ¡ä»¶æŸ¥è¯¢
     *
     * @param areas å®žä½“对象
     * @return List<Areas>
     */
    List<Areas> findList(Areas areas);
    /**
     * åˆ†é¡µæŸ¥è¯¢
     *
     * @param pageWrap åˆ†é¡µå¯¹è±¡
     * @return PageData<Areas>
     */
    PageData<Areas> findPage(PageWrap<Areas> pageWrap);
    /**
     * æ¡ä»¶ç»Ÿè®¡
     *
     * @param areas å®žä½“对象
     * @return long
     */
    long count(Areas areas);
    void cacheData();
    Areas findByCityAndArea(String cityName, String areasName);
    String getAddress(Integer cityId,Integer areaId);
    List<Areas> listByParentId(Areas model);
}
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwContractRevenueService.java
@@ -1,5 +1,6 @@
package com.doumee.service.business;
import com.doumee.core.model.LoginUserInfo;
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.dao.business.model.YwContractRevenue;
@@ -63,6 +64,10 @@
     */
    YwContractRevenue findById(Integer id);
    YwContractRevenue getDetail(Integer id);
    void closeRevenue(Integer id, LoginUserInfo loginUserInfo);
    /**
     * æ¡ä»¶æŸ¥è¯¢å•条记录
     *
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/AreasServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,458 @@
package com.doumee.service.business.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.doumee.core.constants.ResponseStatus;
import com.doumee.core.exception.BusinessException;
import com.doumee.core.model.LoginUserInfo;
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.core.utils.Constants;
import com.doumee.core.utils.Utils;
import com.doumee.dao.business.AreasMapper;
import com.doumee.dao.business.model.Areas;
import com.doumee.service.business.AreasService;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.SecurityUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
/**
 * çœå¸‚区信息表Service实现
 * @author æ±Ÿè¹„蹄
 * @date 2023/02/15 08:55
 */
@Service
public class AreasServiceImpl implements AreasService {
    public static   List<Areas> ALL_AREA_LIST;
    public static   List<Areas> PROVINCE_LIST;
    public static   List<Areas> CITY_LIST;
    public static   List<Areas> AREA_LIST;
    public static   List<Areas> ALL_AREA_TREE;
    @Autowired
    private AreasMapper areasMapper;
    @Override
    public Integer create(Areas areas) {
        LoginUserInfo user = areas.getLoginUserInfo();
/*
        if (Objects.isNull(areas.getParentId())){
            areas.setType(Constants.ZERO);
        }else {
            Areas parentArea = areasMapper.selectById(areas.getParentId());
            if (Objects.isNull(parentArea)){
                areas.setType(Constants.ZERO);
            }else {
                areas.setType(parentArea.getType()+Constants.ONE);
            }
        }*/
        areas.setCreateDate(new Date());
        areas.setEditDate(new Date());
        areas.setCreator(user.getId());
        areas.setEditor(user.getId());
        areas.setIsdeleted(Constants.ZERO);
        areasMapper.insert(areas);
        //刷新缓存数据
        cacheData();
        return areas.getId();
    }
    @Override
    public void deleteById(Integer id) {
        areasMapper.deleteById(id);
        //刷新缓存数据
        cacheData();
    }
    @Override
    public void delete(Areas areas) {
        UpdateWrapper<Areas> deleteWrapper = new UpdateWrapper<>(areas);
        areasMapper.delete(deleteWrapper);
        //刷新缓存数据
        cacheData();
    }
    @Override
    public void deleteByIdInBatch(List<Integer> ids) {
        if (CollectionUtils.isEmpty(ids)) {
            return;
        }
        areasMapper.deleteBatchIds(ids);
        //刷新缓存数据
        cacheData();
    }
    @Override
    public void updateById(Areas areas) {
        UpdateWrapper<Areas> wrapper = new UpdateWrapper<>();
        wrapper.lambda().eq(Areas::getId,areas.getId());
        Areas update = new Areas();
        update.setName(areas.getName());
        update.setSortnum(areas.getSortnum());
        areasMapper.update(update,wrapper);
        //刷新缓存数据
        cacheData();
    }
    @Override
    public void updateByIdInBatch(List<Areas> areass) {
        if (CollectionUtils.isEmpty(areass)) {
            return;
        }
        for (Areas areas: areass) {
            this.updateById(areas);
        }
        //刷新缓存数据
        cacheData();
    }
    @Override
    public Areas findById(Integer id) {
        if(ALL_AREA_LIST!=null){
            for(Areas a : ALL_AREA_LIST){
                if(Constants.equalsInteger(a.getId(),id)){
                    return a;
                }
            }
        }
   //     return areasMapper.selectById(id);
        return  null;
    }
    @Override
    public Areas findById(Integer id,Integer type) {
        List<Areas> list = null;
        if(type == null){
            list = ALL_AREA_LIST;
        }else if(Constants.equalsInteger(type,Constants.ZERO)){
            list = PROVINCE_LIST;
        }else  if(Constants.equalsInteger(type,Constants.ONE)){
            list = CITY_LIST;
        } else if (Constants.equalsInteger(type,Constants.TWO)){
            list =  AREA_LIST;
        }
        if(list!=null){
            for(Areas a : list){
                if(Constants.equalsInteger(a.getId(),id)){
                    return a;
                }
            }
        }
        return null;
    }
    @Override
    public Areas findByName(String name,Integer type){
        List<Areas> list = null;
        if(type == null){
            list = ALL_AREA_LIST;
        }else if(Constants.equalsInteger(type,Constants.ZERO)){
            list = PROVINCE_LIST;
        }else  if(Constants.equalsInteger(type,Constants.ONE)){
            list = CITY_LIST;
        } else if (Constants.equalsInteger(type,Constants.TWO)){
            list =  AREA_LIST;
        }
        if(list!=null){
            for(Areas a : list){
                if(StringUtils.equals(name,a.getName())){
                    return a;
                }
            }
        }
        return null;
    }
    @Override
    public Areas findByNameAndParentId(String name,Integer type,Integer parentId){
        List<Areas> list = null;
        if(type == null){
            list = ALL_AREA_LIST;
        }else if(Constants.equalsInteger(type,Constants.ZERO)){
            list = PROVINCE_LIST;
        }else  if(Constants.equalsInteger(type,Constants.ONE)){
            list = CITY_LIST;
        } else if (Constants.equalsInteger(type,Constants.TWO)){
            list =  AREA_LIST;
        }
        if(list!=null){
            for(Areas a : list){
                if(StringUtils.equals(name,a.getName()) && Constants.equalsInteger(parentId,a.getParentId())){
                    return a;
                }
            }
        }
        return null;
    }
    @Override
    public List<Areas> findByParentId(Integer type, Integer parentId) {
        List<Areas> list = null;
        if(type == null){
            list = ALL_AREA_LIST;
        }else if(Constants.equalsInteger(type,Constants.ZERO)){
            list = PROVINCE_LIST;
        }else  if(Constants.equalsInteger(type,Constants.ONE)){
            list = CITY_LIST;
        } else if (Constants.equalsInteger(type,Constants.TWO)){
            list =  AREA_LIST;
        }
        if(list!=null){
            return list.stream().filter(s->Constants.equalsInteger(s.getParentId(),parentId)).collect(Collectors.toList());
        }
        return null;
    }
    @Override
    public List<Areas> findChildByParentId(Integer id,List<Areas> list){
        List<Areas> result =null;
        if(list == null){
            list = ALL_AREA_LIST;
        }
        if(list!=null && list.size()>0){
            for(Areas model :list){
                if(Constants.equalsInteger(id,model.getParentId())){
                    if(result == null){
                        result = new ArrayList<>();
                    }
                    result.add(model );
                }
            }
        }
        return result;
    }
    @Override
    public boolean isAreaValid(String proName,String cityName,String areaName){
        Areas pro = findByName(proName,Constants.ZERO);
        if(pro == null){
            return  false;
        }
        Areas city = findByName(proName,Constants.ONE);
        if(city == null && !Constants.equalsInteger(city.getParentId(),pro.getId())){
            return  false;
        }
        Areas area = findByName(proName,Constants.TWO);
        if(area == null && !Constants.equalsInteger(area.getParentId(),city.getId())){
            return  false;
        }
        return false;
    }
    @Override
    public Areas findOne(Areas areas) {
        QueryWrapper<Areas> wrapper = new QueryWrapper<>(areas);
        return areasMapper.selectOne(wrapper);
    }
    @Override
    public List<Areas> findList(Areas areas) {
        List<Areas> list = null;
        Integer type =areas.getType();
        if(type == null){
            list = ALL_AREA_LIST;
        }else if(Constants.equalsInteger(type,Constants.ZERO)){
            list = PROVINCE_LIST;
        }else  if(Constants.equalsInteger(type,Constants.ONE)){
            list = CITY_LIST;
        } else if (Constants.equalsInteger(type,Constants.TWO)){
            list =  AREA_LIST;
        }
        List<Areas> result = null;
        if(StringUtils.isNotBlank(areas.getName())){
            for(Areas a : list){
                if(StringUtils.contains(a.getName(),areas.getName())){
                    if(result == null){
                        result = new ArrayList<>();
                    }
                    result.add(a);
                }
            }
            return  result;
        }
        return list;
    }
    @Override
    public  List<Areas> listByParentId(Areas areas) {
        List<Areas> list = null;
        Integer type =areas.getType();
        if(type == null){
            list = ALL_AREA_LIST;
        }else if(Constants.equalsInteger(type,Constants.ZERO)){
            list = PROVINCE_LIST;
        }else  if(Constants.equalsInteger(type,Constants.ONE)){
            list = CITY_LIST;
        } else if (Constants.equalsInteger(type,Constants.TWO)){
            list =  AREA_LIST;
        }
        List<Areas> result = null;
        if(list!=null){
            for(Areas a : list){
                if(result == null){
                    result = new ArrayList<>();
                }
                if( areas.getParentId() == null
                        ||(areas.getParentId() !=null) && Constants.equalsInteger(a.getParentId(),areas.getParentId())){
                    Areas t = new Areas();
                    BeanUtils.copyProperties(a,t);
                    t.setChildList(null);
                    result.add(t);
                }
            }
        }
        return result;
    }
    @Override
    public  void cacheData() {
       Areas a = new Areas();
       a.setIsdeleted(Constants.ZERO);
       ALL_AREA_LIST = null;
       PROVINCE_LIST =null;
       CITY_LIST=null;
       AREA_LIST = null;
       ALL_AREA_TREE = null;
       ALL_AREA_LIST =  areasMapper.selectList(new QueryWrapper<>(a).lambda().orderByDesc(Areas::getSortnum));
       if(ALL_AREA_LIST!=null){
           for(Areas model : ALL_AREA_LIST){
                if(Constants.equalsInteger(model.getType(),Constants.ZERO)){
                    if(PROVINCE_LIST == null){
                        PROVINCE_LIST = new ArrayList<>();
                    }
                    PROVINCE_LIST.add(model);
                }else if(Constants.equalsInteger(model.getType(),Constants.ONE)){
                    if(CITY_LIST == null){
                        CITY_LIST = new ArrayList<>();
                    }
                    CITY_LIST.add(model);
                    if(model.getParentId() != null){
                        Areas p = findById(model.getParentId());
                        if(p!=null  ){
                            model.setProvinceId(p.getId());
                            model.setProvinceName(p.getName());
                        }
                    }
                }else if(Constants.equalsInteger(model.getType(),Constants.TWO)){
                    if(AREA_LIST == null){
                        AREA_LIST = new ArrayList<>();
                    }
                    AREA_LIST.add(model);
                    Areas city = findById(model.getParentId());
                    if(city!=null  ){
                        model.setCityId(city.getId());
                        model.setCityName(city.getName());
                        if(city!=null && city.getParentId()!=null){
                            Areas p = findById(city.getParentId());
                            if(p!=null  ){
                                model.setProvinceId(p.getId());
                                model.setProvinceName(p.getName());
                            }
                        }
                    }
                }
           }
       }
       if(CITY_LIST!=null){
           for(Areas aa : CITY_LIST){
               aa.setChildList(findChildByParentId(aa.getId(), AREA_LIST));
           }
       }
       if(PROVINCE_LIST!=null){
           for(Areas aa : PROVINCE_LIST){
               aa.setChildList(findChildByParentId(aa.getId(),CITY_LIST));
           }
       }
       System.out.println("=================");
    }
    @Override
    public PageData<Areas> findPage(PageWrap<Areas> pageWrap) {
        IPage<Areas> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
        QueryWrapper<Areas> queryWrapper = new QueryWrapper<>();
        Utils.MP.blankToNull(pageWrap.getModel());
        if (pageWrap.getModel().getId() != null) {
            queryWrapper.lambda().eq(Areas::getId, pageWrap.getModel().getId());
        }
        if (pageWrap.getModel().getCreator() != null) {
            queryWrapper.lambda().eq(Areas::getCreator, pageWrap.getModel().getCreator());
        }
        if (pageWrap.getModel().getCreateDate() != null) {
            queryWrapper.lambda().ge(Areas::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()));
            queryWrapper.lambda().le(Areas::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate()));
        }
        if (pageWrap.getModel().getEditor() != null) {
            queryWrapper.lambda().eq(Areas::getEditor, pageWrap.getModel().getEditor());
        }
        if (pageWrap.getModel().getEditDate() != null) {
            queryWrapper.lambda().ge(Areas::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate()));
            queryWrapper.lambda().le(Areas::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate()));
        }
        if (pageWrap.getModel().getIsdeleted() != null) {
            queryWrapper.lambda().eq(Areas::getIsdeleted, pageWrap.getModel().getIsdeleted());
        }
        if (pageWrap.getModel().getName() != null) {
            queryWrapper.lambda().eq(Areas::getName, pageWrap.getModel().getName());
        }
        if (pageWrap.getModel().getInfo() != null) {
            queryWrapper.lambda().eq(Areas::getInfo, pageWrap.getModel().getInfo());
        }
        if (pageWrap.getModel().getCode() != null) {
            queryWrapper.lambda().eq(Areas::getCode, pageWrap.getModel().getCode());
        }
        if (pageWrap.getModel().getParentId() != null) {
            queryWrapper.lambda().eq(Areas::getParentId, pageWrap.getModel().getParentId());
        }
        if (pageWrap.getModel().getType() != null) {
            queryWrapper.lambda().eq(Areas::getType, pageWrap.getModel().getType());
        }
        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
                queryWrapper.orderByDesc(sortData.getProperty());
            } else {
                queryWrapper.orderByAsc(sortData.getProperty());
            }
        }
        return PageData.from(areasMapper.selectPage(page, queryWrapper));
    }
    @Override
    public long count(Areas areas) {
        QueryWrapper<Areas> wrapper = new QueryWrapper<>(areas);
        return areasMapper.selectCount(wrapper);
    }
    @Override
    public Areas findByCityAndArea(String cityName, String areasName) {
        Areas city = findByName(cityName,Constants.ONE);
        if(city !=null){
           return  findByNameAndParentId(areasName,Constants.TWO,city.getId());
        }
        return null;
    }
    @Override
    public String getAddress(Integer cityId,Integer areaId){
        Areas cityAreas = findById(cityId, Constants.ONE);
        Areas areas = findById(areaId, Constants.TWO);
        String cityName = Optional.ofNullable(cityAreas)
                .map(s -> s.getProvinceName() + s.getName())
                .orElseThrow(() -> new BusinessException(ResponseStatus.BAD_REQUEST));
        String areaName = Optional.ofNullable(areas).map(s -> s.getName()).orElse("");
        return cityName+areaName;
    }
}
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwContractBillServiceImpl.java
@@ -8,10 +8,7 @@
import com.doumee.core.model.PageWrap;
import com.doumee.core.utils.Constants;
import com.doumee.core.utils.Utils;
import com.doumee.dao.business.YwContractBillMapper;
import com.doumee.dao.business.YwContractRevenueMapper;
import com.doumee.dao.business.YwContractRoomMapper;
import com.doumee.dao.business.YwRoomMapper;
import com.doumee.dao.business.*;
import com.doumee.dao.business.model.*;
import com.doumee.dao.system.MultifileMapper;
import com.doumee.dao.system.model.Multifile;
@@ -53,6 +50,9 @@
    @Autowired
    private SystemDictDataBiz systemDictDataBiz;
    @Autowired
    private YwContractMapper ywContractMapper;
    @Override
@@ -71,6 +71,14 @@
        ){
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        YwContract ywContract = ywContractMapper.selectById(ywContractBill.getContractId());
        if(Objects.isNull(ywContract)){
            throw new BusinessException(ResponseStatus.DATA_EMPTY);
        }
        if(Constants.equalsInteger(ywContract.getStatus(),Constants.THREE)){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"合同状态已流转,无法进行该操作");
        }
        LoginUserInfo loginUserInfo = ywContractBill.getLoginUserInfo();
        ywContractBill.setReceivableFee(ywContractBill.getTotleFee());
        ywContractBill.setCreateDate(new Date());
@@ -170,6 +178,7 @@
        if(Objects.isNull(ywContractBill)){
            throw new BusinessException(ResponseStatus.DATA_EMPTY);
        }
        //房源数据
        ywContractBill.setYwContractRoomList(ywContractRoomMapper.selectJoinList(YwContractRoom.class,new MPJLambdaWrapper<YwContractRoom>()
                .selectAll(YwContractRoom.class)
@@ -183,16 +192,7 @@
                .eq(YwContractRoom::getContractId,id)
                .eq(YwContractRoom::getType,Constants.ONE)
        ));
        //收支明细
        ywContractBill.setYwContractRevenueList(
            ywContractRevenueMapper.selectJoinList(YwContractRevenue.class,new MPJLambdaWrapper<YwContractRevenue>()
                            .selectAll(YwContractRevenue.class)
                            .selectAs(YwCustomer::getName,YwContractRevenue::getCustomerNme)
                            .leftJoin(YwContract.class,YwContract::getId,YwContractRevenue::getContractId)
                            .leftJoin(YwCustomer.class,YwCustomer::getId,YwContract::getRenterId)
                    .eq(YwContractRevenue::getBillId,id)
            )
        );
        //附件数据
        List<Multifile> multifileList = multifileMapper.selectList(new QueryWrapper<Multifile>().lambda()
                .eq(Multifile::getObjId,id)
@@ -246,8 +246,8 @@
                            YwContractBill::getType,model.getType())
                    .eq(Objects.nonNull(model)&&Objects.nonNull(model.getContractId()),
                            YwContractBill::getContractId,model.getContractId())
                .ge(YwContractBill::getPlanPayDate, Utils.Date.getStart(model.getPlanPayDateStart()))
                .le(YwContractBill::getPlanPayDate, Utils.Date.getEnd(model.getPlanPayDateEnd())) )
                .ge(Objects.nonNull(model)&&Objects.nonNull(model.getPlanPayDateStart()),YwContractBill::getPlanPayDate, Utils.Date.getStart(model.getPlanPayDateStart()))
                .le(Objects.nonNull(model)&&Objects.nonNull(model.getPlanPayDateEnd()),YwContractBill::getPlanPayDate, Utils.Date.getEnd(model.getPlanPayDateEnd())) )
        ;
        this.dealRoomDetail(iPage.getRecords());
        for (YwContractBill ywContractBill:iPage.getRecords()) {
@@ -255,6 +255,16 @@
            ywContractBill.setNeedReceivableFee(
                    ywContractBill.getReceivableFee().subtract(ywContractBill.getActReceivableFee())
            );
            //是否逾期
            if(Constants.equalsInteger(ywContractBill.getStatus(),Constants.ZERO) && (Constants.equalsInteger(ywContractBill.getPayStatus(),Constants.ZERO)
            || Constants.equalsInteger(ywContractBill.getPayStatus(),Constants.TWO)
            || Constants.equalsInteger(ywContractBill.getPayStatus(),Constants.THREE)
            || Constants.equalsInteger(ywContractBill.getPayStatus(),Constants.FOUR))
            && ywContractBill.getEndDate().getTime() < System.currentTimeMillis()){
                ywContractBill.setIsOverdue(Constants.ONE);
            }else{
                ywContractBill.setIsOverdue(Constants.ZERO);
            }
            //楼宇名称
            List<YwContractRoom> ywContractRoomList = ywContractBill.getYwContractRoomList();
            StringBuilder roomPathName = new StringBuilder();
@@ -276,7 +286,6 @@
                }
            }
            ywContractBill.setRoomPathName(roomPathName.toString());
        }
        return PageData.from(iPage);
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwContractRevenueServiceImpl.java
@@ -7,26 +7,32 @@
import com.doumee.core.model.PageWrap;
import com.doumee.core.utils.Constants;
import com.doumee.core.utils.Utils;
import com.doumee.dao.business.YwAccountMapper;
import com.doumee.dao.business.YwContractBillMapper;
import com.doumee.dao.business.YwContractRevenueMapper;
import com.doumee.dao.business.*;
import com.doumee.dao.business.dao.CompanyMapper;
import com.doumee.dao.business.model.Company;
import com.doumee.dao.business.model.YwAccount;
import com.doumee.dao.business.model.YwContractBill;
import com.doumee.dao.business.model.YwContractRevenue;
import com.doumee.dao.business.model.*;
import com.doumee.dao.business.vo.EditRecordDataVO;
import com.doumee.dao.system.MultifileMapper;
import com.doumee.dao.system.SystemUserMapper;
import com.doumee.dao.system.model.Multifile;
import com.doumee.dao.system.model.SystemUser;
import com.doumee.service.business.YwContractRevenueService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
/**
 * è¿ç»´åˆåŒæ”¶æ”¯æµæ°´Service实现
@@ -43,12 +49,26 @@
    private YwContractBillMapper ywContractBillMapper;
    @Autowired
    private YwContractMapper ywContractMapper;
    @Autowired
    private CompanyMapper companyMapper;
    @Autowired
    private YwAccountMapper ywAccountMapper;
    @Autowired
    private MultifileMapper multifileMapper;
    @Autowired
    private YwContractRoomMapper ywContractRoomMapper;
    @Autowired
    private SystemUserMapper systemUserMapper;
    @Override
    @Transactional(rollbackFor = {Exception.class,BusinessException.class})
    public Integer create(YwContractRevenue ywContractRevenue) {
        if(Objects.isNull(ywContractRevenue)
        || Objects.isNull(ywContractRevenue.getActReceivableFee())
@@ -57,12 +77,23 @@
                || Objects.isNull(ywContractRevenue.getCompanyId())
                || Objects.isNull(ywContractRevenue.getAccountId())
                || Objects.isNull(ywContractRevenue.getBillId())
                || ywContractRevenue.getActReceivableFee().compareTo(BigDecimal.ZERO) <= Constants.ZERO
        ){
             throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        YwContractBill ywContractBill = ywContractBillMapper.selectById(ywContractRevenue.getBillId());
        if(Objects.isNull(ywContractBill)){
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"未查询到账单信息");
        }
        if(!Constants.equalsInteger(ywContractBill.getStatus(),Constants.ZERO)){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"账单状态已流转,无法进行该操作");
        }
        if(!(Constants.equalsInteger(ywContractBill.getPayStatus(),Constants.ZERO)
        || Constants.equalsInteger(ywContractBill.getPayStatus(),Constants.TWO)
                || Constants.equalsInteger(ywContractBill.getPayStatus(),Constants.THREE)
                || Constants.equalsInteger(ywContractBill.getPayStatus(),Constants.FOUR)
        )){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"账单结清状态已流转,无法进行该操作");
        }
        Company company =companyMapper.selectById(ywContractRevenue.getCompanyId());
        if(Objects.isNull(company)){
@@ -78,15 +109,75 @@
        ywContractRevenue.setIsdeleted(Constants.ZERO);
        ywContractRevenue.setStatus(Constants.ZERO);
        ywContractRevenue.setContractId(ywContractBill.getContractId());
        ywContractRevenue.setRevenueType(ywContractBill.getBillType());
        ywContractRevenueMapper.insert(ywContractRevenue);
        //根据收支情况 æ›´æ–°è´¦å•数据
        //查询当前账单下 å·²æ”¯ä»˜çš„费用
        List<YwContractRevenue> ywContractRevenueList = ywContractRevenueMapper.selectList(new QueryWrapper<YwContractRevenue>().lambda().eq(YwContractRevenue::getIsdeleted,Constants.ZERO)
                .eq(YwContractRevenue::getStatus,Constants.ZERO)
        );
        //已支付金额
        BigDecimal payTotal = BigDecimal.ZERO;
        //待支付金额
        BigDecimal waitPayTotal = BigDecimal.ZERO;
        //无付款记录 åˆ™ä¸ºåˆæ¬¡æ”¯ä»˜ æ ¹æ®è´¦å•类型 åˆ¤æ–­æ˜¯æ”¯å‡º / æ”¶å…¥
        if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isEmpty(ywContractRevenueList)){
            ywContractRevenue.setRevenueType(ywContractBill.getType());
            if(ywContractRevenue.getActReceivableFee().compareTo(ywContractBill.getReceivableFee())>Constants.ZERO){
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"请输入正确的金额!");
            }else  if(ywContractRevenue.getActReceivableFee().compareTo(ywContractBill.getReceivableFee())==Constants.ZERO){
                ywContractBill.setPayStatus(Constants.ONE);
            }else{
                ywContractBill.setPayStatus(Constants.TWO);
            }
        }else{
            //获取已支付的总金额 ï¼ˆå¯èƒ½æœ‰æ”¶å…¥ æœ‰æ”¯å‡ºï¼‰
            payTotal = ywContractRevenueList.stream().map(i->i.getActReceivableFee().multiply(
                    BigDecimal.valueOf(Constants.equalsInteger(ywContractRevenue.getRevenueType(),Constants.ZERO)?Constants.ONE:-Constants.ONE))
            ).reduce(BigDecimal.ZERO,BigDecimal::add);
            //获取待支付款金额 å¦‚果账单类型为支出 æˆ– ï¼ˆè´¦å•类型为收入 ä¸” å¾…支付金额 å°äºŽ 0) åˆ™ä¸ºæ”¯ä»˜
            waitPayTotal = ywContractBill.getReceivableFee().subtract(payTotal);
            //如果待支付金额 å¤§äºŽ 0  åˆ™æ˜¯ æ”¶å…¥ å¦åˆ™æ˜¯æ”¯å‡º å…¶ä»–状态 ä¸ºå¼‚常!
            if(waitPayTotal.compareTo(BigDecimal.ZERO)>Constants.ZERO){
                ywContractRevenue.setRevenueType(Constants.ZERO);
            }else if(waitPayTotal.compareTo(BigDecimal.ZERO)<Constants.ZERO){
                ywContractRevenue.setRevenueType(Constants.ONE);
            }else{
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"收支金额异常!请联系管理员");
            }
            //待支付的流水 å¦‚果为收入 åˆ™æ¯”对 é‡‘额值  å¦‚果是支出 åˆ™èŽ·å–ç»å¯¹å€¼ è¿›è¡Œå¯¹æ¯”
            if(Constants.equalsInteger(ywContractRevenue.getRevenueType(),Constants.ZERO)){
                //如果支付金额 å¤§äºŽ å¾…支付金额 åˆ™æç¤ºå¼‚常 å¦‚果支付金额小于 å¾…支付金额 åˆ™çŠ¶æ€ä¸å˜åŒ– å…¶ä»–状态 å¼‚常
                if(waitPayTotal.compareTo(ywContractRevenue.getActReceivableFee())>Constants.ZERO){
                    throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"请输入正确的金额!");
                }else if(waitPayTotal.compareTo(ywContractRevenue.getActReceivableFee())==Constants.ZERO){
                    ywContractBill.setPayStatus(Constants.ONE);
                }
            }else{
                waitPayTotal = waitPayTotal.abs();
                if(waitPayTotal.compareTo(ywContractRevenue.getActReceivableFee())>Constants.ZERO){
                    throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"请输入正确的金额!");
                }else if(waitPayTotal.compareTo(ywContractRevenue.getActReceivableFee())==Constants.ZERO){
                    ywContractBill.setPayStatus(Constants.ONE);
                }
            }
        }
        ywContractRevenueMapper.insert(ywContractRevenue);
        ywContractBillMapper.updateById(ywContractBill);
        //存储附件信息
        if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(ywContractRevenue.getMultifileList())){
            for (Multifile multifile:ywContractRevenue.getMultifileList()) {
                if(Objects.isNull(multifile)
                        || StringUtils.isBlank(multifile.getFileurl())
                        || StringUtils.isBlank(multifile.getName())){
                    throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"附件信息错误");
                }
                multifile.setCreator(loginUserInfo.getId());
                multifile.setCreateDate(new Date());
                multifile.setIsdeleted(Constants.ZERO);
                multifile.setObjType(Constants.MultiFile.FN_CONTRACT_REVENUE_FILE.getKey());
                multifile.setObjId(ywContractRevenue.getId());
            }
            multifileMapper.insert(ywContractRevenue.getMultifileList());
        }
        return ywContractRevenue.getId();
    }
@@ -130,6 +221,120 @@
    }
    @Override
    public YwContractRevenue getDetail(Integer id) {
        YwContractRevenue ywContractRevenue = ywContractRevenueMapper.selectJoinOne(
                YwContractRevenue.class,
                new MPJLambdaWrapper<YwContractRevenue>().selectAll(YwContractRevenue.class)
                        .selectAs(YwContractBill::getCode,YwContractRevenue::getBillCode)
                        .selectAs(YwContract::getCode,YwContractRevenue::getContractCode)
                        .selectAs(YwCustomer::getName,YwContractRevenue::getCustomerName)
                        .selectAs(SystemUser::getRealname,YwContractRevenue::getRealname)
                        .leftJoin(YwContractBill.class,YwContractBill::getId,YwContractRevenue::getBillId)
                        .leftJoin(YwContract.class,YwContract::getId,YwContractBill::getContractId)
                        .leftJoin(YwCustomer.class,YwCustomer::getId,YwContract::getRenterId)
                        .leftJoin(SystemUser.class,SystemUser::getId,YwContractRevenue::getCreator)
                        .eq(YwContractRevenue::getId,id)
        );
       this.getRecordData(ywContractRevenue);
        return ywContractRevenue;
    }
    /**
     * æ“ä½œè®°å½•
     * @param ywContractRevenue
     */
    public void getRecordData(YwContractRevenue ywContractRevenue){
        List<EditRecordDataVO> editRecordDataVOList = new ArrayList();
        //模拟流水记录
        if(Objects.nonNull(ywContractRevenue.getCreateDate())){
            EditRecordDataVO editRecordDataVO = new EditRecordDataVO();
            editRecordDataVO.setEditRemark("创建流水");
            editRecordDataVO.setEditTime(ywContractRevenue.getCreateDate());
            SystemUser createUser = systemUserMapper.selectById(ywContractRevenue.getCreator());
            if(Objects.nonNull(createUser)){
                editRecordDataVO.setEditUserName(createUser.getRealname());
            }
            editRecordDataVOList.add(editRecordDataVO);
        }
        if(Objects.nonNull(ywContractRevenue.getEditor())){
            EditRecordDataVO editRecordDataVO = new EditRecordDataVO();
            editRecordDataVO.setEditRemark("关闭流水");
            editRecordDataVO.setEditTime(ywContractRevenue.getEditDate());
            SystemUser closeUser = systemUserMapper.selectById(ywContractRevenue.getEditor());
            if(Objects.nonNull(closeUser)){
                editRecordDataVO.setEditUserName(closeUser.getRealname());
            }
            editRecordDataVOList.add(editRecordDataVO);
        }
        if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(editRecordDataVOList)){
            ywContractRevenue.setEditRecordDataVOList(editRecordDataVOList);
        }
    }
    @Override
    public void closeRevenue(Integer id,LoginUserInfo loginUserInfo) {
        YwContractRevenue ywContractRevenue = ywContractRevenueMapper.selectById(id);
        if(Objects.isNull(ywContractRevenue)){
            throw new BusinessException(ResponseStatus.DATA_EMPTY);
        }
        YwContractBill ywContractBill = ywContractBillMapper.selectById(ywContractRevenue.getBillId());
        if(Objects.isNull(ywContractBill)){
            throw new BusinessException(ResponseStatus.DATA_EMPTY);
        }
        YwContract ywContract = ywContractMapper.selectById(ywContractBill.getContractId());
        if(Objects.isNull(ywContract)){
            throw new BusinessException(ResponseStatus.DATA_EMPTY);
        }
        if(Constants.equalsInteger(ywContract.getStatus(),Constants.THREE)){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"合同状态已流转,无法操作");
        }
        if(Constants.equalsInteger(ywContractBill.getPayStatus(),Constants.ONE)
            || Constants.equalsInteger(ywContractBill.getPayStatus(),Constants.TWO)){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"账单状态已流转,无法操作");
        }
        //查询账单下 æ‰€æœ‰çš„账单
        List<YwContractRevenue> ywContractRevenueList =  ywContractRevenueMapper.selectList(new QueryWrapper<YwContractRevenue>().lambda().eq(YwContractRevenue::getStatus,Constants.ZERO)
                        .eq(YwContractRevenue::getIsdeleted,Constants.ZERO)
                .eq(YwContractRevenue::getBillId,ywContractRevenue.getBillId())
                .ne(YwContractRevenue::getId,id)
        );
        if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isEmpty(ywContractRevenueList)){
            //无其他流水记录 æ ¹æ®è´¦å•创建类型  å˜æ›´çŠ¶æ€
            //自建账单 æ ¹æ®è´¦å•收支类型进行 å˜æ›´çŠ¶æ€
            if(Constants.equalsInteger(ywContractBill.getType(),Constants.ONE)){
                if(Constants.equalsInteger(ywContractBill.getBillType(),Constants.ZERO)){
                    ywContractBill.setPayStatus(Constants.ZERO);
                }else{
                    ywContractBill.setPayStatus(Constants.THREE);
                }
            }else{
                //合同账单 å˜ä¸º å¾…收款
                ywContractBill.setPayStatus(Constants.ZERO);
            }
        }else{
            //存在其他流水 åˆ™ç»Ÿä¸€å˜æ›´ä¸º éƒ¨åˆ†ç»“ç®—
            ywContractBill.setPayStatus(Constants.TWO);
        }
        ywContractBillMapper.update(null,new UpdateWrapper<YwContractBill>().lambda()
                .set(YwContractBill::getPayStatus,ywContractBill.getPayStatus())
                .set(YwContractBill::getEditor,loginUserInfo.getId())
                .set(YwContractBill::getEditDate," now() ")
                .eq(YwContractBill::getId,ywContractBill.getId())
        );
        ywContractRevenueMapper.update(null,new UpdateWrapper<YwContractRevenue>().lambda()
                .set(YwContractRevenue::getStatus,Constants.ONE)
                .set(YwContractRevenue::getEditor,loginUserInfo.getId())
                .set(YwContractRevenue::getEditDate," now() ")
                .eq(YwContractRevenue::getId,id));
    }
    @Override
    public YwContractRevenue findOne(YwContractRevenue ywContractRevenue) {
        QueryWrapper<YwContractRevenue> wrapper = new QueryWrapper<>(ywContractRevenue);
        return ywContractRevenueMapper.selectOne(wrapper);
@@ -137,67 +342,104 @@
    @Override
    public List<YwContractRevenue> findList(YwContractRevenue ywContractRevenue) {
        QueryWrapper<YwContractRevenue> wrapper = new QueryWrapper<>(ywContractRevenue);
        return ywContractRevenueMapper.selectList(wrapper);
        List<YwContractRevenue> ywContractRevenueList = ywContractRevenueMapper.selectJoinList(YwContractRevenue.class,new MPJLambdaWrapper<YwContractRevenue>()
                .selectAll(YwContractRevenue.class)
                .selectAs(YwCustomer::getName,YwContractRevenue::getCustomerNme)
                .leftJoin(YwContract.class,YwContract::getId,YwContractRevenue::getContractId)
                .leftJoin(YwCustomer.class,YwCustomer::getId,YwContract::getRenterId)
                .eq(YwContractRevenue::getStatus,Constants.ZERO)
                .eq(Objects.nonNull(ywContractRevenue) && Objects.nonNull(ywContractRevenue.getBillId()),YwContractRevenue::getBillId,ywContractRevenue.getBillId())
        );
        return ywContractRevenueList;
    }
  
    @Override
    public PageData<YwContractRevenue> findPage(PageWrap<YwContractRevenue> pageWrap) {
        IPage<YwContractRevenue> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
        QueryWrapper<YwContractRevenue> queryWrapper = new QueryWrapper<>();
        MPJLambdaWrapper<YwContractRevenue> queryWrapper = new MPJLambdaWrapper<>();
        Utils.MP.blankToNull(pageWrap.getModel());
        if (pageWrap.getModel().getId() != null) {
            queryWrapper.lambda().eq(YwContractRevenue::getId, pageWrap.getModel().getId());
        YwContractRevenue model = pageWrap.getModel();
        IPage<YwContractRevenue> iPage = ywContractRevenueMapper.selectJoinPage(page,YwContractRevenue.class,
                queryWrapper.selectAll(YwContractRevenue.class)
                        .selectAs(YwContractBill::getCode,YwContractRevenue::getBillCode)
                         .selectAs(YwContract::getCode,YwContractRevenue::getContractCode)
                        .selectAs(YwCustomer::getName,YwContractRevenue::getCustomerName)
                        .selectAs(SystemUser::getRealname,YwContractRevenue::getRealname)
                        .leftJoin(YwContractBill.class,YwContractBill::getId,YwContractRevenue::getBillId)
                        .leftJoin(YwContract.class,YwContract::getId,YwContractBill::getContractId)
                        .leftJoin(YwCustomer.class,YwCustomer::getId,YwContract::getRenterId)
                        .leftJoin(SystemUser.class,SystemUser::getId,YwContractRevenue::getCreator)
                        .eq(YwContractRevenue::getIsdeleted,Constants.ZERO)
                        .like(Objects.nonNull(model)&&StringUtils.isNotBlank(model.getCustomerNme()),
                                YwCustomer::getName,model.getCustomerNme())
                        .eq(Objects.nonNull(model)&&Objects.nonNull(model.getPayType()),
                                YwContractRevenue::getPayType,model.getPayType())
                        .eq(Objects.nonNull(model)&&Objects.nonNull(model.getRevenueType()),
                                YwContractRevenue::getRevenueType,model.getRevenueType())
                        .ge(Objects.nonNull(model)&&Objects.nonNull(model.getPayDateStart()),YwContractRevenue::getActPayDate, Utils.Date.getStart(model.getPayDateStart()))
                        .le(Objects.nonNull(model)&&Objects.nonNull(model.getPayDateEnd()),YwContractRevenue::getActPayDate, Utils.Date.getEnd(model.getPayDateEnd())) )
                ;
        this.dealRoomDetail(iPage.getRecords());
        for (YwContractRevenue ywContractRevenue:iPage.getRecords()) {
            //楼宇名称
            List<YwContractRoom> ywContractRoomList = ywContractRevenue.getYwContractRoomList();
            StringBuilder roomPathName = new StringBuilder();
            for (YwContractRoom ywContractRoom:ywContractRoomList) {
                if(StringUtils.isNotBlank(ywContractRoom.getProjectName())){
                    roomPathName.append(ywContractRoom.getProjectName()+"/");
                }
                if(StringUtils.isNotBlank(ywContractRoom.getBuildingName())){
                    roomPathName.append(ywContractRoom.getBuildingName()+"/");
                }
                if(StringUtils.isNotBlank(ywContractRoom.getFloorName())){
                    roomPathName.append(ywContractRoom.getFloorName()+"/");
                }
                if(StringUtils.isNotBlank(ywContractRoom.getRoomName())){
                    roomPathName.append(ywContractRoom.getRoomName());
                }
                if(StringUtils.isNotBlank(roomPathName)){
                    roomPathName.append(";");
                }
            }
            ywContractRevenue.setRoomPathName(roomPathName.toString());
        }
        if (pageWrap.getModel().getCreator() != null) {
            queryWrapper.lambda().eq(YwContractRevenue::getCreator, pageWrap.getModel().getCreator());
        }
        if (pageWrap.getModel().getCreateDate() != null) {
            queryWrapper.lambda().ge(YwContractRevenue::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()));
            queryWrapper.lambda().le(YwContractRevenue::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate()));
        }
        if (pageWrap.getModel().getEditor() != null) {
            queryWrapper.lambda().eq(YwContractRevenue::getEditor, pageWrap.getModel().getEditor());
        }
        if (pageWrap.getModel().getEditDate() != null) {
            queryWrapper.lambda().ge(YwContractRevenue::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate()));
            queryWrapper.lambda().le(YwContractRevenue::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate()));
        }
        if (pageWrap.getModel().getIsdeleted() != null) {
            queryWrapper.lambda().eq(YwContractRevenue::getIsdeleted, pageWrap.getModel().getIsdeleted());
        }
        if (pageWrap.getModel().getRemark() != null) {
            queryWrapper.lambda().eq(YwContractRevenue::getRemark, pageWrap.getModel().getRemark());
        }
        if (pageWrap.getModel().getStatus() != null) {
            queryWrapper.lambda().eq(YwContractRevenue::getStatus, pageWrap.getModel().getStatus());
        }
        if (pageWrap.getModel().getActReceivableFee() != null) {
            queryWrapper.lambda().eq(YwContractRevenue::getActReceivableFee, pageWrap.getModel().getActReceivableFee());
        }
        if (pageWrap.getModel().getActPayDate() != null) {
            queryWrapper.lambda().ge(YwContractRevenue::getActPayDate, Utils.Date.getStart(pageWrap.getModel().getActPayDate()));
            queryWrapper.lambda().le(YwContractRevenue::getActPayDate, Utils.Date.getEnd(pageWrap.getModel().getActPayDate()));
        }
        if (pageWrap.getModel().getPayType() != null) {
            queryWrapper.lambda().eq(YwContractRevenue::getPayType, pageWrap.getModel().getPayType());
        }
        if (pageWrap.getModel().getCompanyId() != null) {
            queryWrapper.lambda().eq(YwContractRevenue::getCompanyId, pageWrap.getModel().getCompanyId());
        }
        if (pageWrap.getModel().getAccountId() != null) {
            queryWrapper.lambda().eq(YwContractRevenue::getAccountId, pageWrap.getModel().getAccountId());
        }
        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
                queryWrapper.orderByDesc(sortData.getProperty());
            } else {
                queryWrapper.orderByAsc(sortData.getProperty());
        return PageData.from(iPage);
    }
    public void dealRoomDetail(List<YwContractRevenue> ywContractRevenueList){
        //查询账单下的楼宇数据
        if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(ywContractRevenueList)){
            //获取所有数据
            List<Integer> billIdList = ywContractRevenueList.stream().map(i->i.getBillId()).collect(Collectors.toList());
            if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(billIdList)){
                List<YwContractRoom> ywContractRoomList  = ywContractRoomMapper.selectJoinList(YwContractRoom.class,new MPJLambdaWrapper<YwContractRoom>()
                        .selectAll(YwContractRoom.class)
                        .selectAs(YwProject::getName,YwRoom::getProjectName)
                        .selectAs(YwFloor::getName,YwRoom::getFloorName)
                        .selectAs(YwBuilding::getName,YwRoom::getBuildingName)
                        .selectAs(YwRoom::getName,YwContractRoom::getRoomName)
                        .leftJoin(YwRoom.class,YwRoom::getId,YwContractRoom::getRoomId)
                        .leftJoin(YwFloor.class,YwFloor::getId,YwRoom::getFloor)
                        .leftJoin(YwProject.class,YwProject::getId,YwRoom::getProjectId)
                        .leftJoin(YwBuilding.class,YwBuilding::getId,YwRoom::getBuildingId)
                        .in(YwContractRoom::getContractId,billIdList)
                        .eq(YwContractRoom::getType,Constants.ONE)
                );
                if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(ywContractRoomList)){
                    for (YwContractRevenue ywContractRevenue:ywContractRevenueList) {
                        ywContractRevenue.setYwContractRoomList(
                                ywContractRoomList.stream().filter(i->Constants.equalsInteger(i.getContractId(),ywContractRevenue.getBillId())).collect(Collectors.toList())
                        );
                    }
                }
            }
        }
        return PageData.from(ywContractRevenueMapper.selectPage(page, queryWrapper));
    }
    @Override
    public long count(YwContractRevenue ywContractRevenue) {
        QueryWrapper<YwContractRevenue> wrapper = new QueryWrapper<>(ywContractRevenue);
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwContractServiceImpl.java
@@ -71,7 +71,6 @@
    @Transactional(rollbackFor = {BusinessException.class,Exception.class})
    public Integer create(YwContract model) {
        isParamValidCreated(model);
        model.setCreator(model.getLoginUserInfo().getId());
        model.setIsdeleted(Constants.ZERO);
        model.setCreateDate(new Date());
@@ -79,12 +78,89 @@
        model.setEditDate(model.getCreateDate());
        model.setEditor(model.getCreator());
        model.setStatus(Constants.ZERO);//待执行
        model.setRemark(getRemarlByParam(model));
        ywContractMapper.insert(model);
        dealDetailListBiz(model);//处理条款信息
        dealMultifileBiz(model);//处理附件信息
        dealLogBiz(model,Constants.YwLogType.CONTRACT_CREATE,null,null);//记录新建日志
        return model.getId();
    }
    private String getRemarlByParam(YwContract model) {
        String str = "";
        YwContractDetail zl = model.getZlDetailList()!=null&&model.getZlDetailList().size()>0?model.getZlDetailList().get(0):null;
        YwContractDetail yw = model.getWyDetailList()!=null&&model.getWyDetailList().size()>0?model.getWyDetailList().get(0):null;
        //起租日2024/06/01,租赁数为500㎡。首期租赁三月一付,租金单价35元/㎡·月。首期物业三月一付,物业单价4.3元/㎡·月
        String str0 = "合同摘要:起租日{param1},租赁数为{param2}㎡。首期租赁{param3},租金单价{param4}元{param5}。首期物业{param6},物业单价{param7}{param8}";
        String str1 = "合同摘要:起租日{param1},租赁数为{param2}㎡。首期租赁{param3},租金单价{param4}元{param5}。";
        String str2 = "合同摘要:起租日{param1},首期物业{param6},物业单价{param7}元{param8}";
        if(Constants.equalsInteger(model.getType(),Constants.ZERO)){
            str= str0;
        }
        if(Constants.equalsInteger(model.getType(),Constants.ONE)){
            str= str1;
        }
        if(Constants.equalsInteger(model.getType(),Constants.TWO)){
            str= str2;
        }
        str = str.replace("{param1}",DateUtil.getDateLongSlash(model.getStartDate()))
                .replace("{param2}",model.getTotalArea().intValue()+"")
                .replace("{param3}",getPayTypeByNum(model.getZlPayType()))
                .replace("{param4}",zl!=null&&zl.getPrice()!=null?(zl.getPrice().intValue()+""):"0")
                .replace("{param5}",getPayTypeByNum(model.getWyPayType()))
                .replace("{param6}",getUnitTypeByNum(zl))
                .replace("{param7}",zl!=null&&yw.getPrice()!=null?(zl.getPrice().intValue()+""):"0")
                .replace("{param8}",getUnitTypeByNum(yw));
        return  str;
    }
    private String getbackRentRemarkByParam(YwContract model) {
        BigDecimal fee = Constants.formatBigdecimal(model.getBtFee());
        String str = "退租摘要:剩余未结清账单{param1}份,关闭账单{param2}份【退租日{param3},退租费用合计需{param4}{param5}元。】";
        str = str.replace("{param1}",model.getBtWaitBill()+"")
                .replace("{param2}",DateUtil.getDateLongSlash(model.getBtDate()))
                .replace("{param3}",fee.compareTo(new BigDecimal(0)) >=0?"收":"付")
                .replace("{param4}",(fee.compareTo(new BigDecimal(0)) >=0?
                        Constants.formatBigdecimal(model.getBtFee()).intValue()
                        :(Constants.formatBigdecimal(model.getBtFee()).intValue() * -1))+"" );
        return  str;
    }
    private CharSequence getUnitTypeByNum(YwContractDetail zl) {
        if(zl==null){
            return "";
        }
     //   ä»˜æ¬¾å‘¨æœŸç±»åž‹ 0=元每平米天;1=元每平米月;2=元每平米年;3=元每天;4=元每月;5=元每年;6=元每场;
        int zlPayType = Constants.formatIntegerNum(zl.getCircleType());
        if(zlPayType == 1){
            return "元/㎡·月";
        }else   if(zlPayType == 2){
            return "元/㎡·天";
        }else  if(zlPayType == 3){
            return "元/天";
        }else  if(zlPayType == 4){
            return "元/月";
        }else  if(zlPayType == 5){
            return "元/å¹´";
        }else  if(zlPayType == 6){
            return "元/场";
        }
        return "元/㎡·天";
    }
    private CharSequence getPayTypeByNum(Integer zlPayType) {
        //租赁支付方式 0=一次性付款;1=每三个月一付;2=六个月一付;3=一年一付
        if(zlPayType == 1){
            return "3个月一付";
        }else   if(zlPayType == 2){
            return "6个月一付";
        }else  if(zlPayType == 3){
            return "1年一付";
        }
        return "一次性付款";
    }
    /**
     * é€€ç§Ÿæäº¤
     * @param param
@@ -94,6 +170,8 @@
    @Transactional(rollbackFor = {BusinessException.class,Exception.class})
    public  Integer backRent(YwContract param){
        isParamValidBackRent(param);
        param.setEditDate(new Date());
        param.setEditor(param.getLoginUserInfo().getId());
        //处理
        dealBackRentBillBiz(param);
        YwContract update = new YwContract();
@@ -107,12 +185,152 @@
        update.setBtType(param.getBtType());
        update.setBtUserId(param.getBtUserId());
        update.setBtFee(param.getBtFee());
        update.setBtRemark(getbackRentRemarkByParam(param));
        ywContractMapper.updateById(update);
        dealLogBiz(param,Constants.YwLogType.CONTRACT_BACK,null,null);
        return param.getId();
    }
    private void dealBackRentBillBiz(YwContract param) {
        //查询合同全部账单信息
        List<YwContractBill> closeBills = new ArrayList<>();//带关闭
        List<YwContractBill> newBills = new ArrayList<>();//新的账单
        List<YwContractBill> noBills = new ArrayList<>();//不需要结算的账单
        List<YwContractBill> yjBills = new ArrayList<>();//押金账单
        List<YwContractBill> canBills = new ArrayList<>();//可退租修改数据
        List<YwContractBill> allBills = ywContractBillMapper.selectList(new QueryWrapper<YwContractBill>().
                select("*," +
                        "( select ifnull(sum(yw.ACT_RECEIVABLE_FEE),0) from  yw_contract_revenue yw where yw.bill_id = yw_contract_bill.id and yw.status = 0 and yw.isdeleted = 0 ) as  actReceivableFee " )
                .lambda().
                eq(YwContractBill::getIsdeleted,Constants.ZERO)
                .eq(YwContractBill::getContractId,param.getId()));
        if(allBills!=null && allBills.size()>0){
            for(YwContractBill bill: allBills){
                //付款状态:0=待收款;1=已结清;2=部分结清;3=待付款;4=待退款;5=已关闭
                // å¦‚果是押金或者保证金,不支持退款,保持原来的状态, 0=租赁费;1=物业费;2=租赁押金;3=物业押金;4=水电费;5=杂项费;6=其他;7=保证金
                if(Constants.equalsInteger(Constants.THREE,bill.getCostType())
                        ||  Constants.equalsInteger(Constants.FOUR,bill.getCostType())
                        ||Constants.equalsInteger(Constants.SEVEN,bill.getCostType())){
                    //押金和保证金
                    yjBills.add(bill);
                    continue;
                }
                if(Constants.equalsInteger(bill.getPayStatus(),Constants.ZERO)
                        ||Constants.equalsInteger(bill.getPayStatus(),Constants.THREE)){
                    if(bill.getStartDate().getTime()>param.getEditDate().getTime()){
                        //如果还没开始,账单直接关闭
                        closeBills.add(bill);
                        noBills.add(bill);
                    }else{
                        canBills.add(bill);
                    }
                }else  if(Constants.equalsInteger(bill.getPayStatus(),Constants.ONE) ){
                    if(bill.getEndDate().getTime()<param.getEditDate().getTime()){
                        //如果已结清,账单直接关闭
                        noBills.add(bill);
                    }else{
                        canBills.add(bill);
                    }
                }else  if(Constants.equalsInteger(bill.getPayStatus(),Constants.TWO) ){
                     canBills.add(bill);
                }
            }
        }
        if(closeBills.size()>0){
            //直接关闭关闭账单
            for(YwContractBill b : closeBills){
                b.setStatus(Constants.ONE);
                b.setEditDate(param.getEditDate());
                b.setEditor(param.getEditor());
                //关闭订单
                ywContractBillMapper.updateById(b);
            }
        }
        int yjNoBills =0;
        if(yjBills.size()>0){
            // å¦‚果是押金或者保证金,不支持退款,保持原来的状态, 0=租赁费;1=物业费;2=租赁押金;3=物业押金;4=水电费;5=杂项费;6=其他;7=保证金
            for(YwContractBill bill : yjBills){
               if(!Constants.equalsInteger(bill.getPayStatus(),Constants.ONE) ){
                   //如果是未结清押金
                   yjNoBills ++;
               }
            }
        }
        BigDecimal totalBackFee = new BigDecimal(0);
        if(canBills.size()>0){
            //直接关闭关闭账单
            for(YwContractBill b : canBills){
                BigDecimal fee = new BigDecimal(0);
                YwContractBill editBill = getEditBillFromListByParam(b,param.getCanBackRentBills());
                if(editBill != null){
                    //付款状态:0=待收款;1=已结清;2=部分结清;3=待付款;4=待退款;5=已关闭
                    //如果账单信息做了编辑,金额计算 å®žæ”¶é‡‘额 å’Œ ä¿®æ”¹åŽåº”收金额作对比,判断是否应该退款
                    fee = Constants.formatBigdecimal(b.getActReceivableFee()).subtract(editBill.getReceivableFee());
                    if(fee.compareTo(new BigDecimal(0))== 0){
                        //如果费用正好,则修改账单信息为已结清
                        b.setStatus(Constants.ONE);
                    }else if(fee.compareTo(new BigDecimal(0))> 0){
                        //如果需要进行退款,更新账单信息为待退款
                        b.setStatus(Constants.FOUR);
                    }else if(fee.compareTo(new BigDecimal(0)) < 0){
                        //如果账单还有款待收,则保持状态不变
                    }
                }
                b.setEditDate(param.getEditDate());
                b.setEditor(param.getEditor());
                b.setBtActDate(param.getBtActDate());
                b.setBtDate(param.getBtDate());
                b.setBtFee(fee);
                b.setBtInfo(param.getBtInfo());
                b.setBtUserId(param.getBtUserId());
                b.setBtSignDate(param.getBtSignDate());
                b.setBtType(param.getBtType());
                //关闭订单
                ywContractBillMapper.updateById(b);
                totalBackFee = totalBackFee.add(fee);//累计退款金额
            }
        }
        if(param.getAddBillList()!=null && param.getAddBillList().size()>0){
            for(YwContractBill addBill : param.getAddBillList()){
                addBill.setIsdeleted(Constants.ZERO);
                addBill.setContractId(param.getId());
                addBill.setType(Constants.ONE);
                addBill.setStatus(Constants.ZERO);
                if(Constants.equalsInteger(addBill.getBillType(),Constants.ZERO)){
                    //如果是收款
                    totalBackFee = totalBackFee.add(Constants.formatBigdecimal(addBill.getActReceivableFee()));
                    addBill.setPayStatus(Constants.ZERO);
                    addBill.setBtFee(Constants.formatBigdecimal(addBill.getActReceivableFee()));
                }else{
                    //如果是付款
                    addBill.setPayStatus(Constants.THREE);
                    addBill.setBtFee(Constants.formatBigdecimal(addBill.getActReceivableFee()).multiply(new BigDecimal(-1)));
                }
                totalBackFee = totalBackFee.add(Constants.formatBigdecimal(addBill.getBtFee()));
                addBill.setEditDate(param.getEditDate());
                addBill.setEditor(param.getEditor());
                addBill.setBtActDate(param.getBtActDate());
                addBill.setBtDate(param.getBtDate());
                addBill.setBtInfo(param.getBtInfo());
                addBill.setBtUserId(param.getBtUserId());
                addBill.setBtSignDate(param.getBtSignDate());
                addBill.setBtType(param.getBtType());
                newBills.add(addBill);
            }
            ywContractBillMapper.insert(param.getAddBillList());//批量插入数据
        }
        param.setBtWaitBill(canBills.size() + newBills.size()+yjNoBills);//未清算的账单数量
        param.setBtCLoseBill(closeBills.size());
        param.setBtFee(totalBackFee);
    }
    private YwContractBill getEditBillFromListByParam(YwContractBill b, List<YwContractBill> canBackRentBills) {
        for(YwContractBill d : canBackRentBills){
            if(Constants.equalsInteger(b.getId(),d.getId())){
                return d;
            }
        }
        return null;
    }
    private void isParamValidBackRent(YwContract param) {
@@ -138,11 +356,14 @@
                if(bill.getCostType() == null
                        ||bill.getFeeType() == null
                        ||bill.getReceivableFee() == null
                        ||bill.getReceivableFee().compareTo(new BigDecimal(0)) < 1
                        ||bill.getCompanyId() == null
                        ||bill.getPlanPayDate() == null
                        ||(Constants.equalsInteger(bill.getFeeType(),Constants.ZERO)
                        ||bill.getBillType() == null
                        ||(Constants.equalsInteger(bill.getBillType(),Constants.ZERO)
                        &&Constants.equalsInteger(bill.getFeeType(),Constants.ZERO)
                        && (bill.getStartDate() ==null || bill.getEndDate() ==null) )){
                    throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,请按要求填写自建账单信息!");
                }
            }
        }
@@ -626,6 +847,10 @@
        if(rooms.size() != rooms.size()){
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,存在无效的房源信息!");
        }
        model.setTotalArea(new BigDecimal(0));
        for(YwRoom r : rooms){
            model.setTotalArea(model.getTotalArea().add(Constants.formatBigdecimal(r.getArea())));
        }
        YwCustomer customer = customerMapper.selectById(model.getRenterId());
        if(customer ==null || Constants.equalsInteger(customer.getIsdeleted(),Constants.ONE)){
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"对不起,选择租客信息不存在,请返回刷新重试!");
@@ -762,6 +987,32 @@
                            .eq(  YwContractBill::getContractId,model.getId())
                            .eq(YwContractBill::getIsdeleted,Constants.ZERO)
                            .orderByAsc(YwContractBill::getSortnum,YwContractBill::getCreateDate)));
            model.setCanBackRentBills(new ArrayList<>());
            long nowStart = Utils.Date.getStart(new Date()).getTime();
            long nowEnd = Utils.Date.getEnd(new Date()).getTime();
            if(model.getBillList()!=null && model.getBillList().size()>0){
                for(YwContractBill bill: model.getBillList()){
                    //付款状态:0=待收款;1=已结清;2=部分结清;3=待付款;4=待退款;5=已关闭
                    if(Constants.equalsInteger(bill.getPayStatus(),Constants.ZERO)
                            ||Constants.equalsInteger(bill.getPayStatus(),Constants.THREE)){
                        if(bill.getStartDate().getTime()>nowEnd){
                            //如果还没开始,账单直接关闭
                            continue;
                        }
                        model.getCanBackRentBills().add(bill);
                    }else  if(Constants.equalsInteger(bill.getPayStatus(),Constants.ONE) ){
                        if(bill.getEndDate().getTime()<nowStart){
                            //如果已结清,账单直接关闭
                          continue;
                        }
                        model.getCanBackRentBills().add(bill);
                    }else  if(Constants.equalsInteger(bill.getPayStatus(),Constants.TWO) ){
                        model.getCanBackRentBills().add(bill);
                    }
                }
            }
        }
        return model;
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwWorkorderServiceImpl.java
@@ -79,11 +79,12 @@
                if(StringUtils.isBlank(multifile.getFileurl())){
                    continue;
                }
                multifile.setCreateDate(new Date());
                multifile.setCreateDate(model.getCreateDate());
                multifile.setEditDate(model.getCreateDate());
                multifile.setCreator(model.getEditor());
                multifile.setIsdeleted(Constants.ZERO);
                multifile.setObjId(model.getId());
                multifile.setCreator(model.getCreator());
                multifile.setEditor(model.getCreator());
                multifile.setObjType(Constants.MultiFile.YW_WORKORDER_PROBLEM.getKey());
                multifile.setSortnum(i+1);
                fileList.add(multifile);
@@ -169,7 +170,9 @@
        if(model ==null || Constants.equalsInteger(model.getIsdeleted(),Constants.ONE)){
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"对不起,工单信息不存在!");
        }
        if(!Constants.equalsInteger(model.getDealStatus(),Constants.ZERO) && !Constants.equalsInteger(model.getDealStatus(),Constants.ONE)){
        if(!Constants.equalsInteger(model.getDealStatus(),Constants.ZERO)
//                && !Constants.equalsInteger(model.getDealStatus(),Constants.ONE)
        ){
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"对不起,工单状态已流转,不支持当前操作!");
        }
@@ -200,10 +203,10 @@
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"对不起,工单状态已流转,不支持当前操作!");
        }
        SystemUser user = systemUserMapper.selectById(ywWorkorder.getDealUserId());
        if(user ==null ||  (user.getDeleted()!=null&& user.getDeleted() )){
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"对不起,员工信息不存在!");
        }
//        SystemUser user = systemUserMapper.selectById(ywWorkorder.getDealUserId());
//        if(user ==null ||  (user.getDeleted()!=null&& user.getDeleted() )){
//            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"对不起,员工信息不存在!");
//        }
        YwWorkorder update = new YwWorkorder();
        update.setId(model.getId());
        update.setEditDate(new Date());
@@ -211,8 +214,30 @@
        update.setDealStatus(Constants.TWO);
        update.setDealUserId(update.getEditor());
        update.setDealDate(update.getEditDate());
        update.setDealInfo(ywWorkorder.getDispatchInfo());
        update.setDealInfo(ywWorkorder.getDealInfo());
        ywWorkorderMapper.updateById(update);
        List<Multifile> fileList = new ArrayList<>();
        if(ywWorkorder.getDealFileList()!=null && ywWorkorder.getDealFileList().size()>0){
            for (int i = 0; i <  ywWorkorder.getDealFileList().size(); i++) {
                Multifile multifile =  ywWorkorder.getDealFileList().get(i);
                if(StringUtils.isBlank(multifile.getFileurl())){
                    continue;
                }
                multifile.setCreateDate(update.getEditDate());
                multifile.setCreator(update.getEditor());
                multifile.setEditDate(update.getEditDate());
                multifile.setIsdeleted(Constants.ZERO);
                multifile.setObjId(model.getId());
                multifile.setEditor(update.getEditor());
                multifile.setObjType(Constants.MultiFile.YW_WORKORDER_DEAL.getKey());
                multifile.setSortnum(i+1);
                fileList.add(multifile);
            }
        }
        if(fileList.size()>0){
            multifileMapper.insert(fileList);
        }
        dealLogBiz(model,Constants.YwLogType.WORKORDER_DEAL,ywWorkorder.getLoginUserInfo().getRealname(),null);//记录新建日志
    }
    @Override