Merge remote-tracking branch 'origin/build' into build

This commit is contained in:
aixianling
2024-07-02 10:08:37 +08:00
10 changed files with 101 additions and 55 deletions

View File

@@ -1,3 +1,4 @@
VUE_APP_SCOPE=fengdu VUE_APP_SCOPE=fengdu
#VUE_APP_API=https://web.fdfengshou.cn/ #VUE_APP_API=https://web.fdfengshou.cn/
VUE_APP_API=http://192.168.1.87:9000/ #VUE_APP_API=http://192.168.1.87:9000/
VUE_APP_API=http://test87web.cunwuyun.cn/

View File

@@ -91,7 +91,6 @@
</el-form-item> </el-form-item>
<el-form-item label="门店住址:" style="width: 100%;" prop="areaId"> <el-form-item label="门店住址:" style="width: 100%;" prop="areaId">
<ai-area-select :instance="instance" clearable always-show <ai-area-select :instance="instance" clearable always-show
:disabled-level="$store.state.user.info.areaList.length"
@name="v=>form.areaName=v" v-model="form.areaId"/> @name="v=>form.areaName=v" v-model="form.areaId"/>
</el-form-item> </el-form-item>
<el-form-item label="" style="width:100%" prop="address"> <el-form-item label="" style="width:100%" prop="address">
@@ -191,20 +190,21 @@ export default {
} else { } else {
callback(new Error("身份证号格式错误")); callback(new Error("身份证号格式错误"));
} }
} else {
callback(new Error("请输入身份证号"));
} }
// else {
// callback(new Error("请输入身份证号"));
// }
}; };
return { return {
name: [{required: true, message: '请输入经营者姓名', trigger: 'blur'}], name: [{required: true, message: '请输入经营者姓名', trigger: 'blur'}],
idNumber: [{required: true, validator: IdNumberPass, trigger: 'change'}], idNumber: [{required: false, validator: IdNumberPass, trigger: 'change'}],
sex: [{required: true, message: '请选择性别', trigger: 'change'}], sex: [{required: false, message: '请选择性别', trigger: 'change'}],
phone: [{required: true, message: '请输入手机号', trigger: 'blur'}], phone: [{required: true, message: '请输入手机号', trigger: 'blur'}],
shopName: [{required: true, message: '请输入门店名称', trigger: 'blur'}], shopName: [{required: true, message: '请输入门店名称', trigger: 'blur'}],
operatorType: [{required: true, message: '请选择经营者类型', trigger: 'change'}], operatorType: [{required: true, message: '请选择经营者类型', trigger: 'change'}],
girdCode: [{required: true, message: '请选择所属片区', trigger: 'change'}], girdCode: [{required: true, message: '请选择所属片区', trigger: 'change'}],
fileUrl: [{required: true, message: '请选择门店照片', trigger: 'change'}], fileUrl: [{required: false, message: '请选择门店照片', trigger: 'change'}],
areaId: [{required: true, message: '请选择门店住址', trigger: 'change'}], areaId: [{required: false, message: '请选择门店住址', trigger: 'change'}],
} }
} }
}, },

View File

@@ -68,12 +68,12 @@
<el-button icon="iconfont iconDelete" :disabled="!ids.length" @click="handleDelBatch">删除</el-button> <el-button icon="iconfont iconDelete" :disabled="!ids.length" @click="handleDelBatch">删除</el-button>
</template> </template>
<template #right> <template #right>
<ai-import :instance="instance" url="" <ai-import :instance="instance" url="/app/appshoparchives/downloadTemplate"
importUrl="" name="门店档案" title="门店档案" importUrl="/app/appshoparchives/import" name="门店档案" title="门店档案"
@success="getList()"> @success="getList()">
<el-button icon="iconfont iconImport">导入</el-button> <el-button icon="iconfont iconImport">导入</el-button>
</ai-import> </ai-import>
<ai-download :instance="instance" url="" :params="search" <ai-download :instance="instance" url="/app/appshoparchives/export" :params="search"
fileName="门店档案" fileName="门店档案"
:disabled="tableData.length == 0"> :disabled="tableData.length == 0">
</ai-download> </ai-download>
@@ -94,6 +94,7 @@
align="left"> align="left">
<template v-slot="{ row }"> <template v-slot="{ row }">
<img class="preview-img" v-if="row.fileUrl" :src="row.fileUrl" alt="" v-viewer> <img class="preview-img" v-if="row.fileUrl" :src="row.fileUrl" alt="" v-viewer>
<img class="preview-img" v-else src="../img/shop.png" alt="" v-viewer>
</template> </template>
</el-table-column> </el-table-column>
@@ -387,10 +388,6 @@ export default {
<style lang="scss" scoped> <style lang="scss" scoped>
.app-archives-list { .app-archives-list {
.qr-img {
width: 100%;
height: 100%;
}
.preview-img{ .preview-img{
width: 120px; width: 120px;
@@ -404,5 +401,10 @@ export default {
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
.qr-img {
width: 450px;
height: 450px;
}
} }
</style> </style>

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

View File

@@ -15,10 +15,10 @@
<ai-info-item label="评价人电话" :value="info.evaluatorPhone"></ai-info-item> <ai-info-item label="评价人电话" :value="info.evaluatorPhone"></ai-info-item>
<ai-info-item label="评价时间" :value="info.evaluationTime"></ai-info-item> <ai-info-item label="评价时间" :value="info.evaluationTime"></ai-info-item>
<ai-info-item label="评价人类型" :value="$dict.getLabel('evaluatorType',info.evaluatorType)"></ai-info-item> <ai-info-item label="评价人类型" :value="$dict.getLabel('evaluatorType',info.evaluatorType)"></ai-info-item>
<ai-info-item label="评价类型" isLine :value="info.assessType"></ai-info-item> <ai-info-item label="评价类型" isLine :value="$dict.getLabel('evaluationType',info.assessType)"></ai-info-item>
<ai-info-item label="评语" isLine :value="info.remark"></ai-info-item> <ai-info-item label="评语" isLine :value="info.remark"></ai-info-item>
<ai-info-item label="现场图片" isLine> <ai-info-item label="现场图片" isLine>
<div class="files"> <div class="files" v-if="info.pictureUrl">
<ai-uploader <ai-uploader
:instance="instance" :instance="instance"
fileType="img" fileType="img"
@@ -85,9 +85,8 @@ export default {
}, },
created() { created() {
this.$dict.load('evaluatorType').then(() => { this.$dict.load('evaluatorType','evaluationType').then(() => {
this.getDetail() this.getDetail()
this.getList()
}) })
}, },
@@ -97,7 +96,8 @@ export default {
const {code, data: {records}} = await this.instance.post('/app/appscoredetails/list', null, { const {code, data: {records}} = await this.instance.post('/app/appscoredetails/list', null, {
params: { params: {
shopId: this.params.shopId, shopId: this.params.shopId,
pages: 1000 openId:this.info.openId,
size: 1000
} }
}) })
if (code === 0 && records) { if (code === 0 && records) {
@@ -113,7 +113,7 @@ export default {
try { try {
const {code, data} = await this.instance.post('/app/appshopassess/queryDetailById', null, { const {code, data} = await this.instance.post('/app/appshopassess/queryDetailById', null, {
params: { params: {
id: this.params.id id: this.params.id,
} }
}) })
if (code === 0) { if (code === 0) {
@@ -123,6 +123,7 @@ export default {
url: item url: item
} }
}) })
await this.getList()
} }
} catch (e) { } catch (e) {
console.error(e) console.error(e)

View File

@@ -31,16 +31,16 @@
</el-date-picker> </el-date-picker>
</ai-search> </ai-search>
<ai-select <ai-select
v-model="search.status" v-model="search.scoreInterval"
@change="(search.current = 1), getList()" @change="(search.current = 1), getList()"
placeholder="分数区间" placeholder="分数区间"
:selectList="$dict.getDict('appIntegralApplyEventStatus')"> :selectList="$dict.getDict('scoreInterval')">
</ai-select> </ai-select>
<ai-select <ai-select
v-model="search.status" v-model="search.assessType"
@change="(search.current = 1), getList()" @change="(search.current = 1), getList()"
placeholder="评价类型" placeholder="评价类型"
:selectList="$dict.getDict('appIntegralApplyEventStatus')"> :selectList="$dict.getDict('evaluationType')">
</ai-select> </ai-select>
</template> </template>
<template #right> <template #right>
@@ -61,7 +61,7 @@
<el-button icon="iconfont iconDelete" @click="handleDeleteBach" :disabled="!ids.length">删除</el-button> <el-button icon="iconfont iconDelete" @click="handleDeleteBach" :disabled="!ids.length">删除</el-button>
</template> </template>
<template #right> <template #right>
<ai-download :instance="instance" url="/app/appintegraluser/girdIntegralExport" :params="search" fileName="门店评价" <ai-download :instance="instance" url="/app/appshopassess/export" :params="search" fileName="门店评价"
:disabled="tableData.length == 0"> :disabled="tableData.length == 0">
</ai-download> </ai-download>
</template> </template>
@@ -113,12 +113,15 @@ export default {
{ prop: 'shopName', label: '门店名称', align: 'center' }, { prop: 'shopName', label: '门店名称', align: 'center' },
{ prop: 'evaluator', label: '评价人', align: 'center' }, { prop: 'evaluator', label: '评价人', align: 'center' },
{ prop: 'evaluationTime', label: '评价时间', align: 'center' }, { prop: 'evaluationTime', label: '评价时间', align: 'center' },
{ prop: 'phone', label: '联系电话', align: 'center' }, { prop: 'evaluatorPhone', label: '联系电话', align: 'center' },
{ prop: 'evaluatorType', label: '评价人类型', align: 'center',render: (h, {row}) => { { prop: 'evaluatorType', label: '评价人类型', align: 'center',render: (h, {row}) => {
return h('span', { return h('span', {
}, this.dict.getLabel('evaluatorType', row.evaluatorType)) }, this.dict.getLabel('evaluatorType', row.evaluatorType))
}}, }},
{ prop: 'assessType', label: '评价类型', align: 'center' }, { prop: 'assessType', label: '评价类型', align: 'center',render: (h, {row}) => {
return h('span', {
}, this.dict.getLabel('evaluationType', row.assessType))
} },
{ prop: 'address', label: '门店地址', align: 'center' }, { prop: 'address', label: '门店地址', align: 'center' },
{ prop: 'score', label: '分数', align: 'center' }, { prop: 'score', label: '分数', align: 'center' },
], ],
@@ -128,7 +131,7 @@ export default {
}, },
created () { created () {
this.$dict.load('evaluatorType').then(() => { this.$dict.load('evaluatorType','evaluationType','scoreInterval').then(() => {
this.getList() this.getList()
}) })
}, },

View File

@@ -33,7 +33,8 @@
</div> </div>
<div class="right-row flex-col"> <div class="right-row flex-col">
<ai-title title="网格五星门店数量排名"></ai-title> <ai-title title="网格五星门店数量排名"></ai-title>
<div class="bar-chart" ref="chartRef"></div> <div class="bar-chart" v-show="chartList && chartList.length > 0" ref="chartRef"></div>
<div v-show="chartList && chartList.length === 0" class="no-data" style="width:386px;height:160px;"/>
</div> </div>
</div> </div>
<ai-title title="统计列表"></ai-title> <ai-title title="统计列表"></ai-title>
@@ -41,13 +42,13 @@
<template #left> <template #left>
<ai-select <ai-select
v-model="form.operatorType" v-model="form.operatorType"
@change="(form.current = 1), getList1()" @change="(form.current = 1), getList2()"
placeholder="经营类型" placeholder="经营类型"
:selectList="$dict.getDict('operatorType')"> :selectList="$dict.getDict('operatorType')">
</ai-select> </ai-select>
<ai-select <ai-select
v-model="form.girdCode" v-model="form.girdCode"
@change="(form.current = 1), getList1()" @change="(form.current = 1), getList2()"
placeholder="所属网格" placeholder="所属网格"
:selectList="gridList"> :selectList="gridList">
</ai-select> </ai-select>
@@ -56,27 +57,28 @@
<el-input <el-input
v-model="form.shopName" v-model="form.shopName"
size="small" size="small"
v-throttle="() => {form.current = 1, getList1()}" v-throttle="() => {form.current = 1, getList2()}"
placeholder="请输入门店名称" placeholder="请输入门店名称"
clearable clearable
@clear="form.current = 1, form.shopName = '', getList1()" @clear="form.current = 1, form.shopName = '', getList2()"
suffix-icon="iconfont iconSearch"> suffix-icon="iconfont iconSearch">
</el-input> </el-input>
</template> </template>
</ai-search-bar> </ai-search-bar>
<ai-table <ai-table
:tableData="colConfigs1" :tableData="tableData1"
:col-configs="colConfigs1" :col-configs="colConfigs1"
:total="total" :total="total"
:current.sync="search.current" :current.sync="form.current"
:size.sync="search.size" :size.sync="form.size"
@getList="getList"> @getList="getList2">
<el-table-column <el-table-column
label="门店照片" label="门店照片"
slot="pic" slot="pic"
align="left"> align="left">
<template v-slot="{ row }"> <template v-slot="{ row }">
<img :src="row.fileUrl" alt="" v-viewer> <img class="shop-img" :src="row.fileUrl" v-if="row.fileUrl" alt="" v-viewer>
<img class="shop-img" src="./img/shop.png" v-else alt="" v-viewer>
</template> </template>
</el-table-column> </el-table-column>
@@ -107,7 +109,7 @@ export default {
data: {}, data: {},
form: { form: {
current:1, current:1,
pages:10, size:10,
operatorType:'', operatorType:'',
girdCode:'', girdCode:'',
shopName:'', shopName:'',
@@ -116,7 +118,8 @@ export default {
girdCode:'', girdCode:'',
fiveStartTime:new Date().getMonth().toString(), fiveStartTime:new Date().getMonth().toString(),
storeLevel:'5', storeLevel:'5',
pages:1000 current:1,
size:1000
}, },
cardList: [ cardList: [
{ {
@@ -170,6 +173,7 @@ export default {
this.girdList() this.girdList()
this.queryShopDetail() this.queryShopDetail()
this.getList() this.getList()
this.getList2()
this.countByFiveStars() this.countByFiveStars()
}) })
}, },
@@ -178,11 +182,14 @@ export default {
async countByFiveStars(){ async countByFiveStars(){
try { try {
const {code, data:{records}} = await this.instance.post('/app/appShopStatistics/countByFiveStars',null,{ const {code, data:{records}} = await this.instance.post('/app/appShopStatistics/countByFiveStars',null,{
pages:1000 current:1,
size:1000
}) })
if (code === 0) { if (code === 0) {
this.chartList = records?.reverse() || [] this.chartList = records?.reverse() || []
this.initChart() this.$nextTick(()=>{
this.initChart()
})
} }
} catch (e) { } catch (e) {
console.log(e) console.log(e)
@@ -192,7 +199,7 @@ export default {
async girdList() { async girdList() {
try { try {
const {code, data:{records}} = await this.instance.post('/app/appShopStatistics/girdList',null,{ const {code, data:{records}} = await this.instance.post('/app/appShopStatistics/girdList',null,{
pages:1000 size:1000
}) })
if (code === 0) { if (code === 0) {
this.gridList = records?.map(item=>{ this.gridList = records?.map(item=>{
@@ -409,5 +416,10 @@ export default {
width: 100%; width: 100%;
flex: 1; flex: 1;
} }
.shop-img{
width: 120px;
height: 120px;
}
} }
</style> </style>

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

View File

@@ -7,7 +7,7 @@
<el-button type="primary" icon="iconfont iconAdd" @click="handleAdd">评选任务</el-button> <el-button type="primary" icon="iconfont iconAdd" @click="handleAdd">评选任务</el-button>
<ai-search label="开始时间"> <ai-search label="开始时间">
<el-date-picker <el-date-picker
v-model="search.startTime" v-model="search.startTimeStr"
type="date" type="date"
size="small" size="small"
value-format="yyyy-MM-dd" value-format="yyyy-MM-dd"
@@ -17,7 +17,7 @@
</ai-search> </ai-search>
<ai-search label="结束时间"> <ai-search label="结束时间">
<el-date-picker <el-date-picker
v-model="search.endTime" v-model="search.endTimeStr"
type="date" type="date"
size="small" size="small"
value-format="yyyy-MM-dd" value-format="yyyy-MM-dd"
@@ -72,6 +72,7 @@
clearable clearable
style="width: 100%" style="width: 100%"
value-format="yyyy-MM-dd" value-format="yyyy-MM-dd"
@change="startChange"
placeholder="选择开始日期"> placeholder="选择开始日期">
</el-date-picker> </el-date-picker>
</el-form-item> </el-form-item>
@@ -82,6 +83,7 @@
size="small" size="small"
style="width: 100%" style="width: 100%"
clearable clearable
@change="endChange"
value-format="yyyy-MM-dd" value-format="yyyy-MM-dd"
placeholder="选择开始日期"> placeholder="选择开始日期">
</el-date-picker> </el-date-picker>
@@ -96,6 +98,7 @@
</template> </template>
<script> <script>
import dayjs from 'dayjs'
import {mapState} from 'vuex' import {mapState} from 'vuex'
export default { export default {
name: "AppraiseTask", name: "AppraiseTask",
@@ -108,8 +111,8 @@ export default {
return { return {
search:{ search:{
taskName:'', taskName:'',
startTime:'', startTimeStr:'',
endTime:'', endTimeStr:'',
current: 1, current: 1,
size: 10, size: 10,
}, },
@@ -146,6 +149,28 @@ export default {
}, },
methods: { methods: {
startChange(e){
if(e){
const time = new Date(e).getTime();
const now = new Date(dayjs(Date.now()).format("YYYY-MM-DD")).getTime()
if(time < now){
this.$set(this.form,'startTime','')
this.$message.error('开始时间不能小于当前时间')
}
}
},
endChange(e){
if(e){
const endTime = new Date(e).getTime();
const startTime = new Date(this.form.startTime).getTime()
if(endTime < startTime){
this.$set(this.form,'endTime','')
this.$message.error('结束时间不能小于开始时间')
}
}
},
onConfirm(){ onConfirm(){
this.$refs['formRef'].validate(async valid=>{ this.$refs['formRef'].validate(async valid=>{
if(valid){ if(valid){
@@ -153,7 +178,7 @@ export default {
const {code} = await this.instance.post('/app/apptaskmanage/addOrUpdate',{ const {code} = await this.instance.post('/app/apptaskmanage/addOrUpdate',{
...this.form, ...this.form,
startTime:`${this.form.startTime} 00:00:00`, startTime:`${this.form.startTime} 00:00:00`,
endTime:`${this.form.startTime} 23:59:59`, endTime:`${this.form.endTime} 23:59:59`,
}) })
if(code===0){ if(code===0){
this.$message.success('保存成功') this.$message.success('保存成功')
@@ -196,8 +221,10 @@ export default {
async getList(){ async getList(){
try { try {
const {code,data} = await this.instance.post('/app/apptaskmanage/list',{ const {code,data} = await this.instance.post('/app/apptaskmanage/list',null,{
...this.search params:{
...this.search
}
}) })
if(code===0){ if(code===0){
this.tableData = data.records this.tableData = data.records

View File

@@ -13,13 +13,13 @@
<template #left> <template #left>
<el-button type="primary" icon="iconfont iconAdd" @click="handleAdd">添加</el-button> <el-button type="primary" icon="iconfont iconAdd" @click="handleAdd">添加</el-button>
<ai-select <ai-select
v-model="search.genre" v-model="search.type"
@change="onChange" @change="onChange"
placeholder="请选择事件类型" placeholder="请选择事件类型"
:selectList="$dict.getDict('shopScoreType')"> :selectList="$dict.getDict('shopScoreType')">
</ai-select> </ai-select>
<ai-select <ai-select
v-model="search.type" v-model="search.listType"
@change="(search.current = 1), getList()" @change="(search.current = 1), getList()"
placeholder="请选择自定义事件" placeholder="请选择自定义事件"
:selectList="dictList"> :selectList="dictList">
@@ -171,7 +171,7 @@ export default {
if(e){ if(e){
this.queryListTypeByType(e) this.queryListTypeByType(e)
}else { }else {
this.search.type = '' this.search.listType = ''
this.dictList = [] this.dictList = []
this.search.current = 1 this.search.current = 1
this.getList() this.getList()
@@ -189,7 +189,7 @@ export default {
this.dictList = data?.map(item=>{ this.dictList = data?.map(item=>{
return { return {
dictName:item.listType, dictName:item.listType,
dictValue:item.id dictValue:item.listType
} }
}) })
} }