Browse Source

修复宠物代码提交

master
主管理员 1 month ago
parent
commit
0d8a9dde97
32 changed files with 2777 additions and 299 deletions
  1. +53
    -0
      CatmDogd-Mall-Front-test/src/api/model/AppletTask.js
  2. +504
    -0
      CatmDogd-Mall-Front-test/src/views/model/AppletTask/index.vue
  3. +13
    -12
      ruoyi-admin/src/main/resources/application-druid.yml
  4. +103
    -0
      ruoyi-admin/src/main/resources/application-test.yml
  5. +5
    -0
      ruoyi-catdog/src/main/java/com/ruoyi/applet/contoller/ApiAppletOrderItemLogController.java
  6. +187
    -0
      ruoyi-catdog/src/main/java/com/ruoyi/applet/contoller/ApiMallOrderController.java
  7. +77
    -0
      ruoyi-catdog/src/main/java/com/ruoyi/applet/contoller/ApiMallTaskController.java
  8. +31
    -7
      ruoyi-catdog/src/main/java/com/ruoyi/applet/contoller/ApiMallUserTeacherController.java
  9. +35
    -0
      ruoyi-catdog/src/main/java/com/ruoyi/applet/service/IApiMallOrderService.java
  10. +428
    -0
      ruoyi-catdog/src/main/java/com/ruoyi/applet/service/impl/IApiMallOrderServiceImpl.java
  11. +288
    -0
      ruoyi-catdog/src/main/java/com/ruoyi/applet/tencent/TaskConsumer.java
  12. +96
    -0
      ruoyi-catdog/src/main/java/com/ruoyi/model/controller/AppletTaskController.java
  13. +77
    -0
      ruoyi-catdog/src/main/java/com/ruoyi/model/domain/AppletTask.java
  14. +5
    -1
      ruoyi-catdog/src/main/java/com/ruoyi/model/mapper/AppletOrderItemDateLogMapper.java
  15. +67
    -0
      ruoyi-catdog/src/main/java/com/ruoyi/model/mapper/AppletTaskMapper.java
  16. +58
    -0
      ruoyi-catdog/src/main/java/com/ruoyi/model/service/IAppletTaskService.java
  17. +90
    -0
      ruoyi-catdog/src/main/java/com/ruoyi/model/service/impl/AppletTaskServiceImpl.java
  18. +185
    -0
      ruoyi-catdog/src/main/resources/mapper/model/AppletTaskMapper.xml
  19. +5
    -0
      ruoyi-mall/pom.xml
  20. +4
    -0
      ruoyi-mall/src/main/java/com/cyl/h5/controller/H5AppointmentController.java
  21. +6
    -3
      ruoyi-mall/src/main/java/com/cyl/h5/controller/H5OrderController.java
  22. +7
    -0
      ruoyi-mall/src/main/java/com/cyl/h5/pojo/request/CancelOrderRequest.java
  23. +6
    -0
      ruoyi-mall/src/main/java/com/cyl/h5/pojo/vo/H5OrderVO.java
  24. +8
    -0
      ruoyi-mall/src/main/java/com/cyl/h5/pojo/vo/form/AppointmentSubmitForm.java
  25. +9
    -0
      ruoyi-mall/src/main/java/com/cyl/h5/pojo/vo/form/OrderSubmitForm.java
  26. +62
    -1
      ruoyi-mall/src/main/java/com/cyl/h5/service/H5OrderService.java
  27. +10
    -0
      ruoyi-mall/src/main/java/com/cyl/manager/oms/domain/Order.java
  28. +11
    -0
      ruoyi-mall/src/main/java/com/cyl/manager/oms/mapper/OrderMapper.java
  29. +7
    -0
      ruoyi-mall/src/main/java/com/cyl/manager/ums/domain/MemberAddress.java
  30. +285
    -265
      ruoyi-mall/src/main/java/com/cyl/tencent/TaskConsumer.java
  31. +52
    -9
      ruoyi-mall/src/main/resources/mapper/oms/OrderMapper.xml
  32. +3
    -1
      ruoyi-mall/src/main/resources/mapper/ums/AddressMapper.xml

+ 53
- 0
CatmDogd-Mall-Front-test/src/api/model/AppletTask.js View File

@ -0,0 +1,53 @@
import request from '@/utils/request'
// 查询任务中心列表
export function listAppletTask(query) {
return request({
url: '/model/AppletTask/list',
method: 'get',
params: query
})
}
// 查询任务中心详细
export function getAppletTask(id) {
return request({
url: '/model/AppletTask/' + id,
method: 'get'
})
}
// 新增任务中心
export function addAppletTask(data) {
return request({
url: '/model/AppletTask',
method: 'post',
data: data
})
}
// 修改任务中心
export function updateAppletTask(data) {
return request({
url: '/model/AppletTask',
method: 'put',
data: data
})
}
// 删除任务中心
export function delAppletTask(id) {
return request({
url: '/model/AppletTask/' + id,
method: 'delete'
})
}
// 导出任务中心
export function exportAppletTask(query) {
return request({
url: '/model/AppletTask/export',
method: 'get',
params: query
})
}

+ 504
- 0
CatmDogd-Mall-Front-test/src/views/model/AppletTask/index.vue View File

@ -0,0 +1,504 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="100px" size="medium" class="ry_form">
<el-form-item label="当前状态0待接受1以接受" prop="status">
<el-select v-model="queryParams.status" placeholder="请选择当前状态0待接受1以接受" clearable size="small">
<el-option
v-for="dict in dict.type.task_status"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="下单用户标识" prop="memberId">
<el-input
v-model="queryParams.memberId"
placeholder="请输入下单用户标识"
clearable
size="small"
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="任务类型名称" prop="taskName">
<el-input
v-model="queryParams.taskName"
placeholder="请输入任务类型名称"
clearable
size="small"
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="任务报酬" prop="taskMoney">
<el-input
v-model="queryParams.taskMoney"
placeholder="请输入任务报酬"
clearable
size="small"
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="标题" prop="title">
<el-input
v-model="queryParams.title"
placeholder="请输入标题"
clearable
size="small"
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<template v-if="showMoreCondition">
<el-form-item label="主题" prop="theme">
<el-input
v-model="queryParams.theme"
placeholder="请输入主题"
clearable
size="small"
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="任务截至时间" prop="taskEndTime">
<el-date-picker
clearable
size="small"
v-model="queryParams.taskEndTime"
type="datetime"
value-format="yyyy-MM-dd HH:mm:ss"
placeholder="选择任务截至时间">
</el-date-picker>
</el-form-item>
<el-form-item label="任务进度" prop="taskState">
<el-select v-model="queryParams.taskState" placeholder="请选择任务进度" clearable size="small">
<el-option
v-for="dict in dict.type.task_state"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="审核状态" prop="examineState">
<el-select v-model="queryParams.examineState" placeholder="请选择审核状态" clearable size="small">
<el-option
v-for="dict in dict.type.task_state"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="审核说明" prop="examineText">
<el-input
v-model="queryParams.examineText"
placeholder="请输入审核说明"
clearable
size="small"
@keyup.enter.native="handleQuery"
/>
</el-form-item>
</template>
<el-form-item class="flex_one tr">
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
<el-button :icon="showMoreCondition ? 'el-icon-arrow-up' : 'el-icon-arrow-down'" size="mini" @click="showMoreCondition = !showMoreCondition">{{showMoreCondition ? '收起条件' : '展开条件'}}</el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="el-icon-plus"
size="mini"
@click="handleAdd"
v-hasPermi="['model:appletTask:add']"
>新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="success"
plain
icon="el-icon-edit"
size="mini"
:disabled="single"
@click="handleUpdate"
v-hasPermi="['model:appletTask:edit']"
>修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="el-icon-delete"
size="mini"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['model:appletTask:remove']"
>删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="warning"
plain
icon="el-icon-download"
size="mini"
:loading="exportLoading"
@click="handleExport"
v-hasPermi="['model:appletTask:export']"
>导出</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList" :columns="columns"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="appletTaskList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<!-- <el-table-column label="标识" align="center" prop="id" />-->
<el-table-column label="当前状态" align="center" prop="status">
<template slot-scope="scope">
<dict-tag :options="dict.type.task_status" :value="scope.row.status"/>
</template>
</el-table-column>
<el-table-column label="下单用户标识" align="center" prop="memberId" />
<el-table-column label="任务类型名称" align="center" prop="taskName" />
<!-- <el-table-column label="任务小图" align="center" prop="taskIcon" v-if="columns[3].visible"/>-->
<el-table-column label="任务小图" align="center" prop="taskIcon">
<template slot-scope="{ row }">
<el-image v-if="row.taskIcon" :src="row.taskIcon" :preview-src-list="[row.taskIcon]" class="small-img circle-img"/>
</template>
</el-table-column>
<el-table-column label="任务报酬" align="center" prop="taskMoney" />
<!-- <el-table-column label="图片" align="center" prop="image" v-if="columns[5].visible"/>-->
<el-table-column label="图片" align="center" prop="image">
<template slot-scope="{ row }">
<el-image v-if="row.image" :src="row.image" :preview-src-list="[row.image]" class="small-img circle-img"/>
</template>
</el-table-column>
<el-table-column label="标题" align="center" prop="title" />
<el-table-column label="主题" align="center" prop="theme" />
<el-table-column label="任务截至时间" align="center" prop="taskEndTime" width="180" >
<template slot-scope="scope">
<span>{{ parseTime(scope.row.taskEndTime, '')}}</span>
</template>
</el-table-column>
<el-table-column label="任务进度" align="center" prop="taskState" >
<template slot-scope="scope">
<dict-tag :options="dict.type.task_state" :value="scope.row.taskState"/>
</template>
</el-table-column>
<el-table-column label="审核状态" align="center" prop="examineState" v-if="columns[10].visible">
<template slot-scope="scope">
<dict-tag :options="dict.type.task_state" :value="scope.row.examineState"/>
</template>
</el-table-column>
<el-table-column label="审核说明" align="center" prop="examineText" v-if="columns[11].visible"/>
<!-- <el-table-column label="审核图片" align="center" prop="examineImage" v-if="columns[12].visible"/>-->
<el-table-column label="审核图片" align="center" prop="examineImage">
<template slot-scope="{ row }">
<el-image v-if="row.examineImage" :src="row.examineImage" :preview-src-list="[row.examineImage]" class="small-img circle-img"/>
</template>
</el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
v-hasPermi="['model:appletTask:edit']"
>修改</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPermi="['model:appletTask:remove']"
>删除</el-button>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total>0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<!-- 添加或修改任务中心对话框 -->
<el-dialog :title="title" :visible.sync="open" width="50%" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="108px" >
<el-form-item label="当前状态" prop="status">
<el-select v-model="form.status" placeholder="请选择当前状态">
<el-option
v-for="dict in dict.type.task_status"
:key="dict.value"
:label="dict.label"
:value="parseInt(dict.value)" ></el-option>
</el-select>
</el-form-item>
<el-form-item label="下单用户标识" prop="memberId">
<el-input v-model="form.memberId" placeholder="请输入下单用户标识" />
</el-form-item>
<el-form-item label="任务类型名称" prop="taskName">
<el-input v-model="form.taskName" placeholder="请输入任务类型名称" />
</el-form-item>
<el-form-item label="任务小图">
<!-- <imageUpload v-model="form.taskIcon"/>-->
<oss-image-upload v-model="form.taskIcon" :limit="1"></oss-image-upload>
</el-form-item>
<el-form-item label="任务报酬" prop="taskMoney">
<el-input v-model="form.taskMoney" placeholder="请输入任务报酬" />
</el-form-item>
<el-form-item label="图片">
<!-- <imageUpload v-model="form.image"/>-->
<oss-image-upload v-model="form.image" :limit="1"></oss-image-upload>
</el-form-item>
<el-form-item label="标题" prop="title">
<el-input v-model="form.title" placeholder="请输入标题" />
</el-form-item>
<el-form-item label="主题" prop="theme">
<el-input v-model="form.theme" placeholder="请输入主题" />
</el-form-item>
<el-form-item label="任务截至时间" prop="taskEndTime">
<el-date-picker clearable size="small"
v-model="form.taskEndTime"
type="datetime"
value-format="yyyy-MM-dd HH:mm:ss"
placeholder="选择任务截至时间">
</el-date-picker>
</el-form-item>
<el-form-item label="任务进度" prop="taskState">
<el-select v-model="form.taskState" placeholder="请选择任务进度">
<el-option
v-for="dict in dict.type.task_state"
:key="dict.value"
:label="dict.label"
:value="parseInt(dict.value)" ></el-option>
</el-select>
</el-form-item>
<el-form-item label="审核状态" prop="examineState">
<el-select v-model="form.examineState" placeholder="请选择审核状态">
<el-option
v-for="dict in dict.type.task_state"
:key="dict.value"
:label="dict.label"
:value="parseInt(dict.value)" ></el-option>
</el-select>
</el-form-item>
<el-form-item label="审核说明" prop="examineText">
<el-input v-model="form.examineText" placeholder="请输入审核说明" />
</el-form-item>
<el-form-item label="审核图片">
<!-- <imageUpload v-model="form.examineImage"/>-->
<oss-image-upload v-model="form.examineImage" :limit="1"></oss-image-upload>
</el-form-item>
<!-- <el-form-item label="DEL_FLAG" prop="delFlag">-->
<!-- <el-input v-model="form.delFlag" placeholder="请输入DEL_FLAG" />-->
<!-- </el-form-item>-->
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { listAppletTask, getAppletTask, delAppletTask, addAppletTask, updateAppletTask, exportAppletTask } from "@/api/model/AppletTask";
export default {
name: "AppletTask",
dicts: ['task_status', 'task_state', 'task_state'],
data() {
return {
//
loading: true,
//
exportLoading: false,
//
ids: [],
//
single: true,
//
multiple: true,
//
showSearch: true,
//
total: 0,
//
appletTaskList: [],
//
title: "",
//
open: false,
//
queryParams: {
pageNum: 1,
pageSize: 10,
status: null,
memberId: null,
taskName: null,
taskIcon: null,
taskMoney: null,
image: null,
title: null,
theme: null,
taskEndTime: null,
taskState: null,
examineState: null,
examineText: null,
examineImage: null,
},
//
form: {},
//
rules: {
},
columns: [
{ key: 1, label: "当前状态0待接受1以接受", visible: true },
{ key: 2, label: "下单用户标识", visible: true },
{ key: 3, label: "任务类型名称", visible: true },
{ key: 4, label: "任务小图", visible: false },
{ key: 5, label: "任务报酬", visible: true },
{ key: 6, label: "图片", visible: false },
{ key: 7, label: "标题", visible: true },
{ key: 8, label: "主题", visible: true },
{ key: 9, label: "任务截至时间", visible: true },
{ key: 10, label: "任务进度", visible: false },
{ key: 11, label: "审核状态", visible: false },
{ key: 12, label: "审核说明", visible: false },
{ key: 13, label: "审核图片", visible: false },
],
showMoreCondition: false
};
},
created() {
this.getList();
},
methods: {
/** 查询任务中心列表 */
getList() {
this.loading = true;
listAppletTask(this.queryParams).then(response => {
this.appletTaskList = response.rows;
this.total = response.total;
this.loading = false;
});
},
//
cancel() {
this.open = false;
this.reset();
},
//
reset() {
this.form = {
id: null,
status: null,
memberId: null,
taskName: null,
taskIcon: null,
taskMoney: null,
image: null,
title: null,
theme: null,
taskEndTime: null,
taskState: null,
examineState: null,
examineText: null,
examineImage: null,
createTime: null,
createBy: null,
updateTime: null,
updateBy: null,
delFlag: null
};
this.resetForm("form");
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1;
this.getList();
},
/** 重置按钮操作 */
resetQuery() {
this.resetForm("queryForm");
this.handleQuery();
},
//
handleSelectionChange(selection) {
this.ids = selection.map(item => item.id)
this.single = selection.length!==1
this.multiple = !selection.length
},
/** 新增按钮操作 */
handleAdd() {
this.reset();
this.open = true;
this.title = "添加任务中心";
},
/** 修改按钮操作 */
handleUpdate(row) {
this.reset();
const id = row.id || this.ids
getAppletTask(id).then(response => {
this.form = response.data;
this.open = true;
this.title = "修改任务中心";
});
},
/** 提交按钮 */
submitForm() {
this.$refs["form"].validate(valid => {
if (valid) {
if (this.form.id != null) {
updateAppletTask(this.form).then(response => {
this.$modal.msgSuccess("修改成功");
this.open = false;
this.getList();
});
} else {
addAppletTask(this.form).then(response => {
this.$modal.msgSuccess("新增成功");
this.open = false;
this.getList();
});
}
}
});
},
/** 删除按钮操作 */
handleDelete(row) {
const ids = row.id || this.ids;
this.$modal.confirm('是否确认删除任务中心编号为"' + ids + '"的数据项?').then(function() {
return delAppletTask(ids);
}).then(() => {
this.getList();
this.$modal.msgSuccess("删除成功");
}).catch(() => {});
},
/** 导出按钮操作 */
handleExport() {
const queryParams = this.queryParams;
this.$modal.confirm('是否确认导出所有任务中心数据项?').then(() => {
this.exportLoading = true;
return exportAppletTask(queryParams);
}).then(response => {
this.download(response.msg);
this.exportLoading = false;
}).catch(() => {});
}
}
};
</script>

+ 13
- 12
ruoyi-admin/src/main/resources/application-druid.yml View File

@ -6,9 +6,9 @@ spring:
druid:
# 主库数据源 jdbc:mysql://localhost:3306/catmdogf?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&allowMultiQueries=true
master:
url: jdbc:mysql://124.222.255.146:3306/catmdogf?useUnicode=true&useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true
url: jdbc:mysql://47.97.158.59:3306/catmdogf_prod20225?useUnicode=true&useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true
username: root
password: Tc$GePcZ
password: Qweruiop@123
# 从库数据源
slave:
# 从数据源开关/默认关闭
@ -23,16 +23,16 @@ spring:
# redis 配置
redis:
# 地址
host: 124.222.255.146
host: 47.97.158.59
# 端口,默认为6379
port: 6379
# 数据库索引
database: 5
# 密码
password: Abc.123456
password: Qweruiop@123
redisson:
address: "redis://ip"
password: "password" # 如果有密码的话
address: "redis://47.97.158.59"
password: "Qweruiop@123" # 如果有密码的话
connectionPoolSize: 10
idleConnectionTimeout: 10000
timeout: 3000
@ -55,18 +55,19 @@ wechat:
appId: wxd1a6ba7b5e17a5b6
secret: 你的微信服务号密钥
merchantId: 1665639691
# privateKeyPath: ruoyi-admin/src/main/resources/apiclient_cert.p12
privateKeyPath: F:\\java_work\\team_work_java\\pet-admin-25-01-25\\pet-admin\\ruoyi-admin\\src\\main\\resources\\apiclient_key.pem
privateKeyPath: /data/software/app/key/apiclient_key.pem
# privateKeyPath: /root/pem/apiclient_key.pem
# privateKeyPath: F:\\java_work\\team_work_java\\pet-admin-25-01-25\\pet-admin\\ruoyi-admin\\src\\main\\resources\\apiclient_key.pem
#privateKeyPath: /Users/daixiande/Work/杂七杂八/1665639691_20240111_cert/apiclient_key.pem
merchantSerialNumber: 6050244FC18200362585F1F9FD6557A1B291E8C0
apiV3key: 19971022197001121966060120240731
apiV2key: 19961022196901121965060120230731
# notifyUrl: https://api.catmdogd.com/prod-api/no-auth/wechat/notify
# notifyUrlForBCHSH: https://api.catmdogd.com/prod-api/no-auth/wechat/notifyForBCHSH
notifyUrl: https://api.catmdogd.com/prod-api/no-auth/wechat/notify
notifyUrlForBCHSH: https://api.catmdogd.com/prod-api/no-auth/wechat/notifyForBCHSH
# notifyUrl: https://pet-admin.hhlm1688.com/api/no-auth/wechat/notify
# notifyUrlForBCHSH: https://pet-admin.hhlm1688.com/api/no-auth/wechat/notifyForBCHSH
notifyUrl: http://h5.xzaiyp.top/no-auth/wechat/notify
notifyUrlForBCHSH: http://h5.xzaiyp.top/no-auth/wechat/notifyForBCHSH
# notifyUrl: http://h5.xzaiyp.top/no-auth/wechat/notify
# notifyUrlForBCHSH: http://h5.xzaiyp.top/no-auth/wechat/notifyForBCHSH
miniProgramAppId: wxd1a6ba7b5e17a5b6
miniProgramSecret: 06e946a2c9010f8eb9e306018a779a7f
staffAppId: wx01f0f43759922fda


+ 103
- 0
ruoyi-admin/src/main/resources/application-test.yml View File

@ -0,0 +1,103 @@
# 数据源配置
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driverClassName: com.mysql.cj.jdbc.Driver
druid:
# 主库数据源
master:
url: jdbc:mysql://106.15.49.231:3306/catmdogf_test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&allowMultiQueries=true
username: root
password: Qweruiop@123
# 从库数据源
slave:
# 从数据源开关/默认关闭
enabled: false
url:
username:
password:
statViewServlet:
# 控制台管理用户名和密码
login-username: ruoyi
login-password: 123456
# redis 配置
redis:
# 地址
host: 47.97.158.59
# 端口,默认为6379
port: 6379
# 数据库索引
database: 5
# 密码
password: Qweruiop@123
redisson:
address: "redis://47.97.158.59"
password: "Qweruiop@123" # 如果有密码的话
connectionPoolSize: 10
idleConnectionTimeout: 10000
timeout: 3000
ruoyi:
# 文件路径 示例( Windows配置C:/ruoyi/uploadPath,Linux配置 /home/ruoyi/uploadPath)
profile: /Users/daixiande/Work/ruoyi/uploadPath
scheduling:
enabled: false
#操作oss需要的一些参数
aliyun:
accessKeyId: LTAI5tD3bjTBDvgmgXLTKL5X # 阿里云的accessKeyId
secretAccessKey: wCPlCO5nnnqBekd3wxAPU6CSUto6fQ # accessKey 密码
oss:
endPoint: oss-cn-shanghai.aliyuncs.com # Endpoint:在阿里云oss控制台查看自己使用的endpoint
bucketName: catmdogf # bucket 名称
cdnName: cdn.catmdogd.com
wechat:
enabled: true
appId: wxd1a6ba7b5e17a5b6
secret: 你的微信服务号密钥
merchantId: 1665639691
privateKeyPath: /data/software/app/key/apiclient_key.pem
#privateKeyPath: /Users/daixiande/Work/杂七杂八/1665639691_20240111_cert/apiclient_key.pem
merchantSerialNumber: 6050244FC18200362585F1F9FD6557A1B291E8C0
apiV3key: 19971022197001121966060120240731
apiV2key: 19961022196901121965060120230731
notifyUrl: https://api.catmdogd.com/prod-api/no-auth/wechat/notify
notifyUrlForBCHSH: https://api.catmdogd.com/prod-api/no-auth/wechat/notifyForBCHSH
miniProgramAppId: wxd1a6ba7b5e17a5b6
miniProgramSecret: 06e946a2c9010f8eb9e306018a779a7f
staffAppId: wx01f0f43759922fda
staffSecret: b0a5617e6e4c387262a32af2b355c8b6
pay:
v3:
# 租户id
miniapp:
# 应用appId 服务商模式下为服务商的appid 必填
app-id: wxd1a6ba7b5e17a5b6
# v2 api 密钥 1.0.5版本以后如果用到V2的接口时必填
app-secret: 06e946a2c9010f8eb9e306018a779a7f
# api v3 密钥 必填
app-v3-secret: 19971022197001121966060120240731
# 微信支付商户号 服务商模式下为服务商的mchid 必填
mch-id: 1665639691
# 商户服务器域名 用于回调 需要放开回调接口的安全策略 必填
domain: https://api-test.catmdogd.com
# 商户 api 证书路径 必填 填写classpath路径 位于 maven项目的resources文件下
cert-path: apiclient_cert.p12
#cert-path: /data/software/app/key/apiclient_cert.p12
sms:
enabled: true
# 阿里云 dysmsapi.aliyuncs.com
endpoint: dysmsapi.aliyuncs.com
accessKeyId: LTAI5tKHcnnn2Ydue8ZSXwaN #阿里云短信服务控制台查看
accessKeySecret: 6qvhtCb9MkswKEGmRmlpOXwtKwKJFv #同上
signName: 猫妈狗爸
#猫妈狗爸
templateId: SMS_301225389
# 腾讯专用
sdkAppId:
aes:
# aes的密钥
key: 1111111111123456

+ 5
- 0
ruoyi-catdog/src/main/java/com/ruoyi/applet/contoller/ApiAppletOrderItemLogController.java View File

@ -43,6 +43,8 @@ public class ApiAppletOrderItemLogController {
public AjaxResult addOrUpdate(@RequestBody AppletOrderItemDateLog appletOrderItemDateLog)
{
if(appletOrderItemDateLog.getId()!=null){
int i = appletOrderItemDateLogService.updateAppletOrderItemDateLog(appletOrderItemDateLog);
@ -156,4 +158,7 @@ public class ApiAppletOrderItemLogController {
}

+ 187
- 0
ruoyi-catdog/src/main/java/com/ruoyi/applet/contoller/ApiMallOrderController.java View File

@ -0,0 +1,187 @@
package com.ruoyi.applet.contoller;
import com.alibaba.fastjson.JSONObject;
import com.cyl.h5.pojo.request.CancelOrderRequest;
import com.cyl.h5.pojo.request.OrderPayRequest;
import com.cyl.h5.pojo.response.OrderPayResponse;
import com.cyl.h5.pojo.vo.H5OrderVO;
import com.cyl.manager.oms.service.OrderOperateHistoryService;
import com.cyl.manager.ums.domain.Member;
import com.ruoyi.applet.mallpojo.TeacherListRequest;
import com.ruoyi.applet.service.IApiMallOrderService;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.core.redis.RedisService;
import com.ruoyi.framework.config.LocalDataUtil;
import com.ruoyi.model.domain.AppUsers;
import com.ruoyi.model.domain.AppletAddress;
import com.ruoyi.model.domain.AppletUsersTeacher;
import com.ruoyi.model.service.IAppUsersService;
import com.ruoyi.model.service.IAppletAddressService;
import com.ruoyi.model.service.IAppletConfigService;
import com.ruoyi.model.service.IAppletUsersTeacherService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.Pageable;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.List;
@Slf4j
@Api(description = "下单小程序端 - 订单信息列表")
@RestController
@RequestMapping("/applet/mall/order")
public class ApiMallOrderController extends BaseController {
@Autowired
private IApiMallOrderService service;
@Autowired
private IAppUsersService appUsersService;
@Autowired
private IAppletUsersTeacherService appletUsersTeacherService;
@Autowired
private IAppletConfigService appletConfigService;
@Autowired
private IAppletAddressService appletAddressService;
@Autowired
private RedisService redisService;
@Autowired
private OrderOperateHistoryService orderOperateHistoryService;
@ApiOperation("mall-订单列表信息接口")
@GetMapping("/listByOpenid")
public ResponseEntity<PageImpl<H5OrderVO>> orderPageByOpenid(Integer status, String openId, Pageable pageable){
List<Integer> statusList = new ArrayList<>();
if (status == -1) {
statusList.add(0);
statusList.add(1);
statusList.add(2);
statusList.add(3);
} else {
statusList.add(status);
}
PageImpl<H5OrderVO> h5OrderVOS = service.orderPageByOpenid(statusList, openId, pageable);
return ResponseEntity.ok(h5OrderVOS);
}
//根据订单标识查询订单详情
@ApiOperation("mall-根据订单标识查询订单详情接口")
@GetMapping("/orderDetail")
public ResponseEntity<H5OrderVO> orderDetail(@RequestParam(required = false) Long orderId){
if (orderId == null){
throw new RuntimeException("系统繁忙");
}
return ResponseEntity.ok(service.orderDetail(orderId));
}
//根据订单标识取消订单
@ApiOperation("mall-根据订单标识取消订单接口")
@PostMapping("/orderCancel")
public AjaxResult orderCancel(@RequestBody CancelOrderRequest request){
//修改订单状态为已渠道
String s = service.orderBatchCancel(request, null);
return AjaxResult.success(s);
// Member member = (Member) LocalDataUtil.getVar(Constants.MEMBER_INFO);
// String redisKey = "h5_oms_order_cancel_"+ request.getIdList().get(0);
// String redisValue = request.getIdList().get(0)+"_"+System.currentTimeMillis();
// try{
// redisService.lock(redisKey,redisValue,60);
// return ResponseEntity.ok(service.orderBatchCancel(request, member.getId()));
// }catch (Exception e){
// log.error("订单取消方法异常",e);
// throw new RuntimeException("订单取消失败");
// }finally {
// try {
// redisService.unLock(redisKey,redisValue);
// }catch (Exception e){
// log.error("",e);
// }
// }
}
//根据订单标识去评价
@ApiOperation("mall-根据订单标识去评价接口")
@GetMapping("/orderEvaluate")
public AjaxResult orderEvaluate(@RequestParam Long orderId){
if (orderId == null){
throw new RuntimeException("系统繁忙");
}
return AjaxResult.successData(service.orderEvaluate(orderId));
}
//查询-再来一单的历史伴宠师
@ApiOperation("mall-查询-再来一单的历史伴宠师接口")
@GetMapping("/getTeacherList")
public TableDataInfo getTeacherList(TeacherListRequest request) {
startPage();
AppUsers appUsers = new AppUsers();
appUsers.setUserBcs(1);
//如果伴宠师等级传入
if (request.getTeacherLevels() != null) {
appUsers.setUserBcsRole(request.getTeacherLevels());
}
List<AppUsers> appUsersList = appUsersService.selectAppUsersList(appUsers);
for (AppUsers appUsers1 : appUsersList){
AppletUsersTeacher appletUsersTeacher = appletUsersTeacherService.selectAppletUsersTeacherByUserId(appUsers1.getUserId());
appUsers1.setAppletUsersTeacher(appletUsersTeacher);
AppletAddress appletAddress = new AppletAddress();
appletAddress.setUserId(appUsers.getUserId());
List<AppletAddress> appletAddresses = appletAddressService.selectAppletAddressList(appletAddress);
appUsers.setAppletAddresseList(appletAddresses);
}
return getDataTable(appUsersList);
}
@ApiOperation("mall-查询-再次支付")
@PostMapping("/orderPay")
public ResponseEntity<OrderPayResponse> orderPay(@RequestBody OrderPayRequest req){
log.info("订单支付","提交的数据:"+ JSONObject.toJSONString(req));
String redisKey = "h5_oms_order_pay_"+req.getPayId();
String redisValue = req.getPayId()+"_"+System.currentTimeMillis();
try {
redisService.lock(redisKey, redisValue, 60);
Member member = (Member) LocalDataUtil.getVar(Constants.MEMBER_INFO);
Long memberId = member.getId();
req.setMemberId(memberId);
return ResponseEntity.ok(service.orderPay(req));
}catch (Exception e){
log.error("支付方法异常", e);
throw new RuntimeException(e.getMessage());
}finally {
try{
redisService.unLock(redisKey,redisValue);
}catch (Exception e){
log.error("",e);
}
}
}
}

+ 77
- 0
ruoyi-catdog/src/main/java/com/ruoyi/applet/contoller/ApiMallTaskController.java View File

@ -0,0 +1,77 @@
package com.ruoyi.applet.contoller;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.model.domain.AppletTask;
import com.ruoyi.model.service.IAppletTaskService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@Slf4j
@Api(description = "下单小程序端 - 任务中心相关接口")
@RestController
@RequestMapping("/applet/mall/task")
public class ApiMallTaskController extends BaseController {
@Autowired
private IAppletTaskService appletTaskService;
// 任务中心列表
@ApiOperation("mall端-任务中心列表")
@GetMapping("/list")
public TableDataInfo list(AppletTask appletTask) {
startPage();
List<AppletTask> list = appletTaskService.selectAppletTaskList(appletTask);
return getDataTable(list);
}
//根据标识查询任务详情
@ApiOperation("mall端-根据标识查询任务详情")
@GetMapping("/taskDetail/{id}")
public AjaxResult taskDetail(AppletTask appletTask){
AppletTask task = appletTaskService.selectAppletTaskById(appletTask.getId());
return AjaxResult.success("任务详情",task);
}
//接受任务
@ApiOperation("mall端-接受任务")
@GetMapping("/acceptTask")
public AjaxResult acceptTask(@RequestBody AppletTask appletTask){
appletTask.setStatus(1);
int i = appletTaskService.updateAppletTask(appletTask);
if (i>0){
return AjaxResult.success("接受成功");
}
return AjaxResult.error("接受失败");
}
//提交任务信息
@ApiOperation("mall端-提交任务信息")
@PostMapping("/submitTask")
public AjaxResult submitTask(@RequestBody AppletTask appletTask){
appletTask.setTaskState(1);
int i = appletTaskService.updateAppletTask(appletTask);
if (i>0){
return AjaxResult.success("提交成功");
}
return AjaxResult.error("提交失败");
}
}

+ 31
- 7
ruoyi-catdog/src/main/java/com/ruoyi/applet/contoller/ApiMallUserTeacherController.java View File

@ -15,6 +15,7 @@ import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@ -35,6 +36,30 @@ public class ApiMallUserTeacherController extends BaseController {
@Autowired
private IAppletAddressService appletAddressService;
//mall-首页周边伴宠师
@ApiOperation("mall-首页周边伴宠师接口")
@GetMapping("/getTeacherListIndex")
public TableDataInfo getTeacherListIndex() {
startPage();
AppUsers appUsers = new AppUsers();
appUsers.setUserBcs(1);
List<AppUsers> appUsersList = appUsersService.selectAppUsersList(appUsers);
for (AppUsers appUsers1 : appUsersList){
AppletUsersTeacher appletUsersTeacher = appletUsersTeacherService.selectAppletUsersTeacherByUserId(appUsers1.getUserId());
appUsers1.setAppletUsersTeacher(appletUsersTeacher);
AppletAddress appletAddress = new AppletAddress();
appletAddress.setUserId(appUsers.getUserId());
List<AppletAddress> appletAddresses = appletAddressService.selectAppletAddressList(appletAddress);
appUsers.setAppletAddresseList(appletAddresses);
}
return getDataTable(appUsersList);
}
//mall端-查询周边伴宠师集合
@ApiOperation("mall端-查询周边伴宠师列表集合接口")
@GetMapping("/getTeacherList")
@ -63,8 +88,10 @@ public class ApiMallUserTeacherController extends BaseController {
//mall端-查询指定伴宠师详情
@ApiOperation("mall端-查询指定伴宠师详情接口")
@GetMapping("/getTeacherDetail")
public AppUsers getTeacherDetail(Long userId) {
AppUsers appUsers = appUsersService.selectAppUsersByUserId(userId);
public AppUsers getTeacherDetail(AppUsers app) {
//用户标识不能为空
AppUsers appUsers = appUsersService.selectAppUsersByUserId(app.getUserId());
AppletUsersTeacher appletUsersTeacher = appletUsersTeacherService.selectAppletUsersTeacherByUserId(appUsers.getUserId());
appUsers.setAppletUsersTeacher(appletUsersTeacher);
@ -72,15 +99,12 @@ public class ApiMallUserTeacherController extends BaseController {
appletAddress.setUserId(appUsers.getUserId());
List<AppletAddress> appletAddresses = appletAddressService.selectAppletAddressList(appletAddress);
appUsers.setAppletAddresseList(appletAddresses);
return appUsers;
}
//mall端-系统派单的时候需要选择的伴宠师等级说明
@ApiOperation("mall端-系统派单的时候需要选择的伴宠师等级说明接口")
@GetMapping("/getTeacherLevels")


+ 35
- 0
ruoyi-catdog/src/main/java/com/ruoyi/applet/service/IApiMallOrderService.java View File

@ -0,0 +1,35 @@
package com.ruoyi.applet.service;
import com.cyl.h5.pojo.request.CancelOrderRequest;
import com.cyl.h5.pojo.request.OrderPayRequest;
import com.cyl.h5.pojo.response.OrderPayResponse;
import com.cyl.h5.pojo.vo.H5OrderVO;
import com.ruoyi.common.core.domain.AjaxResult;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.Pageable;
import java.util.List;
public interface IApiMallOrderService {
//下单端小程序 - 查看订单列表信息
PageImpl<H5OrderVO> orderPageByOpenid(List<Integer> status, String openId, Pageable pageable);
//下单小程序端 - 根据订单标识查询订单详情
H5OrderVO orderDetail(Long orderId);
//下单小程序端 - 根据订单标识取消订单
String orderBatchCancel(CancelOrderRequest request, Long userId);
//下单小程序端 - 根据订单标识去评价
AjaxResult orderEvaluate(Long orderId);
//再次支付
OrderPayResponse orderPay(OrderPayRequest req);
}

+ 428
- 0
ruoyi-catdog/src/main/java/com/ruoyi/applet/service/impl/IApiMallOrderServiceImpl.java View File

@ -0,0 +1,428 @@
package com.ruoyi.applet.service.impl;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.cyl.h5.pojo.request.CancelOrderRequest;
import com.cyl.h5.pojo.request.OrderPayRequest;
import com.cyl.h5.pojo.response.OrderPayResponse;
import com.cyl.h5.pojo.vo.H5OrderVO;
import com.cyl.h5.service.H5CouponService;
import com.cyl.h5.service.H5PetService;
import com.cyl.manager.marketing.mapper.WechatMemberCouponMapper;
import com.cyl.manager.marketing.service.IWechatMemberCouponService;
import com.cyl.manager.oms.convert.AftersaleItemConvert;
import com.cyl.manager.oms.convert.OrderItemConvert;
import com.cyl.manager.oms.domain.*;
import com.cyl.manager.oms.mapper.*;
import com.cyl.manager.oms.service.OmsOrderServiceService;
import com.cyl.manager.oms.service.OrderItemService;
import com.cyl.manager.oms.service.OrderOperateHistoryService;
import com.cyl.manager.pms.mapper.ProductMapper;
import com.cyl.manager.pms.mapper.SkuMapper;
import com.cyl.manager.staff.service.IBondTransactionService;
import com.cyl.manager.staff.service.IStaffService;
import com.cyl.manager.ums.domain.Member;
import com.cyl.manager.ums.domain.MemberWechat;
import com.cyl.manager.ums.mapper.MemberAddressMapper;
import com.cyl.manager.ums.mapper.MemberCartMapper;
import com.cyl.manager.ums.mapper.MemberWechatMapper;
import com.cyl.manager.ums.pojo.vo.PetVO;
import com.cyl.manager.ums.service.PetService;
import com.cyl.tencent.OrderMessageModel;
import com.cyl.wechat.WechatPayData;
import com.cyl.wechat.WechatPayService;
import com.cyl.wechat.WechatPayUtil;
import com.github.pagehelper.PageHelper;
import com.ruoyi.applet.service.IApiMallOrderService;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.redis.RedisService;
import com.ruoyi.framework.config.LocalDataUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.Pageable;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.*;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.atomic.AtomicReference;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@Slf4j
@Service
public class IApiMallOrderServiceImpl implements IApiMallOrderService {
@Autowired
private MemberAddressMapper memberAddressMapper;
@Autowired
private SkuMapper skuMapper;
@Autowired
private ProductMapper productMapper;
@Autowired
private MemberCartMapper memberCartMapper;
@Autowired
private OrderMapper orderMapper;
@Autowired
private OmsOrderServiceMapper omsOrderServiceMapper;
@Autowired
private OrderItemMapper orderItemMapper;
@Autowired
private OrderOperateHistoryMapper orderOperateHistoryMapper;
@Autowired
// @Lazy
private WechatPayService wechatPayService;
@Autowired
private MemberWechatMapper memberWechatMapper;
@Autowired
private OrderOperateHistoryService orderOperateHistoryService;
@Autowired
private WechatPaymentHistoryMapper wechatPaymentHistoryMapper;
private AftersaleMapper aftersaleMapper;
@Autowired
private AftersaleItemMapper aftersaleItemMapper;
@Autowired
private OmsOrderServiceService omsOrderServiceService;
@Autowired
private WechatMemberCouponMapper wechatMemberCouponMapper;
@Autowired
private H5PetService h5PetService;
//下单端小程序 - 查看订单列表信息
@Override
public PageImpl<H5OrderVO> orderPageByOpenid(List<Integer> status, String openId, Pageable pageable){
QueryWrapper<MemberWechat> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("routine_openid", openId);
MemberWechat memberWechat = memberWechatMapper.selectOne(queryWrapper);
if (memberWechat == null) {
return new PageImpl<>(Collections.EMPTY_LIST, pageable, 0);
}
if (pageable != null){
PageHelper.startPage(pageable.getPageNumber() + 1, pageable.getPageSize());
}
List<H5OrderVO> orderList = orderMapper.orderPage3(status, memberWechat.getMemberId());
long total = ((com.github.pagehelper.Page) orderList).getTotal();
// 两个list都没数据那肯定返回空了
if (CollectionUtil.isEmpty(orderList)){
return new PageImpl<>(Collections.EMPTY_LIST, pageable, 0);
}
// 开始组装item了
// 拿出所有orderId查item然后分组 by orderId
List<Long> idList = new ArrayList<>();
if (CollectionUtil.isNotEmpty(orderList)){
idList.addAll(orderList.stream().map(H5OrderVO::getOrderId).collect(Collectors.toList()));
}
for (Long item : idList){
System.out.println("这个东西是什么:======:"+item);
}
QueryWrapper<OrderItem> orderItemQw = new QueryWrapper<>();
orderItemQw.in("order_id", idList);
Map<Long, List<OrderItem>> orderItemMap =
orderItemMapper.selectList(orderItemQw).stream().collect(Collectors.groupingBy(OrderItem::getOrderId));
orderList.forEach(item -> {
item.setOrderItemList(orderItemMap.get(item.getOrderId()));
OmsOrderService orderServiceInfo = omsOrderServiceService.selectByOrderId(item.getOrderId());
PetVO petVO = h5PetService.selectPetById(orderServiceInfo.getPetId());
orderServiceInfo.setPetVo(petVO);
item.setService(orderServiceInfo);
OmsOrderService omsOrderService = new OmsOrderService();
omsOrderService.setOrderId(item.getOrderId());
List<OmsOrderService> orderServiceList = omsOrderServiceMapper.selectList(omsOrderService);
// 使用一个 Set 来跟踪已经添加的 PetVO id
Set<Integer> addedPetIds = new HashSet<>();
List<PetVO> petVOList = new ArrayList<>();
for (OmsOrderService service1 : orderServiceList) {
// 宠物标识不为空的时候查询数据
if (service1.getPetId() != null) {
PetVO petVO1 = h5PetService.selectPetById(service1.getPetId());
// 检查 petVO id 是否已经添加过
if (petVO1 != null && !addedPetIds.contains(petVO1.getId())) {
service1.setPetVo(petVO1);
petVOList.add(petVO1);
addedPetIds.add(petVO1.getId()); // 标记该 id 已添加
}
}
}
item.setOrderServiceList(orderServiceList);
item.setPetVOList(petVOList);
// item.setUsersTeacher(appletUsersTeacherService.selectAppletUsersTeacherById(item.getTeacherId()));
});
return new PageImpl<>(orderList, pageable, total);
}
//下单小程序端 - 根据订单标识查询订单详情
@Override
public H5OrderVO orderDetail(Long orderId){
H5OrderVO order = orderMapper.selectOrderDetail(orderId);
if (order == null){
throw new RuntimeException("未查询到该订单");
}
// 组装item
QueryWrapper<OrderItem> orderItemQw = new QueryWrapper<>();
orderItemQw.eq("order_id", orderId);
List<OrderItem> orderItemList = orderItemMapper.selectList(orderItemQw);
order.setOrderItemList(orderItemList);
//组装order_service
OmsOrderService omsOrderService = new OmsOrderService();
omsOrderService.setOrderId(orderId);
List<OmsOrderService> orderServiceList = omsOrderServiceMapper.selectList(omsOrderService);
order.setOrderServiceList(orderServiceList);
List<OmsOrderService> service = orderServiceList;
// 使用一个 Set 来跟踪已经添加的 PetVO id
Set<Integer> addedPetIds = new HashSet<>();
List<PetVO> petVOList = new ArrayList<>();
for (OmsOrderService service1 : service) {
// 宠物标识不为空的时候查询数据
if (service1.getPetId() != null) {
PetVO petVO = h5PetService.selectPetById(service1.getPetId());
// 检查 petVO id 是否已经添加过
if (petVO != null && !addedPetIds.contains(petVO.getId())) {
service1.setPetVo(petVO);
petVOList.add(petVO);
addedPetIds.add(petVO.getId()); // 标记该 id 已添加
}
}
}
order.setPetVOList(petVOList);
// 如果未付款计算倒计时
if (Constants.OrderStatus.NOTPAID.equals(order.getStatus())){
// 订单超时时间900s后面可以配置到字典等
Integer time = 900;
Date addDate = Date.from(order.getCreateTime().plusSeconds(time).atZone(ZoneId.systemDefault()).toInstant());
if (addDate.after(new Date())) {
order.setTimeToPay(addDate.getTime());
}
}
return order;
}
//下单小程序端 - 根据订单标识取消订单
@Transactional
@Override
public String orderBatchCancel(CancelOrderRequest request, Long userId) {
// LocalDateTime optDate = LocalDateTime.now();
// if (CollectionUtil.isEmpty(request.getIdList())){
// throw new RuntimeException("未指定需要取消的订单号");
// }
// QueryWrapper<Order> orderQw = new QueryWrapper<>();
// orderQw.in("id", request.getIdList());
// List<Order> orderList = orderMapper.selectList(orderQw);
// if (orderList.size() < request.getIdList().size()){
// throw new RuntimeException("未查询到订单信息");
// }
// //查orderItem
// QueryWrapper<OrderItem> qw = new QueryWrapper<>();
// qw.in("order_id", request.getIdList());
// List<OrderItem> orderItem = orderItemMapper.selectList(qw);
// if (CollectionUtil.isEmpty(orderItem)) {
// throw new RuntimeException("未查询到订单信息");
// }
// long count = orderList.stream().filter(it -> !Constants.H5OrderStatus.UN_PAY.equals(it.getStatus())).count();
// if (count > 0){
// throw new RuntimeException("订单状态已更新,请刷新页面");
// }
// List<OrderOperateHistory> addHistoryList = new ArrayList<>();
// orderList.forEach(item -> {
// item.setStatus(Constants.H5OrderStatus.CLOSED);
// item.setUpdateTime(optDate);
// item.setUpdateBy(userId);
// OrderOperateHistory history = new OrderOperateHistory();
// history.setOrderId(item.getId());
// history.setOrderSn(item.getOrderSn());
// history.setOperateMan(userId == null ? "后台管理员" : "" + item.getMemberId());
// history.setOrderStatus(Constants.H5OrderStatus.CLOSED);
// history.setCreateTime(optDate);
// history.setCreateBy(userId);
// history.setUpdateBy(userId);
// history.setUpdateTime(optDate);
// addHistoryList.add(history);
//
// });
// //取消订单
// int rows = orderMapper.cancelBatch(orderList);
// if (rows < 1){
// throw new RuntimeException("更改订单状态失败");
// }
// orderItem.stream().collect(Collectors.groupingBy(it->it.getSkuId())).forEach((k,v)->{
// AtomicReference<Integer> totalCount = new AtomicReference<>(0);
// v.forEach(it-> totalCount.updateAndGet(v1 -> v1 + it.getQuantity()));
// skuMapper.updateStockById(k, optDate, -1 * totalCount.get());
// });
//
// //创建订单操作记录
// boolean flag = orderOperateHistoryService.saveBatch(addHistoryList);
// if (!flag){
// throw new RuntimeException("创建订单操作记录失败");
// }
orderMapper.cancelBatchOne(request.getId());
return "取消订单成功";
}
//下单小程序端 - 根据订单标识去评价
@Override
public AjaxResult orderEvaluate(Long orderId){
if (orderId == null){
throw new RuntimeException("系统繁忙");
}
return AjaxResult.successData("");
}
@Override
public OrderPayResponse orderPay(OrderPayRequest req) {
QueryWrapper<Order> qw = new QueryWrapper<>();
qw.eq("pay_id", req.getPayId());
qw.eq("status", 0);
List<Order> orderList = orderMapper.selectList(qw);
if (CollectionUtil.isEmpty(orderList)){
throw new RuntimeException("没有待支付的订单");
}
QueryWrapper<MemberWechat> memberWechatQw = new QueryWrapper<>();
memberWechatQw.eq("member_id", req.getMemberId());
MemberWechat memberWechat = memberWechatMapper.selectOne(memberWechatQw);
if (memberWechat == null || StrUtil.isBlank(memberWechat.getOpenid())){
throw new RuntimeException("获取用户openId失败");
}
QueryWrapper<OrderItem> orderItemQw = new QueryWrapper<>();
orderItemQw.eq("order_id", orderList.get(0).getId());
List<OrderItem> orderItemList = orderItemMapper.selectList(orderItemQw);
String orderDesc = orderItemList.get(0).getProductName().substring(0, Math.min(40, orderItemList.get(0).getProductName().length()));
//保存微信支付历史
LocalDateTime optDate = LocalDateTime.now();
QueryWrapper<WechatPaymentHistory> wxPaymentQw = new QueryWrapper<>();
wxPaymentQw.eq("order_id", orderList.get(0).getPayId());
wxPaymentQw.eq("op_type", Constants.PaymentOpType.PAY);
WechatPaymentHistory wechatPaymentHistory = wechatPaymentHistoryMapper.selectOne(wxPaymentQw);
if (wechatPaymentHistory == null){
wechatPaymentHistory = new WechatPaymentHistory();
wechatPaymentHistory.setOrderId(orderList.get(0).getPayId());
wechatPaymentHistory.setMemberId(req.getMemberId());
wechatPaymentHistory.setOpenid(memberWechat.getOpenid());
wechatPaymentHistory.setTitle(orderItemList.get(0).getProductName());
wechatPaymentHistory.setMoney(orderList.get(0).getPayAmount());
wechatPaymentHistory.setOpType(Constants.PaymentOpType.PAY);
wechatPaymentHistory.setPaymentStatus(0);
wechatPaymentHistory.setCreateBy(req.getMemberId());
wechatPaymentHistory.setCreateTime(optDate);
wechatPaymentHistory.setUpdateBy(req.getMemberId());
wechatPaymentHistory.setUpdateTime(optDate);
wechatPaymentHistoryMapper.insert(wechatPaymentHistory);
}else {
wechatPaymentHistory.setMoney(orderList.get(0).getPayAmount());
wechatPaymentHistoryMapper.updateById(wechatPaymentHistory);
}
//请开启微信支付 wechat.enabled=true
//调用wx的jsapi拿prepayId返回签名等信息
String openId = memberWechat.getOpenid();
String appId = WechatPayData.appId;
if (2 == req.getWechatType()) {
openId = memberWechat.getRoutineOpenid();
appId = WechatPayData.miniProgramAppId;
}
String prepayId = wechatPayService.jsapiPay(
String.valueOf(req.getPayId()),
orderDesc,
Integer.valueOf(orderList.stream().map(Order::getPayAmount).
reduce(BigDecimal.ZERO, BigDecimal::add).multiply(new BigDecimal(100)).stripTrailingZeros().toPlainString()),
openId,
req.getMemberId(),
appId
);
OrderPayResponse response = new OrderPayResponse();
response.setPayType(2);
String nonceStr = WechatPayUtil.generateNonceStr();
long timeStamp = WechatPayUtil.getCurrentTimestamp();
prepayId = "prepay_id=" + prepayId;
String signType = "RSA";
String paySign = null;
String signatureStr = Stream.of(appId, String.valueOf(timeStamp), nonceStr, prepayId)
.collect(Collectors.joining("\n", "", "\n"));
try {
paySign = WechatPayUtil.getSign(signatureStr, WechatPayData.privateKeyPath);
} catch (Exception e) {
throw new RuntimeException("支付失败");
}
response.setAppId(appId);
response.setTimeStamp(String.valueOf(timeStamp));
response.setNonceStr(nonceStr);
response.setSignType(signType);
response.setPackage_(prepayId);
response.setPaySign(paySign);
response.setOrderId(orderList.get(0).getId());
return response;
}
}

+ 288
- 0
ruoyi-catdog/src/main/java/com/ruoyi/applet/tencent/TaskConsumer.java View File

@ -0,0 +1,288 @@
package com.ruoyi.applet.tencent;
import com.cyl.h5.pojo.vo.H5OrderVO;
import com.cyl.h5.service.H5MemberService;
import com.cyl.h5.service.H5OrderService;
import com.cyl.manager.oms.domain.OmsOrderService;
import com.cyl.manager.oms.domain.Order;
import com.cyl.manager.oms.service.OmsOrderServiceService;
import com.cyl.manager.oms.service.OrderService;
import com.cyl.manager.staff.service.IDispatchOrderService;
import com.cyl.manager.ums.domain.Member;
import com.cyl.manager.ums.domain.MemberPointHistory;
import com.cyl.manager.ums.mapper.MemberMapper;
import com.cyl.manager.ums.service.MemberPointHistoryService;
import com.cyl.manager.ums.service.MemberService;
import com.cyl.tencent.OrderMessageModel;
import com.cyl.tencent.QueueConsumer;
import com.ruoyi.applet.service.IMallOrderService;
import com.ruoyi.common.config.properties.SmsProperties;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.sms.AliyunSmsUtils;
import com.ruoyi.common.utils.StringUtils;
import com.wechat.pay.java.core.util.GsonUtil;
import lombok.extern.slf4j.Slf4j;
import lombok.val;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Date;
import java.util.List;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.atomic.AtomicReference;
@Slf4j
@Component
public class TaskConsumer implements QueueConsumer {
@Autowired
@Qualifier("taskQueue")
private BlockingQueue<OrderMessageModel> taskQueue;
@Autowired
private MemberPointHistoryService memberPointHistoryService;
@Autowired
private H5MemberService h5MemberService;
@Autowired
private MemberService memberService;
@Autowired
private OrderService orderService;
@Autowired
private OmsOrderServiceService omsOrderServiceService;
@Autowired
private MemberMapper memberMapper;
@Autowired
private SmsProperties smsProperties;
@Autowired
private H5OrderService h5OrderService;
@Autowired
private IDispatchOrderService dispatchedOrdersService;
@Autowired
private IMallOrderService mallOrderService;
int threadSize = 2;
private boolean run;
private TaskThread[] taskThreads;
private class TaskThread extends Thread {
@Override
public void run() {
while (run) {
try {
OrderMessageModel model = taskQueue.take();
log.info("消费者消息:" + model);
//处理任务逻辑
log.info("推送订单信息:" + GsonUtil.toJson(model.getOrder()));
//处理积分集点等级
pointHandler(model.getOrder());
//派单订单逻辑处理方法--------lzx
log.info("派单订单逻辑处理方法--------lzx");
log.info("派单类型:"+model.getOrder().getTeacherId());
H5OrderVO h5OrderVO = h5OrderService.orderDetail(model.getOrder().getId());
//如果为空则为系统派单
if (model.getOrder().getTeacherId() == null) {
//系统派单
log.info("系统派单");
mallOrderService.acceptDispatchAll(h5OrderVO);
}else if (model.getOrder().getTeacherId() != null) {
//指定派单
log.info("指定派单");
mallOrderService.acceptDispatch(model.getOrder().getTeacherId(), h5OrderVO);
}
//进行派单操作
dispatchedOrdersService.dispatch(model.getOrder().getId());
//TODO 等待订单逻辑完成
smsHandler(model.getOrder());
} catch (Exception e) {
log.error("task消费异常:{}", e);
}
}
}
}
private void smsHandler(Order order) {
try {
Member member = memberService.selectById(order.getMemberId());
String phone = memberService.getPhoneDecrypted(member.getPhoneEncrypted());
//TODO 查询订单的开始日期和结束日期
List<OmsOrderService> omsOrderServiceList = omsOrderServiceService.selectListByOrderId(order.getId());
AtomicReference<String> startDate = new AtomicReference<>();
AtomicReference<String> endDate = new AtomicReference<>();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
omsOrderServiceList.forEach(item -> {
String serviceDate = item.getServiceDate();
if (StringUtils.isNotEmpty(serviceDate)) {
try {
Date serviceDateDate = sdf.parse(serviceDate);
if (StringUtils.isEmpty(startDate.get())) {
startDate.set(serviceDate);
} else {
if (serviceDateDate.before(sdf.parse(startDate.get()))) {
startDate.set(serviceDate);
}
}
if (StringUtils.isEmpty(endDate.get())) {
endDate.set(serviceDate);
} else {
if (serviceDateDate.after(sdf.parse(endDate.get()))) {
endDate.set(serviceDate);
}
}
} catch (ParseException e) {
log.error("时间解析失败:" + serviceDate);
}
}
});
if (StringUtils.isEmpty(endDate.get()) || StringUtils.isEmpty(startDate.get())) {
return;
}
AliyunSmsUtils util = new AliyunSmsUtils(smsProperties);
AliyunSmsUtils.sendOrderSuccessSMS(phone, startDate.get(), endDate.get());
} catch (Exception e) {
e.printStackTrace();
log.error("【支付回调任务处理】发送短信失败:" + e.getMessage());
}
}
private void pointHandler(Order order) {
BigDecimal amount = order.getPayAmount();
Member member = memberService.selectById(order.getMemberId());
Integer level = member.getLevel();
BigDecimal coefficient = BigDecimal.ZERO;
if (level == 1) {
coefficient = BigDecimal.valueOf(1.1);
} else if ( level == 2) {
coefficient = BigDecimal.valueOf(1.1);
} else if ( level == 3) {
coefficient = BigDecimal.valueOf(1.3);
} else if ( level == 4) {
coefficient = BigDecimal.valueOf(1.5);
} else {
coefficient = BigDecimal.valueOf(1.1);
}
//处理积分
MemberPointHistory point = getPointEntity(member,order,coefficient);
memberPointHistoryService.insertMemberPointHistory(point);
log.info("新增积分明细:{}", point);
//处理集点
MemberPointHistory gather = getGatherEntity(order,member.getCentralPoint());
memberPointHistoryService.insertMemberPointHistory(gather);
log.info("新增集点明细:{}", gather);
//处理等级
//有效订单开始时间为当前时间往前推一年的第一天
// 获取当前日期
LocalDate currentDate = LocalDate.now();
// 获取往前推一年的日期
LocalDate oneYearAgo = currentDate.minusYears(1);
// 获取往前推一年后的第一天1月1日
LocalDate firstDayOfYear = oneYearAgo.withDayOfYear(1);
// 将LocalDate转换为LocalDateTime设置时间为00:00:00
LocalDateTime startOfDay = firstDayOfYear.atStartOfDay();
// 如果需要转换为Date类型
Date startDate = Date.from(startOfDay.atZone(ZoneId.systemDefault()).toInstant());
List<Order> orders = orderService.getOrdersByMemberId(order.getMemberId(),startDate,new Date());
//订单总金额
BigDecimal totalAmount = orders.stream()
.map(Order::getPayAmount) // 获取每个订单的 amount
.reduce(BigDecimal.ZERO, BigDecimal::add); // 累加
int[] levels = h5MemberService.evaluateOrderAmount(totalAmount);
int memberLevel = levels[0];
member.setLevel(memberLevel);
member.setCentralPoint(BigDecimal.valueOf(orders.size()));
member.setIntegral(totalAmount.multiply(coefficient));
memberMapper.updateById(member);
log.info("更新member信息:{}", member);
}
private MemberPointHistory getGatherEntity(Order order, BigDecimal centralPoint) {
MemberPointHistory memberPointHistory = new MemberPointHistory();
memberPointHistory.setMemberId(order.getMemberId());
memberPointHistory.setPoint(BigDecimal.ONE);
memberPointHistory.setType("gather");
memberPointHistory.setTransactionId(order.getId());
memberPointHistory.setDescription("数据手工同步");
memberPointHistory.setAction("added");
memberPointHistory.setPointBefore(centralPoint);
centralPoint = centralPoint.add(BigDecimal.valueOf(1));
memberPointHistory.setPointAfter(centralPoint);
memberPointHistory.setCreateAt(order.getCreateTime());
return memberPointHistory;
}
private MemberPointHistory getPointEntity(Member member,Order order, BigDecimal coefficient) {
MemberPointHistory memberPointHistory = new MemberPointHistory();
memberPointHistory.setMemberId(order.getMemberId());
BigDecimal result = order.getPayAmount().multiply(coefficient);
memberPointHistory.setPoint(result);
memberPointHistory.setType("point");
memberPointHistory.setTransactionId(order.getId());
memberPointHistory.setDescription("订单生成");
memberPointHistory.setAction("added");
memberPointHistory.setPointBefore(member.getIntegral());
BigDecimal pointAfter = member.getIntegral().add(order.getPayAmount().multiply(coefficient));
memberPointHistory.setPointAfter(pointAfter);
memberPointHistory.setCreateAt(order.getCreateTime());
return memberPointHistory;
}
@Override
public void start() {
run = true;
taskThreads = new TaskThread[threadSize];
for (int i = 0; i < threadSize; i++) {
taskThreads [i] = new TaskThread();
taskThreads [i].start();
}
}
@Override
public void stop() {
run = false;
if (taskThreads != null) {
for (TaskThread thread : taskThreads ) {
thread.interrupt();
}
}
}
}

+ 96
- 0
ruoyi-catdog/src/main/java/com/ruoyi/model/controller/AppletTaskController.java View File

@ -0,0 +1,96 @@
package com.ruoyi.model.controller;
import java.util.List;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.model.domain.AppletTask;
import com.ruoyi.model.service.IAppletTaskService;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.common.core.page.TableDataInfo;
/**
* 任务中心Controller
*
* @author daixiande
* @date 2025-04-24
*/
@RestController
@RequestMapping("/model/AppletTask")
public class AppletTaskController extends BaseController {
@Autowired
private IAppletTaskService appletTaskService;
/**
* 查询任务中心列表
*/
@PreAuthorize("@ss.hasPermi('model:AppletTask:list')")
@GetMapping("/list")
public TableDataInfo list(AppletTask appletTask) {
startPage();
List<AppletTask> list = appletTaskService.selectAppletTaskList(appletTask);
return getDataTable(list);
}
/**
* 导出任务中心列表
*/
@PreAuthorize("@ss.hasPermi('model:AppletTask:export')")
@Log(title = "任务中心", businessType = BusinessType.EXPORT)
@GetMapping("/export")
public AjaxResult export(AppletTask appletTask) {
List<AppletTask> list = appletTaskService.selectAppletTaskList(appletTask);
ExcelUtil<AppletTask> util = new ExcelUtil<AppletTask>(AppletTask.class);
return util.exportExcel(list, "任务中心数据");
}
/**
* 获取任务中心详细信息
*/
@PreAuthorize("@ss.hasPermi('model:AppletTask:query')")
@GetMapping(value = "/{id}")
public AjaxResult getInfo(@PathVariable("id") Long id) {
return AjaxResult.success(appletTaskService.selectAppletTaskById(id));
}
/**
* 新增任务中心
*/
@PreAuthorize("@ss.hasPermi('model:AppletTask:add')")
@Log(title = "任务中心", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@RequestBody AppletTask appletTask) {
return toAjax(appletTaskService.insertAppletTask(appletTask));
}
/**
* 修改任务中心
*/
@PreAuthorize("@ss.hasPermi('model:AppletTask:edit')")
@Log(title = "任务中心", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@RequestBody AppletTask appletTask) {
return toAjax(appletTaskService.updateAppletTask(appletTask));
}
/**
* 删除任务中心
*/
@PreAuthorize("@ss.hasPermi('model:AppletTask:remove')")
@Log(title = "任务中心", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public AjaxResult remove(@PathVariable Long[] ids) {
return toAjax(appletTaskService.deleteAppletTaskByIds(ids));
}
}

+ 77
- 0
ruoyi-catdog/src/main/java/com/ruoyi/model/domain/AppletTask.java View File

@ -0,0 +1,77 @@
package com.ruoyi.model.domain;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.core.domain.BaseAudit;
import lombok.Data;
/**
* 任务中心对象 applet_task
*
* @author daixiande
*/
@Data
public class AppletTask extends BaseAudit {
private static final long serialVersionUID = 1L;
/** 标识 */
private Long id;
/** 当前状态0待接受1以接受 */
@Excel(name = "当前状态0待接受1以接受")
private Integer status;
/** 下单用户标识 */
@Excel(name = "下单用户标识")
private Long memberId;
/** 任务类型名称 */
@Excel(name = "任务类型名称")
private String taskName;
/** 任务小图 */
@Excel(name = "任务小图")
private String taskIcon;
/** 任务报酬 */
@Excel(name = "任务报酬")
private BigDecimal taskMoney;
/** 图片 */
@Excel(name = "图片")
private String image;
/** 标题 */
@Excel(name = "标题")
private String title;
/** 主题 */
@Excel(name = "主题")
private String theme;
/** 任务截至时间 */
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@Excel(name = "任务截至时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime taskEndTime;
/** 任务进度 */
@Excel(name = "任务进度")
private Integer taskState;
/** 审核状态 */
@Excel(name = "审核状态")
private Integer examineState;
/** 审核说明 */
@Excel(name = "审核说明")
private String examineText;
/** 审核图片 */
@Excel(name = "审核图片")
private String examineImage;
/** DEL_FLAG */
private Long delFlag;
}

+ 5
- 1
ruoyi-catdog/src/main/java/com/ruoyi/model/mapper/AppletOrderItemDateLogMapper.java View File

@ -2,6 +2,8 @@ package com.ruoyi.model.mapper;
import java.util.List;
import com.ruoyi.model.domain.AppletOrderItemDateLog;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
/**
* 订单信息表Mapper接口
@ -16,7 +18,9 @@ public interface AppletOrderItemDateLogMapper {
* @return 订单信息表
*/
AppletOrderItemDateLog selectById(Long id);
AppletOrderItemDateLog selectAppletOrderItemDateLogByItemDateId(Long itemDateId);
@Select("select * from applet_order_item_date_log where item_date_id = #{itemDateId}")
AppletOrderItemDateLog selectAppletOrderItemDateLogByItemDateId(@Param("itemDateId") Long itemDateId);
/**
* 查询订单信息表列表


+ 67
- 0
ruoyi-catdog/src/main/java/com/ruoyi/model/mapper/AppletTaskMapper.java View File

@ -0,0 +1,67 @@
package com.ruoyi.model.mapper;
import java.util.List;
import com.ruoyi.model.domain.AppletTask;
/**
* 任务中心Mapper接口
*
* @author daixiande
*/
public interface AppletTaskMapper {
/**
* 查询任务中心
*
* @param id 任务中心主键
* @return 任务中心
*/
AppletTask selectById(Long id);
/**
* 查询任务中心列表
*
* @param appletTask 任务中心
* @return 任务中心集合
*/
List<AppletTask> selectList(AppletTask appletTask);
/**
* 新增任务中心
*
* @param appletTask 任务中心
* @return 结果
*/
int insert(AppletTask appletTask);
/**
* 修改任务中心
*
* @param appletTask 任务中心
* @return 结果
*/
int update(AppletTask appletTask);
/**
* 删除任务中心
*
* @param id 任务中心主键
* @return 结果
*/
int deleteById(Long id);
/**
* 批量删除任务中心
*
* @param ids 需要删除的数据主键集合
* @return 结果
*/
int deleteByIds(Long[] ids);
/**
* 更新或插入任务中心
*
* @param appletTask 任务中心
* @return 结果
*/
int insertOrUpdate(AppletTask appletTask);
}

+ 58
- 0
ruoyi-catdog/src/main/java/com/ruoyi/model/service/IAppletTaskService.java View File

@ -0,0 +1,58 @@
package com.ruoyi.model.service;
import java.util.List;
import com.ruoyi.model.domain.AppletTask;
/**
* 任务中心Service接口
*
* @author daixiande
*/
public interface IAppletTaskService {
/**
* 查询任务中心
*
* @param id 任务中心主键
* @return 任务中心
*/
AppletTask selectAppletTaskById(Long id);
/**
* 查询任务中心列表
*
* @param appletTask 任务中心
* @return 任务中心集合
*/
List<AppletTask> selectAppletTaskList(AppletTask appletTask);
/**
* 新增任务中心
*
* @param appletTask 任务中心
* @return 结果
*/
int insertAppletTask(AppletTask appletTask);
/**
* 修改任务中心
*
* @param appletTask 任务中心
* @return 结果
*/
int updateAppletTask(AppletTask appletTask);
/**
* 批量删除任务中心
*
* @param ids 需要删除的任务中心主键集合
* @return 结果
*/
int deleteAppletTaskByIds(Long[] ids);
/**
* 删除任务中心信息
*
* @param id 任务中心主键
* @return 结果
*/
int deleteAppletTaskById(Long id);
}

+ 90
- 0
ruoyi-catdog/src/main/java/com/ruoyi/model/service/impl/AppletTaskServiceImpl.java View File

@ -0,0 +1,90 @@
package com.ruoyi.model.service.impl;
import java.util.List;
import java.time.LocalDateTime;
import com.ruoyi.common.utils.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.model.mapper.AppletTaskMapper;
import com.ruoyi.model.domain.AppletTask;
import com.ruoyi.model.service.IAppletTaskService;
/**
* 任务中心Service业务层处理
*
* @author daixiande
*/
@Service
public class AppletTaskServiceImpl implements IAppletTaskService {
@Autowired
private AppletTaskMapper appletTaskMapper;
/**
* 查询任务中心
*
* @param id 任务中心主键
* @return 任务中心
*/
@Override
public AppletTask selectAppletTaskById(Long id) {
return appletTaskMapper.selectById(id);
}
/**
* 查询任务中心列表
*
* @param appletTask 任务中心
* @return 任务中心
*/
@Override
public List<AppletTask> selectAppletTaskList(AppletTask appletTask) {
return appletTaskMapper.selectList(appletTask);
}
/**
* 新增任务中心
*
* @param appletTask 任务中心
* @return 结果
*/
@Override
public int insertAppletTask(AppletTask appletTask) {
appletTask.setCreateTime(LocalDateTime.now());
return appletTaskMapper.insert(appletTask);
}
/**
* 修改任务中心
*
* @param appletTask 任务中心
* @return 结果
*/
@Override
public int updateAppletTask(AppletTask appletTask) {
appletTask.setUpdateTime(DateUtils.getNowDate());
return appletTaskMapper.update(appletTask);
}
/**
* 批量删除任务中心
*
* @param ids 需要删除的任务中心主键
* @return 结果
*/
@Override
public int deleteAppletTaskByIds(Long[] ids) {
return appletTaskMapper.deleteByIds(ids);
}
/**
* 删除任务中心信息
*
* @param id 任务中心主键
* @return 结果
*/
@Override
public int deleteAppletTaskById(Long id) {
return appletTaskMapper.deleteById(id);
}
}

+ 185
- 0
ruoyi-catdog/src/main/resources/mapper/model/AppletTaskMapper.xml View File

@ -0,0 +1,185 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.model.mapper.AppletTaskMapper">
<resultMap type="AppletTask" id="AppletTaskResult">
<result property="id" column="id"/>
<result property="status" column="status"/>
<result property="memberId" column="member_id"/>
<result property="taskName" column="task_name"/>
<result property="taskIcon" column="task_icon"/>
<result property="taskMoney" column="task_money"/>
<result property="image" column="image"/>
<result property="title" column="title"/>
<result property="theme" column="theme"/>
<result property="taskEndTime" column="task_end_time"/>
<result property="taskState" column="task_state"/>
<result property="examineState" column="examine_state"/>
<result property="examineText" column="examine_text"/>
<result property="examineImage" column="examine_image"/>
<result property="createTime" column="create_time"/>
<result property="createBy" column="create_by"/>
<result property="updateTime" column="update_time"/>
<result property="updateBy" column="update_by"/>
<result property="delFlag" column="del_flag"/>
</resultMap>
<sql id="selectAppletTaskVo">
select id, status, member_id, task_name, task_icon, task_money, image, title, theme, task_end_time, task_state, examine_state, examine_text, examine_image, create_time, create_by, update_time, update_by, del_flag from applet_task
</sql>
<select id="selectList" parameterType="AppletTask" resultMap="AppletTaskResult">
<include refid="selectAppletTaskVo"/>
<where>
<if test="status != null "> and status = #{status}</if>
<if test="memberId != null "> and member_id = #{memberId}</if>
<if test="taskName != null and taskName != ''"> and task_name like concat('%', #{taskName}, '%')</if>
<if test="taskIcon != null and taskIcon != ''"> and task_icon = #{taskIcon}</if>
<if test="taskMoney != null "> and task_money = #{taskMoney}</if>
<if test="image != null and image != ''"> and image = #{image}</if>
<if test="title != null and title != ''"> and title = #{title}</if>
<if test="theme != null and theme != ''"> and theme = #{theme}</if>
<if test="taskEndTime != null "> and task_end_time = #{taskEndTime}</if>
<if test="taskState != null "> and task_state = #{taskState}</if>
<if test="examineState != null "> and examine_state = #{examineState}</if>
<if test="examineText != null and examineText != ''"> and examine_text = #{examineText}</if>
<if test="examineImage != null and examineImage != ''"> and examine_image = #{examineImage}</if>
</where>
</select>
<select id="selectById" parameterType="Long" resultMap="AppletTaskResult">
<include refid="selectAppletTaskVo"/>
where id = #{id}
</select>
<insert id="insert" parameterType="AppletTask">
insert into applet_task
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="id != null">id,</if>
<if test="status != null">status,</if>
<if test="memberId != null">member_id,</if>
<if test="taskName != null">task_name,</if>
<if test="taskIcon != null">task_icon,</if>
<if test="taskMoney != null">task_money,</if>
<if test="image != null">image,</if>
<if test="title != null">title,</if>
<if test="theme != null">theme,</if>
<if test="taskEndTime != null">task_end_time,</if>
<if test="taskState != null">task_state,</if>
<if test="examineState != null">examine_state,</if>
<if test="examineText != null">examine_text,</if>
<if test="examineImage != null">examine_image,</if>
<if test="createTime != null">create_time,</if>
<if test="createBy != null">create_by,</if>
<if test="updateTime != null">update_time,</if>
<if test="updateBy != null">update_by,</if>
<if test="delFlag != null">del_flag,</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="id != null">#{id},</if>
<if test="status != null">#{status},</if>
<if test="memberId != null">#{memberId},</if>
<if test="taskName != null">#{taskName},</if>
<if test="taskIcon != null">#{taskIcon},</if>
<if test="taskMoney != null">#{taskMoney},</if>
<if test="image != null">#{image},</if>
<if test="title != null">#{title},</if>
<if test="theme != null">#{theme},</if>
<if test="taskEndTime != null">#{taskEndTime},</if>
<if test="taskState != null">#{taskState},</if>
<if test="examineState != null">#{examineState},</if>
<if test="examineText != null">#{examineText},</if>
<if test="examineImage != null">#{examineImage},</if>
<if test="createTime != null">#{createTime},</if>
<if test="createBy != null">#{createBy},</if>
<if test="updateTime != null">#{updateTime},</if>
<if test="updateBy != null">#{updateBy},</if>
<if test="delFlag != null">#{delFlag},</if>
</trim>
</insert>
<update id="update" parameterType="AppletTask">
update applet_task
<trim prefix="SET" suffixOverrides=",">
<if test="status != null">status = #{status},</if>
<if test="memberId != null">member_id = #{memberId},</if>
<if test="taskName != null">task_name = #{taskName},</if>
<if test="taskIcon != null">task_icon = #{taskIcon},</if>
<if test="taskMoney != null">task_money = #{taskMoney},</if>
<if test="image != null">image = #{image},</if>
<if test="title != null">title = #{title},</if>
<if test="theme != null">theme = #{theme},</if>
<if test="taskEndTime != null">task_end_time = #{taskEndTime},</if>
<if test="taskState != null">task_state = #{taskState},</if>
<if test="examineState != null">examine_state = #{examineState},</if>
<if test="examineText != null">examine_text = #{examineText},</if>
<if test="examineImage != null">examine_image = #{examineImage},</if>
<if test="createTime != null">create_time = #{createTime},</if>
<if test="createBy != null">create_by = #{createBy},</if>
<if test="updateTime != null">update_time = #{updateTime},</if>
<if test="updateBy != null">update_by = #{updateBy},</if>
<if test="delFlag != null">del_flag = #{delFlag},</if>
</trim>
where id = #{id}
</update>
<delete id="deleteById" parameterType="Long">
delete from applet_task where id = #{id}
</delete>
<delete id="deleteByIds" parameterType="String">
delete from applet_task where id in
<foreach item="id" collection="array" open="(" separator="," close=")">
#{id}
</foreach>
</delete>
<insert id="insertOrUpdate" parameterType="AppletTask" useGeneratedKeys="true" keyProperty="id">
insert into applet_task
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="id != null">
id,
</if>
status, member_id, task_name, task_icon, task_money, image, title, theme, task_end_time, task_state, examine_state, examine_text, examine_image, create_time, create_by, update_time, update_by, del_flag,
</trim>
values
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="id != null">
#{id, jdbcType=BIGINT},
</if>
#{status, jdbcType=INTEGER},#{memberId, jdbcType=BIGINT},#{taskName, jdbcType=VARCHAR},#{taskIcon, jdbcType=VARCHAR},#{taskMoney, jdbcType=DECIMAL},#{image, jdbcType=VARCHAR},#{title, jdbcType=VARCHAR},#{theme, jdbcType=VARCHAR},#{taskEndTime, jdbcType=DATE},#{taskState, jdbcType=INTEGER},#{examineState, jdbcType=INTEGER},#{examineText, jdbcType=VARCHAR},#{examineImage, jdbcType=VARCHAR},#{createTime, jdbcType=DATE},#{createBy, jdbcType=BIGINT},#{updateTime, jdbcType=DATE},#{updateBy, jdbcType=BIGINT},#{delFlag, jdbcType=BIGINT},
</trim>
on duplicate key update
<trim suffixOverrides=",">
<if test="id != null">
id = #{id,jdbcType=BIGINT},
</if>
status = #{status, jdbcType=INTEGER},
member_id = #{memberId, jdbcType=BIGINT},
task_name = #{taskName, jdbcType=VARCHAR},
task_icon = #{taskIcon, jdbcType=VARCHAR},
task_money = #{taskMoney, jdbcType=DECIMAL},
image = #{image, jdbcType=VARCHAR},
title = #{title, jdbcType=VARCHAR},
theme = #{theme, jdbcType=VARCHAR},
task_end_time = #{taskEndTime, jdbcType=DATE},
task_state = #{taskState, jdbcType=INTEGER},
examine_state = #{examineState, jdbcType=INTEGER},
examine_text = #{examineText, jdbcType=VARCHAR},
examine_image = #{examineImage, jdbcType=VARCHAR},
create_time = #{createTime, jdbcType=DATE},
create_by = #{createBy, jdbcType=BIGINT},
update_time = #{updateTime, jdbcType=DATE},
update_by = #{updateBy, jdbcType=BIGINT},
del_flag = #{delFlag, jdbcType=BIGINT},
</trim>
</insert>
</mapper>

+ 5
- 0
ruoyi-mall/pom.xml View File

@ -18,6 +18,11 @@
<artifactId>ruoyi-common</artifactId>
<version>${ruoyi.version}</version>
</dependency>
<!-- <dependency>-->
<!-- <groupId>com.ruoyi</groupId>-->
<!-- <artifactId>ruoyi-catdog</artifactId>-->
<!-- <version>${ruoyi.version}</version>-->
<!-- </dependency>-->
<dependency>
<groupId>com.ruoyi</groupId>
<artifactId>ruoyi-system</artifactId>


+ 4
- 0
ruoyi-mall/src/main/java/com/cyl/h5/controller/H5AppointmentController.java View File

@ -67,6 +67,10 @@ public class H5AppointmentController {
beanCopier.copy(form, orderSubmitForm, null);
orderSubmitForm.setAddressId(memberAddressVO.getId());
//lzx增加的两个字段
orderSubmitForm.setTeacherId(form.getTeacherId());
orderSubmitForm.setCompanionLevel(form.getCompanionLevel());
redisService.lock(redisKey, redisValue, 60);
Order order = orderService.submit(orderSubmitForm);


+ 6
- 3
ruoyi-mall/src/main/java/com/cyl/h5/controller/H5OrderController.java View File

@ -79,11 +79,12 @@ public class H5OrderController {
return ResponseEntity.ok(service.orderPage(status, member.getId(), pageable));
}
//@ApiOperation("订单列表")
//@ApiOperation("订单列表")这个改了一下
@GetMapping("/listByOpenid")
public ResponseEntity<PageImpl<H5OrderVO>> orderPageByOpenid(Integer status, String openid, Pageable pageable){
public ResponseEntity<PageImpl<H5OrderVO>> orderPageByOpenid(Integer status, String openId, Pageable pageable){
List<Integer> statusList = new ArrayList<>();
if (status == -1) {
statusList.add(0);
statusList.add(1);
statusList.add(2);
statusList.add(3);
@ -91,7 +92,9 @@ public class H5OrderController {
} else {
statusList.add(status);
}
return ResponseEntity.ok(service.orderPageByOpenid(statusList, openid, pageable));
PageImpl<H5OrderVO> h5OrderVOS = service.orderPageByOpenid(statusList, openId, pageable);
return ResponseEntity.ok(h5OrderVOS);
}
//@ApiOperation("订单详情")


+ 7
- 0
ruoyi-mall/src/main/java/com/cyl/h5/pojo/request/CancelOrderRequest.java View File

@ -11,4 +11,11 @@ import java.util.List;
public class CancelOrderRequest {
@ApiModelProperty("要取消的订单id集合")
private List<Long> idList;
@ApiModelProperty("取消订单说明")
private String remark;
@ApiModelProperty("取消订单标识")
private Long id;
}

+ 6
- 0
ruoyi-mall/src/main/java/com/cyl/h5/pojo/vo/H5OrderVO.java View File

@ -89,4 +89,10 @@ public class H5OrderVO {
@TableField(exist = false)
private List<PetVO> petVOList;
private Long teacherId;
private Integer companionLevel;
// @TableField(exist = false)
// private AppletUsersTeacher usersTeacher;
}

+ 8
- 0
ruoyi-mall/src/main/java/com/cyl/h5/pojo/vo/form/AppointmentSubmitForm.java View File

@ -39,5 +39,13 @@ public class AppointmentSubmitForm {
/** 宠物服务列表 */
private List<PetOrderServiceDTO> petOrderServices;
//指定伴宠师
private Long teacherId;
//伴宠师等级
private int companionLevel;
//todo 预留字段 1订单派单方式 2伴宠师名字用于展示3伴宠师 ID
}

+ 9
- 0
ruoyi-mall/src/main/java/com/cyl/h5/pojo/vo/form/OrderSubmitForm.java View File

@ -46,4 +46,13 @@ public class OrderSubmitForm {
/** 宠物服务列表 */
private List<PetOrderServiceDTO> petOrderServices;
//指定伴宠师
private Long teacherId;
//伴宠师等级
private Integer companionLevel;
}

+ 62
- 1
ruoyi-mall/src/main/java/com/cyl/h5/service/H5OrderService.java View File

@ -52,6 +52,8 @@ import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.IDGenerator;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.framework.config.LocalDataUtil;
//import com.ruoyi.model.domain.AppletUsersTeacher;
//import com.ruoyi.model.service.IAppletUsersTeacherService;
import com.wechat.pay.java.service.partnerpayments.jsapi.model.Transaction;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
@ -161,6 +163,14 @@ public class H5OrderService {
@Autowired
private WechatMemberCouponMapper wechatMemberCouponMapper;
@Autowired
private H5PetService h5PetService;
//
// @Autowired
// private IAppletUsersTeacherService appletUsersTeacherService;
@Transactional
public Order submit(OrderSubmitForm form) {
Member member = (Member) LocalDataUtil.getVar(Constants.MEMBER_INFO);
@ -238,6 +248,17 @@ public class H5OrderService {
if(!StringUtils.isEmpty(form.getOrderMethod())){
order.setOrderMethod(form.getOrderMethod());
}
//设置伴宠师ID和下单方式
if(form.getTeacherId() != null){
order.setTeacherId(form.getTeacherId());
}
if(form.getCompanionLevel()!=null){
order.setCompanionLevel(form.getCompanionLevel());
}
order.setNote(form.getNote());
order.setConfirmStatus(0);
@ -746,8 +767,48 @@ public class H5OrderService {
item.setOrderItemList(orderItemMap.get(item.getOrderId()));
OmsOrderService orderServiceInfo = omsOrderServiceService.selectByOrderId(item.getOrderId());
PetVO petVO = h5PetService.selectPetById(orderServiceInfo.getPetId());
orderServiceInfo.setPetVo(petVO);
item.setService(orderServiceInfo);
OmsOrderService omsOrderService = new OmsOrderService();
omsOrderService.setOrderId(item.getOrderId());
List<OmsOrderService> orderServiceList = omsOrderServiceMapper.selectList(omsOrderService);
// 使用一个 Set 来跟踪已经添加的 PetVO id
Set<Integer> addedPetIds = new HashSet<>();
List<PetVO> petVOList = new ArrayList<>();
for (OmsOrderService service1 : orderServiceList) {
// 宠物标识不为空的时候查询数据
if (service1.getPetId() != null) {
PetVO petVO1 = h5PetService.selectPetById(service1.getPetId());
// 检查 petVO id 是否已经添加过
if (petVO1 != null && !addedPetIds.contains(petVO1.getId())) {
service1.setPetVo(petVO1);
petVOList.add(petVO1);
addedPetIds.add(petVO1.getId()); // 标记该 id 已添加
}
}
}
item.setOrderServiceList(orderServiceList);
item.setPetVOList(petVOList);
// item.setUsersTeacher(appletUsersTeacherService.selectAppletUsersTeacherById(item.getTeacherId()));
});
return new PageImpl<>(orderList, pageable, total);
}
@ -1016,7 +1077,7 @@ public class H5OrderService {
//TODO
String payAmount = order.getPayAmount().multiply(new BigDecimal(100)).stripTrailingZeros().toPlainString();
payAmount = "1";//支付一分钱
// payAmount = "1";//支付一分钱
String prepayId = wechatPayService.jsapiPay(
String.valueOf(order.getPayId()),
orderDesc,


+ 10
- 0
ruoyi-mall/src/main/java/com/cyl/manager/oms/domain/Order.java View File

@ -165,4 +165,14 @@ public class Order extends BaseAudit {
@Excel(name = "伴宠师ID")
private Long servicerId;
private Long teacherId;
private Integer companionLevel;
}

+ 11
- 0
ruoyi-mall/src/main/java/com/cyl/manager/oms/mapper/OrderMapper.java View File

@ -14,6 +14,8 @@ import com.cyl.manager.oms.pojo.vo.ManagerOrderVO;
import com.cyl.manager.statistics.pojo.vo.OrderAndAftersaleStatisticsVO;
import com.cyl.manager.ums.pojo.vo.MemberDataStatisticsVO;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
/**
* 订单表Mapper接口
@ -33,6 +35,10 @@ public interface OrderMapper extends BaseMapper<Order> {
List<H5OrderVO> orderPage(@Param("status") Integer status, @Param("memberId")Long memberId);
List<H5OrderVO> orderPage3(@Param("status") List<Integer> status, @Param("memberId") Long memberId);
List<H5OrderVO> orderPage2(@Param("status") List<Integer> status, @Param("memberId")Long memberId);
H5OrderVO selectOrderDetail(Long orderId);
@ -41,6 +47,11 @@ public interface OrderMapper extends BaseMapper<Order> {
Integer cancelBatch(@Param("list") List<Order> orderList);
//修改订单状态为已取消
@Update("update oms_order set status = 4 where id = #{orderId}")
Integer cancelBatchOne(@Param("orderId") Long orderId);
MemberDataStatisticsVO statOrderCountAndAmount(Long memberId);


+ 7
- 0
ruoyi-mall/src/main/java/com/cyl/manager/ums/domain/MemberAddress.java View File

@ -110,4 +110,11 @@ public class MemberAddress extends BaseAudit {
@Excel(name = "STAFF_ID")
private Long staffId;
/** 纬度 */
@Excel(name = "纬度")
private String latitude;
/** 删除标识 */
private Integer delFlag;
}

+ 285
- 265
ruoyi-mall/src/main/java/com/cyl/tencent/TaskConsumer.java View File

@ -1,265 +1,285 @@
package com.cyl.tencent;
import com.cyl.h5.service.H5MemberService;
import com.cyl.h5.service.H5OrderService;
import com.cyl.manager.oms.domain.OmsOrderService;
import com.cyl.manager.oms.domain.Order;
import com.cyl.manager.oms.service.OmsOrderServiceService;
import com.cyl.manager.oms.service.OrderService;
import com.cyl.manager.staff.service.IDispatchOrderService;
import com.cyl.manager.ums.domain.Member;
import com.cyl.manager.ums.domain.MemberPointHistory;
import com.cyl.manager.ums.mapper.MemberMapper;
import com.cyl.manager.ums.service.MemberPointHistoryService;
import com.cyl.manager.ums.service.MemberService;
import com.ruoyi.common.config.properties.SmsProperties;
import com.ruoyi.common.core.sms.AliyunSmsUtils;
import com.ruoyi.common.utils.StringUtils;
import com.wechat.pay.java.core.util.GsonUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Date;
import java.util.List;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.atomic.AtomicReference;
@Slf4j
@Component
public class TaskConsumer implements QueueConsumer {
@Autowired
@Qualifier("taskQueue")
private BlockingQueue<OrderMessageModel> taskQueue;
@Autowired
private MemberPointHistoryService memberPointHistoryService;
@Autowired
private H5MemberService h5MemberService;
@Autowired
private MemberService memberService;
@Autowired
private OrderService orderService;
@Autowired
private OmsOrderServiceService omsOrderServiceService;
@Autowired
private MemberMapper memberMapper;
@Autowired
private SmsProperties smsProperties;
@Autowired
private H5OrderService h5OrderService;
@Autowired
private IDispatchOrderService dispatchedOrdersService;
int threadSize = 2;
private boolean run;
private TaskThread[] taskThreads;
private class TaskThread extends Thread {
@Override
public void run() {
while (run) {
try {
OrderMessageModel model = taskQueue.take();
log.info("消费者消息:" + model);
//处理任务逻辑
log.info("推送订单信息:" + GsonUtil.toJson(model.getOrder()));
//处理积分集点等级
pointHandler(model.getOrder());
//派单订单逻辑处理方法--------lzx
//进行派单操作
dispatchedOrdersService.dispatch(model.getOrder().getId());
//TODO 等待订单逻辑完成
smsHandler(model.getOrder());
} catch (Exception e) {
log.error("task消费异常:{}", e);
}
}
}
}
private void smsHandler(Order order) {
try {
Member member = memberService.selectById(order.getMemberId());
String phone = memberService.getPhoneDecrypted(member.getPhoneEncrypted());
//TODO 查询订单的开始日期和结束日期
List<OmsOrderService> omsOrderServiceList = omsOrderServiceService.selectListByOrderId(order.getId());
AtomicReference<String> startDate = new AtomicReference<>();
AtomicReference<String> endDate = new AtomicReference<>();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
omsOrderServiceList.forEach(item -> {
String serviceDate = item.getServiceDate();
if (StringUtils.isNotEmpty(serviceDate)) {
try {
Date serviceDateDate = sdf.parse(serviceDate);
if (StringUtils.isEmpty(startDate.get())) {
startDate.set(serviceDate);
} else {
if (serviceDateDate.before(sdf.parse(startDate.get()))) {
startDate.set(serviceDate);
}
}
if (StringUtils.isEmpty(endDate.get())) {
endDate.set(serviceDate);
} else {
if (serviceDateDate.after(sdf.parse(endDate.get()))) {
endDate.set(serviceDate);
}
}
} catch (ParseException e) {
log.error("时间解析失败:" + serviceDate);
}
}
});
if (StringUtils.isEmpty(endDate.get()) || StringUtils.isEmpty(startDate.get())) {
return;
}
AliyunSmsUtils util = new AliyunSmsUtils(smsProperties);
AliyunSmsUtils.sendOrderSuccessSMS(phone, startDate.get(), endDate.get());
} catch (Exception e) {
e.printStackTrace();
log.error("【支付回调任务处理】发送短信失败:" + e.getMessage());
}
}
private void pointHandler(Order order) {
BigDecimal amount = order.getPayAmount();
Member member = memberService.selectById(order.getMemberId());
Integer level = member.getLevel();
BigDecimal coefficient = BigDecimal.ZERO;
if (level == 1) {
coefficient = BigDecimal.valueOf(1.1);
} else if ( level == 2) {
coefficient = BigDecimal.valueOf(1.1);
} else if ( level == 3) {
coefficient = BigDecimal.valueOf(1.3);
} else if ( level == 4) {
coefficient = BigDecimal.valueOf(1.5);
} else {
coefficient = BigDecimal.valueOf(1.1);
}
//处理积分
MemberPointHistory point = getPointEntity(member,order,coefficient);
memberPointHistoryService.insertMemberPointHistory(point);
log.info("新增积分明细:{}", point);
//处理集点
MemberPointHistory gather = getGatherEntity(order,member.getCentralPoint());
memberPointHistoryService.insertMemberPointHistory(gather);
log.info("新增集点明细:{}", gather);
//处理等级
//有效订单开始时间为当前时间往前推一年的第一天
// 获取当前日期
LocalDate currentDate = LocalDate.now();
// 获取往前推一年的日期
LocalDate oneYearAgo = currentDate.minusYears(1);
// 获取往前推一年后的第一天1月1日
LocalDate firstDayOfYear = oneYearAgo.withDayOfYear(1);
// 将LocalDate转换为LocalDateTime设置时间为00:00:00
LocalDateTime startOfDay = firstDayOfYear.atStartOfDay();
// 如果需要转换为Date类型
Date startDate = Date.from(startOfDay.atZone(ZoneId.systemDefault()).toInstant());
List<Order> orders = orderService.getOrdersByMemberId(order.getMemberId(),startDate,new Date());
//订单总金额
BigDecimal totalAmount = orders.stream()
.map(Order::getPayAmount) // 获取每个订单的 amount
.reduce(BigDecimal.ZERO, BigDecimal::add); // 累加
int[] levels = h5MemberService.evaluateOrderAmount(totalAmount);
int memberLevel = levels[0];
member.setLevel(memberLevel);
member.setCentralPoint(BigDecimal.valueOf(orders.size()));
member.setIntegral(totalAmount.multiply(coefficient));
memberMapper.updateById(member);
log.info("更新member信息:{}", member);
}
private MemberPointHistory getGatherEntity(Order order, BigDecimal centralPoint) {
MemberPointHistory memberPointHistory = new MemberPointHistory();
memberPointHistory.setMemberId(order.getMemberId());
memberPointHistory.setPoint(BigDecimal.ONE);
memberPointHistory.setType("gather");
memberPointHistory.setTransactionId(order.getId());
memberPointHistory.setDescription("数据手工同步");
memberPointHistory.setAction("added");
memberPointHistory.setPointBefore(centralPoint);
centralPoint = centralPoint.add(BigDecimal.valueOf(1));
memberPointHistory.setPointAfter(centralPoint);
memberPointHistory.setCreateAt(order.getCreateTime());
return memberPointHistory;
}
private MemberPointHistory getPointEntity(Member member,Order order, BigDecimal coefficient) {
MemberPointHistory memberPointHistory = new MemberPointHistory();
memberPointHistory.setMemberId(order.getMemberId());
BigDecimal result = order.getPayAmount().multiply(coefficient);
memberPointHistory.setPoint(result);
memberPointHistory.setType("point");
memberPointHistory.setTransactionId(order.getId());
memberPointHistory.setDescription("订单生成");
memberPointHistory.setAction("added");
memberPointHistory.setPointBefore(member.getIntegral());
BigDecimal pointAfter = member.getIntegral().add(order.getPayAmount().multiply(coefficient));
memberPointHistory.setPointAfter(pointAfter);
memberPointHistory.setCreateAt(order.getCreateTime());
return memberPointHistory;
}
@Override
public void start() {
run = true;
taskThreads = new TaskThread[threadSize];
for (int i = 0; i < threadSize; i++) {
taskThreads [i] = new TaskThread();
taskThreads [i].start();
}
}
@Override
public void stop() {
run = false;
if (taskThreads != null) {
for (TaskThread thread : taskThreads ) {
thread.interrupt();
}
}
}
}
//package com.cyl.tencent;
//
//import com.cyl.h5.pojo.vo.H5OrderVO;
//import com.cyl.h5.service.H5MemberService;
//import com.cyl.h5.service.H5OrderService;
//import com.cyl.manager.oms.domain.OmsOrderService;
//import com.cyl.manager.oms.domain.Order;
//import com.cyl.manager.oms.service.OmsOrderServiceService;
//import com.cyl.manager.oms.service.OrderService;
//import com.cyl.manager.staff.service.IDispatchOrderService;
//import com.cyl.manager.ums.domain.Member;
//import com.cyl.manager.ums.domain.MemberPointHistory;
//import com.cyl.manager.ums.mapper.MemberMapper;
//import com.cyl.manager.ums.service.MemberPointHistoryService;
//import com.cyl.manager.ums.service.MemberService;
//import com.ruoyi.common.config.properties.SmsProperties;
//import com.ruoyi.common.core.sms.AliyunSmsUtils;
//import com.ruoyi.common.utils.StringUtils;
//import com.wechat.pay.java.core.util.GsonUtil;
//import lombok.extern.slf4j.Slf4j;
//import lombok.val;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.beans.factory.annotation.Qualifier;
//import org.springframework.stereotype.Component;
//
//import java.math.BigDecimal;
//import java.text.ParseException;
//import java.text.SimpleDateFormat;
//import java.time.LocalDate;
//import java.time.LocalDateTime;
//import java.time.ZoneId;
//import java.util.Date;
//import java.util.List;
//import java.util.concurrent.BlockingQueue;
//import java.util.concurrent.atomic.AtomicReference;
//
//
//@Slf4j
//@Component
//public class TaskConsumer implements QueueConsumer {
//
//
// @Autowired
// @Qualifier("taskQueue")
// private BlockingQueue<OrderMessageModel> taskQueue;
//
// @Autowired
// private MemberPointHistoryService memberPointHistoryService;
//
// @Autowired
// private H5MemberService h5MemberService;
//
// @Autowired
// private MemberService memberService;
//
// @Autowired
// private OrderService orderService;
//
// @Autowired
// private OmsOrderServiceService omsOrderServiceService;
//
// @Autowired
// private MemberMapper memberMapper;
//
// @Autowired
// private SmsProperties smsProperties;
//
// @Autowired
// private H5OrderService h5OrderService;
//
// @Autowired
// private IDispatchOrderService dispatchedOrdersService;
//
// @Autowired
// private IMallOrderService mallOrderService;
//
// int threadSize = 2;
// private boolean run;
// private TaskThread[] taskThreads;
//
//
//
// private class TaskThread extends Thread {
//
// @Override
// public void run() {
// while (run) {
// try {
// OrderMessageModel model = taskQueue.take();
// log.info("消费者消息:" + model);
// //处理任务逻辑
// log.info("推送订单信息:" + GsonUtil.toJson(model.getOrder()));
// //处理积分集点等级
// pointHandler(model.getOrder());
//
// //派单订单逻辑处理方法--------lzx
// log.info("派单订单逻辑处理方法--------lzx");
// log.info("派单类型:"+model.getOrder().getTeacherId());
// H5OrderVO h5OrderVO = h5OrderService.orderDetail(model.getOrder().getId());
// //如果为空则为系统派单
// if (model.getOrder().getTeacherId() == null) {
// //系统派单
// log.info("系统派单");
//
// mallOrderService.acceptDispatchAll(h5OrderVO);
//
// }else if (model.getOrder().getTeacherId() != null) {
// //指定派单
// log.info("指定派单");
// //获取当前时间
// LocalDateTime now = LocalDateTime.now();
// }
//
//
//
//
//
//
// //进行派单操作
// dispatchedOrdersService.dispatch(model.getOrder().getId());
// //TODO 等待订单逻辑完成
// smsHandler(model.getOrder());
// } catch (Exception e) {
// log.error("task消费异常:{}", e);
// }
// }
// }
// }
//
// private void smsHandler(Order order) {
// try {
// Member member = memberService.selectById(order.getMemberId());
// String phone = memberService.getPhoneDecrypted(member.getPhoneEncrypted());
//
// //TODO 查询订单的开始日期和结束日期
// List<OmsOrderService> omsOrderServiceList = omsOrderServiceService.selectListByOrderId(order.getId());
//
// AtomicReference<String> startDate = new AtomicReference<>();
// AtomicReference<String> endDate = new AtomicReference<>();
//
// SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
//
// omsOrderServiceList.forEach(item -> {
// String serviceDate = item.getServiceDate();
// if (StringUtils.isNotEmpty(serviceDate)) {
// try {
// Date serviceDateDate = sdf.parse(serviceDate);
//
// if (StringUtils.isEmpty(startDate.get())) {
// startDate.set(serviceDate);
// } else {
// if (serviceDateDate.before(sdf.parse(startDate.get()))) {
// startDate.set(serviceDate);
// }
// }
//
// if (StringUtils.isEmpty(endDate.get())) {
// endDate.set(serviceDate);
// } else {
// if (serviceDateDate.after(sdf.parse(endDate.get()))) {
// endDate.set(serviceDate);
// }
// }
// } catch (ParseException e) {
// log.error("时间解析失败:" + serviceDate);
// }
// }
// });
//
// if (StringUtils.isEmpty(endDate.get()) || StringUtils.isEmpty(startDate.get())) {
// return;
// }
//
// AliyunSmsUtils util = new AliyunSmsUtils(smsProperties);
// AliyunSmsUtils.sendOrderSuccessSMS(phone, startDate.get(), endDate.get());
// } catch (Exception e) {
// e.printStackTrace();
// log.error("【支付回调任务处理】发送短信失败:" + e.getMessage());
// }
// }
//
// private void pointHandler(Order order) {
// BigDecimal amount = order.getPayAmount();
// Member member = memberService.selectById(order.getMemberId());
// Integer level = member.getLevel();
// BigDecimal coefficient = BigDecimal.ZERO;
// if (level == 1) {
// coefficient = BigDecimal.valueOf(1.1);
// } else if ( level == 2) {
// coefficient = BigDecimal.valueOf(1.1);
// } else if ( level == 3) {
// coefficient = BigDecimal.valueOf(1.3);
// } else if ( level == 4) {
// coefficient = BigDecimal.valueOf(1.5);
// } else {
// coefficient = BigDecimal.valueOf(1.1);
// }
// //处理积分
// MemberPointHistory point = getPointEntity(member,order,coefficient);
// memberPointHistoryService.insertMemberPointHistory(point);
// log.info("新增积分明细:{}", point);
//
// //处理集点
// MemberPointHistory gather = getGatherEntity(order,member.getCentralPoint());
// memberPointHistoryService.insertMemberPointHistory(gather);
// log.info("新增集点明细:{}", gather);
//
// //处理等级
// //有效订单开始时间为当前时间往前推一年的第一天
// // 获取当前日期
// LocalDate currentDate = LocalDate.now();
// // 获取往前推一年的日期
// LocalDate oneYearAgo = currentDate.minusYears(1);
// // 获取往前推一年后的第一天1月1日
// LocalDate firstDayOfYear = oneYearAgo.withDayOfYear(1);
// // 将LocalDate转换为LocalDateTime设置时间为00:00:00
// LocalDateTime startOfDay = firstDayOfYear.atStartOfDay();
//
// // 如果需要转换为Date类型
// Date startDate = Date.from(startOfDay.atZone(ZoneId.systemDefault()).toInstant());
// List<Order> orders = orderService.getOrdersByMemberId(order.getMemberId(),startDate,new Date());
// //订单总金额
// BigDecimal totalAmount = orders.stream()
// .map(Order::getPayAmount) // 获取每个订单的 amount
// .reduce(BigDecimal.ZERO, BigDecimal::add); // 累加
// int[] levels = h5MemberService.evaluateOrderAmount(totalAmount);
// int memberLevel = levels[0];
// member.setLevel(memberLevel);
// member.setCentralPoint(BigDecimal.valueOf(orders.size()));
// member.setIntegral(totalAmount.multiply(coefficient));
// memberMapper.updateById(member);
// log.info("更新member信息:{}", member);
// }
//
// private MemberPointHistory getGatherEntity(Order order, BigDecimal centralPoint) {
// MemberPointHistory memberPointHistory = new MemberPointHistory();
// memberPointHistory.setMemberId(order.getMemberId());
// memberPointHistory.setPoint(BigDecimal.ONE);
// memberPointHistory.setType("gather");
// memberPointHistory.setTransactionId(order.getId());
// memberPointHistory.setDescription("数据手工同步");
// memberPointHistory.setAction("added");
// memberPointHistory.setPointBefore(centralPoint);
// centralPoint = centralPoint.add(BigDecimal.valueOf(1));
// memberPointHistory.setPointAfter(centralPoint);
// memberPointHistory.setCreateAt(order.getCreateTime());
// return memberPointHistory;
// }
//
// private MemberPointHistory getPointEntity(Member member,Order order, BigDecimal coefficient) {
// MemberPointHistory memberPointHistory = new MemberPointHistory();
// memberPointHistory.setMemberId(order.getMemberId());
// BigDecimal result = order.getPayAmount().multiply(coefficient);
// memberPointHistory.setPoint(result);
// memberPointHistory.setType("point");
// memberPointHistory.setTransactionId(order.getId());
// memberPointHistory.setDescription("订单生成");
// memberPointHistory.setAction("added");
// memberPointHistory.setPointBefore(member.getIntegral());
// BigDecimal pointAfter = member.getIntegral().add(order.getPayAmount().multiply(coefficient));
// memberPointHistory.setPointAfter(pointAfter);
// memberPointHistory.setCreateAt(order.getCreateTime());
// return memberPointHistory;
// }
//
// @Override
// public void start() {
// run = true;
// taskThreads = new TaskThread[threadSize];
// for (int i = 0; i < threadSize; i++) {
// taskThreads [i] = new TaskThread();
// taskThreads [i].start();
// }
// }
//
// @Override
// public void stop() {
// run = false;
// if (taskThreads != null) {
// for (TaskThread thread : taskThreads ) {
// thread.interrupt();
// }
// }
// }
//}

+ 52
- 9
ruoyi-mall/src/main/resources/mapper/oms/OrderMapper.xml View File

@ -45,11 +45,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result property="orderServiceId" column="order_service_id"/>
<result property="orderMethod" column="order_method"/>
<result property="teacherId" column="teacher_id"/>
<result property="companionLevel" column="companion_level"/>
</resultMap>
<sql id="selectOrderVo">
select id, member_id, member_username, total_amount, purchase_price, pay_amount, freight_amount, pay_type, status, aftersale_status, delivery_company, delivery_sn, auto_confirm_day, receiver_name, receiver_phone, receiver_post_code, receiver_province, receiver_city, receiver_district, receiver_province_id, receiver_city_id, receiver_district_id, receiver_detail_address, note, confirm_status, delete_status, payment_time, delivery_time, receive_time, create_by, create_time, update_by, update_time, need_pre_familiarize, wechat_member_coupon_id,servicer_id,order_method from oms_order
select id, member_id, member_username, total_amount, purchase_price, pay_amount, freight_amount, pay_type, status, aftersale_status, delivery_company, delivery_sn, auto_confirm_day, receiver_name, receiver_phone, receiver_post_code, receiver_province, receiver_city, receiver_district, receiver_province_id, receiver_city_id, receiver_district_id, receiver_detail_address, note, confirm_status, delete_status, payment_time, delivery_time, receive_time, create_by, create_time, update_by, update_time, need_pre_familiarize, wechat_member_coupon_id,servicer_id,order_method,teacher_id,companion_level from oms_order
</sql>
<update id="cancelBatch">
<foreach collection="list" item="item" index="index" open="" close="" separator=";">
@ -92,7 +93,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="wechatMemberCouponId != null "> and wechat_member_coupon_id = #{wechatMemberCouponId}</if>
<if test="servicerId != null "> and servicer_id = #{servicerId}</if>
<if test="orderMethod != null "> and order_method = #{orderMethod}</if>
<if test="teacherId != null "> and teacher_id = #{teacherId}</if>
<if test="companionLevel != null "> and companion_level = #{companionLevel}</if>
,
</where>
</select>
@ -223,16 +225,55 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
receiver_province,
receiver_city,
receiver_district,
receiver_detail_address
receiver_detail_address,
teacher_id,
companion_level
from oms_order
where
delete_status=0
and member_id=#{memberId}
<if test="status != null and status.size() != 0">
and status in
<foreach collection="status" item="item" index="index" open="(" close=")" separator=",">
#{item}
</foreach>
and status in (0,1,2,3,4)
<!-- <foreach collection="status" item="item" index="index" open="(" close=")" separator=",">-->
<!-- #{item}-->
<!-- </foreach>-->
</if>
order by create_time desc
</select>
<select id="orderPage3" resultType="com.cyl.h5.pojo.vo.H5OrderVO">
select
id orderId,
pay_id,
order_sn,
member_id,
total_amount,
pay_amount,
status,
aftersale_status,
note,
delivery_sn,
create_time,
payment_time,
receiver_name,
receiver_phone,
receiver_province,
receiver_city,
receiver_district,
receiver_detail_address,
teacher_id,
companion_level
from oms_order
where
delete_status=0
and member_id=#{memberId}
<if test="status != null and status.size() != 0">
and status in (0,1,2,3,4)
<!-- <foreach collection="status" item="item" index="index" open="(" close=")" separator=",">-->
<!-- #{item}-->
<!-- </foreach>-->
</if>
order by create_time desc
</select>
@ -256,7 +297,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
receiver_province,
receiver_city,
receiver_district,
receiver_detail_address
receiver_detail_address,
teacher_id,
companion_level
from oms_order
where
delete_status=0


+ 3
- 1
ruoyi-mall/src/main/resources/mapper/ums/AddressMapper.xml View File

@ -13,10 +13,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result property="createdAt" column="created_at"/>
<result property="updatedAt" column="updated_at"/>
<result property="deletedAt" column="deleted_at"/>
<result property="longitude" column="longitude"/>
<result property="latitude" column="latitude"/>
</resultMap>
<sql id="selectAddressVo">
select id, code, parent_code, name, level, created_at, updated_at, deleted_at from address
select id, code, parent_code, name, level, created_at, updated_at, deleted_at, longitude, latitude from address
</sql>
<select id="selectByEntity" parameterType="Address" resultMap="AddressResult">


Loading…
Cancel
Save