From 16217be9c85f95cb236e639da6e546bb38cdc53d Mon Sep 17 00:00:00 2001
From: jiangping <jp@doumee.com>
Date: 星期四, 05 十二月 2024 14:45:07 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 admin/.env                                                                                                     |    2 
 admin/src/views/contract/components/contractEdit.vue                                                           |  199 ++++++++++----
 admin/src/api/customer.js                                                                                      |    6 
 admin/vue.config.js                                                                                            |    5 
 h5/pages/login.vue                                                                                             |    2 
 admin/src/views/contract/components/contractDetail.vue                                                         |  108 +++++--
 admin/src/views/project/projectList.vue                                                                        |    2 
 admin/src/views/workorder/components/detail.vue                                                                |    5 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwBuilding.java                      |    4 
 admin/src/views/operation/components/deviceDetail.vue                                                          |    8 
 h5/pages/workOrder/detail.vue                                                                                  |    4 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/CategoryServiceImpl.java          |    6 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwCustomerServiceImpl.java        |    3 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwPatrolTaskServiceImpl.java      |    1 
 admin/src/views/client/components/OperaYwCustomerWindow.vue                                                    |    6 
 admin/src/views/finance/components/details.vue                                                                 |    2 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwProjectService.java                  |    3 
 admin/src/views/system/user.vue                                                                                |    2 
 server/system_service/src/main/java/com/doumee/core/utils/DateCompare.java                                     |    8 
 admin/.gitignore                                                                                               |    3 
 admin/src/views/finance/components/bullEdit.vue                                                                |    2 
 admin/src/views/finance/bull.vue                                                                               |   16 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/ProjectDataVO.java                      |    4 
 admin/.env.development                                                                                         |   10 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwRoomServiceImpl.java            |    4 
 admin/src/views/login.vue                                                                                      |    1 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java            |    8 
 admin/src/views/contract/components/terminateLease.vue                                                         |   32 -
 admin/src/views/finance/components/flowingWater.vue                                                            |    7 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwContractRevenueServiceImpl.java |   60 +++
 admin/src/views/contract/contractList.vue                                                                      |   10 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwContractServiceImpl.java        |   46 +++
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwProjectServiceImpl.java         |   23 +
 /dev/null                                                                                                      |    5 
 admin/src/components/common/GlobalWindow.vue                                                                   |    4 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwBuildingServiceImpl.java        |    3 
 admin/src/views/operation/components/maintainDetail.vue                                                        |    5 
 server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwProjectCloudController.java                 |    5 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwPatrolLineServiceImpl.java      |    3 
 admin/src/views/project/components/OperaYwBuildingWindow.vue                                                   |    2 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwContractBillServiceImpl.java    |   25 +
 admin/src/views/contract/components/config.js                                                                  |    2 
 admin/src/views/finance/components/bullDetail.vue                                                              |  133 +++++----
 admin/src/views/project/buildingList.vue                                                                       |    2 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwDeviceRecordServiceImpl.java    |    1 
 admin/src/router/index.js                                                                                      |    2 
 admin/src/views/client/components/staffEdit.vue                                                                |    6 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/dto/DataDTO.java                           |   29 ++
 48 files changed, 567 insertions(+), 262 deletions(-)

diff --git a/admin/.env b/admin/.env
index af248a9..18495ab 100644
--- a/admin/.env
+++ b/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'
diff --git a/admin/.env.development b/admin/.env.development
new file mode 100644
index 0000000..a124a35
--- /dev/null
+++ b/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'
+
diff --git a/admin/.gitignore b/admin/.gitignore
index 25910be..c2dd892 100644
--- a/admin/.gitignore
+++ b/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*
diff --git a/admin/babel.config.js b/admin/babel.config.js
deleted file mode 100644
index e955840..0000000
--- a/admin/babel.config.js
+++ /dev/null
@@ -1,5 +0,0 @@
-module.exports = {
-  presets: [
-    '@vue/cli-plugin-babel/preset'
-  ]
-}
diff --git a/admin/src/api/customer.js b/admin/src/api/customer.js
index e57764c..48bb68e 100644
--- a/admin/src/api/customer.js
+++ b/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)
+}
+
diff --git a/admin/src/components/common/GlobalWindow.vue b/admin/src/components/common/GlobalWindow.vue
index 376a5b7..b734be2 100644
--- a/admin/src/components/common/GlobalWindow.vue
+++ b/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;
diff --git a/admin/src/router/index.js b/admin/src/router/index.js
index f69ea19..6002274 100644
--- a/admin/src/router/index.js
+++ b/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: [
     // 鐧诲綍
diff --git a/admin/src/views/client/components/OperaYwCustomerWindow.vue b/admin/src/views/client/components/OperaYwCustomerWindow.vue
index d3c0941..c966c3f 100644
--- a/admin/src/views/client/components/OperaYwCustomerWindow.vue
+++ b/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>
\ No newline at end of file
+</style>
diff --git a/admin/src/views/client/components/staffEdit.vue b/admin/src/views/client/components/staffEdit.vue
index e1ce3d3..ffe8cd5 100644
--- a/admin/src/views/client/components/staffEdit.vue
+++ b/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>
\ No newline at end of file
+</style>
diff --git a/admin/src/views/contract/components/config.js b/admin/src/views/contract/components/config.js
index c094419..0611aea 100644
--- a/admin/src/views/contract/components/config.js
+++ b/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: '璇疯緭鍏�' }],
diff --git a/admin/src/views/contract/components/contractDetail.vue b/admin/src/views/contract/components/contractDetail.vue
index f13cf9a..730f2c2 100644
--- a/admin/src/views/contract/components/contractDetail.vue
+++ b/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">姝e父鎵ц涓�</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">姝e父鎵ц涓�</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
         }
diff --git a/admin/src/views/contract/components/contractEdit.vue b/admin/src/views/contract/components/contractEdit.vue
index 213d597..3fa3f50 100644
--- a/admin/src/views/contract/components/contractEdit.vue
+++ b/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;
diff --git a/admin/src/views/contract/components/terminateLease.vue b/admin/src/views/contract/components/terminateLease.vue
index 6bb8929..83108ee 100644
--- a/admin/src/views/contract/components/terminateLease.vue
+++ b/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();
diff --git a/admin/src/views/contract/contractList.vue b/admin/src/views/contract/contractList.vue
index 13a9176..089e6f5 100644
--- a/admin/src/views/contract/contractList.vue
+++ b/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>
diff --git a/admin/src/views/finance/bull.vue b/admin/src/views/finance/bull.vue
index 4c7923a..e0e4de8 100644
--- a/admin/src/views/finance/bull.vue
+++ b/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: '寰呴��娆�' }
             ]
           },
           {
diff --git a/admin/src/views/finance/components/bullDetail.vue b/admin/src/views/finance/components/bullDetail.vue
index bfea17f..d08fee0 100644
--- a/admin/src/views/finance/components/bullDetail.vue
+++ b/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')
     },
diff --git a/admin/src/views/finance/components/bullEdit.vue b/admin/src/views/finance/components/bullEdit.vue
index 9eaf189..de28758 100644
--- a/admin/src/views/finance/components/bullEdit.vue
+++ b/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="璇烽�夋嫨">
diff --git a/admin/src/views/finance/components/details.vue b/admin/src/views/finance/components/details.vue
index 1336c5a..f349cc1 100644
--- a/admin/src/views/finance/components/details.vue
+++ b/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">
diff --git a/admin/src/views/finance/components/flowingWater.vue b/admin/src/views/finance/components/flowingWater.vue
index d011587..c042606 100644
--- a/admin/src/views/finance/components/flowingWater.vue
+++ b/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: [
diff --git a/admin/src/views/login.vue b/admin/src/views/login.vue
index a728dbc..c51189a 100644
--- a/admin/src/views/login.vue
+++ b/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()
diff --git a/admin/src/views/operation/components/deviceDetail.vue b/admin/src/views/operation/components/deviceDetail.vue
index 5dad8e6..f3181aa 100644
--- a/admin/src/views/operation/components/deviceDetail.vue
+++ b/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;
       }
     }
 
diff --git a/admin/src/views/operation/components/maintainDetail.vue b/admin/src/views/operation/components/maintainDetail.vue
index 0ab9cd3..048a182 100644
--- a/admin/src/views/operation/components/maintainDetail.vue
+++ b/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{
diff --git a/admin/src/views/project/buildingList.vue b/admin/src/views/project/buildingList.vue
index cb453d9..a94db6f 100644
--- a/admin/src/views/project/buildingList.vue
+++ b/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'])"
diff --git a/admin/src/views/project/components/OperaYwBuildingWindow.vue b/admin/src/views/project/components/OperaYwBuildingWindow.vue
index 3a4c986..83fecbe 100644
--- a/admin/src/views/project/components/OperaYwBuildingWindow.vue
+++ b/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 />
diff --git a/admin/src/views/project/projectList.vue b/admin/src/views/project/projectList.vue
index a150378..383fc76 100644
--- a/admin/src/views/project/projectList.vue
+++ b/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'])"
diff --git a/admin/src/views/system/user.vue b/admin/src/views/system/user.vue
index 73d74f4..ee79e9f 100644
--- a/admin/src/views/system/user.vue
+++ b/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
diff --git a/admin/src/views/workorder/components/detail.vue b/admin/src/views/workorder/components/detail.vue
index 55f1e8d..d5337ea 100644
--- a/admin/src/views/workorder/components/detail.vue
+++ b/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;
       }
     }
 
diff --git a/admin/vue.config.js b/admin/vue.config.js
index c429385..9d855e9 100644
--- a/admin/vue.config.js
+++ b/admin/vue.config.js
@@ -1,13 +1,12 @@
 // 璇︾粏閰嶇疆璇峰弬鑰僪ttps://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: {
diff --git a/h5/pages/login.vue b/h5/pages/login.vue
index 666d529..4c32dbc 100644
--- a/h5/pages/login.vue
+++ b/h5/pages/login.vue
@@ -33,7 +33,7 @@
   data() {
     return {
       form: {
-				phone: '17878787878',
+				phone: '18888888888',
 				code: '1'
       },
 			downTime: 0
diff --git a/h5/pages/workOrder/detail.vue b/h5/pages/workOrder/detail.vue
index 6e74b6a..f1726d3 100644
--- a/h5/pages/workOrder/detail.vue
+++ b/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>
diff --git a/server/system_service/src/main/java/com/doumee/core/utils/DateCompare.java b/server/system_service/src/main/java/com/doumee/core/utils/DateCompare.java
index 630334d..df82f83 100644
--- a/server/system_service/src/main/java/com/doumee/core/utils/DateCompare.java
+++ b/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;
 
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwProjectCloudController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwProjectCloudController.java
index 02e8e94..02ec71c 100644
--- a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwProjectCloudController.java
+++ b/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));
     }
 
 
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/dto/DataDTO.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/dto/DataDTO.java
new file mode 100644
index 0000000..82dad9d
--- /dev/null
+++ b/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;
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwBuilding.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwBuilding.java
index 0da0eea..5fca146 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwBuilding.java
+++ b/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;
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/ProjectDataVO.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/ProjectDataVO.java
index f292cb0..ba8b2d3 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/ProjectDataVO.java
+++ b/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;
 
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwProjectService.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwProjectService.java
index d4232c7..7175677 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwProjectService.java
+++ b/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);
 }
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/CategoryServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/CategoryServiceImpl.java
index bdbf056..e75dac5 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/CategoryServiceImpl.java
+++ b/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());
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
index ad6f19c..534d629 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
+++ b/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);
     }
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwBuildingServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwBuildingServiceImpl.java
index 612f09e..ac034cb 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwBuildingServiceImpl.java
+++ b/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());
         }
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwContractBillServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwContractBillServiceImpl.java
index 03953ce..471d18f 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwContractBillServiceImpl.java
+++ b/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) {
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwContractRevenueServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwContractRevenueServiceImpl.java
index cdfdf12..e2e4461 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwContractRevenueServiceImpl.java
+++ b/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()) {
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwContractServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwContractServiceImpl.java
index 4683542..f9be5d2 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwContractServiceImpl.java
+++ b/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)));
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwCustomerServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwCustomerServiceImpl.java
index 1fc2a89..f36d94a 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwCustomerServiceImpl.java
+++ b/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());
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwDeviceRecordServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwDeviceRecordServiceImpl.java
index 7d19c2c..9118073 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwDeviceRecordServiceImpl.java
+++ b/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);
     }
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwPatrolLineServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwPatrolLineServiceImpl.java
index 217d7c4..a40d68f 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwPatrolLineServiceImpl.java
+++ b/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(),"瀛樺湪鐩稿悓宸℃鐐�!");
         }
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwPatrolTaskServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwPatrolTaskServiceImpl.java
index 651d6f1..8267901 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwPatrolTaskServiceImpl.java
+++ b/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())
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwProjectServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwProjectServiceImpl.java
index b5dfdb8..2e2061a 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwProjectServiceImpl.java
+++ b/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);
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwRoomServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwRoomServiceImpl.java
index 8cf6dd7..87d1ec9 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwRoomServiceImpl.java
+++ b/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);

--
Gitblit v1.9.3