| @ -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(); | |||
| // } | |||
| // } | |||
| // } | |||
| //} | |||