Compare commits

...

3 Commits

Author SHA1 Message Date
zxf 0d30afb63a Merge remote-tracking branch 'origin/main'
2 months ago
zxf 4a2fca7e67 feat:
2 months ago
zxf 12fe4055d7 feat:
3 months ago

@ -3,5 +3,5 @@ ENV = 'production'
# base api # base api
# VUE_APP_BASE_API = 'http://124.71.134.146:18091' # VUE_APP_BASE_API = 'http://124.71.134.146:18091'
VUE_APP_BASE_API = 'http://119.45.21.129:18091' VUE_APP_BASE_API = 'https://fzbfwy.com/prod-api'

@ -61,3 +61,15 @@ export function pmcomplaintsuggestionListApi(params) {
}) })
} }
/**
* 祈愿菜单列表csType=99
* @param params
*/
export function wishMenuListApi(params) {
return request({
url: `autogencode/pmcomplaintsuggestion/wishMenuList`,
method: 'GET',
params
})
}

@ -0,0 +1,95 @@
import request from '@/utils/request'
/**
* 新增pmdailymenudtllike
* @param pram
*/
export function pmdailymenudtllikeCreateApi(data) {
return request({
url: `autogencode/pmdailymenudtllike/save`,
method: 'POST',
data
})
}
/**
* pmdailymenudtllike更新
* @param pram
*/
export function pmdailymenudtllikeUpdateApi(data) {
return request({
url: `autogencode/pmdailymenudtllike/update`,
method: 'POST',
data
})
}
/**
* pmdailymenudtllike详情
* @param pram
*/
export function pmdailymenudtllikeDetailApi(id) {
return request({
url: `autogencode/pmdailymenudtllike/info/${id}`,
method: 'GET'
})
}
/**
* pmdailymenudtllike批量删除
* @param ids
*/
export function pmdailymenudtllikeDeleteApi(ids) {
return request({
url: `autogencode/pmdailymenudtllike/delete`,
method: 'POST',
data: ids
})
}
/**
* pmdailymenudtllike列表
* @param pram
*/
export function pmdailymenudtllikeListApi(params) {
return request({
url: `autogencode/pmdailymenudtllike/list`,
method: 'GET',
params
})
}
/**
* 对菜单明细进行点赞/点踩
* @param menuDtlId 菜单明细ID
* @param likeType 评价类型1-点赞2-点踩
*/
export function pmdailymenudtllikeLikeApi(menuDtlId, likeType) {
return request({
url: `autogencode/pmdailymenudtllike/like`,
method: 'POST',
params: {
menuDtlId,
likeType
}
})
}
/**
* 查询菜品点赞和点踩排行
* @param params 查询参数
* @param params.limit 返回数量限制
* @param params.rankingType 排行类型like-点赞排行dislike-点踩排行
* @param params.itemType 菜品类型
* @param params.date 日期
*/
export function pmdailymenudtllikeRankingApi(params) {
return request({
url: `autogencode/pmdailymenudtllike/ranking`,
method: 'GET',
params
})
}

@ -19,7 +19,14 @@
<el-input v-model="dataForm.contactWay" placeholder="联系方式"></el-input> <el-input v-model="dataForm.contactWay" placeholder="联系方式"></el-input>
</el-form-item> </el-form-item>
<el-form-item label="状态" prop="status"> <el-form-item label="状态" prop="status">
<el-input v-model="dataForm.status" placeholder="状态"></el-input> <el-select v-model="dataForm.status" placeholder="请选择状态">
<el-option
v-for="item in statusOptions"
:key="item.dictValue"
:label="item.dictLabel"
:value="item.dictValue">
</el-option>
</el-select>
</el-form-item> </el-form-item>
<el-form-item label="联系人" prop="contactPerson"> <el-form-item label="联系人" prop="contactPerson">
<el-input v-model="dataForm.contactPerson" placeholder="联系人"></el-input> <el-input v-model="dataForm.contactPerson" placeholder="联系人"></el-input>
@ -37,10 +44,12 @@
<script> <script>
import * as api from '@/api/cmcust.js' import * as api from '@/api/cmcust.js'
import { sysdicttypeTypesApi } from '@/api/sysdicttype.js'
export default { export default {
data () { data () {
return { return {
visible: false, visible: false,
statusOptions: [],
dataForm: { dataForm: {
id: 0, id: 0,
custCode: '' , custCode: '' ,
@ -80,6 +89,7 @@
init (id) { // init (id) { //
this.dataForm.id = id || 0 this.dataForm.id = id || 0
this.visible = true this.visible = true
this.getStatusOptions()
this.$nextTick(function() { this.$nextTick(function() {
this.$refs['dataForm'].resetFields() this.$refs['dataForm'].resetFields()
if (this.dataForm.id) { if (this.dataForm.id) {
@ -89,6 +99,14 @@
} }
}.bind(this)) }.bind(this))
}, },
//
getStatusOptions() {
sysdicttypeTypesApi(['cust_status']).then(res => {
if (res.code === 200 && res.data) {
this.statusOptions = res.data.filter(item => item.dictType === 'cust_status')
}
})
},
// //
dataSubmit () { dataSubmit () {
this.$refs['dataForm'].validate((valid) => { this.$refs['dataForm'].validate((valid) => {

@ -1,9 +1,9 @@
<template> <template>
<div class="divBox"> <div class="divBox">
<el-form :inline="true" :model="dataForm" @keyup.enter.native="getDataList()"> <el-form :inline="true" :model="dataForm" @keyup.enter.native="getDataList()">
<!-- <el-form-item label="客户代码">--> <!-- <el-form-item label="客户代码">
<!-- <el-input v-model="dataForm.custCode" placeholder="请输入客户代码" clearable></el-input>--> <el-input v-model="dataForm.custCode" placeholder="请输入客户代码" clearable></el-input>
<!-- </el-form-item>--> </el-form-item>-->
<el-form-item label="客户名称"> <el-form-item label="客户名称">
<el-input v-model="dataForm.custName" placeholder="请输入客户名称" clearable></el-input> <el-input v-model="dataForm.custName" placeholder="请输入客户名称" clearable></el-input>
</el-form-item> </el-form-item>
@ -14,7 +14,14 @@
<el-input v-model="dataForm.contactWay" placeholder="请输入联系方式" clearable></el-input> <el-input v-model="dataForm.contactWay" placeholder="请输入联系方式" clearable></el-input>
</el-form-item> </el-form-item>
<el-form-item label="状态"> <el-form-item label="状态">
<el-input v-model="dataForm.status" placeholder="请输入状态" clearable></el-input> <el-select v-model="dataForm.status" placeholder="请选择状态" clearable>
<el-option
v-for="item in statusOptions"
:key="item.dictValue"
:label="item.dictLabel"
:value="item.dictValue">
</el-option>
</el-select>
</el-form-item> </el-form-item>
<el-form-item label="联系人"> <el-form-item label="联系人">
<el-input v-model="dataForm.contactPerson" placeholder="请输入联系人" clearable></el-input> <el-input v-model="dataForm.contactPerson" placeholder="请输入联系人" clearable></el-input>
@ -70,6 +77,9 @@
header-align="center" header-align="center"
align="center" align="center"
label="状态"> label="状态">
<template slot-scope="scope">
{{ getStatusText(scope.row.status) }}
</template>
</el-table-column> </el-table-column>
<el-table-column <el-table-column
prop="contactPerson" prop="contactPerson"
@ -112,6 +122,7 @@
<script> <script>
import AddOrUpdate from './cmcust-add-and-update' import AddOrUpdate from './cmcust-add-and-update'
import * as api from '@/api/cmcust.js' import * as api from '@/api/cmcust.js'
import { sysdicttypeTypesApi } from '@/api/sysdicttype.js'
export default { export default {
data () { data () {
return { return {
@ -124,18 +135,7 @@
contactPerson: '', contactPerson: '',
remark: '', remark: '',
}, },
// statusOptions: [],
resetForm() {
this.dataForm = {
custCode: '',
custName: '',
licenseNumber: '',
contactWay: '',
status: '',
contactPerson: '',
remark: '',
}
},
dataList: [], dataList: [],
pageIndex: 1, pageIndex: 1,
pageSize: 10, pageSize: 10,
@ -149,9 +149,36 @@
AddOrUpdate AddOrUpdate
}, },
activated () { activated () {
this.getStatusOptions()
this.getDataList() this.getDataList()
}, },
methods: { methods: {
//
getStatusOptions() {
sysdicttypeTypesApi(['cust_status']).then(res => {
if (res.code === 200 && res.data) {
this.statusOptions = res.data.filter(item => item.dictType === 'cust_status')
}
})
},
//
getStatusText(status) {
if (!status) return '-'
const option = this.statusOptions.find(item => item.dictValue === status)
return option ? option.dictLabel : status
},
//
resetForm() {
this.dataForm = {
custCode: '',
custName: '',
licenseNumber: '',
contactWay: '',
status: '',
contactPerson: '',
remark: '',
}
},
// //
getDataList () { getDataList () {
this.dataListLoading = true this.dataListLoading = true

@ -14,7 +14,14 @@
<el-input v-model="dataForm.contactWay" placeholder="请输入联系方式" clearable></el-input> <el-input v-model="dataForm.contactWay" placeholder="请输入联系方式" clearable></el-input>
</el-form-item> </el-form-item>
<el-form-item label="状态"> <el-form-item label="状态">
<el-input v-model="dataForm.status" placeholder="请输入状态" clearable></el-input> <el-select v-model="dataForm.status" placeholder="请选择状态" clearable>
<el-option
v-for="dict in dict.type.cust_status"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item> </el-form-item>
<el-form-item label="联系人"> <el-form-item label="联系人">
<el-input v-model="dataForm.contactPerson" placeholder="请输入联系人" clearable></el-input> <el-input v-model="dataForm.contactPerson" placeholder="请输入联系人" clearable></el-input>

@ -19,7 +19,7 @@
</el-table-column> </el-table-column>
<el-table-column prop="orderQuantity" header-align="center" align="center" label="订单数量" style="width: 100px"> <el-table-column prop="orderQuantity" header-align="center" align="center" label="订单数量" style="width: 100px">
<template slot-scope="scope"> <template slot-scope="scope">
<template v-if="editingRow === scope.row.id"> <template v-if="editingRow == scope.row.id">
<el-input <el-input
v-model.number="editForm.orderQuantity" v-model.number="editForm.orderQuantity"
type="number" type="number"
@ -154,13 +154,20 @@ export default {
// //
editDetail(row) { editDetail(row) {
this.editingRow = row.id this.editingRow = row.id
// this.editingRow = String(row.id)
// editForm // editForm
// this.editForm = {
// orderQuantity: parseFloat(row.orderQuantity) || 0,
// orderPrice: parseFloat(row.orderPrice) || 0,
// orderAmount: parseFloat(row.orderAmount) || 0,
// remark: row.remark || ''
// }
this.editForm = { this.editForm = {
orderQuantity: parseFloat(row.orderQuantity) || 0, orderQuantity: row.orderQuantity,
orderPrice: parseFloat(row.orderPrice) || 0, orderPrice: row.orderPrice,
orderAmount: parseFloat(row.orderAmount) || 0, orderAmount: row.orderAmount,
remark: row.remark || '' remark: row.remark
} }
console.log('开始编辑,表单数据:', this.editForm) console.log('开始编辑,表单数据:', this.editForm)
}, },

@ -631,9 +631,6 @@
if (submitData.submitTime) { if (submitData.submitTime) {
submitData.submitTime = this.formatDate(submitData.submitTime) submitData.submitTime = this.formatDate(submitData.submitTime)
} }
if (submitData.handlerDate) {
submitData.handlerDate = this.formatDate(submitData.handlerDate)
}
if (this.dataForm.id) { if (this.dataForm.id) {
api.pmcomplaintsuggestionUpdateApi(submitData).then(function(res) { api.pmcomplaintsuggestionUpdateApi(submitData).then(function(res) {

@ -9,7 +9,6 @@
v-loading="dataListLoading" v-loading="dataListLoading"
:row-key="'id'" :row-key="'id'"
style="width: 100%;"> style="width: 100%;">
<el-table-column prop="itemName" header-align="center" align="center" label="菜品名称"> <el-table-column prop="itemName" header-align="center" align="center" label="菜品名称">
<template slot-scope="scope"> <template slot-scope="scope">
<template v-if="editingRow === scope.row.id"> <template v-if="editingRow === scope.row.id">
@ -33,14 +32,15 @@
</el-select> </el-select>
</template> </template>
<template v-else> <template v-else>
<dict-tag :options="dict.type.item_type" :value="scope.row.itemType" /> <dict-tag :options="dict.type.item_type" :value="scope.row.itemType"/>
</template> </template>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="itemPrice" header-align="center" align="center" label="菜品价格"> <el-table-column prop="itemPrice" header-align="center" align="center" label="菜品价格">
<template slot-scope="scope"> <template slot-scope="scope">
<template v-if="editingRow === scope.row.id"> <template v-if="editingRow === scope.row.id">
<el-input-number v-model="editForm.itemPrice" size="small" :min="0" :step="0.01" :precision="2"></el-input-number> <el-input-number v-model="editForm.itemPrice" size="small" :min="0" :step="0.01"
:precision="2"></el-input-number>
</template> </template>
<template v-else> <template v-else>
{{ scope.row.itemPrice }} {{ scope.row.itemPrice }}
@ -57,7 +57,7 @@
</template> </template>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column header-align="center" align="center" width="150" label="操作" fixed="right"> <el-table-column header-align="center" align="center" width="250" label="操作" fixed="right">
<template slot-scope="scope"> <template slot-scope="scope">
<template v-if="editingRow === scope.row.id"> <template v-if="editingRow === scope.row.id">
<el-button type="text" size="small" @click="saveDetail(scope.row.id)"></el-button> <el-button type="text" size="small" @click="saveDetail(scope.row.id)"></el-button>
@ -66,6 +66,24 @@
<template v-else> <template v-else>
<el-button type="text" size="small" @click="editDetail(scope.row)">{{ '' }}</el-button> <el-button type="text" size="small" @click="editDetail(scope.row)">{{ '' }}</el-button>
<el-button type="text" size="small" @click="deleteDetail(scope.row.id, scope.$index)" style="color: #f56c6c;">删除</el-button> <el-button type="text" size="small" @click="deleteDetail(scope.row.id, scope.$index)" style="color: #f56c6c;">删除</el-button>
<div class="estimate">
<div
class="upvote"
@click="likeDetail(scope.row)"
:class="{ 'active': scope.row.userLiked, 'disabled': scope.row.evaluationLimitReached }"
>
<i class="iconfont icon-dianzan"></i>
<span>{{ scope.row.likeCount || 0 }}</span>
</div>
<div
class="disapprove"
@click="dislikeDetail(scope.row)"
:class="{ 'active': scope.row.userDisliked, 'disabled': scope.row.evaluationLimitReached }"
>
<i class="iconfont icon-cai"></i>
<span>{{ scope.row.dislikeCount || 0 }}</span>
</div>
</div>
</template> </template>
</template> </template>
</el-table-column> </el-table-column>
@ -87,6 +105,8 @@
<script> <script>
import DictTag from '@/components/DictTag' import DictTag from '@/components/DictTag'
import * as detailApi from '@/api/pmdailymenudtl.js' import * as detailApi from '@/api/pmdailymenudtl.js'
import * as likeApi from '@/api/pmdailymenudtllike.js'
export default { export default {
components: { components: {
DictTag DictTag
@ -197,7 +217,8 @@ export default {
}).catch(() => { }).catch(() => {
this.$message.error('删除失败') this.$message.error('删除失败')
}) })
}).catch(() => {}) }).catch(() => {
})
}, },
// //
resetForm() { resetForm() {
@ -255,10 +276,99 @@ export default {
currentChangeHandle(val) { currentChangeHandle(val) {
this.pageIndex = val this.pageIndex = val
this.getDataList() this.getDataList()
},
//
likeDetail(row) {
//
row.likeLoading = true
likeApi.pmdailymenudtllikeLikeApi(row.id, '1').then(res => {
this.$message.success('点赞成功')
//
row.likeCount = (row.likeCount || 0) + 1
//
row.userLiked = true
//
row.evaluationLimitReached = true
}).catch(error => {
this.$message.error('点赞失败')
console.error(error)
}).finally(() => {
//
row.likeLoading = false
})
},
//
dislikeDetail(row) {
//
row.dislikeLoading = true
likeApi.pmdailymenudtllikeLikeApi(row.id, '2').then(res => {
this.$message.success('点踩成功')
//
row.dislikeCount = (row.dislikeCount || 0) + 1
//
row.userDisliked = true
//
row.evaluationLimitReached = true
}).catch(error => {
this.$message.error('点踩失败')
console.error(error)
}).finally(() => {
//
row.dislikeLoading = false
})
} }
} }
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.el-button {
margin-right: 12px;
}
.estimate {
display: flex;
.upvote,
.disapprove {
padding: 6px 8px;
font-size: 1rem;
cursor: pointer;
vertical-align: middle;
margin-right: 12px;
i {
vertical-align: middle;
font-size: 16px;
margin-right: 4px;
}
span {
font-size: 12px;
color: #606266;
}
&:hover:not(.disabled) {
color: #ccc;
i {
transform: scale(1.1);
transition: transform 0.2s ease;
}
}
&.active {
&.upvote {
color: #67C23A;
}
&.disapprove {
color: #F56C6C;
}
}
&.disabled {
cursor: not-allowed;
opacity: 0.6;
}
}
}
</style> </style>

@ -0,0 +1,201 @@
<template>
<div class="like-ranking-container">
<div class="ranking-header">
<h3>菜品评价排行</h3>
<el-radio-group v-model="rankingType" @change="getDataList">
<el-radio-button label="like">点赞排行</el-radio-button>
<el-radio-button label="dislike">点踩排行</el-radio-button>
</el-radio-group>
</div>
<div class="search-form">
<el-form :inline="true" :model="searchForm" class="demo-form-inline">
<el-form-item label="菜品类型">
<el-select v-model="searchForm.itemType" placeholder="请选择菜品类型" @change="getDataList">
<el-option
v-for="dict in dict.type.item_type"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="日期">
<el-date-picker
v-model="searchForm.dateRange"
type="daterange"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期"
@change="getDataList"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="getDataList"></el-button>
<el-button @click="resetForm"></el-button>
</el-form-item>
</el-form>
</div>
<el-table
:data="rankingList"
border
v-loading="dataListLoading"
style="width: 100%;">
<el-table-column type="index" label="排名" width="80" align="center"></el-table-column>
<el-table-column prop="itemName" header-align="center" align="center" label="菜品名称"></el-table-column>
<el-table-column prop="itemType" header-align="center" align="center" label="菜品类型">
<template slot-scope="scope">
<dict-tag :options="dict.type.item_type" :value="scope.row.itemType"/>
</template>
</el-table-column>
<el-table-column prop="itemPrice" header-align="center" align="center" label="菜品价格"></el-table-column>
<el-table-column header-align="center" align="center" :label="rankingType === 'like' ? '点赞数' : '点踩数'">
<template slot-scope="scope">
{{ rankingType === 'like' ? scope.row.likeCount : scope.row.dislikeCount }}
</template>
</el-table-column>
</el-table>
<el-pagination
hide-on-single-page
@size-change="sizeChangeHandle"
@current-change="currentChangeHandle"
:current-page="pageIndex"
:page-sizes="[10, 20, 50, 100]"
:page-size="pageSize"
:total="totalPage"
layout="total, sizes, prev, pager, next, jumper">
</el-pagination>
</div>
</template>
<script>
import DictTag from '@/components/DictTag'
import * as likeApi from '@/api/pmdailymenudtllike.js'
export default {
components: {
DictTag
},
dicts: ['item_type'],
data() {
return {
rankingType: 'like', //
searchForm: {
itemType: '',
dateRange: []
},
rankingList: [],
pageIndex: 1,
pageSize: 10,
totalPage: 0,
dataListLoading: false
}
},
mounted() {
this.getDataList()
},
methods: {
//
getDataList() {
this.dataListLoading = true
const params = {
limit: this.pageSize,
rankingType: this.rankingType,
itemType: this.searchForm.itemType
}
//
if (this.searchForm.dateRange && this.searchForm.dateRange.length === 2) {
params.startDate = this.formatDate(this.searchForm.dateRange[0])
params.endDate = this.formatDate(this.searchForm.dateRange[1])
}
likeApi.pmdailymenudtllikeRankingApi(params).then((res) => {
this.dataListLoading = false
if (res && 'list' in res) {
this.rankingList = res.list || []
this.totalPage = res.total || 0
} else if ('list' in res) {
this.rankingList = res.list || []
this.totalPage = res.total || 0
} else {
//
this.rankingList = []
this.totalPage = 0
}
}).catch((error) => {
this.dataListLoading = false
this.rankingList = []
this.totalPage = 0
console.error(error)
})
},
//
resetForm() {
this.searchForm = {
itemType: '',
date: ''
}
this.pageIndex = 1
this.getDataList()
},
//
formatDate(date) {
if (!date) return ''
const year = date.getFullYear()
const month = String(date.getMonth() + 1).padStart(2, '0')
const day = String(date.getDate()).padStart(2, '0')
return `${year}-${month}-${day}`
},
//
sizeChangeHandle(val) {
this.pageSize = val
this.pageIndex = 1
this.getDataList()
},
//
currentChangeHandle(val) {
this.pageIndex = val
this.getDataList()
},
//
viewDetail(id) {
//
this.$message.info('查看菜品详情:' + id)
}
}
}
</script>
<style lang="scss" scoped>
.like-ranking-container {
padding: 20px;
background: #fff;
border-radius: 4px;
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
}
.ranking-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 20px;
h3 {
margin: 0;
font-size: 18px;
font-weight: 500;
color: #303133;
}
}
.search-form {
margin-bottom: 20px;
padding: 15px;
background: #f5f7fa;
border-radius: 4px;
}
.el-table {
margin-bottom: 20px;
}
</style>

@ -0,0 +1,311 @@
<template>
<div class="divBox">
<el-form :inline="true" :model="dataForm" @keyup.enter.native="getDataList()">
<el-form-item label="祈愿人">
<el-input v-model="dataForm.ownerName" placeholder="请输入祈愿人" style="width: 150px"></el-input>
</el-form-item>
<el-form-item label="状态">
<el-select v-model="dataForm.status" placeholder="请选择状态" clearable style="width: 150px">
<el-option
v-for="dict in dict.type.suggestion_status"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item>
<el-button @click="getDataList()"></el-button>
<el-button @click="resetForm()"></el-button>
<el-button v-hasPermi="['autogencode:pmcomplaintsuggestion:save']" type="primary" @click="addOrUpdateHandle()"></el-button>
<el-button v-hasPermi="['autogencode:pmcomplaintsuggestion:delete']" type="danger" @click="deleteHandle()" :disabled="dataListSelections.length <= 0"></el-button>
</el-form-item>
</el-form>
<el-table
:data="dataList"
border
v-loading="dataListLoading"
@selection-change="selectionChangeHandle"
style="width: 100%;">
<el-table-column
type="selection"
header-align="center"
align="center"
width="50">
</el-table-column>
<el-table-column
prop="ownerName"
header-align="center"
align="center"
label="祈愿人">
</el-table-column>
<el-table-column
prop="csContent"
header-align="center"
align="center"
label="祈愿内容"
show-overflow-tooltip>
</el-table-column>
<el-table-column
prop="status"
header-align="center"
align="center"
label="状态">
<template slot-scope="scope">
<dict-tag :options="dict.type.suggestion_status" :value="scope.row.status"/>
</template>
</el-table-column>
<el-table-column
prop="submitTime"
header-align="center"
align="center"
label="提交时间">
</el-table-column>
<el-table-column
prop="handlerName"
header-align="center"
align="center"
label="处理人">
</el-table-column>
<el-table-column
prop="handlerReslut"
header-align="center"
align="center"
label="处理结果"
show-overflow-tooltip>
</el-table-column>
<el-table-column
prop="handlerDate"
header-align="center"
align="center"
label="处理时间">
</el-table-column>
<el-table-column
fixed="right"
header-align="center"
align="center"
width="150"
label="操作">
<template slot-scope="scope">
<el-button type="text" size="small" @click="addOrUpdateHandle(scope.row.id)">{{ '' }}</el-button>
<el-button v-if="scope.row.status !== '3'" type="text" size="small" @click="handleComplaint(scope.row.id)">{{ '' }}</el-button>
<el-button v-hasPermi="['autogencode:pmcomplaintsuggestion:delete']" type="text" size="small" @click="deleteHandle(scope.row.id)" style="color: #f56c6c;"></el-button>
</template>
</el-table-column>
</el-table>
<el-pagination
@size-change="sizeChangeHandle"
@current-change="currentChangeHandle"
:current-page="pageIndex"
:page-sizes="[10, 20, 50, 100]"
:page-size="pageSize"
:total="totalPage"
layout="total, sizes, prev, pager, next, jumper">
</el-pagination>
<!-- 表单弹窗, 新增数据和修改数据 -->
<add-or-update v-if="addOrUpdateVisible" ref="addOrUpdate" @refreshDataList="getDataList"></add-or-update>
</div>
</template>
<script>
import AddOrUpdate from './pmcomplaintsuggestion-add-and-update'
import * as api from '@/api/pmcomplaintsuggestion.js'
import * as ownerApi from '@/api/pmowner.js'
import * as houseApi from '@/api/pmhouse.js'
import DictTag from '@/components/DictTag'
export default {
dicts: ['suggestion_status'],
data () {
return {
dataForm: {
ownerName: '',
status: '',
remark: '',
csContent: '',
submitChannel: '',
submitTime: '',
handlerReslut: '',
handlerId: '',
handlerDate: '',
phone: '',
ownerType: '',
ownerId: '',
houseId: '',
houseOwnerId: '',
},
dataList: [],
pageIndex: 1,
pageSize: 10,
totalPage: 0,
dataListLoading: false,
dataListSelections: [],
addOrUpdateVisible: false,
ownerList: [],
houseList: []
}
},
components: {
AddOrUpdate,
DictTag
},
activated () {
this.getDataList()
},
mounted() {
//
this.getDataList()
//
this.loadOwnerList()
this.loadHouseList()
},
methods: {
//
loadOwnerList() {
ownerApi.pmownerListApi({ page: 1, limit: 9999 }).then(res => {
this.ownerList = res.list || []
})
},
//
loadHouseList() {
houseApi.pmhouseListApi({ page: 1, limit: 9999 }).then(res => {
this.houseList = res.list || []
})
},
// ID
getOwnerName(ownerId) {
const owner = this.ownerList.find(item => item.id === ownerId)
return owner ? owner.ownerName : ownerId
},
// ID
getHouseName(houseId) {
const house = this.houseList.find(item => item.id === houseId)
return house ? `${house.unitNo}单元 ${house.floorNo}${house.houseNo}` : houseId
},
//
resetForm() {
this.dataForm = {
ownerName: '',
status: '',
remark: '',
csContent: '',
submitChannel: '',
submitTime: '',
handlerReslut: '',
handlerId: '',
handlerDate: '',
phone: '',
ownerType: '',
ownerId: '',
houseId: '',
houseOwnerId: '',
}
this.getDataList()
},
//
getDataList () {
this.dataListLoading = true
// PmComplaintSuggestionControllerPageParamRequest
const params = {
page: this.pageIndex,
limit: this.pageSize
}
//
if (this.dataForm.ownerName) params.ownerName = this.dataForm.ownerName;
if (this.dataForm.status) params.status = this.dataForm.status;
if (this.dataForm.remark) params.remark = this.dataForm.remark;
if (this.dataForm.csContent) params.csContent = this.dataForm.csContent;
if (this.dataForm.submitChannel) params.submitChannel = this.dataForm.submitChannel;
if (this.dataForm.submitTime) params.submitTime = this.dataForm.submitTime;
if (this.dataForm.handlerReslut) params.handlerReslut = this.dataForm.handlerReslut;
if (this.dataForm.handlerId) params.handlerId = this.dataForm.handlerId;
if (this.dataForm.handlerDate) params.handlerDate = this.dataForm.handlerDate;
if (this.dataForm.phone) params.phone = this.dataForm.phone;
if (this.dataForm.ownerType) params.ownerType = this.dataForm.ownerType;
if (this.dataForm.ownerId) params.ownerId = this.dataForm.ownerId;
if (this.dataForm.houseId) params.houseId = this.dataForm.houseId;
if (this.dataForm.houseOwnerId) params.houseOwnerId = this.dataForm.houseOwnerId;
api.wishMenuListApi(params).then(res => {
this.dataListLoading = false
this.dataList = res.list || [];
this.totalPage = res.total;
}).catch(e => {
this.dataListLoading = false
})
},
//
sizeChangeHandle (val) {
this.pageSize = val
this.pageIndex = 1
this.getDataList()
},
//
currentChangeHandle (val) {
this.pageIndex = val
this.getDataList()
},
//
selectionChangeHandle (val) {
this.dataListSelections = val
},
// /
addOrUpdateHandle (id) {
this.addOrUpdateVisible = true
this.$nextTick(() => {
this.$refs.addOrUpdate.init(id)
})
},
//
deleteHandle (id) {
let ids = []
let idText = ''
// id
if (id) {
ids = [id]
idText = id
} else {
//
ids = this.dataListSelections.map(item => {
return item.id
})
idText = ids.join(',')
}
this.$confirm(`确定进行删除操作?`, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
// API
api.pmcomplaintsuggestionDeleteApi(ids).then(res => {
this.$message.success('删除成功')
this.getDataList()
})
})
},
// /3
handleComplaint (id) {
this.$confirm('确定要将该投诉/建议标记为已处理吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
// API
api.pmcomplaintsuggestionUpdateApi({
id: id,
status: '3'
}).then(res => {
this.$message.success('处理成功')
this.getDataList()
}).catch(() => {
this.$message.error('处理失败')
})
}).catch(() => {})
},
}
}
</script>

@ -0,0 +1,471 @@
<template>
<!-- 基于 Element UI 新增和修改弹窗 -->
<el-dialog
:title="!dataForm.id ? '新增祈愿' : '修改祈愿'"
:close-on-click-modal="false"
:visible.sync="visible"
width="80%">
<!-- 新增和修改表单 -->
<el-form :model="dataForm" :rules="dataRule" ref="dataForm" @keyup.enter.native="dataSubmit()" label-width="100px">
<!-- 第一行业主类型祈愿人房屋名称 -->
<el-row :gutter="20">
<el-col :span="8">
<el-form-item label="业主类型" prop="ownerType">
<el-select v-model="dataForm.ownerType" placeholder="请选择业主类型" clearable style="width: 100%"
@change="handleOwnerTypeChange" filterable>
<el-option
v-for="dict in dict.type.owner_type"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item :label="dataForm.ownerType === '1' ? '祈愿人' : '祈愿人'" prop="ownerId">
<el-select v-if="dataForm.ownerType === '1'" v-model="dataForm.ownerId" placeholder="请选择业主" clearable
style="width: 100%" @change="handleOwnerChange" filterable>
<el-option
v-for="item in ownerList"
:key="item.id"
:label="item.ownerName"
:value="item.id"
/>
</el-select>
<el-select v-else-if="dataForm.ownerType === '2'" v-model="dataForm.ownerId" placeholder="请选择租户" clearable
style="width: 100%" @change="handleOwnerChange" filterable>
<el-option
v-for="item in tenantList"
:key="item.id"
:label="item.tenantName"
:value="item.id"
/>
</el-select>
<el-select v-else v-model="dataForm.ownerId" placeholder="请先选择业主类型" clearable disabled style="width: 100%"></el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="房屋名称" prop="houseId">
<el-select v-model="dataForm.houseId" placeholder="选择房屋" clearable style="width: 100%"
@change="handleHouseChange" filterable>
<el-option
v-for="item in ownerHouseList"
:key="item.id"
:label="`${item.unitNo}单元 ${item.floorNo}层 ${item.houseNo}室`"
:value="item.id"
/>
</el-select>
</el-form-item>
</el-col>
</el-row>
<!-- 第二行提交渠道联系方式 -->
<el-row :gutter="20">
<el-col :span="8">
<el-form-item label="提交渠道" prop="submitChannel">
<el-select v-model="dataForm.submitChannel" placeholder="请选择提交渠道" clearable style="width: 100%" filterable>
<el-option
v-for="dict in dict.type.submit_channel"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="联系方式" prop="phone">
<el-input v-model="dataForm.phone" placeholder="联系方式"></el-input>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="类型" prop="csType" style="display: none;">
<el-input v-model="dataForm.csType" placeholder="类型" readonly></el-input>
</el-form-item>
</el-col>
</el-row>
<!-- 第三行提交时间 -->
<el-row :gutter="20">
<el-col :span="8">
<el-form-item label="提交时间" prop="submitTime">
<el-date-picker v-model="dataForm.submitTime" type="datetime" placeholder="选择提交时间" style="width: 100%"></el-date-picker>
</el-form-item>
</el-col>
</el-row>
<!-- 内容 -->
<el-row :gutter="20">
<el-col :span="24">
<el-form-item label="祈愿内容" prop="csContent">
<el-input v-model="dataForm.csContent" placeholder="请输入祈愿内容" type="textarea" :rows="4"></el-input>
</el-form-item>
</el-col>
</el-row>
<!-- 隐藏的字段 -->
<el-form-item label="房屋业主id" prop="houseOwnerId" v-show="false">
<el-input v-model="dataForm.houseOwnerId" placeholder="房屋业主id" readonly></el-input>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="visible = false">取消</el-button>
<el-button type="primary" @click="dataSubmit()"></el-button>
</span>
</el-dialog>
</template>
<script>
import * as api from '@/api/pmcomplaintsuggestion.js'
import * as ownerApi from '@/api/pmowner.js'
import * as tenantApi from '@/api/pmtenant.js'
import * as tenantHouseApi from '@/api/pmtenanthouse.js'
import * as houseApi from '@/api/pmhouse.js'
import * as ownerHouseRelApi from '@/api/pmownerhouserel.js'
import * as tenantHouseRelApi from '@/api/pmtenanthouserel.js'
export default {
dicts: ['owner_type', 'submit_channel', 'suggestion_status'],
data () {
return {
visible: false,
ownerList: [],
tenantList: [],
ownerHouseList: [], //
dataForm: {
id: 0,
csType: '' ,
status: '1' ,
csContent: '' ,
submitChannel: '' ,
submitTime: '' ,
phone: '' ,
ownerType: '' ,
ownerId: '' ,
houseId: '' ,
houseOwnerId: ''
},
dataRule: {
ownerType: [
{ required: true, message: '业主类型为必填项', trigger: 'blur' }
],
ownerId: [
{ required: true, message: '祈愿人为必填项', trigger: 'blur' }
],
houseId: [
{ required: true, message: '房屋为必填项', trigger: 'blur' }
],
csContent: [
{ required: true, message: '祈愿内容为必填项', trigger: 'blur' }
]
}
}
},
mounted() {
this.handleGetOwnerList()
this.handleGetTenantList()
},
methods: {
//
handleGetOwnerList() {
ownerApi.pmownerListApi({page: 1, limit: 9999}).then(res => {
this.ownerList = res.list || []
})
},
//
handleGetTenantList() {
tenantApi.pmtenantListApi({page: 1, limit: 9999}).then(res => {
this.tenantList = res.list || []
})
},
//
handleOwnerTypeChange(ownerType) {
// IDID
this.dataForm.ownerId = ''
this.dataForm.houseId = ''
this.dataForm.houseOwnerId = ''
this.ownerHouseList = []
},
//
handleOwnerChange(ownerId, callback) {
//
if (ownerId) {
if (this.dataForm.ownerType === '1') {
//
ownerHouseRelApi.pmownerhouserelListApi({ ownerId: ownerId, page: 1, limit: 9999 }).then(res => {
const relList = res.list || []
// ID
const houseIds = relList.map(item => item.houseId)
//
this.ownerHouseList = this.houseList.filter(house => houseIds.includes(house.id))
//
this.dataForm.houseId = ''
this.dataForm.houseOwnerId = ''
//
const owner = this.ownerList.find(item => item.id === ownerId)
if (owner && owner.deptId) {
this.dataForm.ownerCompany = owner.deptId
this.dataForm.ownerCompanyName = owner.deptName || ''
}
//
if (callback) {
callback()
}
})
} else if (this.dataForm.ownerType === '2') {
// PmTenantHousetenantIdLong rentId
tenantHouseApi.pmtenanthouseListApi({ rentId: ownerId, page: 1, limit: 9999 }).then(res => {
const tenantHouses = res.list || []
if (tenantHouses.length > 0) {
// ID
const allHouseIds = []
// PmTenantHouseID
const promises = tenantHouses.map(tenantHouse => {
// pm_tenant_houseidPmTenantHouseRel
return tenantHouseRelApi.pmtenanthouserelListApi({ tenantHouseId: tenantHouse.id, page: 1, limit: 9999 }).then(relRes => {
const relList = relRes.list || []
if (relList.length > 0) {
const houseIds = relList.map(item => item.houseId)
return houseIds
}
return []
})
})
Promise.all(promises).then(results => {
// ID
results.forEach(houseIds => {
allHouseIds.push(...houseIds)
})
//
this.ownerHouseList = this.houseList.filter(house => allHouseIds.includes(house.id))
//
this.dataForm.houseId = ''
this.dataForm.houseOwnerId = ''
//
const tenant = this.tenantList.find(item => item.id === ownerId)
if (tenant && tenant.deptId) {
this.dataForm.ownerCompany = tenant.deptId
this.dataForm.ownerCompanyName = tenant.deptName || ''
}
//
if (callback) {
callback()
}
})
} else {
//
this.ownerHouseList = []
this.dataForm.houseId = ''
this.dataForm.houseOwnerId = ''
//
const tenant = this.tenantList.find(item => item.id === ownerId)
if (tenant && tenant.deptId) {
this.dataForm.ownerCompany = tenant.deptId
this.dataForm.ownerCompanyName = tenant.deptName || ''
}
//
if (callback) {
callback()
}
}
})
}
} else {
this.ownerHouseList = []
this.dataForm.houseId = ''
this.dataForm.houseOwnerId = ''
//
this.dataForm.ownerCompany = ''
this.dataForm.ownerCompanyName = ''
//
if (callback) {
callback()
}
}
},
//
handleHouseChange(houseId) {
if (houseId) {
// IDID
this.dataForm.houseOwnerId = this.dataForm.ownerId
} else {
// ID
this.dataForm.houseOwnerId = ''
}
},
//
updateBeforeProcessFiles(files) {
this.beforeProcessFiles = files
// dataForm.beforeProcessFiles
if (files && files.length > 0) {
// FileUploadVOSystemAttachment
this.dataForm.beforeProcessFiles = files.map(file => {
//
let attDir = file.attDir || file.attachFileUrl || ''
// /file/public/
if (attDir.startsWith('/file/public/')) {
attDir = attDir.replace('/file/public/', '')
} else if (attDir.startsWith('/file/')) {
attDir = attDir.replace('/file/', '')
}
return {
// SystemAttachment
attId: file.id || file.attId || '', //
name: file.name || file.oldName || '', //
attDir: attDir, //
attSize: file.attSize || '', //
attType: 'before_process', //
//
fileName: file.name || file.oldName || '',
filePath: attDir,
url: attDir,
createTime: null,
createdBy: null,
createTimeStr: null,
delFlag: '0',
updateBy: null,
updateTime: null,
i18nCode: '',
i18nLanguage: '',
originalFileName: file.name || file.oldName || '',
position: 0,
remark: file.remark || '',
sort: 0,
status: ''
}
})
} else {
this.dataForm.beforeProcessFiles = []
}
},
//
updateAfterProcessFiles(files) {
this.afterProcessFiles = files
// dataForm.afterProcessFiles
if (files && files.length > 0) {
// FileUploadVOSystemAttachment
this.dataForm.afterProcessFiles = files.map(file => {
//
let attDir = file.attDir || file.attachFileUrl || ''
// /file/public/
if (attDir.startsWith('/file/public/')) {
attDir = attDir.replace('/file/public/', '')
} else if (attDir.startsWith('/file/')) {
attDir = attDir.replace('/file/', '')
}
return {
// SystemAttachment
attId: file.id || file.attId || '', //
name: file.name || file.oldName || '', //
attDir: attDir, //
attSize: file.attSize || '', //
attType: 'after_process', //
//
fileName: file.name || file.oldName || '',
filePath: attDir,
url: attDir,
createTime: null,
createdBy: null,
createTimeStr: null,
delFlag: '0',
updateBy: null,
updateTime: null,
i18nCode: '',
i18nLanguage: '',
originalFileName: file.name || file.oldName || '',
position: 0,
remark: file.remark || '',
sort: 0,
status: ''
}
})
} else {
this.dataForm.afterProcessFiles = []
}
},
init (id) { //
this.dataForm.id = id || 0
this.visible = true
this.beforeProcessFiles = [] //
this.afterProcessFiles = [] //
this.$nextTick(function() {
this.$refs['dataForm'].resetFields()
// csType99
if (!this.dataForm.id) {
this.dataForm.csType = '99'
}
if (this.dataForm.id) {
api.pmcomplaintsuggestionDetailApi(id).then(function(res) {
// Date
const data = res;
if (data.submitTime) {
data.submitTime = new Date(data.submitTime)
}
this.dataForm = data;
// ID
const houseId = data.houseId;
//
this.handleOwnerChange(data.ownerId, () => {
// ID
this.$nextTick(() => {
this.dataForm.houseId = houseId;
// ID
this.handleHouseChange(houseId);
});
});
}.bind(this))
}
}.bind(this))
},
//
dataSubmit () {
this.$refs['dataForm'].validate((valid) => {
if (valid) {
//
const submitData = { ...this.dataForm }
if (submitData.submitTime) {
submitData.submitTime = this.formatDate(submitData.submitTime)
}
if (submitData.handlerDate) {
submitData.handlerDate = this.formatDate(submitData.handlerDate)
}
if (this.dataForm.id) {
api.pmcomplaintsuggestionUpdateApi(submitData).then(function(res) {
this.$message.success('保存成功')
this.visible = false
this.$emit('refreshDataList')
}.bind(this));
} else {
api.pmcomplaintsuggestionCreateApi(submitData).then(function(res) {
this.$message.success('新增成功')
this.visible = false
this.$emit('refreshDataList')
}.bind(this));
}
}
})
},
// YYYY-MM-DD HH:mm:ss
formatDate(date) {
if (!date) return ''
const d = new Date(date)
const year = d.getFullYear()
const month = String(d.getMonth() + 1).padStart(2, '0')
const day = String(d.getDate()).padStart(2, '0')
const hours = String(d.getHours()).padStart(2, '0')
const minutes = String(d.getMinutes()).padStart(2, '0')
const seconds = String(d.getSeconds()).padStart(2, '0')
return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`
}
}
}
</script>

@ -186,6 +186,18 @@ public class CmCustController {
} }
supplier.setQualifyStatus(qualifyStatus); supplier.setQualifyStatus(qualifyStatus);
// 设置资质状态的虚拟字段根据supplier关联的所有CmCustQualifyFile的status是否都是status为1
String allStatusPassed = "0";
List<CmCustQualifyFile> allCustFiles = allFilesMap.getOrDefault(supplier.getId(), Collections.emptyList());
if (!allCustFiles.isEmpty()) {
boolean isAllStatusOne = allCustFiles.stream().allMatch(file -> "1".equals(file.getStatus()));
if (isAllStatusOne) {
allStatusPassed = "1";
}
}
supplier.setAllStatusPassed(allStatusPassed);
} }
return CommonResult.success(page); return CommonResult.success(page);
@ -235,6 +247,19 @@ public class CmCustController {
// 设置供应商的资质列表 // 设置供应商的资质列表
cmCust.setCmCustQualifyList(qualifyList); cmCust.setCmCustQualifyList(qualifyList);
// 设置资质状态的虚拟字段根据supplier关联的所有CmCustQualifyFile的status是否都是status为1
String allStatusPassed = "0";
List<CmCustQualifyFile> allCustFiles = cmCustQualifyFileService.list(new LambdaQueryWrapper<CmCustQualifyFile>()
.eq(CmCustQualifyFile::getCustId, id)
.eq(CmCustQualifyFile::getDelFlag, "0"));
if (!allCustFiles.isEmpty()) {
boolean isAllStatusOne = allCustFiles.stream().allMatch(file -> "1".equals(file.getStatus()));
if (isAllStatusOne) {
allStatusPassed = "1";
}
}
cmCust.setAllStatusPassed(allStatusPassed);
} }
return CommonResult.success(cmCust); return CommonResult.success(cmCust);

@ -1,6 +1,7 @@
package com.zbkj.modules.autogencode.controller; package com.zbkj.modules.autogencode.controller;
import java.util.Arrays; import java.util.Arrays;
import java.util.List;
import java.util.Map; import java.util.Map;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
@ -8,6 +9,12 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.zbkj.common.request.PageParamRequest; import com.zbkj.common.request.PageParamRequest;
import com.zbkj.common.response.CommonResult; import com.zbkj.common.response.CommonResult;
import com.zbkj.common.page.CommonPage; import com.zbkj.common.page.CommonPage;
import com.zbkj.modules.autogencode.entity.CmCustProduct;
import com.zbkj.modules.autogencode.service.CmCustProductService;
import com.zbkj.modules.autogencode.entity.PmCanteenPurchaseDetail;
import com.zbkj.modules.autogencode.service.PmCanteenPurchaseDetailService;
import com.zbkj.modules.autogencode.entity.PmCanteenPurchasePlan;
import com.zbkj.modules.autogencode.service.PmCanteenPurchasePlanService;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
@ -32,7 +39,12 @@ import com.zbkj.modules.autogencode.service.PmCanteenPlanOrderRelService;
public class PmCanteenPlanOrderRelController { public class PmCanteenPlanOrderRelController {
@Autowired @Autowired
private PmCanteenPlanOrderRelService pmCanteenPlanOrderRelService; private PmCanteenPlanOrderRelService pmCanteenPlanOrderRelService;
@Autowired
private CmCustProductService cmCustProductService;
@Autowired
private PmCanteenPurchaseDetailService pmCanteenPurchaseDetailService;
@Autowired
private PmCanteenPurchasePlanService pmCanteenPurchasePlanService;
/** /**
@ -137,8 +149,48 @@ public class PmCanteenPlanOrderRelController {
// 应用搜索条件 // 应用搜索条件
condition(queryWrapper, request); condition(queryWrapper, request);
List<PmCanteenPlanOrderRel> pmCanteenPlanOrderRels = pmCanteenPlanOrderRelService.pageList(queryWrapper, pageParamRequest);
if (null != pmCanteenPlanOrderRels && pmCanteenPlanOrderRels.size() > 0 ) {
for (PmCanteenPlanOrderRel rel : pmCanteenPlanOrderRels) {
// 如果有detailId查询PmCanteenPurchaseDetail进行字段赋值
if (rel.getDetailId() != null) {
PmCanteenPurchaseDetail detail = pmCanteenPurchaseDetailService.getById(rel.getDetailId());
if (detail != null) {
// 从采购明细表中获取字段值 还要有计划编号
rel.setGoodsId(detail.getGoodsId());
rel.setGoodsName(detail.getGoodsName());
rel.setGoodsCode(detail.getGoodsCode());
rel.setSpec(detail.getSpec());
rel.setUnit(detail.getUnit());
rel.setSupplierId(detail.getCustId());
rel.setSupplierName(detail.getCustName());
// 查询计划编号
if (detail.getPlanId() != null) {
PmCanteenPurchasePlan plan = pmCanteenPurchasePlanService.getById(detail.getPlanId());
if (plan != null) {
rel.setPlanNo(plan.getPlanNo());
}
}
}
}
if (rel.getGoodsId() != null) {
// 从商品表中查询商品信息
CmCustProduct goodsDetail = cmCustProductService.getById(rel.getGoodsId());
if (goodsDetail != null) {
rel.setGoodsCode(goodsDetail.getGoodsCode());
rel.setSpec(goodsDetail.getSpec());
rel.setUnit(goodsDetail.getUnit());
rel.setSupplierId(goodsDetail.getCustId());
rel.setSupplierName(goodsDetail.getCustName());
rel.setGoodsName(goodsDetail.getGoodsName());
}
}
}
}
CommonPage<PmCanteenPlanOrderRel> page = CommonPage.restPage(pmCanteenPlanOrderRelService.pageList(queryWrapper, pageParamRequest)); CommonPage<PmCanteenPlanOrderRel> page = CommonPage.restPage(pmCanteenPlanOrderRels);
return CommonResult.success(page); return CommonResult.success(page);
} }

@ -585,10 +585,6 @@ public class PmCanteenPurchasePlanController {
} }
// 描写 去吃饭之前,请求帮助 巴麻美答应帮忙,其他人也答应帮忙
// 因为枫在昨晚也帮助过其他人
// 鹤乃表示大家一起帮忙,很快就可以解决了。
// 前往中央电波塔

@ -194,6 +194,11 @@ public class PmComplaintSuggestionController {
queryWrapper.eq(PmComplaintSuggestion::getOwnerId, request.getOwnerId()); queryWrapper.eq(PmComplaintSuggestion::getOwnerId, request.getOwnerId());
} }
// 业主名称
if (StrUtil.isNotBlank(request.getOwnerName())) {
queryWrapper.like(PmComplaintSuggestion::getOwnerName, request.getOwnerName());
}
// 房屋id // 房屋id
if (request.getHouseId() != null) { if (request.getHouseId() != null) {
queryWrapper.eq(PmComplaintSuggestion::getHouseId, request.getHouseId()); queryWrapper.eq(PmComplaintSuggestion::getHouseId, request.getHouseId());
@ -241,6 +246,9 @@ public class PmComplaintSuggestionController {
// 应用搜索条件 // 应用搜索条件
condition(queryWrapper, request); condition(queryWrapper, request);
// 过滤掉csType=99的数据祈愿菜单
queryWrapper.ne(PmComplaintSuggestion::getCsType, "99");
List<PmComplaintSuggestion> list = pmComplaintSuggestionService.pageList(queryWrapper, pageParamRequest); List<PmComplaintSuggestion> list = pmComplaintSuggestionService.pageList(queryWrapper, pageParamRequest);
// 为每个投诉建议添加处理人名称、业主名称和房屋名称 // 为每个投诉建议添加处理人名称、业主名称和房屋名称
@ -327,6 +335,108 @@ public class PmComplaintSuggestionController {
} }
/**
* csType=99
* @param request
* @param pageParamRequest
*/
@ApiOperation(value = "祈愿菜单列表")
@RequestMapping(value = "/wishMenuList", method = RequestMethod.GET)
public CommonResult<CommonPage<PmComplaintSuggestion>> getWishMenuList(@Validated PmComplaintSuggestion request, @Validated PageParamRequest pageParamRequest) {
LambdaQueryWrapper<PmComplaintSuggestion> queryWrapper = new LambdaQueryWrapper();
// 强制设置csType为99祈愿菜单类型
request.setCsType("99");
// 应用搜索条件
condition(queryWrapper, request);
List<PmComplaintSuggestion> list = pmComplaintSuggestionService.pageList(queryWrapper, pageParamRequest);
// 为每个祈愿菜单添加处理人名称、业主名称和房屋名称
for (PmComplaintSuggestion item : list) {
// 添加处理人名称
if (item.getHandlerId() != null) {
try {
// 将Long类型的handlerId转换为Integer
Integer adminId = item.getHandlerId().intValue();
com.zbkj.common.model.system.SystemAdmin admin = systemAdminService.getDetail(adminId);
if (admin != null) {
item.setHandlerName(admin.getRealName());
} else {
item.setHandlerName("");
}
} catch (Exception e) {
item.setHandlerName("");
}
} else {
item.setHandlerName("");
}
// 添加业主名称
if (item.getOwnerId() != null) {
if ("1".equals(item.getOwnerType())) {
PmOwner owner = pmOwnerService.getById(item.getOwnerId());
item.setOwnerName(owner != null ? owner.getOwnerName() : "");
} else if ("2".equals(item.getOwnerType())) {
PmTenant tenant = pmTenantService.getById(item.getOwnerId());
item.setOwnerName(tenant != null ? tenant.getTenantName() : "");
}
}
// 添加房屋名称
if (item.getHouseId() != null) {
PmHouse house = pmHouseService.getById(item.getHouseId());
if (house != null) {
StringBuilder houseName = new StringBuilder();
if (house.getUnitNo() != null) {
houseName.append(house.getUnitNo()).append("单元 ");
}
if (house.getFloorNo() != null) {
houseName.append(house.getFloorNo()).append("层 ");
}
if (house.getHouseNo() != null) {
houseName.append(house.getHouseNo()).append("室");
}
item.setHouseName(houseName.toString());
}
}
// 添加被投诉房屋名称
if (item.getComplainedHouseId() != null) {
PmHouse complainedHouse = pmHouseService.getById(item.getComplainedHouseId());
if (complainedHouse != null) {
StringBuilder complainedHouseName = new StringBuilder();
if (complainedHouse.getUnitNo() != null) {
complainedHouseName.append(complainedHouse.getUnitNo()).append("单元 ");
}
if (complainedHouse.getFloorNo() != null) {
complainedHouseName.append(complainedHouse.getFloorNo()).append("层 ");
}
if (complainedHouse.getHouseNo() != null) {
complainedHouseName.append(complainedHouse.getHouseNo()).append("室");
}
item.setComplainedHouseName(complainedHouseName.toString());
}
}
// 添加业主所属部门名称
if (item.getOwnerCompany() != null) {
SysDept dept = sysDeptService.getById(item.getOwnerCompany());
if (dept != null) {
item.setOwnerDeptName(dept.getDeptName());
}
}
// 设置文件列表
setFile(item);
}
CommonPage<PmComplaintSuggestion> page = CommonPage.restPage(list);
return CommonResult.success(page);
}
/** /**
* *
*/ */
@ -421,6 +531,25 @@ public class PmComplaintSuggestionController {
@RequestMapping(value = "/save", method = RequestMethod.POST) @RequestMapping(value = "/save", method = RequestMethod.POST)
public CommonResult<String> save(@RequestBody PmComplaintSuggestion pmComplaintSuggestion){ public CommonResult<String> save(@RequestBody PmComplaintSuggestion pmComplaintSuggestion){
// 检查是否是祈愿菜单csType=99
if ("99".equals(pmComplaintSuggestion.getCsType())) {
// 检查用户是否已有未答复的祈愿
if (pmComplaintSuggestion.getOwnerId() != null) {
LambdaQueryWrapper<PmComplaintSuggestion> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(PmComplaintSuggestion::getCsType, "99"); // 祈愿菜单类型
queryWrapper.eq(PmComplaintSuggestion::getOwnerId, pmComplaintSuggestion.getOwnerId()); // 同一用户
queryWrapper.ne(PmComplaintSuggestion::getStatus, "3"); // 状态不是已处理
queryWrapper.eq(PmComplaintSuggestion::getDelFlag, "0"); // 未删除
long count = pmComplaintSuggestionService.count(queryWrapper);
if (count > 0) {
return CommonResult.failed("您有未答复的祈愿,请等待处理完成后再提交新的祈愿");
}
} else {
return CommonResult.failed("请先选择祈愿人");
}
}
// 获取当前用户信息(如果没有通过 uid 设置 create_by // 获取当前用户信息(如果没有通过 uid 设置 create_by
Long currentUserId = null; Long currentUserId = null;
if (pmComplaintSuggestion.getCreateBy() == null) { if (pmComplaintSuggestion.getCreateBy() == null) {

@ -27,6 +27,8 @@ import com.zbkj.modules.autogencode.entity.PmDailyMenu;
import com.zbkj.modules.autogencode.entity.PmDailyMenuDtl; import com.zbkj.modules.autogencode.entity.PmDailyMenuDtl;
import com.zbkj.modules.autogencode.service.PmDailyMenuDtlService; import com.zbkj.modules.autogencode.service.PmDailyMenuDtlService;
import com.zbkj.modules.autogencode.service.PmDailyMenuService; import com.zbkj.modules.autogencode.service.PmDailyMenuService;
import com.zbkj.modules.autogencode.entity.PmDailyMenuDtlLike;
import com.zbkj.modules.autogencode.service.PmDailyMenuDtlLikeService;
@ -43,6 +45,9 @@ public class PmDailyMenuDtlController {
@Autowired @Autowired
private PmDailyMenuService pmDailyMenuService; private PmDailyMenuService pmDailyMenuService;
@Autowired
private PmDailyMenuDtlLikeService pmDailyMenuDtlLikeService;
/** /**
@ -215,6 +220,22 @@ public class PmDailyMenuDtlController {
dtl.setMealType(menu.getMealType()); dtl.setMealType(menu.getMealType());
} }
} }
// 计算点赞数量
LambdaQueryWrapper<PmDailyMenuDtlLike> likeQueryWrapper = new LambdaQueryWrapper<>();
likeQueryWrapper.eq(PmDailyMenuDtlLike::getMenuDtlId, dtl.getId());
likeQueryWrapper.eq(PmDailyMenuDtlLike::getLikeType, "1");
likeQueryWrapper.eq(PmDailyMenuDtlLike::getDelFlag, "0");
int likeCount = pmDailyMenuDtlLikeService.count(likeQueryWrapper);
dtl.setLikeCount(likeCount);
// 计算点踩数量
LambdaQueryWrapper<PmDailyMenuDtlLike> dislikeQueryWrapper = new LambdaQueryWrapper<>();
dislikeQueryWrapper.eq(PmDailyMenuDtlLike::getMenuDtlId, dtl.getId());
dislikeQueryWrapper.eq(PmDailyMenuDtlLike::getLikeType, "2");
dislikeQueryWrapper.eq(PmDailyMenuDtlLike::getDelFlag, "0");
int dislikeCount = pmDailyMenuDtlLikeService.count(dislikeQueryWrapper);
dtl.setDislikeCount(dislikeCount);
} }
CommonPage<PmDailyMenuDtl> page = CommonPage.restPage(pmDailyMenuDtls); CommonPage<PmDailyMenuDtl> page = CommonPage.restPage(pmDailyMenuDtls);
@ -270,6 +291,22 @@ public class PmDailyMenuDtlController {
dtl.setMealType(menu.getMealType()); dtl.setMealType(menu.getMealType());
} }
} }
// 计算点赞数量
LambdaQueryWrapper<PmDailyMenuDtlLike> likeQueryWrapper = new LambdaQueryWrapper<>();
likeQueryWrapper.eq(PmDailyMenuDtlLike::getMenuDtlId, dtl.getId());
likeQueryWrapper.eq(PmDailyMenuDtlLike::getLikeType, "1");
likeQueryWrapper.eq(PmDailyMenuDtlLike::getDelFlag, "0");
int likeCount = pmDailyMenuDtlLikeService.count(likeQueryWrapper);
dtl.setLikeCount(likeCount);
// 计算点踩数量
LambdaQueryWrapper<PmDailyMenuDtlLike> dislikeQueryWrapper = new LambdaQueryWrapper<>();
dislikeQueryWrapper.eq(PmDailyMenuDtlLike::getMenuDtlId, dtl.getId());
dislikeQueryWrapper.eq(PmDailyMenuDtlLike::getLikeType, "2");
dislikeQueryWrapper.eq(PmDailyMenuDtlLike::getDelFlag, "0");
int dislikeCount = pmDailyMenuDtlLikeService.count(dislikeQueryWrapper);
dtl.setDislikeCount(dislikeCount);
} }
return CommonResult.success(pmDailyMenuDtls); return CommonResult.success(pmDailyMenuDtls);
@ -327,6 +364,3 @@ public class PmDailyMenuDtlController {

@ -0,0 +1,371 @@
package com.zbkj.modules.autogencode.controller;
import java.util.Arrays;
import java.util.Map;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.ArrayList;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.zbkj.common.request.PageParamRequest;
import com.zbkj.common.response.CommonResult;
import com.zbkj.common.page.CommonPage;
import com.zbkj.common.utils.SecurityUtil;
import com.zbkj.common.vo.LoginUserVo;
import com.zbkj.modules.autogencode.entity.PmDailyMenu;
import com.zbkj.modules.autogencode.service.PmDailyMenuService;
import com.zbkj.modules.autogencode.entity.PmDailyMenuDtl;
import com.zbkj.modules.autogencode.service.PmDailyMenuDtlService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import io.swagger.annotations.ApiOperation;
import org.springframework.security.access.prepost.PreAuthorize;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.zbkj.modules.autogencode.entity.PmDailyMenuDtlLike;
import com.zbkj.modules.autogencode.service.PmDailyMenuDtlLikeService;
/**
* /
*/
@RestController
@RequestMapping("api/autogencode/pmdailymenudtllike")
public class PmDailyMenuDtlLikeController {
@Autowired
private PmDailyMenuDtlLikeService pmDailyMenuDtlLikeService;
@Autowired
private PmDailyMenuDtlService pmDailyMenuDtlService;
@Autowired
private PmDailyMenuService pmDailyMenuService;
/**
*
*
*/
private void condition(LambdaQueryWrapper<PmDailyMenuDtlLike> queryWrapper, PmDailyMenuDtlLike request) {
if (request == null) {
return;
}
// 根据实体类字段自动生成查询条件
// 主键ID
if (request.getId() != null) {
queryWrapper.eq(PmDailyMenuDtlLike::getId, request.getId());
}
// 菜单明细ID关联pm_daily_menu_dtl.id
if (request.getMenuDtlId() != null) {
queryWrapper.eq(PmDailyMenuDtlLike::getMenuDtlId, request.getMenuDtlId());
}
// 评价用户ID
if (request.getUserId() != null) {
queryWrapper.eq(PmDailyMenuDtlLike::getUserId, request.getUserId());
}
// 菜单日期(冗余字段,方便按日统计)
if (request.getMenuDate() != null) {
queryWrapper.eq(PmDailyMenuDtlLike::getMenuDate, request.getMenuDate());
}
// 评价类型1-点赞2-点踩
if (StrUtil.isNotBlank(request.getLikeType())) {
queryWrapper.eq(PmDailyMenuDtlLike::getLikeType, request.getLikeType());
}
// 删除标志0存在 2删除
if (StrUtil.isNotBlank(request.getDelFlag())) {
queryWrapper.eq(PmDailyMenuDtlLike::getDelFlag, request.getDelFlag());
}
// 创建人
if (request.getCreateBy() != null) {
queryWrapper.eq(PmDailyMenuDtlLike::getCreateBy, request.getCreateBy());
}
// 创建时间
if (request.getCreateTime() != null) {
queryWrapper.eq(PmDailyMenuDtlLike::getCreateTime, request.getCreateTime());
}
// 修改人
if (request.getUpdateBy() != null) {
queryWrapper.eq(PmDailyMenuDtlLike::getUpdateBy, request.getUpdateBy());
}
// 修改时间
if (request.getUpdateTime() != null) {
queryWrapper.eq(PmDailyMenuDtlLike::getUpdateTime, request.getUpdateTime());
}
// 租户ID
if (StrUtil.isNotBlank(request.getTenantId())) {
queryWrapper.eq(PmDailyMenuDtlLike::getTenantId, request.getTenantId());
}
}
/**
* /
* @param request
* @param pageParamRequest
*/
@ApiOperation(value = "分页列表")
@RequestMapping(value = "/list", method = RequestMethod.GET)
public CommonResult<CommonPage<PmDailyMenuDtlLike>> getList(@Validated PmDailyMenuDtlLike request, @Validated PageParamRequest pageParamRequest) {
LambdaQueryWrapper<PmDailyMenuDtlLike> queryWrapper = new LambdaQueryWrapper();
// 应用搜索条件
condition(queryWrapper, request);
CommonPage<PmDailyMenuDtlLike> page = CommonPage.restPage(pmDailyMenuDtlLikeService.pageList(queryWrapper, pageParamRequest));
return CommonResult.success(page);
}
/**
*
*/
@RequestMapping(value = "/info/{id}", method = RequestMethod.GET)
public CommonResult<PmDailyMenuDtlLike> info(@PathVariable("id") Long id){
PmDailyMenuDtlLike pmDailyMenuDtlLike = pmDailyMenuDtlLikeService.getById(id);
return CommonResult.success(pmDailyMenuDtlLike);
}
/**
*
*/
@RequestMapping(value = "/save", method = RequestMethod.POST)
public CommonResult<String> save(@RequestBody PmDailyMenuDtlLike pmDailyMenuDtlLike){
if (pmDailyMenuDtlLikeService.save(pmDailyMenuDtlLike)) {
return CommonResult.success();
}
return CommonResult.failed();
}
/**
*
*/
@RequestMapping(value = "/update", method = RequestMethod.POST)
public CommonResult<String> update(@RequestBody PmDailyMenuDtlLike pmDailyMenuDtlLike){
if (pmDailyMenuDtlLikeService.updateById(pmDailyMenuDtlLike)) {
return CommonResult.success();
}
return CommonResult.failed();
}
/**
* :id
*/
@RequestMapping(value = "/delete", method = RequestMethod.POST)
public CommonResult<String> delete(@RequestBody Long[] ids){
if (pmDailyMenuDtlLikeService.removeByIds(Arrays.asList(ids))) {
return CommonResult.success();
}
return CommonResult.failed();
}
/**
* /
* @param menuDtlId ID
* @param likeType 1-2-
*/
@ApiOperation(value = "对菜单明细进行点赞/点踩")
@RequestMapping(value = "/like", method = RequestMethod.POST)
public CommonResult<String> likeOrDislike(@RequestParam Long menuDtlId, @RequestParam String likeType) {
try {
// 获取当前登录用户ID
LoginUserVo loginUserVo = SecurityUtil.getLoginUserVo();
if (loginUserVo == null || loginUserVo.getUser() == null) {
return CommonResult.failed("用户未登录");
}
Long userId = Long.valueOf(loginUserVo.getUser().getId());
// 获取菜单明细信息
PmDailyMenuDtl menuDtl = pmDailyMenuDtlService.getById(menuDtlId);
if (menuDtl == null) {
return CommonResult.failed("菜单明细不存在");
}
// 通过PmDailyMenu 获取菜单日期
PmDailyMenu menu = pmDailyMenuService.getById(menuDtl.getMenuId());
if (menu == null) {
return CommonResult.failed("菜单不存在");
}
Date menuDate = menu.getMenuDate();
if (menuDate == null) {
return CommonResult.failed("菜单日期不存在");
}
// 检查用户在该日期的评价次数
LambdaQueryWrapper<PmDailyMenuDtlLike> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(PmDailyMenuDtlLike::getUserId, userId);
queryWrapper.eq(PmDailyMenuDtlLike::getMenuDate, menuDate);
queryWrapper.eq(PmDailyMenuDtlLike::getLikeType, likeType);
queryWrapper.eq(PmDailyMenuDtlLike::getDelFlag, "0");
int count = pmDailyMenuDtlLikeService.count(queryWrapper);
if (count >= 3) {
return CommonResult.failed("同一日期内" + ("1".equals(likeType) ? "点赞" : "点踩") + "次数已达上限3次");
}
// 检查是否已经对该菜单明细进行过评价
LambdaQueryWrapper<PmDailyMenuDtlLike> existQueryWrapper = new LambdaQueryWrapper<>();
existQueryWrapper.eq(PmDailyMenuDtlLike::getUserId, userId);
existQueryWrapper.eq(PmDailyMenuDtlLike::getMenuDtlId, menuDtlId);
existQueryWrapper.eq(PmDailyMenuDtlLike::getLikeType, likeType);
existQueryWrapper.eq(PmDailyMenuDtlLike::getDelFlag, "0");
PmDailyMenuDtlLike existingLike = pmDailyMenuDtlLikeService.getOne(existQueryWrapper);
if (existingLike != null) {
return CommonResult.failed("已经对该菜品进行过" + ("1".equals(likeType) ? "点赞" : "点踩"));
}
// 保存点赞/点踩记录
PmDailyMenuDtlLike like = new PmDailyMenuDtlLike();
like.setMenuDtlId(menuDtlId);
like.setUserId(userId);
like.setMenuDate(menuDate);
like.setLikeType(likeType);
like.setDelFlag("0");
like.setCreateBy(userId);
like.setCreateTime(new Date());
if (pmDailyMenuDtlLikeService.save(like)) {
return CommonResult.success("操作成功");
} else {
return CommonResult.failed("操作失败");
}
} catch (Exception e) {
e.printStackTrace();
return CommonResult.failed("操作失败:" + e.getMessage());
}
}
/**
*
* @param limit
* @param rankingType like-dislike-
* @param itemType
* @param startDate
* @param endDate
*/
@ApiOperation(value = "查询菜品点赞和点踩排行")
@RequestMapping(value = "/ranking", method = RequestMethod.GET)
public CommonResult<CommonPage<PmDailyMenuDtlLike>> getRanking(@RequestParam(defaultValue = "10") Integer limit,
@RequestParam(defaultValue = "like") String rankingType,
@RequestParam(required = false) String itemType,
@RequestParam(required = false) String startDate,
@RequestParam(required = false) String endDate) {
try {
// 构建查询条件
LambdaQueryWrapper<PmDailyMenuDtlLike> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(PmDailyMenuDtlLike::getDelFlag, "0");
// 如果有日期范围条件,添加日期过滤
if (StrUtil.isNotBlank(startDate)) {
queryWrapper.ge(PmDailyMenuDtlLike::getMenuDate, startDate);
}
if (StrUtil.isNotBlank(endDate)) {
queryWrapper.le(PmDailyMenuDtlLike::getMenuDate, endDate);
}
// 获取点赞/点踩记录
List<PmDailyMenuDtlLike> likeList = pmDailyMenuDtlLikeService.list(queryWrapper);
// 统计每个菜品的点赞和点踩数量
Map<Long, Map<String, Object>> itemStats = new HashMap<>();
for (PmDailyMenuDtlLike like : likeList) {
// 获取菜单明细信息
PmDailyMenuDtl menuDtl = pmDailyMenuDtlService.getById(like.getMenuDtlId());
if (menuDtl != null && StrUtil.isNotBlank(menuDtl.getItemName())) {
// 如果有菜品类型条件,过滤不符合的菜品
if (StrUtil.isNotBlank(itemType) && !itemType.equals(menuDtl.getItemType())) {
continue;
}
Long menuDtlId = menuDtl.getId();
// 初始化菜品统计信息
if (!itemStats.containsKey(menuDtlId)) {
Map<String, Object> stats = new HashMap<>();
stats.put("likeCount", 0);
stats.put("dislikeCount", 0);
stats.put("menuDtl", menuDtl);
itemStats.put(menuDtlId, stats);
}
// 更新统计信息
Map<String, Object> stats = itemStats.get(menuDtlId);
if ("1".equals(like.getLikeType())) {
stats.put("likeCount", (Integer) stats.get("likeCount") + 1);
} else if ("2".equals(like.getLikeType())) {
stats.put("dislikeCount", (Integer) stats.get("dislikeCount") + 1);
}
}
}
// 转换为排行列表
List<PmDailyMenuDtlLike> rankingList = new ArrayList<>();
for (Map.Entry<Long, Map<String, Object>> entry : itemStats.entrySet()) {
PmDailyMenuDtl menuDtl = (PmDailyMenuDtl) entry.getValue().get("menuDtl");
// 创建PmDailyMenuDtlLike对象用于返回
PmDailyMenuDtlLike rankingItem = new PmDailyMenuDtlLike();
rankingItem.setId(menuDtl.getId());
rankingItem.setItemName(menuDtl.getItemName());
rankingItem.setItemType(menuDtl.getItemType());
rankingItem.setItemPrice(menuDtl.getItemPrice());
rankingItem.setLikeCount((Integer) entry.getValue().get("likeCount"));
rankingItem.setDislikeCount((Integer) entry.getValue().get("dislikeCount"));
rankingItem.setTotalCount((Integer) entry.getValue().get("likeCount") + (Integer) entry.getValue().get("dislikeCount"));
rankingList.add(rankingItem);
}
// 根据排行类型排序
if ("like".equals(rankingType)) {
// 按照点赞数量排序
rankingList.sort((a, b) -> {
return Integer.compare(b.getLikeCount(), a.getLikeCount());
});
} else if ("dislike".equals(rankingType)) {
// 按照点踩数量排序
rankingList.sort((a, b) -> {
return Integer.compare(b.getDislikeCount(), a.getDislikeCount());
});
}
// 限制返回数量
if (rankingList.size() > limit) {
rankingList = rankingList.subList(0, limit);
}
CommonPage<PmDailyMenuDtlLike> page = CommonPage.restPage(rankingList);
return CommonResult.success(page);
} catch (Exception e) {
e.printStackTrace();
return CommonResult.failed("查询失败:" + e.getMessage());
}
}
}

@ -6,6 +6,7 @@ import java.util.Map;
import java.util.Random; import java.util.Random;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.Date;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@ -218,7 +219,7 @@ public class PmMaintenanceOrderController {
// 应用搜索条件 // 应用搜索条件
condition(queryWrapper, request); condition(queryWrapper, request);
queryWrapper.orderByDesc(PmMaintenanceOrder::getCreateTime);
CommonPage<PmMaintenanceOrder> page = CommonPage.restPage(pmMaintenanceOrderService.pageList(queryWrapper, pageParamRequest)); CommonPage<PmMaintenanceOrder> page = CommonPage.restPage(pmMaintenanceOrderService.pageList(queryWrapper, pageParamRequest));
// 收集所有需要查询的ID // 收集所有需要查询的ID
@ -409,6 +410,11 @@ public class PmMaintenanceOrderController {
currentUserId = pmMaintenanceOrder.getCreateBy(); currentUserId = pmMaintenanceOrder.getCreateBy();
} }
// 设置创建时间
if (pmMaintenanceOrder.getCreateTime() == null) {
pmMaintenanceOrder.setCreateTime(new Date());
}
// 如果有传uid根据eb_user中的字段查询对应的业主、租户、部门 // 如果有传uid根据eb_user中的字段查询对应的业主、租户、部门
if (pmMaintenanceOrder.getUid() != null) { if (pmMaintenanceOrder.getUid() != null) {
User user = userService.getOne(Wrappers.<User>lambdaQuery() User user = userService.getOne(Wrappers.<User>lambdaQuery()

@ -0,0 +1,13 @@
package com.zbkj.modules.autogencode.dao;
import com.zbkj.modules.autogencode.entity.PmDailyMenuDtlLike;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
/**
* / DAO
*/
@Mapper
public interface PmDailyMenuDtlLikeDao extends BaseMapper<PmDailyMenuDtlLike> {
}

@ -115,4 +115,11 @@ public class CmCust implements Serializable {
@TableField(exist = false) @TableField(exist = false)
private List<String> supplierType; private List<String> supplierType;
/**
* 01
*/
@ApiModelProperty(value = "资质状态0为存在未通过的资质1为所有资质都通过")
@TableField(exist = false)
private String allStatusPassed;
} }

@ -1,7 +1,10 @@
package com.zbkj.modules.autogencode.entity; package com.zbkj.modules.autogencode.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import java.math.BigDecimal; import java.math.BigDecimal;
@ -102,4 +105,22 @@ public class PmCanteenPlanOrderRel implements Serializable {
@ApiModelProperty(value = "租户ID") @ApiModelProperty(value = "租户ID")
private String tenantId; private String tenantId;
@TableField(exist = false)
private String goodsCode;
@TableField(exist = false)
private String spec;
@TableField(exist = false)
private String unit;
@TableField(exist = false)
private String supplierName;
@TableField(exist = false)
private Long supplierId;
@TableField(exist = false)
private String planNo;
} }

@ -8,9 +8,10 @@ import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import org.springframework.format.annotation.DateTimeFormat; import org.springframework.format.annotation.DateTimeFormat;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.io.Serializable; import java.io.Serializable;
import java.util.Date; import java.util.Date;
import lombok.Data; import lombok.Data;
@ -111,4 +112,18 @@ public class PmDailyMenuDtl implements Serializable {
@TableField(exist = false) @TableField(exist = false)
private String mealType; private String mealType;
/**
*
*/
@ApiModelProperty(value = "点赞数量")
@TableField(exist = false)
private Integer likeCount;
/**
*
*/
@ApiModelProperty(value = "点踩数量")
@TableField(exist = false)
private Integer dislikeCount;
} }

@ -0,0 +1,117 @@
package com.zbkj.modules.autogencode.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable;
import java.util.Date;
import lombok.Data;
@Data
@TableName("pm_daily_menu_dtl_like")
public class PmDailyMenuDtlLike implements Serializable {
private static final long serialVersionUID = 1L;
/**
* ID
*/
@ApiModelProperty(value = "主键ID")
@TableId
private Long id;
/**
* IDpm_daily_menu_dtl.id
*/
@ApiModelProperty(value = "菜单明细ID关联pm_daily_menu_dtl.id")
private Long menuDtlId;
/**
* ID
*/
@ApiModelProperty(value = "评价用户ID")
private Long userId;
/**
* 便
*/
@ApiModelProperty(value = "菜单日期(冗余字段,方便按日统计)")
private Date menuDate;
/**
* 1-2-
*/
@ApiModelProperty(value = "评价类型1-点赞2-点踩")
private String likeType;
/**
* 0 2
*/
@ApiModelProperty(value = "删除标志0存在 2删除")
private String delFlag;
/**
*
*/
@ApiModelProperty(value = "创建人")
private Long createBy;
/**
*
*/
@ApiModelProperty(value = "创建时间")
private Date createTime;
/**
*
*/
@ApiModelProperty(value = "修改人")
private Long updateBy;
/**
*
*/
@ApiModelProperty(value = "修改时间")
private Date updateTime;
/**
* ID
*/
@ApiModelProperty(value = "租户ID")
private String tenantId;
/**
*
*/
@ApiModelProperty(value = "菜品名称")
@TableField(exist = false)
private String itemName;
/**
*
*/
@ApiModelProperty(value = "菜品类型")
@TableField(exist = false)
private String itemType;
/**
*
*/
@ApiModelProperty(value = "菜品价格")
@TableField(exist = false)
private java.math.BigDecimal itemPrice;
/**
*
*/
@ApiModelProperty(value = "点赞数量")
@TableField(exist = false)
private Integer likeCount;
/**
*
*/
@ApiModelProperty(value = "点踩数量")
@TableField(exist = false)
private Integer dislikeCount;
/**
*
*/
@ApiModelProperty(value = "总数量")
@TableField(exist = false)
private Integer totalCount;
}

@ -0,0 +1,25 @@
package com.zbkj.modules.autogencode.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.zbkj.modules.autogencode.entity.PmDailyMenuDtlLike;
import com.zbkj.common.request.PageParamRequest;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import java.util.List;
import java.util.Map;
/**
* /
* +----------------------------------------------------------------------
*/
public interface PmDailyMenuDtlLikeService extends IService<PmDailyMenuDtlLike> {
/**
* PmDailyMenuDtlLike
* @param pageParamRequest
* @return
*/
List<PmDailyMenuDtlLike> pageList(LambdaQueryWrapper<PmDailyMenuDtlLike> queryWrapper, PageParamRequest pageParamRequest);
}

@ -18,20 +18,18 @@ public class PmCanteenPlanOrderRelServiceImpl extends ServiceImpl<PmCanteenPlanO
@Resource @Resource
private PmCanteenPlanOrderRelDao dao; private PmCanteenPlanOrderRelDao dao;
@Resource
private PmCanteenPlanOrderRelService pmCanteenPlanOrderRelService;
@Override @Override
public List<PmCanteenPlanOrderRel> getByOrderId(Long orderId) { public List<PmCanteenPlanOrderRel> getByOrderId(Long orderId) {
LambdaQueryWrapper<PmCanteenPlanOrderRel> queryWrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<PmCanteenPlanOrderRel> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(PmCanteenPlanOrderRel::getOrderId, orderId); queryWrapper.eq(PmCanteenPlanOrderRel::getOrderId, orderId);
return pmCanteenPlanOrderRelService.list(queryWrapper); return this.list(queryWrapper);
} }
@Override @Override
public boolean deleteByOrderId(Long orderId) { public boolean deleteByOrderId(Long orderId) {
LambdaQueryWrapper<PmCanteenPlanOrderRel> queryWrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<PmCanteenPlanOrderRel> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(PmCanteenPlanOrderRel::getOrderId, orderId); queryWrapper.eq(PmCanteenPlanOrderRel::getOrderId, orderId);
return pmCanteenPlanOrderRelService.remove(queryWrapper); return this.remove(queryWrapper);
} }
/** /**

@ -0,0 +1,42 @@
package com.zbkj.modules.autogencode.service.impl;
import com.github.pagehelper.PageHelper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import com.zbkj.modules.autogencode.dao.PmDailyMenuDtlLikeDao;
import com.zbkj.modules.autogencode.entity.PmDailyMenuDtlLike;
import com.zbkj.modules.autogencode.service.PmDailyMenuDtlLikeService;
import com.zbkj.common.page.CommonPage;
import com.zbkj.common.request.PageParamRequest;
import javax.annotation.Resource;
import java.util.Map;
import java.util.Arrays;
import java.util.List;
@Service("pmDailyMenuDtlLikeService")
public class PmDailyMenuDtlLikeServiceImpl extends ServiceImpl<PmDailyMenuDtlLikeDao, PmDailyMenuDtlLike> implements PmDailyMenuDtlLikeService {
@Resource
private PmDailyMenuDtlLikeDao dao;
/**
*
*/
@Override
public List<PmDailyMenuDtlLike> pageList(LambdaQueryWrapper<PmDailyMenuDtlLike> queryWrapper, PageParamRequest pageParamRequest) {
PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit());
return dao.selectList(queryWrapper);
}
}

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zbkj.modules.autogencode.dao.PmDailyMenuDtlLikeDao">
<!-- 根据包名 模块名 以及类名 生成Mapper XML 配置文件 -->
<resultMap type="com.zbkj.modules.autogencode.entity.PmDailyMenuDtlLike" id="pmDailyMenuDtlLikeMap">
<result property="id" column="id"/>
<result property="menuDtlId" column="menu_dtl_id"/>
<result property="userId" column="user_id"/>
<result property="menuDate" column="menu_date"/>
<result property="likeType" column="like_type"/>
<result property="delFlag" column="del_flag"/>
<result property="createBy" column="create_by"/>
<result property="createTime" column="create_time"/>
<result property="updateBy" column="update_by"/>
<result property="updateTime" column="update_time"/>
<result property="tenantId" column="tenant_id"/>
</resultMap>
</mapper>

@ -198,6 +198,9 @@ public class SystemAdminServiceImpl extends ServiceImpl<SystemAdminDao, SystemAd
SystemAdmin systemAdmin = new SystemAdmin(); SystemAdmin systemAdmin = new SystemAdmin();
BeanUtils.copyProperties(systemAdminAddRequest, systemAdmin); BeanUtils.copyProperties(systemAdminAddRequest, systemAdmin);
// 保存原始密码用于User表加密
String originalPwd = systemAdmin.getPwd();
String pwd = CrmebUtil.encryptPassword(systemAdmin.getPwd(), systemAdmin.getAccount()); String pwd = CrmebUtil.encryptPassword(systemAdmin.getPwd(), systemAdmin.getAccount());
systemAdmin.setPwd(pwd); systemAdmin.setPwd(pwd);
@ -240,10 +243,11 @@ public class SystemAdminServiceImpl extends ServiceImpl<SystemAdminDao, SystemAd
} }
} }
String pwdByPhoto = CrmebUtil.encryptPassword(originalPwd, systemAdmin.getPhone());
// 将相关信息保存到eb_user表 // 将相关信息保存到eb_user表
User user = new User(); User user = new User();
user.setAccount(systemAdmin.getAccount()); user.setAccount(systemAdmin.getPhone());
user.setPwd(systemAdmin.getPwd()); user.setPwd(pwdByPhoto);
user.setRealName(systemAdmin.getRealName()); user.setRealName(systemAdmin.getRealName());
user.setPhone(systemAdmin.getPhone()); user.setPhone(systemAdmin.getPhone());
user.setAdminid(systemAdmin.getId()); // 设置管理员ID user.setAdminid(systemAdmin.getId()); // 设置管理员ID
@ -290,6 +294,8 @@ public class SystemAdminServiceImpl extends ServiceImpl<SystemAdminDao, SystemAd
SystemAdmin systemAdmin = new SystemAdmin(); SystemAdmin systemAdmin = new SystemAdmin();
BeanUtils.copyProperties(systemAdminRequest, systemAdmin); BeanUtils.copyProperties(systemAdminRequest, systemAdmin);
systemAdmin.setPwd(null); systemAdmin.setPwd(null);
// 保存原始密码用于User表加密
String originalPwd = systemAdminRequest.getPwd();
if (StrUtil.isNotBlank(systemAdminRequest.getPwd())) { if (StrUtil.isNotBlank(systemAdminRequest.getPwd())) {
String pwd = CrmebUtil.encryptPassword(systemAdminRequest.getPwd(), systemAdminRequest.getAccount()); String pwd = CrmebUtil.encryptPassword(systemAdminRequest.getPwd(), systemAdminRequest.getAccount());
systemAdmin.setPwd(pwd); systemAdmin.setPwd(pwd);
@ -356,8 +362,10 @@ public class SystemAdminServiceImpl extends ServiceImpl<SystemAdminDao, SystemAd
if (user != null) { if (user != null) {
// 更新用户信息 // 更新用户信息
user.setAccount(systemAdmin.getAccount()); user.setAccount(systemAdmin.getAccount());
if (StrUtil.isNotBlank(systemAdmin.getPwd())) { if (StrUtil.isNotBlank(originalPwd)) {
user.setPwd(systemAdmin.getPwd()); // 使用原始密码加密更新User表密码
String userPwd = CrmebUtil.encryptPassword(originalPwd, systemAdmin.getPhone());
user.setPwd(userPwd);
} }
user.setRealName(systemAdmin.getRealName()); user.setRealName(systemAdmin.getRealName());
user.setPhone(systemAdmin.getPhone()); user.setPhone(systemAdmin.getPhone());

Loading…
Cancel
Save