Browse Source

修改日订单

master
前端-胡立永 1 week ago
parent
commit
601394dff0
37 changed files with 2402 additions and 448 deletions
  1. +2
    -2
      CatmDogd-Mall-Front-test/.env.development
  2. +61
    -0
      CatmDogd-Mall-Front-test/src/api/model/appletOrderDateFrequency.js
  3. +540
    -0
      CatmDogd-Mall-Front-test/src/components/CheckinDialog.vue
  4. +21
    -20
      CatmDogd-Mall-Front-test/src/components/DictTag/index.vue
  5. +245
    -278
      CatmDogd-Mall-Front-test/src/views/model/AppletIcon/index.vue
  6. +453
    -0
      CatmDogd-Mall-Front-test/src/views/model/appletOrderDateFrequency/index.vue
  7. +1
    -1
      CatmDogd-Mall-Front-test/vue.config.js
  8. +99
    -0
      ruoyi-admin/src/main/java/com/ruoyi/web/core/config/AppletTechnicianInterceptor.java
  9. +3
    -0
      ruoyi-admin/src/main/java/com/ruoyi/web/core/config/H5MemberInterceptor.java
  10. +116
    -120
      ruoyi-admin/src/main/resources/application-druid.yml
  11. +2
    -2
      ruoyi-admin/src/main/resources/application.yml
  12. +3
    -0
      ruoyi-admin/src/test/java/com/fjp/lc/test/common/CommonTest.java
  13. +13
    -0
      ruoyi-admin/src/test/java/com/fjp/lc/test/service/ServiceTest.java
  14. +10
    -0
      ruoyi-catdog/src/main/java/com/ruoyi/applet/contoller/ApiAppletHhrWorkInController.java
  15. +6
    -1
      ruoyi-catdog/src/main/java/com/ruoyi/applet/contoller/ApiAppletOrderController.java
  16. +87
    -0
      ruoyi-catdog/src/main/java/com/ruoyi/applet/contoller/AppletOrderDateFrequencyAppletController.java
  17. +2
    -2
      ruoyi-catdog/src/main/java/com/ruoyi/applet/service/impl/IApiMallOrderServiceImpl.java
  18. +114
    -0
      ruoyi-catdog/src/main/java/com/ruoyi/model/controller/AppletOrderDateFrequencyController.java
  19. +107
    -0
      ruoyi-catdog/src/main/java/com/ruoyi/model/domain/AppletOrderDateFrequency.java
  20. +2
    -2
      ruoyi-catdog/src/main/java/com/ruoyi/model/domain/AppletOrderItem.java
  21. +3
    -3
      ruoyi-catdog/src/main/java/com/ruoyi/model/domain/AppletOrderItemDateLog.java
  22. +3
    -2
      ruoyi-catdog/src/main/java/com/ruoyi/model/mapper/AppBannerMapper.java
  23. +3
    -2
      ruoyi-catdog/src/main/java/com/ruoyi/model/mapper/AppletIconMapper.java
  24. +14
    -0
      ruoyi-catdog/src/main/java/com/ruoyi/model/mapper/AppletOrderDateFrequencyMapper.java
  25. +3
    -1
      ruoyi-catdog/src/main/java/com/ruoyi/model/mapper/AppletOrderItemDateLogMapper.java
  26. +3
    -2
      ruoyi-catdog/src/main/java/com/ruoyi/model/service/IAppletIconService.java
  27. +78
    -0
      ruoyi-catdog/src/main/java/com/ruoyi/model/service/IAppletOrderDateFrequencyService.java
  28. +1
    -1
      ruoyi-catdog/src/main/java/com/ruoyi/model/service/IAppletOrderItemService.java
  29. +3
    -2
      ruoyi-catdog/src/main/java/com/ruoyi/model/service/impl/AppletIconServiceImpl.java
  30. +382
    -0
      ruoyi-catdog/src/main/java/com/ruoyi/model/service/impl/AppletOrderDateFrequencyServiceImpl.java
  31. +1
    -0
      ruoyi-mall/src/main/java/com/cyl/h5/pojo/vo/H5OrderVO.java
  32. +2
    -2
      ruoyi-mall/src/main/java/com/cyl/h5/service/H5OrderService.java
  33. +5
    -0
      ruoyi-mall/src/main/java/com/cyl/manager/oms/domain/OmsOrderService.java
  34. +1
    -1
      ruoyi-mall/src/main/java/com/cyl/manager/oms/mapper/OmsOrderServiceMapper.java
  35. +3
    -3
      ruoyi-mall/src/main/java/com/cyl/manager/oms/service/OmsOrderServiceService.java
  36. +9
    -0
      ruoyi-mall/src/main/java/com/cyl/manager/ums/domain/Pet.java
  37. +1
    -1
      ruoyi-mall/src/main/resources/mapper/oms/OrderServiceMapper.xml

+ 2
- 2
CatmDogd-Mall-Front-test/.env.development View File

@ -6,9 +6,9 @@ VUE_APP_TITLE = 下单伴宠师综合管理平台
# 若依管理系统/开发环境 https://pet-admin.hhlm1688.com/api
# VUE_APP_BASE_API = 'https://api.catmdogd.com'
VUE_APP_BASE_API = 'https://pet-admin.hhlm1688.com/api/'
# VUE_APP_BASE_API = 'https://pet-admin.hhlm1688.com/api/'
# VUE_APP_BASE_API = 'http://h5.xzaiyp.top'
# VUE_APP_BASE_API = 'http://localhost:8002'
VUE_APP_BASE_API = 'http://localhost:8002'
# 路由懒加载
VUE_CLI_BABEL_TRANSPILE_MODULES = true


+ 61
- 0
CatmDogd-Mall-Front-test/src/api/model/appletOrderDateFrequency.js View File

@ -0,0 +1,61 @@
import request from '@/utils/request'
// 查询日订单列表
export function listAppletOrderDateFrequency(query) {
return request({
url: '/model/appletOrderDateFrequency/list',
method: 'get',
params: query
})
}
// 查询日订单详细
export function getAppletOrderDateFrequency(id) {
return request({
url: '/model/appletOrderDateFrequency/' + id,
method: 'get'
})
}
// 查询日订单详细
export function getAppletOrderDateFrequencyCheck(id) {
return request({
url: '/model/appletOrderDateFrequency/check/' + id,
method: 'get'
})
}
// 新增日订单
export function addAppletOrderDateFrequency(data) {
return request({
url: '/model/appletOrderDateFrequency',
method: 'post',
data: data
})
}
// 修改日订单
export function updateAppletOrderDateFrequency(data) {
return request({
url: '/model/appletOrderDateFrequency',
method: 'put',
data: data
})
}
// 删除日订单
export function delAppletOrderDateFrequency(id) {
return request({
url: '/model/appletOrderDateFrequency/' + id,
method: 'delete'
})
}
// 导出日订单
export function exportAppletOrderDateFrequency(query) {
return request({
url: '/model/appletOrderDateFrequency/export',
method: 'get',
params: query
})
}

+ 540
- 0
CatmDogd-Mall-Front-test/src/components/CheckinDialog.vue View File

@ -0,0 +1,540 @@
<template>
<el-dialog title="打卡信息" :visible.sync="visible" width="80%" :before-close="handleClose" class="checkin-dialog">
<div v-loading="loading" class="checkin-content">
<!-- 个人准备 -->
<div class="section">
<div class="section-title">
<span class="title-text">个人准备</span>
</div>
<div class="upload-group">
<div class="upload-item">
<div class="upload-label">手套照片</div>
<div class="image-gallery">
<div v-if="checkinData.gloveImages && checkinData.gloveImages.length > 0"
class="image-list">
<div v-for="(image, index) in checkinData.gloveImages" :key="index" class="image-item"
@click="previewImage(image)">
<img :src="image" alt="手套照片" />
</div>
</div>
<div v-else class="no-data">暂无图片</div>
</div>
</div>
<div class="upload-item">
<div class="upload-label">鞋套照片</div>
<div class="image-gallery">
<div v-if="checkinData.shoeImages && checkinData.shoeImages.length > 0" class="image-list">
<div v-for="(image, index) in checkinData.shoeImages" :key="index" class="image-item"
@click="previewImage(image)">
<img :src="image" alt="鞋套照片" />
</div>
</div>
<div v-else class="no-data">暂无图片</div>
</div>
</div>
</div>
</div>
<!-- 宠物状态记录 -->
<div class="section">
<div class="section-title">
<span class="title-text">宠物状态记录</span>
</div>
<div v-if="checkinData.petList && checkinData.petList.length > 0">
<div v-for="(pet, index) in checkinData.petList" :key="index" class="pet-item">
<div class="upload-label">{{ pet.title }}照片</div>
<div class="image-gallery">
<div v-if="pet.images && pet.images.length > 0" class="image-list">
<div
v-for="(image, imgIndex) in pet.images"
:key="imgIndex"
class="image-item"
@click="previewImage(image)"
>
<img :src="image" alt="宠物状态照片" />
</div>
</div>
<div v-else class="no-data">暂无图片</div>
</div>
</div>
</div>
<div v-else class="no-data">暂无宠物数据</div>
</div>
<!-- 基础服务记录 -->
<div class="section">
<div class="section-title">
<span class="title-text">基础服务记录</span>
</div>
<div class="service-item">
<div class="service-label">粮碗前后对比</div>
<div class="compare-container">
<div class="compare-item">
<div class="compare-label"></div>
<div class="image-gallery">
<div v-if="checkinData.groomingBeforeImages && checkinData.groomingBeforeImages.length > 0"
class="image-list">
<div v-for="(image, index) in checkinData.groomingBeforeImages" :key="index"
class="image-item" @click="previewImage(image)">
<img :src="image" alt="粮碗前照片" />
</div>
</div>
<div v-else class="no-data">暂无图片</div>
</div>
</div>
<div class="compare-item">
<div class="compare-label"></div>
<div class="image-gallery">
<div v-if="checkinData.groomingAfterImages && checkinData.groomingAfterImages.length > 0"
class="image-list">
<div v-for="(image, index) in checkinData.groomingAfterImages" :key="index"
class="image-item" @click="previewImage(image)">
<img :src="image" alt="粮碗后照片" />
</div>
</div>
<div v-else class="no-data">暂无图片</div>
</div>
</div>
</div>
</div>
<div class="service-item">
<div class="service-label">水碗前后对比</div>
<div class="compare-container">
<div class="compare-item">
<div class="compare-label"></div>
<div class="image-gallery">
<div v-if="checkinData.waterBowlBeforeImages && checkinData.waterBowlBeforeImages.length > 0"
class="image-list">
<div v-for="(image, index) in checkinData.waterBowlBeforeImages" :key="index"
class="image-item" @click="previewImage(image)">
<img :src="image" alt="水碗前照片" />
</div>
</div>
<div v-else class="no-data">暂无图片</div>
</div>
</div>
<div class="compare-item">
<div class="compare-label"></div>
<div class="image-gallery">
<div v-if="checkinData.waterBowlAfterImages && checkinData.waterBowlAfterImages.length > 0"
class="image-list">
<div v-for="(image, index) in checkinData.waterBowlAfterImages" :key="index"
class="image-item" @click="previewImage(image)">
<img :src="image" alt="水碗后照片" />
</div>
</div>
<div v-else class="no-data">暂无图片</div>
</div>
</div>
</div>
</div>
<div class="service-item">
<div class="service-label">猫砂盆尿垫前后对比</div>
<div class="compare-container">
<div class="compare-item">
<div class="compare-label"></div>
<div class="image-gallery">
<div v-if="checkinData.basinBeforeImages && checkinData.basinBeforeImages.length > 0"
class="image-list">
<div v-for="(image, index) in checkinData.basinBeforeImages" :key="index"
class="image-item" @click="previewImage(image)">
<img :src="image" alt="猫砂盆前照片" />
</div>
</div>
<div v-else class="no-data">暂无图片</div>
</div>
</div>
<div class="compare-item">
<div class="compare-label"></div>
<div class="image-gallery">
<div v-if="checkinData.basinAfterImages && checkinData.basinAfterImages.length > 0"
class="image-list">
<div v-for="(image, index) in checkinData.basinAfterImages" :key="index"
class="image-item" @click="previewImage(image)">
<img :src="image" alt="猫砂盆后照片" />
</div>
</div>
<div v-else class="no-data">暂无图片</div>
</div>
</div>
</div>
</div>
</div>
<!-- 定制服务记录 -->
<div class="section" v-if="checkinData.projectList && checkinData.projectList.length > 0">
<div class="section-title">
<span class="title-text">定制服务记录</span>
</div>
<div v-for="(project, index) in checkinData.projectList" :key="index" class="project-item">
<div class="upload-label">{{ project.title }}</div>
<div class="image-gallery">
<div v-if="project.images && project.images.length > 0" class="image-list">
<div
v-for="(image, imgIndex) in project.images"
:key="imgIndex"
class="image-item"
@click="previewImage(image)"
>
<img :src="image" alt="定制服务照片" />
</div>
</div>
<div v-else class="no-data">暂无图片</div>
</div>
</div>
</div>
<!-- 其他补充信息 -->
<div class="section" v-if="checkinData.notes">
<div class="section-title">
<span class="title-text">其他补充信息</span>
</div>
<div class="notes-content">
{{ checkinData.notes }}
</div>
</div>
</div>
<div slot="footer" class="dialog-footer">
<el-button @click="handleClose"> </el-button>
</div>
<!-- 图片预览弹窗 -->
<el-dialog title="图片预览" :visible.sync="previewVisible" width="60%" class="image-preview-dialog">
<div class="preview-container">
<img :src="previewImageUrl" alt="预览图片" style="max-width: 100%; max-height: 500px;" />
</div>
</el-dialog>
</el-dialog>
</template>
<script>
import { getAppletOrderDateFrequencyCheck } from "@/api/model/appletOrderDateFrequency";
export default {
name: 'CheckinDialog',
props: {
value: {
type: Boolean,
default: false
},
orderData: {
type: Object,
default: () => ({})
}
},
data() {
return {
visible: this.value,
loading: false,
checkinData: {},
previewVisible: false,
previewImageUrl: ''
}
},
watch: {
value(val) {
this.visible = val
if (val && this.orderData.id) {
this.loadCheckinData()
}
},
visible(val) {
this.$emit('input', val)
}
},
methods: {
//
loadCheckinData() {
this.loading = true
getAppletOrderDateFrequencyCheck(this.orderData.id).then(response => {
if (response.code === 200) {
const data = response.data || {}
//
this.checkinData = {
// -
gloveImages: data.glovePhoto ? [data.glovePhoto] : [],
// -
shoeImages: data.shoeCoverPhoto ? [data.shoeCoverPhoto] : [],
//
groomingBeforeImages: data.grainBowlFront ? [data.grainBowlFront] : [],
groomingAfterImages: data.grainBowlAfter ? [data.grainBowlAfter] : [],
//
waterBowlBeforeImages: data.waterBowlFront ? [data.waterBowlFront] : [],
waterBowlAfterImages: data.waterBowlAfter ? [data.waterBowlAfter] : [],
// /尿
basinBeforeImages: data.basinFront ? [data.basinFront] : [],
basinAfterImages: data.basinAfter ? [data.basinAfter] : [],
//
petList: this.parsePetList(data.petPhoto),
//
projectList: this.parseProjectList(data.workDogImage),
//
notes: data.notes
}
} else {
this.$message.error('获取打卡数据失败')
this.checkinData = {}
}
this.loading = false
}).catch(error => {
console.error('获取打卡数据失败:', error)
this.$message.error('获取打卡数据失败')
this.checkinData = {}
this.loading = false
})
},
// JSON
parseImageArray(...jsonStrings) {
let images = []
jsonStrings.forEach(jsonStr => {
if (jsonStr) {
try {
const parsed = JSON.parse(jsonStr)
if (Array.isArray(parsed)) {
parsed.forEach(item => {
if (item.fileList) {
// fileList
const fileList = item.fileList.split(',').filter(url => url.trim())
images.push(...fileList)
}
})
}
} catch (e) {
console.warn('解析图片数据失败:', e)
}
}
})
return images
},
//
previewImage(imageUrl) {
this.previewImageUrl = imageUrl
this.previewVisible = true
},
//
handleClose() {
this.visible = false
this.checkinData = {}
},
//
parsePetList(petPhoto) {
if (petPhoto) {
try {
const petList = JSON.parse(petPhoto)
return petList.map(pet => ({
title: pet.title,
images: pet.fileList ? pet.fileList.split(',').filter(url => url.trim()) : []
}))
} catch (e) {
console.warn('解析宠物数据失败:', e)
return []
}
}
return []
},
//
parseProjectList(workDogImage) {
if (workDogImage) {
try {
const projectList = JSON.parse(workDogImage)
return projectList.map(project => ({
title: project.title,
images: project.fileList ? project.fileList.split(',').filter(url => url.trim()) : []
}))
} catch (e) {
console.warn('解析定制服务数据失败:', e)
return []
}
}
return []
}
}
}
</script>
<style lang="scss" scoped>
.checkin-dialog {
.checkin-content {
max-height: 70vh;
overflow-y: auto;
}
.section {
margin-bottom: 30px;
padding: 20px;
border: 1px solid #e4e7ed;
border-radius: 6px;
background-color: #fafafa;
.section-title {
margin-bottom: 20px;
.title-text {
font-size: 16px;
font-weight: bold;
color: #ff9500;
position: relative;
&::before {
content: '';
position: absolute;
left: -10px;
top: 50%;
transform: translateY(-50%);
width: 4px;
height: 16px;
background-color: #ff9500;
border-radius: 2px;
}
}
}
}
.upload-group {
display: flex;
gap: 40px;
flex-wrap: wrap;
}
.upload-item {
flex: 1;
min-width: 300px;
.upload-label {
margin-bottom: 10px;
font-weight: 500;
color: #333;
}
}
.pet-item,
.project-item {
margin-bottom: 20px;
.upload-label {
margin-bottom: 10px;
font-weight: 500;
color: #333;
}
}
.notes-content {
padding: 15px;
background-color: #f5f5f5;
border-radius: 8px;
border: 1px solid #e4e7ed;
color: #606266;
font-size: 14px;
line-height: 1.6;
white-space: pre-wrap;
word-break: break-word;
}
.service-item {
margin-bottom: 30px;
.service-label {
margin-bottom: 15px;
font-weight: 500;
color: #333;
}
.compare-container {
display: flex;
gap: 40px;
.compare-item {
flex: 1;
.compare-label {
text-align: center;
margin-bottom: 10px;
font-weight: 500;
color: #666;
}
}
}
}
.image-gallery {
min-height: 100px;
.image-list {
display: flex;
flex-wrap: wrap;
gap: 10px;
.image-item {
width: 100px;
height: 100px;
border: 1px solid #d9d9d9;
border-radius: 6px;
overflow: hidden;
cursor: pointer;
transition: all 0.3s;
&:hover {
border-color: #409eff;
transform: scale(1.05);
}
img {
width: 100%;
height: 100%;
object-fit: cover;
}
}
}
.no-data {
display: flex;
align-items: center;
justify-content: center;
height: 100px;
color: #999;
font-size: 14px;
border: 1px dashed #d9d9d9;
border-radius: 6px;
background-color: #fafafa;
}
}
}
.dialog-footer {
text-align: right;
padding-top: 20px;
border-top: 1px solid #e4e7ed;
}
.image-preview-dialog {
.preview-container {
text-align: center;
}
}
</style>

+ 21
- 20
CatmDogd-Mall-Front-test/src/components/DictTag/index.vue View File

@ -1,29 +1,30 @@
<template>
<el-tag :type="valueType">{{valueLabel}}</el-tag>
<el-tag :type="valueType">{{ valueLabel }}</el-tag>
</template>
<script>
import {mapGetters} from "vuex";
import { mapGetters } from "vuex";
export default {
props: ["value", "propName", 'options'],
computed: {
...mapGetters(['dictMap']),
options1() {
if (this.options) {
return this.options;
}
if (!this.propName) {
return [];
}
return this.dictMap[this.propName] || []
props: ["value", "propName", 'options'],
computed: {
...mapGetters(['dictMap']),
options1() {
if (this.options) {
return this.options;
}
if (!this.propName) {
return [];
}
return this.dictMap[this.propName] || []
},
valueLabel() {
return this.options1.find(it => it.value === this.value || it.value == this.value)?.label;
},
valueType() {
let data = this.options1.find(it => it.value === this.value || it.value == this.value)
return data && (data.listClass || data.raw.listClass);
}
},
valueLabel() {
return this.options1.find(it => it.value === this.value || it.value == this.value)?.label;
},
valueType() {
return this.options1.find(it => it.value === this.value || it.value == this.value)?.listClass;
}
},
};
</script>

+ 245
- 278
CatmDogd-Mall-Front-test/src/views/model/AppletIcon/index.vue View File

@ -1,310 +1,277 @@
<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="名称" prop="name">
<el-input
v-model="queryParams.name"
placeholder="请输入名称"
clearable
size="small"
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="地址" prop="url">
<el-input
v-model="queryParams.url"
placeholder="请输入地址"
clearable
size="small"
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="类别" prop="type">
<el-select v-model="queryParams.type" placeholder="请选择类别" clearable size="small">
</el-select>
</el-form-item>
<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-form-item>
</el-form>
<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="名称" prop="name">
<el-input v-model="queryParams.name" placeholder="请输入名称" clearable size="small"
@keyup.enter.native="handleQuery" />
</el-form-item>
<el-form-item label="地址" prop="url">
<el-input v-model="queryParams.url" placeholder="请输入地址" clearable size="small"
@keyup.enter.native="handleQuery" />
</el-form-item>
<el-form-item label="类别" prop="type">
<el-select v-model="queryParams.type" placeholder="请选择类别" clearable size="small">
<el-option
v-for="dict in dict.type.applet_icon_type"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<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-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:AppletIcon: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:AppletIcon: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:AppletIcon: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:AppletIcon:export']"
>导出</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList" :columns="columns"></right-toolbar>
</el-row>
<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:AppletIcon: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:AppletIcon: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:AppletIcon: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:AppletIcon:export']">导出</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList" :columns="columns"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="AppletIconList" @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="name" v-if="columns[0].visible"/>
<el-table-column label="图标" align="center" prop="image" v-if="columns[1].visible"/>
<el-table-column label="地址" align="center" prop="url" v-if="columns[2].visible"/>
<el-table-column label="类别" align="center" prop="type" v-if="columns[3].visible"/>
<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:AppletIcon:edit']"
>修改</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPermi="['model:AppletIcon: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-table v-loading="loading" :data="AppletIconList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="ID" align="center" prop="id" />
<el-table-column label="名称" align="center" prop="name" v-if="columns[0].visible" />
<el-table-column label="图标" align="center" prop="image" v-if="columns[1].visible" />
<el-table-column label="地址" align="center" prop="url" v-if="columns[2].visible" />
<el-table-column label="类别" align="center" prop="type" v-if="columns[3].visible" >
<template slot-scope="scope">
<dict-tag :options="dict.type.applet_icon_type" :value="scope.row.type"/>
</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:AppletIcon:edit']">修改</el-button>
<el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
v-hasPermi="['model:AppletIcon:remove']">删除</el-button>
</template>
</el-table-column>
</el-table>
<!-- 添加或修改跳转图标菜单对话框 -->
<el-dialog :title="title" :visible.sync="open" width="50%" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="108px" inline class="dialog-form-two">
<el-form-item label="名称" prop="name">
<el-input v-model="form.name" placeholder="请输入名称" />
</el-form-item>
<el-form-item label="图标">
<imageUpload v-model="form.image"/>
</el-form-item>
<el-form-item label="地址" prop="url">
<el-input v-model="form.url" placeholder="请输入地址" />
</el-form-item>
<el-form-item label="逻辑删除标识" prop="delFlag">
<el-input v-model="form.delFlag" placeholder="请输入逻辑删除标识" />
</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>
<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" inline class="dialog-form-two">
<el-form-item label="名称" prop="name">
<el-input v-model="form.name" placeholder="请输入名称" />
</el-form-item>
<el-form-item label="图标">
<!-- <imageUpload v-model="form.image" /> -->
<el-input v-model="form.image" placeholder="请输入图标" />
</el-form-item>
<el-form-item label="地址" prop="url">
<el-input v-model="form.url" placeholder="请输入地址" />
</el-form-item>
<el-form-item label="类别" prop="type">
<el-radio-group v-model="form.type">
<el-radio
v-for="dict in dict.type.applet_icon_type"
:key="dict.value"
:label="dict.value"
>{{dict.label}}</el-radio>
</el-radio-group>
</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 { listAppletIcon, getAppletIcon, delAppletIcon, addAppletIcon, updateAppletIcon, exportAppletIcon } from "@/api/model/AppletIcon";
export default {
name: "AppletIcon",
data() {
return {
//
loading: true,
//
exportLoading: false,
//
ids: [],
//
single: true,
//
multiple: true,
//
showSearch: true,
//
total: 0,
//
AppletIconList: [],
//
title: "",
//
open: false,
//
queryParams: {
pageNum: 1,
pageSize: 10,
name: null,
name: "AppletIcon",
dicts: ['applet_icon_type'],
data() {
return {
//
loading: true,
//
exportLoading: false,
//
ids: [],
//
single: true,
//
multiple: true,
//
showSearch: true,
//
total: 0,
//
AppletIconList: [],
//
title: "",
//
open: false,
//
queryParams: {
pageNum: 1,
pageSize: 10,
name: null,
image: null,
image: null,
url: null,
url: null,
type: null,
type: null,
},
//
form: {},
//
rules: {
},
columns: [
{ key: 1, label: "名称", visible: true },
{ key: 2, label: "图标", visible: false },
{ key: 3, label: "地址", visible: true },
{ key: 4, label: "类别", visible: true },
],
};
},
created() {
this.getList();
},
methods: {
/** 查询跳转图标菜单列表 */
getList() {
this.loading = true;
listAppletIcon(this.queryParams).then(response => {
this.AppletIconList = response.rows;
this.total = response.total;
this.loading = false;
});
},
//
form: {},
//
rules: {
},
columns: [
{ key: 1, label: "名称", visible: true },
{ key: 2, label: "图标", visible: false },
{ key: 3, label: "地址", visible: true },
{ key: 4, label: "类别", visible: true },
],
};
},
//
cancel() {
this.open = false;
this.reset();
created() {
this.getList();
},
//
reset() {
this.form = {
id: null,
methods: {
/** 查询跳转图标菜单列表 */
getList() {
this.loading = true;
listAppletIcon(this.queryParams).then(response => {
this.AppletIconList = response.rows;
this.total = response.total;
this.loading = false;
});
},
//
cancel() {
this.open = false;
this.reset();
},
//
reset() {
this.form = {
id: null,
name: null,
name: null,
image: null,
image: null,
url: null,
url: null,
type: null,
type: null,
createTime: null,
createTime: null,
createBy: null,
createBy: null,
updateTime: null,
updateTime: null,
updateBy: null,
updateBy: null,
delFlag: 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
getAppletIcon(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) {
updateAppletIcon(this.form).then(response => {
this.$modal.msgSuccess("修改成功");
this.open = false;
this.getList();
};
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
getAppletIcon(id).then(response => {
this.form = response.data;
this.open = true;
this.title = "修改跳转图标菜单";
});
} else {
addAppletIcon(this.form).then(response => {
this.$modal.msgSuccess("新增成功");
this.open = false;
this.getList();
},
/** 提交按钮 */
submitForm() {
this.$refs["form"].validate(valid => {
if (valid) {
if (this.form.id != null) {
updateAppletIcon(this.form).then(response => {
this.$modal.msgSuccess("修改成功");
this.open = false;
this.getList();
});
} else {
addAppletIcon(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 delAppletIcon(ids);
}).then(() => {
this.getList();
this.$modal.msgSuccess("删除成功");
}).catch(() => { });
},
/** 导出按钮操作 */
handleExport() {
const queryParams = this.queryParams;
this.$modal.confirm('是否确认导出所有跳转图标菜单数据项?').then(() => {
this.exportLoading = true;
return exportAppletIcon(queryParams);
}).then(response => {
this.download(response.msg);
this.exportLoading = false;
}).catch(() => { });
}
});
},
/** 删除按钮操作 */
handleDelete(row) {
const ids = row.id || this.ids;
this.$modal.confirm('是否确认删除跳转图标菜单编号为"' + ids + '"的数据项?').then(function() {
return delAppletIcon(ids);
}).then(() => {
this.getList();
this.$modal.msgSuccess("删除成功");
}).catch(() => {});
},
/** 导出按钮操作 */
handleExport() {
const queryParams = this.queryParams;
this.$modal.confirm('是否确认导出所有跳转图标菜单数据项?').then(() => {
this.exportLoading = true;
return exportAppletIcon(queryParams);
}).then(response => {
this.download(response.msg);
this.exportLoading = false;
}).catch(() => {});
}
}
};
</script>

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

@ -0,0 +1,453 @@
<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="订单ID" prop="orderId">
<el-input v-model="queryParams.orderId" placeholder="请输入订单ID" clearable size="small"
@keyup.enter.native="handleQuery" />
</el-form-item>
<el-form-item label="服务日期" prop="serviceDate">
<el-input v-model="queryParams.serviceDate" placeholder="请输入服务日期" clearable size="small"
@keyup.enter.native="handleQuery" />
</el-form-item>
<!-- <el-form-item label="省份" prop="receiverProvince">
<el-input v-model="queryParams.receiverProvince" placeholder="请输入省份" clearable size="small"
@keyup.enter.native="handleQuery" />
</el-form-item>
<el-form-item label="城市" prop="receiverCity">
<el-input v-model="queryParams.receiverCity" placeholder="请输入城市" clearable size="small"
@keyup.enter.native="handleQuery" />
</el-form-item> -->
<!-- <el-form-item label="区县" prop="receiverDistrict">
<el-input
v-model="queryParams.receiverDistrict"
placeholder="请输入区县"
clearable
size="small"
@keyup.enter.native="handleQuery"
/>
</el-form-item> -->
<el-form-item label="伴宠师" prop="masterId">
<el-input v-model="queryParams.masterId" placeholder="请输入伴宠师" clearable size="small"
@keyup.enter.native="handleQuery" />
</el-form-item>
<el-form-item label="下单用户" prop="userId">
<el-input v-model="queryParams.userId" placeholder="请输入下单用户" clearable size="small"
@keyup.enter.native="handleQuery" />
</el-form-item>
<el-form-item label="完成状态" prop="status">
<el-select v-model="queryParams.status" placeholder="请选择完成状态" clearable size="small">
<el-option v-for="dict in dict.type.order_check_status" :key="dict.value" :label="dict.label"
:value="dict.value" />
</el-select>
</el-form-item>
<!-- <template v-if="showMoreCondition">
<el-form-item label="完成状态" prop="status">
<el-select v-model="queryParams.status" placeholder="请选择完成状态" clearable size="small">
<el-option
v-for="dict in dict.type.order_check_status"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</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:appletOrderDateFrequency: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:appletOrderDateFrequency: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:appletOrderDateFrequency: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:appletOrderDateFrequency:export']"
>导出</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList" :columns="columns"></right-toolbar>
</el-row> -->
<el-table v-loading="loading" :data="appletOrderDateFrequencyList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="编号" align="center" prop="id" width="100px"/>
<el-table-column label="订单ID" align="center" prop="orderId" v-if="columns[0].visible" width="120px"/>
<el-table-column label="服务日期" align="center" prop="serviceDate" v-if="columns[1].visible" width="100px"/>
<!-- <el-table-column label="省份" align="center" prop="receiverProvince" v-if="columns[2].visible"/> -->
<el-table-column label="城市" align="center" prop="receiverCity" v-if="columns[3].visible">
<template slot-scope="scope">
{{ scope.row.receiverProvince }}{{ scope.row.receiverCity }}{{ scope.row.receiverDistrict }}
</template>
</el-table-column>
<!-- <el-table-column label="区县" align="center" prop="receiverDistrict" v-if="columns[4].visible"/> -->
<el-table-column label="接单伴宠师" align="center" prop="masterId" v-if="columns[5].visible" width="180px">
<template slot-scope="scope">
<div style="display: flex; align-items: center; justify-content: center;">
<!-- 左侧头像 -->
<div style="margin-right: 10px;">
<el-avatar :size="40" :src="scope.row.master.userImage" icon="el-icon-user-solid"
style="background-color: #409EFF;">
</el-avatar>
</div>
<!-- 右侧信息上下布局 -->
<div style="display: flex; flex-direction: column; align-items: flex-start;">
<div style="font-weight: bold; margin-bottom: 2px;">
{{ scope.row.master.userName || '未分配' }}
</div>
<div style="font-size: 12px; color: #999;">
ID: {{ scope.row.masterId || '--' }}
</div>
</div>
</div>
</template>
</el-table-column>
<el-table-column label="下单用户" align="center" prop="userId" v-if="columns[6].visible" width="140px">
<template slot-scope="scope">
<div style="display: flex; align-items: center; justify-content: center;">
<div style="display: flex; flex-direction: column; align-items: flex-start;">
<div style="font-weight: bold; margin-bottom: 2px;">
{{ scope.row.user.nickname || '未分配' }}
</div>
<div style="font-size: 12px; color: #999;">
ID: {{ scope.row.userId || '--' }}
</div>
</div>
</div>
</template>
</el-table-column>
<el-table-column label="宠物" align="center" prop="status" v-if="columns[7].visible">
<template slot-scope="scope">
<div style="display: flex; align-items: center; justify-content: center;"
v-for="(pet, index) in scope.row.pets"
:key="index">
<!-- 左侧头像 -->
<div style="margin-right: 10px;">
<el-avatar :size="40" :src="pet.photo" icon="el-icon-user-solid"
style="background-color: #409EFF;">
</el-avatar>
</div>
<!-- 右侧信息上下布局 -->
<div style="display: flex; flex-direction: column; align-items: flex-start;">
<div style="margin-bottom: 2px;">
{{ pet.name }} | {{ pet.breed }} | {{ pet.bodyType }}
</div>
<div style="font-size: 12px; color: #999;">
{{ pet.orderItemList.map(n => n.productName).join(',') }}
</div>
</div>
</div>
</template>
</el-table-column>
<el-table-column label="完成状态" align="center" prop="status" v-if="columns[7].visible" width="100px">
<template slot-scope="scope">
<dict-tag :options="dict.type.order_check_status" :value="scope.row.status" />
</template>
</el-table-column>
<el-table-column label="完成时间" align="center" prop="completionTime" v-if="columns[8].visible" width="130px"/>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="120px">
<template slot-scope="scope">
<!-- <el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
v-hasPermi="['model:appletOrderDateFrequency:edit']"
>修改</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPermi="['model:appletOrderDateFrequency:remove']"
>删除</el-button> -->
<el-button size="mini" type="text" icon="el-icon-full-screen"
@click="handleCheckin(scope.row)">打卡信息</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" inline class="dialog-form-two">
<el-form-item label="下单端订单ID" prop="orderId">
<el-input v-model="form.orderId" placeholder="请输入下单端订单ID" />
</el-form-item>
<el-form-item label="服务日期" prop="serviceDate">
<el-input v-model="form.serviceDate" placeholder="请输入服务日期" />
</el-form-item>
<el-form-item label="省份" prop="receiverProvince">
<el-input v-model="form.receiverProvince" placeholder="请输入省份" />
</el-form-item>
<el-form-item label="城市" prop="receiverCity">
<el-input v-model="form.receiverCity" placeholder="请输入城市" />
</el-form-item>
<el-form-item label="区县" prop="receiverDistrict">
<el-input v-model="form.receiverDistrict" placeholder="请输入区县" />
</el-form-item>
<el-form-item label="伴宠师" prop="masterId">
<el-input v-model="form.masterId" placeholder="请输入伴宠师" />
</el-form-item>
<el-form-item label="下单用户" prop="userId">
<el-input v-model="form.userId" placeholder="请输入下单用户" />
</el-form-item>
<el-form-item label="完成状态">
<el-radio-group v-model="form.status">
<el-radio v-for="dict in dict.type.order_check_status" :key="dict.value"
:label="parseInt(dict.value)">{{ dict.label }}</el-radio>
</el-radio-group>
</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>
<!-- 打卡弹窗 -->
<checkin-dialog
v-model="checkinDialogVisible"
:order-data="currentOrderData">
</checkin-dialog>
</div>
</template>
<script>
import { listAppletOrderDateFrequency,
getAppletOrderDateFrequencyCheck,
getAppletOrderDateFrequency, delAppletOrderDateFrequency, addAppletOrderDateFrequency, updateAppletOrderDateFrequency, exportAppletOrderDateFrequency } from "@/api/model/appletOrderDateFrequency";
import CheckinDialog from "@/components/CheckinDialog.vue";
export default {
name: "AppletOrderDateFrequency",
dicts: ['order_check_status'],
components: {
CheckinDialog
},
data() {
return {
//
loading: true,
//
exportLoading: false,
//
ids: [],
//
single: true,
//
multiple: true,
//
showSearch: true,
//
total: 0,
//
appletOrderDateFrequencyList: [],
//
title: "",
//
open: false,
//
checkinDialogVisible: false,
//
currentOrderData: {},
//
queryParams: {
pageNum: 1,
pageSize: 10,
orderId: null,
serviceDate: null,
receiverProvince: null,
receiverCity: null,
receiverDistrict: null,
masterId: null,
userId: null,
status: null,
},
//
form: {},
//
rules: {
orderId: [
{ required: true, message: "下单端订单ID不能为空", trigger: "blur" }
],
serviceDate: [
{ required: true, message: "服务日期不能为空", trigger: "blur" }
],
},
columns: [
{ key: 1, label: "下单端订单ID", visible: true },
{ key: 2, label: "服务日期", visible: true },
{ key: 5, label: "省份", visible: true },
{ key: 6, label: "城市", visible: true },
{ key: 7, label: "区县", visible: true },
{ key: 9, label: "伴宠师", visible: true },
{ key: 10, label: "下单用户", visible: true },
{ key: 11, label: "完成状态", visible: true },
{ key: 12, label: "完成时间", visible: true },
{ key: 13, label: "宠物信息", visible: true },
],
showMoreCondition: false
};
},
created() {
this.getList();
},
methods: {
/** 查询日订单列表 */
getList() {
this.loading = true;
listAppletOrderDateFrequency(this.queryParams).then(response => {
this.appletOrderDateFrequencyList = response.rows;
this.total = response.total;
this.loading = false;
});
},
//
cancel() {
this.open = false;
this.reset();
},
//
reset() {
this.form = {
id: null,
orderId: null,
serviceDate: null,
serviceExpected: null,
petId: null,
receiverProvince: null,
receiverCity: null,
receiverDistrict: null,
receiverDetailAddress: null,
masterId: null,
userId: null,
status: 0,
completionTime: null,
createBy: null,
createTime: null,
updateBy: null,
updateTime: 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
getAppletOrderDateFrequency(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) {
updateAppletOrderDateFrequency(this.form).then(response => {
this.$modal.msgSuccess("修改成功");
this.open = false;
this.getList();
});
} else {
addAppletOrderDateFrequency(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 delAppletOrderDateFrequency(ids);
}).then(() => {
this.getList();
this.$modal.msgSuccess("删除成功");
}).catch(() => { });
},
/** 导出按钮操作 */
handleExport() {
const queryParams = this.queryParams;
this.$modal.confirm('是否确认导出所有日订单数据项?').then(() => {
this.exportLoading = true;
return exportAppletOrderDateFrequency(queryParams);
}).then(response => {
this.download(response.msg);
this.exportLoading = false;
}).catch(() => { });
},
handleCheckin(row) {
this.currentOrderData = row;
this.checkinDialogVisible = true;
}
}
};
</script>

+ 1
- 1
CatmDogd-Mall-Front-test/vue.config.js View File

@ -35,7 +35,7 @@ module.exports = {
proxy: {
// detail: https://cli.vuejs.org/config/#devserver-proxy
[process.env.VUE_APP_BASE_API]: {
target: `http://localhost:8080`,
target: `http://localhost:8002`,
changeOrigin: true,
pathRewrite: {
['^' + process.env.VUE_APP_BASE_API]: ''


+ 99
- 0
ruoyi-admin/src/main/java/com/ruoyi/web/core/config/AppletTechnicianInterceptor.java View File

@ -0,0 +1,99 @@
package com.ruoyi.web.core.config;
import com.cyl.manager.staff.domain.Staff;
import com.cyl.manager.staff.service.IStaffService;
import com.cyl.manager.ums.domain.Member;
import com.cyl.manager.ums.service.MemberService;
import com.cyl.manager.ums.service.MemberWechatService;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.constant.HttpStatus;
import com.ruoyi.common.core.domain.model.LoginMember;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.framework.config.LocalDataUtil;
import com.ruoyi.framework.web.service.TokenService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//@Configuration
public class AppletTechnicianInterceptor extends HandlerInterceptorAdapter {
@Autowired
private TokenService tokenService;
@Autowired
private MemberService memberService;
@Autowired
private MemberWechatService memberWechatService;
@Autowired
private IStaffService iStaffService;
private static String[] WHITE_PATHS = {
"/h5/sms/login",
"/h5/wechat/login",
"/h5/account/login",
"/h5/register",
"/h5/validate",
"/h5/staff",
"/h5/order/listByOpenid",
"/h5/system",
"/h5/oss/upload",
"/h5/companion/staff/getTrainAnswerRecord",
};
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String requestUri = request.getRequestURI();
boolean flag = true;
if (requestUri.startsWith("/h5/")) {
return super.preHandle(request, response, handler);
}
if (!requestUri.startsWith("/applet/")) {
return super.preHandle(request, response, handler);
}
for (String s : WHITE_PATHS) {
if (requestUri.startsWith(s)) {
flag = false;
break;
}
}
if (!flag) {
return super.preHandle(request, response, handler);
}
LoginMember loginMember = tokenService.getLoginMember(request);
if (loginMember == null) {
throw new ServiceException("获取用户ID异常", HttpStatus.UNAUTHORIZED);
}
tokenService.verifyMemberToken(loginMember);
if (new Integer(1).equals(loginMember.getSourceType())) {
//伴宠师
Staff staff = iStaffService.getById(loginMember.getMemberId());
if (staff == null) {
throw new ServiceException("获取用户ID异常", HttpStatus.UNAUTHORIZED);
}
//将员工信息存放至全局
LocalDataUtil.setVar(Constants.STAFF_INFO, staff);
}else {
//获取会员信息
Member member = memberService.selectById(loginMember.getMemberId());
if (member == null || member.getStatus() == 0) {
throw new ServiceException("获取用户ID异常", HttpStatus.UNAUTHORIZED);
}
//将会员信息存放至全局
LocalDataUtil.setVar(Constants.MEMBER_INFO, member);
}
return super.preHandle(request, response, handler);
}
}

+ 3
- 0
ruoyi-admin/src/main/java/com/ruoyi/web/core/config/H5MemberInterceptor.java View File

@ -53,6 +53,9 @@ public class H5MemberInterceptor extends HandlerInterceptorAdapter {
if (!requestUri.startsWith("/h5/")) {
return super.preHandle(request, response, handler);
}
// if (requestUri.startsWith("/applet/")) {
// return super.preHandle(request, response, handler);
// }
for (String s : WHITE_PATHS) {
if (requestUri.startsWith(s)) {


+ 116
- 120
ruoyi-admin/src/main/resources/application-druid.yml View File

@ -1,100 +1,96 @@
# 数据源配置
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driverClassName: com.mysql.cj.jdbc.Driver
druid:
# 主库数据源 jdbc:mysql://localhost:3306/catmdogf?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&allowMultiQueries=true
master:
url: jdbc:mysql://124.222.255.146:3306/catmdogf?useUnicode=true&useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true
username: root
password: Tc$GePcZ
# 从库数据源
slave:
# 从数据源开关/默认关闭
enabled: false
url:
username:
password:
statViewServlet:
# 控制台管理用户名和密码
login-username: ruoyi
login-password: 123456
# redis 配置
redis:
# 地址
host: 124.222.255.146
# 端口,默认为6379
port: 6379
# 数据库索引
database: 5
# 密码
password: Abc.123456
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driverClassName: com.mysql.cj.jdbc.Driver
druid:
# 主库数据源 jdbc:mysql://localhost:3306/catmdogf?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&allowMultiQueries=true
master:
url: jdbc:mysql://47.97.158.59:3306/catmdogf_prod20225?useUnicode=true&useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true
username: root
password: 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://124.222.255.146"
password: "Abc.123456" # 如果有密码的话
connectionPoolSize: 10
idleConnectionTimeout: 10000
timeout: 3000
address: "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
# 文件路径 示例( Windows配置C:/ruoyi/uploadPath,Linux配置 /home/ruoyi/uploadPath)
profile: /Users/daixiande/Work/ruoyi/uploadPath
scheduling:
enabled: false
#aliyun:
# accessKeyId: LTAI5tQSs47izVy8DLVdwUU9 # 阿里云的accessKeyId
# secretAccessKey: qHI7C3PaXYZySr84HTToviC71AYlFq # accessKey 密码
# oss:
# endPoint: oss-cn-shenzhen.aliyuncs.com # Endpoint:在阿里云oss控制台查看自己使用的endpoint
# bucketName: hanhaiimage # bucket 名称
# cdnName: image.hhlm1688.com
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
accessKeyId: LTAI5tQSs47izVy8DLVdwUU9 # 阿里云的accessKeyId
secretAccessKey: qHI7C3PaXYZySr84HTToviC71AYlFq # accessKey 密码
oss:
endPoint: oss-cn-shenzhen.aliyuncs.com # Endpoint:在阿里云oss控制台查看自己使用的endpoint
bucketName: hanhaiimage # bucket 名称
cdnName: image.hhlm1688.com
wechat:
enabled: true
appId: wxd1a6ba7b5e17a5b6
secret: 你的微信服务号密钥
merchantId: 1665639691
privateKeyPath: /root/pem/apiclient_key.pem
# privateKeyPath: F:\\java_work\\team_work_java\\pet-admin-25-01-25\\pet-admin\\ruoyi-admin\\src\\main\\resources\\apiclient_key.pem
#privateKeyPath: /Users/daixiande/Work/杂七杂八/1665639691_20240111_cert/apiclient_key.pem
merchantSerialNumber: 6050244FC18200362585F1F9FD6557A1B291E8C0
apiV3key: 19971022197001121966060120240731
apiV2key: 19961022196901121965060120230731
# notifyUrl: https://api.catmdogd.com/prod-api/no-auth/wechat/notify
# notifyUrlForBCHSH: https://api.catmdogd.com/prod-api/no-auth/wechat/notifyForBCHSH
notifyUrl: https://pet-admin.hhlm1688.com/api/no-auth/wechat/notify
notifyUrlForBCHSH: https://pet-admin.hhlm1688.com/api/no-auth/wechat/notifyForBCHSH
# notifyUrl: http://h5.xzaiyp.top/no-auth/wechat/notify
# notifyUrlForBCHSH: http://h5.xzaiyp.top/no-auth/wechat/notifyForBCHSH
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
enabled: true
appId: wxd1a6ba7b5e17a5b6
secret: 你的微信服务号密钥
merchantId: 1665639691
# privateKeyPath: /data/software/app/key/apiclient_key.pem
# privateKeyPath: /root/pem/apiclient_key.pem
# privateKeyPath: E:\\file\\2025\\1\\pet-admin\\ruoyi-admin\\src\\main\\resources\\apiclient_cert.p12
privateKeyPath: E:\\file\\2025\\1\pet-admin\\ruoyi-admin\\src\\main\\resources\\apiclient_key.pem
# privateKeyPath: F:\\java_work\\team_work_java\\pet-admin-25-01-25\\pet-admin\\ruoyi-admin\\src\\main\\resources\\apiclient_key.pem
#privateKeyPath: /Users/daixiande/Work/杂七杂八/1665639691_20240111_cert/apiclient_key.pem
merchantSerialNumber: 6050244FC18200362585F1F9FD6557A1B291E8C0
apiV3key: 19971022197001121966060120240731
apiV2key: 19961022196901121965060120230731
# notifyUrl: https://api.catmdogd.com/prod-api/no-auth/wechat/notify
# notifyUrlForBCHSH: https://api.catmdogd.com/prod-api/no-auth/wechat/notifyForBCHSH
# notifyUrl: https://pet-admin.hhlm1688.com/api/no-auth/wechat/notify
# notifyUrlForBCHSH: https://pet-admin.hhlm1688.com/api/no-auth/wechat/notifyForBCHSH
notifyUrl: http://h5.xzaiyp.top/no-auth/wechat/notify
notifyUrlForBCHSH: http://h5.xzaiyp.top/no-auth/wechat/notifyForBCHSH
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:
@ -120,38 +116,38 @@ aes:
# 伴宠师-相关配置信息
wechat-admin:
enabled: true
appId: wx01f0f43759922fda
secret: b0a5617e6e4c387262a32af2b355c8b6
merchantId: 1665639691
privateKeyPath: ruoyi-admin/src/main/resources/apiclient_cert.p12
#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
enabled: true
appId: wx01f0f43759922fda
secret: b0a5617e6e4c387262a32af2b355c8b6
merchantId: 1665639691
privateKeyPath: ruoyi-admin/src/main/resources/apiclient_cert.p12
#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


+ 2
- 2
ruoyi-admin/src/main/resources/application.yml View File

@ -20,7 +20,7 @@ ruoyi:
# 开发环境配置.0
server:
# 服务器的HTTP端口,默认为8080
port: 8001
port: 8002
servlet:
# 应用的访问路径
context-path: /
@ -45,7 +45,7 @@ spring:
# 国际化资源文件路径
basename: i18n/messages
profiles:
active: druid
active: dev
# 文件上传
servlet:
multipart:


+ 3
- 0
ruoyi-admin/src/test/java/com/fjp/lc/test/common/CommonTest.java View File

@ -36,6 +36,7 @@ public class CommonTest {
log.info("end {}", System.currentTimeMillis() - start);
}*/
@Test
public void test4() throws IOException {
String f1 = "D:/build/tt.jpg";
@ -109,4 +110,6 @@ public class CommonTest {
System.out.println(ans);
}
}

+ 13
- 0
ruoyi-admin/src/test/java/com/fjp/lc/test/service/ServiceTest.java View File

@ -1,11 +1,13 @@
package com.fjp.lc.test.service;
import cn.hutool.core.img.ImgUtil;
import cn.hutool.core.lang.Snowflake;
import cn.hutool.core.util.CharsetUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.crypto.SecureUtil;
import cn.hutool.crypto.symmetric.AES;
import com.cyl.h5.pojo.dto.PayNotifyMessageDTO;
import com.cyl.h5.pojo.vo.H5OrderVO;
import com.cyl.h5.service.H5OrderService;
import com.cyl.manager.aws.domain.SystemStatistics;
import com.cyl.manager.aws.mapper.SystemStatisticsMapper;
@ -18,6 +20,7 @@ import com.ruoyi.RuoYiApplication;
import com.ruoyi.common.config.properties.SmsProperties;
import com.ruoyi.common.core.sms.AliyunSmsTemplate;
import com.ruoyi.common.core.sms.SmsTemplate;
import com.ruoyi.model.service.IAppletOrderDateFrequencyService;
import com.wechat.pay.java.service.partnerpayments.jsapi.model.Transaction;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
@ -29,6 +32,8 @@ import org.springframework.http.ResponseEntity;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.junit4.SpringRunner;
import java.io.File;
import java.io.IOException;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
@ -57,6 +62,9 @@ public class ServiceTest {
@Autowired
private SystemStatisticsMapper systemStatisticsMapper;
@Autowired
private IAppletOrderDateFrequencyService appletOrderDateFrequencyService;
@Test
public void test1() {
memberCartService.mineCartNum();
@ -131,4 +139,9 @@ public class ServiceTest {
SystemStatistics data = systemStatisticsService.stat(startTime, endTime);
systemStatisticsMapper.insert(data);
}
@Test
public void aceptOrdersGenerateDayOrdersByOrderVO() throws IOException {
}
}

+ 10
- 0
ruoyi-catdog/src/main/java/com/ruoyi/applet/contoller/ApiAppletHhrWorkInController.java View File

@ -26,6 +26,9 @@ public class ApiAppletHhrWorkInController extends BaseController {
@Autowired
private IAppBannerService appletBannerService;
@Autowired
private IAppletIconService appletIconService;
@ApiOperation("轮播图列表")
@GetMapping("/bannerList")
public AjaxResult bannerList(){
@ -36,6 +39,11 @@ public class ApiAppletHhrWorkInController extends BaseController {
@ApiOperation("已加入的工作台图标配置查询")
@GetMapping("/indexConfig")
public TableDataInfo getIndexConfig(){
// return getDataTable(appletIconService.list());
// /*
List<AppletIconVo> list = new ArrayList<>();
AppletIconVo icon1 = new AppletIconVo();
icon1.setType(0);
@ -107,6 +115,8 @@ public class ApiAppletHhrWorkInController extends BaseController {
return getDataTable(list);
// */
}
@ApiOperation("申请加入合伙人")


+ 6
- 1
ruoyi-catdog/src/main/java/com/ruoyi/applet/contoller/ApiAppletOrderController.java View File

@ -31,6 +31,7 @@ import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.Synchronized;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import java.math.BigDecimal;
@ -83,6 +84,9 @@ public class ApiAppletOrderController extends BaseController {
private OmsOrderServiceMapper omsOrderServiceMapper;
@Autowired
private IAppletOrderDateFrequencyService appletOrderDateFrequencyService;
@ApiOperation("接单大厅列表-带分页")
@GetMapping("/list")
public AjaxResult outDateList(AppletOrder appletOrder){
@ -423,6 +427,7 @@ public class ApiAppletOrderController extends BaseController {
@ApiOperation("接单大厅 - 立即接单")
@PostMapping("/startByOrderId")
@Synchronized
@Transactional
public AjaxResult startByOrderId(@RequestBody AppletOrder appletOrder){
if(appletOrder.getId() == null){
return AjaxResult.error("订单标识不能为空");
@ -546,7 +551,7 @@ public class ApiAppletOrderController extends BaseController {
appletOrderDateFrequencyService.aceptOrdersGenerateDayOrdersByOrderVO(h5OrderVO, appletOrder.getUserId());


+ 87
- 0
ruoyi-catdog/src/main/java/com/ruoyi/applet/contoller/AppletOrderDateFrequencyAppletController.java View File

@ -0,0 +1,87 @@
package com.ruoyi.applet.contoller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.cyl.h5.config.SecurityUtil;
import com.cyl.manager.oms.domain.OrderItem;
import com.cyl.manager.oms.mapper.OrderItemMapper;
import com.cyl.manager.ums.domain.Member;
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.AppletOrderDateFrequency;
import com.ruoyi.model.domain.AppletOrderItemDateLog;
import com.ruoyi.model.service.IAppletOrderDateFrequencyService;
import com.ruoyi.model.service.IAppletOrderItemDateLogService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.stream.Collectors;
/**
* 新版本小程序日订单Controller
*
* @author daixiande
* @date 2025-05-28
*/
@RestController
@RequestMapping("/applet/appletOrderDateFrequency")
public class AppletOrderDateFrequencyAppletController extends BaseController {
@Autowired
private IAppletOrderDateFrequencyService appletOrderDateFrequencyService;
@Autowired
private IAppletOrderItemDateLogService appletOrderItemDateLogService;
/**
* 查询日订单列表
*/
@GetMapping("/list")
public AjaxResult list(AppletOrderDateFrequency frequency) {
List<AppletOrderDateFrequency> list = appletOrderDateFrequencyService.selectAppletOrderDateFrequencyList(frequency);
// 按日期分组
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
Map<String, List<AppletOrderDateFrequency>> groupedByDate = list.stream()
.collect(Collectors.groupingBy(item -> formatter.format(item.getServiceDate())));
// 转换为目标格式按日期排序
List<Map<String, Object>> result = new ArrayList<>();
groupedByDate.entrySet().stream()
.sorted(Map.Entry.comparingByKey())
.forEach(entry -> {
Map<String, Object> group = new HashMap<>();
group.put("date", entry.getKey());
group.put("list", entry.getValue());
result.add(group);
});
return success(result);
}
/**
* 获取日订单详细信息
*/
@GetMapping(value = "/{id}")
public AjaxResult getInfo(@PathVariable("id") Long id) {
AppletOrderDateFrequency frequency = appletOrderDateFrequencyService.selectAppletOrderDateFrequencyById(id);
AppletOrderItemDateLog check = appletOrderItemDateLogService.selectAppletOrderItemDateLogByItemDateId(id);
HashMap<String, Object> map = new HashMap<>();
map.put("frequency", frequency);
map.put("check", check);
return AjaxResult.success(map);
}
/**
* 获取日订单详细信息
*/
@PostMapping(value = "/check")
public AjaxResult check(@RequestBody AppletOrderItemDateLog log) {
return AjaxResult.success(appletOrderDateFrequencyService.check(log));
}
}

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

@ -179,7 +179,7 @@ public class IApiMallOrderServiceImpl implements IApiMallOrderService {
OmsOrderService omsOrderService = new OmsOrderService();
omsOrderService.setOrderId(item.getOrderId());
List<OmsOrderService> orderServiceList = omsOrderServiceMapper.selectList(omsOrderService);
List<OmsOrderService> orderServiceList = omsOrderServiceMapper.selectListBySql(omsOrderService);
@ -229,7 +229,7 @@ public class IApiMallOrderServiceImpl implements IApiMallOrderService {
//组装order_service
OmsOrderService omsOrderService = new OmsOrderService();
omsOrderService.setOrderId(orderId);
List<OmsOrderService> orderServiceList = omsOrderServiceMapper.selectList(omsOrderService);
List<OmsOrderService> orderServiceList = omsOrderServiceMapper.selectListBySql(omsOrderService);
order.setOrderServiceList(orderServiceList);


+ 114
- 0
ruoyi-catdog/src/main/java/com/ruoyi/model/controller/AppletOrderDateFrequencyController.java View File

@ -0,0 +1,114 @@
package com.ruoyi.model.controller;
import java.util.List;
import com.ruoyi.model.domain.AppletOrderItemDateLog;
import com.ruoyi.model.service.IAppletOrderItemDateLogService;
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.AppletOrderDateFrequency;
import com.ruoyi.model.service.IAppletOrderDateFrequencyService;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.common.core.page.TableDataInfo;
/**
* 日订单Controller
*
* @author daixiande
* @date 2025-05-28
*/
@RestController
@RequestMapping("/model/appletOrderDateFrequency")
public class AppletOrderDateFrequencyController extends BaseController {
@Autowired
private IAppletOrderDateFrequencyService appletOrderDateFrequencyService;
@Autowired
private IAppletOrderItemDateLogService appletOrderItemDateLogService;
/**
* 查询日订单列表
*/
@PreAuthorize("@ss.hasPermi('model:appletOrderDateFrequency:list')")
@GetMapping("/list")
public TableDataInfo list(AppletOrderDateFrequency appletOrderDateFrequency) {
startPage();
List<AppletOrderDateFrequency> list = appletOrderDateFrequencyService.selectAppletOrderDateFrequencyList(appletOrderDateFrequency);
list.forEach(appletOrderDateFrequencyService::buildUserData);
return getDataTable(list);
}
/**
* 导出日订单列表
*/
@PreAuthorize("@ss.hasPermi('model:appletOrderDateFrequency:export')")
@Log(title = "日订单", businessType = BusinessType.EXPORT)
@GetMapping("/export")
public AjaxResult export(AppletOrderDateFrequency appletOrderDateFrequency) {
List<AppletOrderDateFrequency> list = appletOrderDateFrequencyService.selectAppletOrderDateFrequencyList(appletOrderDateFrequency);
ExcelUtil<AppletOrderDateFrequency> util = new ExcelUtil<AppletOrderDateFrequency>(AppletOrderDateFrequency.class);
return util.exportExcel(list, "日订单数据");
}
/**
* 获取日订单详细信息
*/
@PreAuthorize("@ss.hasPermi('model:appletOrderDateFrequency:query')")
@GetMapping(value = "/{id}")
public AjaxResult getInfo(@PathVariable("id") Long id) {
return AjaxResult.success(appletOrderDateFrequencyService.selectAppletOrderDateFrequencyById(id));
}
/**
* 获取日订单打卡详细信息
*/
@PreAuthorize("@ss.hasPermi('model:appletOrderDateFrequency:query')")
@GetMapping(value = "/check/{id}")
public AjaxResult getCheck(@PathVariable("id") Long id) {
AppletOrderItemDateLog check = appletOrderItemDateLogService.selectAppletOrderItemDateLogByItemDateId(id);
return AjaxResult.success(check);
}
/**
* 新增日订单
*/
@PreAuthorize("@ss.hasPermi('model:appletOrderDateFrequency:add')")
@Log(title = "日订单", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@RequestBody AppletOrderDateFrequency appletOrderDateFrequency) {
return toAjax(appletOrderDateFrequencyService.insertAppletOrderDateFrequency(appletOrderDateFrequency));
}
/**
* 修改日订单
*/
@PreAuthorize("@ss.hasPermi('model:appletOrderDateFrequency:edit')")
@Log(title = "日订单", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@RequestBody AppletOrderDateFrequency appletOrderDateFrequency) {
return toAjax(appletOrderDateFrequencyService.updateAppletOrderDateFrequency(appletOrderDateFrequency));
}
/**
* 删除日订单
*/
@PreAuthorize("@ss.hasPermi('model:appletOrderDateFrequency:remove')")
@Log(title = "日订单", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public AjaxResult remove(@PathVariable Long[] ids) {
return toAjax(appletOrderDateFrequencyService.deleteAppletOrderDateFrequencyByIds(ids));
}
}

+ 107
- 0
ruoyi-catdog/src/main/java/com/ruoyi/model/domain/AppletOrderDateFrequency.java View File

@ -0,0 +1,107 @@
package com.ruoyi.model.domain;
import com.baomidou.mybatisplus.annotation.TableField;
import com.cyl.manager.ums.domain.Member;
import com.cyl.manager.ums.domain.Pet;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.common.annotation.Excel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
import java.util.List;
/**
* 日订单对象 applet_order_date_frequency
*
* @author daixiande
*/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class AppletOrderDateFrequency {
private static final long serialVersionUID = 1L;
/** 编号 */
private Long id;
/** 下单端订单ID */
@Excel(name = "下单端订单ID")
private Long orderId;
/** 服务日期 */
@Excel(name = "服务日期")
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
private Date serviceDate;
/** 期望上门时间 */
private String serviceExpected;
/** 关联宠物直接用json保存他以及服务内容 */
private String petId;
/** 省份 */
@Excel(name = "省份")
private String receiverProvince;
/** 城市 */
@Excel(name = "城市")
private String receiverCity;
/** 区县 */
@Excel(name = "区县")
private String receiverDistrict;
/** 详细地址 */
private String receiverDetailAddress;
/** 当日上门的第几次 */
private Integer dayNumber;
/** 伴宠师 */
@Excel(name = "伴宠师")
private Long masterId;
/** 下单用户 */
@Excel(name = "下单用户")
private Long userId;
/** 完成状态 */
@Excel(name = "完成状态")
private String status;
/** 完成时间 */
@Excel(name = "完成时间")
@JsonFormat(pattern = "yyyy-MM-dd hh:mm:ss", timezone = "GMT+8")
private Date completionTime;
/** 项目ids多个,号隔开 */
private String projectIds;
/** 创建者 */
private Long createBy;
/** 创建时间 */
private String createTime;
/** 更新者 */
private Long updateBy;
/** 更新时间 */
private String updateTime;
@TableField(exist = false)
private List<Pet> pets;
// 伴宠师
@TableField(exist = false)
private AppUsers master;
// 下单用户
@TableField(exist = false)
private Member user;
}

+ 2
- 2
ruoyi-catdog/src/main/java/com/ruoyi/model/domain/AppletOrderItem.java View File

@ -43,7 +43,7 @@ public class AppletOrderItem {
@Excel(name = "支付时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime payTime;
/** 订单状态 */
/** 订单状态类型 在接单大厅使用 */
@Excel(name = "订单状态")
private Integer status;
@ -107,7 +107,7 @@ public class AppletOrderItem {
@Excel(name = "伴宠师电话")
private String phone;
/** 订单状态 */
/** 订单状态 0待服务 1进行中 2已完成 */
@Excel(name = "订单状态")
private Integer orderStatus;


+ 3
- 3
ruoyi-catdog/src/main/java/com/ruoyi/model/domain/AppletOrderItemDateLog.java View File

@ -68,7 +68,7 @@ public class AppletOrderItemDateLog {
@Excel(name = "盆/尿垫前后对比-后")
private String basinAfter;
/** 溜狗 */
/** 溜狗 定制服务的信息以json格式保存在这里 */
@Excel(name = "溜狗")
private String workDogImage;
@ -80,11 +80,11 @@ public class AppletOrderItemDateLog {
@Excel(name = "备注")
private String notes;
/** 日订单标识 */
/** 日订单标识, 新版本指向AppletOrderDateFrequency表id */
@Excel(name = "日订单标识")
private Long itemDateId;
/** 总订单标识 */
/** 总订单标识, 新版本不使用,而是使用orderId */
@Excel(name = "总订单标识")
private Long itemOrderId;


+ 3
- 2
ruoyi-catdog/src/main/java/com/ruoyi/model/mapper/AppBannerMapper.java View File

@ -1,6 +1,8 @@
package com.ruoyi.model.mapper;
import java.util.List;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.model.domain.AppBanner;
/**
@ -9,8 +11,7 @@ import com.ruoyi.model.domain.AppBanner;
* @author ruoyi
* @date 2025-03-04
*/
public interface AppBannerMapper
{
public interface AppBannerMapper {
/**
* 查询轮播图
*


+ 3
- 2
ruoyi-catdog/src/main/java/com/ruoyi/model/mapper/AppletIconMapper.java View File

@ -1,6 +1,8 @@
package com.ruoyi.model.mapper;
import java.util.List;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.model.domain.AppletIcon;
/**
@ -9,8 +11,7 @@ import com.ruoyi.model.domain.AppletIcon;
* @author ruoyi
* @date 2025-03-30
*/
public interface AppletIconMapper
{
public interface AppletIconMapper extends BaseMapper<AppletIcon> {
/**
* 查询跳转图标菜单
*


+ 14
- 0
ruoyi-catdog/src/main/java/com/ruoyi/model/mapper/AppletOrderDateFrequencyMapper.java View File

@ -0,0 +1,14 @@
package com.ruoyi.model.mapper;
import java.util.List;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.model.domain.AppletOrderDateFrequency;
/**
* 日订单Mapper接口
*
* @author daixiande
*/
public interface AppletOrderDateFrequencyMapper extends BaseMapper<AppletOrderDateFrequency> {
}

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

@ -1,6 +1,8 @@
package com.ruoyi.model.mapper;
import java.util.List;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.model.domain.AppletOrderItemDateLog;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
@ -10,7 +12,7 @@ import org.apache.ibatis.annotations.Select;
*
* @author daixiande
*/
public interface AppletOrderItemDateLogMapper {
public interface AppletOrderItemDateLogMapper extends BaseMapper<AppletOrderItemDateLog> {
/**
* 查询订单信息表
*


+ 3
- 2
ruoyi-catdog/src/main/java/com/ruoyi/model/service/IAppletIconService.java View File

@ -1,6 +1,8 @@
package com.ruoyi.model.service;
import java.util.List;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.model.domain.AppletIcon;
/**
@ -9,8 +11,7 @@ import com.ruoyi.model.domain.AppletIcon;
* @author ruoyi
* @date 2025-03-30
*/
public interface IAppletIconService
{
public interface IAppletIconService extends IService<AppletIcon> {
/**
* 查询跳转图标菜单
*


+ 78
- 0
ruoyi-catdog/src/main/java/com/ruoyi/model/service/IAppletOrderDateFrequencyService.java View File

@ -0,0 +1,78 @@
package com.ruoyi.model.service;
import java.util.List;
import com.baomidou.mybatisplus.extension.service.IService;
import com.cyl.h5.pojo.vo.H5OrderVO;
import com.ruoyi.model.domain.AppletOrderDateFrequency;
import com.ruoyi.model.domain.AppletOrderItemDateLog;
/**
* 日订单Service接口
*
* @author daixiande
*/
public interface IAppletOrderDateFrequencyService extends IService<AppletOrderDateFrequency> {
/**
* 查询日订单
*
* @param id 日订单主键
* @return 日订单
*/
AppletOrderDateFrequency selectAppletOrderDateFrequencyById(Long id);
/**
* 查询日订单列表
*
* @param appletOrderDateFrequency 日订单
* @return 日订单集合
*/
List<AppletOrderDateFrequency> selectAppletOrderDateFrequencyList(AppletOrderDateFrequency appletOrderDateFrequency);
/**
* 新增日订单
*
* @param appletOrderDateFrequency 日订单
* @return 结果
*/
int insertAppletOrderDateFrequency(AppletOrderDateFrequency appletOrderDateFrequency);
/**
* 修改日订单
*
* @param appletOrderDateFrequency 日订单
* @return 结果
*/
int updateAppletOrderDateFrequency(AppletOrderDateFrequency appletOrderDateFrequency);
/**
* 批量删除日订单
*
* @param ids 需要删除的日订单主键集合
* @return 结果
*/
int deleteAppletOrderDateFrequencyByIds(Long[] ids);
void buildPetData(AppletOrderDateFrequency frequency);
/**
* 删除日订单信息
*
* @param id 日订单主键
* @return 结果
*/
int deleteAppletOrderDateFrequencyById(Long id);
/**
* 接单生成日订单
* @param h5OrderVO 下单端订单信息
* @param masterId 伴宠师ID
*/
void aceptOrdersGenerateDayOrdersByOrderVO(H5OrderVO h5OrderVO, Long masterId);
void buildUserData(AppletOrderDateFrequency frequency);
int check(AppletOrderItemDateLog log);
}

+ 1
- 1
ruoyi-catdog/src/main/java/com/ruoyi/model/service/IAppletOrderItemService.java View File

@ -6,7 +6,7 @@ import com.ruoyi.model.domain.AppletOrderItem;
import java.util.List;
/**
* 订单信息Service接口
* 接单端总订单信息Service接口
*
* @author ruoyi
* @date 2025-03-28


+ 3
- 2
ruoyi-catdog/src/main/java/com/ruoyi/model/service/impl/AppletIconServiceImpl.java View File

@ -1,6 +1,8 @@
package com.ruoyi.model.service.impl;
import java.util.List;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.utils.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@ -15,8 +17,7 @@ import com.ruoyi.model.service.IAppletIconService;
* @date 2025-03-30
*/
@Service
public class AppletIconServiceImpl implements IAppletIconService
{
public class AppletIconServiceImpl extends ServiceImpl<AppletIconMapper, AppletIcon> implements IAppletIconService {
@Autowired
private AppletIconMapper appletIconMapper;


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

@ -0,0 +1,382 @@
package com.ruoyi.model.service.impl;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.util.*;
import java.util.stream.Collectors;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.cyl.h5.pojo.vo.H5OrderVO;
import com.cyl.h5.service.H5MemberService;
import com.cyl.manager.oms.domain.OmsOrderService;
import com.cyl.manager.oms.domain.OrderItem;
import com.cyl.manager.oms.mapper.OmsOrderServiceMapper;
import com.cyl.manager.oms.mapper.OrderItemMapper;
import com.cyl.manager.oms.service.OmsOrderServiceService;
import com.cyl.manager.ums.domain.Pet;
import com.cyl.manager.ums.mapper.PetMapper;
import com.cyl.manager.ums.service.MemberService;
import com.cyl.manager.ums.service.PetService;
import com.ruoyi.model.domain.*;
import com.ruoyi.model.mapper.AppletOrderItemMapper;
import com.ruoyi.model.service.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.model.mapper.AppletOrderDateFrequencyMapper;
import org.springframework.transaction.annotation.Transactional;
import static org.apache.ibatis.ognl.OgnlOps.in;
/**
* 日订单Service业务层处理
*
* @author daixiande
*/
@Service
public class AppletOrderDateFrequencyServiceImpl extends ServiceImpl<AppletOrderDateFrequencyMapper, AppletOrderDateFrequency> implements IAppletOrderDateFrequencyService {
@Autowired
private AppletOrderDateFrequencyMapper appletOrderDateFrequencyMapper;
@Autowired
private PetMapper petMapper;
@Autowired
private OrderItemMapper orderItemMapper;
@Autowired
private OmsOrderServiceMapper omsOrderServiceMapper;
@Autowired
private IAppUsersService appUsersService;
@Autowired
private MemberService memberService;
@Autowired
private IAppletOrderItemDateLogService appletOrderItemDateLogService;
@Autowired
private AppletOrderItemMapper appletOrderItemMapper;
@Autowired
private IAppletAmountLogService appletAmountLogService;
/**
* 查询日订单
*
* @param id 日订单主键
* @return 日订单
*/
@Override
public AppletOrderDateFrequency selectAppletOrderDateFrequencyById(Long id) {
AppletOrderDateFrequency appletOrderDateFrequency = appletOrderDateFrequencyMapper.selectById(id);
buildPetData(appletOrderDateFrequency);
return appletOrderDateFrequency;
}
/**
* 查询日订单列表
*
* @param frequency 日订单
* @return 日订单
*/
@Override
public List<AppletOrderDateFrequency> selectAppletOrderDateFrequencyList(AppletOrderDateFrequency frequency) {
LambdaQueryChainWrapper<AppletOrderDateFrequency> qw = lambdaQuery()
.eq(frequency.getOrderId() != null, AppletOrderDateFrequency::getOrderId, frequency.getOrderId())
.eq(frequency.getMasterId() != null, AppletOrderDateFrequency::getMasterId, frequency.getMasterId())
.orderByAsc(AppletOrderDateFrequency::getServiceDate);
if (frequency.getStatus() != null){
qw.in(AppletOrderDateFrequency::getStatus,
Arrays.asList(frequency.getStatus().split(",")));
}
List<AppletOrderDateFrequency> list = qw.list();
list.forEach(this::buildPetData);
return list;
}
@Override
public void buildPetData(AppletOrderDateFrequency frequency){
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
String[] split = frequency.getPetId().split(",");
List<Pet> pets = petMapper.selectList(Wrappers.<Pet>lambdaQuery()
.in(Pet::getId, split));
frequency.setPets(pets);
if(frequency.getProjectIds() == null){
return;
}
pets.forEach(pet -> {
LambdaQueryWrapper<OmsOrderService> omsOrderServiceQW = Wrappers.<OmsOrderService>lambdaQuery()
.eq(OmsOrderService::getPetId, pet.getId())
.eq(OmsOrderService::getOrderId, frequency.getOrderId())
.eq(OmsOrderService::getServiceDate, formatter.format(frequency.getServiceDate()))
.select(OmsOrderService::getId);
List<Long> omsOrderServiceIds = omsOrderServiceMapper.selectList(omsOrderServiceQW).stream().map(n -> n.getId())
.collect(Collectors.toList());
LambdaQueryWrapper<OrderItem> qw = Wrappers.<OrderItem>lambdaQuery()
.in(OrderItem::getOrderServiceId, omsOrderServiceIds)
.in(OrderItem::getId, Arrays.asList(frequency.getProjectIds().split(",")));
List<OrderItem> orderItemList = orderItemMapper.selectList(qw);
pet.setOrderItemList(orderItemList);
});
}
/**
* 新增日订单
*
* @param appletOrderDateFrequency 日订单
* @return 结果
*/
@Override
public int insertAppletOrderDateFrequency(AppletOrderDateFrequency appletOrderDateFrequency) {
return appletOrderDateFrequencyMapper.insert(appletOrderDateFrequency);
}
/**
* 修改日订单
*
* @param appletOrderDateFrequency 日订单
* @return 结果
*/
@Override
public int updateAppletOrderDateFrequency(AppletOrderDateFrequency appletOrderDateFrequency) {
return appletOrderDateFrequencyMapper.updateById(appletOrderDateFrequency);
}
/**
* 批量删除日订单
*
* @param ids 需要删除的日订单主键
* @return 结果
*/
@Override
public int deleteAppletOrderDateFrequencyByIds(Long[] ids) {
return appletOrderDateFrequencyMapper.deleteBatchIds(Arrays.asList(ids));
}
/**
* 删除日订单信息
*
* @param id 日订单主键
* @return 结果
*/
@Override
public int deleteAppletOrderDateFrequencyById(Long id) {
return appletOrderDateFrequencyMapper.deleteById(id);
}
/**
* 接单生成日订单
* 以下是新的日订单代码
* @param masterId 伴宠师ID
*/
@Override
public void aceptOrdersGenerateDayOrdersByOrderVO(H5OrderVO h5OrderVO, Long masterId) {
//生成按照次数完成打卡的日订单
ArrayList<AppletOrderDateFrequency> frequencies = new ArrayList<>();
//提取去重的日期列表避免重复添加
List<OmsOrderService> orderServiceSet = h5OrderVO.getOrderServiceList().stream()
.filter(service -> service.getServiceDate() != null)
.collect(Collectors.collectingAndThen(
Collectors.toCollection(() ->
new TreeSet<>(Comparator.comparing(OmsOrderService::getServiceDate))),
ArrayList::new));
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
for (OmsOrderService service : orderServiceSet) {
// 当前订单生成数
int index = 0;
// 订单最大生成数
int maxIndex = 3;
//找出符合当前日期时间的服务列表
List<OmsOrderService> serviceList = h5OrderVO.getOrderServiceList().stream().
filter(n -> n.getServiceDate().equals(service.getServiceDate()))
.map(n -> {
n.setOrderItems(new ArrayList<>());
return n;
})
.collect(Collectors.toList());
//取出当前日期所对应的项目
List<OrderItem> orderItemList = h5OrderVO.getOrderItemList().stream().
filter(n -> {
for (OmsOrderService omsOrderService : serviceList) {
if(n.getOrderServiceId().equals(omsOrderService.getId())){
omsOrderService.getOrderItems().add(n);
return true;
}
}
return false;
}).collect(Collectors.toList());
// 找出最大次数生成对应个数的日订单
for (OrderItem orderItem : orderItemList) {
maxIndex = Math.max(maxIndex, orderItem.getQuantity());
}
// 根据次数生成
while (index < maxIndex){
//当前次数对应的项目
HashSet<Long> projectIds = new HashSet<>();
//当前次数对应的宠物
HashSet<Integer> petIds = new HashSet<>();
for (OmsOrderService omsOrderService : serviceList) {
//找出最大次数最大次数符合的才能添加宠物
int oIndex = 0;
for (OrderItem orderItem : omsOrderService.getOrderItems()) {
oIndex = Math.max(oIndex, orderItem.getQuantity());
//找出符合次数的项目
if (orderItem.getQuantity() > index){
projectIds.add(orderItem.getId());
}
}
//最大次数符合当前次数内添加宠物id
if (oIndex > index){
petIds.add(omsOrderService.getPetId());
}
}
//如果当前次数没有需要服务的宠物了则直接跳过
if (petIds.isEmpty()){
break;
}
Date serviceDate;
try {
serviceDate = formatter.parse(service.getServiceDate());
} catch (ParseException e) {
throw new RuntimeException("日期解析失败");
}
frequencies.add(AppletOrderDateFrequency.builder()
.serviceDate(serviceDate)
.receiverCity(h5OrderVO.getReceiverCity())
.receiverProvince(h5OrderVO.getReceiverProvince())
.receiverDistrict(h5OrderVO.getReceiverDistrict())
.receiverDetailAddress(h5OrderVO.getReceiverDetailAddress())
.userId(h5OrderVO.getMemberId())
.masterId(masterId)
.orderId(service.getOrderId())
.dayNumber(index + 1)
.petId(String.join(",", petIds.stream()
.map(String::valueOf).collect(Collectors.toList())))
.projectIds(String.join(",", projectIds.stream()
.map(String::valueOf).collect(Collectors.toList())))
.build());
index++;
}
}
saveBatch(frequencies);
}
@Override
public void buildUserData(AppletOrderDateFrequency frequency) {
frequency.setMaster(appUsersService.selectAppUsersByUserId(frequency.getMasterId()));
frequency.setUser(memberService.selectById(frequency.getUserId()));
}
@Override
@Transactional
public int check(AppletOrderItemDateLog log) {
AppletOrderDateFrequency byId = getById(log.getItemDateId());
if(byId == null){
throw new RuntimeException("无效日订单");
}
byId.setStatus(String.valueOf(log.getSubmitFlag()));
if(log.getSubmitFlag() == 2){
byId.setCompletionTime(new Date());
}
updateById(byId);
log.setOrderId(byId.getOrderId());
//当所有的日订单完成就将订单状态修改完成
Integer count = lambdaQuery()
.eq(AppletOrderDateFrequency::getOrderId, byId.getOrderId())
.in(AppletOrderDateFrequency::getStatus, Arrays.asList("0,1".split(",")))
.count();
//总订单
AppletOrderItem appletOrderItem = appletOrderItemMapper
.selectAppletOrderItemByOrderIdUserId(byId.getOrderId(), byId.getMasterId());
//订单完成
if(count == 0){
appletOrderItem.setOrderStatus(2);
appletOrderItemMapper.updateAppletOrderItem(appletOrderItem);
//根据订单中的用户id查询用户信息
AppUsers user = appUsersService.selectAppUsersByUserId(appletOrderItem.getUserId());
//增加伴宠师流水
// 记录日志
AppletAmountLog moneyLog = new AppletAmountLog();
moneyLog.setUserId(user.getUserId());
moneyLog.setTitle("伴宠师佣金");
moneyLog.setAmount(appletOrderItem.getOrderGivePrice());
moneyLog.setType(0); //收入
moneyLog.setState(1); //到账
moneyLog.setCreateTime(LocalDateTime.now());
moneyLog.setMoneyType(1);//钱包类型
int i = appletAmountLogService.insertAppletAmountLog(moneyLog);
user.setPrice(user.getPrice().add(appletOrderItem.getOrderGivePrice()));
appUsersService.updateAppUsers(user);
}else if (appletOrderItem.getOrderStatus() == 0){//修改成订单进行中
appletOrderItem.setOrderStatus(1);
appletOrderItemMapper.updateAppletOrderItem(appletOrderItem);
}
if(log.getId() == null){
return appletOrderItemDateLogService.insertAppletOrderItemDateLog(log);
}else {
return appletOrderItemDateLogService.updateAppletOrderItemDateLog(log);
}
}
}

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

@ -89,6 +89,7 @@ public class H5OrderVO {
@TableField(exist = false)
private List<PetVO> petVOList;
//接单的伴宠师
private Long teacherId;
private Integer companionLevel;


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

@ -775,7 +775,7 @@ public class H5OrderService {
OmsOrderService omsOrderService = new OmsOrderService();
omsOrderService.setOrderId(item.getOrderId());
List<OmsOrderService> orderServiceList = omsOrderServiceMapper.selectList(omsOrderService);
List<OmsOrderService> orderServiceList = omsOrderServiceMapper.selectListBySql(omsOrderService);
@ -826,7 +826,7 @@ public class H5OrderService {
//组装order_service
OmsOrderService omsOrderService = new OmsOrderService();
omsOrderService.setOrderId(orderId);
List<OmsOrderService> orderServiceList = omsOrderServiceMapper.selectList(omsOrderService);
List<OmsOrderService> orderServiceList = omsOrderServiceMapper.selectListBySql(omsOrderService);
order.setOrderServiceList(orderServiceList);
// 如果未付款计算倒计时


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

@ -10,6 +10,8 @@ import com.ruoyi.common.core.domain.BaseAudit;
import lombok.Data;
import java.time.LocalDateTime;
import java.util.List;
/**
* 预约订单服务详细信息记录表对象 oms_order_service
*
@ -69,4 +71,7 @@ public class OmsOrderService extends BaseAudit {
@TableField(exist = false)
private Pet pets;
@TableField(exist = false)
private List<OrderItem> orderItems;
}

+ 1
- 1
ruoyi-mall/src/main/java/com/cyl/manager/oms/mapper/OmsOrderServiceMapper.java View File

@ -25,7 +25,7 @@ public interface OmsOrderServiceMapper extends BaseMapper<OmsOrderService> {
* @param omsOrderService 预约订单服务详细信息记录表
* @return 预约订单服务详细信息记录表集合
*/
List<OmsOrderService> selectList(OmsOrderService omsOrderService);
List<OmsOrderService> selectListBySql(OmsOrderService omsOrderService);
/**
* 新增预约订单服务详细信息记录表


+ 3
- 3
ruoyi-mall/src/main/java/com/cyl/manager/oms/service/OmsOrderServiceService.java View File

@ -33,7 +33,7 @@ public class OmsOrderServiceService {
public OmsOrderService selectByOrderId(Long id) {
OmsOrderService omsOrderService = new OmsOrderService();
omsOrderService.setOrderId(id);
List<OmsOrderService> orderServiceList = omsOrderServiceMapper.selectList(omsOrderService);
List<OmsOrderService> orderServiceList = omsOrderServiceMapper.selectListBySql(omsOrderService);
if (CollectionUtils.isEmpty(orderServiceList)){
return null;
@ -46,7 +46,7 @@ public class OmsOrderServiceService {
public List<OmsOrderService> selectListByOrderId(Long id) {
OmsOrderService omsOrderService = new OmsOrderService();
omsOrderService.setOrderId(id);
List<OmsOrderService> orderServiceList = omsOrderServiceMapper.selectList(omsOrderService);
List<OmsOrderService> orderServiceList = omsOrderServiceMapper.selectListBySql(omsOrderService);
if (CollectionUtils.isEmpty(orderServiceList)){
return null;
@ -63,7 +63,7 @@ public class OmsOrderServiceService {
* @return 预约订单服务详细信息记录表集合
*/
public List<OmsOrderService> selectOmsOrderServiceList(OmsOrderService omsOrderService){
return omsOrderServiceMapper.selectList(omsOrderService);
return omsOrderServiceMapper.selectListBySql(omsOrderService);
}
/**


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

@ -1,8 +1,12 @@
package com.cyl.manager.ums.domain;
import java.math.BigDecimal;
import java.util.List;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.cyl.manager.oms.domain.OmsOrderService;
import com.cyl.manager.oms.domain.OrderItem;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.core.domain.BaseAudit;
@ -84,4 +88,9 @@ public class Pet extends BaseAudit {
/** 删除标志(0代表存在 2代表删除)*/
private Integer delFlag = 0;
@TableField(exist = false)
private List<OmsOrderService> services;
@TableField(exist = false)
private List<OrderItem> orderItemList;
}

+ 1
- 1
ruoyi-mall/src/main/resources/mapper/oms/OrderServiceMapper.xml View File

@ -27,7 +27,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
select id, order_id, pet, service_frequency, service_date, service_time_first, service_time_second, create_by, create_time, update_by, update_time, del_flag , create_by, create_time, update_by, update_time, feed_count, pet_id, expect_service_time from oms_order_service
</sql>
<select id="selectList" parameterType="OmsOrderService" resultMap="OmsOrderServiceResult">
<select id="selectListBySql" parameterType="OmsOrderService" resultMap="OmsOrderServiceResult">
<include refid="selectOmsOrderServiceVo"/>
<where>
<if test="orderId != null "> and order_id = #{orderId}</if>


Loading…
Cancel
Save