MrShi
2024-11-26 14a20df4699cf3d933e2bdbe1ba2aba15ade1059
解决冲突
已添加10个文件
已修改35个文件
已重命名14个文件
7973 ■■■■ 文件已修改
admin/package-lock.json 4799 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/package.json 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/Inspection/ywPatrolPoint.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/client/staff.js 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/project/yeFloor.js 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/system/user.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/workorder/ywWorkorder.js 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/assets/icons/position.png 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/common/CommonHeader.vue 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/common/map/mapDrag.vue 320 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/eventBus/eventBus.js 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/Inspection/components/OperaYwPatrolPointWindow.vue 81 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/Inspection/dot.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/operation/components/deviceEdit.vue 36 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/project/components/OperaYwRoomWindow.vue 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/project/components/floorLevel.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/project/housingList.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/workorder/components/OperaYwWorkorderWindow.vue 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/workorder/components/detail.vue 371 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/workorder/workorderList.vue 144 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/cloud/NoticesCloudController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/cloud/SystemCloudController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/cloud/SystemDataPermissionCloudController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/cloud/SystemDepartmentCloudController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/cloud/SystemDictCloudController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/cloud/SystemDictDataCloudController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/cloud/SystemLoginLogCloudController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/cloud/SystemMenuCloudController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/cloud/SystemMonitorCloudController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/cloud/SystemPermissionCloudController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/cloud/SystemPositionCloudController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/cloud/SystemRoleCloudController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/cloud/SystemTraceLogCloudController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/cloud/SystemUserCloudController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/core/utils/Constants.java 94 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwContractBillCloudController.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwContractCloudController.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwContractRevenueCloudController.java 108 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwFloorCloudController.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/java/com/doumee/config/swagger/SwaggerConfig.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/java/com/doumee/service/impl/HkSyncEventServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwContractRevenueMapper.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwContract.java 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwContractBill.java 145 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwContractRevenue.java 144 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwContractRoom.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwRoom.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwWorkorder.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwWorkorderLog.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/EditRecordDataVO.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwContractBillService.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwContractRevenueService.java 102 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwContractService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwContractBillServiceImpl.java 232 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwContractRevenueServiceImpl.java 448 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwContractServiceImpl.java 432 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwFloorServiceImpl.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwRoomServiceImpl.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwWorkorderServiceImpl.java 199 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/package-lock.json
ÎļþÌ«´ó
admin/package.json
@@ -13,6 +13,7 @@
    "fix": "eslint --ext .js,.vue src --fix"
  },
  "dependencies": {
    "@amap/amap-jsapi-loader": "^1.0.1",
    "@riophae/vue-treeselect": "^0.4.0",
    "@wangeditor/editor": "^5.1.23",
    "@wangeditor/editor-for-vue": "^1.0.2",
admin/src/api/Inspection/ywPatrolPoint.js
@@ -34,6 +34,10 @@
export function deleteById (id) {
  return request.get(`/visitsAdmin/cloudService/business/ywPatrolPoint/delete/${id}`)
}
// è¯¦æƒ…
export function detail (id) {
  return request.get(`/visitsAdmin/cloudService/business/ywPatrolPoint/${id}`)
}
// æ‰¹é‡åˆ é™¤
export function deleteByIdInBatch (ids) {
admin/src/api/client/staff.js
@@ -6,7 +6,12 @@
    trim: true
  })
}
// æŸ¥è¯¢
export function getStaffList (data) {
  return request.post('/visitsAdmin/cloudService/business/member/ywList', data, {
    trim: true
  })
}
// å¯¼å‡ºExcel
export function exportExcel (data) {
  return request.post('/visitsAdmin/cloudService/business/member/exportExcel', data, {
admin/src/api/project/yeFloor.js
@@ -6,6 +6,11 @@
    trim: true
  })
}
export function getFloorList (data) {
  return request.post('/visitsAdmin/cloudService/business/ywFloor/list', data, {
    trim: true
  })
}
// å¯¼å‡ºExcel
export function exportExcel (data) {
  return request.post('/visitsAdmin/cloudService/business/ywFloor/exportExcel', data, {
admin/src/api/system/user.js
@@ -4,6 +4,10 @@
export function fetchList (data) {
  return request.post('/visitsAdmin/cloudService/system/user/page', data)
}
// æŸ¥è¯¢æ‰€æœ‰å†…部人员
export function getUserList (data) {
  return request.post('/visitsAdmin/cloudService/system/user/findInternalList', data)
}
// æ–°å»º
export function create (data) {
admin/src/api/workorder/ywWorkorder.js
@@ -19,7 +19,14 @@
export function create (data) {
  return request.post('/visitsAdmin/cloudService/business/ywWorkorder/create', data)
}
// æŒ‡æ´¾
export function dispatchOrder (data) {
  return request.post('/visitsAdmin/cloudService/business/ywWorkorder/dispatchOrder', data)
}
// å¤„理
export function dealOrder (data) {
  return request.post('/visitsAdmin/cloudService/business/ywWorkorder/dealOrder', data)
}
// ä¿®æ”¹
export function updateById (data) {
  return request.post('/visitsAdmin/cloudService/business/ywWorkorder/updateById', data)
@@ -29,6 +36,10 @@
export function deleteById (id) {
  return request.get(`/visitsAdmin/cloudService/business/ywWorkorder/delete/${id}`)
}
// æŸ¥è¯¢è¯¦æƒ…
export function detailById (id) {
  return request.get(`/visitsAdmin/cloudService/business/ywWorkorder/${id}`)
}
// æ‰¹é‡åˆ é™¤
export function deleteByIdInBatch (ids) {
admin/src/assets/icons/position.png
admin/src/components/common/CommonHeader.vue
@@ -114,9 +114,9 @@
  },
  mounted() {
    // needChangePwd 0 : é»˜è®¤å¯†ç éœ€è¦ä¿®æ”¹ï¼Œ1 ä¸éœ€è¦
    if (this.userInfo &&(!this.userInfo.needChangePwd || this.userInfo.needChangePwd == '0')) {
      this.visible.changePwd = true
    }
    // if (this.userInfo &&(!this.userInfo.needChangePwd || this.userInfo.needChangePwd == '0')) {
    //   this.visible.changePwd = true
    // }
  },
  filters: {
    // å±•示名称
admin/src/components/common/map/mapDrag.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,320 @@
<!--
  æè¿°ï¼šæ‹–放地图组件,默认尺寸是 500 * 300
  æŽ¥æ”¶å±žæ€§å‚数:
    lat: çº¬åº¦
    lng: ç»åº¦
  è‡ªå®šä¹‰äº‹ä»¶ï¼š
    drag: æ‹–放完成事件
  ç¤ºä¾‹ï¼š
    <mapDrag @drag="dragMap" lat="22.574405" lng="114.095388"></mapDrag>
-->
<template>
  <div class="m-map">
    <div class="search">
      <el-form @submit.native.prevent>
        <input
          :id="search_id"
          v-model="input"
          type="text"
          placeholder="请输入关键字"
          autocomplete="off"
        >
        <input type="text" style="display: none">
        <button type="primary" @click="searchMap">搜索</button>
      </el-form>
      <div v-show="searchKey" id="js-result" class="result" />
    </div>
    <!-- <div id="panel" /> -->
    <!-- æœç´¢ç»“果栏 -->
    <div v-if="showsearchResult" class="tool_search_result">
      <ul>
        <li
          v-for="(item, index) in poiList"
          :key="index"
          @click="markerResult(item)"
        >
          {{ item.name }}
        </li>
      </ul>
    </div>
    <div id="js-container" class="map">正在加载数据 ...</div>
  </div>
</template>
<script>
// import remoteLoad from '@/utils/remoteLoad.js'
import bus from '@/eventBus/eventBus.js'
// import { MapKey, securityJsCode } from '@/api/config'
import AMapLoader from '@amap/amap-jsapi-loader'
const MapKey = 'c477e250c63cde947d7e9072bdcf9e65'
const securityJsCode = '746ae93f3f20c7fc30134109bd55fd19'
export default {
  props: {
    lat: {
      type: String,
      default: ''
    },
    lng: {
      type: String,
      default: ''
    }
  },
  data() {
    return {
      autoOptions: {
        input: ''
      },
      showsearchResult: false,
      search_id: 'searchId',
      input: '',
      searchPlaceInput: '',
      searchKey: '',
      placeSearch: null,
      dragStatus: false,
      AMapUI: null,
      AMap: null,
      positionImage: require('@/assets/icons/position.png'),
      marker: {},
      map: null,
      poiList: []
    }
  },
  watch: {
    searchPlaceInput(newValue) {
      if (newValue != null) {
        // this.placeSearch.search(newValue)
      }
    }
  },
  created() {
    bus.$on('share_id', val => {
      this.autoOptions.input = val
    })
    bus.$on('share', val => {
      this.searchPlaceInput = val
    })
  },
  mounted() {
    this.initMap()
    this.sendId()
  },
  methods: {
    sendMsg() {
      bus.$emit('share', this.input)
    },
    sendId() {
      bus.$emit('share_id', this.search_id)
    },
    // å®žä¾‹åŒ–地图
    initMap() {
      window._AMapSecurityConfig = { securityJsCode }
      AMapLoader.load({
        key: MapKey, // ç”³è¯·å¥½çš„Web端开发者Key,首次调用 load æ—¶å¿…å¡«
        version: '2.0', // æŒ‡å®šè¦åŠ è½½çš„ JSAPI çš„版本,缺省时默认为 1.4.15
        plugins: ['AMap.ToolBar', 'AMap.Geocoder', 'AMap.PlaceSearch', 'AMap.Geolocation', 'AMap.MapType', 'AMap.HawkEye', 'AMap.Scale', 'AMap.AutoComplete'] // éœ€è¦ä½¿ç”¨çš„的插件列表,如比例尺'AMap.Scale'等
      }).then((AMap) => {
        this.map = new AMap.Map('js-container', { // è®¾ç½®åœ°å›¾å®¹å™¨id
          viewMode: '3D', // æ˜¯å¦ä¸º3D地图模式
          zoom: 11, // åˆå§‹åŒ–地图级别
          center: [117.279952, 31.850109] // åˆå§‹åŒ–地图中心点位置
        })
        this.map.addControl(new AMap.ToolBar())
        this.mapOn(AMap)
      }).catch(e => {
        console.log(e)
      })
    },
    searchMap() {
      var placeSearch = new AMap.PlaceSearch({
        // æž„造地点查询类
        pageSize: 30, // å•页显示结果条数
        pageIndex: 1, // é¡µç 
        citylimit: false, // æ˜¯å¦å¼ºåˆ¶é™åˆ¶åœ¨è®¾ç½®çš„城市内搜索
        map: this.map, // å±•现结果的地图实例
        // panel: 'panel', // ç»“果列表将在此容器中进行展示。
        autoFitView: true // æ˜¯å¦è‡ªåŠ¨è°ƒæ•´åœ°å›¾è§†é‡Žä½¿ç»˜åˆ¶çš„ Marker点都处于视口的可见范围
      })
      // å…³é”®å­—查询
      const cur = this
      placeSearch.search(this.input, (status, result) => {
        // æŸ¥è¯¢æˆåŠŸæ—¶ï¼Œresult即对应匹配的POI信息
        console.log(status)
        console.log(result)
        if (status === 'complete' && result.info === 'OK') {
          cur.showsearchResult = true
          cur.poiList = result.poiList.pois
        } else {
          cur.showsearchResult = false
          cur.poiList = []
          cur.$message({
            message: '没有查到结果',
            type: 'warning'
          })
        }
      })
    },
    markerResult(data) {
      // this.input = data.name
      // this.searchMap()
      const that = this
      const { lat, lng } = data.location
      window._AMapSecurityConfig = { securityJsCode }
      AMapLoader.load({
        key: MapKey, // ç”³è¯·å¥½çš„Web端开发者Key,首次调用 load æ—¶å¿…å¡«
        version: '2.0', // æŒ‡å®šè¦åŠ è½½çš„ JSAPI çš„版本,缺省时默认为 1.4.15
        plugins: ['AMap.ToolBar', 'AMap.Geocoder', 'AMap.PlaceSearch', 'AMap.Geolocation', 'AMap.MapType', 'AMap.HawkEye', 'AMap.Scale', 'AMap.AutoComplete'] // éœ€è¦ä½¿ç”¨çš„的插件列表,如比例尺'AMap.Scale'等
      }).then((AMap) => {
        this.map = new AMap.Map('js-container', { // è®¾ç½®åœ°å›¾å®¹å™¨id
          viewMode: '3D', // æ˜¯å¦ä¸º3D地图模式
          zoom: 18, // åˆå§‹åŒ–地图级别
          center: [lng, lat] // åˆå§‹åŒ–地图中心点位置
        })
        this.map.addControl(new AMap.ToolBar())
        const address = data.name
        const marker = new AMap.Marker({
          position: new AMap.LngLat(lng, lat),
          icon: that.positionImage,
          anchor: 'bottom-center'
        })
        // map.remove(that.marker)
        this.map.add(marker)
        that.marker = marker
        that.showsearchResult = false
        that.$emit('center', { lnglat: lng + ',' + lat, address })
        this.mapOn(AMap)
      }).catch(e => {
        console.log(e)
      })
      // var marker = new AMap.Marker({
      //   position: [Number(data.location.lng), Number(data.location.lat)],
      //   cursor: 'pointer',
      //   // icon: carIcon,
      //   autoRotation: true,
      //   angle: 0,
      //   offset: new AMap.Pixel(-36, -30),
      // })
      // marker.setMap(this.mapall)
      // this.mapall.setFitView();
    },
    // åœ°å›¾äº‹ä»¶ç›‘听
    mapOn(AMap) {
      const { map } = this
      const that = this
      const geocoder = new AMap.Geocoder()
      let address = ''
      // ç›‘听地图点击事件
      map.on('click', function(e) {
        // èŽ·å–ç‚¹å‡»ä½ç½®åæ ‡
        const { lat, lng } = e.lnglat
        // è®¾ç½®æ ‡è®°ç‚¹
        const marker = new AMap.Marker({
          position: new AMap.LngLat(lng, lat),
          icon: that.positionImage,
          anchor: 'bottom-center'
        })
        map.remove(that.marker)
        map.add(marker)
        that.marker = marker
        geocoder.getAddress([lng, lat], function(status, result) {
          address = result.regeocode.formattedAddress
          that.showsearchResult = false
          that.$emit('center', { lng, lat, address })
        })
      })
    }
  }
}
</script>
<style lang="css">
.m-map {
  min-width: 500px;
  min-height: 300px;
  position: relative;
}
.m-map .map {
  width: 100%;
  height: 100%;
}
.m-map .search {
  position: absolute;
  top: 10px;
  left: 10px;
  width: 285px;
  z-index: 1;
}
.m-map .search input {
  width: 220px;
  border: 1px solid #ccc;
  height: 30px;
  box-sizing: border-box;
  line-height: 20px;
  padding: 5px;
  outline: none;
}
.m-map .search button {
  line-height: 26px;
  background: #fff;
  border: 1px solid #ccc;
  width: 50px;
  text-align: center;
}
.m-map .result {
  max-height: 300px;
  overflow: auto;
  margin-top: 10px;
}
#panel {
  position: absolute;
  top: 50px;
  left: 10px;
  width: 270px;
  z-index: 1;
}
.tool_search_result {
  position: absolute;
  top: 40px;
  left: 10px;
  width: 270px;
  height: 300px;
  overflow: auto;
  z-index: 1;
  border: 1px solid rgb(175, 175, 173);
  border-top: none;
  background: #fff;
  opacity: 0.8;
  bottom: auto;
  z-index: 12;
  position: absolute;
  text-align: left;
  font-size: 14px;
}
.tool_search_result ul {
  width: 100%;
  list-style: none;
  margin: 0;
  padding: 0;
}
.tool_search_result ul li {
  font-size: 12px;
  cursor: pointer;
  color: rgb(23, 40, 75);
  text-align: center;
  width: 100%;
  line-height: 2;
  padding: 5px 10px;
  box-sizing: border-box;
  border-bottom: 1px dashed rgb(170, 170, 172);
  display: block;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.tool_search_result ul li:last-child {
  border: none;
}
</style>
admin/src/eventBus/eventBus.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,3 @@
import Vue from 'vue'
// å…„弟组件之间进行通行
export default new Vue()
admin/src/views/Inspection/components/OperaYwPatrolPointWindow.vue
@@ -18,18 +18,20 @@
            label: 'name',
            value: 'id',
            children: 'childCategoryList',
            checkStrictly: true
          }"></el-cascader>
      </el-form-item>
      <el-form-item label="经纬度">
        <el-input v-model="form.lnglat" disabled v-trim />
      </el-form-item>
      <el-form-item>
        <mapDrag class="mapbox" @center="getCenter" />
      </el-form-item>
      <el-form-item label="巡检内容" prop="content">
        <el-input type="textarea" :rows="4" v-model="form.content" placeholder="请输入" />
      </el-form-item>
      <el-form-item label="上传图片" prop="imgurl">
        <UploadAvatarImage :file="{ 'imgurlfull': form.imgurlfull, 'imgurl': form.imgurl }"
          :uploadData="{ folder: 'projects' }" @uploadSuccess="uploadAvatarSuccess" @uploadEnd="isUploading = false"
          :uploadData="{ folder: 'ywPatrol/' }" @uploadSuccess="uploadAvatarSuccess" @uploadEnd="isUploading = false"
          @uploadBegin="isUploading = true" />
      </el-form-item>
    </el-form>
@@ -40,11 +42,13 @@
import BaseOpera from '@/components/base/BaseOpera'
import GlobalWindow from '@/components/common/GlobalWindow'
import UploadAvatarImage from '@/components/common/UploadAvatarImage'
import mapDrag from '@/components/common/map/mapDrag.vue'
import { fetchList } from '@/api/business/category'
import { detail } from '@/api/Inspection/ywPatrolPoint'
export default {
  name: 'OperaYwPatrolPointWindow',
  extends: BaseOpera,
  components: { GlobalWindow, UploadAvatarImage },
  components: { GlobalWindow, UploadAvatarImage, mapDrag },
  data() {
    return {
      // è¡¨å•数据
@@ -53,7 +57,8 @@
        code: '',
        content: '',
        imgurl: '',
        areaId: '',
        areaId: 0,
        areaIds: [],
        addr: ''
      },
      deviceList: [],
@@ -73,28 +78,64 @@
    })
  },
  methods: {
    initData() {
    open(title, row) {
      this.title = title
      this.visible = true
      if (row && row.id) {
        this.getDetail(row)
      }
    },
    getDetail(row) {
      detail(row.id).then(res => {
        this.form = { ...res }
        // this.$set(this.form, 'areaId', res.areaId)
        // console.log('res', res)
        // console.log('res', this.form)
        this.initData(res.areaId)
      })
    },
    initData(areaId) {
      fetchList({
        model: { type: 4 },
        capacity: 1000,
        page: 1,
      }).then(res => {
        this.cateList = res.records || []
        console.log('this.form.areaId', this.form)
        if (areaId) {
          this.cateList.forEach(item => {
            if (item.childCategoryList) {
              item.childCategoryList.forEach(item2 => {
                if (item2.id == areaId) {
                  this.$set(this.form, 'areaIds', [item.id, item2.id])
                  console.log('areaIds', this.form)
                }
              })
            }
          })
        }
      })
    },
    changeSel(e) {
      if (e && e.length == 1) {
        this.$set(this.form, 'catePId', e[0])
        this.$set(this.form, 'cateId', '')
      } else if (e && e.length == 2) {
        this.$set(this.form, 'catePId', e[0])
        this.$set(this.form, 'cateId', e[1])
    getCenter(data) {
      // console.log(data)
      // this.$set(this.form, 'postion', data.address)
      if(data.lng){
        this.$set(this.form, 'lnglat', data.lng + ',' + data.lat)
      } else {
        this.$set(this.form, 'catePId', '')
        this.$set(this.form, 'cateId', '')
        this.$set(this.form, 'lnglat', '')
      }
      this.search()
      this.$set(this.form, 'longitude', data.lng)
      this.$set(this.form, 'latitude', data.lat)
    },
    changeSel(e) {
      if (e && e.length == 2) {
        this.$set(this.form, 'areaId', e[1])
      } else {
        this.$set(this.form, 'areaId', '')
      }
    },
    uploadAvatarSuccess(file) {
      this.form.imgurl = file.imgurl
@@ -103,3 +144,11 @@
  }
}
</script>
<style lang="scss" scoped>
.mapbox {
  width: 100%;
  height: 400px;
  margin-bottom: 20px;
  float: left;
}
</style>
admin/src/views/Inspection/dot.vue
@@ -106,11 +106,11 @@
    },
    editClick(row) {
      if (row && row.id) {
        this.$refs.operaYwPatrolPointWindow.open('编辑巡检点')
        this.$refs.operaYwPatrolPointWindow.open('编辑巡检点', row)
      } else {
        this.$refs.operaYwPatrolPointWindow.open('新建巡检点')
      }
      this.$refs.operaYwPatrolPointWindow.initData()
      // this.$refs.operaYwPatrolPointWindow.initData()
    },
    changeSel(e) {
      if (e && e.length == 1) {
admin/src/views/operation/components/deviceEdit.vue
@@ -1,6 +1,6 @@
<template>
  <GlobalWindow :title="param.id ? '编辑设备' : '新建设备'" :confirmWorking="subLoading" :visible.sync="isShowModal" width="600px" @close="close"
    @confirm="handleSub">
  <GlobalWindow :title="param.id ? '编辑设备' : '新建设备'" :confirmWorking="subLoading" :visible.sync="isShowModal"
    width="600px" @close="close" @confirm="handleSub">
    <el-form :model="param" ref="paramRef" :rules="rules">
      <el-form-item label="设备编码" prop="code">
        <el-input v-model="param.code" placeholder="请输入" v-trim />
@@ -12,17 +12,16 @@
        <el-input v-model="param.modelNo" placeholder="请输入" v-trim />
      </el-form-item>
      <el-form-item label="设备分类" prop="">
        <el-cascader v-model="param.areaIds" @change="changeSel" placeholder="请选择巡检区域" clearable :options="cateList"
        <el-cascader v-model="param.areaIds" @change="changeSel" placeholder="请选择设备分类" clearable :options="cateList"
          :props="{
            label: 'name',
            value: 'id',
            children: 'childCategoryList',
            checkStrictly: true
            children: 'childCategoryList'
          }"></el-cascader>
      </el-form-item>
      <el-form-item label="设备管理员" prop="">
        <el-select v-model="param.realName" filterable clearable>
          <el-option value="0" label="xxx"></el-option>
        <el-select v-model="param.userId" clearable filterable class="w400">
          <el-option v-for="item in staffList" :label="item.realname" :value="item.id"></el-option>
        </el-select>
      </el-form-item>
      <el-form-item label="所在位置" prop="">
@@ -60,6 +59,7 @@
import UploadAvatarImage from '@/components/common/UploadAvatarImage'
import { fetchList } from '@/api/business/category'
import { create, updateById } from '@/api/Inspection/device'
import { getUserList } from '@/api/system/user'
import { Message } from 'element-ui'
export default {
  components: { GlobalWindow, UploadAvatarImage },
@@ -73,6 +73,7 @@
        name: [{ required: true, message: '请输入' }],
        code: [{ required: true, message: '请输入' }]
      },
      staffList: []
    }
  },
@@ -99,6 +100,11 @@
        }
      })
    },
    getStaff() {
      getUserList({}).then(res => {
        this.staffList = res
      })
    },
    initData() {
      fetchList({
        model: { type: 5 },
@@ -107,20 +113,14 @@
      }).then(res => {
        this.cateList = res.records || []
      })
      this.getStaff()
    },
    changeSel(e) {
      if (e && e.length == 1) {
        this.$set(this.param, 'catePId', e[0])
        this.$set(this.param, 'cateId', '')
      } else if (e && e.length == 2) {
        this.$set(this.param, 'catePId', e[0])
        this.$set(this.param, 'cateId', e[1])
      if (e && e.length == 2) {
        this.$set(this.param, 'areaId', e[1])
      } else {
        this.$set(this.param, 'catePId', '')
        this.$set(this.param, 'cateId', '')
        this.$set(this.param, 'areaId', '')
      }
      this.search()
    },
    uploadAvatarSuccess(file) {
      this.$set(this.param, 'imgurl', file.imgurl)
@@ -133,5 +133,3 @@
  }
}
</script>
<style lang="scss" scoped></style>
admin/src/views/project/components/OperaYwRoomWindow.vue
@@ -7,12 +7,14 @@
        </el-select>
      </el-form-item>
      <el-form-item label="所属楼宇" prop="buildingId">
        <el-select v-model="form.buildingId" placeholder="请选择楼宇" clearable>
        <el-select v-model="form.buildingId" @change="changeBuild" placeholder="请选择楼宇" clearable>
          <el-option v-for="item in buildList" :key="item.id" :label="item.name" :value="item.id"></el-option>
        </el-select>
      </el-form-item>
      <el-form-item label="楼层" prop="floor">
        <el-input v-model="form.floor" placeholder="请输入楼层" v-trim />
        <el-select v-model="form.floor" placeholder="请选择楼层" clearable>
          <el-option v-for="item in floorList" :key="item.id" :label="item.name" :value="item.id"></el-option>
        </el-select>
      </el-form-item>
      <el-form-item label="房号" prop="roomNum">
        <el-input v-model="form.roomNum" placeholder="请输入房号" v-trim />
@@ -42,6 +44,7 @@
import GlobalWindow from '@/components/common/GlobalWindow'
import { getProjectList } from '@/api/project/ywProject'
import { getBuildList } from '@/api/project/ywBuilding'
import { getFloorList } from '@/api/project/yeFloor'
export default {
  name: 'OperaYwRoomWindow',
  extends: BaseOpera,
@@ -83,6 +86,7 @@
      },
      projectList: [],
      buildList: [],
      floorList: [],
    }
  },
  created() {
@@ -100,10 +104,16 @@
    },
    changeProject(e) {
      this.form.buildingId = ''
      getBuildList({id: e}).then(res => {
      getBuildList({projectId: e}).then(res => {
        this.buildList = res || []
      })
    },
    changeBuild(e) {
      this.form.floor = ''
      getFloorList({buildingId: e}).then(res => {
        this.floorList = res || []
      })
    },
  }
}
</script>
admin/src/views/project/components/floorLevel.vue
@@ -97,6 +97,7 @@
      let page = pagination.page
      fetchList({ capacity, page, model: { buildingId: id } }).then(res => {
        this.list = res.records
        this.pagination.total = res.total
      })
    },
    editClick(row) {
admin/src/views/project/housingList.vue
@@ -34,7 +34,7 @@
        <el-table-column type="selection" width="55"></el-table-column>
        <el-table-column prop="projectName" label="项目" min-width="100px"></el-table-column>
        <el-table-column prop="buildingName" label="楼宇" min-width="70px"></el-table-column>
        <el-table-column prop="floor" label="楼层" min-width="60px"></el-table-column>
        <el-table-column prop="floorName" label="楼层" min-width="60px"></el-table-column>
        <el-table-column prop="roomNum" label="房号" min-width="60px"></el-table-column>
        <el-table-column prop="rentArea" label="计租面积(m²)" min-width="80px"></el-table-column>
        <el-table-column prop="feeArea" label="计费面积(m²)" min-width="80px"></el-table-column>
admin/src/views/workorder/components/OperaYwWorkorderWindow.vue
@@ -1,5 +1,5 @@
<template>
  <GlobalWindow width="800px" :title="title" :visible.sync="visible" :confirm-working="isWorking" @confirm="confirm">
  <GlobalWindow width="800px" :title="title" :visible.sync="visible" @close="close" :confirm-working="isWorking" @confirm="confirm">
    <el-form :model="form" ref="form" :rules="rules">
      <el-form-item label="位置类型" prop="areaType">
        <el-select v-model="form.areaType">
@@ -18,14 +18,14 @@
        </el-select>
      </el-form-item>
      <el-form-item label="选择楼层" prop="floorId">
      <el-form-item v-if="form.areaType == 1" label="选择楼层" prop="floorId">
        <el-select v-model="form.floorId">
          <el-option v-for="item in levelList" clearable filterable :label="item.name" :value="item.id" />
        </el-select>
      </el-form-item>
      <el-form-item v-if="form.areaType == 0" label="选择房间" prop="roomId">
        <el-select v-model="form.roomId" clearable filterable>
          <el-option v-for="item in roomList" :label="item.name" :value="item.id" />
          <el-option v-for="item in roomList" :label="item.roomNum" :value="item.id" />
        </el-select>
      </el-form-item>
      <el-form-item label="分类" prop="cateId">
@@ -74,7 +74,7 @@
import { getProjectList } from '@/api/project/ywProject'
import { getBuildList } from '@/api/project/ywBuilding'
import { getRoomList } from '@/api/project/ywRoom'
import { fetchList } from '@/api/project/yeFloor'
import { getFloorList } from '@/api/project/yeFloor'
import { fetchList as getCateList } from '@/api/business/category.js'
import { rules } from './config'
export default {
@@ -128,7 +128,7 @@
      uploadImgUrl: process.env.VUE_APP_API_PREFIX + '/visitsAdmin/cloudService/public/uploadBatch',
      fileList: [],
      uploadData: {
        folder: 'HIDDEN_DANGER_FILE'
        folder: 'YW_WORKORDER_FILE'
      },
    }
  },
@@ -159,6 +159,10 @@
        }
      })
    },
    close() {
      this.visible = false
      this.$emit('close')
    },
    getProject() {
      getProjectList({}).then(res => {
        this.projectList = res
@@ -175,12 +179,17 @@
    changeBuild(e) {
      this.$set(this.form, 'floorId', '')
      this.$set(this.form, 'roomId', '')
      if(this.form.areaType == 1){
      this.getLevel(e)
      }else{
      this.getRoom(e)
      }
    },
    getLevel(buildingId) {
      fetchList({ model: { buildingId }, capacity: 9999, page: 1 }).then(res => {
        this.levelList = res.records
      getFloorList({ buildingId}).then(res => {
        this.levelList = res
      })
    },
    getRoom(buildingId) {
@@ -195,7 +204,6 @@
      }else{
        this.$set(this.form, 'cateId', '')
      }
    },
    getCate() {
      getCateList({
@@ -247,12 +255,14 @@
          fileurlFull: item.url
        })
      }
      console.log('file', this.fileList)
      // this.$set(this.param, 'faceImg', file.imgurl)
      // console.log('file', this.fileList)
      this.$set(this.form, 'fileList', this.fileList)
      // this.$set(this.param, 'faceImgUrl', file.imgurlfull)
    },
    handleDelImg(i) {
      this.fileList.splice(i, 1)
      this.$set(this.form, 'fileList', this.fileList)
    },
    close() {
      this.isShowModal = false
admin/src/views/workorder/components/detail.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,371 @@
<template>
  <GlobalWindow width="820px" title="工单详情" :visible.sync="visible" :confirm-working="isWorking" @close="close"
    @confirm="confirm">
    <div class="main">
      <div class="title">
        <span>工单详情</span>
        <div>
          <div class="status primaryColor" v-if="info.dealStatus == 0 || info.dealStatus == null">待指派</div>
          <div class="status" v-if="info.dealStatus == 1">已指派</div>
          <div class="status gray" v-if="info.dealStatus == 2">已处理</div>
        </div>
      </div>
      <div class="list">
        <div class="item">
          <div class="la">位置类型</div>
          <div class="val">{{ info.areaType == 0 ? '室内维修' : '公共维修' }}</div>
        </div>
        <div class="item">
          <div class="la">对应位置</div>
          <div class="val">{{ info.buildingName }} / {{ info.roomNum || info.floorName }}</div>
        </div>
        <div class="item">
          <div class="la">工单类别</div>
          <div class="val">{{ info.categoryName }}</div>
        </div>
        <div class="item">
          <div class="la">上报人</div>
          <div class="val">{{ info.creatorName }}</div>
        </div>
        <div class="item">
          <div class="la">上报人电话</div>
          <div class="val">{{ info.creatorPhone }}</div>
        </div>
        <div class="item">
          <div class="la">上报时间</div>
          <div class="val">{{ info.createDate }}</div>
        </div>
        <div class="item max">
          <div class="la">上门时间</div>
          <div class="val">{{ info.getDate }}</div>
        </div>
        <div class="item max">
          <div class="la">问题描述</div>
          <div class="val">{{ info.content }}</div>
        </div>
        <div class="item max">
          <div class="la">问题图片</div>
          <div class="value" v-if="info.fileList == null || !info.fileList.length">无</div>
          <div class="value" v-if="info.fileList != null && info.fileList.length">
            <div v-for="item in info.fileList" :key="item.id" style="display: inline;margin-right: 20px">
              <video v-if="item.fileurlFull && item.fileurlFull.endsWith('.mp4')" ref="videoRef" controls preload="auto"
                style="width: 80px;height: 80px;object-fit: contain;" :src="item.fileurlFull" />
              <el-image v-else-if="item.fileurlFull" style="width:80px; height: 80px" :src="item.fileurlFull"
                :preview-src-list="[item.fileurlFull]">
              </el-image>
            </div>
          </div>
        </div>
      </div>
      <div class="title">工单处理</div>
      <el-form :model="param" ref="form" :rules="rules">
        <template v-if="info.dealStatus == 0 || info.dealStatus == null">
          <el-form-item label="处理方式" prop="dealType">
            <div>
              <el-radio v-model="param.dealType" :label="0">指派</el-radio>
              <el-radio v-model="param.dealType" :label="1">直接回复</el-radio>
            </div>
          </el-form-item>
          <el-form-item v-if="param.dealType == 0" label="指派给" prop="dealUserId">
            <el-select v-model="param.dealUserId" clearable filterable class="w400">
              <el-option v-for="item in staffList" :label="item.realname" :value="item.id"></el-option>
            </el-select>
          </el-form-item>
          <el-form-item v-if="param.dealType == 1" label="回复内容" prop="dealInfo">
            <el-input type="textarea" class="w400" :rows="4" v-model="param.dealInfo" placeholder="请填写说明"></el-input>
          </el-form-item>
        </template>
        <template v-if="info.dealStatus == 1 && info.dealUserId === userInfo.id">
          <el-form-item label="处理时间" prop="getDate">
            <el-date-picker type="datetime" class="w400" v-model="param.getDate" format="yyyy-MM-dd HH:mm"
              value-format="yyyy-MM-dd HH:mm:ss" placeholder="请选择"></el-date-picker>
          </el-form-item>
          <el-form-item label="回复内容" prop="dealInfo">
            <el-input type="textarea" class="w400" :rows="4" v-model="param.dealInfo" placeholder="请填写说明"></el-input>
          </el-form-item>
          <el-form-item label="现场图片">
            <div class="file_list">
              <el-upload class="avatar-uploader" :data="uploadData" multiple :limit="6" :auto-upload="true" :action="uploadImgUrl"
                :show-file-list="false" :on-success="uploadAvatarSuccess" :on-error="uploadError"
                :before-upload="beforeUpload">
                <div class="upload_wrap">
                  <i class="el-icon-plus avatar-uploader-icon"></i>
                  <div>图片/视频</div>
                </div>
              </el-upload>
              <div v-for="(item, i) in dealFileList" :key="i" class="item">
                <i @click="handleDelImg(i)" class="el-icon-error close"></i>
                <el-image :src="item.fileurlFull" :preview-src-list="[item.fileurlFull]" v-if="item.type == 0"
                  class="img"></el-image>
                <video :src="item.fileurlFull" controls v-if="item.type == 1" class="img"></video>
              </div>
            </div>
          </el-form-item>
        </template>
        <template v-if="info.dealStatus == 2">
          <div class="list">
            <div class="item item2">
              <div class="la">处理时间:</div>
              <div class="val">{{ info.getDate }}</div>
            </div>
            <div class="item item2">
              <div class="la">处理备注:</div>
              <div class="val">{{ info.dealInfo }}</div>
            </div>
            <div class="item item2">
              <div class="la">现场照片:</div>
              <div class="value" v-if="info.dealFileList == null || !info.dealFileList.length">无</div>
              <div class="value" v-if="info.dealFileList != null && info.dealFileList.length">
                <div v-for="item in info.dealFileList" :key="item.id" style="display: inline;margin-right: 20px">
                  <video v-if="item.fileurlFull && item.fileurlFull.endsWith('.mp4')" ref="videoRef" controls
                    preload="auto" style="width: 80px;height: 80px;object-fit: contain;" :src="item.fileurlFull" />
                  <el-image v-else-if="item.fileurlFull" style="width:80px; height: 80px" :src="item.fileurlFull"
                    :preview-src-list="[item.fileurlFull]">
                  </el-image>
                </div>
              </div>
            </div>
          </div>
        </template>
      </el-form>
    </div>
  </GlobalWindow>
</template>
<script>
import GlobalWindow from '@/components/common/GlobalWindow'
import BaseOpera from '@/components/base/BaseOpera'
import { detailById, dispatchOrder, dealOrder } from '@/api/workorder/ywWorkorder'
import { getUserList } from '@/api/system/user'
import { Message, Loading } from 'element-ui'
export default {
  components: {
    GlobalWindow
  },
  extends: BaseOpera,
  data() {
    return {
      id: '',
      visible: false,
      param: {
        dealType: 0
      },
      info: {},
      rules: {
        dealType: [{ required: true, message: '请选择' }],
        dealUserId: [{ required: true, message: '请选择' }],
      },
      staffList: [],
      uploadImgUrl: process.env.VUE_APP_API_PREFIX + '/visitsAdmin/cloudService/public/uploadBatch',
      dealFileList: [],
      uploadData: {
        folder: 'HIDDEN_DANGER_FILE'
      },
    }
  },
  computed: {
    userInfo() {
      return this.$store.state.userInfo
    }
  },
  created() {
    this.getStaff()
  },
  methods: {
    confirm() {
      this.$refs['form'].validate((valid) => {
        if (valid) {
          const { param, id, dealFileList, info } = this
          let fn = null
          if(info.dealStatus == 0 || info.dealStatus == null){
            fn = param.dealType == 0 ? dispatchOrder : dealOrder
          }else{
            fn = dealOrder
          }
          fn({
            id,
            ...param,
            dealFileList
          }).then(res => {
            Message.success('提交成功')
            this.visible = false
            this.$emit('success')
          })
        }
      })
    },
    getDetail() {
      const { id } = this
      detailById(id).then(res => {
        this.info = res
      })
    },
    getStaff() {
      getUserList({}).then(res => {
        this.staffList = res
      })
    },
    beforeUpload(file) {
      if (['video/mp4', 'video/ogg', 'video/flv', 'video/avi', 'video/wmv', 'video/rmvb', 'image/jpeg', 'image/jpg', 'image/png', 'image/gif'].indexOf(file.type) == -1) {
        this.$message.error('请上传正确的视频/图片格式')
        return false
      }
      if (this.dealFileList.length > 8) return Message.warning('现场图片不能超过9å¼ ')
      this.loadingInstance = Loading.service({
        lock: true,
        text: 'Loading',
        spinner: 'el-icon-loading',
        background: 'rgba(0, 0, 0, 0.7)'
      })
    },
    uploadError() {
      this.$nextTick(() => { // ä»¥æœåŠ¡çš„æ–¹å¼è°ƒç”¨çš„ Loading éœ€è¦å¼‚步关闭
        if (this.loadingInstance) {
          this.loadingInstance.close()
        }
      })
    },
    uploadAvatarSuccess(file) {
      this.$nextTick(() => { // ä»¥æœåŠ¡çš„æ–¹å¼è°ƒç”¨çš„ Loading éœ€è¦å¼‚步关闭
        if (this.loadingInstance) {
          this.loadingInstance.close()
        }
      })
      console.log('file', file)
      const item = file.data[0]
      if (['.mp4', '.avi', '.flv', '.wmv'].some(char => item.imgaddr.includes(char))) {
        this.dealFileList.push({
          type: 1,
          fileurl: item.imgaddr,
          fileurlFull: item.url
        })
      } else {
        this.dealFileList.push({
          type: 0,
          fileurl: item.imgaddr,
          fileurlFull: item.url
        })
      }
      console.log('file', this.dealFileList)
      // this.$set(this.param, 'faceImg', file.imgurl)
      // this.$set(this.param, 'faceImgUrl', file.imgurlfull)
    },
    handleDelImg(i) {
      this.dealFileList.splice(i, 1)
    },
    close() {
      this.visible = false
      this.$emit('close')
    }
  }
}
</script>
<style lang="scss" scoped>
@import '@/assets/style/variables.scss';
.main {
  padding-top: 20px;
  .title {
    font-weight: 500;
    font-size: 18px;
    color: $primary-color;
    margin-bottom: 10px;
    display: flex;
    align-items: center;
    .status {
      padding: 0 6px;
      height: 22px;
      line-height: 22px;
      border-radius: 2px;
      border: 1px solid #00BA92;
      color: #00BA92;
      font-weight: 400;
      font-size: 12px;
      margin-left: 10px;
    }
    .primaryColor {
      border: 1px solid $primary-color;
    }
    .gray {
      color: gray;
      border: 1px solid gray;
    }
  }
  .list {
    display: flex;
    flex-wrap: wrap;
    /* background: #F7F7F7; */
    border-radius: 2px;
    padding: 15px 20px;
    margin-bottom: 16px;
    .item {
      width: 33.3%;
      margin-bottom: 12px;
      .la {
        color: #7f7f7f;
        margin-top: 2px;
      }
    }
    .item2 {
      width: 100%;
      display: flex;
      align-items: center;
    }
    .max {
      width: 100%;
    }
  }
}
.file_list {
  display: flex;
  flex-wrap: wrap;
  .avatar-uploader {
    width: 92px;
    height: 92px;
    display: flex;
    justify-content: center;
    align-items: center;
    border: 1px dashed #d9d9d9;
  }
  .item {
    width: 92px;
    max-height: 92px;
    margin-left: 10px;
    position: relative;
    border: 1px dashed #d9d9d9;
    border-radius: 4px;
    display: flex;
    align-items: center;
    justify-content: center;
    .close {
      font-size: 20px;
      position: absolute;
      right: -10px;
      top: -10px;
      z-index: 111;
      color: red;
      cursor: pointer;
    }
    .img {
      width: 92px;
      max-height: 92px;
    }
  }
}
</style>
admin/src/views/workorder/workorderList.vue
@@ -2,19 +2,35 @@
  <TableLayout :permissions="['business:ywworkorder:query']">
    <!-- æœç´¢è¡¨å• -->
    <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
      <el-form-item prop="areaType">
      <el-form-item prop="areaType" label="位置类别">
        <el-select v-model="searchForm.areaType">
          <el-option label="室内维修" value="0"></el-option>
          <el-option label="公共维修" value="1"></el-option>
        </el-select>
      </el-form-item>
      <el-form-item label="请选择报修区域" prop="buildingId">
        <el-input v-model="searchForm.buildingId" placeholder="请输入所属项目编码(关联yw_building)"
          @keypress.enter.native="search"></el-input>
      <el-form-item label="选择项目" prop="projectId">
        <el-select v-model="searchForm.projectId" @change="getBuild" clearable filterable>
          <el-option v-for="item in projectList" :label="item.name" :value="item.id" />
        </el-select>
      </el-form-item>
      <el-form-item prop="cateId">
        <el-input v-model="searchForm.cateId" placeholder="报修物品类别" @keypress.enter.native="search"></el-input>
      <el-form-item label="选择楼宇" prop="buildingId">
        <el-select v-model="searchForm.buildingId" clearable filterable>
          <el-option v-for="item in buildList" :label="item.name" :value="item.id" />
        </el-select>
      </el-form-item>
      <el-form-item prop="cateId" label="物品类别">
        <el-cascader v-model="searchForm.areaIds" @change="changeSel" placeholder="请选择巡检区域" clearable
          :options="cateList" :props="{
            label: 'name',
            value: 'id',
            children: 'childCategoryList'
          }"></el-cascader>
      </el-form-item>
      <el-form-item label="提交日期">
        <el-date-picker v-model="searchForm.selDate" @change="changeSelDate" format="yyyy-MM-dd"
          value-format="yyyy-MM-dd" type="daterange"></el-date-picker>
      </el-form-item>
      <section>
        <el-button type="primary" @click="search">搜索</el-button>
        <el-button type="primary" :loading="isWorking.export" v-permissions="['business:ywworkorder:exportExcel']"
@@ -37,10 +53,15 @@
            <span v-if="scope.row.areaType == 1">公共区域</span>
          </template>
        </el-table-column>
        <el-table-column prop="" label="报修区域" min-width="100px"></el-table-column>
        <el-table-column prop="cateName" label="报修物品类型" min-width="100px"></el-table-column>
        <el-table-column prop="userName" label="上报人" min-width="100px"></el-table-column>
        <el-table-column prop="submitDate" label="上报时间" min-width="100px"></el-table-column>
        <el-table-column prop="" label="报修区域" min-width="100px">
          <template v-slot="scope">
            <span>{{ scope.row.buildingName }} / {{ scope.row.areaType == 0 ? scope.row.roomNum : scope.row.floorName
              }}</span>
          </template>
        </el-table-column>
        <el-table-column prop="categoryName" label="物品类型" min-width="100px"></el-table-column>
        <el-table-column prop="creatorName" label="上报人" min-width="100px"></el-table-column>
        <el-table-column prop="createDate" label="上报时间" min-width="100px"></el-table-column>
        <el-table-column prop="dealUserName" label="处理人" min-width="100px"></el-table-column>
        <el-table-column label="处理结果" min-width="100px">
          <template slot-scope="{row}">
@@ -49,16 +70,17 @@
            <span v-if="row.dealStatus == 2">已处理</span>
          </template>
        </el-table-column>
        <el-table-column v-if="containPermissions(['business:ywworkorder:update'])"
          label="操作" min-width="80" fixed="right">
        <el-table-column v-if="containPermissions(['business:ywworkorder:update'])" label="操作" min-width="80"
          fixed="right">
          <template slot-scope="{row}">
            <span class="primaryColor cu">查看详情</span>
            <span @click="handleDetail(row)" class="primaryColor cu">查看详情</span>
          </template>
        </el-table-column>
      </el-table>
      <pagination @size-change="handleSizeChange" @current-change="handlePageChange" :pagination="tableData.pagination">
      </pagination>
    </template>
    <Detail v-if="showDetail" ref="DetailRef" @close="showDetail = false" @success="search" />
    <!-- æ–°å»º/修改 -->
    <OperaYwWorkorderWindow ref="operaYwWorkorderWindow" @success="handlePageChange" />
  </TableLayout>
@@ -69,43 +91,29 @@
import TableLayout from '@/layouts/TableLayout'
import Pagination from '@/components/common/Pagination'
import OperaYwWorkorderWindow from './components/OperaYwWorkorderWindow'
import Detail from './components/detail'
import { getBuildList } from '@/api/project/ywBuilding'
import { getProjectList } from '@/api/project/ywProject'
import { fetchList as getCateList } from '@/api/business/category.js'
export default {
  name: 'YwWorkorder',
  extends: BaseTable,
  components: { TableLayout, Pagination, OperaYwWorkorderWindow },
  components: { TableLayout, Pagination,Detail, OperaYwWorkorderWindow },
  data() {
    return {
      // æœç´¢
      showDetail: false,
      searchForm: {
        selDate: [],
        areaType: '',
        creator: '',
        createDate: '',
        editor: '',
        editDate: '',
        isdeleted: '',
        title: '',
        remark: '',
        status: '',
        sortnum: '',
        content: '',
        getDate: '',
        areaIds: '',
        projectId: '',
        buildingId: '',
        roomId: '',
        userId: '',
        phone: '',
        submitDate: '',
        cateId: '',
        code: '',
        dealStatus: '',
        dispatchUserId: '',
        dispatchDate: '',
        dispatchInfo: '',
        dealUserId: '',
        dealDate: '',
        dealInfo: '',
        dealType: ''
      }
      },
      projectList: [],
      buildList: [],
      cateList: [],
    }
  },
  created() {
@@ -116,6 +124,64 @@
      'field.main': 'id'
    })
    this.search()
    this.initData()
  },
  methods: {
    handleDetail(row) {
      this.showDetail = true
      this.$nextTick(() => {
        this.$refs.DetailRef.visible = true
        this.$refs.DetailRef.id = row.id
        this.$refs.DetailRef.getDetail()
      })
    },
    initData() {
      getProjectList({}).then(res => {
        this.projectList = res
      })
      getCateList({
        model: { type: 3 },
        capacity: 1000,
        page: 1,
      }).then(res => {
        this.cateList = res.records || []
      })
    },
    getBuild(projectId) {
      this.$set(this.searchForm, 'buildingId', '')
      getBuildList({ projectId }).then(res => {
        this.buildList = res
      })
    },
    changeSel(e) {
      if (e && e.length == 2) {
        this.$set(this.searchForm, 'cateId', e[1])
      } else {
        this.$set(this.searchForm, 'cateId', '')
      }
    },
    reset() {
      this.searchForm = {
        selDate: [],
        areaType: '',
        areaIds: '',
        projectId: '',
        buildingId: '',
        cateId: '',
      }
      this.search()
    },
    changeSelDate(e) {
      if (e && e.length > 0) {
        this.$set(this.searchForm, 'queryStartTime', e[0] + ' 00:00:00')
        this.$set(this.searchForm, 'queryEndTime', e[1] + ' 23:59:59')
      } else {
        this.$set(this.searchForm, 'queryStartTime', '')
        this.$set(this.searchForm, 'queryEndTime', '')
      }
    },
  }
}
</script>
server/system_service/src/main/java/com/doumee/cloud/NoticesCloudController.java
ÎļþÃû´Ó server/system_service/src/main/java/com/doumee/api/cloud/NoticesCloudController.java ÐÞ¸Ä
@@ -1,4 +1,4 @@
package com.doumee.api.cloud;
package com.doumee.cloud;
import com.doumee.api.BaseController;
import com.doumee.config.annotation.CloudRequiredPermission;
server/system_service/src/main/java/com/doumee/cloud/SystemCloudController.java
ÎļþÃû´Ó server/system_service/src/main/java/com/doumee/api/cloud/SystemCloudController.java ÐÞ¸Ä
@@ -1,4 +1,4 @@
package com.doumee.api.cloud;
package com.doumee.cloud;
import com.doumee.api.BaseController;
import com.doumee.biz.system.SystemUserBiz;
server/system_service/src/main/java/com/doumee/cloud/SystemDataPermissionCloudController.java
ÎļþÃû´Ó server/system_service/src/main/java/com/doumee/api/cloud/SystemDataPermissionCloudController.java ÐÞ¸Ä
@@ -1,4 +1,4 @@
package com.doumee.api.cloud;
package com.doumee.cloud;
import com.doumee.api.BaseController;
import com.doumee.biz.system.SystemDataPermissionBiz;
server/system_service/src/main/java/com/doumee/cloud/SystemDepartmentCloudController.java
ÎļþÃû´Ó server/system_service/src/main/java/com/doumee/api/cloud/SystemDepartmentCloudController.java ÐÞ¸Ä
@@ -1,4 +1,4 @@
package com.doumee.api.cloud;
package com.doumee.cloud;
import com.doumee.api.BaseController;
import com.doumee.biz.system.SystemDepartmentBiz;
server/system_service/src/main/java/com/doumee/cloud/SystemDictCloudController.java
ÎļþÃû´Ó server/system_service/src/main/java/com/doumee/api/cloud/SystemDictCloudController.java ÐÞ¸Ä
@@ -1,4 +1,4 @@
package com.doumee.api.cloud;
package com.doumee.cloud;
import com.doumee.api.BaseController;
import com.doumee.biz.system.SystemDictBiz;
server/system_service/src/main/java/com/doumee/cloud/SystemDictDataCloudController.java
ÎļþÃû´Ó server/system_service/src/main/java/com/doumee/api/cloud/SystemDictDataCloudController.java ÐÞ¸Ä
@@ -1,4 +1,4 @@
package com.doumee.api.cloud;
package com.doumee.cloud;
import com.doumee.api.BaseController;
import com.doumee.biz.system.SystemDictDataBiz;
server/system_service/src/main/java/com/doumee/cloud/SystemLoginLogCloudController.java
ÎļþÃû´Ó server/system_service/src/main/java/com/doumee/api/cloud/SystemLoginLogCloudController.java ÐÞ¸Ä
@@ -1,4 +1,4 @@
package com.doumee.api.cloud;
package com.doumee.cloud;
import com.doumee.api.BaseController;
import com.doumee.config.annotation.CloudRequiredPermission;
server/system_service/src/main/java/com/doumee/cloud/SystemMenuCloudController.java
ÎļþÃû´Ó server/system_service/src/main/java/com/doumee/api/cloud/SystemMenuCloudController.java ÐÞ¸Ä
@@ -1,4 +1,4 @@
package com.doumee.api.cloud;
package com.doumee.cloud;
import com.doumee.api.BaseController;
import com.doumee.biz.system.SystemMenuBiz;
server/system_service/src/main/java/com/doumee/cloud/SystemMonitorCloudController.java
ÎļþÃû´Ó server/system_service/src/main/java/com/doumee/api/cloud/SystemMonitorCloudController.java ÐÞ¸Ä
@@ -1,4 +1,4 @@
package com.doumee.api.cloud;
package com.doumee.cloud;
import com.doumee.api.BaseController;
import com.doumee.config.annotation.CloudRequiredPermission;
server/system_service/src/main/java/com/doumee/cloud/SystemPermissionCloudController.java
ÎļþÃû´Ó server/system_service/src/main/java/com/doumee/api/cloud/SystemPermissionCloudController.java ÐÞ¸Ä
@@ -1,4 +1,4 @@
package com.doumee.api.cloud;
package com.doumee.cloud;
import com.doumee.api.BaseController;
import com.doumee.biz.system.SystemPermissionBiz;
server/system_service/src/main/java/com/doumee/cloud/SystemPositionCloudController.java
ÎļþÃû´Ó server/system_service/src/main/java/com/doumee/api/cloud/SystemPositionCloudController.java ÐÞ¸Ä
@@ -1,4 +1,4 @@
package com.doumee.api.cloud;
package com.doumee.cloud;
import com.doumee.api.BaseController;
import com.doumee.biz.system.SystemPositionBiz;
server/system_service/src/main/java/com/doumee/cloud/SystemRoleCloudController.java
ÎļþÃû´Ó server/system_service/src/main/java/com/doumee/api/cloud/SystemRoleCloudController.java ÐÞ¸Ä
@@ -1,4 +1,4 @@
package com.doumee.api.cloud;
package com.doumee.cloud;
import com.doumee.api.BaseController;
import com.doumee.biz.system.SystemRoleBiz;
server/system_service/src/main/java/com/doumee/cloud/SystemTraceLogCloudController.java
ÎļþÃû´Ó server/system_service/src/main/java/com/doumee/api/cloud/SystemTraceLogCloudController.java ÐÞ¸Ä
@@ -1,4 +1,4 @@
package com.doumee.api.cloud;
package com.doumee.cloud;
import com.doumee.api.BaseController;
import com.doumee.config.annotation.CloudRequiredPermission;
server/system_service/src/main/java/com/doumee/cloud/SystemUserCloudController.java
ÎļþÃû´Ó server/system_service/src/main/java/com/doumee/api/cloud/SystemUserCloudController.java ÐÞ¸Ä
@@ -1,4 +1,4 @@
package com.doumee.api.cloud;
package com.doumee.cloud;
import com.doumee.api.BaseController;
import com.doumee.biz.system.SystemUserBiz;
server/system_service/src/main/java/com/doumee/core/utils/Constants.java
@@ -51,6 +51,7 @@
    public static final String SPECIAL_COMPANY_ID ="SPECIAL_COMPANY_ID" ;
    public static final String YW_DEVICE ="YW_DEVICE" ;
    public static final String YW_PATROL ="YW_PATROL" ;
    public static final String YW_CONTRACT_BILL ="YW_CONTRACT_BILL" ;
    public static final String RESERVATION_TOTAL_NUM ="RESERVATION_TOTAL_NUM" ;
    public static final String SIGN_IN_PLACE_LAT ="SIGN_IN_PLACE_LAT" ;
@@ -117,6 +118,7 @@
    public static final String ERP ="ERP" ;
    public static final Integer THREE =3 ;
    public static final Integer FOUR =4 ;
    public static final Integer SEVEN =7 ;
    public static final Integer FIVE =5 ;
    public static final String ORG_USER_ORIGIN = "ORG_USER_ORIGIN";
    public static final String VIRTUAL_CARD_INDEX = "02098469790";
@@ -144,6 +146,7 @@
    public static final String MYSQL_BACKUP_DIR ="MYSQL_BACKUP_DIR" ;
    public static final String EVENT_FILES_PRIVATE_DOMAIN ="EVENT_FILES_PRIVATE_DOMAIN" ;
    public static final String EVENT_FILES_PUBLIC_DOMAIN ="EVENT_FILES_PUBLIC_DOMAIN" ;
    public static final String YW_CONTRACT_FILE = "YW_CONTRACT_FILE";
    public static  boolean DEALING_HK_SYNCPRIVILEGE= false;
    public static  boolean DEALING_HK_SYNCDEVICE = false;
    public static  boolean DEALING_HK_SYNCPLATFORM = false;
@@ -213,17 +216,17 @@
    }
    public interface BillPayStatus{
        //访客状态(0:未签到,1:已签到,2:已签退,3:滞留,4:未访问,5:自动签离,6:未签退)
        int waitSign = 0;
        int signin= 1;
        int signout = 2;
        int noleave =3;
        int novisit =4;
        int autoOut =5;
        int noSignout =6;
    /**
     * è´¦å•类型 0租赁条款 1物业条款 2租赁押金 3物业押金 4自建账单
     */
    public interface contractBillType{
        int lease = 0;
        int property= 1;
        int leaseDeposit = 2;
        int propertyDeposit =3;
        int create =4;
    }
    /**
     * ä½œä¸šç±»åž‹ 0自有车卸货 1自有车装货 2外协车卸货 3外协车装货 4市公司外协车卸货
@@ -1249,6 +1252,9 @@
        FN_DEVICE_RECORD_FILE(6, "阜宁服务平台运维记录图片 ", "阜宁服务平台运维记录图片 "),
        FN_PATROL_POINT_FILE(7, "巡检点附件 ", "巡检点附件 "),
        FN_CONTRACT_BILL_FILE(8, "合同账单附件 ", "合同账单附件 "),
        YW_CONTRACT_FILE(9, "合同附件 ", "合同附件 "),
        FN_CONTRACT_REVENUE_FILE(10, "收支流水附件 ", "合同账单附件 "),
        ;
        // æˆå‘˜å˜é‡
        private String name;
@@ -1303,6 +1309,74 @@
            return noteinfo;
        }
    }
    /**
     * è¿ç»´åˆåŒã€å·¥å•信息记录类型
     * æ“ä½œç±»åž‹ 0工单创建 1指派 2处理 3合同创建 4合同变更 5合同退租
     */
    public  enum YwLogType{
        WORKORDER_CREATE(0, "工单创建", "工单创建"),
        WORKORDER_DISPATCH(1, "工单指派", "工单指派"),
        WORKORDER_DEAL(2, "工单处理 ", "工单处理 "),
        CONTRACT_CREATE(3, "合同创建 ", "合同创建 "),
        CONTRACT_UPDATE(4, "合同变更 ", "合同变更 "),
        CONTRACT_BACK(5, "合同退租 ", "合同退租 "),
        ;
        // æˆå‘˜å˜é‡
        private String name;
        private int key;
        private String noteinfo;// æè¿°
        // æž„造方法
        YwLogType(int key, String name, String noteinfo) {
            this.name = name;
            this.key = key;
            this.noteinfo = noteinfo;
        }
        // æ™®é€šæ–¹æ³•
        public static String getName(int index) {
            for (MultiFile c : MultiFile.values()) {
                if (c.getKey() == index) {
                    return c.name;
                }
            }
            return null;
        }
        // æ™®é€šæ–¹æ³•
        public static String getInfo(int index) {
            for (YwLogType c : YwLogType.values()) {
                if (c.getKey() == index) {
                    return c.noteinfo;
                }
            }
            return null;
        }
        // get set æ–¹æ³•
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public int getKey() {
            return key;
        }
        public void setKey(int key) {
            this.key = key;
        }
        public String getNoteinfo() {
            return noteinfo;
        }
    }
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwContractBillCloudController.java
@@ -90,7 +90,6 @@
    @GetMapping("/{id}")
    @CloudRequiredPermission("business:ywcontractbill:query")
    public ApiResponse findById(@PathVariable Integer id,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        return ApiResponse.success(ywContractBillService.findById(id));
        return ApiResponse.success(ywContractBillService.getDetail(id));
    }
}
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwContractCloudController.java
@@ -40,6 +40,14 @@
        ywContract.setLoginUserInfo(this.getLoginUser(token));
        return ApiResponse.success(ywContractService.create(ywContract));
    }
    @PreventRepeat
    @ApiOperation("退租")
    @PostMapping("/backRent")
    @CloudRequiredPermission("business:ywcontract:update")
    public ApiResponse backRent(@RequestBody YwContract ywContract,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        ywContract.setLoginUserInfo(this.getLoginUser(token));
        return ApiResponse.success(ywContractService.backRent(ywContract));
    }
    @ApiOperation("根据ID删除")
    @GetMapping("/delete/{id}")
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwContractRevenueCloudController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,108 @@
package com.doumee.cloud.admin;
import com.doumee.api.BaseController;
import com.doumee.config.annotation.CloudRequiredPermission;
import com.doumee.core.annotation.excel.ExcelExporter;
import com.doumee.core.annotation.pr.PreventRepeat;
import com.doumee.core.model.ApiResponse;
import com.doumee.core.model.PageWrap;
import com.doumee.core.model.PageData;
import com.doumee.core.utils.Constants;
import com.doumee.dao.business.model.YwContractRevenue;
import com.doumee.service.business.YwContractRevenueService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.List;
/**
 * @author æ±Ÿè¹„蹄
 * @date 2024/11/25 10:29
 */
@Api(tags = "运维合同收支流水")
@RestController
@RequestMapping(Constants.CLOUD_SERVICE_URL_INDEX+"/business/ywContractRevenue")
public class YwContractRevenueCloudController extends BaseController {
    @Autowired
    private YwContractRevenueService ywContractRevenueService;
    @PreventRepeat
    @ApiOperation("新建")
    @PostMapping("/create")
    @CloudRequiredPermission("business:ywcontractrevenue:create")
    public ApiResponse create(@RequestBody YwContractRevenue ywContractRevenue,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        ywContractRevenue.setLoginUserInfo(getLoginUser(token));
        return ApiResponse.success(ywContractRevenueService.create(ywContractRevenue));
    }
    @ApiOperation("根据ID删除")
    @GetMapping("/delete/{id}")
    @CloudRequiredPermission("business:ywcontractrevenue:delete")
    public ApiResponse deleteById(@PathVariable Integer id,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        ywContractRevenueService.deleteById(id);
        return ApiResponse.success(null);
    }
    @ApiOperation("批量删除")
    @GetMapping("/delete/batch")
    @CloudRequiredPermission("business:ywcontractrevenue:delete")
    public ApiResponse deleteByIdInBatch(@RequestParam String ids,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        String [] idArray = ids.split(",");
        List<Integer> idList = new ArrayList<>();
        for (String id : idArray) {
            idList.add(Integer.valueOf(id));
        }
        ywContractRevenueService.deleteByIdInBatch(idList);
        return ApiResponse.success(null);
    }
    @ApiOperation("根据ID修改")
    @PostMapping("/updateById")
    @CloudRequiredPermission("business:ywcontractrevenue:update")
    public ApiResponse updateById(@RequestBody YwContractRevenue ywContractRevenue,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        ywContractRevenueService.updateById(ywContractRevenue);
        return ApiResponse.success(null);
    }
    @ApiOperation("关闭流水")
    @GetMapping("/close")
    @CloudRequiredPermission("business:ywcontractrevenue:update")
    public ApiResponse close(@RequestParam Integer id,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        ywContractRevenueService.closeRevenue(id,getLoginUser(token));
        return ApiResponse.success(null);
    }
    @ApiOperation("分页查询")
    @PostMapping("/page")
    @CloudRequiredPermission("business:ywcontractrevenue:query")
    public ApiResponse<PageData<YwContractRevenue>> findPage (@RequestBody PageWrap<YwContractRevenue> pageWrap,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        return ApiResponse.success(ywContractRevenueService.findPage(pageWrap));
    }
    @ApiOperation("收支列表")
    @PostMapping("/list")
    @CloudRequiredPermission("business:ywcontractrevenue:query")
    public ApiResponse<List<YwContractRevenue>> list (@RequestBody YwContractRevenue ywContractRevenue,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        return ApiResponse.success(ywContractRevenueService.findList(ywContractRevenue));
    }
    @ApiOperation("导出Excel")
    @PostMapping("/exportExcel")
    @CloudRequiredPermission("business:ywcontractrevenue:exportExcel")
    public void exportExcel (@RequestBody PageWrap<YwContractRevenue> pageWrap, HttpServletResponse response,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        ExcelExporter.build(YwContractRevenue.class).export(ywContractRevenueService.findPage(pageWrap).getRecords(), "运维合同收支流水", response);
    }
    @ApiOperation("根据ID查询")
    @GetMapping("/{id}")
    @CloudRequiredPermission("business:ywcontractrevenue:query")
    public ApiResponse findById(@PathVariable Integer id,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        return ApiResponse.success(ywContractRevenueService.getDetail(id));
    }
}
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwFloorCloudController.java
@@ -79,6 +79,14 @@
        return ApiResponse.success(ywFloorService.findPage(pageWrap));
    }
    @ApiOperation("分页查询")
    @PostMapping("/list")
    @CloudRequiredPermission("business:ywfloor:query")
    public ApiResponse<List<YwFloor>> findList (@RequestBody  YwFloor pageWrap,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        pageWrap. setLoginUserInfo(this.getLoginUser(token));
        return ApiResponse.success(ywFloorService.findList(pageWrap));
    }
    @ApiOperation("导出Excel")
    @PostMapping("/exportExcel")
    @CloudRequiredPermission("business:ywfloor:exportExcel")
server/visits/dmvisit_admin/src/main/java/com/doumee/config/swagger/SwaggerConfig.java
@@ -53,6 +53,7 @@
                .host(host)
                .select()
                .apis( basePackage("com.doumee.cloud"))
//                .apis( basePackage("com.doumee.api.cloud"))
//                .apis( basePackage("com.doumee.api.common"))
//                .apis( basePackage("com.doumee.cloud.openapi;com.doumee.api.common"))
server/visits/dmvisit_admin/src/main/java/com/doumee/service/impl/HkSyncEventServiceImpl.java
@@ -32,7 +32,7 @@
    @Autowired
    private InterfaceLogService interfaceLogService;
    @PostConstruct
//    @PostConstruct
    public  int  initHkConfig(){
        //获取根组织编码
        initHkParamConfig();
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/YwContractRevenueMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,14 @@
package com.doumee.dao.business;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.doumee.dao.business.model.YwContractRevenue;
import com.github.yulichang.base.MPJBaseMapper;
import com.github.yulichang.base.mapper.MPJJoinMapper;
/**
 * @author æ±Ÿè¹„蹄
 * @date 2024/11/25 10:29
 */
public interface YwContractRevenueMapper extends MPJBaseMapper<YwContractRevenue> {
}
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwContract.java
@@ -50,13 +50,16 @@
    @ExcelColumn(name="是否删除0否 1是")
    private Integer isdeleted;
    @ApiModelProperty(value = "备注")
    @ExcelColumn(name="备注")
    @ApiModelProperty(value = "合同摘要")
    @ExcelColumn(name="合同摘要")
    private String remark;
    @ApiModelProperty(value = "状态 0待执行 1执行中 2已到期 3已退租", example = "1")
    @ExcelColumn(name="状态 0待执行 1执行中 2已到期 3已退租")
    private Integer status;
    @ApiModelProperty(value = "账单结清状态: 0待付款 1部分收款 2已结清 3已关闭", example = "1")
    @ExcelColumn(name="账单结清状态: 0待付款 1部分收款 2已结清 3已关闭")
    private Integer billStatus;
    @ApiModelProperty(value = "类型 0物业租赁 1物业 2租赁", example = "1")
    @ExcelColumn(name="类型 0物业租赁 1物业 2租赁")
@@ -101,7 +104,41 @@
    @ApiModelProperty(value = "联系人编码(关联memebr)", example = "1")
    @ExcelColumn(name="联系人编码(关联memebr)")
    private Integer memberId;
    @ApiModelProperty(value = "退租类型 0到期退租 1换房退租 2违约退租 3协商退租", example = "1")
    @ExcelColumn(name="退租类型 0到期退租 1换房退租 2违约退租 3协商退租")
    private Integer btType;
    @ApiModelProperty(value = "退租操作时间")
    @ExcelColumn(name="退租操作时间")
    private Date btActDate;
    @ApiModelProperty(value = "退租操作人(关联system_user)", example = "1")
    @ExcelColumn(name="退租操作人(关联system_user)")
    private Integer btActUserId;
    @ApiModelProperty(value = "退租原因")
    @ExcelColumn(name="退租原因")
    private String btInfo;
    @ApiModelProperty(value = "退租摘要")
    @ExcelColumn(name="退租摘要")
    private String btRemark;
    @ApiModelProperty(value = "退租日期")
    @ExcelColumn(name="退租日期")
    private Date btDate;
    @ApiModelProperty(value = "退租经办人编码", example = "1")
    @ExcelColumn(name="退租经办人编码")
    private Integer btUserId;
    @ApiModelProperty(value = "退租签到日期")
    @ExcelColumn(name="退租签到日期")
    private Date btSignDate;
    @ApiModelProperty(value = "退租结算金额合计", example = "1")
    @ExcelColumn(name="退租结算金额合计")
    private BigDecimal btFee;
    @ApiModelProperty(value = "租赁条款押金(元)", example = "1")
    @ExcelColumn(name="租赁条款押金(元)")
    private BigDecimal zlDeposit;
@@ -158,12 +195,30 @@
    @ApiModelProperty(value = "公司名称")
    @TableField(exist = false)
    private String companyName;
    @ApiModelProperty(value = "经办人姓名")
    @TableField(exist = false)
    private String userName;
    @ApiModelProperty(value = "项目名")
    @TableField(exist = false)
    private String projectName;
    @ApiModelProperty(value = "租客名称")
    @TableField(exist = false)
    private String renterName;
    @ApiModelProperty(value = "创建人姓名")
    @TableField(exist = false)
    private String creatorName;
    @ApiModelProperty(value = "租赁总面积", example = "1")
    @TableField(exist = false)
    private BigDecimal totalArea;
    @ApiModelProperty(value = "物业条款集合")
    @TableField(exist = false)
    private List<YwContractDetail> wyDetailList;
    @ApiModelProperty(value = "操作日志集合")
    @TableField(exist = false)
    private List<YwWorkorderLog> logList;
    @ApiModelProperty(value = "账单集合")
    @TableField(exist = false)
    private List<YwContractBill> billList;
    @ApiModelProperty(value = "重新开始时间")
    @TableField(exist = false)
    private Date queryStartTime;
@@ -171,4 +226,17 @@
    @ApiModelProperty(value = "查询结束时间")
    @TableField(exist = false)
    private Date queryEndTime;
    @ApiModelProperty(value = "退款关闭账单数")
    @TableField(exist = false)
    private int btCLoseBill;
    @ApiModelProperty(value = "退款未结清账单数")
    @TableField(exist = false)
    private int btWaitBill;
    @ApiModelProperty(value = "退租时新增的收付款账单")
    @TableField(exist = false)
    private List<YwContractBill> addBillList;
    @ApiModelProperty(value = "当前支持退款修改金额的账单集合")
    @TableField(exist = false)
    private List<YwContractBill> canBackRentBills;
}
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwContractBill.java
@@ -28,118 +28,177 @@
    @TableId(type = IdType.AUTO)
    @ApiModelProperty(value = "主键", example = "1")
    @ExcelColumn(name="主键")
    private Integer id;
    @ApiModelProperty(value = "创建人编码", example = "1")
    @ExcelColumn(name="创建人编码")
    private Integer creator;
    @ApiModelProperty(value = "创建时间")
    @ExcelColumn(name="创建时间")
    private Date createDate;
    @ApiModelProperty(value = "更新人编码", example = "1")
    @ExcelColumn(name="更新人编码")
    private Integer editor;
    @ApiModelProperty(value = "更新时间")
    @ExcelColumn(name="更新时间")
    private Date editDate;
    @ApiModelProperty(value = "是否删除0否 1是", example = "1")
    @ExcelColumn(name="是否删除0否 1是")
    private Integer isdeleted;
    @ApiModelProperty(value = "备注")
    @ExcelColumn(name="备注")
    private String remark;
    @ApiModelProperty(value = "账单名称")
    @ExcelColumn(name="账单名称")
    private String title;
    @ApiModelProperty(value = "类型 0租赁条款 1物业条款 2租赁押金 3物业押金", example = "1")
    @ExcelColumn(name="类型 0租赁条款 1物业条款 2租赁押金 3物业押金")
    @ApiModelProperty(value = "账单编号")
    private String code;
    @ApiModelProperty(value = "类型 0合同账单 1自建账单", example = "1")
    @ExcelColumn(name="账单来源",index = 12,width = 6,valueMapping = "0=合同账单;1=自建账单;")
    private Integer type;
    @ApiModelProperty(value = "状态 0开始;1关闭;", example = "1")
    @ExcelColumn(name="状态 0开始;1关闭;")
    private Integer status;
    @ApiModelProperty(value = "开始时间")
    @ExcelColumn(name="开始时间")
    @ExcelColumn(name="计费开始日期",index = 10,width = 6,dateFormat = "yyyy-MM-dd")
    private Date startDate;
    @ApiModelProperty(value = "实际付款日")
    @ExcelColumn(name="实际付款日")
    private Date actPayDate;
    @ApiModelProperty(value = "计划付款日")
    @ExcelColumn(name="计划付款日")
    private Date planPayDate;
    @ApiModelProperty(value = "结束时间")
    @ExcelColumn(name="结束时间")
    @ExcelColumn(name="计费结束日期",index = 11,width = 6,dateFormat = "yyyy-MM-dd")
    private Date endDate;
    @ApiModelProperty(value = "实际付款日")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date actPayDate;
    @ApiModelProperty(value = "计划付款日")
    @ExcelColumn(name="计划付款日")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date planPayData;
    @ApiModelProperty(value = "实际付款日")
    @ExcelColumn(name="实际付款日")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date actPayData;
    private Date planPayDate;
    @ApiModelProperty(value = "合同条款编码(关联yw_contract_detail)", example = "1")
    @ExcelColumn(name="合同条款编码(关联yw_contract_detail)")
    private Integer detailId;
    @ApiModelProperty(value = "合同编码(关联yw_contract)", example = "1")
    @ExcelColumn(name="合同编码(关联yw_contract)")
    private Integer contractId;
    @ApiModelProperty(value = "排序码", example = "1")
    @ExcelColumn(name="排序码")
    private Integer sortnum;
    @ApiModelProperty(value = "总金额", example = "1")
    @ExcelColumn(name="总金额")
    @ApiModelProperty(value = "账单金额", example = "1")
    @ExcelColumn(name="账单金额",index = 4,width = 6)
    private BigDecimal totleFee;
    @ApiModelProperty(value = "费用类型:0=租赁费;1=物业费;2=押金;3=保证金;4=水电费;5=杂项费;6=其他", example = "1")
    @ExcelColumn(name="费用类型:0=租赁费;1=物业费;2=押金;3=保证金;4=水电费;5=杂项费;6=其他")
    @ApiModelProperty(value = "应收金额", example = "1")
    @ExcelColumn(name="应收金额",index = 5,width = 6)
    private BigDecimal receivableFee;
    @ApiModelProperty(value = "费用类型:0=租赁费;1=物业费;2=租赁押金;3=物业押金;4=水电费;5=杂项费;6=其他; 7=保证金", example = "1")
    @ExcelColumn(name="费用类型",index = 8,width = 6,valueMapping = "0=租赁费;1=物业费;2=租赁押金;3=物业押金;4=水电费;5=杂项费;6=其他;7=保证金;")
    private Integer costType;
    @ApiModelProperty(value = "账单类型:0=收款;1=付款", example = "1")
    @ExcelColumn(name="账单类型:0=收款;1=付款")
    private Integer billType;
    @ApiModelProperty(value = "费用类型:0=周期费用;1=一次性费用")
    @TableField(exist = false)
    private Integer feeType;
    @ApiModelProperty(value = "所属公司", example = "1")
    @ExcelColumn(name="所属公司")
    private Integer companyId;
    @ApiModelProperty(value = "付款状态:0=待收款;1=已结清;2=部分结清;3=待付款;4=待退款;5=已关闭")
    @ExcelColumn(name="付款状态:0=待收款;1=已结清;2=部分结清;3=待付款;4=待退款;5=已关闭")
    @ExcelColumn(name="结清状态",index = 3,width = 6,valueMapping = "0=待收款;1=已结清;2=部分结清;3=待付款;4=待退款;5=已关闭;")
    private Integer payStatus;
    @ApiModelProperty(value = "退租类型 0到期退租 1换房退租 2违约退租 3协商退租", example = "1")
    @ExcelColumn(name="退租类型 0到期退租 1换房退租 2违约退租 3协商退租")
    private Integer btType;
    @ApiModelProperty(value = "退租操作时间")
    @ExcelColumn(name="退租操作时间")
    private Date btActDate;
    @ApiModelProperty(value = "退租操作人(关联system_user)", example = "1")
    @ExcelColumn(name="退租操作人(关联system_user)")
    private Integer btActUserId;
    @ApiModelProperty(value = "退租原因")
    @ExcelColumn(name="退租原因")
    private String btInfo;
    @ApiModelProperty(value = "退租日期")
    @ExcelColumn(name="退租日期")
    private Date btDate;
    @ApiModelProperty(value = "退租经办人编码", example = "1")
    @ExcelColumn(name="退租经办人编码")
    private Integer btUserId;
    @ApiModelProperty(value = "退租签到日期")
    @ExcelColumn(name="退租签到日期")
    private Date btSignDate;
    @ApiModelProperty(value = "退租结算金额合计", example = "1")
    @ExcelColumn(name="退租结算金额合计")
    private BigDecimal btFee;
    @ApiModelProperty(value = "客户名称(付款方)", example = "1")
    @ExcelColumn(name="客户名称",index = 0,width = 10)
    @TableField(exist = false)
    private String customerName;
    @ApiModelProperty(value = "合同名称", example = "1")
    @TableField(exist = false)
    private String contractName;
    @ApiModelProperty(value = "公司名称", example = "1")
    @TableField(exist = false)
    private String companyName;
    @ApiModelProperty(value = "单号日期", example = "1",hidden = true)
    @TableField(exist = false)
    private String codeDate;
    @ApiModelProperty(value = "合同编号", example = "1")
    @ExcelColumn(name="合同编号",index = 2,width = 10)
    @TableField(exist = false)
    private String contractCode;
    @ApiModelProperty(value = "楼宇房间", example = "1")
    @ExcelColumn(name="楼宇房间",index = 1,width = 10)
    @TableField(exist = false)
    private String roomPathName;
    @ApiModelProperty(value = "计划付款日 - å¼€å§‹")
    @TableField(exist = false)
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date planPayDateStart;
    @ApiModelProperty(value = "计划付款日 - ç»“束")
    @TableField(exist = false)
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date planPayDateEnd;
    @ApiModelProperty(value = "实收金额")
    @TableField(exist = false)
    @ExcelColumn(name="实收金额",index = 6,width = 6)
    private BigDecimal actReceivableFee;
    @ApiModelProperty(value = "需收金额")
    @TableField(exist = false)
    @ExcelColumn(name="需收金额",index = 7,width = 6)
    private BigDecimal needReceivableFee;
    @ApiModelProperty(value = "是否逾期:0=否;1=是")
    @TableField(exist = false)
    @ExcelColumn(name="是否逾期",index = 9,width = 6,valueMapping = "0=未逾期;1=已逾期")
    private Integer isOverdue;
    @ApiModelProperty(value = "附件信息", example = "1")
    @TableField(exist = false)
    private List<Multifile> multifileList;
    @ApiModelProperty(value = "附件信息", example = "1")
    @ApiModelProperty(value = "关联房间数据", example = "1")
    @TableField(exist = false)
    private List<YwContractRoom> ywContractRoomList;
    @ApiModelProperty(value = "收支流水", example = "1")
    @TableField(exist = false)
    private List<YwContractRevenue> ywContractRevenueList;
}
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwContractRevenue.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,144 @@
package com.doumee.dao.business.model;
import com.baomidou.mybatisplus.annotation.TableField;
import com.doumee.core.annotation.excel.ExcelColumn;
import com.doumee.core.constants.OperaType;
import com.doumee.core.model.LoginUserModel;
import com.doumee.dao.business.vo.EditRecordDataVO;
import com.doumee.dao.system.model.Multifile;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import com.fasterxml.jackson.annotation.JsonFormat;
import javax.validation.constraints.NotBlank;
import java.util.Date;
import java.math.BigDecimal;
import java.util.List;
/**
 * è¿ç»´åˆåŒæ”¶æ”¯æµæ°´
 * @author æ±Ÿè¹„蹄
 * @date 2024/11/25 10:29
 */
@Data
@ApiModel("运维合同收支流水")
@TableName("`yw_contract_revenue`")
public class YwContractRevenue extends LoginUserModel {
    @TableId(type = IdType.AUTO)
    @ApiModelProperty(value = "主键", example = "1")
    private Integer id;
    @ApiModelProperty(value = "创建人编码", example = "1")
    private Integer creator;
    @ApiModelProperty(value = "创建时间")
    @ExcelColumn(name="创建日期",index = 8,width = 10,dateFormat = "yyyy-MM-dd HH:mm:ss")
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date createDate;
    @ApiModelProperty(value = "更新人编码", example = "1")
    private Integer editor;
    @ApiModelProperty(value = "更新时间")
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date editDate;
    @ApiModelProperty(value = "是否删除0否 1是", example = "1")
    private Integer isdeleted;
    @ApiModelProperty(value = "备注")
    private String remark;
    @ApiModelProperty(value = "状态 0=开启;1=关闭", example = "1")
    @ExcelColumn(name="状态",index = 10,width = 10,valueMapping = "0=开启;1=关闭")
    private Integer status;
    @ApiModelProperty(value = "发生金额", example = "1")
    @ExcelColumn(name="发生金额",index = 5,width = 10)
    private BigDecimal actReceivableFee;
    @ApiModelProperty(value = "实际付款日")
    @ExcelColumn(name="入账日期",index = 7,width = 10,dateFormat = "yyyy-MM-dd")
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date actPayDate;
    @ApiModelProperty(value = "付款类型:0=现金;1=网银转账;2=POS机;3=支付宝;4=微信;5=转账支票;6=其他", example = "1")
    @ExcelColumn(name="收款方式",index = 6,width = 10,valueMapping = "0=现金;1=网银转账;2=POS机;3=支付宝;4=微信;5=转账支票;6=其他;")
    private Integer payType;
    @ApiModelProperty(value = "所属公司(关联 company)", example = "1")
    private Integer companyId;
    @ApiModelProperty(value = "收支账户(关联yw_account)", example = "1")
    private Integer accountId;
    @ApiModelProperty(value = "合同主键(关联yw_contract)", example = "1")
    private Integer contractId;
    @ApiModelProperty(value = "账单主键(关联yw_contract_bill)", example = "1")
    private Integer billId;
    @ApiModelProperty(value = "收支类型:0=收入;1=支出", example = "1")
    @ExcelColumn(name="收支类型",index = 4,width = 10,valueMapping = "0=收入;1=支出")
    private Integer revenueType;
    @ApiModelProperty(value = "合同编号", example = "1")
    @ExcelColumn(name="合同编号",index = 1,width = 10)
    @TableField(exist = false)
    private String contractCode;
    @ApiModelProperty(value = "客户名称")
    @TableField(exist = false)
    private String customerNme;
    @ApiModelProperty(value = "客户名称(付款方)", example = "1")
    @ExcelColumn(name="客户名称",index = 0,width = 10)
    @TableField(exist = false)
    private String customerName;
    @ApiModelProperty(value = "创建人名称")
    @ExcelColumn(name="创建人",index = 9,width = 10)
    private String realname;
    @ApiModelProperty(value = "关联房间数据", example = "1")
    @TableField(exist = false)
    private List<YwContractRoom> ywContractRoomList;
    @ApiModelProperty(value = "附件信息", example = "1")
    @TableField(exist = false)
    private List<Multifile> multifileList;
    @ApiModelProperty(value = "入账日期 - å¼€å§‹")
    @TableField(exist = false)
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date payDateStart;
    @ApiModelProperty(value = "入账日期 - ç»“束")
    @TableField(exist = false)
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date payDateEnd;
    @ApiModelProperty(value = "楼宇房间", example = "1")
    @ExcelColumn(name="房号",index = 2,width = 10)
    @TableField(exist = false)
    private String roomPathName;
    @ApiModelProperty(value = "账单编号", example = "1")
    @ExcelColumn(name="账单编号",index = 3,width = 16)
    @TableField(exist = false)
    private String billCode;
    @ApiModelProperty(value = "操作记录", example = "1")
    @TableField(exist = false)
    private List<EditRecordDataVO> editRecordDataVOList;
}
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwContractRoom.java
@@ -1,5 +1,6 @@
package com.doumee.dao.business.model;
import com.baomidou.mybatisplus.annotation.TableField;
import com.doumee.core.annotation.excel.ExcelColumn;
import com.doumee.core.model.LoginUserModel;
import io.swagger.annotations.ApiModel;
@@ -68,4 +69,16 @@
    @ExcelColumn(name="排序码")
    private Integer sortnum;
    @ApiModelProperty(value = "项目名称")
    @TableField(exist = false)
    private String projectName;
    @ApiModelProperty(value = "楼宇名称")
    @TableField(exist = false)
    private String buildingName;
    @ApiModelProperty(value = "楼层名称")
    @TableField(exist = false)
    private String floorName;
    @ApiModelProperty(value = "房间名称")
    @TableField(exist = false)
    private String roomName;
}
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwRoom.java
@@ -94,8 +94,8 @@
    @ExcelColumn(name="计租面积(平方米)")
    private BigDecimal rentArea;
    @ApiModelProperty(value = "楼层数", example = "1")
    @ExcelColumn(name="楼层数")
    @ApiModelProperty(value = "楼层编码(关联yw_floor)", example = "1")
    @ExcelColumn(name="楼层编码")
    private Integer floor;
    @ApiModelProperty(value = "所属项目编码(关联yw_project)", example = "1")
@@ -112,4 +112,8 @@
    @ApiModelProperty(value = "楼宇名称")
    @TableField(exist = false)
    private String buildingName;
    @ApiModelProperty(value = "楼层名称")
    @TableField(exist = false)
    private String floorName;
}
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwWorkorder.java
@@ -87,6 +87,9 @@
    @ApiModelProperty(value = "所属房间编码(关联yw_room)", example = "1")
    @ExcelColumn(name="所属房间编码(关联yw_room)")
    private Integer roomId;
    @ApiModelProperty(value = "所属楼层编码(关联yw_floor)", example = "1")
    @ExcelColumn(name="所属楼层编码(关联yw_floor)")
    private Integer floorId;
    @ApiModelProperty(value = "提报人编码", example = "1")
    @ExcelColumn(name="提报人编码")
@@ -155,6 +158,9 @@
    @ApiModelProperty(value = "房源名称")
    @TableField(exist = false)
    private String roomName;
    @ApiModelProperty(value = "楼层名称")
    @TableField(exist = false)
    private String floorName;
    @ApiModelProperty(value = "房号")
    @TableField(exist = false)
    private String roomNum;
@@ -164,6 +170,9 @@
    @ApiModelProperty(value = "处理人姓名")
    @TableField(exist = false)
    private String dealUserName;
    @ApiModelProperty(value = "类别名称")
    @TableField(exist = false)
    private String categoryName;
    @ApiModelProperty(value = "分配人姓名")
    @TableField(exist = false)
    private String dispatchUserName;
@@ -182,4 +191,11 @@
    @ApiModelProperty(value = "操作记录列表")
    @TableField(exist = false)
    private List<YwWorkorderLog> logList;
    @ApiModelProperty(value = "重新开始时间")
    @TableField(exist = false)
    private Date queryStartTime;
    @ApiModelProperty(value = "查询结束时间")
    @TableField(exist = false)
    private Date queryEndTime;
}
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwWorkorderLog.java
@@ -65,8 +65,8 @@
    @ExcelColumn(name="简介")
    private String content;
    @ApiModelProperty(value = "操作类型 0工单创建 1指派 2处理", example = "1")
    @ExcelColumn(name="操作类型 0工单创建 1指派 2处理")
    @ApiModelProperty(value = "操作类型 0工单创建 1指派 2处理 3合同创建 4合同变更 5合同退租 ", example = "1")
    @ExcelColumn(name="操作类型 0工单创建 1指派 2处理 3合同创建 4合同变更 5合同退租")
    private Integer objType;
    @ApiModelProperty(value = "关联对象编码")
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/EditRecordDataVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,28 @@
package com.doumee.dao.business.vo;
import com.doumee.dao.business.model.Approve;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
import java.util.List;
/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Rk
 * @create 2024/5/23 14:56
 */
@Data
public class EditRecordDataVO {
    @ApiModelProperty(value = "操作时间")
    private Date editTime;
    @ApiModelProperty(value = "操作人")
    private String editUserName;
    @ApiModelProperty(value = "操作备注")
    private String editRemark;
}
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwContractBillService.java
@@ -95,4 +95,11 @@
     * @return long
     */
    long count(YwContractBill ywContractBill);
    YwContractBill getDetail(Integer id);
    /**
     * å¤„理账单编号
     */
    void dealDayBillCode();
}
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwContractRevenueService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,102 @@
package com.doumee.service.business;
import com.doumee.core.model.LoginUserInfo;
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.dao.business.model.YwContractRevenue;
import java.util.List;
/**
 * è¿ç»´åˆåŒæ”¶æ”¯æµæ°´Service定义
 * @author æ±Ÿè¹„蹄
 * @date 2024/11/25 10:29
 */
public interface YwContractRevenueService {
    /**
     * åˆ›å»º
     *
     * @param ywContractRevenue å®žä½“对象
     * @return Integer
     */
    Integer create(YwContractRevenue ywContractRevenue);
    /**
     * ä¸»é”®åˆ é™¤
     *
     * @param id ä¸»é”®
     */
    void deleteById(Integer id);
    /**
     * åˆ é™¤
     *
     * @param ywContractRevenue å®žä½“对象
     */
    void delete(YwContractRevenue ywContractRevenue);
    /**
     * æ‰¹é‡ä¸»é”®åˆ é™¤
     *
     * @param ids ä¸»é”®é›†
     */
    void deleteByIdInBatch(List<Integer> ids);
    /**
     * ä¸»é”®æ›´æ–°
     *
     * @param ywContractRevenue å®žä½“对象
     */
    void updateById(YwContractRevenue ywContractRevenue);
    /**
     * æ‰¹é‡ä¸»é”®æ›´æ–°
     *
     * @param ywContractRevenues å®žä½“集
     */
    void updateByIdInBatch(List<YwContractRevenue> ywContractRevenues);
    /**
     * ä¸»é”®æŸ¥è¯¢
     *
     * @param id ä¸»é”®
     * @return YwContractRevenue
     */
    YwContractRevenue findById(Integer id);
    YwContractRevenue getDetail(Integer id);
    void closeRevenue(Integer id, LoginUserInfo loginUserInfo);
    /**
     * æ¡ä»¶æŸ¥è¯¢å•条记录
     *
     * @param ywContractRevenue å®žä½“对象
     * @return YwContractRevenue
     */
    YwContractRevenue findOne(YwContractRevenue ywContractRevenue);
    /**
     * æ¡ä»¶æŸ¥è¯¢
     *
     * @param ywContractRevenue å®žä½“对象
     * @return List<YwContractRevenue>
     */
    List<YwContractRevenue> findList(YwContractRevenue ywContractRevenue);
    /**
     * åˆ†é¡µæŸ¥è¯¢
     *
     * @param pageWrap åˆ†é¡µå¯¹è±¡
     * @return PageData<YwContractRevenue>
     */
    PageData<YwContractRevenue> findPage(PageWrap<YwContractRevenue> pageWrap);
    /**
     * æ¡ä»¶ç»Ÿè®¡
     *
     * @param ywContractRevenue å®žä½“对象
     * @return long
     */
    long count(YwContractRevenue ywContractRevenue);
}
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/YwContractService.java
@@ -95,4 +95,6 @@
     * @return long
     */
    long count(YwContract ywContract);
    Integer backRent(YwContract ywContract);
}
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwContractBillServiceImpl.java
@@ -1,5 +1,6 @@
package com.doumee.service.business.impl;
import com.doumee.biz.system.SystemDictDataBiz;
import com.doumee.core.constants.ResponseStatus;
import com.doumee.core.exception.BusinessException;
import com.doumee.core.model.LoginUserInfo;
@@ -7,12 +8,8 @@
import com.doumee.core.model.PageWrap;
import com.doumee.core.utils.Constants;
import com.doumee.core.utils.Utils;
import com.doumee.dao.business.YwContractBillMapper;
import com.doumee.dao.business.YwContractRoomMapper;
import com.doumee.dao.business.model.YwContract;
import com.doumee.dao.business.model.YwContractBill;
import com.doumee.dao.business.model.YwContractRoom;
import com.doumee.dao.business.model.YwCustomer;
import com.doumee.dao.business.*;
import com.doumee.dao.business.model.*;
import com.doumee.dao.system.MultifileMapper;
import com.doumee.dao.system.model.Multifile;
import com.doumee.service.business.YwContractBillService;
@@ -27,9 +24,8 @@
import org.springframework.util.CollectionUtils;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import java.util.*;
import java.util.stream.Collectors;
/**
 * è¿ç»´åˆåŒè´¦å•信息表Service实现
@@ -48,27 +44,51 @@
    @Autowired
    private MultifileMapper multifileMapper;
    @Autowired
    private YwContractRevenueMapper ywContractRevenueMapper;
    @Autowired
    private SystemDictDataBiz systemDictDataBiz;
    @Autowired
    private YwContractMapper ywContractMapper;
    @Override
    public Integer create(YwContractBill ywContractBill) {
        if(Objects.isNull(ywContractBill)
        || Objects.isNull(ywContractBill.getContractId())
        || Objects.isNull(ywContractBill.getTotleFee())
        || Objects.isNull(ywContractBill.getPlanPayData())
                || Objects.isNull(ywContractBill.getPlanPayDate())
                || Objects.isNull(ywContractBill.getCostType())
                || Objects.isNull(ywContractBill.getBillType())
                || Objects.isNull(ywContractBill.getCompanyId())
                || Objects.isNull(ywContractBill.getStartDate())
                || Objects.isNull(ywContractBill.getEndDate())
                || com.github.xiaoymin.knife4j.core.util.CollectionUtils.isEmpty(ywContractBill.getYwContractRoomList())
                || Objects.nonNull(ywContractBill.getFeeType())
                || (Constants.equalsInteger(ywContractBill.getFeeType(),Constants.ZERO)&& (Objects.isNull(ywContractBill.getStartDate())
                || Objects.isNull(ywContractBill.getEndDate())))
        ){
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        YwContract ywContract = ywContractMapper.selectById(ywContractBill.getContractId());
        if(Objects.isNull(ywContract)){
            throw new BusinessException(ResponseStatus.DATA_EMPTY);
        }
        if(Constants.equalsInteger(ywContract.getStatus(),Constants.THREE)){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"合同状态已流转,无法进行该操作");
        }
        LoginUserInfo loginUserInfo = ywContractBill.getLoginUserInfo();
        ywContractBill.setReceivableFee(ywContractBill.getTotleFee());
        ywContractBill.setCreateDate(new Date());
        ywContractBill.setCreator(loginUserInfo.getId());
        ywContractBill.setIsdeleted(Constants.ZERO);
        ywContractBill.setType(Constants.ONE);
        ywContractBill.setStatus(Constants.ZERO);
        ywContractBillMapper.insert(ywContractBill);
        //房源数据
        if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(ywContractBill.getYwContractRoomList())){
            for (YwContractRoom ywContractRoom:ywContractBill.getYwContractRoomList()) {
                if(Objects.isNull(ywContractRoom)
@@ -80,11 +100,11 @@
                ywContractRoom.setIsdeleted(Constants.ZERO);
                ywContractRoom.setContractId(ywContractBill.getId());
                ywContractRoom.setType(Constants.ONE);
            }
            ywContractRoomMapper.insert(ywContractBill.getYwContractRoomList());
        }
        //附件数据
        if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(ywContractBill.getMultifileList())){
            for (Multifile multifile:ywContractBill.getMultifileList()) {
                if(Objects.isNull(multifile)
@@ -95,7 +115,7 @@
                multifile.setCreator(loginUserInfo.getId());
                multifile.setCreateDate(new Date());
                multifile.setIsdeleted(Constants.ZERO);
                multifile.setObjType(Constants.MultiFile.FN_PATROL_POINT_FILE.getKey());
                multifile.setObjType(Constants.MultiFile.FN_CONTRACT_BILL_FILE.getKey());
                multifile.setObjId(ywContractBill.getId());
            }
            multifileMapper.insert(ywContractBill.getMultifileList());
@@ -143,6 +163,53 @@
        return ywContractBillMapper.selectById(id);
    }
    @Override
    public YwContractBill getDetail(Integer id) {
        YwContractBill ywContractBill = ywContractBillMapper.selectJoinOne(YwContractBill.class,
                new MPJLambdaWrapper<YwContractBill>().selectAll(YwContractBill.class)
                        .select(" ( select ifnull(sum(yw.ACT_RECEIVABLE_FEE),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)
                        .leftJoin(YwCustomer.class,YwCustomer::getId,YwContract::getRenterId)
                        .eq(YwContractBill::getIsdeleted,Constants.ZERO)
                        .eq(YwContractBill::getId,id));
        if(Objects.isNull(ywContractBill)){
            throw new BusinessException(ResponseStatus.DATA_EMPTY);
        }
        //房源数据
        ywContractBill.setYwContractRoomList(ywContractRoomMapper.selectJoinList(YwContractRoom.class,new MPJLambdaWrapper<YwContractRoom>()
                .selectAll(YwContractRoom.class)
                .selectAs(YwProject::getName,YwRoom::getProjectName)
                .selectAs(YwFloor::getName,YwRoom::getFloorName)
                .selectAs(YwBuilding::getName,YwRoom::getBuildingName)
                .leftJoin(YwRoom.class,YwRoom::getId,YwContractRoom::getRoomId)
                .leftJoin(YwFloor.class,YwFloor::getId,YwRoom::getFloor)
                .leftJoin(YwProject.class,YwProject::getId,YwRoom::getProjectId)
                .leftJoin(YwBuilding.class,YwBuilding::getId,YwRoom::getBuildingId)
                .eq(YwContractRoom::getContractId,id)
                .eq(YwContractRoom::getType,Constants.ONE)
        ));
        //附件数据
        List<Multifile> multifileList = multifileMapper.selectList(new QueryWrapper<Multifile>().lambda()
                .eq(Multifile::getObjId,id)
                .eq(Multifile::getObjType,Constants.MultiFile.FN_CONTRACT_BILL_FILE.getKey()));
        if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(multifileList)){
            String path = systemDictDataBiz.queryByCode(Constants.FTP,Constants.FTP_RESOURCE_PATH).getCode()
                    +systemDictDataBiz.queryByCode(Constants.FTP,Constants.YW_CONTRACT_BILL).getCode();
            for (Multifile multifile:multifileList) {
                if(StringUtils.isNotBlank(multifile.getFileurl())){
                    multifile.setFileurlFull(path + multifile.getFileurl());
                }
            }
            ywContractBill.setMultifileList(multifileList);
        }
        return ywContractBill;
    }
    @Override
    public YwContractBill findOne(YwContractBill ywContractBill) {
        QueryWrapper<YwContractBill> wrapper = new QueryWrapper<>(ywContractBill);
@@ -160,17 +227,150 @@
        IPage<YwContractBill> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
        MPJLambdaWrapper<YwContractBill> queryWrapper = new MPJLambdaWrapper<>();
        Utils.MP.blankToNull(pageWrap.getModel());
        YwContractBill model = pageWrap.getModel();
        IPage<YwContractBill> iPage = ywContractBillMapper.selectJoinPage(page,YwContractBill.class,
        queryWrapper.selectAll(YwContractBill.class)
                    .select(" ( select ifnull(sum(yw.ACT_RECEIVABLE_FEE),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)
                .leftJoin(YwCustomer.class,YwCustomer::getId,YwContract::getRenterId)
                    .eq(YwContractBill::getIsdeleted,Constants.ZERO)
                    .like(Objects.nonNull(model)&&StringUtils.isNotBlank(model.getCustomerName()),
                            YwCustomer::getName,model.getCustomerName())
                    .eq(Objects.nonNull(model)&&Objects.nonNull(model.getStatus()),
                            YwContractBill::getStatus,model.getStatus())
                    .eq(Objects.nonNull(model)&&Objects.nonNull(model.getPayStatus()),
                            YwContractBill::getPayStatus,model.getPayStatus())
                    .eq(Objects.nonNull(model)&&Objects.nonNull(model.getType()),
                            YwContractBill::getType,model.getType())
                    .eq(Objects.nonNull(model)&&Objects.nonNull(model.getContractId()),
                            YwContractBill::getContractId,model.getContractId())
                .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())) )
        ;
        return PageData.from(ywContractBillMapper.selectPage(page, queryWrapper));
        this.dealRoomDetail(iPage.getRecords());
        for (YwContractBill ywContractBill:iPage.getRecords()) {
            //需收金额
            ywContractBill.setNeedReceivableFee(
                    ywContractBill.getReceivableFee().subtract(ywContractBill.getActReceivableFee())
            );
            //是否逾期
            if(Constants.equalsInteger(ywContractBill.getStatus(),Constants.ZERO) && (Constants.equalsInteger(ywContractBill.getPayStatus(),Constants.ZERO)
            || Constants.equalsInteger(ywContractBill.getPayStatus(),Constants.TWO)
            || Constants.equalsInteger(ywContractBill.getPayStatus(),Constants.THREE)
            || Constants.equalsInteger(ywContractBill.getPayStatus(),Constants.FOUR))
            && ywContractBill.getEndDate().getTime() < System.currentTimeMillis()){
                ywContractBill.setIsOverdue(Constants.ONE);
            }else{
                ywContractBill.setIsOverdue(Constants.ZERO);
    }
            //楼宇名称
            List<YwContractRoom> ywContractRoomList = ywContractBill.getYwContractRoomList();
            StringBuilder roomPathName = new StringBuilder();
            for (YwContractRoom ywContractRoom:ywContractRoomList) {
                if(StringUtils.isNotBlank(ywContractRoom.getProjectName())){
                    roomPathName.append(ywContractRoom.getProjectName());
                }
                if(StringUtils.isNotBlank(ywContractRoom.getBuildingName())){
                    roomPathName.append(ywContractRoom.getBuildingName());
                }
                if(StringUtils.isNotBlank(ywContractRoom.getFloorName())){
                    roomPathName.append(ywContractRoom.getFloorName());
                }
                if(StringUtils.isNotBlank(ywContractRoom.getRoomName())){
                    roomPathName.append(ywContractRoom.getRoomName());
                }
                if(StringUtils.isNotBlank(roomPathName)){
                    roomPathName.append(";");
                }
            }
            ywContractBill.setRoomPathName(roomPathName.toString());
        }
        return PageData.from(iPage);
    }
    public void dealRoomDetail(List<YwContractBill> ywContractBillList){
        //查询账单下的楼宇数据
        if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(ywContractBillList)){
            //获取所有数据
            List<Integer> billIdList = ywContractBillList.stream().map(i->i.getId()).collect(Collectors.toList());
            if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(billIdList)){
                List<YwContractRoom> ywContractRoomList  = ywContractRoomMapper.selectJoinList(YwContractRoom.class,new MPJLambdaWrapper<YwContractRoom>()
                        .selectAll(YwContractRoom.class)
                        .selectAs(YwProject::getName,YwRoom::getProjectName)
                        .selectAs(YwFloor::getName,YwRoom::getFloorName)
                        .selectAs(YwBuilding::getName,YwRoom::getBuildingName)
                        .selectAs(YwRoom::getName,YwContractRoom::getRoomName)
                        .leftJoin(YwRoom.class,YwRoom::getId,YwContractRoom::getRoomId)
                        .leftJoin(YwFloor.class,YwFloor::getId,YwRoom::getFloor)
                        .leftJoin(YwProject.class,YwProject::getId,YwRoom::getProjectId)
                        .leftJoin(YwBuilding.class,YwBuilding::getId,YwRoom::getBuildingId)
                        .in(YwContractRoom::getContractId,billIdList)
                        .eq(YwContractRoom::getType,Constants.ONE)
                );
                if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(ywContractRoomList)){
                    for (YwContractBill ywContractBill:ywContractBillList) {
                        ywContractBill.setYwContractRoomList(
                                ywContractRoomList.stream().filter(i->Constants.equalsInteger(i.getContractId(),ywContractBill.getId())).collect(Collectors.toList())
                        );
                    }
                }
            }
        }
    }
    @Override
    public long count(YwContractBill ywContractBill) {
        QueryWrapper<YwContractBill> wrapper = new QueryWrapper<>(ywContractBill);
        return ywContractBillMapper.selectCount(wrapper);
    }
    @Override
    public void dealDayBillCode(){
        List<YwContractBill> ywContractBillList = ywContractBillMapper.selectJoinList(YwContractBill.class,
                new MPJLambdaWrapper<YwContractBill>()
                        .selectAll(YwContractBill.class)
                        .select(" DATE(CREATE_DATE)  as codeDate")
                        .isNull(YwContractBill::getCode)
                        .orderByAsc(YwContractBill::getId)
        );
        if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(ywContractBillList)){
            List<String> codeDateList = ywContractBillList.stream().map(i->i.getCodeDate()).collect(Collectors.toList());
            if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(codeDateList)){
                Set<String> codeDateSet = new HashSet<String>(codeDateList);
                for (String codeDate:codeDateSet) {
                    //获取当前日期的数据
                    List<YwContractBill> codeDateBillList =
                            ywContractBillList.stream().filter(i->i.getCodeDate().equals(codeDate)).collect(Collectors.toList());
                    if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isEmpty(codeDateBillList)){
                        continue;
                    }
                    //查询最大的单号
                    YwContractBill ywContractBill = ywContractBillMapper.selectOne(new QueryWrapper<YwContractBill>().lambda()
                            .isNotNull(YwContractBill::getCode)
                            .apply(" CREATE_DATE like '"+codeDate+"%' ")
                            .orderByDesc(YwContractBill::getId)
                    );
                    Integer maxCode = Constants.ONE;
                    if(Objects.nonNull(ywContractBill)){
                        maxCode = Integer.valueOf(ywContractBill.getCode().replace("ZD"+codeDate,""));
                    }
                    for (YwContractBill contractBill:codeDateBillList) {
                        maxCode = maxCode + 1;
                        contractBill.setCode("ZD" + codeDate + "-" + StringUtils.leftPad(maxCode.toString() , 4,"0"));
                        ywContractBillMapper.update(null, new UpdateWrapper<YwContractBill>().lambda().set(YwContractBill::getCode,contractBill.getCode())
                                .eq(YwContractBill::getId,ywContractBill.getId()));
                    }
                }
            }
        }
    }
}
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwContractRevenueServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,448 @@
package com.doumee.service.business.impl;
import com.doumee.core.constants.ResponseStatus;
import com.doumee.core.exception.BusinessException;
import com.doumee.core.model.LoginUserInfo;
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.core.utils.Constants;
import com.doumee.core.utils.Utils;
import com.doumee.dao.business.*;
import com.doumee.dao.business.dao.CompanyMapper;
import com.doumee.dao.business.model.*;
import com.doumee.dao.business.vo.EditRecordDataVO;
import com.doumee.dao.system.MultifileMapper;
import com.doumee.dao.system.SystemUserMapper;
import com.doumee.dao.system.model.Multifile;
import com.doumee.dao.system.model.SystemUser;
import com.doumee.service.business.YwContractRevenueService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
/**
 * è¿ç»´åˆåŒæ”¶æ”¯æµæ°´Service实现
 * @author æ±Ÿè¹„蹄
 * @date 2024/11/25 10:29
 */
@Service
public class YwContractRevenueServiceImpl implements YwContractRevenueService {
    @Autowired
    private YwContractRevenueMapper ywContractRevenueMapper;
    @Autowired
    private YwContractBillMapper ywContractBillMapper;
    @Autowired
    private YwContractMapper ywContractMapper;
    @Autowired
    private CompanyMapper companyMapper;
    @Autowired
    private YwAccountMapper ywAccountMapper;
    @Autowired
    private MultifileMapper multifileMapper;
    @Autowired
    private YwContractRoomMapper ywContractRoomMapper;
    @Autowired
    private SystemUserMapper systemUserMapper;
    @Override
    @Transactional(rollbackFor = {Exception.class,BusinessException.class})
    public Integer create(YwContractRevenue ywContractRevenue) {
        if(Objects.isNull(ywContractRevenue)
        || Objects.isNull(ywContractRevenue.getActReceivableFee())
                || Objects.isNull(ywContractRevenue.getActPayDate())
                || Objects.isNull(ywContractRevenue.getPayType())
                || Objects.isNull(ywContractRevenue.getCompanyId())
                || Objects.isNull(ywContractRevenue.getAccountId())
                || Objects.isNull(ywContractRevenue.getBillId())
                || ywContractRevenue.getActReceivableFee().compareTo(BigDecimal.ZERO) <= Constants.ZERO
        ){
             throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        YwContractBill ywContractBill = ywContractBillMapper.selectById(ywContractRevenue.getBillId());
        if(Objects.isNull(ywContractBill)){
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"未查询到账单信息");
        }
        if(!Constants.equalsInteger(ywContractBill.getStatus(),Constants.ZERO)){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"账单状态已流转,无法进行该操作");
        }
        if(!(Constants.equalsInteger(ywContractBill.getPayStatus(),Constants.ZERO)
        || Constants.equalsInteger(ywContractBill.getPayStatus(),Constants.TWO)
                || Constants.equalsInteger(ywContractBill.getPayStatus(),Constants.THREE)
                || Constants.equalsInteger(ywContractBill.getPayStatus(),Constants.FOUR)
        )){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"账单结清状态已流转,无法进行该操作");
        }
        Company company =companyMapper.selectById(ywContractRevenue.getCompanyId());
        if(Objects.isNull(company)){
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"未查询到所属公司信息");
        }
        YwAccount ywAccount =ywAccountMapper.selectById(ywContractRevenue.getAccountId());
        if(Objects.isNull(ywAccount)){
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"未查询到收支账户信息");
        }
        LoginUserInfo loginUserInfo = ywContractRevenue.getLoginUserInfo();
        ywContractRevenue.setCreateDate(new Date());
        ywContractRevenue.setCreator(loginUserInfo.getId());
        ywContractRevenue.setIsdeleted(Constants.ZERO);
        ywContractRevenue.setStatus(Constants.ZERO);
        ywContractRevenue.setContractId(ywContractBill.getContractId());
        //根据收支情况 æ›´æ–°è´¦å•数据
        //查询当前账单下 å·²æ”¯ä»˜çš„费用
        List<YwContractRevenue> ywContractRevenueList = ywContractRevenueMapper.selectList(new QueryWrapper<YwContractRevenue>().lambda().eq(YwContractRevenue::getIsdeleted,Constants.ZERO)
                .eq(YwContractRevenue::getStatus,Constants.ZERO)
        );
        //已支付金额
        BigDecimal payTotal = BigDecimal.ZERO;
        //待支付金额
        BigDecimal waitPayTotal = BigDecimal.ZERO;
        //无付款记录 åˆ™ä¸ºåˆæ¬¡æ”¯ä»˜ æ ¹æ®è´¦å•类型 åˆ¤æ–­æ˜¯æ”¯å‡º / æ”¶å…¥
        if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isEmpty(ywContractRevenueList)){
            ywContractRevenue.setRevenueType(ywContractBill.getType());
            if(ywContractRevenue.getActReceivableFee().compareTo(ywContractBill.getReceivableFee())>Constants.ZERO){
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"请输入正确的金额!");
            }else  if(ywContractRevenue.getActReceivableFee().compareTo(ywContractBill.getReceivableFee())==Constants.ZERO){
                ywContractBill.setPayStatus(Constants.ONE);
            }else{
                ywContractBill.setPayStatus(Constants.TWO);
            }
        }else{
            //获取已支付的总金额 ï¼ˆå¯èƒ½æœ‰æ”¶å…¥ æœ‰æ”¯å‡ºï¼‰
            payTotal = ywContractRevenueList.stream().map(i->i.getActReceivableFee().multiply(
                    BigDecimal.valueOf(Constants.equalsInteger(ywContractRevenue.getRevenueType(),Constants.ZERO)?Constants.ONE:-Constants.ONE))
            ).reduce(BigDecimal.ZERO,BigDecimal::add);
            //获取待支付款金额 å¦‚果账单类型为支出 æˆ– ï¼ˆè´¦å•类型为收入 ä¸” å¾…支付金额 å°äºŽ 0) åˆ™ä¸ºæ”¯ä»˜
            waitPayTotal = ywContractBill.getReceivableFee().subtract(payTotal);
            //如果待支付金额 å¤§äºŽ 0  åˆ™æ˜¯ æ”¶å…¥ å¦åˆ™æ˜¯æ”¯å‡º å…¶ä»–状态 ä¸ºå¼‚常!
            if(waitPayTotal.compareTo(BigDecimal.ZERO)>Constants.ZERO){
                ywContractRevenue.setRevenueType(Constants.ZERO);
            }else if(waitPayTotal.compareTo(BigDecimal.ZERO)<Constants.ZERO){
                ywContractRevenue.setRevenueType(Constants.ONE);
            }else{
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"收支金额异常!请联系管理员");
            }
            //待支付的流水 å¦‚果为收入 åˆ™æ¯”对 é‡‘额值  å¦‚果是支出 åˆ™èŽ·å–ç»å¯¹å€¼ è¿›è¡Œå¯¹æ¯”
            if(Constants.equalsInteger(ywContractRevenue.getRevenueType(),Constants.ZERO)){
                //如果支付金额 å¤§äºŽ å¾…支付金额 åˆ™æç¤ºå¼‚常 å¦‚果支付金额小于 å¾…支付金额 åˆ™çŠ¶æ€ä¸å˜åŒ– å…¶ä»–状态 å¼‚常
                if(waitPayTotal.compareTo(ywContractRevenue.getActReceivableFee())>Constants.ZERO){
                    throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"请输入正确的金额!");
                }else if(waitPayTotal.compareTo(ywContractRevenue.getActReceivableFee())==Constants.ZERO){
                    ywContractBill.setPayStatus(Constants.ONE);
                }
            }else{
                waitPayTotal = waitPayTotal.abs();
                if(waitPayTotal.compareTo(ywContractRevenue.getActReceivableFee())>Constants.ZERO){
                    throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"请输入正确的金额!");
                }else if(waitPayTotal.compareTo(ywContractRevenue.getActReceivableFee())==Constants.ZERO){
                    ywContractBill.setPayStatus(Constants.ONE);
                }
            }
        }
        ywContractRevenueMapper.insert(ywContractRevenue);
        ywContractBillMapper.updateById(ywContractBill);
        //存储附件信息
        if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(ywContractRevenue.getMultifileList())){
            for (Multifile multifile:ywContractRevenue.getMultifileList()) {
                if(Objects.isNull(multifile)
                        || StringUtils.isBlank(multifile.getFileurl())
                        || StringUtils.isBlank(multifile.getName())){
                    throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"附件信息错误");
                }
                multifile.setCreator(loginUserInfo.getId());
                multifile.setCreateDate(new Date());
                multifile.setIsdeleted(Constants.ZERO);
                multifile.setObjType(Constants.MultiFile.FN_CONTRACT_REVENUE_FILE.getKey());
                multifile.setObjId(ywContractRevenue.getId());
            }
            multifileMapper.insert(ywContractRevenue.getMultifileList());
        }
        return ywContractRevenue.getId();
    }
    @Override
    public void deleteById(Integer id) {
        ywContractRevenueMapper.deleteById(id);
    }
    @Override
    public void delete(YwContractRevenue ywContractRevenue) {
        UpdateWrapper<YwContractRevenue> deleteWrapper = new UpdateWrapper<>(ywContractRevenue);
        ywContractRevenueMapper.delete(deleteWrapper);
    }
    @Override
    public void deleteByIdInBatch(List<Integer> ids) {
        if (CollectionUtils.isEmpty(ids)) {
            return;
        }
        ywContractRevenueMapper.deleteBatchIds(ids);
    }
    @Override
    public void updateById(YwContractRevenue ywContractRevenue) {
        ywContractRevenueMapper.updateById(ywContractRevenue);
    }
    @Override
    public void updateByIdInBatch(List<YwContractRevenue> ywContractRevenues) {
        if (CollectionUtils.isEmpty(ywContractRevenues)) {
            return;
        }
        for (YwContractRevenue ywContractRevenue: ywContractRevenues) {
            this.updateById(ywContractRevenue);
        }
    }
    @Override
    public YwContractRevenue findById(Integer id) {
        return ywContractRevenueMapper.selectById(id);
    }
    @Override
    public YwContractRevenue getDetail(Integer id) {
        YwContractRevenue ywContractRevenue = ywContractRevenueMapper.selectJoinOne(
                YwContractRevenue.class,
                new MPJLambdaWrapper<YwContractRevenue>().selectAll(YwContractRevenue.class)
                        .selectAs(YwContractBill::getCode,YwContractRevenue::getBillCode)
                        .selectAs(YwContract::getCode,YwContractRevenue::getContractCode)
                        .selectAs(YwCustomer::getName,YwContractRevenue::getCustomerName)
                        .selectAs(SystemUser::getRealname,YwContractRevenue::getRealname)
                        .leftJoin(YwContractBill.class,YwContractBill::getId,YwContractRevenue::getBillId)
                        .leftJoin(YwContract.class,YwContract::getId,YwContractBill::getContractId)
                        .leftJoin(YwCustomer.class,YwCustomer::getId,YwContract::getRenterId)
                        .leftJoin(SystemUser.class,SystemUser::getId,YwContractRevenue::getCreator)
                        .eq(YwContractRevenue::getId,id)
        );
       this.getRecordData(ywContractRevenue);
        return ywContractRevenue;
    }
    /**
     * æ“ä½œè®°å½•
     * @param ywContractRevenue
     */
    public void getRecordData(YwContractRevenue ywContractRevenue){
        List<EditRecordDataVO> editRecordDataVOList = new ArrayList();
        //模拟流水记录
        if(Objects.nonNull(ywContractRevenue.getCreateDate())){
            EditRecordDataVO editRecordDataVO = new EditRecordDataVO();
            editRecordDataVO.setEditRemark("创建流水");
            editRecordDataVO.setEditTime(ywContractRevenue.getCreateDate());
            SystemUser createUser = systemUserMapper.selectById(ywContractRevenue.getCreator());
            if(Objects.nonNull(createUser)){
                editRecordDataVO.setEditUserName(createUser.getRealname());
            }
            editRecordDataVOList.add(editRecordDataVO);
        }
        if(Objects.nonNull(ywContractRevenue.getEditor())){
            EditRecordDataVO editRecordDataVO = new EditRecordDataVO();
            editRecordDataVO.setEditRemark("关闭流水");
            editRecordDataVO.setEditTime(ywContractRevenue.getEditDate());
            SystemUser closeUser = systemUserMapper.selectById(ywContractRevenue.getEditor());
            if(Objects.nonNull(closeUser)){
                editRecordDataVO.setEditUserName(closeUser.getRealname());
            }
            editRecordDataVOList.add(editRecordDataVO);
        }
        if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(editRecordDataVOList)){
            ywContractRevenue.setEditRecordDataVOList(editRecordDataVOList);
        }
    }
    @Override
    public void closeRevenue(Integer id,LoginUserInfo loginUserInfo) {
        YwContractRevenue ywContractRevenue = ywContractRevenueMapper.selectById(id);
        if(Objects.isNull(ywContractRevenue)){
            throw new BusinessException(ResponseStatus.DATA_EMPTY);
        }
        YwContractBill ywContractBill = ywContractBillMapper.selectById(ywContractRevenue.getBillId());
        if(Objects.isNull(ywContractBill)){
            throw new BusinessException(ResponseStatus.DATA_EMPTY);
        }
        YwContract ywContract = ywContractMapper.selectById(ywContractBill.getContractId());
        if(Objects.isNull(ywContract)){
            throw new BusinessException(ResponseStatus.DATA_EMPTY);
        }
        if(Constants.equalsInteger(ywContract.getStatus(),Constants.THREE)){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"合同状态已流转,无法操作");
        }
        if(Constants.equalsInteger(ywContractBill.getPayStatus(),Constants.ONE)
            || Constants.equalsInteger(ywContractBill.getPayStatus(),Constants.TWO)){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"账单状态已流转,无法操作");
        }
        //查询账单下 æ‰€æœ‰çš„账单
        List<YwContractRevenue> ywContractRevenueList =  ywContractRevenueMapper.selectList(new QueryWrapper<YwContractRevenue>().lambda().eq(YwContractRevenue::getStatus,Constants.ZERO)
                        .eq(YwContractRevenue::getIsdeleted,Constants.ZERO)
                .eq(YwContractRevenue::getBillId,ywContractRevenue.getBillId())
                .ne(YwContractRevenue::getId,id)
        );
        if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isEmpty(ywContractRevenueList)){
            //无其他流水记录 æ ¹æ®è´¦å•创建类型  å˜æ›´çŠ¶æ€
            //自建账单 æ ¹æ®è´¦å•收支类型进行 å˜æ›´çŠ¶æ€
            if(Constants.equalsInteger(ywContractBill.getType(),Constants.ONE)){
                if(Constants.equalsInteger(ywContractBill.getBillType(),Constants.ZERO)){
                    ywContractBill.setPayStatus(Constants.ZERO);
                }else{
                    ywContractBill.setPayStatus(Constants.THREE);
                }
            }else{
                //合同账单 å˜ä¸º å¾…收款
                ywContractBill.setPayStatus(Constants.ZERO);
            }
        }else{
            //存在其他流水 åˆ™ç»Ÿä¸€å˜æ›´ä¸º éƒ¨åˆ†ç»“ç®—
            ywContractBill.setPayStatus(Constants.TWO);
        }
        ywContractBillMapper.update(null,new UpdateWrapper<YwContractBill>().lambda()
                .set(YwContractBill::getPayStatus,ywContractBill.getPayStatus())
                .set(YwContractBill::getEditor,loginUserInfo.getId())
                .set(YwContractBill::getEditDate," now() ")
                .eq(YwContractBill::getId,ywContractBill.getId())
        );
        ywContractRevenueMapper.update(null,new UpdateWrapper<YwContractRevenue>().lambda()
                .set(YwContractRevenue::getStatus,Constants.ONE)
                .set(YwContractRevenue::getEditor,loginUserInfo.getId())
                .set(YwContractRevenue::getEditDate," now() ")
                .eq(YwContractRevenue::getId,id));
    }
    @Override
    public YwContractRevenue findOne(YwContractRevenue ywContractRevenue) {
        QueryWrapper<YwContractRevenue> wrapper = new QueryWrapper<>(ywContractRevenue);
        return ywContractRevenueMapper.selectOne(wrapper);
    }
    @Override
    public List<YwContractRevenue> findList(YwContractRevenue ywContractRevenue) {
        List<YwContractRevenue> ywContractRevenueList = ywContractRevenueMapper.selectJoinList(YwContractRevenue.class,new MPJLambdaWrapper<YwContractRevenue>()
                .selectAll(YwContractRevenue.class)
                .selectAs(YwCustomer::getName,YwContractRevenue::getCustomerNme)
                .leftJoin(YwContract.class,YwContract::getId,YwContractRevenue::getContractId)
                .leftJoin(YwCustomer.class,YwCustomer::getId,YwContract::getRenterId)
                .eq(YwContractRevenue::getStatus,Constants.ZERO)
                .eq(Objects.nonNull(ywContractRevenue) && Objects.nonNull(ywContractRevenue.getBillId()),YwContractRevenue::getBillId,ywContractRevenue.getBillId())
        );
        return ywContractRevenueList;
    }
    @Override
    public PageData<YwContractRevenue> findPage(PageWrap<YwContractRevenue> pageWrap) {
        IPage<YwContractRevenue> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
        MPJLambdaWrapper<YwContractRevenue> queryWrapper = new MPJLambdaWrapper<>();
        Utils.MP.blankToNull(pageWrap.getModel());
        YwContractRevenue model = pageWrap.getModel();
        IPage<YwContractRevenue> iPage = ywContractRevenueMapper.selectJoinPage(page,YwContractRevenue.class,
                queryWrapper.selectAll(YwContractRevenue.class)
                        .selectAs(YwContractBill::getCode,YwContractRevenue::getBillCode)
                         .selectAs(YwContract::getCode,YwContractRevenue::getContractCode)
                        .selectAs(YwCustomer::getName,YwContractRevenue::getCustomerName)
                        .selectAs(SystemUser::getRealname,YwContractRevenue::getRealname)
                        .leftJoin(YwContractBill.class,YwContractBill::getId,YwContractRevenue::getBillId)
                        .leftJoin(YwContract.class,YwContract::getId,YwContractBill::getContractId)
                        .leftJoin(YwCustomer.class,YwCustomer::getId,YwContract::getRenterId)
                        .leftJoin(SystemUser.class,SystemUser::getId,YwContractRevenue::getCreator)
                        .eq(YwContractRevenue::getIsdeleted,Constants.ZERO)
                        .like(Objects.nonNull(model)&&StringUtils.isNotBlank(model.getCustomerNme()),
                                YwCustomer::getName,model.getCustomerNme())
                        .eq(Objects.nonNull(model)&&Objects.nonNull(model.getPayType()),
                                YwContractRevenue::getPayType,model.getPayType())
                        .eq(Objects.nonNull(model)&&Objects.nonNull(model.getRevenueType()),
                                YwContractRevenue::getRevenueType,model.getRevenueType())
                        .ge(Objects.nonNull(model)&&Objects.nonNull(model.getPayDateStart()),YwContractRevenue::getActPayDate, Utils.Date.getStart(model.getPayDateStart()))
                        .le(Objects.nonNull(model)&&Objects.nonNull(model.getPayDateEnd()),YwContractRevenue::getActPayDate, Utils.Date.getEnd(model.getPayDateEnd())) )
                ;
        this.dealRoomDetail(iPage.getRecords());
        for (YwContractRevenue ywContractRevenue:iPage.getRecords()) {
            //楼宇名称
            List<YwContractRoom> ywContractRoomList = ywContractRevenue.getYwContractRoomList();
            StringBuilder roomPathName = new StringBuilder();
            for (YwContractRoom ywContractRoom:ywContractRoomList) {
                if(StringUtils.isNotBlank(ywContractRoom.getProjectName())){
                    roomPathName.append(ywContractRoom.getProjectName()+"/");
                }
                if(StringUtils.isNotBlank(ywContractRoom.getBuildingName())){
                    roomPathName.append(ywContractRoom.getBuildingName()+"/");
                }
                if(StringUtils.isNotBlank(ywContractRoom.getFloorName())){
                    roomPathName.append(ywContractRoom.getFloorName()+"/");
                }
                if(StringUtils.isNotBlank(ywContractRoom.getRoomName())){
                    roomPathName.append(ywContractRoom.getRoomName());
                }
                if(StringUtils.isNotBlank(roomPathName)){
                    roomPathName.append(";");
                }
            }
            ywContractRevenue.setRoomPathName(roomPathName.toString());
        }
        return PageData.from(iPage);
    }
    public void dealRoomDetail(List<YwContractRevenue> ywContractRevenueList){
        //查询账单下的楼宇数据
        if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(ywContractRevenueList)){
            //获取所有数据
            List<Integer> billIdList = ywContractRevenueList.stream().map(i->i.getBillId()).collect(Collectors.toList());
            if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(billIdList)){
                List<YwContractRoom> ywContractRoomList  = ywContractRoomMapper.selectJoinList(YwContractRoom.class,new MPJLambdaWrapper<YwContractRoom>()
                        .selectAll(YwContractRoom.class)
                        .selectAs(YwProject::getName,YwRoom::getProjectName)
                        .selectAs(YwFloor::getName,YwRoom::getFloorName)
                        .selectAs(YwBuilding::getName,YwRoom::getBuildingName)
                        .selectAs(YwRoom::getName,YwContractRoom::getRoomName)
                        .leftJoin(YwRoom.class,YwRoom::getId,YwContractRoom::getRoomId)
                        .leftJoin(YwFloor.class,YwFloor::getId,YwRoom::getFloor)
                        .leftJoin(YwProject.class,YwProject::getId,YwRoom::getProjectId)
                        .leftJoin(YwBuilding.class,YwBuilding::getId,YwRoom::getBuildingId)
                        .in(YwContractRoom::getContractId,billIdList)
                        .eq(YwContractRoom::getType,Constants.ONE)
                );
                if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(ywContractRoomList)){
                    for (YwContractRevenue ywContractRevenue:ywContractRevenueList) {
                        ywContractRevenue.setYwContractRoomList(
                                ywContractRoomList.stream().filter(i->Constants.equalsInteger(i.getContractId(),ywContractRevenue.getBillId())).collect(Collectors.toList())
                        );
                    }
                }
            }
        }
    }
    @Override
    public long count(YwContractRevenue ywContractRevenue) {
        QueryWrapper<YwContractRevenue> wrapper = new QueryWrapper<>(ywContractRevenue);
        return ywContractRevenueMapper.selectCount(wrapper);
    }
}
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwContractServiceImpl.java
@@ -1,5 +1,6 @@
package com.doumee.service.business.impl;
import com.doumee.biz.system.SystemDictDataBiz;
import com.doumee.core.constants.ResponseStatus;
import com.doumee.core.exception.BusinessException;
import com.doumee.core.model.LoginUserInfo;
@@ -50,6 +51,8 @@
    @Autowired
    private MultifileMapper multifileMapper;
    @Autowired
    private YwWorkorderLogMapper  ywWorkorderLogMapper;
    @Autowired
    private CompanyMapper companyMapper;
    @Autowired
    private YwProjectMapper projectMapper;
@@ -62,11 +65,12 @@
    @Autowired
    private MemberMapper memberMapper;
    @Autowired
    private SystemDictDataBiz systemDictDataBiz;
    @Override
    @Transactional(rollbackFor = {BusinessException.class,Exception.class})
    public Integer create(YwContract model) {
        isParamValidCreated(model);
        model.setCreator(model.getLoginUserInfo().getId());
        model.setIsdeleted(Constants.ZERO);
        model.setCreateDate(new Date());
@@ -74,10 +78,295 @@
        model.setEditDate(model.getCreateDate());
        model.setEditor(model.getCreator());
        model.setStatus(Constants.ZERO);//待执行
        model.setRemark(getRemarlByParam(model));
        ywContractMapper.insert(model);
        dealDetailListBiz(model);//处理条款信息
        dealMultifileBiz(model);//处理附件信息
        dealLogBiz(model,Constants.YwLogType.CONTRACT_CREATE,null,null);//记录新建日志
        return model.getId();
    }
    private String getRemarlByParam(YwContract model) {
        String str = "";
        YwContractDetail zl = model.getZlDetailList()!=null&&model.getZlDetailList().size()>0?model.getZlDetailList().get(0):null;
        YwContractDetail yw = model.getWyDetailList()!=null&&model.getWyDetailList().size()>0?model.getWyDetailList().get(0):null;
        //起租日2024/06/01,租赁数为500㎡。首期租赁三月一付,租金单价35元/㎡·月。首期物业三月一付,物业单价4.3元/㎡·月
        String str0 = "合同摘要:起租日{param1},租赁数为{param2}㎡。首期租赁{param3},租金单价{param4}元{param5}。首期物业{param6},物业单价{param7}{param8}";
        String str1 = "合同摘要:起租日{param1},租赁数为{param2}㎡。首期租赁{param3},租金单价{param4}元{param5}。";
        String str2 = "合同摘要:起租日{param1},首期物业{param6},物业单价{param7}元{param8}";
        if(Constants.equalsInteger(model.getType(),Constants.ZERO)){
            str= str0;
        }
        if(Constants.equalsInteger(model.getType(),Constants.ONE)){
            str= str1;
        }
        if(Constants.equalsInteger(model.getType(),Constants.TWO)){
            str= str2;
        }
        str = str.replace("{param1}",DateUtil.getDateLongSlash(model.getStartDate()))
                .replace("{param2}",model.getTotalArea().intValue()+"")
                .replace("{param3}",getPayTypeByNum(model.getZlPayType()))
                .replace("{param4}",zl!=null&&zl.getPrice()!=null?(zl.getPrice().intValue()+""):"0")
                .replace("{param5}",getPayTypeByNum(model.getWyPayType()))
                .replace("{param6}",getUnitTypeByNum(zl))
                .replace("{param7}",zl!=null&&yw.getPrice()!=null?(zl.getPrice().intValue()+""):"0")
                .replace("{param8}",getUnitTypeByNum(yw));
        return  str;
    }
    private String getbackRentRemarkByParam(YwContract model) {
        BigDecimal fee = Constants.formatBigdecimal(model.getBtFee());
        String str = "退租摘要:剩余未结清账单{param1}份,关闭账单{param2}份【退租日{param3},退租费用合计需{param4}{param5}元。】";
        str = str.replace("{param1}",model.getBtWaitBill()+"")
                .replace("{param2}",DateUtil.getDateLongSlash(model.getBtDate()))
                .replace("{param3}",fee.compareTo(new BigDecimal(0)) >=0?"收":"付")
                .replace("{param4}",(fee.compareTo(new BigDecimal(0)) >=0?
                        Constants.formatBigdecimal(model.getBtFee()).intValue()
                        :(Constants.formatBigdecimal(model.getBtFee()).intValue() * -1))+"" );
        return  str;
    }
    private CharSequence getUnitTypeByNum(YwContractDetail zl) {
        if(zl==null){
            return "";
        }
     //   ä»˜æ¬¾å‘¨æœŸç±»åž‹ 0=元每平米天;1=元每平米月;2=元每平米年;3=元每天;4=元每月;5=元每年;6=元每场;
        int zlPayType = Constants.formatIntegerNum(zl.getCircleType());
        if(zlPayType == 1){
            return "元/㎡·月";
        }else   if(zlPayType == 2){
            return "元/㎡·天";
        }else  if(zlPayType == 3){
            return "元/天";
        }else  if(zlPayType == 4){
            return "元/月";
        }else  if(zlPayType == 5){
            return "元/å¹´";
        }else  if(zlPayType == 6){
            return "元/场";
        }
        return "元/㎡·天";
    }
    private CharSequence getPayTypeByNum(Integer zlPayType) {
        //租赁支付方式 0=一次性付款;1=每三个月一付;2=六个月一付;3=一年一付
        if(zlPayType == 1){
            return "3个月一付";
        }else   if(zlPayType == 2){
            return "6个月一付";
        }else  if(zlPayType == 3){
            return "1年一付";
        }
        return "一次性付款";
    }
    /**
     * é€€ç§Ÿæäº¤
     * @param param
     * @return
     */
    @Override
    @Transactional(rollbackFor = {BusinessException.class,Exception.class})
    public  Integer backRent(YwContract param){
        isParamValidBackRent(param);
        param.setEditDate(new Date());
        param.setEditor(param.getLoginUserInfo().getId());
        //处理
        dealBackRentBillBiz(param);
        YwContract update = new YwContract();
        update.setEditDate(new Date());
        update.setEditor(param.getLoginUserInfo().getId());
        update.setBtActDate(update.getEditDate());
        update.setBtActUserId(update.getEditor());
        update.setStatus(Constants.THREE);
        update.setBtInfo(param.getBtInfo());
        update.setBtDate(param.getBtDate());
        update.setBtType(param.getBtType());
        update.setBtUserId(param.getBtUserId());
        update.setBtFee(param.getBtFee());
        update.setBtRemark(getbackRentRemarkByParam(param));
        ywContractMapper.updateById(update);
        dealLogBiz(param,Constants.YwLogType.CONTRACT_BACK,null,null);
        return param.getId();
    }
    private void dealBackRentBillBiz(YwContract param) {
        //查询合同全部账单信息
        List<YwContractBill> closeBills = new ArrayList<>();//带关闭
        List<YwContractBill> newBills = new ArrayList<>();//新的账单
        List<YwContractBill> noBills = new ArrayList<>();//不需要结算的账单
        List<YwContractBill> yjBills = new ArrayList<>();//押金账单
        List<YwContractBill> canBills = new ArrayList<>();//可退租修改数据
        List<YwContractBill> allBills = ywContractBillMapper.selectList(new QueryWrapper<YwContractBill>().
                select("*," +
                        "( select ifnull(sum(yw.ACT_RECEIVABLE_FEE),0) from  yw_contract_revenue yw where yw.bill_id = yw_contract_bill.id and yw.status = 0 and yw.isdeleted = 0 ) as  actReceivableFee " )
                .lambda().
                eq(YwContractBill::getIsdeleted,Constants.ZERO)
                .eq(YwContractBill::getContractId,param.getId()));
        if(allBills!=null && allBills.size()>0){
            for(YwContractBill bill: allBills){
                //付款状态:0=待收款;1=已结清;2=部分结清;3=待付款;4=待退款;5=已关闭
                // å¦‚果是押金或者保证金,不支持退款,保持原来的状态, 0=租赁费;1=物业费;2=租赁押金;3=物业押金;4=水电费;5=杂项费;6=其他;7=保证金
                if(Constants.equalsInteger(Constants.THREE,bill.getCostType())
                        ||  Constants.equalsInteger(Constants.FOUR,bill.getCostType())
                        ||Constants.equalsInteger(Constants.SEVEN,bill.getCostType())){
                    //押金和保证金
                    yjBills.add(bill);
                    continue;
                }
                if(Constants.equalsInteger(bill.getPayStatus(),Constants.ZERO)
                        ||Constants.equalsInteger(bill.getPayStatus(),Constants.THREE)){
                    if(bill.getStartDate().getTime()>param.getEditDate().getTime()){
                        //如果还没开始,账单直接关闭
                        closeBills.add(bill);
                        noBills.add(bill);
                    }else{
                        canBills.add(bill);
                    }
                }else  if(Constants.equalsInteger(bill.getPayStatus(),Constants.ONE) ){
                    if(bill.getEndDate().getTime()<param.getEditDate().getTime()){
                        //如果已结清,账单直接关闭
                        noBills.add(bill);
                    }else{
                        canBills.add(bill);
                    }
                }else  if(Constants.equalsInteger(bill.getPayStatus(),Constants.TWO) ){
                     canBills.add(bill);
                }
            }
        }
        if(closeBills.size()>0){
            //直接关闭关闭账单
            for(YwContractBill b : closeBills){
                b.setStatus(Constants.ONE);
                b.setEditDate(param.getEditDate());
                b.setEditor(param.getEditor());
                //关闭订单
                ywContractBillMapper.updateById(b);
            }
        }
        int yjNoBills =0;
        if(yjBills.size()>0){
            // å¦‚果是押金或者保证金,不支持退款,保持原来的状态, 0=租赁费;1=物业费;2=租赁押金;3=物业押金;4=水电费;5=杂项费;6=其他;7=保证金
            for(YwContractBill bill : yjBills){
               if(!Constants.equalsInteger(bill.getPayStatus(),Constants.ONE) ){
                   //如果是未结清押金
                   yjNoBills ++;
               }
            }
        }
        BigDecimal totalBackFee = new BigDecimal(0);
        if(canBills.size()>0){
            //直接关闭关闭账单
            for(YwContractBill b : canBills){
                BigDecimal fee = new BigDecimal(0);
                YwContractBill editBill = getEditBillFromListByParam(b,param.getCanBackRentBills());
                if(editBill != null){
                    //付款状态:0=待收款;1=已结清;2=部分结清;3=待付款;4=待退款;5=已关闭
                    //如果账单信息做了编辑,金额计算 å®žæ”¶é‡‘额 å’Œ ä¿®æ”¹åŽåº”收金额作对比,判断是否应该退款
                    fee = Constants.formatBigdecimal(b.getActReceivableFee()).subtract(editBill.getReceivableFee());
                    if(fee.compareTo(new BigDecimal(0))== 0){
                        //如果费用正好,则修改账单信息为已结清
                        b.setStatus(Constants.ONE);
                    }else if(fee.compareTo(new BigDecimal(0))> 0){
                        //如果需要进行退款,更新账单信息为待退款
                        b.setStatus(Constants.FOUR);
                    }else if(fee.compareTo(new BigDecimal(0)) < 0){
                        //如果账单还有款待收,则保持状态不变
                    }
                }
                b.setEditDate(param.getEditDate());
                b.setEditor(param.getEditor());
                b.setBtActDate(param.getBtActDate());
                b.setBtDate(param.getBtDate());
                b.setBtFee(fee);
                b.setBtInfo(param.getBtInfo());
                b.setBtUserId(param.getBtUserId());
                b.setBtSignDate(param.getBtSignDate());
                b.setBtType(param.getBtType());
                //关闭订单
                ywContractBillMapper.updateById(b);
                totalBackFee = totalBackFee.add(fee);//累计退款金额
            }
        }
        if(param.getAddBillList()!=null && param.getAddBillList().size()>0){
            for(YwContractBill addBill : param.getAddBillList()){
                addBill.setIsdeleted(Constants.ZERO);
                addBill.setContractId(param.getId());
                addBill.setType(Constants.ONE);
                addBill.setStatus(Constants.ZERO);
                if(Constants.equalsInteger(addBill.getBillType(),Constants.ZERO)){
                    //如果是收款
                    totalBackFee = totalBackFee.add(Constants.formatBigdecimal(addBill.getActReceivableFee()));
                    addBill.setPayStatus(Constants.ZERO);
                    addBill.setBtFee(Constants.formatBigdecimal(addBill.getActReceivableFee()));
                }else{
                    //如果是付款
                    addBill.setPayStatus(Constants.THREE);
                    addBill.setBtFee(Constants.formatBigdecimal(addBill.getActReceivableFee()).multiply(new BigDecimal(-1)));
                }
                totalBackFee = totalBackFee.add(Constants.formatBigdecimal(addBill.getBtFee()));
                addBill.setEditDate(param.getEditDate());
                addBill.setEditor(param.getEditor());
                addBill.setBtActDate(param.getBtActDate());
                addBill.setBtDate(param.getBtDate());
                addBill.setBtInfo(param.getBtInfo());
                addBill.setBtUserId(param.getBtUserId());
                addBill.setBtSignDate(param.getBtSignDate());
                addBill.setBtType(param.getBtType());
                newBills.add(addBill);
            }
            ywContractBillMapper.insert(param.getAddBillList());//批量插入数据
        }
        param.setBtWaitBill(canBills.size() + newBills.size()+yjNoBills);//未清算的账单数量
        param.setBtCLoseBill(closeBills.size());
        param.setBtFee(totalBackFee);
    }
    private YwContractBill getEditBillFromListByParam(YwContractBill b, List<YwContractBill> canBackRentBills) {
        for(YwContractBill d : canBackRentBills){
            if(Constants.equalsInteger(b.getId(),d.getId())){
                return d;
            }
        }
        return null;
    }
    private void isParamValidBackRent(YwContract param) {
        if(param.getId()==null
                || param.getBtType() == null
                || param.getBtDate() == null
                || param.getBtUserId() == null
                || param.getBtSignDate() == null
                ||StringUtils.isBlank( param.getBtInfo())){
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        YwContract model = ywContractMapper.selectById(param.getId());
        if(model==null || Constants.equalsInteger(model.getIsdeleted(),Constants.ONE)){
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"对不起,合同信息不存在,请返回列表刷新重试!");
        }
        SystemUser user = systemUserMapper.selectById(param.getUserId());
        if(user ==null ||  (user.getDeleted()!=null&& user.getDeleted() )){
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"对不起,经办人信息不存在!");
        }
        if(param.getAddBillList()!=null && param.getAddBillList().size()>0){
            for(YwContractBill bill: param.getAddBillList()){
                if(bill.getCostType() == null
                        ||bill.getFeeType() == null
                        ||bill.getReceivableFee() == null
                        ||bill.getReceivableFee().compareTo(new BigDecimal(0)) < 1
                        ||bill.getCompanyId() == null
                        ||bill.getPlanPayDate() == null
                        ||bill.getBillType() == null
                        ||(Constants.equalsInteger(bill.getBillType(),Constants.ZERO)
                        &&Constants.equalsInteger(bill.getFeeType(),Constants.ZERO)
                        && (bill.getStartDate() ==null || bill.getEndDate() ==null) )){
                    throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,请按要求填写自建账单信息!");
                }
            }
        }
    }
    private void dealDetailListBiz(YwContract model) {
@@ -182,10 +471,10 @@
        bill.setStatus(Constants.ZERO);
        bill.setStartDate(model.getStartDate());
        bill.setEndDate(model.getEndDate());
        bill.setType(type);
        bill.setType(Constants.ZERO);
        bill.setCostType(type);
        bill.setTotleFee(type==Constants.THREE?model.getZlDeposit():model.getWyDeposit());//押金费用
        bill.setSortnum(0);
        bill.setTitle(type==Constants.THREE?"租赁押金":"物业押金" );
        return bill;
    }
@@ -387,7 +676,8 @@
        bill.setContractId(model.getId());
        bill.setStatus(Constants.ZERO);
        bill.setDetailId(d.getId());
        bill.setType(d.getType());
        bill.setCostType(d.getType());
        bill.setType(Constants.ZERO);
        return bill;
    }
@@ -400,7 +690,28 @@
        return  data;
    }
    private void initFiles(YwContract model) {
        List<Multifile> multifiles = multifileMapper.selectList(new QueryWrapper<Multifile>().lambda()
                .eq(Multifile::getObjId, model.getId() )
                .in(Multifile::getObjType, Arrays.asList(new Integer[]{Constants.MultiFile.YW_CONTRACT_FILE.getKey()}))
                .eq(Multifile::getIsdeleted,Constants.ZERO));
        if(multifiles!=null){
            String path = systemDictDataBiz.queryByCode(Constants.FTP,Constants.FTP_RESOURCE_PATH).getCode()
                    +systemDictDataBiz.queryByCode(Constants.FTP,Constants.YW_CONTRACT_FILE).getCode();
            for(Multifile f : multifiles){
                if(StringUtils.isBlank(f.getFileurl())){
                    continue;
                }
                f.setFileurlFull(path+f.getFileurl());
                //现场情况
                if(model.getFileList() == null){
                    model.setFileList(new ArrayList<>());
                }
                model.getFileList().add(f);
            }
        }
    }
    private void dealMultifileBiz(YwContract model) {
@@ -416,7 +727,7 @@
                multifile.setIsdeleted(Constants.ZERO);
                multifile.setObjId(model.getId());
                multifile.setCreator(model.getCreator());
                multifile.setObjType(Constants.MultiFile.YW_WORKORDER_PROBLEM.getKey());
                multifile.setObjType(Constants.MultiFile.YW_CONTRACT_FILE.getKey());
                multifile.setSortnum(i+1);
                fileList.add(multifile);
            }
@@ -536,6 +847,10 @@
        if(rooms.size() != rooms.size()){
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,存在无效的房源信息!");
        }
        model.setTotalArea(new BigDecimal(0));
        for(YwRoom r : rooms){
            model.setTotalArea(model.getTotalArea().add(Constants.formatBigdecimal(r.getArea())));
        }
        YwCustomer customer = customerMapper.selectById(model.getRenterId());
        if(customer ==null || Constants.equalsInteger(customer.getIsdeleted(),Constants.ONE)){
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"对不起,选择租客信息不存在,请返回刷新重试!");
@@ -594,10 +909,113 @@
            this.updateById(ywContract);
        }
    }
    private void dealLogBiz(YwContract model,Constants.YwLogType type,String param1,String param2) {
        YwWorkorderLog log = new YwWorkorderLog();
        log.setCreateDate(model.getEditDate());
        log.setCreator(model.getCreator());
        log.setJobId(model.getId());
        log.setIsdeleted(Constants.ZERO);
        log.setObjId(model.getId()+"");
        log.setObjType(type.getKey());
        log.setParam1(param1);
        log.setParam2(param2);
        log.setTitle(type.getNoteinfo());
        ywWorkorderLogMapper.insert(log);
    }
    @Override
    public YwContract findById(Integer id) {
        return ywContractMapper.selectById(id);
        MPJLambdaWrapper<YwContract> queryWrapper = new MPJLambdaWrapper<>();
        queryWrapper.selectAll(YwContract.class )
                .selectAs(Company::getName,YwContract::getCompanyName )
                .selectAs(SystemUser::getRealname,YwContract::getUserName )
                .selectAs(YwCustomer::getName,YwContract::getRenterName )
                .selectAs(YwProject::getName,YwContract::getProjectName )
                .select("t4.realname",YwContract::getCreatorName )
                .leftJoin(Company.class,Company::getId,YwContract::getCompanyId)
                .leftJoin(SystemUser.class,SystemUser::getId,YwContract::getUserId)
                .leftJoin(SystemUser.class,SystemUser::getId,YwContract::getCreator)
                .leftJoin(YwProject.class,YwProject::getId,YwContract::getProjectId)
                .leftJoin(YwCustomer.class,YwCustomer::getId,YwContract::getRenterId);
        YwContract model = ywContractMapper.selectJoinOne(YwContract.class,queryWrapper);
        if(model != null){
            //合同附件
            initFiles(model);
            //查询房源信息数据
            MPJLambdaWrapper<YwRoom> rw = new MPJLambdaWrapper<>();
            rw.selectAll(YwRoom.class )
                    .selectAs(YwProject::getName,YwRoom::getProjectName)
                    .selectAs(YwFloor::getName,YwRoom::getFloorName)
                    .selectAs(YwBuilding::getName,YwRoom::getBuildingName)
                    .leftJoin(YwProject.class,YwProject::getId,YwRoom::getProjectId)
                    .leftJoin(YwBuilding.class,YwBuilding::getId,YwRoom::getBuildingId)
                    .leftJoin(YwFloor.class,YwFloor::getId,YwRoom::getFloor)
                    .eq(YwRoom::getIsdeleted,Constants.ZERO)
                    .exists("(select a.id from yw_contract_room a where a.isdeleted=1 and a.room_id=t.id and a.contract_id="+model.getId()+")");
            model.setRoomList(roomMapper.selectJoinList(YwRoom.class,rw));
            //查询租賃条款信息
            MPJLambdaWrapper<YwContractDetail> dw = new MPJLambdaWrapper<>();
            dw.selectAll(YwContractDetail.class )
                    .eq(YwContractDetail::getIsdeleted,Constants.ZERO)
                    .eq(YwContractDetail::getContractId,model.getId())
                    .in(YwContractDetail::getType,Constants.ZERO,Constants.TWO)
                    .orderByAsc(YwContractDetail::getSortnum);
            model.setZlDetailList(ywContractDetailMapper.selectJoinList(YwContractDetail.class,dw));
            //查询物業条款信息
            dw = new MPJLambdaWrapper<>();
            dw.selectAll(YwContractDetail.class )
                    .eq(YwContractDetail::getIsdeleted,Constants.ZERO)
                    .eq(YwContractDetail::getContractId,model.getId())
                    .in(YwContractDetail::getType,Constants.ONE,Constants.THREE)
                    .orderByAsc(YwContractDetail::getSortnum);
            model.setWyDetailList(ywContractDetailMapper.selectJoinList(YwContractDetail.class,dw));
            //查询操作日志记录
            YwWorkorderLog log = new YwWorkorderLog();
            log.setJobId(model.getId());
            log.setIsdeleted(Constants.ZERO);
            model.setLogList(ywWorkorderLogMapper.selectList(new QueryWrapper<YwWorkorderLog>(log)
                    .lambda()
                    .in(YwWorkorderLog::getObjType,Constants.YwLogType.CONTRACT_BACK.getKey()
                            ,Constants.YwLogType.CONTRACT_CREATE.getKey()
                            ,Constants.YwLogType.CONTRACT_UPDATE.getKey())
                    .orderByAsc(YwWorkorderLog::getCreateDate)));
            //查询账单集合
            model.setBillList(ywContractBillMapper.selectJoinList(YwContractBill.class,new MPJLambdaWrapper<YwContractBill>()
                            .selectAll(YwContractBill.class )
                            .eq(  YwContractBill::getContractId,model.getId())
                            .eq(YwContractBill::getIsdeleted,Constants.ZERO)
                            .orderByAsc(YwContractBill::getSortnum,YwContractBill::getCreateDate)));
            model.setCanBackRentBills(new ArrayList<>());
            long nowStart = Utils.Date.getStart(new Date()).getTime();
            long nowEnd = Utils.Date.getEnd(new Date()).getTime();
            if(model.getBillList()!=null && model.getBillList().size()>0){
                for(YwContractBill bill: model.getBillList()){
                    //付款状态:0=待收款;1=已结清;2=部分结清;3=待付款;4=待退款;5=已关闭
                    if(Constants.equalsInteger(bill.getPayStatus(),Constants.ZERO)
                            ||Constants.equalsInteger(bill.getPayStatus(),Constants.THREE)){
                        if(bill.getStartDate().getTime()>nowEnd){
                            //如果还没开始,账单直接关闭
                            continue;
                        }
                        model.getCanBackRentBills().add(bill);
                    }else  if(Constants.equalsInteger(bill.getPayStatus(),Constants.ONE) ){
                        if(bill.getEndDate().getTime()<nowStart){
                            //如果已结清,账单直接关闭
                          continue;
                        }
                        model.getCanBackRentBills().add(bill);
                    }else  if(Constants.equalsInteger(bill.getPayStatus(),Constants.TWO) ){
                        model.getCanBackRentBills().add(bill);
                    }
                }
            }
        }
        return model;
    }
    @Override
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwFloorServiceImpl.java
@@ -121,6 +121,7 @@
    @Override
    public List<YwFloor> findList(YwFloor ywFloor) {
        ywFloor.setIsdeleted(Constants.ZERO);
        QueryWrapper<YwFloor> wrapper = new QueryWrapper<>(ywFloor);
        return ywFloorMapper.selectList(wrapper);
    }
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwRoomServiceImpl.java
@@ -10,6 +10,7 @@
import com.doumee.dao.business.YwBuildingMapper;
import com.doumee.dao.business.YwRoomMapper;
import com.doumee.dao.business.model.YwBuilding;
import com.doumee.dao.business.model.YwFloor;
import com.doumee.dao.business.model.YwProject;
import com.doumee.dao.business.model.YwRoom;
import com.doumee.service.business.YwRoomService;
@@ -131,11 +132,13 @@
    public PageData<YwRoom> findPage(PageWrap<YwRoom> pageWrap) {
        IPage<YwRoom> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
         MPJLambdaWrapper<YwRoom> queryWrapper = new MPJLambdaWrapper<>();
        queryWrapper.selectAll(YwBuilding.class )
        queryWrapper.selectAll(YwRoom.class )
                .selectAs(YwProject::getName,YwRoom::getProjectName)
                .selectAs(YwFloor::getName,YwRoom::getFloorName)
                .selectAs(YwBuilding::getName,YwRoom::getBuildingName)
                .leftJoin(YwProject.class,YwProject::getId,YwRoom::getProjectId)
                .leftJoin(YwBuilding.class,YwBuilding::getId,YwRoom::getBuildingId);
                .leftJoin(YwBuilding.class,YwBuilding::getId,YwRoom::getBuildingId)
                .leftJoin(YwFloor.class,YwFloor::getId,YwRoom::getFloor);
        pageWrap.getModel().setIsdeleted(Constants.ZERO);
        Utils.MP.blankToNull(pageWrap.getModel());
        if (pageWrap.getModel().getId() != null) {
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwWorkorderServiceImpl.java
@@ -28,10 +28,7 @@
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.*;
/**
 * è¿ç»´å·¥å•信息表Service实现
@@ -57,6 +54,8 @@
    private YwRoomMapper ywRoomMapper;
    @Autowired
    private YwBuildingMapper ywBuildingMapper;
    @Autowired
    private YwFloorMapper ywFloorMapper;
    @Override
    @Transactional(rollbackFor = {BusinessException.class,Exception.class})
@@ -67,6 +66,7 @@
        model.setIsdeleted(Constants.ZERO);
        model.setCreateDate(new Date());
        model.setStatus(Constants.ZERO);
        model.setDealStatus(Constants.ZERO);
        model.setEditDate(model.getCreateDate());
        model.setEditor(model.getCreator());
        ywWorkorderMapper.insert(model);
@@ -79,11 +79,12 @@
                if(StringUtils.isBlank(multifile.getFileurl())){
                    continue;
                }
                multifile.setCreateDate(new Date());
                multifile.setCreateDate(model.getCreateDate());
                multifile.setEditDate(model.getCreateDate());
                multifile.setCreator(model.getEditor());
                multifile.setIsdeleted(Constants.ZERO);
                multifile.setObjId(model.getId());
                multifile.setCreator(model.getCreator());
                multifile.setEditor(model.getCreator());
                multifile.setObjType(Constants.MultiFile.YW_WORKORDER_PROBLEM.getKey());
                multifile.setSortnum(i+1);
                fileList.add(multifile);
@@ -92,27 +93,21 @@
        if(fileList.size()>0){
            multifileMapper.insert(fileList);
        }
        dealLogBiz(model,Constants.ZERO,model.getLoginUserInfo().getRealname(),null);//记录新建日志
        dealLogBiz(model,Constants.YwLogType.WORKORDER_CREATE,model.getLoginUserInfo().getRealname(),null);//记录新建日志
        return model.getId();
    }
    private void dealLogBiz(YwWorkorder model, int type,String param1,String param2) {
    private void dealLogBiz(YwWorkorder model,Constants.YwLogType type,String param1,String param2) {
        YwWorkorderLog log = new YwWorkorderLog();
        log.setCreateDate(model.getEditDate());
        log.setCreator(model.getCreator());
        log.setJobId(model.getId());
        log.setIsdeleted(Constants.ZERO);
        log.setObjId(model.getId()+"");
        log.setObjType(type);
        log.setObjType(type.getKey());
        log.setParam1(param1);
        log.setParam2(param2);
        if(type ==0){
            log.setTitle("创建工单");
        }else  if(type ==1){
            log.setTitle("分派工单");
        }else  if(type ==2){
            log.setTitle("处理工单");
        }
        log.setTitle(type.getNoteinfo());
        ywWorkorderLogMapper.insert(log);
    }
@@ -130,13 +125,14 @@
            model.setProjectId(room.getProjectId());
        }else{
            //如果是公共区域装修,必须选择楼宇信息
            if(model.getBuildingId()==null){
                throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"对不起,请选择正确的楼宇信息!");
            if(model.getFloorId()==null){
                throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"对不起,请选择正确的楼层信息!");
            }
            YwBuilding room = ywBuildingMapper.selectById(model.getRoomId());
            YwFloor room = ywFloorMapper.selectById(model.getFloorId());
            if(room ==null || Constants.equalsInteger(room.getIsdeleted(),Constants.ONE)){
                throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"对不起,请选择正确的楼宇信息!");
                throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"对不起,请选择正确的楼层信息!");
            }
            model.setBuildingId(room.getBuildingId());
            model.setProjectId(room.getProjectId());
        }
    }
@@ -174,7 +170,9 @@
        if(model ==null || Constants.equalsInteger(model.getIsdeleted(),Constants.ONE)){
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"对不起,工单信息不存在!");
        }
        if(!Constants.equalsInteger(model.getDealStatus(),Constants.ZERO) && !Constants.equalsInteger(model.getDealStatus(),Constants.ONE)){
        if(!Constants.equalsInteger(model.getDealStatus(),Constants.ZERO)
//                && !Constants.equalsInteger(model.getDealStatus(),Constants.ONE)
        ){
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"对不起,工单状态已流转,不支持当前操作!");
        }
@@ -190,8 +188,9 @@
        update.setDispatchUserId(update.getEditor());
        update.setDispatchDate(update.getEditDate());
        update.setDispatchInfo(ywWorkorder.getDispatchInfo());
        update.setDealUserId(ywWorkorder.getDealUserId());
        ywWorkorderMapper.updateById(update);
        dealLogBiz(model,Constants.ONE,model.getLoginUserInfo().getRealname(),user.getRealname());//记录新建日志
        dealLogBiz(model,Constants.YwLogType.WORKORDER_DISPATCH,ywWorkorder.getLoginUserInfo().getRealname(),user.getRealname());//记录新建日志
    }
    @Override
    @Transactional(rollbackFor = {BusinessException.class,Exception.class})
@@ -204,10 +203,10 @@
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"对不起,工单状态已流转,不支持当前操作!");
        }
        SystemUser user = systemUserMapper.selectById(ywWorkorder.getDealUserId());
        if(user ==null ||  (user.getDeleted()!=null&& user.getDeleted() )){
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"对不起,员工信息不存在!");
        }
//        SystemUser user = systemUserMapper.selectById(ywWorkorder.getDealUserId());
//        if(user ==null ||  (user.getDeleted()!=null&& user.getDeleted() )){
//            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"对不起,员工信息不存在!");
//        }
        YwWorkorder update = new YwWorkorder();
        update.setId(model.getId());
        update.setEditDate(new Date());
@@ -215,9 +214,31 @@
        update.setDealStatus(Constants.TWO);
        update.setDealUserId(update.getEditor());
        update.setDealDate(update.getEditDate());
        update.setDealInfo(ywWorkorder.getDispatchInfo());
        update.setDealInfo(ywWorkorder.getDealInfo());
        ywWorkorderMapper.updateById(update);
        dealLogBiz(model,Constants.TWO,model.getLoginUserInfo().getRealname(),null);//记录新建日志
        List<Multifile> fileList = new ArrayList<>();
        if(ywWorkorder.getDealFileList()!=null && ywWorkorder.getDealFileList().size()>0){
            for (int i = 0; i <  ywWorkorder.getDealFileList().size(); i++) {
                Multifile multifile =  ywWorkorder.getDealFileList().get(i);
                if(StringUtils.isBlank(multifile.getFileurl())){
                    continue;
                }
                multifile.setCreateDate(update.getEditDate());
                multifile.setCreator(update.getEditor());
                multifile.setEditDate(update.getEditDate());
                multifile.setIsdeleted(Constants.ZERO);
                multifile.setObjId(model.getId());
                multifile.setEditor(update.getEditor());
                multifile.setObjType(Constants.MultiFile.YW_WORKORDER_DEAL.getKey());
                multifile.setSortnum(i+1);
                fileList.add(multifile);
            }
        }
        if(fileList.size()>0){
            multifileMapper.insert(fileList);
        }
        dealLogBiz(model,Constants.YwLogType.WORKORDER_DEAL,ywWorkorder.getLoginUserInfo().getRealname(),null);//记录新建日志
    }
    @Override
    @Transactional(rollbackFor = {BusinessException.class,Exception.class})
@@ -299,24 +320,33 @@
    @Override
    public YwWorkorder findById(Integer id) {
        MPJLambdaWrapper<YwWorkorder> wrapper = new MPJLambdaWrapper<>();
        wrapper.selectAll(YwWorkorder.class )
                .select("t4.realname",YwWorkorder::getDealUserName)
                .select("t3.realname",YwWorkorder::getDispatchUserName)
                .selectAs(SystemUser::getRealname,YwWorkorder::getCreatorName)
                .selectAs(SystemUser::getMobile,YwWorkorder::getCreatorPhone)
                .selectAs(Company::getCompanyNamePath,YwWorkorder::getCreatorCompany)
                .leftJoin(SystemUser.class,SystemUser::getId,YwWorkorder::getCreator)
                .leftJoin(Company.class,Company::getId,SystemUser::getCompanyId)
                .leftJoin(SystemUser.class,SystemUser::getId,YwWorkorder::getDispatchUserId)
        MPJLambdaWrapper<YwWorkorder> queryWrapper = new MPJLambdaWrapper<>();
        queryWrapper.selectAll(YwWorkorder.class )
                .selectAs(SystemUser::getRealname,YwWorkorder::getDealUserName)
                .select("t3.realname",YwWorkorder::getCreatorName)
                .selectAs(Category::getName,YwWorkorder::getCategoryName)
                .selectAs(YwRoom::getName,YwWorkorder::getRoomName)
                .selectAs(YwRoom::getRoomNum,YwWorkorder::getRoomNum)
                .selectAs(YwFloor::getName,YwWorkorder::getFloorName)
                .selectAs(YwBuilding::getName,YwWorkorder::getBuildingName)
                .leftJoin(SystemUser.class,SystemUser::getId,YwWorkorder::getDealUserId)
                .leftJoin(Category.class,Category::getId,YwWorkorder::getCateId)
                .leftJoin(SystemUser.class,SystemUser::getId,YwWorkorder::getCreator)
                .leftJoin(YwRoom.class,YwRoom::getId,YwWorkorder::getRoomId)
                .leftJoin(YwFloor.class,YwFloor::getId,YwWorkorder::getFloorId)
                .leftJoin(YwBuilding.class,YwBuilding::getId,YwWorkorder::getBuildingId)
                .eq(YwWorkorder::getId,id);
        YwWorkorder model = ywWorkorderMapper.selectJoinOne(YwWorkorder.class,wrapper);
        YwWorkorder model = ywWorkorderMapper.selectJoinOne(YwWorkorder.class,queryWrapper);
        initFiles(model);//读取附件信息
        YwWorkorderLog log = new YwWorkorderLog();
        log.setJobId(model.getId());
        log.setIsdeleted(Constants.ZERO);
        model.setLogList(ywWorkorderLogMapper.selectList(new QueryWrapper<YwWorkorderLog>(log).lambda().orderByAsc(YwWorkorderLog::getCreateDate)));
        model.setLogList(ywWorkorderLogMapper.selectList(new QueryWrapper<YwWorkorderLog>(log)
                 .lambda()
                 .in(YwWorkorderLog::getObjType,Constants.YwLogType.WORKORDER_DEAL.getKey()
                 ,Constants.YwLogType.WORKORDER_CREATE.getKey()
                   ,Constants.YwLogType.WORKORDER_DISPATCH.getKey())
                .orderByAsc(YwWorkorderLog::getCreateDate)));
        return model;
    }
@@ -336,101 +366,115 @@
    @Override
    public PageData<YwWorkorder> findPage(PageWrap<YwWorkorder> pageWrap) {
        IPage<YwWorkorder> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
        QueryWrapper<YwWorkorder> queryWrapper = new QueryWrapper<>();
        MPJLambdaWrapper<YwWorkorder> queryWrapper = new MPJLambdaWrapper<>();
        queryWrapper.selectAll(YwWorkorder.class )
                .selectAs(SystemUser::getRealname,YwWorkorder::getDealUserName)
                .select("t3.realname",YwWorkorder::getCreatorName)
                .selectAs(Category::getName,YwWorkorder::getCategoryName)
                .selectAs(YwRoom::getName,YwWorkorder::getRoomName)
                .selectAs(YwRoom::getRoomNum,YwWorkorder::getRoomNum)
                .selectAs(YwFloor::getName,YwWorkorder::getFloorName)
                .selectAs(YwBuilding::getName,YwWorkorder::getBuildingName)
                .leftJoin(SystemUser.class,SystemUser::getId,YwWorkorder::getDealUserId)
                .leftJoin(Category.class,Category::getId,YwWorkorder::getCateId)
                .leftJoin(SystemUser.class,SystemUser::getId,YwWorkorder::getCreator)
                .leftJoin(YwRoom.class,YwRoom::getId,YwWorkorder::getRoomId)
                .leftJoin(YwFloor.class,YwFloor::getId,YwWorkorder::getFloorId)
                .leftJoin(YwBuilding.class,YwBuilding::getId,YwWorkorder::getBuildingId);
        pageWrap.getModel().setIsdeleted(Constants.ZERO);
        Utils.MP.blankToNull(pageWrap.getModel());
        if (pageWrap.getModel().getId() != null) {
            queryWrapper.lambda().eq(YwWorkorder::getId, pageWrap.getModel().getId());
            queryWrapper.eq(YwWorkorder::getId, pageWrap.getModel().getId());
        }
        if (pageWrap.getModel().getCreator() != null) {
            queryWrapper.lambda().eq(YwWorkorder::getCreator, pageWrap.getModel().getCreator());
            queryWrapper.eq(YwWorkorder::getCreator, pageWrap.getModel().getCreator());
        }
        if (pageWrap.getModel().getCreateDate() != null) {
            queryWrapper.lambda().ge(YwWorkorder::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()));
            queryWrapper.lambda().le(YwWorkorder::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate()));
            queryWrapper.ge(YwWorkorder::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()));
            queryWrapper.le(YwWorkorder::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate()));
        }
        if (pageWrap.getModel().getEditor() != null) {
            queryWrapper.lambda().eq(YwWorkorder::getEditor, pageWrap.getModel().getEditor());
            queryWrapper.eq(YwWorkorder::getEditor, pageWrap.getModel().getEditor());
        }
        if (pageWrap.getModel().getEditDate() != null) {
            queryWrapper.lambda().ge(YwWorkorder::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate()));
            queryWrapper.lambda().le(YwWorkorder::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate()));
            queryWrapper.ge(YwWorkorder::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate()));
            queryWrapper.le(YwWorkorder::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate()));
        }
        if (pageWrap.getModel().getIsdeleted() != null) {
            queryWrapper.lambda().eq(YwWorkorder::getIsdeleted, pageWrap.getModel().getIsdeleted());
            queryWrapper.eq(YwWorkorder::getIsdeleted, pageWrap.getModel().getIsdeleted());
        }
        if (pageWrap.getModel().getTitle() != null) {
            queryWrapper.lambda().eq(YwWorkorder::getTitle, pageWrap.getModel().getTitle());
            queryWrapper.eq(YwWorkorder::getTitle, pageWrap.getModel().getTitle());
        }
        if (pageWrap.getModel().getRemark() != null) {
            queryWrapper.lambda().eq(YwWorkorder::getRemark, pageWrap.getModel().getRemark());
            queryWrapper.eq(YwWorkorder::getRemark, pageWrap.getModel().getRemark());
        }
        if (pageWrap.getModel().getStatus() != null) {
            queryWrapper.lambda().eq(YwWorkorder::getStatus, pageWrap.getModel().getStatus());
            queryWrapper.eq(YwWorkorder::getStatus, pageWrap.getModel().getStatus());
        }
        if (pageWrap.getModel().getSortnum() != null) {
            queryWrapper.lambda().eq(YwWorkorder::getSortnum, pageWrap.getModel().getSortnum());
            queryWrapper.eq(YwWorkorder::getSortnum, pageWrap.getModel().getSortnum());
        }
        if (pageWrap.getModel().getContent() != null) {
            queryWrapper.lambda().eq(YwWorkorder::getContent, pageWrap.getModel().getContent());
            queryWrapper.eq(YwWorkorder::getContent, pageWrap.getModel().getContent());
        }
        if (pageWrap.getModel().getGetDate() != null) {
            queryWrapper.lambda().ge(YwWorkorder::getGetDate, Utils.Date.getStart(pageWrap.getModel().getGetDate()));
            queryWrapper.lambda().le(YwWorkorder::getGetDate, Utils.Date.getEnd(pageWrap.getModel().getGetDate()));
            queryWrapper.ge(YwWorkorder::getGetDate, Utils.Date.getStart(pageWrap.getModel().getGetDate()));
            queryWrapper.le(YwWorkorder::getGetDate, Utils.Date.getEnd(pageWrap.getModel().getGetDate()));
        }
        if (pageWrap.getModel().getProjectId() != null) {
            queryWrapper.lambda().eq(YwWorkorder::getProjectId, pageWrap.getModel().getProjectId());
            queryWrapper.eq(YwWorkorder::getProjectId, pageWrap.getModel().getProjectId());
        }
        if (pageWrap.getModel().getBuildingId() != null) {
            queryWrapper.lambda().eq(YwWorkorder::getBuildingId, pageWrap.getModel().getBuildingId());
            queryWrapper.eq(YwWorkorder::getBuildingId, pageWrap.getModel().getBuildingId());
        }
        if (pageWrap.getModel().getRoomId() != null) {
            queryWrapper.lambda().eq(YwWorkorder::getRoomId, pageWrap.getModel().getRoomId());
            queryWrapper.eq(YwWorkorder::getRoomId, pageWrap.getModel().getRoomId());
        }
        if (pageWrap.getModel().getUserId() != null) {
            queryWrapper.lambda().eq(YwWorkorder::getUserId, pageWrap.getModel().getUserId());
            queryWrapper.eq(YwWorkorder::getUserId, pageWrap.getModel().getUserId());
        }
        if (pageWrap.getModel().getPhone() != null) {
            queryWrapper.lambda().eq(YwWorkorder::getPhone, pageWrap.getModel().getPhone());
            queryWrapper.eq(YwWorkorder::getPhone, pageWrap.getModel().getPhone());
        }
        if (pageWrap.getModel().getSubmitDate() != null) {
            queryWrapper.lambda().ge(YwWorkorder::getSubmitDate, Utils.Date.getStart(pageWrap.getModel().getSubmitDate()));
            queryWrapper.lambda().le(YwWorkorder::getSubmitDate, Utils.Date.getEnd(pageWrap.getModel().getSubmitDate()));
            queryWrapper.ge(YwWorkorder::getSubmitDate, Utils.Date.getStart(pageWrap.getModel().getSubmitDate()));
            queryWrapper.le(YwWorkorder::getSubmitDate, Utils.Date.getEnd(pageWrap.getModel().getSubmitDate()));
        }
        if (pageWrap.getModel().getCateId() != null) {
            queryWrapper.lambda().eq(YwWorkorder::getCateId, pageWrap.getModel().getCateId());
            queryWrapper.eq(YwWorkorder::getCateId, pageWrap.getModel().getCateId());
        }
        if (pageWrap.getModel().getAreaType() != null) {
            queryWrapper.lambda().eq(YwWorkorder::getAreaType, pageWrap.getModel().getAreaType());
            queryWrapper.eq(YwWorkorder::getAreaType, pageWrap.getModel().getAreaType());
        }
        if (pageWrap.getModel().getCode() != null) {
            queryWrapper.lambda().eq(YwWorkorder::getCode, pageWrap.getModel().getCode());
            queryWrapper.eq(YwWorkorder::getCode, pageWrap.getModel().getCode());
        }
        if (pageWrap.getModel().getDealStatus() != null) {
            queryWrapper.lambda().eq(YwWorkorder::getDealStatus, pageWrap.getModel().getDealStatus());
            queryWrapper.eq(YwWorkorder::getDealStatus, pageWrap.getModel().getDealStatus());
        }
        if (pageWrap.getModel().getDispatchUserId() != null) {
            queryWrapper.lambda().eq(YwWorkorder::getDispatchUserId, pageWrap.getModel().getDispatchUserId());
            queryWrapper.eq(YwWorkorder::getDispatchUserId, pageWrap.getModel().getDispatchUserId());
        }
        if (pageWrap.getModel().getDispatchDate() != null) {
            queryWrapper.lambda().ge(YwWorkorder::getDispatchDate, Utils.Date.getStart(pageWrap.getModel().getDispatchDate()));
            queryWrapper.lambda().le(YwWorkorder::getDispatchDate, Utils.Date.getEnd(pageWrap.getModel().getDispatchDate()));
            queryWrapper.ge(YwWorkorder::getDispatchDate, Utils.Date.getStart(pageWrap.getModel().getDispatchDate()));
            queryWrapper.le(YwWorkorder::getDispatchDate, Utils.Date.getEnd(pageWrap.getModel().getDispatchDate()));
        }
        if (pageWrap.getModel().getDispatchInfo() != null) {
            queryWrapper.lambda().eq(YwWorkorder::getDispatchInfo, pageWrap.getModel().getDispatchInfo());
            queryWrapper.eq(YwWorkorder::getDispatchInfo, pageWrap.getModel().getDispatchInfo());
        }
        if (pageWrap.getModel().getDealUserId() != null) {
            queryWrapper.lambda().eq(YwWorkorder::getDealUserId, pageWrap.getModel().getDealUserId());
            queryWrapper.eq(YwWorkorder::getDealUserId, pageWrap.getModel().getDealUserId());
        }
        if (pageWrap.getModel().getDealDate() != null) {
            queryWrapper.lambda().ge(YwWorkorder::getDealDate, Utils.Date.getStart(pageWrap.getModel().getDealDate()));
            queryWrapper.lambda().le(YwWorkorder::getDealDate, Utils.Date.getEnd(pageWrap.getModel().getDealDate()));
            queryWrapper.ge(YwWorkorder::getDealDate, Utils.Date.getStart(pageWrap.getModel().getDealDate()));
            queryWrapper.le(YwWorkorder::getDealDate, Utils.Date.getEnd(pageWrap.getModel().getDealDate()));
        }
        if (pageWrap.getModel().getDealInfo() != null) {
            queryWrapper.lambda().eq(YwWorkorder::getDealInfo, pageWrap.getModel().getDealInfo());
            queryWrapper.eq(YwWorkorder::getDealInfo, pageWrap.getModel().getDealInfo());
        }
        if (pageWrap.getModel().getDealType() != null) {
            queryWrapper.lambda().eq(YwWorkorder::getDealType, pageWrap.getModel().getDealType());
            queryWrapper.eq(YwWorkorder::getDealType, pageWrap.getModel().getDealType());
        }
        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
@@ -439,6 +483,9 @@
                queryWrapper.orderByAsc(sortData.getProperty());
            }
        }
        queryWrapper.ge(Objects.nonNull(pageWrap.getModel().getQueryStartTime()), YwWorkorder::getCreateDate, pageWrap.getModel().getQueryStartTime())
                .le(Objects.nonNull(pageWrap.getModel().getQueryEndTime()), YwWorkorder::getCreateDate, pageWrap.getModel().getQueryEndTime());
        queryWrapper.orderByDesc(YwContract::getCreateDate );
        return PageData.from(ywWorkorderMapper.selectPage(page, queryWrapper));
    }