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

@@ -91,7 +91,6 @@
</el-form-item>
<el-form-item label="门店住址:" style="width: 100%;" prop="areaId">
<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"/>
</el-form-item>
<el-form-item label="" style="width:100%" prop="address">
@@ -191,20 +190,21 @@ export default {
} else {
callback(new Error("身份证号格式错误"));
}
} else {
callback(new Error("请输入身份证号"));
}
// else {
// callback(new Error("请输入身份证号"));
// }
};
return {
name: [{required: true, message: '请输入经营者姓名', trigger: 'blur'}],
idNumber: [{required: true, validator: IdNumberPass, trigger: 'change'}],
sex: [{required: true, message: '请选择性别', trigger: 'change'}],
idNumber: [{required: false, validator: IdNumberPass, trigger: 'change'}],
sex: [{required: false, message: '请选择性别', trigger: 'change'}],
phone: [{required: true, message: '请输入手机号', trigger: 'blur'}],
shopName: [{required: true, message: '请输入门店名称', trigger: 'blur'}],
operatorType: [{required: true, message: '请选择经营者类型', trigger: 'change'}],
girdCode: [{required: true, message: '请选择所属片区', trigger: 'change'}],
fileUrl: [{required: true, message: '请选择门店照片', trigger: 'change'}],
areaId: [{required: true, message: '请选择门店住址', trigger: 'change'}],
fileUrl: [{required: false, 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>
</template>
<template #right>
<ai-import :instance="instance" url=""
importUrl="" name="门店档案" title="门店档案"
<ai-import :instance="instance" url="/app/appshoparchives/downloadTemplate"
importUrl="/app/appshoparchives/import" name="门店档案" title="门店档案"
@success="getList()">
<el-button icon="iconfont iconImport">导入</el-button>
</ai-import>
<ai-download :instance="instance" url="" :params="search"
<ai-download :instance="instance" url="/app/appshoparchives/export" :params="search"
fileName="门店档案"
:disabled="tableData.length == 0">
</ai-download>
@@ -94,6 +94,7 @@
align="left">
<template v-slot="{ row }">
<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>
</el-table-column>
@@ -387,10 +388,6 @@ export default {
<style lang="scss" scoped>
.app-archives-list {
.qr-img {
width: 100%;
height: 100%;
}
.preview-img{
width: 120px;
@@ -404,5 +401,10 @@ export default {
display: flex;
align-items: center;
justify-content: center;
.qr-img {
width: 450px;
height: 450px;
}
}
</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.evaluationTime"></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>
<div class="files">
<div class="files" v-if="info.pictureUrl">
<ai-uploader
:instance="instance"
fileType="img"
@@ -85,9 +85,8 @@ export default {
},
created() {
this.$dict.load('evaluatorType').then(() => {
this.$dict.load('evaluatorType','evaluationType').then(() => {
this.getDetail()
this.getList()
})
},
@@ -97,7 +96,8 @@ export default {
const {code, data: {records}} = await this.instance.post('/app/appscoredetails/list', null, {
params: {
shopId: this.params.shopId,
pages: 1000
openId:this.info.openId,
size: 1000
}
})
if (code === 0 && records) {
@@ -113,7 +113,7 @@ export default {
try {
const {code, data} = await this.instance.post('/app/appshopassess/queryDetailById', null, {
params: {
id: this.params.id
id: this.params.id,
}
})
if (code === 0) {
@@ -123,6 +123,7 @@ export default {
url: item
}
})
await this.getList()
}
} catch (e) {
console.error(e)

View File

@@ -31,16 +31,16 @@
</el-date-picker>
</ai-search>
<ai-select
v-model="search.status"
v-model="search.scoreInterval"
@change="(search.current = 1), getList()"
placeholder="分数区间"
:selectList="$dict.getDict('appIntegralApplyEventStatus')">
:selectList="$dict.getDict('scoreInterval')">
</ai-select>
<ai-select
v-model="search.status"
v-model="search.assessType"
@change="(search.current = 1), getList()"
placeholder="评价类型"
:selectList="$dict.getDict('appIntegralApplyEventStatus')">
:selectList="$dict.getDict('evaluationType')">
</ai-select>
</template>
<template #right>
@@ -61,7 +61,7 @@
<el-button icon="iconfont iconDelete" @click="handleDeleteBach" :disabled="!ids.length">删除</el-button>
</template>
<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">
</ai-download>
</template>
@@ -113,12 +113,15 @@ export default {
{ prop: 'shopName', label: '门店名称', align: 'center' },
{ prop: 'evaluator', 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}) => {
return h('span', {
}, 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: 'score', label: '分数', align: 'center' },
],
@@ -128,7 +131,7 @@ export default {
},
created () {
this.$dict.load('evaluatorType').then(() => {
this.$dict.load('evaluatorType','evaluationType','scoreInterval').then(() => {
this.getList()
})
},

View File

@@ -33,7 +33,8 @@
</div>
<div class="right-row flex-col">
<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>
<ai-title title="统计列表"></ai-title>
@@ -41,13 +42,13 @@
<template #left>
<ai-select
v-model="form.operatorType"
@change="(form.current = 1), getList1()"
@change="(form.current = 1), getList2()"
placeholder="经营类型"
:selectList="$dict.getDict('operatorType')">
</ai-select>
<ai-select
v-model="form.girdCode"
@change="(form.current = 1), getList1()"
@change="(form.current = 1), getList2()"
placeholder="所属网格"
:selectList="gridList">
</ai-select>
@@ -56,27 +57,28 @@
<el-input
v-model="form.shopName"
size="small"
v-throttle="() => {form.current = 1, getList1()}"
v-throttle="() => {form.current = 1, getList2()}"
placeholder="请输入门店名称"
clearable
@clear="form.current = 1, form.shopName = '', getList1()"
@clear="form.current = 1, form.shopName = '', getList2()"
suffix-icon="iconfont iconSearch">
</el-input>
</template>
</ai-search-bar>
<ai-table
:tableData="colConfigs1"
:tableData="tableData1"
:col-configs="colConfigs1"
:total="total"
:current.sync="search.current"
:size.sync="search.size"
@getList="getList">
:current.sync="form.current"
:size.sync="form.size"
@getList="getList2">
<el-table-column
label="门店照片"
slot="pic"
align="left">
<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>
</el-table-column>
@@ -107,7 +109,7 @@ export default {
data: {},
form: {
current:1,
pages:10,
size:10,
operatorType:'',
girdCode:'',
shopName:'',
@@ -116,7 +118,8 @@ export default {
girdCode:'',
fiveStartTime:new Date().getMonth().toString(),
storeLevel:'5',
pages:1000
current:1,
size:1000
},
cardList: [
{
@@ -170,6 +173,7 @@ export default {
this.girdList()
this.queryShopDetail()
this.getList()
this.getList2()
this.countByFiveStars()
})
},
@@ -178,11 +182,14 @@ export default {
async countByFiveStars(){
try {
const {code, data:{records}} = await this.instance.post('/app/appShopStatistics/countByFiveStars',null,{
pages:1000
current:1,
size:1000
})
if (code === 0) {
this.chartList = records?.reverse() || []
this.initChart()
this.$nextTick(()=>{
this.initChart()
})
}
} catch (e) {
console.log(e)
@@ -192,7 +199,7 @@ export default {
async girdList() {
try {
const {code, data:{records}} = await this.instance.post('/app/appShopStatistics/girdList',null,{
pages:1000
size:1000
})
if (code === 0) {
this.gridList = records?.map(item=>{
@@ -409,5 +416,10 @@ export default {
width: 100%;
flex: 1;
}
.shop-img{
width: 120px;
height: 120px;
}
}
</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>
<ai-search label="开始时间">
<el-date-picker
v-model="search.startTime"
v-model="search.startTimeStr"
type="date"
size="small"
value-format="yyyy-MM-dd"
@@ -17,7 +17,7 @@
</ai-search>
<ai-search label="结束时间">
<el-date-picker
v-model="search.endTime"
v-model="search.endTimeStr"
type="date"
size="small"
value-format="yyyy-MM-dd"
@@ -72,6 +72,7 @@
clearable
style="width: 100%"
value-format="yyyy-MM-dd"
@change="startChange"
placeholder="选择开始日期">
</el-date-picker>
</el-form-item>
@@ -82,6 +83,7 @@
size="small"
style="width: 100%"
clearable
@change="endChange"
value-format="yyyy-MM-dd"
placeholder="选择开始日期">
</el-date-picker>
@@ -96,6 +98,7 @@
</template>
<script>
import dayjs from 'dayjs'
import {mapState} from 'vuex'
export default {
name: "AppraiseTask",
@@ -108,8 +111,8 @@ export default {
return {
search:{
taskName:'',
startTime:'',
endTime:'',
startTimeStr:'',
endTimeStr:'',
current: 1,
size: 10,
},
@@ -146,6 +149,28 @@ export default {
},
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(){
this.$refs['formRef'].validate(async valid=>{
if(valid){
@@ -153,7 +178,7 @@ export default {
const {code} = await this.instance.post('/app/apptaskmanage/addOrUpdate',{
...this.form,
startTime:`${this.form.startTime} 00:00:00`,
endTime:`${this.form.startTime} 23:59:59`,
endTime:`${this.form.endTime} 23:59:59`,
})
if(code===0){
this.$message.success('保存成功')
@@ -196,8 +221,10 @@ export default {
async getList(){
try {
const {code,data} = await this.instance.post('/app/apptaskmanage/list',{
...this.search
const {code,data} = await this.instance.post('/app/apptaskmanage/list',null,{
params:{
...this.search
}
})
if(code===0){
this.tableData = data.records

View File

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