doum
8 小时以前 d8d6661b4736e5de37d4a158b8286509b748d62b
经销商管理
已添加1个文件
已修改13个文件
992 ■■■■■ 文件已修改
admin/src/api/business/goodsorder.js 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/base/BaseTable.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaGoodsOrderDetailOld.vue 216 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaOrderMarkWindow.vue 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaShipmentsWindow.vue 62 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/common/GlobalAlertWindow.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/common/UploadImage.vue 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/goodsorder.vue 465 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/labelsExpress.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/core/utils/Constants.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/dao/business/model/Goodsorder.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/dao/business/model/GoodsorderDetail.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/service/business/impl/GoodsorderServiceImpl.java 169 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/service/business/impl/UserActionServiceImpl.java 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/business/goodsorder.js
@@ -29,3 +29,11 @@
export function updateById (data) {
  return request.post('/business/goodsorder/updateById', data)
}
// ä¿®æ”¹
export function orderRemark (data) {
  return request.post('/business/goodsorder/orderRemark', data)
}
export function orderSendOutGoods (data) {
  return request.post('/business/goodsorder/orderSendOutGoods', data)
}
admin/src/components/base/BaseTable.vue
@@ -33,6 +33,7 @@
        sorts: [],
        // å½“前页数据
        list: [],
        totalData:{},
        // åˆ†é¡µ
        pagination: {
          pageIndex: 1,
@@ -124,6 +125,9 @@
        .then(data => {
          this.tableData.list = data.records
          this.tableData.pagination.total = data.total
          if (this.tableData.pagination.pageIndex === 1) {
            this.tableData.totalData = data.countData || {}
          }
        })
        .catch(e => {
          this.$tip.apiFailed(e)
admin/src/components/business/OperaGoodsOrderDetailOld.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,216 @@
<template>
  <GlobalWindow
    :title="title"
    :visible.sync="visible"
    :confirm-working="isWorking"
    @confirm="confirm"
  >
    <el-tabs v-model="activeName" @tab-click="handleClick">
      <el-tab-pane label="订单信息" name="first">
        <el-descriptions title="订单信息" size="medium" direction="horizontal" :column="4">
          <el-descriptions-item label="订单编号">{{ form.code }}</el-descriptions-item>
          <el-descriptions-item label="订单状态">
            <span :class="[0,1,2,5].indexOf(form.status) != -1 ? 'underway' : 'complete'">
              {{
                form.status==0 ? '待支付'
                  : form.status==1 ? '待发货'
                    : form.status==2 ? '待收货'
                      : form.status==3 ? '交易完成'
                        : form.status==4 ? '已关闭' : '部分发货'
              }}
            </span>
          </el-descriptions-item>
          <el-descriptions-item label="下单时间">{{ form.createDate }}</el-descriptions-item>
          <el-descriptions-item label="支付时间">{{ form.payDate }}</el-descriptions-item>
          <el-descriptions-item label="订单金额">
            <span v-if="isPlatform">ï¿¥</span>{{ form.price }}<span v-if="!isPlatform">咖豆</span></el-descriptions-item>
          <el-descriptions-item label="支付订单号">{{ form.payOrderId }}</el-descriptions-item>
          <el-descriptions-item label="完成时间" :span="2">{{ form.completeDate }}</el-descriptions-item>
          <el-descriptions-item label="用户备注" :span="4">{{ form.memberInfo }}</el-descriptions-item>
          <el-descriptions-item label="平台备注" :span="4">{{ form.sysInfo }}</el-descriptions-item>
        </el-descriptions>
        <div style="height: 20px;"></div>
        <el-descriptions title="订单信息" size="medium" direction="horizontal" :column="4">
          <el-descriptions-item label="收件姓名">{{ form.linkname }}</el-descriptions-item>
          <el-descriptions-item label="联系电话">{{ form.linkphone }}</el-descriptions-item>
          <el-descriptions-item label="收获地址">{{ form.linkaddr }}</el-descriptions-item>
        </el-descriptions>
        <div style="height: 20px;"></div>
        <el-descriptions title="商品信息" size="medium" direction="horizontal" :column="4">
        </el-descriptions>
        <el-table
          :data="list"
          stripe
          border
        >
          <el-table-column prop="name" label="商品ID" align="center" min-width="100px"></el-table-column>
          <el-table-column prop="name" label="商品信息" align="center" min-width="100px"></el-table-column>
          <el-table-column prop="name" label="分类" align="center" width="100px"></el-table-column>
          <el-table-column prop="name" label="规格" align="center" min-width="100px"></el-table-column>
          <el-table-column prop="name" :label="isPlatform?'ä»·æ ¼(元)':'ä»·æ ¼(咖豆)'" align="center" width="100px"></el-table-column>
        </el-table>
        <div v-if="isPlatform" class="statistics">
          <div>订单商品金额:{{ form.price }}元</div>
          <div>订单优惠金额:-{{ form.price }}元</div>
          <div>实收款:{{ form.price }}元</div>
        </div>
      </el-tab-pane>
      <el-tab-pane label="物流信息" name="second">
        <el-descriptions title="快递信息" size="medium" direction="horizontal" :column="4">
          <el-descriptions-item label="运单号">{{ form.createDate }}</el-descriptions-item>
          <el-descriptions-item label="物流公司" :span="3">{{ form.kdName }}</el-descriptions-item>
          <el-descriptions-item label="收货地址" :span="4">{{ form.linkaddr }}</el-descriptions-item>
          <el-descriptions-item label="发货时间" :span="4">{{ form.kdDate }}</el-descriptions-item>
        </el-descriptions>
        <div class="kd-detail">
          <div class="kd-status">已签收</div>
          <el-timeline>
            <el-timeline-item
              v-for="(item, index) in kdDetail"
              :key="index"
              hide-timestamp
              :class="index==0&&'first'"
              :size="index==0?'large':'normal'"
              :timestamp="item.date"
            >
              <h4>{{ item.date }}</h4>
              <p>{{ item.message }}</p>
            </el-timeline-item>
          </el-timeline>
        </div>
      </el-tab-pane>
    </el-tabs>
    <div slot="footer"></div>
  </GlobalWindow>
</template>
<script>
import BaseOpera from '@/components/base/BaseOpera'
import GlobalWindow from '@/components/common/GlobalWindow'
export default {
  name: 'OperaGoodsOrderDetail',
  extends: BaseOpera,
  components: { GlobalWindow },
  data () {
    return {
      activeName: '0',
      isPlatform: true,
      // è¡¨å•数据
      form: {
        id: '1',
        code: '256302564258',
        payOrderId: '256302564258',
        createDate: '2022-11-01 22:30:43',
        payDate: '2022-11-01 22:30:43',
        soonTime: '2022-11-03 22:30:43',
        completeDate: '2022-11-03 22:30:43',
        imgurl: '',
        goodsName: '咖啡杯',
        attr: '白色;其它规格内容; 10L',
        memberInfo: '这里是用户备注',
        sysInfo: '这里是平台备注',
        linkname: '李怀英',
        linkphone: '18055151023',
        linkaddr: '四川省成都市金牛区,金泉街道中海国际社区蓝岸街98号橙郡一期5-2-504',
        price: '2333',
        status: 1,
        kdCode: 'SF01021213',
        kdDate: '2022-11-03 23:30:43',
        kdId: 'KD21312',
        kdInfo: '这是发货备注',
        kdName: '顺丰快递',
        kdUser: '00190',
      },
      list: [],
      kdDetail: [
        { date: '2022-11-03 23:30:43', message: '已发货' },
        { date: '2022-11-03 23:30:43', message: '已发货' },
        { date: '2022-11-03 23:30:43', message: '已发货' },
        { date: '2022-11-03 23:30:43', message: '已发货' },
        { date: '2022-11-03 23:30:43', message: '已发货' },
      ]
    }
  },
  created () {
    this.config({
      api: '/business/coupon',
      'field.id': 'id'
    })
  },
  methods: {
    open(title, target, active, isPlatform=true) {
      this.title = title
      this.visible = true
      this.activeName = active
      this.isPlatform = isPlatform
      // æ–°å»º
      if (target == null) {
        this.$nextTick(() => {
          this.type = '0'
          this.$refs.form.resetFields()
          this.form[this.configData['field.id']] = null
        })
        return
      }
      // ç¼–辑
      this.$nextTick(() => {
        for (const key in this.form) {
          this.form[key] = target[key]
        }
        if (this.form.shopId) {
          this.type = 0
          this.shops = [{ label: target.shopName, id: this.form.shopId }]
        } else {
          this.type = 1
          this.orgs = [{ label: target.orgName, id: this.form.orgId }]
        }
      })
    },
    handleClick() {}
  },
}
</script>
<style lang="scss" scoped>
.underway {
  color: rgb(233, 165, 80)
}
.complete {
  color: #ccc;
}
.first {
  ::v-deep .el-timeline-item__node {
    background-color: #fff !important;
    width: 8px !important;
    height: 8px !important;
    transform: translateX(-3px);
    border: #216EEE solid 6px !important;
  }
}
.kd-detail {
  padding: 30px;
  background-color: #f2f2f2;
  .kd-status {
    height: 30px;
    line-height: 30px;
    font-size: 20px;
    font-weight: 500;
    border-bottom: 1px solid #000;
    margin-bottom: 20px;
  }
}
.statistics {
  text-align: right;
  padding: 10px 5px;
  font-size: 14px;
  line-height: 24px;
  :last-child {
    color: rgb(232, 60,45);
  }
}
</style>
admin/src/components/business/OperaOrderMarkWindow.vue
@@ -6,9 +6,9 @@
    :confirm-working="isWorking"
    @confirm="confirm"
  >
    <el-form :model="form" ref="form" label-width="120px" label-suffix=":"  inline>
    <el-form :model="form" ref="form" label-width="120px" label-suffix=":"  :rules="rules" inline>
      <el-form-item label="备注" prop="sysInfo">
        <el-input type="textarea" :autosize="{ minRows: 4, maxRows: 12}" v-model="form.sysInfo" placeholder="请输入备注" :maxlength="5" v-trim/>
        <el-input type="textarea" :autosize="{ minRows: 4, maxRows: 12}" v-model="form.sysInfo" placeholder="请输入备注" :maxlength="50" v-trim/>
      </el-form-item>
      
    </el-form>
@@ -29,32 +29,49 @@
      form: {
        id: null,
        sysInfo: ''
        // isdeleted: '',
        // name: '',
        // info: '',
        // type: '',
        // module: '',
        // parentId: '',
        // sortnum: '',
        // status: '',
        // imgurl: ''
      },
      // éªŒè¯è§„则
      rules: {
        sysInfo: [
          { required: true, message: '请输入订单备注信息', tigger: 'blur' }
        ]
      }
    }
  },
  
  created () {
    this.config({
      api: '/business/labels',
      api: '/business/goodsorder',
      'field.id': 'id'
    })
  },
  methods: {
    confirm () {
      this.$refs.form.validate((valid) => {
        if (!valid) {
          return
        }
        this.isWorking = true
        this.api.orderRemark(this.form)
          .then(() => {
            this.visible = false
            this.$tip.apiSuccess('发货成功')
            this.$emit('success')
          }).catch(e => {
            this.$tip.apiFailed(e)
          })
          .finally(() => {
            this.isWorking = false
          })
        // è°ƒç”¨æ–°å»ºæŽ¥å£
      })
    }
  }
  
}
</script>
<style lang="scss" scoped>
@import "@/assets/style/alertstyle.scss";
</style>
admin/src/components/business/OperaShipmentsWindow.vue
@@ -7,7 +7,7 @@
    @confirm="confirm"
  >
    <el-form :model="form" ref="form" :rules="rules" label-width="120px" label-suffix=":"  inline>
      <div class="tips-style">您真在针对订单:<span>{{ form.code }} </span>进行发货</div>
      <p class="tip-warn" style="margin: 30px;"><i class="el-icon-warning"></i>操作说明:您正在针对订单:<span class="red">{{ form.code }} </span>进行{{ form.status==2?'快递变更':'发货' }}操作!</p>
      <el-form-item label="快递公司" prop="kdId">
        <el-select
          v-model="form.kdId"
@@ -15,14 +15,14 @@
          clearable
          placeholder="请选择快递公司"
        >
          <el-option v-for="item in kd" :key="item.id" :value="item.id" :label="item.label" />
          <el-option v-for="item in kd" :key="item.id" :value="item.id" :label="item.name" />
        </el-select>
      </el-form-item>
      <el-form-item label="快递单号" prop="kdCode">
        <el-input v-model="form.kdCode" placeholder="请输入快递单号" :maxlength="5" v-trim/>
        <el-input v-model="form.kdCode" placeholder="请输入快递单号"   v-trim/>
      </el-form-item>
      <el-form-item label="发货备注" prop="kdInfo">
        <el-input type="textarea" :autosize="{ minRows: 4, maxRows: 12}" v-model="form.kdInfo" placeholder="请输入发货备注" :maxlength="5" v-trim/>
        <el-input type="textarea" :autosize="{ minRows: 4, maxRows: 12}" v-model="form.kdInfo" placeholder="请输入发货备注"   v-trim/>
      </el-form-item>
      
    </el-form>
@@ -32,7 +32,7 @@
<script>
import BaseOpera from '@/components/base/BaseOpera'
import GlobalAlertWindow from '@/components/common/GlobalAlertWindow'
import { fetchList as kdList } from '@/api/business/labels'
import {orderSendOutGoods} from '@/api/business/goodsorder'
export default {
  name: 'OperaShipmentsWindow',
  extends: BaseOpera,
@@ -44,27 +44,20 @@
      form: {
        id: null,
        code: '',
        status: '',
        kdId: '',
        kdInfo: '',
        kdCode: '',
        // isdeleted: '',
        // name: '',
        // info: '',
        // type: '',
        // module: '',
        // parentId: '',
        // sortnum: '',
        // status: '',
        // imgurl: ''
        kdName: ''
      },
      kd: [],
      // éªŒè¯è§„则
      rules: {
        kdId: [
          { required: true, message: '请选择快递公司', tigger: 'change' }
          { required: true, message: '请选择快递公司' }
        ],
        kdCode: [
          { required: true, message: '请输入快递单号', tigger: 'blur' }
          { required: true, message: '请输入快递单号' }
        ]
      }
    }
@@ -77,23 +70,36 @@
    })
  },
  mounted() {
    kdList({
      capacity: 999,
      model: {
        type: 3 //快递
      }
    })
    this.api.findAll({ status: 0, type: 17 })
      .then(res => {
        this.kd = res.records
        this.kd = res
      })
  },
  methods: {
    // ä¸Šä¼ å›¾ç‰‡
    uploadAvatarSuccess(file) {
      this.form.imgurl = file.imgurl;
      this.form.imgurlfull = file.imgurlfull;
    },
  },
    confirm () {
      this.$refs.form.validate((valid) => {
        if (!valid) {
          return
        }
        this.isWorking = true
        var kd = this.kd.find(item => item.id === this.form.kdId)
        this.form.kdName = kd.name
        orderSendOutGoods(this.form)
          .then(() => {
            this.visible = false
            this.$tip.apiSuccess('添加成功')
            this.$emit('success')
          }).catch(e => {
            this.$tip.apiFailed(e)
          })
          .finally(() => {
            this.isWorking = false
          })
        // è°ƒç”¨æ–°å»ºæŽ¥å£
      })
    }
  }
}
</script>
admin/src/components/common/GlobalAlertWindow.vue
@@ -6,6 +6,7 @@
    :with-header="true"
    :width="width"
    :close-on-press-escape="false"
    :close-on-click-modal="false"
    :wrapper-closable="false"
    :append-to-body="true"
    @close="close"
admin/src/components/common/UploadImage.vue
@@ -83,7 +83,6 @@
            this.srcList.push(item.url)
          })
        }
        console.log("==================srcList=",this.srcList);
      }
@@ -129,9 +128,9 @@
      console.log(this.fileList);
      let tempIndex = this.realList.findIndex(item => item.fileurl === file.fileurl)
      // debugger
      this.realList.splice(tempIndex, 1)
      // this.realList.splice(tempIndex, 1)
      this.fileList.splice(tempIndex, 1)
      this.srcList.splice(tempIndex, 1)
      // this.srcList.splice(tempIndex, 1)
    },
  },
admin/src/views/business/goodsorder.vue
@@ -4,148 +4,67 @@
    <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
      <!-- 0待支付 1待发货 2待收货 3交易完成 4已关闭 5部分发货 -->
      <el-tabs v-model="status" @tab-click="handleClick">
        <el-tab-pane label="全部订单" name="10"></el-tab-pane>
        <el-tab-pane label="待支付" name="0"></el-tab-pane>
        <el-tab-pane label="待发货" name="1"></el-tab-pane>
        <el-tab-pane label="待收货" name="2"></el-tab-pane>
        <el-tab-pane label="交易完成" name="3"></el-tab-pane>
        <el-tab-pane label="交易关闭" name="4"></el-tab-pane>
        <el-tab-pane label="回收站" name="9"></el-tab-pane>
        <el-tab-pane
            v-for="tab in statusList"
            :key="tab.name"
            :name="tab.name"
        >
          <template #label>
            <span>{{ tab.label }}</span>
            <el-badge
                v-if="tab.count > 0"
                :value="tab.count"
                class="tab-badge"
            />
          </template>
        </el-tab-pane>
      </el-tabs>
      <el-form-item label="订单编号" prop="code">
        <el-input v-model="searchForm.code" placeholder="请输入订单编号" @keypress.enter.native="search"></el-input>
        <el-input v-model="searchForm.code" placeholder="请输入订单编号" type="number" clearable @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="用户信息" prop="information">
        <el-input v-model="searchForm.information" placeholder="请输入昵称/手机号" @keypress.enter.native="search"></el-input>
      <el-form-item label="收货人" prop="nickName">
        <el-input v-model="searchForm.nickName" placeholder="请输入姓名/手机号" clearable  @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="订单时间" prop="createDate">
        <el-date-picker
          v-model="createDate"
          type="daterange"
          value-format="yyyy-MM-dd"
          start-placeholder="开始日期"
          end-placeholder="结束日期"
          @change="selectDate"
        />
      </el-form-item>
      <el-form-item label="催发货" prop="isSoon">
        <el-select
          v-model="searchForm.isSoon"
          placeholder="请选择是否催发货"
          @change="search"
        >
          <el-option :key="0" :value="0" label="否"></el-option>
          <el-option :key="1" :value="1" label="是"></el-option>
      <el-form-item label="取货方式" prop="receiveType">
        <el-select v-model="searchForm.receiveType"    placeholder="请选择取货方式" clearable   @change="search" >
          <el-option :key="0" :value="0" label="快递配送"></el-option>
          <el-option :key="1" :value="1" label="自提"></el-option>
        </el-select>
      </el-form-item>
      <el-form-item label="归属经销商" prop="shopName">
        <el-input v-model="searchForm.shopName" placeholder="请输入经销商名称" clearable @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="支付单号" prop="payOrderId">
        <el-input v-model="searchForm.payOrderId" placeholder="请输入支付单号" @keypress.enter.native="search"></el-input>
        <el-input v-model="searchForm.payOrderId" placeholder="请输入支付单号" clearable  @keypress.enter.native="search"></el-input>
      </el-form-item>
      <!-- <el-form-item label="更新人编码" prop="editor">
        <el-input v-model="searchForm.editor" placeholder="请输入更新人编码" @keypress.enter.native="search"></el-input>
      <div class="date-style" style="display: inline">
        <el-form-item label="订单时间" prop="starttime" >
          <el-date-picker
              style="width: 160px"
              clearable
              @change="search"
              v-model="searchForm.starttime"
              type="datetime"
              value-format="yyyy-MM-dd HH:mm:ss"
              format="yyyy-MM-dd HH:mm:ss"
              range-separator="至"
              placeholder="开始时间"
          ></el-date-picker>
      </el-form-item>
      <el-form-item label="是否删除0否 1是" prop="isdeleted">
        <el-input v-model="searchForm.isdeleted" placeholder="请输入是否删除0否 1是" @keypress.enter.native="search"></el-input>
        <el-form-item label="-" label-width="10px" prop="endtime" >
          <el-date-picker
              style="width: 160px"
              clearable
              v-model="searchForm.endtime"
              type="datetime"
              @change="search"
              value-format="yyyy-MM-dd HH:mm:ss"
              format="yyyy-MM-dd HH:mm:ss"
              range-separator="至"
              placeholder="截止时间"
          ></el-date-picker>
      </el-form-item>
      <el-form-item label="备注" prop="remark">
        <el-input v-model="searchForm.remark" placeholder="请输入备注" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="订单编号" prop="code">
        <el-input v-model="searchForm.code" placeholder="请输入订单编号" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="订单实付价格(元/咖豆)" prop="price">
        <el-input v-model="searchForm.price" placeholder="请输入订单实付价格(元/咖豆)" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="商品总数量" prop="goodsNum">
        <el-input v-model="searchForm.goodsNum" placeholder="请输入商品总数量" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="下单人编码(关联member表)" prop="memberId">
        <el-input v-model="searchForm.memberId" placeholder="请输入下单人编码(关联member表)" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="收货地址编码(关联addr表)" prop="addrId">
        <el-input v-model="searchForm.addrId" placeholder="请输入收货地址编码(关联addr表)" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="收货人姓名" prop="linkname">
        <el-input v-model="searchForm.linkname" placeholder="请输入收货人姓名" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="收货人电话" prop="linkphone">
        <el-input v-model="searchForm.linkphone" placeholder="请输入收货人电话" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="收货地址" prop="linkaddr">
        <el-input v-model="searchForm.linkaddr" placeholder="请输入收货地址" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="状态 0待支付 1待发货 2待收货 3交易完成 4已关闭 5部分发货" prop="status">
        <el-input v-model="searchForm.status" placeholder="请输入状态 0待支付 1待发货 2待收货 3交易完成 4已关闭 5部分发货" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="是否已评价 0未评价 1已评价" prop="isComment">
        <el-input v-model="searchForm.isComment" placeholder="请输入是否已评价 0未评价 1已评价" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="支付状态 0未支付 1已支付" prop="payStatus">
        <el-input v-model="searchForm.payStatus" placeholder="请输入支付状态 0未支付 1已支付" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="支付时间" prop="payDate">
        <el-date-picker v-model="searchForm.payDate" value-format="yyyy-MM-dd" placeholder="请输入支付时间" @change="search"/>
      </el-form-item>
      <el-form-item label="支付方式 0微信支付 1线下支付" prop="payMethod">
        <el-input v-model="searchForm.payMethod" placeholder="请输入支付方式 0微信支付 1线下支付" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="快递单号" prop="kdCode">
        <el-input v-model="searchForm.kdCode" placeholder="请输入快递单号" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="快递名称" prop="kdName">
        <el-input v-model="searchForm.kdName" placeholder="请输入快递名称" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="快递编码(关联labels表)" prop="kdId">
        <el-input v-model="searchForm.kdId" placeholder="请输入快递编码(关联labels表)" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="用户备注" prop="memberInfo">
        <el-input v-model="searchForm.memberInfo" placeholder="请输入用户备注" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="平台备注" prop="sysInfo">
        <el-input v-model="searchForm.sysInfo" placeholder="请输入平台备注" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="取消时间" prop="cancelDate">
        <el-date-picker v-model="searchForm.cancelDate" value-format="yyyy-MM-dd" placeholder="请输入取消时间" @change="search"/>
      </el-form-item>
      <el-form-item label="取消人" prop="cancelUser">
        <el-input v-model="searchForm.cancelUser" placeholder="请输入取消人" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="取消备注" prop="cancelInfo">
        <el-input v-model="searchForm.cancelInfo" placeholder="请输入取消备注" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="发货时间" prop="kdDate">
        <el-date-picker v-model="searchForm.kdDate" value-format="yyyy-MM-dd" placeholder="请输入发货时间" @change="search"/>
      </el-form-item>
      <el-form-item label="发货备注" prop="kdInfo">
        <el-input v-model="searchForm.kdInfo" placeholder="请输入发货备注" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="发货人编码(关联system_user表)" prop="kdUser">
        <el-input v-model="searchForm.kdUser" placeholder="请输入发货人编码(关联system_user表)" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="完成时间" prop="doneDate">
        <el-date-picker v-model="searchForm.doneDate" value-format="yyyy-MM-dd" placeholder="请输入完成时间" @change="search"/>
      </el-form-item>
      <el-form-item label="完成备注" prop="doneInfo">
        <el-input v-model="searchForm.doneInfo" placeholder="请输入完成备注" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="是否已售后 0否 1是" prop="isAftersale">
        <el-input v-model="searchForm.isAftersale" placeholder="请输入是否已售后 0否 1是" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="订单类型 0平台商城 1咖豆商城 2咖啡计划编码" prop="type">
        <el-input v-model="searchForm.type" placeholder="请输入订单类型 0平台商城 1咖豆商城 2咖啡计划编码" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="优惠金额" prop="couponPrice">
        <el-input v-model="searchForm.couponPrice" placeholder="请输入优惠金额" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="优惠券编码(关联MEMBER_COUPON表)" prop="couponId">
        <el-input v-model="searchForm.couponId" placeholder="请输入优惠券编码(关联MEMBER_COUPON表)" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="咖啡计划订单形式 0新增 1延长" prop="planOrderType">
        <el-input v-model="searchForm.planOrderType" placeholder="请输入咖啡计划订单形式 0新增 1延长" @keypress.enter.native="search"></el-input>
      </el-form-item> -->
      </div>
      <section>
        <el-button type="primary" @click="search">搜索</el-button>
        <el-button type="primary" :loading="isWorking.export" v-permissions="['business:goodsorder:exportExcel']" @click="exportExcel">导出</el-button>
@@ -154,78 +73,72 @@
    </el-form>
    <!-- è¡¨æ ¼å’Œåˆ†é¡µ -->
    <template v-slot:table-wrap>
      <div v-for="item in list" :key="id" class="order-detail">
      <div v-for="item in tableData.list" :key="'id_'+item.id" class="order-detail">
        <div class="order-title-message">
          <div class="base-message">
            <div class="date">{{ item.createDate }}</div>
            <div>订单编号:<span>{{ item.code }}</span></div>
            <div class="date" >订单时间:{{ item.createDate }}</div>
            <div class="date" >订单编号:<span  @click="$refs.operaGoodsOrderDetail.open('订单详情', item, 'first')" style="cursor: pointer;">{{ item.code }}</span></div>
            <div v-if="item.distributionShopId">经销商:{{ item.shopName || ''}}</div>
          </div>
          <div class="soon-style">{{ `用户于${item.soonTime}催发货` }}</div>
          <div>
            <span v-if="item.status ==0" class="orange">待支付</span>
            <span  v-if="item.status ==1" class="orange">{{item.receiveType==1?'待自提':'待发货'}}</span>
            <span  v-if="item.status ==2" class="orange">待收货</span>
            <span  v-if="item.status ==3" class="grey">交易完成</span>
            <span  v-if="item.status ==4" class="grey">已关闭</span>
            <span  v-if="item.status ==6" class="grey">已退款</span>
          </div>
        </div>
        <div class="detail-message">
          <div class="goods-message right-border">
            <div class="goods-base-message">
            <div  class="goods-base-message" :key="item.id+'_'+goods.id" v-for="goods in item.goodsorderDetailList">
              <div style="width: 60px; height: 60px;">
              <el-image
                style="width: 90px; height: 90px; border-radius: 2px;"
                :src="item.imgurl"
                :preview-src-list="[item.imgurl]"
                    style="width: 60px; height: 60px; border-radius: 2px;"
                    :src="goods.imgurl"
                    :preview-src-list="[goods.imgurl]"
              ></el-image>
              <div class="message">
                <div>{{ item.goodsName }}</div>
                <div class="attr">规格:{{ item.attr }}</div>
                <div class="attr">价格:{{ item.price }}</div>
              </div>
              <div class="message" style="">
                <div class="name">{{ goods.name }}</div>
                <div class="attr">ï¿¥{{ goods.goodsNum }}</div>
              </div>
            </div>
            <div v-if="item.memberInfo" class="mark">用户备注:{{ item.memberInfo }}</div>
            <div v-if="item.sysInfo" class="mark">平台备注:{{ item.sysInfo }}</div>
            <div class="mark" v-if="item.sysInfo&& item.sysInfo.length" >备注:{{item.sysInfo}}</div>
          </div>
          <div class="member-message right-border">
            <div>{{ item.linkname }}</div>
            <div>{{ item.linkphone }}</div>
            <div class="el-icon-user" style="padding: 5px 5px;">{{ item.linkname }}</div>
            <div class="el-icon-phone-outline" style="padding: 10px 5px;color: #777;font-size: 13px;">{{ item.linkphone }}</div>
          </div>
          <div class="address-message right-border">{{ item.linkaddr }}</div>
          <div class="price-message right-border">ï¿¥{{ item.price }}</div>
          <div class="status-message right-border">
            <!-- // 0待支付 1待发货 2待收货 3交易完成 4已关闭 5部分发货 -->
            <div :class="[0,1,2,5].indexOf(item.status) != -1 ? 'underway' : 'complete'">
              {{
                item.status==0 ? '待支付'
                  : item.status==1 ? '待发货'
                    : item.status==2 ? '待收货'
                      : item.status==3 ? '交易完成'
                        : item.status==4 ? '已关闭' : '部分发货'
              }}
          <div class="address-message right-border right-border" style="padding-top: 15px;" >
            <div class="underway el-icon-sell" >{{item.receiveType==1?'到店自提':'快递配送'}} </div>
            <div class=" el-icon-add-location" v-if="item.receiveType!=1">{{ item.linkaddr }}</div>
            </div>
            <el-button style="color: #666; font-size: 16px;"  type="text" @click="$refs.operaGoodsOrderDetail.open('订单详情', item, 'first')">订单详情</el-button>
            <div></div>
            <el-button style="color: #666; font-size: 16px;"  type="text" @click="$refs.operaGoodsOrderDetail.open('物流详情', item, 'second')">物流详情</el-button>
          <div class="price-message right-border">
            <div class="underway" >订单总价:¥{{ (item.totalPrice||0).toFixed(2) }}</div>
            <div class="price-info">商品总价:¥{{  ((item.totalPrice||0)-(item.price || 0)).toFixed(2)}}</div>
            <div class="price-info">物流运费:¥{{  (item.mailPrice || 0).toFixed(2)}}</div>
            <div class="price-info">积分抵扣:-ï¿¥{{  (item.integral || 0 ).toFixed(2)}}</div>
            <div class="price-info">优惠金额:-ï¿¥{{  (item.couponPrice).toFixed(2) }}</div>
            <div class="price-info">实付金额:<span class="red" style="font-weight: 600">ï¿¥{{  (item.price).toFixed(2) }}</span></div>
          </div>
          <div class="action">
            <el-button v-if="item.status==1" style="font-size: 16px; width: 80%;" type="primary" @click="$refs.operaShipmentsWindow.open('发货', item)">发货</el-button>
            <el-button v-if="item.status==1 && item.receiveType!=1" style=" width: 80%;" type="primary" @click="$refs.operaShipmentsWindow.open('发货', item)">发货</el-button>
            <div></div>
            <el-button v-if="item.status<2" style="color: #666; font-size: 16px;"  type="text" @click="cancelOrder(item)">取消订单</el-button>
            <el-button v-if="item.status == 0" style="color: red; "  type="text" @click="cancelOrder(item)">取消订单</el-button>
            <div></div>
            <el-button style="color: #666; font-size: 16px;" type="text" @click="$refs.operaOrderMarkWindow.open(item.sysInfo.length?'编辑备注':'添加备注', item)">备注</el-button>
            <el-button v-if="item.status == 3" style="color: red "  type="text" @click="cancelOrder(item)">订单退款</el-button>
            <div></div>
            <el-button v-if="item.status==2 && item.receiveType!=1" style="color: #666; " type="text"  @click="$refs.operaShipmentsWindow.open('快递信息变更', item)">快递变更</el-button>
            <div></div>
            <el-button style="color: #666; " type="text" @click="$refs.operaOrderMarkWindow.open(item.sysInfo && item.sysInfo.length?'编辑备注':'添加备注', item)">
              {{ item.sysInfo && item.sysInfo.length?'修改备注':'添加备注' }}</el-button>
            <div></div>
            <el-button style="color: #216EEE; "  type="text" @click="$refs.operaGoodsOrderDetail.open('订单详情', item, 'first')">查看详情</el-button>
          </div>
        </div>
      </div>
      <!-- <el-table
        v-loading="isWorking.search"
        :data="tableData.list"
        stripe
      >
        <el-table-column
          v-if="containPermissions(['business:goodsorder:update', 'business:goodsorder:delete'])"
          label="操作"
          min-width="120"
          fixed="right"
        >
          <template slot-scope="{row}">
            <el-button type="text" @click="$refs.operaGoodsorderWindow.open('编辑商品订单信息表', row)" icon="el-icon-edit" v-permissions="['business:goodsorder:update']">编辑</el-button>
          </template>
        </el-table-column>
      </el-table> -->
      <div style="width: 100%;text-align: center;padding: 50px;color: #999;font-size: 12px;" v-if="!tableData.pagination ||!tableData.pagination.total">暂无数据</div>
      <pagination
        @size-change="handleSizeChange"
        @current-change="handlePageChange"
@@ -234,7 +147,7 @@
      </pagination>
    </template>
    <!-- æ–°å»º/修改 -->
    <OperaShipmentsWindow ref="operaShipmentsWindow" @success="handlePageChange"/>
    <OperaShipmentsWindow ref="operaShipmentsWindow" @success="search"/>
    <OperaOrderMarkWindow ref="operaOrderMarkWindow" @success="handlePageChange"/>
    <OperaGoodsOrderDetail ref="operaGoodsOrderDetail"/>
  </TableLayout>
@@ -256,76 +169,25 @@
      status: '10',
      createDate: [],
      id: '',
      statusList: [{ name: '10', label: '全部订单', count: 0 },
        { name: '0', label: '待支付', count: 0 },
        { name: '1', label: '待发货/待自提', count: 0 },
        { name: '2', label: '待收货', count: 0 },
        { name: '3', label: '交易完成', count: 0 },
        { name: '6', label: '已退款', count: 0 },
        { name: '4', label: '交易关闭', count: 0 }],
      // æœç´¢
      searchForm: {
        id: '',
        creator: '',
        createDate: '',
        editor: '',
        editDate: '',
        isdeleted: '',
        remark: '',
        receiveType: '',
        shopName: '',
        goodsName: '',
        code: '',
        price: '',
        goodsNum: '',
        memberId: '',
        addrId: '',
        linkname: '',
        linkphone: '',
        linkaddr: '',
        status: '',
        isComment: '',
        payStatus: '',
        payDate: '',
        payOrderId: '',
        payMethod: '',
        kdCode: '',
        kdName: '',
        kdId: '',
        memberInfo: '',
        sysInfo: '',
        cancelDate: '',
        cancelUser: '',
        cancelInfo: '',
        kdDate: '',
        kdInfo: '',
        kdUser: '',
        doneDate: '',
        doneInfo: '',
        isAftersale: '',
        type: '0', // 0平台商城 1咖豆商城 2咖啡计划
        couponPrice: '',
        couponId: '',
        planOrderType: ''
        nickName: '',
        starttime: null,
        enttime: null
      },
      list: [
        {
          id: '1',
          code: '256302564258',
          payOrderId: '256302564258',
          createDate: '2022-11-01 22:30:43',
          payDate: '2022-11-01 22:30:59',
          soonTime: '2022-11-03 22:30:43',
          completeDate: '2022-11-05 22:30:43',
          imgurl: '',
          goodsName: '咖啡杯',
          attr: '白色;其它规格内容; 10L',
          memberInfo: '这里是用户备注',
          sysInfo: '这里是平台备注',
          linkname: '李怀英',
          linkphone: '18055151023',
          linkaddr: '四川省成都市金牛区,金泉街道中海国际社区蓝岸街98号橙郡一期5-2-504',
          price: '2333',
          status: 1,
          kdCode: 'SF01021213',
          kdDate: '2022-11-03 23:30:43',
          kdId: 'KD21312',
          kdInfo: '这是发货备注',
          kdName: '顺丰快递',
          kdUser: '00190',
        }
      ]
    }
  },
  created () {
@@ -338,6 +200,32 @@
    this.search()
  },
  methods: {
    handlePageChange (pageIndex) {
      this.tableData.pagination.pageIndex = pageIndex || this.tableData.pagination.pageIndex
      this.isWorking.search = true
      this.api.fetchList({
        page: this.tableData.pagination.pageIndex,
        capacity: this.tableData.pagination.pageSize,
        model: this.searchForm, // é”€å”®æ¨¡å¼å˜æ›´
        sorts: this.tableData.sorts
      })
        .then(data => {
          this.tableData.list = data.records || []
          this.tableData.pagination.total = data.total || 0
          if (this.tableData.pagination.pageIndex === 1) {
            var totalData = data.countData || {}
            this.statusList[1].count = totalData.waitPayNum || 0
            this.statusList[2].count = totalData.waitKdNum || 0
            this.statusList[3].count = totalData.waitDoneNum || 0
          }
        })
        .catch(e => {
          this.$tip.apiFailed(e)
        })
        .finally(() => {
          this.isWorking.search = false
        })
    },
    selectDate(v) {
      this.searchForm.startDate = v[0]
      this.searchForm.endDate = v[1]
@@ -345,13 +233,13 @@
    },
    reset () {
      this.createDate = []
      this.searchForm.startDate = ''
      this.searchForm.endDate = ''
      this.searchForm.starttime = ''
      this.searchForm.enttime = ''
      this.$refs.searchForm.resetFields()
      this.search()
    },
    handleClick(table, val) {
      this.$refs.searchForm.resetFields()
      // this.$refs.searchForm.resetFields()
      if (this.status==9) {
        this.searchForm.isdeleted=1
        this.searchForm.status=''
@@ -369,25 +257,30 @@
        })
    }
  },
  }
}
</script>
<style lang="scss" scoped>
.tab-badge{
  color: green;
}
.order-detail {
  font-size: 14px;
  color: #666;
  margin-bottom: 10px;
  .order-title-message {
    display: flex;
    justify-content: space-between;
    padding: 8px;
    padding: 10px 20px;
    font-weight: 500;
    box-sizing: border-box;
    background-color: #f2f2f2;
    .base-message {
      display: flex;
      font-size: 14px;
      color: #999;
      color: #333;
      .date {
        width: 150px;
        width: auto;
        margin-right: 100px;
      }
      span {
@@ -412,50 +305,84 @@
      .goods-base-message {
        display: flex;
        margin-bottom: 10px;
        padding-bottom: 10px;
        border-bottom: 1px solid #f2f2f2;
        .message {
          flex-basis: content-box;
          display: flex;width: 100%;
          margin-left: 10px;
          font-size: 16px;
          .name {
            flex: 3;
            display: -webkit-box;
            -webkit-box-orient: vertical;
            -webkit-line-clamp: 2;
            overflow: hidden;
            max-height: 40px;
          }
          .attr {
            font-size: 13px;
            padding-top: 10px;
            text-align: right;
            flex: 1;
            padding-right: 30px;
            font-size: 12px;
            color: #666;
          }
        }
      }
      .mark {
        margin-bottom: 5px;
        color: rgb(235, 80, 50);
        font-size: 13px;
        color: rgb(235, 80, 50);
      }
    }
    .member-message {
      flex: 0.4;
      font-size: 14px;
      :last-child {
        margin-top: 5px;
        font-size: 13px;
      }
    }
    .address-message {
      flex: 0.6;
      display: -webkit-box;
      -webkit-box-orient: vertical;
      overflow: hidden;
      .underway {
        display: block;
        padding-bottom: 10px;
        border-bottom: 1px solid #f2f2f2;
        color: #71b247;
        margin-bottom: 10px;
      }
    }
    .price-message {
      flex: 0.5;
      font-size: 18px;
      flex: 0.6;
      font-weight: 600;
      text-align: center;
      .underway {
        padding-bottom: 10px;
        border-bottom: 1px solid #f2f2f2;
        color: rgb(233, 165, 80);
        margin-bottom: 10px;
      }
      .price-info {
        text-align: left;
        width: 100%;
        font-weight: normal;
        color: #777;
        font-size: 13px;
      }
    }
    .status-message {
      flex: 0.4;
      text-align: center;
      .underway {
        padding-bottom: 10px;
        border-bottom: 1px solid #f2f2f2;
        color: rgb(233, 165, 80)
      }
      .complete {
        color: #ccc;
      }
    }
    .action {
      flex: 0.6;
      flex: 0.5;
      box-sizing: border-box;
      padding: 10px;
      text-align: center;
admin/src/views/business/labelsExpress.vue
@@ -68,7 +68,6 @@
import TableLayout from '@/layouts/TableLayout'
import Pagination from '@/components/common/Pagination'
import OperaLabelExpressWindow from '@/components/business/OperaLabelExpressWindow'
import {updateStatusById} from "@/api/business/labels";
export default {
  name: 'ProductLabel',
  extends: BaseTable,
server/dmmall_service/src/main/java/com/doumee/core/utils/Constants.java
@@ -1201,6 +1201,7 @@
    public  enum UserActionType {
        CHANGE_SHOP(0, "经销商更换","由【${param1}】于【${param2}】,进行【经销商更换】" ),
        CHANGE_SALETYPE(1, "经销商更换销售模式","由【${param1}】于【${param2}】,进行【销售模式变更】" ),
        CHANGE_ORDER_KD(2, "订单快递更换","由【${param1}】于【${param2}】,进行【订单快递更换】;${param3}" ),
        ;
        // æˆå‘˜å˜é‡
server/dmmall_service/src/main/java/com/doumee/dao/business/model/Goodsorder.java
@@ -62,7 +62,7 @@
    @ExcelColumn(name="联系人地址" ,index =8 ,width = 10)
    private String linkaddr;
    @ApiModelProperty(value = "订单总价格", example = "1")
    @ApiModelProperty(value = "订单总价格(包含运费)", example = "1")
    private BigDecimal totalPrice;
    @ApiModelProperty(value = "订单实付价格(元/咖豆)", example = "1")
@@ -253,6 +253,15 @@
    @ApiModelProperty(value = "订单总数 ")
    @TableField(exist = false)
    private Long orderCount;
    @ApiModelProperty(value = "待支付总数 ")
    @TableField(exist = false)
    private Integer waitPayNum;
    @ApiModelProperty(value = "待发货总数 ")
    @TableField(exist = false)
    private Integer waitKdNum;
    @ApiModelProperty(value = "待收货总数 ")
    @TableField(exist = false)
    private Integer waitDoneNum;
    @ApiModelProperty(value = "订单商品总数 ")
    @TableField(exist = false)
    private Long goodsCount;
@@ -271,5 +280,8 @@
    @ApiModelProperty(value = "日期 ")
    @TableField(exist = false)
    private String everyDay;
    @ApiModelProperty(value = "经销商名称 ")
    @TableField(exist = false)
    private String shopName;
}
server/dmmall_service/src/main/java/com/doumee/dao/business/model/GoodsorderDetail.java
@@ -107,6 +107,7 @@
    private String lablesName;
    @ApiModelProperty(value = "商品主图")
    @TableField(exist = false)
    private String goodsImgurl;
server/dmmall_service/src/main/java/com/doumee/service/business/impl/GoodsorderServiceImpl.java
@@ -78,6 +78,8 @@
    @Autowired
    private GoodsorderMapper goodsorderMapper;
    @Autowired
    private UserActionMapper userActionMapper;
    @Autowired
    private ActivitySignMapper activitySignMapper;
    @Autowired
    private AftersaleMapper  aftersaleMapper;
@@ -240,22 +242,47 @@
    @Override
    public void orderSendOutGoods(Goodsorder goodsorder) {
        LoginUserInfo user = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
        if(StringUtils.isBlank(goodsorder.getKdCode()) ||StringUtils.isBlank(goodsorder.getKdName())){
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        Goodsorder query=goodsorderMapper.selectById(goodsorder.getId());
        if(query==null){
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),ResponseStatus.DATA_EMPTY.getMessage());
        }
        if(!Constants.equalsInteger(query.getStatus(),Constants.ONE)){
        if(!Constants.equalsInteger(query.getStatus(),Constants.OrderStatus.PAY_DONE.getKey())
                && !Constants.equalsInteger(query.getStatus(),Constants.OrderStatus.WAIT_RECEIVE.getKey())){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"订单状态已流转,请刷新页面!");
        }
        goodsorder.setEditDate(new Date());
        goodsorder.setEditor(user.getId());
        goodsorder.setKdDate(new Date());
        goodsorder.setKdUser(user.getId());
        goodsorder.setStatus(Constants.OrderStatus.WAIT_RECEIVE.getKey());
        goodsorderMapper.updateById(goodsorder);
        if(!Constants.equalsInteger(query.getReceiveType(),Constants.ZERO)){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"该订单有客户到店自提,无需发货操作!");
        }
        Goodsorder update = new Goodsorder();
        update.setId(goodsorder.getId());
        update.setKdName(goodsorder.getKdName());
        update.setKdCode(goodsorder.getKdCode());
        update.setKdInfo(goodsorder.getKdInfo());
        update.setKdId(goodsorder.getKdId());
        update.setEditDate(new Date());
        update.setEditor(user.getId());
        update.setKdDate(new Date());
        update.setKdUser(user.getId());
        update.setStatus(Constants.OrderStatus.WAIT_RECEIVE.getKey());
        goodsorderMapper.updateById(update);
        // TODO å‘送微信模板消息
        if(Constants.equalsInteger(query.getStatus(), Constants.OrderStatus.WAIT_RECEIVE.getKey())){
            //如果是快递变更
            UserActionServiceImpl.saveUserActionBiz(user,query.getId(),
                    Constants.UserActionType.CHANGE_ORDER_KD,
                    userActionMapper,
                    update.getEditDate(),
                    new String[]{user.getUsername(), DateUtil.getPlusTime2(update.getEditDate()),"备注:"+goodsorder.getKdInfo()},
                    JSONObject.toJSONString(update) ,
                    query.getKdName()+"(单号:"+query.getKdCode()+")",
                    goodsorder.getKdName()+"(单号:"+goodsorder.getKdCode()+")");
        }
      /*  // TODO å‘送微信模板消息
        Member member=memberMapper.selectById(query.getMemberId());
        MPJLambdaWrapper<GoodsorderDetail> queryWrapper = new MPJLambdaWrapper<>();
        queryWrapper.eq(GoodsorderDetail::getIsdeleted,Constants.ZERO);
@@ -263,7 +290,7 @@
        queryWrapper.orderByDesc(GoodsorderDetail::getCreateDate);
        queryWrapper.last("limit 1");
        GoodsorderDetail goodsorderDetail=goodsorderDetailMapper.selectOne(queryWrapper);
        SendWxMessage.orderSendNotice(goodsorder,goodsorderDetail!=null?goodsorderDetail.getName():"",member);
        SendWxMessage.orderSendNotice(goodsorder,goodsorderDetail!=null?goodsorderDetail.getName():"",member);*/
    }
@@ -381,12 +408,14 @@
        if(Objects.nonNull(result)){
            MPJLambdaWrapper<GoodsorderDetail> queryWrapper = new MPJLambdaWrapper<>();
            queryWrapper.selectAll(GoodsorderDetail.class);
            queryWrapper.selectAs(Shop::getName,Goodsorder::getShopName);
            queryWrapper.selectAs(Labels::getName,GoodsorderDetail::getLablesName);
            queryWrapper.eq(GoodsorderDetail::getIsdeleted,Constants.ZERO);
            queryWrapper.eq(GoodsorderDetail::getOrderId,result.getId());
            queryWrapper.leftJoin(GoodsSku.class,GoodsSku::getId,GoodsorderDetail::getGoodsSkuId);
            queryWrapper.leftJoin(Goods.class,Goods::getId,GoodsSku::getGoodsId);
            queryWrapper.leftJoin(Labels.class,Labels::getId,Goods::getCategoryId);
            queryWrapper.leftJoin(Shop.class,Shop::getId,Goodsorder::getDistributionShopId);
            List<GoodsorderDetail> goodsorderDetailList=goodsorderDetailMapper.selectList(queryWrapper);
            String path = systemDictDataBiz.queryByCode(Constants.OSS, Constants.RESOURCE_PATH).getCode() + systemDictDataBiz.queryByCode(Constants.OSS, Constants.ACTIVITY_FILE).getCode();
@@ -426,34 +455,88 @@
        IPage<Goodsorder> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
        MPJLambdaWrapper<Goodsorder> queryWrapper = new MPJLambdaWrapper<>();
        Utils.MP.blankToNull(pageWrap.getModel());
        queryWrapper.selectAll(Goodsorder.class);
        queryWrapper.selectAs(Member::getNickname,Goodsorder::getNickName);
        queryWrapper.selectAs(Member::getPhone,Goodsorder::getPhone);
        queryWrapper.selectAs(Addr::getAddr,Goodsorder::getAddr);
      //  queryWrapper.select("(select CREATE_DATE  from order_urge where ORDER_ID=t.id and ISDELETED=0 ORDER BY CREATE_DATE desc limit 1) as urgeCreateDate ");
        queryWrapper.leftJoin(Member.class,Member::getId,Goodsorder::getMemberId);
        queryWrapper.leftJoin(Addr.class,Addr::getMemberId,Member::getId);
        queryWrapper.eq(Addr::getIsDefault,Constants.ONE);
        queryWrapper.selectAs(Shop::getName,Goodsorder::getShopName);
        initPageQueryWrapper(queryWrapper,pageWrap);
        queryWrapper.eq(pageWrap.getModel().getStatus()!=null,Goodsorder::getStatus,pageWrap.getModel().getStatus());
        queryWrapper.orderByDesc(Goodsorder::getCreateDate);
        IPage<Goodsorder> result = goodsorderJoinMapper.selectJoinPage(page, Goodsorder.class, queryWrapper);
        List<Integer> idList = new ArrayList<>();
        for(Goodsorder model:result.getRecords()){
            idList.add(model.getId());
        }
        if(idList.size()>0){
            dealOrderDetailsBiz(idList,result);//查询订单明细
        }
        PageData<Goodsorder> rr =  PageData.from(result);
        if(pageWrap.getPage() == 1){
            //如果查询第一页,做数据统计
            rr.setCountData(dealCountOrderNum(pageWrap));
        }
        return rr;
    }
    private void initPageQueryWrapper(MPJLambdaWrapper<Goodsorder> queryWrapper, PageWrap<Goodsorder> pageWrap) {
        queryWrapper.leftJoin(Shop.class,Shop::getId,Goodsorder::getDistributionShopId);
        queryWrapper.eq(Goodsorder::getIsdeleted,Constants.ZERO);
        queryWrapper.eq(pageWrap.getModel().getCode()!=null,Goodsorder::getCode,pageWrap.getModel().getCode());
        queryWrapper.eq(StringUtils.isNotBlank(pageWrap.getModel().getShopName()),Shop::getName,pageWrap.getModel().getShopName());
        queryWrapper.and(StringUtils.isNotBlank(pageWrap.getModel().getNickName()),ms->ms.like(Goodsorder::getLinkname,pageWrap.getModel().getNickName())
         .or().like(Goodsorder::getLinkphone,pageWrap.getModel().getNickName())
        );
        queryWrapper.ge(pageWrap.getModel().getStarttime()!=null,Goodsorder::getCreateDate,pageWrap.getModel().getStarttime());
        queryWrapper.le(pageWrap.getModel().getEndtime()!=null,Goodsorder::getCreateDate, pageWrap.getModel().getEndtime());
        queryWrapper.eq(pageWrap.getModel().getReceiveType()!=null,Goodsorder::getReceiveType,pageWrap.getModel().getReceiveType());
        queryWrapper.eq(pageWrap.getModel().getPayOrderId()!=null,Goodsorder::getPayOrderId,pageWrap.getModel().getPayOrderId());
        queryWrapper.eq(pageWrap.getModel().getStatus()!=null,Goodsorder::getStatus,pageWrap.getModel().getStatus());
        queryWrapper.eq(pageWrap.getModel().getIsdeleted()==null,Goodsorder::getIsdeleted,Constants.ZERO);
        queryWrapper.orderByDesc(Goodsorder::getCreateDate);
    }
        IPage<Goodsorder> result = goodsorderJoinMapper.selectJoinPage(page, Goodsorder.class, queryWrapper);
        String path = systemDictDataBiz.queryByCode(Constants.OSS, Constants.RESOURCE_PATH).getCode() + systemDictDataBiz.queryByCode(Constants.OSS, Constants.GOODS_FILE).getCode();
    private Goodsorder dealCountOrderNum( PageWrap<Goodsorder>  pageWrap) {
        MPJLambdaWrapper<Goodsorder> queryWrapper = new MPJLambdaWrapper<>();
        initPageQueryWrapper(queryWrapper,pageWrap);
        Goodsorder goodsorder = new Goodsorder();
        queryWrapper.eq( Goodsorder::getStatus,Constants.OrderStatus.WAIT_PAY.getKey());
        goodsorder.setWaitPayNum(goodsorderJoinMapper.selectJoinCount(queryWrapper));//待支付
        queryWrapper = new MPJLambdaWrapper<>();
        initPageQueryWrapper(queryWrapper,pageWrap);
        queryWrapper.eq( Goodsorder::getStatus,Constants.OrderStatus.PAY_DONE.getKey());
        goodsorder.setWaitKdNum(goodsorderJoinMapper.selectJoinCount(queryWrapper));//待发货,待自提
        queryWrapper = new MPJLambdaWrapper<>();
        initPageQueryWrapper(queryWrapper,pageWrap);
        queryWrapper.eq( Goodsorder::getStatus,Constants.OrderStatus.WAIT_RECEIVE.getKey());
        goodsorder.setWaitDoneNum(goodsorderJoinMapper.selectJoinCount(queryWrapper));//待收货
        return goodsorder;
    }
    private void dealOrderDetailsBiz(List<Integer> idList, IPage<Goodsorder> result) {
        MPJLambdaWrapper<GoodsorderDetail> queryGoods = new MPJLambdaWrapper<>();
        queryGoods.selectAll(GoodsorderDetail.class);
        queryGoods.selectAs(Goods::getImgurl,GoodsorderDetail::getGoodsImgurl);
        queryGoods.selectAs(Labels::getName, GoodsorderDetail::getCategoryName);
        queryGoods.select("ls.name as parentName ");
        queryGoods.leftJoin(GoodsSku.class,GoodsSku::getId,GoodsorderDetail::getGoodsSkuId);
        queryGoods.leftJoin(Goods.class,Goods::getId,GoodsSku::getGoodsId);
        queryGoods.leftJoin(Labels.class, Labels::getId, Goods::getCategoryId);
        queryGoods.leftJoin("labels ls on ls.id=t2.PARENT_CATEGORY_ID");
        queryGoods.in(GoodsorderDetail::getOrderId,idList);
        queryGoods.eq(GoodsorderDetail::getIsdeleted,Constants.ZERO);
        List<GoodsorderDetail> goodsorderDetailList=goodsorderDetailJoinMapper.selectList(queryGoods);
        String fullUrl = systemDictDataBiz.queryByCode(Constants.OSS,Constants.RESOURCE_PATH).getCode()+
                systemDictDataBiz.queryByCode(Constants.OSS,Constants.GOODS_FILE).getCode();
        for(Goodsorder model:result.getRecords()){
            model.setResourcePath(path);
            initOrderPrice(model);
            model.setGoodsorderDetailList(getDetailListById(fullUrl,goodsorderDetailList,model.getId()));
        }
    }
    private void initOrderPrice(Goodsorder model) {
            //订单总金额等于实付金额加优惠金额,再减去退款金额
            BigDecimal sumMoney=new BigDecimal(0);
            if(model.getPrice()!=null){
@@ -477,31 +560,8 @@
                    model.setOrderMoneyCount(sumMoney);
                }
            }
            MPJLambdaWrapper<GoodsorderDetail> queryGoods = new MPJLambdaWrapper<>();
            queryGoods.selectAll(GoodsorderDetail.class);
            queryGoods.selectAs(Goods::getImgurl,GoodsorderDetail::getGoodsImgurl);
            queryGoods.selectAs(Labels::getName, GoodsorderDetail::getCategoryName);
            queryGoods.select("ls.name as parentName ");
            queryGoods.leftJoin(GoodsSku.class,GoodsSku::getId,GoodsorderDetail::getGoodsSkuId);
            queryGoods.leftJoin(Goods.class,Goods::getId,GoodsSku::getGoodsId);
            queryGoods.leftJoin(Labels.class, Labels::getId, Goods::getCategoryId);
            queryGoods.leftJoin("labels ls on ls.id=t2.PARENT_CATEGORY_ID");
            queryGoods.eq(GoodsorderDetail::getOrderId,model.getId());
            queryGoods.eq(GoodsorderDetail::getIsdeleted,Constants.ZERO);
           List<GoodsorderDetail> goodsorderDetailList=goodsorderDetailJoinMapper.selectList(queryGoods);
           goodsorderDetailList.stream().forEach(s ->{
               if(StringUtils.isBlank(s.getImgurl())){
                   s.setImgurl(s.getGoodsImgurl());
               }
           });
           model.setGoodsorderDetailList(goodsorderDetailList);
        }
        return PageData.from(result);
    }
    @Override
    public PageData<Goodsorder> findPageShop(PageWrap<Goodsorder> pageWrap) {
        IPage<Goodsorder> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
@@ -533,8 +593,10 @@
                w.like(GoodsorderDetail::getName,pageWrap.getModel().getGoodsName() ).or().eq(GoodsorderDetail::getGoodsSkuId,pageWrap.getModel().getGoodsName());
            } );
            List<GoodsorderDetail> goodsorderDetailList=goodsorderDetailJoinMapper.selectList(queryGoods);
            String fullUrl = systemDictDataBiz.queryByCode(Constants.OSS,Constants.RESOURCE_PATH).getCode()+
                    systemDictDataBiz.queryByCode(Constants.OSS,Constants.GOODS_FILE).getCode();
            for(Goodsorder model:result.getRecords()){
                model.setGoodsorderDetailList(getDetailListById(goodsorderDetailList,model.getId()));
                model.setGoodsorderDetailList(getDetailListById(fullUrl,goodsorderDetailList,model.getId()));
            }
            if(pageWrap.getPage() == 1 && pageWrap.getModel().getDistributionShopId()!=null){
                //如果查询第一页,做经销商销售信息统计业务查询
@@ -569,13 +631,18 @@
        return rr;
    }
    private List<GoodsorderDetail> getDetailListById(List<GoodsorderDetail> goodsorderDetailList, Integer id) {
    private List<GoodsorderDetail> getDetailListById( String fullUrl ,List<GoodsorderDetail> goodsorderDetailList, Integer id) {
        List<GoodsorderDetail> list = new ArrayList<>();
        if(goodsorderDetailList!=null && goodsorderDetailList.size()>0){
        for(GoodsorderDetail d : goodsorderDetailList){
            if(Constants.equalsInteger(id,d.getOrderId())){
                    if(d.getImgurl()!=null){
                        d.setImgurl(fullUrl+d.getImgurl());
                    }
                list.add(d);
            }
        }
        }
        return list;
    }
server/dmmall_service/src/main/java/com/doumee/service/business/impl/UserActionServiceImpl.java