jiangping
2024-12-03 20232b4204a2994b934afd1f5812337680ea5fdb
Merge remote-tracking branch 'origin/master'
已修改24个文件
794 ■■■■■ 文件已修改
admin/.env 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/.env.test 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaInternalCompanyWindow.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/common/MemberSearch/src/index.vue 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/router/index.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/internalCompany.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/internalMember.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/contract/components/addCollectionBill.vue 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/contract/components/addPaymentBill.vue 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/contract/components/config.js 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/contract/components/contractDetail.vue 21 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/contract/components/contractEdit.vue 145 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/contract/components/terminateLease.vue 80 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/contract/contractList.vue 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/finance/company.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/finance/components/bullEditFu.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/finance/components/companyEdit.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/login.vue 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/project/housingList.vue 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/common/memberSel.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/operation/record.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/polling/task.vue 439 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/workOrder/edit.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/workOrder/list.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/.env
@@ -4,7 +4,7 @@
VUE_APP_ROUTER_MODE = 'hash'
# 项目上下文路径
VUE_APP_CONTEXT_PATH = '/fn_admin'
VUE_APP_CONTEXT_PATH = '/'
# 接口前缀
VUE_APP_API_PREFIX = '/gateway_interface'
admin/.env.test
@@ -3,6 +3,6 @@
# VUE_APP_API_URL  = 'http://192.168.5.13/gateway_interface'
VUE_APP_API_URL  = 'http://192.168.0.162:10010/'
VUE_APP_API_URL  = 'http://192.168.0.163:10010/'
# VUE_APP_API_URL  = 'http://192.168.0.108:10030/'
admin/src/components/business/OperaInternalCompanyWindow.vue
@@ -39,7 +39,7 @@
      // 表单数据
      form: {
        id: null,
        type: '2',
        type: '1',
        name: '',
        parentId: null,
        disable: false,
admin/src/components/common/MemberSearch/src/index.vue
@@ -4,8 +4,9 @@
      <div class="df_ac mb20">
        <el-input v-model="modalSearchValue" placeholder="请输入客户名称" class="w400" @keyup.enter.native="queryList">
        </el-input>
        <el-button class="ml10" type="primary" @click="queryList()">查询</el-button>
        <el-button class="ml10 mr10" type="primary" @click="queryList()">查询</el-button>
        <el-button class="ml10" @click="clear()">重置</el-button>
        <el-button class="ml10" type="primary" @click="$refs.operaYwCustomerWindow.open('新建客户')">新建客户</el-button>
      </div>
      <el-table ref="table" v-loading="listLoading" :data="list" element-loading-text="Loading" border fit
        :header-row-class-name="'table-header'" class="doumee-element-table doumee-element-tableb"
@@ -53,8 +54,12 @@
          </template>
        </el-table-column>
      </el-table>
      <Pagination @size-change="handleSizeChange" @current-change="getList" :pagination="pagination" />
      <div style="text-align: right; margin-top: 15px;">
        <Pagination @size-change="handleSizeChange" @current-change="getList" :pagination="pagination" />
      </div>
    </div>
    <!-- 新建/修改 -->
    <OperaYwCustomerWindow ref="operaYwCustomerWindow" @success="clear" />
  </GlobalWindow>
</template>
@@ -62,10 +67,12 @@
import { fetchList } from '@/api/customer'
import GlobalWindow from '@/components/common/GlobalWindow'
import Pagination from '@/components/common/Pagination'
import OperaYwCustomerWindow from '@/views/client/components/OperaYwCustomerWindow'
export default {
  components: {
    Pagination,
    GlobalWindow
    GlobalWindow,
    OperaYwCustomerWindow
  },
  props: {
    isShowChooseBtn: {
admin/src/router/index.js
@@ -10,8 +10,8 @@
const router = new VueRouter({
  // + (process.env.VUE_APP_ROUTER_MODE === 'hash' ? '#' : '')
  base: process.env.VUE_APP_CONTEXT_PATH,
  mode: process.env.VUE_APP_ROUTER_MODE,
  // base: process.env.VUE_APP_CONTEXT_PATH,
  mode: 'hash',
  routes: [
    // 登录
    {
admin/src/views/business/internalCompany.vue
@@ -73,7 +73,7 @@
      loading: false,
      sorting: false,
      searchForm: {
        type: 2
        type: 1
      },
      list: [],
      total: 0
admin/src/views/business/internalMember.vue
@@ -287,7 +287,7 @@
    },
    // 获取组织树
    getfindCompanyTreePage () {
      fetchList()
      fetchList(1)
        .then(res => {
          if (res && res.length > 0) {
            res[0].fsStatus = 1
admin/src/views/contract/components/addCollectionBill.vue
@@ -10,7 +10,7 @@
            <div class="main_content">
                <el-form :model="form" label-position="top" ref="form" :rules="rules">
                    <div class="head">
                        <div class="m_title">基础信息-{{time.startDate}}~{{time.endDate}}</div>
                        <div class="m_title">基础信息</div>
                        <div class="tabs">
                            <div class="tab" :class="{ active: form.feeType === 0 }" @click="timeTabClick(0)">周期费用</div>
                            <div class="tab" :class="{ active: form.feeType === 1 }" @click="timeTabClick(1)">一次性费用</div>
@@ -85,11 +85,9 @@
    extends: BaseOpera,
    data () {
      const validateArr = (rule, value, callback) => {
        if (value.length === 0 || !value) {
          callback(new Error('请选择'));
        } else {
          callback();
        }
        if (!value) return callback(new Error('请选择'));
        if (!value.length === 0) return callback(new Error('请选择'));
        callback();
      };
      return {
        form: {
@@ -126,7 +124,7 @@
            { required: true, message: '请选择', trigger: 'blur' }
          ],
          date: [
            { validator: validateArr, trigger: 'blur' }
            { required: true, validator: validateArr, trigger: 'blur' }
          ],
          receivableFee: [
            { required: true, message: '请输入', trigger: 'blur' }
@@ -143,14 +141,15 @@
    },
    methods: {
      open (title, target, time) {
        var that = this
        this.title = title
        this.time.startDate = time.startDate
        this.time.endDate = time.endDate
        this.pickerOptions = {
          disabledDate(time) {
            // 如果没有后面的 -8.64e7 就是不可以选择今天的
            const beginDate = new Date(time.startDate).getTime() - 8.64e7
            const endDate = new Date(time.endDate).getTime() - 8.64e7
            const beginDate = new Date(that.time.startDate).getTime() - 8.64e7
            const endDate = new Date(that.time.endDate).getTime()
            return beginDate > time.getTime() || endDate < time.getTime()
          }
        }
admin/src/views/contract/components/addPaymentBill.vue
@@ -34,6 +34,7 @@
                                range-separator="至"
                                v-model="form.date"
                                @change="changeDate"
                                :picker-options="pickerOptions"
                                start-placeholder="开始日期"
                                end-placeholder="结束日期"
                                value-format="yyyy-MM-dd"
@@ -97,12 +98,18 @@
          startDate: '',
          endDate: '',
          price: 0,
          feeType: 0,
          receivableFeeCopy: '',
          receivableFee: '',
          planPayDate: '',
          billType: 1,
          billTypeCopy: 1,
          date: []
        },
        pickerOptions: {},
        time: {
          startDate: '',
          endDate: ''
        },
        rules: {
          contractCode: [
@@ -131,8 +138,18 @@
      }
    },
    methods: {
      open (title, target) {
      open (title, target, time) {
        var that = this
        this.title = title
        this.time.startDate = time.startDate
        this.time.endDate = time.endDate
        this.pickerOptions = {
          disabledDate(time) {
            const beginDate = new Date(that.time.startDate).getTime() - 8.64e7
            const endDate = new Date(that.time.endDate).getTime()
            return beginDate > time.getTime() || endDate < time.getTime()
          }
        }
        this.getCompanyList()
        this.visible = true
        // 新建
admin/src/views/contract/components/config.js
@@ -12,8 +12,6 @@
  memberName: [{ required: true, message: '请选择' }],
  zlDeposit: [{ required: true, message: '请输入' }],
  zlPayType: [{ required: true, message: '请选择' }],
  zlDate: [{ required: true, message: '请选择' }],
  wyDeposit: [{ required: true, message: '请输入' }],
  wyPayType: [{ required: true, message: '请选择' }],
  wyDate: [{ required: true, message: '请选择' }]
  wyPayType: [{ required: true, message: '请选择' }]
}
admin/src/views/contract/components/contractDetail.vue
@@ -2,6 +2,7 @@
  <GlobalWindow
    :title="title"
    :visible.sync="visible"
    :withFooter="false"
    :confirm-working="isWorking"
    @close="close"
    @confirm="confirm">
@@ -9,9 +10,10 @@
      <div class="left">
        <span class="mr10">单位名称:{{info.renterName}}</span>
        <el-tag type="success" v-if="info.status === 0">待执行</el-tag>
        <el-tag type="success" v-if="info.status === 1">执行中</el-tag>
        <el-tag type="success" v-if="info.status === 2">已到期</el-tag>
        <el-tag type="success" v-if="info.status === 3">已退租</el-tag>
        <el-tag type="success" v-if="info.status === 1">正常执行中</el-tag>
        <el-tag type="info" v-if="info.status === 2">已到期</el-tag>
        <el-tag type="info" v-if="info.status === 3">退租结算中</el-tag>
        <el-tag type="info" v-if="info.status === 4">已退租</el-tag>
      </div>
      <el-button plain type="danger" v-if="[0, 1, 2].includes(info.status)" @click="refund">退租</el-button>
    </div>
@@ -178,6 +180,7 @@
          label="账单金额">
        </el-table-column>
        <el-table-column
          :key="Date.now()"
          prop="receivableFee"
          label="应收金额">
        </el-table-column>
@@ -188,6 +191,11 @@
        <el-table-column
          prop="needReceivableFee"
          label="需收金额">
          <template slot-scope="{row}">
            <el-tag type="success" v-if="row.needReceivableFee > 0">收</el-tag>
            <el-tag type="warning" v-else>付</el-tag>
            <span style="margin-left: 10px;">{{Math.abs(row.needReceivableFee)}}</span>
          </template>
        </el-table-column>
        <el-table-column
          label="账单来源">
@@ -243,14 +251,20 @@
        border
        style="width: 100%">
        <el-table-column
          :key="Date.now()"
          width="200"
          prop="param1"
          label="操作人">
        </el-table-column>
        <el-table-column
          :key="Date.now()"
          width="200"
          prop="createDate"
          label="操作时间">
        </el-table-column>
        <el-table-column
          :key="Date.now()"
          width="150"
          label="操作">
          <template slot-scope="{row}">
            <span v-if="row.objType === 0">工单创建</span>
@@ -262,6 +276,7 @@
          </template>
        </el-table-column>
        <el-table-column
          :key="Date.now()"
          prop="content"
          label="操作内容">
        </el-table-column>
admin/src/views/contract/components/contractEdit.vue
@@ -1,9 +1,17 @@
<template>
  <GlobalWindow width="100%" :title="title" :visible.sync="visible" :confirm-working="isWorking" @close="close"
    @confirm="confirm">
    <div class="tabs">
      <div class="tab" :class="{ active: activeTabs === 0 }" @click="tabsClick(0)">1、基本信息</div>
      <div class="tab" :class="{ active: activeTabs === 1 }" @click="tabsClick(1)">2、费用条款</div>
<!--  :text="activeTabs === 0 ? '下一步' : '提交'"-->
<!--  :backText="activeTabs === 0 ? '返回' : '上一步'"-->
  <GlobalWindow
    width="100%"
    :title="title"
    :withFooter="false"
    :visible.sync="visible"
    :confirm-working="isWorking"
    @confirm="confirm"
    @close="close">
    <div class="tabs fixed">
      <div class="tab" :class="{ active: activeTabs === 0 }">1、基本信息</div>
      <div class="tab" :class="{ active: activeTabs === 1 }">2、费用条款</div>
    </div>
    <div v-show="activeTabs === 0">
      <div class="main">
@@ -25,13 +33,13 @@
                </el-select>
              </el-form-item>
              <el-form-item label="合同签订日期" prop="signDate">
                <el-date-picker type="date" v-model="form.signDate" value-format="yyyy-MM-dd" placeholder="请选择" />
                <el-date-picker type="date" v-model="form.signDate" value-format="yyyy-MM-dd" :clearable="false" placeholder="请选择" />
              </el-form-item>
              <el-form-item label="合同开始日期" prop="startDate">
                <el-date-picker type="date" v-model="form.startDate" value-format="yyyy-MM-dd" placeholder="请选择" />
                <el-date-picker type="date" v-model="form.startDate" @change="getHouseData" :clearable="false" value-format="yyyy-MM-dd" placeholder="请选择" />
              </el-form-item>
              <el-form-item label="合同结束日期" prop="endDate">
                <el-date-picker type="date" v-model="form.endDate" value-format="yyyy-MM-dd" placeholder="请选择" />
                <el-date-picker type="date" v-model="form.endDate" @change="getHouseData" :clearable="false" value-format="yyyy-MM-dd" placeholder="请选择" />
              </el-form-item>
              <el-form-item label="归属项目" prop="projectId">
                <el-select v-model="form.projectId" placeholder="请选择">
@@ -126,13 +134,13 @@
                <el-button type="text" size="medium" @click="addZl">增加</el-button>
              </div>
              <div class="list">
                <template v-for="(item, index) in form.zlDetailList" :key="index">
                <div v-for="(item, index) in form.zlDetailList" :key="index">
                  <el-form-item label="起始日期" prop="time">
                    <el-date-picker type="daterange" v-model="item.time" @change="getDate1($event, index)" value-format="yyyy-MM-dd" placeholder="请选择" />
                  </el-form-item>
                  <el-form-item label="合同单价" prop="price">
                    <el-input placeholder="请输入" v-model="item.price">
                      <el-select v-model="item.circleType" slot="append" placeholder="请选择">
                    <el-input placeholder="请输入" v-model="item.price" class="input-with-select">
                      <el-select v-model="item.circleType" style="width: 150px;" slot="append" placeholder="请选择">
                        <el-option v-for="(item, index) in unitOps" :key="index" :value="item.value" :label="item.name"></el-option>
                      </el-select>
                    </el-input>
@@ -143,7 +151,7 @@
                      <el-link :underline="false" type="danger" @click="deleZl(index)" style="margin-left: 20px; flex-shrink: 0;">删除</el-link>
                    </div>
                  </el-form-item>
                </template>
                </div>
              </div>
            </el-form>
          </div>
@@ -173,11 +181,15 @@
            </template>
          </el-table-column>
          <el-table-column prop="planPayDate" label="付款日" align="center" show-overflow-tooltip />
          <el-table-column prop="receivableFee" label="应收" align="center" show-overflow-tooltip />
          <el-table-column label="应收" align="center" show-overflow-tooltip>
            <template slot-scope="{row}">
              {{row.receivableFee}}元
            </template>
          </el-table-column>
        </el-table>
        <div class="total">
          <span>总计</span>
          <div>费用应收总计:{{zlPrice}},押金应收总计:{{form.zlDeposit}}</div>
          <div>费用应收总计:{{zlPrice}}元,押金应收总计:{{form.zlDeposit}}元</div>
        </div>
      </div>
      <!--   物业条款   -->
@@ -205,13 +217,13 @@
                <el-button type="text" size="medium" @click="addWy">增加</el-button>
              </div>
              <div class="list">
                <template v-for="(item, index) in form.wyDetailList" :key="index">
                <div v-for="(item, index) in form.wyDetailList" :key="index">
                  <el-form-item label="起始日期" prop="time">
                    <el-date-picker type="daterange" v-model="item.time" @change="getDate2($event, index)" value-format="yyyy-MM-dd" placeholder="请选择" />
                  </el-form-item>
                  <el-form-item label="合同单价" prop="price">
                    <el-input placeholder="请输入" v-model="item.price">
                      <el-select v-model="item.circleType" slot="append" placeholder="请选择">
                      <el-select v-model="item.circleType" style="width: 150px;" slot="append" placeholder="请选择">
                        <el-option v-for="(item, index) in unitOps" :key="index" :value="item.value" :label="item.name"></el-option>
                      </el-select>
                    </el-input>
@@ -222,7 +234,7 @@
                      <el-link :underline="false" type="danger" @click="deleWy(index)" style="margin-left: 20px; flex-shrink: 0;">删除</el-link>
                    </div>
                  </el-form-item>
                </template>
                </div>
              </div>
            </el-form>
          </div>
@@ -252,13 +264,24 @@
            </template>
          </el-table-column>
          <el-table-column prop="planPayDate" label="付款日" align="center" show-overflow-tooltip />
          <el-table-column prop="receivableFee" label="应收" align="center" show-overflow-tooltip />
          <el-table-column prop="receivableFee" label="应收" align="center" show-overflow-tooltip>
            <template slot-scope="{row}">
              {{row.receivableFee}}元
            </template>
          </el-table-column>
        </el-table>
        <div class="total">
          <span>总计</span>
          <div>费用应收总计:{{wyPrice}},押金应收总计:{{form.wyDeposit}}</div>
          <div>费用应收总计:{{wyPrice}}元,押金应收总计:{{form.wyDeposit}}元</div>
        </div>
      </div>
    </div>
    <div class="window__footer" style="position: sticky; bottom: 0; left: 0; z-index: 9; background: #ffffff;">
      <slot name="footer">
        <el-button @click="confirm" :loading="confirmWorking" type="primary">{{activeTabs === 0 ? '下一步' : '提交'}}</el-button>
        <slot name="btns" />
        <el-button @click="close">{{activeTabs === 0 ? '返回' : '上一步'}}</el-button>
      </slot>
    </div>
    <!-- 选择租客 -->
    <MemberSearch ref="MemberSearchRef" @select="getTenant" />
@@ -387,17 +410,47 @@
      this.getUser()
      this.getProject()
      this.getCompany()
      this.getHouseTree()
      this.visible = true
      this.$nextTick(() => {
        this.$refs.form.resetFields()
        for (const key in this.form) {
          if (['roomIds', 'fileList', 'wyDate', 'zlDate'].includes(key)) {
            this.form[key] = []
          } else {
            this.form[key] = target[key]
            this.form[key] = ''
          }
        }
        this.form.zlDetailList = [
          {
            startDate: '',
            endDate: '',
            time: [],
            price: '',
            advanceDays: ''
          }
        ]
        this.form.wyDetailList = [
          {
            startDate: '',
            endDate: '',
            time: [],
            price: '',
            advanceDays: ''
          }
        ]
        this.wyList = []
        this.zlList = []
        this.form.userId = this.userInfo.id
        this.form.signDate = this.getDayTime()
        this.form.startDate = this.getDayTime()
        this.form.endDate = this.getDayTime(1)
        this.getHouseTree()
      })
    },
    getHouseData () {
      if (this.form.startDate && this.form.endDate) {
        this.getHouseTree()
      }
    },
    changeType (e) {
      if (e === 0 || e === 2) {
@@ -406,11 +459,24 @@
        this.cactiveTabs = 1
      }
    },
    getDayTime (num) {
      const today = new Date();
      const year = today.getFullYear();
      const month = today.getMonth() + 1; // 月份是从 0 开始的,因此需要加 1
      const day = today.getDate();
      if (!num) {
        return `${year}-${month < 10 ? '0' + month : month}-${day < 10 ? '0' + day : day}`;
      } else {
        return `${year + 1}-${month < 10 ? '0' + month : month}-${day < 10 ? '0' + day : day}`;
      }
    },
    confirm () {
      this.$refs.form.validate((valid) => {
        if (!valid) {
          return
        }
      if (this.activeTabs === 0) {
        this.$refs.form.validate((valid) => {
          if (!valid) return
          this.activeTabs = 1
        })
      } else if (this.activeTabs === 1) {
        if (this.form.type === 0) {
          this.$refs.paramCostRef.validate((valid1) => {
            if (!valid1) {
@@ -438,7 +504,7 @@
            this.submit()
          })
        }
      })
      }
    },
    submit () {
      // 调用新建接口
@@ -471,7 +537,10 @@
      this.form.roomIds = arr.filter(item => item !== undefined);
    },
    getHouseTree () {
      tree({})
      tree({
        startDate: this.form.startDate,
        endDate: this.form.endDate
      })
        .then(res => {
          res.forEach(item => {
            item.disabled = true
@@ -490,30 +559,30 @@
      }
    },
    generateZL () {
      getBillList({ ...this.form })
      getBillList({ ...this.form, billType: 0 })
        .then(res => {
          let zlPrice = 0
          let arr = []
          res.forEach(item => {
            if (item.costType === 0) {
              zlPrice += item.receivableFee
              arr.push(item)
            }
            arr.push(item)
          })
          this.zlPrice = zlPrice
          this.zlList = arr
        })
    },
    generateWY () {
      getBillList({ ...this.form })
      getBillList({ ...this.form, billType: 1 })
        .then(res => {
          let zlPrice = 0
          let arr = []
          res.forEach(item => {
            if (item.costType === 1) {
              zlPrice += item.receivableFee
              arr.push(item)
            }
            arr.push(item)
          })
          this.wyPrice = zlPrice
          this.wyList = arr
@@ -582,6 +651,7 @@
      companyList({ type: 2 })
        .then(res => {
          this.comparyList = res
          this.form.companyId = res[0].id
        })
    },
    tabsClick (val) {
@@ -631,7 +701,11 @@
      this.form.fileList.push({ ...item, fileurl: item.imgaddr, name: item.originname, userName: this.userInfo.realname, createTime: this.getDay() })
    },
    close () {
      this.$emit('close')
      if (this.activeTabs === 0) {
        this.$emit('close')
      } else {
        this.activeTabs = 0
      }
    }
  }
}
@@ -639,7 +713,12 @@
<style lang="scss" scoped>
@import '@/assets/style/variables.scss';
.fixed {
  background: #ffffff;
  position: sticky;
  top: 0;
  left: 0;
}
.tabs {
  border-bottom: 1px solid #DFE2E8;
  display: flex;
admin/src/views/contract/components/terminateLease.vue
@@ -24,7 +24,6 @@
                            </el-select>
                        </el-form-item>
                        <el-form-item label="退租日期" prop="btDate" style="width: 33%;">
<!--                            @change="changeBtDate"-->
                            <el-date-picker
                                v-model="form.btDate"
                                type="date"
@@ -197,12 +196,16 @@
  import AddPaymentBill from './addPaymentBill'
  import { getUserList } from '@/api/system/user'
  import { backRent, getCanBackBill } from '@/api/contract'
  import { mapState } from 'vuex'
  export default {
    name: "terminateLease",
    components: {
      GlobalWindow,
      AddCollectionBill,
      AddPaymentBill
    },
    computed: {
      ...mapState(['userInfo'])
    },
    extends: BaseOpera,
    data() {
@@ -245,30 +248,33 @@
      }
    },
    watch: {
      info: {
        deep: true,
        immediate: true,
        handler(news, olds) {
          const arr = [...this.info.terminateList, ...this.info.depositList]
          let total1 = 0
          let total2 = 0
          arr.forEach(item => {
            if (item.billType === 0) {
              total1 += Number(item.price)
            } else if (item.billType === 1) {
              total2 += Number(item.price)
            }
          })
          this.receivable = total1
          this.meet = total2
        }
      }
      // info: {
      //   deep: true,
      //   immediate: true,
      //   handler(news, olds) {
      //     const arr = [...this.info.terminateList, ...this.info.depositList]
      //     let total1 = 0
      //     let total2 = 0
      //     arr.forEach(item => {
      //       if (item.billType === 0) {
      //         total1 += Number(item.price)
      //       } else if (item.billType === 1) {
      //         total2 += Number(item.price)
      //       }
      //     })
      //     this.receivable = total1
      //     this.meet = total2
      //   }
      // }
    },
    methods: {
      open (title, info) {
        this.title = title
        this.info = info
        this.form.id = info.id
        this.form.btSignDate = this.getDay()
        console.log(this.userInfo)
        this.form.btUserId = this.userInfo.id
        this.$nextTick(() => {
          this.$refs.form.resetFields()
        })
@@ -294,8 +300,30 @@
            return item
          }
        })
        this.countData()
        this.getUser()
        this.visible = true
      },
      countData () {
        const arr = [...this.info.terminateList, ...this.info.depositList]
        let total1 = 0
        let total2 = 0
        arr.forEach(item => {
          if (item.billType === 0) {
            total1 += Number(item.price)
          } else if (item.billType === 1) {
            total2 += Number(item.price)
          }
        })
        this.receivable = total1
        this.meet = total2
      },
      getDay () {
        const today = new Date();
        const year = today.getFullYear();
        const month = today.getMonth() + 1; // 月份是从 0 开始的,因此需要加 1
        const day = today.getDate();
        return `${year}-${month < 10 ? '0' + month : month}-${day < 10 ? '0' + day : day}`;
      },
      addZD () {
        if (!this.form.btDate) return this.$message.warning('请选择退租日期')
@@ -317,6 +345,7 @@
          renterName: this.info.renterName,
          renterId: this.info.renterId,
          billType: 1,
          feeType: 0,
          billTypeCopy: 1
        }, { startDate: this.info.startDate, endDate: this.form.btDate })
      },
@@ -337,16 +366,18 @@
              return item
            }
          })
          this.countData()
        }).finally(() => {
          this.loading = false
        })
      },
      getObjS (obj) {
        this.info.terminateList.push(obj)
        this.info.terminateList.forEach(item => {
          item.receivableFee = Number(item.receivableFee) + 1
          item.receivableFee = Number(item.receivableFee) - 1
        })
        // this.info.terminateList.forEach(item => {
        //   item.receivableFee = Number(item.receivableFee) + 1
        //   item.receivableFee = Number(item.receivableFee) - 1
        // })
        this.countData()
      },
      confirm () {
        this.$refs.form.validate((valid) => {
@@ -388,6 +419,7 @@
        if (Number(num) > row.receivableFeeCopy) {
          row.receivableFee = ''
          row.price = 0
          this.countData()
          this.$message.warning('不能大于原始应收付金额')
        } else {
          if (num) {
@@ -413,9 +445,9 @@
          } else {
            row.price = 0
            row.billType = row.billTypeCopy
            console.log('billTypeCopy', row.billTypeCopy)
          }
          row.price = Math.abs(row.price);
          this.countData()
        }
      }
    }
admin/src/views/contract/contractList.vue
@@ -12,7 +12,20 @@
      <el-table-column prop="renterName" label="客户名称" min-width="100" show-overflow-tooltip />
      <el-table-column prop="startDate" label="开始日期" min-width="100" show-overflow-tooltip />
      <el-table-column prop="endDate" label="结束日期" min-width="100" show-overflow-tooltip />
<!--      <el-table-column label="租赁单价" min-width="100" show-overflow-tooltip></el-table-column>-->
        <el-table-column prop="zlFirstPrice" label="租赁单价" min-width="100" show-overflow-tooltip>
            <template slot-scope="{row}">
                <div style="display: flex; align-items: center;">
                    <span>{{row.zlFirstPrice}}</span>
                    <span v-if="row.zlFirstCircle === 0">元/m²·天</span>
                    <span v-if="row.zlFirstCircle === 1">元/m²·月</span>
                    <span v-if="row.zlFirstCircle === 2">元/天</span>
                    <span v-if="row.zlFirstCircle === 3">元/月</span>
                    <span v-if="row.zlFirstCircle === 4">元/年</span>
                    <span v-if="row.zlFirstCircle === 5">元/m²·年</span>
                    <span v-if="row.zlFirstCircle === 6">元/场</span>
                </div>
            </template>
        </el-table-column>
      <el-table-column prop="totalArea" label="租赁面积" min-width="100" show-overflow-tooltip />
      <el-table-column prop="signDate" label="签订日" min-width="100" show-overflow-tooltip />
      <el-table-column prop="code" label="合同编号" min-width="100" show-overflow-tooltip />
admin/src/views/finance/company.vue
@@ -7,7 +7,7 @@
    </div>
    <el-table v-loading="loading" :data="list" stripe>
      <el-table-column prop="name" label="公司名称" min-width="100" show-overflow-tooltip />
      <el-table-column prop="shortName" label="公司简介" min-width="100" show-overflow-tooltip />
      <el-table-column prop="shortName" label="公司简称" min-width="100" show-overflow-tooltip />
      <el-table-column prop="code" label="纳税识别号" min-width="100" show-overflow-tooltip />
      <el-table-column prop="address" label="公司地址" min-width="100" show-overflow-tooltip />
      <el-table-column prop="accountNum" label="收支账户数量" min-width="100" show-overflow-tooltip />
admin/src/views/finance/components/bullEditFu.vue
@@ -13,8 +13,8 @@
                                <el-option v-for="(item, index) in contract" :key="index" :value="item.id" :label="item.code"></el-option>
                            </el-select>
                        </el-form-item>
                        <el-form-item label="付款方" prop="renterName">
                            <el-input v-model="form.renterName" disabled placeholder="请输入应收金额" v-trim />
                        <el-form-item label="收款方" prop="renterName">
                            <el-input v-model="form.renterName" disabled placeholder="收款方" v-trim />
                        </el-form-item>
                        <el-form-item label="房源" prop="ywContractRoomList">
                            <el-select v-model="form.ywContractRoomList" multiple placeholder="请选择">
admin/src/views/finance/components/companyEdit.vue
@@ -5,7 +5,7 @@
      <el-form-item label="公司名称" prop="name">
        <el-input v-model="param.name" placeholder="请输入" v-trim />
      </el-form-item>
      <el-form-item label="公司简介" prop="shortName">
      <el-form-item label="公司简称" prop="shortName">
        <el-input v-model="param.shortName" placeholder="请输入" v-trim />
      </el-form-item>
      <el-form-item label="纳税识别号">
@@ -90,4 +90,4 @@
}
</script>
<style lang="scss" scoped></style>
<style lang="scss" scoped></style>
admin/src/views/login.vue
@@ -127,7 +127,6 @@
          uuid: this.captcha.uuid
        })
          .then((res) => {
            // window.location.href = process.env.VUE_APP_CONTEXT_PATH
            if (this.isRemPsd) {
              localStorage.setItem('username', this.username.trim())
              localStorage.setItem('password', this.password.trim())
@@ -138,7 +137,7 @@
              localStorage.removeItem('isRemPsd')
            }
            Cookies.set('dm_user_token', res)
            this.$router.push('index')
            window.location.href = process.env.VUE_APP_CONTEXT_PATH
          })
          .catch(e => {
            this.refreshCaptcha()
admin/src/views/project/housingList.vue
@@ -40,9 +40,9 @@
        <el-table-column prop="feeArea" label="计费面积(m²)" min-width="80px"></el-table-column>
        <el-table-column prop="" label="租赁状态" min-width="80px">
          <template v-slot="{row}">
            <span v-if="row.leaseStatus == 0">待租赁</span>
            <span v-if="row.leaseStatus == 1">已租赁</span>
            <span v-if="row.leaseStatus == 2">未开启租赁</span>
            <span v-if="row.leaseStatus == 0">待租</span>
            <span v-else-if="row.leaseStatus == 1">已租</span>
            <span v-else>-</span>
          </template>
        </el-table-column>
        <el-table-column prop="isInvestment" label="招商状态" min-width="60px">
h5/pages/common/memberSel.vue
@@ -64,7 +64,7 @@
                    realname: param.name,
                    id: param.id
                }).then(res => {
                    this.memberList = res.data || []
                    this.memberList = [{id: '', realname: '全部'}, ...res.data]
                })
            }
        }
h5/pages/operation/record.vue
@@ -99,7 +99,7 @@
            },
            getpeo() {
                findInternalList().then(res => {
                    this.columns = [res.data]
                    this.columns = [...res.data]
                })
            },
            confirm(e) {
h5/pages/polling/task.vue
@@ -1,173 +1,196 @@
<template>
    <view class="main_app">
<!--         <view class="head_wrap">
        <!--         <view class="head_wrap">
            <view class="search_wrap">
                <image class="mr12 search" src="@/static/home/ic_search@2x.png" mode="widthFix"></image>
                <input v-model="param.keyword" @confirm="getList()" type="text" placeholder="搜索楼宇/房间名称" placeholder-class="placeholder9" />
            </view>
        </view> -->
        <!--  -->
        <view class="tabs">
            <view class="tab" :class="{active: param.queryStatus == '0,1'}" @click="tabsClick('0,1')">
                <text>待处理</text>
                <text class="border"></text>
            </view>
            <view class="tab" :class="{active: param.queryStatus == 3}" @click="tabsClick(3)">
                <text>已处理</text>
                <text class="border"></text>
            </view>
            <view class="tab" @click="allClick">
                <view class="name">
                    <image v-if="selectAll" class="icon" src="@/static/checked.png" mode=""></image>
                    <image v-else class="icon" src="@/static/check.png" mode=""></image>
                    <text>查看全部</text>
                </view>
                <text class="border"></text>
            </view>
        </view> -->
        <!--  -->
        <view class="tabs">
            <view class="tab" :class="{active: param.queryStatus == '0,1'}" @click="tabsClick('0,1')">
                <text>待处理</text>
                <text class="border"></text>
            </view>
            <view class="tab" :class="{active: param.queryStatus == 3}" @click="tabsClick(3)">
                <text>已处理</text>
                <text class="border"></text>
            </view>
            <view class="tab" @click="allClick">
                <view class="name">
                    <image v-if="selectAll" class="icon" src="@/static/checked.png" mode=""></image>
                    <image v-else class="icon" src="@/static/check.png" mode=""></image>
                    <text>查看全部</text>
                </view>
                <text class="border"></text>
            </view>
        </view>
        <!--  -->
        <view class="list">
            <view class="item" v-for="item in list" @click="itemClick(item)">
                <image v-if="item.status == 0 || item.status == 1" src="@/static/side/xunjianed.png" class="icon"></image>
                <image v-else src="@/static/side/xunjian.png" class="icon"></image>
                <view class="content">
                    <view class="name_wrap line">
                        <view class="name">{{item.planTitle}}</view>
                        <view class="status" :class="{
                            green: item.status == 1,
                            red: item.status == 2,
                            gray: item.status == 3 || item.status == 4
                        }">{{statusM[item.status]}}</view>
                    </view>
                    <view class="line" v-if="item.startDate">任务日期:{{ item.startDate.slice(0, 11) }}</view>
                    <view class="line">执行时间:{{ item.startDate.slice(11, 16) }} 至 {{ item.endDate.slice(11, 16) }}</view>
                    <view class="line">
                        <view>完成情况:{{item.finishNum || 0}}/{{item.patrolNum}}</view>
                        <view class="btn">
                            <image src="@/static/side/ic_saoma@2x.png" class="saoma" mode=""></image>
                            <view>扫码巡检</view>
                        </view>
        <scroll-view scroll-y="true" class="scroll_Y" @scrolltolower="scrolltolower">
            <view class="list">
                <view class="item" v-for="item in list" @click="itemClick(item)">
                    <image v-if="item.status == 0 || item.status == 1" src="@/static/side/xunjianed.png" class="icon"></image>
                    <image v-else src="@/static/side/xunjian.png" class="icon"></image>
                    <view class="content">
                        <view class="name_wrap line">
                            <view class="name">{{item.planTitle}}</view>
                            <view class="status" :class="{
                                green: item.status == 1,
                                red: item.status == 2,
                                gray: item.status == 3 || item.status == 4
                            }">{{statusM[item.status]}}</view>
                        </view>
                        <view class="line" v-if="item.startDate">任务日期:{{ item.startDate.slice(0, 11) }}</view>
                        <view class="line">执行时间:{{ item.startDate.slice(11, 16) }} 至 {{ item.endDate.slice(11, 16) }}</view>
                        <view class="line">
                            <view>完成情况:{{item.finishNum || 0}}/{{item.patrolNum}}</view>
                            <view class="btn">
                                <image src="@/static/side/ic_saoma@2x.png" class="saoma" mode=""></image>
                                <view>扫码巡检</view>
                            </view>
                        </view>
                    </view>
                </view>
            </view>
        </view>
        </scroll-view>
        <!--  -->
    </view>
</template>
<script>
    import { ywPatrolTaskPost } from '@/api'
<script>
    import {
        ywPatrolTaskPost
    } from '@/api'
    export default {
        data() {
            return {
                param: {
                    queryStatus: '0,1'
                },
                list: [],
                activeTab: 0,
                selectAll: false,
                page: 1,
                statusM: {
                    0: '待开始',
                    1: '进行中',
                    2: '已超期',
                    3: '已完成',
                    4: '已取消',
                param: {
                    queryStatus: '0,1'
                },
                list: [],
                activeTab: 0,
                selectAll: false,
                page: 1,
                statusM: {
                    0: '待开始',
                    1: '进行中',
                    2: '已超期',
                    3: '已完成',
                    4: '已取消',
                }
            };
        },
        onLoad() {
            this.getList()
        },
        onReachBottom() {
            const {total,list} = this
            if (list.length < total) {
                this.page = this.page + 1
                this.getList()
            } else {
                this.showToast('暂无更多数据')
            }
        },
        methods: {
            tabsClick(val) {
                this.param.status = val
                this.page = 1
                this.list = []
                this.getList()
            },
            allClick() {
                this.selectAll = !this.selectAll
                this.list = []
                this.page = 1
                this.getList()
            },
            itemClick(item) {
                uni.navigateTo({
                    url: '/pages/polling/detail?id=' + item.id
                })
            },
            getList() {
                const { page, param, selectAll } = this
                ywPatrolTaskPost({
                    model: {...param, dealUserId: selectAll ? '' : uni.getStorageSync('userInfo').id, },
                    page,
                    capacity: 10
                }).then(res => {
                    this.list = [...this.list, ...res.data.records]
                    this.total = res.data.total
                })
        onLoad() {
            this.getList()
        },
        methods: {
            scrolltolower() {
                const {
                    total,
                    list
                } = this
                if (list.length < total) {
                    this.page = this.page + 1
                    this.getList()
                } else {
                    this.showToast('暂无更多数据')
                }
            },
            tabsClick(val) {
                this.param.queryStatus = val
                this.page = 1
                this.list = []
                this.getList()
            },
            allClick() {
                this.selectAll = !this.selectAll
                this.list = []
                this.page = 1
                this.getList()
            },
            itemClick(item) {
                uni.navigateTo({
                    url: '/pages/polling/detail?id=' + item.id
                })
            },
            getList() {
                const {
                    page,
                    param,
                    selectAll
                } = this
                ywPatrolTaskPost({
                    model: {
                        ...param,
                        dealUserId: selectAll ? '' : uni.getStorageSync('userInfo').id,
                    },
                    page,
                    capacity: 10
                }).then(res => {
                    this.list = [...this.list, ...res.data.records]
                    this.total = res.data.total
                })
            }
        }
    }
</script>
<style lang="scss" scoped>
    .main_app{
        padding: 0 30rpx;
    }
    .tabs{
        display: flex;
        width: 750rpx;
        margin: 12rpx -30rpx 0;
        border-bottom: 1rpx solid #E5E5E5;
        .tab{
            font-size: 30rpx;
            color: #666666;
            flex: 1;
            display: flex;
            flex-direction: column;
            align-items: center;
            justify-content: flex-end;
            height: 88rpx;
            .name{
                display: flex;
                align-items: center;
            }
            .icon{
                width: 28rpx;
                height: 28rpx;
                margin-right: 10rpx;
            }
            .border{
                width: 54rpx;
                height: 6rpx;
                background-color: #fff;
                border-radius: 3rpx;
                margin-top: 24rpx;
            }
        }
        .active{
            font-weight: 600;
            font-size: 32rpx;
            color: #222222;
            .border{
                background-color: $primaryColor;
            }
        }
<style lang="scss" scoped>
    .main_app {
        padding: 0 30rpx;
    }
    .tabs {
        display: flex;
        width: 750rpx;
        margin: 12rpx -30rpx 0;
        border-bottom: 1rpx solid #E5E5E5;
        .tab {
            font-size: 30rpx;
            color: #666666;
            flex: 1;
            display: flex;
            flex-direction: column;
            align-items: center;
            justify-content: flex-end;
            height: 88rpx;
            .name {
                display: flex;
                align-items: center;
            }
            .icon {
                width: 28rpx;
                height: 28rpx;
                margin-right: 10rpx;
            }
            .border {
                width: 54rpx;
                height: 6rpx;
                background-color: #fff;
                border-radius: 3rpx;
                margin-top: 24rpx;
            }
        }
        .active {
            font-weight: 600;
            font-size: 32rpx;
            color: #222222;
            .border {
                background-color: $primaryColor;
            }
        }
    }
    .head_wrap {
        display: flex;
        align-items: center;
@@ -180,9 +203,11 @@
            background: #F7F7F7;
            border-radius: 38rpx;
            padding-left: 30rpx;
            input{
                flex: 1;
            input {
                flex: 1;
            }
            .search {
                width: 28rpx;
                height: 28rpx;
@@ -191,70 +216,86 @@
    }
    .scroll_Y {
        height: calc(100vh - 230rpx);
    }
    .list {
        .item {
            display: flex;
            // height: 290rpx;
            padding: 30rpx 0;
            // height: 290rpx;
            padding: 30rpx 0;
            border-bottom: 2rpx solid #E5E5E5;
            &:nth-last-child(1){
                border: none;
            }
            .icon {
                width: 80rpx;
                height: 80rpx;
                height: 80rpx;
                margin-right: 24rpx;
            }
            .content {
                flex: 1;
                color: #666666;
                display: flex;
                flex-direction: column;
                justify-content: space-between;
                .line{
                    margin-bottom: 20rpx;
                    display: flex;
                    justify-content: space-between;
                    align-items: center;
                    .btn{
                        display: flex;
                        align-items: center;
                        justify-content: center;
                        width: 180rpx;
                        height: 60rpx;
                        background: $primaryColor;
                        color: #fff;
                        font-size: 26rpx;
                        box-shadow: 0rpx 4rpx 12rpx 0rpx rgba(0,104,255,0.3);
                        border-radius: 30rpx;
                        .saoma{
                            width: 28rpx;
                            height: 28rpx;
                            margin-right: 8rpx;
                        }
                    }
                    &:nth-last-child(1){
                        margin-bottom: 0;
                    }
                }
                .name_wrap{
                    display: flex;
                    justify-content: space-between;
                    align-items: center;
                    .name{
                        display: flex;
                        align-items: flex-end;
                        font-weight: 600;
                        font-size: 34rpx;
                        color: #222222;
                    }
                    .status{
                        color: $primaryColor;
                    }
                    .green{
                        color: #0ADE79;
                    }
                    .gray{
                        color: #999999;
                    }
                flex: 1;
                color: #666666;
                display: flex;
                flex-direction: column;
                justify-content: space-between;
                .line {
                    margin-bottom: 20rpx;
                    display: flex;
                    justify-content: space-between;
                    align-items: center;
                    .btn {
                        display: flex;
                        align-items: center;
                        justify-content: center;
                        width: 180rpx;
                        height: 60rpx;
                        background: $primaryColor;
                        color: #fff;
                        font-size: 26rpx;
                        box-shadow: 0rpx 4rpx 12rpx 0rpx rgba(0, 104, 255, 0.3);
                        border-radius: 30rpx;
                        .saoma {
                            width: 28rpx;
                            height: 28rpx;
                            margin-right: 8rpx;
                        }
                    }
                    &:nth-last-child(1) {
                        margin-bottom: 0;
                    }
                }
                .name_wrap {
                    display: flex;
                    justify-content: space-between;
                    align-items: center;
                    .name {
                        display: flex;
                        align-items: flex-end;
                        font-weight: 600;
                        font-size: 34rpx;
                        color: #222222;
                    }
                    .status {
                        color: $primaryColor;
                    }
                    .green {
                        color: #0ADE79;
                    }
                    .gray {
                        color: #999999;
                    }
                }
            }
        }
h5/pages/workOrder/edit.vue
@@ -26,7 +26,7 @@
                    <u-icon name="arrow-right" color="#999999" size="15"></u-icon>
                </view>
            </view>
            <view class="item">
            <view class="item" v-if="param.areaType == 0">
                <view class="la">上门时间</view>
                <view class="line sel_wrap" @click="showTime = true">
                    <view class="left" :class="param.getDate ? '' : 'placeholder9'">{{ param.getDate ? param.getDate : '请选择' }}
h5/pages/workOrder/list.vue
@@ -44,7 +44,7 @@
                        <view class="line">位置类型:{{item.areaType == '0' ? '室内装修' : '公共区域'}}</view>
                        <view class="line">工单分类:{{item.categoryName}}</view>
                        <view class="line">上报时间:{{item.createDate}}</view>
                        <view class="line">上门时间:{{item.getDate}}</view>
                        <view class="line" v-if="item.getDate">上门时间:{{item.getDate}}</view>
                    </view>
                </view>
                <view v-if="list.length == 0" class="empty_wrap">