k94314517
2025-07-16 4384ad3db8f10b7add5f287681c069d4efb1e0ee
Merge remote-tracking branch 'origin/master'
已添加2个文件
已修改8个文件
722 ■■■■■ 文件已修改
admin/src/api/business/orders.js 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaIdentityDetailWindow.vue 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaMemberDetailWindow.vue 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaOrderDetailWindow.vue 485 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/orderProgress.vue 103 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/layouts/TableLayout.vue 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/orders.vue 70 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/core/utils/huaweiOBS/ObsUtil.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/business/model/Orders.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/impl/OrdersServiceImpl.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/business/orders.js
@@ -11,10 +11,20 @@
    trim: true
  })
}
// å¯¼å‡ºExcel
export function exportExcel (data) {
  return request.post('/business/orders/exportExcel', data, {
    download: true,
    trim: true
  })
}
// åˆ›å»º
export function create (data) {
  return request.post('/business/orders/create', data)
}
export function cancel (id) {
  return request.get(`/business/orders/cancel?id=${id}`)
}
// ä¿®æ”¹
@@ -26,6 +36,10 @@
export function deleteById (id) {
  return request.get(`/business/orders/delete/${id}`)
}
// åˆ é™¤
export function getById (id) {
  return request.get(`/business/orders/${id}`)
}
// æ‰¹é‡åˆ é™¤
export function deleteByIdInBatch (ids) {
admin/src/components/business/OperaIdentityDetailWindow.vue
@@ -59,7 +59,12 @@
              <div class="line"> <span class="label">认证资料:</span> <span v-if="!item.imgList || item.imgList.length==0" class="txt">无</span> </div>
            </template>
            <template v-else>
              <div class="line">  <span class="label">身份信息:</span> <span v-if="!item.imgList || item.imgList.length==0" class="txt">无</span> </div>
              <div class="line">
                <span class="label">接单位置:</span><span class="txt">{{item.location || '' }}</span>
              </div>
              <div class="line">
                <span class="label">身份信息:</span> <span v-if="!item.imgList || item.imgList.length==0" class="txt">无</span>
              </div>
            </template>
              <div class="line" v-if="item.imgList && item.imgList.length>0">
                <div v-for="info in item.imgList" style="display: inline-block">
admin/src/components/business/OperaMemberDetailWindow.vue
@@ -153,13 +153,18 @@
            </div>
            <template v-if="item.authType ==1">
              <div class="line">
                <span class="label">单位位置:</span><span class="txt">{{item.location || '' }}</span>
                <span class="label">接单位置:</span><span class="txt">{{item.location || '' }}</span>
                <span class="label">单位名称:</span><span class="txt">{{item.companyName || '' }}</span>
              </div>
              <div class="line"> <span class="label">认证资料:</span> <span v-if="!item.imgList || item.imgList.length==0" class="txt">无</span> </div>
            </template>
            <template v-else>
              <div class="line">  <span class="label">身份信息:</span> <span v-if="!item.imgList || item.imgList.length==0" class="txt">无</span> </div>
              <div class="line">
                <span class="label">接单位置:</span><span class="txt">{{item.location || '' }}</span>
              </div>
              <div class="line">
                <span class="label">身份信息:</span> <span v-if="!item.imgList || item.imgList.length==0" class="txt">无</span>
              </div>
            </template>
              <div class="line" v-if="item.imgList && item.imgList.length>0">
                <div v-for="info in item.imgList" style="display: inline-block">
admin/src/components/business/OperaOrderDetailWindow.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,485 @@
<template>
  <GlobalWindow
    :title="title"
    :visible.sync="visible"
    :withFooter="false"
    width="calc(100% - 250px)"
    :confirm-working="isWorking"
    @close="close"
    @confirm="confirm">
    <div class="main">
      <div class="renzheng" >
        <div class="info" >
            <span class="m10">订单信息</span>
            <el-tag type="primary" class="ml10 tag2" v-if="info.status == 0||info.status == 1||info.status == 2||info.status == 3">{{ info.statusName }}</el-tag>
            <el-tag type="success" class="ml10 tag2" v-if="info.status == 4">{{ info.statusName }}</el-tag>
            <el-tag type="danger" class="ml10 tag2" v-if="info.status == 99">{{ info.statusName }}</el-tag>
            <div style="display: inline-block;float: right;font-size: 12px"><el-button icon="el-icon-timer" type="primary" @click="showLogList" >订单流转日志</el-button></div>
        </div>
        <div class="detail" >
          <div class="line">
            <div class="cont"><span class="label"> è®¢å•号:</span> <span class="txt">{{info.code }}</span></div>
            <div  class="cont">  <span class="label"> ä¸‹å•时间:</span> <span class="txt">{{info.createTime }}</span></div>
            <div  class="cont"><span class="label"> æŽ¥å•时间:</span> <span class="txt">{{info.acceptTime || '' }}</span></div>
          </div>
          <div class="line">
            <div class="cont"><span class="label">开始时间:</span> <span class="txt">{{info.workStartTime || '' }}</span></div>
            <div class="cont" style="flex: 2"><span class="label">完成时间:</span><span class="txt">{{info.finishTime || '' }}</span></div>
          </div>
        </div>
      </div>
      <div class="renzheng" >
        <div class="info" >
          <span class="m10">支付信息</span>
        </div>
        <div class="detail" >
          <div class="line">
            <div class="cont"><span class="label"> å®žä»˜é‡‘额:</span> <span class="txt yellowbtn">{{((info.payAccount||0)/100).toFixed(2) }}元</span></div>
            <div  class="cont"><span class="label">平台手续费:</span> <span class="txt yellowbtn">{{(((info.payAccount||0) - (info.receiveAccount||0))/100).toFixed(2) }}元</span></div>
            <div  class="cont"><span class="label">接单方收到金额:</span> <span class="txt yellowbtn">{{((info.receiveAccount||0)/100).toFixed(2) }}元</span></div>
          </div>
          <div class="line">
            <div class="cont"><span class="label">支付时间:</span> <span class="txt">{{info.payTime || '' }}</span></div>
            <div class="cont"><span class="label">支付方式:</span><span class="txt">{{info.payMethod==0?'微信支付':'其他' }}</span></div>
            <div class="cont"><span class="label">交易单号:</span><span class="txt">{{info.wxExternalNo || '' }}</span></div>
          </div>
        </div>
      </div>
      <div class="renzheng" >
        <div class="info" >
          <span class="m10">需求信息</span>
        </div>
        <div class="detail" v-if="info.type==0">
          <div class="line">
            <div class="cont"><span class="label"> è®¢å•类型:</span> <span class="txt">{{(info.type==0?'用工单':(info.type==1?'货运单':'订单单')) }}</span></div>
            <div  class="cont"><span class="label">工种:</span>
              <span class="txt" v-if="info.type==0">{{(info.workType==0?'采摘工':(info.workType==1?'分拣工':'包装工')) }}</span>
              <span v-else>-</span>
            </div>
            <div  class="cont"><span class="label">采摘品种:</span> <span class="txt">{{info.categoryName || ''}}</span></div>
          </div>
          <div class="line">
            <div class="cont"><span class="label">采摘重量:</span> <span class="txt">{{info.priceNum1 || '' }}斤</span></div>
            <div class="cont"><span class="label">用工时间:</span><span class="txt">{{info.startDate|| '' }}-{{info.endDate|| '' }}</span></div>
            <div class="cont"><span class="label">用工天数:</span><span class="txt">{{info.totalDays || 0 }}</span></div>
          </div>
          <div class="line">
            <div class="cont"><span class="label">用工地点:</span> <span class="txt">{{info.location || '' }}</span></div>
            <div class="cont"><span class="label">费用标准:</span><span class="txt">{{((info.price||0)/100).toFixed(2) }}{{info.priceUnit || '' }}</span></div>
            <div class="cont"><span class="label">预估总费用:</span><span class="txt yellowbtn">{{((info.estimatedAccount||0)/100).toFixed(2) }}元</span></div>
          </div>
          <div class="line">
            <div class="cont"><span class="label">地点描述:</span><span class="txt">{{info.locationRemark || '' }}</span></div>
          </div>
          <div class="line">
            <div class="cont" ><span class="label">需求描述:</span><span class="txt">{{info.supplement || '' }}</span></div>
          </div>
          <div class="line">
            <div class="cont">
              <span class="label">图片:</span>
              <span class="txt" v-if="!info.multifileList || info.multifileList.length ==0">无</span>
            </div>
          </div>
          <div class="line" v-if="info.multifileList && info.multifileList.length>0">
            <div class="cont">
              <template v-if="info.multifileList && info.multifileList.length>0">
              <div v-for="item in info.multifileList" style="display: inline-block" :key="'aaa'+item.id">
                <el-image v-if="item.fileurlFull" style="width: 50px; height: 50px; margin-right: 10px" :src="item.fileurlFull"
                          :preview-src-list="[info.fileurlFull]">
                </el-image>
              </div>
              </template>
            </div>
          </div>
          <div class="line" v-if="info.auditStatus == 3 || info.auditStatus == 2" :style="'background-color: '+(info.auditStatus==2?'#eff8ea':'rgb(253 226 226)')+';padding: 20px'">
            <span class="label"> å®¡æ ¸äººï¼š</span> <span class="txt">{{info.editorName}} </span><span class="label">{{info.auditTime || '' }} </span>
            <div  style="margin-top: 20px"> <span class="label">  å®¡æ ¸ä¿¡æ¯ï¼š</span> <span class="txt">{{info.auditRemark || '' }}</span></div>
          </div>
        </div>
        <div class="detail" v-if="info.type==1">
          <div class="line">
            <div class="cont"><span class="label"> è®¢å•类型:</span> <span class="txt">{{(info.type==0?'用工单':(info.type==1?'货运单':'订单单')) }}</span></div>
            <div  class="cont"><span class="label">车辆:</span> <span class="txt">{{info.categoryName || ''}}</span></div>
            <div  class="cont"><span class="label">用车时间:</span> <span class="txt">{{info.startDate|| '' }}-{{info.endDate|| '' }}</span></div>
          </div>
          <div class="line">
            <div class="cont" >  <span class="label"> åœ°å€ä¿¡æ¯ï¼š</span> <span class="label" v-if="!wayList || wayList.length==0">-</span> </div>
          </div>
          <div class="line"  v-if="wayList && wayList.length>0">
            <div class="cont"  style="padding-left: 40px;background-color: #e4ecfe">
                <div v-for="(item,index) in wayList" style="display: block;margin: 10px" :key="'bbb'+index">
                   <span v-if="index == 0">用车起点:{{item.location || ''}}</span>
                   <span v-if="index >0 && index < wayList.length-1">途经地点:{{item.location || ''}}</span>
                   <span v-if="index == wayList.length-1">用车终点:{{item.location || ''}}</span>
                </div>
            </div>
          </div>
          <div class="line">
            <div class="cont"><span class="label">用工天数:</span><span class="txt">{{info.totalDays || 0 }}</span></div>
            <div class="cont"><span class="label">运输重量/数量:</span> <span class="txt">{{info.priceNum1 || '' }}斤</span></div>
            <div class="cont"><span class="label">费用标准:</span><span class="txt">{{((info.price||0)/100).toFixed(2) }}{{info.priceUnit || '' }}</span></div>
          </div>
          <div class="line">
            <div class="cont"><span class="label">预估总费用:</span><span class="txt yellowbtn">{{((info.estimatedAccount||0)/100).toFixed(2) }}元</span></div>
          </div>
          <div class="line">
            <div class="cont" ><span class="label">需求补充:</span><span class="txt">{{info.supplement || '' }}</span></div>
          </div>
          <div class="line">
            <div class="cont">
              <span class="label">图片:</span>
              <span class="txt" v-if="!info.multifileList || info.multifileList.length ==0">无</span>
            </div>
          </div>
          <div class="line" v-if="info.multifileList && info.multifileList.length>0">
            <div class="cont">
              <template v-if="info.multifileList && info.multifileList.length>0">
                <div v-for="item in info.multifileList" style="display: inline-block" :key="item.id">
                  <el-image v-if="item.fileurlFull" style="width: 50px; height: 50px; margin-right: 10px" :src="item.fileurlFull"
                            :preview-src-list="[info.fileurlFull]">
                  </el-image>
                </div>
              </template>
            </div>
          </div>
        </div>
        <div class="detail" v-if="info.type==2">
          <div class="line">
            <div class="cont"><span class="label">订单类型:</span> <span class="txt">{{(info.type==0?'用工单':(info.type==1?'货运单':'订单单')) }}</span></div>
            <div class="cont"><span class="label">用餐时间:</span><span class="txt">{{info.startDate|| '' }}-{{info.endDate|| '' }}</span></div>
            <div class="cont"><span class="label">用餐天数:</span><span class="txt">{{info.totalDays || 0 }}</span></div>
          </div>
          <div class="line">
            <div class="cont"><span class="label">用餐地点:</span><span class="txt">{{info.location || '' }}</span></div>
            <div class="cont" style="flex: 2"><span class="label" >餐标和份数:</span><span class="txt">{{info.locationRemark || '' }}</span></div>
          </div>
          <div class="line">
            <div class="cont"><span class="label">地点描述:</span><span class="txt">{{info.locationRemark || '' }}</span></div>
          </div>
          <div class="line">
            <div class="cont" ><span class="label">需求描述:</span><span class="txt">{{info.supplement || '' }}</span></div>
          </div>
          <div class="line">
            <div class="cont">
              <span class="label">图片:</span>
              <span class="txt" v-if="!info.multifileList || info.multifileList.length ==0">无</span>
            </div>
          </div>
          <div class="line" v-if="info.multifileList && info.multifileList.length>0">
            <div class="cont">
              <template v-if="info.multifileList && info.multifileList.length>0">
                <div v-for="item in info.multifileList" style="display: inline-block" :key="'aaa'+item.id">
                  <el-image v-if="item.fileurlFull" style="width: 50px; height: 50px; margin-right: 10px" :src="item.fileurlFull"
                            :preview-src-list="[info.fileurlFull]">
                  </el-image>
                </div>
              </template>
            </div>
          </div>
        </div>
      </div>
      <div class="renzheng" >
        <div class="info" >
          <span class="m10">发单方信息</span>
        </div>
        <div class="detail" >
          <div class="line">
            <div class="cont"><span class="label">昵称:</span> <span class="txt">{{ info.releaseName||'' }}</span></div>
            <div  class="cont"  ><span class="label">联系方式:</span> <span class="txt ">{{ info.releasePhone||'' }}</span></div>
            <div  class="cont" ><span class="label">其他联系人:</span> <span class="txt ">{{ info.linkName||'匿名' }}-{{ info.linkPhone||'未设置' }}</span></div>
          </div>
        </div>
      </div>
      <div class="renzheng" >
        <div class="info" >
          <span class="m10">接单方信息</span>
        </div>
        <div class="detail" >
          <div class="line">
            <div class="cont"><span class="label">姓名/单位:</span> <span class="txt">{{ info.acceptName||'' }}</span></div>
            <div  class="cont" style="flex: 2"><span class="label">联系方式:</span> <span class="txt ">{{ info.acceptPhone||'' }}</span></div>
          </div>
        </div>
      </div>
      <div class="renzheng" >
        <div class="info" >
          <span class="m10">评价信息</span>
        </div>
        <div class="detail" >
          <div class="line">
            <div class="cont"><span class="label">{{info.commentType ==1 ?'系统自动评价':'发单方评价'}}</span> <span class="txt">{{ info.commentTime}}</span></div>
          </div>
          <div class="line">
            <div class="cont">
              <el-button class="label" :class="getScoreLevel(1)" style="border: none;cursor: default" icon="el-icon-star-on"></el-button>
              <el-button class="label" :class="getScoreLevel(2)" style="border: grey;cursor: default" icon="el-icon-star-on"></el-button>
              <el-button class="label" :class="getScoreLevel(3)" style="border: grey;cursor: default" icon="el-icon-star-on"></el-button>
              <el-button class="label" :class="getScoreLevel(4)" style="border: grey;cursor: default" icon="el-icon-star-on"></el-button>
              <el-button class="label" :class="getScoreLevel(5)" style="border: grey;cursor: default" icon="el-icon-star-on"></el-button>
            </div>
          </div>
          <div class="line">
            <div class="cont"><span class="label">评价内容:</span> <span class="txt">{{ info.commentInfo || '-'}}</span></div>
          </div>
        </div>
      </div>
    </div>
    <orderProgress ref ='orderProgress'></orderProgress>
  </GlobalWindow>
</template>
<script>
import GlobalWindow from '@/components/common/GlobalWindow'
import BaseOpera from '@/components/base/BaseOpera'
import orderProgress from '@/components/business/orderProgress'
import { getById, cancel } from '@/api/business/orders'
export default {
  components: {
    GlobalWindow, orderProgress
  },
  extends: BaseOpera,
  data () {
    return {
      id: '',
      wayList:[],
      info: {},
      loading: false
    }
  },
  methods: {
    open (title, row) {
      this.title = title
      this.visible = true
      this.tableData2 = []
      this.id = row.id
      this.wayList=[]
      this.getData()
    },
    getData () {
      getById(this.id)
        .then(res => {
          this.info = res
          this.visible = true
          if(this.info.wayInfo){
            this.wayList = JSON.parse(this.info.wayInfo)
          }
          console.log(this.wayList)
        })
    },
    close () {
    },
    showLogList () {
      this.$refs.orderProgress.open('订单流转日志', this.info.orderLogList||[])
    },
    getScoreLevel (num) {
      if (this.info.commentLevel && this.info.commentLevel >= num) {
        return 'staron'
      }
      return 'staroff'
    },
    checkDo (status) {
      console.log(this.$refs.formCheck.length)
      this.$refs.formCheck.validate((valid) => {
        if (!valid) {
          return
        }
        this.$dialog.actionConfirm('您确认【取消】该申请吗?', '操作确认')
          .then(() => {
            this.dealing = true
            cancel({
              id: this.id,
              auditStatus: status,
              auditRemark: this.form.auditRemark
            })
              .then(res => {
                this.$tip.apiSuccess('操作成功')
                this.getData()
                this.$emit('success')
              })
              .catch(e => {
                this.$tip.apiFailed(e)
              })
              .finally(() => {
                this.dealing = false
              })
          })
      })
    }
  }
}
</script>
<style lang="scss" scoped>
@import '@/assets/style/variables.scss';
.bottom{
  text-align: center;
  display: block;
  height: auto;
  background-color: #e4ecfe;
  width: calc(100% - 32px);
  z-index: 999;
  padding: 16px;
}
.staroff{
  color: #8c939d !important;
}
.staron{
  color: #ff4d00 !important;
}
.renzheng{
  margin: 0px 0px 50px 20px;
  width: calc(100% - 60px);
  .detail{
    font-size: 14px;
    .label{
      //color: #8c939d;
    }
    .txt{
      margin-right: 30px;
    }
    .line{
      font-size: 12px;
      margin-top: 15px;
      display: flex;
      width: calc(100% - 60px);
      .cont{
        flex: 1;
      }
    }
  }
  .ml10{
    margin-left: 10px;
  }
  .info{
    font-size: 14px;
    font-weight: bold;
    color: #5a72c5;
  }
  .tag2{
    font-size: 12px;
  }
}
.home_title {
  .mr10{
    margin-right: 10px;
  }
  .m10{
    margin: 10px;
  }
  .bluebtn{
    color: #2985f7;
  }
  .tag1{
    border-radius: 10px;
    font-size: 10px;
    padding: 0px 15px;
    height: 24px;
  }
  display: flex;
  justify-content: space-between;
  align-items: center;
  .left {
    font-weight: 500;
    font-size: 14px;
    margin-right: 10px;
    display: flex;
    align-items: center;
    .status {
      padding: 0 6px;
      height: 22px;
      line-height: 22px;
      border-radius: 2px;
      border: 1px solid #00BA92;
      color: #00BA92;
      font-weight: 400;
      font-size: 12px;
      color: #00BA92;
    }
  }
}
.tab{
  width: 20%;
}
.remark {
  //background: #E8EBF7;
  border-radius: 2px;
  font-size: 14px;
  margin: 10px 10px 0px -10px;
  button{
    border: none;
    cursor: default;
    margin-right: 20px;
    background: #e4ecfe;
  }
}
.bluebtn{
  font-weight: bold;
  color: #2985f7;
}
.redbtn{
  font-weight: bold;
  color: #ff1b1b;
}
.yellowbtn{
  font-weight: bold;
  color: #fc9d20;
}
.tabs {
  border-bottom: 1px solid #DFE2E8;
  display: flex;
  margin-bottom: 20px;
  .tab {
    height: 58px;
    line-height: 58px;
    font-size: 14px;
    color: #666666;
    margin-right: 30px;
    cursor: pointer;
  }
  .active {
    font-weight: 500;
    color: $primary-color;
    border-bottom: 2px solid $primary-color;
  }
}
.main {
  padding: 12px 16px;
  .title {
    font-weight: 500;
    font-size: 12px;
    color: $primary-color;
    margin-bottom: 15px;
  }
  /deep/ .el-form-item__label{
    font-size: 12px;
  }
  .list {
    display: flex;
    flex-wrap: wrap;
    /*background: #F7F7F7;*/
    border-radius: 2px;
    /*padding: 15px 20px;*/
    margin-bottom: 20px;
    .item {
      font-size: 14px;
      width: 25%;
      margin-bottom: 16px;
      .la {
        color: #7f7f7f;
        margin-bottom: 10px;
      }
    }
  }
}
/deep/ .window__body {
  padding: 0px !important;
}
</style>
admin/src/components/business/orderProgress.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,103 @@
<template>
    <GlobalWindow
        :title="title"
        width="50%"
        :withFooter="false"
        :visible.sync="visible"
        :confirm-working="isWorking"
    >
      <div class="time-line">
        <el-timeline :reverse="true">
          <el-timeline-item
              v-for="(activity, index) in list"
              :key="index"
              color="#2991FF"
              size="large"
              type="primary"
          >
            <div class="time">
              <div>
            <span class="year">
              {{ activity.createTime.substring(0, 10) }}
            </span>
              </div>
              <div class="day">{{ activity.createTime.substring(10,20) }}</div>
            </div>
            <div class="ml10">
              <div class="list-title">{{ activity.title }}</div>
              <div class="list-company">{{activity.logInfo }}</div>
            </div>
          </el-timeline-item>
        </el-timeline>
      </div>
    </GlobalWindow>
</template>
<script>
import BaseOpera from '@/components/base/BaseOpera'
import GlobalWindow from '@/components/common/GlobalWindow'
export default {
  name: 'orderProgress',
  extends: BaseOpera,
  components: { GlobalWindow },
  data () {
    return {
      list: []
    }
  },
  methods: {
    open (title, target) {
      this.title = title
      this.list = target
      this.visible = true
    }
  }
}
</script>
<style lang="scss" scoped>
.time-line {
  margin-top: 50px;
  margin-left: 200px;
}
.list-title {
  font-size: 12px;
  font-family: PingFangSC-Medium, PingFang SC;
  font-weight: 500;
  color: #181b1e;
}
.list-company {
  font-size: 12px;
  font-family: PingFangSC-Regular, PingFang SC;
  font-weight: 400;
  color: #596878;
  margin-top: 15px;
  margin-bottom: 15px;
}
.list-desc {
  font-size: 12px;
  font-family: PingFangSC-Regular, PingFang SC;
  font-weight: 400;
  color: #596878;
}
//左侧时间
.time {
  color: #409eff;
  position: absolute;
  left: -94px;
  top: 1px;
  .year {
    font-size: 14px;
    font-family: PingFangSC-Regular, PingFang SC;
    font-weight: 400;
    color: #20354a;
  }
  .day {
    font-size: 12px;
    font-family: PingFangSC-Regular, PingFang SC;
    font-weight: 400;
    color: black;
    text-align: right;
    margin-top: 0px;
  }
}
</style>
admin/src/layouts/TableLayout.vue
@@ -201,4 +201,14 @@
.yellowstate{
  color: #fc9d20;
}
.orderstate4{
  color: #157713;
}
.orderstate0,.orderstate1,.orderstate2,.orderstate3{
  color: #2080f7;
}
.orderstate99{
  color: #5d6269;
}
</style>
admin/src/views/business/orders.vue
@@ -28,27 +28,34 @@
        <el-option label="已取消" :value="99"></el-option>
        </el-select>
      </el-form-item>
      <el-form-item label="发布时间"   style="width: 380px;" label-width="100px" >
        <el-date-picker type="datetime"  style="width: 120px"  v-model="searchForm.createTimeStart" clearable value-format="yyyy-MM-dd HH:mm:ss"
                        placeholder="开始时间" />-
        <el-date-picker type="datetime"  style="width: 120px"  v-model="searchForm.createTimeEnd" clearable value-format="yyyy-MM-dd HH:mm:ss"
      <el-form-item label="发布时间"   prop="createTimeStart"  label-width="100px" >
        <el-date-picker type="datetime"  style="width: 150px"  v-model="searchForm.createTimeStart" clearable value-format="yyyy-MM-dd HH:mm:ss"
                        placeholder="开始时间" /> -
      </el-form-item>
      <el-form-item label="" prop="createTimeEnd"   label-width="0px" >
        <el-date-picker type="datetime"  style="width: 150px"  v-model="searchForm.createTimeEnd" clearable value-format="yyyy-MM-dd HH:mm:ss"
                        placeholder="结束时间" />
      </el-form-item>
      <el-form-item label="接单时间"    style="width: 380px;" label-width="100px" >
        <el-date-picker type="datetime"  style="width: 120px"  v-model="searchForm.acceptTimeStart" clearable value-format="yyyy-MM-dd HH:mm:ss"
                        placeholder="开始时间" />-
        <el-date-picker type="datetime"  style="width: 120px"  v-model="searchForm.acceptTimeEnd" clearable value-format="yyyy-MM-dd HH:mm:ss"
      <el-form-item label="接单时间" prop="acceptTimeStart"  label-width="100px" >
        <el-date-picker type="datetime"  style="width: 150px"  v-model="searchForm.acceptTimeStart" clearable value-format="yyyy-MM-dd HH:mm:ss"
                        placeholder="开始时间" /> -
      </el-form-item>
      <el-form-item label="" prop="acceptTimeEnd"  label-width="0px" >
        <el-date-picker type="datetime"  style="width: 150px"  v-model="searchForm.acceptTimeEnd" clearable value-format="yyyy-MM-dd HH:mm:ss"
                        placeholder="结束时间" />
      </el-form-item>
      <el-form-item label="完成时间"    style="width: 380px;" label-width="100px" >
        <el-date-picker type="datetime"  style="width: 120px"  v-model="searchForm.doneTimeStart" clearable value-format="yyyy-MM-dd HH:mm:ss"
                        placeholder="开始时间" />-
        <el-date-picker type="datetime"  style="width: 120px"  v-model="searchForm.doneTimeEnd" clearable value-format="yyyy-MM-dd HH:mm:ss"
      <el-form-item label="完成时间"    prop="doneTimeStart"   label-width="100px" >
        <el-date-picker type="datetime"  style="width: 150px"  v-model="searchForm.doneTimeStart" clearable value-format="yyyy-MM-dd HH:mm:ss"
                        placeholder="开始时间" /> -
      </el-form-item>
      <el-form-item label="" prop="doneTimeEnd"  label-width="0px" >
        <el-date-picker type="datetime"  style="width: 150px"  v-model="searchForm.doneTimeEnd" clearable value-format="yyyy-MM-dd HH:mm:ss"
                        placeholder="结束时间" />
      </el-form-item>
      <section>
        <el-button type="primary" @click="search">搜索</el-button>
        <el-button @click="reset">重置</el-button>
        <el-button type="primary" :loading="isWorking.export" @click="exportExcel">导出</el-button>
      </section>
    </el-form>
    <!-- è¡¨æ ¼å’Œåˆ†é¡µ -->
@@ -69,7 +76,11 @@
            <span style="cursor: pointer;color: #2E68EC" @click="openDetail(row)">{{row.code}}</span>
          </template>
        </el-table-column>
        <el-table-column prop="statusName" label="订单状态" min-width="100px"  > </el-table-column>
        <el-table-column prop="statusName" label="订单状态" min-width="100px"  >
          <template slot-scope="{row}">
          <span :class="'orderstate'+row.status">{{row.statusName}}</span>
          </template>
        </el-table-column>
        <el-table-column prop="type" label="订单类型" min-width="100px">
          <template slot-scope="{row}">
            <span v-if="row.type==0">用工单</span>
@@ -114,7 +125,7 @@
          fixed="right"
        >
          <template slot-scope="{row}">
            <el-button type="text" class="redstate" @click="cancenDo(row)" v-if="row.status>-1 && row.status<4" icon="el-icon-delete" v-permissions="['business:orders:update']">取消</el-button>
            <el-button type="text" class="redstate" @click="cancelDo(row)" v-if="row.status>-1 && row.status<4" icon="el-icon-delete" v-permissions="['business:orders:update']">取消</el-button>
            <el-button type="text" @click="openDetail( row)" icon="el-icon-info"  >详情</el-button>
          </template>
        </el-table-column>
@@ -127,7 +138,7 @@
      </pagination>
    </template>
    <!-- æ–°å»º/修改 -->
    <OperaOrdersWindow ref="operaOrdersWindow" @success="handlePageChange"/>
    <OperaOrderDetailWindow ref="OperaOrderDetailWindow" @success="handlePageChange"/>
  </TableLayout>
</template>
@@ -135,11 +146,12 @@
import BaseTable from '@/components/base/BaseTable'
import TableLayout from '@/layouts/TableLayout'
import Pagination from '@/components/common/Pagination'
import OperaOrdersWindow from '@/components/business/OperaOrdersWindow'
import OperaOrderDetailWindow from '@/components/business/OperaOrderDetailWindow'
import { cancel } from '@/api/business/orders'
export default {
  name: 'Orders',
  extends: BaseTable,
  components: { TableLayout, Pagination, OperaOrdersWindow },
  components: { TableLayout, Pagination, OperaOrderDetailWindow },
  data () {
    return {
      // æœç´¢
@@ -154,7 +166,7 @@
        doneTimeStart: null,
        doneTimeEnd: null,
        status: null,
        code:null
        code: null
      }
    }
  },
@@ -167,12 +179,26 @@
    })
    this.search()
  },
  methods:{
  methods: {
    openDetail (row) {
      // this.$refs.OperaMemberDetailWindow.open('用户详情', row.id)
      this.$refs.OperaOrderDetailWindow.open('订单详情', row )
    },
    cancenDo(row){
    cancelDo (row) {
      this.$dialog.actionConfirm('您确认【取消】该订单吗?', '操作确认')
        .then(() => {
          this.dealing = true
          cancel(row.id)
            .then(res => {
              this.$tip.apiSuccess('操作成功')
              this.search()
            })
            .catch(e => {
              this.$tip.apiFailed(e)
            })
            .finally(() => {
              this.dealing = false
            })
      })
    }
  }
}
server/services/src/main/java/com/doumee/core/utils/huaweiOBS/ObsUtil.java
@@ -119,10 +119,10 @@
    public static void main(String[] args) {
        ObsUtil blobUtil = new ObsUtil("HPUAQVBRXX9A9TLZ3RTA","uHC2uoFh42Z2xgQmCBBtG8rNZ4Caf85qQ2DQqZZf","obs.cn-south-1.myhuaweicloud.com");
        blobUtil.uploadLocalFile(new File("D://static/1.png"),"jinkuai","member/1.png");
//        blobUtil.uploadLocalFile(new File("D://static/2.png"),"jinkuai","identity/2.png");
//        blobUtil.uploadLocalFile(new File("D://static/3.png"),"jinkuai","identity/3.png");
//        blobUtil.uploadLocalFile(new File("D://static/4.png"),"jinkuai","identity/4.png");
        blobUtil.uploadLocalFile(new File("D://static/1.png"),"jinkuai","orders/1.png");
        blobUtil.uploadLocalFile(new File("D://static/2.png"),"jinkuai","orders/2.png");
        blobUtil.uploadLocalFile(new File("D://static/3.png"),"jinkuai","orders/3.png");
        blobUtil.uploadLocalFile(new File("D://static/4.png"),"jinkuai","orders/4.png");
    }
    public static  Integer uploadNetFile(ObsClient obsClient,String bucketName,String url, String objectKey) throws IOException {
        InputStream is = new URL(url).openStream();
server/services/src/main/java/com/doumee/dao/business/model/Orders.java
@@ -56,9 +56,11 @@
    private Integer type;
    @ApiModelProperty(value = "开始时间 yyyy-MM-dd")
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date startDate;
    @ApiModelProperty(value = "结束时间 yyyy-MM-dd")
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date endDate;
    @ApiModelProperty(value = "地点信息/用车起点/用餐地点")
server/services/src/main/java/com/doumee/service/business/impl/OrdersServiceImpl.java
@@ -1002,17 +1002,21 @@
        }
        //减少发单量
        memberMapper.update(new UpdateWrapper<Member>().lambda().set(Member::getPublishNum,"publish_num - 1").eq(Member::getId,orders.getReleaseMemberId()));
        memberMapper.update(new UpdateWrapper<Member>().lambda()
                .setSql("publish_num = ifnull(publish_num,0) - 1")
                .eq(Member::getId,orders.getReleaseMemberId()));
        if(Constants.equalsInteger(orders.getStatus(),Constants.TWO)||Constants.equalsInteger(orders.getStatus(),Constants.THREE)){
            //减少接单量
            memberMapper.update(new UpdateWrapper<Member>().lambda().set(Member::getReceiveNum,"receive_num - 1").eq(Member::getId,orders.getAcceptMemberId()));
            memberMapper.update(new UpdateWrapper<Member>().lambda()
                    .setSql("receive_num = ifnull(receive_num,0) - 1")
                    .eq(Member::getId,orders.getAcceptMemberId()));
        }
Date date = new Date();
        ordersMapper.update(new UpdateWrapper<Orders>().lambda()
                .set(Orders::getStatus,Constants.ordersStatus.cancel.getKey())
                .set(Orders::getUpdateTime,"now()")
                .set(Orders::getCancelTime,"now()")
                .set(Orders::getUpdateTime,date)
                .set(Orders::getCancelTime,date)
                .set(Orders::getCancelType,Constants.TWO)
                .eq(Orders::getId,orders.getId())
        );