liukangdong
2025-01-24 dc2ed575ac5236f5100baac236254a434dcae8b9
Merge branch '2.0.1' of http://139.186.142.91:10010/r/productDev/funingyunwei into 2.0.1
已添加2个文件
已修改6个文件
479 ■■■■ 文件已修改
admin/.env.test 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/package-lock.json 114 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/package.json 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/ywWorkDesk.js 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/commonFunctions.vue 109 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/contract/components/contractEdit.vue 97 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/contract/components/terminationAgreement.vue 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/index.vue 138 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/.env.test
@@ -4,7 +4,7 @@
# VUE_APP_API_URL  = 'http://192.168.5.13/gateway_interface'
# ä»»åº·
VUE_APP_API_URL  = 'http://192.168.0.146:10010'
VUE_APP_API_URL  = 'http://192.168.0.133:10010'
# èå§
# VUE_APP_API_URL  = 'http://192.168.0.108:10010/'
admin/package-lock.json
@@ -410,8 +410,7 @@
    "@babel/helper-string-parser": {
      "version": "7.25.9",
      "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz",
      "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==",
      "dev": true
      "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA=="
    },
    "@babel/helper-validator-identifier": {
      "version": "7.14.0",
@@ -2046,8 +2045,7 @@
    "@jridgewell/sourcemap-codec": {
      "version": "1.5.0",
      "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
      "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==",
      "dev": true
      "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ=="
    },
    "@jridgewell/trace-mapping": {
      "version": "0.3.25",
@@ -3029,7 +3027,6 @@
      "version": "3.5.13",
      "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.13.tgz",
      "integrity": "sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==",
      "dev": true,
      "requires": {
        "@babel/parser": "^7.25.3",
        "@vue/shared": "3.5.13",
@@ -3041,14 +3038,12 @@
        "@babel/helper-validator-identifier": {
          "version": "7.25.9",
          "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz",
          "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==",
          "dev": true
          "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ=="
        },
        "@babel/parser": {
          "version": "7.26.2",
          "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.2.tgz",
          "integrity": "sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==",
          "dev": true,
          "requires": {
            "@babel/types": "^7.26.0"
          }
@@ -3057,7 +3052,6 @@
          "version": "7.26.0",
          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.0.tgz",
          "integrity": "sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==",
          "dev": true,
          "requires": {
            "@babel/helper-string-parser": "^7.25.9",
            "@babel/helper-validator-identifier": "^7.25.9"
@@ -3066,8 +3060,7 @@
        "entities": {
          "version": "4.5.0",
          "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
          "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
          "dev": true
          "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="
        }
      }
    },
@@ -3075,7 +3068,6 @@
      "version": "3.5.13",
      "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.13.tgz",
      "integrity": "sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==",
      "dev": true,
      "requires": {
        "@vue/compiler-core": "3.5.13",
        "@vue/shared": "3.5.13"
@@ -3085,7 +3077,6 @@
      "version": "3.5.13",
      "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.13.tgz",
      "integrity": "sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==",
      "dev": true,
      "requires": {
        "@babel/parser": "^7.25.3",
        "@vue/compiler-core": "3.5.13",
@@ -3101,14 +3092,12 @@
        "@babel/helper-validator-identifier": {
          "version": "7.25.9",
          "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz",
          "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==",
          "dev": true
          "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ=="
        },
        "@babel/parser": {
          "version": "7.26.2",
          "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.2.tgz",
          "integrity": "sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==",
          "dev": true,
          "requires": {
            "@babel/types": "^7.26.0"
          }
@@ -3117,7 +3106,6 @@
          "version": "7.26.0",
          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.0.tgz",
          "integrity": "sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==",
          "dev": true,
          "requires": {
            "@babel/helper-string-parser": "^7.25.9",
            "@babel/helper-validator-identifier": "^7.25.9"
@@ -3127,7 +3115,6 @@
          "version": "8.4.49",
          "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz",
          "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==",
          "dev": true,
          "requires": {
            "nanoid": "^3.3.7",
            "picocolors": "^1.1.1",
@@ -3140,7 +3127,6 @@
      "version": "3.5.13",
      "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.13.tgz",
      "integrity": "sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==",
      "dev": true,
      "requires": {
        "@vue/compiler-dom": "3.5.13",
        "@vue/shared": "3.5.13"
@@ -3210,11 +3196,47 @@
      "integrity": "sha1-zrkktOyzucQ4ccekKaAvhCPmIas=",
      "dev": true
    },
    "@vue/reactivity": {
      "version": "3.5.13",
      "resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.5.13.tgz",
      "integrity": "sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg==",
      "requires": {
        "@vue/shared": "3.5.13"
      }
    },
    "@vue/runtime-core": {
      "version": "3.5.13",
      "resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.5.13.tgz",
      "integrity": "sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw==",
      "requires": {
        "@vue/reactivity": "3.5.13",
        "@vue/shared": "3.5.13"
      }
    },
    "@vue/runtime-dom": {
      "version": "3.5.13",
      "resolved": "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.5.13.tgz",
      "integrity": "sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog==",
      "requires": {
        "@vue/reactivity": "3.5.13",
        "@vue/runtime-core": "3.5.13",
        "@vue/shared": "3.5.13",
        "csstype": "^3.1.3"
      }
    },
    "@vue/server-renderer": {
      "version": "3.5.13",
      "resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.5.13.tgz",
      "integrity": "sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA==",
      "requires": {
        "@vue/compiler-ssr": "3.5.13",
        "@vue/shared": "3.5.13"
      }
    },
    "@vue/shared": {
      "version": "3.5.13",
      "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.13.tgz",
      "integrity": "sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==",
      "dev": true
      "integrity": "sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ=="
    },
    "@vue/web-component-wrapper": {
      "version": "1.3.0",
@@ -5880,6 +5902,11 @@
        }
      }
    },
    "csstype": {
      "version": "3.1.3",
      "resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.1.3.tgz",
      "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="
    },
    "currently-unhandled": {
      "version": "0.4.1",
      "resolved": "https://registry.npm.taobao.org/currently-unhandled/download/currently-unhandled-0.4.1.tgz",
@@ -7354,8 +7381,7 @@
    "estree-walker": {
      "version": "2.0.2",
      "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
      "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
      "dev": true
      "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="
    },
    "esutils": {
      "version": "2.0.3",
@@ -10448,7 +10474,6 @@
      "version": "0.30.13",
      "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.13.tgz",
      "integrity": "sha512-8rYBO+MsWkgjDSOvLomYnzhdwEG51olQ4zL5KXnNJWV5MNmrb4rTZdrtkhxjnD/QyZUqR/Z/XDsUs/4ej2nx0g==",
      "dev": true,
      "requires": {
        "@jridgewell/sourcemap-codec": "^1.5.0"
      }
@@ -11865,8 +11890,7 @@
    "picocolors": {
      "version": "1.1.1",
      "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
      "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
      "dev": true
      "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="
    },
    "picomatch": {
      "version": "2.2.3",
@@ -14398,6 +14422,11 @@
        }
      }
    },
    "sortablejs": {
      "version": "1.10.2",
      "resolved": "https://registry.npmmirror.com/sortablejs/-/sortablejs-1.10.2.tgz",
      "integrity": "sha512-YkPGufevysvfwn5rfdlGyrGjt7/CRHwvRPogD/lC+TnvcN29jDpCifKP+rBqf+LRldfXSTh+0CGLcSg0VIxq3A=="
    },
    "source-list-map": {
      "version": "2.0.1",
      "resolved": "https://registry.npm.taobao.org/source-list-map/download/source-list-map-2.0.1.tgz",
@@ -14413,8 +14442,7 @@
    "source-map-js": {
      "version": "1.2.1",
      "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
      "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
      "dev": true
      "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="
    },
    "source-map-resolve": {
      "version": "0.5.3",
@@ -15834,6 +15862,28 @@
      "resolved": "https://registry.nlark.com/vue-router/download/vue-router-3.5.1.tgz?cache=0&sync_timestamp=1620899536020&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fvue-router%2Fdownload%2Fvue-router-3.5.1.tgz",
      "integrity": "sha1-7fPPSQeVLR4Fg+B5I3Igxf9utsk="
    },
    "vue-simple-calendar": {
      "version": "7.1.0",
      "resolved": "https://registry.npmmirror.com/vue-simple-calendar/-/vue-simple-calendar-7.1.0.tgz",
      "integrity": "sha512-WNbvRVGQQJlStaLPvvpe2ZsB/E1n8eFgUh4hD931ljp2czPA8xT81i4jGD5+jKZT1OHDFpON5mNn0KwO2QC9rA==",
      "requires": {
        "vue": "^3.4.15"
      },
      "dependencies": {
        "vue": {
          "version": "3.5.13",
          "resolved": "https://registry.npmmirror.com/vue/-/vue-3.5.13.tgz",
          "integrity": "sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==",
          "requires": {
            "@vue/compiler-dom": "3.5.13",
            "@vue/compiler-sfc": "3.5.13",
            "@vue/runtime-dom": "3.5.13",
            "@vue/server-renderer": "3.5.13",
            "@vue/shared": "3.5.13"
          }
        }
      }
    },
    "vue-style-loader": {
      "version": "4.1.3",
      "resolved": "https://registry.npm.taobao.org/vue-style-loader/download/vue-style-loader-4.1.3.tgz",
@@ -15868,6 +15918,14 @@
      "integrity": "sha1-HuO8mhbsv1EYvjNLsV+cRvgvWCU=",
      "dev": true
    },
    "vuedraggable": {
      "version": "2.24.3",
      "resolved": "https://registry.npmmirror.com/vuedraggable/-/vuedraggable-2.24.3.tgz",
      "integrity": "sha512-6/HDXi92GzB+Hcs9fC6PAAozK1RLt1ewPTLjK0anTYguXLAeySDmcnqE8IC0xa7shvSzRjQXq3/+dsZ7ETGF3g==",
      "requires": {
        "sortablejs": "1.10.2"
      }
    },
    "vuescroll": {
      "version": "4.17.3",
      "resolved": "https://registry.npm.taobao.org/vuescroll/download/vuescroll-4.17.3.tgz",
admin/package.json
@@ -33,6 +33,8 @@
    "vue-cropper": "^0.6.5",
    "vue-json-viewer": "^2.2.22",
    "vue-router": "^3.5.1",
    "vue-simple-calendar": "^7.1.0",
    "vuedraggable": "^2.24.3",
    "vuescroll": "^4.17.3",
    "vuex": "^3.4.0"
  },
admin/src/api/ywWorkDesk.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,11 @@
import request from '@/utils/request'
// èŽ·å–å¿«æ·èœå•æ¨¡å—ä¿¡æ¯
export function getYwQuickList () {
  return request.get('/visitsAdmin/cloudService/business/ywWorkDesk/getYwQuickList')
}
// æ›´æ–°å¿«æ·æ¨¡å—数据
export function updMyYwQuickModel () {
  return request.get('/visitsAdmin/cloudService/business/ywWorkDesk/updMyYwQuickModel')
}
admin/src/components/business/commonFunctions.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,109 @@
<template>
    <GlobalWindow
        :title="title"
        width="60%"
        :visible.sync="visible"
        @confirm="confirm"
    >
        <div class="Analysis">
            <span>请根据使用习惯自定义常用功能,支持拖动排</span>
            <draggable v-model="filterList" chosenClass="chosen" forceFallback="true" group="people" animation="1000">
                <transition-group class="dra">
                    <div class="list" v-for="(item, index) in filterList" :key="index">
                        <div class="list_checkbox">
                            <el-checkbox v-model="item.checked"> </el-checkbox>
                        </div>
                        <img :src="item.path" />
                        <div class="list_title">{{ item.name }}</div>
                    </div>
                </transition-group>
            </draggable>
        </div>
    </GlobalWindow>
</template>
<script>
  import BaseOpera from '@/components/base/BaseOpera'
  import GlobalWindow from '@/components/common/GlobalWindow'
  import { updMyYwQuickModel } from '@/api/ywWorkDesk'
  import draggable from 'vuedraggable'
  export default {
    name: 'commonFunctions',
    extends: BaseOpera,
    components: { GlobalWindow, draggable },
    data () {
      return {
        filterList: []
      }
    },
    methods: {
      open (title, target) {
        this.title = title
        this.filterList = target
        this.visible = true
      },
      confirm () {
        this.isWorking = true
        updMyYwQuickModel(this.form)
          .then(() => {
            this.visible = false
            this.$tip.apiSuccess('修改成功')
            this.$emit('success')
          })
          .finally(() => {
            this.isWorking = false
          })
      }
    }
  }
</script>
<style lang="scss" scoped>
    .Analysis {
        width: 100%;
        margin-top: 20px;
        display: flex;
        flex-direction: column;
        span {
            font-weight: 400;
            font-size: 14px;
            color: #333333;
            margin-bottom: 20px;
        }
        .dra {
            display: flex;
            flex-wrap: wrap;
            justify-content: space-between;
        }
        .list {
            cursor: pointer;
            display: flex;
            align-items: center;
            width: 24%;
            height: 80px;
            background: #FFFFFF;
            border-radius: 8px;
            border: 1px solid #DFE2E8;
            margin-bottom: 10px;
            padding: 0 20px;
            box-sizing: border-box;
            position: relative;
            .list_checkbox {
                position: absolute;
                right: 10px;
                top: 10px;
            }
            img {
                width: 40px;
                height: 40px;
                user-select: none;
                margin-right: 10px;
            }
            .list_title {
                width: 130px;
                font-size: 11px;
                user-select: none;
            }
        }
    }
</style>
admin/src/views/contract/components/contractEdit.vue
@@ -178,8 +178,15 @@
          </div>
        </div>
        <el-button style="width: 100%;height: 48px;" type="primary" plain @click="generateZL">生成账单明细</el-button>
        <div style="width: 100%; text-align: right; margin-bottom: 10px; margin-top: 15px;" v-if="zlList.length > 0">
          <el-button icon="el-icon-edit" v-if="!isShow" @click="changeEdit(1)">编辑</el-button>
          <el-popconfirm v-if="isShow" title="是否放弃手动修改所填的数据?" @confirm="isShow = false">
            <el-button slot="reference" style="margin-right: 15px;">取消</el-button>
          </el-popconfirm>
          <el-button type="primary" v-if="isShow" @click="changeNum(1)">保存</el-button>
        </div>
        <el-table :data="zlList" class="mt20" stripe>
          <el-table-column label="费用类型" align="center" show-overflow-tooltip>
          <el-table-column label="费用类型" align="center" :key="Date.now()" show-overflow-tooltip>
            <template slot-scope="{row}">
              <span v-if="row.costType === 0">租赁费</span>
              <span v-if="row.costType === 1">物业费</span>
@@ -191,20 +198,26 @@
              <span v-if="row.costType === 7">保证金</span>
            </template>
          </el-table-column>
          <el-table-column label="期数" align="center" show-overflow-tooltip>
          <el-table-column label="期数" align="center" :key="Date.now()" show-overflow-tooltip>
            <template slot-scope="{row}">
              <el-tag type="success" v-if="row.sortnum > 0">{{ row.sortnum }}</el-tag>
            </template>
          </el-table-column>
          <el-table-column label="区间" align="center" show-overflow-tooltip>
          <el-table-column label="区间" align="center" :key="Date.now()" show-overflow-tooltip>
            <template slot-scope="{row}">
              {{ row.startDate }} ~ {{ row.endDate }}
            </template>
          </el-table-column>
          <el-table-column prop="planPayDate" label="付款日" align="center" show-overflow-tooltip />
          <el-table-column label="应收" align="center" show-overflow-tooltip>
          <el-table-column prop="planPayDate" label="付款日" align="center" :key="Date.now()" show-overflow-tooltip />
          <el-table-column label="应收" align="center" :key="Date.now()" show-overflow-tooltip>
            <template slot-scope="{row}">
              {{ row.receivableFee }}元
              <span v-if="[2,3].includes(row.costType)">{{ row.totleFee }}元</span>
              <template v-else>
                <span v-if="!isShow">{{ row.totleFee }}元</span>
                <div style="display: flex; align-items: center;" v-if="isShow">
                  <el-input v-model="row.totleFeeCopy" placeholder="请输入"></el-input>元
                </div>
              </template>
            </template>
          </el-table-column>
        </el-table>
@@ -273,8 +286,15 @@
          </div>
        </div>
        <el-button style="width: 100%;height: 48px;" type="primary" plain @click="generateWY">生成账单明细</el-button>
        <div style="width: 100%; text-align: right; margin-bottom: 10px; margin-top: 15px;">
          <el-button icon="el-icon-edit" v-if="!isShow" @click="changeEdit(1)">编辑</el-button>
          <el-popconfirm v-if="isShow" title="是否放弃手动修改所填的数据?" @confirm="isShow = false">
            <el-button slot="reference" style="margin-right: 15px;">取消</el-button>
          </el-popconfirm>
          <el-button type="primary" v-if="isShow" @click="changeNum(2)">保存</el-button>
        </div>
        <el-table :data="wyList" class="mt20" stripe>
          <el-table-column label="费用类型" align="center" show-overflow-tooltip>
          <el-table-column label="费用类型" align="center" :key="Date.now()" show-overflow-tooltip>
            <template slot-scope="{row}">
              <span v-if="row.costType === 0">租赁费</span>
              <span v-if="row.costType === 1">物业费</span>
@@ -286,20 +306,26 @@
              <span v-if="row.costType === 7">保证金</span>
            </template>
          </el-table-column>
          <el-table-column label="期数" align="center" show-overflow-tooltip>
          <el-table-column label="期数" align="center" :key="Date.now()" show-overflow-tooltip>
            <template slot-scope="{row}">
              <el-tag type="success" v-if="row.sortnum > 0">{{ row.sortnum }}</el-tag>
            </template>
          </el-table-column>
          <el-table-column label="区间" align="center" show-overflow-tooltip>
          <el-table-column label="区间" align="center" :key="Date.now()" show-overflow-tooltip>
            <template slot-scope="{row}">
              {{ row.startDate }} ~ {{ row.endDate }}
            </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="planPayDate" label="付款日" :key="Date.now()" align="center" show-overflow-tooltip />
          <el-table-column label="应收" :key="Date.now()" align="center" show-overflow-tooltip>
            <template slot-scope="{row}">
              {{ row.receivableFee }}元
              <span v-if="[2,3].includes(row.costType)">{{ row.totleFee }}元</span>
              <template v-else>
                <span v-if="!isShow">{{ row.totleFee }}元</span>
                <div style="display: flex; align-items: center;" v-if="isShow">
                  <el-input v-model="row.totleFeeCopy" placeholder="请输入"></el-input>元
                </div>
              </template>
            </template>
          </el-table-column>
        </el-table>
@@ -309,6 +335,7 @@
        </div>
      </div>
    </div>
    <div style="width: 100%; height: 50px;"></div>
    <div class="window__footer">
      <slot name="footer">
        <el-button @click="confirm" :loading="confirmWorking" type="primary">{{ activeTabs === 0 ? '下一步' :
@@ -378,7 +405,6 @@
            advanceDays: ''
          }
        ],
        wyDeposit: '',
        wyPayType: '',
@@ -450,7 +476,8 @@
      ],
      houseLvThree: []
      houseLvThree: [],
      isShow: false
    }
  },
  methods: {
@@ -502,6 +529,39 @@
        this.form.roundedUp = 0
        // this.getHouseTree()
      })
    },
    changeEdit(type) {
      if (type === 1) {
        this.zlList.forEach(item => {
          item.totleFeeCopy = JSON.parse(JSON.stringify(item.totleFee))
        })
        this.isShow = true
      } else if (type === 2) {
        this.isShow = false
      }
    },
    changeNum(type) {
      // ç§Ÿèµè®¡ç®—
      if (type === 1) {
        let num = 0
        this.zlList.forEach(item => {
          if (item.costType !== 2) {
            num += Number(item.totleFeeCopy)
            item.totleFee = JSON.parse(JSON.stringify(item.totleFeeCopy))
          }
        })
        this.zlPrice = num
      } else if (type === 2) {
        let num = 0
        this.wyList.forEach(item => {
          if (item.costType !== 3) {
            num += Number(item.totleFeeCopy)
            item.totleFee = JSON.parse(JSON.stringify(item.totleFeeCopy))
          }
        })
        this.wyPrice = num
      }
      this.isShow = false
    },
    changePayType(e) {
      if (e === 0) {
@@ -653,7 +713,7 @@
    submit() {
      // è°ƒç”¨æ–°å»ºæŽ¥å£
      this.isWorking = true
      create({ ...this.form })
      create({ ...this.form, ywContractBillDTOList: [...this.wyList, ...this.zlList] })
        .then(res => {
          this.visible = false
          this.$tip.apiSuccess('创建成功')
@@ -711,8 +771,9 @@
          let zlPrice = 0
          let arr = []
          res.forEach(item => {
            item.totleFeeCopy = JSON.parse(JSON.stringify(item.totleFee))
            if (item.costType === 0) {
              zlPrice += item.receivableFee
              zlPrice += item.totleFee
            }
            arr.push(item)
          })
@@ -728,7 +789,8 @@
          let arr = []
          res.forEach(item => {
            if (item.costType === 1) {
              zlPrice += item.receivableFee
              zlPrice += item.totleFee
              item.totleFeeCopy = JSON.parse(JSON.stringify(item.totleFee))
            }
            arr.push(item)
          })
@@ -817,6 +879,7 @@
      this.activeTabs = val
    },
    ctabsClick(val) {
      this.isShow = false
      this.cactiveTabs = val
    },
    handleRent() {
admin/src/views/contract/components/terminationAgreement.vue
@@ -16,7 +16,11 @@
                <el-table :data="info.roomList" stripe>
                    <el-table-column prop="projectName" label="项目名称" show-overflow-tooltip />
                    <el-table-column prop="buildingName" label="楼宇名称" show-overflow-tooltip />
                    <el-table-column prop="buildingName" label="楼层/房号" show-overflow-tooltip></el-table-column>
                    <el-table-column label="楼层/房号" show-overflow-tooltip>
                        <template slot-scope="{row}">
                            {{row.floorName}}{{row.roomNum}}
                        </template>
                    </el-table-column>
                    <el-table-column prop="area" label="面积" show-overflow-tooltip></el-table-column>
                </el-table>
            </div>
admin/src/views/index.vue
@@ -30,15 +30,15 @@
      <div class="main_left_menu">
        <div class="main_left_menu_title">
          <span>常用功能</span>
          <div class="main_left_menu_title_edit">
          <div class="main_left_menu_title_edit" @click="$refs.commonFunctions.open('常用功能管理', list)">
            <img src="@/assets/indexIcon/ic_daibangongdan@2x.png" />
            <span>自定义功能</span>
          </div>
        </div>
        <div class="main_left_menu_list">
          <div class="list_item" v-for="(item, index) in menu" :key="index">
          <div class="list_item" v-for="(item, index) in list" :key="index">
            <div class="list_item_left">
              <img :src="item.icon" />
              <img :src="item.path" />
              <span>{{item.name}}</span>
            </div>
            <i class="el-icon-arrow-right"></i>
@@ -67,13 +67,33 @@
        </el-select>
      </div>
      <div class="main_right_date">
        <el-calendar v-model="value" :mark-data="markData"></el-calendar>
        <el-calendar v-model="value"></el-calendar>
      </div>
      <div class="main_right_rc">
        <div class="main_right_rc_title">当日日程(3)</div>
        <div class="main_right_rc_list">
          <div class="main_right_rc_list_row" v-for="(item, index) in 5" :key="index">
            <div class="top">
              <div class="top_left">
                <div class="top_left_dian"></div>
                <div class="top_left_title">盘点通知</div>
              </div>
              <div class="top_date">2024-12-13 12:53:12</div>
            </div>
            <div class="bottom">
              ã€ç›˜ç‚¹è®¡åˆ’名称】将在【2024-12-1
            </div>
          </div>
        </div>
      </div>
    </div>
    <CommonFunctions ref="commonFunctions" />
  </div>
</template>
<script>
import CommonFunctions from '@/components/business/commonFunctions'
import { getYwQuickList } from '@/api/ywWorkDesk'
export default {
  data() {
    return {
@@ -89,25 +109,24 @@
        { name: '账单列表', icon: require('@/assets/indexIcon/ic_zhangdanliebiao@2x.png') },
        { name: '新增入库单', icon: require('@/assets/indexIcon/ic_xinzengruku@2x.png') },
        { name: '新增出库单', icon: require('@/assets/indexIcon/ic_xinzengchuku@2x.png') },
        { name: '资产清单', icon: require('@/assets/indexIcon/ic_zichan@2x.png') },
        { name: '物料清单', icon: require('@/assets/indexIcon/ic_zichan@2x.png') },
      ],
      options: [],
      value: '',
      markData: [
        {
          date: '2025-01-22', // æ ‡è®°çš„æ—¥æœŸ
          // è‡ªå®šä¹‰æ ‡è®°å†…容
          content: '<div style="color: red;">重要事件</div>'
        },
        {
          date: '2025-01-19',
          content: '生日'
        }
      ]
      list: [],
      value: new Date()
    }
  },
  components: { CommonFunctions },
  created () {
    this.getYwQuickLists()
  },
  methods: {
    getYwQuickLists() {
      getYwQuickList({})
        .then(res => {
          console.log(res)
          this.list = res
        })
    }
  }
}
</script>
@@ -115,12 +134,12 @@
<style lang="scss" scoped>
  .main {
    width: 100%;
    height: calc(100vh - 48px - 56px - 35px);
    /*height: calc(100vh - 48px - 56px - 35px);*/
    padding: 15px;
    box-sizing: border-box;
    background: #F4F7FC;
    display: flex;
    align-items: center;
    align-items: self-start;
    justify-content: space-between;
    .main_left {
      flex: 1;
@@ -199,6 +218,7 @@
            color: #222222;
          }
          .main_left_menu_title_edit {
            cursor: pointer;
            display: flex;
            align-items: center;
            img {
@@ -266,9 +286,68 @@
        color: #222222;
        margin-bottom: 12px;
      }
      .main_right_rc {
        width: 100%;
        display: flex;
        flex-direction: column;
        .main_right_rc_title {
          font-weight: 500;
          font-size: 16px;
          color: #222222;
          margin-bottom: 15px;
        }
        .main_right_rc_list {
          width: 100%;
          height: 300px;
          overflow-y: scroll;
          .main_right_rc_list_row {
            width: 100%;
            padding: 15px;
            box-sizing: border-box;
            background: #F4F7FC;
            border-radius: 2px;
            margin-bottom: 10px;
            .top {
              width: 100%;
              display: flex;
              align-items: center;
              justify-content: space-between;
              .top_left {
                display: flex;
                align-items: center;
                .top_left_dian {
                  width: 10px;
                  height: 10px;
                  border-radius: 50%;
                  background: #FF9E00;
                  margin-right: 10px;
                }
                .top_left_title {
                  font-weight: 500;
                  font-size: 15px;
                  color: #222222;
                }
              }
              .top_date {
                font-weight: 400;
                font-size: 12px;
                color: #999999;
              }
            }
            .bottom {
              font-weight: 400;
              font-size: 13px;
              color: #666666;
              margin-top: 8px;
            }
          }
        }
      }
      .main_right_date {
        width: 100%;
        height: 300px;
        ::v-deep .el-calendar__header {
          display: none;
        }
        ::v-deep .el-calendar-table tr td:first-child{
          border: none;
        }
@@ -283,6 +362,21 @@
          align-items: center;
          justify-content: center;
        }
        ::v-deep thead th {
          height: 20px;
          border-bottom: 1px solid #DFE2E8;
        }
        ::v-deep.el-calendar-table .el-calendar-day{
          width: 100%;
          height: 50px;
          text-align: center;
        }
        ::v-deep .el-calendar-table td.is-selected {
          background: #3E80EF;
        }
        ::v-deep .el-calendar-table .el-calendar-day:hover {
          background: none;
        }
      }
    }
  }