jiangping
2024-11-30 d87b6ff6bf0681854bb431e8f8e93652a6540691
Merge remote-tracking branch 'origin/master'
已添加5个文件
已修改27个文件
2081 ■■■■■ 文件已修改
admin/.env 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/.env.production 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/.env.test 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/contract.js 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/ywContractRevenue.js 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/contract/components/addCollectionBill.vue 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/contract/components/terminateLease.vue 112 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/finance/bull.vue 35 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/finance/components/bullDetail.vue 62 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/finance/components/bullEdit.vue 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/finance/components/details.vue 335 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/finance/components/flowingWater.vue 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/finance/payments.vue 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/login.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/workorder/components/OperaYwWorkorderWindow.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/workorder/components/detail.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/api/index.js 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/api/staff.js 211 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/api/yw.js 73 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/manifest.json 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages.json 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/common/memberSel.vue 256 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/index.vue 41 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/login.vue 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/operation/detail.vue 37 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/operation/record.vue 154 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/workOrder/detail.vue 108 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/workOrder/edit.vue 396 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/workOrder/list.vue 56 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/static/empty.png 补丁 | 查看 | 原始文档 | blame | 历史
h5/static/home/ic_xinzenggongdan@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
h5/utils/service.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/.env
@@ -10,4 +10,4 @@
VUE_APP_API_PREFIX = '/gateway_interface'
# é¡¹ç›®åç§°
VUE_APP_TITLE = '阜宁文体中心'
VUE_APP_TITLE = '租赁平台'
admin/.env.production
@@ -1,4 +1,4 @@
# ç”Ÿäº§çŽ¯å¢ƒé…ç½®
NODE_ENV = 'production'
# VUE_APP_API_URL  = 'http://10.50.250.178:8088/gateway_interface'
# VUE_APP_API_URL  = 'http://192.168.0.173/gateway_interface'
admin/.env.test
@@ -5,4 +5,4 @@
VUE_APP_API_URL  = 'http://192.168.0.162:10010/'
# VUE_APP_API_URL  = 'http://192.168.0.136:10010/'
# VUE_APP_API_URL  = 'http://192.168.0.108:10030/'
admin/src/api/contract.js
@@ -36,3 +36,9 @@
export function getYwContractBillById (id) {
  return request.get(`/visitsAdmin/cloudService/business/ywContractBill/${id}`)
}
// å¯é€€æ¬¾è´¦å•
export function getCanBackBill (data) {
  return request.post('/visitsAdmin/cloudService/business/ywContractBill/getCanBackBill', data)
}
admin/src/api/ywContractRevenue.js
@@ -16,3 +16,8 @@
export function close (id) {
  return request.get(`/visitsAdmin/cloudService/business/ywContractRevenue/close?id=${id}`)
}
// æ ¹æ®ID查询
export function getById (id) {
  return request.get(`/visitsAdmin/cloudService/business/ywContractRevenue/${id}`)
}
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">基础信息</div>
                        <div class="m_title">基础信息-{{time.startDate}}~{{time.endDate}}</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>
@@ -37,6 +37,8 @@
                                type="daterange"
                                range-separator="至"
                                v-model="form.date"
                                :min-date="new Date(time.startDate)"
                                :max-date="new Date(time.endDate)"
                                @change="changeDate"
                                start-placeholder="开始日期"
                                end-placeholder="结束日期"
@@ -109,6 +111,10 @@
          billTypeCopy: 0,
          date: []
        },
        time: {
          startDate: '',
          endDate: ''
        },
        rules: {
          contractCode: [
            { required: true, message: '请输入', trigger: 'blur' }
@@ -136,8 +142,10 @@
      }
    },
    methods: {
      open (title, target) {
      open (title, target, time) {
        this.title = title
        this.time.startDate = time.startDate
        this.time.endDate = time.endDate
        this.getCompany()
        this.visible = true
        // æ–°å»º
admin/src/views/contract/components/terminateLease.vue
@@ -24,6 +24,7 @@
                            </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"
@@ -69,13 +70,14 @@
            <div class="title">
                <span>退租信息</span>
                <div style="display: flex; align-items: center;">
                    <el-button type="primary" @click="$refs.addCollectionBill.open('创建收款账单', { contractCode: info.code, contractId: info.id, renterName: info.renterName, renterId: info.renterId, billType: 0, billTypeCopy: 0, feeType: 0 })">添加收款</el-button>
                    <el-button type="primary" @click="$refs.AddPaymentBill.open('创建付款账单', { contractCode: info.code, contractId: info.id, renterName: info.renterName, renterId: info.renterId, billType: 1, billTypeCopy: 1 })">添加付款</el-button>
                    <el-button type="primary" @click="addZD">添加收款</el-button>
                    <el-button type="primary" @click="addFK">添加付款</el-button>
                </div>
            </div>
            <el-table
                :data="info.terminateList"
                border
                v-loading="loading"
                style="width: 100%; margin-bottom: 15px;">
                <el-table-column
                    prop="code"
@@ -193,7 +195,7 @@
  import AddCollectionBill from './addCollectionBill'
  import AddPaymentBill from './addPaymentBill'
  import { getUserList } from '@/api/system/user'
  import { backRent } from '@/api/contract'
  import { backRent, getCanBackBill } from '@/api/contract'
  export default {
    name: "terminateLease",
    components: {
@@ -236,7 +238,9 @@
        agentList: [],
        receivable: '',
        meet: ''
        meet: '',
        loading: false
      }
    },
    watch: {
@@ -264,28 +268,74 @@
        this.title = title
        this.info = info
        this.form.id = info.id
        this.info.billList.forEach(item => {
        this.info.canBackRentBills.forEach(item => {
          this.$set(item, 'receivableFeeCopy', item.receivableFee)
          this.$set(item, 'receivableFee', item.needReceivableFee)
          if ([2,3,7].includes(item.costType)) {
            this.$set(item, 'billType', 1)
            this.$set(item, 'price', item.actReceivableFee)
          } else {
            this.$set(item, 'price', item.receivableFee)
            this.$set(item, 'price', item.needReceivableFee)
          }
        })
        this.info.terminateList = this.info.canBackRentBills.filter(item => {
          if ([0,1,4,5,6].includes(item.costType)) {
            item.billTypeCopy = item.billType
            item.billTypeCopy = JSON.parse(JSON.stringify(item.billType))
            return item
          }
        })
        this.info.depositList = this.info.canBackRentBills.filter(item => {
          if ([2,3,7].includes(item.costType)) {
            item.billTypeCopy = item.billType
            item.billTypeCopy = JSON.parse(JSON.stringify(item.billType))
            return item
          }
        })
        this.getUser()
        this.visible = true
      },
      addZD () {
        if (!this.form.btDate) return this.$message.warning('请选择退租日期')
        this.$refs.addCollectionBill.open('创建收款账单', {
          contractCode: this.info.code,
          contractId: this.info.id,
          renterName: this.info.renterName,
          renterId: this.info.renterId,
          billType: 0,
          billTypeCopy: 0,
          feeType: 0
        }, { startDate: this.info.startDate, endDate: this.form.btDate })
      },
      addFK () {
        if (!this.form.btDate) return this.$message.warning('请选择退租日期')
        this.$refs.AddPaymentBill.open('创建付款账单', {
          contractCode: this.info.code,
          contractId: this.info.id,
          renterName: this.info.renterName,
          renterId: this.info.renterId,
          billType: 1,
          billTypeCopy: 1
        }, { startDate: this.info.startDate, endDate: this.form.btDate })
      },
      changeBtDate (planPayDateEnd) {
        this.loading = true
        getCanBackBill({
          contractId: this.info.id,
          planPayDateEnd
        }).then(res => {
          res.forEach(item => {
            this.$set(item, 'receivableFeeCopy', item.receivableFee)
            this.$set(item, 'receivableFee', item.needReceivableFee)
            this.$set(item, 'price', item.needReceivableFee)
          })
          this.info.terminateList = res.filter(item => {
            if ([0,1,4,5,6].includes(item.costType)) {
              item.billTypeCopy = JSON.parse(JSON.stringify(item.billType))
              return item
            }
          })
        }).finally(() => {
          this.loading = false
        })
      },
      getObjS (obj) {
        this.info.terminateList.push(obj)
@@ -336,34 +386,32 @@
          row.price = 0
          this.$message.warning('不能大于原始应收付金额')
        } else {
          row.price = Number(num) - row.actReceivableFee
          // æ”¶
          if (row.billTypeCopy === 0) {
            if (row.price > 0) {
              row.billType = 0
            } else if (row.price < 0) {
              row.billType = 1
          if (num) {
            row.price = Number(num) - row.actReceivableFee
            // æ”¶
            if (row.billTypeCopy === 0) {
              if (row.price > 0) {
                row.billType = 0
              } else if (row.price < 0) {
                row.billType = 1
              } else {
                row.billType = 0
              }
            } else {
              row.billType = 0
              if (row.price > 0) {
                row.billType = 1
              } else if (row.price < 0) {
                row.billType = 0
              } else {
                row.billType = 1
              }
            }
          } else {
            if (row.price > 0) {
              row.billType = 1
            } else if (row.price < 0) {
              row.billType = 0
            } else {
              row.billType = 1
            }
            row.price = 0
            row.billType = row.billTypeCopy
            console.log('billTypeCopy', row.billTypeCopy)
          }
          // if (row.price > 0) {
          //   row.billType = 0
          // } else if (row.price < 0) {
          //   row.billType = 1
          // }
          row.price = String(row.price)
          if (row.price.indexOf('-') > 0) {
            row.price = row.price.substring(0, row.price.length)
          }
          row.price = Math.abs(row.price);
        }
      }
    }
admin/src/views/finance/bull.vue
@@ -38,24 +38,40 @@
      <el-table-column prop="needReceivableFee" label="需收金额" min-width="100" show-overflow-tooltip />
      <el-table-column label="费用类型" min-width="100" show-overflow-tooltip>
        <template slot-scope="{row}">
          <span v-if="row.feeType === 0">周期费用</span>
          <span v-if="row.feeType === 1">一次性费用</span>
          <span v-if="row.costType === 0">租赁费</span>
          <span v-if="row.costType === 1">物业费</span>
          <span v-if="row.costType === 2">租赁押金</span>
          <span v-if="row.costType === 3">物业押金</span>
          <span v-if="row.costType === 4">水电费</span>
          <span v-if="row.costType === 5">杂项费</span>
          <span v-if="row.costType === 6">其它</span>
          <span v-if="row.costType === 7">保证金</span>
        </template>
      </el-table-column>
      <el-table-column label="是否逾期" min-width="100" show-overflow-tooltip>
        <template slot-scope="{row}">
          <span v-if="row.isOverdue === 0">否</span>
          <span v-if="row.isOverdue === 1">是</span>
          <span v-if="row.isOverdue === 0">未逾期</span>
          <span v-if="row.isOverdue === 1" style="color: red;">已逾期</span>
        </template>
      </el-table-column>
      <el-table-column label="计费周期" min-width="100" show-overflow-tooltip>
      <el-table-column label="计费周期" min-width="200" show-overflow-tooltip>
        <template slot-scope="{row}">
          {{ row.startDate }} ~ {{ row.endDate }}
        </template>
      </el-table-column>
      <el-table-column prop="planPayDate" label="应收日期" min-width="100" show-overflow-tooltip />
      <el-table-column prop="createTime" label="账单来源" min-width="100" show-overflow-tooltip />
      <el-table-column prop="statusName" label="合同状态" min-width="100" fixed="right" show-overflow-tooltip />
      <el-table-column label="账单来源" min-width="100" show-overflow-tooltip>
        <template slot-scope="{row}">
          <span v-if="row.type === 0">合同账单</span>
          <span v-if="row.type === 1">自建账单</span>
        </template>
      </el-table-column>
      <el-table-column label="账单状态" min-width="100" fixed="right" show-overflow-tooltip>
        <template slot-scope="{row}">
          <span v-if="row.status === 0">开启</span>
          <span v-if="row.status === 1" style="color: red;">关闭</span>
        </template>
      </el-table-column>
      <el-table-column label="操作" min-width="120" fixed="right">
        <template slot-scope="{row}">
          <el-button type="text" @click="handleDetail(row)" icon="el-icon-edit" v-permissions="['business:category:update']">查看详情</el-button>
@@ -150,6 +166,11 @@
    },
    getList (page) {
      const { pagination, filters } = this
      let form = JSON.parse(JSON.stringify(filters))
      if (form && form.selDate && form.selDate.length > 0) {
        form.planPayDateStart = form.payDate[0]
        form.planPayDateEnd = form.payDate[1]
      }
      this.loading = true
      fetchList({
        model: {
admin/src/views/finance/components/bullDetail.vue
@@ -5,12 +5,13 @@
      <div class="left">
        <span class="mr10">付款方:{{info.customerName}}</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="info" v-if="info.status === 1">关闭</el-tag>
      </div>
      <el-button plain type="primary" @click="$refs.flowingWater.open(info.billType === 0 ? '创建收款账单' : '创建付款账单', {
      <el-button plain type="primary" @click="$refs.flowingWater.open('创建收支流水', {
        billType: info.billType,
        billId: info.id,
        costType: info.costType,
        receivableFee: info.needReceivableFee,
        costTypeName: returnText(info.costType),
        contractCode: info.contractCode,
        contractId: info.contractId,
@@ -36,19 +37,19 @@
          <div class="val" style="margin-top: 10px;" v-if="info.payStatus === 5">已关闭</div>
        </div>
        <div class="item" style="flex: 1;">
          <div class="la">应收金额(元)</div>
          <div class="la">应{{info.billType === 0 ? '收' : '付'}}金额(元)</div>
          <div class="val" style="margin-top: 10px;">{{info.receivableFee}}</div>
        </div>
        <div class="item" style="flex: 1;">
          <div class="la">实收金额(元)</div>
          <div class="la">实{{info.billType === 0 ? '收' : '付'}}金额(元)</div>
          <div class="val" style="margin-top: 10px;">{{info.actReceivableFee}}</div>
        </div>
        <div class="item" style="flex: 1;">
          <div class="la">需付金额(元)</div>
          <div class="la">需{{info.billType === 0 ? '收' : '付'}}金额(元)</div>
          <div class="val" style="margin-top: 10px;">{{info.needReceivableFee}}</div>
        </div>
        <div class="item" style="flex: 1;">
          <div class="la">应收日期</div>
          <div class="la">应{{info.billType === 0 ? '收' : '付'}}日期</div>
          <div class="val" style="margin-top: 10px;">{{info.planPayDate}}</div>
        </div>
      </div>
@@ -62,9 +63,8 @@
      <div class="title">基础信息</div>
      <div class="list" style="background: rgba(0,0,0,0); padding: 0;">
        <div class="item">
          <div class="la">账单类型</div>
          <div class="val" v-if="info.billType === 0">收款</div>
          <div class="val" v-if="info.billType === 1">付款</div>
          <div class="la">费用类型</div>
          <div class="val">{{returnText(info.costType)}}</div>
        </div>
        <div class="item">
          <div class="la">计费周期</div>
@@ -92,7 +92,7 @@
        </div>
        <div class="item">
          <div class="la">经办人</div>
          <div class="val">张三</div>
          <div class="val">{{info.realname}}</div>
        </div>
        <div class="item">
          <div class="la">所属公司</div>
@@ -126,47 +126,13 @@
            </template>
          </el-table-column>
          <el-table-column
            prop="area"
            label="面积">
            <template slot-scope="{row}">
              {{row.area}}㎡
            </template>
          </el-table-column>
        </el-table>
      </div>
<!--      <div class="title">账单明细</div>-->
<!--      <div class="list" style="background: rgba(0,0,0,0); padding: 0;">-->
<!--        <el-table-->
<!--          :data="tableData"-->
<!--          border-->
<!--          style="width: 100%">-->
<!--          <el-table-column-->
<!--            prop="date"-->
<!--            label="费用类型">-->
<!--          </el-table-column>-->
<!--          <el-table-column-->
<!--            prop="name"-->
<!--            label="应收/付金额">-->
<!--          </el-table-column>-->
<!--          <el-table-column-->
<!--            prop="address"-->
<!--            label="实收金额">-->
<!--          </el-table-column>-->
<!--          <el-table-column-->
<!--            prop="address"-->
<!--            label="需收金额">-->
<!--          </el-table-column>-->
<!--          <el-table-column-->
<!--            prop="address"-->
<!--            label="计费周期">-->
<!--          </el-table-column>-->
<!--          <el-table-column-->
<!--            prop="address"-->
<!--            label="应收/付日期">-->
<!--          </el-table-column>-->
<!--          <el-table-column-->
<!--            prop="address"-->
<!--            label="备注">-->
<!--          </el-table-column>-->
<!--        </el-table>-->
<!--      </div>-->
      <div class="title">收支流水</div>
      <div class="list" style="background: rgba(0,0,0,0); padding: 0;">
        <el-table
@@ -197,7 +163,7 @@
            </template>
          </el-table-column>
          <el-table-column
            prop="payDateEnd"
            prop="actPayDate"
            label="入账日期">
          </el-table-column>
          <el-table-column
admin/src/views/finance/components/bullEdit.vue
@@ -21,11 +21,11 @@
                <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="请选择">
              <el-select v-model="form.ywContractRoomList" @click="clickHouse" multiple placeholder="请选择">
                <el-option
                  v-for="(item, index) in houseList"
                  :key="index"
                  :value="item.id"
                  :value="item.roomId"
                  :label="item.projectName + item.buildingName + item.floorName + item.roomName" />
              </el-select>
            </el-form-item>
@@ -149,6 +149,7 @@
  methods: {
    open (title, target) {
      this.title = title
      this.form.feeType = 0
      this.form.multifileList = []
      this.getListAll()
      this.getCompanyList()
@@ -168,6 +169,11 @@
        }
      })
    },
    clickHouse () {
      if (!this.form.contractId) {
        return this.$message.warning('请先选择合同')
      }
    },
    changeContract (e) {
      this.form.renterName = this.contract.filter(item => {
        if (item.id === e) {
admin/src/views/finance/components/details.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,335 @@
<template>
    <GlobalWindow :title="title" :visible.sync="visible" :confirm-working="isWorking" @close="close"
        @confirm="confirm">
        <div class="home_title">
            <div class="left">
                <span class="mr10">对方单位名称:{{info.customerName}}</span>
                <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 type="danger" v-if="info.status === 0" @click="closeDW()">关闭流水</el-button>
        </div>
        <div class="line"></div>
        <div class="main">
            <div class="list" style="background: rgba(0,0,0,0); padding: 0; margin-bottom: 0;">
                <div class="item" style="flex: 1;">
                    <div class="la">结清状态</div>
                    <div class="val" style="margin-top: 10px;" v-if="info1.payStatus === 0">待收款</div>
                    <div class="val" style="margin-top: 10px;" v-if="info1.payStatus === 1">已结清</div>
                    <div class="val" style="margin-top: 10px;" v-if="info1.payStatus === 2">部分结清</div>
                    <div class="val" style="margin-top: 10px;" v-if="info1.payStatus === 3">待付款</div>
                    <div class="val" style="margin-top: 10px;" v-if="info1.payStatus === 4">待退款</div>
                    <div class="val" style="margin-top: 10px;" v-if="info1.payStatus === 5">已关闭</div>
                </div>
                <div class="item" style="flex: 1;">
                    <div class="la">应{{info.revenueType === 0 ? '收' : '付'}}金额(元)</div>
                    <div class="val" style="margin-top: 10px;">{{info1.receivableFee}}</div>
                </div>
                <div class="item" style="flex: 1;">
                    <div class="la">实{{info.revenueType === 0 ? '收' : '付'}}金额(元)</div>
                    <div class="val" style="margin-top: 10px;">{{info1.actReceivableFee}}</div>
                </div>
                <div class="item" style="flex: 1;">
                    <div class="la">需{{info.revenueType === 0 ? '收' : '付'}}金额(元)</div>
                    <div class="val" style="margin-top: 10px;">{{info1.needReceivableFee}}</div>
                </div>
                <div class="item" style="flex: 1;">
                    <div class="la">应{{info.revenueType === 0 ? '收' : '付'}}日期</div>
                    <div class="val" style="margin-top: 10px;">{{info1.planPayDate}}</div>
                </div>
            </div>
        </div>
        <div class="tabs">
            <div class="tab" :class="{ active: activeTabs == 0 }" @click="tabsClick(0)">流水信息</div>
            <div class="tab" :class="{ active: activeTabs == 1 }" @click="tabsClick(1)">关联账单</div>
        </div>
        <div class="main">
            <div class="title">流水信息</div>
            <div class="list" style="background: rgba(0,0,0,0); padding: 0;">
                <div class="item">
                    <div class="la">收支类型</div>
                    <div class="val" v-if="info.revenueType === 0">收入</div>
                    <div class="val" v-if="info.revenueType === 1">支出</div>
                </div>
                <div class="item">
                    <div class="la">入账日期</div>
                    <div class="val">{{info.actPayDate}}</div>
                </div>
                <div class="item">
                    <div class="la">发生额(元)</div>
                    <div class="val">{{info.actReceivableFee}}</div>
                </div>
                <div class="item">
                    <div class="la">账单编号</div>
                    <div class="val">{{info.billCode}}</div>
                </div>
                <div class="item">
                    <div class="la">合同编号</div>
                    <div class="val">{{info.contractCode}}</div>
                </div>
                <div class="item">
                    <div class="la">创建时间</div>
                    <div class="val">{{info.createDate}}</div>
                </div>
                <div class="item">
                    <div class="la">对方公司</div>
                    <div class="val">{{info.customerName}}</div>
                </div>
                <div class="item">
                    <div class="la">经办人</div>
                    <div class="val">{{info.realname}}</div>
                </div>
                <div class="item">
                    <div class="la">流水账户</div>
                    <div class="val">{{info.accountTitle}}</div>
                </div>
                <div class="item">
                    <div class="la">备注</div>
                    <div class="val">{{info.remark}}</div>
                </div>
                <div class="item"></div>
                <div class="item"></div>
            </div>
            <div class="title">关联账单</div>
            <div class="list" style="background: rgba(0,0,0,0); padding: 0;">
                <el-table
                    :data="[info1]"
                    border
                    style="width: 100%">
                    <el-table-column
                        label="费用类型">
                        <template slot-scope="{row}">
                            <span v-if="row.costType === 0">租赁费</span>
                            <span v-if="row.costType === 1">物业费</span>
                            <span v-if="row.costType === 2">租赁押金</span>
                            <span v-if="row.costType === 3">物业押金</span>
                            <span v-if="row.costType === 4">水电费</span>
                            <span v-if="row.costType === 5">杂项费</span>
                            <span v-if="row.costType === 6">其它</span>
                            <span v-if="row.costType === 7">保证金</span>
                        </template>
                    </el-table-column>
                    <el-table-column
                        prop="receivableFee"
                        label="应收/付金额">
                    </el-table-column>
                    <el-table-column
                        prop="actReceivableFee"
                        label="实收金额">
                    </el-table-column>
                    <el-table-column
                        prop="needReceivableFee"
                        label="需收金额">
                    </el-table-column>
                    <el-table-column
                        label="计费周期">
                        <template slot-scope="{row}">
                            {{row.startDate}} ~ {{row.endDate}}
                        </template>
                    </el-table-column>
                    <el-table-column
                        prop="planPayDate"
                        label="应收/付日期">
                    </el-table-column>
                    <el-table-column
                        prop="remark"
                        label="备注">
                    </el-table-column>
                </el-table>
            </div>
            <div class="title">流水附件</div>
            <div class="list" style="background: rgba(0,0,0,0); padding: 0;">
                <el-table
                    :data="info.multifileList"
                    border
                    style="width: 100%">
                    <el-table-column
                        prop="name"
                        label="附件名称">
                    </el-table-column>
                    <el-table-column
                        prop="userName"
                        label="操作人">
                    </el-table-column>
                    <el-table-column
                        prop="createDate"
                        label="操作时间">
                    </el-table-column>
                </el-table>
            </div>
            <div class="title">操作记录</div>
            <div class="list" style="background: rgba(0,0,0,0); padding: 0;">
                <el-table
                    :data="info.editRecordDataVOList"
                    border
                    style="width: 100%">
                    <el-table-column
                        width="200"
                        prop="editUserName"
                        label="操作人">
                    </el-table-column>
                    <el-table-column
                        width="200"
                        prop="editTime"
                        label="操作时间">
                    </el-table-column>
                    <el-table-column
                        prop="editRemark"
                        label="操作内容">
                    </el-table-column>
                </el-table>
            </div>
        </div>
    </GlobalWindow>
</template>
<script>
  import GlobalWindow from '@/components/common/GlobalWindow'
  import BaseOpera from '@/components/base/BaseOpera'
  import { close, getById } from '@/api/ywContractRevenue'
  import { getYwContractBillById } from '@/api/contract'
  export default {
    name: 'details',
    components: {
      GlobalWindow
    },
    extends: BaseOpera,
    data() {
      return {
        id: '',
        activeTabs: '',
        info: {},
        info1: {}
      }
    },
    methods: {
      open (title, id) {
        this.title = title
        this.id = id
        this.getDetails()
      },
      getDetails () {
        getById(this.id)
          .then(res => {
            this.info = res
            this.getDetails1()
          })
      },
      getDetails1 () {
        getYwContractBillById(this.info.billId)
          .then(res => {
            this.info1 = res
            this.visible = true
          })
      },
      tabsClick(val) {
        this.activeTabs = val
      },
      closeDW (id) {
        this.$confirm('确认关闭此流水吗?', '提示', {
          confirmButtonText: '确定',
          cancelButtonText: '取消',
          type: 'warning'
        }).then(() => {
          close(id)
            .then(res => {
              this.getDetails()
            })
        }).catch(() => {
        });
      },
    }
  }
</script>
<style lang="scss" scoped>
    @import '@/assets/style/variables.scss';
    .home_title {
        display: flex;
        justify-content: space-between;
        align-items: center;
        .left {
            font-weight: 500;
            font-size: 16px;
            margin-right: 10px;
            display: flex;
            align-items: center;
            .status {
                padding: 0 6px;
                height: 22px;
                line-height: 22px;
                border-radius: 2px;
                border: 1px solid #00BA92;
                color: #00BA92;
                font-weight: 400;
                font-size: 12px;
                color: #00BA92;
            }
        }
    }
    .remark {
        background: #E8EBF7;
        border-radius: 2px;
        padding: 10px 20px;
        font-size: 16px;
        margin: 20px 0
    }
    .tabs {
        border-bottom: 1px solid #DFE2E8;
        display: flex;
        margin-bottom: 20px;
        .tab {
            height: 58px;
            line-height: 58px;
            font-size: 16px;
            color: #666666;
            margin-right: 30px;
            cursor: pointer;
        }
        .active {
            font-weight: 500;
            color: $primary-color;
            border-bottom: 2px solid $primary-color;
        }
    }
    .line {
        width: 100%;
        margin: 15px 0;
        border-bottom: 1px dashed #eaeaea;
    }
    .main {
        .title {
            font-weight: 500;
            font-size: 18px;
            color: $primary-color;
            margin-bottom: 15px;
        }
        .list {
            display: flex;
            flex-wrap: wrap;
            /*background: #F7F7F7;*/
            border-radius: 2px;
            padding: 0 20px;
            margin-bottom: 20px;
            .item {
                flex: 25%;
                margin-bottom: 20px;
                .la {
                    color: #7f7f7f;
                    margin-bottom: 5px;
                }
            }
        }
    }
</style>
admin/src/views/finance/components/flowingWater.vue
@@ -17,8 +17,8 @@
                        <el-form-item label="计费周期" required>
                            <el-input v-model="form.date" disabled placeholder="请输入" v-trim />
                        </el-form-item>
                        <el-form-item label="应收金额" prop="receivableFee">
                            <el-input v-model="form.receivableFee" placeholder="请输入" v-trim />
                        <el-form-item label="应收金额" required>
                            <el-input v-model="form.receivableFee" disabled placeholder="请输入" v-trim />
                        </el-form-item>
                        <el-form-item label="实收金额" prop="actReceivableFee">
                            <el-input v-model="form.actReceivableFee" placeholder="请输入" v-trim />
@@ -100,6 +100,7 @@
          contractId: '',
          startDate: '',
          endDate: '',
          receivableFee: '',
          date: '',
          companyId: '',
          actReceivableFee: '',
@@ -204,7 +205,6 @@
          }
        })
        const item = file.data[0]
        console.log(item)
        this.form.multifileList.push({ ...item, fileurl: item.imgaddr, name: item.originname, userName: this.userInfo.realname, createTime: this.getDay() })
      },
      close() {
@@ -214,11 +214,11 @@
        this.title = title
        this.visible = true
        this.$nextTick(() => {
          this.$refs.form.resetFields();
          for (const key in this.form) {
            this.form[key] = target[key]
          }
        })
        console.log(this.form)
        this.getDates(target.companyId)
      }
    }
admin/src/views/finance/payments.vue
@@ -2,7 +2,7 @@
  <div class="main_app">
    <QueryForm v-model="filters" :query-form-config="queryFormConfig" @handleQuery="getList(1)" @clear="clear" />
    <div class="mt20">
      <el-button @click="handleEdit()" v-permissions="['business:ywpatrolline:create']">导出</el-button>
      <el-button v-permissions="['business:ywpatrolline:create']">导出</el-button>
    </div>
    <el-table v-loading="loading" :data="list" stripe>
      <el-table-column prop="customerName" label="客户名称" min-width="100" show-overflow-tooltip />
@@ -33,7 +33,7 @@
          <span v-if="row.payType === 6">其他</span>
        </template>
      </el-table-column>
      <el-table-column prop="payDateEnd" label="入账日期" show-overflow-tooltip />
      <el-table-column prop="actPayDate" label="入账日期" show-overflow-tooltip />
      <el-table-column prop="createDate" label="创建日期" show-overflow-tooltip />
      <el-table-column prop="realname" label="创建人" show-overflow-tooltip />
      <el-table-column label="状态" min-width="100" fixed="right" show-overflow-tooltip>
@@ -44,7 +44,7 @@
      </el-table-column>
      <el-table-column label="操作" min-width="190" fixed="right">
        <template slot-scope="{row}">
          <el-button type="text">查看详情</el-button>
          <el-button type="text" @click="$refs.details.open('收支流水详情', row.id)">查看详情</el-button>
          <el-button type="text" @click="closeDW(row.id)" v-if="row.status !== 1">关闭流水</el-button>
        </template>
      </el-table-column>
@@ -52,25 +52,25 @@
    <div class="mt20">
      <Pagination @size-change="handleSizeChange" @current-change="getList" :pagination="pagination" />
    </div>
    <Edit v-if="showEdit" ref="EditRef" @success="getList" @close="showEdit = false" />
    <!--  è¯¦æƒ…  -->
    <Details ref="details" />
  </div>
</template>
<script>
import Pagination from '@/components/common/Pagination'
import QueryForm from '@/components/common/QueryForm'
import Edit from './components/paymentsEdit.vue'
import Details from './components/details'
import { fetchList, close } from '@/api/ywContractRevenue'
export default {
  components: {
    Pagination,
    QueryForm,
    Edit
    Details
  },
  data() {
    return {
      loading: false,
      showEdit: false,
      pagination: {
        pageSize: 10,
        page: 1,
@@ -125,10 +125,15 @@
  methods: {
    getList(page) {
      const { pagination, filters } = this
      let form = JSON.parse(JSON.stringify(filters))
      if (form && form.payDate && form.payDate.length > 0) {
        form.payDateStart = form.payDate[0]
        form.payDateEnd = form.payDate[1]
      }
      this.loading = true
      fetchList({
        model: {
          ...filters
          ...form
        },
        capacity: pagination.pageSize,
        page: page || pagination.page,
@@ -153,16 +158,6 @@
      }).catch(() => {
      
      });
    },
    handleEdit(row) {
      this.showEdit = true
      this.$nextTick(() => {
        this.$refs.EditRef.isShowModal = true
        if (row && row.id) {
          this.$refs.EditRef.getDetail(row.id)
        }
      })
    },
    handleDel(row) {
      let message = `确认删除该记录吗?`
admin/src/views/login.vue
@@ -3,8 +3,8 @@
    <img src="@/assets/images/bg@2x.png" class="main_bg" alt="">
    <div class="login_wrap">
      <div class="login_img">
        <!-- <div class="h2">阜宁文体中心</div> -->
        <div class="h3">智慧场馆运维管理系统</div>
         <div class="h3">阜宁文体中心</div>
<!--        <div class="h3">智慧场馆运维管理系统</div>-->
      </div>
      <div class="form_wrap">
        <div class="tabs">
admin/src/views/workorder/components/OperaYwWorkorderWindow.vue
@@ -49,7 +49,7 @@
              <i class="el-icon-plus avatar-uploader-icon"></i>
              <div>图片/视频</div>
            </div>
          </el-upload>
          </el-upload>
          <div v-for="(item, i) in fileList" :key="i" class="item">
            <i @click="handleDelImg(i)" class="el-icon-error close"></i>
            <el-image :src="item.fileurlFull" :preview-src-list="[item.fileurlFull]" v-if="item.type == 0"
admin/src/views/workorder/components/detail.vue
@@ -178,7 +178,7 @@
      uploadImgUrl: process.env.VUE_APP_API_PREFIX + '/visitsAdmin/cloudService/public/uploadBatch',
      dealFileList: [],
      uploadData: {
        folder: 'HIDDEN_DANGER_FILE'
        folder: 'YW_WORKORDER_FILE'
      },
    }
  },
h5/api/index.js
@@ -1,6 +1,7 @@
import { http } from '@/utils/service.js'
export * from '@/utils/config.js'
export * from './staff'
export * from './yw'
@@ -16,14 +17,6 @@
  return http({
    url: 'visitsAdmin/cloudService/web/visitor/wxAuthorize',
    method: 'get',
    data
  })
}
//  å‘送短信验证码
export const sendSms = (data) => {
  return http({
    url: 'visitsAdmin/cloudService/business/smsEmail/sendSms',
    method: 'post',
    data
  })
}
h5/api/staff.js
@@ -3,53 +3,29 @@
// login
export const loginPost = (data) => {
  return http({
    url: 'loginH5',
    url: 'loginByPhone',
    method: 'post',
    data
  })
}
export const loginCaptcha = () => {
export const sendSMsPost = (data) => {
  return http({
    url: 'captcha',
    method: 'get'
    url: 'visitsAdmin/cloudService/business/smsEmail/sendSms',
    method: 'post',
    data
  })
}
// åˆ·æ–°token
export const refreshToken = () => {
export const findInternalList = (data) => {
  return http({
    url: 'refreshtoken',
    method: 'post'
    url: 'visitsAdmin/cloudService/system/user/findInternalList',
    method: 'post',
    data
  })
}
export const getUserInfo = () => {
  return http({
    url: 'getUserInfo',
    method: 'get'
  })
}
// æŸ¥è¯¢äººå‘˜ç›¸å…³ä¿¡æ¯0劳务访客 1普通访客 2内部人员,示例值(1)
export const findTypeMemberInfo = (data) => {
  return http({
    url: 'visitsAdmin/cloudService/business/member/findTypeMemberInfo',
    // url: 'visitsAdmin/cloudService/business/member/page',
    method: 'post',
    data
  })
}
//  é‡ç½®å¯†ç 
export const resetPassword = (data) => {
  return http({
    url: 'visitsAdmin/cloudService/business/visits/resetPassword',
    method: 'post',
    data
  })
}
//  ä¿®æ”¹å¯†ç 
export const uploadPassword = (data) => {
  return http({
    url: 'visitsAdmin/cloudService/business/member/updatePwd',
    method: 'post',
    data
  })
}
// loginout
@@ -61,172 +37,3 @@
  })
}
//  é𐿂£éšæ‰‹æ‹ åˆ›å»º
export const DangerCreate = (data) => {
  return http({
    url: 'visitsAdmin/cloudService/business/hiddenDanger/create',
    method: 'post',
    data
  })
}
// é𐿂£åŒºåŸŸ
export const DangerArea = (data) => {
  return http({
    url: 'visitsAdmin/cloudService/business/hiddenDanger/create',
    method: 'post',
    data
  })
}
// é𐿂£ è¯¦æƒ…
export const hiddenDangerDetail = (id) => {
  return http({
    url:  `visitsAdmin/cloudService/business/hiddenDanger/${id}`,
    method: 'get'
  })
}
// éƒ¨é—¨åˆ—表
export const deptListPost = (data) => {
  return http({
    url: '/visitsAdmin/cloudService/business/company/list',
    method: 'post',
    data
  })
}
// é𐿂£ ç±»åž‹
export const DangerConfigType = (data) => {
  return http({
    url: 'visitsAdmin/cloudService/business/hiddenDangerParam/list',
    method: 'post',
    data
  })
}
// é𐿂£ æŸ¥è¯¢åŒºåŸŸå†…安全员
export const findHiddenAreaMemberList = (data) => {
  return http({
    url: 'visitsAdmin/cloudService/business/hiddenDangerParam/findHiddenAreaMemberList',
    method: 'post',
    data
  })
}
// é𐿂£ å¤„理
export const dealHiddenDanger = (data) => {
  return http({
    url: 'visitsAdmin/cloudService/business/hiddenDanger/dealHiddenDanger',
    method: 'post',
    data
  })
}
// é𐿂£ è½¬äº¤
export const transferHiddenDanger = (data) => {
  return http({
    url: 'visitsAdmin/cloudService/business/hiddenDanger/transferHiddenDanger',
    method: 'post',
    data
  })
}
// é𐿂£ æµç¨‹åˆ—表
export const findListFlowDanger = (data) => {
  return http({
    url: 'visitsAdmin/cloudService/business/hiddenDangerLog/findList',
    method: 'post',
    data
  })
}
// è½¦è¾† åˆ—表
export const getCarsList = (data) => {
  return http({
    url: 'visitsAdmin/cloudService/business/cars/list',
    method: 'post',
    data
  })
}
// æŸ¥è¯¢è½¦è¾†å¯é¢„约时段
export const carCanReservationDate = (data) => {
  return http({
    url: 'visitsAdmin/cloudService/business/carUseBook/carCanReservationDate',
    method: 'get',
    data
  })
}
// æŸ¥è¯¢è½¦è¾† é¢„约记录
export const carUseBookList = (data) => {
  return http({
    url: 'visitsAdmin/cloudService/business/carUseBook/carUseBookList',
    method: 'post',
    data
  })
}
// ç”¨è½¦ç”³è¯·æäº¤
export const carUseBookCraete = (data) => {
  return http({
    url: 'visitsAdmin/cloudService/business/carUseBook/create',
    method: 'post',
    data
  })
}
// æŸ¥è¯¢è½¦è¾† æ´¾è½¦è®°å½•
export const carUseBookPaiche = (data) => {
  return http({
    url: 'visitsAdmin/cloudService/business/carUseBook/page',
    method: 'post',
    data
  })
}
// æŸ¥è¯¢è½¦è¾† æ´¾è½¦è®°å½• è¯¦æƒ…
export const carUseBookDetail = (id) => {
  return http({
    url: 'visitsAdmin/cloudService/business/carUseBook/'+id,
    method: 'get'
  })
}
//  å®¡æ‰¹
export const carUseBookAppr = (data) => {
  return http({
    url: 'visitsAdmin/cloudService/business/approve/approved',
    method: 'post',
    data
  })
}
// æŸ¥è¯¢è½¦è¾† æ´¾è½¦è®°å½• æ’¤é”€ç”³è¯·
export const carUseBookBack = (data) => {
  return http({
    url: 'visitsAdmin/cloudService/business/carUseBook/revoke',
    method: 'get',
    data
  })
}
// æŸ¥è¯¢è½¦è¾† å¸æœºåˆ—表
export const driveListPost = (data) => {
  return http({
    url: 'visitsAdmin/cloudService/business/member/driveList',
    method: 'post',
    data
  })
}
//  ä»»åŠ¡ä¸­å¿ƒ å¤´éƒ¨æ•°æ®
export const stagingHead = (data) => {
  return http({
    url: 'visitsAdmin/cloudService/business/staging/taskCenterHead',
    method: 'get',
    data
  })
}
//  ä»»åŠ¡ä¸­å¿ƒ åˆ†é¡µæ•°æ®
export const stagingTaskPage = (data) => {
  return http({
    url: 'visitsAdmin/cloudService/business/staging/taskPage',
    method: 'post',
    data
  })
}
//  ä»»åŠ¡ä¸­å¿ƒ æ ‡è®°å·²è¯»
export const signReadTask = (data) => {
  return http({
    url: 'visitsAdmin/cloudService/business/staging/signRead',
    method: 'get',
    data
  })
}
h5/api/yw.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,73 @@
import { http } from '@/utils/service.js'
// å·¥å•列表
export const ywWorkorder = (data) => {
  return http({
    url: 'visitsAdmin/cloudService/business/ywWorkorder/page',
    data
  })
}
// å·¥å•详情
export const ywWorkorderD = (id) => {
  return http({
    url: 'visitsAdmin/cloudService/business/ywWorkorder/' + id,
        method: 'get'
  })
}
// å·¥å•处理
export const ywWorkorderDeal = (data) => {
  return http({
    url: 'visitsAdmin/cloudService/business/ywWorkorder/dealOrder',
    data
  })
}
// åˆ›å»ºå·¥å•
export const ywWorkorderCreate = (data) => {
  return http({
    url: 'visitsAdmin/cloudService/business/ywWorkorder/create',
    data
  })
}
// é¡¹ç›®åˆ—表
export const ywProjectPost = (data) => {
  return http({
    url: 'visitsAdmin/cloudService/business/ywProject/list',
    data
  })
}
// æ¥¼å®‡åˆ—表
export const ywBuildingPost = (data) => {
  return http({
    url: 'visitsAdmin/cloudService/business/ywBuilding/list',
    data
  })
}
// æ¥¼å±‚列表
export const ywFloorPost = (data) => {
  return http({
    url: 'visitsAdmin/cloudService/business/ywFloor/list',
    data
  })
}
// æˆ¿æºåˆ—表
export const ywRoomPost = (data) => {
  return http({
    url: 'visitsAdmin/cloudService/business/ywRoom/list',
    data
  })
}
// è¿ç»´è®°å½•
export const ywDeviceRecord = (data) => {
  return http({
    url: 'visitsAdmin/cloudService/business/ywDeviceRecord/page',
    data
  })
}
// è¿ç»´è®°å½•详情
export const ywDeviceDetail = (id) => {
  return http({
    url: 'visitsAdmin/cloudService/business/ywDeviceRecord/' + id,
    method: 'get'
  })
}
h5/manifest.json
@@ -129,9 +129,9 @@
                "/gateway_interface" : {
                    // è¿™ä¸ªå­—段名需与你配置的basePrefixUrl一致,系统识别到带有/dev-api请求的地址时,会在前面拼接上代理服务器地址
                    // "target" : "http://172.20.10.7:10010", // ä»£ç†æœåŠ¡å™¨åŸŸåæˆ–IP地址
                    // "target" : "http://192.168.0.100:10010", // ä»£ç†æœåŠ¡å™¨åŸŸåæˆ–IP地址
                    "target" : "http://192.168.0.108:10030", // ä»£ç†æœåŠ¡å™¨åŸŸåæˆ–IP地址
                    // "target" : "http://10.50.250.253:8088/gateway_interface", // ä»£ç†æœåŠ¡å™¨åŸŸåæˆ–IP地址
                    "target" : "http://192.168.0.173/gateway_interface", // ä»£ç†æœåŠ¡å™¨åŸŸåæˆ–IP地址
                    // "target" : "http://192.168.0.173/gateway_interface", // ä»£ç†æœåŠ¡å™¨åŸŸåæˆ–IP地址
                    "changeOrigin" : true, // å…è®¸è·¨åŸŸ 
                    "pathRewrite" : {
                        "^/gateway_interface" : ""
h5/pages.json
@@ -2,17 +2,18 @@
    "easycom": {
        "^u-(.*)": "uview-ui/components/u-$1/u-$1.vue"
    },
    "pages": [{
    "pages": [
        {
            "path": "pages/login",
            "style": {
                "navigationBarTitleText": "登录"
            }
        },
        {
            "path": "pages/index",
            "style": {
                "navigationBarTitleText": "首页",
                "enablePullDownRefresh": false
            }
        },
        {
            "path": "pages/login",
            "style": {
                "navigationBarTitleText": "登录"
            }
        },
        {
@@ -75,6 +76,13 @@
            {
                "navigationBarTitleText" : "巡检点"
            }
        },
        {
            "path" : "pages/common/memberSel",
            "style" :
            {
                "navigationBarTitleText" : "选择人员"
            }
        }
    ],
    "globalStyle": {
h5/pages/common/memberSel.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,256 @@
<template>
    <view class="main_app">
        <view class="search_inp df_ac">
            <image class="mr12 search" src="@/static/home/ic_search@2x.png" mode="widthFix"></image>
            <input v-model="param.name" @blur="initData()" type="text" placeholder="请输入姓名进行搜索"
                placeholder-style="color: #999999;" />
        </view>
        <view class="member_list">
            <view v-for="item in memberList" @click="onSubmit(item)" :key="item.id" class="line">
                <image v-if="item.faceImgFull" :src="item.faceImgFull" class="avatar"></image>
                <span v-else class="img_name">{{item.realname && item.realname.slice(0,1)}}</span>
                <view class="content">
                    <view class="info">
                        <text class="name">{{ item.realname }}</text>
                        <!-- <text class="tag">tag</text> -->
                    </view>
                    <view class="depart">{{ item.companyName }}</view>
                </view>
                <text></text>
            </view>
            <view v-if="memberList.length == 0" class="empty_wrap">
                <image src="@/static/empty.png"></image>
                <text>暂无数据</text>
            </view>
        </view>
        <!--  -->
    </view>
</template>
<script>
    import {
        findInternalList
    } from '@/api'
    export default {
        data() {
            return {
                memberList: [],
                selList: [],
                param: {},
                isShowSelMem: false
            }
        },
        onLoad() {
            this.initData()
        },
        methods: {
            onSubmit(item) {
                this.$eventBus.$emit('memberSel', { realname: item.realname, id: item.id })
                uni.navigateBack()
            },
            changeMem(e) {
                console.log(e.detail.value[0]);
                const id = Number(e.detail.value[0])
                const item = this.memberList.find(i => i.id === id)
                this.$eventBus.$emit('snapshotSel', item)
                uni.navigateBack()
            },
            initData() {
                const {
                    param
                } = this
                findInternalList({
                    realname: param.name,
                    id: param.id
                }).then(res => {
                    this.memberList = res.data || []
                })
            }
        }
    };
</script>
<style lang="scss">
    .modal {
        padding: 40rpx 30rpx;
        .modal_header {
            display: flex;
            justify-content: space-between;
            align-items: center;
            .status {
                font-weight: 600;
            }
            .btn {
                color: $uni-color-primary;
            }
        }
        .modal_mem_list {
            .line {
                display: flex;
                align-items: center;
                border-bottom: 1rpx solid #e5e5e5;
                padding: 30rpx 0;
                .avatar {
                    width: 64rpx;
                    height: 64rpx;
                    border-radius: 50%;
                    overflow: hidden;
                    margin-right: 20rpx;
                }
                .content {
                    flex: 1;
                    .depart {
                        font-size: 24rpx;
                        color: #666666;
                    }
                    .info {
                        display: flex;
                        margin-bottom: 16rpx;
                        .name {
                            font-size: 30rpx;
                        }
                    }
                }
                .btn {
                    width: 80rpx;
                    height: 48rpx;
                    line-height: 48rpx;
                    text-align: center;
                    font-size: 24rpx;
                    color: #333333;
                    border-radius: 4rpx;
                    border: 1rpx solid #999999;
                }
            }
        }
    }
    .sub_wrap {
        position: absolute;
        bottom: 0;
        left: 0;
        width: 100%;
        box-shadow: 0rpx 0rpx 6rpx 0rpx #b2b2b2;
        padding: 30rpx 30rpx 64rpx;
        .sel_mem {
            display: flex;
            align-items: center;
            .members {
                width: 500rpx;
                color: $uni-color-primary;
                white-space: nowrap;
                overflow: hidden; //文本超出隐藏
                text-overflow: ellipsis;
                margin-right: 20rpx;
            }
            .open_icon {
                width: 44rpx;
                height: 44rpx;
            }
        }
        .btn {
            width: 690rpx;
            height: 88rpx;
            line-height: 88rpx;
            background: $uni-color-primary;
            border-radius: 44rpx;
            color: #fff;
            text-align: center;
            margin-top: 22rpx;
        }
    }
    .member_list {
        .line {
            display: flex;
            align-items: center;
            border-bottom: 1rpx solid #e5e5e5;
            padding: 30rpx 0;
            .avatar {
                width: 64rpx;
                height: 64rpx;
                border-radius: 50%;
                overflow: hidden;
                margin-right: 20rpx;
            }
            .img_name {
                width: 64rpx;
                height: 64rpx;
                line-height: 64rpx;
                text-align: center;
                border-radius: 50%;
                overflow: hidden;
                margin-right: 20rpx;
                background: $uni-color-primary;
                color: #fff;
                border: 1rpx solid $uni-color-primary;
            }
            .content {
                flex: 1;
                .depart {
                    font-size: 24rpx;
                    color: #666666;
                }
                .info {
                    display: flex;
                    margin-bottom: 16rpx;
                    .name {
                        font-size: 30rpx;
                    }
                    .tag {
                        font-size: 24rpx;
                        border-radius: 4rpx;
                        border: 1rpx solid #f62710;
                        color: #f62710;
                        padding: 0rpx 6rpx;
                        margin-left: 8rpx;
                    }
                }
            }
        }
        .empty {
            width: 100%;
            height: 280rpx;
        }
    }
    .search_inp {
        height: 72rpx;
        background: #f7f7f7;
        border-radius: 4rpx;
        padding-left: 16rpx;
        .search {
            width: 28rpx;
        }
        input {
            flex: 1;
            font-size: 28rpx;
            color: #333333;
        }
    }
</style>
h5/pages/index.vue
@@ -1,6 +1,6 @@
<template>
    <view class="main_app">
        <view class="hone_name title">{{ userInfo.name }},欢迎登录</view>
        <view class="hone_name title">{{ userInfo.realname }},欢迎登录</view>
        <view class="home_con">
            <image class="bg" src="@/static/home/home_bg.jpg" mode=""></image>
            <view class="h1">阜宁文体中心</view>
@@ -20,19 +20,21 @@
                <view class="name">{{item.name}}</view>
            </view>
        </view>
        <view class="loginout" @click="loginOut">退出登陆</view>
    </view>
</template>
<script>
<script>
    import { logoutPost } from '@/api'
    export default {
        data() {
            return {
                userInfo: uni.getStorageSync('userInfo') || {},
                list1: [{
                        name: '扫码巡检',
                        url: '',
                        img: require('@/static/home/ic_fangkebaobei@2x.png'),
                list1: [
                    {
                        name: '新增工单',
                        url: '/pages/workOrder/edit',
                        img: require('@/static/home/ic_xinzenggongdan@2x.png'),
                        auth: 'weixin:menu:visitcar'
                    },
                    {
@@ -72,7 +74,14 @@
                    url: item.url
                })
            },
            loginOut() {
                this.$store.commit('empty')
                logoutPost()
                uni.redirectTo({
                    url: '/pages/login'
                })
            },
        }
    }
</script>
@@ -131,5 +140,21 @@
                }
            }
        }
        .loginout {
            position: fixed;
            bottom: 88rpx;
            left: 50%;
            transform: translate(-50%, 0);
            width: 152rpx;
            height: 60rpx;
            border-radius: 30rpx;
            border: 1rpx solid $primaryColor;
            color: $primaryColor;
            font-size: 26rpx;
            display: flex;
            justify-content: center;
            align-items: center;
        }
    }
</style>
h5/pages/login.vue
@@ -5,16 +5,17 @@
    <view class="login_list">
      <view class="login_list_item">
        <image src="@/static/login_ic_phone@2x.png" mode="widthFix" />
        <input v-model="form.username" maxlength="18" placeholder="请输入手机号" />
        <input v-model="form.phone" maxlength="18" placeholder="请输入手机号" />
      </view>
<!--      <view class="login_list_item">
<!--     <view class="login_list_item">
        <image src="@/static/login_ic_password@2x.png" mode="widthFix" />
        <input v-model="form.password" type="password" placeholder="密码" />
      </view> -->
      <view class="login_list_item">
     <view class="login_list_item">
        <image src="@/static/login_ic_password@2x.png" mode="widthFix"></image>
        <input v-model="form.code" placeholder="请输入验证码" type="text" />
        <view class="btn">获取验证码</view>
        <view v-if="downTime == 0" class="btn" @click="sendSms">获取验证码</view>
        <view v-else class="btn gray">{{ downTime }}</view>
      </view>
    </view>
    <view class="login_btn">
@@ -24,7 +25,7 @@
</template>
<script>
import { loginPost, loginCaptcha, getUserInfo, getSystemDictData } from '@/api'
import { loginPost, getUserInfo, sendSMsPost } from '@/api'
import { mapState, mapMutations } from 'vuex'
export default {
  name: 'login',
@@ -32,20 +33,14 @@
  data() {
    return {
      form: {
        // username: '18056814089',
        username: '',
        password: '',
                code: ''
                phone: '17878787878',
                code: '1'
      },
      isShowProtocol: false,
      ProtocolFlag: false,
      captcha: {},
      htmlText: ''
            downTime: 0
    }
  },
  onLoad() {
    this.initCaptcha()
  },
  onBackPress(options) {
    uni.redirectTo({
@@ -55,39 +50,28 @@
  },
  methods: {
    ...mapMutations(["setToken", "setUserInfo"]),
    changeFalg() {
      this.ProtocolFlag = !this.ProtocolFlag
    },
    getContent() {
      getSystemDictData({
        dictCode: 'SYSTEM',
        label: 'USER_PROTOCOL'
      }).then(res => {
        this.htmlText = res.data.code
        this.isShowProtocol = true
      })
    },
    showContent() {
      this.getContent()
    },
    initCaptcha() {
      loginCaptcha().then(res => {
        this.captcha = res.data
      })
    },
        sendSms() {
            this.downTime = 60
            let timer = setInterval(() => {
                if(this.downTime == 0) return clearInterval(timer)
                this.downTime = this.downTime - 1
            }, 1000)
            const { form } = this
            sendSMsPost({
                phone: form.phone,
                type: 0
            }).then(res => {
                this.showToast('短信发送成功')
            })
        },
    onLogin() {
      const { form, ProtocolFlag } = this
      if (!ProtocolFlag) return uni.showToast({
        title: '请先阅读并同意用户协议',
        icon: 'none'
      })
      if (!form.username) return uni.showToast({
        title: '账号不能为空',
        icon: 'none'
      })
      if (!form.password) return uni.showToast({
        title: '密码不能为空',
      // if (!ProtocolFlag) return uni.showToast({
      //   title: '请先阅读并同意用户协议',
      //   icon: 'none'
      // })
      if (!form.phone) return uni.showToast({
        title: '手机号不能为空',
        icon: 'none'
      })
      if (!form.code) return uni.showToast({
@@ -96,15 +80,15 @@
      })
      loginPost({
        ...form,
        uuid: this.captcha.uuid,
        openId: this.$store.state.openId
      }).then(res => {
        if (res.code === 200) {
          this.setToken(res.data)
                    this.showToast('登录成功')
          getUserInfo().then(ress => {
            this.setUserInfo(ress.data)
            uni.redirectTo({
              url: "/pages/staff/index"
              url: "/pages/index"
            })
          })
        }
@@ -162,7 +146,11 @@
      .btn{
          width: 145rpx;
          color:  $primaryColor;
                text-align: center;
      }
            .gray{
                color: #999999;
            }
      input {
        flex: 1;
        height: 100%;
h5/pages/operation/detail.vue
@@ -2,31 +2,47 @@
    <view>
        <view class="content">
            <view class="name_wrap">
                <view class="name">xx设备</view>
                <view class="status red">正常</view>
                <view class="name">{{info.deviceName}}</view>
                <view class="status" v-if="info.status == 0">正常</view>
                <view class="status red" v-if="info.status == 1">损坏</view>
                <view class="status red" v-if="info.status == 2">报废</view>
            </view>
            <view class="line">运维人:xxx</view>
            <view class="line">运维时间:121212</view>
            <view class="line">运维人:{{info.realName}}</view>
            <view class="line">运维时间:{{info.createDate}}</view>
        </view>
        <!--  -->
        <view class="remark">
            <view class="title">运维备注</view>
            <view class="file_list">
                <view class="file">
                <view class="file" v-for="item in info.multifileList">
                    <image v-if="item.type == 0" :src="item.fileurlFull" mode="widthFix"></image>
                    <video v-if="item.type == 1" :src="item.fileurlFull" :controls="false"></video>
                </view>
            </view>
            <view class="desc">remark</view>
            <view class="desc">{{info.content}}</view>
        </view>
    </view>
</template>
<script>
<script>
    import { ywDeviceDetail } from '@/api'
    export default {
        data() {
            return {
                id: '',
                info: {}
            };
        },
        onLoad(option) {
            this.id = option.id
            this.getDetail()
        },
        methods: {
            getDetail() {
                ywDeviceDetail(this.id).then(res => {
                    this.info = res.data
                })
            }
        }
    }
</script>
@@ -81,6 +97,9 @@
                    margin-right: 0;
                }
            }
            image,video{
                width: 156rpx;
            }
        }
        .desc{
            margin-top: 8rpx;
h5/pages/operation/record.vue
@@ -3,64 +3,113 @@
        <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" />
                <input v-model="param.keyword" @confirm="getList()" type="text" placeholder="搜索设备名称/编号"
                    placeholder-class="placeholder9" />
            </view>
            <view class="name_wrap" @click="showModal = true">
                <view class="name">运维人</view>
            <view class="name_wrap" @click="handleMem">
                <view class="name">{{ param.realname ? param.realname : '运维人' }}</view>
                <u-icon :name="showModal  ? 'arrow-right' : 'arrow-down'" color="#999999" size="12"></u-icon>
            </view>
        </view>
        <!--  -->
        <view class="list">
            <view class="item" v-for="item in 10" @click="itemClick(item)">
            <view class="item" v-for="item in list" @click="itemClick(item)">
                <image src="@/static/side/ic_shuiyu@2x.png" class="icon"></image>
                <view class="content">
                    <view class="name_wrap">
                        <view class="name">
                            <text class="device">xx设备</text>
                            <text>D20231</text>
                            <text class="device">{{item.deviceName}}</text>
                            <text>{{item.deviceCode}}</text>
                        </view>
                        <view class="status red">正常</view>
                        <view class="status" v-if="item.status == 0">正常</view>
                        <view class="status red" v-if="item.status == 1">损坏</view>
                        <view class="status red" v-if="item.status == 2">报废</view>
                    </view>
                    <view class="line">运维人:xxx</view>
                    <view class="line">运维时间:121212</view>
                    <view class="line">运维人:{{item.realName}}</view>
                    <view class="line">运维时间:{{item.dealDate}}</view>
                </view>
            </view>
        </view>
        <!--  -->
        <u-picker :show="showModal" keyName="name" @cancel="showModal = false" @confirm='confirm'
        <u-picker :show="showModal" keyName="realname" @cancel="showModal = false" @confirm='confirm'
            :columns="columns"></u-picker>
    </view>
</template>
<script>
    import {
        ywDeviceRecord,
        findInternalList
    } from '@/api'
    export default {
        data() {
            return {
                param: {},
                columns: [],
                showModal: false
                showModal: false,
                list: [],
                total: 0,
                page: 1,
            };
        },
        methods: {
            getList() {},
        onLoad() {
            this.getpeo()
            this.getList()
        },
        mounted() {
            this.$eventBus.$on('memberSel', (option) => {
                this.$set(this.param, 'realname', option.realname)
                this.$set(this.param, 'memberId', option.id)
                this.getList()
            })
        },
        methods: {
            getList() {
                const {
                    page,
                    total,
                    list,
                    param
                } = this
                ywDeviceRecord({
                    page,
                    capacity: 10,
                    model: param
                }).then(res => {
                    this.list = res.data.records || []
                    this.total = res.data.total
                })
            },
            handleMem() {
                uni.navigateTo({
                    url: '/pages/common/memberSel'
                })
            },
            getpeo() {
                findInternalList().then(res => {
                    this.columns = [res.data]
                })
            },
            confirm() {
                this.showModal = false
            },
            itemClick() {
                uni.navigateTo({
                    url: '/pages/operation/detail'
                })
            },
            itemClick(item) {
                uni.navigateTo({
                    url: '/pages/operation/detail?id='+ item.id
                })
            }
        }
    }
</script>
<style lang="scss" scoped>
    .main_app{
        padding: 0 30rpx;
<style lang="scss" scoped>
    .main_app {
        padding: 0 30rpx;
    }
    .head_wrap {
        display: flex;
        align-items: center;
@@ -73,9 +122,11 @@
            background: #F7F7F7;
            border-radius: 38rpx;
            padding-left: 30rpx;
            input{
                flex: 1;
            input {
                flex: 1;
            }
            .search {
                width: 28rpx;
                height: 28rpx;
@@ -94,39 +145,44 @@
    .list {
        .item {
            display: flex;
            height: 228rpx;
            padding: 30rpx 0;
            height: 228rpx;
            padding: 30rpx 0;
            border-bottom: 2rpx solid #E5E5E5;
            .icon {
                width: 80rpx;
                height: 80rpx;
                height: 80rpx;
                margin-right: 24rpx;
            }
            .content {
                flex: 1;
                color: #666666;
                display: flex;
                flex-direction: column;
                justify-content: space-between;
                .name_wrap{
                    display: flex;
                    justify-content: space-between;
                    align-items: center;
                    .name{
                        display: flex;
                        align-items: flex-end;
                        font-size: 26rpx;
                        .device{
                            font-weight: 600;
                            font-size: 34rpx;
                            color: #222222;
                            margin-right: 6rpx;
                        }
                    }
                    .status{
                        color: $primaryColor;
                    }
                flex: 1;
                color: #666666;
                display: flex;
                flex-direction: column;
                justify-content: space-between;
                .name_wrap {
                    display: flex;
                    justify-content: space-between;
                    align-items: center;
                    .name {
                        display: flex;
                        align-items: flex-end;
                        font-size: 26rpx;
                        .device {
                            font-weight: 600;
                            font-size: 34rpx;
                            color: #222222;
                            margin-right: 6rpx;
                        }
                    }
                    .status {
                        color: $primaryColor;
                    }
                }
            }
        }
h5/pages/workOrder/detail.vue
@@ -2,59 +2,63 @@
    <view>
        <view class="main_info">
            <view class="title">
                <text>阜宁文体中心/A座/401</text>
                <text class="status">待处理</text>
                <text>{{ info.projectName }}/{{ info.buildingName }}/{{info.roomNum || info.floorName}}</text>
                <text class="status" v-if="info.dealStatus == 0">待处理</text>
                <text class="status" v-if="info.dealStatus == 1">已指派</text>
                <text class="status gray" v-if="info.dealStatus == 2">已处理</text>
            </view>
            <view class="desc">西边走廊的一个顶灯坏了,不亮需要维修西边</view>
            <view class="desc">{{ info.content }}</view>
            <view class="file_list">
                <view class="file">
                <view class="file" v-for="(item,index) in info.fileList">
                    <image v-if="item.type == 0" :src="item.fileurlFull" mode="widthFix"></image>
                    <video v-if="item.type == 1" :src="item.fileurlFull" :controls="false"></video>
                </view>
            </view>
            <view class="content">
                <view class="line">
                <view class="line" v-if="info.categoryName">
                    <view class="la">工单类型:</view>
                    <view class="val">1111</view>
                    <view class="val">{{info.categoryName}}</view>
                </view>
                <view class="line">
                    <view class="la">上报人:</view>
                    <view class="val">1111</view>
                    <view class="val">{{ info.creatorName }}{{info.creatorCompany ? '-' + info.creatorCompany : ''}}</view>
                </view>
                <view class="line">
                <view class="line"  v-if="info.creatorPhone">
                    <view class="la">联系电话:</view>
                    <view class="val">1111</view>
                    <view class="val">{{ info.creatorPhone }}</view>
                </view>
                <view class="line">
                    <view class="la">上报时间:</view>
                    <view class="val">1111</view>
                    <view class="val">{{ info.createDate }}</view>
                </view>
                <view class="line">
                <view class="line" v-if="info.getDate">
                    <view class="la">上门时间:</view>
                    <view class="val">1111</view>
                    <view class="val">{{ info.getDate }}</view>
                </view>
            </view>
            <view class="result_wrap">
            <view class="result_wrap" v-if="info.dealStatus == 2">
                <div class="title">处理结果</div>
                <view class="file_list">
                    <view class="file">
                <view v-if="info.dealFileList && info.dealFileList.length > 0" class="file_list">
                    <view class="file" v-for="item in info.dealFileList">
                        <image v-if="item.type == 0" :src="item.fileurlFull" mode="widthFix"></image>
                        <video v-if="item.type == 1" :src="item.fileurlFull" :controls="false"></video>
                    </view>
                </view>
                <view class="content">
                    å·²æ›´æ¢ç¯æ³¡å’Œç¯ç½©å·²æ›´æ¢ç¯æ³¡å’Œç¯ç½©å·²æ›´æ¢ç¯
                <view v-if="info.dealInfo" class="content">
                    {{info.dealInfo}}
                </view>
                <view class="line">
                    <view class="la">处理人:</view>
                    <view class="val">{{ 1111 }}</view>
                    <view class="val">{{ info.dealUserName }}</view>
                </view>
                <view class="line">
                    <view class="la">处理时间:</view>
                    <view class="val">{{ 1111 }}</view>
                    <view class="val">{{ info.dealDate }}</view>
                </view>
            </view>
        </view>
        <!--  -->
        <view class="btns">
        <view class="btns" v-if="info.dealStatus == 0">
            <view class="btn">
                <image src="@/static/side/phoneed.png" class="icon"></image>
                <text>上报人</text>
@@ -62,7 +66,7 @@
            <view class="btn active" @click="isShowHandle = true">去处理</view>
        </view>
        <!--  -->
        <u-popup :show="showUpload" @close="showUpload = false" closeOnClickOverlay>
        <u-popup :show="showUpload" @close="showUpload = false" zIndex="10076" closeOnClickOverlay>
            <view class="sel_upload_wrap">
                <view class="btn" @click="uploadImage">选择图片</view>
                <view class="btn" @click="uploadVideo">选择视频</view>
@@ -70,11 +74,12 @@
        </u-popup>
        <!--  -->
        <!-- å·¥å•处理 -->
        <u-popup :show="isShowHandle" :round="10" :safeAreaInsetBottom="true" mode="bottom" closeable @close="isShowHandle = false">
        <u-popup :show="isShowHandle" :round="10" :safeAreaInsetBottom="true" mode="bottom" closeable
            @close="isShowHandle = false">
            <view class="appr_modal">
                <view class="title">工单处理</view>
                <view class="df_sb">
                    <view>处理时间</view>
                    <view><text class="red">*</text>处理时间</view>
                    <view class="df_ac" @click="isShowHandleDate = true" v-if="handleParam.dealTime">
                        {{ handleParam.dealTime }}
                        <u-icon name="arrow-right"></u-icon>
@@ -86,7 +91,6 @@
                </view>
                <view class="label">
                    <text>*</text>
                    ä¸Šä¼ å›¾ç‰‡/视频
                </view>
                <view class="upload_wrap">
@@ -119,12 +123,16 @@
<script>
    import {
        uploadUrl
        uploadUrl,
        ywWorkorderD,
        ywWorkorderDeal
    } from '@/api'
    import dayjs from 'dayjs';
    export default {
        data() {
            return {
                id: '',
                info: {},
                showUpload: false,
                isShowHandle: false,
                isShowHandleDate: false,
@@ -132,9 +140,30 @@
                dealFileList: []
            };
        },
        onLoad(option) {
            console.log(option);
            this.id = option.id
            this.getDetail()
        },
        methods: {
            onSubmit() {
            onSubmit() {
                const { handleParam, dealFileList, id } = this
                if (!handleParam.dealTime) return this.showToast('处理时间不能为空')
                ywWorkorderDeal({
                    ...handleParam,
                    id,
                    dealFileList
                }).then(res => {
                    if(res.code == 200){
                        this.showToast('操作成功')
                        uni.navigateBack()
                    }
                })
            },
            getDetail() {
                ywWorkorderD(this.id).then(res => {
                    this.info = res.data
                })
            },
            callPhone() {
                uni.makePhoneCall({
@@ -152,7 +181,7 @@
                this.showUpload = false;
                let token = uni.getStorageSync('token') || '';
                uni.chooseImage({
                    count: 4,
                    count: 6,
                    success: chooseImageRes => {
                        uni.showLoading({
                            title: '上传中',
@@ -170,7 +199,7 @@
                            files: imgs,
                            name: 'file',
                            formData: {
                                folder: 'HIDDEN_DANGER_FILE'
                                folder: 'YW_WORKORDER_FILE'
                            },
                            header: {
                                Dm_user_token: token
@@ -182,7 +211,7 @@
                                        i.type = 0;
                                        i.fileurl = i.imgaddr;
                                        i.fileurlFull = i.url;
                                        this.submitFileList.push(i);
                                        this.dealFileList.push(i);
                                    });
                                }
                            },
@@ -216,7 +245,7 @@
                            },
                            name: 'file',
                            formData: {
                                folder: 'HIDDEN_DANGER_FILE'
                                folder: 'YW_WORKORDER_FILE'
                            },
                            success: uploadFileRes => {
                                let res = JSON.parse(uploadFileRes.data);
@@ -225,7 +254,7 @@
                                        i.type = 1;
                                        i.fileurl = i.imgaddr;
                                        i.fileurlFull = i.url;
                                        this.submitFileList.push(i);
                                        this.dealFileList.push(i);
                                    });
                                }
                            },
@@ -264,6 +293,10 @@
                font-size: 28rpx;
                color: $primaryColor;
            }
            .gray {
                color: #999999;
            }
        }
        .file_list {
@@ -279,6 +312,11 @@
                &:nth-of-type(4n) {
                    margin-right: 0;
                }
                image,
                video {
                    width: 156rpx;
                }
            }
        }
@@ -368,7 +406,7 @@
    .sel_upload_wrap {
        width: 100%;
        border-top: 1px solid #333333;
        border-top: 1px solid #666666;
        box-shadow: 0 1 1 #333333;
        .btn {
h5/pages/workOrder/edit.vue
@@ -3,29 +3,30 @@
        <view class="list">
            <view class="item">
                <view class="la"><text class="red">*</text>位置类型</view>
                <view class="line sel_wrap">
                    <view class="left" :class="param.name ? '' : 'placeholder9'">{{ param.name ? param.name : '请选择' }}</view>
                <view class="line sel_wrap" @click="showModal0 = true">
                    <view class="left" :class="param.areaName ? '' : 'placeholder9'">{{ param.areaName ? param.areaName : '请选择' }}
                    </view>
                    <u-icon name="arrow-right" color="#999999" size="15"></u-icon>
                </view>
            </view>
            <view class="item">
                <view class="la"><text class="red">*</text>选择区域</view>
                <view class="line sel_wrap">
                    <view class="left" :class="param.name ? '' : 'placeholder9'">{{ param.name ? param.name : '请选择' }}</view>
                <view class="line sel_wrap" @click="showModal1 = true">
                    <view class="left" :class="param.projectName ? '' : 'placeholder9'">{{ param.projectName ? `${param.projectName} ${param.buildingName || ''} ${param.areaType == 0 ? param.roomName || '' : param.floorName || ''}` : '请选择' }}</view>
                    <u-icon name="arrow-right" color="#999999" size="15"></u-icon>
                </view>
            </view>
            <view class="item">
                <view class="la">上门时间</view>
                <view class="line sel_wrap">
                    <view class="left" :class="param.name ? '' : 'placeholder9'">{{ param.name ? param.name : '请选择' }}</view>
                <view class="line sel_wrap" @click="showTime = true">
                    <view class="left" :class="param.getDate ? '' : 'placeholder9'">{{ param.getDate ? param.getDate : '请选择' }}</view>
                    <u-icon name="arrow-right" color="#999999" size="15"></u-icon>
                </view>
            </view>
            <view class="item">
                <view class="la">描述</view>
                <view class="line">
                    <textarea v-model="param.checkInfo" placeholder="请输入" placeholder-class="placeholder9" />
                    <textarea v-model="param.content" placeholder="请输入" placeholder-class="placeholder9" />
                </view>
            </view>
            <view class="item">
@@ -35,16 +36,16 @@
                        <u-icon name="plus" color="rgb(153, 153, 153)" size="28"></u-icon>
                        <view class="mt6">图片/视频</view>
                    </view>
                    <view class="upload_file" v-for="(item, i) in dealFileList" :key="i">
                    <view class="upload_file" v-for="(item, i) in fileList" :key="i">
                        <u-icon class="close" size="20" name="close-circle-fill" color="red"
                            @click="fileDel('dealBeforeFileList', i)"></u-icon>
                        <image v-if="item.type == 0" :src="item.fileurlFull" mode="widthFix"></image>
                        <video v-if="item.type == 1" :src="item.fileurlFull" :controls="false"></video>
                    </view>
                </view>
            </view>
        </view>
        <view class="sub_btn">提交</view>
            </view>
        </view>
        <view class="sub_btn" @click="onSubmit">提交</view>
        <!--  -->
        <u-popup :show="showUpload" @close="showUpload = false" closeOnClickOverlay>
            <view class="sel_upload_wrap">
@@ -52,121 +53,252 @@
                <view class="btn" @click="uploadVideo">选择视频</view>
            </view>
        </u-popup>
        <!--  -->
        <u-picker :show="showModal0" keyName="name" @cancel="showModal0 = false" @confirm='confirm0'
            :columns="areaType"></u-picker>
        <!--  -->
        <u-picker :show="showModal1" keyName="name" @cancel="showModal1 = false" @confirm='confirm1'
            :columns="projectList"></u-picker>
        <u-picker :show="showModal2" keyName="name" @cancel="showModal2 = false" @confirm='confirm2'
            :columns="buildingList"></u-picker>
        <u-picker :show="showModal3" keyName="name" @cancel="showModal3 = false" @confirm='confirm3'
            :columns="floorList"></u-picker>
        <u-picker :show="showModal4" keyName="name" @cancel="showModal4 = false" @confirm='confirm4'
            :columns="roomList"></u-picker>
        <!--  -->
        <u-datetime-picker :minDate="new Date().getTime()" :show="showTime" @confirm="confirmDate"
            @cancel="showTime = false" mode="datetime"></u-datetime-picker>
    </view>
</template>
<script>
    import {
        uploadUrl
    } from '@/api'
<script>
    import {
        uploadUrl,
        ywProjectPost,
        ywBuildingPost,
        ywFloorPost,
        ywRoomPost,
        ywWorkorderCreate
    } from '@/api'
    import dayjs from 'dayjs';
    export default {
        data() {
            return {
                param: {},
                showUpload: false,
                dealFileList: [],
                fileList: [],
                showModal0: false,
                showModal1: false,
                showModal2: false,
                showModal3: false,
                showModal4: false,
                showTime: false,
                areaType: [
                    [{
                            name: '室内装修',
                            id: 0
                        },
                        {
                            name: '公共维修',
                            id: 1
                        }
                    ]
                ],
                projectList: [],
                buildingList: [],
                floorList: [],
                roomList: [],
            };
        },
        },
        onLoad() {
            this.getProject()
        },
        methods: {
            fileDel(str, i) {
                this[str].splice(i, 1);
            onSubmit() {
                const { param, fileList } = this
                ywWorkorderCreate({
                    ...param,
                    // roomId: '',
                    fileList
                }).then(res => {
                    this.showToast('提交成功')
                    uni.redirectTo({
                        url: '/pages/workOrder/list'
                    })
                })
            },
            confirm0(e) {
                const item = e.value[0]
                this.$set(this.param, 'areaType', item.id)
                this.$set(this.param, 'areaName', item.name)
                this.showModal0 = false
                this.param = {
                    areaType: item.id,
                    areaName: item.name,
                }
            },
            confirm1(e) {
                const item = e.value[0]
                this.showModal1 = false
                this.$set(this.param, 'projectName', item.name)
                this.$set(this.param, 'projectId', item.id)
                this.getBuilding(item.id)
                this.showModal2 = true
            },
            confirm2(e) {
                const item = e.value[0]
                this.showModal2 = false
                this.$set(this.param, 'buildingName', item.name)
                this.$set(this.param, 'buildingId', item.id)
                if (this.areaType == 0) {
                    this.getRoom(item.id)
                    this.showModal4 = true
                } else {
                    this.getFloor(item.id)
                    this.showModal3 = true
                }
            },
            uploadImage() {
                this.showUpload = false;
                let token = uni.getStorageSync('token') || '';
                uni.chooseImage({
                    count: 4,
                    success: chooseImageRes => {
                        uni.showLoading({
                            title: '上传中',
                            mask: true
                        });
                        const tempFilePaths = chooseImageRes.tempFilePaths;
                        let imgs = tempFilePaths.map((value, index) => {
                            return {
                                name: 'file',
                                uri: value
                            };
                        });
                        uni.uploadFile({
                            url: `${uploadUrl}`,
                            files: imgs,
                            name: 'file',
                            formData: {
                                folder: 'HIDDEN_DANGER_FILE'
                            },
                            header: {
                                Dm_user_token: token
                            },
                            success: uploadFileRes => {
                                let res = JSON.parse(uploadFileRes.data);
                                if (res.data && res.data.length > 0) {
                                    res.data.forEach(i => {
                                        i.type = 0;
                                        i.fileurl = i.imgaddr;
                                        i.fileurlFull = i.url;
                                        this.submitFileList.push(i);
                                    });
                                }
                            },
                            fail(err) {
                                console.log('err', err);
                            },
                            complete() {
                                uni.hideLoading();
                                // if (i === chooseImageRes.tempFilePaths.length - 1) {
                                //   uni.hideLoading()
                                // }
                            }
                        });
                    }
                });
            confirm3(e) {
                const item = e.value[0]
                this.showModal3 = false
                this.$set(this.param, 'floorName', item.name)
                this.$set(this.param, 'floorId', item.id)
            },
            uploadVideo() {
                this.showUpload = false;
                let token = uni.getStorageSync('token') || '';
                uni.chooseVideo({
                    success: chooseImageRes => {
                        uni.showLoading({
                            title: '上传中',
                            mask: true
                        });
                        uni.uploadFile({
                            url: `${uploadUrl}`,
                            filePath: chooseImageRes.tempFilePath,
                            header: {
                                Dm_user_token: token
                            },
                            name: 'file',
                            formData: {
                                folder: 'HIDDEN_DANGER_FILE'
                            },
                            success: uploadFileRes => {
                                let res = JSON.parse(uploadFileRes.data);
                                if (res.data && res.data.length > 0) {
                                    res.data.forEach(i => {
                                        i.type = 1;
                                        i.fileurl = i.imgaddr;
                                        i.fileurlFull = i.url;
                                        this.submitFileList.push(i);
                                    });
                                }
                            },
                            complete() {
                                uni.hideLoading();
                            }
                        });
                    }
                });
            }
            confirm4(e) {
                const item = e.value[0]
                this.showModal4 = false
                this.$set(this.param, 'roomName', item.name)
                this.$set(this.param, 'roomId', item.id)
            },
            confirmDate(e) {
                this.$set(this.param, 'getDate', dayjs(e.value).format('YYYY-MM-DD HH:mm:ss'));
                this.showTime = false
            },
            getProject() {
                ywProjectPost().then(res => {
                    this.projectList = [res.data || []]
                })
            },
            getBuilding(projectId) {
                ywBuildingPost({
                    projectId
                }).then(res => {
                    this.buildingList = [res.data || []]
                })
            },
            getFloor(buildingId) {
                ywFloorPost({
                    buildingId
                }).then(res => {
                    this.floorList = [res.data || []]
                })
            },
            getRoom(buildingId) {
                ywRoomPost({
                    buildingId
                }).then(res => {
                    this.roomList = [res.data || []]
                })
            },
            fileDel(str, i) {
                this[str].splice(i, 1);
            },
            uploadImage() {
                this.showUpload = false;
                let token = uni.getStorageSync('token') || '';
                uni.chooseImage({
                    count: 6,
                    success: chooseImageRes => {
                        uni.showLoading({
                            title: '上传中',
                            mask: true
                        });
                        const tempFilePaths = chooseImageRes.tempFilePaths;
                        let imgs = tempFilePaths.map((value, index) => {
                            return {
                                name: 'file',
                                uri: value
                            };
                        });
                        uni.uploadFile({
                            url: `${uploadUrl}`,
                            files: imgs,
                            name: 'file',
                            formData: {
                                folder: 'YW_WORKORDER_FILE'
                            },
                            header: {
                                Dm_user_token: token
                            },
                            success: uploadFileRes => {
                                let res = JSON.parse(uploadFileRes.data);
                                if (res.data && res.data.length > 0) {
                                    res.data.forEach(i => {
                                        i.type = 0;
                                        i.fileurl = i.imgaddr;
                                        i.fileurlFull = i.url;
                                        this.fileList.push(i);
                                    });
                                }
                            },
                            fail(err) {
                                console.log('err', err);
                            },
                            complete() {
                                uni.hideLoading();
                                // if (i === chooseImageRes.tempFilePaths.length - 1) {
                                //   uni.hideLoading()
                                // }
                            }
                        });
                    }
                });
            },
            uploadVideo() {
                this.showUpload = false;
                let token = uni.getStorageSync('token') || '';
                uni.chooseVideo({
                    success: chooseImageRes => {
                        uni.showLoading({
                            title: '上传中',
                            mask: true
                        });
                        uni.uploadFile({
                            url: `${uploadUrl}`,
                            filePath: chooseImageRes.tempFilePath,
                            header: {
                                Dm_user_token: token
                            },
                            name: 'file',
                            formData: {
                                folder: 'YW_WORKORDER_FILE'
                            },
                            success: uploadFileRes => {
                                let res = JSON.parse(uploadFileRes.data);
                                if (res.data && res.data.length > 0) {
                                    res.data.forEach(i => {
                                        i.type = 1;
                                        i.fileurl = i.imgaddr;
                                        i.fileurlFull = i.url;
                                        this.fileList.push(i);
                                    });
                                }
                            },
                            complete() {
                                uni.hideLoading();
                            }
                        });
                    }
                });
            }
        }
    }
</script>
<style lang="scss" scoped>
    .list {
    .list {
        .item {
            .la {
                margin-top: 30rpx;
@@ -216,9 +348,11 @@
                align-items: center;
                justify-content: center;
                position: relative;
                &:nth-of-type(4n){
                    margin-right: 0;
                &:nth-of-type(4n) {
                    margin-right: 0;
                }
                .close {
                    position: absolute;
                    right: -20rpx;
@@ -238,21 +372,33 @@
            }
        }
    }
    .sub_btn {
        position: fixed;
        bottom: 68rpx;
        left: 40rpx;
        width: 670rpx;
        height: 88rpx;
        background: $primaryColor;
        box-shadow: 0rpx 8rpx 20rpx 0rpx rgba(0, 104, 255, 0.3);
        border-radius: 44rpx;
        display: flex;
        align-items: center;
        justify-content: center;
        font-weight: 500;
        font-size: 32rpx;
        color: #FFFFFF;
    }
    .sub_btn{
        position: fixed;
        bottom: 68rpx;
        left: 40rpx;
        width: 670rpx;
        height: 88rpx;
        background: $primaryColor;
        box-shadow: 0rpx 8rpx 20rpx 0rpx rgba(0,104,255,0.3);
        border-radius: 44rpx;
        display: flex;
        align-items: center;
        justify-content: center;
        font-weight: 500;
        font-size: 32rpx;
        color: #FFFFFF;
    .sel_upload_wrap {
        width: 100%;
        border-top: 1px solid #666666;
        box-shadow: 0 1 1 #333333;
        .btn {
            height: 90rpx;
            line-height: 90rpx;
            text-align: center;
        }
    }
</style>
h5/pages/workOrder/list.vue
@@ -8,11 +8,11 @@
        </view>
        <!--  -->
        <view class="tabs">
            <view class="tab" :class="{active: activeTab == 0}" @click="tabsClick(0)">
            <view class="tab" :class="{active: activeTab == -1}" @click="tabsClick(-1)">
                <text>待处理</text>
                <text class="border"></text>
            </view>
            <view class="tab" :class="{active: activeTab == 1}" @click="tabsClick(1)">
            <view class="tab" :class="{active: activeTab == 2}" @click="tabsClick(2)">
                <text>已处理</text>
                <text class="border"></text>
            </view>
@@ -27,18 +27,20 @@
        </view>
        <!--  -->
        <view class="list">
            <view class="item" v-for="item in 10" @click="itemClick(item)">
            <view class="item" v-for="item in list" @click="itemClick(item)">
                <image v-if="item.stats == 1" src="@/static/side/workordered.png" class="icon"></image>
                <image v-else src="@/static/side/workorder.png" class="icon"></image>
                <view class="content">
                    <view class="name_wrap line">
                        <view class="name">A座/401</view>
                        <view class="status">已处理</view>
                        <view class="name">{{item.buildingName}}/{{item.roomNum}}</view>
                        <view class="status gray" v-if="item.dealStatus == 2">已处理</view>
                        <view class="status" v-if="item.dealStatus == 0">待处理</view>
                        <view class="status" v-if="item.dealStatus == 1">待处理</view>
                    </view>
                    <view class="line">工单类型:xxx</view>
                    <view class="line">报修物品:121212</view>
                    <view class="line">上报时间:121212</view>
                    <view class="line">上门时间:121212</view>
                    <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>
            </view>
        </view>
@@ -46,29 +48,50 @@
    </view>
</template>
<script>
<script>
    import { ywWorkorder } from '@/api'
    export default {
        data() {
            return {
                param: {},
                activeTab: 0,
                selectAll: false
                activeTab: -1,
                selectAll: false,
                list: [],
                total: 0,
                page: 1,
            };
        },
        onShow() {
            this.getList()
        },
        onReachBottom() {
        },
        methods: {
            tabsClick(val) {
                this.activeTab = val
                this.list = []
                this.page = 1
                this,getList()
            },
            allClick() {
                this.selectAll = !this.selectAll
            },
            itemClick() {
            itemClick(item) {
                uni.navigateTo({
                    url: '/pages/workOrder/detail'
                    url: `/pages/workOrder/detail?id=${item.id}`
                })
            },
            getList() {
                console.log('---');
                const { page, total, list, activeTab } = this
                ywWorkorder({
                    page,
                    capacity: 10,
                    model: {  }
                }).then(res => {
                    this.list = res.data.records || []
                })
            }
        }
    }
@@ -181,6 +204,9 @@
                    .status{
                        color: $primaryColor;
                    }
                    .gray{
                        color: #999999;
                    }
                }
            }
        }
h5/static/empty.png
h5/static/home/ic_xinzenggongdan@2x.png
h5/utils/service.js
@@ -15,7 +15,7 @@
            uni.request({
                url: baseUrl + options.url,
                data: options.data || {},
                method: options.method || 'GET',
                method: options.method || 'POST',
                header: options.header || {
                    // æ ¹æ®å®žé™…接口设计 key å– token æˆ–者 authorization
                    dm_user_token: token,