照片统计页面接口调试完成

This commit is contained in:
BianLzhaoMin 2025-04-08 17:24:43 +08:00
parent 0034ac44f1
commit c6ecf0c761
24 changed files with 1926 additions and 757 deletions

1
.env.development Normal file
View File

@ -0,0 +1 @@
VITE_API_BASE_URL = /api

1
.env.production Normal file
View File

@ -0,0 +1 @@
VITE_API_BASE_URL = http://localhost:3000/api

View File

@ -4,10 +4,16 @@
<view class="title"> 照片分类 </view>
<view>
<up-grid :border="false" col="5">
<up-grid-item v-for="(icon, index) in iconList" :key="index">
<up-grid-item
:key="index"
v-for="(icon, index) in iconList"
@tap="onSearchByClass(icon.imgType)"
>
<up-image width="40" height="40" :src="icon.iconUrl" />
<text class="grid-text">{{ icon.title }}</text>
<text class="count">5100</text>
<text class="count">
{{ formatCustomNumber(props.imgCount[icon.imgNum]) }}
</text>
</up-grid-item>
</up-grid>
</view>
@ -21,11 +27,27 @@ import icon_2 from '@/static/image/home_2.png'
import icon_3 from '@/static/image/home_3.png'
import icon_4 from '@/static/image/home_4.png'
import icon_5 from '@/static/image/home_5.png'
import { formatCustomNumber } from '@/utils/index.js'
const emits = defineEmits(['handleGetImgListByImgType'])
const props = defineProps({
totalCount: {
type: Number,
default: () => 0,
},
imgCount: {
type: Object,
default: () => {
return {
totalNum: 0, //
safetyVioNum: 0, //
safetyMeasNum: 0, //
qualityInsNum: 0, //
coordinatedPhotoNum: 0, //
importIssuesAndPublicityNum: 0, //
}
},
},
})
const iconList = ref([
@ -33,28 +55,43 @@ const iconList = ref([
jumpPath: '/pages/safetyViolations/index',
title: '安全违章',
iconUrl: icon_1,
imgNum: 'safetyVioNum',
imgType: 1,
},
{
jumpPath: '/pages/qualityInspection/index',
title: '质量检查',
iconUrl: icon_2,
imgNum: 'qualityInsNum',
imgType: 2,
},
{
jumpPath: '/pages/safetyMeasure/index',
title: '安全措施',
iconUrl: icon_3,
imgNum: 'safetyMeasNum',
imgType: 3,
},
{
jumpPath: '/pages/coordinatePhotos/index',
title: '协调照片',
iconUrl: icon_4,
imgNum: 'coordinatedPhotoNum',
imgType: 4,
},
{
jumpPath: '/pages/importantMatters/index',
title: '重要事项',
iconUrl: icon_5,
imgNum: 'importIssuesAndPublicityNum',
imgType: 5,
},
])
//
const onSearchByClass = (type) => {
emits('handleGetImgListByImgType', type)
}
</script>
<style lang="scss" scoped>

View File

@ -2,12 +2,12 @@
<!-- 最近上传 -->
<view class="photo-class">
<view class="title">
<view>最近上传</view>
<view>我的收藏</view>
<view @tap="onHandleLastUpload">最近上传</view>
<view @tap="onHandleMyCollect">我的收藏</view>
</view>
<view>
<up-grid :border="false" col="2">
<up-grid-item v-for="(icon, index) in iconList" :key="index">
<up-grid-item v-for="(icon, index) in props?.imgList" :key="index">
<!-- <up-image width="40" height="40" :src="icon.iconUrl" />
<text class="grid-text">{{ icon.title }}</text>
<text class="count">5100</text> -->
@ -16,22 +16,22 @@
<up-image
width="100%"
height="120"
:src="icon.iconUrl"
@tap="onHandleImage(icon.iconUrl)"
:src="icon.imgUrl"
@tap="onHandleImage(icon.imgUrl)"
/>
<view class="collect">
<view>2024-02-06</view>
<view>{{ icon.uploadTime }}</view>
<view @tap="onHandleCollect(icon)">
<up-icon
size="18"
:color="icon.collect ? '#f56c6c' : '#999'"
:name="icon.collect ? 'heart-fill' : 'heart'"
:color="icon.collectStatus == 1 ? '#f56c6c' : '#999'"
:name="icon.collectStatus == 1 ? 'heart-fill' : 'heart'"
/>
</view>
</view>
<view class="photo-type" :style="setBackgroundColor(icon)">
{{ icon.title }}
<view class="photo-type" :style="setBackgroundColor(icon.uploadType)">
{{ imgType[icon.uploadType] }}
</view>
</view>
</up-grid-item>
@ -49,111 +49,95 @@
</view>
</view>
</up-popup>
<!-- 退出提示弹框 -->
<up-modal
title="温馨提示"
:show="showModalCollect"
:showCancelButton="true"
@cancel="onCancelCollect"
@confirm="onConfirmCollect"
:content="collectContent"
/>
</template>
<script setup>
import { computed, ref } from 'vue'
import icon_1 from '@/static/image/home_1.png'
import icon_2 from '@/static/image/home_2.png'
import icon_3 from '@/static/image/home_3.png'
import icon_4 from '@/static/image/home_4.png'
import icon_5 from '@/static/image/home_5.png'
import { computed, ref, reactive } from 'vue'
import { useMemberStore } from '@/stores'
import { editCollectTypeApi } from '@/services/comprehensiveQuery.js'
const memberStore = useMemberStore()
const token = memberStore.token
const showModalCollect = ref(false)
const collectContent = ref('')
const collectEditParams = ref({
id: '',
collectType: '',
})
const props = defineProps({
totalCount: {
type: Number,
default: () => 0,
imgList: {
type: Array,
default: () => [],
},
})
const imgType = reactive({
1: '安全违章',
2: '质量检查',
3: '安全措施',
4: '协调照片',
5: '重要事项',
})
const emits = defineEmits(['handleMyCollect', 'handleLastUpload', 'handleGetImgList'])
const showImg = ref(false)
const showImgUrl = ref('')
const iconList = ref([
{
jumpPath: '/pages/safetyViolations/index',
title: '安全违章',
collect: false,
type: 1,
iconUrl:
'https://fc1tn.baidu.com/it/u=3320401609,696579967&fm=202&src=780&ernie_sim_online&mola=new&crop=v1',
},
{
jumpPath: '/pages/qualityInspection/index',
title: '质量检查',
type: 2,
collect: false,
iconUrl:
'https://fc1tn.baidu.com/it/u=3320401609,696579967&fm=202&src=780&ernie_sim_online&mola=new&crop=v1',
},
{
jumpPath: '/pages/safetyMeasure/index',
title: '安全措施',
collect: false,
type: 3,
iconUrl:
'https://fc1tn.baidu.com/it/u=3320401609,696579967&fm=202&src=780&ernie_sim_online&mola=new&crop=v1',
},
{
jumpPath: '/pages/coordinatePhotos/index',
title: '协调照片',
collect: true,
type: 4,
iconUrl:
'https://fc1tn.baidu.com/it/u=3320401609,696579967&fm=202&src=780&ernie_sim_online&mola=new&crop=v1',
},
{
jumpPath: '/pages/importantMatters/index',
title: '重要事项',
collect: true,
type: 5,
iconUrl:
'https://fc1tn.baidu.com/it/u=3320401609,696579967&fm=202&src=780&ernie_sim_online&mola=new&crop=v1',
},
{
jumpPath: '/pages/safetyMeasure/index',
title: '安全措施',
collect: false,
type: 3,
iconUrl:
'https://fc1tn.baidu.com/it/u=3320401609,696579967&fm=202&src=780&ernie_sim_online&mola=new&crop=v1',
},
{
jumpPath: '/pages/coordinatePhotos/index',
title: '协调照片',
collect: true,
type: 4,
iconUrl:
'https://fc1tn.baidu.com/it/u=3320401609,696579967&fm=202&src=780&ernie_sim_online&mola=new&crop=v1',
},
{
jumpPath: '/pages/importantMatters/index',
title: '重要事项',
collect: true,
type: 5,
iconUrl:
'https://fc1tn.baidu.com/it/u=3320401609,696579967&fm=202&src=780&ernie_sim_online&mola=new&crop=v1',
},
])
//
const onHandleCollect = (icon) => {
icon.collect = !icon.collect
console.log('取消收藏')
if (icon.collectStatus == 0) {
collectContent.value = '是否确认把该图片加入我的收藏?'
collectEditParams.value.collectType = 1
} else {
collectContent.value = '是否确认取消收藏?'
collectEditParams.value.collectType = 2
}
collectEditParams.value.id = icon.id
showModalCollect.value = true
}
//
const onCancelCollect = () => {
showModalCollect.value = false
}
//
const onConfirmCollect = async () => {
const res = await editCollectTypeApi(collectEditParams.value)
if (res.code === 200) {
uni.$u.toast('操作成功')
emits('handleGetImgList')
showModalCollect.value = false
} else {
uni.$u.toast(res.msg)
}
}
//
const onHandleImage = (url) => {
console.log('图片点击了')
console.log('图片点击了', url)
showImgUrl.value = url
showImg.value = true
}
//
const setBackgroundColor = (icon) => {
if (icon?.type === 1) return { backgroundColor: '#f56c6c' }
if (icon?.type === 2) return { backgroundColor: '#19be6b' }
if (icon?.type === 3) return { backgroundColor: '#ff9900' }
if (icon?.type === 4) return { backgroundColor: '#f56ccf' }
if (icon?.type === 5) return { backgroundColor: '#00bfbf' }
const setBackgroundColor = (type) => {
if (type == 1) return { backgroundColor: '#f56c6c' }
if (type == 2) return { backgroundColor: '#19be6b' }
if (type == 3) return { backgroundColor: '#ff9900' }
if (type == 4) return { backgroundColor: '#f56ccf' }
if (type == 5) return { backgroundColor: '#00bfbf' }
}
//
@ -164,6 +148,15 @@ const onHandleYtUpload = () => {
const onHandleSyUpload = () => {
showImg.value = false
}
//
const onHandleMyCollect = () => {
emits('handleMyCollect')
}
//
const onHandleLastUpload = () => {
emits('handleLastUpload')
}
</script>
<style lang="scss" scoped>

View File

@ -2,7 +2,7 @@
<!-- 照片总数 -->
<view class="total-count">
<view>
<view class="count">21,635,54 &nbsp;</view>
<view class="count">{{ formatCustomNumber(totalCount) }} &nbsp;</view>
<view class="count-text">照片总数</view>
</view>
<view>
@ -13,6 +13,7 @@
<script setup>
import imgSrc from '@/static/image/photo_total.png'
import { formatCustomNumber } from '@/utils/index.js'
const props = defineProps({
totalCount: {
type: Number,

View File

@ -5,7 +5,7 @@
<!-- 筛选框 -->
<view class="filter-box">
<up-input placeholder="输入标题" v-model="photoSearchValue">
<up-input placeholder="输入标题" v-model="outerKeyWord" clearable>
<template #prefix>
<up-icon name="search" size="24" @tap="onSearchPhoto" />
</template>
@ -17,9 +17,17 @@
</view>
<view class="photo-container">
<PhotoTotal />
<PhotoClass />
<PhotoRecent />
<PhotoTotal :totalCount="imgCount?.totalNum" />
<PhotoClass
:imgCount="imgCount"
@handleGetImgListByImgType="handleGetImgListByImgType"
/>
<PhotoRecent
:imgList="imgList"
@handleMyCollect="handleMyCollect"
@handleLastUpload="handleLastUpload"
@handleGetImgList="handleGetImgList"
/>
</view>
<view class="loading-text">
@ -47,101 +55,117 @@
labelWidth="100"
labelAlign="center"
labelPosition="left"
ref="searchFormRef"
style="padding-right: 20rpx"
:style="{ paddingBottom: safeAreaInsets?.top + 50 + 'px' }"
>
<TitleTipModal :TitleTip="`通用信息查询`" />
<up-form-item prop="projectName" label="搜索查询">
<up-input placeholder="请输入" />
<up-form-item label="搜索查询">
<up-input placeholder="请输入" v-model="innerKeyWord" clearable />
</up-form-item>
<up-form-item prop="projectName" label="开始日期">
<up-input placeholder="请选择">
<up-form-item prop="startTime" label="开始日期">
<up-input placeholder="请选择" v-model="queryParams.startTime" readonly>
<template #prefix>
<up-icon name="calendar" size="16" />
<up-icon name="calendar" size="16" @tap="onSelectDate(1)" />
</template>
</up-input>
</up-form-item>
<up-form-item prop="projectName" label="结束日期">
<up-input placeholder="请选择">
<up-form-item prop="endTime" label="结束日期">
<up-input placeholder="请选择" v-model="queryParams.endTime" readonly>
<template #prefix>
<up-icon name="calendar" size="16" />
<up-icon size="16" name="calendar" @tap="onSelectDate(2)" />
</template>
</up-input>
</up-form-item>
<up-form-item prop="projectName" label="工程">
<up-input placeholder="请选择工程名称">
<up-form-item prop="proName" label="工程">
<up-input
readonly
clearable
placeholder="请选择工程名称"
v-model="queryParams.proName"
>
<template #suffix>
<up-icon name="arrow-down" size="16" />
<up-icon name="arrow-down" size="16" @tap="onSelectProject" />
</template>
</up-input>
</up-form-item>
<up-form-item prop="projectName" label="专业">
<up-input placeholder="请选择专业">
<up-form-item prop="majorName" label="专业">
<up-input
readonly
clearable
placeholder="请选择专业"
v-model="queryParams.majorName"
>
<template #suffix>
<up-icon name="arrow-down" size="16" />
<up-icon name="arrow-down" size="16" @tap="onSelectMajor" />
</template>
</up-input>
</up-form-item>
<up-form-item prop="projectName" label="工序">
<up-input placeholder="请选择工序">
<up-form-item prop="gxName" label="工序">
<up-input
readonly
clearable
placeholder="请选择工序"
v-model="queryParams.gxName"
>
<template #suffix>
<up-icon name="arrow-down" size="16" />
<up-icon name="arrow-down" size="16" @tap="onSelectProcedure" />
</template>
</up-input>
</up-form-item>
<TitleTipModal :TitleTip="`安全违章照片`" />
<up-form-item prop="projectName" label="类型">
<up-checkbox-group placement="row">
<up-checkbox activeColor="red" label="违章照片" />
<up-checkbox activeColor="green" label="整改照片" />
<up-checkbox-group placement="row" v-model="queryParams.photoType_1">
<up-checkbox label="违章照片" name="1" />
<up-checkbox label="整改照片" name="2" />
</up-checkbox-group>
</up-form-item>
<up-form-item prop="projectName" label="违章地点">
<up-input placeholder="请输入" />
<up-form-item prop="vioPlace" label="违章地点">
<up-input placeholder="请输入" v-model="queryParams.vioPlace" />
</up-form-item>
<up-form-item prop="projectName" label="违章描述">
<up-input placeholder="请输入" />
<up-form-item prop="vioDesc" label="违章描述">
<up-input placeholder="请输入" v-model="queryParams.vioDesc" />
</up-form-item>
<up-form-item prop="projectName" label="违章说明">
<up-input placeholder="请输入" />
<up-form-item prop="rectDesc" label="整改说明">
<up-input placeholder="请输入" v-model="queryParams.rectDesc" />
</up-form-item>
<TitleTipModal :TitleTip="`质量检查照片`" />
<up-form-item prop="projectName" label="类型">
<up-checkbox-group placement="row">
<up-checkbox activeColor="red" label="缺陷照片" />
<up-checkbox activeColor="green" label="整改照片" />
<up-checkbox-group placement="row" v-model="queryParams.photoType_2">
<up-checkbox label="缺陷照片" name="3" />
<up-checkbox label="整改照片" name="4" />
</up-checkbox-group>
</up-form-item>
<up-form-item prop="projectName" label="检查地点">
<up-input placeholder="请输入" />
<up-input placeholder="请输入" v-model="queryParams.checkPlace2" />
</up-form-item>
<up-form-item prop="projectName" label="检查描述">
<up-input placeholder="请输入" />
<up-input placeholder="请输入" v-model="queryParams.checkDesc2" />
</up-form-item>
<up-form-item prop="projectName" label="整改说明">
<up-input placeholder="请输入" />
<up-input placeholder="请输入" v-model="queryParams.rectDesc2" />
</up-form-item>
<TitleTipModal :TitleTip="`安全措施落实照片`" />
<up-form-item prop="projectName" label="检查地点">
<up-input placeholder="请输入" />
<up-input placeholder="请输入" v-model="queryParams.checkDesc3" />
</up-form-item>
<up-form-item prop="projectName" label="检查描述">
<up-input placeholder="请输入" />
<up-input placeholder="请输入" v-model="queryParams.rectDesc3" />
</up-form-item>
<TitleTipModal :TitleTip="`协调照片`" />
<up-form-item prop="projectName" label="类型">
<up-checkbox-group placement="row">
<up-checkbox activeColor="red" label="建设前" />
<up-checkbox activeColor="green" label="建设中" />
<up-checkbox activeColor="green" label="恢复后" />
<up-checkbox-group placement="row" v-model="queryParams.photoType_3">
<up-checkbox label="建设前" name="6" />
<up-checkbox label="建设中" name="7" />
<up-checkbox label="恢复后" name="8" />
</up-checkbox-group>
</up-form-item>
<up-form-item prop="projectName" label="建设地点">
<up-input placeholder="请输入" />
<up-form-item prop="buildPlace" label="建设地点">
<up-input placeholder="请输入" v-model="queryParams.buildPlace" />
</up-form-item>
<TitleTipModal :TitleTip="`重要事项及宣传照片`" />
<up-form-item prop="projectName" label="标题">
<up-input placeholder="请输入" />
<up-form-item prop="title" label="标题">
<up-input v-model="queryParams.title" placeholder="请输入" />
</up-form-item>
</up-form>
</up-list>
@ -165,6 +189,41 @@
</view>
</view>
</up-popup>
<!-- 年月日选择器 -->
<up-datetime-picker
mode="date"
:show="dateShow"
v-model="dateValue"
:formatter="formatter"
@confirm="onConfirmDate"
@cancel="dateShow = !dateShow"
/>
<!-- 工程选择器 -->
<up-picker
keyName="name"
:show="projectShow"
:columns="projectList"
@confirm="onConfirmProject"
@cancel="projectShow = !projectShow"
/>
<!-- 专业选择器 -->
<up-picker
keyName="name"
:show="majorShow"
:columns="majorList"
@confirm="onConfirmMajor"
@cancel="majorShow = !majorShow"
/>
<!-- 工序选择器 -->
<up-picker
keyName="name"
:show="procedureShow"
:columns="procedureList"
@confirm="onConfirmProcedure"
@cancel="procedureShow = !procedureShow"
/>
</template>
<script setup>
@ -173,44 +232,419 @@ import TitleTipModal from '@/components/TitleTipModal/index'
import PhotoTotal from './components/photo-total.vue'
import PhotoClass from './components/photo-class'
import PhotoRecent from './components/photo-recent'
import { ref } from 'vue'
import { useMemberStore } from '@/stores'
import { reactive, ref, computed, onMounted } from 'vue'
import { getProcedureApi } from '@/services/common.js'
import { useCommon } from '@/hooks/useCommon.js'
import { debounce } from 'lodash-es' //
import { getClassCountApi, getImgListApi } from '@/services/comprehensiveQuery.js'
import { onLoad, onReachBottom, onPageScroll } from '@dcloudio/uni-app'
const scrollTop = ref(0)
const finish = ref(true)
const photoSearchValue = ref('')
const rightPopupShow = ref(false)
const { getProjectList, getMajorList } = useCommon()
const { safeAreaInsets } = uni.getSystemInfoSync()
const memberStore = useMemberStore()
const token = memberStore?.token
const baseURL = import.meta.env.VITE_API_BASE_URL // url
const scrollTop = ref(0)
const searchFormRef = ref(null)
const outerKeyWord = ref('')
const innerKeyWord = ref('')
const rightPopupShow = ref(false)
const total = ref(0)
const dateShow = ref(false)
const dateValue = ref(Date.now())
const dateType = ref(1)
const projectShow = ref(false)
const majorShow = ref(false)
const procedureShow = ref(false)
const projectList = reactive([])
const majorList = reactive([])
const procedureList = reactive([])
//
const imgCount = reactive({
totalNum: 0, //
safetyVioNum: 0, //
safetyMeasNum: 0, //
qualityInsNum: 0, //
coordinatedPhotoNum: 0, //
importIssuesAndPublicityNum: 0, //
})
//
const imgList = ref([])
//
const queryParams = ref({
pageNum: 1,
pageSize: 10,
queryType: '2', // 1. 2.
searchType: '', // 1. 2. 3.
uploadType: '', //
keyWord: '', //
proId: '', //
proName: '', //
majorId: '', // id
majorName: '', //
gxId: '', // id
gxName: '', //
startTime: '', //
endTime: '', //
vioPlace: '', //
vioDesc: '', //
rectDesc: '', //
checkPlace2: '', //
checkDesc2: '', //
rectDesc2: '', //
checkDesc3: '', //
rectDesc3: '', //
buildPlace: '', //
title: '',
photoType: [],
photoType_1: [],
photoType_2: [],
photoType_3: [],
})
//
const onSearchPhoto = () => {
console.log('onSearchPhoto')
// console.log('onSearchPhoto')
queryParams.value.uploadType = ''
queryParams.value.searchType = 1
queryParams.value.keyWord = outerKeyWord.value
getImgListData(true)
}
//
const onHandleSeniorSearch = () => {
console.log('高级搜索')
rightPopupShow.value = true
}
//
const onHandleSearch = () => {
queryParams.value.searchType = 3
queryParams.value.keyWord = innerKeyWord.value
getImgListData(true)
rightPopupShow.value = false
resetForm()
}
//
const onHandleReset = () => {
rightPopupShow.value = false
// rightPopupShow.value = false
resetForm()
}
onReachBottom(() => {
console.log('滚动触底事件--')
})
//
onReachBottom(
debounce(() => {
if (imgList.value.length < total.value) {
queryParams.value.pageNum++
getImgListData(false)
}
}, 1000),
)
//
onPageScroll((e) => {
scrollTop.value = e.scrollTop
})
//
const getClassCountData = async () => {
const res = await getClassCountApi({})
console.log(
'%c🔍 获取照片分类出参 %c',
'background: linear-gradient(90deg, #FF6B6B, #4ECDC4); color: white; padding: 5px 10px; border-radius: 5px; font-weight: bold;',
'',
res,
)
if (res.code === 200) {
Object.assign(imgCount, res.data)
} else {
uni.$u.toast(res.msg)
}
}
getClassCountData()
//
const getImgListData = async (isTap = false) => {
try {
queryParams.value.photoType = [
...queryParams.value.photoType_1,
...queryParams.value.photoType_2,
...queryParams.value.photoType_3,
]
const {
pageNum,
pageSize,
queryType, // 1. 2.
searchType, // 1. 2. 3.
uploadType, //
keyWord, //
proId, //
majorId, // id
gxId, // id
startTime, //
endTime, //
vioPlace, //
vioDesc, //
rectDesc, //
checkPlace2, //
checkDesc2, //
rectDesc2, //
checkDesc3, //
rectDesc3, //
buildPlace, //
title,
photoType,
} = queryParams.value
const queryParamsNew = {
pageNum,
pageSize,
queryType, // 1. 2.
searchType, // 1. 2. 3.
uploadType, //
keyWord, //
proId, //
majorId, // id
gxId, // id
startTime, //
endTime, //
vioPlace, //
vioDesc, //
rectDesc, //
checkPlace2, //
checkDesc2, //
rectDesc2, //
checkDesc3, //
rectDesc3, //
buildPlace, //
title,
photoType,
}
console.log(
'%c🔍 获取照片列表入参 %c',
'background: linear-gradient(90deg, #FF6B6B, #4ECDC4); color: white; padding: 5px 10px; border-radius: 5px; font-weight: bold;',
'',
queryParamsNew,
)
const res = await getImgListApi(queryParamsNew)
//
total.value = res.data.total
console.log(
'%c🔍 获取照片列表出参 %c',
'background: linear-gradient(90deg, #FF6B6B, #4ECDC4); color: white; padding: 5px 10px; border-radius: 5px; font-weight: bold;',
'',
res,
)
if (res.code === 200) {
if (isTap) {
//
imgList.value = res?.data?.list || []
//
queryParams.value.pageNum = 1
} else {
//
if (res?.data && res?.data?.list?.length > 0) {
imgList.value = [...imgList.value, ...res.data.list]
}
}
imgList.value.forEach((e) => {
e.imgUrl = `${baseURL}/imgTool/files${e.compressFilePath}?token=${token}`
})
} else {
uni.$u.toast(res.msg)
}
} catch (error) {
//
if (isTap) {
imgList.value = []
}
}
}
getImgListData()
//
const finish = computed(() => {
if (total.value === imgList.value.length) return true
})
//
const handleMyCollect = () => {
queryParams.value.queryType = 1
getImgListData(true)
}
//
const handleLastUpload = () => {
queryParams.value.queryType = 2
getImgListData(true)
}
//
const handleGetImgList = () => {
getImgListData(true)
}
//
const handleGetImgListByImgType = (type) => {
queryParams.value.uploadType = type
queryParams.value.searchType = 2
getImgListData(true)
}
//
const formatter = (type, value) => {
if (type === 'year') {
return `${value}`
}
if (type === 'month') {
return `${value}`
}
if (type === 'day') {
return `${value}`
}
return value
}
const onConfirmDate = () => {
const formatDateValue = formatDate(dateValue.value)
if (dateType.value === 1) {
queryParams.value.startTime = formatDateValue
}
if (dateType.value === 2) {
queryParams.value.endTime = formatDateValue
}
//
if (queryParams.value.startTime && queryParams.value.endTime) {
const start = new Date(queryParams.value.startTime)
const end = new Date(queryParams.value.endTime)
if (start > end) {
uni.showToast({
title: '结束时间不能早于开始时间',
icon: 'none',
})
if (dateType.value === 1) {
queryParams.value.endTime = formatDateValue
} else {
queryParams.value.startTime = formatDateValue
}
return //
}
}
dateShow.value = false
}
const formatDate = (timestamp) => {
const date = new Date(timestamp)
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}`
}
//
const onSelectDate = (type) => {
// type 1. 2.
dateType.value = type
dateShow.value = true
}
//
const onSelectProject = () => {
projectShow.value = true
}
//
const onConfirmProject = (item) => {
queryParams.value.proName = item.value[0].name
queryParams.value.proId = item.value[0].id
projectShow.value = false
}
//
const onSelectMajor = () => {
majorShow.value = true
}
//
const onConfirmMajor = (item) => {
queryParams.value.majorName = item.value[0].name
queryParams.value.majorId = item.value[0].id
getProcedureData(item.value[0].id)
majorShow.value = false
}
//
const onSelectProcedure = () => {
procedureShow.value = true
}
//
const onConfirmProcedure = (item) => {
queryParams.value.gxName = item.value[0].name
queryParams.value.gxId = item.value[0].id
procedureShow.value = false
}
//
const getProcedureData = async (pid) => {
console.log(
'%c🔍 获取工序请求入参 %c',
'background: linear-gradient(90deg, #FF6B6B, #4ECDC4); color: white; padding: 5px 10px; border-radius: 5px; font-weight: bold;',
'',
'pid=' + pid,
)
const { data: res } = await getProcedureApi({ pid })
console.log(
'%c🔍 获取工序请求出参 %c',
'background: linear-gradient(90deg, #FF6B6B, #4ECDC4); color: white; padding: 5px 10px; border-radius: 5px; font-weight: bold;',
'',
res,
)
procedureList.push(res)
}
const resetForm = () => {
innerKeyWord.value = ''
Object.assign(queryParams.value, {
proId: '', //
proName: '', //
majorId: '', // id
majorName: '', //
gxId: '', // id
gxName: '', //
startTime: '', //
endTime: '', //
vioPlace: '', //
vioDesc: '', //
rectDesc: '', //
checkPlace2: '', //
checkDesc2: '', //
rectDesc2: '', //
checkDesc3: '', //
rectDesc3: '', //
buildPlace: '', //
title: '',
photoType: [],
photoType_1: [],
photoType_2: [],
photoType_3: [],
})
}
onMounted(async () => {
projectList.push(await getProjectList())
majorList.push(await getMajorList())
})
</script>
<style lang="scss" scoped>

View File

@ -10,30 +10,31 @@
style="background-color: #fff; padding: 0 30rpx 20rpx"
>
<TitleTipModal :TitleTip="`项目信息`" />
<up-form-item prop="projectName" label="项目名称" required>
<up-form-item prop="proName" label="项目名称" required>
<up-input
readonly
border="none"
:placeholder="props.addAndEditFormType == 3 ? '' : '点击选择项目'"
v-model="addAndEditModel.projectName"
v-model="addAndEditModel.proName"
>
<template #suffix v-if="props.addAndEditFormType != 3">
<up-icon name="arrow-right" @tap="onSelectProject" />
</template>
</up-input>
</up-form-item>
<up-form-item prop="examiner" label="建设地点">
<up-form-item prop="buildPlace" label="建设地点">
<up-input
border="none"
v-model="addAndEditModel.buildPlace"
:readonly="props.addAndEditFormType == 3"
:placeholder="props.addAndEditFormType == 3 ? '' : '请输入建设地点'"
/>
</up-form-item>
<up-form-item prop="major" label="专业">
<up-form-item prop="majorName" label="专业">
<up-input
border="none"
readonly
v-model="addAndEditModel.major"
v-model="addAndEditModel.majorName"
:placeholder="props.addAndEditFormType == 3 ? '' : '点击选择专业'"
>
<template #suffix v-if="props.addAndEditFormType != 3">
@ -41,11 +42,11 @@
</template>
</up-input>
</up-form-item>
<up-form-item prop="procedure" label="工序">
<up-form-item prop="gxName" label="工序">
<up-input
border="none"
readonly
v-model="addAndEditModel.procedure"
v-model="addAndEditModel.gxName"
:placeholder="props.addAndEditFormType == 3 ? '' : '点击选择工序'"
>
<template #suffix v-if="props.addAndEditFormType != 3">
@ -55,76 +56,97 @@
</up-form-item>
<TitleTipModal :TitleTip="`建设前`" />
<up-form-item prop="vrDescribe" label="建设前描述">
<up-form-item prop="buildBeforeDesc" label="建设前描述">
<up-textarea
count
autoHeight
border="none"
v-model="addAndEditModel.vrDescribe"
:readonly="props.addAndEditFormType == 3"
maxlength="200"
v-model="addAndEditModel.buildBeforeDesc"
:disabled="props.addAndEditFormType == 3"
:placeholder="props.addAndEditFormType == 3 ? '' : '请输入建设前描述'"
/>
</up-form-item>
<up-form-item
prop="vrImgList"
prop="buildBeforeImgList"
:label="props.addAndEditFormType == 3 ? '建设前照片' : '建设前照片(最多9张)'"
>
<up-upload
name="1"
multiple
@delete="onDeletePicVrImgList"
@afterRead="onAfterReadVrImgList"
:fileList="addAndEditModel.vrImgList"
:maxCount="props.addAndEditFormType == 3 ? 1 : 9"
@delete="onDeletePicBuildBeforeImgList"
@afterRead="onAfterReadBuildBeforeImgList"
:deletable="props.addAndEditFormType != 3"
:fileList="addAndEditModel.buildBeforeImgList"
:maxCount="
props.addAndEditFormType == 3 ? addAndEditModel.buildBeforeImgList.length : 9
"
/>
</up-form-item>
<TitleTipModal :TitleTip="`建设中`" />
<up-form-item prop="vrDescribe" label="建设中描述">
<up-form-item prop="buildUnderDesc" label="建设中描述">
<up-textarea
count
autoHeight
border="none"
v-model="addAndEditModel.vrDescribe"
:readonly="props.addAndEditFormType == 3"
maxlength="200"
v-model="addAndEditModel.buildUnderDesc"
:disabled="props.addAndEditFormType == 3"
:placeholder="props.addAndEditFormType == 3 ? '' : '请输入建设中描述'"
/>
</up-form-item>
<up-form-item
prop="vrImgList"
prop="buildUnderImgList"
:label="props.addAndEditFormType == 3 ? '建设中照片' : '建设中照片(最多9张)'"
>
<up-upload
name="1"
multiple
@delete="onDeletePicVrImgList"
@afterRead="onAfterReadVrImgList"
:fileList="addAndEditModel.vrImgList"
:maxCount="props.addAndEditFormType == 3 ? 1 : 9"
@delete="onDeletePicBuildUnderImgList"
@afterRead="onAfterReadBuildUnderImgList"
:fileList="addAndEditModel.buildUnderImgList"
:deletable="props.addAndEditFormType != 3"
:maxCount="
props.addAndEditFormType == 3 ? addAndEditModel.buildUnderImgList.length : 9
"
/>
</up-form-item>
<TitleTipModal :TitleTip="`恢复后`" />
<up-form-item prop="vrDescribe" label="恢复后描述">
<up-form-item prop="buildAfterDesc" label="恢复后描述">
<up-textarea
count
autoHeight
border="none"
v-model="addAndEditModel.vrDescribe"
:readonly="props.addAndEditFormType == 3"
maxlength="200"
v-model="addAndEditModel.buildAfterDesc"
:disabled="props.addAndEditFormType == 3"
:placeholder="props.addAndEditFormType == 3 ? '' : '请输入恢复后描述'"
/>
</up-form-item>
<up-form-item
prop="vrImgList"
prop="buildAfterImgList"
:label="props.addAndEditFormType == 3 ? '恢复后照片' : '恢复后照片(最多9张)'"
>
<up-upload
name="1"
multiple
@delete="onDeletePicVrImgList"
@afterRead="onAfterReadVrImgList"
:fileList="addAndEditModel.vrImgList"
:maxCount="props.addAndEditFormType == 3 ? 1 : 9"
@delete="onDeletePicBuildAfterImgList"
@afterRead="onAfterReadBuildAfterImgList"
:deletable="props.addAndEditFormType != 3"
:fileList="addAndEditModel.buildAfterImgList"
:maxCount="
props.addAndEditFormType == 3 ? addAndEditModel.buildAfterImgList.length : 9
"
/>
</up-form-item>
<up-button type="primary" text="提交" @tap="onSubmitForm" style="width: 100%" />
<up-button
type="primary"
text="提交"
@tap="onSubmitForm"
v-if="props.addAndEditFormType != 3"
style="width: 100%; margin-top: 10rpx"
/>
</up-form>
<!-- 项目选择弹框 -->
@ -147,11 +169,11 @@
<!-- 工程列表 -->
<view class="project-list">
<up-list @scrolltolower="onScrollTolower" style="width: 100%">
<up-list-item v-for="item in 20" :key="item">
<up-cell :title="`xxxxxxxxx工程-${item}`" @tap="onSelectProjectItem(item)">
<up-list-item v-for="(item, index) in projectList" :key="item.id">
<up-cell :title="item.name" @tap="onSelectProjectItem(item)">
<template #icon>
<text style="margin-right: 10rpx">
{{ item }}
{{ index + 1 }}
</text>
</template>
</up-cell>
@ -163,7 +185,7 @@
<!-- 专业选择器 -->
<up-picker
keyName="label"
keyName="name"
:show="majorShow"
:columns="majorList"
@confirm="onConfirmMajor"
@ -171,7 +193,7 @@
/>
<!-- 工序选择器 -->
<up-picker
keyName="label"
keyName="name"
:show="procedureShow"
:columns="procedureList"
@confirm="onConfirmProcedure"
@ -198,11 +220,19 @@
</template>
<script setup>
import { reactive, ref } from 'vue'
import { reactive, ref, onMounted, watch } from 'vue'
import { debounce } from 'lodash-es' //
import { useCommon } from '@/hooks/useCommon.js'
import { getProcedureApi } from '@/services/common.js'
import {
addCoordinatePhotoApi,
editCoordinatePhotoApi,
getCoordinatePhotoDetailsByIdApi,
} from '@/services/coordinatePhotos.js'
import TitleTipModal from '@/components/TitleTipModal/index'
const addAndEditModelRef = ref(null)
const { getProjectList, getMajorList } = useCommon()
const addAndEditModelRef = ref(null)
const projectShow = ref(false) //
const majorShow = ref(false) //
const procedureShow = ref(false) //
@ -211,36 +241,48 @@ const onSearchProjectName = ref('') // 项目搜索条件
const dateValue = ref(Date.now()) //
const sendLoading = ref(false) //
const dateType = ref(1)
//
const projectList = ref([])
const projectListAll = ref([])
//
const majorList = reactive([])
//
const procedureList = reactive([])
const props = defineProps({
// 1. 2. 3.
addAndEditFormType: {
type: [Number, String],
default: () => 1,
},
// id
detailsId: {
type: [Number, String],
default: () => 1,
},
})
console.log(props.addAndEditFormType, '表单类型')
//
const addAndEditModel = reactive({
projectName: '',
procedure: '',
major: '',
examiner: '',
inspectTime: '',
correctionTerm: '',
vrLocation: '',
vrDescribe: '',
vrImgList: [],
correctionPerson: '',
correctionDescribe: '',
correctionTime: '',
correctionImgList: [],
dataSource: 2,
proId: '', // id
proName: '', //
majorId: '', // id
majorName: '', //
gxId: '', // id
gxName: '', //
buildPlace: '', //
buildBeforeDesc: '', //
buildBeforeImgList: [], //
buildUnderDesc: '', //
buildUnderImgList: [], //
buildAfterDesc: '', //
buildAfterImgList: [], //
})
//
const addAndEditModelRules = ref({
projectName: [
proName: [
{
type: 'string',
required: true,
@ -248,99 +290,7 @@ const addAndEditModelRules = ref({
trigger: ['blur', 'change'],
},
],
correctionTerm: [
{
type: 'string',
required: true,
message: '请选择整改期限',
trigger: ['blur', 'change'],
},
],
vrLocation: [
{
type: 'string',
required: true,
message: '请填写违章地点',
trigger: ['blur', 'change'],
},
],
vrDescribe: [
{
type: 'string',
required: true,
message: '请填写违章描述',
trigger: ['blur', 'change'],
},
],
vrImgList: [
{
type: 'string',
required: true,
message: '请上传违章照片',
trigger: ['blur', 'change'],
},
],
correctionPerson: [
{
type: 'string',
required: true,
message: '请填写整改人',
trigger: ['blur', 'change'],
},
],
correctionDescribe: [
{
type: 'string',
required: true,
message: '请填写整改说明',
trigger: ['blur', 'change'],
},
],
})
//
const projectList = ref([])
//
const majorList = reactive([
[
{
label: '专业1',
value: 2021,
},
{
label: '专业2',
value: 2022,
},
{
label: '专业3',
value: 2023,
},
{
label: '专业4',
value: 2024,
},
],
])
//
const procedureList = reactive([
[
{
label: '工序1',
id: 2021,
},
{
label: '工序2',
id: 2022,
},
{
label: '工序3',
id: 2023,
},
{
label: '工序4',
id: 2024,
},
],
])
//
const formatter = (type, value) => {
@ -364,7 +314,15 @@ const onSelectProject = () => {
}
//
const onSearchInProjectPopup = () => {
console.log('---搜索', onSearchProjectName.value)
if (!onSearchProjectName.value) {
projectList.value = projectListAll.value //
return
}
const searchTerm = onSearchProjectName.value.toLowerCase()
projectList.value = projectListAll.value.filter(
(e) => e.name && e.name.toLowerCase().includes(searchTerm),
)
}
//
@ -374,7 +332,8 @@ const onScrollTolower = () => {
//
const onSelectProjectItem = (item) => {
addAndEditModel.projectName = 'xxxxxx工程' + item
addAndEditModel.proName = item.name
addAndEditModel.proId = item.id
projectShow.value = false
}
@ -391,8 +350,9 @@ const onSelectMajor = () => {
//
const onConfirmMajor = (item) => {
console.log('---确定', item.value[0].label)
addAndEditModel.major = item.value[0].label
addAndEditModel.majorName = item.value[0].name
addAndEditModel.majorId = item.value[0].id
getProcedureData(item.value[0].id)
majorShow.value = false
}
//
@ -400,9 +360,28 @@ const onSelectProcedure = () => {
procedureShow.value = true
}
//
const getProcedureData = async (pid) => {
console.log(
'%c🔍 获取工序请求入参 %c',
'background: linear-gradient(90deg, #FF6B6B, #4ECDC4); color: white; padding: 5px 10px; border-radius: 5px; font-weight: bold;',
'',
'pid=' + pid,
)
const { data: res } = await getProcedureApi({ pid })
console.log(
'%c🔍 获取工序请求出参 %c',
'background: linear-gradient(90deg, #FF6B6B, #4ECDC4); color: white; padding: 5px 10px; border-radius: 5px; font-weight: bold;',
'',
res,
)
procedureList.push(res)
}
//
const onConfirmProcedure = (item) => {
addAndEditModel.procedure = item.value[0].label
addAndEditModel.gxName = item.value[0].name
addAndEditModel.gxId = item.value[0].id
procedureShow.value = false
}
@ -437,56 +416,378 @@ const formatDate = (timestamp) => {
return `${year}-${month}-${day}`
}
//
const onAfterReadVrImgList = (event) => {
//
const onAfterReadBuildBeforeImgList = (event) => {
let lists = [].concat(event.file)
lists.map((item) => {
addAndEditModel.vrImgList.push({
addAndEditModel.buildBeforeImgList.push({
...item,
isEdit: false,
})
})
}
//
const onDeletePicVrImgList = (event) => {
addAndEditModel.vrImgList.splice(event.index, 1)
//
const onDeletePicBuildBeforeImgList = (event) => {
addAndEditModel.buildBeforeImgList.splice(event.index, 1)
}
//
const onAfterReadCorrectionImgList = (event) => {
//
const onAfterReadBuildUnderImgList = (event) => {
let lists = [].concat(event.file)
lists.map((item) => {
addAndEditModel.correctionImgList.push({
addAndEditModel.buildUnderImgList.push({
...item,
isEdit: false,
})
})
}
//
const onDeleteCorrectionImgList = (event) => {
addAndEditModel.correctionImgList.splice(event.index, 1)
//
const onDeletePicBuildUnderImgList = (event) => {
addAndEditModel.buildUnderImgList.splice(event.index, 1)
}
//
const onAfterReadBuildAfterImgList = (event) => {
let lists = [].concat(event.file)
lists.map((item) => {
addAndEditModel.buildAfterImgList.push({
...item,
isEdit: false,
})
})
}
//
const onDeletePicBuildAfterImgList = (event) => {
addAndEditModel.buildAfterImgList.splice(event.index, 1)
}
//
const onSubmitForm = debounce(() => {
console.log('---提交')
sendLoading.value = true
addAndEditModelRef.value.validate().then((valid) => {
if (valid) {
console.log('校验通过')
sendLoading.value = false
}
})
addAndEditModelRef.value
.validate()
.then(async (valid) => {
if (valid) {
//
sendLoading.value = true
const uploadImages = new Promise(async (resolve, reject) => {
try {
let buildBeforeImgListSuccess = []
let buildUnderImgListSuccess = []
let buildAfterImgListSuccess = []
let buildBeforeImgListNoEdit = []
let buildUnderImgListNoEdit = []
let buildAfterImgListNoEdit = []
//
if (addAndEditModel.buildBeforeImgList.length > 0) {
buildBeforeImgListNoEdit = addAndEditModel.buildBeforeImgList.filter(
(e) => !e.isEdit,
)
if (buildBeforeImgListNoEdit.length > 0) {
buildBeforeImgListSuccess = await uploadImgFun(
buildBeforeImgListNoEdit,
6,
)
}
}
//
if (addAndEditModel.buildUnderImgList.length > 0) {
buildUnderImgListNoEdit = addAndEditModel.buildUnderImgList.filter(
(e) => !e.isEdit,
)
if (buildUnderImgListNoEdit.length > 0) {
buildUnderImgListSuccess = await uploadImgFun(
buildUnderImgListNoEdit,
7,
)
}
}
//
if (addAndEditModel.buildAfterImgList.length > 0) {
buildAfterImgListNoEdit = addAndEditModel.buildAfterImgList.filter(
(e) => !e.isEdit,
)
if (buildAfterImgListNoEdit.length > 0) {
buildAfterImgListSuccess = await uploadImgFun(
buildAfterImgListNoEdit,
8,
)
}
}
resolve({
buildBeforeImgListSuccess,
buildUnderImgListSuccess,
buildAfterImgListSuccess,
}) //
} catch (error) {
reject(error) //
}
})
uploadImages
.then(
async ({
buildBeforeImgListSuccess,
buildUnderImgListSuccess,
buildAfterImgListSuccess,
}) => {
//
//
const {
dataSource,
proId, // id
proName, //
majorId, // id
majorName, //
gxId, // id
gxName, //
buildPlace, //
buildBeforeDesc, //
buildBeforeImgList, //
buildUnderDesc, //
buildUnderImgList, //
buildAfterDesc, //
buildAfterImgList, //
} = addAndEditModel
const buildBeforeImgListOld = []
buildBeforeImgList.forEach((e) => {
if (e.isEdit) buildBeforeImgListOld.push(e)
})
const buildUnderImgListOld = []
buildUnderImgList.forEach((e) => {
if (e.isEdit) buildUnderImgListOld.push(e)
})
const buildAfterImgListOld = []
buildAfterImgList.forEach((e) => {
if (e.isEdit) buildAfterImgListOld.push(e)
})
const addParams = {
dataSource,
proId, // id
proName, //
majorId, // id
majorName, //
gxId, // id
gxName, //
buildPlace, //
buildBeforeDesc, //
buildUnderDesc, //
buildAfterDesc, //
sysFileResourceList: [
...buildBeforeImgListSuccess,
...buildUnderImgListSuccess,
...buildAfterImgListSuccess,
...buildBeforeImgListOld,
...buildUnderImgListOld,
...buildAfterImgListOld,
],
uploadType: 4,
}
const SED_API =
props.addAndEditFormType == 1
? addCoordinatePhotoApi
: editCoordinatePhotoApi
if (props.addAndEditFormType == 2) {
Object.assign(addParams, {
id: props.detailsId,
})
}
console.log(
'%c🔍 表单提交入参 %c',
'background: linear-gradient(90deg, #FF6B6B, #4ECDC4); color: white; padding: 5px 10px; border-radius: 5px; font-weight: bold;',
'',
addParams,
)
const res = await SED_API(addParams)
console.log(
'%c🔍 表单提交出参 %c',
'background: linear-gradient(90deg, #FF6B6B, #4ECDC4); color: white; padding: 5px 10px; border-radius: 5px; font-weight: bold;',
'',
res,
)
sendLoading.value = false
if (res.code === 200) {
uni.$u.toast(res.data)
setTimeout(() => {
uni.navigateBack({
delta: 1,
})
}, 500)
} else {
uni.$u.toast(res.msg)
}
},
)
.catch((error) => {
console.error('图片上传失败:', error)
})
}
})
.catch((error) => {})
}, 1000)
//
const uploadImgFun = async (list, type) => {
const fileType = {
6: '协调照片-建设前',
7: '协调照片-建设中',
8: '协调照片-恢复后',
}
return new Promise((resolve, reject) => {
let successList = []
let files = []
list.forEach((f) => {
let d = {
file: f.url,
name: 'files',
uri: f.url,
}
files.push(d)
})
sendLoading.value = true
uni.uploadFile({
url: '/imgTool/sys/file/uploadFile',
files: files,
name: 'files',
formData: {
params: JSON.stringify({
uploadType: 4,
sourceType: type,
sourceTypeName: fileType[type],
}),
},
success: (res) => {
sendLoading.value = false
res = JSON.parse(res.data)
if (res.code === 200) {
successList = res.data
resolve(successList) //
} else {
uni.$u.toast('上传失败' + res.msg)
reject(new Error('上传失败: ' + res.msg))
}
},
fail: (err) => {
sendLoading.value = false
reject(new Error('网络错误: ' + err.errMsg))
},
})
})
}
//
const getFormDetail = () => {
console.log('---获取详情数据')
}
// props.addAndEditFormType 2
if (props.addAndEditFormType == 2) {
//
getFormDetail()
const getFormDetail = async () => {
console.log(
'%c🔍 获取宣传照片详情入参 %c',
'background: linear-gradient(90deg, #FF6B6B, #4ECDC4); color: white; padding: 5px 10px; border-radius: 5px; font-weight: bold;',
'',
'id=' + props?.detailsId,
)
const res = await getCoordinatePhotoDetailsByIdApi({ id: props?.detailsId })
console.log(
'%c🔍 获取宣传照片详情出参 %c',
'background: linear-gradient(90deg, #FF6B6B, #4ECDC4); color: white; padding: 5px 10px; border-radius: 5px; font-weight: bold;',
'',
res,
)
if (res.code === 200) {
const {
proId, // id
proName, //
majorId, // id
majorName, //
gxId, // id
gxName, //
buildPlace, //
buildBeforeDesc, //
buildUnderDesc, //
buildAfterDesc, //
sysFileResourceList,
} = res.data
let buildBeforeImgList = []
let buildUnderImgList = []
let buildAfterImgList = []
if (sysFileResourceList.length > 0) {
sysFileResourceList.map((e) => {
if (e?.sourceType == 6) {
buildBeforeImgList.push({
isEdit: true,
url: e.originalFilePath,
...e,
})
}
if (e?.sourceType == 7) {
buildUnderImgList.push({
isEdit: true,
url: e.originalFilePath,
...e,
})
}
if (e?.sourceType == 8) {
buildAfterImgList.push({
isEdit: true,
url: e.originalFilePath,
...e,
})
}
})
}
Object.assign(addAndEditModel, {
proId, // id
proName, //
majorId, // id
majorName, //
gxId, // id
gxName, //
buildPlace, //
buildBeforeDesc, //
buildBeforeImgList, //
buildUnderDesc, //
buildUnderImgList, //
buildAfterDesc, //
buildAfterImgList, //
})
getProcedureData(majorId)
} else {
uni.$u.toast(res.msg)
}
}
//
watch(
() => props.addAndEditFormType,
(newValue) => {
if (newValue != 1) {
getFormDetail()
}
},
{
deep: true,
immediate: true,
},
)
onMounted(async () => {
projectList.value = await getProjectList()
projectListAll.value = await getProjectList()
majorList.push(await getMajorList())
})
//
</script>

View File

@ -8,7 +8,7 @@
/>
<view class="container">
<AddAndEditForm :addAndEditFormType="addAndEditFormType" />
<AddAndEditForm :addAndEditFormType="addAndEditFormType" :detailsId="detailsId" />
</view>
</view>
</template>
@ -21,12 +21,16 @@ import { onLoad } from '@dcloudio/uni-app'
const { safeAreaInsets } = uni.getSystemInfoSync()
const addAndEditFormType = ref(1)
const detailsId = ref('')
const uploadRecordUrl = ref('/pages/coordinatePhotos/upload-record/index')
onLoad((query) => {
if (query.type) {
addAndEditFormType.value = query.type
}
if (query.id) {
detailsId.value = query.id
}
})
</script>

View File

@ -8,7 +8,7 @@
<up-input
clearable
placeholder="输入搜索关键词"
v-model.trim="onSearchKeyword"
v-model.trim="queryParams.keyWord"
suffixIconStyle="color: #909399"
>
<template #suffix>
@ -18,27 +18,27 @@
</view>
</view>
<view class="upload-record-list">
<view class="upload-record-list" v-if="coordinatePhotosList.length > 0">
<up-list @scrolltolower="onScrollTolower" style="width: 100%">
<up-list-item v-for="item in 10" :key="item">
<up-list-item v-for="item in coordinatePhotosList" :key="item.id">
<view class="record-item">
<view @tap="onHandleViewDetails">
<view @tap="onHandleViewDetails(item.id)">
<!-- 日期 -->
<view class="item-date">
<text>2024-05-06</text>
<!-- <text>{{ }}</text> -->
<view>
<up-button
size="mini"
text="修改"
type="primary"
@tap="onHandleEditRecord"
@tap="onHandleEditRecord(item.id)"
/>
</view>
</view>
<!-- 名称 -->
<view class="item-name">
<text>N3917</text>
<text>{{ item.buildPlace }}</text>
</view>
<!-- 文字内容 -->
@ -52,22 +52,19 @@
shape="circle"
/>
</view>
<up-text
:lines="2"
text="关于uview-plus的取名来由首字母u来自于uni-app首字母
uni-app是基VuejsVue和View(延伸为UI视图之意)同音同时view组件uni-app中
最础最重要的组件故取名uview-plus表达源于uni-app和Vue之意同时在此也对它示感谢"
/>
<up-text :lines="2" :text="item.buildBeforeDesc" />
</view>
<view>
<!-- 图片内容 -->
<view class="swiper-container">
<up-swiper
:list="list1"
:list="item?.buildBeforeImgList"
interval="5000"
@click="onClickSwiper"
/>
<view class="swiper-count"> 3 </view>
<view class="swiper-count">
{{ item?.buildBeforeImgList.length }}
</view>
</view>
</view>
<view class="text-content">
@ -79,22 +76,19 @@ uni-app是基VuejsVue和View(延伸为UI、视图之意)同音同时view
shape="circle"
/>
</view>
<up-text
:lines="2"
text="关于uview-plus的取名来由首字母u来自于uni-app首字母
uni-app是基VuejsVue和View(延伸为UI视图之意)同音同时view组件uni-app中
最础最重要的组件故取名uview-plus表达源于uni-app和Vue之意同时在此也对它示感谢"
/>
<up-text :lines="2" :text="item.buildUnderDesc" />
</view>
<view>
<!-- 图片内容 -->
<view class="swiper-container">
<up-swiper
:list="list1"
:list="item?.buildUnderImgList"
interval="5000"
@click="onClickSwiper"
/>
<view class="swiper-count"> 3 </view>
<view class="swiper-count">
{{ item?.buildUnderImgList.length }}
</view>
</view>
</view>
<view class="text-content">
@ -106,22 +100,19 @@ uni-app是基VuejsVue和View(延伸为UI、视图之意)同音同时view
shape="circle"
/>
</view>
<up-text
:lines="2"
text="关于uview-plus的取名来由首字母u来自于uni-app首字母
uni-app是基VuejsVue和View(延伸为UI视图之意)同音同时view组件uni-app中
最础最重要的组件故取名uview-plus表达源于uni-app和Vue之意同时在此也对它示感谢"
/>
<up-text :lines="2" :text="item.buildAfterDesc" />
</view>
<view>
<!-- 图片内容 -->
<view class="swiper-container">
<up-swiper
:list="list1"
:list="item?.buildAfterImgList"
interval="5000"
@click="onClickSwiper"
/>
<view class="swiper-count"> 3 </view>
<view class="swiper-count">
{{ item?.buildAfterImgList.length }}
</view>
</view>
</view>
</view>
@ -132,45 +123,106 @@ uni-app是基VuejsVue和View(延伸为UI、视图之意)同音同时view
{{ finish ? '没有更多数据了~' : '正在加载...' }}
</view>
</view>
<up-empty mode="data" v-else />
</view>
</view>
</template>
<script setup>
import NavBarModal from '@/components/NavBarModal/index'
import { ref, reactive } from 'vue'
import { ref, computed } from 'vue'
import { debounce } from 'lodash-es' //
const scrollTop = ref(0)
const onSearchKeyword = ref('')
const finish = ref(false)
import { getCoordinatePhotoListApi } from '@/services/coordinatePhotos.js'
const coordinatePhotosList = ref([])
const total = ref(0)
const list1 = reactive([
'https://img1.baidu.com/it/u=1361177696,203903602&fm=253&fmt=auto&app=138&f=JPEG?w=800&h=1455',
'https://img1.baidu.com/it/u=1361177696,203903602&fm=253&fmt=auto&app=138&f=JPEG?w=800&h=1455',
'https://img1.baidu.com/it/u=1361177696,203903602&fm=253&fmt=auto&app=138&f=JPEG?w=800&h=1455',
])
//
const queryParams = ref({
pageNum: 1,
pageSize: 10,
keyWord: '',
})
//
const getCoordinatePhotoListData = async (isTap = false) => {
try {
console.log(
'%c🔍 获取安全违章上传记录入参 %c',
'background: linear-gradient(90deg, #FF6B6B, #4ECDC4); color: white; padding: 5px 10px; border-radius: 5px; font-weight: bold;',
'',
queryParams.value,
)
const { data: res } = await getCoordinatePhotoListApi(queryParams.value)
console.log(
'%c🔍 获取安全违章上传记录出参 %c',
'background: linear-gradient(90deg, #FF6B6B, #4ECDC4); color: white; padding: 5px 10px; border-radius: 5px; font-weight: bold;',
'',
res,
)
//
total.value = res.total
//
if (isTap) {
//
coordinatePhotosList.value = res?.list || []
//
queryParams.value.pageNum = 1
} else {
//
if (res.list && res.list.length > 0) {
coordinatePhotosList.value = [...coordinatePhotosList.value, ...res.list]
}
}
if (coordinatePhotosList.value.length > 0) {
coordinatePhotosList.value.forEach((e) => {
e.buildBeforeImgList = e?.sysFileResourceList.filter((i) => i?.sourceType == 6)
e.buildUnderImgList = e?.sysFileResourceList.filter((i) => i?.sourceType == 7)
e.buildAfterImgList = e?.sysFileResourceList.filter((i) => i?.sourceType == 8)
})
}
} catch (error) {
//
if (isTap) {
coordinatePhotosList.value = []
}
}
}
getCoordinatePhotoListData()
//
const onScrollTolower = debounce(() => {
console.log('onScrollTolower')
//
if (coordinatePhotosList.value.length < total.value) {
queryParams.value.pageNum++
getCoordinatePhotoListData(false)
}
}, 500)
//
const finish = computed(() => {
if (total.value === coordinatePhotosList.value.length) return true
})
//
const onSearchRecord = () => {
console.log('onSearchRecord', onSearchKeyword.value)
getCoordinatePhotoListData(true)
}
//
const onHandleEditRecord = () => {
const onHandleEditRecord = (id) => {
console.log('onHandleEditRecord')
uni.redirectTo({
url: `/pages/coordinatePhotos/index?type=2&id=1`, //
url: `/pages/coordinatePhotos/index?type=2&id=${id}`, //
})
}
//
const onHandleViewDetails = () => {
const onHandleViewDetails = (id) => {
uni.redirectTo({
url: `/pages/coordinatePhotos/index?type=3&id=1`, //
url: `/pages/coordinatePhotos/index?type=3&id=${id}`, //
})
}
@ -213,7 +265,7 @@ const onClickSwiper = (e) => {
width: 100%;
display: flex;
align-items: center;
justify-content: space-between;
justify-content: flex-end;
& text {
color: #999;

View File

@ -10,23 +10,24 @@
style="background-color: #fff; padding: 0 30rpx 20rpx"
>
<TitleTipModal :TitleTip="`项目信息`" />
<up-form-item prop="projectName" label="项目名称" required>
<up-form-item prop="proName" label="项目名称" required>
<up-input
readonly
border="none"
:placeholder="props.addAndEditFormType == 3 ? '' : '点击选择项目'"
v-model="addAndEditModel.projectName"
v-model="addAndEditModel.proName"
@click="onSelectProject"
>
<template #suffix v-if="props.addAndEditFormType != 3">
<up-icon name="arrow-right" @tap="onSelectProject" />
<up-icon name="arrow-right" />
</template>
</up-input>
</up-form-item>
<up-form-item prop="major" label="专业">
<up-form-item prop="majorName" label="专业">
<up-input
border="none"
readonly
v-model="addAndEditModel.major"
v-model="addAndEditModel.majorName"
:placeholder="props.addAndEditFormType == 3 ? '' : '点击选择专业'"
>
<template #suffix v-if="props.addAndEditFormType != 3">
@ -34,11 +35,11 @@
</template>
</up-input>
</up-form-item>
<up-form-item prop="procedure" label="工序">
<up-form-item prop="gxName" label="工序">
<up-input
border="none"
readonly
v-model="addAndEditModel.procedure"
v-model="addAndEditModel.gxName"
:placeholder="props.addAndEditFormType == 3 ? '' : '点击选择工序'"
>
<template #suffix v-if="props.addAndEditFormType != 3">
@ -48,37 +49,41 @@
</up-form-item>
<TitleTipModal :TitleTip="`重要事项及宣传照片`" />
<up-form-item prop="inspectTime" label="日期">
<up-form-item prop="time" label="日期">
<up-input
readonly
border="none"
inputAlign="right"
v-model="addAndEditModel.inspectTime"
v-model="addAndEditModel.time"
:placeholder="props.addAndEditFormType == 3 ? '' : '点击选择日期'"
>
<template #suffix v-if="props.addAndEditFormType != 3">
<up-icon name="arrow-right" @tap="onSelectDate(1)" />
<up-icon name="arrow-right" @tap="onSelectDate" />
</template>
</up-input>
</up-form-item>
<up-form-item prop="examiner" label="标题">
<up-form-item prop="title" label="标题">
<up-input
border="none"
v-model="addAndEditModel.title"
:readonly="props.addAndEditFormType == 3"
:placeholder="props.addAndEditFormType == 3 ? '' : '请输入标题'"
/>
</up-form-item>
<up-form-item prop="vrDescribe" label="内容" required>
<up-form-item prop="content" label="内容" required>
<up-textarea
count
autoHeight
border="none"
v-model="addAndEditModel.vrDescribe"
maxlength="200"
v-model="addAndEditModel.content"
:disabled="props.addAndEditFormType == 3"
:readonly="props.addAndEditFormType == 3"
:placeholder="props.addAndEditFormType == 3 ? '' : '请输入内容'"
/>
</up-form-item>
<up-form-item
prop="vrImgList"
prop="imgList"
:label="props.addAndEditFormType == 3 ? '照片' : '照片(最多9张)'"
required
>
@ -87,101 +92,23 @@
multiple
@delete="onDeletePicVrImgList"
@afterRead="onAfterReadVrImgList"
:fileList="addAndEditModel.vrImgList"
:maxCount="props.addAndEditFormType == 3 ? 1 : 9"
:fileList="addAndEditModel.imgList"
:deletable="props.addAndEditFormType != 3"
:maxCount="
props.addAndEditFormType == 3
? addAndEditModel.imgList.length
: 9 - addAndEditModel.imgList.length
"
/>
</up-form-item>
<!-- <up-form-item prop="correctionTerm" label="整改期限" required>
<up-input
readonly
border="none"
inputAlign="right"
v-model="addAndEditModel.correctionTerm"
:placeholder="props.addAndEditFormType == 3 ? '' : '点击选择整改期限'"
>
<template #suffix v-if="props.addAndEditFormType != 3">
<up-icon name="arrow-right" @tap="onSelectDate(2)" />
</template>
</up-input>
</up-form-item>
<up-form-item prop="vrLocation" label="违章地点" required>
<up-input
border="none"
v-model="addAndEditModel.vrLocation"
:readonly="props.addAndEditFormType == 3"
:placeholder="props.addAndEditFormType == 3 ? '' : '请输入违章地点'"
/>
</up-form-item>
<up-form-item prop="vrDescribe" label="违章描述" required>
<up-textarea
autoHeight
border="none"
v-model="addAndEditModel.vrDescribe"
:readonly="props.addAndEditFormType == 3"
:placeholder="props.addAndEditFormType == 3 ? '' : '请输入违章描述'"
/>
</up-form-item>
<up-form-item
prop="vrImgList"
:label="props.addAndEditFormType == 3 ? '违章照片' : '违章照片(最多9张)'"
required
>
<up-upload
name="1"
multiple
@delete="onDeletePicVrImgList"
@afterRead="onAfterReadVrImgList"
:fileList="addAndEditModel.vrImgList"
:maxCount="props.addAndEditFormType == 3 ? 1 : 9"
/>
</up-form-item>
<TitleTipModal :TitleTip="`整改信息`" />
<up-form-item prop="correctionPerson" label="整改人" required>
<up-input
border="none"
:readonly="props.addAndEditFormType == 3"
v-model="addAndEditModel.correctionPerson"
:placeholder="props.addAndEditFormType == 3 ? '' : '请输入整改人'"
/>
</up-form-item>
<up-form-item prop="correctionTime" label="整改日期">
<up-input
readonly
border="none"
inputAlign="right"
v-model="addAndEditModel.correctionTime"
:placeholder="props.addAndEditFormType == 3 ? '' : '点击选择整改日期'"
>
<template #suffix v-if="props.addAndEditFormType != 3">
<up-icon name="arrow-right" @tap="onSelectDate(3)" />
</template>
</up-input>
</up-form-item>
<up-form-item prop="correctionDescribe" label="整改说明" required>
<up-textarea
autoHeight
border="none"
:readonly="props.addAndEditFormType == 3"
v-model="addAndEditModel.correctionDescribe"
:placeholder="props.addAndEditFormType == 3 ? '' : '请输入整改说明'"
/>
</up-form-item>
<up-form-item
prop="examiner"
:label="props.addAndEditFormType == 3 ? '整改照片' : '整改照片(最多9张)'"
>
<up-upload
name="1"
multiple
@delete="onDeleteCorrectionImgList"
@afterRead="onAfterReadCorrectionImgList"
:deletable="!props.addAndEditFormType == 3"
:fileList="addAndEditModel.correctionImgList"
:maxCount="props.addAndEditFormType == 3 ? 1 : 9"
/>
</up-form-item> -->
<up-button type="primary" text="提交" @tap="onSubmitForm" style="width: 100%" />
<up-button
type="primary"
text="提交"
@tap="onSubmitForm"
v-if="props.addAndEditFormType != 3"
style="width: 100%; margin-top: 10rpx"
/>
</up-form>
<!-- 项目选择弹框 -->
@ -204,23 +131,27 @@
<!-- 工程列表 -->
<view class="project-list">
<up-list @scrolltolower="onScrollTolower" style="width: 100%">
<up-list-item v-for="item in 20" :key="item">
<up-cell :title="`xxxxxxxxx工程-${item}`" @tap="onSelectProjectItem(item)">
<up-list-item v-for="(item, index) in projectList" :key="item.id">
<up-cell :title="item.name" @tap="onSelectProjectItem(item)">
<template #icon>
<text style="margin-right: 10rpx">
{{ item }}
{{ index + 1 }}
</text>
</template>
</up-cell>
</up-list-item>
</up-list>
<view class="loading-mask" v-if="maskLoading">
<up-loading-icon color="#2979ff" />
</view>
</view>
</view>
</up-popup>
<!-- 专业选择器 -->
<up-picker
keyName="label"
keyName="name"
:show="majorShow"
:columns="majorList"
@confirm="onConfirmMajor"
@ -228,7 +159,7 @@
/>
<!-- 工序选择器 -->
<up-picker
keyName="label"
keyName="name"
:show="procedureShow"
:columns="procedureList"
@confirm="onConfirmProcedure"
@ -255,11 +186,19 @@
</template>
<script setup>
import { reactive, ref } from 'vue'
import { reactive, ref, onMounted, watch } from 'vue'
import { debounce } from 'lodash-es' //
import { useCommon } from '@/hooks/useCommon.js'
import {
addImportantMattersApi,
editImportantMattersApi,
getImportantMattersDetailsByIdApi,
} from '@/services/importantMatters.js'
import { getProcedureApi } from '@/services/common.js'
import TitleTipModal from '@/components/TitleTipModal/index'
const addAndEditModelRef = ref(null)
const { getProjectList, getMajorList } = useCommon()
const addAndEditModelRef = ref(null)
const projectShow = ref(false) //
const majorShow = ref(false) //
const procedureShow = ref(false) //
@ -267,6 +206,7 @@ const dateShow = ref(false) // 年月日选择器
const onSearchProjectName = ref('') //
const dateValue = ref(Date.now()) //
const sendLoading = ref(false) //
const maskLoading = ref(false)
const dateType = ref(1)
const props = defineProps({
// 1. 2. 3.
@ -274,25 +214,34 @@ const props = defineProps({
type: [Number, String],
default: () => 1,
},
// id
detailsId: {
type: [Number, String],
default: () => 1,
},
})
console.log(props.addAndEditFormType, '表单类型')
//
const projectList = ref([])
const projectListAll = ref([])
//
const majorList = reactive([])
//
const procedureList = reactive([])
//
const addAndEditModel = reactive({
projectName: '',
procedure: '',
major: '',
examiner: '',
inspectTime: '',
correctionTerm: '',
vrLocation: '',
vrDescribe: '',
vrImgList: [],
correctionPerson: '',
correctionDescribe: '',
correctionTime: '',
correctionImgList: [],
dataSource: 2,
proId: '', // id
proName: '', //
majorId: '', // id
majorName: '', //
gxId: '', // id
gxName: '', //
title: '', //
content: '', //
time: '', //
imgList: [],
})
//
@ -305,99 +254,43 @@ const addAndEditModelRules = ref({
trigger: ['blur', 'change'],
},
],
correctionTerm: [
content: [
{
type: 'string',
required: true,
message: '请选择整改期限',
message: '请填写内容',
trigger: ['blur', 'change'],
},
],
vrLocation: [
imgList: [
{
type: 'string',
required: true,
message: '请填写违章地点',
trigger: ['blur', 'change'],
},
],
vrDescribe: [
{
type: 'string',
required: true,
message: '请填写违章描述',
trigger: ['blur', 'change'],
},
],
vrImgList: [
{
type: 'string',
type: 'array',
required: true,
message: '请上传违章照片',
trigger: ['blur', 'change'],
},
],
correctionPerson: [
{
type: 'string',
required: true,
message: '请填写整改人',
trigger: ['blur', 'change'],
},
],
correctionDescribe: [
{
type: 'string',
required: true,
message: '请填写整改说明',
trigger: ['blur', 'change'],
},
],
})
//
const projectList = ref([])
//
const majorList = reactive([
[
{
label: '专业1',
value: 2021,
},
{
label: '专业2',
value: 2022,
},
{
label: '专业3',
value: 2023,
},
{
label: '专业4',
value: 2024,
},
],
])
//
const procedureList = reactive([
[
{
label: '工序1',
id: 2021,
},
{
label: '工序2',
id: 2022,
},
{
label: '工序3',
id: 2023,
},
{
label: '工序4',
id: 2024,
},
],
])
//
const getProcedureData = async (pid) => {
console.log(
'%c🔍 获取工序请求入参 %c',
'background: linear-gradient(90deg, #FF6B6B, #4ECDC4); color: white; padding: 5px 10px; border-radius: 5px; font-weight: bold;',
'',
'pid=' + pid,
)
const { data: res } = await getProcedureApi({ pid })
console.log(
'%c🔍 获取工序请求出参 %c',
'background: linear-gradient(90deg, #FF6B6B, #4ECDC4); color: white; padding: 5px 10px; border-radius: 5px; font-weight: bold;',
'',
res,
)
procedureList.push(res)
}
//
const formatter = (type, value) => {
@ -415,13 +308,24 @@ const formatter = (type, value) => {
//
const onSelectProject = () => {
console.log('---选择')
projectShow.value = true
}
//
const onSearchInProjectPopup = () => {
console.log('---搜索', onSearchProjectName.value)
maskLoading.value = true
try {
if (!onSearchProjectName.value) {
projectList.value = projectListAll.value
return
}
const searchTerm = onSearchProjectName.value.toLowerCase()
projectList.value = projectListAll.value.filter(
(e) => e.name && e.name.toLowerCase().includes(searchTerm),
)
} finally {
maskLoading.value = false // loading
}
}
//
@ -431,7 +335,8 @@ const onScrollTolower = () => {
//
const onSelectProjectItem = (item) => {
addAndEditModel.projectName = 'xxxxxx工程' + item
addAndEditModel.proName = item.name
addAndEditModel.proId = item.id
projectShow.value = false
}
@ -448,8 +353,9 @@ const onSelectMajor = () => {
//
const onConfirmMajor = (item) => {
console.log('---确定', item.value[0].label)
addAndEditModel.major = item.value[0].label
addAndEditModel.majorName = item.value[0].name
addAndEditModel.majorId = item.value[0].id
getProcedureData(item.value[0].id)
majorShow.value = false
}
//
@ -459,29 +365,20 @@ const onSelectProcedure = () => {
//
const onConfirmProcedure = (item) => {
addAndEditModel.procedure = item.value[0].label
addAndEditModel.gxName = item.value[0].name
addAndEditModel.gxId = item.value[0].id
procedureShow.value = false
}
//
const onSelectDate = (type) => {
// type 1. 2. 3.
dateType.value = type
const onSelectDate = () => {
dateShow.value = true
}
//
const onConfirmDate = (item) => {
const formatDateValue = formatDate(dateValue.value)
if (dateType.value === 1) {
addAndEditModel.inspectTime = formatDateValue
}
if (dateType.value === 2) {
addAndEditModel.correctionTerm = formatDateValue
}
if (dateType.value === 3) {
addAndEditModel.correctionTime = formatDateValue
}
addAndEditModel.time = formatDateValue
dateShow.value = false
console.log('---日期确定', formatDateValue)
}
@ -494,57 +391,260 @@ const formatDate = (timestamp) => {
return `${year}-${month}-${day}`
}
//
//
const onAfterReadVrImgList = (event) => {
let lists = [].concat(event.file)
lists.map((item) => {
addAndEditModel.vrImgList.push({
addAndEditModel.imgList.push({
...item,
isEdit: false,
})
})
}
//
//
const onDeletePicVrImgList = (event) => {
addAndEditModel.vrImgList.splice(event.index, 1)
}
//
const onAfterReadCorrectionImgList = (event) => {
let lists = [].concat(event.file)
lists.map((item) => {
addAndEditModel.correctionImgList.push({
...item,
})
})
}
//
const onDeleteCorrectionImgList = (event) => {
addAndEditModel.correctionImgList.splice(event.index, 1)
addAndEditModel.imgList.splice(event.index, 1)
}
//
const onSubmitForm = debounce(() => {
console.log('---提交')
sendLoading.value = true
addAndEditModelRef.value.validate().then((valid) => {
if (valid) {
console.log('校验通过')
sendLoading.value = false
}
})
addAndEditModelRef.value
.validate()
.then(async (valid) => {
if (valid) {
//
sendLoading.value = true
const uploadImages = new Promise(async (resolve, reject) => {
try {
let successCorrectionImgList = []
let successCorrectionImgListNoEdit = []
if (addAndEditModel.imgList.length > 0) {
successCorrectionImgListNoEdit = addAndEditModel.imgList.filter(
(e) => !e.isEdit,
)
}
if (successCorrectionImgListNoEdit.length > 0) {
successCorrectionImgList = await uploadImgFun(
successCorrectionImgListNoEdit,
)
}
resolve({ successCorrectionImgList }) //
} catch (error) {
reject(error) //
}
})
uploadImages
.then(async ({ successCorrectionImgList }) => {
//
//
const {
dataSource,
proId, // id
proName, //
majorId, // id
majorName, //
gxId, // id
gxName, //
title, //
content, //
time, //
imgList,
} = addAndEditModel
const imgListOld = []
imgList.forEach((e) => {
if (e.isEdit) imgListOld.push(e)
})
const addParams = {
dataSource,
proId, // id
proName, //
majorId, // id
majorName, //
gxId, // id
gxName, //
title, //
content, //
time, //
sysFileResourceList: [...imgListOld, ...successCorrectionImgList],
uploadType: 3,
}
const SED_API =
props.addAndEditFormType == 1
? addImportantMattersApi
: editImportantMattersApi
if (props.addAndEditFormType == 2) {
Object.assign(addParams, {
id: props.detailsId,
})
}
console.log(
'%c🔍 表单提交入参 %c',
'background: linear-gradient(90deg, #FF6B6B, #4ECDC4); color: white; padding: 5px 10px; border-radius: 5px; font-weight: bold;',
'',
addParams,
)
const res = await SED_API(addParams)
console.log(
'%c🔍 表单提交出参 %c',
'background: linear-gradient(90deg, #FF6B6B, #4ECDC4); color: white; padding: 5px 10px; border-radius: 5px; font-weight: bold;',
'',
res,
)
sendLoading.value = false
if (res.code === 200) {
uni.$u.toast(res.data)
setTimeout(() => {
uni.navigateBack({
delta: 1,
})
}, 500)
} else {
uni.$u.toast(res.msg)
}
})
.catch((error) => {
// console.error(':', error)
})
}
})
.catch((error) => {})
}, 1000)
//
const getFormDetail = () => {
console.log('---获取详情数据')
}
// props.addAndEditFormType 2
if (props.addAndEditFormType == 2) {
//
getFormDetail()
//
const uploadImgFun = async (list) => {
console.log(list, '上传逻辑')
return new Promise((resolve, reject) => {
let successList = []
let files = []
list.forEach((f) => {
let d = {
file: f.url,
name: 'files',
uri: f.url,
}
files.push(d)
})
sendLoading.value = true
uni.uploadFile({
url: '/imgTool/sys/file/uploadFile',
files: files,
name: 'files',
formData: {
params: JSON.stringify({
uploadType: 5,
sourceType: 9,
sourceTypeName: '重要事项及宣传照片',
}),
},
success: (res) => {
sendLoading.value = false
res = JSON.parse(res.data)
if (res.code === 200) {
successList = res.data
resolve(successList) //
} else {
uni.$u.toast('上传失败' + res.msg)
reject(new Error('上传失败: ' + res.msg))
}
},
fail: (err) => {
sendLoading.value = false
reject(new Error('网络错误: ' + err.errMsg))
},
})
})
}
//
const getFormDetail = async () => {
console.log(
'%c🔍 获取重要事项及宣传类详情入参 %c',
'background: linear-gradient(90deg, #FF6B6B, #4ECDC4); color: white; padding: 5px 10px; border-radius: 5px; font-weight: bold;',
'',
props?.detailsId,
)
const res = await getImportantMattersDetailsByIdApi({ id: props?.detailsId })
console.log(
'%c🔍 获取重要事项及宣传类详情出参 %c',
'background: linear-gradient(90deg, #FF6B6B, #4ECDC4); color: white; padding: 5px 10px; border-radius: 5px; font-weight: bold;',
'',
res,
)
if (res.code === 200) {
const {
dataSource,
proId, // id
proName, //
majorId, // id
majorName, //
gxId, // id
gxName, //
title, //
content, //
time, //
sysFileResourceList,
} = res.data
let correctionImgListEdit = []
if (sysFileResourceList.length > 0) {
correctionImgListEdit = sysFileResourceList.map((e) => {
return {
idEdit: true,
url: e.originalFilePath,
...e,
}
})
}
Object.assign(addAndEditModel, {
proId, // id
proName, //
majorId, // id
majorName, //
gxId, // id
gxName, //
title, //
content, //
time, //
imgList: correctionImgListEdit,
})
getProcedureData(majorId)
}
}
//
watch(
() => props.addAndEditFormType,
(newValue) => {
if (newValue != 1) {
getFormDetail()
}
},
{
deep: true,
immediate: true,
},
)
onMounted(async () => {
projectList.value = await getProjectList()
projectListAll.value = await getProjectList()
majorList.push(await getMajorList())
})
</script>
<style scoped lang="scss">
@ -574,6 +674,20 @@ if (props.addAndEditFormType == 2) {
.project-list {
width: 100%;
overflow: hidden;
position: relative;
.loading-mask {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: #333;
display: flex;
align-items: center;
justify-content: center;
opacity: 0.8;
}
}
}
</style>

View File

@ -8,7 +8,7 @@
/>
<view class="container">
<AddAndEditForm :addAndEditFormType="addAndEditFormType" />
<AddAndEditForm :addAndEditFormType="addAndEditFormType" :detailsId="detailsId" />
</view>
</view>
</template>
@ -21,12 +21,16 @@ import { onLoad } from '@dcloudio/uni-app'
const { safeAreaInsets } = uni.getSystemInfoSync()
const addAndEditFormType = ref(1)
const detailsId = ref('')
const uploadRecordUrl = ref('/pages/importantMatters/upload-record/index')
onLoad((query) => {
if (query.type) {
addAndEditFormType.value = query.type
}
if (query.id) {
detailsId.value = query.id
}
})
</script>

View File

@ -8,7 +8,7 @@
<up-input
clearable
placeholder="输入搜索关键词"
v-model.trim="onSearchKeyword"
v-model.trim="queryParams.keyWord"
suffixIconStyle="color: #909399"
>
<template #suffix>
@ -18,109 +18,153 @@
</view>
</view>
<view class="upload-record-list">
<view class="upload-record-list" v-if="importantMattersList.length > 0">
<up-list @scrolltolower="onScrollTolower" style="width: 100%">
<up-list-item v-for="item in 10" :key="item">
<up-list-item v-for="item in importantMattersList" :key="item.id">
<view class="record-item">
<view @tap="onHandleViewDetails">
<view @tap="onHandleViewDetails(item.id)">
<!-- 日期 -->
<view class="item-date">
<text>2024-05-06</text>
<text>{{ item.time }}</text>
<view>
<up-button
size="mini"
text="修改"
type="primary"
@tap="onHandleEditRecord"
@tap="onHandleEditRecord(item.id)"
/>
</view>
</view>
<!-- 名称 -->
<view class="item-name">
<text>N3917</text>
<text>{{ item.title }}</text>
</view>
<!-- 文字内容 -->
<view class="text-content">
<up-text
:lines="2"
text="关于uview-plus的取名来由首字母u来自于uni-app首字母
uni-app是基VuejsVue和View(延伸为UI视图之意)同音同时view组件uni-app中
最础最重要的组件故取名uview-plus表达源于uni-app和Vue之意同时在此也对它示感谢"
/>
<up-text :lines="2" :text="item.content" />
</view>
</view>
<!-- 图片内容 -->
<view class="swiper-container">
<up-swiper
:list="list1"
:indicator="true"
:list="item.sysFileResourceList"
interval="5000"
@click="onClickSwiper"
/>
<view class="swiper-count"> 3 </view>
<view class="swiper-count">
{{ item?.sysFileResourceList.length }}
</view>
</view>
<!-- 检查人 -->
<view class="inspect-person">
<view> 检查人武松 </view>
<view> 整改日期2025-05-06 </view>
<!-- <view> 检查人武松 </view> -->
</view>
</view>
</up-list-item>
</up-list>
<view class="loading-text">
{{ finish ? '没有更多数据了~' : '正在加载...' }}
</view>
</view>
<up-empty mode="data" v-else />
</view>
</view>
</template>
<script setup>
import NavBarModal from '@/components/NavBarModal/index'
import { ref, reactive } from 'vue'
import { ref, reactive, computed } from 'vue'
import { debounce } from 'lodash-es' //
const scrollTop = ref(0)
const onSearchKeyword = ref('')
const finish = ref(false)
import { getImportantMattersListApi } from '@/services/importantMatters.js'
const importantMattersList = ref([])
const total = ref(0)
const list1 = reactive([
'https://img1.baidu.com/it/u=1361177696,203903602&fm=253&fmt=auto&app=138&f=JPEG?w=800&h=1455',
'https://img1.baidu.com/it/u=1361177696,203903602&fm=253&fmt=auto&app=138&f=JPEG?w=800&h=1455',
'https://img1.baidu.com/it/u=1361177696,203903602&fm=253&fmt=auto&app=138&f=JPEG?w=800&h=1455',
])
//
const queryParams = ref({
pageNum: 1,
pageSize: 10,
keyWord: '',
})
//
const getImportantMattersListData = async (isTap = false) => {
try {
console.log(
'%c🔍 获取重要事项及宣传类上传记录入参 %c',
'background: linear-gradient(90deg, #FF6B6B, #4ECDC4); color: white; padding: 5px 10px; border-radius: 5px; font-weight: bold;',
'',
queryParams.value,
)
const { data: res } = await getImportantMattersListApi(queryParams.value)
console.log(
'%c🔍 获取重要事项及宣传类上传记录出参 %c',
'background: linear-gradient(90deg, #FF6B6B, #4ECDC4); color: white; padding: 5px 10px; border-radius: 5px; font-weight: bold;',
'',
res,
)
//
total.value = res.total
//
if (isTap) {
//
importantMattersList.value = res?.list || []
//
queryParams.value.pageNum = 1
} else {
//
if (res.list && res.list.length > 0) {
importantMattersList.value = [...importantMattersList.value, ...res.list]
}
}
} catch (error) {
//
if (isTap) {
importantMattersList.value = []
}
}
}
getImportantMattersListData()
//
const onScrollTolower = debounce(() => {
console.log('onScrollTolower')
//
if (importantMattersList.value.length < total.value) {
queryParams.value.pageNum++
getImportantMattersListData(false)
}
}, 500)
//
const finish = computed(() => {
if (total.value === importantMattersList.value.length) return true
})
//
const onSearchRecord = () => {
console.log('onSearchRecord', onSearchKeyword.value)
getImportantMattersListData(true)
}
//
const onHandleEditRecord = () => {
const onHandleEditRecord = (id) => {
console.log('onHandleEditRecord')
uni.redirectTo({
url: `/pages/importantMatters/index?type=2&id=1`, //
url: `/pages/importantMatters/index?type=2&id=${id}`, //
})
}
//
const onHandleViewDetails = () => {
const onHandleViewDetails = (id) => {
uni.redirectTo({
url: `/pages/importantMatters/index?type=3&id=1`, //
url: `/pages/importantMatters/index?type=3&id=${id}`, //
})
}
//
const onClickSwiper = (e) => {
console.log(e, '点击了轮播图')
}
const onClickSwiper = (e) => {}
</script>
<style lang="scss" scoped>
@ -187,7 +231,7 @@ const onClickSwiper = (e) => {
.inspect-person {
display: flex;
justify-content: space-between;
justify-content: flex-end;
align-items: center;
padding: 10rpx 16rpx;
font-size: 14px;

View File

@ -92,10 +92,12 @@
</up-form-item>
<up-form-item prop="vioDesc" label="检查描述" required>
<up-textarea
count
autoHeight
border="none"
maxlength="200"
v-model="addAndEditModel.vioDesc"
:readonly="props.addAndEditFormType == 3"
:disabled="props.addAndEditFormType == 3"
:placeholder="props.addAndEditFormType == 3 ? '' : '请输入检查描述'"
/>
</up-form-item>
@ -141,9 +143,11 @@
</up-form-item>
<up-form-item prop="rectDesc" label="整改说明" required>
<up-textarea
count
autoHeight
border="none"
:readonly="props.addAndEditFormType == 3"
maxlength="200"
:disabled="props.addAndEditFormType == 3"
v-model="addAndEditModel.rectDesc"
:placeholder="props.addAndEditFormType == 3 ? '' : '请输入整改说明'"
/>
@ -170,8 +174,8 @@
text="提交"
type="primary"
@tap="onSubmitForm"
style="width: 100%"
v-if="addAndEditFormType != 3"
v-if="props.addAndEditFormType != 3"
style="width: 100%; margin-top: 10rpx"
/>
</up-form>
@ -284,6 +288,7 @@ const props = defineProps({
//
const projectList = ref([])
const projectListAll = ref([])
//
const majorList = reactive([])
//
@ -330,6 +335,17 @@ const addAndEditModelRules = ref({
trigger: ['blur', 'change'],
},
],
checkUserName: [
{
trigger: ['blur', 'change'],
pattern: /^(?:[\u4e00-\u9fa5]{1,10}|[a-zA-Z][a-zA-Z\s\-.]{1,19})$/,
//
transform(value) {
return String(value)
},
message: '请填写正确的人名',
},
],
vioPlace: [
{
type: 'string',
@ -375,10 +391,10 @@ const addAndEditModelRules = ref({
//
const getProcedureData = async (pid) => {
console.log(
'%c🔍 获取专业请求入参 %c',
'%c🔍 获取工序请求入参 %c',
'background: linear-gradient(90deg, #FF6B6B, #4ECDC4); color: white; padding: 5px 10px; border-radius: 5px; font-weight: bold;',
'',
pid,
'pid=' + pid,
)
const { data: res } = await getProcedureApi({ pid })
console.log(
@ -410,7 +426,15 @@ const onSelectProject = () => {
}
//
const onSearchInProjectPopup = () => {
// console.log('---', onSearchProjectName.value)
if (!onSearchProjectName.value) {
projectList.value = projectListAll.value //
return
}
const searchTerm = onSearchProjectName.value.toLowerCase()
projectList.value = projectListAll.value.filter(
(e) => e.name && e.name.toLowerCase().includes(searchTerm),
)
}
//
@ -548,28 +572,17 @@ const onSubmitForm = debounce(() => {
let successCorrectionImgListNoEdit = []
if (addAndEditModel.vrImgList.length > 0) {
successVrImgListNoEdit = addAndEditModel.vrImgList.map((e) => {
if (!e.isEdit) {
return {
...e,
}
}
})
successVrImgListNoEdit = addAndEditModel.vrImgList.filter(
(e) => !e.isEdit,
)
if (successVrImgListNoEdit.length > 0) {
successVrImgList = await uploadImgFun(successVrImgListNoEdit, 3)
}
}
if (addAndEditModel.correctionImgList.length > 0) {
successCorrectionImgListNoEdit = addAndEditModel.correctionImgList.map(
(e) => {
if (!e.isEdit) {
return {
...e,
}
}
},
)
successCorrectionImgListNoEdit =
addAndEditModel.correctionImgList.filter((e) => !e.isEdit)
if (successCorrectionImgListNoEdit.length > 0) {
successCorrectionImgList = await uploadImgFun(
@ -752,7 +765,7 @@ const getFormDetail = async () => {
if (rectPhotoList.length > 0) {
rectPhotoListEdit = rectPhotoList.map((e) => {
return {
idEdit: true,
isEdit: true,
url: e.originalFilePath,
...e,
}
@ -761,7 +774,7 @@ const getFormDetail = async () => {
if (vioPhotoList.length > 0) {
vioPhotoListEdit = vioPhotoList.map((e) => {
return {
idEdit: true,
isEdit: true,
url: e.originalFilePath,
...e,
}
@ -793,6 +806,7 @@ const getFormDetail = async () => {
onMounted(async () => {
projectList.value = await getProjectList()
projectListAll.value = await getProjectList()
majorList.push(await getMajorList())
})

View File

@ -80,8 +80,10 @@
</up-form-item>
<up-form-item prop="checkDesc" label="检查描述" required>
<up-textarea
count
autoHeight
border="none"
maxlength="200"
:readonly="props.addAndEditFormType == 3"
v-model="addAndEditModel.checkDesc"
:placeholder="props.addAndEditFormType == 3 ? '' : '请输入检查描述'"
@ -111,6 +113,7 @@
type="primary"
text="提交"
@tap="onSubmitForm"
v-if="props.addAndEditFormType != 3"
style="width: 100%; margin-top: 10rpx"
/>
</up-form>
@ -274,6 +277,7 @@ const addAndEditModelRules = ref({
})
//
const projectList = ref([])
const projectListAll = ref([])
//
const majorList = ref([])
@ -297,10 +301,10 @@ const procedureList = reactive([])
//
const getProcedureData = async (pid) => {
console.log(
'%c🔍 获取专业请求入参 %c',
'%c🔍 获取工序请求入参 %c',
'background: linear-gradient(90deg, #FF6B6B, #4ECDC4); color: white; padding: 5px 10px; border-radius: 5px; font-weight: bold;',
'',
pid,
'pid=' + pid,
)
const { data: res } = await getProcedureApi({ pid })
console.log(
@ -318,7 +322,15 @@ const onSelectProject = () => {
}
//
const onSearchInProjectPopup = () => {
// console.log('---', onSearchProjectName.value)
if (!onSearchProjectName.value) {
projectList.value = projectListAll.value //
return
}
const searchTerm = onSearchProjectName.value.toLowerCase()
projectList.value = projectListAll.value.filter(
(e) => e.name && e.name.toLowerCase().includes(searchTerm),
)
}
//
@ -601,7 +613,7 @@ const getFormDetail = async () => {
if (sysFileResourceList.length > 0) {
correctionImgListEdit = sysFileResourceList.map((e) => {
return {
idEdit: true,
isEdit: true,
url: e.originalFilePath,
...e,
}
@ -642,6 +654,7 @@ watch(
onMounted(async () => {
projectList.value = await getProjectList()
projectListAll.value = await getProjectList()
majorList.value.push(await getMajorList())
})
</script>

View File

@ -138,7 +138,7 @@ getSafetyMeasureListData()
const onScrollTolower = debounce(() => {
//
if (safetyMeasureList.value.length < total.value) {
queryParams.value.page++
queryParams.value.pageNum++
getSafetyMeasureListData(false)
}
}, 500)

View File

@ -92,10 +92,12 @@
</up-form-item>
<up-form-item prop="vioDesc" label="违章描述" required>
<up-textarea
count
autoHeight
border="none"
maxlength="200"
v-model="addAndEditModel.vioDesc"
:readonly="props.addAndEditFormType == 3"
:disabled="props.addAndEditFormType == 3"
:placeholder="props.addAndEditFormType == 3 ? '' : '请输入违章描述'"
/>
</up-form-item>
@ -141,10 +143,12 @@
</up-form-item>
<up-form-item prop="rectDesc" label="整改说明" required>
<up-textarea
count
autoHeight
border="none"
:readonly="props.addAndEditFormType == 3"
maxlength="200"
v-model="addAndEditModel.rectDesc"
:disabled="props.addAndEditFormType == 3"
:placeholder="props.addAndEditFormType == 3 ? '' : '请输入整改说明'"
/>
</up-form-item>
@ -170,8 +174,8 @@
text="提交"
type="primary"
@tap="onSubmitForm"
style="width: 100%"
v-if="addAndEditFormType != 3"
v-if="props.addAndEditFormType != 3"
style="width: 100%; margin-top: 10rpx"
/>
</up-form>
@ -284,6 +288,7 @@ const props = defineProps({
//
const projectList = ref([])
const projectListAll = ref([])
//
const majorList = reactive([])
//
@ -375,10 +380,10 @@ const addAndEditModelRules = ref({
//
const getProcedureData = async (pid) => {
console.log(
'%c🔍 获取专业请求入参 %c',
'%c🔍 获取工序请求入参 %c',
'background: linear-gradient(90deg, #FF6B6B, #4ECDC4); color: white; padding: 5px 10px; border-radius: 5px; font-weight: bold;',
'',
pid,
'pid=' + pid,
)
const { data: res } = await getProcedureApi({ pid })
console.log(
@ -412,7 +417,15 @@ const onSelectProject = () => {
}
//
const onSearchInProjectPopup = () => {
// console.log('---', onSearchProjectName.value)
if (!onSearchProjectName.value) {
projectList.value = projectListAll.value //
return
}
const searchTerm = onSearchProjectName.value.toLowerCase()
projectList.value = projectListAll.value.filter(
(e) => e.name && e.name.toLowerCase().includes(searchTerm),
)
}
//
@ -550,28 +563,17 @@ const onSubmitForm = debounce(() => {
let successCorrectionImgListNoEdit = []
if (addAndEditModel.vrImgList.length > 0) {
successVrImgListNoEdit = addAndEditModel.vrImgList.map((e) => {
if (!e.isEdit) {
return {
...e,
}
}
})
successVrImgListNoEdit = addAndEditModel.vrImgList.filter(
(e) => !e.isEdit,
)
if (successVrImgListNoEdit.length > 0) {
successVrImgList = await uploadImgFun(successVrImgListNoEdit, 1)
}
}
if (addAndEditModel.correctionImgList.length > 0) {
successCorrectionImgListNoEdit = addAndEditModel.correctionImgList.map(
(e) => {
if (!e.isEdit) {
return {
...e,
}
}
},
)
successCorrectionImgListNoEdit =
addAndEditModel.correctionImgList.filter((e) => !e.isEdit)
if (successCorrectionImgListNoEdit.length > 0) {
successCorrectionImgList = await uploadImgFun(
@ -658,13 +660,13 @@ const onSubmitForm = debounce(() => {
sendLoading.value = false
if (res.code === 200) {
uni.$u.toast(res.data)
// setTimeout(() => {
// uni.navigateBack({
// delta: 1,
// })
// }, 500)
setTimeout(() => {
uni.navigateBack({
delta: 1,
})
}, 500)
} else {
uni.$u.toast(res.data)
uni.$u.toast(res.msg)
}
})
.catch((error) => {
@ -751,19 +753,19 @@ const getFormDetail = async () => {
let rectPhotoListEdit = []
let vioPhotoListEdit = []
if (rectPhotoList.length > 0) {
if (rectPhotoList?.length > 0) {
rectPhotoListEdit = rectPhotoList.map((e) => {
return {
idEdit: true,
isEdit: true,
url: e.originalFilePath,
...e,
}
})
}
if (vioPhotoList.length > 0) {
if (vioPhotoList?.length > 0) {
vioPhotoListEdit = vioPhotoList.map((e) => {
return {
idEdit: true,
isEdit: true,
url: e.originalFilePath,
...e,
}
@ -809,6 +811,7 @@ watch(
onMounted(async () => {
projectList.value = await getProjectList()
projectListAll.value = await getProjectList()
majorList.push(await getMajorList())
})
</script>

View File

@ -5,6 +5,7 @@ export const getProjectApi = (data) => {
return http({
method: 'POST',
url: '/imgTool/sys/select/getProsSelect',
isPassWord: true,
header: {
'Content-Type': 'application/x-www-form-urlencoded',
},

View File

@ -0,0 +1,38 @@
import { http } from '@/utils/http'
// 综合查询获取分类数量
export const getClassCountApi = (data) => {
return http({
method: 'POST',
url: '/imgTool/app/synthesisQuery/getImgNum',
header: {
'Content-Type': 'application/x-www-form-urlencoded',
},
isPassWord: true,
data,
})
}
// 综合查询获取分类数量
export const getImgListApi = (data) => {
return http({
method: 'POST',
isPassWord: true,
url: '/imgTool/app/synthesisQuery/getImgList',
header: {
'Content-Type': 'application/x-www-form-urlencoded',
},
data,
})
}
// 综合查询收藏以及取消收藏
export const editCollectTypeApi = (data) => {
return http({
method: 'POST',
url: '/imgTool/app/synthesisQuery/collectData',
isPassWord: true,
header: {
'Content-Type': 'application/x-www-form-urlencoded',
},
data,
})
}

View File

@ -0,0 +1,46 @@
import { http } from '@/utils/http'
// 协调照片表单提交接口
export const addCoordinatePhotoApi = (data) => {
return http({
method: 'POST',
url: '/imgTool/coordinatePhoto/addCoordinatePhoto',
data,
header: {
'Content-Type': 'application/x-www-form-urlencoded',
},
})
}
// 协调照片数据列表
export const getCoordinatePhotoListApi = (data) => {
return http({
method: 'POST',
url: '/imgTool/coordinatePhoto/getCoordinatePhotoList',
data,
header: {
'Content-Type': 'application/x-www-form-urlencoded',
},
})
}
// 协调照片表单获取详情
export const getCoordinatePhotoDetailsByIdApi = (data) => {
return http({
method: 'POST',
url: '/imgTool/coordinatePhoto/getCoordinatePhotoById',
data,
header: {
'Content-Type': 'application/x-www-form-urlencoded',
},
})
}
// 协调照片表单修改
export const editCoordinatePhotoApi = (data) => {
return http({
method: 'POST',
url: '/imgTool/coordinatePhoto/updateCoordinatePhoto',
data,
header: {
'Content-Type': 'application/x-www-form-urlencoded',
},
})
}

View File

@ -0,0 +1,46 @@
import { http } from '@/utils/http'
// 重要事项及宣传类表单提交接口
export const addImportantMattersApi = (data) => {
return http({
method: 'POST',
url: '/imgTool/importantMatter/addImportantMatter',
data,
header: {
'Content-Type': 'application/x-www-form-urlencoded',
},
})
}
// 重要事项及宣传类数据列表
export const getImportantMattersListApi = (data) => {
return http({
method: 'POST',
url: '/imgTool/importantMatter/getImportantMatterList',
data,
header: {
'Content-Type': 'application/x-www-form-urlencoded',
},
})
}
// 重要事项及宣传类表单获取详情
export const getImportantMattersDetailsByIdApi = (data) => {
return http({
method: 'POST',
url: '/imgTool/importantMatter/getImportantMatterById',
data,
header: {
'Content-Type': 'application/x-www-form-urlencoded',
},
})
}
// 重要事项及宣传类表单修改
export const editImportantMattersApi = (data) => {
return http({
method: 'POST',
url: '/imgTool/importantMatter/updateImportantMatter',
data,
header: {
'Content-Type': 'application/x-www-form-urlencoded',
},
})
}

View File

@ -6,6 +6,7 @@ export const loginApi = (data) => {
method: 'POST',
url: '/imgTool/login',
isEncrypt: true,
isPassWord: false,
data,
header: {
'Content-Type': 'application/x-www-form-urlencoded',

View File

@ -7,8 +7,10 @@ import { cloneDeep } from 'lodash-es' // 引入深拷贝函数
* 拦截 request 请求
* baseURL 设置请求ip地址和端口
*/
const ENV = process.env.NODE_ENV
const baseURL = ENV === 'development' ? '/api' : 'http://192.168.0.133:11997'
// const ENV = process.env.NODE_ENV
// const baseURL = ENV === 'development' ? '/api' : 'http://192.168.0.133:11997'
const baseURL = import.meta.env.VITE_API_BASE_URL
/**
* httpInterceptor 分别拦截 request uploadFile 请求
*/
@ -21,17 +23,20 @@ const httpInterceptor = {
options.url = baseURL + options.url
}
if (options.isEncrypt) {
if (options.data) {
options.data = cloneDeep(options.data) // 参数深拷贝 避免影响视图
for (const key in options.data) {
options.data[key] = encrypt(options.data[key])
if (options?.isPassWord) {
if (options.isEncrypt) {
if (options.data) {
options.data = cloneDeep(options.data) // 参数深拷贝 避免影响视图
for (const key in options.data) {
options.data[key] = encrypt(options.data[key])
}
}
}
} else {
if (!options.isNull) {
options.data = {
encryptedData: encrypt(JSON.stringify(options.data)),
} else {
if (!options.isNull) {
options.data = {
// encryptedData: encrypt(JSON.stringify(options.data)),
encryptedData: JSON.stringify(options.data),
}
}
}
}

15
src/utils/index.js Normal file
View File

@ -0,0 +1,15 @@
export function formatCustomNumber(num) {
const str = num.toString()
const len = str.length
if (len <= 2) return str // 不足2位直接返回
// 最后2位单独处理
const lastTwo = str.slice(-2)
const rest = str.slice(0, -2)
// 每3位加逗号
const formattedRest = rest.replace(/\B(?=(\d{3})+(?!\d))/g, ',')
return `${formattedRest},${lastTwo}`
}

View File

@ -10,7 +10,8 @@ export default defineConfig({
'/api': {
// target: 'http://192.168.0.133:11997', // 梁超
// target: 'http://192.168.0.137:11997', // 方亮
target: 'http://192.168.0.60:11997', // 赵福海
// target: 'http://192.168.0.60:11997', // 赵福海
target: 'http://192.168.0.39:11997', // 陈长文
changeOrigin: true,
rewrite: (path) => {
return path.replace(/\/api/, '')