MrShi
2024-12-06 242bea686a5a3cd4c0488cdbe72acdc17fc3b698
Merge branch 'master' of http://139.186.142.91:10010/r/productDev/funingyunwei
已修改18个文件
496 ■■■■ 文件已修改
admin/src/views/Inspection/plan.vue 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/workorder/components/OperaYwWorkorderWindow.vue 39 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/workorder/components/detail.vue 31 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/workorder/workorderCate.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/workorder/workorderList.vue 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/operation/device.vue 106 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/workOrder/list.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_gateway/src/main/resources/application.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwContractCloudController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwContractRevenue.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwPatrolScheme.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwWorkorder.java 39 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/CompanyServiceImpl.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwAccountServiceImpl.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwContractRevenueServiceImpl.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwContractServiceImpl.java 184 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwPatrolSchemeServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwWorkorderServiceImpl.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/Inspection/plan.vue
@@ -20,8 +20,8 @@
      <ul class="toolbar" v-permissions="['business:ywpatrolscheme:create', 'business:ywpatrolscheme:delete']">
        <li><el-button type="primary" @click="editClick()" icon="el-icon-plus"
            v-permissions="['business:ywpatrolscheme:create']">新建</el-button></li>
        <el-button type="primary" plain  :loading="isWorking.export" v-permissions="['business:ywpatrolscheme:exportExcel']"
          @click="exportExcel">导出</el-button>
        <el-button type="primary" plain :loading="isWorking.export"
          v-permissions="['business:ywpatrolscheme:exportExcel']" @click="exportExcel">导出</el-button>
        <!-- <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete"
            v-permissions="['business:ywpatrolscheme:delete']">删除</el-button></li> -->
      </ul>
@@ -29,7 +29,7 @@
        <el-table-column type="selection" width="55"></el-table-column>
        <el-table-column prop="title" label="计划名称" min-width="100px"></el-table-column>
        <el-table-column prop="lineId" label="计划编号" min-width="100px"></el-table-column>
        <el-table-column prop="code" label="计划编号" min-width="100px"></el-table-column>
        <el-table-column prop="userName" label="负责人员" min-width="100px"></el-table-column>
        <el-table-column prop="startDate" label="计划日期" min-width="150px">
admin/src/views/workorder/components/OperaYwWorkorderWindow.vue
@@ -1,5 +1,6 @@
<template>
  <GlobalWindow width="800px" :title="title" :visible.sync="visible" @close="close" :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">
@@ -86,12 +87,8 @@
      // 表单数据
      form: {
        id: null,
        creator: '',
        createDate: '',
        editor: '',
        editDate: '',
        floor: '',
        isdeleted: '',
        title: '',
        remark: '',
        status: '',
@@ -103,7 +100,6 @@
        floorId: '',
        roomId: '',
        userId: '',
        phone: '',
        submitDate: '',
        cateId: '',
        areaType: '0',
@@ -147,6 +143,37 @@
      // 新建
      if (target == null) {
        this.$nextTick(() => {
          this.$refs.form = {
            id: null,
            editDate: '',
            floor: '',
            title: '',
            remark: '',
            status: '',
            sortnum: '',
            content: '',
            getDate: '',
            projectId: '',
            buildingId: '',
            floorId: '',
            roomId: '',
            userId: '',
            submitDate: '',
            cateId: '',
            areaType: '0',
            code: '',
            dealStatus: '',
            dispatchUserId: '',
            dispatchDate: '',
            dispatchInfo: '',
            dealUserId: '',
            dealDate: '',
            dealInfo: '',
            dealType: ''
          }
          this.buildList = []
          this.roomList = []
          this.levelList = []
          this.$refs.form.resetFields()
          this.form[this.configData['field.id']] = null
        })
admin/src/views/workorder/components/detail.vue
@@ -1,12 +1,12 @@
<template>
  <GlobalWindow width="920px" title="工单详情" :visible.sync="visible" :confirm-working="isWorking" @close="close"
  <GlobalWindow width="960px" 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 green" v-if="info.dealStatus == 1">已指派</div>
          <div class="status gray" v-if="info.dealStatus == 2">已处理</div>
        </div>
      </div>
@@ -161,6 +161,7 @@
import { detailById, dispatchOrder, dealOrder } from '@/api/workorder/ywWorkorder'
import { getUserList } from '@/api/system/user'
import { Message, Loading } from 'element-ui'
import dayjs from 'dayjs'
export default {
  components: {
    GlobalWindow
@@ -222,6 +223,9 @@
      const { id } = this
      detailById(id).then(res => {
        this.info = res
        if(this.info.dealStatus == 1){
          this.$set(this.param, 'getDate',dayjs().format('YYYY-MM-DD HH:mm:ss') )
        }
      })
    },
    getStaff() {
@@ -300,9 +304,9 @@
    align-items: center;
    .status {
      padding: 0 6px;
      height: 22px;
      line-height: 22px;
      padding: 0 12px;
      height: 24px;
      line-height: 24px;
      border-radius: 2px;
      border: 1px solid #00BA92;
      color: #00BA92;
@@ -312,12 +316,17 @@
    }
    .primaryColor {
      border: 1px solid $primary-color;
      border: 1px solid rgba(63, 126, 239,.2);
      background-color: rgba(63, 126, 239,.2);
    }
    .green{
      background-color: rgba(83, 183, 148, .2);
      border: 1px solid rgba(83, 183, 148, .2);
    }
    .gray {
      color: gray;
      border: 1px solid gray;
      color: #333333;
      background-color: rgba(128, 128, 128, .2);
      border: 1px solid rgba(128, 128, 128, .2);
    }
  }
@@ -343,6 +352,10 @@
      width: 100%;
      display: flex;
      align-items: center;
      .la{
        margin-bottom: 0;
        width: 72px;
      }
    }
    .max {
admin/src/views/workorder/workorderCate.vue
@@ -4,8 +4,8 @@
      <ul class="toolbar" v-permissions="['business:category:create', 'business:category:delete']">
        <li><el-button type="primary" @click="handleEdit()" icon="el-icon-plus"
            v-permissions="['business:category:create']">新建</el-button></li>
        <li v-permissions="['business:category:exportExcel']"><el-button type="primary"
            @click="exportExcel">导出</el-button></li>
        <!-- <li v-permissions="['business:category:exportExcel']"><el-button type="primary"
            @click="exportExcel">导出</el-button></li> -->
      </ul>
      <el-table row-key="id" :tree-props="{ children: 'childCategoryList' }" v-loading="isWorking.search"
        :data="dataList" stripe @selection-change="handleSelectionChange">
admin/src/views/workorder/workorderList.vue
@@ -19,14 +19,14 @@
        </el-select>
      </el-form-item>
      <el-form-item prop="cateId" label="工单分类">
        <el-cascader v-model="searchForm.areaIds" @change="changeSel" placeholder="请选择巡检区域" clearable
        <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-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>
@@ -168,6 +168,7 @@
        buildingId: '',
        cateId: '',
      }
      this.buildList = []
      this.search()
    },
    changeSelDate(e) {
h5/pages/operation/device.vue
@@ -5,10 +5,12 @@
                <view class="la"><text class="red">*</text>选择设备</view>
                <view class="line">
                    <view class="sel_wrap" @click="showModal = true">
                        <view class="left" :class="param.deviceName ? '' : 'placeholder9'">{{ param.deviceName ? param.deviceName : '请选择设备' }}</view>
                        <view class="left" :class="param.deviceName ? '' : 'placeholder9'">
                            {{ param.deviceName ? param.deviceName : '请选择设备' }}
                        </view>
                        <u-icon name="arrow-right" color="#999999" size="17"></u-icon>
                    </view>
                    <image class="icon" src="@/static/side/scan.png" mode=""></image>
                    <image @click="openQrcode" class="icon" src="@/static/side/scan.png" mode=""></image>
                </view>
            </view>
            <view class="item">
@@ -52,12 +54,14 @@
            </view>
        </u-popup>
        <!--  -->
        <u-popup :show="showModal" @close="showModal = false" :safeAreaInsetBottom="true" :round="10" closeable closeOnClickOverlay>
        <u-popup :show="showModal" @close="showModal = false" :safeAreaInsetBottom="true" :round="10" closeable
            closeOnClickOverlay>
            <view class="appr_modal">
                <view class="title">请选择设备</view>
                <view class="search_wrap">
                    <image class="mr12 search" src="@/static/home/ic_search@2x.png" mode="widthFix"></image>
                    <input v-model="searchValue" @confirm="getDevice()" type="text" placeholder="搜索设备名称/编号" placeholder-class="placeholder9" />
                    <input v-model="searchValue" @confirm="getDevice()" type="text" placeholder="搜索设备名称/编号"
                        placeholder-class="placeholder9" />
                </view>
                <view class="modal_list">
                    <view class="item" v-for="item,i in deviceList" @click="deviceClick(item)">
@@ -68,6 +72,10 @@
                <view class="sub_btn" @click="handleDevice">确定选择</view>
            </view>
        </u-popup>
        <!--  -->
        <view class="reader-box" @click="stopScan" v-if="isScaning">
            <view class="reader" id="reader"></view>
        </view>
    </view>
</template>
@@ -78,17 +86,25 @@
        ywDeviceCreate
    } from '@/api'
    import dayjs from 'dayjs';
    import {
        Html5Qrcode
    } from 'html5-qrcode';
    export default {
        data() {
            return {
                param: {status: 0},
                param: {
                    status: 0
                },
                showUpload: false,
                showModal: false,
                fileList: [],
                
                searchValue: '',
                deviceList: [],
                activeDevice: {}
                activeDevice: {},
                html5Qrcode: null,
                isScaning: false,
            };
        },
        onLoad() {
@@ -96,7 +112,10 @@
        },
        methods: {
            onSubmit() {
                const { param, fileList } = this
                const {
                    param,
                    fileList
                } = this
                
                if(!param.deviceId) return this.showToast('请先选择要维护的设备')
                ywDeviceCreate({
@@ -121,7 +140,9 @@
                })
            },
            handleDevice() {
                const { activeDevice } = this
                const {
                    activeDevice
                } = this
                if(!activeDevice.id) return this.showToast('请先选择设备')
                this.$set(this.param, 'deviceId', activeDevice.id)
                this.$set(this.param, 'deviceName', activeDevice.name)
@@ -224,6 +245,40 @@
                        });
                    }
                });
            },
            openQrcode() {
                this.isScaning = true;
                Html5Qrcode.getCameras().then((devices) => {
                    if (devices && devices.length) {
                        this.html5Qrcode = new Html5Qrcode('reader');
                        this.html5Qrcode.start({
                                facingMode: 'environment'
                            }, {
                                focusMode: 'continuous', //设置连续聚焦模式
                                fps: 5, //设置扫码识别速度
                                qrbox: 280 //设置二维码扫描框大小
                            },
                            (decodeText, decodeResult) => {
                                if (decodeText) { //这里decodeText就是通过扫描二维码得到的内容
                                    this.action(decodeText) //对二维码逻辑处理
                                    this.stopScan(); //关闭扫码功能
                                }
                            },
                            (err) => {
                                // console.log(err);  //错误信息
                            }
                        );
                    }
                });
            },
            stopScan() {
                console.log('停止扫码')
                this.isScaning = false;
                if (this.html5Qrcode) {
                    this.html5Qrcode.stop();
                }
            }
        }
    }
@@ -240,11 +295,13 @@
            .line {
                display: flex;
                align-items: center;
                .icon{
                    width: 52rpx;
                    height: 52rpx;
                    margin-left: 40rpx;
                }
                textarea {
                    box-sizing: border-box;
                    width: 690rpx;
@@ -267,11 +324,13 @@
                align-items: center;
                border-bottom: 1rpx solid #E5E5E5;
            }
            .radio_wrap{
                margin-top: 20rpx;
                width: 100%;
                display: flex;
                justify-content: space-between;
                .ite{
                    width: 216rpx;
                    height: 68rpx;
@@ -282,12 +341,14 @@
                    align-items: center;
                    justify-content: center;
                }
                .active{
                    color: $primaryColor;
                    border-color: $primaryColor;
                    background: rgba(0,104,255,0.1);
                }
            }
            .upload_wrap {
                display: flex;
                flex-wrap: wrap;
@@ -333,6 +394,7 @@
        }
    }
    .sel_upload_wrap {
        width: 100%;
        border-top: 1px solid #333333;
@@ -344,6 +406,7 @@
            text-align: center;
        }
    }
    .sub_btn {
        position: fixed;
        bottom: 68rpx;
@@ -360,9 +423,11 @@
        font-size: 32rpx;
        color: #FFFFFF;
    }
    .appr_modal {
        padding: 36rpx 30rpx 0;
        height: calc( 100vh - 120rpx );
        .title {
            font-weight: 600;
            font-size: 32rpx;
@@ -379,16 +444,20 @@
            background: #f2f2f2;
            border-radius: 38rpx;
            padding-left: 30rpx;
            input{
                flex: 1;
            }
            .search {
                width: 28rpx;
                height: 28rpx;
            }
        }
        .modal_list{
            height: calc( 100% - 360rpx );
            .item{
                display: flex;
                align-items: center;
@@ -396,15 +465,36 @@
                height: 100rpx;
                font-size: 30rpx;
                border-bottom: 1px solid #E5E5E5;
                image{
                    width: 40rpx;
                    height: 40rpx;
                }
            }
            .active{
                color: $primaryColor;
            }
        }
        
    }
    .reader-box {
        position: fixed;
        top: 0;
        bottom: 0;
        left: 0;
        right: 0;
        background-color: rgba(0, 0, 0, 0.5);
    }
    .reader {
        width: 100%;
        // width: 540rpx;
        // height: 540rpx;
        position: absolute;
        top: 50%;
        left: 50%;
        transform: translate(-50%, -50%);
    }
</style>
h5/pages/workOrder/list.vue
@@ -126,7 +126,7 @@
                    model: {
                        ...param,
                        queryStatus: activeTab,
                        dispatchUserId: selectAll ? '' : uni.getStorageSync('userInfo').id,
                        dealUserId: selectAll ? '' : uni.getStorageSync('userInfo').id,
                    }
                }).then(res => {
                    this.list = [...this.list, ...res.data.records]
server/system_gateway/src/main/resources/application.yml
@@ -82,7 +82,7 @@
  compression:
    enabled: true
    mime-types: application/json
  port: 8080
  port: 10010
  tomcat:
    max-swallow-size: -1
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/YwContractCloudController.java
@@ -103,7 +103,7 @@
    public ApiResponse<List<YwContract>> list (@RequestBody YwContract model,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        return ApiResponse.success(ywContractService.findList(model));
    }
    @ApiOperation("列表")
    @ApiOperation("根据退租日期查询账单数据")
    @PostMapping("/findForBills")
    @CloudRequiredPermission("business:ywcontract:query")
    public ApiResponse<YwContract> findForBills (@RequestBody YwContract model,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwContractRevenue.java
@@ -92,6 +92,9 @@
    @ExcelColumn(name="合同编号",index = 1,width = 10)
    @TableField(exist = false)
    private String contractCode;
    @ApiModelProperty(value = "合同狀態", example = "1")
    @TableField(exist = false)
    private String contractStatus;
    @ApiModelProperty(value = "客户名称(付款方)", example = "1")
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwPatrolScheme.java
@@ -56,7 +56,7 @@
    private String remark;
    @ApiModelProperty(value = "状态 0启用 1禁用", example = "1")
    @ExcelColumn(name="状态",index = 9,width = 6,valueMapping = "0=启用;1=停用;")
    @ExcelColumn(name="状态",index = 8,width = 6,valueMapping = "0=启用;1=停用;")
    private Integer status;
    @ApiModelProperty(value = "排序码", example = "1")
@@ -121,6 +121,5 @@
    @ApiModelProperty(value = "超期任务数")
    @TableField(exist = false)
    @ExcelColumn(name="超期任务数",index = 8,width = 6)
    private Integer timeOutTaskNum;
}
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/YwWorkorder.java
@@ -26,129 +26,103 @@
    @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="创建时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date createDate;
    @ApiModelProperty(value = "更新人编码", example = "1")
    @ExcelColumn(name="更新人编码")
    private Integer editor;
    @ApiModelProperty(value = "更新时间")
    @ExcelColumn(name="更新时间")
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date editDate;
    @ApiModelProperty(value = "是否删除0否 1是", example = "1")
    @ExcelColumn(name="是否删除0否 1是")
    private Integer isdeleted;
    @ApiModelProperty(value = "标题")
    @ExcelColumn(name="标题")
    private String title;
    @ApiModelProperty(value = "备注")
    @ExcelColumn(name="备注")
    private String remark;
    @ApiModelProperty(value = "状态 0启用 1禁用", example = "1")
    @ExcelColumn(name="状态 0启用 1禁用")
    private Integer status;
    @ApiModelProperty(value = "排序码", example = "1")
    @ExcelColumn(name="排序码")
    private Integer sortnum;
    @ApiModelProperty(value = "情况说明")
    @ExcelColumn(name="情况说明")
    private String content;
    @ApiModelProperty(value = "上门时间")
    @ExcelColumn(name="上门时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date getDate;
    @ApiModelProperty(value = "所属项目编码(关联yw_project)", example = "1")
    @ExcelColumn(name="所属项目编码(关联yw_project)")
    private Integer projectId;
    @ApiModelProperty(value = "所属楼宇编码(关联yw_building)", example = "1")
    @ExcelColumn(name="所属楼宇编码(关联yw_building)")
    private Integer buildingId;
    @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="提报人编码")
    private Integer userId;
    @ApiModelProperty(value = "联系电话")
    @ExcelColumn(name="联系电话")
    private String phone;
    @ApiModelProperty(value = "提报时间")
    @ExcelColumn(name="提报时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @ExcelColumn(name="上报时间",index = 5,width = 16,dateFormat = "yyyy-MM-dd HH:mm:ss")
    private Date submitDate;
    @ApiModelProperty(value = "工单分类编码(关联category)", example = "1")
    @ExcelColumn(name="工单分类编码(关联category)")
    private Integer cateId;
    @ApiModelProperty(value = "保修区域类型 0室内维修 1公共区域", example = "1")
    @ExcelColumn(name="保修区域类型 0室内维修 1公共区域")
    @ExcelColumn(name="位置区域",valueMapping = "0=室内维修;1=公共区域;",index = 0,width = 10)
    private Integer areaType;
    @ApiModelProperty(value = "工单编号")
    @ExcelColumn(name="工单编号")
    private String code;
    @ApiModelProperty(value = "处理状态 0待处理 1已分派 2已处理", example = "1")
    @ExcelColumn(name="处理状态 0待处理 1已分派 2已处理")
    @ExcelColumn(name="工单状态",index = 7,width = 10,valueMapping = "0=待处理;1=已分派;1=已处理;")
    private Integer dealStatus;
    @ApiModelProperty(value = "分派人编码(关联system_user)", example = "1")
    @ExcelColumn(name="分派人编码(关联system_user)")
    private Integer dispatchUserId;
    @ApiModelProperty(value = "分派时间")
    @ExcelColumn(name="分派时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date dispatchDate;
    @ApiModelProperty(value = "分派处理说明")
    @ExcelColumn(name="分派处理说明")
    private String dispatchInfo;
    @ApiModelProperty(value = "处理人编码(关联system_user)", example = "1")
    @ExcelColumn(name="处理人编码(关联system_user)")
    private Integer dealUserId;
    @ApiModelProperty(value = "处理时间")
    @ExcelColumn(name="处理时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date dealDate;
    @ApiModelProperty(value = "处理备注")
    @ExcelColumn(name="处理备注")
    private String dealInfo;
    @ApiModelProperty(value = "处理方式 0指派后处理 1直接回复", example = "1")
    @ExcelColumn(name="处理方式 0指派后处理 1直接回复")
    private Integer dealType;
    @ApiModelProperty(value = "项目名称")
    @TableField(exist = false)
    private String projectName;
@@ -158,9 +132,11 @@
    private String queryStatus;
    @ApiModelProperty(value = "楼宇名称")
    @ExcelColumn(name="楼宇",index = 1,width = 10)
    @TableField(exist = false)
    private String buildingName;
    @ApiModelProperty(value = "房源名称")
    @ExcelColumn(name="房源",index = 2,width = 10)
    @TableField(exist = false)
    private String roomName;
    @ApiModelProperty(value = "楼层名称")
@@ -170,6 +146,7 @@
    @TableField(exist = false)
    private String roomNum;
    @ApiModelProperty(value = "提报人姓名")
    @ExcelColumn(name="上报人",index = 4,width = 10)
    @TableField(exist = false)
    private String creatorName;
    @ApiModelProperty(value = "提报人电话")
@@ -177,11 +154,13 @@
    private String creatorMobile;
    @ApiModelProperty(value = "处理人姓名")
    @TableField(exist = false)
    @ExcelColumn(name="处理人",index = 6,width = 10)
    private String dealUserName;
    @ApiModelProperty(value = "处理人组织")
    @TableField(exist = false)
    private String dealUserCompany;
    @ApiModelProperty(value = "类别名称")
    @ExcelColumn(name="工单分类",index = 3,width = 10)
    @TableField(exist = false)
    private String categoryName;
    @ApiModelProperty(value = "分配人姓名")
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/CompanyServiceImpl.java
@@ -25,10 +25,12 @@
import com.doumee.dao.admin.request.UpdateCompanySortDTO;
import com.doumee.dao.admin.response.CompanyDTO;
import com.doumee.dao.business.MemberMapper;
import com.doumee.dao.business.YwContractMapper;
import com.doumee.dao.business.dao.CompanyMapper;
import com.doumee.dao.business.dao.join.CompanyJoinMapper;
import com.doumee.dao.business.model.Company;
import com.doumee.dao.business.model.Member;
import com.doumee.dao.business.model.YwContract;
import com.doumee.dao.business.vo.CompanyTree;
import com.doumee.dao.system.model.SystemUser;
import com.doumee.service.business.CompanyService;
@@ -63,6 +65,9 @@
    @Autowired
    private CompanyJoinMapper companyJoinMapper;
    @Autowired
    private YwContractMapper ywContractMapper;
    /**
     * 创建财务公司
@@ -77,6 +82,13 @@
                .eq(Company::getType,company.getType())
                .eq(Company::getIsdeleted,Constants.ZERO)) >0){
            throw new BusinessException(ResponseStatus.DATA_EXISTS.getCode(), "对不起,名称不能重复~");
        }
        if(StringUtils.isNotBlank(company.getCode())){
            if(companyMapper.selectCount(new QueryWrapper<Company>().lambda()
                    .eq(Company::getCode,company.getCode())
                    .eq(Company::getIsdeleted,Constants.ZERO)) >0){
                throw new BusinessException(ResponseStatus.DATA_EXISTS.getCode(), "对不起,纳税识别号不能重复~");
            }
        }
        company.setCreateDate(new Date());
        company.setCreator(company.getLoginUserInfo().getId());
@@ -105,6 +117,13 @@
                .eq(Company::getName,company.getName())
                .eq(Company::getIsdeleted,Constants.ZERO)) >0){
            throw new BusinessException(ResponseStatus.DATA_EXISTS.getCode(), "对不起,组织名称不能重复~");
        }
        if(StringUtils.isNotBlank(company.getCode())){
            if(companyMapper.selectCount(new QueryWrapper<Company>().lambda()
                    .eq(Company::getCode,company.getCode())
                    .eq(Company::getIsdeleted,Constants.ZERO)) >0){
                throw new BusinessException(ResponseStatus.DATA_EXISTS.getCode(), "对不起,纳税识别号不能重复~");
            }
        }
        LoginUserInfo user = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
        if(user ==null){
@@ -260,6 +279,9 @@
                .eq(Member::getIsdeleted,Constants.ZERO)) >0){
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "对不起,该部门下存在人员信息,不能进行删除操作!");
        }
        if(ywContractMapper.selectCount(new QueryWrapper<YwContract>().lambda().eq(YwContract::getCompanyId,id))>Constants.ZERO){
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "当前公司已关联业务,不可删除");
        }
        Company company = new Company();
        company.setId(id);
@@ -308,6 +330,15 @@
                .eq(Company::getIsdeleted,Constants.ZERO)) >0){
            throw new BusinessException(ResponseStatus.DATA_EXISTS.getCode(), "对不起,组织名称不能重复~");
        }
        if(StringUtils.isNotBlank(company.getCode())){
            if(companyMapper.selectCount(new QueryWrapper<Company>().lambda()
                    .eq(Company::getCode,company.getCode())
                    .ne(Company::getId,company.getId())
                    .eq(Company::getIsdeleted,Constants.ZERO)) >0){
                throw new BusinessException(ResponseStatus.DATA_EXISTS.getCode(), "对不起,纳税识别号不能重复~");
            }
        }
        LoginUserInfo user = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
        if(user == null){
            user = company.getLoginUserInfo();
@@ -367,6 +398,14 @@
                .eq(Company::getIsdeleted,Constants.ZERO)) >0){
            throw new BusinessException(ResponseStatus.DATA_EXISTS.getCode(), "对不起,名称不能重复~");
        }
        if(StringUtils.isNotBlank(company.getCode())){
            if(companyMapper.selectCount(new QueryWrapper<Company>().lambda()
                    .eq(Company::getCode,company.getCode())
                    .ne(Company::getId,company.getId())
                    .eq(Company::getIsdeleted,Constants.ZERO)) >0){
                throw new BusinessException(ResponseStatus.DATA_EXISTS.getCode(), "对不起,纳税识别号不能重复~");
            }
        }
        companyMapper.updateById(company);
        return company.getId();
    }
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwAccountServiceImpl.java
@@ -8,9 +8,11 @@
import com.doumee.core.utils.Constants;
import com.doumee.core.utils.Utils;
import com.doumee.dao.business.YwAccountMapper;
import com.doumee.dao.business.YwContractRevenueMapper;
import com.doumee.dao.business.dao.CompanyMapper;
import com.doumee.dao.business.model.Company;
import com.doumee.dao.business.model.YwAccount;
import com.doumee.dao.business.model.YwContractRevenue;
import com.doumee.dao.business.model.YwProject;
import com.doumee.service.business.YwAccountService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -18,6 +20,7 @@
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.util.CollectionUtils;
@@ -37,6 +40,8 @@
    private YwAccountMapper ywAccountMapper;
    @Autowired
    private CompanyMapper companyMapper;
    @Autowired
    private YwContractRevenueMapper ywContractRevenueMapper;
    @Override
    public Integer create(YwAccount model) {
@@ -49,6 +54,15 @@
                || !Constants.equalsInteger(ywProject.getType(),Constants.TWO)){
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"对不起,请选择正确的公司信息!");
        }
        if(StringUtils.isNotBlank(model.getTitle())){
            if(ywAccountMapper.selectCount(new QueryWrapper<YwAccount>().lambda()
                    .eq(YwAccount::getTitle,model.getTitle())
                    .eq(YwAccount::getIsdeleted,Constants.ZERO)) >0){
                throw new BusinessException(ResponseStatus.DATA_EXISTS.getCode(), "对不起,收支条目不能重复~");
            }
        }
        model.setCreator(model.getLoginUserInfo().getId());
        model.setIsdeleted(Constants.ZERO);
        model.setCreateDate(new Date());
@@ -61,6 +75,9 @@
    @Override
    public void deleteById(Integer id, LoginUserInfo user) {
        if(ywContractRevenueMapper.selectCount(new QueryWrapper<YwContractRevenue>().lambda().eq(YwContractRevenue::getAccountId,id))>Constants.ZERO){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"当前收支账户已关联业务,不可删除");
        }
        YwAccount model = new YwAccount();
        model.setId(id);
        model.setIsdeleted(Constants.ONE);
@@ -95,6 +112,15 @@
                || !Constants.equalsInteger(ywProject.getType(),Constants.TWO)){
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"对不起,请选择正确的公司信息!");
        }
        if(StringUtils.isNotBlank(model.getTitle())){
            if(ywAccountMapper.selectCount(new QueryWrapper<YwAccount>().lambda()
                    .eq(YwAccount::getTitle,model.getTitle())
                    .ne(YwAccount::getId,model.getId())
                    .eq(YwAccount::getIsdeleted,Constants.ZERO)) >0){
                throw new BusinessException(ResponseStatus.DATA_EXISTS.getCode(), "对不起,收支条目不能重复~");
            }
        }
        model.setEditDate(model.getCreateDate());
        model.setEditor(model.getCreator());
        ywAccountMapper.updateById(model);
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwContractRevenueServiceImpl.java
@@ -268,6 +268,7 @@
                new MPJLambdaWrapper<YwContractRevenue>().selectAll(YwContractRevenue.class)
                        .selectAs(YwContractBill::getCode,YwContractRevenue::getBillCode)
                        .selectAs(YwContract::getCode,YwContractRevenue::getContractCode)
                        .selectAs(YwContract::getStatus,YwContractRevenue::getContractStatus)
                        .selectAs(YwCustomer::getName,YwContractRevenue::getCustomerName)
                        .selectAs(SystemUser::getRealname,YwContractRevenue::getRealname)
                        .selectAs(YwAccount::getTitle,YwContractRevenue::getAccountTitle)
@@ -427,6 +428,7 @@
                        .selectAs(YwContractBill::getCode,YwContractRevenue::getBillCode)
                        .selectAs(YwContractBill::getType,YwContractRevenue::getBillType)
                         .selectAs(YwContract::getCode,YwContractRevenue::getContractCode)
                        .selectAs(YwContract::getStatus,YwContractRevenue::getContractStatus)
                        .selectAs(YwCustomer::getName,YwContractRevenue::getCustomerName)
                        .selectAs(SystemUser::getRealname,YwContractRevenue::getRealname)
                        .leftJoin(YwContractBill.class,YwContractBill::getId,YwContractRevenue::getBillId)
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwContractServiceImpl.java
@@ -31,6 +31,7 @@
import org.springframework.util.CollectionUtils;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.temporal.ChronoUnit;
import java.util.*;
import java.util.stream.Collectors;
@@ -74,12 +75,20 @@
    @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());
        model.setStatus(Constants.ZERO);
        model.setEditDate(model.getCreateDate());
        model.setEditor(model.getCreator());
        if(model.getStartDate().getTime() > System.currentTimeMillis()){
            model.setStatus(Constants.ZERO);
        }else if(model.getStartDate().getTime() <= System.currentTimeMillis() && model.getEndDate().getTime() > System.currentTimeMillis()){
            model.setStatus(Constants.ONE);
        }else{
            model.setStatus(Constants.TWO);
        }
        model.setStatus(Constants.ZERO);//待执行
        model.setRemark(getRemarlByParam(model));
        ywContractMapper.insert(model);
@@ -268,7 +277,7 @@
        }
        model.setTotalArea(new BigDecimal(0));
        for(YwRoom r : rooms){
            model.setTotalArea(model.getTotalArea().add(Constants.formatBigdecimal(r.getArea())));
            model.setTotalArea(model.getTotalArea().add(Constants.formatBigdecimal(r.getRentArea())));
        }
        model.setRoomList(rooms);
    }
@@ -303,11 +312,12 @@
        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))+"" );
                .replace("{param2}",model.getBtCLoseBill()+"")
                .replace("{param3}",DateUtil.getDateLongSlash(model.getBtDate()))
                .replace("{param4}",fee.compareTo(new BigDecimal(0)) >=0?"收":"付")
                .replace("{param5}",(fee.compareTo(new BigDecimal(0)) >=0?
                        Constants.formatBigdecimal2Float(model.getBtFee()).intValue()
                        :(Constants.formatBigdecimal2Float(model.getBtFee()).intValue() * -1))+"" );
        return  str;
    }
    private String getbackRentLogByParam(YwContract model) {
@@ -352,9 +362,6 @@
        update.setBtFee(param.getBtFee());
        update.setBtRemark(getbackRentRemarkByParam(param));
        ywContractMapper.updateById(update);
//        if(1==1){
//            throw new BusinessException(ResponseStatus.NOT_ALLOWED);
//        }
        dealLogBiz(param,Constants.YwLogType.CONTRACT_BACK, param.getLoginUserInfo().getRealname(),getbackRentLogByParam(param));
        return param.getId();
    }
@@ -409,23 +416,15 @@
                }
                if(Constants.equalsInteger(bill.getPayStatus(),Constants.ZERO)
                        ||Constants.equalsInteger(bill.getPayStatus(),Constants.THREE)){
                    if(bill.getStartDate().getTime()<param.getBtDate().getTime()){
                    if(bill.getStartDate().getTime()<=param.getBtDate().getTime()){
                        canBills.add(bill);
                    }else{
                        //如果还没开始,账单直接关闭
                        closeBills.add(bill);
                        noBills.add(bill);
                    }
//                    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.getStartDate().getTime()>param.getBtDate().getTime()){
//                    if(bill.getEndDate().getTime()<param.getEditDate().getTime()){
                        //如果已结清,账单直接关闭
                        noBills.add(bill);
                    }else{
@@ -449,14 +448,14 @@
        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());
                    fee = editBill.getReceivableFee().subtract(Constants.formatBigdecimal(b.getActReceivableFee()));
                    if(fee.compareTo(new BigDecimal(0))== 0){
                        //如果费用正好,则修改账单信息为已结清
                        b.setPayStatus(Constants.ONE);
@@ -488,19 +487,20 @@
                addBill.setContractId(param.getId());
                addBill.setType(Constants.ONE);
                addBill.setStatus(Constants.ZERO);
                addBill.setTotleFee(addBill.getReceivableFee());
                if(Constants.equalsInteger(addBill.getFeeType(),Constants.ONE)){
                    addBill.setStartDate(addBill.getPlanPayDate());
                    addBill.setEndDate(addBill.getPlanPayDate());
                }
                if(Constants.equalsInteger(addBill.getBillType(),Constants.ZERO)){
                    //如果是收款
                    totalBackFee = totalBackFee.add(Constants.formatBigdecimal(addBill.getActReceivableFee()));
//                    totalBackFee = totalBackFee.add(Constants.formatBigdecimal(addBill.getActReceivableFee()));
                    addBill.setPayStatus(Constants.ZERO);
                    addBill.setBtFee(Constants.formatBigdecimal(addBill.getActReceivableFee()));
                    addBill.setBtFee(Constants.formatBigdecimal(addBill.getReceivableFee()));
                }else{
                    //如果是付款
                    addBill.setPayStatus(Constants.THREE);
                    addBill.setBtFee(Constants.formatBigdecimal(addBill.getActReceivableFee()).multiply(new BigDecimal(-1)));
                    addBill.setBtFee(Constants.formatBigdecimal(addBill.getReceivableFee()).multiply(new BigDecimal(-1)));
                }
                totalBackFee = totalBackFee.add(Constants.formatBigdecimal(addBill.getBtFee()));
                addBill.setEditDate(param.getEditDate());
@@ -529,12 +529,20 @@
                        yjBill.setEditDate(param.getEditDate());
                        yjBill.setEditor(param.getEditor());
                        yjBill.setReceivableFee(BigDecimal.ZERO);
                        if(Constants.formatBigdecimal(canBill.getActReceivableFee()).compareTo(new BigDecimal(0)) == 0){
                            //未支付的押金,直接关闭
                            yjBill.setStatus(Constants.ONE);
                            closeBills.add(yjBill);
                        }else{
                            yjBill.setBtFee(Constants.formatBigdecimal(canBill.getActReceivableFee()).multiply(new BigDecimal(-1)));
                        yjBill.setPayStatus(Constants.FOUR);
                        yjBill.setPlanPayDate(canBill.getPlanPayDate());
                            totalBackFee = totalBackFee.add(Constants.formatBigdecimal(yjBill.getBtFee()));
                            yjNoBills ++;
                        }
                        ywContractBillMapper.updateById(yjBill);
                    }
                }
                yjNoBills ++;
            }
        }
        param.setBtWaitBill(canBills.size() + newBills.size()+yjNoBills);//未清算的账单数量
@@ -689,12 +697,16 @@
        }
        int num =1;
        for(int i=0;i<billList1.size();i++){
            if(Constants.equalsInteger(billList1.get(i).getCostType(),Constants.ZERO)){
            billList1.get(i).setSortnum(num);
            num++;
        }
        }
        for(int i=0;i<billList2.size();i++){
            if(Constants.equalsInteger(billList1.get(i).getCostType(),Constants.ONE)) {
            billList2.get(i).setSortnum(num);
            num++;
            }
        }
        if(model.getId()!=null){
            ywContractBillMapper.insert(billList1);
@@ -840,34 +852,37 @@
        BigDecimal totalFee = new BigDecimal(0);
        DateCompare dateCompare =   DateCompare.dayCompare(bill.getStartDate(),bill.getEndDate(),freeStart, freeEnd);
        if(Constants.equalsInteger(d.getCircleType(),Constants.ZERO)){
            //0=元每平米天
            //0=元每平米天 账单金额=账单周期的天数*租赁面积*单价;
            int days = dateCompare.getDay() ;
            BigDecimal areas = getAreasNumBYRooms(model.getRoomList());
            totalFee = new BigDecimal(days).multiply(areas).multiply(Constants.formatBigdecimal(d.getPrice()));//总价格
        }else  if(Constants.equalsInteger(d.getCircleType(),Constants.ONE)){
            //1=元每平米月
            //1=元每平米月 账单金额=账单周期的月数(开始日期计算自然月)*租赁面积*单价+不满一个月的天数*租赁面积*单价*12/365;
            BigDecimal areas = getAreasNumBYRooms(model.getRoomList());
            BigDecimal month =dateCompare.getMonthFloat();
            totalFee = month.multiply(areas).multiply(Constants.formatBigdecimal(d.getPrice()));//总价格
        }else  if(Constants.equalsInteger(d.getCircleType(),Constants.TWO)){
            //2=元每平米年
            //2=元每平米年 账单金额=账单周期的月数(开始日期计算自然月)*单价*面积/12+不满一个月的天数*租赁面积*单价/365;
            BigDecimal areas = getAreasNumBYRooms(model.getRoomList());
            BigDecimal year =  dateCompare.getYearFloat();
            totalFee = year.multiply(areas).multiply(Constants.formatBigdecimal(d.getPrice()));//总价格
            BigDecimal month = new BigDecimal(dateCompare.getMonth());
            totalFee = ((month.multiply(Constants.formatBigdecimal(d.getPrice())).divide(new BigDecimal(12),2, RoundingMode.HALF_UP))
                    .add(new BigDecimal(dateCompare.getMonthDays()).multiply(Constants.formatBigdecimal(d.getPrice())).divide(new BigDecimal(365),2, RoundingMode.HALF_UP)))
                    .multiply(areas);//总价格
        }else  if(Constants.equalsInteger(d.getCircleType(),Constants.THREE)){
            //3=元每天
            //3=元每天 账单金额=账单周期的天数*单价;
            int days = dateCompare.getDay() ;
            totalFee = new BigDecimal(days).multiply(Constants.formatBigdecimal(d.getPrice()));//总价格
        }else  if(Constants.equalsInteger(d.getCircleType(),Constants.FOUR)){
            //4=元每月
            //4=元每月 账单金额=账单周期的月数(开始日期计算自然月)*单价+不满一个月的天数*单价*12/365
            BigDecimal month = dateCompare.getMonthFloat();
            totalFee = month.multiply(Constants.formatBigdecimal(d.getPrice()));//总价格
        }else  if(Constants.equalsInteger(d.getCircleType(),Constants.FIVE)){
            //5=元每年
            BigDecimal year =  dateCompare.getYearFloat();
            totalFee = year.multiply(Constants.formatBigdecimal(d.getPrice()));//总价格
            //5=元每年 账单金额=账单周期的月数(开始日期计算自然月)*单价*面积/12+不满一个月的天数*租赁面积*单价/365;
            BigDecimal month = new BigDecimal(dateCompare.getMonth());
            totalFee =( month.multiply(Constants.formatBigdecimal(d.getPrice())).divide(new BigDecimal(12),2, RoundingMode.HALF_UP))
                    .add(new BigDecimal(dateCompare.getMonthDays()).multiply(Constants.formatBigdecimal(d.getPrice())).divide(new BigDecimal(365),2, RoundingMode.HALF_UP));//总价格
        }else  if(Constants.equalsInteger(d.getCircleType(),Constants.SIX)){
            //6=元每场
            //6=元每场 账单金额=单价;只有选择一次性付款时,才能选择该单价维度;
            totalFee =Constants.formatBigdecimal(d.getPrice());
        }
        if(Constants.equalsInteger(model.getRoundedUp(),Constants.ONE)){
@@ -938,7 +953,7 @@
        BigDecimal data= new BigDecimal(0);
        if(roomList!=null){
            for(YwRoom r :roomList){
                data = data.add(Constants.formatBigdecimal(r.getArea()));
                data = data.add(Constants.formatBigdecimal(r.getRentArea()));
            }
        }
@@ -1132,7 +1147,7 @@
        }
        model.setTotalArea(new BigDecimal(0));
        for(YwRoom r : rooms){
            model.setTotalArea(model.getTotalArea().add(Constants.formatBigdecimal(r.getArea())));
            model.setTotalArea(model.getTotalArea().add(Constants.formatBigdecimal(r.getRentArea())));
        }
        model.setRoomList(rooms);
        YwCustomer customer = customerMapper.selectById(model.getRenterId());
@@ -1209,6 +1224,24 @@
    }
    @Override
    public YwContract findById(Integer id) {
        YwContract model =queryDetailInfoById(id);
        //查询操作日志记录
        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)));
        //查询账单集合
        queryBillListByModel(model,new Date());
        return model;
    }
    private YwContract queryDetailInfoById(Integer id) {
        MPJLambdaWrapper<YwContract> queryWrapper = new MPJLambdaWrapper<>();
        queryWrapper.selectAll(YwContract.class )
                .selectAs(Company::getName,YwContract::getCompanyName )
@@ -1224,7 +1257,9 @@
                .leftJoin(YwCustomer.class,YwCustomer::getId,YwContract::getRenterId)
                .eq( YwContract::getId,id);
        YwContract model = ywContractMapper.selectJoinOne(YwContract.class,queryWrapper);
        if(model != null){
        if (model == null) {
                throw  new BusinessException(ResponseStatus.DATA_EMPTY);
        }
            //合同附件
            initFiles(model);
            //查询房源信息数据
@@ -1258,30 +1293,20 @@
                    .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)));
            //查询账单集合
            queryBillListByModel(model,new Date());
        }
        return model;
    }
    @Override
    public YwContract findForBills(YwContract model) {
        queryBillListByModel(model,model.getBtDate());
    public YwContract findForBills(YwContract param) {
        YwContract model = queryDetailInfoById(param.getId());
        queryBillListByModel(model,param.getBtDate());
        return model;
    }
    private void queryBillListByModel(YwContract model,Date date) {
        if(date ==null){
            date = new Date();
        }
        //查询账单集合
        model.setBillList(ywContractBillMapper.selectJoinList(YwContractBill.class,new MPJLambdaWrapper<YwContractBill>()
                .selectAll(YwContractBill.class )
@@ -1290,13 +1315,13 @@
                .eq(  YwContractBill::getContractId,model.getId())
                .eq(YwContractBill::getIsdeleted,Constants.ZERO)
                .orderByAsc(YwContractBill::getSortnum,YwContractBill::getCreateDate)));
        for (YwContractBill ywContractBill:model.getBillList()) {
            ywContractBill.setNeedReceivableFee(ywContractBill.getReceivableFee().subtract(ywContractBill.getActReceivableFee()));
            ywContractBill.setNeedReceivableFee(ywContractBill.getReceivableFee());
//            ywContractBill.setNeedReceivableFee(ywContractBill.getReceivableFee().subtract(ywContractBill.getActReceivableFee()));
        }
        model.setCanBackRentBills(new ArrayList<>());
        long nowStart = Utils.Date.getStart(date).getTime();
        long nowEnd = Utils.Date.getEnd(date).getTime();
        long nowEnd = Utils.Date.getDayEnd(date).getTime();
        if(model.getBillList()!=null && model.getBillList().size()>0){
            for(YwContractBill bill: model.getBillList()){
                //付款状态:0=待收款;1=已结清;2=部分结清;3=待付款;4=待退款;5=已关闭
@@ -1307,7 +1332,6 @@
                        continue;
                    }
                    model.getCanBackRentBills().add(bill);
                }else  if(Constants.equalsInteger(bill.getPayStatus(),Constants.ONE) ){
                    if(bill.getEndDate().getTime()<nowStart){
                        //如果已结清,账单直接关闭
@@ -1318,7 +1342,42 @@
                    model.getCanBackRentBills().add(bill);
                }
            }
            for(YwContractBill bill : model.getCanBackRentBills()){
                YwContractDetail detail = null;
                if(Constants.equalsInteger(bill.getCostType(),Constants.ZERO)){
                    detail = getDetailByIdFromList(bill.getDetailId(),model.getZlDetailList());
                    if(detail!=null&& bill.getStartDate()!=null && bill.getEndDate()!=null
                            &&(date.getTime() <= bill.getStartDate().getTime() || (date.getTime() >= bill.getStartDate().getTime() && date.getTime()<= bill.getEndDate().getTime()))){
                        Date odate = bill.getEndDate();
                        bill.setEndDate(date);
                        BigDecimal actFee = getTotalFeeByStartEnd(model,detail,bill,model.getZlFreeStartDate(),model.getZlFreeEndDate());
                        bill.setEndDate(odate);
                        bill.setNeedReceivableFee(actFee);
        }
                }else if(Constants.equalsInteger(bill.getCostType(),Constants.ONE)){
                    detail = getDetailByIdFromList(bill.getDetailId(),model.getWyDetailList());
                    if(detail!=null&& bill.getStartDate()!=null && bill.getEndDate()!=null
                            &&(date.getTime() <= bill.getStartDate().getTime() || (date.getTime() >= bill.getStartDate().getTime() && date.getTime()<= bill.getEndDate().getTime()))){
                        Date odate = bill.getEndDate();
                        bill.setEndDate(date);
                        BigDecimal actFee = getTotalFeeByStartEnd(model,detail,bill,model.getWyFreeStartDate(),model.getWyFreeEndDate());
                        bill.setEndDate(odate);
                        bill.setNeedReceivableFee(actFee);
                    }
                }
            }
        }
    }
    private YwContractDetail getDetailByIdFromList(Integer detailId, List<YwContractDetail> list) {
        if(list!=null){
            for(YwContractDetail d : list){
                if(Constants.equalsInteger(detailId,d.getId())){
                    return d;
                }
            }
        }
        return  null;
    }
    @Override
@@ -1445,6 +1504,11 @@
            queryWrapper.ge(YwContract::getWyFreeEndDate, Utils.Date.getStart(pageWrap.getModel().getWyFreeEndDate()));
            queryWrapper.le(YwContract::getWyFreeEndDate, Utils.Date.getEnd(pageWrap.getModel().getWyFreeEndDate()));
        }
        if (pageWrap.getModel().getZlTotalFee() != null) {
            queryWrapper.eq(YwContract::getZlTotalFee, pageWrap.getModel().getZlTotalFee());
        }
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwPatrolSchemeServiceImpl.java
@@ -287,7 +287,7 @@
                .like(StringUtils.isNotBlank(model.getTitle()),YwPatrolScheme::getTitle,model.getTitle())
                //查询有时段交集的数据
                .apply(Objects.nonNull(model.getStartDate())&&Objects.nonNull(model.getEndDate()),
                        " t.START_DATE <= '"+Utils.Date.getStart(pageWrap.getModel().getEndDate())+"' and t.END_DATE >= '"+Utils.Date.getStart(pageWrap.getModel().getStartDate())+"' "
                        " t.START_DATE <= '"+pageWrap.getModel().getEndDate()+"' and t.END_DATE >= '"+pageWrap.getModel().getStartDate()+"' "
                )
//                .ge(Objects.nonNull(model.getStartDate()),YwDeviceRecord::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getStartDate()))
//                .le(Objects.nonNull(model.getEndDate()),YwDeviceRecord::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getEndDate()))
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwWorkorderServiceImpl.java
@@ -404,7 +404,6 @@
                    .like(YwRoom::getRoomNum,pageWrap.getModel().getRoomName())
            );
        }
        if (pageWrap.getModel().getCreator() != null) {
            queryWrapper.eq(YwWorkorder::getCreator, pageWrap.getModel().getCreator());
        }