doum
4 天以前 275b6c4986343c3e4230e1ad28ce9548b017d584
代码初始化
已添加2个文件
已修改27个文件
已重命名3个文件
1193 ■■■■ 文件已修改
admin/.env 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/.env.development 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/.env.production 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/business/orders.js 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/assets/style/style.scss 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/orders.vue 31 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/index.vue 515 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/system/user.vue 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/vue.config.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/admin/pom.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/admin/src/main/java/com/doumee/api/business/OrdersController.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/admin/src/main/java/com/doumee/api/web/WebOrdersController.java 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/admin/src/main/resources/application.yml 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/admin/src/main/resources/logback-spring.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/allinpay/syb/lib/SybUtil.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/allinpay/syb/model/PayOrderNotifyParam.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/allinpay/syb/model/PayOrderParam.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/allinpay/syb/model/PayOrderResponse.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/allinpay/syb/model/PayPublicModel.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/business/model/Orders.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/vo/IndexOrderCountVO.java 68 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/OrdersService.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/impl/OrdersServiceImpl.java 275 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/system/impl/SystemLoginServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/resources/application-pro.yml 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/resources/application-test.yml 46 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/startsh/admin_start.sh 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web/pages.json 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web/pages/index/index.vue 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web/pages/success/success.vue 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web/unpackage/dist/build/web/index.html 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
web/utils/config.js 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/.env
@@ -7,4 +7,4 @@
VUE_APP_ROUTER_MODE = 'hash'
ddd
# æŽ¥å£å‰ç¼€
VUE_APP_API_PREFIX = '/diandongche_admin_api'
VUE_APP_API_PREFIX = '/admin_interface'
admin/.env.development
@@ -4,3 +4,6 @@
# é¡¹ç›®ä¸Šä¸‹æ–‡è·¯å¾„
VUE_APP_CONTEXT_PATH = '/'
VUE_APP_API_URL = 'http://localhost:12010'
#VUE_APP_API_URL = 'https://pay.smartbee.run/admin_interface'
admin/.env.production
@@ -3,5 +3,5 @@
# å…³é—­DEBUG
VUE_APP_DEBUG = 'off'
VUE_APP_CONTEXT_PATH = '/diandongche_admin'
VUE_APP_API_URL = ' '
VUE_APP_CONTEXT_PATH = '/admin'
VUE_APP_API_URL = 'https://pay.smartbee.run/admin_interface'
admin/src/api/business/orders.js
@@ -6,6 +6,11 @@
    trim: true
  })
}
export function getIndexData (data) {
  return request.post('/business/orders/getIndexData', data, {
    trim: true
  })
}
export function commentList (data) {
  return request.post('/business/orders/commentList', data, {
    trim: true
@@ -23,6 +28,9 @@
export function create (data) {
  return request.post('/business/orders/create', data)
}
export function updateByPayStatus (data) {
  return request.post('/business/orders/updateByPayStatus', data)
}
export function cancel (id) {
  return request.get(`/business/orders/cancel?id=${id}`)
}
admin/src/assets/style/style.scss
@@ -63,6 +63,9 @@
.grey{
  color: grey;
}
.black{
  color: #333;
}
.green{
  color: green;
}
admin/src/views/business/orders.vue
@@ -84,23 +84,21 @@
            <span v-if="row.type==1">延期款</span>
          </template>
        </el-table-column>
        <el-table-column prop="remark" label="订单备注"  width="100px"  ></el-table-column>
        <el-table-column prop="remark" label="订单备注"  width="200px"  ></el-table-column>
        <el-table-column prop="userRealname" label="收款人姓名"  width="100px"  ></el-table-column>
        <el-table-column prop="username" label="负责人账号"  width="120px"  ></el-table-column>
        <el-table-column prop="createTime" label="创建时间" min-width="150px"></el-table-column>
        <el-table-column prop="payDate" label="付款时间" min-width="150px"></el-table-column>
        <el-table-column prop="cancelDate" label="取消时间" min-width="150px"></el-table-column>
<!--        <el-table-column
  <el-table-column
          label="操作"
          align="center"
          min-width="150"
          fixed="right"
          min-width="100"
        >
          <template slot-scope="{row}">
            <el-button type="text" class="redstate" @click="cancelDo(row)" v-if="row.status!=5 && row.status!=4&& row.status!=99" icon="el-icon-delete" v-permissions="['business:orders:update']">取消</el-button>
            <el-button type="text" @click="openDetail( row)" icon="el-icon-info"  >详情</el-button>
            <el-button type="text"   @click="payStatus(row)" icon="el-icon-refresh" v-permissions="['business:orders:update']">同步状态</el-button>
          </template>
        </el-table-column>-->
        </el-table-column>
      </el-table>
      <pagination
        @size-change="handleSizeChange"
@@ -132,7 +130,7 @@
        status: null,
        type: null,
        starttime: null,
        endTime: null,
        endtime: null,
        username: null,
        userRealName: null,
        name: null,
@@ -169,6 +167,23 @@
              this.dealing = false
            })
        })
    },
    payStatus (row) {
      this.$dialog.actionConfirm('您确认【同步】该订单最新状态吗?', '操作确认')
        .then(() => {
          this.dealing = true
          this.api.updateByPayStatus({id:row.id})
            .then(res => {
              this.$tip.apiSuccess('操作成功')
              this.search()
            })
            .catch(e => {
              this.$tip.apiFailed(e)
            })
            .finally(() => {
              this.dealing = false
            })
        })
    }
  }
}
admin/src/views/index.vue
@@ -6,6 +6,163 @@
        ä»Šå¤©æ˜¯ {{ nowDate }} {{ nowWeek }},欢迎访问智租蜂后台管理系统
      </div>
    </div>
    <div class="main">
      <div class="app_content">
        <div class="static_card">
          <div class="card">
            <div class="header" >
              <div class="left">
                <div class="fs15">今日总交易(金额 | è®¢å•量)</div>
                <div class="num ">
                  <span  class=" orange" style="display: inline;">ï¿¥{{( (headerData.todayMoney ||0 )/100).toFixed(2)}}</span>
                  <span   > | </span>
                  <span  >  {{ headerData.todayNum || 0}}</span>
                </div>
              </div>
              <!--              <img src="@/assets/images/bg_a.png" alt="" />-->
            </div>
            <div class="content">
              <div>等待支付:
                <span  class=" orange">ï¿¥{{ ((headerData.todayWaitMoney ||0 )/100).toFixed(2)}}</span>
                <span  class="split"> | </span>
                <span class="numtxt">  {{ headerData.todayWaitNum || 0}}</span>
              </div>
              <div>交易成功:
                <span  class=" orange"  >ï¿¥{{( (headerData.todayDoneMoney ||0 )/100).toFixed(2)}}</span>
                <span  class="split" > | </span>
                <span class="numtxt">  {{ headerData.todayDoneNum || 0}}</span>
              </div>
              <div>交易失败:
                <span  class=" orange">ï¿¥{{ ((headerData.todayFailMoney ||0 )/100).toFixed(2)}}</span>
                <span class="split" > | </span>
                <span class="numtxt">  {{ headerData.todayFailNum || 0}}</span>
              </div>
            </div>
          </div>
          <div class="card">
            <div class="header" >
              <div class="left">
                <div class="fs15">今日车款交易(金额 | è®¢å•量)</div>
                <div class="num ">
                  <span class=" orange"   style="display: inline;">ï¿¥{{( (headerData.todayMoney0 ||0 )/100).toFixed(2)}}</span>
                  <span class=" " > | </span>
                  <span class=" ">  {{ headerData.todayNum0 || 0}}</span>
                </div>
              </div>
              <!--              <img src="@/assets/images/bg_a.png" alt="" />-->
            </div>
            <div class="content">
              <div>等待支付:
                <span class=" orange">ï¿¥{{( (headerData.todayWaitMoney0 ||0 )/100).toFixed(2)}}</span>
                <span  class="split"> | </span>
                <span class="numtxt">  {{ headerData.todayWaitNum0 || 0}}</span>
              </div>
              <div>交易成功:
                <span  class=" orange">ï¿¥{{ ((headerData.todayDoneMoney0 ||0 )/100).toFixed(2)}}</span>
                <span  class="split"> | </span>
                <span class="numtxt">  {{ headerData.todayDoneNum0 || 0}}</span>
              </div>
              <div>交易失败:
                <span  class=" orange">ï¿¥{{ ((headerData.todayFailMoney0 ||0 )/100).toFixed(2)}}</span>
                <span class="split" > | </span>
                <span class="numtxt">  {{ headerData.todayFailNum0 || 0}}</span>
              </div>
            </div>
          </div>
          <div class="card">
            <div class="header" >
              <div class="left">
                <div class="fs15">今日延期款交易(金额 | è®¢å•量)</div>
                <div class="num ">
                  <span  class=" orange"   style="display: inline;">ï¿¥{{( (headerData.todayMoney1 ||0 )/100).toFixed(2)}}</span>
                  <span  > | </span>
                  <span >  {{ headerData.todayNum1 || 0}}</span>
                </div>
              </div>
              <!--              <img src="@/assets/images/bg_a.png" alt="" />-->
            </div>
            <div class="content">
              <div>等待支付:
                <span  class=" orange">ï¿¥{{ ((headerData.todayWaitMoney1 ||0 )/100).toFixed(2)}}</span>
                <span  class="split"> | </span>
                <span class="numtxt">  {{ headerData.todayWaitNum1 || 0}}</span>
              </div>
              <div>交易成功:
                <span  class=" orange">ï¿¥{{ ((headerData.todayDoneMoney1 ||0 )/100).toFixed(2)}}</span>
                <span  class="split"> | </span>
                <span class="numtxt">  {{ headerData.todayDoneNum1 || 0}}</span>
              </div>
              <div>交易失败:
                <span  class=" orange">ï¿¥{{ ((headerData.todayFailMoney1 ||0 )/100).toFixed(2)}}</span>
                <span  class="split"> | </span>
                <span class="numtxt">  {{ headerData.todayFailNum1 || 0}}</span>
              </div>
            </div>
          </div>
        </div>
        <div class="static_wrap">
<!--          <div class="df mb50" >
            <div class="wrap static1">
              <div class="header" style="text-align: center">
                <div class="home_title"  style="text-align: center;width: 80%">各类型交易统计({{searchForm.timeName}})</div>
                <div style="text-align: right;width: 150px;font-size: 12px;height: 25px">
                  <el-form   :model="searchForm" label-width="100px" inline >
                    <el-select v-model="searchForm.timeType"  :popper-append-to-body="true" clearable   placeholder="时间范围"   @change="reloadDataByType()">
                      <el-option value="0" label="本周"/>
                      <el-option value="1" label="本月"/>
                      <el-option value="2" label="本季度"/>
                      <el-option value="3" label="本年"/>
                    </el-select>
                  </el-form>
                </div>
              </div>
              <div class="echart"  style="height: 400px" >
                <div  id="circleChart0"></div>
                <div  id="circleChart1"></div>
              </div>
            </div>
          </div>-->
<!--          <div class="df mb50" >
            <div class="wrap static1">
              <div class="header">
                <div class="home_title">1.SHE事件上报</div>
              </div>
              <div class="echart" >
                <div  id="echart0"></div>
                <div  id="echart01"></div>
              </div>
            </div>
            <div class="wrap static2">
              <div class="header">
                <div class="home_title">2.深度符合性审查DCA上报记录</div>
              </div>
              <div class="echart" >
                <div  id="echart1">  </div>
                <div  id="echart11">   </div>
              </div>
            </div>
            <div class="wrap static3">
              <div class="header">
                <div class="home_title">3.深度符合性审查DCA事件工单</div>
              </div>
              <div class="echart" >
                <div  id="echart2">  </div>
                <div  id="echart21">   </div>
              </div>
            </div>
            <div class="wrap static4">
              <div class="header">
                <div class="home_title">4.跌绊滑风险上报</div>
              </div>
              <div class="echart" >
                <div  id="echart3">  </div>
                <div  id="echart31">   </div>
              </div>
            </div>
          </div>-->
        </div>
      </div>
    </div>
  </div>
</template>
@@ -13,6 +170,7 @@
import dayjs from 'dayjs'
import * as echarts from 'echarts'
import { weeks } from '@/utils/config'
import { getIndexData} from '@/api/business/orders'
const colors = ['#52a4f7', '#7678f7', '#5fc6d5']
export default {
  components: {
@@ -43,15 +201,344 @@
    }
  },
  created () {
    this.initData()
  },
  mounted () {
    this.updateDate()
    // this.initData()
  },
  methods: {
    initData () {
      this.updateDate()
      this.getWorkHead()
      this.getWorkBody0()
      this.getWorkBody1()
      this.getWorkBody2()
      this.getWorkBody3()
      // this.getWorkBody()
    },
    reloadDataByType () {
      getIndexData({timeType: this.searchForm.timeType }).then(res => {
        if (this.searchForm.timeType == '0') {
          this.searchForm.timeName = '本周'
        } else if (this.searchForm.timeType =='1') {
          this.searchForm.timeName = '本月'
        } else if (this.searchForm.timeType =='2') {
          this.searchForm.timeName = '本季度'
        } else if (this.searchForm.timeType == '3') {
          this.searchForm.timeName = '本年'
        } else {
          this.searchForm.timeName = '全部'
        }
        this.headerData1 =res || []
        this.initAllData()
      })
    },
    getWorkBody0 () {
      getWorkOrderData({ queryType: 0, orderType: 0 }).then(res => {
        this.staticData0 = res || []
        this.initEchart0()
      })
      getWorkOrderData({ queryType: 1, orderType: 0 }).then(res => {
        this.staticData01 = res || []
        this.initEchart01()
      })
    },
    getWorkBody1 () {
      getWorkOrderData({ queryType: 0, orderType: 1 }).then(res => {
        this.staticData1 = res || []
        this.initEchart1()
      })
      getWorkOrderData({ queryType: 1, orderType: 1 }).then(res => {
        this.staticData11 = res || []
        this.initEchart11()
      })
    },
    getWorkBody2 () {
      getWorkOrderData({ queryType: 0, orderType: 2 }).then(res => {
        this.staticData2 = res || []
        this.initEchart2()
      })
      getWorkOrderData({ queryType: 1, orderType: 2 }).then(res => {
        this.staticData21 = res || []
        this.initEchart21()
      })
    },
    getWorkBody3 () {
      getWorkOrderData({ queryType: 0, orderType: 3 }).then(res => {
        this.staticData3 = res || []
        this.initEchart3()
      })
      getWorkOrderData({ queryType: 1, orderType: 3 }).then(res => {
        this.staticData31 = res || []
        this.initEchart31()
      })
    },
    getWorkHead () {
      getIndexData({ }).then(res => {
        this.headerData = res || {}
        this.headerData1 = res || {}
        this.initAllData()
      })
    },
    initAllData(){
      var cdata = []
      cdata.push({ name: '跌绊滑事件', value: this.headerData1.dbhNum || 0 })
      cdata.push({ name: 'DCA事件', value: this.headerData1.dcaChildNum || 0 })
      cdata.push({ name: 'SHE事件', value: this.headerData1.sheNum || 0 })
      this.initEchartCircleDo('circleChart0', '各类型事件工单上报统计', '', cdata)
      var xdata = ['SHE事件', '跌绊滑事件', 'DCA事件']
      var ydata = []
      ydata.push({ name: '已解决', stack: 'cateNum', type: 'bar', unit: '项', color: '#f07e6f', data: [this.headerData1.sheNum || 0, this.headerData1.dbhYesNum || 0, this.headerData1.dcaChildYesNum || 0] })
      ydata.push({ name: '未解决', stack: 'cateNum', type: 'bar', unit: '项', color: '#8383ff', data: [0, this.headerData1.dbhNoNum || 0, this.headerData1.dcaChildNoNum || 0] })
      ydata.push({ name: '总单量', type: 'bar', unit: '次', color: '#29aeff', data: [this.headerData1.sheNum || 0, this.headerData1.dbhNum || 0, this.headerData1.dcaChildNum || 0] })
      this.initEchartDataDo('各类型事件状态统计', 'circleChart1', xdata, ydata)
    },
    updateDate () {
      this.nowDate = dayjs().format('YYYYå¹´M月D日')
      this.nowWeek = weeks[new Date().getDay()]
    },
    initEchart0 () {
      var ydata = [{ name: '工单数量', type: 'line', unit: '单', color: '#29aeff', data: this.staticData0.map(i => i.total) }]
      this.initEchartDataDo('月度统计', 'echart0', this.staticData0.map(i => i.dateStr), ydata)
    },
    initEchart01 () {
      var ydata = [{ name: '工单数量', type: 'bar', unit: '单', color: '#29aeff', data: this.staticData01.map(i => i.total) }]
      this.initEchartDataDo('季度统计', 'echart01', this.staticData01.map(i => i.dateStr), ydata)
    },
    initEchart1 () {
      var ydata = []
      ydata.push({ name: '符合项', type: 'line', unit: '项', color: '#f07e6f', data: this.staticData1.map(i => i.dcaYesTotal) })
      ydata.push({ name: '不符合项', type: 'line', unit: '项', color: '#8383ff', data: this.staticData1.map(i => i.dcaNoTotal) })
      ydata.push({ name: '上报次数', type: 'bar', unit: '次', color: '#29aeff', data: this.staticData1.map(i => i.total) })
      this.initEchartDataDo('月度统计', 'echart1', this.staticData1.map(i => i.dateStr), ydata)
    },
    initEchart11 () {
      var ydata = []
      ydata.push({ name: '符合项', type: 'line', unit: '项', color: '#f07e6f', data: this.staticData11.map(i => i.dcaYesTotal) })
      ydata.push({ name: '不符合项', type: 'line', unit: '项', color: '#8383ff', data: this.staticData11.map(i => i.dcaNoTotal) })
      ydata.push({ name: '上报次数', type: 'bar', unit: '次', color: '#29aeff', data: this.staticData11.map(i => i.total) })
      this.initEchartDataDo('季度统计', 'echart11', this.staticData11.map(i => i.dateStr), ydata)
    },
    initEchart2 () {
      var ydata = []
      ydata.push({ name: '工程师关闭单量', type: 'line', unit: '单', color: '#f0ee6f', data: this.staticData2.map(i => i.gcsTotal) })
      ydata.push({ name: 'WTS关闭单量', type: 'line', unit: '单', color: '#29aeff', data: this.staticData2.map(i => i.wtsTotal) })
      ydata.push({ name: 'SHE关闭单量', type: 'line', unit: '单', color: '#e75314', data: this.staticData2.map(i => i.sheTotal) })
      ydata.push({ name: '未解决单量', type: 'line', unit: '单', color: '#8383ff', data: this.staticData2.map(i => i.unCloseTotal) })
      ydata.push({ name: '工单总量', type: 'line', unit: '单', color: '#30d3de', data: this.staticData2.map(i => i.total) })
      this.initEchartDataDo('月度统计', 'echart2', this.staticData2.map(i => i.dateStr), ydata)
    },
    initEchart21 () {
      var ydata = []
      ydata.push({ name: '工程师关闭单量', type: 'bar', unit: '单', color: '#f0ee6f', data: this.staticData21.map(i => i.gcsTotal) })
      ydata.push({ name: 'WTS关闭单量', type: 'bar', unit: '单', color: '#29aeff', data: this.staticData21.map(i => i.wtsTotal) })
      ydata.push({ name: 'SHE关闭单量', type: 'bar', unit: '单', color: '#e75314', data: this.staticData21.map(i => i.sheTotal) })
      ydata.push({ name: '未解决单量', type: 'bar', unit: '单', color: '#8383ff', data: this.staticData21.map(i => i.unCloseTotal) })
      ydata.push({ name: '工单总量', type: 'line', unit: '单', color: '#30d3de', data: this.staticData21.map(i => i.total) })
      this.initEchartDataDo('季度统计', 'echart21', this.staticData21.map(i => i.dateStr), ydata)
    },
    initEchart3 () {
      var ydata = []
      ydata.push({ name: '工程师关闭单量', type: 'line', unit: '单', color: '#6feef0', data: this.staticData3.map(i => i.gcsTotal) })
      ydata.push({ name: 'WTS关闭单量', type: 'line', unit: '单', color: 'rgba(217,4,34,0.83)', data: this.staticData3.map(i => i.wtsTotal) })
      ydata.push({ name: 'SHE关闭单量', type: 'line', unit: '单', color: '#e75314', data: this.staticData3.map(i => i.sheTotal) })
      ydata.push({ name: '未解决单量', type: 'line', unit: '单', color: '#8383ff', data: this.staticData3.map(i => i.unCloseTotal) })
      ydata.push({ name: '工单总量', type: 'line', unit: '单', color: '#30d3de', data: this.staticData3.map(i => i.total) })
      this.initEchartDataDo('月度统计', 'echart3', this.staticData3.map(i => i.dateStr), ydata)
    },
    initEchart31 () {
      var ydata = []
      ydata.push({ name: '工程师关闭单量', type: 'bar', unit: '单', color: '#6feef0', data: this.staticData31.map(i => i.gcsTotal) })
      ydata.push({ name: 'WTS关闭单量', type: 'bar', unit: '单', color: 'rgba(217,4,34,0.83)', data: this.staticData31.map(i => i.wtsTotal) })
      ydata.push({ name: 'SHE关闭单量', type: 'bar', unit: '单', color: '#e75314', data: this.staticData31.map(i => i.sheTotal) })
      ydata.push({ name: '未解决单量', type: 'bar', unit: '单', color: '#8383ff', data: this.staticData31.map(i => i.unCloseTotal) })
      ydata.push({ name: '工单总量', type: 'line', unit: '单', color: '#30d3de', data: this.staticData31.map(i => i.total) })
      this.initEchartDataDo('季度统计', 'echart31', this.staticData31.map(i => i.dateStr), ydata)
    },
    initEchartDataDo (title, id, xdata, ydata) {
      const myChart = echarts.init(document.getElementById(id))
      myChart.setOption({
        title: {
          text: (title || ''),
          textStyle: {
            fontSize: 12,
            fontStyle: 'normal',
            fontWeight: 'bold'
          }
        },
        tooltip: {
          trigger: 'axis',
          axisPointer: {
            type: 'shadow'
          },
          textStyle: {
            fontSize: 10,
            fontStyle: 'normal',
            fontWeight: 'normal'
          }
        },
        legend: {
          orient: 'vertical',
          left: 'right',
          textStyle: {
            fontSize: 10,
            fontStyle: 'normal',
            fontWeight: 'normal'
          }
        },
        xAxis: {
          type: 'category',
          // boundaryGap: false,
          data: xdata
        },
        yAxis: {
          type: 'value',
          name: '',
          min: 0,
          axisLabel: {
            formatter: function (value) {
              return Number.isInteger(value) ? value : ''
            }
          },
          textStyle: {
            fontSize: 10,
            fontStyle: 'normal',
            fontWeight: 'normal'
          },
          nameTextStyle: {
            padding: [0, 0, 4, -30] // å››ä¸ªæ•°å­—分别为上右下左与原位置距离
          },
          splitLine: {
            show: true,
            lineStyle: {
              // è¿™é‡Œè¾“入线条的样式
              color: 'rgba(255,255,255,0.14)'
            }
          }
        },
        grid: {
          top: '16%',
          left: '2%',
          right: '8%',
          bottom: '2%',
          containLabel: true
        },
        series: this.seriesInitData(ydata)
      })
      window.addEventListener('resize', function () { // æ‰§è¡Œ
        myChart.resize()
      })
    },
    seriesInitData (ydata) {
      var array = []
      for (let i = 0; i < ydata.length; i++) {
        array.push({
          data: ydata[i].data,
          name: ydata[i].name,
          stack: ydata[i].stack || '',
          type: ydata[i].type || 'line',
          areaStyle: {
            normal: {
              color: {
                x: 0,
                y: 0,
                x2: 0,
                y2: 1,
                colorStops: [{
                  offset: 0,
                  color: ydata[i].color || '#207FF7' // 0% å¤„的颜色
                }, {
                  offset: 1,
                  color: 'rgba(255,255,255,.2)' // 100% å¤„的颜色
                }],
                globalCoord: false // ç¼ºçœä¸º false
              }
            }
          },
          lineStyle: { // çº¿æ¡æ ·å¼
            color: {
              type: 'linear',
              x: 0,
              y: 0,
              x2: 0,
              y2: 1,
              colorStops: [{
                offset: 0, color: ydata[i].color || '#207FF7' // 0% å¤„的颜色
              }, {
                offset: 1, color: ydata[i].color || '#207FF7' // 100% å¤„的颜色
              }]
            },
            width: 2 // çº¿æ¡ç²—细
          },
          symbol: 'circle',
          symbolSize: 10,
          itemStyle: {
            borderWidth: 1,
            borderColor: '#fff',
            color: ydata[i].color || '#207FF7'
          },
          smooth: false
        })
      }
      return array
    },
    initEchartCircleDo (id, title, subTitle, data) {
      var option = {
        title: {
          text: '',
          subtext: '',
          left: 'center',
          bottom: 'bottom',
          textStyle: {
            fontSize: 10,
            fontStyle: 'normal',
            fontWeight: 'bold'
          }
        },
        tooltip: {
          trigger: 'item'
        },
        legend: {
          orient: 'vertical',
          left: 'left',
          textStyle: {
            fontSize: 10,
            fontStyle: 'normal',
            fontWeight: 'normal'
          }
        },
        series: [
          {
            name: title || '',
            type: 'pie',
            radius: '50%',
            data: data,
            label: {
              show: true,
              formatter: '{b}:{d}%',
              textStyle: {
                fontSize: 10,
                fontStyle: 'normal',
                fontWeight: 'normal'
              }
            },
            labelLine: {
              show: true
            },
            emphasis: {
              itemStyle: {
                shadowBlur: 10,
                shadowOffsetX: 0,
                shadowColor: 'rgba(0, 0, 0, 0.5)'
              }
            }
          }
        ]
      }
      const myChart = echarts.init(document.getElementById(id))
      myChart.setOption(option)
    }
  }
}
@@ -103,13 +590,14 @@
        }
        &:nth-of-type(3) {
          background: linear-gradient(270deg, #42d49d 0%, #12bb8b 100%);
        }
        &:nth-of-type(4) {
          margin-right: 0;
          background: linear-gradient(270deg, #c430dee3 0%, #cd04b9cf 100%);
        //linear-gradient(270deg, #de3049b8 0%, #cd0421d4 100%);
          //linear-gradient(270deg, #de3049b8 0%, #cd0421d4 100%);
          //background: linear-gradient(270deg, #30d3de 0%, #04b7cd 100%);
        }
@@ -120,19 +608,27 @@
          align-items: center;
          padding: 20px 20px 12px;
          border-bottom: 1px solid rgba(255, 255, 255, 0.2);
          img {
            width: 40px;
            height: 40px;
          }
          .num {
          .num{
            font-weight: 600;
            font-size: 30px;
            margin-top: 12px;
          }
        }
        .orange{
          display: inline-block;
          width: 100px;
          text-shadow: 2px 2px 5px #606266;;
          font-weight: 600;
        }
        .split{
          display: inline-block;
          width: 40px;
          font-size: 10px;
        }
        .numtxt{
          display: inline-block;
          text-shadow: 2px 2px 5px #606266;
        }
        .content {
          height: 82px;
          display: flex;
@@ -275,4 +771,5 @@
    background: linear-gradient(180deg, #076ae5 0%, rgba(32, 127, 247, 0) 100%);
  }
}
</style>
admin/src/views/system/user.vue
@@ -32,7 +32,7 @@
        @sort-change="handleSortChange"
      >
        <el-table-column type="selection" width="55"></el-table-column>
        <el-table-column prop="avatar" label="收款码" width="100px" class-name="table-column-avatar"  >
        <el-table-column prop="avatar" label="收款码" width="220px" class-name="table-column-avatar"  >
          <template slot-scope="{ row }">
              <div class="qrcodediv" :id="`qrcode${row.id}`" :ref="`qrcode${row.id}`"></div>
          </template>
@@ -67,7 +67,6 @@
          v-if="containPermissions(['system:user:update', 'system:user:createUserRole', 'system:user:resetPwd', 'system:user:delete'])"
          label="操作"
          width="270"
          fixed="right"
        >
          <template v-if="isAdmin || (row.id !== userInfo.id && row.roles.findIndex(r => r.code === adminCode) === -1)" slot-scope="{row}">
            <el-button type="text" icon="el-icon-edit" @click="$refs.operaUserWindow.open('编辑用户', row)" v-permissions="['system:user:update']">编辑</el-button>
@@ -189,11 +188,9 @@
        return
      }
      return new QRCode(div, {
        width: 80,
        height: 80,
        text: qrcode1,
        correctLevel: QRCode.CorrectLevel.H,
        useSVG: true
        width: 200,
        height: 200,
        text: qrcode1
      })
    }
  }
admin/vue.config.js
@@ -7,7 +7,7 @@
}
module.exports = {
  publicPath: process.env.VUE_APP_CONTEXT_PATH,
  outputDir: 'dianjiang_admin',
  outputDir: 'admin',
  assetsDir: 'static',
  lintOnSave: false,
  devServer: {
server/admin/pom.xml
@@ -39,7 +39,7 @@
     </dependencies>
    <build>
        <finalName>dianjiang_admin</finalName>
        <finalName>diandongche_admin</finalName>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
server/admin/src/main/java/com/doumee/api/business/OrdersController.java
@@ -8,6 +8,7 @@
import com.doumee.core.model.PageWrap;
import com.doumee.dao.business.model.Orders;
import com.doumee.core.utils.Utils;
import com.doumee.dao.vo.IndexOrderCountVO;
import com.doumee.service.business.OrdersService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@@ -61,6 +62,13 @@
        ordersService.updateById(orders);
        return ApiResponse.success(null);
    }
    @ApiOperation("根据ID查询交易流水信息更新最新交易状态")
    @PostMapping("/updateByPayStatus")
    @RequiresPermissions("business:orders:update")
    public ApiResponse updateByPayStatus(@RequestBody Orders orders) {
        ordersService.updateByPayStatus(orders);
        return ApiResponse.success(null);
    }
    @ApiOperation("分页查询")
    @PostMapping("/page")
@@ -69,6 +77,12 @@
        return ApiResponse.success(ordersService.findPage(pageWrap));
    }
    @ApiOperation("数据统计")
    @PostMapping("/getIndexData")
    public ApiResponse<IndexOrderCountVO> getIndexData (@RequestBody Orders pageWrap) {
        return ApiResponse.success(ordersService.getIndexData(pageWrap));
    }
    @ApiOperation("导出Excel")
    @PostMapping("/exportExcel")
    @RequiresPermissions("business:orders:exportExcel")
server/admin/src/main/java/com/doumee/api/web/WebOrdersController.java
@@ -1,15 +1,11 @@
package com.doumee.api.web;
import com.allinpay.syb.lib.SybConstants;
import com.allinpay.syb.lib.SybUtil;
import com.doumee.api.BaseController;
import com.doumee.core.model.ApiResponse;
import com.doumee.dao.business.dto.PayOrderNotifyParam;
import com.doumee.dao.business.dto.PayOrderParam;
import com.doumee.dao.business.dto.PayOrderResponse;
import com.allinpay.syb.model.PayOrderParam;
import com.allinpay.syb.model.PayOrderResponse;
import com.doumee.dao.business.model.Orders;
import com.doumee.service.business.OrdersService;
import com.fasterxml.jackson.databind.ObjectMapper;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
@@ -17,7 +13,6 @@
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import javax.servlet.ServletException;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@@ -25,8 +20,6 @@
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URLDecoder;
import java.util.Map;
import java.util.TreeMap;
/**
 * è®¢å•记录表信息表Controller定义
server/admin/src/main/resources/application.yml
@@ -5,14 +5,10 @@
project:
  name: è±†ç±³ç”µåŠ¨è½¦
  version: 1.0.0
  # çŽ¯å¢ƒï¼Œç”Ÿäº§çŽ¯å¢ƒproduction,开发环境development
  env: production
  # æ¨¡å¼ï¼Œtesting测试模式
  mode: testing
spring:
  profiles:
    active: dev
    active: pro
  # JSON返回配置
  jackson:
    # é»˜è®¤æ—¶åŒº
server/admin/src/main/resources/logback-spring.xml
@@ -5,7 +5,7 @@
            <pattern>%highlight(%date{yyyy-MM-dd HH:mm:ss}) | %highlight(%-5level) | %highlight(%thread) | %highlight(%logger) | %msg%n</pattern>
        </layout>
    </appender>
    <property name="log.path" value="/usr/local/jars/logs/admin"></property>
    <property name="log.path" value="/www/server/dmpay/logs/admin"></property>
    <property name="log.fileSize" value="100MB"></property>
    <property name="log.historyDays" value="7"></property>
    <appender name="fileInfoLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
server/services/src/main/java/com/allinpay/syb/lib/SybUtil.java
@@ -1,6 +1,5 @@
package com.allinpay.syb.lib;
import java.io.UnsupportedEncodingException;
import java.security.KeyFactory;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
@@ -8,14 +7,13 @@
import java.security.PublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.TreeMap;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;
import com.doumee.dao.business.dto.PayOrderNotifyParam;
import com.allinpay.syb.model.PayOrderNotifyParam;
import org.apache.commons.codec.binary.Base64;
public class SybUtil {
server/services/src/main/java/com/allinpay/syb/model/PayOrderNotifyParam.java
ÎļþÃû´Ó server/services/src/main/java/com/doumee/dao/business/dto/PayOrderNotifyParam.java ÐÞ¸Ä
@@ -1,4 +1,4 @@
package com.doumee.dao.business.dto;
package com.allinpay.syb.model;
import io.swagger.annotations.ApiModel;
import lombok.Data;
@@ -12,6 +12,8 @@
@ApiModel("订单支付参数异步通知返回")
public class PayOrderNotifyParam {
   private String retcode;//    string    å¦    æ”¶é“¶å®APPID    8
   private String retmsg;//    string    å¦    æ”¶é“¶å®APPID    8
   private String appid;//    string    å¦    æ”¶é“¶å®APPID    8
    private String    outtrxid    ;//    string    å¦    ç¬¬ä¸‰æ–¹äº¤æ˜“号    50    æš‚未启用
    private String   trxcode;//        string    å¦    äº¤æ˜“类型    8    è¯¦è§é™„录交易类型
server/services/src/main/java/com/allinpay/syb/model/PayOrderParam.java
ÎļþÃû´Ó server/services/src/main/java/com/doumee/dao/business/dto/PayOrderParam.java ÐÞ¸Ä
@@ -1,4 +1,4 @@
package com.doumee.dao.business.dto;
package com.allinpay.syb.model;
import io.swagger.annotations.ApiModel;
import lombok.Data;
server/services/src/main/java/com/allinpay/syb/model/PayOrderResponse.java
ÎļþÃû´Ó server/services/src/main/java/com/doumee/dao/business/dto/PayOrderResponse.java ÐÞ¸Ä
@@ -1,4 +1,4 @@
package com.doumee.dao.business.dto;
package com.allinpay.syb.model;
import io.swagger.annotations.ApiModel;
import lombok.Data;
server/services/src/main/java/com/allinpay/syb/model/PayPublicModel.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,24 @@
package com.allinpay.syb.model;
import io.swagger.annotations.ApiModel;
import lombok.Data;
/**
 * å‘˜å·¥ä¿¡æ¯å¯¼å…¥è¡¨
 * @author æ±Ÿè¹„蹄
 * @date 2024/01/16 10:03
 */
@Data
@ApiModel("通联公共配置参数")
public class PayPublicModel {
    private String appid;
    private String cusid;
    private String version;
    private String signtype;
    private String appkey;
    private String url;
    private String appPubkey;
}
server/services/src/main/java/com/doumee/dao/business/model/Orders.java
@@ -102,7 +102,7 @@
    private Date cancelDate;
    @ApiModelProperty("取消方式  0自动取消;1手动取消")
    @ExcelColumn(name="取消方式  0自动取消;1手动取消",index=22 ,width=10)
    private String cancelWay;
    private Integer cancelWay;
    @ApiModelProperty("取消备注")
    @ExcelColumn(name="取消备注",index=23 ,width=10)
    private String cancelInfo;
@@ -127,4 +127,7 @@
    @ApiModelProperty("负责人姓名")
    @TableField(exist = false)
    private String userRealname;
    @ApiModelProperty("统计量")
    @TableField(exist = false)
    private Long num;
}
server/services/src/main/java/com/doumee/dao/vo/IndexOrderCountVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,68 @@
package com.doumee.dao.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Rk
 * @create 2026/1/28 10:43
 */
@Data
@ApiModel("工作台数据统计对象")
public class IndexOrderCountVO {
    @ApiModelProperty(value = "总交易额")
    private BigDecimal todayMoney;
    @ApiModelProperty(value = "车款交易额")
    private BigDecimal todayMoney0;
    @ApiModelProperty(value = "延期款交易额")
    private BigDecimal todayMoney1;
    @ApiModelProperty(value = "总交易额(未支付)")
    private BigDecimal todayWaitMoney;
    @ApiModelProperty(value = "车款交易额(未支付)")
    private BigDecimal todayWaitMoney0;
    @ApiModelProperty(value = "延期款交易额(未支付)")
    private BigDecimal todayWaitMoney1;
    @ApiModelProperty(value = "总交易额(完成支付)")
    private BigDecimal todayDoneMoney;
    @ApiModelProperty(value = "车款交易额(完成支付)")
    private BigDecimal todayDoneMoney0;
    @ApiModelProperty(value = "延期款交易额(完成支付)")
    private BigDecimal todayDoneMoney1;
    @ApiModelProperty(value = "总交易额(支付失败)")
    private BigDecimal todayFailMoney;
    @ApiModelProperty(value = "车款交易额(支付失败)")
    private BigDecimal todayFailMoney0;
    @ApiModelProperty(value = "延期款交易额(支付失败)")
    private BigDecimal todayFailMoney1;
    @ApiModelProperty(value = "总交易数量")
    private Long todayNum;
    @ApiModelProperty(value = "车款交易数量")
    private Long todayNum0;
    @ApiModelProperty(value = "延期款交易数量")
    private Long todayNum1;
    @ApiModelProperty(value = "总交易数量(未支付)")
    private Long todayWaitNum;
    @ApiModelProperty(value = "车款交易数量(未支付)")
    private Long todayWaitNum0;
    @ApiModelProperty(value = "延期款交易数量(未支付)")
    private Long todayWaitNum1;
    @ApiModelProperty(value = "总交易数量(完成支付)")
    private Long todayDoneNum;
    @ApiModelProperty(value = "车款交易数量(完成支付)")
    private Long todayDoneNum0;
    @ApiModelProperty(value = "延期款交易数量(完成支付)")
    private Long todayDoneNum1;
    @ApiModelProperty(value = "总交易数量(支付失败)")
    private Long todayFailNum;
    @ApiModelProperty(value = "车款交易数量(支付失败)")
    private Long todayFailNum0;
    @ApiModelProperty(value = "延期款交易数量(支付失败)")
    private Long todayFailNum1;
}
server/services/src/main/java/com/doumee/service/business/OrdersService.java
@@ -2,12 +2,12 @@
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.dao.business.dto.PayOrderNotifyParam;
import com.doumee.dao.business.dto.PayOrderParam;
import com.doumee.dao.business.dto.PayOrderResponse;
import com.allinpay.syb.model.PayOrderParam;
import com.allinpay.syb.model.PayOrderResponse;
import com.doumee.dao.business.model.Orders;
import com.doumee.dao.vo.IndexOrderCountVO;
import io.swagger.models.auth.In;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
@@ -108,4 +108,7 @@
    void returnPage(PayOrderParam param, HttpServletResponse response) throws IOException;
    void autoCancelNoPay();
    void updateByPayStatus(Orders orders);
    IndexOrderCountVO getIndexData(Orders pageWrap);
}
server/services/src/main/java/com/doumee/service/business/impl/OrdersServiceImpl.java
@@ -5,6 +5,8 @@
import com.alibaba.fastjson.TypeReference;
import com.allinpay.syb.lib.SybConstants;
import com.allinpay.syb.lib.SybUtil;
import com.allinpay.syb.model.PayPublicModel;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.doumee.biz.system.SystemDictDataBiz;
import com.doumee.core.constants.Constants;
import com.doumee.core.constants.ResponseStatus;
@@ -12,20 +14,23 @@
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.core.utils.DateUtil;
import com.doumee.dao.business.dto.PayOrderNotifyParam;
import com.doumee.dao.business.dto.PayOrderParam;
import com.doumee.dao.business.dto.PayOrderResponse;
import com.doumee.core.utils.HttpsUtil;
import com.allinpay.syb.model.PayOrderNotifyParam;
import com.allinpay.syb.model.PayOrderParam;
import com.allinpay.syb.model.PayOrderResponse;
import com.doumee.dao.business.model.Orders;
import com.doumee.core.utils.Utils;
import com.doumee.dao.business.OrdersMapper;
import com.doumee.dao.system.SystemUserMapper;
import com.doumee.dao.system.model.SystemUser;
import com.doumee.dao.vo.IndexOrderCountVO;
import com.doumee.service.business.OrdersService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import io.swagger.models.auth.In;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
@@ -37,6 +42,7 @@
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.math.BigDecimal;
import java.net.URLEncoder;
import java.util.*;
/**
@@ -95,14 +101,21 @@
            param.setCusid(systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.PAY_SYB_CUSID).getCode());
            param.setVersion(systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.PAY_VERSION).getCode());
            param.setCharset("utf-8");
            param.setTrxamt("1");//单位分
            param.setTrxamt(orders.getMoney().intValue()+"");//单位分
            param.setRandomstr(UUID.randomUUID().toString().replace("-",""));
            param.setReqsn(""+orders.getId());
            param.setReturl(systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.PAY_RETURN_URL).getCode());
            param.setNotify_url( systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.PAY_NOTIFY_URL).getCode());
            param.setBody(StringUtils.defaultString(orders.getName(),"") +"-"
                    + StringUtils.defaultString(orders.getPhone(),"")+ "-"
                    +StringUtils.defaultString(orders.getRemark(),""));
            String remark = (Constants.equalsInteger(orders.getType(),Constants.ZERO)?"车款":"延期款")
                    +"-"+ StringUtils.defaultString(orders.getName(),"") +"-"
                    + StringUtils.defaultString(orders.getPhone(),"");
            if(StringUtils.isNotBlank(orders.getRemark())){
                remark += "-"+StringUtils.defaultString(orders.getRemark(),"");
            }
            if(remark.length()>300){
                remark = remark.substring(0,300);
            }
            param.setBody(remark);
            param.setValidtime(  systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.PAY_VALID_TIME).getCode());
            param.setSigntype(  systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.PAY_SIGN_TYPE).getCode());
@@ -218,7 +231,7 @@
        queryWrapper.eq(pageWrap.getModel().getPayMethod() != null,Orders::getPayMethod, pageWrap.getModel().getPayMethod());
        queryWrapper.eq(pageWrap.getModel().getPayOrderId() != null,Orders::getPayOrderId, pageWrap.getModel().getPayOrderId());
        queryWrapper.ge(pageWrap.getModel().getStarttime()!=null,Orders::getCreateTime , pageWrap.getModel().getStarttime());
        queryWrapper.ne(pageWrap.getModel().getEndtime()!=null,Orders::getCreateTime , pageWrap.getModel().getEndtime());
        queryWrapper.le(pageWrap.getModel().getEndtime()!=null,Orders::getCreateTime , pageWrap.getModel().getEndtime());
        queryWrapper.eq(pageWrap.getModel().getCancelWay() != null,Orders::getCancelWay, pageWrap.getModel().getCancelWay());
        queryWrapper.eq(pageWrap.getModel().getCancelInfo() != null,Orders::getCancelInfo, pageWrap.getModel().getCancelInfo());
        queryWrapper.eq(pageWrap.getModel().getCancelUserId() != null,Orders::getCancelUserId, pageWrap.getModel().getCancelUserId());
@@ -227,6 +240,107 @@
        queryWrapper.orderByDesc(Orders::getId);
        return PageData.from(ordersMapper.selectJoinPage(page,Orders.class, queryWrapper));
    }
    @Override
    public IndexOrderCountVO getIndexData(Orders pageWrap) {
        IndexOrderCountVO data = initIndexOrderCountMoel();
       List<Orders> list = ordersMapper.selectList(new QueryWrapper<Orders>()
                .select("status,type,count(id) as num,sum(money) as money")
                .lambda()
                .eq(Orders::getDeleted,Constants.ZERO )
                .apply("to_days(create_time) =to_days(now())")
                .groupBy(Orders::getType,Orders::getStatus));//按类型和状态分组
        if(list!=null){
            for(Orders model:list){
                data.setTodayNum(data.getTodayNum()+Constants.formatLongNum(model.getNum()));
                data.setTodayMoney(data.getTodayMoney().add(Constants.formatBigDecimal(model.getMoney())));
                if(Constants.equalsInteger(model.getType(),Constants.ONE)){
                    data.setTodayNum1(data.getTodayNum1()+Constants.formatLongNum(model.getNum()));
                    data.setTodayMoney1(data.getTodayMoney1().add(Constants.formatBigDecimal(model.getMoney())));
                    //延期款
                    if(Constants.equalsInteger(model.getStatus(),Constants.ONE)){
                        //交易成功
                        data.setTodayDoneNum(data.getTodayDoneNum()+Constants.formatLongNum(model.getNum()));
                        data.setTodayDoneMoney(data.getTodayDoneMoney().add(Constants.formatBigDecimal(model.getMoney())));
                        data.setTodayDoneNum1(data.getTodayDoneNum1()+Constants.formatLongNum(model.getNum()));
                        data.setTodayDoneMoney1(data.getTodayDoneMoney1().add(Constants.formatBigDecimal(model.getMoney())));
                    }else  if(Constants.equalsInteger(model.getStatus(),Constants.ZERO)){
                        //交易中
                        data.setTodayWaitNum(data.getTodayWaitNum()+Constants.formatLongNum(model.getNum()));
                        data.setTodayWaitMoney(data.getTodayWaitMoney().add(Constants.formatBigDecimal(model.getMoney())));
                        data.setTodayWaitNum1(data.getTodayWaitNum1()+Constants.formatLongNum(model.getNum()));
                        data.setTodayWaitMoney1(data.getTodayWaitMoney1().add(Constants.formatBigDecimal(model.getMoney())));
                    }else {
                        //交易失败
                        data.setTodayFailNum1(data.getTodayFailNum1()+Constants.formatLongNum(model.getNum()));
                        data.setTodayFailMoney1(data.getTodayFailMoney1().add(Constants.formatBigDecimal(model.getMoney())));
                        data.setTodayFailNum(data.getTodayFailNum()+Constants.formatLongNum(model.getNum()));
                        data.setTodayFailMoney(data.getTodayFailMoney().add(Constants.formatBigDecimal(model.getMoney())));
                    }
                }else{
                    //车款
                    data.setTodayNum0(data.getTodayNum0()+Constants.formatLongNum(model.getNum()));
                    data.setTodayMoney0(data.getTodayMoney0().add(Constants.formatBigDecimal(model.getMoney())));
                    //延期款
                    if(Constants.equalsInteger(model.getStatus(),Constants.ONE)){
                        //交易成功
                        data.setTodayDoneNum(data.getTodayDoneNum()+Constants.formatLongNum(model.getNum()));
                        data.setTodayDoneMoney(data.getTodayDoneMoney().add(Constants.formatBigDecimal(model.getMoney())));
                        data.setTodayDoneNum0(data.getTodayDoneNum0()+Constants.formatLongNum(model.getNum()));
                        data.setTodayDoneMoney0(data.getTodayDoneMoney0().add(Constants.formatBigDecimal(model.getMoney())));
                    }else  if(Constants.equalsInteger(model.getStatus(),Constants.ZERO)){
                        //交易中
                        data.setTodayWaitNum(data.getTodayWaitNum()+Constants.formatLongNum(model.getNum()));
                        data.setTodayWaitMoney(data.getTodayWaitMoney().add(Constants.formatBigDecimal(model.getMoney())));
                        data.setTodayWaitNum0(data.getTodayWaitNum0()+Constants.formatLongNum(model.getNum()));
                        data.setTodayWaitMoney0(data.getTodayWaitMoney0().add(Constants.formatBigDecimal(model.getMoney())));
                    }else {
                        //交易失败
                        data.setTodayFailNum(data.getTodayFailNum()+Constants.formatLongNum(model.getNum()));
                        data.setTodayFailMoney(data.getTodayFailMoney().add(Constants.formatBigDecimal(model.getMoney())));
                        data.setTodayFailNum0(data.getTodayFailNum0()+Constants.formatLongNum(model.getNum()));
                        data.setTodayFailMoney0(data.getTodayFailMoney0().add(Constants.formatBigDecimal(model.getMoney())));
                    }
                }
            }
        }
        return  data;
    }
    private IndexOrderCountVO initIndexOrderCountMoel() {
        IndexOrderCountVO data = new IndexOrderCountVO();
        data.setTodayMoney(new BigDecimal(0));
        data.setTodayMoney0(new BigDecimal(0));
        data.setTodayMoney1(new BigDecimal(0));
        data.setTodayNum(0l);
        data.setTodayNum0(0l);
        data.setTodayNum1(0l);
        data.setTodayDoneMoney(new BigDecimal(0));
        data.setTodayDoneMoney0(new BigDecimal(0));
        data.setTodayDoneMoney1(new BigDecimal(0));
        data.setTodayDoneNum(0l);
        data.setTodayDoneNum0(0l);
        data.setTodayDoneNum1(0l);
        data.setTodayWaitMoney(new BigDecimal(0));
        data.setTodayWaitMoney0(new BigDecimal(0));
        data.setTodayWaitMoney1(new BigDecimal(0));
        data.setTodayWaitNum(0l);
        data.setTodayWaitNum0(0l);
        data.setTodayWaitNum1(0l);
        data.setTodayFailMoney(new BigDecimal(0));
        data.setTodayFailMoney0(new BigDecimal(0));
        data.setTodayFailMoney1(new BigDecimal(0));
        data.setTodayFailNum(0l);
        data.setTodayFailNum0(0l);
        data.setTodayFailNum1(0l);
        return data;
    }
    @Override
    public long count(Orders orders) {
        QueryWrapper<Orders> wrapper = new QueryWrapper<>(orders);
@@ -238,17 +352,142 @@
        try {
            time = Integer.parseInt(systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.PAY_VALID_TIME).getCode());
        }catch (Exception e){
        }
        Date date = new Date();
        ordersMapper.update(null,new UpdateWrapper<Orders>().lambda()
                .set(Orders::getStatus,Constants.TWO)
                .set(Orders::getCancelInfo,"超时未支付,自动取消")
                .set(Orders::getCancelWay,Constants.ZERO)
                .set(Orders::getCancelDate,date)
                .set(Orders::getUpdateTime,date)
        List<Orders> orderList =  ordersMapper.selectList(new QueryWrapper<Orders>().lambda()
                .eq(Orders::getStatus,Constants.ZERO)
                .apply("TIMESTAMPDIFF(MINUTE, create_time ,now()) > "+time));
        if(orderList !=null && orderList.size()>0){
            PayPublicModel publicModel = initPayPublicModel();
            Date date = new Date();
            for(Orders model : orderList){
                queryPayOrderDetailBiz(model,publicModel,date,time);
            }
        }
    }
    @Override
    public  void updateByPayStatus(Orders param) {
        int time = 30;
        try {
            time = Integer.parseInt(systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.PAY_VALID_TIME).getCode());
        }catch (Exception e){
        }
        Orders  model =  ordersMapper.selectById(param.getId());
        if(model !=null ){
            PayPublicModel publicModel = initPayPublicModel();
            Date date = new Date();
            queryPayOrderDetailBiz(model,publicModel,date,time);
        }
    }
    private void queryPayOrderDetailBiz(Orders model, PayPublicModel publicModel, Date date,int time) {
        TreeMap<String,String> params = new TreeMap<String,String>();
        params.put("cusid",publicModel.getCusid());
        params.put("appid",publicModel.getAppid());
        params.put("version",publicModel.getVersion());
        params.put("trxid", "");
        params.put("randomstr", SybUtil.getValidatecode(8));
        params.put("signtype", publicModel.getSigntype());
        String appkey = publicModel.getAppkey();
        String url =  publicModel.getUrl();
        String appPubkey = publicModel.getAppPubkey();
        params.remove("sign");
        params.put("reqsn", model.getId()+"");
        PayOrderNotifyParam map = query(params,url,appkey,appPubkey);
        int status = Constants.TWO;
        if(map!=null){
            String info = SybUtil.getPayInfoByStatus(map);
            if(StringUtils.equals(map.getTrxcode(),"VSP501")
                    ||StringUtils.equals(map.getTrxcode(),"VSP511")
                    ||StringUtils.equals(map.getTrxcode(),"VSP551")){
                //交易类型是 å¾®ä¿¡æ”¯ä»˜ ã€æ”¯ä»˜å®æ”¯ä»˜æˆ–者银联扫码支付,记录支付状态
                if(StringUtils.equals(map.getTrxstatus(),"0000")){
                    //交易成功
                    model.setPayStatus(Constants.ONE);
                    status = Constants.ONE;
                } else if (StringUtils.equals(map.getTrxstatus(),"2000") || StringUtils.equals(map.getTrxstatus(),"2008")) {
                    //如果交易未支付,并且未超过半小时,不处理
                    if(date.getTime() - model.getCreateTime().getTime() < 30*60*1000){
                        return;
                    }
                }
            }
            model.setPayFee(map.getFee());
            model.setStatus(status);
            model.setPayDate(DateUtil.fromStringToDate("yyyyMMddHHmmss",map.getPaytime()));
            model.setPayOrderId(map.getSrctrxid());//通联订单号
            model.setPayThirdOrderId(map.getChnltrxid());//支付宝微信订单号
            model.setPayThirdOrderData(map.getChnldata());//三方交易渠道数据
            model.setPayInfo(info);
            model.setPayCode(map.getTrxcode());
        }else{
            model.setCancelDate(date);
            model.setCancelInfo("超时未支付,自动取消");
            model.setCancelWay(Constants.ZERO);
            model.setStatus(Constants.TWO);
        }
        model.setUpdateTime(date);
        ordersMapper.updateById(model) ;
    }
    private PayPublicModel initPayPublicModel() {
        PayPublicModel model = new PayPublicModel();
        model.setUrl(systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.PAY_SYB_CUSID).getCode());
        model.setCusid( systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.PAY_SYB_CUSID).getCode());
        model.setAppid(systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.PAY_SYB_APPID).getCode());
        model.setVersion(systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.PAY_VERSION).getCode());
        model.setSigntype( systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.PAY_SIGN_TYPE).getCode());
        model.setAppkey(systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.PAY_APPKEY).getCode());
        model.setUrl(systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.PAY_SYB_APIURL).getCode());
        model.setAppPubkey( systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.PAY_SYB_RSATLPUBKEY).getCode());
        return model;
    }
    public  PayOrderNotifyParam query( TreeMap<String,String> params,String url,String appkey,String pubKey )  {
        try {
            params.put("sign", SybUtil.unionSign(params,appkey,SybConstants.SIGN_TYPE));
            String data =getHttpParamsStr(params);
            log.error("订单查询数据请求================{}",data);
            String result =  HttpsUtil.post(url+"/tranx/query",data,"application/x-www-form-urlencoded",true);
            log.error("订单查询数据返回================{}",result);
            PayOrderNotifyParam map = handleResult(result,pubKey,params.get("signtype"));
            return map;
        }catch (Exception e){
            log.error("通联订单查询异常================{}",e);
        }
        return  null;
    }
    public String getHttpParamsStr(Map<String, String> params ) throws IOException {
        StringBuilder outBuf = new StringBuilder();
        boolean isNotFirst = false;
        for (Map.Entry<String, String> entry: params.entrySet()){
            if (isNotFirst)
                outBuf.append('&');
            isNotFirst = true;
            outBuf
                    .append(entry.getKey())
                    .append('=')
                    .append(URLEncoder.encode(entry.getValue(), "UTF-8"));
        }
        System.out.println("参数:"+outBuf.toString());
        return outBuf.toString();
    }
    public static PayOrderNotifyParam handleResult(String result,String pubKey,String signType) throws Exception{
        log.error("返回数据返回================{}",result);
        Map map = SybUtil.json2ObjMap(result);
        if(map == null){
            log.error("返回数据返回错误================{}",result);
            throw new Exception("返回数据错误");
        }
        if("SUCCESS".equals(map.get("retcode"))){
            TreeMap tmap = new TreeMap();
            tmap.putAll(map);
            if(SybUtil.validSign(tmap, pubKey, signType)){
                PayOrderNotifyParam param = JSONObject.toJavaObject(JSONObject.parseObject(result),PayOrderNotifyParam.class);
                return param;
            }
        }
        return null;
    }
    @Override
    public void returnPage(PayOrderParam param, HttpServletResponse response) throws IOException {
@@ -281,7 +520,7 @@
                    r ="支付结果异常,订单查询失败,如有疑问请联系客服人员";
                    return;
                }
                if(Constants.equalsInteger(model.getPayStatus(),Constants.ONE)){
                 if(Constants.equalsInteger(model.getPayStatus(),Constants.ONE)){
                    log.error("支付处理======订单已支付"+map.getCusorderid());
                    return;
                }
@@ -338,4 +577,6 @@
        return map;
    }
}
server/services/src/main/java/com/doumee/service/system/impl/SystemLoginServiceImpl.java
@@ -52,7 +52,7 @@
        loginLog.setClientInfo(Utils.User_Client.getBrowser(request));
        loginLog.setOsInfo(Utils.User_Client.getOS(request));
        loginLog.setServerIp(Utils.Server.getIP());
        if(StringUtils.equals(projectEnv,"development")){
        if(!StringUtils.equals(projectEnv,"development")){
            // æ ¡éªŒéªŒè¯ç 
            try {
                captchaService.check(dto.getUuid(), dto.getCode());
server/services/src/main/resources/application-pro.yml
@@ -1,60 +1,77 @@
spring:
  # æ•°æ®æºé…ç½®
  datasource:
    url: jdbc:mysql://192.168.0.211:3306/diandongche?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
    username: root
    password: Doumee@168
    url: jdbc:mysql://57b57595ddc66.sh.cdb.myqcloud.com:4464/diandongche?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
    username: test
    password: doumee@168
    driver-class-name: com.mysql.cj.jdbc.Driver
    type: com.alibaba.druid.pool.DruidDataSource
  redis:
    #    database: 0
    host: 127.0.0.1
    port: 6379
    password:
    password: ms!123!
    timeout: 5000      # è¿žæŽ¥æ± ä¸­çš„æœ€å°ç©ºé—²è¿žæŽ¥
  jackson:
    time-zone: GMT+8
    date-format: yyyy-MM-dd HH:mm:ss
  mail:
    host: smtp.aliyun.com
    port: 465
    username: your_email@aliyun.com
    password: your_password
    host: smtp.exmail.qq.com
    username: jp@doumee.com
    password: 2Jz9HFW2U7vRnCRu
    default-encoding: UTF-8
    properties:
      mail:
        smtp:
          auth: true
          starttls:
            enable: true
            required: true
          ssl:
            enable: true
debug_model: false
        starttls:
          enable: true
          required: true
debug_model: true
# Swagger配置
swagger:
  host: 127.0.0.1
  host:
  title: ${project.name}接口文档
  description: ${project.name}接口文档
  # å¯ç”¨Swagger,生产环境建议关闭
  enabled: true
  context-path:
  # å¯ç”¨swagger加密
  enable-encrypt: true
  # ç¦ç”¨swagger时的重定向地址
  redirect-uri: /
des_pwd: 123456SDFKDJF
des_pwd: 123456SDFKDJF
knife4j:
  enable: true
  basic:
    enable: true
    username: admin
    password: doumee@168
upload:
  type: blob
    password: 111111
aes:
  encrypt:
    open: true # æ˜¯å¦å¼€å¯åР坆 true  or  false
    showLog: true # æ˜¯å¦æ‰“印加解密log true  or  false
    publicKey: mN4Yn8Or8r7SH1w3 # AES密钥
    privateKey:  # RSA私钥
    time: 600000
upload:
  type: ftp
project:
  # çŽ¯å¢ƒï¼Œç”Ÿäº§çŽ¯å¢ƒproduction,开发环境development
  env: production
  # æ¨¡å¼ï¼Œtesting测试模式
  mode: production
  mode: production
dingtalk:
  clientId: dingulzemj5bynjciapg
  clientSecret: tLnWtSmmTuqjX9a1MvJzYxI1iXVJxEwtyZZYYFQ5cLg57pzzCZ4J8VsVwvmRNtkK
server/services/src/main/resources/application-test.yml
@@ -1,9 +1,9 @@
spring:
  # æ•°æ®æºé…ç½®
  datasource:
    url: jdbc:mysql://192.168.0.211:3306/diandongche?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
    username: root
    password: Doumee@168
    url: jdbc:mysql://57b57595ddc66.sh.cdb.myqcloud.com:4464/diandongche?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
    username: test
    password: doumee@168
    driver-class-name: com.mysql.cj.jdbc.Driver
    type: com.alibaba.druid.pool.DruidDataSource
  redis:
@@ -15,24 +15,7 @@
  jackson:
    time-zone: GMT+8
    date-format: yyyy-MM-dd HH:mm:ss
#  mail:
#    username: jiangping0849@outlook.com
#    password: mwzaislgioyhxnig
#    host: smtp-mail.outlook.com
#    port: 587
#    default-encoding: UTF-8
#    properties:
#      mail:
#        debug: true
#        smtp:
#          ssl:
#            socketFactory:
#              class: com.sun.mail.util.MailSSLSocketFactory
#              fallback: false
#          auth: true
#          starttls:
#            enable: true
#            required: true
  mail:
    host: smtp.exmail.qq.com
    username: jp@doumee.com
@@ -69,13 +52,26 @@
    username: admin
    password: 111111
aes:
  encrypt:
    open: true # æ˜¯å¦å¼€å¯åР坆 true  or  false
    showLog: true # æ˜¯å¦æ‰“印加解密log true  or  false
    publicKey: mN4Yn8Or8r7SH1w3 # AES密钥
    privateKey:  # RSA私钥
    time: 600000
upload:
  type: blob
  type: ftp
project:
  # çŽ¯å¢ƒï¼Œç”Ÿäº§çŽ¯å¢ƒproduction,开发环境development
  env: production
  env: development
  # æ¨¡å¼ï¼Œtesting测试模式
  mode: testing
  mode: testing
dingtalk:
  clientId: dingulzemj5bynjciapg
  clientSecret: tLnWtSmmTuqjX9a1MvJzYxI1iXVJxEwtyZZYYFQ5cLg57pzzCZ4J8VsVwvmRNtkK
server/startsh/admin_start.sh
@@ -2,8 +2,7 @@
killall java
nohup java -jar /usr/local/jars/jinkuai/jinkuai_admin.jar > /dev/null 2>&1 &
nohup java -jar /usr/local/jars/jinkuai/jinkuai_web.jar > /dev/null 2>&1 &
nohup java -jar /www/server/dmpay/diandongche_admin.jar > /dev/null 2>&1 &
cd  /data/jars/lianhelihua/logs
tail -f /data/jars/lianhelihua/logs/info.2025-05-19.1.log
cd  /www/server/dmpay/logs
tail -f /www/server/dmpay/logs/info.2025-05-19.1.log
web/pages.json
@@ -3,7 +3,7 @@
        {
            "path": "pages/index/index",
            "style": {
                "navigationBarTitleText": "电动车收款",
                "navigationBarTitleText": "智租蜂",
                "navigationStyle": "custom"
            }
        },
@@ -17,7 +17,7 @@
    ],
    "globalStyle": {
        "navigationBarTextStyle": "black",
        "navigationBarTitleText": "电动车收款",
        "navigationBarTitleText": "智租蜂",
        "navigationBarBackgroundColor": "#F8F8F8",
        "backgroundColor": "#F8F8F8"
    },
web/pages/index/index.vue
@@ -1,5 +1,5 @@
<template>
    <view class="content">
    <view class="content" v-if="validPath">
        <view class="banner">
            <image src="/static/banner.png" mode="widthFix"></image>
        </view>
@@ -38,6 +38,10 @@
        </view>
        <view class="btn" @click="sendSave">去支付</view>
    </view>
    <view class="box" v-else>
        <image src="/static/ic_payfail.png" mode="widthFix" class="icon"></image>
        <view class="title" >请使用微信或者支付宝应用扫码打开</view>
    </view>
</template>
<script>
@@ -46,6 +50,7 @@
        data() {
            return {
                flag:'name',
                validPath : true,
                form: {
                    type: 0,
                    name: '',
@@ -59,9 +64,26 @@
        },
        mounted() {
            this.loading=false
            this.validPath = this.isWeChatBrowser() || this.isAlipayBrowser()
            this.form.userId = this.fetchParams("userId",window.location.href)
        },
        methods: {
            // åˆ¤æ–­æ˜¯å¦åœ¨å¾®ä¿¡æµè§ˆå™¨ä¸­æ‰“å¼€
            isWeChatBrowser() {
              // #ifdef H5
              const userAgent = navigator.userAgent.toLowerCase();
              return userAgent.indexOf('micromessenger') !== -1;
              // #endif
              return false;
            },
            // åˆ¤æ–­æ˜¯å¦åœ¨æ”¯ä»˜å®æµè§ˆå™¨ä¸­æ‰“å¼€
            isAlipayBrowser() {
              // #ifdef H5
              const userAgent = navigator.userAgent.toLowerCase();
              return userAgent.indexOf('alipayclient') !== -1;
              // #endif
              return false;
            },
            toSuccess() {
                uni.navigateTo({
                    url: '/pages/success/success'
@@ -78,7 +100,7 @@
            },
            async sendSave() {
                if(this.loading){
                    return
                    // return
                }
                this.loading=true
                var that = this
@@ -92,6 +114,13 @@
                if(!this.form.phone){
                    uni.showToast({
                        'title': '请输入手机号',icon:'none'
                    })
                    this.loading=false
                    return
                }
                if(this.form.phone.length != 11){
                    uni.showToast({
                        'title': '请输入正确的11位手机号',icon:'none'
                    })
                    this.loading=false
                    return
@@ -133,7 +162,7 @@
                       demo_form.submit() 
                       
                    // this.toSuccess()
                }
                }
                this.loading=false
            },
        }
@@ -141,6 +170,25 @@
</script>
<style lang="scss" scoped>
    .box {
        width: 100%;
        padding: 0 40rpx;
        box-sizing: border-box;
        display: flex;
        align-items: center;
        justify-content: center;
        flex-direction: column;
        .icon {
            width: 180rpx;
            height: 180rpx;
            margin-top: 54rpx;
        }
        .title {
            font-size: 32rpx;
            color: #222222;
            margin-top: 32rpx;
        }
    }
    .content {
        width: 100%;
        padding: 20rpx 30rpx;
@@ -223,7 +271,7 @@
                        width: 100%;
                        font-weight: 400;
                        font-size: 28rpx;
                        color: #999999;
                        //color: #999999;
                        text-align: right;
                    }
                }
web/pages/success/success.vue
@@ -6,7 +6,8 @@
            <image v-else src="/static/ic_paysuccess@2x.png" mode="widthFix" class="icon"></image>
    
        </template>
        <view class="title">{{info.status==0?'等待支付':(info.status==1?'支付成功':'支付失败')}}</view>
        <view class="title" v-if="info.id">{{info.status==0?'等待支付':(info.status==1?'支付成功':'支付失败')}}</view>
        <view class="title" v-if="!info.id">查询中</view>
        <view class="info">
            <view class="info-item">
                <view class="info-item-label">付款事由</view>
web/unpackage/dist/build/web/index.html
@@ -1,2 +1,2 @@
<!DOCTYPE html><html lang=zh-CN><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><title>智租蜂</title><script>var coverSupport = 'CSS' in window && typeof CSS.supports === 'function' && (CSS.supports('top: env(a)') || CSS.supports('top: constant(a)'))
            document.write('<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0' + (coverSupport ? ', viewport-fit=cover' : '') + '" />')</script><link rel=stylesheet href=/web/static/index.883130ca.css></head><body><noscript><strong>Please enable JavaScript to continue.</strong></noscript><div id=app></div><script src=/web/static/js/chunk-vendors.b176ace3.js></script><script src=/web/static/js/index.a2491d9d.js></script></body></html>
            document.write('<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0' + (coverSupport ? ', viewport-fit=cover' : '') + '" />')</script><link rel=stylesheet href=/web/static/index.883130ca.css></head><body><noscript><strong>Please enable JavaScript to continue.</strong></noscript><div id=app></div><script src=/web/static/js/chunk-vendors.b176ace3.js></script><script src=/web/static/js/index.8a442d3d.js></script></body></html>
web/utils/config.js
@@ -1,5 +1,6 @@
//export const baseUrl = 'http://localhost:11010/'
export const baseUrl = 'http://t569e369.natappfree.cc/admin_interface/'
export const app_url = 'https://atwl.ahzyssl.com/zhyq_h5/#/'
//export const baseUrl = 'http://t569e369.natappfree.cc/admin_interface/'
export const baseUrl = 'https://pay.smartbee.run/admin_interface/'
export const app_url = 'https://pay.smartbee.run/web/#/'