@ -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 | |||
}) | |||
} |
@ -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> |
@ -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 | |||
@ -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); | |||
} | |||
} | |||
} | |||
} |
@ -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("提交失败"); | |||
} | |||
} |
@ -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); | |||
} |
@ -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; | |||
} | |||
} |
@ -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(); | |||
} | |||
} | |||
} | |||
} |
@ -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)); | |||
} | |||
} |
@ -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; | |||
} |
@ -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); | |||
} |
@ -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); | |||
} |
@ -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); | |||
} | |||
} |
@ -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> |
@ -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(); | |||
// } | |||
// } | |||
// } | |||
//} |