jiangping
2024-06-11 6bae45dfd31d647e4abc4e0246f495a29cc6896f
Merge remote-tracking branch 'origin/master'

# Conflicts:
# admin/src/views/task/index.vue
已修改9个文件
627 ■■■■■ 文件已修改
admin/src/views/business/deviceEvent.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/interfaceLog.vue 102 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/retention.vue 41 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/meeting/bookings.vue 83 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/system/InterfaceLog.vue 60 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/task/index.vue 46 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/App.vue 288 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/core/utils/FtpUtil.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/common/PublicCloudController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/deviceEvent.vue
@@ -130,7 +130,6 @@
      'field.main': 'id'
    })
    this.changeRadio('0')
    this.search()
  },
  methods: {
    changeRadio (e) {
admin/src/views/business/interfaceLog.vue
@@ -23,6 +23,11 @@
                    end-placeholder="结束日期">
                </el-date-picker>
            </el-form-item>
            <el-radio-group v-model="searchForm.radio" size="small" @input="changeRadio">
                <el-radio-button label="0">当天</el-radio-button>
                <el-radio-button label="1">近7天</el-radio-button>
                <el-radio-button label="2">近30天</el-radio-button>
            </el-radio-group>
            <section>
                <el-button type="primary" @click="search">搜索</el-button>
                <el-button @click="reset">重置</el-button>
@@ -74,48 +79,67 @@
</template>
<script>
  import BaseTable from '@/components/base/BaseTable'
  import TableLayout from '@/layouts/TableLayout'
  import Pagination from '@/components/common/Pagination'
  import OperaInterfaceLogWindow from '@/components/business/OperaInterfaceLogWindow'
  export default {
    name: 'InterfaceLog',
    extends: BaseTable,
    components: { TableLayout, Pagination, OperaInterfaceLogWindow },
    data () {
      return {
        // 搜索
        searchForm: {
          name: '',
          type: '',
          endDate: '',
          startDate: ''
        },
        time: []
import BaseTable from '@/components/base/BaseTable'
import TableLayout from '@/layouts/TableLayout'
import Pagination from '@/components/common/Pagination'
import OperaInterfaceLogWindow from '@/components/business/OperaInterfaceLogWindow'
import { timeForMat } from '@/utils/util'
export default {
  name: 'InterfaceLog',
  extends: BaseTable,
  components: { TableLayout, Pagination, OperaInterfaceLogWindow },
  data () {
    return {
      // 搜索
      searchForm: {
        name: '',
        type: '',
        endDate: '',
        startDate: '',
        radio: '0'
      },
      time: []
    }
  },
  created () {
    this.config({
      module: '三方平台接口交互记录',
      api: '/business/interfaceLog',
      'field.id': 'id',
      'field.main': 'id'
    })
    this.changeRadio('0')
  },
  methods: {
    changeRadio (e) {
      if (e === '0') {
        this.searchForm.startTime = timeForMat(0)[0]
        this.searchForm.endTime = timeForMat(0)[1]
        this.time = timeForMat(0)
      } else if (e === '1') {
        this.searchForm.startTime = timeForMat(6)[0]
        this.searchForm.endTime = timeForMat(6)[1]
        this.time = timeForMat(6)
      } else if (e === '2') {
        this.searchForm.startTime = timeForMat(29)[0]
        this.searchForm.endTime = timeForMat(29)[1]
        this.time = timeForMat(29)
      }
    },
    created () {
      this.config({
        module: '三方平台接口交互记录',
        api: '/business/interfaceLog',
        'field.id': 'id',
        'field.main': 'id'
      })
      this.search()
    },
    methods: {
      seleTime (e) {
        this.searchForm.startDate = e[0]
        this.searchForm.endDate = e[1]
        this.search()
      },
      reset () {
        this.$refs.searchForm.resetFields()
        this.searchForm.startDate = ''
        this.searchForm.endDate = ''
        this.time = []
        this.search()
      }
    seleTime (e) {
      this.searchForm.startDate = e[0]
      this.searchForm.endDate = e[1]
      this.searchForm.radio = null
      this.search()
    },
    reset () {
      this.$refs.searchForm.resetFields()
      this.searchForm.startDate = ''
      this.searchForm.endDate = ''
      this.time = []
      this.search()
    }
  }
}
</script>
admin/src/views/business/retention.vue
@@ -42,6 +42,15 @@
        >
        </el-date-picker>
      </el-form-item>
      <el-radio-group
        v-model="searchForm.radio"
        size="small"
        @input="changeRadio"
      >
        <el-radio-button label="0">当天</el-radio-button>
        <el-radio-button label="1">近7天</el-radio-button>
        <el-radio-button label="2">近30天</el-radio-button>
      </el-radio-group>
      <section>
        <el-button type="primary" @click="search">搜索</el-button>
        <el-button @click="reset">重置</el-button>
@@ -145,11 +154,12 @@
import BaseTable from '@/components/base/BaseTable'
import TableLayout from '@/layouts/TableLayout'
import Pagination from '@/components/common/Pagination'
import { timeForMat } from '@/utils/util'
export default {
  name: 'Retention',
  extends: BaseTable,
  components: { TableLayout, Pagination },
  data() {
  data () {
    return {
      // 搜索
      searchForm: {
@@ -157,31 +167,50 @@
        type: '',
        keyWords: '',
        startTime: '',
        endTime: ''
        endTime: '',
        radio: 0
      },
      time: []
    }
  },
  created() {
  created () {
    this.config({
      module: '在园人员信息 表(滞留)',
      api: '/business/retention',
      'field.id': 'id',
      'field.main': 'id'
    })
    this.search()
    this.changeRadio('0')
  },
  methods: {
    reset() {
    changeRadio (e) {
      if (e === '0') {
        this.searchForm.startTime = timeForMat(0)[0]
        this.searchForm.endTime = timeForMat(0)[1]
        this.time = timeForMat(0)
      } else if (e === '1') {
        this.searchForm.startTime = timeForMat(6)[0]
        this.searchForm.endTime = timeForMat(6)[1]
        this.time = timeForMat(6)
      } else if (e === '2') {
        this.searchForm.startTime = timeForMat(29)[0]
        this.searchForm.endTime = timeForMat(29)[1]
        this.time = timeForMat(29)
      }
      this.search()
    },
    reset () {
      this.$refs.searchForm.resetFields()
      this.searchForm.startTime = ''
      this.searchForm.radio = '0'
      this.searchForm.endTime = ''
      this.time = []
      this.search()
    },
    seleTime(e) {
    seleTime (e) {
      this.searchForm.startTime = e[0]
      this.searchForm.endTime = e[1]
      this.searchForm.radio = null
    }
  }
}
admin/src/views/meeting/bookings.vue
@@ -58,6 +58,15 @@
        ></el-date-picker>
        <!-- <el-date-picker v-model="searchForm.startTime" value-format="yyyy-MM-dd" placeholder="请输入开始时间" @change="search"/> -->
      </el-form-item>
      <el-radio-group
        v-model="searchForm.radio"
        size="small"
        @input="changeRadio"
      >
        <el-radio-button label="0">当天</el-radio-button>
        <el-radio-button label="1">近7天</el-radio-button>
        <el-radio-button label="2">近30天</el-radio-button>
      </el-radio-group>
      <!-- <el-form-item label="结束时间" prop="endTime">
        <el-date-picker v-model="searchForm.endTime" value-format="yyyy-MM-dd" placeholder="请输入结束时间" @change="search"/>
      </el-form-item> -->
@@ -143,6 +152,7 @@
import { getSystemDictData } from '@/api/system/dictData'
import { fetchList } from '@/api/business/company'
import { cancelById, bookingsDetail } from '@/api/meeting/bookings'
import { timeForMat } from '@/utils/util'
export default {
  name: 'Bookings',
  extends: BaseTable,
@@ -165,7 +175,8 @@
        name: '',
        startTime: '',
        endTime: '',
        content: ''
        content: '',
        radio: 0
      },
      props: {
        label: 'name',
@@ -181,12 +192,12 @@
      status: [
        { name: '全部', id: '' },
        { name: '正常', id: '0' },
        { name: '取消', id: '1' },
        { name: '取消', id: '1' }
      ],
      link: 'https://dmtest.ahapp.net/meeting_h5/' //H5_LINK_ADDR
      link: 'https://dmtest.ahapp.net/meeting_h5/' // H5_LINK_ADDR
    }
  },
  provide() {
  provide () {
    return {
      rooms: () => this.rooms
    }
@@ -204,46 +215,64 @@
      })
    getSystemDictData('H5_LINK_ADDR')
      .then(res => {
        console.log(res);
        this.link=res.code
        console.log(res)
        this.link = res.code
      })
    findList({status:0})
    findList({ status: 0 })
      .then(res => {
        this.rooms = res
      })
    this.search()
    this.changeRadio('0')
  },
  methods: {
    newTree(tree) {
      if(tree ==null){
    changeRadio (e) {
      if (e === '0') {
        this.searchForm.startTime = timeForMat(0)[0]
        this.searchForm.endTime = timeForMat(0)[1]
        this.time = timeForMat(0)
      } else if (e === '1') {
        this.searchForm.startTime = timeForMat(6)[0]
        this.searchForm.endTime = timeForMat(6)[1]
        this.time = timeForMat(6)
      } else if (e === '2') {
        this.searchForm.startTime = timeForMat(29)[0]
        this.searchForm.endTime = timeForMat(29)[1]
        this.time = timeForMat(29)
      }
      this.search()
    },
    newTree (tree) {
      if (tree == null) {
        return []
      }
      return tree.map(item => {
        let newItem = {...item}
        if(newItem){
          newItem.children=newItem.childList
        const newItem = { ...item }
        if (newItem) {
          newItem.children = newItem.childList
        }
        if (item.children && item.children.length == 0) {
          this.$delete( newItem, 'children' )
          this.$delete(newItem, 'children')
        } else {
          newItem.children = this.newTree(newItem.children)
        }
        return newItem
      });
      })
    },
    selectDate(v) {
    selectDate (v) {
      this.searchForm.endTime = v[1] + ' 23:59:59'
      this.searchForm.startTime = v[0] + ' 00:00:00'
      this.searchForm.radio = null
    },
    reset () {
      this.$refs.searchForm.resetFields()
      this.date = []
      this.searchForm.radio = '0'
      this.searchForm.startTime = ''
      this.searchForm.endTime = ''
      this.search()
    },
    copy(row) {
      let text = `${row.realName} 邀请您加入会议\n会议主题:${row.name}\n会议室:${row.roomName}\n会议时间:${row.meetingTime}\n点击链接直接加入会议:\n${this.link}?id=${row.id}`
    copy (row) {
      const text = `${row.realName} 邀请您加入会议\n会议主题:${row.name}\n会议室:${row.roomName}\n会议时间:${row.meetingTime}\n点击链接直接加入会议:\n${this.link}?id=${row.id}`
      this.$copyText(text)
        .then(() => {
          this.$message.success('会议信息复制成功,去分享给同事吧~')
@@ -252,10 +281,10 @@
          this.$message.error(e)
        })
    },
    cancelMeeting(id) {
    cancelMeeting (id) {
      this.$dialog.messageWaring('取消会议', '是否取消当前会议?')
        .then(() => {
          cancelById({id})
          cancelById({ id })
            .then(() => {
              this.$message.success('取消成功')
              this.handlePageChange()
@@ -264,9 +293,8 @@
              this.$message.error(e)
            })
        })
    },
    showDetail(id) {
    showDetail (id) {
      bookingsDetail(id)
        .then(res => {
          this.$refs.operaBookingsDetailWindow.open('会议详情', res)
@@ -275,7 +303,7 @@
          this.$message.error(e)
        })
    },
    editBookings(id) {
    editBookings (id) {
      bookingsDetail(id)
        .then(res => {
          this.$refs.operaBookingsWindow.open('编辑会议预约', res)
@@ -283,15 +311,14 @@
        .catch(e => {
          this.$message.error(e)
        })
    },
    handlePageChange (pageIndex) {
      this.__checkApi()
      this.tableData.pagination.pageIndex = pageIndex || this.tableData.pagination.pageIndex
      this.isWorking.search = true
      let form = JSON.parse(JSON.stringify(this.searchForm))
      const form = JSON.parse(JSON.stringify(this.searchForm))
      if (form.department.length) {
        form.departmentId = form.department[form.department.length-1]
        form.departmentId = form.department[form.department.length - 1]
      }
      this.api.fetchList({
        page: this.tableData.pagination.pageIndex,
@@ -309,7 +336,7 @@
        .finally(() => {
          this.isWorking.search = false
        })
    },
  },
    }
  }
}
</script>
admin/src/views/system/InterfaceLog.vue
@@ -1,11 +1,24 @@
<template>
  <div class="main_app">
    <QueryForm
   <QueryForm
      v-model="filters"
      :query-form-config="queryFormConfig"
      @handleQuery="getList(1)"
      @clear="clear"
    />
      @changeForm='changeForm'
    >
      <template #fastdate>
        <el-radio-group
          v-model="filters.fastdate"
          size="small"
          @input="changeRadio"
        >
          <el-radio-button label="0">当天</el-radio-button>
          <el-radio-button label="6">近7天</el-radio-button>
          <el-radio-button label="29">近30天</el-radio-button>
        </el-radio-group>
      </template>
    </QueryForm>
    <el-table v-loading="loading" :data="list" stripe>
      <el-table-column
        prop="name"
@@ -61,19 +74,22 @@
<script>
import Pagination from '@/components/common/Pagination'
import QueryForm from '@/components/common/QueryForm'
import dayjs from 'dayjs'
export default {
  components: {
    Pagination,
    QueryForm
  },
  data() {
  data () {
    return {
      loading: false,
      pagination: {
        capacity: 10,
        page: 1
      },
      filters: {},
      filters: {
        fastdate: '0'
      },
      list: [],
      total: 0,
      queryFormConfig: {
@@ -90,26 +106,48 @@
            options: []
          },
          {
            filed: 'selDate',
            type: 'daterange',
            label: '日期'
            filed: 'selTime',
            type: 'datetimerange',
            label: '起始时间'
          },
          {
            type: 'slot',
            filed: 'fastdate',
            label: ''
          }
        ],
        online: true
      }
    }
  },
  created () {
    this.changeRadio('0')
  },
  methods: {
    handleSub() {
    changeRadio (day) {
      const arr = [dayjs().subtract(day, 'day').format('YYYY-MM-DD') + ' 00:00:00', dayjs().format('YYYY-MM-DD') + ' 23:59:59']
      this.$set(this.filters, 'selTime', arr)
      this.getList()
    },
    changeForm (str) {
      if (str === 'selTime') {
        this.$set(this.filters, 'fastdate', null)
        this.getList()
      }
    },
    handleSub () {
      this.$refs.ruleForm.validate((valid) => {
        if (valid) {
          alert('submit!')
        }
      })
    },
    getList(page) { },
    clear() { },
    handleSizeChange(capacity) {
    getList (page) { },
    clear () {
      this.filters = { fastdate: '0' }
      this.getList()
    },
    handleSizeChange (capacity) {
      this.pagination.capacity = capacity
    }
  }
admin/src/views/task/index.vue
@@ -5,7 +5,20 @@
      :query-form-config="queryFormConfig"
      @handleQuery="getList(1)"
      @clear="clear"
    />
      @changeForm='changeForm'
    >
      <template #fastdate>
        <el-radio-group
          v-model="filters.fastdate"
          size="small"
          @input="changeRadio"
        >
          <el-radio-button label="0">当天</el-radio-button>
          <el-radio-button label="6">近7天</el-radio-button>
          <el-radio-button label="29">近30天</el-radio-button>
        </el-radio-group>
      </template>
    </QueryForm>
    <!--  -->
    <el-tabs v-model="filters.queryType" @tab-click="(e) => getList(1)">
      <el-tab-pane label="待处理" name="0">
@@ -112,11 +125,11 @@
    <VisReportDetail v-if="isShowReport" ref="VisReportDetailRef" />
    <DangetDetail v-if="isShowDanger" ref="DangetDetailRef" />
    <!-- 用车申请 -->
    <OperaCarUseBookWindow ref="OperaDetailsWindow" @success="getList"/>
    <OperaCarUseBookWindow ref="OperaDetailsWindow" @success="getList" />
    <!-- 隐患 -->
    <OperaHiddenDangerWindow ref="OperaHiddenDangerWindow" @success="getList"/>
    <OperaHiddenDangerWindow ref="OperaHiddenDangerWindow" @success="getList" />
    <!-- 预约详情 -->
     <OperaVisitsDesWindow ref="OperaVisitsDesWindow" />
    <OperaVisitsDesWindow ref="OperaVisitsDesWindow" />
  </div>
</template>
@@ -129,6 +142,7 @@
import OperaCarUseBookWindow from '@/components/business/OperaCarUseBookWindow'
import OperaHiddenDangerWindow from '@/components/business/OperaHiddenDangerWindow'
import OperaVisitsDesWindow from '@/components/business/OperaVisitsDesWindow'
import dayjs from 'dayjs'
import {
  taskCenterHead,
  taskCenterPage
@@ -150,7 +164,8 @@
      isShowReport: false,
      isShowDanger: false,
      filters: {
        queryType: '0'
        queryType: '0',
        fastdate: 0
      },
      queryFormConfig: {
        formItems: [
@@ -170,6 +185,11 @@
          {
            filed: 'selDate',
            type: 'daterange',
            label: '起始日期'
          },
          {
            type: 'slot',
            filed: 'fastdate',
            label: ''
          }
        ],
@@ -194,9 +214,16 @@
    }
  },
  created () {
    // this.getHeadData()
    this.changeRadio('0')
    this.getList()
  },
  methods: {
    changeRadio (day) {
      const arr = [dayjs().subtract(day, 'day').format('YYYY-MM-DD'), dayjs().format('YYYY-MM-DD')]
      this.$set(this.filters, 'selDate', arr)
      this.getList()
    },
    handleDetail (row) {
      if (row.objType === 2) {
        this.$refs.OperaDetailsWindow.open('公务车申请详情', row)
@@ -225,6 +252,12 @@
          this.$refs.DetailRef.getDetail()
          this.$refs.DetailRef.isShowModal = true
        })
      }
    },
    changeForm (str) {
      if (str === 'selDate') {
        this.$set(this.filters, 'fastdate', null)
        this.getList()
      }
    },
    getList (page) {
@@ -259,7 +292,8 @@
    },
    clear () {
      this.filters = {
        queryType: '0'
        queryType: '0',
        fastdate: 0
      }
      this.getList(0)
    },
h5/App.vue
@@ -1,48 +1,54 @@
<script>
import { wxAuthorize, refreshToken } from '@/api'
export default {
    onLaunch: function () {
        var that = this
        if (!that.$store.state.openid) {
            let url = window.location.href
            let code = ''
            if (url.indexOf('code=') !== -1) {
                const query = url.split('?')
                console.log('app-app', url);
                for (const q of query) {
                    if (q.indexOf('code=') !== -1) {
                        code = q.substring(q.indexOf('code=') + 5, q.length)
                    }
                }
                wxAuthorize({
                    code: code
                }).then(res => {
                    console.log('app_ress', res);
                    if (res.code === 200) {
                        that.$store.commit('setOpenId', res.data.openid)
                        if (res.data.member) {
                            that.$store.commit('setMember', res.data.member)
                        }
                    }
                })
            }
        }
        // 刷新token
        const token = uni.getStorageSync('token')
        if(token){
            //  refreshToken().then(res => {
            //      if(res.code && res.code === 200){
            //         this.$store.commit('setToken', res.data)
            //     }
            // })
        }
    },
    onShow: function () {
        console.log('App Show')
    },
    onHide: function () {
        console.log('App Hide')
    }
  onLaunch: function () {
    var that = this
    if (!that.$store.state.openid) {
      let url = window.location.href
      let code = ''
      if (url.indexOf('code=') !== -1) {
        const query = url.split('?')
        console.log('app-app', url)
        for (const q of query) {
          if (q.indexOf('code=') !== -1) {
            code = q.substring(q.indexOf('code=') + 5, q.length)
          }
        }
        wxAuthorize({
          code: code
        }).then(res => {
          console.log('app_ress', res)
          if (res.code === 200) {
            that.$store.commit('setOpenId', res.data.openid)
            if (res.data.member) {
              that.$store.commit('setMember', res.data.member)
            }
          }
        })
      } else {
        // const appID = 'wx4d7c10bdec51942b'
        // let uri = encodeURIComponent(url)
        // let authURL =
        //   `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${appID}&redirect_uri=${uri}&response_type=code&scope=snsapi_base&state=123#wechat_redirect`
        // window.location.href = authURL
      }
    }
    // 刷新token
    const token = uni.getStorageSync('token')
    if (token) {
      //  refreshToken().then(res => {
      //      if(res.code && res.code === 200){
      //         this.$store.commit('setToken', res.data)
      //     }
      // })
    }
  },
  onShow: function () {
    console.log('App Show')
  },
  onHide: function () {
    console.log('App Hide')
  }
}
</script>
@@ -51,187 +57,187 @@
@import "uview-ui/index.scss";
.flex-cb {
    display: flex;
    justify-content: space-between;
    align-items: center;
  display: flex;
  justify-content: space-between;
  align-items: center;
}
.container {
    height: 100%;
    width: 100%;
    max-width: 800rpx;
    overflow-y: auto;
  height: 100%;
  width: 100%;
  max-width: 800rpx;
  overflow-y: auto;
}
.doumee-container .ivu-tabs-nav {
    width: 100%;
  width: 100%;
}
.doumee-container .ivu-tabs-nav .ivu-tabs-tab {
    width: calc(100% / 3);
  width: calc(100% / 3);
}
.doumee-container .ivu-tabs-nav .ivu-tabs-tab {
    margin-right: 0;
    text-align: center;
  margin-right: 0;
  text-align: center;
}
.cell {
    background-color: #fff;
    display: flex;
    justify-content: space-between;
    align-items: center;
    min-height: 100rpx;
    padding: 24rpx 30rpx;
    box-sizing: border-box;
    border-bottom: 1rpx solid #eee;
    font-size: 15rpx;
    position: relative;
  background-color: #fff;
  display: flex;
  justify-content: space-between;
  align-items: center;
  min-height: 100rpx;
  padding: 24rpx 30rpx;
  box-sizing: border-box;
  border-bottom: 1rpx solid #eee;
  font-size: 15rpx;
  position: relative;
}
.cell .title {
    flex-shrink: 0;
    color: #222;
    line-height: 20rpx;
    height: 20rpx;
    width: 28%;
    margin-right: 5%;
  flex-shrink: 0;
  color: #222;
  line-height: 20rpx;
  height: 20rpx;
  width: 28%;
  margin-right: 5%;
}
.cell .content {
    flex: 1;
    font-size: 28rpx;
    font-weight: 400;
    color: #999999;
    display: flex;
    align-items: center;
    justify-content: flex-end;
  flex: 1;
  font-size: 28rpx;
  font-weight: 400;
  color: #999999;
  display: flex;
  align-items: center;
  justify-content: flex-end;
}
.cell .content .input {
    width: 100%;
    height: 100%;
    font-size: 28rpx;
    font-weight: 400;
    color: #333333;
    text-align: right;
  width: 100%;
  height: 100%;
  font-size: 28rpx;
  font-weight: 400;
  color: #333333;
  text-align: right;
}
.cell.is-link::after {
    content: '';
    display: block;
    width: 8rpx;
    height: 8rpx;
    transform: rotate(-45deg);
    border-right: 1rpx solid #999999;
    border-bottom: 1rpx solid #999999;
    margin-left: 5rpx;
  content: "";
  display: block;
  width: 8rpx;
  height: 8rpx;
  transform: rotate(-45deg);
  border-right: 1rpx solid #999999;
  border-bottom: 1rpx solid #999999;
  margin-left: 5rpx;
}
.card {
    background-color: #fff;
    padding: 16rpx;
    position: relative;
  background-color: #fff;
  padding: 16rpx;
  position: relative;
}
.card::after {
    content: '';
    display: block;
    position: absolute;
    width: calc(100% - 32rpx);
    height: 0;
    bottom: 0;
    left: 16rpx;
    border-bottom: 1rpx solid #f7f7f7;
  content: "";
  display: block;
  position: absolute;
  width: calc(100% - 32rpx);
  height: 0;
  bottom: 0;
  left: 16rpx;
  border-bottom: 1rpx solid #f7f7f7;
}
.card .title {
    color: #777777;
    margin-bottom: 12rpx;
  color: #777777;
  margin-bottom: 12rpx;
}
.card .content {
    color: #222;
  color: #222;
}
.placeholder9 {
    color: #999999;
    font-size: 28rpx;
  color: #999999;
  font-size: 28rpx;
}
//设置圆角
checkbox .uni-checkbox-input {
    border-radius: 50%;
  border-radius: 50%;
}
checkbox .uni-checkbox-input.uni-checkbox-input-checked {
    color: #fff !important;
    border: 1px solid #4d99a8 !important;
    background-color: #4d99a8 !important;
  color: #fff !important;
  border: 1px solid #4d99a8 !important;
  background-color: #4d99a8 !important;
}
checkbox .uni-checkbox-input.uni-checkbox-input-checked:before {
    /* color: #4d99a8 !important;  */
    /* border: 1px solid #4d99a8 !important; */
    /* font-size: 58rpx; */
    /* border-radius: 50%; */
  /* color: #4d99a8 !important;  */
  /* border: 1px solid #4d99a8 !important; */
  /* font-size: 58rpx; */
  /* border-radius: 50%; */
}
//
//
view {
    box-sizing: border-box;
  box-sizing: border-box;
}
image {
    box-sizing: border-box;
    margin: 0;
    display: flex;
  box-sizing: border-box;
  margin: 0;
  display: flex;
}
input{
    font-size: 30rpx
input {
  font-size: 30rpx;
}
textarea {
    box-sizing: border-box;
    // background-color: #f7f7f7;
    font-size: 30rpx !important;
    padding: 0;
    border-radius: 8rpx;
    color: #333333 !important;
  box-sizing: border-box;
  // background-color: #f7f7f7;
  font-size: 30rpx !important;
  padding: 0;
  border-radius: 8rpx;
  color: #333333 !important;
}
.u-textarea{
    padding: 0 !important;
    color: #333333 !important;
.u-textarea {
  padding: 0 !important;
  color: #333333 !important;
}
.df_ac {
    display: flex;
    align-items: center;
  display: flex;
  align-items: center;
}
.main_app {
    padding: 0 30rpx 30rpx;
    font-size: 28rpx;
    color: #333333;
  padding: 0 30rpx 30rpx;
  font-size: 28rpx;
  color: #333333;
}
.placeholder9 {
    color: #999999;
    font-size: 28rpx;
  color: #999999;
  font-size: 28rpx;
}
.mr24 {
    margin-right: 24rpx;
  margin-right: 24rpx;
}
.mr12 {
    margin-right: 12rpx;
  margin-right: 12rpx;
}
.ml12 {
    margin-left: 12rpx;
  margin-left: 12rpx;
}
.mr6 {
    margin-right: 6rpx;
  margin-right: 6rpx;
}
</style>
server/system_service/src/main/java/com/doumee/core/utils/FtpUtil.java
@@ -267,7 +267,7 @@
        return false;
    }
    public boolean uploadInputstreamBatch(InputStream inputStream, String remote, Boolean close)  {
    public boolean uploadInputstreamBatch(InputStream inputStream, String remote, Boolean close , Integer index )  {
        // 设置PassiveMode传输
        try {
            ftpClient.enterLocalPassiveMode();
@@ -279,7 +279,7 @@
            if (remote.contains("/")) {
                remoteFileName = remote.substring(remote.lastIndexOf("/") + 1);
                // 创建服务器远程目录结构,创建失败直接返回
                if (StringUtils.equals(CreateDirecroty(remote, ftpClient), "2")) {
                if (Constants.equalsInteger(index,Constants.ONE) && StringUtils.equals(CreateDirecroty(remote, ftpClient), "2")) {
                    log.error("创建ftp目录失败======================="+remote);
                    return false;
                }
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/common/PublicCloudController.java
@@ -101,7 +101,7 @@
                        String date = DateUtil.getNowShortDate();
                        String fName = date + "/" + UUID.randomUUID() + endType;
                        String fileName = folder + "/" + fName;
                        boolean r = ftp.uploadInputstreamBatch(is, fileName, Constants.equalsInteger(index ,fileList.size()));
                        boolean r = ftp.uploadInputstreamBatch(is, fileName, Constants.equalsInteger(index ,fileList.size()),index);
                        if (r) {
                            JSONObject fileJSON = new JSONObject();
                            fileJSON.put("url", prefixPath + fileName);