MrShi
2025-01-17 db96301a4715b1c4f1180095441963ed6f430797
开发功能
已添加1个文件
已修改15个文件
768 ■■■■■ 文件已修改
admin/.env.test 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/package-lock.json 168 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/package.json 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/ywContractBill.js 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/ywStocktaking.js 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/ywWarehouse.js 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/finance/collectionSettings.vue 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/finance/components/bullDetail.vue 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/finance/components/call.vue 73 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/finance/components/templateKeywords.vue 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/finance/overdueBills.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/stock/check.vue 48 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/stock/components/inventoryDetails.vue 112 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/stock/components/newInventory.vue 70 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/workorder/components/detail.vue 75 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/workorder/workorderList.vue 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/.env.test
@@ -4,10 +4,10 @@
# VUE_APP_API_URL  = 'http://192.168.5.13/gateway_interface'
# ä»»åº·
# VUE_APP_API_URL  = 'http://192.168.0.143:10010'
VUE_APP_API_URL  = 'http://192.168.0.143:10010'
# èå§
# VUE_APP_API_URL  = 'http://192.168.0.108:10010/'
# æµ‹è¯•服务
VUE_APP_API_URL  = 'https://dmtest.ahapp.net/gateway_interface'
# VUE_APP_API_URL  = 'https://dmtest.ahapp.net/gateway_interface'
admin/package-lock.json
@@ -6,7 +6,7 @@
  "dependencies": {
    "@amap/amap-jsapi-loader": {
      "version": "1.0.1",
      "resolved": "https://registry.npmmirror.com/@amap/amap-jsapi-loader/-/amap-jsapi-loader-1.0.1.tgz",
      "resolved": "https://registry.npmjs.org/@amap/amap-jsapi-loader/-/amap-jsapi-loader-1.0.1.tgz",
      "integrity": "sha512-nPyLKt7Ow/ThHLkSvn2etQlUzqxmTVgK7bIgwdBRTg2HK5668oN7xVxkaiRe3YZEzGzfV2XgH5Jmu2T73ljejw=="
    },
    "@babel/code-frame": {
@@ -2915,6 +2915,63 @@
          "integrity": "sha1-/q7SVZc9LndVW4PbwIhRpsY1IPo=",
          "dev": true
        },
        "ansi-styles": {
          "version": "4.3.0",
          "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
          "dev": true,
          "optional": true,
          "requires": {
            "color-convert": "^2.0.1"
          }
        },
        "chalk": {
          "version": "4.1.2",
          "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
          "dev": true,
          "optional": true,
          "requires": {
            "ansi-styles": "^4.1.0",
            "supports-color": "^7.1.0"
          }
        },
        "color-convert": {
          "version": "2.0.1",
          "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
          "dev": true,
          "optional": true,
          "requires": {
            "color-name": "~1.1.4"
          }
        },
        "color-name": {
          "version": "1.1.4",
          "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
          "dev": true,
          "optional": true
        },
        "has-flag": {
          "version": "4.0.0",
          "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
          "dev": true,
          "optional": true
        },
        "loader-utils": {
          "version": "2.0.4",
          "resolved": "https://registry.npmmirror.com/loader-utils/-/loader-utils-2.0.4.tgz",
          "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
          "dev": true,
          "optional": true,
          "requires": {
            "big.js": "^5.2.2",
            "emojis-list": "^3.0.0",
            "json5": "^2.1.2"
          }
        },
        "ssri": {
          "version": "8.0.1",
          "resolved": "https://registry.npm.taobao.org/ssri/download/ssri-8.0.1.tgz?cache=0&sync_timestamp=1617826515595&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fssri%2Fdownload%2Fssri-8.0.1.tgz",
@@ -2922,6 +2979,28 @@
          "dev": true,
          "requires": {
            "minipass": "^3.1.1"
          }
        },
        "supports-color": {
          "version": "7.2.0",
          "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
          "dev": true,
          "optional": true,
          "requires": {
            "has-flag": "^4.0.0"
          }
        },
        "vue-loader-v16": {
          "version": "npm:vue-loader@16.8.3",
          "resolved": "https://registry.npmmirror.com/vue-loader/-/vue-loader-16.8.3.tgz",
          "integrity": "sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA==",
          "dev": true,
          "optional": true,
          "requires": {
            "chalk": "^4.1.0",
            "hash-sum": "^2.0.0",
            "loader-utils": "^2.0.0"
          }
        }
      }
@@ -15669,9 +15748,9 @@
      "dev": true
    },
    "vue-clipboard2": {
      "version": "0.3.1",
      "resolved": "https://registry.npm.taobao.org/vue-clipboard2/download/vue-clipboard2-0.3.1.tgz",
      "integrity": "sha1-blUft704SImyiw2jsSKJ7WvKSJQ=",
      "version": "0.3.3",
      "resolved": "https://registry.npmmirror.com/vue-clipboard2/-/vue-clipboard2-0.3.3.tgz",
      "integrity": "sha512-aNWXIL2DKgJyY/1OOeITwAQz1fHaCIGvUFHf9h8UcoQBG5a74MkdhS/xqoYe7DNZdQmZRL+TAdIbtUs9OyVjbw==",
      "requires": {
        "clipboard": "^2.0.0"
      }
@@ -15739,87 +15818,6 @@
          "resolved": "https://registry.npm.taobao.org/hash-sum/download/hash-sum-1.0.2.tgz",
          "integrity": "sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ=",
          "dev": true
        }
      }
    },
    "vue-loader-v16": {
      "version": "npm:vue-loader@16.8.3",
      "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-16.8.3.tgz",
      "integrity": "sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA==",
      "dev": true,
      "optional": true,
      "requires": {
        "chalk": "^4.1.0",
        "hash-sum": "^2.0.0",
        "loader-utils": "^2.0.0"
      },
      "dependencies": {
        "ansi-styles": {
          "version": "4.3.0",
          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
          "dev": true,
          "optional": true,
          "requires": {
            "color-convert": "^2.0.1"
          }
        },
        "chalk": {
          "version": "4.1.2",
          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
          "dev": true,
          "optional": true,
          "requires": {
            "ansi-styles": "^4.1.0",
            "supports-color": "^7.1.0"
          }
        },
        "color-convert": {
          "version": "2.0.1",
          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
          "dev": true,
          "optional": true,
          "requires": {
            "color-name": "~1.1.4"
          }
        },
        "color-name": {
          "version": "1.1.4",
          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
          "dev": true,
          "optional": true
        },
        "has-flag": {
          "version": "4.0.0",
          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
          "dev": true,
          "optional": true
        },
        "loader-utils": {
          "version": "2.0.4",
          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz",
          "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
          "dev": true,
          "optional": true,
          "requires": {
            "big.js": "^5.2.2",
            "emojis-list": "^3.0.0",
            "json5": "^2.1.2"
          }
        },
        "supports-color": {
          "version": "7.2.0",
          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
          "dev": true,
          "optional": true,
          "requires": {
            "has-flag": "^4.0.0"
          }
        }
      }
    },
admin/package.json
@@ -29,7 +29,7 @@
    "path": "^0.12.7",
    "qrcodejs2": "0.0.2",
    "vue": "^2.6.11",
    "vue-clipboard2": "^0.3.1",
    "vue-clipboard2": "^0.3.3",
    "vue-cropper": "^0.6.5",
    "vue-json-viewer": "^2.2.22",
    "vue-router": "^3.5.1",
admin/src/api/ywContractBill.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,8 @@
import request from '@/utils/request'
// æŸ¥è¯¢
export function fetchList (data) {
  return request.post('/visitsAdmin/cloudService/business/ywContractBill/findPageForOverdue', data, {
    trim: true
  })
}
admin/src/api/ywStocktaking.js
@@ -21,3 +21,26 @@
export function deleteById (id) {
  return request.get(`/visitsAdmin/cloudService/business/ywStocktaking/delete/${id}`)
}
// æ ¹æ®ID查询
export function getById (id) {
  return request.get(`/visitsAdmin/cloudService/business/ywStocktaking/${id}`)
}
// å–消盘点单
export function cancelById (id) {
  return request.get(`/visitsAdmin/cloudService/business/ywStocktaking/cancelById?id=${id}`)
}
// å®Œæˆç›˜ç‚¹å•
export function finishById (id) {
  return request.get(`/visitsAdmin/cloudService/business/ywStocktaking/finishById?id=${id}`)
}
// æŸ¥è¯¢
export function ywStocktakingRecordPage (data) {
  return request.post('/visitsAdmin/cloudService/business/ywStocktakingRecord/page', data, {
    trim: true
  })
}
admin/src/api/ywWarehouse.js
@@ -12,6 +12,11 @@
  return request.post('/visitsAdmin/cloudService/business/ywWarehouse/create', data)
}
// åˆ—表
export function list (data) {
  return request.post('/visitsAdmin/cloudService/business/ywWarehouse/list', data)
}
// æ ¹æ®ID修改
export function updateById (data) {
  return request.post('/visitsAdmin/cloudService/business/ywWarehouse/updateById', data)
admin/src/views/finance/collectionSettings.vue
@@ -5,15 +5,46 @@
                <el-form ref="form" :model="form" label-width="120px">
                    <el-form-item label="短信模板">
                        <div style="display: flex; align-items: self-start;">
                            <el-input type="textarea" rows="5" v-model="form.desc"></el-input>
                            <el-button type="primary" style="margin-left: 10px;">保存</el-button>
                            <el-input type="textarea" rows="5" v-model="form.smsTemp"></el-input>
<!--                            <el-button type="primary" style="margin-left: 10px;">保存</el-button>-->
                        </div>
                    </el-form-item>
                    <el-form-item label="邮箱模板">
                        <div style="display: flex; align-items: self-start;">
                            <el-input type="textarea" rows="5" v-model="form.desc"></el-input>
                            <el-button type="primary" style="margin-left: 10px;">保存</el-button>
                            <el-input type="textarea" rows="5" v-model="form.emailTemp"></el-input>
<!--                            <el-button type="primary" style="margin-left: 10px;">保存</el-button>-->
                        </div>
                    </el-form-item>
                    <el-form-item label="租赁通知单模板">
                        <div style="display: flex; align-items: self-start;">
                            <el-tooltip style="margin-right: 10px; margin-top: 10px; flex-shrink: 0;" effect="dark" content="包含租赁费、物业费、租赁押金、物业押金" placement="bottom-start">
                                <i class="el-icon-question"></i>
                            </el-tooltip>
                            <el-upload
                                style="flex: 1;"
                                class="upload-demo"
                                :action="uploadImgUrl"
                                :data="uploadData"
                                :on-success="uploadAvatarSuccess"
                                :on-remove="handleRemove"
                                :file-list="form.leaseTemp">
                                <el-button size="small" type="primary">点击上传</el-button>
                            </el-upload>
                        </div>
                    </el-form-item>
                    <el-form-item label="其他通知单模板">
                        <el-upload
                            class="upload-demo"
                            :action="uploadImgUrl"
                            :data="uploadData"
                            :on-success="uploadAvatarSuccess1"
                            :on-remove="handleRemove1"
                            :file-list="form.otherTemp">
                            <el-button size="small" type="primary">点击上传</el-button>
                        </el-upload>
                    </el-form-item>
                    <el-form-item>
                        <el-button type="primary" @click="submit">保存</el-button>
                    </el-form-item>
                </el-form>
            </div>
@@ -30,8 +61,15 @@
    name: 'collectionSettings',
    data() {
      return {
        uploadImgUrl: process.env.VUE_APP_API_PREFIX + '/visitsAdmin/cloudService/public/uploadBatch',
        uploadData: {
          folder: 'TEMP_CONFIG'
        },
        form: {
          desc: ''
          emailTemp: '',
          smsTemp: '',
          leaseTemp: [],
          otherTemp: []
        }
      }
    },
@@ -40,10 +78,30 @@
      this.getCallTempVal()
    },
    methods: {
      submit() {
      },
      handleRemove(e) {
        this.form.leaseTemp = []
      },
      uploadAvatarSuccess(file) {
        const item = file.data[0]
        this.form.leaseTemp = [{ ...item, name: item.originname }]
      },
      handleRemove1(e) {
        this.form.otherTemp = []
      },
      uploadAvatarSuccess1(file) {
        const item = file.data[0]
        this.form.otherTemp = [{ ...item, name: item.originname }]
      },
      getCallTempVal() {
        getCallTemp({})
            .then(res => {
              console.log(res)
              this.form.smsTemp = res.smsTemp.title
              this.form.emailTemp = res.emailTemp.title
              this.form.leaseTemp = [{ url: res.leaseTemp.url, name: res.leaseTemp.title }]
              this.form.otherTemp = [{ url: res.otherTemp.url, name: res.otherTemp.title }]
            })
      }
    }
@@ -64,7 +122,7 @@
            align-items: self-start;
            justify-content: space-between;
            .content_form {
                width: 60%;
                width: 70%;
            }
        }
    }
admin/src/views/finance/components/bullDetail.vue
@@ -8,23 +8,26 @@
          <el-tag type="success" v-if="info.status === 0">开启</el-tag>
          <el-tag type="info" v-if="info.status === 1">关闭</el-tag>
        </div>
        <el-button plain type="primary" v-if="![1].includes(info.payStatus)" @click="$refs.flowingWater.open('创建收支流水', {
          billType: returnBillType(),
          billId: info.id,
          costType: info.costType,
          receivableFee: Math.abs(info.needReceivableFee),
          costTypeName: returnText(info.costType),
          contractCode: info.contractCode,
          contractId: info.contractId,
          startDate: info.startDate,
          endDate: info.endDate,
          multifileList: [],
          date: `${info.startDate} ~ ${info.endDate}`,
          companyId: info.companyId,
          companyName: info.companyName,
          actReceivableFee: Math.abs(info.needReceivableFee),
          needReceivableFeeCopy: info.needReceivableFee
        })">新建收支流水</el-button>
        <div style="display: flex; align-items: center;">
          <el-button @click="$refs.call.open('发送催缴通知', info)">发送缴费通知</el-button>
          <el-button plain type="primary" v-if="![1].includes(info.payStatus)" @click="$refs.flowingWater.open('创建收支流水', {
            billType: returnBillType(),
            billId: info.id,
            costType: info.costType,
            receivableFee: Math.abs(info.needReceivableFee),
            costTypeName: returnText(info.costType),
            contractCode: info.contractCode,
            contractId: info.contractId,
            startDate: info.startDate,
            endDate: info.endDate,
            multifileList: [],
            date: `${info.startDate} ~ ${info.endDate}`,
            companyId: info.companyId,
            companyName: info.companyName,
            actReceivableFee: Math.abs(info.needReceivableFee),
            needReceivableFeeCopy: info.needReceivableFee
          })">新建收支流水</el-button>
        </div>
      </div>
      <div class="line"></div>
      <div class="main">
@@ -190,6 +193,8 @@
    <FlowingWater ref="flowingWater" @success="getDetails" @refresh="Refresh" />
    <!--  åˆåŒè¯¦æƒ…  -->
    <ContractDetail ref="ContractDetailRef" />
    <!--  å‘送缴费通知  -->
    <Call ref="call" />
  </GlobalWindow>
</template>
@@ -197,13 +202,15 @@
import GlobalWindow from '@/components/common/GlobalWindow'
import BaseOpera from '@/components/base/BaseOpera'
import FlowingWater from './flowingWater'
import Call from './call'
import ContractDetail from '../../contract/components/contractDetail'
import { getYwContractBillById } from '@/api/contract'
export default {
  components: {
    GlobalWindow,
    FlowingWater,
    ContractDetail
    ContractDetail,
    Call
  },
  extends: BaseOpera,
  data() {
admin/src/views/finance/components/call.vue
@@ -2,33 +2,23 @@
    <GlobalWindow
        :title="title"
        :visible.sync="visible"
        width="100%">
        width="100%"
        @confirm="confirm">
        <el-form :model="form" label-position="top" ref="paramRef" :rules="rules">
            <el-form-item label="通知方式" prop="title">
                <el-checkbox-group v-model="form.title">
                    <el-checkbox label="美食/餐厅线上活动" name="1"></el-checkbox>
                    <el-checkbox label="地推活动" name="2"></el-checkbox>
                    <el-checkbox label="线下主题活动" name="3"></el-checkbox>
                    <el-checkbox label="单纯品牌曝光" name="4"></el-checkbox>
            <el-form-item label="通知方式" prop="type">
                <el-checkbox-group v-model="form.type">
                    <el-checkbox label="短信"></el-checkbox>
                    <el-checkbox label="邮件"></el-checkbox>
                </el-checkbox-group>
            </el-form-item>
            <el-form-item label="通知接收人" prop="companyId">
                <div style="display: flex; flex-direction: column;">
                    <div style="display: flex; align-items: center; margin-bottom: 20px;">
                        <span style="font-size: 14px; color: black; margin-right: 10px;">张三</span>
                        <el-select v-model="form.companyId" placeholder="请选择">
                            <el-option label="区域一" value="0"></el-option>
                            <el-option label="区域二" value="1"></el-option>
                        </el-select>
                    </div>
                    <div style="display: flex; align-items: center;">
                        <span style="font-size: 14px; color: black; margin-right: 10px;">XXXX公司</span>
                        <el-select v-model="form.companyId" placeholder="请选择">
                            <el-option label="区域一" value="0"></el-option>
                            <el-option label="区域二" value="1"></el-option>
                        </el-select>
                    </div>
                </div>
            <el-form-item label="通知接收人" prop="userId">
                <el-select v-model="form.userId" placeholder="请选择">
                    <el-option
                        v-for="(item, index) in userList"
                        :key="index"
                        :label="item.realname"
                        :value="item.id" />
                </el-select>
            </el-form-item>
        </el-form>
    </GlobalWindow>
@@ -37,24 +27,47 @@
<script>
  import GlobalWindow from '@/components/common/GlobalWindow'
  import BaseOpera from '@/components/base/BaseOpera'
  import { getUserList } from '@/api/system/user'
  export default {
    name: "call",
    components: { GlobalWindow },
    extends: BaseOpera,
    data() {
      return {
        info: null,
        form: {
          title: '1',
          companyId: '0'
          type: [],
          userId: ''
        },
        rules: {
          title: [{ required: true, message: '请输入' }],
          companyId: [{ required: true, message: '请选择' }],
        }
          type: [{ required: true, message: '请选择', trigger: 'blur' }],
          userId: [{ required: true, message: '请选择', trigger: 'blur' }]
        },
        userList: []
      }
    },
    created () {
      this.getUser()
    },
    methods: {
      open (title, target) {
        this.title = title
        this.info = target
        this.visible = true
      },
        getUser() {
          getUserList({})
            .then(res => {
              this.userList = res
            })
        },
      confirm() {
        this.$refs.paramRef.validate((valid) => {
          if (!valid) {
            return
          }
        })
      }
    }
  }
</script>
admin/src/views/finance/components/templateKeywords.vue
@@ -1,32 +1,21 @@
<template>
    <GlobalWindow
        :title="title"
        :withFooter="false"
        :visible.sync="visible"
        width="100%">
        <div class="main">
            <div class="title">账单信息</div>
            <div class="list">
                <el-tag type="info" size="medium" effect="plain" style="margin-right: 10px;">${费用名称}</el-tag>
                <el-tag type="info" size="medium" effect="plain" style="margin-right: 10px;">${计费周期}</el-tag>
                <el-tag type="info" size="medium" effect="plain" style="margin-right: 10px;">${单价}</el-tag>
                <el-tag type="info" size="medium" effect="plain" style="margin-right: 10px;">${单位}</el-tag>
                <el-tag type="info" size="medium" effect="plain" style="margin-right: 10px;">${应收日期}</el-tag>
                <el-tag type="info" size="medium" effect="plain" style="margin-right: 10px; cursor: pointer;" @click="copy(item.title)" v-for="(item, index) in billTempList" :key="index">{{item.title}}</el-tag>
            </div>
            <div class="title">合同信息</div>
            <div class="list">
                <el-tag type="info" size="medium" effect="plain" style="margin-right: 10px;">${费用名称}</el-tag>
                <el-tag type="info" size="medium" effect="plain" style="margin-right: 10px;">${计费周期}</el-tag>
                <el-tag type="info" size="medium" effect="plain" style="margin-right: 10px;">${单价}</el-tag>
                <el-tag type="info" size="medium" effect="plain" style="margin-right: 10px;">${单位}</el-tag>
                <el-tag type="info" size="medium" effect="plain" style="margin-right: 10px;">${应收日期}</el-tag>
                <el-tag type="info" size="medium" effect="plain" style="margin-right: 10px; cursor: pointer;" @click="copy(item.title)" v-for="(item, index) in contractTempList" :key="index">{{item.title}}</el-tag>
            </div>
            <div class="title">其他信息</div>
            <div class="list">
                <el-tag type="info" size="medium" effect="plain" style="margin-right: 10px;">${费用名称}</el-tag>
                <el-tag type="info" size="medium" effect="plain" style="margin-right: 10px;">${计费周期}</el-tag>
                <el-tag type="info" size="medium" effect="plain" style="margin-right: 10px;">${单价}</el-tag>
                <el-tag type="info" size="medium" effect="plain" style="margin-right: 10px;">${单位}</el-tag>
                <el-tag type="info" size="medium" effect="plain" style="margin-right: 10px;">${应收日期}</el-tag>
                <el-tag type="info" size="medium" effect="plain" style="margin-right: 10px; cursor: pointer;" @click="copy(item.title)" v-for="(item, index) in otherTempList" :key="index">{{item.title}}</el-tag>
            </div>
        </div>
    </GlobalWindow>
@@ -35,17 +24,44 @@
<script>
  import GlobalWindow from '@/components/common/GlobalWindow'
  import BaseOpera from '@/components/base/BaseOpera'
  import { getCallTemp } from '@/api/ywTempConfig'
  export default {
    name: "templateKeywords",
    components: { GlobalWindow },
    extends: BaseOpera,
    data() {
      return {
        billTempList: [],
        contractTempList: [],
        otherTempList: []
      }
    },
    created () {
      this.getCallTempVal()
    },
    methods: {
      open (title) {
        this.title = title
        this.visible = true
      },
      getCallTempVal() {
        getCallTemp({})
          .then(res => {
            this.billTempList = res.billTempList
            this.contractTempList = res.contractTempList
            this.otherTempList = res.otherTempList
          })
      },
      copy(val) {
        this.$copyText(val).then(
          (e) => {
            this.$message.success('复制成功!')
          },
          (err) => {
            this.$message.error('复制成功!')
          }
        );
      }
    }
  }
</script>
admin/src/views/finance/overdueBills.vue
@@ -97,7 +97,7 @@
  import BullEditFu from './components/bullEditFu.vue'
  import Detail from './components/bullDetail.vue'
  import Call from './components/call.vue'
  import { fetchList } from '@/api/bill'
  import { fetchList } from '@/api/ywContractBill'
  export default {
    components: {
      Pagination,
admin/src/views/stock/check.vue
@@ -2,13 +2,13 @@
  <div class="main_app">
    <QueryForm v-model="filters" :query-form-config="queryFormConfig" @handleQuery="getList(1)" @clear="clear" />
    <div class="mt20">
      <el-button type="primary" @click="handleEx()" v-permissions="['business:ywpatrolline:create']">添加</el-button>
      <el-button type="primary" @click="$refs.newInventory.open('新建盘点单')" v-permissions="['business:ywpatrolline:create']">添加</el-button>
    </div>
    <el-table v-loading="loading" :data="list" stripe>
      <el-table-column prop="name" label="盘点单名称" min-width="120" show-overflow-tooltip />
      <el-table-column prop="warehouseName" label="盘点仓库" min-width="100" show-overflow-tooltip />
      <el-table-column prop="userName" label="盘点员" min-width="80" show-overflow-tooltip />
      <el-table-column prop="dealDate" label="盘点日期" min-width="110" show-overflow-tooltip />
      <el-table-column prop="planDate" label="盘点日期" min-width="110" show-overflow-tooltip />
      <el-table-column prop="createName" label="创建人" min-width="80" show-overflow-tooltip />
      <el-table-column prop="createDate" label="创建时间" min-width="140" show-overflow-tooltip />
      <el-table-column label="盘点状态" min-width="80">
@@ -21,29 +21,35 @@
      </el-table-column>
      <el-table-column prop="workTime" label="操作" min-width="140" show-overflow-tooltip>
        <template v-slot="{ row }">
          <el-button type="text">查看详情</el-button>
          <el-button type="text">取消</el-button>
          <el-button type="text">删除</el-button>
          <el-button type="text" @click="$refs.inventoryDetails.open('盘点详细', row.id)">查看详情</el-button>
          <el-button type="text" v-if="[0,1].includes(row.status)" @click="cancel(row.id)">取消</el-button>
          <el-button type="text" v-if="[0,3].includes(row.status)" @click="dele(row.id)">删除</el-button>
        </template>
      </el-table-column>
    </el-table>
    <div class="mt20">
      <Pagination @size-change="handleSizeChange" @current-change="getList" :pagination="pagination" />
    </div>
    <NewInventory ref="newInventory" @success="getList" />
    <InventoryDetails ref="inventoryDetails" />
  </div>
</template>
<script>
import Pagination from '@/components/common/Pagination'
import QueryForm from '@/components/common/QueryForm'
import NewInventory from './components/newInventory'
import InventoryDetails from './components/inventoryDetails'
import dayjs from 'dayjs'
import duration from 'dayjs/plugin/duration'
dayjs.extend(duration)
import { fetchList } from '@/api/ywStocktaking'
import { fetchList, cancelById, deleteById } from '@/api/ywStocktaking'
export default {
  components: {
    Pagination,
    QueryForm
    QueryForm,
    NewInventory,
    InventoryDetails
  },
  data() {
    return {
@@ -100,6 +106,34 @@
        this.loading = false
      })
    },
    cancel(id) {
      this.$confirm('是否确认取消?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      }).then(() => {
        cancelById(id)
          .then(res => {
            this.getList()
          })
      }).catch(() => {
      });
    },
    dele(id) {
      this.$confirm('是否确认删除?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      }).then(() => {
        deleteById(id)
          .then(res => {
            this.getList()
          })
      }).catch(() => {
      });
    },
    clear() {
      this.filters = {}
      this.pagination.pageSize = 10
admin/src/views/stock/components/inventoryDetails.vue
@@ -10,62 +10,66 @@
            <div class="list">
                <div class="item">
                    <div class="la">盘点单名称</div>
                    <div class="val">库存盘点20241212</div>
                    <div class="val">{{info.name}}</div>
                </div>
                <div class="item">
                    <div class="la">盘点日期</div>
                    <div class="val">2024-11-17</div>
                    <div class="val">{{info.planDate}}</div>
                </div>
                <div class="item">
                    <div class="la">盘点仓库</div>
                    <div class="val">仓库1</div>
                    <div class="val">{{info.warehouseName}}</div>
                </div>
                <div class="item">
                    <div class="la">盘点员</div>
                    <div class="val">张三</div>
                    <div class="val">{{info.userName}}</div>
                </div>
                <div class="item">
                    <div class="la">盘点状态</div>
                    <div class="val">已完成</div>
                    <div class="val" v-if="info.status === 0">未开始</div>
                    <div class="val" v-if="info.status === 1">进行中</div>
                    <div class="val" v-if="info.status === 2">已完成</div>
                    <div class="val" v-if="info.status === 3">已取消</div>
                </div>
            </div>
            <div class="title">盘点结果</div>
            <div class="list">
                <div class="list_search">
                    <div class="list_search_left">
                        <el-input v-model="input" style="width: 200px; margin-right: 10px;" placeholder="请输入内容"></el-input>
                        <el-select v-model="input" style="width: 200px; margin-right: 10px;" placeholder="请选择">
                            <el-option
                                v-for="item in options"
                                :key="item.value"
                                :label="item.label"
                                :value="item.value">
                            </el-option>
                        <el-input v-model="form.code" style="width: 200px; margin-right: 10px;" placeholder="请输入物料名称/编码"></el-input>
                        <el-select v-model="form.status" style="width: 150px; margin-right: 10px;" placeholder="盘点状态">
                            <el-option label="已盘" :value="1"></el-option>
                            <el-option label="未盘" :value="0"></el-option>
                        </el-select>
                        <el-button type="primary">查询</el-button>
                        <el-button>清空</el-button>
                        <el-select v-model="form.type" style="width: 150px; margin-right: 10px;" placeholder="盘点结果">
                            <el-option label="账实相符" :value="0"></el-option>
                            <el-option label="盘亏" :value="1"></el-option>
                            <el-option label="盘盈" :value="2"></el-option>
                        </el-select>
                        <el-button type="primary" @click="getList">查询</el-button>
                        <el-button @click="clear">清空</el-button>
                        <el-button>导出</el-button>
                    </div>
                    <div class="list_search_right">
                        <span>已盘:100</span>
                        <span>未盘:20</span>
                        <span>账实相符:88</span>
                        <span>盘盈:2</span>
                        <span>盘亏:20</span>
                        <span>已盘:{{info.finishAmount || 0}}</span>
                        <span>未盘:{{info.unFinishAmount || 0}}</span>
                        <span>账实相符:{{info.equalAmount || 0}}</span>
                        <span>盘盈:{{info.profitAmount || 0}}</span>
                        <span>盘亏:{{info.lossAmount || 0}}</span>
                    </div>
                </div>
                <div style="width: 100%; margin: 20px 0;">
                    <el-table :data="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 prop="buildingName" 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 prop="buildingName" 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 prop="buildingName" label="备注" show-overflow-tooltip />
                    <el-table :data="list" stripe>
                        <el-table-column prop="materialCode" label="资产编码" show-overflow-tooltip />
                        <el-table-column prop="materialName" label="资产名称" show-overflow-tooltip />
                        <el-table-column prop="materialQrcode" label="条码" show-overflow-tooltip />
                        <el-table-column prop="materialBrand" label="品牌" show-overflow-tooltip />
                        <el-table-column prop="materialAttr" label="规格型号" show-overflow-tooltip />
                        <el-table-column prop="materialUnitName" label="单位" show-overflow-tooltip />
                        <el-table-column prop="warehouseName" label="所在仓库" show-overflow-tooltip />
                        <el-table-column prop="stock" label="账面数量" show-overflow-tooltip />
                        <el-table-column prop="actStock" label="盘点数量" show-overflow-tooltip />
                        <el-table-column prop="remark" label="备注" show-overflow-tooltip />
                    </el-table>
                </div>
                <div class="list_pagination">
@@ -87,6 +91,7 @@
<script>
  import GlobalWindow from '@/components/common/GlobalWindow'
  import BaseOpera from '@/components/base/BaseOpera'
  import { ywStocktakingRecordPage, getById } from '@/api/ywStocktaking'
  export default {
    name: "inventoryDetails",
    components: {
@@ -95,11 +100,14 @@
    extends: BaseOpera,
    data() {
      return {
        id: null,
        info: {},
        input: '',
        options: [],
        roomList: [],
        list: [],
        form: {
          code: '',
          status: '',
          type: ''
        },
        pageSize: 10,
        total: 0,
        page: 1
@@ -108,13 +116,45 @@
    methods: {
      handleSizeChange(size) {
        this.pageSize = size
        this.getList()
      },
      handleCurrentChange(page) {
        this.page = page
        this.getList()
      },
      open (title) {
      open (title, id) {
        this.title = title
        this.visible = true
        this.id = id
        this.getDetails()
        this.getList()
      },
      getDetails() {
        getById(this.id)
            .then(res => {
              this.info = res
            })
      },
      clear() {
        this.form.name = ''
        this.form.status = ''
        this.form.type = ''
        this.page = 1
        this.getList()
      },
      getList() {
        ywStocktakingRecordPage({
          capacity: this.pageSize,
          page: this.page,
          model: {
            stocktakingId: this.id,
            code: this.form.code,
            status: this.form.status,
            type: this.form.type
          }
        }).then(res => {
          this.list = res.records
        })
      }
    }
  }
admin/src/views/stock/components/newInventory.vue
@@ -6,29 +6,35 @@
        :confirm-working="isWorking"
        @confirm="confirm">
        <el-form :model="form" ref="form" :rules="rules">
            <el-form-item label="盘点单名称" prop="name">
                <el-input v-model="form.name" placeholder="请输入盘点单名称" v-trim />
            </el-form-item>
            <el-form-item label="盘点日期" prop="name">
            <el-form-item label="盘点日期" prop="planDate">
                <el-date-picker
                    v-model="form.name"
                    v-model="form.planDate"
                    @change="getName"
                    type="date"
                    value-format="yyyy-MM-dd"
                    placeholder="选择日期">
                </el-date-picker>
            </el-form-item>
            <el-form-item label="盘点仓库" prop="name">
                <el-select v-model="form.name" placeholder="请选择">
                    <el-option label="张三" :value="1"></el-option>
                    <el-option label="李四" :value="1"></el-option>
                    <el-option label="王二" :value="1"></el-option>
            <el-form-item label="盘点仓库" prop="warehouseId">
                <el-select v-model="form.warehouseId" @change="getName" placeholder="请选择">
                    <el-option
                        v-for="(item, index) in warehouseList"
                        :key="index"
                        :label="item.name"
                        :value="item.id" />
                </el-select>
            </el-form-item>
            <el-form-item label="盘点员" prop="name">
                <el-select v-model="form.name" placeholder="请选择">
                    <el-option label="张三" :value="1"></el-option>
                    <el-option label="李四" :value="1"></el-option>
                    <el-option label="王二" :value="1"></el-option>
            <el-form-item label="盘点员" prop="userId">
                <el-select v-model="form.userId" @change="getName" placeholder="请选择">
                    <el-option
                        v-for="(item, index) in userList"
                        :key="index"
                        :label="item.realname"
                        :value="item.id" />
                </el-select>
            </el-form-item>
            <el-form-item label="盘点单名称" prop="name">
                <el-input v-model="form.name" placeholder="请输入" v-trim />
            </el-form-item>
        </el-form>
    </GlobalWindow>
@@ -37,6 +43,8 @@
<script>
  import BaseOpera from '@/components/base/BaseOpera'
  import GlobalWindow from '@/components/common/GlobalWindow'
  import { list } from '@/api/ywWarehouse'
  import { getUserList } from '@/api/system/user'
  export default {
    name: 'newInventory',
    extends: BaseOpera,
@@ -47,21 +55,45 @@
        form: {
          id: '',
          name: '',
          planDate: '',
          warehouseId: '',
          userId: ''
        },
        // éªŒè¯è§„则
        rules: {
          name: [{ required: true, message: '请输入项目名称', trigger: 'blur' }]
          planDate: [{ required: true, message: '请选择盘点日期', trigger: 'blur' }],
          warehouseId: [{ required: true, message: '请选择盘点仓库', trigger: 'blur' }],
          userId: [{ required: true, message: '请选择盘点员', trigger: 'blur' }],
          name: [{ required: true, message: '请输入盘点单名称', trigger: 'blur' }]
        },
        warehouseList: [],
        userList: []
      }
    },
    created() {
      this.config({
        api: '/project/ywProject',
        'field.id': 'id'
        api: '/ywStocktaking'
      })
      this.getList()
    },
    methods: {
        getList() {
          list({})
            .then(res => {
              this.warehouseList = res
            })
          getUserList({})
            .then(res => {
              this.userList = res
            })
        },
      getName(e) {
          if (this.form.warehouseId && this.form.userId && this.form.planDate) {
            let userName = this.userList.filter(item => item.id === this.form.userId)[0].realname
            let warehouseName = this.warehouseList.filter(item => item.id === this.form.warehouseId)[0].name
            this.form.name = warehouseName + '-' + userName + '-' + this.form.planDate
          }
      }
    }
  }
</script>
admin/src/views/workorder/components/detail.vue
@@ -3,12 +3,15 @@
    @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 green" v-if="info.dealStatus == 1">已指派</div>
          <div class="status gray" v-if="info.dealStatus == 2">已处理</div>
        <div class="title_left">
          <span>工单详情</span>
          <div>
            <div class="status primaryColor" v-if="info.dealStatus == 0 || info.dealStatus == null">待指派</div>
            <div class="status green" v-if="info.dealStatus == 1">已指派</div>
            <div class="status gray" v-if="info.dealStatus == 2">已处理</div>
          </div>
        </div>
        <el-button>查看问题上报</el-button>
      </div>
      <div class="main_content">
        <div class="list">
@@ -308,39 +311,41 @@
  padding-top: 20px;
  .title {
    font-weight: 500;
    font-size: 18px;
    color: $primary-color;
    margin-bottom: 10px;
    display: flex;
    align-items: center;
    .status {
      padding: 0 12px;
      height: 24px;
      line-height: 24px;
      border-radius: 2px;
      border: 1px solid #00BA92;
      color: #00BA92;
      font-weight: 400;
      font-size: 12px;
      margin-left: 10px;
    }
    .primaryColor {
      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: #333333;
      background-color: rgba(128, 128, 128, .2);
      border: 1px solid rgba(128, 128, 128, .2);
    justify-content: space-between;
    .title_left {
      display: flex;
      align-items: center;
      font-weight: 500;
      font-size: 18px;
      color: $primary-color;
      .status {
        padding: 0 12px;
        height: 24px;
        line-height: 24px;
        border-radius: 2px;
        border: 1px solid #00BA92;
        color: #00BA92;
        font-weight: 400;
        font-size: 12px;
        margin-left: 10px;
      }
      .primaryColor {
        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: #333333;
        background-color: rgba(128, 128, 128, .2);
        border: 1px solid rgba(128, 128, 128, .2);
      }
    }
  }
admin/src/views/workorder/workorderList.vue
@@ -26,6 +26,12 @@
            children: 'childCategoryList'
          }"></el-cascader>
      </el-form-item>
      <el-form-item label="来源" prop="origin">
        <el-select v-model="searchForm.origin" clearable filterable>
          <el-option label="自建" :value="0" />
          <el-option label="问题转工单" :value="1" />
        </el-select>
      </el-form-item>
      <el-form-item label="上报时间">
        <el-date-picker v-model="searchForm.selDate" @change="changeSelDate" format="yyyy-MM-dd"
          value-format="yyyy-MM-dd" type="daterange"></el-date-picker>
@@ -58,6 +64,12 @@
          </template>
        </el-table-column>
        <el-table-column prop="categoryName" label="工单分类" min-width="100px"></el-table-column>
        <el-table-column label="来源" min-width="100px">
          <template slot-scope="{row}">
            <span v-if="row.origin == 0">自建</span>
            <span v-if="row.origin == 1">问题转工单</span>
          </template>
        </el-table-column>
        <el-table-column prop="creatorName" label="上报人" min-width="80px"></el-table-column>
        <el-table-column prop="createDate" label="上报时间" min-width="100px"></el-table-column>
        <el-table-column prop="dealUserName" label="处理人" min-width="80px"></el-table-column>
@@ -107,6 +119,7 @@
        projectId: '',
        buildingId: '',
        cateId: '',
        origin: ''
      },
      projectList: [],
      buildList: [],