jiangping
2024-12-05 16217be9c85f95cb236e639da6e546bb38cdc53d
Merge remote-tracking branch 'origin/master'

# Conflicts:
# server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwContractServiceImpl.java
已添加2个文件
已删除1个文件
已修改45个文件
829 ■■■■■ 文件已修改
admin/.env 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/.env.development 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/.gitignore 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/babel.config.js 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/customer.js 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/common/GlobalWindow.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/router/index.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/client/components/OperaYwCustomerWindow.vue 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/client/components/staffEdit.vue 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/contract/components/config.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/contract/components/contractDetail.vue 108 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/contract/components/contractEdit.vue 199 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/contract/components/terminateLease.vue 32 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/contract/contractList.vue 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/finance/bull.vue 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/finance/components/bullDetail.vue 133 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/finance/components/bullEdit.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/finance/components/details.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/finance/components/flowingWater.vue 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/login.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/operation/components/deviceDetail.vue 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/operation/components/maintainDetail.vue 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/project/buildingList.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/project/components/OperaYwBuildingWindow.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/project/projectList.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/system/user.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/workorder/components/detail.vue 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/vue.config.js 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/login.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/workOrder/detail.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/core/utils/DateCompare.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwProjectCloudController.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/dto/DataDTO.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwBuilding.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/ProjectDataVO.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwProjectService.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/CategoryServiceImpl.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwBuildingServiceImpl.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwContractBillServiceImpl.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwContractRevenueServiceImpl.java 60 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwContractServiceImpl.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwCustomerServiceImpl.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwDeviceRecordServiceImpl.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwPatrolLineServiceImpl.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwPatrolTaskServiceImpl.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwProjectServiceImpl.java 23 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwRoomServiceImpl.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/.env
@@ -4,7 +4,7 @@
VUE_APP_ROUTER_MODE = 'hash'
# é¡¹ç›®ä¸Šä¸‹æ–‡è·¯å¾„
VUE_APP_CONTEXT_PATH = '/'
VUE_APP_CONTEXT_PATH = '/fn_admin/#/'
# æŽ¥å£å‰ç¼€
VUE_APP_API_PREFIX = '/gateway_interface'
admin/.env.development
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,10 @@
# å¼€å‘环境配置
NODE_ENV = 'development'
# é¡¹ç›®ä¸Šä¸‹æ–‡è·¯å¾„
VUE_APP_CONTEXT_PATH = './'
#VUE_APP_API_URL  = 'http://localhost:10010'
VUE_APP_API_URL  = 'http://192.168.0.163:10010'
# VUE_APP_API_URL  = 'https://dmtest.ahapp.net/fn_admin'
#  VUE_APP_API_URL  = 'http://10.50.250.253:8088/gateway_interface'
admin/.gitignore
@@ -1,7 +1,7 @@
.DS_Store
coderd.json
node_modules
.env.development
# .env.development
/dist
@@ -10,6 +10,7 @@
.env.*.local
unpackage
admin
fn_admin
# Log files
npm-debug.log*
yarn-debug.log*
admin/babel.config.js
ÎļþÒÑɾ³ý
admin/src/api/customer.js
@@ -11,3 +11,9 @@
export function list (data) {
  return request.post('/visitsAdmin/cloudService/business/ywCustomer/list', data)
}
// é˜œå®è¿ç»´ - æŸ¥è¯¢è”系人列表
export function ywList (data) {
  return request.post('/visitsAdmin/cloudService/business/member/ywList', data)
}
admin/src/components/common/GlobalWindow.vue
@@ -125,11 +125,11 @@
    .window__body {
      // width: 1100px;
      // margin: 0 auto;
      // background-color: #fff;
      background-color: #fff;
      width: 100%;
      height: 100%;
      overflow-y: auto;
      padding: 12px 16px;
      padding: 0 16px 12px 16px;
      // æ ‡ç­¾
      // .el-form-item__label {
      //   float: none;
admin/src/router/index.js
@@ -10,7 +10,7 @@
const router = new VueRouter({
  // + (process.env.VUE_APP_ROUTER_MODE === 'hash' ? '#' : '')
  // base: process.env.VUE_APP_CONTEXT_PATH,
  base: '/',
  mode: 'hash',
  routes: [
    // ç™»å½•
admin/src/views/client/components/OperaYwCustomerWindow.vue
@@ -45,7 +45,9 @@
          <el-form-item label="证件号码" prop="member.idcardNo">
            <el-input v-model="form.member.idcardNo" placeholder="请输入" v-trim />
          </el-form-item>
          <el-form-item label="邮箱" prop="email">
          <el-form-item label="邮箱" prop="member.email" :rules="[
            { required: false, type: 'email', message: '请输入正确的邮箱格式'}
          ]">
            <el-input v-model="form.member.email" placeholder="请输入邮箱" v-trim />
          </el-form-item>
        </template>
@@ -264,4 +266,4 @@
    }
  }
}
</style>
</style>
admin/src/views/client/components/staffEdit.vue
@@ -32,7 +32,9 @@
        <el-form-item label="证件号码" prop="member.idcardNo">
          <el-input v-model="form.idcardNo" placeholder="请输入" v-trim />
        </el-form-item>
        <el-form-item label="邮箱" prop="email">
        <el-form-item label="邮箱" prop="email" :rules="[
          { required: false, type: 'email', message: '请输入正确的邮箱格式'}
        ]">
          <el-input v-model="form.email" placeholder="请输入邮箱" v-trim />
        </el-form-item>
        <el-form-item label="性别">
@@ -213,4 +215,4 @@
    }
  }
}
</style>
</style>
admin/src/views/contract/components/config.js
@@ -9,7 +9,7 @@
  roundedUp: [{ required: true, message: '请选择' }],
  companyId: [{ required: true, message: '请选择' }],
  renterName: [{ required: true, message: '请选择' }],
  memberName: [{ required: true, message: '请选择' }],
  memberId: [{ required: true, message: '请选择' }],
  zlDeposit: [{ required: true, message: '请输入' }],
  zlPayType: [{ required: true, message: '请选择' }],
  wyDeposit: [{ required: true, message: '请输入' }],
admin/src/views/contract/components/contractDetail.vue
@@ -6,22 +6,25 @@
    :confirm-working="isWorking"
    @close="close"
    @confirm="confirm">
    <div class="home_title" v-if="info">
      <div class="left">
        <span class="mr10">单位名称:{{info.renterName}}</span>
        <el-tag type="success" v-if="info.status === 0">待执行</el-tag>
        <el-tag type="success" v-if="info.status === 1">正常执行中</el-tag>
        <el-tag type="info" v-if="info.status === 2">已到期</el-tag>
        <el-tag type="info" v-if="info.status === 3">退租结算中</el-tag>
        <el-tag type="info" v-if="info.status === 4">已退租</el-tag>
    <div style="width: 100%; position: sticky; top: 0; left: 0; z-index: 999; background: #ffffff;">
      <div class="home_title" v-if="info">
        <div class="left">
          <span class="mr10">单位名称:{{info.renterName}}</span>
          <el-tag type="success" v-if="info.status === 0">待执行</el-tag>
          <el-tag type="success" v-if="info.status === 1">正常执行中</el-tag>
          <el-tag type="info" v-if="info.status === 2">已到期</el-tag>
          <el-tag type="info" v-if="info.status === 3">退租结算中</el-tag>
          <el-tag type="info" v-if="info.status === 4">已退租</el-tag>
        </div>
        <el-button plain type="danger" v-if="[0, 1, 2].includes(info.status)" @click="refund">退租</el-button>
      </div>
      <el-button plain type="danger" v-if="[0, 1, 2].includes(info.status)" @click="refund">退租</el-button>
    </div>
    <div class="remark" v-if="info">{{info.remark}}</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="remark" v-if="info">{{info.remark}}</div>
      <div class="remark" v-if="info && info.status === 3">{{info.btRemark}}</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>
    </div>
    <div class="main" v-if="activeTabs === 0 && info">
      <div class="title">基础信息</div>
@@ -40,7 +43,7 @@
        </div>
        <div class="item">
          <div class="la">合同租赁数</div>
          <div class="val">{{ info.totalArea }}</div>
          <div class="val">{{ info.totalArea }}㎡</div>
        </div>
        <div class="item">
          <div class="la">所属公司</div>
@@ -99,7 +102,7 @@
      <div class="list" style="background: #F7F7F7; padding: 15px 20px;" v-if="info.type === 2 || info.type === 0">
        <div class="item">
          <div class="la">押金金额</div>
          <div class="val">{{ info.zlDeposit }}</div>
          <div class="val">{{ info.zlDeposit }}元</div>
        </div>
        <div class="item">
          <div class="la">付款方式</div>
@@ -116,14 +119,22 @@
      <el-table :data="info.zlDetailList" stripe style="margin-bottom: 20px;" v-if="info.type === 2 || info.type === 0">
        <el-table-column prop="startDate" label="开始日期" min-width="100" show-overflow-tooltip />
        <el-table-column prop="endDate" label="结束日期" min-width="100" show-overflow-tooltip />
        <el-table-column prop="price" label="合同单价" min-width="100" show-overflow-tooltip />
        <el-table-column prop="advanceDays" label="付款提前天数" min-width="100" show-overflow-tooltip />
        <el-table-column label="合同单价" min-width="100" show-overflow-tooltip>
          <template slot-scope="{row}">
            {{row.price}} {{returnUnit(row.circleType)}}
          </template>
        </el-table-column>
        <el-table-column label="付款提前天数" min-width="100" show-overflow-tooltip>
          <template slot-scope="{row}">
            {{row.advanceDays}}天
          </template>
        </el-table-column>
      </el-table>
      <div class="title" v-if="info.type === 1 || info.type === 0">物业费条款</div>
      <div class="list" style="background: #F7F7F7; padding: 15px 20px;" v-if="info.type === 1 || info.type === 0">
        <div class="item">
          <div class="la">押金金额</div>
          <div class="val">{{ info.wyDeposit }}</div>
          <div class="val">{{ info.wyDeposit }}元</div>
        </div>
        <div class="item">
          <div class="la">付款方式</div>
@@ -140,13 +151,25 @@
      <el-table :data="info.wyDetailList" stripe style="margin-bottom: 20px;" v-if="info.type === 1 || info.type === 0">
        <el-table-column prop="startDate" label="开始日期" min-width="100" show-overflow-tooltip />
        <el-table-column prop="endDate" label="结束日期" min-width="100" show-overflow-tooltip />
        <el-table-column prop="price" label="合同单价" min-width="100" show-overflow-tooltip />
        <el-table-column prop="advanceDays" label="付款提前天数" min-width="100" show-overflow-tooltip />
        <el-table-column label="合同单价" min-width="100" show-overflow-tooltip>
          <template slot-scope="{row}">
            {{row.price}} {{returnUnit(row.circleType)}}
          </template>
        </el-table-column>
        <el-table-column label="付款提前天数" min-width="100" show-overflow-tooltip>
          <template slot-scope="{row}">
            {{row.advanceDays}}天
          </template>
        </el-table-column>
      </el-table>
      <div class="title">合同附件</div>
      <div class="list">
        <el-table :data="info.fileList" stripe>
          <el-table-column prop="name" label="附件名称" show-overflow-tooltip />
          <el-table-column label="附件名称" show-overflow-tooltip>
            <template slot-scope="{row}">
              <u style="color: #0c6ce3; cursor: pointer;" @click="xiazai(row.fileurlFull)">{{row.name}}</u>
            </template>
          </el-table-column>
          <el-table-column prop="userName" label="操作人" show-overflow-tooltip />
          <el-table-column prop="createDate" label="操作时间" show-overflow-tooltip />
        </el-table>
@@ -182,18 +205,22 @@
        <el-table-column
          :key="Date.now()"
          prop="receivableFee"
          label="应收金额">
          :label="`应${type === 0 ? '收' : '付'}金额`">
        </el-table-column>
        <el-table-column
          prop="actReceivableFee"
          label="实收金额">
          :label="`实${type === 0 ? '收' : '付'}金额`">
        </el-table-column>
        <el-table-column
          prop="needReceivableFee"
          label="需收金额">
          :label="`需${type === 0 ? '收' : '付'}金额`">
          <template slot-scope="{row}">
            <el-tag type="success" v-if="row.needReceivableFee > 0">收</el-tag>
            <el-tag type="warning" v-else>付</el-tag>
            <template v-if="type === 0">
              <el-tag type="success" v-if="row.needReceivableFee > 0">收</el-tag>
              <el-tag type="warning" v-else-if="row.needReceivableFee < 0">付</el-tag>
            </template>
            <template v-else>
              <el-tag type="warning" v-if="row.needReceivableFee !== 0">付</el-tag>
            </template>
            <span style="margin-left: 10px;">{{Math.abs(row.needReceivableFee)}}</span>
          </template>
        </el-table-column>
@@ -205,6 +232,7 @@
          </template>
        </el-table-column>
        <el-table-column
          width="200"
          label="计费周期">
          <template slot-scope="{row}">
            {{ row.startDate }} ~ {{ row.endDate }}
@@ -325,6 +353,27 @@
      this.id = id
      this.getData()
    },
    xiazai (url) {
      window.open(url)
    },
    returnUnit (type) {
      switch (type) {
        case 0:
          return '元/m²·天'
        case 1:
          return '元/m²·月'
        case 2:
          return '元/m²·年'
        case 3:
          return '元/天'
        case 4:
          return '元/月'
        case 5:
          return '元/å¹´'
        case 6:
          return '元/场'
      }
    },
    getData () {
      getById(this.id)
        .then(res => {
@@ -342,6 +391,7 @@
        capacity: this.pageSize,
        page: this.page,
        model: {
          status: 0,
          billType: this.type,
          contractId: this.info.id
        }
admin/src/views/contract/components/contractEdit.vue
@@ -1,6 +1,4 @@
<template>
<!--  :text="activeTabs === 0 ? '下一步' : '提交'"-->
<!--  :backText="activeTabs === 0 ? '返回' : '上一步'"-->
  <GlobalWindow
    width="100%"
    :title="title"
@@ -42,7 +40,7 @@
                <el-date-picker type="date" v-model="form.endDate" @change="getHouseData" :clearable="false" value-format="yyyy-MM-dd" placeholder="请选择" />
              </el-form-item>
              <el-form-item label="归属项目" prop="projectId">
                <el-select v-model="form.projectId" placeholder="请选择">
                <el-select v-model="form.projectId" @change="getHouseTree" placeholder="请选择">
                  <el-option v-for="(item, index) in projectList" :key="index" :value="item.id" :label="item.name"></el-option>
                </el-select>
              </el-form-item>
@@ -65,8 +63,11 @@
                  <el-input v-model="form.renterName" readonly placeholder="请点击选择租客" />
                </div>
              </el-form-item>
              <el-form-item label="联系人" prop="memberName">
                <el-input v-model="form.memberName" readonly placeholder="请点击选择租客" />
              <el-form-item label="联系人" prop="memberId">
                <el-select v-model="form.memberId" placeholder="请选择">
                  <el-option v-for="(item, index) in contactsList" :key="index" :value="item.id" :label="item.name"></el-option>
                </el-select>
<!--                <el-input v-model="form.memberName" readonly placeholder="请点击选择租客" />-->
              </el-form-item>
            </div>
          </el-form>
@@ -81,6 +82,12 @@
            :default-expanded-keys="ids"
            :default-checked-keys="ids"
            :props="{ children: 'projectDataVOList', label: 'name' }">
            <span class="custom-tree-node" style="width: 100%; display: flex; align-items: center; justify-content: space-between;" slot-scope="{ node, data }">
              <span>{{ data.name }}</span>
              <span style="color: #2080f7;" v-if="data.lv === 3">
                {{ data.area }}㎡
              </span>
            </span>
          </el-tree>
        </div>
      </div>
@@ -117,10 +124,10 @@
              <div class="m_title">租赁信息</div>
              <div class="list">
                <el-form-item label="押金金额(元)" prop="zlDeposit">
                  <el-input v-model="form.zlDeposit" placeholder="请输入" v-trim />
                  <el-input v-model="form.zlDeposit" @input="clearzl" placeholder="请输入" v-trim />
                </el-form-item>
                <el-form-item label="付款方式" prop="zlPayType">
                  <el-select v-model="form.zlPayType" placeholder="请选择">
                  <el-select v-model="form.zlPayType" @change="clearzl" placeholder="请选择">
                    <el-option v-for="(item, index) in payMethods" :key="index" :value="item.value" :label="item.name"></el-option>
                  </el-select>
                </el-form-item>
@@ -134,20 +141,26 @@
                <el-button type="text" size="medium" @click="addZl">增加</el-button>
              </div>
              <div class="list">
                <div v-for="(item, index) in form.zlDetailList" :key="index">
                  <el-form-item label="起始日期" prop="time">
                    <el-date-picker type="daterange" v-model="item.time" @change="getDate1($event, index)" value-format="yyyy-MM-dd" placeholder="请选择" />
                <div style="width: 100%; display: flex; flex-wrap: wrap;" v-for="(zlDetailList, index) in form.zlDetailList" :key="index">
                  <el-form-item label="起始日期" :prop="'zlDetailList.' + index + '.time'" :rules="{
                    required: true, message: '请选择', trigger: 'blur'
                  }">
                    <el-date-picker type="daterange" v-model="zlDetailList.time" @change="getDate1($event, index)" value-format="yyyy-MM-dd" placeholder="请选择" />
                  </el-form-item>
                  <el-form-item label="合同单价" prop="price">
                    <el-input placeholder="请输入" v-model="item.price" class="input-with-select">
                      <el-select v-model="item.circleType" style="width: 150px;" slot="append" placeholder="请选择">
                  <el-form-item label="合同单价" :prop="'zlDetailList.' + index + '.price'" :rules="{
                    required: true, message: '请输入', trigger: 'blur'
                  }">
                    <el-input placeholder="请输入" v-model="zlDetailList.price" @input="clearzl" class="input-with-select">
                      <el-select v-model="zlDetailList.circleType" @change="clearzl" style="width: 150px;" slot="append" placeholder="请选择">
                        <el-option v-for="(item, index) in unitOps" :key="index" :value="item.value" :label="item.name"></el-option>
                      </el-select>
                    </el-input>
                  </el-form-item>
                  <el-form-item label="付款提前天数" prop="advanceDays">
                  <el-form-item label="付款提前天数" :prop="'zlDetailList.' + index + '.advanceDays'" :rules="{
                    required: true, message: '请输入', trigger: 'blur'
                  }">
                    <div style="display: flex; align-items: center; justify-content: space-between;">
                      <el-input v-model="item.advanceDays" placeholder="请输入" v-trim />
                      <el-input v-model="zlDetailList.advanceDays" @input="clearzl" placeholder="请输入" v-trim />
                      <el-link :underline="false" type="danger" @click="deleZl(index)" style="margin-left: 20px; flex-shrink: 0;">删除</el-link>
                    </div>
                  </el-form-item>
@@ -172,7 +185,7 @@
          </el-table-column>
          <el-table-column label="期数" align="center" show-overflow-tooltip>
            <template slot-scope="{row}">
              <el-tag type="success">{{row.sortnum}}</el-tag>
              <el-tag type="success" v-if="row.sortnum > 0">{{row.sortnum}}</el-tag>
            </template>
          </el-table-column>
          <el-table-column label="区间" align="center" show-overflow-tooltip>
@@ -200,10 +213,10 @@
              <div class="m_title">物业信息</div>
              <div class="list">
                <el-form-item label="物业押金" prop="wyDeposit">
                  <el-input v-model="form.wyDeposit" placeholder="请输入" v-trim />
                  <el-input v-model="form.wyDeposit" @input="clearwy" placeholder="请输入" v-trim />
                </el-form-item>
                <el-form-item label="付款方式" prop="wyPayType">
                  <el-select v-model="form.wyPayType" placeholder="请选择">
                  <el-select v-model="form.wyPayType" @change="clearwy" placeholder="请选择">
                    <el-option v-for="(item, index) in payMethods" :key="index" :value="item.value" :label="item.name"></el-option>
                  </el-select>
                </el-form-item>
@@ -217,20 +230,26 @@
                <el-button type="text" size="medium" @click="addWy">增加</el-button>
              </div>
              <div class="list">
                <div v-for="(item, index) in form.wyDetailList" :key="index">
                  <el-form-item label="起始日期" prop="time">
                    <el-date-picker type="daterange" v-model="item.time" @change="getDate2($event, index)" value-format="yyyy-MM-dd" placeholder="请选择" />
                <div style="width: 100%; display: flex; flex-wrap: wrap;" v-for="(wyDetailList, index) in form.wyDetailList" :key="index">
                  <el-form-item label="起始日期" :prop="'wyDetailList.' + index + '.time'" :rules="{
                    required: true, message: '请输入', trigger: 'blur'
                  }">
                    <el-date-picker type="daterange" v-model="wyDetailList.time" @change="getDate2($event, index)" value-format="yyyy-MM-dd" placeholder="请选择" />
                  </el-form-item>
                  <el-form-item label="合同单价" prop="price">
                    <el-input placeholder="请输入" v-model="item.price">
                      <el-select v-model="item.circleType" style="width: 150px;" slot="append" placeholder="请选择">
                  <el-form-item label="合同单价" :prop="'wyDetailList.' + index + '.price'" :rules="{
                    required: true, message: '请输入', trigger: 'blur'
                  }">
                    <el-input placeholder="请输入" @input="clearwy" v-model="wyDetailList.price">
                      <el-select v-model="wyDetailList.circleType" @change="clearwy" style="width: 150px;" slot="append" placeholder="请选择">
                        <el-option v-for="(item, index) in unitOps" :key="index" :value="item.value" :label="item.name"></el-option>
                      </el-select>
                    </el-input>
                  </el-form-item>
                  <el-form-item label="付款提前天数" prop="advanceDays">
                  <el-form-item label="付款提前天数" :prop="'wyDetailList.' + index + '.advanceDays'" :rules="{
                    required: true, message: '请输入', trigger: 'blur'
                  }">
                    <div style="display: flex; align-items: center; justify-content: space-between;">
                      <el-input v-model="item.advanceDays" placeholder="请输入" v-trim />
                      <el-input v-model="wyDetailList.advanceDays" @input="clearwy" placeholder="请输入" v-trim />
                      <el-link :underline="false" type="danger" @click="deleWy(index)" style="margin-left: 20px; flex-shrink: 0;">删除</el-link>
                    </div>
                  </el-form-item>
@@ -255,7 +274,7 @@
          </el-table-column>
          <el-table-column label="期数" align="center" show-overflow-tooltip>
            <template slot-scope="{row}">
              <el-tag type="success">{{row.sortnum}}</el-tag>
              <el-tag type="success" v-if="row.sortnum > 0">{{row.sortnum}}</el-tag>
            </template>
          </el-table-column>
          <el-table-column label="区间" align="center" show-overflow-tooltip>
@@ -294,6 +313,7 @@
import MemberSearch from '@/components/common/MemberSearch'
import { rules } from './config'
import { create, getBillList } from '@/api/contract'
import { ywList } from '@/api/customer'
import { getUserList } from '@/api/system/user'
import { getProjectList, tree } from '@/api/project/ywProject'
import { companyList } from '@/api/company'
@@ -335,6 +355,7 @@
        zlDate: [],
        zlDetailList: [
          {
            circleType: 0,
            startDate: '',
            endDate: '',
            time: [],
@@ -350,6 +371,7 @@
        wyDate: [],
        wyDetailList: [
          {
            circleType: 0,
            startDate: '',
            endDate: '',
            time: [],
@@ -367,6 +389,8 @@
      wyList: [],
      
      rules,
      contactsList: [],
      loadingInstance: null,
      uploadImgUrl: process.env.VUE_APP_API_PREFIX + '/visitsAdmin/cloudService/public/uploadBatch',
@@ -388,7 +412,7 @@
        { name: '一次性付款', value: 0 },
        { name: '3个月一付', value: 1 },
        { name: '6个月一付', value: 2 },
        { name: '1年一付', value: 2 },
        { name: '1年一付', value: 3 },
      ],
      unitOps: [
        { name: '元/m²·天', value: 0 },
@@ -407,6 +431,9 @@
    open (title, target) {
      this.title = title
      this.ids = []
      this.houseList = []
      this.zlPrice = ''
      this.wyPrice = ''
      this.getUser()
      this.getProject()
      this.getCompany()
@@ -420,31 +447,41 @@
            this.form[key] = ''
          }
        }
        this.form.zlDetailList = [
          {
            startDate: '',
            endDate: '',
            time: [],
            price: '',
            advanceDays: ''
          }
        ]
        this.form.wyDetailList = [
          {
            startDate: '',
            endDate: '',
            time: [],
            price: '',
            advanceDays: ''
          }
        ]
        this.wyList = []
        this.zlList = []
        this.form.userId = this.userInfo.id
        this.form.signDate = this.getDayTime()
        this.form.startDate = this.getDayTime()
        this.form.endDate = this.getDayTime(1)
        this.getHouseTree()
        this.form.zlDetailList = [
          {
            circleType: 0,
            startDate: this.form.startDate,
            endDate: this.form.endDate,
            time: [this.form.startDate, this.form.endDate],
            price: '',
            advanceDays: ''
          }
        ]
        this.form.wyDetailList = [
          {
            circleType: 0,
            startDate: this.form.startDate,
            endDate: this.form.endDate,
            time: [this.form.startDate, this.form.endDate],
            price: '',
            advanceDays: ''
          }
        ]
        // this.getHouseTree()
      })
    },
    // èŽ·å–è”ç³»äºº
    getYwList () {
      ywList({
        customerId: this.form.renterId
      }).then(res => {
        this.contactsList = res
      })
    },
    getHouseData () {
@@ -467,13 +504,45 @@
      if (!num) {
        return `${year}-${month < 10 ? '0' + month : month}-${day < 10 ? '0' + day : day}`;
      } else {
        return `${year + 1}-${month < 10 ? '0' + month : month}-${day < 10 ? '0' + day : day}`;
        return `${year + 1}-${month < 10 ? '0' + month : month}-${day < 10 ? '0' + day - 1 : day - 1}`;
      }
    },
    clearData () {
      this.form.zlDetailList = [
        {
          circleType: 0,
          startDate: this.form.startDate,
          endDate: this.form.endDate,
          time: [this.form.startDate, this.form.endDate],
          price: '',
          advanceDays: ''
        }
      ]
      this.form.wyDetailList = [
        {
          circleType: 0,
          startDate: this.form.startDate,
          endDate: this.form.endDate,
          time: [this.form.startDate, this.form.endDate],
          price: '',
          advanceDays: ''
        }
      ]
    },
    clearzl () {
      this.zlList = []
      this.zlPrice = ''
    },
    clearwy () {
      this.wyList = []
      this.wyPrice = ''
    },
    confirm () {
      var that = this
      if (this.activeTabs === 0) {
        this.$refs.form.validate((valid) => {
          if (!valid) return
          if (this.form.roomIds.length === 0) return this.$message.warning('请选择房源!')
          this.activeTabs = 1
        })
      } else if (this.activeTabs === 1) {
@@ -486,6 +555,8 @@
              if (!valid2) {
                return
              }
              if (that.zlList.length === 0) return that.$message.warning('请先生成租赁账单!')
              if (that.wyList.length === 0) return that.$message.warning('请先生成物业账单!')
              this.submit()
            })
          })
@@ -494,6 +565,7 @@
            if (!valid1) {
              return
            }
            if (that.zlList.length === 0) return that.$message.warning('请先生成租赁账单!')
            this.submit()
          })
        } else if (this.form.type === 1) {
@@ -501,6 +573,7 @@
            if (!valid2) {
              return
            }
            if (that.wyList.length === 0) return that.$message.warning('请先生成物业账单!')
            this.submit()
          })
        }
@@ -522,10 +595,12 @@
    getDate1 (e, index) {
      this.form.zlDetailList[index].startDate = e[0]
      this.form.zlDetailList[index].endDate = e[1]
      this.clearzl()
    },
    getDate2 (e, index) {
      this.form.wyDetailList[index].startDate = e[0]
      this.form.wyDetailList[index].endDate = e[1]
      this.clearwy()
    },
    checkHouseRoom (a, b) {
      this.ids = b.checkedKeys
@@ -539,7 +614,8 @@
    getHouseTree () {
      tree({
        startDate: this.form.startDate,
        endDate: this.form.endDate
        endDate: this.form.endDate,
        projectId: this.form.projectId
      })
        .then(res => {
          res.forEach(item => {
@@ -576,6 +652,7 @@
    generateWY () {
      getBillList({ ...this.form, billType: 1 })
        .then(res => {
          this.wy = true
          let zlPrice = 0
          let arr = []
          res.forEach(item => {
@@ -590,18 +667,20 @@
    },
    addZl () {
      this.form.zlDetailList.push({
        startDate: '',
        endDate: '',
        time: [],
        circleType: 0,
        startDate: this.form.startDate,
        endDate: this.form.endDate,
        time: [this.form.startDate, this.form.endDate],
        price: '',
        advanceDays: ''
      })
    },
    addWy () {
      this.form.wyDetailList.push({
        startDate: '',
        endDate: '',
        time: [],
        circleType: 0,
        startDate: this.form.startDate,
        endDate: this.form.endDate,
        time: [this.form.startDate, this.form.endDate],
        price: '',
        advanceDays: ''
      })
@@ -609,24 +688,29 @@
    deleZl(index) {
      if (this.form.zlDetailList.length === 1) return Message.warning('至少保留一条!')
      this.form.zlDetailList.splice(index, 1)
      this.clearzl()
    },
    deleWy(index) {
      if (this.form.wyDetailList.length === 1) return Message.warning('至少保留一条!')
      this.form.wyDetailList.splice(index, 1)
      this.clearwy()
    },
    getZLDate (e) {
      this.form.zlFreeStartDate = e[0]
      this.form.zlFreeEndDate = e[1]
      this.clearzl()
    },
    getWYDate (e) {
      this.form.wyFreeStartDate = e[0]
      this.form.wyFreeEndDate = e[1]
      this.clearwy()
    },
    getTenant (row) {
      this.form.renterId = row.id
      this.form.renterName = row.name
      this.form.memberId = row.memberId
      this.form.memberName = row.memberName
      this.form.memberId = ''
      this.form.memberName = ''
      this.getYwList()
    },
    dele (imgaddr) {
      this.form.fileList.forEach((item, index) => {
@@ -718,6 +802,7 @@
  position: sticky;
  top: 0;
  left: 0;
  z-index: 999;
}
.tabs {
  border-bottom: 1px solid #DFE2E8;
admin/src/views/contract/components/terminateLease.vue
@@ -84,6 +84,7 @@
                    label="账单编号">
                </el-table-column>
                <el-table-column
                    width="100"
                    label="费用类型">
                    <template slot-scope="{row}">
                        <span v-if="row.costType === 0">租赁费</span>
@@ -103,13 +104,14 @@
                    label="应收付金额/原始应收付">
                    <template v-slot="{row}">
                        <div style="display: flex; align-items: center;">
                            <el-input v-model="row.receivableFee" @input="changeReceivableFee($event, row)" placeholder="请输入内容" style="width: 90px;"></el-input>
                            <el-input v-model="row.receivableFee" @input="changeReceivableFee($event, row)" placeholder="请输入内容" style="flex: 1;"></el-input>
                            <span style="margin: 0 10px;">/</span>
                            {{row.receivableFeeCopy}}
                        </div>
                    </template>
                </el-table-column>
                <el-table-column
                    width="120"
                    prop="actReceivableFee"
                    label="实收/付金额">
                </el-table-column>
@@ -247,26 +249,6 @@
        loading: false
      }
    },
    watch: {
      // info: {
      //   deep: true,
      //   immediate: true,
      //   handler(news, olds) {
      //     const arr = [...this.info.terminateList, ...this.info.depositList]
      //     let total1 = 0
      //     let total2 = 0
      //     arr.forEach(item => {
      //       if (item.billType === 0) {
      //         total1 += Number(item.price)
      //       } else if (item.billType === 1) {
      //         total2 += Number(item.price)
      //       }
      //     })
      //     this.receivable = total1
      //     this.meet = total2
      //   }
      // }
    },
    methods: {
      open (title, info) {
        this.title = title
@@ -279,12 +261,12 @@
          this.$refs.form.resetFields()
        })
        this.info.canBackRentBills.forEach(item => {
          this.$set(item, 'receivableFeeCopy', item.receivableFee)
          this.$set(item, 'receivableFee', item.needReceivableFee)
          if ([2,3,7].includes(item.costType)) {
            this.$set(item, 'billType', 1)
            this.$set(item, 'price', item.actReceivableFee)
          } else {
            this.$set(item, 'receivableFeeCopy', item.receivableFee)
            this.$set(item, 'receivableFee', item.needReceivableFee)
            this.$set(item, 'price', item.needReceivableFee)
          }
        })
@@ -315,8 +297,8 @@
            total2 += Number(item.price)
          }
        })
        this.receivable = total1
        this.meet = total2
        this.receivable = total1.toFixed(2)
        this.meet = total2.toFixed(2)
      },
      getDay () {
        const today = new Date();
admin/src/views/contract/contractList.vue
@@ -15,14 +15,8 @@
        <el-table-column prop="zlFirstPrice" label="租赁单价" min-width="100" show-overflow-tooltip>
            <template slot-scope="{row}">
                <div style="display: flex; align-items: center;">
                    <span>{{row.zlFirstPrice}}</span>
                    <span v-if="row.zlFirstCircle === 0">元/m²·天</span>
                    <span v-if="row.zlFirstCircle === 1">元/m²·月</span>
                    <span v-if="row.zlFirstCircle === 2">元/天</span>
                    <span v-if="row.zlFirstCircle === 3">元/月</span>
                    <span v-if="row.zlFirstCircle === 4">元/å¹´</span>
                    <span v-if="row.zlFirstCircle === 5">元/m²·年</span>
                    <span v-if="row.zlFirstCircle === 6">元/场</span>
                    <span>{{row.zlFirstPrice || row.wyFirstPrice}}</span>
                    <span>{{row.zlFirstCircleStr || row.wyFirstCircleStr}}</span>
                </div>
            </template>
        </el-table-column>
admin/src/views/finance/bull.vue
@@ -33,9 +33,13 @@
        </template>
      </el-table-column>
      <el-table-column prop="totleFee" label="账单金额" min-width="100" show-overflow-tooltip />
      <el-table-column prop="receivableFee" label="应收金额" min-width="100" show-overflow-tooltip />
      <el-table-column prop="actReceivableFee" label="实收金额" min-width="100" show-overflow-tooltip />
      <el-table-column prop="needReceivableFee" label="需收金额" min-width="100" show-overflow-tooltip />
      <el-table-column prop="receivableFee" :label="`应${billType === 0 ? '收' : '付'}金额`" min-width="100" show-overflow-tooltip />
      <el-table-column prop="actReceivableFee" :label="`实${billType === 0 ? '收' : '付'}金额`" min-width="100" show-overflow-tooltip />
      <el-table-column :label="`需收/付金额`" min-width="100" show-overflow-tooltip>
        <template slot-scope="{row}">
          {{Math.abs(row.needReceivableFee)}}
        </template>
      </el-table-column>
      <el-table-column label="费用类型" min-width="100" show-overflow-tooltip>
        <template slot-scope="{row}">
          <span v-if="row.costType === 0">租赁费</span>
@@ -59,7 +63,7 @@
          {{ row.startDate }} ~ {{ row.endDate }}
        </template>
      </el-table-column>
      <el-table-column prop="planPayDate" label="应收日期" min-width="100" show-overflow-tooltip />
      <el-table-column prop="planPayDate" :label="`应${billType === 0 ? '收' : '付'}日期`" min-width="100" show-overflow-tooltip />
      <el-table-column label="账单来源" min-width="100" show-overflow-tooltip>
        <template slot-scope="{row}">
          <span v-if="row.type === 0">合同账单</span>
@@ -145,8 +149,8 @@
              { value: 0, label: '待收款' },
              { value: 1, label: '已结算' },
              { value: 2, label: '部分结清' },
              { value: 3, label: '待退款' },
              { value: 4, label: '待付款' }
              { value: 3, label: '待付款' },
              { value: 4, label: '待退款' }
            ]
          },
          {
admin/src/views/finance/components/bullDetail.vue
@@ -1,63 +1,68 @@
<template>
  <GlobalWindow :title="'账单详情'" :visible.sync="visible" :confirm-working="isWorking" @close="close"
    @confirm="confirm">
    <div class="home_title">
      <div class="left">
        <span class="mr10">付款方:{{info.customerName}}</span>
        <el-tag type="success" v-if="info.status === 0">开启</el-tag>
        <el-tag type="info" v-if="info.status === 1">关闭</el-tag>
    <div style="width: 100%; position: sticky; top: 0; left: 0; z-index: 999; background: #ffffff;">
      <div class="home_title">
        <div class="left">
          <span class="mr10">付款方:{{info.customerName}}</span>
          <el-tag type="success" v-if="info.status === 0">开启</el-tag>
          <el-tag type="info" v-if="info.status === 1">关闭</el-tag>
        </div>
        <el-button plain type="primary" v-if="![1].includes(info.payStatus)" @click="$refs.flowingWater.open('创建收支流水', {
          billType: returnBillType(),
          billId: info.id,
          costType: info.costType,
          receivableFee: Math.abs(info.needReceivableFee),
          costTypeName: returnText(info.costType),
          contractCode: info.contractCode,
          contractId: info.contractId,
          startDate: info.startDate,
          endDate: info.endDate,
          multifileList: [],
          date: `${info.startDate} ~ ${info.endDate}`,
          companyId: info.companyId,
          companyName: info.companyName,
          actReceivableFee: Math.abs(info.needReceivableFee),
          needReceivableFeeCopy: info.needReceivableFee
        })">新建收支流水</el-button>
      </div>
      <el-button plain type="primary" @click="$refs.flowingWater.open('创建收支流水', {
        billType: info.billType,
        billId: info.id,
        costType: info.costType,
        receivableFee: info.needReceivableFee,
        costTypeName: returnText(info.costType),
        contractCode: info.contractCode,
        contractId: info.contractId,
        startDate: info.startDate,
        endDate: info.endDate,
        multifileList: [],
        date: `${info.startDate} ~ ${info.endDate}`,
        companyId: info.companyId,
        companyName: info.companyName,
        actReceivableFee: info.actReceivableFee
      })">新建收支流水</el-button>
    </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;" v-if="info.payStatus === 0">待收款</div>
          <div class="val" style="margin-top: 10px;" v-if="info.payStatus === 1">已结清</div>
          <div class="val" style="margin-top: 10px;" v-if="info.payStatus === 2">部分结清</div>
          <div class="val" style="margin-top: 10px;" v-if="info.payStatus === 3">待付款</div>
          <div class="val" style="margin-top: 10px;" v-if="info.payStatus === 4">待退款</div>
          <div class="val" style="margin-top: 10px;" v-if="info.payStatus === 5">已关闭</div>
        </div>
        <div class="item" style="flex: 1;">
          <div class="la">应{{info.billType === 0 ? '收' : '付'}}金额(元)</div>
          <div class="val" style="margin-top: 10px;">{{info.receivableFee}}</div>
        </div>
        <div class="item" style="flex: 1;">
          <div class="la">实{{info.billType === 0 ? '收' : '付'}}金额(元)</div>
          <div class="val" style="margin-top: 10px;">{{info.actReceivableFee}}</div>
        </div>
        <div class="item" style="flex: 1;">
          <div class="la">需{{info.billType === 0 ? '收' : '付'}}金额(元)</div>
          <div class="val" style="margin-top: 10px;">{{info.needReceivableFee}}</div>
        </div>
        <div class="item" style="flex: 1;">
          <div class="la">应{{info.billType === 0 ? '收' : '付'}}日期</div>
          <div class="val" style="margin-top: 10px;">{{info.planPayDate}}</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;" v-if="info.payStatus === 0">待收款</div>
            <div class="val" style="margin-top: 10px;" v-if="info.payStatus === 1">已结清</div>
            <div class="val" style="margin-top: 10px;" v-if="info.payStatus === 2">部分结清</div>
            <div class="val" style="margin-top: 10px;" v-if="info.payStatus === 3">待付款</div>
            <div class="val" style="margin-top: 10px;" v-if="info.payStatus === 4">待退款</div>
            <div class="val" style="margin-top: 10px;" v-if="info.payStatus === 5">已关闭</div>
          </div>
          <div class="item" style="flex: 1;">
            <div class="la">应{{info.billType === 0 ? '收' : '付'}}金额(元)</div>
            <div class="val" style="margin-top: 10px;">{{info.receivableFee}}</div>
          </div>
          <div class="item" style="flex: 1;">
            <div class="la">实{{info.billType === 0 ? '收' : '付'}}金额(元)</div>
            <div class="val" style="margin-top: 10px;">{{info.actReceivableFee}}</div>
          </div>
          <div class="item" style="flex: 1;">
            <template v-if="info.billType === 1">
              <div class="la">需付金额(元)</div>
            </template>
            <div class="la" v-else>需{{info.needReceivableFee > 0 ? '收' : '付'}}金额(元)</div>
            <div class="val" style="margin-top: 10px;">{{Math.abs(info.needReceivableFee)}}</div>
          </div>
          <div class="item" style="flex: 1;">
            <div class="la">应{{info.billType === 0 ? '收' : '付'}}日期</div>
            <div class="val" style="margin-top: 10px;">{{info.planPayDate}}</div>
          </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="tabs">
        <div class="tab" :class="{ active: activeTabs == 0 }" @click="tabsClick(0)">基础信息</div>
        <div class="tab" :class="{ active: activeTabs == 2 }" @click="tabsClick(2)">收支流水</div>
      </div>
    </div>
    <div class="main">
      <div class="title">基础信息</div>
@@ -80,7 +85,7 @@
        </div>
        <div class="item">
          <div class="la">合同编号</div>
          <div class="val">{{info.contractCode}}</div>
          <div class="val" style="color: #2080f7; cursor: pointer;" @click="handleDetail(info.contractId)">{{info.contractCode}}</div>
        </div>
        <div class="item">
          <div class="la">创建时间</div>
@@ -183,6 +188,8 @@
    </div>
    <!--  åˆ›å»ºæµæ°´  -->
    <FlowingWater ref="flowingWater" @success="getDetails" @refresh="Refresh" />
    <!--  åˆåŒè¯¦æƒ…  -->
    <ContractDetail ref="ContractDetailRef" />
  </GlobalWindow>
</template>
@@ -190,11 +197,13 @@
import GlobalWindow from '@/components/common/GlobalWindow'
import BaseOpera from '@/components/base/BaseOpera'
import FlowingWater from './flowingWater'
import ContractDetail from '../../contract/components/contractDetail'
import { getYwContractBillById } from '@/api/contract'
export default {
  components: {
    GlobalWindow,
    FlowingWater
    FlowingWater,
    ContractDetail
  },
  extends: BaseOpera,
  data() {
@@ -212,6 +221,9 @@
      this.id = id
      this.getDetails()
    },
    handleDetail (id) {
      this.$refs.ContractDetailRef.open('合同详情', id)
    },
    getDetails () {
      getYwContractBillById(this.id)
        .then(res => {
@@ -219,6 +231,15 @@
          this.visible = true
        })
    },
    returnBillType () {
      if (this.info.payStatus === 0) {
        return 0
      } else if (this.info.payStatus === 2) {
        return this.info.billType
      } else if ([3,4].includes(this.info.payStatus)) {
        return 1
      }
    },
    Refresh () {
      this.$emit('success')
    },
admin/src/views/finance/components/bullEdit.vue
@@ -18,7 +18,7 @@
              </el-select>
            </el-form-item>
            <el-form-item label="付款方" prop="renterName">
                <el-input v-model="form.renterName" disabled placeholder="请输入应收金额" v-trim />
                <el-input v-model="form.renterName" disabled placeholder="付款方" v-trim />
            </el-form-item>
            <el-form-item label="房源" prop="ywContractRoomList">
              <el-select v-model="form.ywContractRoomList" @click="clickHouse" multiple placeholder="请选择">
admin/src/views/finance/components/details.vue
@@ -1,5 +1,5 @@
<template>
    <GlobalWindow :title="title" :visible.sync="visible" :confirm-working="isWorking" @close="close"
    <GlobalWindow :title="title" :withFooter="false" :visible.sync="visible" :confirm-working="isWorking" @close="close"
        @confirm="confirm">
        <div class="home_title">
            <div class="left">
admin/src/views/finance/components/flowingWater.vue
@@ -17,10 +17,10 @@
                        <el-form-item label="计费周期" required>
                            <el-input v-model="form.date" disabled placeholder="请输入" v-trim />
                        </el-form-item>
                        <el-form-item label="应收金额" required>
                        <el-form-item :label="`应${form.needReceivableFeeCopy > 0 ? '收' : '付'}金额`" required>
                            <el-input v-model="form.receivableFee" disabled placeholder="请输入" v-trim />
                        </el-form-item>
                        <el-form-item label="实收金额" prop="actReceivableFee">
                        <el-form-item :label="`实${form.needReceivableFeeCopy > 0 ? '收' : '付'}金额`" prop="actReceivableFee">
                            <el-input v-model="form.actReceivableFee" placeholder="请输入" v-trim />
                        </el-form-item>
                        <el-form-item label="入账日期" prop="actPayDate">
@@ -110,7 +110,8 @@
          remark: '',
          accountId: '',
          multifileList: [],
          costTypeName: ''
          costTypeName: '',
          needReceivableFeeCopy: ''
        },
        rules: {
          receivableFee: [
admin/src/views/login.vue
@@ -138,6 +138,7 @@
            }
            Cookies.set('dm_user_token', res)
            window.location.href = process.env.VUE_APP_CONTEXT_PATH
            // this.$router.push('')
          })
          .catch(e => {
            this.refreshCaptcha()
admin/src/views/operation/components/deviceDetail.vue
@@ -1,5 +1,5 @@
<template>
  <GlobalWindow width="720px" title="工单详情" :visible.sync="visible" :confirm-working="isWorking" @close="close"
  <GlobalWindow width="720px" title="设备详情" :visible.sync="visible" :confirm-working="isWorking" @close="close"
    @confirm="confirm">
    <div class="main">
      <div class="title">
@@ -25,7 +25,7 @@
          </div>
          <div class="item">
            <div class="la">设备管理员</div>
            <div class="val">{{ info.realName }}</div>
            <div class="val">{{ info.realName || info.realname }}</div>
          </div>
          <div class="item">
            <div class="la">所在位置</div>
@@ -138,7 +138,7 @@
    .item {
      width: 33.3%;
      margin-bottom: 12px;
      margin-bottom: 14px;
      .photo {
        width: 92px;
@@ -147,7 +147,7 @@
      .la {
        color: #7f7f7f;
        margin-top: 2px;
        margin-bottom: 6px;
      }
    }
admin/src/views/operation/components/maintainDetail.vue
@@ -90,10 +90,11 @@
    .item {
      width: 33.33%;
      margin-bottom: 8px;
      margin-bottom: 14px;
      .la {
        color: #7f7f7f
        color: #7f7f7f;
        margin-bottom: 6px;
      }
    }
    .max{
admin/src/views/project/buildingList.vue
@@ -35,7 +35,7 @@
        <el-table-column prop="projectName" label="所属项目" min-width="100px"></el-table-column>
        <el-table-column prop="code" label="楼宇编码" min-width="80px"></el-table-column>
        <el-table-column prop="area" label="建筑面积(m²)" min-width="80px"></el-table-column>
        <el-table-column prop="cqArea" label="管理面积(m²)" min-width="80px"></el-table-column>
        <el-table-column prop="manageArea" label="管理面积(m²)" min-width="80px"></el-table-column>
        <el-table-column prop="roomNum" label="房间总数(间)" min-width="80px"></el-table-column>
        <el-table-column prop="roomRentNum" label="可招商房源数量(间)" min-width="100px"></el-table-column>
        <el-table-column v-if="containPermissions(['business:ywbuilding:update', 'business:ywbuilding:delete'])"
admin/src/views/project/components/OperaYwBuildingWindow.vue
@@ -19,7 +19,7 @@
        <el-input type="textarea" :rows="4" v-model="form.remark" placeholder="请输入" />
      </el-form-item>
      <el-form-item label="建筑面积(m²)" prop="area">
        <el-input v-model="form.area" placeholder="请输入简直面积(m²)" v-trim />
        <el-input v-model="form.area" placeholder="请输入建筑面积(m²)" v-trim />
      </el-form-item>
      <el-form-item label="产权面积(m²)" prop="cqArea">
        <el-input v-model="form.cqArea" placeholder="请输入产权面积(m²)" v-trim />
admin/src/views/project/projectList.vue
@@ -22,7 +22,7 @@
      <el-table v-loading="isWorking.search" :data="tableData.list" stripe @selection-change="handleSelectionChange">
        <el-table-column type="selection" width="55"></el-table-column>
        <el-table-column prop="name" label="项目名称" min-width="100px"></el-table-column>
        <el-table-column prop="area" label="管理面积(m)" min-width="100px"></el-table-column>
        <el-table-column prop="area" label="管理面积(m²)" min-width="100px"></el-table-column>
        <el-table-column prop="roomNum" label="总房源数量(间)" min-width="100px"></el-table-column>
        <el-table-column prop="roomRentNum" label="可招商房源数量(间)" min-width="100px"></el-table-column>
        <el-table-column v-if="containPermissions(['business:ywproject:update', 'business:ywproject:delete'])"
admin/src/views/system/user.vue
@@ -28,7 +28,7 @@
    <!-- è¡¨æ ¼å’Œåˆ†é¡µ -->
    <template v-slot:table-wrap>
      <ul class="toolbar" v-permissions="['system:user:create', 'system:user:delete']">
        <li v-permissions="['system:user:create']"><el-button icon="el-icon-plus" type="primary" @click="$refs.operaUserWindow.open('新建用户')">新建</el-button></li>
        <!-- <li v-permissions="['system:user:create']"><el-button icon="el-icon-plus" type="primary" @click="$refs.operaUserWindow.open('新建用户')">新建</el-button></li> -->
        <li v-permissions="['system:user:delete']"><el-button icon="el-icon-delete" @click="deleteByIdInBatch">删除</el-button></li>
      </ul>
      <el-table
admin/src/views/workorder/components/detail.vue
@@ -70,6 +70,7 @@
                <div class="name">{{ item.title }}</div>
                <div class="time">操作时间:{{ item.createDate }}</div>
                <div class="creator">操作人:{{ item.param1 }}</div>
                <div class="creator" v-if="item.param2">指派给:{{ item.param2 }}</div>
              </div>
            </div>
          </div>
@@ -330,11 +331,11 @@
    .item {
      width: 33.3%;
      margin-bottom: 12px;
      margin-bottom: 14px;
      .la {
        color: #7f7f7f;
        margin-top: 2px;
        margin-bottom: 6px;
      }
    }
admin/vue.config.js
@@ -1,13 +1,12 @@
// è¯¦ç»†é…ç½®è¯·å‚考https://cli.vuejs.org/zh/config/#vue-config-js
// const outputDir = process.env.VUE_APP_CONTEXT_PATH.substring(1, process.env.VUE_APP_CONTEXT_PATH.length - 1)
const path = require('path')
function resolve (dir) {
  return path.join(__dirname, dir)
}
module.exports = {
  publicPath: process.env.VUE_APP_CONTEXT_PATH,
  outputDir: 'admin',
  publicPath: './',
  outputDir: 'fn_admin',
  assetsDir: 'static',
  lintOnSave: false,
  devServer: {
h5/pages/login.vue
@@ -33,7 +33,7 @@
  data() {
    return {
      form: {
                phone: '17878787878',
                phone: '18888888888',
                code: '1'
      },
            downTime: 0
h5/pages/workOrder/detail.vue
@@ -23,9 +23,9 @@
                    <view class="la">上报人:</view>
                    <view class="val">{{ info.creatorName }}{{info.creatorCompany ? '-' + info.creatorCompany : ''}}</view>
                </view>
                <view class="line"  v-if="info.creatorPhone">
                <view class="line"  v-if="info.creatorPhone || info.creatorMobile">
                    <view class="la">联系电话:</view>
                    <view class="val">{{ info.creatorPhone }}</view>
                    <view class="val">{{ info.creatorMobile || info.creatorPhone }}</view>
                </view>
                <view class="line">
                    <view class="la">上报时间:</view>
server/system_service/src/main/java/com/doumee/core/utils/DateCompare.java
@@ -44,7 +44,10 @@
     */
    public static DateCompare dayCompare(Date fromDateOrigin,Date toDateOrigin,Date freeStart,Date freeEnd){
        //开始时间往后延伸,除去有效时期
        Date fromDate = DateUtil.addDaysToDate(fromDateOrigin,getIntersectingDays(fromDateOrigin,DateUtil.addDaysToDate(toDateOrigin,1),freeStart,DateUtil.addDaysToDate(freeEnd,1)));
        Date fromDate = DateUtil.addDaysToDate(fromDateOrigin,getIntersectingDays(fromDateOrigin,DateUtil.addDaysToDate(toDateOrigin,1),
                freeStart,
                Objects.isNull(freeEnd)?null:DateUtil.addDaysToDate(freeEnd,1))
        );
        if(toDateOrigin.getTime()<  fromDate.getTime()){
            return DateCompare.builder().day(0).month(0).year(0).yearFloat(new BigDecimal(0)).monthFloat(new BigDecimal(0)).build();
        }
@@ -141,6 +144,9 @@
    }
    public static int getIntersectingDays(Date start1, Date end1, Date start2, Date end2) {
        if(Objects.isNull(start2)||Objects.isNull(end2)){
            return 0;
        }
        Date earlierStart = DateUtil.daysBetweenDates(start1,start2)>0? start1 : start2;
        Date laterEnd =  DateUtil.daysBetweenDates(end2,end1)>0 ? end1 : end2;
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwProjectCloudController.java
@@ -7,6 +7,7 @@
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.core.utils.Constants;
import com.doumee.dao.business.dto.DataDTO;
import com.doumee.dao.business.model.YwProject;
import com.doumee.dao.business.model.YwRoom;
import com.doumee.dao.business.vo.ProjectDataVO;
@@ -90,8 +91,8 @@
    @ApiOperation("项目树")
    @PostMapping("/tree")
    @CloudRequiredPermission("business:ywproject:query")
    public ApiResponse<List<ProjectDataVO>> tree (@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        return ApiResponse.success(ywProjectService.projectTree());
    public ApiResponse<List<ProjectDataVO>> tree (@RequestBody DataDTO dataDTO, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        return ApiResponse.success(ywProjectService.projectTree(dataDTO));
    }
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/dto/DataDTO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,29 @@
package com.doumee.dao.business.dto;
import com.doumee.core.model.LoginUserInfo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Rk
 * @create 2024/5/20 14:54
 */
@Data
@ApiModel("日期查询类")
public class DataDTO {
    @ApiModelProperty(value = "项目主键")
    private Integer projectId;
    @ApiModelProperty(value = "开始日期: yyyy-MM-dd")
    private String startDate;
    @ApiModelProperty(value = "结束日期: yyyy-MM-dd")
    private String endDate;
}
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwBuilding.java
@@ -102,6 +102,10 @@
    @ExcelColumn(name="所属项目编码(关联yw_project)")
    private Integer projectId;
    @ApiModelProperty(value = "管理面积")
    @TableField(exist = false)
    private BigDecimal manageArea;
    @ApiModelProperty(value = "可招商房源数")
    @TableField(exist = false)
    private Integer roomRentNum;
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/ProjectDataVO.java
@@ -4,6 +4,7 @@
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
/**
@@ -21,6 +22,9 @@
    @ApiModelProperty(value = "业务名称")
    private String name;
    @ApiModelProperty(value = "面积")
    private BigDecimal area;
    @ApiModelProperty(value = "父级主键")
    private Integer pId;
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwProjectService.java
@@ -3,6 +3,7 @@
import com.doumee.core.model.LoginUserInfo;
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.dao.business.dto.DataDTO;
import com.doumee.dao.business.model.YwProject;
import com.doumee.dao.business.vo.ProjectDataVO;
@@ -99,5 +100,5 @@
    long count(YwProject ywProject);
    List<ProjectDataVO> projectTree();
    List<ProjectDataVO> projectTree(DataDTO dataDTO);
}
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/CategoryServiceImpl.java
@@ -135,7 +135,9 @@
        Utils.MP.blankToNull(pageWrap.getModel());
        queryWrapper.lambda().eq(Category::getIsdeleted,Constants.ZERO)
                .eq(Objects.nonNull(pageWrap.getModel().getType()),Category::getType,pageWrap.getModel().getType())
                .isNull(Category::getParentId);
                .isNull(Category::getParentId)
                .orderByAsc(Category::getSortnum)
        ;
        PageData<Category> categoryPageData = PageData.from(categoryMapper.selectPage(page, queryWrapper));
        //查询所有二级数据
        List<Category> categoryList = categoryMapper.selectList(
@@ -191,7 +193,7 @@
    private void checkUnique(Category category){
        QueryWrapper<Category> wrapper = new QueryWrapper<>();
        wrapper.lambda()
                .eq(Objects.nonNull(category.getId()),Category::getId,category.getId())
                .ne(Objects.nonNull(category.getId()),Category::getId,category.getId())
                .eq(Category::getIsdeleted,Constants.ZERO)
                .eq(Category::getType,category.getType())
                .eq(Category::getName,category.getName());
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
@@ -2118,9 +2118,6 @@
        ){
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        if(StringUtils.isNotBlank(member.getEmail())&&!Constants.validEmail(member.getEmail())){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"请填写正确的email");
        }
        LoginUserInfo loginUserInfo = member.getLoginUserInfo();
        member.setCreator(loginUserInfo.getId());
        member.setCreateDate(new Date());
@@ -2162,8 +2159,10 @@
    @Override
    public List<Member> ywList(Member member) {
        List<Member> memberList = memberMapper.selectList(new QueryWrapper<Member>()
                .lambda().eq(Member::getIsdeleted,Constants.ZERO)
                .lambda()
                .eq(Member::getIsdeleted,Constants.ZERO)
                        .eq(Member::getStatus,Constants.ZERO)
                .eq(Objects.nonNull(member.getCustomerId()),Member::getCustomerId,member.getCustomerId())
                .eq(Member::getType,Constants.memberType.customer)
        );
        return memberList;
@@ -2210,6 +2209,7 @@
                .and(Objects.nonNull(model)&&StringUtils.isNotBlank(model.getName()),i->i.like(Member::getName,model.getName()).or().like(
                        Member::getPhone,model.getName()
                ))
                .orderByDesc(Member::getCreateDate)
        );
        return PageData.from(iPage);
    }
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwBuildingServiceImpl.java
@@ -147,7 +147,8 @@
        Utils.MP.blankToNull(pageWrap.getModel());
        pageWrap.getModel().setIsdeleted(Constants.ZERO);
        queryWrapper.select(" (select count(1) from yw_room a where a.isdeleted=0 and a.BUILDING_ID=t.id) as roomNum "+
                ",(select count(1) from yw_room a where a.isdeleted=0 and a.BUILDING_ID=t.id and a.IS_INVESTMENT=1) as roomRentNum");
                ",(select count(1) from yw_room a where a.isdeleted=0 and a.BUILDING_ID=t.id and a.IS_INVESTMENT=1) as roomRentNum " +
                ", ( select ifnull(sum(a.RENT_AREA),0) from  yw_room a where a.isdeleted=0 and a.BUILDING_ID=t.id ) as manageArea");
        if (pageWrap.getModel().getId() != null) {
            queryWrapper.eq(YwBuilding::getId, pageWrap.getModel().getId());
        }
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwContractBillServiceImpl.java
@@ -98,11 +98,14 @@
            ywContractBill.setEndDate(ywContractBill.getPlanPayDate());
        }
        //查询合同下的最大的序号
        List<YwContractBill> ywContractBillList = ywContractBillMapper.selectList(new QueryWrapper<YwContractBill>().lambda().eq(YwContractBill::getContractId,ywContract.getId()).orderByDesc(YwContractBill::getId));
        List<YwContractBill> ywContractBillList = ywContractBillMapper.selectList(new QueryWrapper<YwContractBill>()
                .lambda().eq(YwContractBill::getContractId,ywContract.getId())
                .in(YwContractBill::getCostType,Constants.ZERO,Constants.SIX,Constants.FOUR,Constants.FIVE,7)
                .orderByDesc(YwContractBill::getId));
        if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(ywContractBillList)){
            ywContractBill.setSortnum(ywContractBillList.size() + 1 );
        }else{
            ywContractBill.setSortnum(Constants.ZERO);
            ywContractBill.setSortnum(0);
        }
        ywContractBillMapper.insert(ywContractBill);
@@ -186,7 +189,8 @@
    public YwContractBill getDetail(Integer id) {
        YwContractBill ywContractBill = ywContractBillMapper.selectJoinOne(YwContractBill.class,
                new MPJLambdaWrapper<YwContractBill>().selectAll(YwContractBill.class)
                        .select(" ( select ifnull(sum(case when yw.REVENUE_TYPE = 0 then yw.ACT_RECEIVABLE_FEE  else  -yw.ACT_RECEIVABLE_FEE end),0) from  yw_contract_revenue yw where yw.bill_id = t.id and yw.status = 0 and yw.isdeleted = 0 ) as  actReceivableFee  ")
                        //.select(" ( select ifnull(sum(case when yw.REVENUE_TYPE = 0 then yw.ACT_RECEIVABLE_FEE  else  -yw.ACT_RECEIVABLE_FEE end),0) from  yw_contract_revenue yw where yw.bill_id = t.id and yw.status = 0 and yw.isdeleted = 0 ) as  actReceivableFee  ")
                        .select(" ( select ifnull( sum( CASE WHEN t.bill_type = 0 and yw.REVENUE_TYPE = 0 THEN yw.ACT_RECEIVABLE_FEE when  t.bill_type = 0 and yw.REVENUE_TYPE = 1 then -yw.ACT_RECEIVABLE_FEE  when t.bill_type = 1 and yw.REVENUE_TYPE = 0 then -yw.ACT_RECEIVABLE_FEE else  yw.ACT_RECEIVABLE_FEE END),0) from  yw_contract_revenue yw where yw.bill_id = t.id and yw.status = 0 and yw.isdeleted = 0 ) as  actReceivableFee  ")
                        .selectAs(YwContract::getCode,YwContractBill::getContractCode)
                        .selectAs(YwCustomer::getName,YwContractBill::getCustomerName)
                        .selectAs(Company::getName,YwContractBill::getCompanyName)
@@ -276,7 +280,8 @@
        YwContractBill model = pageWrap.getModel();
        IPage<YwContractBill> iPage = ywContractBillMapper.selectJoinPage(page,YwContractBill.class,
            queryWrapper.selectAll(YwContractBill.class)
                    .select(" ( select ifnull(sum(case when yw.REVENUE_TYPE = 0 then yw.ACT_RECEIVABLE_FEE  else  -yw.ACT_RECEIVABLE_FEE end),0) from  yw_contract_revenue yw where yw.bill_id = t.id and yw.status = 0 and yw.isdeleted = 0 ) as  actReceivableFee  ")
//                    .select(" ( select ifnull(sum(case when yw.REVENUE_TYPE = 0 then yw.ACT_RECEIVABLE_FEE  else  -yw.ACT_RECEIVABLE_FEE end),0) from  yw_contract_revenue yw where yw.bill_id = t.id and yw.status = 0 and yw.isdeleted = 0 ) as  actReceivableFee  ")
                    .select(" ( select ifnull( sum( CASE WHEN t.bill_type = 0 and yw.REVENUE_TYPE = 0 THEN yw.ACT_RECEIVABLE_FEE when  t.bill_type = 0 and yw.REVENUE_TYPE = 1 then -yw.ACT_RECEIVABLE_FEE  when t.bill_type = 1 and yw.REVENUE_TYPE = 0 then -yw.ACT_RECEIVABLE_FEE else  yw.ACT_RECEIVABLE_FEE END),0) from  yw_contract_revenue yw where yw.bill_id = t.id and yw.status = 0 and yw.isdeleted = 0 ) as  actReceivableFee  ")
                    .selectAs(YwContract::getCode,YwContractBill::getContractCode)
                    .selectAs(YwCustomer::getName,YwContractBill::getCustomerName)
                    .leftJoin(YwContract.class,YwContract::getId,YwContractBill::getContractId)
@@ -297,8 +302,9 @@
                    .like(Objects.nonNull(model)&&StringUtils.isNotBlank(model.getContractCode()),
                            YwContract::getCode,model.getContractCode())
                .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())) )
        ;
                .le(Objects.nonNull(model)&&Objects.nonNull(model.getPlanPayDateEnd()),YwContractBill::getPlanPayDate, Utils.Date.getEnd(model.getPlanPayDateEnd()))
                    .orderByDesc(YwContractBill::getId));
        this.dealRoomDetail(iPage.getRecords());
        for (YwContractBill ywContractBill:iPage.getRecords()) {
            //需收金额
@@ -457,7 +463,8 @@
    public List<YwContractBill> getCanBackBill(YwContractBill model) {
        List<YwContractBill> list = ywContractBillMapper.selectJoinList(YwContractBill.class,
                new MPJLambdaWrapper<YwContractBill>().selectAll(YwContractBill.class)
                        .select(" ( select ifnull(sum(case when yw.REVENUE_TYPE = 0 then yw.ACT_RECEIVABLE_FEE  else  -yw.ACT_RECEIVABLE_FEE end),0) from  yw_contract_revenue yw where yw.bill_id = t.id and yw.status = 0 and yw.isdeleted = 0 ) as  actReceivableFee  ")
//                        .select(" ( select ifnull(sum(case when yw.REVENUE_TYPE = 0 then yw.ACT_RECEIVABLE_FEE  else  -yw.ACT_RECEIVABLE_FEE end),0) from  yw_contract_revenue yw where yw.bill_id = t.id and yw.status = 0 and yw.isdeleted = 0 ) as  actReceivableFee  ")
                        .select(" ( select ifnull( sum( CASE WHEN t.bill_type = 0 and yw.REVENUE_TYPE = 0 THEN yw.ACT_RECEIVABLE_FEE when  t.bill_type = 0 and yw.REVENUE_TYPE = 1 then -yw.ACT_RECEIVABLE_FEE  when t.bill_type = 1 and yw.REVENUE_TYPE = 0 then -yw.ACT_RECEIVABLE_FEE else  yw.ACT_RECEIVABLE_FEE END),0) from  yw_contract_revenue yw where yw.bill_id = t.id and yw.status = 0 and yw.isdeleted = 0 ) as  actReceivableFee  ")
                        .selectAs(YwContract::getCode,YwContractBill::getContractCode)
                        .selectAs(YwCustomer::getName,YwContractBill::getCustomerName)
                        .leftJoin(YwContract.class,YwContract::getId,YwContractBill::getContractId)
@@ -466,7 +473,9 @@
                        .in(YwContractBill::getCostType,Constants.ZERO,Constants.ONE,Constants.FOUR,Constants.FIVE,7)
                        .eq(Objects.nonNull(model)&&Objects.nonNull(model.getContractId()),
                                YwContractBill::getContractId,model.getContractId())
                        .le(Objects.nonNull(model)&&Objects.nonNull(model.getPlanPayDateEnd()),YwContractBill::getStartDate, Utils.Date.getEnd(model.getPlanPayDateEnd())) )
                        .and(Objects.nonNull(model)&&Objects.nonNull(model.getPlanPayDateEnd()),
                                i->i.le(YwContractBill::getStartDate, Utils.Date.getEnd(model.getPlanPayDateEnd())).or()
                        .in(YwContractBill::getPayStatus,Constants.ONE,Constants.TWO) ))
                ;
        for (YwContractBill ywContractBill:list) {
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwContractRevenueServiceImpl.java
@@ -24,6 +24,7 @@
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import org.apache.commons.lang3.StringUtils;
import org.checkerframework.checker.units.qual.C;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -125,7 +126,7 @@
        BigDecimal waitPayTotal = BigDecimal.ZERO;
        //无付款记录 åˆ™ä¸ºåˆæ¬¡æ”¯ä»˜ æ ¹æ®è´¦å•类型 åˆ¤æ–­æ˜¯æ”¯å‡º / æ”¶å…¥
        if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isEmpty(ywContractRevenueList)){
            ywContractRevenue.setRevenueType(ywContractBill.getType());
            ywContractRevenue.setRevenueType(ywContractBill.getBillType());
            if(ywContractRevenue.getActReceivableFee().compareTo(ywContractBill.getReceivableFee())>Constants.ZERO){
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"请输入正确的金额!");
            }else  if(ywContractRevenue.getActReceivableFee().compareTo(ywContractBill.getReceivableFee())==Constants.ZERO){
@@ -135,19 +136,39 @@
            }
        }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);
            if(Constants.equalsInteger(ywContractBill.getBillType(),Constants.ZERO)){
                payTotal = ywContractRevenueList.stream().map(i->
                        i.getActReceivableFee().multiply(
                                BigDecimal.valueOf(Constants.equalsInteger(i.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(),"收支金额异常!请联系管理员");
                }
            }else{
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"收支金额异常!请联系管理员");
                payTotal = ywContractRevenueList.stream().map(i->
                        i.getActReceivableFee().multiply(
                                BigDecimal.valueOf(Constants.equalsInteger(i.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.ONE);
                }else if(waitPayTotal.compareTo(BigDecimal.ZERO)<Constants.ZERO){
                    ywContractRevenue.setRevenueType(Constants.ZERO);
                }else{
                    throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"收支金额异常!请联系管理员");
                }
            }
            //待支付的流水 å¦‚果为收入 åˆ™æ¯”对 é‡‘额值  å¦‚果是支出 åˆ™èŽ·å–ç»å¯¹å€¼ è¿›è¡Œå¯¹æ¯”
            if(Constants.equalsInteger(ywContractRevenue.getRevenueType(),Constants.ZERO)){
                //如果支付金额 å¤§äºŽ å¾…支付金额 åˆ™æç¤ºå¼‚常 å¦‚果支付金额小于 å¾…支付金额 åˆ™çŠ¶æ€ä¸å˜åŒ– å…¶ä»–状态 å¼‚常
@@ -167,6 +188,21 @@
        }
        ywContractRevenueMapper.insert(ywContractRevenue);
        ywContractBillMapper.updateById(ywContractBill);
        //如果账单完结,则查询合同下开启中的账单是否存在退款中 å¦‚果不存在则标记合同已退款
        if(Constants.equalsInteger(ywContractBill.getPayStatus(),Constants.ONE)){
            if( ywContractBillMapper
                    .selectCount(new QueryWrapper<YwContractBill>().lambda().eq(YwContractBill::getContractId,ywContractBill.getContractId())
                            .ne(YwContractBill::getId,ywContractBill.getId())
                    .eq(YwContractBill::getStatus,Constants.ZERO)
                                    .in(YwContractBill::getPayStatus,Constants.ZERO,Constants.FOUR, Constants.TWO,Constants.THREE)
                    ) == Constants.ZERO){
                ywContractMapper.update(new UpdateWrapper<YwContract>().lambda()
                        .set(YwContract::getStatus,Constants.FOUR)
                        .set(YwContract::getEditDate,DateUtil.getCurrDateTime())
                        .eq(YwContract::getId,ywContractBill.getContractId())
                );
            }
        }
        //存储附件信息
        if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(ywContractRevenue.getMultifileList())){
            for (Multifile multifile:ywContractRevenue.getMultifileList()) {
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwContractServiceImpl.java
@@ -91,6 +91,7 @@
    }
    private void dealRoomsForContract(YwContract model) {
        this.dealRoomsValid(model);
        List<YwContractRoom> list = new ArrayList<>();
        for(YwRoom room :model.getRoomList()){
            YwContractRoom t = new YwContractRoom();
@@ -106,6 +107,46 @@
        }
        ywContractRoomMapper.insert(list);
    }
    private void dealRoomsValid(YwContract model){
        List<Integer> roomIds = model.getRoomList().stream().map(i->i.getId()).collect(Collectors.toList());
        if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(roomIds)){
            if(ywContractMapper.selectJoinCount(new MPJLambdaWrapper<YwContract>()
                    .leftJoin(YwContractRoom.class,YwContractRoom::getContractId,YwContract::getId)
                    .eq(YwContractRoom::getType,Constants.ZERO)
                    .in(YwContractRoom::getRoomId,roomIds)
                    .in(YwContract::getStatus,Constants.ZERO,Constants.ONE,Constants.TWO)
                    .apply(" (" +
                            " ( t.START_DATE < '"+DateUtil.getFomartDate(model.getEndDate(),"yyyy-MM-dd HH:mm:ss")+"'  and t.END_DATE > '"+DateUtil.getFomartDate(model.getStartDate(),"yyyy-MM-dd HH:mm:ss")+"' ) " +
                            "or " +
                            " ( t.START_DATE < '"+DateUtil.getFomartDate(model.getEndDate(),"yyyy-MM-dd HH:mm:ss")+"'  and t.END_DATE > '"+DateUtil.getFomartDate(model.getStartDate(),"yyyy-MM-dd HH:mm:ss")+"' ) " +
                            " ) ")
            )>Constants.ZERO){
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"房源已被占用请刷新重试");
            };
            if(ywContractMapper.selectJoinCount(new MPJLambdaWrapper<YwContract>()
                    .leftJoin(YwContractRoom.class,YwContractRoom::getContractId,YwContract::getId)
                    .eq(YwContractRoom::getType,Constants.ZERO)
                    .in(YwContractRoom::getRoomId,roomIds)
                    .in(YwContract::getStatus,Constants.THREE)
                    .apply(" ( t.START_DATE < '"+DateUtil.getFomartDate(model.getEndDate(),"yyyy-MM-dd HH:mm:ss")+"' " +
                            " and t.BT_DATE > '"+DateUtil.getFomartDate(model.getStartDate(),"yyyy-MM-dd HH:mm:ss")+"' ) " )
            )>Constants.ZERO){
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"房源已被占用请刷新重试");
            };
        }
    }
    @Override
    public   List<YwContractBill> getBillList(YwContract model){
@@ -1228,6 +1269,8 @@
                            ,Constants.YwLogType.CONTRACT_UPDATE.getKey())
                    .orderByAsc(YwWorkorderLog::getCreateDate)));
            //查询账单集合
            queryBillListByModel(model,new Date());
        }
        return model;
@@ -1242,7 +1285,8 @@
        //查询账单集合
        model.setBillList(ywContractBillMapper.selectJoinList(YwContractBill.class,new MPJLambdaWrapper<YwContractBill>()
                .selectAll(YwContractBill.class )
                .select(" ( select ifnull(sum(case when yw.REVENUE_TYPE = 0 then yw.ACT_RECEIVABLE_FEE  else  -yw.ACT_RECEIVABLE_FEE end),0) from  yw_contract_revenue yw where yw.bill_id = t.id and yw.status = 0 and yw.isdeleted = 0 ) as  actReceivableFee  ")
                //.select(" ( select ifnull(sum(case when yw.REVENUE_TYPE = 0 then yw.ACT_RECEIVABLE_FEE  else  -yw.ACT_RECEIVABLE_FEE end),0) from  yw_contract_revenue yw where yw.bill_id = t.id and yw.status = 0 and yw.isdeleted = 0 ) as  actReceivableFee  ")
                .select(" ( select ifnull( sum( CASE WHEN t.bill_type = 0 and yw.REVENUE_TYPE = 0 THEN yw.ACT_RECEIVABLE_FEE when  t.bill_type = 0 and yw.REVENUE_TYPE = 1 then -yw.ACT_RECEIVABLE_FEE  when t.bill_type = 1 and yw.REVENUE_TYPE = 0 then -yw.ACT_RECEIVABLE_FEE else  yw.ACT_RECEIVABLE_FEE END),0) from  yw_contract_revenue yw where yw.bill_id = t.id and yw.status = 0 and yw.isdeleted = 0 ) as  actReceivableFee  ")
                .eq(  YwContractBill::getContractId,model.getId())
                .eq(YwContractBill::getIsdeleted,Constants.ZERO)
                .orderByAsc(YwContractBill::getSortnum,YwContractBill::getCreateDate)));
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwCustomerServiceImpl.java
@@ -61,9 +61,6 @@
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        LoginUserInfo loginUserInfo = ywCustomer.getLoginUserInfo();
        if(StringUtils.isNotBlank(ywCustomer.getEmail())&&!Constants.validEmail(ywCustomer.getEmail())){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"请填写正确的email");
        }
        ywCustomer.setStatus(Constants.ZERO);
        ywCustomer.setIsdeleted(Constants.ZERO);
        ywCustomer.setCreator(loginUserInfo.getId());
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwDeviceRecordServiceImpl.java
@@ -180,6 +180,7 @@
                        .ge(Objects.nonNull(model.getStartDate()),YwDeviceRecord::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getStartDate()))
                        .le(Objects.nonNull(model.getEndDate()),YwDeviceRecord::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getEndDate()))
                        .eq(YwDeviceRecord::getIsdeleted,Constants.ZERO)
                        .orderByDesc(YwDeviceRecord::getCreateDate)
        );
        return PageData.from(iPage);
    }
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwPatrolLineServiceImpl.java
@@ -106,6 +106,7 @@
    }
    @Override
    @Transactional(rollbackFor = {Exception.class,BusinessException.class})
    public void updateById(YwPatrolLine ywPatrolLine) {
        if(Objects.isNull(ywPatrolLine)
                || StringUtils.isBlank(ywPatrolLine.getName())
@@ -123,7 +124,7 @@
        //循环处理 å­é›†æ•°æ®
        List<YwLinePoint> ywLinePointList = ywPatrolLine.getLinePointList();
        //是否存在相同数据
        Set<Integer> setIds = new HashSet<Integer>(ywLinePointList.stream().map(i->i.getLineId()).collect(Collectors.toList()));
        Set<Integer> setIds = new HashSet<Integer>(ywLinePointList.stream().map(i->i.getPointId()).collect(Collectors.toList()));
        if(setIds.size()!=ywLinePointList.size()){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"存在相同巡检点!");
        }
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwPatrolTaskServiceImpl.java
@@ -146,6 +146,7 @@
                .leftJoin(YwPatrolScheme.class,YwPatrolScheme::getId,YwPatrolTask::getSchemeId)
                .eq(YwPatrolTask::getIsdeleted, Constants.ZERO)
                .eq(Objects.nonNull(model.getStatus()) && !Constants.equalsInteger(model.getStatus(),Constants.TWO),YwPatrolTask::getStatus, model.getStatus())
                .eq(Objects.nonNull(model.getDealUserId()),YwPatrolTask::getDealUserId, model.getDealUserId())
                .apply(Objects.nonNull(model.getStatus()) && Constants.equalsInteger(model.getStatus(),Constants.TWO)," t.status = 1 and t.END_DATE > now() ")
                .apply(StringUtils.isNotBlank(model.getQueryStatus())," find_in_set(t.status ,'"+model.getQueryStatus()+"') ")
                .like(StringUtils.isNotBlank(model.getPlanTitle()),YwPatrolScheme::getTitle,model.getPlanTitle())
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwProjectServiceImpl.java
@@ -6,11 +6,13 @@
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.core.utils.Constants;
import com.doumee.core.utils.DateUtil;
import com.doumee.core.utils.Utils;
import com.doumee.dao.business.YwBuildingMapper;
import com.doumee.dao.business.YwFloorMapper;
import com.doumee.dao.business.YwProjectMapper;
import com.doumee.dao.business.YwRoomMapper;
import com.doumee.dao.business.dto.DataDTO;
import com.doumee.dao.business.model.*;
import com.doumee.dao.business.vo.CompanyTree;
import com.doumee.dao.business.vo.ProjectDataVO;
@@ -28,6 +30,7 @@
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
@@ -230,11 +233,12 @@
    @Override
    public List<ProjectDataVO> projectTree(){
    public List<ProjectDataVO> projectTree(DataDTO dataDTO){
        List<ProjectDataVO> projectDataVOList = new ArrayList<>();
        List<YwProject>  ywProjectList = ywProjectMapper.selectList(new QueryWrapper<YwProject>().lambda()
                .eq(YwProject::getIsdeleted,Constants.ZERO)
                .eq(YwProject::getStatus,Constants.ZERO)
                .eq(Objects.nonNull(dataDTO.getProjectId()),YwProject::getId,dataDTO.getProjectId())
                .orderByAsc(YwProject::getSortnum)
        );
        for (YwProject ywProject:ywProjectList) {
@@ -247,6 +251,7 @@
        List<YwBuilding>  ywBuildingList = ywBuildingMapper.selectList(new QueryWrapper<YwBuilding>().lambda()
                .eq(YwBuilding::getIsdeleted,Constants.ZERO)
                .eq(YwBuilding::getStatus,Constants.ZERO)
                .eq(Objects.nonNull(dataDTO.getProjectId()),YwBuilding::getProjectId,dataDTO.getProjectId())
                .orderByAsc(YwBuilding::getSortnum)
        );
@@ -262,6 +267,7 @@
        List<YwFloor>  ywFloorList = ywFloorMapper.selectList(new QueryWrapper<YwFloor>().lambda()
                .eq(YwFloor::getIsdeleted,Constants.ZERO)
                .eq(YwFloor::getStatus,Constants.ZERO)
                .eq(Objects.nonNull(dataDTO.getProjectId()),YwFloor::getProjectId,dataDTO.getProjectId())
                .orderByAsc(YwFloor::getSortnum)
        );
@@ -273,19 +279,26 @@
            projectDataVOList.add(projectDataVO);
        }
        List<YwRoom>  ywRoomList = ywRoomMapper.selectList(new QueryWrapper<YwRoom>().lambda()
                .eq(YwRoom::getIsdeleted,Constants.ZERO)
                .eq(YwRoom::getStatus,Constants.ZERO)
                .eq(Objects.nonNull(dataDTO.getProjectId()),YwRoom::getProjectId,dataDTO.getProjectId())
                .apply(Objects.nonNull(dataDTO)&&Objects.nonNull(dataDTO.getStartDate())&&Objects.nonNull(dataDTO.getEndDate())," id not in  (" +
                        " SELECT y2.room_id FROM  yw_contract y1 left join yw_contract_room y2 on y1.id = y2.contract_id where 1 = 1 and y1.`STATUS` in( 0,1,2) " +
                        " and y1.START_DATE < '"+dataDTO.getEndDate()+" 00:00:00' and y1.END_DATE > '"+ dataDTO.getStartDate() +"  00:00:00' " +
                        "  ) ")
                .apply(Objects.nonNull(dataDTO)&&Objects.nonNull(dataDTO.getStartDate())&&Objects.nonNull(dataDTO.getEndDate())," id not in  (" +
                        " SELECT y2.room_id FROM  yw_contract y1 left join yw_contract_room y2 on y1.id = y2.contract_id where 1 = 1 and y1.`STATUS` = 3 " +
                        " and y1.START_DATE < '"+dataDTO.getEndDate()+" 00:00:00' and y1.BT_DATE > '"+ dataDTO.getStartDate() +"  00:00:00' " +
                        "  ) ")
                .orderByAsc(YwRoom::getSortnum)
        );
        for (YwRoom data:ywRoomList) {
            ProjectDataVO projectDataVO = new ProjectDataVO();
            BeanUtils.copyProperties(data,projectDataVO);
            projectDataVO.setName(data.getCode());
            projectDataVO.setName(data.getRoomNum());
            projectDataVO.setArea(data.getRentArea().setScale(2, BigDecimal.ROUND_HALF_UP));
            projectDataVO.setPId(data.getFloor());
            projectDataVO.setLv(Constants.THREE);
            projectDataVOList.add(projectDataVO);
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwRoomServiceImpl.java
@@ -150,9 +150,9 @@
                .selectAs(YwProject::getName,YwRoom::getProjectName)
                .selectAs(YwFloor::getName,YwRoom::getFloorName)
                .selectAs(YwBuilding::getName,YwRoom::getBuildingName)
                .select(" select case when y1.status = 3 then now() BETWEEN y1.START_DATE and y1.BT_DATE else now() BETWEEN y1.START_DATE and y1.END_DATE END  " +
                .select(" ifnull( ( select case when y1.status = 3 then now() BETWEEN y1.START_DATE and y1.BT_DATE else now() BETWEEN y1.START_DATE and y1.END_DATE END  " +
                        "from yw_contract y1 left join yw_contract_room y2 on y1.id = y2.CONTRACT_ID and y2.TYPE = 0  " +
                        "where y1.`STATUS` <> 4  and y2.room_id = t.id order by y1.create_date desc  limit 1   ",YwRoom::getLeaseStatus)
                        "where y1.`STATUS` <> 4  and y2.room_id = t.id order by y1.create_date desc  limit 1  ) ,0) ",YwRoom::getLeaseStatus)
                .leftJoin(YwProject.class,YwProject::getId,YwRoom::getProjectId)
                .leftJoin(YwBuilding.class,YwBuilding::getId,YwRoom::getBuildingId)
                .leftJoin(YwFloor.class,YwFloor::getId,YwRoom::getFloor);