Compare commits
2 Commits
b6dc3d4fea
...
b15b847d52
| Author | SHA1 | Date |
|---|---|---|
|
|
b15b847d52 | 2 years ago |
|
|
c948623fad | 2 years ago |
|
After Width: | Height: | Size: 90 KiB |
|
After Width: | Height: | Size: 6.2 KiB |
|
After Width: | Height: | Size: 238 KiB |
|
After Width: | Height: | Size: 271 B |
|
After Width: | Height: | Size: 110 KiB |
|
After Width: | Height: | Size: 47 KiB |
|
After Width: | Height: | Size: 128 KiB |
|
After Width: | Height: | Size: 38 KiB |
@ -0,0 +1,8 @@
|
||||
import { get, post} from "@/util/request" |
||||
|
||||
|
||||
|
||||
export function listSecond() { |
||||
return get('/system/dept/second/list') |
||||
} |
||||
|
||||
@ -0,0 +1,8 @@
|
||||
import { get, post} from "@/util/request" |
||||
|
||||
|
||||
|
||||
export function addMail(body) { |
||||
return post('/mailbox/add', body) |
||||
} |
||||
|
||||
@ -0,0 +1,291 @@
|
||||
<template> |
||||
<el-dialog |
||||
width="50vw" |
||||
align-center |
||||
title="自建信件" |
||||
> |
||||
<el-form |
||||
ref="formRef" |
||||
:model="form" |
||||
label-width="200px" |
||||
:rules="rules" |
||||
style="width: 100%" |
||||
> |
||||
|
||||
<el-divider /> |
||||
<el-row class="title-label"> |
||||
<el-col> |
||||
<span class="main-label">联系人信息</span> |
||||
</el-col> |
||||
</el-row> |
||||
<el-row> |
||||
<el-col :span="12"> |
||||
<el-form-item |
||||
label="姓名" |
||||
class="info-input" |
||||
prop="contactName" |
||||
required |
||||
> |
||||
<el-input |
||||
v-model="form.contactName" |
||||
placeholder="请输入姓名" |
||||
></el-input> |
||||
</el-form-item> |
||||
</el-col> |
||||
<el-col :span="12"> |
||||
<el-form-item |
||||
label="性别" |
||||
class="info-input" |
||||
prop="contactSex" |
||||
> |
||||
<el-select |
||||
v-model="form.contactSex" |
||||
placeholder="请选择性别" |
||||
> |
||||
<el-option label="男" value="M"></el-option> |
||||
<el-option label="女" value="F"></el-option> |
||||
</el-select> |
||||
</el-form-item> |
||||
</el-col> |
||||
</el-row> |
||||
<el-row> |
||||
<el-col :span="12"> |
||||
<el-form-item |
||||
label="证件号码" |
||||
class="info-input" |
||||
prop="contactIdCard" |
||||
> |
||||
<el-input |
||||
v-model="form.contactIdCard" |
||||
placeholder="请输入证件号码" |
||||
></el-input> |
||||
</el-form-item> |
||||
</el-col> |
||||
<el-col :span="12"> |
||||
<el-form-item |
||||
label="联系电话" |
||||
class="info-input" |
||||
prop="contactPhone" |
||||
> |
||||
<el-input |
||||
v-model="form.contactPhone" |
||||
placeholder="请输入联系电话" |
||||
></el-input> |
||||
</el-form-item> |
||||
</el-col> |
||||
</el-row> |
||||
<el-divider /> |
||||
<el-row class="title-label"> |
||||
<el-col> |
||||
<span class="main-label">信件内容</span> |
||||
</el-col> |
||||
</el-row> |
||||
<el-row> |
||||
<el-col :span="12"> |
||||
<el-form-item label="案件编号" prop="caseNumber" class="info-input"> |
||||
<el-input |
||||
v-model="form.caseNumber" |
||||
placeholder="请输入案件编号" |
||||
></el-input> |
||||
</el-form-item> |
||||
</el-col> |
||||
<el-col :span="12"> |
||||
<el-form-item |
||||
label="被投诉/涉及单位" |
||||
prop="involvedDeptName" |
||||
class="info-input" |
||||
> |
||||
<el-select |
||||
v-model="form.involvedDeptName" |
||||
@change="selectMediaId" |
||||
> |
||||
<el-option v-for="item in depts" |
||||
:key="item.value" |
||||
:label="item.text" |
||||
:value="item.text" |
||||
ref="select" /> |
||||
</el-select> |
||||
</el-form-item> |
||||
</el-col> |
||||
</el-row> |
||||
<el-row> |
||||
<el-col> |
||||
<el-form-item |
||||
label="信件内容" |
||||
style="width: 100%" |
||||
prop="content" |
||||
> |
||||
<el-input |
||||
type="textarea" |
||||
v-model="form.content" |
||||
placeholder="请您尽量完整的描述您的信件内容,如发生事件、涉及单位、设计对象姓名、警号以及具体事项" |
||||
></el-input> |
||||
</el-form-item> |
||||
</el-col> |
||||
</el-row> |
||||
<el-row> |
||||
<el-form-item label="上传附件"> |
||||
<Upload v-model="form.fileList" /> |
||||
</el-form-item> |
||||
</el-row> |
||||
<div |
||||
style=" |
||||
width: 100%; |
||||
display: flex; |
||||
justify-content: flex-end; |
||||
" |
||||
> |
||||
<el-button |
||||
type="primary" |
||||
@click="handleSubmit" |
||||
style="height: 40px" |
||||
>提交信件</el-button |
||||
> |
||||
</div> |
||||
</el-form> |
||||
</el-dialog> |
||||
</template> |
||||
<script lang="ts" setup> |
||||
import { ref, reactive } from "vue"; |
||||
import type { FormInstance, FormRules } from "element-plus"; |
||||
import { listSecond } from "../api/dept"; |
||||
import { addMail } from "../api/mail"; |
||||
import { useTokenStore } from '../stores/useTokenStore' |
||||
const tokens = useTokenStore() |
||||
const accessToken = tokens.access_token; |
||||
import { depts } from "../stores/dept"; |
||||
import { request } from '../util/axios_config' |
||||
interface FormData { |
||||
source: string; |
||||
contactName: string; |
||||
contactSex: string; |
||||
contactIdCard: string; |
||||
contactPhone: string; |
||||
caseNumber: string; |
||||
involvedDeptId: number; |
||||
involvedDeptName: string; |
||||
content: string; |
||||
fileList: any[]; |
||||
attachments: String; |
||||
} |
||||
const { VITE_API_URL } = process.env; |
||||
|
||||
const formRef = ref<FormInstance>(); |
||||
const form = ref({ |
||||
source: "", |
||||
contactName: "", |
||||
contactSex: "", |
||||
contactIdCard: "", |
||||
contactPhone: "", |
||||
caseNumber: "", |
||||
involvedDeptId:'', |
||||
involvedDeptName: "", |
||||
content: "", |
||||
attachments: "", |
||||
}); |
||||
|
||||
const rules = reactive<FormRules<FormData>>({ |
||||
source: [{ required: true, message: "请选择途径来源" }], |
||||
contactName: [ |
||||
{ required: true, message: "请输入姓名" }, |
||||
], |
||||
contactPhone: [ |
||||
{ required: true, message: "请输入手机号码"}, |
||||
], |
||||
contactSex: [ |
||||
{ required: true, message: "请输入性别"}, |
||||
], |
||||
contactIdCard: [ |
||||
{ required: true, message: "请输入身份证"}, |
||||
], |
||||
content: [ |
||||
{ |
||||
required: true, |
||||
message: |
||||
"请您尽量完整的描述您的信件内容,如发生事件、涉及单位、设计对象姓名、警号以及具体事项", |
||||
trigger: "blur" |
||||
}, |
||||
], |
||||
}); |
||||
// const { optionsData } = useDictOptions<{ |
||||
// dept: any[]; |
||||
// }>({ |
||||
// dept: { |
||||
// api: listSecond, |
||||
// }, |
||||
// }); |
||||
|
||||
const emit = defineEmits(["success", "close"]); |
||||
const selectMediaId = (depart)=>{ |
||||
for (const i of depts) { |
||||
if(i.text == depart){ |
||||
form.value.involvedDeptId=i.value; |
||||
form.value.involvedDeptName=i.text; |
||||
} |
||||
} |
||||
// console.log(mailData.value.involved_dept_id, 'select值') |
||||
// console.log(depart, '选中的ID值') |
||||
} |
||||
|
||||
const handleSubmit = () => { |
||||
formRef.value.validate((valid: boolean) => { |
||||
if (valid) { |
||||
form.value.attachments = JSON.stringify(form.value.fileList); |
||||
console.log("accessToken"+accessToken) |
||||
// addMail({data:form.value,headers: { "Authorization": accessToken}}).then(() => { |
||||
// emit("success"); |
||||
// emit("close"); |
||||
// feedback.msgSuccess("操作成功"); |
||||
// formRef.value.resetFields() |
||||
// form.value.fileList = [] |
||||
// form.value.involvedDeptName = '' |
||||
// }); |
||||
const url = VITE_API_URL +'/mailbox/add' |
||||
request({ |
||||
url: url, |
||||
method: 'POST', |
||||
data: {MailBo:form.value} , |
||||
headers: { 'Content-Type': 'application/json'} |
||||
}).then(() => { |
||||
emit("success"); |
||||
emit("close"); |
||||
formRef.value.resetFields() |
||||
form.value.fileList = [] |
||||
form.value.involvedDeptName = '' |
||||
}); |
||||
} |
||||
}); |
||||
}; |
||||
|
||||
function handleDeptChange(val) { |
||||
const dept = optionsData.dept.find((item) => item.id === val); |
||||
form.value.involvedDeptName = dept.name; |
||||
} |
||||
|
||||
|
||||
|
||||
</script> |
||||
<style lang="scss" scoped> |
||||
.main-label { |
||||
width: 80px; |
||||
height: 22px; |
||||
font-size: 20px; |
||||
font-family: PingFang-SC, PingFang-SC; |
||||
font-weight: bold; |
||||
color: #333333; |
||||
line-height: 22px; |
||||
} |
||||
|
||||
.title-label { |
||||
margin-bottom: 20px; |
||||
} |
||||
.info-input { |
||||
width: 100%; |
||||
} |
||||
|
||||
.el-upload__inner { |
||||
display: flex; |
||||
justify-content: center; |
||||
align-items: center; |
||||
} |
||||
</style> |
||||
@ -0,0 +1,375 @@
|
||||
<template> |
||||
<div class="flex gap-12 wrap file-container"> |
||||
<div |
||||
v-for="(item, index) in fileList" |
||||
:key="index" |
||||
class="item pointer" |
||||
> |
||||
<template v-if="item.type && item.type.indexOf('image') > -1"> |
||||
<div |
||||
class="img-box" |
||||
:style="{ |
||||
backgroundImage: `url(${VITE_API_URL}/file/stream/${item.filepath})`, |
||||
}" |
||||
@click="filePreview(item)" |
||||
></div> |
||||
<a |
||||
class="remove-btn" |
||||
@click="remove(index)" |
||||
v-if="removeEnable" |
||||
> |
||||
<img src="\imgs\close.png"/> |
||||
</a> |
||||
</template> |
||||
<div |
||||
class="item flex end v-center column text-center" |
||||
:title="item.orgiinFilename" |
||||
@click="filePreview(item)" |
||||
v-else |
||||
> |
||||
<icon :name="getIconName(item.type)" :size="40" /> |
||||
<span class="filename">{{ item.orgiinFilename }}</span> |
||||
<a |
||||
class="remove-btn" |
||||
@click.stop="remove(index)" |
||||
v-if="removeEnable" |
||||
> |
||||
<img src="\imgs\close.png"/> |
||||
</a> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
|
||||
</template> |
||||
<script setup> |
||||
|
||||
import { watch } from "vue"; |
||||
|
||||
const { VITE_API_URL } = process.env; |
||||
const props = defineProps({ |
||||
files: { |
||||
type: Array, |
||||
default: () => [], |
||||
}, |
||||
removeEnable: { |
||||
type: Boolean, |
||||
default: false, |
||||
}, |
||||
}); |
||||
const emit = defineEmits(["update:files"]); |
||||
|
||||
const fileList = ref(props.files); |
||||
|
||||
watch( |
||||
() => props.files, |
||||
(files) => { |
||||
fileList.value = files; |
||||
} |
||||
); |
||||
|
||||
const activeFile = ref({}); |
||||
const fileRrror = ref(false); |
||||
const rotate = ref(0); |
||||
const scale = ref(0); |
||||
const translateX = ref(0); |
||||
const translateY = ref(0); |
||||
let moveFlag = false; |
||||
let initialX = 0; |
||||
let initialY = 0; |
||||
function prev() { |
||||
const index = fileList.value.indexOf(activeFile.value); |
||||
if (index === 0) { |
||||
filePreview(fileList.value[fileList.value.length - 1]); |
||||
} else { |
||||
filePreview(fileList.value[index - 1]); |
||||
} |
||||
} |
||||
function next() { |
||||
const index = fileList.value.indexOf(activeFile.value); |
||||
if (index === fileList.value.length - 1) { |
||||
filePreview(fileList.value[0]); |
||||
} else { |
||||
filePreview(fileList.value[index + 1]); |
||||
} |
||||
} |
||||
const preview = ref(false); |
||||
watch(preview, (val) => { |
||||
|
||||
}) |
||||
|
||||
function filePreview(file) { |
||||
preview.value = true; |
||||
fileRrror.value = false; |
||||
activeFile.value = file; |
||||
rotate.value = 0; |
||||
scale.value = 1; |
||||
translateX.value = 0; |
||||
translateY.value = 0; |
||||
moveFlag = false; |
||||
|
||||
} |
||||
|
||||
function wheel(event) { |
||||
if (activeFile.value.type.indexOf("image") === -1) { |
||||
return; |
||||
} |
||||
if (event.deltaY > 0 && scale.value > 0.5) { |
||||
scale.value -= 0.1; |
||||
} |
||||
if (event.deltaY < 0) { |
||||
scale.value += 0.1; |
||||
} |
||||
} |
||||
|
||||
function mousedown() { |
||||
moveFlag = true; |
||||
initialX = event.clientX; |
||||
initialY = event.clientY; |
||||
} |
||||
function mousemove(event) { |
||||
if (!moveFlag) { |
||||
return; |
||||
} |
||||
if (rotate.value % 360 === 0) { |
||||
translateX.value += event.clientX - initialX; |
||||
translateY.value += event.clientY - initialY; |
||||
} |
||||
if (rotate.value === 90) { |
||||
translateY.value -= event.clientX - initialX; |
||||
translateX.value += event.clientY - initialY; |
||||
} |
||||
if (rotate.value === 180) { |
||||
translateX.value -= event.clientX - initialX; |
||||
translateY.value -= event.clientY - initialY; |
||||
} |
||||
if (rotate.value === 270) { |
||||
translateY.value += event.clientX - initialX; |
||||
translateX.value -= event.clientY - initialY; |
||||
} |
||||
initialX = event.clientX; |
||||
initialY = event.clientY; |
||||
} |
||||
|
||||
function mouseup(event) { |
||||
moveFlag = false; |
||||
} |
||||
|
||||
function rotateLeft() { |
||||
if (rotate.value === 360) { |
||||
rotate.value = 0; |
||||
} else { |
||||
rotate.value += 90; |
||||
} |
||||
} |
||||
|
||||
function rotateRight() { |
||||
if (rotate.value === 0) { |
||||
rotate.value = 270; |
||||
} else { |
||||
rotate.value -= 90; |
||||
} |
||||
} |
||||
|
||||
function getIconName(filetype) { |
||||
if (!filetype) { |
||||
return "el-icon-document"; |
||||
} |
||||
if (filetype.indexOf("image") > -1) { |
||||
return "el-icon-Picture"; |
||||
} |
||||
if (filetype === "application/pdf") { |
||||
return "local-icon-pdf"; |
||||
} |
||||
if (filetype.indexOf("audio") > -1) { |
||||
return "local-icon-mp3"; |
||||
} |
||||
if (filetype.indexOf("word") > -1) { |
||||
return "local-icon-doc"; |
||||
} |
||||
if ( |
||||
filetype.indexOf("excel") > -1 || |
||||
filetype.indexOf("spreadsheetml.sheet") > -1 |
||||
) { |
||||
return "local-icon-xls"; |
||||
} |
||||
if ( |
||||
filetype.indexOf("video") > -1 |
||||
) { |
||||
return "local-icon-mp4"; |
||||
} |
||||
return "el-icon-document"; |
||||
} |
||||
|
||||
function remove(index) { |
||||
fileList.value.splice(index, 1); |
||||
emit("update:files", fileList.value); |
||||
} |
||||
|
||||
function download() { |
||||
window.open(`${VITE_API_URL}/api/file/stream/${activeFile.value.filepath}`); |
||||
} |
||||
|
||||
function getDocFilepath() { |
||||
if ( |
||||
activeFile.value.type === "application/msword" && |
||||
activeFile.value.docxFilepath |
||||
) { |
||||
return `${VITE_API_URL}/api/file/stream/${activeFile.value.docxFilepath}`; |
||||
} |
||||
return `${VITE_API_URL}/api/file/stream/${activeFile.value.filepath}`; |
||||
} |
||||
</script> |
||||
<style lang="scss" scoped> |
||||
.file-container { |
||||
min-height: 80px; |
||||
.item { |
||||
width: 80px; |
||||
height: 80px; |
||||
margin-bottom: 12px; |
||||
border-radius: 2px; |
||||
color: var(--primary-color); |
||||
position: relative; |
||||
&:hover { |
||||
background-color: #ededed; |
||||
span.filename { |
||||
font-weight: 700; |
||||
} |
||||
} |
||||
span.filename { |
||||
line-height: 1.2; |
||||
font-size: 12px; |
||||
width: 100%; |
||||
white-space: nowrap; |
||||
text-overflow: ellipsis; |
||||
margin-top: 10px; |
||||
overflow: hidden; |
||||
} |
||||
.img-box { |
||||
width: 80px; |
||||
height: 80px; |
||||
background-size: cover; |
||||
background-position: center; |
||||
border-radius: 2px; |
||||
&:hover { |
||||
outline: 2px solid #ff9800; |
||||
} |
||||
} |
||||
.remove-btn { |
||||
position: absolute; |
||||
top: -10px; |
||||
right: -10px; |
||||
display: block; |
||||
border-radius: 50%; |
||||
height: 20px; |
||||
background-color: #fff; |
||||
&:hover { |
||||
color: red; |
||||
cursor: pointer; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
.file-preview-wrapper { |
||||
.file-list { |
||||
width: 15vw; |
||||
height: 100vh; |
||||
padding: 16px 8px; |
||||
background-color: #fff; |
||||
box-sizing: border-box; |
||||
section { |
||||
padding: 8px 16px; |
||||
border: 2px solid transparent; |
||||
&:hover { |
||||
color: var(--primary-color); |
||||
font-weight: 700; |
||||
} |
||||
&[active="true"] { |
||||
border-color: var(--primary-color); |
||||
} |
||||
span { |
||||
width: calc(100% - 32px); |
||||
overflow: hidden; |
||||
white-space: nowrap; |
||||
text-overflow: ellipsis; |
||||
} |
||||
} |
||||
} |
||||
.file-content { |
||||
width: 86vw; |
||||
position: relative; |
||||
|
||||
.img-container { |
||||
height: 100vh; |
||||
img { |
||||
max-height: 100%; |
||||
display: block; |
||||
&:hover { |
||||
cursor: pointer; |
||||
} |
||||
} |
||||
} |
||||
.error { |
||||
background-color: #fff; |
||||
img { |
||||
width: 500px; |
||||
} |
||||
} |
||||
} |
||||
.close-btn { |
||||
position: absolute; |
||||
top: 12px; |
||||
right: 8px; |
||||
background-color: transparent; |
||||
border: none; |
||||
color: #fff; |
||||
&:hover { |
||||
color: red; |
||||
} |
||||
} |
||||
.rotate-left-btn { |
||||
position: absolute; |
||||
top: 12px; |
||||
right: 118px; |
||||
background-color: transparent; |
||||
border: none; |
||||
color: #fff; |
||||
} |
||||
.rotate-right-btn { |
||||
position: absolute; |
||||
top: 12px; |
||||
right: 68px; |
||||
background-color: transparent; |
||||
border: none; |
||||
color: #fff; |
||||
} |
||||
.left-btn { |
||||
position: absolute; |
||||
top: 50%; |
||||
left: 0; |
||||
transform: translateY(-50%); |
||||
background-color: transparent; |
||||
border: none; |
||||
color: #fff; |
||||
} |
||||
.right-btn { |
||||
position: absolute; |
||||
top: 50%; |
||||
right: 0; |
||||
transform: translateY(-50%); |
||||
background-color: transparent; |
||||
border: none; |
||||
color: #fff; |
||||
} |
||||
.download-btn { |
||||
position: absolute; |
||||
bottom: 16px; |
||||
right: 18px; |
||||
} |
||||
.file-number { |
||||
position: absolute; |
||||
top: 16px; |
||||
left: 18px; |
||||
color: #fff; |
||||
} |
||||
} |
||||
</style> |
||||
@ -0,0 +1,80 @@
|
||||
<template> |
||||
<div> |
||||
<el-upload |
||||
:action="`${VITE_API_URL}/file/upload`" |
||||
:headers=headers |
||||
multiple |
||||
:before-upload="beforeUpload" |
||||
@progress="uploadProgress" |
||||
@success="handleSuccess" |
||||
:show-file-list="false" |
||||
:accept="accept" |
||||
> |
||||
<el-button |
||||
>上传 |
||||
</el-button> |
||||
</el-upload> |
||||
<div class="flex v-center wrap mt-10"> |
||||
<FileList v-model:files="files" :removeEnable="true" /> |
||||
<div v-if="loading"> |
||||
<el-progress type="circle" :percentage="uploadPercentage" :width="80" /> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
</template> |
||||
<script setup> |
||||
const { VITE_API_URL } = process.env; |
||||
import { useTokenStore } from '../stores/useTokenStore' |
||||
const tokens = useTokenStore() |
||||
const accessToken = tokens.access_token; |
||||
|
||||
const headers = reactive({'Authorization': 'Bearer '+accessToken}); |
||||
const props = defineProps({ |
||||
modelValue: { |
||||
type: Array, |
||||
default: () => [], |
||||
}, |
||||
accept: { |
||||
type: String, |
||||
default: "image/*", |
||||
} |
||||
}); |
||||
|
||||
const emit = defineEmits(["update:modelValue"]); |
||||
|
||||
const files = ref(props.modelValue); |
||||
|
||||
watch(() => props.modelValue, (newValue) => { |
||||
if (newValue) { |
||||
files.value = newValue; |
||||
} else { |
||||
files.value = [] |
||||
} |
||||
}) |
||||
|
||||
const loading = ref(false) |
||||
const uploadPercentage = ref(0) |
||||
function beforeUpload() { |
||||
uploadPercentage.value = 0 |
||||
loading.value = true |
||||
} |
||||
|
||||
function uploadProgress(progressEvent) { |
||||
uploadPercentage.value = parseInt(progressEvent.percent) |
||||
} |
||||
|
||||
function handleSuccess(data, file) { |
||||
loading.value = false |
||||
if (data.code !== 200) { |
||||
return; |
||||
} |
||||
files.value.push({ |
||||
filepath: data.data.filepath, |
||||
orgiinFilename: file.name, |
||||
type: file.raw.type, |
||||
size: file.size, |
||||
docxFilepath: data.data.docxFilepath |
||||
}); |
||||
emit("update:modelValue", files.value); |
||||
} |
||||
</script> |
||||
@ -0,0 +1,51 @@
|
||||
|
||||
export const depts = [ |
||||
{ |
||||
text: "芙蓉分局", |
||||
value: 6, |
||||
}, |
||||
{ |
||||
text: "天心分局", |
||||
value: 29, |
||||
}, |
||||
{ |
||||
text: "岳麓分局", |
||||
value: 34, |
||||
}, |
||||
{ |
||||
text: "开福分局", |
||||
value: 20, |
||||
}, |
||||
{ |
||||
text: "雨花分局", |
||||
value: 33, |
||||
}, |
||||
{ |
||||
text: "高新分局", |
||||
value: 7, |
||||
}, |
||||
{ |
||||
text: "望城分局", |
||||
value: 31, |
||||
}, |
||||
{ |
||||
text: "长沙县局", |
||||
value: 35, |
||||
}, |
||||
{ |
||||
text: "浏阳市局", |
||||
value: 22, |
||||
}, |
||||
{ |
||||
text: "宁乡市局", |
||||
value: 24, |
||||
}, |
||||
{ |
||||
text: "交警支队", |
||||
value: 14, |
||||
}, |
||||
{ |
||||
text: "其他单位", |
||||
value: 0, |
||||
}, |
||||
] |
||||