Merge remote-tracking branch 'origin/master'
| | |
| | | } |
| | | } |
| | | |
| | | .el-select__wrapper.is-disabled .el-select__selected-item { |
| | | color: #a8abb2; |
| | | } |
| | | |
| | | .el-select { |
| | | --el-select-border-color-hover: rgb(0, 162, 255) !important; |
| | | } |
| | |
| | | <div class="val">{{ formData.areaName || '-' }}</div> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <div class="label">部署模式</div> |
| | | <div class="val">{{ deploymentModeLabel(formData.deploymentMode) }}</div> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <div class="label">排序</div> |
| | | <div class="val">{{ formData.sort }}</div> |
| | | </el-col> |
| | |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="部署模式" prop="deploymentMode"> |
| | | <el-radio-group v-model="formData.deploymentMode" class="command-radio-group"> |
| | | <el-radio :label="0">统一部署</el-radio> |
| | | <el-radio :label="1">独立部署</el-radio> |
| | | </el-radio-group> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="24"> |
| | | <el-form-item label="备注" prop="remark"> |
| | | <el-input class="command-input" v-model="formData.remark" type="textarea" :rows="3" placeholder="请输入" clearable /> |
| | |
| | | deptNature: null, |
| | | areaCode: [], |
| | | areaName: '', |
| | | deploymentMode: 0, |
| | | sort: 0, |
| | | remark: '', |
| | | }) |
| | |
| | | deptCategory: fieldRules(true), |
| | | deptNature: fieldRules(true), |
| | | areaCode: fieldRules(true), |
| | | deploymentMode: fieldRules(true), |
| | | sort: fieldRules(true), |
| | | } |
| | | |
| | | function deploymentModeLabel(value) { |
| | | if (value === 1) return '独立部署' |
| | | if (value === 0) return '统一部署' |
| | | return value ?? '-' |
| | | } |
| | | |
| | | function normalizeAreaCode(value) { |
| | |
| | | <el-table-column prop="sort" show-overflow-tooltip width="80" label="排序" /> |
| | | <el-table-column prop="bingId" show-overflow-tooltip width="100" label="组织id" /> |
| | | <el-table-column prop="areaName" show-overflow-tooltip width="180" label="行政区划" /> |
| | | <el-table-column prop="deploymentMode" show-overflow-tooltip width="120" label="部署模式"> |
| | | <template v-slot="{ row }"> |
| | | {{ deploymentModeLabel(row.deploymentMode) }} |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <el-table-column label="操作" class-name="operation-btns" width="220"> |
| | | <template v-slot="{ row }"> |
| | | <el-link @click="handleView(row)">查看</el-link> |
| | |
| | | |
| | | provide('dictObj', dictObj) |
| | | provide('deptTree', deptTree) |
| | | |
| | | function deploymentModeLabel(value) { |
| | | if (value === 1) return '独立部署' |
| | | if (value === 0) return '统一部署' |
| | | return value ?? '-' |
| | | } |
| | | |
| | | async function getList() { |
| | | loading.value = true |
| | |
| | | <div class="label">账号状态</div> |
| | | <div class="val">{{ formData.statusName }}</div> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <div class="label">到期时间</div> |
| | | <div class="val">{{ formData.expireTime }}</div> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <div class="label">次数限制</div> |
| | | <div class="val">{{ formData.maxLoginNum }}</div> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <div class="label">飞行开始时间</div> |
| | | <div class="val">{{ formData.flightStartTime }}</div> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <div class="label">飞行结束时间</div> |
| | | <div class="val">{{ formData.flightEndTime }}</div> |
| | | </el-col> |
| | | </el-row> |
| | | </div> |
| | | |
| | |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | |
| | | <div class="detail-title">登录限制</div> |
| | | <el-row :gutter="16"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="到期时间" prop="expireTime"> |
| | | <el-date-picker |
| | | class="command-date-picker" |
| | | popper-class="command-date-picker-popper" |
| | | v-model="formData.expireTime" |
| | | type="datetime" |
| | | placeholder="请选择" |
| | | format="YYYY-MM-DD HH:mm:ss" |
| | | value-format="YYYY-MM-DD HH:mm:ss" |
| | | clearable |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="次数限制" prop="maxLoginNum"> |
| | | <el-input class="command-input" v-model="formData.maxLoginNum" placeholder="请输入" clearable /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="飞行开始时间" prop="flightStartTime"> |
| | | <el-time-picker |
| | | class="command-date-picker" |
| | | popper-class="command-date-picker-popper" |
| | | v-model="formData.flightStartTime" |
| | | placeholder="请选择" |
| | | format="HH:mm" |
| | | value-format="HH:mm" |
| | | clearable |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="飞行结束时间" prop="flightEndTime"> |
| | | <el-time-picker |
| | | class="command-date-picker" |
| | | popper-class="command-date-picker-popper" |
| | | v-model="formData.flightEndTime" |
| | | placeholder="请选择" |
| | | format="HH:mm" |
| | | value-format="HH:mm" |
| | | clearable |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | </el-form> |
| | | |
| | | <template #footer> |
| | |
| | | code: '', |
| | | roleId: '', |
| | | deptId: '', |
| | | expireTime: '', |
| | | maxLoginNum: '', |
| | | flightStartTime: '', |
| | | flightEndTime: '', |
| | | }) |
| | | |
| | | const treeProps = { |
| | |
| | | visible.value = false |
| | | } |
| | | |
| | | function validateFlightTime() { |
| | | if (formData.value.flightStartTime && formData.value.flightEndTime) { |
| | | const [startHours, startMinutes] = formData.value.flightStartTime.split(':').map(Number) |
| | | const [endHours, endMinutes] = formData.value.flightEndTime.split(':').map(Number) |
| | | const startTotalMinutes = startHours * 60 + startMinutes |
| | | const endTotalMinutes = endHours * 60 + endMinutes |
| | | if (endTotalMinutes < startTotalMinutes) { |
| | | ElMessage.error('飞行结束时间不能小于飞行开始时间') |
| | | return false |
| | | } |
| | | } |
| | | return true |
| | | } |
| | | |
| | | async function handleSubmit() { |
| | | const isValid = await formRef.value?.validate().catch(() => false) |
| | | if (!isValid) return |
| | | if (!validateFlightTime()) return |
| | | submitting.value = true |
| | | try { |
| | | const submitData = { ...formData.value } |
| | |
| | | |
| | | # xt接口地址 |
| | | VITE_APP_URL_XT=http://218.202.104.82:8200 |
| | | |
| | | # 预览地址 previewURL |
| | | VITE_APP_PREVIEW_URL=http://192.168.1.204:8012 |
| | |
| | | }) |
| | | |
| | | const formRef = ref(null) |
| | | const formData = reactive({ |
| | | |
| | | const initForm = () => ({ |
| | | flyerName: '', |
| | | flyerId: '', |
| | | flyerPhone: '', |
| | |
| | | technicalStrength: '', |
| | | skilledUavType: '', |
| | | certification: [], // 证书 |
| | | regionCode: '', // 区域编码 |
| | | }) |
| | | |
| | | const formData = ref(initForm()) // 表单数据 |
| | | |
| | | |
| | | // const rules = { |
| | | // flyerId: fieldRules(true), |
| | | // flyerPhone: fieldRules(true, 50), |
| | | // flightHours: fieldRules(true, 50), |
| | | // technicalSkills: fieldRules(true, 50), |
| | | // skilledTaskType: fieldRules(true), |
| | | // projectExperience: fieldRules(true), |
| | | // technicalStrength: fieldRules(true), |
| | | // skilledUavType: fieldRules(true, 50), |
| | | // } |
| | | |
| | | const rules = { |
| | | flyerId: [ |
| | |
| | | watch( |
| | | () => props.flyingHandData, |
| | | (newData) => { |
| | | formData.value = initForm() |
| | | if (newData) { |
| | | Object.assign(formData, newData) |
| | | formData.flightHours = Number(newData.flightHours) |
| | | } |
| | | Object.assign(formData.value, newData) |
| | | formData.value.flightHours = Number(newData.flightHours) |
| | | } |
| | | }, |
| | | { deep: true, immediate: true } |
| | | ) |
| | |
| | | // 处理选择飞手姓名 |
| | | function handleChange(val) { |
| | | const result = flyingHandList.value.find(item => item.id === val) || [] |
| | | formData.flyerName = result.name |
| | | formData.certification = formData.certification.concat(result.licenseFrontFileUrl || [], result.licenseBackFileUrl || []) |
| | | formData.value.flyerName = result.name |
| | | formData.value.regionCode = result.regionCode |
| | | formData.value.certification = formData.value.certification.concat(result.licenseFrontFileUrl || [], result.licenseBackFileUrl || []) |
| | | } |
| | | |
| | | |
| | |
| | | function resetForm() { |
| | | formRef.value?.resetFields() |
| | | // 重置为默认值 |
| | | Object.assign(formData, { |
| | | Object.assign(formData.value, { |
| | | flyerName: '', |
| | | flyerPhone: '', |
| | | flightHours: 0, |
| | |
| | | |
| | | try { |
| | | if (props.dialogType === 'add') { |
| | | await submitFlyingHand(formData) |
| | | await submitFlyingHand(formData.value) |
| | | ElMessage.success('添加成功') |
| | | } else if (props.dialogType === 'edit') { |
| | | await submitFlyingHand(formData) |
| | | await submitFlyingHand(formData.value) |
| | | ElMessage.success('编辑成功') |
| | | } |
| | | emit('confirm') |
| | |
| | | import { getDictLabel } from '@ztzf/utils' |
| | | import PreviewFiles from '@/components/PreviewFiles/PreviewFiles.vue' |
| | | import { getDictionaryByCode } from '@/api/system/dictbiz' |
| | | import { Base64 } from 'js-base64' |
| | | |
| | | const store = useStore() |
| | | const userInfo = computed(() => store.getters.userInfo) |
| | |
| | | editParams.value.link = row.link |
| | | } |
| | | |
| | | |
| | | // 'zip', 'rar', 'jar', 'tar', 'gzip', '7z', |
| | | const allSupportedExtensions = [ |
| | | 'doc', 'docx', 'xls', 'xlsx', 'xlsm', 'ppt', 'pptx', 'csv', 'tsv', 'dotm', 'xlt', 'xltm', 'dot', 'dotx', 'xlam', 'xla', |
| | | 'wps', 'dps', 'et', 'ett', 'wpt', |
| | | 'odt', 'ods', 'ots', 'odp', 'otp', 'six', 'ott', 'fodt', 'fods', |
| | | 'vsd', 'vsdx', 'wmf', 'emf', 'psd', |
| | | 'pdf', 'ofd', 'rtf', 'epub', |
| | | 'xmind', 'bpmn', 'eml', |
| | | 'obj', '3ds', 'stl', 'ply', 'gltf', 'glb', 'off', '3dm', 'fbx', 'dae', 'wrl', '3mf', 'ifc', 'brep', 'step', 'iges', 'fcstd', 'bim', |
| | | 'dwg', 'dxf', |
| | | 'txt', 'xml', 'md', 'java', 'php', 'py', 'js', 'css', |
| | | 'jpg', 'jpeg', 'png', 'gif', 'bmp', 'ico', 'jfif', 'webp', 'tif', 'tiff', 'tga', 'svg', |
| | | 'mp3', 'wav', 'mp4', 'flv', 'avi', 'mov', 'rm', 'webm', 'ts', 'mkv', 'mpeg', 'ogg', 'mpg', 'rmvb', 'wmv', '3gp', 'swf' |
| | | ]; |
| | | const { VITE_APP_PREVIEW_URL } = import.meta.env |
| | | |
| | | // 在线查看文档 |
| | | function seeOnlineWord(row) { |
| | | // 获取点之后的文件格式名 |
| | | const fileType = row?.link?.split('.').pop() || '' |
| | | if (!row.link) { |
| | | ElMessage.warning('文件链接不存在') |
| | | return |
| | | } else if ( |
| | | !row.link.includes('docx') && |
| | | !row.link.includes('pdf') && |
| | | !row.link.includes('png') && |
| | | !row.link.includes('jpg') |
| | | ) { |
| | | }else if (allSupportedExtensions.includes(fileType)){ |
| | | window.open(`${VITE_APP_PREVIEW_URL}/onlinePreview?url=`+encodeURIComponent(Base64.encode(row.link))); |
| | | }else { |
| | | ElMessage.warning(`${fileType}文件格式,可以下载再查看`) |
| | | return |
| | | } else if (row.link.includes('png') || row.link.includes('jpg')) { |
| | | previewVisibleImg.value = true |
| | | searchUrl.value = row.link |
| | | return |
| | | } else if (row.link.includes('docx') || row.link.includes('pdf')) { |
| | | previewVisible.value = true |
| | | searchUrl.value = row.link |
| | | return |
| | | } |
| | | } |
| | | |
| | |
| | | > |
| | | {{ gdStatusObj[gdStatus].reason }} |
| | | </el-button> |
| | | <el-button @click="addDescription" v-if="['20', '24', '25', '50'].includes(gdStatus)" color="#F2F3F5"> |
| | | {{ gdStatus === '50' ? '结算' : '申请取消' }} |
| | | <el-button @click="addDescription" v-if="['20', '24', '25'].includes(gdStatus)" color="#F2F3F5"> |
| | | 申请取消 |
| | | </el-button> |
| | | <el-button color="#4C34FF" @click="requestModification" v-if="['20', '25'].includes(gdStatus)"> |
| | | 申请修改 |
| | |
| | | <el-button v-if="['21', '23'].includes(gdStatus)" @click="viewDescription" color="#F2F3F5"> |
| | | {{ gdStatusObj[gdStatus].reason }} |
| | | </el-button> |
| | | <el-button v-if="gdStatus === '50'" @click="addDescription" color="#F2F3F5">结算</el-button> |
| | | <el-button v-if="gdStatus === '10'" @click="addDescription" color="#F2F3F5">拒绝接单</el-button> |
| | | <el-button v-if="gdStatus === '10'" @click="statusChange(1)" color="#4C34FF">接单</el-button> |
| | | <el-button v-if="gdStatus === '22'" @click="addDescription" color="#F2F3F5">不同意修改</el-button> |
| | |
| | | } |
| | | .card { |
| | | display: flex; |
| | | padding: 44rpx; |
| | | padding: 40rpx 0; |
| | | border-bottom: 1px solid #EBEEF3; |
| | | .left { |
| | | width: 70px; |
| | |
| | | color: #86909C; |
| | | margin-bottom: 14rpx; |
| | | } |
| | | // 最后一个txt 不添加margin-bottom |
| | | .txt:last-child { |
| | | margin-bottom: 0; |
| | | } |
| | | } |
| | | } |
| | | // 第一个card 不添加下边框 |
| | |
| | | <template> |
| | | <view class="legalPolicy"> |
| | | <!-- <u-navbar title="法律政策" @rightClick="rightClick" :autoBack="true"></u-navbar> --> |
| | | <u-search :bgColor="'white'" v-model="noticeTitle" :show-action="true" actionText="搜索" :animation="true" @custom="handleSearch"></u-search> |
| | | <u-search :bgColor="'white'" v-model="formParams.noticeTitle" :show-action="true" actionText="搜索" :animation="true" @custom="handleSearch"></u-search> |
| | | <view class="tabs-container"> |
| | | <u-tabs :list="tabs" lineColor="#265CFD" @click="tabClick"></u-tabs> |
| | | </view> |
| | |
| | | import docSvg from '@/static/images/doc.png' |
| | | import { ref, onMounted } from 'vue' |
| | | |
| | | const noticeTitle = ref('') |
| | | |
| | | const tabs = ref([ |
| | | { |
| | | name: '法律法规', |
| | |
| | | current: 1, |
| | | size: 10, |
| | | noticeType: 2, |
| | | noticeTitle: noticeTitle.value, |
| | | noticeTitle: '', |
| | | isAsc: true |
| | | }) |
| | | |
| | |
| | | const handleSearch = () => { |
| | | // 搜索时重置为第一页 |
| | | formParams.value.current = 1 |
| | | formParams.value.noticeTitle = formParams.value.noticeTitle.trim() |
| | | getSysNoticeList() |
| | | } |
| | | // 触底加载 |
| | |
| | | |
| | | :deep(.u-button--primary) { |
| | | background-color: #265CFD; |
| | | border-color: #265CFD; |
| | | } |
| | | |
| | | :deep(.u-form) { |
| | |
| | | flex: 1; |
| | | max-width: 350rpx; |
| | | height: 166rpx; |
| | | background: rgba(251,253,255,0.57); |
| | | background: rgba(251,253,255,0.8); |
| | | box-shadow: inset 0px 0px 7px 0px rgba(64,156,230,0.14), 0px 1px 3px 0px rgba(35,49,96,0.11); |
| | | border-radius: 8px 8px 8px 8px; |
| | | border: 1px solid #fff; |