jiangping
2023-10-30 6e78d2b1b00eceac3ee6222b713f749e21428f9a
Merge branch 'dev' of http://139.186.142.91:10010/r/productDev/parkBike into dev
已修改30个文件
348 ■■■■ 文件已修改
admin/.env.development 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/business/bikeRepair.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaPriceConfigWindow.vue 47 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaSitesWindow.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/RepairDetailWindow.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/backGoodsorderWindow.vue 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/billDetail.vue 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/system/user/OperaUserWindow.vue 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/backgroundRefund.vue 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/bikeLocation.vue 33 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/bikeRepair.vue 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/bikeRetakeRecord.vue 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/goodsorder.vue 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/memberRides.vue 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/sites.vue 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/sitesBike.vue 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/wxBill.vue 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/wxBillDetail.vue 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/system/user.vue 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/platform/src/main/java/com/doumee/config/shiro/ShiroRealm.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/platform/src/main/java/com/doumee/task/ScheduleTool.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/business/model/Goodsorder.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/business/vo/GoodsorderExportVO.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/business/web/response/BikeLogDTO.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/SitesService.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/impl/GoodsorderServiceImpl.java 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/impl/MemberRidesServiceImpl.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/impl/RefundServiceImpl.java 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/impl/SitesServiceImpl.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/system/impl/SystemLoginServiceImpl.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/.env.development
@@ -7,10 +7,10 @@
#焦松本地
# http://192.168.0.36:10012/doc.html#/home
VUE_APP_API_BASE_URL='http://192.168.0.188:10026'
VUE_APP_API_BASE_URL='http://192.168.0.190:10026'
# # 测试服务
# VUE_APP_API_PREFIX='/bike_admin_api'
# # 后端接口地址:https://dmtest.ahapp.net/bike_admin_api/doc.html
# VUE_APP_API_BASE_URL='https://dmtest.ahapp.net/bike_admin_api'
VUE_APP_API_BASE_URL='https://dmtest.ahapp.net/bike_admin_api'
admin/src/api/business/bikeRepair.js
@@ -14,5 +14,5 @@
// 修改
export function getFileList (id) {
  return request.post(`/business/bikeRepair/getFileList/${id}`)
  return request.get(`/business/bikeRepair/getFileList/${id}`)
}
admin/src/components/business/OperaPriceConfigWindow.vue
@@ -11,7 +11,7 @@
      <el-form-item label="车型名称" prop="bikeTypeName">
        {{ form.bikeTypeName }}
      </el-form-item>
      <el-form-item label="工作日计费">
      <el-form-item label="工作日计费" prop="base">
        <el-select v-model="form.baseType" @change="selectBaseType">
          <el-option
            v-for="item in priceType"
@@ -35,7 +35,7 @@
          </div>
        </div>
      </el-form-item>
      <el-form-item label="节假日计费">
      <el-form-item label="节假日计费" prop="holiday">
        <el-select v-model="form.holidayBaseType" @change="selectHolidayBaseType">
          <el-option
            v-for="item in priceType"
@@ -68,12 +68,45 @@
import GlobalAlertWindow from '@/components/common/GlobalAlertWindow'
import { updatePricingDetailById } from '@/api/business/pricingParam'
// import { findList } from '@/api/business/roomTime'
import { numRule } from '@/utils/form'
export default {
  name: 'OperaPriceConfigWindow',
  extends: BaseOpera,
  components: { GlobalAlertWindow },
  data () {
    const baseRule = (rule, value, callback) => {
      if (this.form.baseType==1) {
        if (!this.form.basePrice || this.form.basePrice<0) {
          callback(new Error())
        } else {
          callback()
        }
      } else {
        if (!this.form.basePrice || this.form.basePrice<0 || !this.form.baseTime || this.form.baseTime <0
          || !this.form.unitPrice || this.form.unitPrice<0 || !this.form.unitTime || this.form.unitTime <0
        ) {
          callback(new Error())
        } else {
          callback()
        }
      }
    }
    const holidayRule = (rule, value, callback) => {
      if (this.form.holidayBaseType==1) {
        if (!this.form.holidayBasePrice || this.form.holidayBasePrice<0) {
          callback(new Error())
        } else {
          callback()
        }
      } else {
        if (!this.form.holidayBasePrice || this.form.holidayBasePrice<0 || !this.form.holidayBaseTime || this.form.holidayBaseTime <0
          || !this.form.holidayBasePrice || this.form.holidayBasePrice<0 || !this.form.holidayUnitTime || this.form.holidayUnitTime <0
        ) {
          callback(new Error())
        } else {
          callback()
        }
      }
    }
    return {
      // 表单数据
      form: {
@@ -99,11 +132,11 @@
      backInfoRequired: false,
      // 验证规则
      rules: {
        duration: [
         { required: true, validator: numRule, message: '请输入计费时长', tigger: 'blur' }
        base: [
         { required: true, validator: baseRule, message: '请完善工作日计价信息', tigger: 'blur' }
        ],
        backReason: [
          { required: true, message: '请选择调整原因', tigger: 'change'},
        holiday: [
          { required: true, validator: holidayRule, message: '请完善节假日计价信息', tigger: 'blur'},
        ]
      },
      
admin/src/components/business/OperaSitesWindow.vue
@@ -13,12 +13,12 @@
      <el-form-item label="站点名称" prop="name">
        <el-input v-model="form.name" placeholder="请输入站点名称" v-trim/>
      </el-form-item>
      <el-form-item label="站点ip" prop="ip">
      <!-- <el-form-item label="站点ip" prop="ip">
        <el-input v-model="form.ip" placeholder="请输入站点ip地址" v-trim/>
      </el-form-item>
      <el-form-item label="站点端口号" prop="port">
        <el-input v-model="form.port" placeholder="请输入站点端口号" v-trim/>
      </el-form-item>
      </el-form-item> -->
      
      <!-- <el-form-item label="备注" prop="info">
        <el-input v-model="form.info" placeholder="请输入备注" v-trim/>
admin/src/components/business/RepairDetailWindow.vue
@@ -7,8 +7,8 @@
      </el-form-item>
      <el-form-item label="图片/视频" prop="dealInfo">
        <el-image v-for="(url, index) in form.imgList" :key="index"
          style="width: 100px; height: 100px; margin-right: 5px;" :src="url" fit="contain"
          :prediv-src-list="form.imgList"></el-image>
          style="width: 100px; height: 100px; margin-right: 5px;" :src="url" :initial-index="index" fit="contain"
          :preview-src-list="form.imgList"></el-image>
      </el-form-item>
    </el-form>
    <div slot="footer">
admin/src/components/business/backGoodsorderWindow.vue
@@ -15,7 +15,7 @@
    <el-form :model="form" ref="form" :rules="rules" label-suffix=":">
      <el-form-item label="退款金额" prop="money">
        <div style="display: flex;">
          <el-input style="flex: 1;" v-model="form.money" placeholder="请输入退款金额" v-trim/>
          <el-input style="flex: 1;" v-model="form.money" type="number" placeholder="请输入退款金额" v-trim/>
        </div>
      </el-form-item>
      <el-form-item label="退款原因" prop="reason">
@@ -23,7 +23,7 @@
          type="textarea"
          :autosize="{ minRows: 2, maxRows: 4}"
          v-model="form.reason"
          placeholder="请输入调整备注"
          placeholder="请输入调整备注1"
          v-trim
        />
      </el-form-item>
@@ -41,6 +41,13 @@
  extends: BaseOpera,
  components: { GlobalAlertWindow },
  data () {
    const moneyRule = (rule, value, callback) => {
      if (value <=0 ) {
        callback(new Error('退款金额必须大于0'))
      } else {
        callback()
      }
    }
    return {
      // 表单数据
      form: {
@@ -55,8 +62,8 @@
      },
      // 验证规则
      rules: {
        duration: [
         { required: true, validator: numRule, message: '请输入退款金额', tigger: 'blur' }
        money: [
         { required: true, validator: moneyRule, tigger: 'blur' }
        ]
      },
      
admin/src/components/business/billDetail.vue
@@ -10,13 +10,13 @@
        stripe
        border
      >
        <el-table-column prop="memberOpenid" label="用户" min-width="100px" align="center"></el-table-column>
        <el-table-column prop="preOrderid" label="订单编号" min-width="100px" align="center"></el-table-column>
        <el-table-column prop="openid" label="用户" min-width="100px" align="center"></el-table-column>
        <el-table-column prop="code" label="订单编号" min-width="100px" align="center"></el-table-column>
        <el-table-column prop="payDate" label="支付时间" min-width="100px" align="center"></el-table-column>
        <el-table-column prop="money" label="支付金额" min-width="100px" align="center"></el-table-column>
        <el-table-column prop="refundDate" label="退款时间" min-width="100px" align="center"></el-table-column>
        <el-table-column prop="refundMoney" label="退款金额" min-width="100px" align="center"></el-table-column>
        <el-table-column prop="closeDate" label="结算金额" min-width="100px" align="center"></el-table-column>
        <el-table-column prop="money" label="支付金额" width="80px" align="center"></el-table-column>
        <el-table-column prop="refundDate" label="退款时间" width="150px" align="center"></el-table-column>
        <el-table-column prop="refundMoney" label="退款金额" width="80px" align="center"></el-table-column>
        <el-table-column prop="closeMoney" label="结算金额" width="80px" align="center"></el-table-column>
      </el-table>
      <pagination
        @size-change="handleSizeChange"
admin/src/components/system/user/OperaUserWindow.vue
@@ -4,9 +4,10 @@
    :title="title"
    :visible.sync="visible"
    :confirm-working="isWorking"
    width="600px"
    @confirm="confirm"
  >
    <el-form :model="form" ref="form" :rules="rules">
    <el-form :model="form" ref="form" :rules="rules" label-width="100px" label-suffix=":">
      <!-- <el-form-item label="用户名" prop="username" required>
        <el-input v-model="form.username" placeholder="请输入用户名" v-trim maxlength="50"/>
      </el-form-item> -->
@@ -34,10 +35,10 @@
      <el-form-item label="工号" prop="empNo">
        <el-input v-model="form.empNo" placeholder="请输入工号" v-trim maxlength="50"/>
      </el-form-item>
      <el-form-item label="所属部门" prop="departmentId">
      <!-- <el-form-item label="所属部门" prop="departmentId">
        <DepartmentSelect v-model="form.departmentId" placeholder="请选择用户所属部门" :inline="false" clearable/>
      </el-form-item>
      <div v-if="!form.id" style="color: red">新建用户的默认密码为手机号后六位</div>
      </el-form-item> -->
      <div v-if="!form.id" style="color: red">新建用户的账号为手机号、默认密码为手机号后六位</div>
      <!-- <el-form-item label="岗位" prop="positionId">
        <PositionSelect v-model="form.positionIds" placeholder="请选择用户所在岗位" :inline="false" :multiple="true" clearable/>
      </el-form-item>
admin/src/views/business/backgroundRefund.vue
@@ -43,9 +43,9 @@
            <div class="long-title-style">{{ row.openid }}</div>
          </template>
        </el-table-column>
        <el-table-column prop="id" label="系统单号" min-width="140px" align="center" show-overflow-tooltip>
        <el-table-column prop="objId" label="系统单号" min-width="140px" align="center" show-overflow-tooltip>
          <template slot-scope="{row}">
            <div class="long-title-style">{{ row.id }}</div>
            <div class="long-title-style">{{ row.objId }}</div>
          </template>
        </el-table-column>
        <!-- payOnlineOrderid  支付押金交易单号 -->
@@ -57,14 +57,9 @@
          </template>
        </el-table-column>
        <el-table-column prop="canBalance" label="当前可退回押金(元)" min-width="140px" align="center">
          <template slot-scope="{row}">
            {{ (row.canBalance / 100).toFixed(2) }}
          </template>
        </el-table-column>
        <el-table-column prop="money" label="退回押金(元)" min-width="140px" align="center">
          <template slot-scope="{row}">
            {{ (row.money / 100).toFixed(2) }}
          </template>
        </el-table-column>
        <el-table-column prop="createDate" label="操作时间" min-width="140px" align="center"></el-table-column>
        <el-table-column prop="creatorName" label="操作人" min-width="100px" align="center"></el-table-column>
admin/src/views/business/bikeLocation.vue
@@ -2,11 +2,30 @@
  <TableLayout :permissions="['business:sites:query']">
    <!-- 搜索表单 -->
    <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
      <el-form-item label="站点编号" prop="code">
        <el-input v-model="searchForm.code" placeholder="请输入站点编号" @keypress.enter.native="search"></el-input>
      <el-form-item label="站点编号" prop="siteId">
        <el-input v-model="searchForm.siteId" placeholder="请输入站点编号" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="站点名称" prop="name">
        <el-input v-model="searchForm.name" placeholder="请输入站点名称" @keypress.enter.native="search"></el-input>
      <el-form-item label="站点名称" prop="siteName">
        <el-input v-model="searchForm.siteName" placeholder="请输入站点名称" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="锁止器号" prop="lockId">
        <el-input v-model="searchForm.lockId" placeholder="请输入站点名称" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="是否有车" prop="hasBike">
        <el-select v-model="searchForm.hasBike" placeholder="请选择">
          <el-option
            label="全部"
            :value="0">
          </el-option>
          <el-option
            label="无车"
            :value="1">
          </el-option>
          <el-option
            label="有车"
            :value="2">
          </el-option>
        </el-select>
      </el-form-item>
      <section>
        <el-button type="primary" @click="search">搜索</el-button>
@@ -51,8 +70,10 @@
    return {
      // 搜索
      searchForm: {
        name: '',
        code: '',
        siteName: '',
        siteId: '',
        lockId: '',
        hasBike: 0,
      }
    }
  },
admin/src/views/business/bikeRepair.vue
@@ -2,8 +2,8 @@
  <TableLayout :permissions="['business:bikerepair:query']">
    <!-- 搜索表单 -->
    <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
      <el-form-item label="用户" prop="creator">
        <el-input v-model="searchForm.creator" placeholder="请输入" @keypress.enter.native="search"></el-input>
      <el-form-item label="用户" prop="openid">
        <el-input v-model="searchForm.openid" placeholder="请输入" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="车辆编码" prop="bikeCode">
        <el-input v-model="searchForm.bikeCode" placeholder="请输入车辆编号" @keypress.enter.native="search"></el-input>
@@ -112,7 +112,7 @@
      searchForm: {
        id: '',
        createDate: '',
        creator: '',
        openid: '',
        editDate: '',
        editor: '',
        isdeleted: '',
admin/src/views/business/bikeRetakeRecord.vue
@@ -116,7 +116,7 @@
      searchForm: {
        id: '',
        createDate: '',
        creator: '',
        hasBack: '',
        editDate: '',
        editor: '',
        isdeleted: '',
@@ -165,6 +165,7 @@
      'field.main': 'id'
    })
    this.searchForm.startDate = formatDateTime(new Date(), 'yyyy-MM-dd') + ' 00:00:00'
    this.searchForm.endDate = formatDateTime(new Date(), 'yyyy-MM-dd') + ' 23:59:59'
    this.search()
  },
  methods: {
admin/src/views/business/goodsorder.vue
@@ -87,8 +87,8 @@
        >
          <template slot-scope="{row}">
            <el-button type="text" @click="showDetail(row)">订单详情</el-button>
            <el-button type="text" @click="statement(row)" v-if="row.status != 4" style="color: red">结算</el-button>
            <el-button type="text" @click="refenMoney(row)" v-else>退款</el-button>
            <el-button type="text" @click="statement(row)" v-if="row.status != 4 && (row.memberRidesStatus>1 || !row.memberRidesStatus)" style="color: red">结算</el-button>
            <el-button type="text" @click="refenMoney(row)"  v-if="row.status == 4">退款</el-button>
          </template>
        </el-table-column>
      </el-table>
@@ -184,7 +184,7 @@
      
    },
    statement({id}) {
      this.$dialog.messageWaring('当前订单可能有未完成的骑行,确定强制结算?', '强制结算')
      this.$dialog.messageWaring('确定强制结算码?结算后订单自动完成', '强制结算')
        .then(() => {
          closerGoodsorder(id)
            .then(() => {
admin/src/views/business/memberRides.vue
@@ -13,7 +13,7 @@
        <el-select v-model="searchForm.closeStatus" placeholder="请选择">
          <el-option
            label="未结算"
            :value="1">
            :value="0">
          </el-option>
          <el-option
            label="已结算"
@@ -166,6 +166,7 @@
      'field.main': 'id'
    })
    this.searchForm.startDate = formatDateTime(new Date(), 'yyyy-MM-dd') + ' 00:00:00'
    this.searchForm.endDate = formatDateTime(new Date(), 'yyyy-MM-dd') + ' 23:59:59'
    this.search()
  },
  methods: {
admin/src/views/business/sites.vue
@@ -51,7 +51,7 @@
    <!-- 表格和分页 -->
    <template v-slot:table-wrap>
      <ul class="toolbar" v-permissions="['business:sites:create']">
        <li><el-button type="primary" @click="$refs.operaSitesWindow.open('新建站点信息表')" icon="el-icon-plus" v-permissions="['business:sites:create']">新建</el-button></li>
        <li><el-button type="primary" @click="$refs.operaSitesWindow.open('新建站点')" icon="el-icon-plus" v-permissions="['business:sites:create']">新建</el-button></li>
      </ul>
      <el-table
        v-loading="isWorking.search"
@@ -61,8 +61,8 @@
      >
        <el-table-column prop="code" label="站点编号" min-width="100px" align="center"></el-table-column>
        <el-table-column prop="name" label="站点名称" min-width="100px" align="center"></el-table-column>
        <el-table-column prop="ip" label="站点ip" min-width="100px" align="center"></el-table-column>
        <el-table-column prop="port" label="端口号" min-width="100px" align="center"></el-table-column>
        <!-- <el-table-column prop="ip" label="站点ip" min-width="100px" align="center"></el-table-column>
        <el-table-column prop="port" label="端口号" min-width="100px" align="center"></el-table-column> -->
        <el-table-column prop="editDate" label="最后通讯时间" min-width="100px" align="center"></el-table-column>
        <el-table-column prop="status" label="状态" min-width="100px" align="center">
          <template slot-scope="{row}">
@@ -85,7 +85,7 @@
          fixed="right"
        >
          <template slot-scope="{row}">
            <el-button type="text" @click="$refs.operaSitesWindow.open('编辑站点信息表', row)" icon="el-icon-edit" v-permissions="['business:sites:update']">编辑</el-button>
            <el-button type="text" @click="$refs.operaSitesWindow.open('编辑站点', row)" icon="el-icon-edit" v-permissions="['business:sites:update']">编辑</el-button>
            <el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:sites:delete']">删除</el-button>
          </template>
        </el-table-column>
admin/src/views/business/sitesBike.vue
@@ -23,9 +23,9 @@
      >
        <el-table-column prop="code" label="站点编号" min-width="100px" align="center"></el-table-column>
        <el-table-column prop="name" label="站点名称" min-width="100px" align="center"></el-table-column>
        <el-table-column prop="lockNum" label="锁头数量" min-width="100px" align="center"></el-table-column>
        <el-table-column prop="ip" label="在架车数量" min-width="100px" align="center"></el-table-column>
        <el-table-column prop="ip" label="满架率" min-width="100px" align="center"></el-table-column>
        <el-table-column prop="allLockNum" label="锁头数量" min-width="100px" align="center"></el-table-column>
        <el-table-column prop="bikeCount" label="在架车数量" min-width="100px" align="center"></el-table-column>
        <el-table-column prop="rate" label="满架率" min-width="100px" align="center"></el-table-column>
        <el-table-column prop="editDate" label="最后通讯时间" min-width="100px" align="center"></el-table-column>
      </el-table>
      <pagination
admin/src/views/business/wxBill.vue
@@ -9,6 +9,7 @@
          range-separator="至"
          start-placeholder="开始日期"
          end-placeholder="结束日期"
          :picker-options="pickerOptions"
          format="yyyy-MM-dd" value-format="yyyy-MM-dd HH:mm:ss"
          @change="selectDate"
        ></el-date-picker>
@@ -59,20 +60,21 @@
        :data="tableData.list"
        stripe
        border
        show-summary
      >
        <el-table-column prop="createDate" label="日期" min-width="100px" align="center"></el-table-column>
        <el-table-column prop="id" label="日期" min-width="100px" align="center"></el-table-column>
        <el-table-column prop="sumBill" label="收款笔数" min-width="100px" align="center"></el-table-column>
        <el-table-column prop="sumTotalFee" label="收款金额" min-width="100px" align="center"></el-table-column>
        <el-table-column prop="sumCmmsAmt" label="收款手续费" min-width="100px" align="center"></el-table-column>
        <el-table-column prop="sumTotalFee" label="收款金额(元)" min-width="100px" align="center"></el-table-column>
        <el-table-column prop="sumCmmsAmt" label="收款手续费(元)" min-width="100px" align="center"></el-table-column>
        <el-table-column prop="sumRefundBill" label="退款笔数" min-width="100px" align="center"></el-table-column>
        <el-table-column prop="sumRefundFee" label="退款金额" min-width="100px" align="center"></el-table-column>
        <el-table-column prop="sumRefundCmmsAmt" label="退款手续费" min-width="100px" align="center"></el-table-column>
        <el-table-column prop="sumRefundFee" label="退款金额(元)" min-width="100px" align="center"></el-table-column>
        <el-table-column prop="sumRefundCmmsAmt" label="退款手续费(元)" min-width="100px" align="center"></el-table-column>
        <!-- <el-table-column prop="sumSuccessFee" label="应结订单总金额" min-width="100px" align="center"></el-table-column>
        <el-table-column prop="sumCouponRefundFee" label="充值券退款总金额" min-width="100px" align="center"></el-table-column>
        <el-table-column prop="sumApplyRefundFee" label="申请退款总金额" min-width="100px" align="center"></el-table-column> -->
        <el-table-column prop="total" label="结算金额" min-width="100px" align="center"></el-table-column>
        <el-table-column prop="bikeFee" label="自行车收入" min-width="100px" align="center"></el-table-column>
        <el-table-column prop="total" label="结算金额(元)" min-width="100px" align="center"></el-table-column>
        <el-table-column prop="bikeFee" label="自行车收入(元)" min-width="100px" align="center"></el-table-column>
      </el-table>
      <pagination
        @size-change="handleSizeChange"
@@ -95,7 +97,7 @@
  components: { TableLayout, Pagination },
  data () {
    return {
      value1: [new Date(), new Date()],
      value1: [],
      // 搜索
      searchForm: {
        endDate: '',
@@ -103,7 +105,8 @@
      },
      sumData: {
      }
      },
      pickerOptions: {}
    }
  },
  created () {
@@ -113,7 +116,15 @@
      'field.id': 'id',
      'field.main': 'id'
    })
    this.searchForm.startDate = formatDateTime(new Date(), 'yyyy-MM-dd') + ' 00:00:00'
    this.pickerOptions.disabledDate = (time) => {
        // 一天
      let tempTime = 3600 * 1000 * 24
      return time.getTime() > new Date() - tempTime
    }
    // let tempTime = new Date().getTime() - 3600 * 1000 * 24
    // this.searchForm.startDate = formatDateTime(new Date(tempTime), 'yyyy-MM-dd') + ' 00:00:00'
    // this.searchForm.endDate = formatDateTime(new Date(tempTime), 'yyyy-MM-dd') + ' 23:59:59'
    // this.value1 = [this.searchForm.startDate, this.searchForm.endDate]
    this.search()
  },
  methods: {
admin/src/views/business/wxBillDetail.vue
@@ -9,6 +9,7 @@
          range-separator="至"
          start-placeholder="开始日期"
          end-placeholder="结束日期"
          :picker-options="pickerOptions"
          format="yyyy-MM-dd" value-format="yyyy-MM-dd HH:mm:ss"
          @change="selectDate"
        ></el-date-picker>
@@ -73,12 +74,13 @@
  components: { TableLayout, BillDetailWindow },
  data () {
    return {
      value1: [new Date(), new Date()],
      value1: [],
      // 搜索
      searchForm: {
        endDate: '',
        startDate: '',
      },
      pickerOptions: {}
    }
  },
  created () {
@@ -88,7 +90,16 @@
      'field.id': 'id',
      'field.main': 'id'
    })
    this.searchForm.startDate = formatDateTime(new Date(), 'yyyy-MM-dd') + ' 00:00:00'
    this.pickerOptions.disabledDate = (time) => {
        // 一天
      let tempTime = 3600 * 1000 * 24
      return time.getTime() > new Date() - tempTime
    }
    // let tempTime = new Date().getTime() - 3600 * 1000 * 24
    // this.searchForm.startDate = formatDateTime(new Date(tempTime), 'yyyy-MM-dd') + ' 00:00:00'
    // this.searchForm.endDate = formatDateTime(new Date(tempTime), 'yyyy-MM-dd') + ' 23:59:59'
    // this.value1 = [this.searchForm.startDate, this.searchForm.endDate]
    this.search()
  },
  methods: {
admin/src/views/system/user.vue
@@ -44,15 +44,9 @@
    </el-form>
    <!-- 表格和分页 -->
    <template v-slot:table-wrap>
      <div style="display: flex;">
        <div style="width: 15%; border-right: 1px solid #ececec;">
          <Tree
            :list="data"
            :defaultProps="defaultProps"
            @callback="callback"
          ></Tree>
        </div>
        <div style="width: 84%; margin-left: 1%;">
        <div>
          <div class="zdy_box">
            <div style="display: flex; align-items: center;">
              <span>{{name ? name : '全部'}} ({{tableData.pagination.total}})</span>
@@ -68,7 +62,7 @@
                />
              </li>
              <li v-permissions="['system:user:create']"><el-button type="primary" @click="$refs.operaUserWindow.open('新建用户')">添加用户</el-button></li>
              <li v-permissions="['system:user:create']"><el-button type="primary" @click="changeZZ">更换组织</el-button></li>
              <!-- <li v-permissions="['system:user:create']"><el-button type="primary" @click="changeZZ">更换组织</el-button></li> -->
              <li v-permissions="['system:user:delete']"><el-button @click="deleteByIdInBatch">删除</el-button></li>
            </ul>
          </div>
@@ -137,7 +131,6 @@
            :pagination="tableData.pagination"
          ></pagination>
        </div>
      </div>
    </template>
    <!-- 新建/修改 -->
    <OperaUserWindow ref="operaUserWindow" @success="handlePageChange(tableData.pagination.pageIndex)"/>
@@ -275,7 +268,11 @@
        id: item.id,
        status: item.status
      }).then(res => {
        this.search()
      }).catch(e => {
        this.$tip.apiFailed(e)
      }).finally(() => {
        this.handlePageChange()
      })
    },
    resPwd() {
server/platform/src/main/java/com/doumee/config/shiro/ShiroRealm.java
@@ -84,7 +84,7 @@
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"对不起,账号或密码不正确!");
        }
        if(Objects.equals(user.getStatus(),Constants.ONE)){
            throw new AuthenticationException("用户已被禁用,请联系管理员");
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"登录账号已禁用,请联系管理员!");
        }
        // 获取登录用户信息
        List<SystemRole> roles = systemRoleService.findByUserId(user.getId());
server/platform/src/main/java/com/doumee/task/ScheduleTool.java
@@ -8,6 +8,7 @@
import com.doumee.dao.business.model.Goodsorder;
import com.doumee.service.business.GoodsorderService;
import com.doumee.service.business.MemberRidesService;
import com.doumee.service.business.SitesService;
import com.doumee.service.business.WxBillService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
@@ -41,9 +42,12 @@
    @Autowired
    private GoodsorderService goodsorderService;
    @Autowired
    private MemberRidesService memberRidesService;
    @Autowired
    private SitesService sitesService;
    /**
     * @throws Exception
     */
@@ -76,6 +80,18 @@
        log.info("=====================开始每天自动结算=======================");
        memberRidesService.autoRefreshLockStatus();
        log.info("=====================结束每天自动结算=======================");
    }
    /**
     * 站点车辆满架率预警
     * @throws Exception
     */
    @Scheduled(fixedDelay = 1000L * 60L * 3L)
    public void siteReserves() throws Exception {
        log.info("=====================开始 站点车辆满架率预警=======================");
        sitesService.siteReservesNotice();;
        log.info("=====================结束 站点车辆满架率预警=======================");
    }
}
server/services/src/main/java/com/doumee/dao/business/model/Goodsorder.java
@@ -47,7 +47,6 @@
    private Integer isdeleted;
    @ApiModelProperty(value = "备注")
    @ExcelColumn(name="备注")
    private String info;
    @ApiModelProperty(value = "订单编码")
@@ -80,7 +79,7 @@
    private Integer payWay;
    @ApiModelProperty(value = "支付时间")
    @ExcelColumn(name="交押金时间",index = 5,width = 10,align = HorizontalAlignment.CENTER)
    @ExcelColumn(name="交押金时间",index = 5,width = 10,align = HorizontalAlignment.CENTER,dateFormat = "yyyy-MM-dd HH:mm:ss" )
    private Date payDate;
    @ApiModelProperty(value = "交易类型 0租车押金")
@@ -94,7 +93,7 @@
    private String closeId;
    @ApiModelProperty(value = "结算时间")
    @ExcelColumn(name="结算时间",index = 8,width = 10,align = HorizontalAlignment.CENTER)
    @ExcelColumn(name="结算时间",index = 8,width = 10,align = HorizontalAlignment.CENTER,dateFormat = "yyyy-MM-dd HH:mm:ss")
    private Date closeDate;
    @ApiModelProperty(value = "结算备注")
    private String closeInfo;
@@ -129,7 +128,7 @@
    @ApiModelProperty(value = "最后退款时间")
    @TableField(exist = false)
    @ExcelColumn(name="退款结算时间",index = 9,width = 10,align = HorizontalAlignment.CENTER)
    @ExcelColumn(name="退款结算时间",index = 9,width = 10,align = HorizontalAlignment.CENTER,dateFormat = "yyyy-MM-dd HH:mm:ss")
    private Date refundDate;
    @ApiModelProperty(value = "最近骑行状态")
server/services/src/main/java/com/doumee/dao/business/vo/GoodsorderExportVO.java
@@ -46,7 +46,7 @@
    private BigDecimal closeMoney;
    @ApiModelProperty(value = "结算时间")
    @ExcelColumn(name="结算时间",width = 10,index = 6,align = HorizontalAlignment.CENTER,dateFormat = "yyyy-MM-dd HH:mm:ss")
//    @ExcelColumn(name="结算时间",width = 10,index = 6,align = HorizontalAlignment.CENTER,dateFormat = "yyyy-MM-dd HH:mm:ss")
    private Date closeDate;
    @ApiModelProperty(value = "退款金额(分)")
server/services/src/main/java/com/doumee/dao/business/web/response/BikeLogDTO.java
@@ -37,7 +37,7 @@
    private String rentLockId;
    @ApiModelProperty(value = "骑行时长")
    @ExcelColumn(name="借出时长",index = 8,width = 10,align = HorizontalAlignment.CENTER)
    @ExcelColumn(name="借出时长(分)",index = 8,width = 10,align = HorizontalAlignment.CENTER)
    private Integer rideTime;
    @ApiModelProperty(value = "计费时长")
//    @ExcelColumn(name="计费时长",index = 8,width = 10,align = HorizontalAlignment.CENTER)
@@ -60,10 +60,10 @@
    private Date backDate;
    @ApiModelProperty(value = "状态 0请求开锁中 1骑行中 2已还车  3开锁失败")
    @ExcelColumn(name="状态 ", valueMapping = "0=请求开锁中;1=骑行中;2=已还车;3=开锁失败;" ,width = 10,align = HorizontalAlignment.CENTER)
//    @ExcelColumn(name="状态 ", valueMapping = "0=请求开锁中;1=骑行中;2=已还车;3=开锁失败;" ,width = 10,align = HorizontalAlignment.CENTER)
    private Integer status;
    @ApiModelProperty(value = "结算状态")
    @ExcelColumn(name="结算状态 ", valueMapping = "0=未结算;1=已结算;" ,width = 10,align = HorizontalAlignment.CENTER)
//    @ExcelColumn(name="结算状态 ", valueMapping = "0=未结算;1=已结算;" ,width = 10,align = HorizontalAlignment.CENTER)
    private Integer closeStatus;
}
server/services/src/main/java/com/doumee/service/business/SitesService.java
@@ -103,10 +103,8 @@
    /**
     * 站点预警
     * @param siteId
     * @throws Exception
     */
    void siteReservesNotice(String siteId) throws Exception;
    void siteReservesNotice()  throws Exception;
    /**
server/services/src/main/java/com/doumee/service/business/impl/GoodsorderServiceImpl.java
@@ -520,6 +520,7 @@
        MPJLambdaWrapper<MemberRides> wrapper = new MPJLambdaWrapper<>();
        wrapper.eq(MemberRides::getOrdreId,id);
        wrapper.ne(MemberRides::getStatus,Constants.MEMBER_RIDES_STATUS.LOCKING_DEFEAT.getKey());
        wrapper.selectAll(MemberRides.class).selectAs(BaseParam::getName, MemberRides::getParamName);
        wrapper.leftJoin(BaseParam.class, BaseParam::getId, MemberRides::getParamId);
        wrapper.orderByDesc(BaseParam::getSortnum);
@@ -634,8 +635,12 @@
                }
            }
        QueryWrapper<Refund> queryWrapper2 = new QueryWrapper<>();
        queryWrapper2.lambda().ge(param.getStartDate() !=null,Refund::getDoneDate,Utils.Date.getStart(param.getStartDate()));
        queryWrapper2.lambda().le(param.getEndDate() !=null,Refund::getDoneDate,Utils.Date.getEnd(param.getEndDate()));
        if(Objects.nonNull(param.getStartDate())) {
            queryWrapper2.lambda().ge(Refund::getDoneDate, Utils.Date.getStart(param.getStartDate()));
        }
        if(Objects.nonNull(param.getEndDate())) {
            queryWrapper2.lambda().le(Refund::getDoneDate, Utils.Date.getEnd(param.getEndDate()));
        }
        queryWrapper2.lambda().eq(Refund::getIsdeleted, Constants.ZERO);
        queryWrapper2.select( "count(id) as count_num"
                ,"sum(money) as money" );
server/services/src/main/java/com/doumee/service/business/impl/MemberRidesServiceImpl.java
@@ -189,6 +189,15 @@
    public PageData<BikeLogDTO> findBikeLog(PageWrap<MemberRidesQuery> pageWrap) {
        IPage<MemberRides> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
        MPJLambdaWrapper<MemberRides> queryWrapper = initQueryParamByModel(pageWrap.getModel());
        MemberRidesQuery model = pageWrap.getModel();
        //已还车
        if (Objects.nonNull(model.getHasBack()) && model.getHasBack()){
            queryWrapper.eq(MemberRides::getStatus,Constants.TWO);
        }
        //未归还的
        if (Objects.nonNull(model.getHasBack()) && !model.getHasBack()){
            queryWrapper.eq(MemberRides::getStatus,Constants.ONE);
        }
        IPage<BikeLogDTO> bikeLogDTOIPage = memberRidesJoinMapper.selectJoinPage(page, BikeLogDTO.class, queryWrapper);
        initBikeLogObj(bikeLogDTOIPage.getRecords());
        return PageData.from(bikeLogDTOIPage);
@@ -221,7 +230,7 @@
            queryWrapper.ge(MemberRides::getRentDate, Utils.Date.getStart(model.getStartDate()));
        }
        if (Objects.nonNull(model.getEndDate())) {
            queryWrapper.le(MemberRides::getRentDate, Utils.Date.getStart(model.getEndDate()));
            queryWrapper.le(MemberRides::getRentDate, Utils.Date.getEnd(model.getEndDate()));
        }
        queryWrapper.eq(model.getCloseStatus()!=null,MemberRides::getCloseStatus, model.getCloseStatus());
        queryWrapper.eq(model.getStatus()!=null,MemberRides::getStatus, model.getStatus());
server/services/src/main/java/com/doumee/service/business/impl/RefundServiceImpl.java
@@ -109,8 +109,13 @@
        queryWrapper.eq(StringUtils.isNotBlank(pageWrap.getModel().getCreatorName())
                ,SystemUser::getRealname
                ,pageWrap.getModel().getCreatorName());
        return PageData.from(refundJoinMapper.selectJoinPage(page, Refund.class,queryWrapper));
        IPage<Refund> refundIPage = refundJoinMapper.selectJoinPage(page, Refund.class, queryWrapper);
        if (!CollectionUtils.isEmpty(refundIPage.getRecords())){
            refundIPage.getRecords().forEach(s->{
                    s.setMoney(Constants.translateMoney(s.getMoney()));
            });
        }
        return PageData.from(refundIPage);
    }
    @Override
    public List<RefundPlatExportVO>  findPlatExportPage( Refund pageWrap) {
server/services/src/main/java/com/doumee/service/business/impl/SitesServiceImpl.java
@@ -30,6 +30,7 @@
import org.springframework.util.CollectionUtils;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Objects;
@@ -235,7 +236,37 @@
    }
    @Override
    public void siteReservesNotice(String siteId) throws Exception {
    public void siteReservesNotice()  throws Exception{
        QueryWrapper<Sites> queryWrapper = new QueryWrapper<>();
        queryWrapper.select(" *, " +
                " (select count(r.id) from locks r where r.site_id = sites.id) as all_lock_num ," +
                "(select count(l.bike_code) from locks l where l.site_id = sites.id and l.bike_code IS NOT NULL and l.bike_code !='' ) as bikeCount");
        queryWrapper.lambda().eq(Sites::getStatus,Constants.ZERO);
        queryWrapper.lambda().eq(Sites::getIsdeleted,Constants.ZERO);
        queryWrapper.lambda().orderByAsc(Sites::getCode);
        List<Sites> sitesList = sitesMapper.selectList(queryWrapper);
        if (!CollectionUtils.isEmpty(sitesList)){
                for (Sites s:sitesList) {
                    if(Constants.formatIntegerNum(s.getAllLockNum())<=Constants.ZERO){
                        continue;
                    }
                    BigDecimal warnMin = new BigDecimal(systemDictDataBiz.queryByCode(Constants.MINI_PROGRAMME,Constants.WARN_MIN).getCode());
                    BigDecimal warnMax = new BigDecimal(systemDictDataBiz.queryByCode(Constants.MINI_PROGRAMME,Constants.WARN_MAX).getCode());
                    BigDecimal rata = new BigDecimal(s.getBikeCount()).divide(new BigDecimal(s.getAllLockNum()),2,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(100L));
                    if(rata.compareTo(warnMax)>Constants.ZERO){
                        //发送钉钉通知
                        DingDingNotice.reservesNotice(StringUtils.isBlank(s.getName())?s.getId() + " - 未知" :s.getId() + " - " + s.getName(),
                                systemDictDataBiz.queryByCode(Constants.DINGDING,Constants.DINGDING_URL).getCode(),
                                systemDictDataBiz.queryByCode(Constants.DINGDING,Constants.DINGDING_SECRET).getCode(),Constants.ZERO,warnMax);
                    }else if(rata.compareTo(warnMin)<Constants.ZERO){
                        //发送钉钉通知
                        DingDingNotice.reservesNotice(StringUtils.isBlank(s.getName())?s.getId() + " - 未知" :s.getId() + " - " + s.getName(),
                                systemDictDataBiz.queryByCode(Constants.DINGDING,Constants.DINGDING_URL).getCode(),
                                systemDictDataBiz.queryByCode(Constants.DINGDING,Constants.DINGDING_SECRET).getCode(),Constants.ONE,warnMin);
                    }
                }
        }
    }
}
server/services/src/main/java/com/doumee/service/system/impl/SystemLoginServiceImpl.java
@@ -120,7 +120,10 @@
            loginLog.setReason(e.getMessage().length() > 200 ? (e.getMessage().substring(0, 190) + "...") : e.getMessage());
            loginLog.setSuccess(Constants.ONE);
            systemLoginLogService.create(loginLog);
            throw new BusinessException(ResponseStatus.ACCOUNT_INCORRECT.getCode(),e.getCause().getMessage());
            if (e.getCause() instanceof BusinessException) {
                throw new BusinessException(ResponseStatus.ACCOUNT_INCORRECT.getCode(), e.getCause().getMessage());
            }
            throw new BusinessException(ResponseStatus.ACCOUNT_INCORRECT.getCode(), "提示对不起,账号或密码错误!");
        }
    }