已添加8个文件
已修改29个文件
2070 ■■■■ 文件已修改
admin/src/api/business/workbench.js 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/index.vue 514 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_admin/src/main/java/com/doumee/api/business/WithdrawRecordController.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_admin/src/main/java/com/doumee/api/business/WorkbenchController.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/core/utils/Constants.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/core/utils/DateUtil.java 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/core/wx/SendWxMessage.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/dao/business/GoodsorderMapper.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/dao/business/model/Aftersale.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/dao/business/model/GoodsorderDetail.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/dao/business/model/Notice.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/dao/system/dto/CountDataDTO.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/dao/system/vo/BusinessDataCountVO.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/dao/system/vo/CountDataVO.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/dao/web/dto/NoticeCardDTO.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/dao/web/request/CouponNoticeRequest.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/dao/web/request/DealIntegralRequest.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/dao/web/request/WxPhoneRequest.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/dao/web/response/HomeInfoResponse.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/service/business/AftersaleService.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/service/business/LabelsService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/service/business/NoticeService.java 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/service/business/WithdrawRecordService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/service/business/WorkbenchService.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/service/business/impl/AftersaleServiceImpl.java 185 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/service/business/impl/BannerServiceImpl.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/service/business/impl/GoodsorderServiceImpl.java 245 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/service/business/impl/IntegralServiceImpl.java 114 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/service/business/impl/LabelsServiceImpl.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/service/business/impl/NoticeServiceImpl.java 216 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/service/business/impl/WithdrawRecordServiceImpl.java 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/service/business/impl/WorkbenchServiceImpl.java 269 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_web/src/main/java/com/doumee/api/web/AccountApi.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_web/src/main/java/com/doumee/api/web/LabelsApi.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_web/src/main/java/com/doumee/api/web/NoticeApi.java 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_web/src/main/java/com/doumee/api/web/mall/PaymentCallback.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/business/workbench.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,17 @@
import request from '../../utils/request'
export function businessData (data) {
  return request.post('/business/workbench/businessData', data, {
    trim: true
  })
}
export function shopRankList10 (data) {
  return request.post('/business/workbench/shopRankList10', data, {
    trim: true
  })
}
export function goodsRankList10 (data) {
  return request.post('/business/workbench/goodsRankList10', data, {
    trim: true
  })
}
admin/src/views/index.vue
@@ -1,93 +1,295 @@
<template>
  <TableLayout>
    <div slot="search-form" class="data">
        <div class="item-title">数据看板</div>
      <div class="top-tab">
        <div class="tab-title">经营数据分析</div>
        <div class="tab-item">
          <span v-for="(item,index) in tabs" :key="'tab'+index"  :class="item.index==tabIndex?'active-tab tab-btn':'tab-btn'" @click="changeTab(item)">{{item.name}}</span>
        </div>
      </div>
        <div class="item-title"> </div>
        <div class="data-summary">
          <div class="data-item">
            <div>会员数量</div>
            <div class="data-num">{{ countData.users }}</div>
          <div class="data-item blue">
            <div>{{tabName}}销售额</div>
            <div class="data-num">ï¿¥{{ (topData.price ||0).toFixed(2) }}</div>
          </div>
          <div class="parting"></div>
          <div class="data-item">
            <div>今日活跃用户</div>
            <div class="data-num">{{ countData.activeUsers }}</div>
          <div class="data-item yellow">
            <div>{{tabName}}成交订单量</div>
            <div class="data-num">{{ topData.num||0}}</div>
          </div>
          <div class="parting"></div>
          <div class="data-item">
            <div>订单总数</div>
            <div class="data-num">{{ countData.orders }}</div>
          <div class="data-item green">
            <div>{{tabName}}退款金额</div>
            <div class="data-num">ï¿¥{{( topData.price1 ||0).toFixed(2) }}</div>
          </div>
          <div class="parting"></div>
          <div class="data-item">
            <div>订单总金额</div>
            <div class="data-num">{{ countData.money }}</div>
          <div class="data-item orange">
            <div>{{tabName}}退款订单量</div>
            <div class="data-num">{{ topData.num1 ||0 }}</div>
          </div>
          <div class="parting"></div>
          <div class="data-item">
            <div>本月订单数</div>
            <div class="data-num">{{ countData.mouthOrders }}</div>
          </div>
          <div class="parting"></div>
          <div class="data-item">
            <div>本月订单总金额</div>
            <div class="data-num">{{ countData.mouthMoney }}</div>
          </div>
        </div>
      </div>
    <template v-slot:table-wrap>
      <div class="change-style">
        <div class="item-title">订单金额趋势</div>
        <div style="display: flex;">
          <el-button type="text" @click="changeCount(7)">7日</el-button>
          <div style="margin: 0 5px;">|</div>
          <el-button type="text" @click="changeCount(30)">30日</el-button>
        <div class="count-left">
          <div class="item-title">订单量与销售额趋势</div>
          <div ref="orderCount" class="bottom"  ></div>
        </div>
        <div class="count-right">
          <div class="item-title">各品类销售额占比</div>
          <div ref="cateCount" class="bottom"></div>
        </div>
      </div>
      <div ref="orderChange" class="bottom">
      <div class="change-style">
          <div class="tab-title" style="display: flex;align-items: center; ">
            <span style="">排名分析</span>
            <div class="tab-item" style="margin-left: 20px;" >
              <el-date-picker  style="width: 110px;height: 22px;margin-right: 10px;"   v-model="searchForm.topYear"  type="year" @change="changeYearMonth"
                  clearable  value-format="yyyy"     format="yyyy'å¹´'"   placeholder="年份" ></el-date-picker>
              <el-date-picker  style="width: 100px;height: 22px;"   v-model="searchForm.topMonth"  type="month"  @change="changeYearMonth"
                               clearable  value-format="MM"     format="MM'月'"   placeholder="月份" ></el-date-picker>
            </div>
          </div>
      </div>
      <div class="change-style">
        <div class="count-left">
          <div class="item-title" style="display: flex;">
            <span style="flex: 1">经销商IOP10</span>
            <div class="tab-item" style="text-align: right;flex: 1.5; ">
              <span v-for="(item,index) in tabs1" :key="'tab'+index"  :class="item.index==tabIndex1?'active-tab tab-btn':'tab-btn'" @click="changeTab1(item)">{{item.name}}</span>
            </div>
          </div>
          <div class="bottom1">
            <el-table  :data="dataList1||[]"  stripe  border inline >
              <el-table-column prop="sortnum" label="排名"  align="center">
                <template slot-scope="scope">{{scope.$index +1}}</template>
              </el-table-column>
              <el-table-column prop="name" label="经销商名称"   align="center" >  </el-table-column>
              <el-table-column prop="num" label="订单量"   align="center" >  </el-table-column>
              <el-table-column prop="price" label="销售额(元)" align="center" ></el-table-column>
              <el-table-column prop="num1" label="会员数" align="center"  ></el-table-column>
            </el-table>
          </div>
        </div>
        <div class="count-right">
          <div class="item-title">
            <div class="item-title" style="display: flex;">
              <span style="flex: 1">单一商品TOP10</span>
              <div class="tab-item" style="text-align: right;flex: 1.5; ">
                <span v-for="(item,index) in tabs2" :key="'tab'+index"  :class="item.index==tabIndex2?'active-tab tab-btn':'tab-btn'" @click="changeTab2(item)">{{item.name}}</span>
              </div>
            </div>
          </div>
          <div class="bottom1">
            <el-table  :data="dataList2||[]"  stripe  border >
              <el-table-column prop="sortnum" label="排名"   align="center">
                <template slot-scope="scope">{{scope.$index +1}}</template>
              </el-table-column>
              <el-table-column prop="name" label="商品名称"   align="center" >  </el-table-column>
              <el-table-column prop="num" label="销量"   align="center" >  </el-table-column>
              <el-table-column prop="price" label="销售额(元)" align="center"  ></el-table-column>
            </el-table>
          </div>
        </div>
      </div>
      <div class="change-style">
        <div class="tab-title" style="display: flex;align-items: center; ">
          <span style="">营销数据分析</span>
          <div class="tab-item" style="margin-left: 20px;" >
            <el-date-picker  style="width: 110px;height: 22px;margin-right: 10px;"   v-model="searchForm.topYear2"  type="year"
                             clearable  value-format="yyyy"     format="yyyy'å¹´'"   placeholder="年份" ></el-date-picker>
          </div>
        </div>
      </div>
      <div class="change-style">
        <div class="count-left">
          <div class="item-title">积分发放类型占比</div>
          <div  class="bottom2" style="display: flex">
              <div ref="integralCount" style="flex: 1"></div>
              <div style="flex: 1;font-size: 14px;font-weight: 500;">
                  <div>累计消耗:{{10000}}</div>
                  <div>累计优惠金额:¥{{10000 }}</div>
              </div>
          </div>
        </div>
        <div class="count-right">
          <div class="item-title">优惠券发放类型占比</div>
          <div  class="bottom2">
            <div  class="bottom2" style="display: flex">
              <div ref="couponCount" style="flex: 1"></div>
              <div style="flex: 1;font-size: 14px;font-weight: 500;">
                <div>已使用优惠券:{{10000}}</div>
                <div>累计优惠金额:¥{{10000 }}</div>
              </div>
            </div>
          </div>
        </div>
      </div>
      <div class="change-style" v-if="1==2">
          <div class="item-title">营销投入费用与销售额分析</div>
          <div ref="feeCount" class="bottom"></div>
      </div>
    </template>
  </TableLayout>
</template>
<script>
import TableLayout from '@/layouts/TableLayout'
import * as echarts from 'echarts';
import { findAllList, createCoffeeTask } from '@/api/business/taskRule'
import BaseTable from '@/components/base/BaseTable'
import * as echarts from 'echarts'
export default {
  extends: BaseTable,
  components: {
    TableLayout
  },
  data() {
  data () {
    return {
      countData: {
        users: 1000,
        activeUsers: 1000,
        mouthOrders: 10,
        mouthMoney: 100000,
        orders: 10,
        money: 100000
      loading1: false,
      loading2: false,
      loading3: false,
      tabs2: [{ index: 0, name: '按销量' }, { index: 1, name: '按销售额' }],
      tabs1: [{ index: 0, name: '按订单量' }, { index: 1, name: '按销售额' }, { index: 2, name: '按会员数' }],
      tabs: [{ index: 0, name: '今日' }, { index: 1, name: '近7日' }, { index: 2, name: '近30日' }, { index: 3, name: '近12月' }],
      tabName: '今日',
      tabIndex: 0,
      tabIndex1: 0,
      tabIndex2: 0,
      searchForm: {
        topYear: null,
        topMonth: null,
        topYear2: null
      },
      orderCorderCount: [10,10,20,10,40,10,30],
      opinionData: ['3.20', '3.21', '3.22', '3.23', '3.24', '3.25', '3.26'],
      myChart: null
      topData: {
        num: 0,
        num1: 0,
        price: 0,
        price1: 0,
        dateStrList: [],
        dataList: [],
        dataList2: [],
        cateList: [],
        numList: []
      },
      countData: {
        totalPrice: 1000,
        totalNum: 1000,
        totalRefundPrice: 10000,
        totalRefundNum: 100
      },
      dataList1: [],
      dataList2: [],
      myChart0: null,
      myChart1: null
    }
  },
  mounted() {
    this.myChart = echarts.init(this.$refs.orderChange)
    window.addEventListener('resize', () => {
      this.myChart.resize()
  created () {
    this.config({
      module: '工作台数据统计',
      api: '/business/workbench',
      'field.id': 'id',
      'field.main': 'id'
    })
    this.renderOrderChange()
    findAllList({})
  },
  mounted () {
    this.initTopData()
    this.initShopRankData()
    this.initGoodsRankData()
  },
  methods: {
    renderOrderChange() {
      this.myChart.setOption({
    changeYearMonth(){
      this.initGoodsRankData()
      this.initShopRankData()
    },
    initShopRankData () {
      this.loading2 = true
      this.api.shopRankList10({ year: this.searchForm.topYear, month: this.searchForm.topMonth ,type:this.tabIndex1}).then(res => {
        res = res || []
        this.dataList1 = res
      }).finally(() => {
        this.loading2 = false
      })
    },
    initGoodsRankData () {
      this.loading3 = true
      this.api.goodsRankList10({ year: this.searchForm.topYear, month: this.searchForm.topMonth ,type:this.tabIndex2}).then(res => {
        res = res || []
        this.dataList2 = res
      }).finally(() => {
        this.loading3 = false
      })
    },
    initTopData () {
      this.loading1 = true
      this.initTopEcharts()
      this.api.businessData({ dateType: this.tabIndex }).then(res => {
        res = res || {}
        res.num = res.num || 0
        res.num1 = res.num1 || 0
        res.price = res.price || 0
        res.price1 = res.price1 || 0
        res.dateStrList = res.dateStrList || []
        res.datalist2 = res.datalist2 || []
        res.dataList = res.dataList || []
        res.cateList = res.cateList || []
        this.topData = res
        this.renderEchartOption0()
        this.renderEchartOption2()
      }).finally(() => {
        this.loading1 = false
      })
    },
    initTopEcharts () {
      this.myChart0 = echarts.init(this.$refs.orderCount)
      window.addEventListener('resize', () => {
        this.myChart0.resize()
      })
      this.myChart1 = echarts.init(this.$refs.cateCount)
      window.addEventListener('resize', () => {
        this.myChart1.resize()
      })
      this.renderEchartOption0()
      this.renderEchartOption2()
    },
    changeTab (item) {
      if (this.loading1) {
        return
      }
      if (item.index !== this.tabIndex) {
        this.tabName = item.name
        this.tabIndex = item.index
        this.initTopData()
      }
    },
    changeTab1 (item) {
      if (this.loading2) {
        return
      }
      if (item.index !== this.tabIndex1) {
        this.tabName = item.name
        this.tabIndex1 = item.index
        this.initShopRankData()
      }
    },
    changeTab2 (item) {
      if (this.loading3) {
        return
      }
      if (item.index !== this.tabIndex2) {
        this.tabName = item.name
        this.tabIndex2 = item.index
        this.initGoodsRankData()
      }
    },
    renderEchartOption0 () {
      this.myChart0.setOption({
        tooltip: {
          trigger: 'axis'
          trigger: 'axis',
          axisPointer: {
            type: 'cross'
          }
        },
        grid: {
          left: '3%',
@@ -97,55 +299,157 @@
        },
        toolbox: {
          feature: {
          }
        },
        legend: {
          data: ['订单量', '销售额(元)']
        },
        xAxis: {
          type: 'category',
          boundaryGap: false,
          data: this.opinionData
          data: this.topData.dateStrList || []
        },
        yAxis: {
          type: 'value'
        },
        series: [{
          name: '订单',
          type: 'line',
          stack: '总量',
          data: this.orderCorderCount
        }]
        yAxis: [
          {
            type: 'value',
            name: '订单量',
            min: 0
          },
          {
            type: 'value',
            name: '销售额(元)',
            min: 0
          }
        ],
        series: [
          {
            name: '订单量',
            data: this.topData.dataList || [],
            type: 'bar'
          },
          {
            name: '销售额(元)',
            yAxisIndex: 1,
            data: this.topData.dataList2 || [],
            type: 'line'
          }
        ]
      })
    },
    changeCount(page) {
      if (page == 7) {
        this.orderCorderCount = [10,10,20,10,40,10,30]
        this.opinionData = ['3.20', '3.21', '3.22', '3.23', '3.24', '3.25', '3.26']
      } else {
        this.orderCorderCount = [11,10,20,10,40,10,30,20,10,20,10,40,10,30,10,10,20,10,40,10,30,10,10,20,10,40,10,30,20,40]
        this.opinionData = ['3.01','3.02','3.03','3.04','3.05','3.06','3.07','3.08','3.09','3.10','3.11','3.12','3.13','3.14','3.15','3.16','3.17','3.18','3.19','3.20', '3.21', '3.22', '3.23', '3.24', '3.25', '3.26', '3.27','3.28','3.28','3.30',]
      }
      // this.orderCorderCount.push(1)
      // this.opinionData.push(1)
      this.renderOrderChange()
    renderEchartOption2 () {
      const series = []
      this.topData.cateList.forEach((item, index) => {
        series.push( {
          name: item.name,
          type: 'bar',
          stack: 'total',
          barWidth: '60%',
          label: {
            // show: true
          },
          data: item.data||[]
        })
      })
      this.myChart1.setOption({
        tooltip: {
          trigger: 'axis',
          axisPointer: {
            type: 'cross'
          }
        },
        grid: {
          left: '3%',
          right: '4%',
          bottom: '3%',
          containLabel: true
        },
        toolbox: {
          feature: {
          }
        },
        legend: {
          data: this.topData.cateList || []
        },
        xAxis: {
          type: 'category',
          boundaryGap: false,
          data: this.topData.dateStrList || []
        },
        yAxis: { type: 'value' } ,
        series
      })
    }
  },
  }
}
</script>
<style lang="scss" scoped>
::v-deep .el-input--small .el-input__inner{
  height: 22px;
  line-height: 22px;
  border-radius: 0;
}
::v-deep .el-input--small .el-input__icon{
  height: 22px;
  line-height: 22px;
}
.top-tab{
  margin-bottom: 30px;
  display: block;
}
.tab-title{
  font-weight: 600;
  font-size: 16px;
  color: #222222;
  line-height: 22px;
  display: inline;
}
.tab-item{
  display: inline;
  margin-left: 50px;
  .active-tab{
    border: 1px solid #216EEE !important;
    color: #216EEE !important;
  }
  .tab-btn{
    font-weight: normal;
    cursor: pointer;
    border-radius: 0px;
    margin: 0px 5px;
    font-size: 12px;
    border: 1px solid #999;
    color: #999;
    padding: 1px 5px;
    background-color: #f2f2f2;
  }
}
.data {
  padding-bottom: 10px;
}
.item-title {
  font-weight: 500;
  font-weight: 600;
  font-size: 14px;
  color: #222222;
  margin-left: 20px;
  line-height: 22px;
}
.data-summary {
  display: flex;
  justify-content: space-between;
  margin-top: 10px;
  margin-bottom: 20px;
  .green{
    border-left: 8px solid #12bb8b;
  }
  .yellow{
    border-left: 8px solid #f6cf46;
  }
  .blue{
    border-left: 8px solid #216EEE;
  }
  .orange{
    border-left: 8px solid #ff9e56;
  }
  .data-item {
    flex: 1;
    height: 80px;
@@ -153,12 +457,15 @@
    box-sizing: border-box;
    padding: 15px;
    display: flex;
    font-size: 14px;
    flex-direction: column;
    justify-content: space-between;
    background-color: #f4f7fc;
    color: #666;
    .data-num {
      font-size: 20px;
      font-weight: 700;
      color:aqua
      font-weight: 800;
      color: #333;
    }
  }
  .parting {
@@ -169,9 +476,42 @@
  display: flex;
  justify-content: space-between;
  line-height: 31px;
}
.bottom {
  height: 500px;
}
</style>
  margin-bottom: 50px;
  .count-left{
    display: inline-block;
    margin-right: 10px;
    flex: 1;
    .bottom {
      height: 500px;
      width: 100%;
    }
    .bottom2 {
      height: 300px;
      width: 100%;
    }
    .bottom1 {
      height: auto;
      width: 100%;
    }
  }
  .count-right{
    display: inline-block;
    margin-left: 10px;
    flex: 1;
    .bottom {
      height: 500px;
      width: 100%;
    }
    .bottom2 {
      height: 300px;
      width: 100%;
    }
    .bottom1 {
      height: auto;
      width: 100%;
    }
  }
}
</style>
server/dmmall_admin/src/main/java/com/doumee/api/business/WithdrawRecordController.java
@@ -7,6 +7,7 @@
import com.doumee.core.model.PageWrap;
import com.doumee.core.model.PageData;
import com.doumee.dao.business.model.WithdrawRecord;
import com.doumee.service.business.IntegralService;
import com.doumee.service.business.WithdrawRecordService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@@ -29,6 +30,9 @@
    @Autowired
    private WithdrawRecordService withdrawRecordService;
    @Autowired
    private IntegralService integralService;
    @PreventRepeat
    @ApiOperation("新建")
@@ -63,7 +67,7 @@
    @PostMapping("/updateById")
    @RequiresPermissions("business:withdrawrecord:update")
    public ApiResponse updateById(@RequestBody WithdrawRecord withdrawRecord) {
        withdrawRecordService.updateById(withdrawRecord);
        withdrawRecordService.updateById(withdrawRecord,integralService);
        return ApiResponse.success(null);
    }
server/dmmall_admin/src/main/java/com/doumee/api/business/WorkbenchController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,48 @@
package com.doumee.api.business;
import com.doumee.api.BaseController;
import com.doumee.core.annotation.pr.PreventRepeat;
import com.doumee.core.model.ApiResponse;
import com.doumee.dao.business.model.Fund;
import com.doumee.dao.system.dto.CountDataDTO;
import com.doumee.dao.system.vo.BusinessDataCountVO;
import com.doumee.dao.system.vo.CountDataVO;
import com.doumee.service.business.FundService;
import com.doumee.service.business.WorkbenchService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
 * @author æ±Ÿè¹„蹄
 * @date 2023/03/21 15:48
 */
@Api(tags = "工作台数据统计接口")
@RestController
@RequestMapping("/business/workbench")
public class WorkbenchController extends BaseController {
    @Autowired
    private WorkbenchService workbenchService;
    @ApiOperation("经营数据分析")
    @PostMapping("/businessData")
    public ApiResponse<BusinessDataCountVO> businessData(@RequestBody CountDataDTO param) {
        return ApiResponse.success(workbenchService.businessData(param));
    }
    @ApiOperation("经销商TOP10")
    @PostMapping("/shopRankList10")
    public ApiResponse<List<BusinessDataCountVO>> shopRankList10(@RequestBody CountDataDTO param) {
        return ApiResponse.success(workbenchService.shopRankList10(param));
    }
    @ApiOperation("单一商品TOP10")
    @PostMapping("/goodsRankList10")
    public ApiResponse<List<BusinessDataCountVO>> goodsRankList10(@RequestBody CountDataDTO param) {
        return ApiResponse.success(workbenchService.goodsRankList10(param));
    }
}
server/dmmall_service/src/main/java/com/doumee/core/utils/Constants.java
@@ -623,8 +623,7 @@
        DONE(3, "交易完成", "交易完成"),
        CLOSE(4, "已关闭", "已关闭"),
        PART_DONE(5, "部分发货", "部分发货"),
        REFUND(6, "订单退款", "订单退款"),
        ;
        // æˆå‘˜å˜é‡
        private String name;
@@ -881,23 +880,27 @@
     */
    public  enum IntegralObjType {
        REGISTER(0, "注册积分奖励", "注册成功,获得${param}积分",0,0),
        INVITENEWUSER(3, "邀请好友得积分", "推荐好友${param}成功,获得${param1}积分",0,0),
        INVITENEWUSER(3, "邀请好友得积分", "推荐好友${param1}成功,获得${param}积分",0,0),
        SYSTEM_RECHARGE(12,"积分发放","平台奖励,获得${param}积分",0,0),
        SYSTEM_DEDUCT(13,"积分扣除","平台扣减,消耗${param}积分",0,0),
        MEMBER_ORDER_CANCEL(14,"取消订单退回","交易退款退回,获得${param}积分",0,0),
        MEMBER_ORDER_REFUND(28,"订单退款","订单退款,返还订单消耗${param}积分",0,0),
        MEMBER_ORDER(9,"下单抵扣","消费抵扣,消耗${param}积分",1,0),
        ORDER_DONATE(15,"消费返积分","购物成功,获得${param}积分",0,0),
        SHOP_YEAR_SETTLEMENT(18,"积分过期","积分过期,消耗${param}积分",0,0),
        MEMBER_ORDER_REFUND_RETURN(27,"订单退款","订单退款,扣除订单返还${param}积分",0,0),
        ORDER_DONE_AMOUNT(16,"订单结算","${param}订单结算成功,获得¥${param1}元",0,1),//${param}订单编号,${param1}金额
        WITHDRAW_APPLY(17,"余额提现","余额提现已提交,消耗¥${param}元",0,1),
        WITHDRAW_APPLY_BACK(19,"提现退回","余额提现失败,获得¥${param}元",0,1),
        ORDER_DONE_AMOUNT_BACK(20,"订单结算退回","${param}订单结算退回,消耗¥${param1}元",0,1),//${param}订单编号,${param1}金额
        ORDER_DONE_AMOUNT(16,"订单结算","${param1}订单结算成功,获得¥${param}",0,1),//${param}订单编号,${param1}金额
        WITHDRAW_APPLY(17,"余额提现","余额提现已提交,消耗¥${param}",0,1),
        WITHDRAW_APPLY_BACK(19,"提现退回","余额提现失败,获得¥${param}",0,1),
//        ORDER_DONE_AMOUNT_BACK(20,"订单结算退回","${param1}订单结算退回,消耗¥${param}元",0,1),//${param}订单编号,${param1}金额
        SHOP_ORDER_REFUND_CASH(25,"订单退款","${param1}订单退款,扣除结算金额¥${param}",0,0),
        SHOP_ORDER(21,"消费返积分","会员${param}交易成功,获得${param1}积分",0,0),//${param}昵称-手机号
        SHOP_ORDER_CANCEL(22,"订单取消退回","订单取消退回,退回${param}积分",0,0),
        SHOP_ORDER(21,"消费返积分","会员${param1}交易成功,获得${param}积分",0,0),//${param}昵称-手机号
//        SHOP_ORDER_CANCEL(22,"订单取消退回","订单取消退回,退回${param}积分",0,0),
        SHOP_ORDER_REFUND_INTEGRAL(26,"订单退款","订单退款,扣除订单返还${param}积分",0,0),
        SHOP_SYSTEM_RECHARGE(23,"积分发放","平台奖励,获得${param}积分",0,0),
        SHOP_SYSTEM_DEDUCT(24,"积分扣除","平台扣减,消耗${param}积分",0,0),
server/dmmall_service/src/main/java/com/doumee/core/utils/DateUtil.java
@@ -7,13 +7,11 @@
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalAdjusters;
import java.util.Calendar;
import java.util.*;
import java.util.Date;
import java.util.Enumeration;
import java.util.GregorianCalendar;
import java.util.Hashtable;
import java.util.Locale;
import org.apache.commons.lang3.RandomStringUtils;
import org.apache.commons.lang3.StringUtils;
@@ -1240,7 +1238,12 @@
        }
        return length;
    }
    public static String minusMonthToDate(LocalDate date, int num) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM");
        String month = date.minusMonths(num).format(formatter);
        return month;
}
    /**
     * å¾—到两个日期之间相差的天数
     *
@@ -1712,7 +1715,56 @@
        calo.add(Calendar.DATE, intBetween);
        return calo.getTime();
    }
    public static List<Date> getDatePeriodByYearAndMonth(int year  , int month) {
        List<Date> list = new ArrayList<>();
        list.add(null);
        list.add(null);
        try {
            Calendar calendar = Calendar.getInstance();
            calendar.set(Calendar.YEAR, year);
            calendar.set(Calendar.MONTH, month);
            calendar.set(Calendar.DAY_OF_MONTH, 1);
            calendar.set(Calendar.HOUR_OF_DAY, 0);
            calendar.set(Calendar.MINUTE, 0);
            calendar.set(Calendar.SECOND, 0);
            list.set(0,calendar.getTime());
            calendar.add(Calendar.MONTH, 1); // åŠ ä¸€ä¸ªæœˆ
            calendar.add(Calendar.DAY_OF_MONTH, -1); // ç„¶åŽå‡ä¸€å¤©å¾—到这个月最后一天
            calendar.set(Calendar.HOUR_OF_DAY, 23);
            calendar.set(Calendar.MINUTE, 59);
            calendar.set(Calendar.SECOND, 59);
            list.set(1,calendar.getTime());
        }catch (Exception e){
        }
        return list;
    }
    public static List<Date> getDatePeriodByYear(int year) {
        List<Date> list = new ArrayList<>();
        list.add(null);
        list.add(null);
        try {
            Calendar calendar = Calendar.getInstance();
            calendar.set(Calendar.YEAR, year);
            calendar.set(Calendar.MONTH,0);
            calendar.set(Calendar.DAY_OF_MONTH, 1);
            calendar.set(Calendar.HOUR_OF_DAY, 0);
            calendar.set(Calendar.MINUTE, 0);
            calendar.set(Calendar.SECOND, 0);
            list.set(0,calendar.getTime());
            calendar.add(Calendar.YEAR, 1); // åŠ ä¸€ä¸ªæœˆ
            calendar.add(Calendar.DAY_OF_MONTH, -1); // ç„¶åŽå‡ä¸€å¤©å¾—到这个月最后一天
            calendar.set(Calendar.HOUR_OF_DAY, 23);
            calendar.set(Calendar.MINUTE, 59);
            calendar.set(Calendar.SECOND, 59);
            list.set(1,calendar.getTime());
        }catch (Exception e){
        }
        return list;
    }
    /**
     * å¾—到将date增加指定年数后的date
     *
@@ -2753,7 +2805,10 @@
    public static void main(String[] args) {
        try {
            System.out.println(RandomStringUtils.randomNumeric(3));
            System.out.println(getPlusTime2(getDatePeriodByYearAndMonth(2026,11).get(0)));
            System.out.println(getPlusTime2(getDatePeriodByYearAndMonth(2026,11).get(1)));
            System.out.println(getPlusTime2(getDatePeriodByYear(2026).get(0)));
            System.out.println(getPlusTime2(getDatePeriodByYear(2026).get(1)));
        } catch (Exception ex) {
            ex.printStackTrace();
        }
server/dmmall_service/src/main/java/com/doumee/core/wx/SendWxMessage.java
@@ -91,11 +91,7 @@
        }catch (WxErrorException wxErrorException){
        }
    }
    /**
server/dmmall_service/src/main/java/com/doumee/dao/business/GoodsorderMapper.java
@@ -8,6 +8,8 @@
import com.doumee.dao.web.request.goods.GoodsRequest;
import com.doumee.dao.web.response.goods.GoodsInfoResponse;
import com.doumee.dao.web.response.goods.MemberOrderResponse;
import com.github.yulichang.base.mapper.MPJJoinMapper;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import io.swagger.annotations.ApiModelProperty;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
@@ -18,7 +20,7 @@
 * @author æ±Ÿè¹„蹄
 * @date 2023/03/21 15:48
 */
public interface GoodsorderMapper extends BaseMapper<Goodsorder> {
public interface GoodsorderMapper extends MPJJoinMapper<Goodsorder> {
    @Select(" select g.CODE AS code ,  g.id as orderId , g.CREATE_DATE as createDate    , g.TYPE as orderType , g.STATUS as orderStatus , g.IS_COMMENT as isComment , g.PAY_STATUS as  payStatus ," +
server/dmmall_service/src/main/java/com/doumee/dao/business/model/Aftersale.java
@@ -79,6 +79,23 @@
    @ApiModelProperty(value = "退款金额", example = "1")
    @ExcelColumn(name="退款金额")
    private BigDecimal money;
    @ApiModelProperty(value = "扣除已返经销商积分值", example = "1")
    @ExcelColumn(name="扣除已返经销商积分值")
    private BigDecimal returnShopIntegral;
    @ApiModelProperty(value = "扣除经销商结算金额", example = "1")
    @ExcelColumn(name="扣除经销商结算金额")
    private BigDecimal returnShopSettlement;
    @ApiModelProperty(value = "扣除已返用户积分值", example = "1")
    @ExcelColumn(name="扣除已返用户积分值")
    private BigDecimal returnIntegral;
    @ApiModelProperty(value = "退款配置信息", example = "1")
    @ExcelColumn(name="退款配置信息")
    private String returnConfig;
    @ApiModelProperty(value = "实际退款金额", example = "1")
    @ExcelColumn(name="实际退款金额")
    private BigDecimal actMoney;
server/dmmall_service/src/main/java/com/doumee/dao/business/model/GoodsorderDetail.java
@@ -55,6 +55,9 @@
    @ApiModelProperty(value = "订单编码(关联goodsorder表)", example = "1")
    @ExcelColumn(name="订单编码(关联goodsorder表)")
    private Integer orderId;
    @ApiModelProperty(value = "商品编码(gooods表)", example = "1")
    @ExcelColumn(name="商品编码(gooods表)")
    private Integer goodsId;
    @ApiModelProperty(value = "SKU列表图")
    @ExcelColumn(name="SKU列表图")
server/dmmall_service/src/main/java/com/doumee/dao/business/model/Notice.java
@@ -80,12 +80,12 @@
    @ExcelColumn(name="对象编码")
    private Integer objId;
    @ApiModelProperty(value = "对象类型 0咖豆订单 ã€å•†åŸŽã€å’–啡计划订单 1活动、探店、资讯 2活动探店资讯评论", example = "1")
    @ExcelColumn(name="对象类型 0咖豆订单 ã€å•†åŸŽã€å’–啡计划订单 1活动、探店、资讯 2活动探店资讯评论")
    @ApiModelProperty(value = "对象类型 0商城订单 1积分流水 2互动评价 3优惠券 4现金流水", example = "1")
    @ExcelColumn(name="对象类型 0商城订单 1积分流水 2互动评价 3优惠券 4现金流水")
    private Integer objType;
    @ApiModelProperty(value = "消息类型 0订单通知 1系统消息 2互动消息 3优惠券提醒 4官方客服  5活动推荐 6我的关注", example = "1")
    @ExcelColumn(name="消息类型 0订单通知 1系统消息 2互动消息 3优惠券提醒 4官方客服  5活动推荐 6我的关注")
    @ApiModelProperty(value = "消息类型 0消费者消息;1=经销商消息;", example = "1")
    @ExcelColumn(name="消息类型 0消费者消息;1=经销商消息;")
    private Integer type;
    @ApiModelProperty(value = "状态 0未读 1已读", example = "1")
@@ -104,4 +104,7 @@
    @TableField(exist = false)
    private Integer shopId;
    @ApiModelProperty(value = "查询类型:0=系统消息;1=社区消息;", example = "1")
    @TableField(exist = false)
    private Integer queryType;
}
server/dmmall_service/src/main/java/com/doumee/dao/system/dto/CountDataDTO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,28 @@
package com.doumee.dao.system.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
@Data
@ApiModel("经销商账户明细对象")
public class CountDataDTO {
    @ApiModelProperty(value = "排名", example = "1")
    private Integer year;
    @ApiModelProperty(value = "统计数量(订单数、销量、消耗积分量)")
    private Integer month;
    @ApiModelProperty(value = "统计数量(订单数、销量、消耗积分量)")
    private Integer type;
    @ApiModelProperty(value = "时间类型 0今天 1近七日 2近30天 3一年")
    private int dateType;
    @ApiModelProperty(value = "开始时间")
    private Date startTime;
    @ApiModelProperty(value = "截止时间")
    private Date endTime;
}
server/dmmall_service/src/main/java/com/doumee/dao/system/vo/BusinessDataCountVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,32 @@
package com.doumee.dao.system.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
@Data
@ApiModel("经营数据分析统计解雇")
public class BusinessDataCountVO {
    @ApiModelProperty(value = "统计数量(订单数、销量、消耗积分量)")
    private Long num;
    @ApiModelProperty(value = "统计数量2 (会员数)")
    private Long num1;
    @ApiModelProperty(value = "销售额,优惠金额")
    private BigDecimal price;
    @ApiModelProperty(value = "销售额,促成交易金额金额")
    private BigDecimal price1;
    @ApiModelProperty(value = "统计维度名称")
    private String name;
    @ApiModelProperty(value = "统计列表数据")
    private List<Long> dataList;
    @ApiModelProperty(value = "横轴")
    private List<String> dateStrList;
    @ApiModelProperty(value = "统计列表数据2")
    private List<BigDecimal> dataList2;
    @ApiModelProperty(value = "统计列表数据分类2")
    private List<CountDataVO>  cateList;
}
server/dmmall_service/src/main/java/com/doumee/dao/system/vo/CountDataVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,32 @@
package com.doumee.dao.system.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
@Data
@ApiModel("经销商账户明细对象")
public class CountDataVO {
    @ApiModelProperty(value = "排名", example = "1")
    private Integer sortnum;
    @ApiModelProperty(value = "统计数量(订单数、销量、消耗积分量)")
    private Long num;
    @ApiModelProperty(value = "统计数量2 (会员数)")
    private Long num2;
    @ApiModelProperty(value = "销售额,优惠金额")
    private BigDecimal price;
    @ApiModelProperty(value = "销售额,促成交易金额金额")
    private BigDecimal price1;
    @ApiModelProperty(value = "统计维度名称")
    private String name;
    @ApiModelProperty(value = "统计维度时间名称")
    private String dateStr;
    @ApiModelProperty(value = "销售额集合")
    private BigDecimal[] data;
}
server/dmmall_service/src/main/java/com/doumee/dao/web/dto/NoticeCardDTO.java
@@ -31,7 +31,7 @@
    @ApiModelProperty(value = "对象编码", example = "1")
    private Integer objId;
    @ApiModelProperty(value = "对象类型 0咖豆订单 ã€å•†åŸŽã€å’–啡计划订单 1活动、探店、资讯 2活动探店资讯评论", example = "1")
    @ApiModelProperty(value = "对象类型 0商城订单 1积分流水 2互动评价 3优惠券 4现金流水", example = "1")
    private Integer objType;
    @ApiModelProperty(value = "消息类型 0订单通知 1系统消息 2互动消息 3优惠券提醒 4官方客服  5活动推荐 6我的关注", example = "1")
server/dmmall_service/src/main/java/com/doumee/dao/web/request/CouponNoticeRequest.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,28 @@
package com.doumee.dao.web.request;
import com.doumee.dao.business.model.MemberCoupon;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
import java.io.Serializable;
/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Rk
 * @create 2023/3/23 9:50
 */
@Data
@ApiModel("发送优惠券通知请求类")
public class CouponNoticeRequest{
    @ApiModelProperty(value = "用户优惠券信息")
    private MemberCoupon memberCoupon;
    @ApiModelProperty(value = "优惠券数量")
    private Integer num;
}
server/dmmall_service/src/main/java/com/doumee/dao/web/request/DealIntegralRequest.java
@@ -35,6 +35,8 @@
    @ApiModelProperty(value = "收支类型 0收入 1支出")
    private Integer dealType;
    @ApiModelProperty(value = "消息参数")
    private String param1;
}
server/dmmall_service/src/main/java/com/doumee/dao/web/request/WxPhoneRequest.java
@@ -18,22 +18,27 @@
@ApiModel("微信授权手机号请求类")
public class WxPhoneRequest implements Serializable {
    @NotEmpty(message = "encryptedData ä¸èƒ½ä¸ºç©º")
    @ApiModelProperty(value = "encryptedData")
    private String encryptedData;
    @NotEmpty(message = "iv ä¸èƒ½ä¸ºç©º")
    @ApiModelProperty(value = "iv")
    private String iv;
    @NotEmpty(message = "sessionKey ä¸èƒ½ä¸ºç©º")
    @ApiModelProperty(value = "sessionKey")
    private String sessionKey;
//    @NotEmpty(message = "encryptedData ä¸èƒ½ä¸ºç©º")
//    @ApiModelProperty(value = "encryptedData")
//    private String encryptedData;
//
//    @NotEmpty(message = "iv ä¸èƒ½ä¸ºç©º")
//    @ApiModelProperty(value = "iv")
//    private String iv;
//
//    @NotEmpty(message = "sessionKey ä¸èƒ½ä¸ºç©º")
//    @ApiModelProperty(value = "sessionKey")
//    private String sessionKey;
    @NotEmpty(message = "openid ä¸èƒ½ä¸ºç©º")
    @ApiModelProperty(value = "openid")
    private String openid;
    @NotEmpty(message = "code ä¸èƒ½ä¸ºç©º")
    @ApiModelProperty(value = "code")
    private String code;
    @ApiModelProperty(value = "邀请码")
    private String recId;
server/dmmall_service/src/main/java/com/doumee/dao/web/response/HomeInfoResponse.java
@@ -32,5 +32,8 @@
    @ApiModelProperty(value = "待收货数量")
    private Long waitReceiveNum;
    @ApiModelProperty(value = "是否存在未读:0=无;1=存在")
    private Integer unRead;
}
server/dmmall_service/src/main/java/com/doumee/service/business/AftersaleService.java
@@ -4,6 +4,7 @@
import com.doumee.core.model.PageWrap;
import com.doumee.dao.admin.response.AftersaleListResponse;
import com.doumee.dao.business.model.Aftersale;
import com.doumee.dao.web.request.AfterSaleApplyRequest;
import com.doumee.dao.web.request.goods.AftersaleCancelRequest;
import com.doumee.dao.web.request.goods.AftersaleCreateRequest;
import com.doumee.dao.web.request.goods.AftersalePostRequest;
@@ -114,4 +115,6 @@
    void memberPost(AftersalePostRequest aftersale);
    void autoDone();
    void afterSaleApply(AfterSaleApplyRequest afterSaleApplyRequest, Integer userId);
}
server/dmmall_service/src/main/java/com/doumee/service/business/LabelsService.java
@@ -135,6 +135,6 @@
     */
    List<LabelsResponse> getGoodsLabels(Integer parentId);
    List<LabelsResponse> getGoodsLabelsByType(Integer type);
    List<LabelsResponse> getGoodsLabelsByType(Integer type,Integer parentId);
}
server/dmmall_service/src/main/java/com/doumee/service/business/NoticeService.java
@@ -2,9 +2,12 @@
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.core.utils.Constants;
import com.doumee.dao.business.model.Notice;
import com.doumee.dao.web.dto.NoticeCardDTO;
import com.doumee.dao.web.request.CouponNoticeRequest;
import java.math.BigDecimal;
import java.util.List;
/**
@@ -104,4 +107,59 @@
     * @return
     */
    PageData<NoticeCardDTO> findNoticeCardDTOPage(PageWrap<Notice> pageWrap);
    /**
     * ç§¯åˆ†å˜åŠ¨æ¶ˆæ¯ç±»åž‹
     * @param integralObjType  ç§¯åˆ†å˜åŠ¨ç±»åž‹
     * @param memberId ç”¨æˆ·ä¸»é”®/商户主键
     * @param integral å˜åŠ¨ç§¯åˆ†/现金值
     * @param objId å…³è”对象主键 - ç§¯åˆ†æµæ°´å˜åŠ¨è®°å½•ä¸»é”®
     * @param param1 param2
     */
    void saveMemberIntegralNotice(Constants.IntegralObjType integralObjType, Integer type,
                                  Integer memberId,
                                  BigDecimal integral,
                                  Integer objId, String param1);
    /**
     * ä¼˜æƒ åˆ¸æ¶ˆæ¯
     * @param memberId
     * @param couponList
     */
    void couponNotice(Integer memberId,List<CouponNoticeRequest> couponList);
    /**
     * è®¢å•支付成功 å‘送消息
     * @param shopId
     * @param objId
     * @param receiveType
     */
    void orderPayNotice(Integer shopId, Integer objId,Integer receiveType);
    /**
     * è®¢å•取消消息
     * @param shopId
     * @param objId
     * @param orderNo
     */
    void orderCancelNotice(Integer shopId, Integer objId,String orderNo);
    /**
     * ç§¯åˆ†è¿‡æœŸæ¶ˆæ¯
     * @param memberId
     * @param integral
     * @param expireDateNum
     */
    void expireNotice(Integer memberId, BigDecimal integral,Integer expireDateNum);
    /**
     * è¯„论站内信
     * @param memberId
     * @param objId
     * @param memberName
     */
    void commonNotice(Integer memberId, Integer objId,String memberName );
}
server/dmmall_service/src/main/java/com/doumee/service/business/WithdrawRecordService.java
@@ -48,7 +48,7 @@
     *
     * @param withdrawRecord å®žä½“对象
     */
    void updateById(WithdrawRecord withdrawRecord);
    void updateById(WithdrawRecord withdrawRecord, IntegralService integralService);
    /**
     * æ‰¹é‡ä¸»é”®æ›´æ–°
server/dmmall_service/src/main/java/com/doumee/service/business/WorkbenchService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
package com.doumee.service.business;
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.dao.business.model.Fund;
import com.doumee.dao.system.dto.CountDataDTO;
import com.doumee.dao.system.vo.BusinessDataCountVO;
import com.doumee.dao.system.vo.CountDataVO;
import java.util.List;
/**
 * èµ„金明细信息表Service定义
 * @author æ±Ÿè¹„蹄
 * @date 2023/03/21 15:48
 */
public interface WorkbenchService {
    BusinessDataCountVO businessData(CountDataDTO param);
    List<BusinessDataCountVO> shopRankList10(CountDataDTO param);
    List<BusinessDataCountVO> goodsRankList10(CountDataDTO param);
}
server/dmmall_service/src/main/java/com/doumee/service/business/impl/AftersaleServiceImpl.java
@@ -12,13 +12,11 @@
import com.doumee.core.utils.Utils;
import com.doumee.core.wx.WxMiniUtilService;
import com.doumee.dao.admin.response.AftersaleListResponse;
import com.doumee.dao.business.AftersaleMapper;
import com.doumee.dao.business.FundMapper;
import com.doumee.dao.business.GoodsorderDetailMapper;
import com.doumee.dao.business.GoodsorderMapper;
import com.doumee.dao.business.*;
import com.doumee.dao.business.join.AftersaleJoinMapper;
import com.doumee.dao.business.model.*;
import com.doumee.dao.web.dto.MultiFileDTO;
import com.doumee.dao.web.request.AfterSaleApplyRequest;
import com.doumee.dao.web.request.DealIntegralRequest;
import com.doumee.dao.web.request.goods.AftersaleCancelRequest;
import com.doumee.dao.web.request.goods.AftersaleCreateRequest;
@@ -43,10 +41,7 @@
import org.springframework.util.CollectionUtils;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.*;
/**
 * å•†å“å”®åŽä¿¡æ¯è¡¨Service实现
@@ -64,6 +59,10 @@
    @Autowired
    private GoodsorderMapper goodsorderMapper;
    @Autowired
    private ShopMapper shopMapper;
    @Autowired
    private MemberMapper memberMapper;
    @Autowired
    private GoodsorderDetailMapper goodsorderDetailMapper;
    @Autowired
    private AftersaleJoinMapper aftersaleJoinMapper;
@@ -73,6 +72,9 @@
    @Autowired
    @Lazy
    private IntegralService integralService;
    @Autowired
    private MemberCouponJoinMapper memberCouponJoinMapper;
    @Autowired
    private FundMapper fundMapper;
@@ -1004,4 +1006,171 @@
    }
    @Override
    @Transactional(rollbackFor = {BusinessException.class,Exception.class})
    public void afterSaleApply(AfterSaleApplyRequest afterSaleApplyRequest, Integer userId){
        if(Objects.isNull(afterSaleApplyRequest)
            || Objects.isNull(afterSaleApplyRequest.getOrderId())
                || Objects.isNull(afterSaleApplyRequest.getReturnUseIntegralStatus())
                || Objects.isNull(afterSaleApplyRequest.getReturnUseCouponStatus())
                || Objects.isNull(afterSaleApplyRequest.getReturnShopSettlementStatus())
                || Objects.isNull(afterSaleApplyRequest.getReturnShopIntegralStatus())
                || Objects.isNull(afterSaleApplyRequest.getReturnIntegralStatus())
                || Objects.isNull(afterSaleApplyRequest.getMoney())
        ){
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        Goodsorder goodsorder = goodsorderMapper.selectById(afterSaleApplyRequest.getOrderId());
        if(Objects.isNull(goodsorder)){
            throw new BusinessException(ResponseStatus.DATA_EMPTY);
        }
        if(!(Constants.equalsInteger(goodsorder.getStatus(),Constants.OrderStatus.WAIT_RECEIVE.getKey())
            || Constants.equalsInteger(goodsorder.getStatus(),Constants.OrderStatus.DONE.getKey()))){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"订单状态已流转,无法进行该操作!");
        }
        Aftersale aftersale = new Aftersale();
        aftersale.setCreateDate(new Date());
        aftersale.setIsdeleted(Constants.ZERO);
        aftersale.setOrderId(goodsorder.getId());
        aftersale.setType(Constants.ZERO);
        aftersale.setContent(afterSaleApplyRequest.getRemark());
        aftersale.setStatus(Constants.AftersaleStatus.DONE.getKey());
        aftersale.setInfo(afterSaleApplyRequest.getRemark());
        aftersale.setMoney(afterSaleApplyRequest.getMoney());
        aftersale.setCoupon(goodsorder.getCouponPrice());
        aftersale.setReturnShopIntegral(BigDecimal.ZERO);
        aftersale.setReturnIntegral(BigDecimal.ZERO);
        aftersale.setReturnShopSettlement(BigDecimal.ZERO);
        aftersale.setCode(getNextInCode());
        //订单退回返回给经销商的积分
        if(Objects.nonNull(goodsorder.getDistributionShopId())&&goodsorder.getReturnCustomerIntegral().compareTo(BigDecimal.ZERO)>Constants.ZERO){
            Shop shop = shopMapper.selectById(goodsorder.getDistributionShopId());
            //经销商存在剩余积分
            if(Objects.nonNull(shop)&&shop.getIntegral().compareTo(BigDecimal.ZERO)>Constants.ZERO){
                //开启了扣除返还经销商积分
                if(Constants.equalsInteger(afterSaleApplyRequest.getReturnShopIntegralStatus(),Constants.ONE)){
                    //记录扣除经销商积分值
                    aftersale.setReturnShopIntegral(shop.getIntegral().compareTo(goodsorder.getReturnCustomerIntegral())>Constants.ZERO
                            ?goodsorder.getReturnCustomerIntegral():shop.getIntegral());
                    DealIntegralRequest dealIntegralRequest = new DealIntegralRequest();
                    dealIntegralRequest.setIntegralNum(aftersale.getReturnShopIntegral());
                    dealIntegralRequest.setDealType(Constants.ONE);
                    dealIntegralRequest.setMemberId(goodsorder.getDistributionShopId());
                    dealIntegralRequest.setObjId(goodsorder.getId());
                    dealIntegralRequest.setOrderCode(goodsorder.getCode().toString());
                    dealIntegralRequest.setIntegralObjType(Constants.IntegralObjType.SHOP_ORDER_REFUND_INTEGRAL);
                    integralService.dealShopIntegral(dealIntegralRequest);
                }
            }
        }
        //订单退回 ç»é”€å•†ç»“算余额
        if(Objects.nonNull(goodsorder.getDistributionShopId())&&goodsorder.getShopSettlement().compareTo(BigDecimal.ZERO)>Constants.ZERO){
            Shop shop = shopMapper.selectById(goodsorder.getDistributionShopId());
            //经销商存在剩余积分
            if(Objects.nonNull(shop)&&shop.getAmount().compareTo(BigDecimal.ZERO)>Constants.ZERO){
                //开启了扣除返还经销商积分
                if(Constants.equalsInteger(afterSaleApplyRequest.getReturnShopSettlementStatus(),Constants.ONE)){
                    //记录扣除经销商积分值
                    aftersale.setReturnShopSettlement(shop.getAmount().compareTo(goodsorder.getShopSettlement())>Constants.ZERO
                            ?goodsorder.getShopSettlement():shop.getAmount());
                    DealIntegralRequest dealIntegralRequest = new DealIntegralRequest();
                    dealIntegralRequest.setIntegralNum(aftersale.getReturnShopIntegral());
                    dealIntegralRequest.setDealType(Constants.ONE);
                    dealIntegralRequest.setMemberId(goodsorder.getDistributionShopId());
                    dealIntegralRequest.setObjId(goodsorder.getId());
                    dealIntegralRequest.setOrderCode(goodsorder.getCode().toString());
                    dealIntegralRequest.setIntegralObjType(Constants.IntegralObjType.SHOP_ORDER_REFUND_CASH);
                    integralService.dealShopAmount(dealIntegralRequest);
                }
            }
        }
        //订单退回 è¿”还给客户的积分
        if(Objects.nonNull(goodsorder.getDistributionShopId())&&goodsorder.getReturnMemberIntegral().compareTo(BigDecimal.ZERO)>Constants.ZERO){
            Member member = memberMapper.selectById(goodsorder.getMemberId());
            //客户存在剩余积分
            if(Objects.nonNull(member)&&member.getIntegral().compareTo(BigDecimal.ZERO)>Constants.ZERO){
                //开启了扣除返还客户积分
                if(Constants.equalsInteger(afterSaleApplyRequest.getReturnIntegralStatus(),Constants.ONE)){
                    //记录扣除经销商积分值
                    aftersale.setReturnIntegral(member.getIntegral().compareTo(goodsorder.getReturnCustomerIntegral())>Constants.ZERO
                            ?goodsorder.getReturnCustomerIntegral():member.getIntegral());
                    DealIntegralRequest dealIntegralRequest = new DealIntegralRequest();
                    dealIntegralRequest.setIntegralNum(aftersale.getReturnShopIntegral());
                    dealIntegralRequest.setDealType(Constants.ONE);
                    dealIntegralRequest.setMemberId(member.getId());
                    dealIntegralRequest.setObjId(goodsorder.getId());
                    dealIntegralRequest.setOrderCode(goodsorder.getCode().toString());
                    dealIntegralRequest.setIntegralObjType(Constants.IntegralObjType.MEMBER_ORDER_REFUND_RETURN);
                    integralService.dealIntegral(dealIntegralRequest);
                }
            }
        }
        //订单退款 è¿”还客户使用的积分
        if(Constants.equalsInteger(afterSaleApplyRequest.getReturnIntegralStatus(),Constants.ONE)
            && goodsorder.getUseIntegral().compareTo(BigDecimal.ZERO)>Constants.ZERO){
            DealIntegralRequest dealIntegralRequest = new DealIntegralRequest();
            dealIntegralRequest.setIntegralNum(aftersale.getReturnShopIntegral());
            dealIntegralRequest.setDealType(Constants.ZERO);
            dealIntegralRequest.setMemberId(goodsorder.getMemberId());
            dealIntegralRequest.setObjId(goodsorder.getId());
            dealIntegralRequest.setOrderCode(goodsorder.getCode().toString());
            dealIntegralRequest.setIntegralObjType(Constants.IntegralObjType.MEMBER_ORDER_REFUND);
            dealIntegralRequest.setParam1(goodsorder.getCode().toString());
            integralService.dealIntegral(dealIntegralRequest);
        }
        //订单退款 é€€å›žå®¢æˆ·ä½¿ç”¨çš„优惠券
        if(Constants.equalsInteger(afterSaleApplyRequest.getReturnUseCouponStatus(),Constants.ONE)
            && Objects.nonNull(goodsorder.getCouponId())){
            memberCouponJoinMapper.update(new UpdateWrapper<MemberCoupon>().lambda()
                    .set(MemberCoupon::getStatus, Constants.ZERO)
                    .eq(MemberCoupon::getId, goodsorder.getCouponId())
            );
        }
        if(afterSaleApplyRequest.getMoney().compareTo(BigDecimal.ZERO)>Constants.ZERO
             && afterSaleApplyRequest.getMoney().compareTo(goodsorder.getPrice())<=Constants.ZERO){
            //订单退款
            String refundCode = WxMiniUtilService.wxRefund(goodsorder.getCode().toString(), goodsorder.getPrice(), afterSaleApplyRequest.getMoney());
            Fund fund = new Fund();
            fund.setOrderCode(refundCode);
            fund.setCreator(userId);
            fund.setCreateDate(new Date());
            fund.setIsdeleted(Constants.ZERO);
            fund.setRemark(userId.toString());
            fund.setMemberId(goodsorder.getCreator());
            fund.setTitle("订单退款");
            fund.setContent(afterSaleApplyRequest.getRemark());
            fund.setObjId(goodsorder.getId());
            fund.setObjType(Constants.ONE);
            fund.setType(Constants.ZERO);
            fund.setNum(goodsorder.getPrice());
            fundMapper.insert(fund);
            aftersale.setDrawbackNo(refundCode);
            aftersale.setDrawbackDate(new Date());
            aftersale.setDrawbackInfo(afterSaleApplyRequest.getRemark());
            aftersale.setDrawbackNo(refundCode);
        }
        aftersaleMapper.insert(aftersale);
        goodsorderMapper.update(null,new UpdateWrapper<Goodsorder>().lambda()
                .set(Goodsorder::getStatus, Constants.OrderStatus.REFUND.getKey())
                .eq(Goodsorder::getId, goodsorder.getId())
        );
    }
}
server/dmmall_service/src/main/java/com/doumee/service/business/impl/BannerServiceImpl.java
@@ -192,9 +192,11 @@
        QueryWrapper<Banner> wrapper = new QueryWrapper<>(banner);
        wrapper.lambda().orderByDesc(Banner::getSortnum);
        List<Banner> banners = bannerMapper.selectList(wrapper);
        String path = systemDictDataBiz.queryByCode(Constants.OSS, Constants.RESOURCE_PATH).getCode() + systemDictDataBiz.queryByCode(Constants.OSS, Constants.BANNER_FILE).getCode();
        List<BannerDTO> collect = banners.stream().map(s -> {
            BannerDTO dto = new BannerDTO();
            BeanUtils.copyProperties(s, dto);
            dto.setImgurl(path + s.getImgurl());
            if (Constants.equalsInteger(dto.getType(),Constants.ZERO)){
                dto.setContent(null);
            }
server/dmmall_service/src/main/java/com/doumee/service/business/impl/GoodsorderServiceImpl.java
@@ -36,6 +36,7 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.doumee.service.business.IntegralService;
import com.doumee.service.business.NoticeService;
import com.doumee.service.system.SystemDictDataService;
import com.github.binarywang.wxpay.bean.request.BaseWxPayRequest;
import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest;
@@ -90,6 +91,10 @@
    private MemberMapper memberMapper;
    @Autowired
    private CouponMapper couponMapper;
    @Autowired
    private NoticeService noticeService;
    @Autowired
    private NoticeMapper noticeMapper;
    @Autowired
    private MemberCouponJoinMapper memberCouponJoinMapper;
    @Autowired
@@ -708,187 +713,6 @@
    /****************************************移动端接口开始********************************************************************/
    @Transactional(rollbackFor = {Exception.class,BusinessException.class})
    public PayResponse orderPay(OrderPayRequest orderPayRequest){
        Member member = memberMapper.selectById(orderPayRequest.getMemberId());
        //查询收货地址
        Addr addr = addrMapper.selectById(orderPayRequest.getAddressId());
        if(Objects.isNull(addr)){
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"未查询到收货地址信息!");
        }
        Areas area = areasService.findById(addr.getAreaId(), Constants.TWO);
        if(Objects.isNull(area)){
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"收货地址区划信息发生变化,请更新后下单!");
        }
        Goodsorder goodsorder = new Goodsorder();
        goodsorder.setCreator(orderPayRequest.getMemberId());
        goodsorder.setIntegral(BigDecimal.ZERO);
        goodsorder.setCreateDate(new Date());
        goodsorder.setIsdeleted(Constants.ZERO);
        goodsorder.setMemberInfo(orderPayRequest.getRemark());
        goodsorder.setAddrId(addr.getId());
        goodsorder.setLinkaddr(area.getProvinceName()+area.getCityName() + area.getName() + addr.getAddr());
        goodsorder.setLinkphone(addr.getPhone());
        goodsorder.setLinkname(addr.getName());
        goodsorder.setMemberId(member.getId());
        goodsorder.setType(orderPayRequest.getOrderType());
        //单据编号 è‡ªå¢ž
        goodsorder.setCode(getNextInCode());
        //计算订单总金额
        BigDecimal sumPrice = BigDecimal.ZERO;
        //存储记录明细
        List<PayDetailRequest> payDetailRequestList = orderPayRequest.getPayDetailRequestList();
        if(Objects.isNull(payDetailRequestList)||payDetailRequestList.size()==Constants.ZERO){
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"无明细数据,请检查选择数据!");
        }
        List<GoodsorderDetail> goodsOrderDetailList = new ArrayList<>();
        for (PayDetailRequest payDetailRequest:payDetailRequestList) {
            //查询商品
            GoodsSku goodsSku = goodsSkuMapper.selectById(payDetailRequest.getGoodsSkuId());
            if(Objects.isNull(goodsSku)){
                throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"未查询到商品SKU信息!");
            }
            Goods goods = goodsMapper.selectById(goodsSku.getGoodsId());
            if(Objects.isNull(goods)){
                throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"未查询到商品信息!");
            }
            if(goods.getStatus().equals(Constants.ONE)){
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"存在商品已删除或已下架,无法下单");
            }
            if(goodsSku.getStock().compareTo(new BigDecimal(Constants.formatIntegerNum(payDetailRequest.getGoodsNum())))<Constants.ZERO){
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"存在商品库存不足,无法下单!");
            }
            //商品库存扣除
            goodsSku.setStock(goodsSku.getStock().subtract(new BigDecimal(Constants.formatIntegerNum(payDetailRequest.getGoodsNum()))));
            goodsSkuMapper.updateById(goodsSku);
            GoodsorderDetail goodsOrderDetail = new GoodsorderDetail();
            goodsOrderDetail.setCreator(member.getId());
            goodsOrderDetail.setCreateDate(new Date());
            goodsOrderDetail.setImgurl(StringUtils.isBlank(goodsSku.getImgurl())?goods.getImgurl():goodsSku.getImgurl());
            goodsOrderDetail.setName(goods.getName());
            goodsOrderDetail.setGoodsSkuId(goodsSku.getId().toString());
            goodsOrderDetail.setSkuName(goodsSku.getName());
            goodsOrderDetail.setPrice(goodsSku.getPrice());
            goodsOrderDetail.setGoodsNum(payDetailRequest.getGoodsNum());
            goodsOrderDetailList.add(goodsOrderDetail);
            sumPrice = sumPrice.add(goodsSku.getPrice().multiply(new BigDecimal(payDetailRequest.getGoodsNum())));
            //购物车支付 åˆ é™¤è´­ç‰©è½¦å•†å“
            if(orderPayRequest.getIsShopChart().equals(Constants.ONE)){
                shopcartMapper.deleteById(payDetailRequest.getShopCartId());
            }
        }
        //订单支付现金金额
        goodsorder.setPrice((sumPrice.subtract(orderPayRequest.getDeductionBalance())));
        MemberCoupon memberCoupon = new MemberCoupon();
        if(!Objects.isNull(orderPayRequest.getCouponId())){
            memberCoupon = memberCouponMapper.selectById(orderPayRequest.getCouponId());
            if(Objects.isNull(memberCoupon)){
                throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"未查询到优惠券信息!");
            }
            if(sumPrice.compareTo(memberCoupon.getLimitPrice())<Constants.ZERO){
                throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"订单金额小于优惠券总金额,无法使用!");
            }
            if(memberCoupon.getStatus().equals(Constants.ONE)){
                throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"优惠券已使用!");
            }
            sumPrice = sumPrice.subtract(memberCoupon.getPrice());
            goodsorder.setCouponId(orderPayRequest.getCouponId());
            goodsorder.setCouponPrice(memberCoupon.getPrice());
        }
        goodsorder.setCode(getNextInCode());
        if(!Objects.isNull(memberCoupon)){
            memberCoupon.setStatus(Constants.ONE);
            memberCouponMapper.updateById(memberCoupon);
        }
        //咖豆商城订单 å•独处理 æ‰£å‡ç§¯åˆ† æ·»åŠ ç§¯åˆ†å˜åŠ¨è®°å½•
        if(orderPayRequest.getOrderType().equals(Constants.ONE)){
            if(member.getIntegral().compareTo(sumPrice)<=Constants.ZERO){
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "咖豆不足,无法兑换!");
            }
            goodsorder.setStatus(Constants.OrderStatus.PAY_DONE.getKey());
            goodsorder.setPayStatus(Constants.ZERO);
            goodsorder.setPayDate(new Date());
            goodsorderMapper.insert(goodsorder);
            //更新用户积分
            memberMapper.subtractIntegral(member.getId(),sumPrice);
            PayResponse payResponse = new PayResponse();
            payResponse.setOrderId(goodsorder.getId());
            return payResponse;
        }
        goodsorder.setIntegral(orderPayRequest.getDeductionBalance());
        goodsorderMapper.insert(goodsorder);
        //数据存储
        BigDecimal total = Constants.formatBigdecimal(goodsorder.getPrice()).add(Constants.formatBigdecimal(goodsorder.getIntegral())).add(Constants.formatBigdecimal(goodsorder.getCouponPrice()));
        BigDecimal rate =Constants.formatBigdecimal(goodsorder.getCouponPrice()).divide(total,4,BigDecimal.ROUND_HALF_UP);
        BigDecimal totalWxMoney = new BigDecimal(0);
        BigDecimal totalIntegral = new BigDecimal(0);
        for (int i =0;i< goodsOrderDetailList.size();i++) {
            GoodsorderDetail goodsOrderDetail= goodsOrderDetailList.get(i);
            goodsOrderDetail.setOrderId(goodsorder.getId());
            BigDecimal wxMoney ;
            BigDecimal integral;
            if(i!=0 && i == goodsOrderDetailList.size() -1){
                //处理因为四舍五入造成的可退金额损失
                wxMoney = Constants.formatBigdecimal(goodsorder.getPrice()).subtract(totalWxMoney);
                integral = Constants.formatBigdecimal(goodsorder.getIntegral()).subtract(totalIntegral);;
            }else{
                //当前明细实际价格
                BigDecimal detialTotal = Constants.formatBigdecimal(goodsOrderDetail.getPrice()).multiply(new BigDecimal(Constants.formatIntegerNum(goodsOrderDetail.getGoodsNum())));
                //折算优惠券后支付价格(包含现金和余额部分)
                BigDecimal  actDetialTotal = detialTotal.subtract(detialTotal.multiply(rate));
                //按现金和积分支付比例,折算每个明细现金和积分支付的数量
                BigDecimal rate1 = detialTotal .divide(total,4,BigDecimal.ROUND_HALF_UP);
                //可退现金金额
                wxMoney = Constants.formatBigdecimal(goodsorder.getPrice()).multiply(rate1);
                //剩下的是余额抵扣
                integral =actDetialTotal.subtract(wxMoney);
                totalWxMoney = totalWxMoney.add(wxMoney);//累计
                totalIntegral= totalIntegral.add(integral);//累计
            }
            goodsOrderDetail.setMoney(wxMoney);
            goodsOrderDetail.setIntegral(integral);
            goodsorderDetailMapper.insert(goodsOrderDetail);
        }
        //如果抵扣金额大于 0 åˆ™è¿›è¡Œä½™é¢ä¸šåŠ¡å¤„ç†
        if(orderPayRequest.getDeductionBalance().compareTo(BigDecimal.ZERO)>Constants.ZERO){
            //抵扣金额小于会员剩余余额
            if(orderPayRequest.getDeductionBalance().compareTo(member.getIntegral())<=Constants.ZERO){
                //更新余额信息 æ·»åŠ ç§¯åˆ†å˜åŠ¨è®°å½•
                DealIntegralRequest dealIntegralRequest = new DealIntegralRequest();
                dealIntegralRequest.setIntegralNum(orderPayRequest.getDeductionBalance());
                dealIntegralRequest.setDealType(Constants.ONE);
                dealIntegralRequest.setMemberId(member.getId());
                dealIntegralRequest.setObjId(goodsorder.getId());
                dealIntegralRequest.setOrderCode(goodsorder.getCode().toString());
                dealIntegralRequest.setIntegralObjType(Constants.IntegralObjType.SHOP_ORDER);
                integralService.dealIntegral(dealIntegralRequest);
                //发送微信小程序订阅消息
                SendWxMessage.integralChangeNotice(member,orderPayRequest.getDeductionBalance());
                //余额全部抵扣
                if(goodsorder.getPrice().compareTo(BigDecimal.ZERO)==Constants.ZERO){
                    goodsorder.setStatus(Constants.OrderStatus.PAY_DONE.getKey());
                    goodsorder.setPayStatus(Constants.ONE);
                    goodsorder.setPayDate(new Date());
                    goodsorderMapper.updateById(goodsorder);
                    PayResponse payResponse = new PayResponse();
                    payResponse.setOrderId(goodsorder.getId());
                    return payResponse;
                }
            }else{
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"余额不足,无法进行支付,当前剩余余额:【"+member.getIntegral()+"】!");
            }
        }
        if(goodsorder.getPrice().compareTo(orderPayRequest.getTitlePrice())!=Constants.ZERO){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"商品价格发生变化,请刷新后重新支付!");
        }
        return this.wxPay(goodsorder,member);
    }
    @Override
    @Transactional(rollbackFor = {Exception.class,BusinessException.class})
    public PayResponse orderPay(ShopOrderPayRequest orderPayRequest,MemberCouponServiceImpl memberCouponService){
@@ -1068,7 +892,7 @@
            dealIntegralRequest.setMemberId(member.getId());
            dealIntegralRequest.setObjId(goodsorder.getId());
            dealIntegralRequest.setOrderCode(goodsorder.getCode().toString());
            dealIntegralRequest.setIntegralObjType(Constants.IntegralObjType.SHOP_ORDER);
            dealIntegralRequest.setIntegralObjType(Constants.IntegralObjType.MEMBER_ORDER);
            integralService.dealIntegral(dealIntegralRequest);
        }
@@ -1089,6 +913,13 @@
        PayResponse payResponse = new PayResponse();
        payResponse.setOrderId(goodsorder.getId());
        payResponse.setPayType(Constants.ONE);
        //发送通知
        if(Objects.nonNull(goodsorder.getPickUpShopId())){
            //发送站内信 - ç»é”€å•†
            noticeService.orderPayNotice(goodsorder.getPickUpShopId(),goodsorder.getId(),goodsorder.getReceiveType());
        }
        return payResponse;
    }
@@ -1316,7 +1147,7 @@
            dealIntegralRequest.setMemberId(goodsorder.getMemberId());
            dealIntegralRequest.setObjId(goodsorder.getId());
            dealIntegralRequest.setOrderCode(goodsorder.getCode().toString());
            dealIntegralRequest.setIntegralObjType(Constants.IntegralObjType.SHOP_ORDER_CANCEL);
            dealIntegralRequest.setIntegralObjType(Constants.IntegralObjType.MEMBER_ORDER_CANCEL);
            integralService.dealIntegral(dealIntegralRequest);
        }
        //订单信息取消
@@ -1343,8 +1174,6 @@
        SendWxMessage.orderCancel(goodsorder,memberMapper.selectById(goodsorder.getMemberId()),goodsName);
        //查询优惠券信息记录
        if(!Objects.isNull(goodsorder.getCouponId())){
            MemberCoupon memberCoupon = memberCouponMapper.selectById(goodsorder.getCouponId());
@@ -1367,8 +1196,7 @@
            throw new BusinessException(ResponseStatus.DATA_EMPTY);
        }
        if(!(Constants.equalsInteger(goodsorder.getStatus(),Constants.OrderStatus.WAIT_PAY.getKey())
            || Constants.equalsInteger(goodsorder.getStatus(),Constants.OrderStatus.PAY_DONE.getKey())
            || Constants.equalsInteger(goodsorder.getStatus(),Constants.OrderStatus.WAIT_RECEIVE.getKey()) )){
            || Constants.equalsInteger(goodsorder.getStatus(),Constants.OrderStatus.PAY_DONE.getKey()) )){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"订单取消失败:订单状态已流转!");
        }
        if(Constants.formatBigdecimal(goodsorder.getPrice()).compareTo(BigDecimal.ZERO)>Constants.ZERO
@@ -1389,7 +1217,9 @@
            fund.setNum(goodsorder.getPrice());
            fundMapper.insert(fund);
        }
        if(goodsorder.getIntegral().compareTo(BigDecimal.ZERO)>Constants.ZERO){
        //订单已支付状态 ï¼Œ ä½¿ç”¨äº†ç§¯åˆ† ä¸”积分使用大于0
        if(goodsorder.getIntegral().compareTo(BigDecimal.ZERO)>Constants.ZERO
                &&Constants.equalsInteger(goodsorder.getStatus(),Constants.OrderStatus.PAY_DONE.getKey())){
            //更新余额信息 æ·»åŠ ç§¯åˆ†å˜åŠ¨è®°å½•
            DealIntegralRequest dealIntegralRequest = new DealIntegralRequest();
            dealIntegralRequest.setIntegralNum(goodsorder.getIntegral());
@@ -1397,7 +1227,7 @@
            dealIntegralRequest.setMemberId(goodsorder.getMemberId());
            dealIntegralRequest.setObjId(goodsorder.getId());
            dealIntegralRequest.setOrderCode(goodsorder.getCode().toString());
            dealIntegralRequest.setIntegralObjType(Constants.IntegralObjType.SHOP_ORDER_CANCEL);
            dealIntegralRequest.setIntegralObjType(Constants.IntegralObjType.MEMBER_ORDER_CANCEL);
            integralService.dealIntegral(dealIntegralRequest);
        }
        //订单信息取消
@@ -1422,7 +1252,10 @@
            }
        }
        //SendWxMessage.orderCancel(goodsorder,memberMapper.selectById(goodsorder.getMemberId()),goodsName);
        // ç”¨æˆ·ä¸»åŠ¨å–æ¶ˆ å‘送经销商站内消息
        if(Objects.nonNull(goodsorder.getPickUpShopId())&&StringUtils.isBlank(cancelInfo)){
            noticeService.orderCancelNotice(goodsorder.getPickUpShopId(),goodsorder.getId(),goodsorder.getCode().toString());
        }
        //查询优惠券信息记录
        if(!Objects.isNull(goodsorder.getCouponId())){
@@ -1433,10 +1266,6 @@
            }
        }
    }
    public BigDecimal getDeductAmount(List<PayDetailRequest> requestList){
        List<MemberCoupon> memberCouponList = new ArrayList<>();
@@ -1811,6 +1640,7 @@
        String couponNames = "";
        if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(shareCouponRewardList)){
            List<MemberCoupon> memberCouponList = new ArrayList<>();
            List<CouponNoticeRequest> requestList = new ArrayList<>();
            for (JSONObject jsonObject:shareCouponRewardList) {
                Integer couponId = jsonObject.getInteger("couponId");
                Integer num = jsonObject.getInteger("num");
@@ -1824,9 +1654,19 @@
                }
                couponIds = couponIds + (StringUtils.isBlank(couponIds)? ",":"" )+ couponId ;
                couponNames = couponNames + (StringUtils.isBlank(couponNames)? ",":"" )+ coupon.getName() ;
                CouponNoticeRequest couponNoticeRequest = new CouponNoticeRequest();
                couponNoticeRequest.setMemberCoupon(memberCoupon);
                couponNoticeRequest.setNum(num);
                requestList.add(couponNoticeRequest);
            }
            if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(memberCouponList)){
                memberCouponJoinMapper.insert(memberCouponList);
            }
            if(CollectionUtils.isNotEmpty(requestList)){
                //发送站内信
                noticeService.couponNotice(inviteMember.getId(),requestList);
            }
        }
        inviteRecordMapper.update(new UpdateWrapper<InviteRecord>().lambda()
@@ -1901,7 +1741,11 @@
            dealIntegralRequest.setMemberId(goodsorder.getDistributionShopId());
            dealIntegralRequest.setObjId(goodsorder.getId());
            dealIntegralRequest.setOrderCode(goodsorder.getCode().toString());
            dealIntegralRequest.setIntegralObjType(Constants.IntegralObjType.ORDER_DONATE);
            dealIntegralRequest.setIntegralObjType(Constants.IntegralObjType.SHOP_ORDER);
            Member member = memberMapper.selectById(goodsorder.getMemberId());
            if(Objects.nonNull(member)){
                dealIntegralRequest.setParam1(member.getNickname());
            }
            integralService.dealShopIntegral(dealIntegralRequest);
        }
    }
@@ -1922,6 +1766,7 @@
            dealIntegralRequest.setObjId(goodsorder.getId());
            dealIntegralRequest.setOrderCode(goodsorder.getCode().toString());
            dealIntegralRequest.setIntegralObjType(Constants.IntegralObjType.ORDER_DONE_AMOUNT);
            dealIntegralRequest.setParam1(goodsorder.getCode().toString());
            integralService.dealShopAmount(dealIntegralRequest);
        }
    }
@@ -1949,6 +1794,7 @@
            integralService.dealIntegral(dealIntegralRequest);
        }
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
@@ -2024,7 +1870,7 @@
        ));
        myPageResponse.setAfterOrders(aftersaleMapper.selectCount(new QueryWrapper<Aftersale>()
                .apply(" ID in ( select g.id from goodsorder g where g.MEMBER_ID = '"+memberId+"'  ) ")
                .notIn("STATUS",Constants.AftersaleStatus.DONE,Constants.AftersaleStatus.SHOP_REFUSE,Constants.AftersaleStatus.CANCEL)
                .notIn("STATUS",Constants.AftersaleStatus.DONE.getKey(),Constants.AftersaleStatus.SHOP_REFUSE.getKey(),Constants.AftersaleStatus.CANCEL.getKey())
        ));
@@ -2234,6 +2080,13 @@
                        .eq(Collect::getMemberId,member.getId())
                )
        );
        homeInfoResponse.setUnRead(
                noticeMapper.selectCount(new QueryWrapper<Notice>().lambda()
                        .eq(Notice::getIsdeleted,Constants.ZERO)
                        .eq(Notice::getMemberId,member.getId())
                        .eq(Notice::getStatus,Constants.ZERO)
                )>=Constants.ZERO?Constants.ZERO:Constants.ONE
        );
        return homeInfoResponse;
    }
server/dmmall_service/src/main/java/com/doumee/service/business/impl/IntegralServiceImpl.java
@@ -27,6 +27,7 @@
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.doumee.service.business.NoticeService;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.SecurityUtils;
@@ -66,6 +67,9 @@
    @Autowired
    private ShopMapper shopMapper;
    @Autowired
    private NoticeService noticeService;
    @Transactional(rollbackFor = {Exception.class, BusinessException.class})
    @Override
@@ -166,6 +170,14 @@
        }else{
            memberMapper.subtractIntegral(member.getId(),dealIntegralRequest.getIntegralNum());
        }
        //站内信
        noticeService.saveMemberIntegralNotice(
                dealIntegralRequest.getIntegralObjType(),Constants.ZERO,member.getId(),dealIntegralRequest.getIntegralNum(),
                integral.getId(), dealIntegralRequest.getParam1()
        );
        return integral.getId();
    }
@@ -196,6 +208,14 @@
        }else{
            shopMapper.subtractIntegral(shop.getId(),dealIntegralRequest.getIntegralNum());
        }
        //站内信
        noticeService.saveMemberIntegralNotice(
                dealIntegralRequest.getIntegralObjType(),Constants.ZERO,shop.getId(),dealIntegralRequest.getIntegralNum(),
                integral.getId(), dealIntegralRequest.getParam1()
        );
        return integral.getId();
    }
@@ -450,21 +470,32 @@
            BigDecimal num = param.getNum();
            if(param.getType() == 1 &&Constants.formatBigdecimal(model.getIntegral()).compareTo(param.getNum())<0){
                //如果是减少,判断用户余额是否满足
                num = num.multiply(new BigDecimal(-1));//减少
//                num = num.multiply(new BigDecimal(-1));//减少
                throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"用户账户余额不足!");
            }
            //账户余额
            memberMapper.update(null,new UpdateWrapper<Member>().lambda()
                    .eq(Member::getId,model.getId())
                    .set(Member::getEditDate,date)
                    .set(Member::getEditor,user.getId())
                    .setSql(param.getType() == 0,"total_integral = ifnull(total_integral,0)+" + num)//累计增加
                    .setSql(param.getType() == 0,"integral = ifnull(integral,0)+" + param.getNum())
                    .setSql(param.getType() == 1,"integral = ifnull(integral,0)-" + param.getNum()));
            integralObjType = param.getType()==0?Constants.IntegralObjType.SYSTEM_RECHARGE:Constants.IntegralObjType.SYSTEM_DEDUCT;
            integral.setTotalNum(param.getType() == 0? Constants.formatBigdecimal(model.getIntegral()).add(param.getNum()):Constants.formatBigdecimal(model.getIntegral()).subtract(param.getNum()));
            integral.setUserType(Constants.ZERO);
            DealIntegralRequest dealIntegralRequest = new DealIntegralRequest();
            dealIntegralRequest.setIntegralNum(num);
            dealIntegralRequest.setDealType(param.getType());
            dealIntegralRequest.setMemberId(model.getId());
            dealIntegralRequest.setObjId(null);
            dealIntegralRequest.setOrderCode(null);
            dealIntegralRequest.setIntegralObjType(integralObjType);
            this.dealIntegral(dealIntegralRequest);
            //账户余额
//            memberMapper.update(null,new UpdateWrapper<Member>().lambda()
//                    .eq(Member::getId,model.getId())
//                    .set(Member::getEditDate,date)
//                    .set(Member::getEditor,user.getId())
//                    .setSql(param.getType() == 0,"total_integral = ifnull(total_integral,0)+" + num)//累计增加
//                    .setSql(param.getType() == 0,"integral = ifnull(integral,0)+" + param.getNum())
//                    .setSql(param.getType() == 1,"integral = ifnull(integral,0)-" + param.getNum()));
//
//            integralObjType = param.getType()==0?Constants.IntegralObjType.SYSTEM_RECHARGE:Constants.IntegralObjType.SYSTEM_DEDUCT;
//            integral.setTotalNum(param.getType() == 0? Constants.formatBigdecimal(model.getIntegral()).add(param.getNum()):Constants.formatBigdecimal(model.getIntegral()).subtract(param.getNum()));
//            integral.setUserType(Constants.ZERO);
        }else{//经销商账户
            Shop model = shopMapper.selectById(param.getMemberId());
            if(model == null ||Constants.equalsObject(model.getIsdeleted(),Constants.ONE)){
@@ -473,34 +504,45 @@
            BigDecimal num = param.getNum();
            if(param.getType() == 1 &&Constants.formatBigdecimal(model.getIntegral()).compareTo(param.getNum())<0){
                //如果是减少,判断用户余额是否满足
                num = num.multiply(new BigDecimal(-1));//减少
//                num = num.multiply(new BigDecimal(-1));//减少
                throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"经销商账户积分余额不足!");
            }
            //账户余额
            shopMapper.update(null,new UpdateWrapper<Shop>().lambda()
                    .eq(Shop::getId,model.getId())
                    .set(Shop::getEditDate,date)
                    .set(Shop::getEditor,user.getId())
                    .setSql(param.getType() == 0,"total_integral = ifnull(total_integral,0)+" + num)//累计增加
                    .setSql(param.getType() == 0,"integral = ifnull(integral,0)+" + param.getNum())
                    .setSql(param.getType() == 1,"integral = ifnull(integral,0)-" + param.getNum()));
            integralObjType = param.getType()==0?Constants.IntegralObjType.SHOP_SYSTEM_RECHARGE:Constants.IntegralObjType.SHOP_SYSTEM_DEDUCT;
            integral.setTotalNum(param.getType() == 0? Constants.formatBigdecimal(model.getIntegral()).add(param.getNum()):Constants.formatBigdecimal(model.getIntegral()).subtract(param.getNum()));
            integral.setUserType(Constants.ONE);
//            shopMapper.update(null,new UpdateWrapper<Shop>().lambda()
//                    .eq(Shop::getId,model.getId())
//                    .set(Shop::getEditDate,date)
//                    .set(Shop::getEditor,user.getId())
//                    .setSql(param.getType() == 0,"total_integral = ifnull(total_integral,0)+" + num)//累计增加
//                    .setSql(param.getType() == 0,"integral = ifnull(integral,0)+" + param.getNum())
//                    .setSql(param.getType() == 1,"integral = ifnull(integral,0)-" + param.getNum()));
//            integralObjType = param.getType()==0?Constants.IntegralObjType.SHOP_SYSTEM_RECHARGE:Constants.IntegralObjType.SHOP_SYSTEM_DEDUCT;
//            integral.setTotalNum(param.getType() == 0? Constants.formatBigdecimal(model.getIntegral()).add(param.getNum()):Constants.formatBigdecimal(model.getIntegral()).subtract(param.getNum()));
//            integral.setUserType(Constants.ONE);
            DealIntegralRequest dealIntegralRequest = new DealIntegralRequest();
            dealIntegralRequest.setIntegralNum(num);
            dealIntegralRequest.setDealType(param.getType());
            dealIntegralRequest.setMemberId(model.getId());
            dealIntegralRequest.setObjId(null);
            dealIntegralRequest.setOrderCode(null);
            dealIntegralRequest.setIntegralObjType(integralObjType);
            this.dealShopIntegral(dealIntegralRequest);
        }
        integral.setCreateDate(new Date());
        integral.setCreator(user.getId());
        integral.setIsdeleted(Constants.ZERO);
        integral.setNum(param.getNum());
        integral.setTitle(integralObjType.getName());
        integral.setContent(integralObjType.getNoteinfo().replace("${param}",integral.getNum().toString()));
        integral.setMemberId(param.getMemberId());
        integral.setObjId(param.getMemberId());
        integral.setObjType(integralObjType.getKey());
        integral.setType(param.getType());
        integral.setRemark(param.getRemark());
        integral.setOrderCode(null);
        integralMapper.insert(integral);
//        integral.setCreateDate(new Date());
//        integral.setCreator(user.getId());
//        integral.setIsdeleted(Constants.ZERO);
//        integral.setNum(param.getNum());
//        integral.setTitle(integralObjType.getName());
//        integral.setContent(integralObjType.getNoteinfo().replace("${param}",integral.getNum().toString()));
//        integral.setMemberId(param.getMemberId());
//        integral.setObjId(param.getMemberId());
//        integral.setObjType(integralObjType.getKey());
//        integral.setType(param.getType());
//        integral.setRemark(param.getRemark());
//        integral.setOrderCode(null);
//        integralMapper.insert(integral);
    }
    @Override
    public IntegralDataResponse getIntegralData(IntegralRecordDTO model){
server/dmmall_service/src/main/java/com/doumee/service/business/impl/LabelsServiceImpl.java
@@ -470,16 +470,22 @@
    @Override
    public List<LabelsResponse> getGoodsLabelsByType(Integer type) {
    public List<LabelsResponse> getGoodsLabelsByType(Integer type,Integer parentId) {
        LambdaQueryWrapper<Labels> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(Labels::getStatus,Constants.ZERO);
        wrapper.eq(Labels::getStatus,Constants.ONE);
        wrapper.eq(Labels::getIsdeleted,Constants.ZERO);
        wrapper.eq(Objects.nonNull(parentId),Labels::getParentId,parentId);
        wrapper.eq(Labels::getType,type);
        wrapper.orderByAsc(Labels::getSortnum,Labels::getCreateDate);
        List<Labels> labels = labelsMapper.selectList(wrapper);
        String path = systemDictDataBiz.queryByCode(Constants.OSS,Constants.RESOURCE_PATH).getCode()
                + systemDictDataBiz.queryByCode(Constants.OSS,Constants.LABELS_IMG).getCode();
        List<LabelsResponse> collect = labels.stream().map(s -> {
            LabelsResponse labelsResponse = new LabelsResponse();
            BeanUtils.copyProperties(s, labelsResponse);
            if(StringUtils.isNotBlank(s.getImgurl())){
                labelsResponse.setImgUrl(path + s.getImgurl());
            }
            return labelsResponse;
        }).collect(Collectors.toList());
        return collect;
server/dmmall_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
@@ -310,15 +310,14 @@
            Member member = memberMapper.selectOne(new QueryWrapper<Member>().lambda().eq(Member::getOpenId, openId)
                            .eq(Member::getIsdeleted,Constants.ZERO)
                    .last(" limit 1"));
            //创建token
            JwtPayLoad payLoad = new JwtPayLoad(Constants.MEMBER_PREFIX+member.getId());
            String token = JwtTokenUtil.generateToken(payLoad);
            AccountResponse accountResponse = new AccountResponse();
            accountResponse.setSessionKey(session.getSessionKey());
            if(Objects.nonNull(member)){
                memberMapper.updateById(member);
                member.setImgFullUrl(systemDictDataBiz.queryByCode(Constants.OSS,Constants.RESOURCE_PATH).getCode()+
                        systemDictDataBiz.queryByCode(Constants.OSS,Constants.MEMBER_FILE).getCode()+member.getImgurl());
                //创建token
                JwtPayLoad payLoad = new JwtPayLoad(Constants.MEMBER_PREFIX+member.getId());
                String token = JwtTokenUtil.generateToken(payLoad);
                accountResponse.setToken(token);
                accountResponse.setMember(member);
            }else{
@@ -345,10 +344,8 @@
    @Override
    public AccountResponse wxPhone(WxPhoneRequest wxPhoneRequest){
        try {
            WxMaPhoneNumberInfo userPhoneInfo = WxMiniConfig.wxMaService.getUserService().getPhoneNoInfo(
                    wxPhoneRequest.getSessionKey(), wxPhoneRequest.getEncryptedData(), wxPhoneRequest.getIv());
            //获取手机号
            String phone= userPhoneInfo.getPurePhoneNumber();
            WxMaPhoneNumberInfo userPhoneInfo = WxMiniConfig.wxMaService.getUserService().getPhoneNumber(wxPhoneRequest.getCode());
            String phone = userPhoneInfo.getPhoneNumber();
            if(Objects.isNull(phone)){
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"未获取到手机号");
            }
@@ -367,6 +364,7 @@
                    member.setRecId(Constants.getInviteCode(wxPhoneRequest.getRecId()));
                }
                member.setOpenId(wxPhoneRequest.getOpenid());
                member.setIntegral(BigDecimal.ZERO);
            }
            member.setPhone(phone);
            member.setEditDate(new Date());
@@ -466,6 +464,17 @@
                platformConfigDTO.getShareIntegralReward():BigDecimal.ZERO);
        inviteRecord.setFirstOrderStatus(Constants.ZERO);
        inviteRecordMapper.insert(inviteRecord);
        //赠送邀请积分
        //开启邀请注册送积分
        if(Constants.equalsInteger(platformConfigDTO.getShareIntegralRewardStatus(),Constants.ZERO)){
            DealIntegralRequest dealIntegralRequest = new DealIntegralRequest();
            dealIntegralRequest.setIntegralNum(platformConfigDTO.getShareIntegralReward());
            dealIntegralRequest.setDealType(Constants.ZERO);
            dealIntegralRequest.setMemberId(member.getRecId());
            dealIntegralRequest.setIntegralObjType(Constants.IntegralObjType.INVITENEWUSER);
            dealIntegralRequest.setParam1(member.getNickname());
            integralService.dealIntegral(dealIntegralRequest);
        }
    }
server/dmmall_service/src/main/java/com/doumee/service/business/impl/NoticeServiceImpl.java
@@ -11,11 +11,10 @@
import com.doumee.dao.business.NoticeMapper;
import com.doumee.dao.business.join.MemberJoinMapper;
import com.doumee.dao.business.join.NoticeJoinMapper;
import com.doumee.dao.business.model.Member;
import com.doumee.dao.business.model.Notice;
import com.doumee.dao.business.model.Shop;
import com.doumee.dao.business.model.*;
import com.doumee.dao.web.dto.NoticeCardDTO;
import com.doumee.dao.system.model.SystemUser;
import com.doumee.dao.web.request.CouponNoticeRequest;
import com.doumee.service.business.NoticeService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
@@ -30,6 +29,8 @@
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Objects;
@@ -216,24 +217,30 @@
    @Override
    public PageData<NoticeCardDTO> findNoticeCardDTOPage(PageWrap<Notice> pageWrap) {
        LoginUserInfo loginUserInfo = (LoginUserInfo)SecurityUtils.getSubject().getPrincipal();
        IPage<Notice> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
        LambdaQueryWrapper<Notice> queryWrapper = new LambdaQueryWrapper<>();
        Utils.MP.blankToNull(pageWrap.getModel());
        queryWrapper.eq(Notice::getType,pageWrap.getModel().getType())
                    .eq(Notice::getObjMemberId,loginUserInfo.getMemberId());
        Notice notice = pageWrap.getModel();
        queryWrapper.ne(Objects.nonNull(notice.getQueryType())&&Constants.equalsInteger(notice.getQueryType(),Constants.ZERO),
                        Notice::getObjType,Constants.TWO)
                    .eq(Objects.nonNull(notice.getQueryType())&&Constants.equalsInteger(notice.getQueryType(),Constants.ONE),
                        Notice::getObjType,Constants.TWO)
                    .eq(Notice::getMemberId,notice.getMemberId())
                .orderByAsc(Notice::getStatus)
                .orderByDesc(Notice::getId)
        ;
        IPage<Notice> noticeIPage = noticeMapper.selectPage(page, queryWrapper);
        List<NoticeCardDTO> noticeCardDTOs = new ArrayList<>();
        if (CollectionUtils.isEmpty(noticeIPage.getRecords())){
            return PageData.from(new Page<>());
            noticeCardDTOs = noticeIPage.getRecords().stream().map(s -> {
                NoticeCardDTO noticeCardDTO = new NoticeCardDTO();
                BeanUtils.copyProperties(s, noticeCardDTO);
                return noticeCardDTO;
            }).collect(Collectors.toList());
        }
        List<NoticeCardDTO> noticeCardDTOs = noticeIPage.getRecords().stream().map(s -> {
            NoticeCardDTO noticeCardDTO = new NoticeCardDTO();
            BeanUtils.copyProperties(s, noticeCardDTO);
            return noticeCardDTO;
        }).collect(Collectors.toList());
        PageData<NoticeCardDTO> pageData = new PageData<>();
        pageData.setPage(pageWrap.getPage());
        pageData.setCapacity(pageWrap.getCapacity());
@@ -242,4 +249,183 @@
        return pageData;
    }
    /**
     *
     * @param type 0消费者;1=经销商;
     * @param objType 0商城订单 1积分流水 2互动评价 3优惠券
     *
     */
    public void saveNoticeInfo(Integer type,Integer objType,Integer memberId
        ,String title,String content,Integer objId){
        Notice notice = new Notice();
        notice.setCreateDate(new Date());
        notice.setIsdeleted(Constants.ZERO);
        notice.setTitle(title);
        notice.setContent(content);
        notice.setType(type);
        notice.setObjType(objType);
        notice.setObjId(objId);
        notice.setMemberId(memberId);
        notice.setStatus(Constants.ZERO);
        noticeMapper.insert(notice);
    }
    /**
     * ç§¯åˆ†å˜åŠ¨æ¶ˆæ¯ç±»åž‹
     * @param integralObjType  ç§¯åˆ†å˜åŠ¨ç±»åž‹
     * @param memberId ç”¨æˆ·ä¸»é”®/商户主键
     * @param integral å˜åŠ¨ç§¯åˆ†/现金值
     * @param objId å…³è”对象主键 - ç§¯åˆ†æµæ°´å˜åŠ¨è®°å½•ä¸»é”®
     * @param param1 param2
     */
    @Override
    public void saveMemberIntegralNotice(Constants.IntegralObjType integralObjType,Integer type,
                                         Integer memberId,
                                         BigDecimal integral,
                                         Integer objId,String param1){
        String title = integralObjType.getName();
        String info = integralObjType.getNoteinfo();
        info = info.replace("${param}",integral.toString()).replace("${param1}",param1);
        this.saveNoticeInfo(
                type,
                Constants.ONE,
                memberId,
                title,
                info,
                objId
        );
    }
    /**
     * å‘放优惠券 ç«™å†…ä¿¡
     * @param memberId
     * @param couponList
     */
    @Override
    public void couponNotice(Integer memberId,List<CouponNoticeRequest> couponList){
        String noticeInfo = "恭喜您获得${param}";
        //恭喜您获得 æ»¡50减10抵扣券
        String replaceInfo = "";
        //整理优惠券内容
        for (CouponNoticeRequest c:couponList) {
            MemberCoupon mc = c.getMemberCoupon();
            String info = Constants.equalsInteger(mc.getCouponType(),Constants.ZERO)?
                    "满"+mc.getLimitPrice()+"元减"+mc.getPrice()+"元抵扣券*"+c.getNum():
                    "满"+mc.getLimitPrice()+"元享"+mc.getPrice()+"折券";
            replaceInfo = replaceInfo + (StringUtils.isBlank(replaceInfo)?
                    info:","+info);
        }
        noticeInfo.replace("${param}",replaceInfo);
        this.saveNoticeInfo(
                Constants.ZERO,
                Constants.ONE,
                memberId,
                "获得系统发放的优惠券",
                noticeInfo,
                null
        );
    }
    /**
     * ç§¯åˆ†è¿‡æœŸ ç«™å†…消息
     * @param memberId
     * @param integral
     * @param expireDateNum
     */
    @Override
    public void expireNotice(Integer memberId, BigDecimal integral,Integer expireDateNum){
        //您有1000积分30天后过期,请尽快使用
        String noticeInfo = "您有${param}积分即将过期,请尽快使用";
        if(integral.compareTo(BigDecimal.ZERO)<=Constants.ZERO){
            return;
        }
        noticeInfo.replace("${param}",integral.toString());
        this.saveNoticeInfo(
                Constants.ZERO,
                Constants.ONE,
                memberId,
                "您的积分将在"+expireDateNum+"天后清空,请尽快使用",
                noticeInfo,
                null
        );
    }
    /**
     * è¯„论消息 ç«™å†…ä¿¡
     * @param memberId
     * @param objId
     * @param memberName
     */
    @Override
    public void commonNotice(Integer memberId, Integer objId,String memberName ){
        //您有1000积分30天后过期,请尽快使用
        String noticeInfo = "${param}回复了您的评论";
        noticeInfo.replace("${param}",memberName);
        this.saveNoticeInfo(
                Constants.ZERO,
                Constants.TWO,
                memberId,
                noticeInfo,
                noticeInfo,
                objId
        );
    }
    /**
     * è®¢å•支付成功 å‘送消息
     * @param shopId
     * @param objId
     * @param receiveType
     */
    @Override
    public void orderPayNotice(Integer shopId, Integer objId,Integer receiveType){
        if(Constants.equalsInteger(receiveType,Constants.ZERO)){
            return;
        }
        //您有新的【发货方式】订单待处理
        String noticeInfo = "您有新的${param}订单待处理";
        noticeInfo.replace("${param}",Constants.equalsInteger(receiveType,Constants.ZERO)?"物流发货":"门店自提");
        this.saveNoticeInfo(
                Constants.ONE,
                Constants.ZERO,
                shopId,
                noticeInfo,
                noticeInfo,
                objId
        );
    }
    /**
     * è®¢å•取消 å‘送站内信
     * @param shopId
     * @param objId
     * @param orderNo
     */
    @Override
    public void orderCancelNotice(Integer shopId, Integer objId,String orderNo){
        // æ‚¨çš„订单{订单号},已由客户手动取消,请知悉
        String noticeInfo = " æ‚¨çš„订单${param},已由客户手动取消,请知悉";
        noticeInfo.replace("${param}",orderNo);
        this.saveNoticeInfo(
                Constants.ONE,
                Constants.ZERO,
                shopId,
                noticeInfo,
                noticeInfo,
                objId
        );
    }
}
server/dmmall_service/src/main/java/com/doumee/service/business/impl/WithdrawRecordServiceImpl.java
@@ -52,6 +52,7 @@
    @Autowired
    private WithdrawRecordMapper withdrawRecordMapper;
    @Autowired
    private ShopMapper shopMapper;
@@ -101,7 +102,7 @@
     */
    @Override
    @Transactional
    public void updateById(WithdrawRecord withdrawRecord) {
    public void updateById(WithdrawRecord withdrawRecord, IntegralService integralService) {
        LoginUserInfo user = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
        if(!Constants.equalsObject(withdrawRecord.getStatus(),Constants.ONE)
                && !Constants.equalsObject(withdrawRecord.getStatus(),Constants.TWO)){
@@ -126,7 +127,20 @@
        model.setPayBank(withdrawRecord.getPayBank());
        withdrawRecordMapper.updateById(model);
        dealBatchMultiFiles(model,withdrawRecord.getPayFileList());
        //审批未通过 é€€å›žæçŽ°é‡‘é¢
        if (Constants.equalsObject(model.getStatus(), Constants.TWO)) {
            DealIntegralRequest dealIntegralRequest = new DealIntegralRequest();
            dealIntegralRequest.setIntegralObjType(Constants.IntegralObjType.WITHDRAW_APPLY_BACK);
            dealIntegralRequest.setIntegralNum(model.getAmount());
            dealIntegralRequest.setObjId(withdrawRecord.getId());
            dealIntegralRequest.setOrderCode(withdrawRecord.getCode().toString());
            dealIntegralRequest.setMemberId(model.getMemberId());
            dealIntegralRequest.setDealType(Constants.ZERO);
            integralService.dealShopAmount(dealIntegralRequest);
        }
    }
    public void dealBatchMultiFiles(WithdrawRecord model, List<Multifile> fileList  ) {
        //清空原有的
        if(fileList!=null && fileList.size()>0){
@@ -153,7 +167,7 @@
            return;
        }
        for (WithdrawRecord withdrawRecord: withdrawRecords) {
            this.updateById(withdrawRecord);
//            this.updateById(withdrawRecord);
        }
    }
server/dmmall_service/src/main/java/com/doumee/service/business/impl/WorkbenchServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,269 @@
package com.doumee.service.business.impl;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.doumee.biz.system.SystemDictDataBiz;
import com.doumee.config.rocketmq5.NormalMsgProducer;
import com.doumee.core.constants.ResponseStatus;
import com.doumee.core.exception.BusinessException;
import com.doumee.core.model.LoginUserInfo;
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.core.utils.Constants;
import com.doumee.core.utils.DateUtil;
import com.doumee.core.utils.Utils;
import com.doumee.dao.business.*;
import com.doumee.dao.business.model.*;
import com.doumee.dao.system.SystemUserMapper;
import com.doumee.dao.system.dto.CountDataDTO;
import com.doumee.dao.system.model.SystemUser;
import com.doumee.dao.system.vo.BusinessDataCountVO;
import com.doumee.dao.system.vo.CountDataVO;
import com.doumee.dao.web.dto.CollectDTO;
import com.doumee.dao.web.dto.MemberDTO;
import com.doumee.dao.web.dto.MultiFileDTO;
import com.doumee.dao.web.dto.OrgDTO;
import com.doumee.dao.web.dto.activity.*;
import com.doumee.dao.web.dto.shop.ShopSimpleDTO;
import com.doumee.dao.web.request.ActivityPageListRequest;
import com.doumee.service.business.*;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import org.apache.commons.collections4.MapUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.SecurityUtils;
import org.checkerframework.checker.units.qual.C;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.*;
import java.util.stream.Collectors;
/**
 * æ´»åŠ¨ã€èµ„è®¯ã€æŽ¢åº—ä¿¡æ¯è¡¨Service实现
 *
 * @author æ±Ÿè¹„蹄
 * @date 2023/03/21 15:48
 */
@Service
public class WorkbenchServiceImpl implements WorkbenchService {
    @Autowired
    private GoodsorderMapper goodsorderMapper;
    @Autowired
    private GoodsorderDetailMapper goodsorderDetailMapper;
    @Override
    public List<BusinessDataCountVO> shopRankList10(CountDataDTO param) {
        Date startDate = null,endDate = null;
        if(param.getYear()!=null && param.getMonth()!=null){
            List<Date> dList = DateUtil.getDatePeriodByYearAndMonth(param.getYear(),param.getMonth()-1);
            startDate = dList.get(0);
            endDate = dList.get(1);
        }else if(param.getYear()!=null && param.getMonth()==null){
            List<Date> dList = DateUtil.getDatePeriodByYear(param.getYear());
            startDate = dList.get(0);
            endDate = dList.get(1);
        }
        //统计订单销量和销售额集合
        List<BusinessDataCountVO> list1 =  goodsorderMapper.selectJoinList(BusinessDataCountVO.class,new MPJLambdaWrapper<Goodsorder>()
                .selectAs(Shop::getName,BusinessDataCountVO::getName)
                .select("(select count(distinct(t.member_id)) )",BusinessDataCountVO::getNum1)
                .select("(select count(t.id) )",BusinessDataCountVO::getNum)
                .select("(select sum(t.total_price) )",BusinessDataCountVO::getPrice)
                .leftJoin(Shop.class,Shop::getId,Goodsorder::getDistributionShopId)
                .ge(startDate!=null,Goodsorder::getCreateDate,startDate)
                .ne(endDate!=null,Goodsorder::getCreateDate,endDate)
                .eq(Goodsorder::getIsdeleted,Constants.ZERO)
                .in(Goodsorder::getStatus,Constants.OrderStatus.DONE.getKey(),Constants.OrderStatus.REFUND.getKey())
                .groupBy(Goodsorder::getDistributionShopId)
                .orderByDesc(Constants.equalsInteger(param.getType() ,0),"sum(t.total_price) ")
                .orderByDesc(Constants.equalsInteger(param.getType() ,1),"count(t.id) ")
                .orderByDesc(Constants.equalsInteger(param.getType() ,2),"count(distinct(t.member_id))")
                .last("limit 10")) ;
        return list1;
    }
    @Override
    public List<BusinessDataCountVO> goodsRankList10(CountDataDTO param) {
        Date startDate = null,endDate = null;
        if(param.getYear()!=null && param.getMonth()!=null){
            List<Date> dList = DateUtil.getDatePeriodByYearAndMonth(param.getYear(),param.getMonth()-1);
            startDate = dList.get(0);
            endDate = dList.get(1);
        }else if(param.getYear()!=null && param.getMonth()==null){
            List<Date> dList = DateUtil.getDatePeriodByYear(param.getYear());
            startDate = dList.get(0);
            endDate = dList.get(1);
        }
        //统计订单销量和销售额集合
        List<BusinessDataCountVO> list1 =  goodsorderDetailMapper.selectJoinList(BusinessDataCountVO.class,new MPJLambdaWrapper<GoodsorderDetail>()
                .selectAs(Goods::getName,BusinessDataCountVO::getName)
                .select("(select sum(t.goods_num) )",BusinessDataCountVO::getNum)
                .select("(select  sum(ifnull(t.price,0) * ifnull(t.goods_num,0)))",BusinessDataCountVO::getPrice)
                .leftJoin(Goodsorder.class,Goodsorder::getId,GoodsorderDetail::getOrderId)
                .leftJoin(Goods.class,Goods::getId,GoodsorderDetail::getGoodsId)
                .ge(startDate!=null,Goodsorder::getCreateDate,startDate)
                .ne(endDate!=null,Goodsorder::getCreateDate,endDate)
                .eq(Goodsorder::getIsdeleted,Constants.ZERO)
                .in(Goodsorder::getStatus,Constants.OrderStatus.DONE.getKey(),Constants.OrderStatus.REFUND.getKey())
                .groupBy(GoodsorderDetail::getGoodsId)
                .orderByDesc(Constants.equalsInteger(param.getType() ,1),"sum(ifnull(t.price,0) * ifnull(t.goods_num,0)) ")
                .orderByDesc(Constants.equalsInteger(param.getType() ,0),"sum(t.goods_num) ")
                .last("limit 10")) ;
        return list1;
    }
    @Override
    public BusinessDataCountVO businessData(CountDataDTO param) {
        BusinessDataCountVO data = new BusinessDataCountVO();
        int dataType = param.getDateType();//0今日 1近七日 2近30日 3近1å¹´
        String name = "HOUR(t.CREATE_DATE)";
        List<String> dateList = new ArrayList<>();
        Date date = Utils.Date.getEnd(new Date());//今日 23:59:59
        Date startDate = DateUtil.addDaysToDate(date,-1);
        switch (dataType) {
            case 1: {
                name = "DATE_FORMAT(t.CREATE_DATE, '%Y-%m-%d')";
                for(int i=1;i<=7;i++){
                    dateList.add(DateUtil.getShortTime(DateUtil.addDaysToDate(date,i-7)));
                }
                startDate = DateUtil.addDaysToDate(date,-7);
                break;
            } case 2: {
                name = "DATE_FORMAT(t.CREATE_DATE, '%Y-%m-%d')";
                for(int i=1;i<=30;i++){
                    dateList.add(DateUtil.getShortTime(DateUtil.addDaysToDate(date,i-30)));
                }
                startDate = DateUtil.addDaysToDate(date,-30);
                break;
            } case 3: {
                LocalDate now = LocalDate.now();
                startDate = DateUtil.increaseYear(date,-1);
                name = "DATE_FORMAT(t.CREATE_DATE, '%Y-%m')";
                for(int i=1;i<=12;i++){
                    dateList.add(DateUtil.minusMonthToDate(now,12-i));
                }
                break;
            } default:{
                for(int i=0;i<=23;i++){
                    dateList.add(i+"");
                }
                break;
            }
        }
        data.setDateStrList(dateList);
        //订单销量
        CountDataVO r =  goodsorderMapper.selectJoinOne(CountDataVO.class,new MPJLambdaWrapper<Goodsorder>()
                        .select("(select count(t.id) )",CountDataVO::getNum)
                        .select("(select sum(t.total_Price) )",CountDataVO::getPrice)
                .ge(Goodsorder::getCreateDate,startDate)
                .eq(Goodsorder::getIsdeleted,Constants.ZERO)
                .in(Goodsorder::getStatus,Constants.OrderStatus.DONE.getKey(),Constants.OrderStatus.REFUND.getKey()) );
        if (r != null) {
            data.setNum(Constants.formatLongNum(r.getNum()));//订单量
            data.setPrice(Constants.formatBigdecimal(r.getPrice()));//订单金额
        }
        //退款统计
        CountDataVO r1 =  goodsorderMapper.selectJoinOne(CountDataVO.class,new MPJLambdaWrapper<Goodsorder>()
                        .select("(select count(t.id) )",CountDataVO::getNum)
                        .select("(select sum(t.refund_money) )",CountDataVO::getPrice)
                .ge(Goodsorder::getRefundTime,startDate)
                .eq(Goodsorder::getIsdeleted,Constants.ZERO)
                .in(Goodsorder::getStatus,Constants.OrderStatus.REFUND.getKey())  );
        if (r1 != null) {
            data.setNum1(Constants.formatLongNum(r1.getNum()));//退款单量
            data.setPrice1(Constants.formatBigdecimal(r1.getPrice()));//退款金额
        }
        //统计订单销量和销售额集合
        List<CountDataVO> list1 =  goodsorderMapper.selectJoinList(CountDataVO.class,new MPJLambdaWrapper<Goodsorder>()
                .select("(select "+name+")",CountDataVO::getDateStr)
                .select("(select count(t.id) )",CountDataVO::getNum)
                .select("(select sum(t.total_price) )",CountDataVO::getPrice)
                .ge(Goodsorder::getCreateDate,startDate)
                .eq(Goodsorder::getIsdeleted,Constants.ZERO)
                .in(Goodsorder::getStatus,Constants.OrderStatus.DONE.getKey(),Constants.OrderStatus.REFUND.getKey())
                .groupBy(name) );
        List<Long> datalist1 = new ArrayList<>();
        List<BigDecimal> datalistPrice = new ArrayList<>();
        for(String str : dateList){
            long tnum =0;
            BigDecimal tprice = new BigDecimal(0);
            if(list1!=null){
                for(CountDataVO p : list1){
                    if(StringUtils.equals(p.getDateStr(),str)){
                        tnum =(Constants.formatLongNum(p.getNum()));
                        tprice = (Constants.formatBigdecimal(p.getPrice()));
                        break;
                    }
                }
            }
            datalist1.add( tnum );
            datalistPrice.add(tprice);
        }
        data.setDataList(datalist1 );
        data.setDataList2(datalistPrice );
        String name1 =name.replace("t.","t3.");
        //统计各类商品数据集合
        List<CountDataVO> list2 =  goodsorderDetailMapper.selectJoinList(CountDataVO.class,new MPJLambdaWrapper<GoodsorderDetail>()
                .select("(select "+name1+")",CountDataVO::getDateStr)
                .selectAs(Labels::getName,CountDataVO::getName)
                .select("(select sum(ifnull(t.price,0) * ifnull(t.goods_num,0)) )",CountDataVO::getPrice)
                .leftJoin(Goods.class,Goods::getId,GoodsorderDetail::getGoodsId)
                .leftJoin(Labels.class,Labels::getId,Goods::getCategoryId)
                .leftJoin(Goodsorder.class,Goodsorder::getId,GoodsorderDetail::getOrderId)
                .ge(Goodsorder::getCreateDate,startDate)
                .eq(Goodsorder::getIsdeleted,Constants.ZERO)
                .in(Goodsorder::getStatus,Constants.OrderStatus.DONE.getKey(),Constants.OrderStatus.REFUND.getKey())
                .groupBy(name1+",t1.category_id"));
        List<CountDataVO> cateList = getCateListFromDataList(list2);
        if(list2!=null &&list2.size()>0 && cateList!=null && cateList.size()>0){
            BigDecimal[] temp = new BigDecimal[dateList.size()];
            for(CountDataVO cate : cateList){
                for(int i=0;i<dateList.size();i++){
                    temp[i] = new BigDecimal(0);
                    for(CountDataVO model : list2){
                        if(StringUtils.equals(model.getDateStr(),dateList.get(i)) && StringUtils.equals(model.getName(),cate.getName())){
                            temp[i] = Constants.formatBigdecimal(model.getPrice());
                        }
                    }
                }
                cate.setData(temp);
            }
        }
        data.setCateList(cateList);
        return data;
    }
    private List<CountDataVO> getCateListFromDataList(List<CountDataVO> list2) {
        List<CountDataVO> list = new ArrayList<>();
        for(CountDataVO model :list2){
            boolean isnew = true;
            for(CountDataVO str :list){
                if(StringUtils.equals(str.getName(),model.getName())){
                    isnew = false;
                }
            }
            if(isnew ){
                list.add(model);
            }
        }
        return list;
    }
}
server/dmmall_web/src/main/java/com/doumee/api/web/AccountApi.java
@@ -46,12 +46,8 @@
        return  ApiResponse.success(memberService.wxLogin(code));
    }
    @LoginRequired
    @ApiOperation(value = "绑定手机号", notes = "小程序端")
    @PostMapping("/wxPhone")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "用户token值", required = true)
    })
    public ApiResponse<AccountResponse> wxPhone(@Valid @RequestBody WxPhoneRequest wxPhoneRequest) {
        return  ApiResponse.success(memberService.wxPhone(wxPhoneRequest));
    }
server/dmmall_web/src/main/java/com/doumee/api/web/LabelsApi.java
@@ -12,6 +12,7 @@
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@@ -21,7 +22,7 @@
 */
@Api(tags = "标签信息表业务")
@Trace(exclude = true)
//@RestController
@RestController
@RequestMapping("/web/labels")
@Slf4j
public class LabelsApi  extends ApiController{
@@ -48,11 +49,11 @@
    @ApiOperation(value = "获取分类信息", notes = "小程序端")
    @GetMapping("/getGoodsLabelsByType")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "用户token值", required = true),
            @ApiImplicitParam(paramType = "query", dataType = "Integer", name = "type", value = "类型0商品分类 1商品品牌 2商家标签 3快递 4退货选项 5换货选项 6退款选项 7取消订单选项 8咖啡百科分类 9咨 è¯¢åˆ†ç±» 10活动赛事分类 11达人探店分类", required = true),
            @ApiImplicitParam(paramType = "query", dataType = "Integer", name = "parentId", value = "父级主键", required = false),
    })
    public ApiResponse<List<LabelsResponse>> getGoodsLabelsByType(Integer type){
        return ApiResponse.success(labelsService.getGoodsLabelsByType(type));
    public ApiResponse<List<LabelsResponse>> getGoodsLabelsByType(@RequestParam Integer type,Integer parentId){
        return ApiResponse.success(labelsService.getGoodsLabelsByType(type,parentId));
    }
server/dmmall_web/src/main/java/com/doumee/api/web/NoticeApi.java
@@ -9,6 +9,8 @@
import com.doumee.dao.business.model.Notice;
import com.doumee.dao.web.dto.NoticeCardDTO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
@@ -16,7 +18,7 @@
@Api(tags = "消息通知信业务")
@Trace(exclude = true)
@LoginRequired
//@RestController
@RestController
@RequestMapping("/web/notice")
@Slf4j
public class NoticeApi extends ApiController{
@@ -27,10 +29,15 @@
     * @param pageWrap
     * @return
     */
    @ApiOperation(value = "查询用户通知", notes = "小程序端")
    @GetMapping("/findNoticeCardDTOPage")
    public ApiResponse<PageData<NoticeCardDTO>> findNoticeCardDTOPage(@RequestBody PageWrap<Notice> pageWrap){
    @LoginRequired
    @ApiOperation(value = "查询用户通知", notes = "小程序端")
    @PostMapping("/findNoticeCardDTOPage")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "用户token值", required = true),
    })
    public ApiResponse<PageData<NoticeCardDTO>> findNoticeCardDTOPage(@RequestBody PageWrap<Notice> pageWrap){
        pageWrap.getModel().setMemberId(this.getMemberId());
        return ApiResponse.success(noticeService.findNoticeCardDTOPage(pageWrap));
    }
server/dmmall_web/src/main/java/com/doumee/api/web/mall/PaymentCallback.java
@@ -118,6 +118,10 @@
                        goodsOrder.setExchangeCode(Constants.equalsInteger(goodsOrder.getReceiveType(),Constants.ZERO)?null:Constants.getRandomNumber());
                        goodsOrder.setPayMethod(Constants.ZERO);
                        goodsorderService.updateById(goodsOrder);
                        if(Objects.nonNull(goodsOrder.getPickUpShopId())){
                            //发送站内信 - ç»é”€å•†
                            noticeService.orderPayNotice(goodsOrder.getPickUpShopId(),goodsOrder.getId(),goodsOrder.getReceiveType());
                        }
                        Fund fund = new Fund();
                        fund.setOrderCode(goodsOrder.getPayOrderId());
                        fund.setCreator(goodsOrder.getMemberId());