刘妍 2024-09-30 14:41:24 +08:00
commit 3f6d6e78fd
31 changed files with 4602 additions and 2 deletions

View File

@ -24,6 +24,12 @@ enum Api {
CaseRecover = '/api/DroneCaseInfoFLH/CaseRecover',
// 图斑分割
CaseSplit = '/api/DroneCaseInfoFLH/CaseSplit',
// 判读-待审核列表
LoadCaseInfoLists = '/api/DroneCaseInfoFLH/LoadCaseInfoCheckTuBanList',
// 判读-详情
GetCaseInfo = '/api/DroneCaseInfoFLH/GetCaseInfo',
// 判读-关闭案件
CloseCaseInfo = '/api/DroneCaseInfoFLH/CloseSingleCaseInfo',
}
export function LoadCaiKuangTaskList(params) {
return defHttp.get({ url: Api.LoadCaiKuangTaskList, params });
@ -62,4 +68,22 @@ export function CaseRecover(params){
}
export function CaseSplit(params){
return defHttp.post({ url: Api.CaseSplit, data: params });
}
export function LoadCaseInfoLists(params){
return defHttp.get({
url: Api.LoadCaseInfoLists,
params,
})
}
export function GetCaseInfo(params: { id: string }){
return defHttp.get({
url: Api.GetCaseInfo,
params,
})
}
export function CloseCaseInfo(params: string){
return defHttp.post({
url: Api.CloseCaseInfo,
data: params,
})
}

View File

@ -18,6 +18,12 @@ enum Api {
LoadTaskIllegalDetailList = '/api/DroneCaseInfoSatellite/LoadTaskIllegalDetailList',
// 图斑详情
GetCaseInfoById = '/api/DroneCaseInfoSatellite/GetCaseInfoById',
// 判读-待审核列表
LoadCaseInfoLists = '/api/DroneCaseInfoSatellite/LoadCaseInfoCheckTuBanList',
// 判读-详情
GetCaseInfo = '/api/DroneCaseInfoSatellite/GetCaseInfo',
// 判读-关闭案件
CloseCaseInfo = '/api/DroneCaseInfoSatellite/CloseSingleCaseInfo',
/****************************************************************************************************************************/
@ -51,6 +57,12 @@ enum Api {
SplitCase = '/api/DroneCaseInfoMinerals/CaseSplit',
// 更新图斑行政区划
UpdateDroneCaseInfo = '/api/DroneCaseInfoMinerals/UpdateDroneCaseInfo',
// 判读-待审核列表
MainLoadCaseInfoLists = '/api/DroneCaseInfoMinerals/LoadCaseInfoCheckTuBanList',
// 判读-详情
MainGetCaseInfo = '/api/DroneCaseInfoMinerals/GetCaseInfo',
// 判读-关闭案件
MainCloseCaseInfo = '/api/DroneCaseInfoMinerals/CloseSingleCaseInfo',
}
export function LoadCaiKuangTaskList(params) {
@ -83,6 +95,24 @@ export function LoadReformCaseCount(params) {
export function GetCaseInfoById(params?: { id: string }) {
return defHttp.get({ url: Api.GetCaseInfoById, params });
}
export function LoadCaseInfoLists(params){
return defHttp.get({
url: Api.LoadCaseInfoLists,
params,
})
}
export function GetCaseInfo(params: { id: string }){
return defHttp.get({
url: Api.GetCaseInfo,
params,
})
}
export function CloseCaseInfo(params: string){
return defHttp.post({
url: Api.CloseCaseInfo,
data: params,
})
}
/****************************************************************************************************************************/
@ -129,4 +159,22 @@ export function splitCase(params){
return defHttp.post({ url: Api.SplitCase, data: params });
}
export const updateDroneCaseInfo = (params) =>
defHttp.post({ url: Api.UpdateDroneCaseInfo, params });
defHttp.post({ url: Api.UpdateDroneCaseInfo, params });
export function MainLoadCaseInfoLists(params){
return defHttp.get({
url: Api.MainLoadCaseInfoLists,
params,
})
}
export function MainGetCaseInfo(params: { id: string }){
return defHttp.get({
url: Api.MainGetCaseInfo,
params,
})
}
export function MainCloseCaseInfo(params: string){
return defHttp.post({
url: Api.MainCloseCaseInfo,
data: params,
})
}

View File

@ -51,6 +51,12 @@ enum Api {
LoadCaseInfoTuBanList = '/api/DroneCaseInfoXcsj/LoadCaseInfoTuBanList',
CaseOffence = '/api/DroneCaseInfoXcsj/CaseOffence',
LoadCaseInfoListOffence = '/api/DroneCaseInfoXcsj/LoadCaseInfoListOffence',
// 判读-待审核列表
LoadCaseInfoLists = '/api/DroneCaseInfoXcsj/LoadCaseInfoCheckTuBanList',
// 判读-详情
GetCaseInfo = '/api/DroneCaseInfoXcsj/GetCaseInfo',
// 判读-关闭案件
CloseCaseInfo = '/api/DroneCaseInfoXcsj/CloseSingleCaseInfo',
}
/**
@ -168,4 +174,22 @@ export function loadCaseInfoTuBanList(params) {
export const getCaseOffence = (params) =>
defHttp.get({ url: Api.CaseOffence, params });
export const getLoadCaseInfoListOffence = (params) =>
defHttp.get({ url: Api.LoadCaseInfoListOffence, params });
defHttp.get({ url: Api.LoadCaseInfoListOffence, params });
export function LoadCaseInfoLists(params){
return defHttp.get({
url: Api.LoadCaseInfoLists,
params,
})
}
export function GetCaseInfo(params: { id: string }){
return defHttp.get({
url: Api.GetCaseInfo,
params,
})
}
export function CloseCaseInfo(params: string){
return defHttp.post({
url: Api.CloseCaseInfo,
data: params,
})
}

View File

@ -0,0 +1,81 @@
<template>
<PageWrapper dense contentFullHeight fixedHeight contentClass="flex">
<BasicTable class="w-4/4 xl:w-5/5" @register="registerTable">
<template #bodyCell="{ column, record }">
<template v-if="column.key === 'action'">
<TableAction
:actions="[
{
label: '详情',
onClick: () => {
handleAudit(record);
},
}
]"
/>
</template>
</template>
</BasicTable>
<a-modal width="75%" v-model:open="openModal" title="线索审核" :destroyOnClose="true" :footer="null">
<InfoModal :infoData="infoData.info" @handleOk="handleOk" @closeModal="closeModal" :control="false"/>
</a-modal>
</PageWrapper>
</template>
<script lang="ts" setup>
import { nextTick, onMounted, ref } from 'vue';
import { BasicTable, useTable, TableAction } from '@/components/Table';
import { PageWrapper } from '@/components/Page';
import InfoModal from '../audit/InfoModal/index.vue'
import { columns, searchFormSchema } from './util';
import { LoadCaseInfoLists, GetCaseInfo } from '@/api/degraining/index';
const infoData = ref({})
const openModal = ref(false)
const [registerTable, { reload, expandAll}] = useTable({
title: '已审核',
api: LoadCaseInfoLists,
columns,
rowKey: 'id',
formConfig: {
labelWidth: 120,
schemas: searchFormSchema,
},
striped: false,
//
showIndexColumn: false,
// 使
useSearchForm: true,
//
showTableSetting: true,
bordered: true,
beforeFetch(data) {
let params = {...data,nowStatus: '已审核'}
return params
},
afterFetch(data) {
console.log('afterFetch', data);
},
actionColumn: {
width: 100,
title: '操作',
dataIndex: 'action',
},
handleSearchInfoFn(info) {
return info;
},
});
function handleAudit(record) {
GetCaseInfo({id: record.Id}).then(res => {
console.log(res)
infoData.value = res
openModal.value = true
})
}
const handleOk = () => {
console.log('infoData',infoData.value)
}
const closeModal = () => {
openModal.value = false
}
</script>

View File

@ -0,0 +1,113 @@
import { BasicColumn, FormSchema } from '@/components/Table';
import { h } from 'vue';
import { Tag } from 'ant-design-vue';
import { getChildrenTree } from '@/api/demo/system';
import { getLoad } from '@/api/sys/sysDataItemDetail';
export const columns: BasicColumn[] = [
{
title: '案件编号',
dataIndex: 'case_no',
width: 200,
},
{
title: '案件描述',
dataIndex: 'case_description',
width: 300,
},
{
title: '案件类型',
dataIndex: 'typename',
},
{
title: '县',
dataIndex: 'countyname',
},
{
title: '镇',
dataIndex: 'streetname',
},
{
title: '判读人',
dataIndex: 'identification_user',
},
{
title: '判读时间',
dataIndex: 'identification_time',
},
{
title: '状态',
dataIndex: 'checkstatus',
customRender: ({ record }) => {
const { checkstatus } = record;
if(checkstatus == '待审核'){
return h(Tag, { color: 'yellow' }, () => checkstatus);
}else if(checkstatus == '已审核'){
return h(Tag, { color: 'green' }, () => checkstatus);
}
return h(Tag, {}, () => checkstatus);
}
},
];
export const searchFormSchema: FormSchema[] = [
{
field: 'caseNo',
label: '案件编号',
component: 'Input',
colProps: { span: 5 },
componentProps: {
placeholder: '请输入名称/编号',
},
},
{
field: 'typename',
label:'案件类型',
component: 'ApiSelect',
colProps: { span: 4 },
componentProps: ({formModel}) => {
return {
api: getLoad,
params: { code: 'gdflhtblx' },
// 接口参数
resultField: 'result',
labelField: 'itemName',
valueField: 'itemValue',
};
},
},
{
field: 'countyid',
label:'县/区',
component: 'ApiSelect',
colProps: { span: 4 },
componentProps: ({ tableAction, formModel }) => {
return {
api: getChildrenTree,
params: { parentId: 371300 },
// 接口参数
resultField: 'result',
labelField: 'name',
valueField: 'id',
onChange: () => {
formModel.streetid = '';
},
};
},
},
{
field: 'streetid',
label:'乡镇/街道',
component: 'ApiSelect',
colProps: { span: 4 },
componentProps: ({ formModel }) => {
return {
api: formModel.countyid && getChildrenTree,
params: { parentId: formModel.countyid },
// 接口参数
resultField: 'result',
labelField: 'name',
valueField: 'id',
};
},
}
];

View File

@ -0,0 +1,381 @@
<template>
<div class="modal-content">
<div class="row">
<div class="item">
<div class="label">案件编号</div>
<div class="item-value" style="flex:2">
<a-input v-model:value="props.infoData.case_no" disabled/>
</div>
</div>
<div class="item">
<div class="label">案件类型</div>
<div class="item-value">
<a-select
style="width: 100%"
v-model:value="props.infoData.typename"
:options="typenameOptions"
placeholder="请选择案件类型" disabled/>
</div>
</div>
<div class="item" style="flex:2">
<div class="label">案件详情</div>
<div class="item-value" style="flex:3">
<a-input v-model:value="props.infoData.case_description" disabled/>
</div>
</div>
</div>
<div class="row">
<div class="item">
<div class="label">/</div>
<div class="item-value">
<a-select
style="width: 100%"
v-model:value="props.infoData.countyid"
:options="countyOptions"
placeholder="请选择县/区" disabled/>
</div>
</div>
<div class="item">
<div class="label">乡镇/街道</div>
<div class="item-value">
<a-select
style="width: 100%"
v-model:value="props.infoData.streetid"
:options="streetOptions"
placeholder="请选择乡镇/街道" disabled/>
</div>
</div>
<div class="item">
<div class="label">社区/</div>
<div class="item-value">
<a-select
style="width: 100%"
v-model:value="props.infoData.communityid"
:options="communityOptions"
placeholder="请选择社区/村" disabled/>
</div>
</div>
<div class="item">
<div class="label">详细地址</div>
<div class="item-value" style="flex:2">
<a-input v-model:value="props.infoData.address" disabled/>
</div>
</div>
</div>
<div class="row">
<div class="item">
<div class="label">图斑面积</div>
<div class="item-value">
<a-input v-model:value="props.infoData.area" disabled/>
</div>
</div>
<div class="item">
<div class="label">耕地面积</div>
<div class="item-value">
<a-input v-model:value="props.infoData.gengdi_area" disabled/>
</div>
</div>
<div class="item">
<div class="label">占重点区域面积</div>
<div class="item-value">
<a-input v-model:value="props.infoData.zhongdianquyu_area" disabled/>
</div>
</div>
<div class="item">
<div class="label">占生态红线面积</div>
<div class="item-value">
<a-input v-model:value="props.infoData.shengtaibaohuhongxian_area" disabled/>
</div>
</div>
</div>
<div class="row">
<div class="item">
<div class="label">占空间规划面积</div>
<div class="item-value">
<a-input v-model:value="props.infoData.guotukongjianguihua_area" disabled/>
</div>
</div>
<div class="item">
<div class="label">占农用地面积</div>
<div class="item-value">
<a-input v-model:value="props.infoData.nongyongdi_area" disabled/>
</div>
</div>
<div class="item" style="flex:2">
<div class="label">占永久基本农田面积</div>
<div class="item-value">
<a-input v-model:value="props.infoData.yongjiujibennongtian_area" disabled/>
</div>
<div style="flex:2"></div>
</div>
</div>
<div class="row">
<div class="item">
<div class="label">前影像名称</div>
<div class="item-value" style="flex:2">
<a-input v-model:value="props.infoData.pre_phase_img" disabled />
</div>
</div>
<div class="item">
<div class="label">前时相时间</div>
<div class="item-value" style="flex:2">
<a-input v-model:value="props.infoData.pre_phase_time" disabled/>
</div>
</div>
<div class="item">
<div class="label">备注</div>
<div class="item-value" style="flex:2">
<a-input v-model:value="props.infoData.remark" disabled/>
</div>
</div>
</div>
<div class="row">
<div class="item">
<div class="label">后影像名称</div>
<div class="item-value" style="flex:2">
<a-input v-model:value="props.infoData.later_phase_img" disabled/>
</div>
</div>
<div class="item">
<div class="label">后时相时间</div>
<div class="item-value" style="flex:2">
<a-input v-model:value="props.infoData.later_phase_time" disabled/>
</div>
</div>
<div class="item">
<div class="label">经纬度</div>
<div class="item-value" style="flex:2;display: flex">
<a-input id="lnglat" style="margin-right: 15px;" :value="`${props.infoData.lng},${props.infoData.lat}`" disabled/>
<a-button @click="copyText"></a-button>
<textarea id="copyText" style="position: absolute;left: -9999px;top: -9999px;" :value="`${props.infoData.lng},${props.infoData.lat}`"/>
</div>
</div>
</div>
<div class="row">
<div class="item">
<div class="label">判读人</div>
<div class="item-value" style="flex:2">
<a-input v-model:value="props.infoData.identification_user" disabled/>
</div>
</div>
<div class="item">
<div class="label">判读时间</div>
<div class="item-value" style="flex:2">
<a-input v-model:value="props.infoData.identification_time" disabled/>
</div>
</div>
<div class="item">
</div>
</div>
<div class="row">
<div class="item" style="width: 100%;">
<div class="label">图片</div>
<div style="flex:9;display:flex;">
<a-image-preview-group>
<div class="video-item" v-for="(item, index) in fileList" :key="index" style="display: inline-block;position:relative;">
<!-- <div v-if="!$attrs.disabled" class="video-delete-btn" @click="handlerDelete(index)">
<CloseOutlined />
</div> -->
<a-image :src="item.url" style="width:100px;height:100px;" />
</div>
</a-image-preview-group>
<!-- <Upload
list-type="picture-card"
:showUploadList="false"
:custom-request="customRequest"
@change="handleChange"
>
<div>
<plus-outlined />
<div style="margin-top: 8px">Upload</div>
</div>
</Upload> -->
</div>
</div>
</div>
<div class="footer">
<div class="button-div">
<a-button style="margin-right: 10px;" @click="emits('closeModal')"></a-button>
<a-button v-if="props.control" style="margin-right: 10px;" type="primary" class="danger-button" @click="emits('closeCase',props.infoData.id)">线</a-button>
<a-button v-if="props.control" style="margin-right: 10px;" type="primary" @click="submit"></a-button>
<a-button v-if="props.control" style="margin-right: 10px;" type="primary" class="danger-button" @click="reSubmit"></a-button>
<!-- <a-button v-if="props.control" type="primary"></a-button> -->
</div>
</div>
</div>
</template>
<script setup lang="ts">
import { defineProps, ref, watch, onMounted, defineEmits } from "vue"
import { PlusOutlined, CloseOutlined } from '@ant-design/icons-vue';
import { Upload, message } from 'ant-design-vue';
import { uploadFile } from '@/api/formrender/index';
import { getAppEnvConfig } from '@/utils/env';
import { getLoad } from '@/api/sys/sysDataItemDetail';
import { getChildrenTree } from '@/api/demo/system';
const props = defineProps(['infoData','control'])
const emits = defineEmits(['handleOk','closeModal','closeCase','reSubmit'])
const typenameOptions = ref([])
const countyOptions = ref([])
const streetOptions = ref([])
const communityOptions = ref([])
const fileList = ref<any>([])
const previewVisible = ref(false);
const previewImage = ref('');
const previewTitle = ref('');
onMounted(() => {
getLoad({code:'gdflhtblx'}).then(res => {
typenameOptions.value = res.map(item => {
return {
label: item.itemName,
value: item.itemValue
}
})
})
getChildrenTree({ parentId: 371300 }).then(res => {
countyOptions.value = res.map(item => {
return {
label: item.name,
value: item.id.toString(),
}
})
})
props.infoData.countyid && getChildrenTree({ parentId: props.infoData.countyid }).then(res => {
streetOptions.value = res.map(item => {
return {
label: item.name,
value: item.id.toString(),
}
})
})
props.infoData.streetid && getChildrenTree({ parentId: props.infoData.streetid }).then(res => {
communityOptions.value = res.map(item => {
return {
label: item.name,
value: item.id.toString(),
}
})
})
const { VITE_GLOB_API_URL } = getAppEnvConfig();
props.infoData.casepic && props.infoData.casepic.split(',').forEach(item => {
fileList.value.push({
uid: '-1',
name: item,
status: 'done',
url: VITE_GLOB_API_URL + '/' + item,
})
})
})
watch(() => fileList.value.length, (val) => {
props.infoData.casepic = fileList.value.map(item => item.name).join(',')
})
const handleChange = (info) => {
if (info.file.status !== 'uploading') {
}
if (info.file.status === 'done') {
} else if (info.file.status === 'error') {
}
};
const customRequest = (file) => {
console.log('handleCustomRequest',file)
const { VITE_GLOB_API_URL } = getAppEnvConfig();
const formData = new FormData()
formData.append('files', file.file)
uploadFile(formData).then(res => {
console.log(res)
fileList.value?.push({
uid: '-1',
name: res[0].filePath,
status: 'done',
url: VITE_GLOB_API_URL + '/' + res[0].filePath,
});
})
}
const handlePreview = () => {
}
const handleRemove = () => {
}
const handlerDelete = (index) => {
fileList.value.splice(index, 1);
}
const handlerPreviewImage = (url,list) => {
}
const submit = () => {
console.log('通过')
emits('handleOk')
}
const reSubmit = () => {
emits('reSubmit',props.infoData.original_case_no)
}
const copyText = () => {
const copyTextDom = document.getElementById('copyText')
console.log(copyTextDom)
if(copyTextDom){
copyTextDom.select()
document.execCommand('Copy');
message.success('复制成功')
}
}
</script>
<style lang="scss" scoped>
:deep(.ant-image){
margin-right: 10px;
margin-bottom: 10px;
}
.video-delete-btn {
position: absolute;
top: 0px;
right: 10px;
width: 30px;
height: 30px;
border-bottom-left-radius: 80%;
background: rgb(0 0 0 / 20%);
color: #fff;
line-height: 30px;
text-align: center;
z-index: 999;
}
.modal-content{
padding: 20px;
}
.row{
display: flex;
margin-bottom: 15px;
}
.select-width{
width:100%;
}
.item{
display: flex;
flex:1;
.label{
flex: 1;
padding: 0px 15px;
display: flex;
align-items: center;
justify-content: center;
}
.item-value{
padding: 0px 15px;
flex:1;
}
}
.button-div{
display: flex;
justify-content: flex-end;
.danger-button{
background: #ed6f6f;
&:hover{
background: #faa19d;
}
}
}
</style>

View File

@ -0,0 +1,225 @@
<template>
<PageWrapper dense contentFullHeight fixedHeight contentClass="flex">
<BasicTable class="w-4/4 xl:w-5/5" @register="registerTable">
<template #toolbar>
<!-- <a-button type="primary" @click="handleCreate"></a-button> -->
<!-- <a-upload
:accept="'.xlsx,.csv,.xls'"
:showUploadList="false"
:custom-request="customRequest"
>
<a-button type="primary">导入</a-button>
</a-upload> -->
</template>
<template #bodyCell="{ column, record }">
<template v-if="column.key === 'action'">
<TableAction
:actions="[
{
label: '审核',
onClick: () => {
handleAudit(record);
},
}
]"
/>
</template>
</template>
</BasicTable>
<a-modal width="75%" v-model:open="openModal" title="线索审核" :destroyOnClose="true" :footer="null">
<InfoModal
:infoData="infoData.info"
@handleOk="handleOk"
@closeModal="closeModal"
:control="true"
@closeCase="closeCase"
@reSubmit="reSubmit"/>
</a-modal>
</PageWrapper>
</template>
<script lang="ts" setup>
import { nextTick, onMounted, ref, h } from 'vue';
import { BasicTable, useTable, TableAction } from '@/components/Table';
import { PageWrapper } from '@/components/Page';
import InfoModal from './InfoModal/index.vue'
import { columns, searchFormSchema, dictionary, code } from './util';
import { getDetail } from '@/api/sys/WFSchemeInfo';
import { functionsaveForm, LoadFormScheme } from '@/api/demo/formScheme';
import { buildGUID } from '@/utils/uuid';
import { useUserStore } from '@/store/modules/user';
import { create, saveDraft, GetDraft } from '@/api/sys/WFProcess';
import { message, Modal, Input } from 'ant-design-vue';
import { SaveReSubmitInfo } from '@/api/demo/resubmit';
import { LoadCaseInfoLists, GetCaseInfo, CloseCaseInfo } from '@/api/degraining/index';
const userStore = useUserStore();
const userInfo = userStore.getUserInfo;
const infoData = ref({})
const openModal = ref(false)
const reSubmitRemark = ref("")
const [registerTable, { reload, expandAll}] = useTable({
title: '待审核',
api: LoadCaseInfoLists,
columns,
rowKey: 'id',
formConfig: {
labelWidth: 120,
schemas: searchFormSchema,
},
striped: false,
//
showIndexColumn: false,
// 使
useSearchForm: true,
//
showTableSetting: true,
bordered: true,
beforeFetch(data) {
let params = {...data,nowStatus: '待审核'}
return params
},
afterFetch(data) {
console.log('afterFetch', data);
},
actionColumn: {
width: 100,
title: '操作',
dataIndex: 'action',
},
handleSearchInfoFn(info) {
return info;
},
});
function handleAudit(record) {
GetCaseInfo({id: record.Id}).then(res => {
console.log(res)
infoData.value = res
openModal.value = true
})
}
const handleOk = async () => {
try {
const { id } = infoData.value.info
const checkValue = await GetDraft({id})
if(checkValue.process == null){
let data = await getDetail({ code });
let content = JSON.parse(data.scheme.content);
const currentNode = content.wfData.find((t) => t.type == 'bpmn:StartEvent');
let formVerison = currentNode.formVerison
let keyValue = ''
const schemaData = await LoadFormScheme({
schemeId: formVerison
});
const scheme = JSON.parse(schemaData.scheme);
scheme.formInfo.tabList.forEach((tabElement) => {
tabElement.schemas.forEach((element) => {
if (element.field == currentNode.formRelationId) {
keyValue = element.componentProps.fieldName;
}
});
});
let commit = {
schemeId: currentNode.formVerison,
pkey: keyValue,
pkeyValue: id,
};
let resultQuery = {
schemeCode: code,
userId: userInfo.id,
title: '',
processId: id,
InstanceInfo: JSON.stringify(commit),
};
await saveDraft(resultQuery);
resultQuery.schemeCode = '';
const result = await create(resultQuery);
if(result){
message.success('发起流程成功');
reload()
openModal.value = false
}else{
message.error('发起流程失败');
}
}else{
message.warning('该案件已发起流程');
}
} catch(err) {
console.log(err)
}
}
const closeModal = () => {
openModal.value = false
}
const closeCase = (id: string) => {
Modal.confirm({
title: '关闭案件',
content: '确定关闭该案件吗?',
onOk: async () => {
const result = await CloseCaseInfo(id)
if(result){
message.success('关闭案件成功');
reload()
openModal.value = false
}else{
message.error('关闭案件失败');
}
},
onCancel() {},
})
}
const reSubmit = (originalcaseno: string) => {
Modal.confirm({
title: '请输入复提原因',
content: h('input',{
class: 'reSubmitInput',
onChange: (e) => reSubmitRemark.value = e.target.value
}),
onOk: async () => {
console.log(reSubmitRemark.value)
const result = await SaveReSubmitInfo({ originalcaseno, remark: reSubmitRemark.value })
if(result){
message.success('复提成功');
reload()
openModal.value = false
}else{
message.error('复提失败');
}
reSubmitRemark.value = ''
},
onCancel() {
reSubmitRemark.value = ''
},
})
}
const customRequest = (file) => {
console.log('handleCustomRequest',file)
// const { VITE_GLOB_API_URL } = getAppEnvConfig();
const formData = new FormData()
formData.append('files', file.file)
// uploadFile(formData).then(res => {
// console.log(res)
// fileList.value?.push({
// uid: '-1',
// name: res[0].filePath,
// status: 'done',
// url: VITE_GLOB_API_URL + '/' + res[0].filePath,
// });
// })
}
</script>
<style lang="scss">
.reSubmitInput{
border: 1px solid;
width: 100%;
height: 35px;
border-radius: 5px;
padding: 0px 10px;
border-color: #000;
transition: 0.2s;
&:focus{
border-color: #6db8ff;
}
}
</style>

View File

@ -0,0 +1,135 @@
import { BasicColumn, FormSchema } from '@/components/Table';
import { h } from 'vue';
import { Tag } from 'ant-design-vue';
import { getChildrenTree } from '@/api/demo/system';
import { getLoad } from '@/api/sys/sysDataItemDetail';
export const code = '0000004'
export const columns: BasicColumn[] = [
{
title: '案件编号',
dataIndex: 'case_no',
width: 200,
},
{
title: '案件描述',
dataIndex: 'case_description',
width: 300,
},
{
title: '案件类型',
dataIndex: 'typename',
},
{
title: '县',
dataIndex: 'countyname',
},
{
title: '镇',
dataIndex: 'streetname',
},
{
title: '判读人',
dataIndex: 'identification_user',
},
{
title: '判读时间',
dataIndex: 'identification_time',
},
{
title: '状态',
dataIndex: 'checkstatus',
customRender: ({ record }) => {
const { checkstatus } = record;
if(checkstatus == '待审核'){
return h(Tag, { color: 'yellow' }, () => checkstatus);
}else if(checkstatus == '已审核'){
return h(Tag, { color: 'green' }, () => checkstatus);
}
return h(Tag, {}, () => checkstatus);
}
},
];
export const searchFormSchema: FormSchema[] = [
{
field: 'caseNo',
label: '案件编号',
component: 'Input',
colProps: { span: 5 },
componentProps: {
placeholder: '请输入名称/编号',
},
},
{
field: 'typename',
label:'案件类型',
component: 'ApiSelect',
colProps: { span: 4 },
componentProps: ({formModel}) => {
return {
api: getLoad,
params: { code: 'gdflhtblx' },
// 接口参数
resultField: 'result',
labelField: 'itemName',
valueField: 'itemValue',
};
},
},
{
field: 'countyid',
label:'县/区',
component: 'ApiSelect',
colProps: { span: 4 },
componentProps: ({ tableAction, formModel }) => {
return {
api: getChildrenTree,
params: { parentId: 371300 },
// 接口参数
resultField: 'result',
labelField: 'name',
valueField: 'id',
onChange: () => {
formModel.streetid = '';
},
};
},
},
{
field: 'streetid',
label:'乡镇/街道',
component: 'ApiSelect',
colProps: { span: 4 },
componentProps: ({ formModel }) => {
return {
api: formModel.countyid && getChildrenTree,
params: { parentId: formModel.countyid },
// 接口参数
resultField: 'result',
labelField: 'name',
valueField: 'id',
};
},
}
];
export const dictionary = {
_input_39: 'case_no',
_input_15: 'typename',
_input_16: 'case_description',
_input_3: 'countyid',
_input_10: 'streetid',
_input_ca1c543fcf014e6abdcb6d329d796cee: 'communityid',
_input_43: 'area',
_input_18fd0953784b4c35b9219bd6defaf376: 'gengdi_area',
_input_42fed651e58c4b5daf9868ff6a0da3b0: 'shengtaibaohuhongxian_area',
_input_520d1d8068f4492ea8c42ce9bb61b3cf: 'nongyongdi_area',
_input_039dd978de5c4176b2913eae5ba60844: 'yongjiujibennongtian_area',
_input_17: 'remark',
_input_4: 'lng',
_input_14: 'lat',
_input_44: 'identification_time',
_image_upload_369: 'casepic',
}

View File

@ -0,0 +1,78 @@
<template>
<PageWrapper dense contentFullHeight fixedHeight contentClass="flex">
<BasicTable class="w-4/4 xl:w-5/5" @register="registerTable">
<template #bodyCell="{ column, record }">
<template v-if="column.key === 'action'">
<TableAction
:actions="[
{
label: '详情',
onClick: () => {
handleAudit(record);
},
}
]"
/>
</template>
</template>
</BasicTable>
<a-modal width="75%" v-model:open="openModal" title="线索审核" :destroyOnClose="true" :footer="null">
<InfoModal :infoData="infoData.info" @handleOk="handleOk" :control="false"/>
</a-modal>
</PageWrapper>
</template>
<script lang="ts" setup>
import { nextTick, onMounted, ref } from 'vue';
import { BasicTable, useTable, TableAction } from '@/components/Table';
import { PageWrapper } from '@/components/Page';
import InfoModal from '../audit/InfoModal/index.vue'
import { columns, searchFormSchema } from './util';
import { LoadCaseInfoLists, GetCaseInfo } from '@/api/degraining/index';
const infoData = ref({})
const openModal = ref(false)
const [registerTable, { reload, expandAll}] = useTable({
title: '已关闭',
api: LoadCaseInfoLists,
columns,
rowKey: 'id',
formConfig: {
labelWidth: 120,
schemas: searchFormSchema,
},
striped: false,
//
showIndexColumn: false,
// 使
useSearchForm: true,
//
showTableSetting: true,
bordered: true,
beforeFetch(data) {
let params = {...data,nowStatus: '已关闭'}
return params
},
afterFetch(data) {
console.log('afterFetch', data);
},
actionColumn: {
width: 100,
title: '操作',
dataIndex: 'action',
},
handleSearchInfoFn(info) {
return info;
},
});
function handleAudit(record) {
GetCaseInfo({id: record.Id}).then(res => {
console.log(res)
infoData.value = res
openModal.value = true
})
}
const handleOk = () => {
console.log('infoData',infoData.value)
}
</script>

View File

@ -0,0 +1,113 @@
import { BasicColumn, FormSchema } from '@/components/Table';
import { h } from 'vue';
import { Tag } from 'ant-design-vue';
import { getChildrenTree } from '@/api/demo/system';
import { getLoad } from '@/api/sys/sysDataItemDetail';
export const columns: BasicColumn[] = [
{
title: '案件编号',
dataIndex: 'case_no',
width: 200,
},
{
title: '案件描述',
dataIndex: 'case_description',
width: 300,
},
{
title: '案件类型',
dataIndex: 'typename',
},
{
title: '县',
dataIndex: 'countyname',
},
{
title: '镇',
dataIndex: 'streetname',
},
{
title: '判读人',
dataIndex: 'identification_user',
},
{
title: '判读时间',
dataIndex: 'identification_time',
},
{
title: '状态',
dataIndex: 'checkstatus',
customRender: ({ record }) => {
const { checkstatus } = record;
if(checkstatus == '待审核'){
return h(Tag, { color: 'yellow' }, () => checkstatus);
}else if(checkstatus == '已审核'){
return h(Tag, { color: 'green' }, () => checkstatus);
}
return h(Tag, {}, () => checkstatus);
}
},
];
export const searchFormSchema: FormSchema[] = [
{
field: 'caseNo',
label: '案件编号',
component: 'Input',
colProps: { span: 5 },
componentProps: {
placeholder: '请输入名称/编号',
},
},
{
field: 'typename',
label:'案件类型',
component: 'ApiSelect',
colProps: { span: 4 },
componentProps: ({formModel}) => {
return {
api: getLoad,
params: { code: 'gdflhtblx' },
// 接口参数
resultField: 'result',
labelField: 'itemName',
valueField: 'itemValue',
};
},
},
{
field: 'countyid',
label:'县/区',
component: 'ApiSelect',
colProps: { span: 4 },
componentProps: ({ tableAction, formModel }) => {
return {
api: getChildrenTree,
params: { parentId: 371300 },
// 接口参数
resultField: 'result',
labelField: 'name',
valueField: 'id',
onChange: () => {
formModel.streetid = '';
},
};
},
},
{
field: 'streetid',
label:'乡镇/街道',
component: 'ApiSelect',
colProps: { span: 4 },
componentProps: ({ formModel }) => {
return {
api: formModel.countyid && getChildrenTree,
params: { parentId: formModel.countyid },
// 接口参数
resultField: 'result',
labelField: 'name',
valueField: 'id',
};
},
}
];

View File

@ -0,0 +1,81 @@
<template>
<PageWrapper dense contentFullHeight fixedHeight contentClass="flex">
<BasicTable class="w-4/4 xl:w-5/5" @register="registerTable">
<template #bodyCell="{ column, record }">
<template v-if="column.key === 'action'">
<TableAction
:actions="[
{
label: '详情',
onClick: () => {
handleAudit(record);
},
}
]"
/>
</template>
</template>
</BasicTable>
<a-modal width="75%" v-model:open="openModal" title="线索审核" :destroyOnClose="true" :footer="null">
<InfoModal :infoData="infoData.info" @handleOk="handleOk" @closeModal="closeModal" :control="false"/>
</a-modal>
</PageWrapper>
</template>
<script lang="ts" setup>
import { nextTick, onMounted, ref } from 'vue';
import { BasicTable, useTable, TableAction } from '@/components/Table';
import { PageWrapper } from '@/components/Page';
import InfoModal from '../audit/InfoModal/index.vue'
import { columns, searchFormSchema } from './util';
import { LoadCaseInfoLists, GetCaseInfo } from '@/api/illegalmining/index';
const infoData = ref({})
const openModal = ref(false)
const [registerTable, { reload, expandAll}] = useTable({
title: '已审核',
api: LoadCaseInfoLists,
columns,
rowKey: 'id',
formConfig: {
labelWidth: 120,
schemas: searchFormSchema,
},
striped: false,
//
showIndexColumn: false,
// 使
useSearchForm: true,
//
showTableSetting: true,
bordered: true,
beforeFetch(data) {
let params = {...data,nowStatus: '已审核'}
return params
},
afterFetch(data) {
console.log('afterFetch', data);
},
actionColumn: {
width: 100,
title: '操作',
dataIndex: 'action',
},
handleSearchInfoFn(info) {
return info;
},
});
function handleAudit(record) {
GetCaseInfo({id: record.Id}).then(res => {
console.log(res)
infoData.value = res
openModal.value = true
})
}
const handleOk = () => {
console.log('infoData',infoData.value)
}
const closeModal = () => {
openModal.value = false
}
</script>

View File

@ -0,0 +1,113 @@
import { BasicColumn, FormSchema } from '@/components/Table';
import { h } from 'vue';
import { Tag } from 'ant-design-vue';
import { getChildrenTree } from '@/api/demo/system';
import { getLoad } from '@/api/sys/sysDataItemDetail';
export const columns: BasicColumn[] = [
{
title: '案件编号',
dataIndex: 'case_no',
width: 200,
},
{
title: '案件描述',
dataIndex: 'case_description',
width: 300,
},
{
title: '案件类型',
dataIndex: 'typename',
},
{
title: '县',
dataIndex: 'countyname',
},
{
title: '镇',
dataIndex: 'streetname',
},
{
title: '判读人',
dataIndex: 'identification_user',
},
{
title: '判读时间',
dataIndex: 'identification_time',
},
{
title: '状态',
dataIndex: 'checkstatus',
customRender: ({ record }) => {
const { checkstatus } = record;
if(checkstatus == '待审核'){
return h(Tag, { color: 'yellow' }, () => checkstatus);
}else if(checkstatus == '已审核'){
return h(Tag, { color: 'green' }, () => checkstatus);
}
return h(Tag, {}, () => checkstatus);
}
},
];
export const searchFormSchema: FormSchema[] = [
{
field: 'caseNo',
label: '案件编号',
component: 'Input',
colProps: { span: 5 },
componentProps: {
placeholder: '请输入名称/编号',
},
},
{
field: 'typename',
label:'案件类型',
component: 'ApiSelect',
colProps: { span: 4 },
componentProps: ({formModel}) => {
return {
api: getLoad,
params: { code: 'kctubanleixing' },
// 接口参数
resultField: 'result',
labelField: 'itemName',
valueField: 'itemValue',
};
},
},
{
field: 'countyid',
label:'县/区',
component: 'ApiSelect',
colProps: { span: 4 },
componentProps: ({ tableAction, formModel }) => {
return {
api: getChildrenTree,
params: { parentId: 371300 },
// 接口参数
resultField: 'result',
labelField: 'name',
valueField: 'id',
onChange: () => {
formModel.streetid = '';
},
};
},
},
{
field: 'streetid',
label:'乡镇/街道',
component: 'ApiSelect',
colProps: { span: 4 },
componentProps: ({ formModel }) => {
return {
api: formModel.countyid && getChildrenTree,
params: { parentId: formModel.countyid },
// 接口参数
resultField: 'result',
labelField: 'name',
valueField: 'id',
};
},
}
];

View File

@ -0,0 +1,381 @@
<template>
<div class="modal-content">
<div class="row">
<div class="item">
<div class="label">案件编号</div>
<div class="item-value" style="flex:2">
<a-input v-model:value="props.infoData.case_no" disabled/>
</div>
</div>
<div class="item">
<div class="label">案件类型</div>
<div class="item-value">
<a-select
style="width: 100%"
v-model:value="props.infoData.typename"
:options="typenameOptions"
placeholder="请选择案件类型" disabled/>
</div>
</div>
<div class="item" style="flex:2">
<div class="label">案件详情</div>
<div class="item-value" style="flex:3">
<a-input v-model:value="props.infoData.case_description" disabled/>
</div>
</div>
</div>
<div class="row">
<div class="item">
<div class="label">/</div>
<div class="item-value">
<a-select
style="width: 100%"
v-model:value="props.infoData.countyid"
:options="countyOptions"
placeholder="请选择县/区" disabled/>
</div>
</div>
<div class="item">
<div class="label">乡镇/街道</div>
<div class="item-value">
<a-select
style="width: 100%"
v-model:value="props.infoData.streetid"
:options="streetOptions"
placeholder="请选择乡镇/街道" disabled/>
</div>
</div>
<div class="item">
<div class="label">社区/</div>
<div class="item-value">
<a-select
style="width: 100%"
v-model:value="props.infoData.communityid"
:options="communityOptions"
placeholder="请选择社区/村" disabled/>
</div>
</div>
<div class="item">
<div class="label">详细地址</div>
<div class="item-value" style="flex:2">
<a-input v-model:value="props.infoData.address" disabled/>
</div>
</div>
</div>
<div class="row">
<div class="item">
<div class="label">图斑面积</div>
<div class="item-value">
<a-input v-model:value="props.infoData.area" disabled/>
</div>
</div>
<div class="item">
<div class="label">耕地面积</div>
<div class="item-value">
<a-input v-model:value="props.infoData.gengdi_area" disabled/>
</div>
</div>
<div class="item">
<div class="label">占重点区域面积</div>
<div class="item-value">
<a-input v-model:value="props.infoData.zhongdianquyu_area" disabled/>
</div>
</div>
<div class="item">
<div class="label">占生态红线面积</div>
<div class="item-value">
<a-input v-model:value="props.infoData.shengtaibaohuhongxian_area" disabled/>
</div>
</div>
</div>
<div class="row">
<div class="item">
<div class="label">占空间规划面积</div>
<div class="item-value">
<a-input v-model:value="props.infoData.guotukongjianguihua_area" disabled/>
</div>
</div>
<div class="item">
<div class="label">占农用地面积</div>
<div class="item-value">
<a-input v-model:value="props.infoData.nongyongdi_area" disabled/>
</div>
</div>
<div class="item" style="flex:2">
<div class="label">占永久基本农田面积</div>
<div class="item-value">
<a-input v-model:value="props.infoData.yongjiujibennongtian_area" disabled/>
</div>
<div style="flex:2"></div>
</div>
</div>
<div class="row">
<div class="item">
<div class="label">前影像名称</div>
<div class="item-value" style="flex:2">
<a-input v-model:value="props.infoData.pre_phase_img" disabled />
</div>
</div>
<div class="item">
<div class="label">前时相时间</div>
<div class="item-value" style="flex:2">
<a-input v-model:value="props.infoData.pre_phase_time" disabled/>
</div>
</div>
<div class="item">
<div class="label">备注</div>
<div class="item-value" style="flex:2">
<a-input v-model:value="props.infoData.remark" disabled/>
</div>
</div>
</div>
<div class="row">
<div class="item">
<div class="label">后影像名称</div>
<div class="item-value" style="flex:2">
<a-input v-model:value="props.infoData.later_phase_img" disabled/>
</div>
</div>
<div class="item">
<div class="label">后时相时间</div>
<div class="item-value" style="flex:2">
<a-input v-model:value="props.infoData.later_phase_time" disabled/>
</div>
</div>
<div class="item">
<div class="label">经纬度</div>
<div class="item-value" style="flex:2;display: flex">
<a-input id="lnglat" style="margin-right: 15px;" :value="`${props.infoData.lng},${props.infoData.lat}`" disabled/>
<a-button @click="copyText"></a-button>
<textarea id="copyText" style="position: absolute;left: -9999px;top: -9999px;" :value="`${props.infoData.lng},${props.infoData.lat}`"/>
</div>
</div>
</div>
<div class="row">
<div class="item">
<div class="label">判读人</div>
<div class="item-value" style="flex:2">
<a-input v-model:value="props.infoData.identification_user" disabled/>
</div>
</div>
<div class="item">
<div class="label">判读时间</div>
<div class="item-value" style="flex:2">
<a-input v-model:value="props.infoData.identification_time" disabled/>
</div>
</div>
<div class="item">
</div>
</div>
<div class="row">
<div class="item" style="width: 100%;">
<div class="label">图片</div>
<div style="flex:9;display:flex;">
<a-image-preview-group>
<div class="video-item" v-for="(item, index) in fileList" :key="index" style="display: inline-block;position:relative;">
<!-- <div v-if="!$attrs.disabled" class="video-delete-btn" @click="handlerDelete(index)">
<CloseOutlined />
</div> -->
<a-image :src="item.url" style="width:100px;height:100px;" />
</div>
</a-image-preview-group>
<!-- <Upload
list-type="picture-card"
:showUploadList="false"
:custom-request="customRequest"
@change="handleChange"
>
<div>
<plus-outlined />
<div style="margin-top: 8px">Upload</div>
</div>
</Upload> -->
</div>
</div>
</div>
<div class="footer">
<div class="button-div">
<a-button style="margin-right: 10px;" @click="emits('closeModal')"></a-button>
<a-button v-if="props.control" style="margin-right: 10px;" type="primary" class="danger-button" @click="emits('closeCase',props.infoData.id)">线</a-button>
<a-button v-if="props.control" style="margin-right: 10px;" type="primary" @click="submit"></a-button>
<a-button v-if="props.control" style="margin-right: 10px;" type="primary" class="danger-button" @click="reSubmit"></a-button>
<!-- <a-button v-if="props.control" type="primary"></a-button> -->
</div>
</div>
</div>
</template>
<script setup lang="ts">
import { defineProps, ref, watch, onMounted, defineEmits } from "vue"
import { PlusOutlined, CloseOutlined } from '@ant-design/icons-vue';
import { Upload, message } from 'ant-design-vue';
import { uploadFile } from '@/api/formrender/index';
import { getAppEnvConfig } from '@/utils/env';
import { getLoad } from '@/api/sys/sysDataItemDetail';
import { getChildrenTree } from '@/api/demo/system';
const props = defineProps(['infoData','control'])
const emits = defineEmits(['handleOk','closeModal','closeCase','reSubmit'])
const typenameOptions = ref([])
const countyOptions = ref([])
const streetOptions = ref([])
const communityOptions = ref([])
const fileList = ref<any>([])
const previewVisible = ref(false);
const previewImage = ref('');
const previewTitle = ref('');
onMounted(() => {
getLoad({code:'kctubanleixing'}).then(res => {
typenameOptions.value = res.map(item => {
return {
label: item.itemName,
value: item.itemValue
}
})
})
getChildrenTree({ parentId: 371300 }).then(res => {
countyOptions.value = res.map(item => {
return {
label: item.name,
value: item.id.toString(),
}
})
})
props.infoData.countyid && getChildrenTree({ parentId: props.infoData.countyid }).then(res => {
streetOptions.value = res.map(item => {
return {
label: item.name,
value: item.id.toString(),
}
})
})
props.infoData.streetid && getChildrenTree({ parentId: props.infoData.streetid }).then(res => {
communityOptions.value = res.map(item => {
return {
label: item.name,
value: item.id.toString(),
}
})
})
const { VITE_GLOB_API_URL } = getAppEnvConfig();
props.infoData.casepic && props.infoData.casepic.split(',').forEach(item => {
fileList.value.push({
uid: '-1',
name: item,
status: 'done',
url: VITE_GLOB_API_URL + '/' + item,
})
})
})
watch(() => fileList.value.length, (val) => {
props.infoData.casepic = fileList.value.map(item => item.name).join(',')
})
const handleChange = (info) => {
if (info.file.status !== 'uploading') {
}
if (info.file.status === 'done') {
} else if (info.file.status === 'error') {
}
};
const customRequest = (file) => {
console.log('handleCustomRequest',file)
const { VITE_GLOB_API_URL } = getAppEnvConfig();
const formData = new FormData()
formData.append('files', file.file)
uploadFile(formData).then(res => {
console.log(res)
fileList.value?.push({
uid: '-1',
name: res[0].filePath,
status: 'done',
url: VITE_GLOB_API_URL + '/' + res[0].filePath,
});
})
}
const handlePreview = () => {
}
const handleRemove = () => {
}
const handlerDelete = (index) => {
fileList.value.splice(index, 1);
}
const handlerPreviewImage = (url,list) => {
}
const submit = () => {
console.log('通过')
emits('handleOk')
}
const reSubmit = () => {
emits('reSubmit',props.infoData.original_case_no)
}
const copyText = () => {
const copyTextDom = document.getElementById('copyText')
console.log(copyTextDom)
if(copyTextDom){
copyTextDom.select()
document.execCommand('Copy');
message.success('复制成功')
}
}
</script>
<style lang="scss" scoped>
:deep(.ant-image){
margin-right: 10px;
margin-bottom: 10px;
}
.video-delete-btn {
position: absolute;
top: 0px;
right: 10px;
width: 30px;
height: 30px;
border-bottom-left-radius: 80%;
background: rgb(0 0 0 / 20%);
color: #fff;
line-height: 30px;
text-align: center;
z-index: 999;
}
.modal-content{
padding: 20px;
}
.row{
display: flex;
margin-bottom: 15px;
}
.select-width{
width:100%;
}
.item{
display: flex;
flex:1;
.label{
flex: 1;
padding: 0px 15px;
display: flex;
align-items: center;
justify-content: center;
}
.item-value{
padding: 0px 15px;
flex:1;
}
}
.button-div{
display: flex;
justify-content: flex-end;
.danger-button{
background: #ed6f6f;
&:hover{
background: #faa19d;
}
}
}
</style>

View File

@ -0,0 +1,225 @@
<template>
<PageWrapper dense contentFullHeight fixedHeight contentClass="flex">
<BasicTable class="w-4/4 xl:w-5/5" @register="registerTable">
<template #toolbar>
<!-- <a-button type="primary" @click="handleCreate"></a-button> -->
<a-upload
:accept="'.xlsx,.csv,.xls'"
:showUploadList="false"
:custom-request="customRequest"
>
<a-button type="primary">导入</a-button>
</a-upload>
</template>
<template #bodyCell="{ column, record }">
<template v-if="column.key === 'action'">
<TableAction
:actions="[
{
label: '审核',
onClick: () => {
handleAudit(record);
},
}
]"
/>
</template>
</template>
</BasicTable>
<a-modal width="75%" v-model:open="openModal" title="线索审核" :destroyOnClose="true" :footer="null">
<InfoModal
:infoData="infoData.info"
@handleOk="handleOk"
@closeModal="closeModal"
:control="true"
@closeCase="closeCase"
@reSubmit="reSubmit"/>
</a-modal>
</PageWrapper>
</template>
<script lang="ts" setup>
import { nextTick, onMounted, ref, h } from 'vue';
import { BasicTable, useTable, TableAction } from '@/components/Table';
import { PageWrapper } from '@/components/Page';
import InfoModal from './InfoModal/index.vue'
import { columns, searchFormSchema, dictionary, code } from './util';
import { getDetail } from '@/api/sys/WFSchemeInfo';
import { functionsaveForm, LoadFormScheme } from '@/api/demo/formScheme';
import { buildGUID } from '@/utils/uuid';
import { useUserStore } from '@/store/modules/user';
import { create, saveDraft, GetDraft } from '@/api/sys/WFProcess';
import { message, Modal, Input } from 'ant-design-vue';
import { SaveReSubmitInfo } from '@/api/demo/resubmit';
import { LoadCaseInfoLists, GetCaseInfo, CloseCaseInfo } from '@/api/illegalmining/index';
const userStore = useUserStore();
const userInfo = userStore.getUserInfo;
const infoData = ref({})
const openModal = ref(false)
const reSubmitRemark = ref("")
const [registerTable, { reload, expandAll}] = useTable({
title: '待审核',
api: LoadCaseInfoLists,
columns,
rowKey: 'id',
formConfig: {
labelWidth: 120,
schemas: searchFormSchema,
},
striped: false,
//
showIndexColumn: false,
// 使
useSearchForm: true,
//
showTableSetting: true,
bordered: true,
beforeFetch(data) {
let params = {...data,nowStatus: '待审核'}
return params
},
afterFetch(data) {
console.log('afterFetch', data);
},
actionColumn: {
width: 100,
title: '操作',
dataIndex: 'action',
},
handleSearchInfoFn(info) {
return info;
},
});
function handleAudit(record) {
GetCaseInfo({id: record.Id}).then(res => {
console.log(res)
infoData.value = res
openModal.value = true
})
}
const handleOk = async () => {
try {
const { id } = infoData.value.info
const checkValue = await GetDraft({id})
if(checkValue.process == null){
let data = await getDetail({ code });
let content = JSON.parse(data.scheme.content);
const currentNode = content.wfData.find((t) => t.type == 'bpmn:StartEvent');
let formVerison = currentNode.formVerison
let keyValue = ''
const schemaData = await LoadFormScheme({
schemeId: formVerison
});
const scheme = JSON.parse(schemaData.scheme);
scheme.formInfo.tabList.forEach((tabElement) => {
tabElement.schemas.forEach((element) => {
if (element.field == currentNode.formRelationId) {
keyValue = element.componentProps.fieldName;
}
});
});
let commit = {
schemeId: currentNode.formVerison,
pkey: keyValue,
pkeyValue: id,
};
let resultQuery = {
schemeCode: code,
userId: userInfo.id,
title: '',
processId: id,
InstanceInfo: JSON.stringify(commit),
};
await saveDraft(resultQuery);
resultQuery.schemeCode = '';
const result = await create(resultQuery);
if(result){
message.success('发起流程成功');
reload()
openModal.value = false
}else{
message.error('发起流程失败');
}
}else{
message.warning('该案件已发起流程');
}
} catch(err) {
console.log(err)
}
}
const closeModal = () => {
openModal.value = false
}
const closeCase = (id: string) => {
Modal.confirm({
title: '关闭案件',
content: '确定关闭该案件吗?',
onOk: async () => {
const result = await CloseCaseInfo(id)
if(result){
message.success('关闭案件成功');
reload()
openModal.value = false
}else{
message.error('关闭案件失败');
}
},
onCancel() {},
})
}
const reSubmit = (originalcaseno: string) => {
Modal.confirm({
title: '请输入复提原因',
content: h('input',{
class: 'reSubmitInput',
onChange: (e) => reSubmitRemark.value = e.target.value
}),
onOk: async () => {
console.log(reSubmitRemark.value)
const result = await SaveReSubmitInfo({ originalcaseno, remark: reSubmitRemark.value })
if(result){
message.success('复提成功');
reload()
openModal.value = false
}else{
message.error('复提失败');
}
reSubmitRemark.value = ''
},
onCancel() {
reSubmitRemark.value = ''
},
})
}
const customRequest = (file) => {
console.log('handleCustomRequest',file)
// const { VITE_GLOB_API_URL } = getAppEnvConfig();
const formData = new FormData()
formData.append('files', file.file)
// uploadFile(formData).then(res => {
// console.log(res)
// fileList.value?.push({
// uid: '-1',
// name: res[0].filePath,
// status: 'done',
// url: VITE_GLOB_API_URL + '/' + res[0].filePath,
// });
// })
}
</script>
<style lang="scss">
.reSubmitInput{
border: 1px solid;
width: 100%;
height: 35px;
border-radius: 5px;
padding: 0px 10px;
border-color: #000;
transition: 0.2s;
&:focus{
border-color: #6db8ff;
}
}
</style>

View File

@ -0,0 +1,135 @@
import { BasicColumn, FormSchema } from '@/components/Table';
import { h } from 'vue';
import { Tag } from 'ant-design-vue';
import { getChildrenTree } from '@/api/demo/system';
import { getLoad } from '@/api/sys/sysDataItemDetail';
export const code = '0000003'
export const columns: BasicColumn[] = [
{
title: '案件编号',
dataIndex: 'case_no',
width: 200,
},
{
title: '案件描述',
dataIndex: 'case_description',
width: 300,
},
{
title: '案件类型',
dataIndex: 'typename',
},
{
title: '县',
dataIndex: 'countyname',
},
{
title: '镇',
dataIndex: 'streetname',
},
{
title: '判读人',
dataIndex: 'identification_user',
},
{
title: '判读时间',
dataIndex: 'identification_time',
},
{
title: '状态',
dataIndex: 'checkstatus',
customRender: ({ record }) => {
const { checkstatus } = record;
if(checkstatus == '待审核'){
return h(Tag, { color: 'yellow' }, () => checkstatus);
}else if(checkstatus == '已审核'){
return h(Tag, { color: 'green' }, () => checkstatus);
}
return h(Tag, {}, () => checkstatus);
}
},
];
export const searchFormSchema: FormSchema[] = [
{
field: 'caseNo',
label: '案件编号',
component: 'Input',
colProps: { span: 5 },
componentProps: {
placeholder: '请输入名称/编号',
},
},
{
field: 'typename',
label:'案件类型',
component: 'ApiSelect',
colProps: { span: 4 },
componentProps: ({formModel}) => {
return {
api: getLoad,
params: { code: 'kctubanleixing' },
// 接口参数
resultField: 'result',
labelField: 'itemName',
valueField: 'itemValue',
};
},
},
{
field: 'countyid',
label:'县/区',
component: 'ApiSelect',
colProps: { span: 4 },
componentProps: ({ tableAction, formModel }) => {
return {
api: getChildrenTree,
params: { parentId: 371300 },
// 接口参数
resultField: 'result',
labelField: 'name',
valueField: 'id',
onChange: () => {
formModel.streetid = '';
},
};
},
},
{
field: 'streetid',
label:'乡镇/街道',
component: 'ApiSelect',
colProps: { span: 4 },
componentProps: ({ formModel }) => {
return {
api: formModel.countyid && getChildrenTree,
params: { parentId: formModel.countyid },
// 接口参数
resultField: 'result',
labelField: 'name',
valueField: 'id',
};
},
}
];
export const dictionary = {
_input_39: 'case_no',
_input_15: 'typename',
_input_16: 'case_description',
_input_3: 'countyid',
_input_10: 'streetid',
_input_ca1c543fcf014e6abdcb6d329d796cee: 'communityid',
_input_43: 'area',
_input_18fd0953784b4c35b9219bd6defaf376: 'gengdi_area',
_input_42fed651e58c4b5daf9868ff6a0da3b0: 'shengtaibaohuhongxian_area',
_input_520d1d8068f4492ea8c42ce9bb61b3cf: 'nongyongdi_area',
_input_039dd978de5c4176b2913eae5ba60844: 'yongjiujibennongtian_area',
_input_17: 'remark',
_input_4: 'lng',
_input_14: 'lat',
_input_44: 'identification_time',
_image_upload_369: 'casepic',
}

View File

@ -0,0 +1,78 @@
<template>
<PageWrapper dense contentFullHeight fixedHeight contentClass="flex">
<BasicTable class="w-4/4 xl:w-5/5" @register="registerTable">
<template #bodyCell="{ column, record }">
<template v-if="column.key === 'action'">
<TableAction
:actions="[
{
label: '详情',
onClick: () => {
handleAudit(record);
},
}
]"
/>
</template>
</template>
</BasicTable>
<a-modal width="75%" v-model:open="openModal" title="线索审核" :destroyOnClose="true" :footer="null">
<InfoModal :infoData="infoData.info" @handleOk="handleOk" :control="false"/>
</a-modal>
</PageWrapper>
</template>
<script lang="ts" setup>
import { nextTick, onMounted, ref } from 'vue';
import { BasicTable, useTable, TableAction } from '@/components/Table';
import { PageWrapper } from '@/components/Page';
import InfoModal from '../audit/InfoModal/index.vue'
import { columns, searchFormSchema } from './util';
import { MainLoadCaseInfoLists, MainGetCaseInfo } from '@/api/illegalmining/index';
const infoData = ref({})
const openModal = ref(false)
const [registerTable, { reload, expandAll}] = useTable({
title: '已关闭',
api: MainLoadCaseInfoLists,
columns,
rowKey: 'id',
formConfig: {
labelWidth: 120,
schemas: searchFormSchema,
},
striped: false,
//
showIndexColumn: false,
// 使
useSearchForm: true,
//
showTableSetting: true,
bordered: true,
beforeFetch(data) {
let params = {...data,nowStatus: '已关闭'}
return params
},
afterFetch(data) {
console.log('afterFetch', data);
},
actionColumn: {
width: 100,
title: '操作',
dataIndex: 'action',
},
handleSearchInfoFn(info) {
return info;
},
});
function handleAudit(record) {
MainGetCaseInfo({id: record.Id}).then(res => {
console.log(res)
infoData.value = res
openModal.value = true
})
}
const handleOk = () => {
console.log('infoData',infoData.value)
}
</script>

View File

@ -0,0 +1,113 @@
import { BasicColumn, FormSchema } from '@/components/Table';
import { h } from 'vue';
import { Tag } from 'ant-design-vue';
import { getChildrenTree } from '@/api/demo/system';
import { getLoad } from '@/api/sys/sysDataItemDetail';
export const columns: BasicColumn[] = [
{
title: '案件编号',
dataIndex: 'case_no',
width: 200,
},
{
title: '案件描述',
dataIndex: 'case_description',
width: 300,
},
{
title: '案件类型',
dataIndex: 'typename',
},
{
title: '县',
dataIndex: 'countyname',
},
{
title: '镇',
dataIndex: 'streetname',
},
{
title: '判读人',
dataIndex: 'identification_user',
},
{
title: '判读时间',
dataIndex: 'identification_time',
},
{
title: '状态',
dataIndex: 'checkstatus',
customRender: ({ record }) => {
const { checkstatus } = record;
if(checkstatus == '待审核'){
return h(Tag, { color: 'yellow' }, () => checkstatus);
}else if(checkstatus == '已审核'){
return h(Tag, { color: 'green' }, () => checkstatus);
}
return h(Tag, {}, () => checkstatus);
}
},
];
export const searchFormSchema: FormSchema[] = [
{
field: 'caseNo',
label: '案件编号',
component: 'Input',
colProps: { span: 5 },
componentProps: {
placeholder: '请输入名称/编号',
},
},
{
field: 'typename',
label:'案件类型',
component: 'ApiSelect',
colProps: { span: 4 },
componentProps: ({formModel}) => {
return {
api: getLoad,
params: { code: 'kctubanleixing' },
// 接口参数
resultField: 'result',
labelField: 'itemName',
valueField: 'itemValue',
};
},
},
{
field: 'countyid',
label:'县/区',
component: 'ApiSelect',
colProps: { span: 4 },
componentProps: ({ tableAction, formModel }) => {
return {
api: getChildrenTree,
params: { parentId: 371300 },
// 接口参数
resultField: 'result',
labelField: 'name',
valueField: 'id',
onChange: () => {
formModel.streetid = '';
},
};
},
},
{
field: 'streetid',
label:'乡镇/街道',
component: 'ApiSelect',
colProps: { span: 4 },
componentProps: ({ formModel }) => {
return {
api: formModel.countyid && getChildrenTree,
params: { parentId: formModel.countyid },
// 接口参数
resultField: 'result',
labelField: 'name',
valueField: 'id',
};
},
}
];

View File

@ -0,0 +1,81 @@
<template>
<PageWrapper dense contentFullHeight fixedHeight contentClass="flex">
<BasicTable class="w-4/4 xl:w-5/5" @register="registerTable">
<template #bodyCell="{ column, record }">
<template v-if="column.key === 'action'">
<TableAction
:actions="[
{
label: '详情',
onClick: () => {
handleAudit(record);
},
}
]"
/>
</template>
</template>
</BasicTable>
<a-modal width="75%" v-model:open="openModal" title="线索审核" :destroyOnClose="true" :footer="null">
<InfoModal :infoData="infoData.info" @handleOk="handleOk" @closeModal="closeModal" :control="false"/>
</a-modal>
</PageWrapper>
</template>
<script lang="ts" setup>
import { nextTick, onMounted, ref } from 'vue';
import { BasicTable, useTable, TableAction } from '@/components/Table';
import { PageWrapper } from '@/components/Page';
import InfoModal from '../mainaudit/InfoModal/index.vue'
import { columns, searchFormSchema } from './util';
import { MainLoadCaseInfoLists, MainGetCaseInfo } from '@/api/illegalmining/index';
const infoData = ref({})
const openModal = ref(false)
const [registerTable, { reload, expandAll}] = useTable({
title: '已审核',
api: MainLoadCaseInfoLists,
columns,
rowKey: 'id',
formConfig: {
labelWidth: 120,
schemas: searchFormSchema,
},
striped: false,
//
showIndexColumn: false,
// 使
useSearchForm: true,
//
showTableSetting: true,
bordered: true,
beforeFetch(data) {
let params = {...data,nowStatus: '已审核'}
return params
},
afterFetch(data) {
console.log('afterFetch', data);
},
actionColumn: {
width: 100,
title: '操作',
dataIndex: 'action',
},
handleSearchInfoFn(info) {
return info;
},
});
function handleAudit(record) {
MainGetCaseInfo({id: record.Id}).then(res => {
console.log(res)
infoData.value = res
openModal.value = true
})
}
const handleOk = () => {
console.log('infoData',infoData.value)
}
const closeModal = () => {
openModal.value = false
}
</script>

View File

@ -0,0 +1,113 @@
import { BasicColumn, FormSchema } from '@/components/Table';
import { h } from 'vue';
import { Tag } from 'ant-design-vue';
import { getChildrenTree } from '@/api/demo/system';
import { getLoad } from '@/api/sys/sysDataItemDetail';
export const columns: BasicColumn[] = [
{
title: '案件编号',
dataIndex: 'case_no',
width: 200,
},
{
title: '案件描述',
dataIndex: 'case_description',
width: 300,
},
{
title: '案件类型',
dataIndex: 'typename',
},
{
title: '县',
dataIndex: 'countyname',
},
{
title: '镇',
dataIndex: 'streetname',
},
{
title: '判读人',
dataIndex: 'identification_user',
},
{
title: '判读时间',
dataIndex: 'identification_time',
},
{
title: '状态',
dataIndex: 'checkstatus',
customRender: ({ record }) => {
const { checkstatus } = record;
if(checkstatus == '待审核'){
return h(Tag, { color: 'yellow' }, () => checkstatus);
}else if(checkstatus == '已审核'){
return h(Tag, { color: 'green' }, () => checkstatus);
}
return h(Tag, {}, () => checkstatus);
}
},
];
export const searchFormSchema: FormSchema[] = [
{
field: 'caseNo',
label: '案件编号',
component: 'Input',
colProps: { span: 5 },
componentProps: {
placeholder: '请输入名称/编号',
},
},
{
field: 'typename',
label:'案件类型',
component: 'ApiSelect',
colProps: { span: 4 },
componentProps: ({formModel}) => {
return {
api: getLoad,
params: { code: 'kctubanleixing' },
// 接口参数
resultField: 'result',
labelField: 'itemName',
valueField: 'itemValue',
};
},
},
{
field: 'countyid',
label:'县/区',
component: 'ApiSelect',
colProps: { span: 4 },
componentProps: ({ tableAction, formModel }) => {
return {
api: getChildrenTree,
params: { parentId: 371300 },
// 接口参数
resultField: 'result',
labelField: 'name',
valueField: 'id',
onChange: () => {
formModel.streetid = '';
},
};
},
},
{
field: 'streetid',
label:'乡镇/街道',
component: 'ApiSelect',
colProps: { span: 4 },
componentProps: ({ formModel }) => {
return {
api: formModel.countyid && getChildrenTree,
params: { parentId: formModel.countyid },
// 接口参数
resultField: 'result',
labelField: 'name',
valueField: 'id',
};
},
}
];

View File

@ -0,0 +1,381 @@
<template>
<div class="modal-content">
<div class="row">
<div class="item">
<div class="label">案件编号</div>
<div class="item-value" style="flex:2">
<a-input v-model:value="props.infoData.case_no" disabled/>
</div>
</div>
<div class="item">
<div class="label">案件类型</div>
<div class="item-value">
<a-select
style="width: 100%"
v-model:value="props.infoData.typename"
:options="typenameOptions"
placeholder="请选择案件类型" disabled/>
</div>
</div>
<div class="item" style="flex:2">
<div class="label">案件详情</div>
<div class="item-value" style="flex:3">
<a-input v-model:value="props.infoData.case_description" disabled/>
</div>
</div>
</div>
<div class="row">
<div class="item">
<div class="label">/</div>
<div class="item-value">
<a-select
style="width: 100%"
v-model:value="props.infoData.countyid"
:options="countyOptions"
placeholder="请选择县/区" disabled/>
</div>
</div>
<div class="item">
<div class="label">乡镇/街道</div>
<div class="item-value">
<a-select
style="width: 100%"
v-model:value="props.infoData.streetid"
:options="streetOptions"
placeholder="请选择乡镇/街道" disabled/>
</div>
</div>
<div class="item">
<div class="label">社区/</div>
<div class="item-value">
<a-select
style="width: 100%"
v-model:value="props.infoData.communityid"
:options="communityOptions"
placeholder="请选择社区/村" disabled/>
</div>
</div>
<div class="item">
<div class="label">详细地址</div>
<div class="item-value" style="flex:2">
<a-input v-model:value="props.infoData.address" disabled/>
</div>
</div>
</div>
<div class="row">
<div class="item">
<div class="label">图斑面积</div>
<div class="item-value">
<a-input v-model:value="props.infoData.area" disabled/>
</div>
</div>
<div class="item">
<div class="label">耕地面积</div>
<div class="item-value">
<a-input v-model:value="props.infoData.gengdi_area" disabled/>
</div>
</div>
<div class="item">
<div class="label">占重点区域面积</div>
<div class="item-value">
<a-input v-model:value="props.infoData.zhongdianquyu_area" disabled/>
</div>
</div>
<div class="item">
<div class="label">占生态红线面积</div>
<div class="item-value">
<a-input v-model:value="props.infoData.shengtaibaohuhongxian_area" disabled/>
</div>
</div>
</div>
<div class="row">
<div class="item">
<div class="label">占空间规划面积</div>
<div class="item-value">
<a-input v-model:value="props.infoData.guotukongjianguihua_area" disabled/>
</div>
</div>
<div class="item">
<div class="label">占农用地面积</div>
<div class="item-value">
<a-input v-model:value="props.infoData.nongyongdi_area" disabled/>
</div>
</div>
<div class="item" style="flex:2">
<div class="label">占永久基本农田面积</div>
<div class="item-value">
<a-input v-model:value="props.infoData.yongjiujibennongtian_area" disabled/>
</div>
<div style="flex:2"></div>
</div>
</div>
<div class="row">
<div class="item">
<div class="label">前影像名称</div>
<div class="item-value" style="flex:2">
<a-input v-model:value="props.infoData.pre_phase_img" disabled />
</div>
</div>
<div class="item">
<div class="label">前时相时间</div>
<div class="item-value" style="flex:2">
<a-input v-model:value="props.infoData.pre_phase_time" disabled/>
</div>
</div>
<div class="item">
<div class="label">备注</div>
<div class="item-value" style="flex:2">
<a-input v-model:value="props.infoData.remark" disabled/>
</div>
</div>
</div>
<div class="row">
<div class="item">
<div class="label">后影像名称</div>
<div class="item-value" style="flex:2">
<a-input v-model:value="props.infoData.later_phase_img" disabled/>
</div>
</div>
<div class="item">
<div class="label">后时相时间</div>
<div class="item-value" style="flex:2">
<a-input v-model:value="props.infoData.later_phase_time" disabled/>
</div>
</div>
<div class="item">
<div class="label">经纬度</div>
<div class="item-value" style="flex:2;display: flex">
<a-input id="lnglat" style="margin-right: 15px;" :value="`${props.infoData.lng},${props.infoData.lat}`" disabled/>
<a-button @click="copyText"></a-button>
<textarea id="copyText" style="position: absolute;left: -9999px;top: -9999px;" :value="`${props.infoData.lng},${props.infoData.lat}`"/>
</div>
</div>
</div>
<div class="row">
<div class="item">
<div class="label">判读人</div>
<div class="item-value" style="flex:2">
<a-input v-model:value="props.infoData.identification_user" disabled/>
</div>
</div>
<div class="item">
<div class="label">判读时间</div>
<div class="item-value" style="flex:2">
<a-input v-model:value="props.infoData.identification_time" disabled/>
</div>
</div>
<div class="item">
</div>
</div>
<div class="row">
<div class="item" style="width: 100%;">
<div class="label">图片</div>
<div style="flex:9;display:flex;">
<a-image-preview-group>
<div class="video-item" v-for="(item, index) in fileList" :key="index" style="display: inline-block;position:relative;">
<!-- <div v-if="!$attrs.disabled" class="video-delete-btn" @click="handlerDelete(index)">
<CloseOutlined />
</div> -->
<a-image :src="item.url" style="width:100px;height:100px;" />
</div>
</a-image-preview-group>
<!-- <Upload
list-type="picture-card"
:showUploadList="false"
:custom-request="customRequest"
@change="handleChange"
>
<div>
<plus-outlined />
<div style="margin-top: 8px">Upload</div>
</div>
</Upload> -->
</div>
</div>
</div>
<div class="footer">
<div class="button-div">
<a-button style="margin-right: 10px;" @click="emits('closeModal')"></a-button>
<a-button v-if="props.control" style="margin-right: 10px;" type="primary" class="danger-button" @click="emits('closeCase',props.infoData.id)">线</a-button>
<a-button v-if="props.control" style="margin-right: 10px;" type="primary" @click="submit"></a-button>
<a-button v-if="props.control" style="margin-right: 10px;" type="primary" class="danger-button" @click="reSubmit"></a-button>
<!-- <a-button v-if="props.control" type="primary"></a-button> -->
</div>
</div>
</div>
</template>
<script setup lang="ts">
import { defineProps, ref, watch, onMounted, defineEmits } from "vue"
import { PlusOutlined, CloseOutlined } from '@ant-design/icons-vue';
import { Upload, message } from 'ant-design-vue';
import { uploadFile } from '@/api/formrender/index';
import { getAppEnvConfig } from '@/utils/env';
import { getLoad } from '@/api/sys/sysDataItemDetail';
import { getChildrenTree } from '@/api/demo/system';
const props = defineProps(['infoData','control'])
const emits = defineEmits(['handleOk','closeModal','closeCase','reSubmit'])
const typenameOptions = ref([])
const countyOptions = ref([])
const streetOptions = ref([])
const communityOptions = ref([])
const fileList = ref<any>([])
const previewVisible = ref(false);
const previewImage = ref('');
const previewTitle = ref('');
onMounted(() => {
getLoad({code:'kctubanleixing'}).then(res => {
typenameOptions.value = res.map(item => {
return {
label: item.itemName,
value: item.itemValue
}
})
})
getChildrenTree({ parentId: 371300 }).then(res => {
countyOptions.value = res.map(item => {
return {
label: item.name,
value: item.id.toString(),
}
})
})
props.infoData.countyid && getChildrenTree({ parentId: props.infoData.countyid }).then(res => {
streetOptions.value = res.map(item => {
return {
label: item.name,
value: item.id.toString(),
}
})
})
props.infoData.streetid && getChildrenTree({ parentId: props.infoData.streetid }).then(res => {
communityOptions.value = res.map(item => {
return {
label: item.name,
value: item.id.toString(),
}
})
})
const { VITE_GLOB_API_URL } = getAppEnvConfig();
props.infoData.casepic && props.infoData.casepic.split(',').forEach(item => {
fileList.value.push({
uid: '-1',
name: item,
status: 'done',
url: VITE_GLOB_API_URL + '/' + item,
})
})
})
watch(() => fileList.value.length, (val) => {
props.infoData.casepic = fileList.value.map(item => item.name).join(',')
})
const handleChange = (info) => {
if (info.file.status !== 'uploading') {
}
if (info.file.status === 'done') {
} else if (info.file.status === 'error') {
}
};
const customRequest = (file) => {
console.log('handleCustomRequest',file)
const { VITE_GLOB_API_URL } = getAppEnvConfig();
const formData = new FormData()
formData.append('files', file.file)
uploadFile(formData).then(res => {
console.log(res)
fileList.value?.push({
uid: '-1',
name: res[0].filePath,
status: 'done',
url: VITE_GLOB_API_URL + '/' + res[0].filePath,
});
})
}
const handlePreview = () => {
}
const handleRemove = () => {
}
const handlerDelete = (index) => {
fileList.value.splice(index, 1);
}
const handlerPreviewImage = (url,list) => {
}
const submit = () => {
console.log('通过')
emits('handleOk')
}
const reSubmit = () => {
emits('reSubmit',props.infoData.original_case_no)
}
const copyText = () => {
const copyTextDom = document.getElementById('copyText')
console.log(copyTextDom)
if(copyTextDom){
copyTextDom.select()
document.execCommand('Copy');
message.success('复制成功')
}
}
</script>
<style lang="scss" scoped>
:deep(.ant-image){
margin-right: 10px;
margin-bottom: 10px;
}
.video-delete-btn {
position: absolute;
top: 0px;
right: 10px;
width: 30px;
height: 30px;
border-bottom-left-radius: 80%;
background: rgb(0 0 0 / 20%);
color: #fff;
line-height: 30px;
text-align: center;
z-index: 999;
}
.modal-content{
padding: 20px;
}
.row{
display: flex;
margin-bottom: 15px;
}
.select-width{
width:100%;
}
.item{
display: flex;
flex:1;
.label{
flex: 1;
padding: 0px 15px;
display: flex;
align-items: center;
justify-content: center;
}
.item-value{
padding: 0px 15px;
flex:1;
}
}
.button-div{
display: flex;
justify-content: flex-end;
.danger-button{
background: #ed6f6f;
&:hover{
background: #faa19d;
}
}
}
</style>

View File

@ -0,0 +1,225 @@
<template>
<PageWrapper dense contentFullHeight fixedHeight contentClass="flex">
<BasicTable class="w-4/4 xl:w-5/5" @register="registerTable">
<template #toolbar>
<!-- <a-button type="primary" @click="handleCreate"></a-button> -->
<a-upload
:accept="'.xlsx,.csv,.xls'"
:showUploadList="false"
:custom-request="customRequest"
>
<a-button type="primary">导入</a-button>
</a-upload>
</template>
<template #bodyCell="{ column, record }">
<template v-if="column.key === 'action'">
<TableAction
:actions="[
{
label: '审核',
onClick: () => {
handleAudit(record);
},
}
]"
/>
</template>
</template>
</BasicTable>
<a-modal width="75%" v-model:open="openModal" title="线索审核" :destroyOnClose="true" :footer="null">
<InfoModal
:infoData="infoData.info"
@handleOk="handleOk"
@closeModal="closeModal"
:control="true"
@closeCase="closeCase"
@reSubmit="reSubmit"/>
</a-modal>
</PageWrapper>
</template>
<script lang="ts" setup>
import { nextTick, onMounted, ref, h } from 'vue';
import { BasicTable, useTable, TableAction } from '@/components/Table';
import { PageWrapper } from '@/components/Page';
import InfoModal from './InfoModal/index.vue'
import { columns, searchFormSchema, dictionary, code } from './util';
import { getDetail } from '@/api/sys/WFSchemeInfo';
import { functionsaveForm, LoadFormScheme } from '@/api/demo/formScheme';
import { buildGUID } from '@/utils/uuid';
import { useUserStore } from '@/store/modules/user';
import { create, saveDraft, GetDraft } from '@/api/sys/WFProcess';
import { message, Modal, Input } from 'ant-design-vue';
import { SaveReSubmitInfo } from '@/api/demo/resubmit';
import { MainLoadCaseInfoLists, MainGetCaseInfo, MainCloseCaseInfo } from '@/api/illegalmining/index';
const userStore = useUserStore();
const userInfo = userStore.getUserInfo;
const infoData = ref({})
const openModal = ref(false)
const reSubmitRemark = ref("")
const [registerTable, { reload, expandAll}] = useTable({
title: '待审核',
api: MainLoadCaseInfoLists,
columns,
rowKey: 'id',
formConfig: {
labelWidth: 120,
schemas: searchFormSchema,
},
striped: false,
//
showIndexColumn: false,
// 使
useSearchForm: true,
//
showTableSetting: true,
bordered: true,
beforeFetch(data) {
let params = {...data,nowStatus: '待审核'}
return params
},
afterFetch(data) {
console.log('afterFetch', data);
},
actionColumn: {
width: 100,
title: '操作',
dataIndex: 'action',
},
handleSearchInfoFn(info) {
return info;
},
});
function handleAudit(record) {
MainGetCaseInfo({id: record.Id}).then(res => {
console.log(res)
infoData.value = res
openModal.value = true
})
}
const handleOk = async () => {
try {
const { id } = infoData.value.info
const checkValue = await GetDraft({id})
if(checkValue.process == null){
let data = await getDetail({ code });
let content = JSON.parse(data.scheme.content);
const currentNode = content.wfData.find((t) => t.type == 'bpmn:StartEvent');
let formVerison = currentNode.formVerison
let keyValue = ''
const schemaData = await LoadFormScheme({
schemeId: formVerison
});
const scheme = JSON.parse(schemaData.scheme);
scheme.formInfo.tabList.forEach((tabElement) => {
tabElement.schemas.forEach((element) => {
if (element.field == currentNode.formRelationId) {
keyValue = element.componentProps.fieldName;
}
});
});
let commit = {
schemeId: currentNode.formVerison,
pkey: keyValue,
pkeyValue: id,
};
let resultQuery = {
schemeCode: code,
userId: userInfo.id,
title: '',
processId: id,
InstanceInfo: JSON.stringify(commit),
};
await saveDraft(resultQuery);
resultQuery.schemeCode = '';
const result = await create(resultQuery);
if(result){
message.success('发起流程成功');
reload()
openModal.value = false
}else{
message.error('发起流程失败');
}
}else{
message.warning('该案件已发起流程');
}
} catch(err) {
console.log(err)
}
}
const closeModal = () => {
openModal.value = false
}
const closeCase = (id: string) => {
Modal.confirm({
title: '关闭案件',
content: '确定关闭该案件吗?',
onOk: async () => {
const result = await MainCloseCaseInfo(id)
if(result){
message.success('关闭案件成功');
reload()
openModal.value = false
}else{
message.error('关闭案件失败');
}
},
onCancel() {},
})
}
const reSubmit = (originalcaseno: string) => {
Modal.confirm({
title: '请输入复提原因',
content: h('input',{
class: 'reSubmitInput',
onChange: (e) => reSubmitRemark.value = e.target.value
}),
onOk: async () => {
console.log(reSubmitRemark.value)
const result = await SaveReSubmitInfo({ originalcaseno, remark: reSubmitRemark.value })
if(result){
message.success('复提成功');
reload()
openModal.value = false
}else{
message.error('复提失败');
}
reSubmitRemark.value = ''
},
onCancel() {
reSubmitRemark.value = ''
},
})
}
const customRequest = (file) => {
console.log('handleCustomRequest',file)
// const { VITE_GLOB_API_URL } = getAppEnvConfig();
const formData = new FormData()
formData.append('files', file.file)
// uploadFile(formData).then(res => {
// console.log(res)
// fileList.value?.push({
// uid: '-1',
// name: res[0].filePath,
// status: 'done',
// url: VITE_GLOB_API_URL + '/' + res[0].filePath,
// });
// })
}
</script>
<style lang="scss">
.reSubmitInput{
border: 1px solid;
width: 100%;
height: 35px;
border-radius: 5px;
padding: 0px 10px;
border-color: #000;
transition: 0.2s;
&:focus{
border-color: #6db8ff;
}
}
</style>

View File

@ -0,0 +1,135 @@
import { BasicColumn, FormSchema } from '@/components/Table';
import { h } from 'vue';
import { Tag } from 'ant-design-vue';
import { getChildrenTree } from '@/api/demo/system';
import { getLoad } from '@/api/sys/sysDataItemDetail';
export const code = '100001'
export const columns: BasicColumn[] = [
{
title: '案件编号',
dataIndex: 'case_no',
width: 200,
},
{
title: '案件描述',
dataIndex: 'case_description',
width: 300,
},
{
title: '案件类型',
dataIndex: 'typename',
},
{
title: '县',
dataIndex: 'countyname',
},
{
title: '镇',
dataIndex: 'streetname',
},
{
title: '判读人',
dataIndex: 'identification_user',
},
{
title: '判读时间',
dataIndex: 'identification_time',
},
{
title: '状态',
dataIndex: 'checkstatus',
customRender: ({ record }) => {
const { checkstatus } = record;
if(checkstatus == '待审核'){
return h(Tag, { color: 'yellow' }, () => checkstatus);
}else if(checkstatus == '已审核'){
return h(Tag, { color: 'green' }, () => checkstatus);
}
return h(Tag, {}, () => checkstatus);
}
},
];
export const searchFormSchema: FormSchema[] = [
{
field: 'caseNo',
label: '案件编号',
component: 'Input',
colProps: { span: 5 },
componentProps: {
placeholder: '请输入名称/编号',
},
},
{
field: 'typename',
label:'案件类型',
component: 'ApiSelect',
colProps: { span: 4 },
componentProps: ({formModel}) => {
return {
api: getLoad,
params: { code: 'kctubanleixing' },
// 接口参数
resultField: 'result',
labelField: 'itemName',
valueField: 'itemValue',
};
},
},
{
field: 'countyid',
label:'县/区',
component: 'ApiSelect',
colProps: { span: 4 },
componentProps: ({ tableAction, formModel }) => {
return {
api: getChildrenTree,
params: { parentId: 371300 },
// 接口参数
resultField: 'result',
labelField: 'name',
valueField: 'id',
onChange: () => {
formModel.streetid = '';
},
};
},
},
{
field: 'streetid',
label:'乡镇/街道',
component: 'ApiSelect',
colProps: { span: 4 },
componentProps: ({ formModel }) => {
return {
api: formModel.countyid && getChildrenTree,
params: { parentId: formModel.countyid },
// 接口参数
resultField: 'result',
labelField: 'name',
valueField: 'id',
};
},
}
];
export const dictionary = {
_input_39: 'case_no',
_input_15: 'typename',
_input_16: 'case_description',
_input_3: 'countyid',
_input_10: 'streetid',
_input_ca1c543fcf014e6abdcb6d329d796cee: 'communityid',
_input_43: 'area',
_input_18fd0953784b4c35b9219bd6defaf376: 'gengdi_area',
_input_42fed651e58c4b5daf9868ff6a0da3b0: 'shengtaibaohuhongxian_area',
_input_520d1d8068f4492ea8c42ce9bb61b3cf: 'nongyongdi_area',
_input_039dd978de5c4176b2913eae5ba60844: 'yongjiujibennongtian_area',
_input_17: 'remark',
_input_4: 'lng',
_input_14: 'lat',
_input_44: 'identification_time',
_image_upload_369: 'casepic',
}

View File

@ -0,0 +1,78 @@
<template>
<PageWrapper dense contentFullHeight fixedHeight contentClass="flex">
<BasicTable class="w-4/4 xl:w-5/5" @register="registerTable">
<template #bodyCell="{ column, record }">
<template v-if="column.key === 'action'">
<TableAction
:actions="[
{
label: '详情',
onClick: () => {
handleAudit(record);
},
}
]"
/>
</template>
</template>
</BasicTable>
<a-modal width="75%" v-model:open="openModal" title="线索审核" :destroyOnClose="true" :footer="null">
<InfoModal :infoData="infoData.info" @handleOk="handleOk" :control="false"/>
</a-modal>
</PageWrapper>
</template>
<script lang="ts" setup>
import { nextTick, onMounted, ref } from 'vue';
import { BasicTable, useTable, TableAction } from '@/components/Table';
import { PageWrapper } from '@/components/Page';
import InfoModal from '../audit/InfoModal/index.vue'
import { columns, searchFormSchema } from './util';
import { LoadCaseInfoLists, GetCaseInfo } from '@/api/illegalmining/index';
const infoData = ref({})
const openModal = ref(false)
const [registerTable, { reload, expandAll}] = useTable({
title: '已关闭',
api: LoadCaseInfoLists,
columns,
rowKey: 'id',
formConfig: {
labelWidth: 120,
schemas: searchFormSchema,
},
striped: false,
//
showIndexColumn: false,
// 使
useSearchForm: true,
//
showTableSetting: true,
bordered: true,
beforeFetch(data) {
let params = {...data,nowStatus: '已关闭'}
return params
},
afterFetch(data) {
console.log('afterFetch', data);
},
actionColumn: {
width: 100,
title: '操作',
dataIndex: 'action',
},
handleSearchInfoFn(info) {
return info;
},
});
function handleAudit(record) {
GetCaseInfo({id: record.Id}).then(res => {
console.log(res)
infoData.value = res
openModal.value = true
})
}
const handleOk = () => {
console.log('infoData',infoData.value)
}
</script>

View File

@ -0,0 +1,113 @@
import { BasicColumn, FormSchema } from '@/components/Table';
import { h } from 'vue';
import { Tag } from 'ant-design-vue';
import { getChildrenTree } from '@/api/demo/system';
import { getLoad } from '@/api/sys/sysDataItemDetail';
export const columns: BasicColumn[] = [
{
title: '案件编号',
dataIndex: 'case_no',
width: 200,
},
{
title: '案件描述',
dataIndex: 'case_description',
width: 300,
},
{
title: '案件类型',
dataIndex: 'typename',
},
{
title: '县',
dataIndex: 'countyname',
},
{
title: '镇',
dataIndex: 'streetname',
},
{
title: '判读人',
dataIndex: 'identification_user',
},
{
title: '判读时间',
dataIndex: 'identification_time',
},
{
title: '状态',
dataIndex: 'checkstatus',
customRender: ({ record }) => {
const { checkstatus } = record;
if(checkstatus == '待审核'){
return h(Tag, { color: 'yellow' }, () => checkstatus);
}else if(checkstatus == '已审核'){
return h(Tag, { color: 'green' }, () => checkstatus);
}
return h(Tag, {}, () => checkstatus);
}
},
];
export const searchFormSchema: FormSchema[] = [
{
field: 'caseNo',
label: '案件编号',
component: 'Input',
colProps: { span: 5 },
componentProps: {
placeholder: '请输入名称/编号',
},
},
{
field: 'typename',
label:'案件类型',
component: 'ApiSelect',
colProps: { span: 4 },
componentProps: ({formModel}) => {
return {
api: getLoad,
params: { code: 'kctubanleixing' },
// 接口参数
resultField: 'result',
labelField: 'itemName',
valueField: 'itemValue',
};
},
},
{
field: 'countyid',
label:'县/区',
component: 'ApiSelect',
colProps: { span: 4 },
componentProps: ({ tableAction, formModel }) => {
return {
api: getChildrenTree,
params: { parentId: 371300 },
// 接口参数
resultField: 'result',
labelField: 'name',
valueField: 'id',
onChange: () => {
formModel.streetid = '';
},
};
},
},
{
field: 'streetid',
label:'乡镇/街道',
component: 'ApiSelect',
colProps: { span: 4 },
componentProps: ({ formModel }) => {
return {
api: formModel.countyid && getChildrenTree,
params: { parentId: formModel.countyid },
// 接口参数
resultField: 'result',
labelField: 'name',
valueField: 'id',
};
},
}
];

View File

@ -0,0 +1,81 @@
<template>
<PageWrapper dense contentFullHeight fixedHeight contentClass="flex">
<BasicTable class="w-4/4 xl:w-5/5" @register="registerTable">
<template #bodyCell="{ column, record }">
<template v-if="column.key === 'action'">
<TableAction
:actions="[
{
label: '详情',
onClick: () => {
handleAudit(record);
},
}
]"
/>
</template>
</template>
</BasicTable>
<a-modal width="75%" v-model:open="openModal" title="线索审核" :destroyOnClose="true" :footer="null">
<InfoModal :infoData="infoData.info" @handleOk="handleOk" @closeModal="closeModal" :control="false"/>
</a-modal>
</PageWrapper>
</template>
<script lang="ts" setup>
import { nextTick, onMounted, ref } from 'vue';
import { BasicTable, useTable, TableAction } from '@/components/Table';
import { PageWrapper } from '@/components/Page';
import InfoModal from '../audit/InfoModal/index.vue'
import { columns, searchFormSchema } from './util';
import { LoadCaseInfoLists, GetCaseInfo } from '@/api/inspectionaudit/index';
const infoData = ref({})
const openModal = ref(false)
const [registerTable, { reload, expandAll}] = useTable({
title: '已审核',
api: LoadCaseInfoLists,
columns,
rowKey: 'id',
formConfig: {
labelWidth: 120,
schemas: searchFormSchema,
},
striped: false,
//
showIndexColumn: false,
// 使
useSearchForm: true,
//
showTableSetting: true,
bordered: true,
beforeFetch(data) {
let params = {...data,nowStatus: '已审核'}
return params
},
afterFetch(data) {
console.log('afterFetch', data);
},
actionColumn: {
width: 100,
title: '操作',
dataIndex: 'action',
},
handleSearchInfoFn(info) {
return info;
},
});
function handleAudit(record) {
GetCaseInfo({id: record.Id}).then(res => {
console.log(res)
infoData.value = res
openModal.value = true
})
}
const handleOk = () => {
console.log('infoData',infoData.value)
}
const closeModal = () => {
openModal.value = false
}
</script>

View File

@ -0,0 +1,113 @@
import { BasicColumn, FormSchema } from '@/components/Table';
import { h } from 'vue';
import { Tag } from 'ant-design-vue';
import { getChildrenTree } from '@/api/demo/system';
import { getLoad } from '@/api/sys/sysDataItemDetail';
export const columns: BasicColumn[] = [
{
title: '案件编号',
dataIndex: 'case_no',
width: 200,
},
{
title: '案件描述',
dataIndex: 'case_description',
width: 300,
},
{
title: '案件类型',
dataIndex: 'typename',
},
{
title: '县',
dataIndex: 'countyname',
},
{
title: '镇',
dataIndex: 'streetname',
},
{
title: '判读人',
dataIndex: 'identification_user',
},
{
title: '判读时间',
dataIndex: 'identification_time',
},
{
title: '状态',
dataIndex: 'checkstatus',
customRender: ({ record }) => {
const { checkstatus } = record;
if(checkstatus == '待审核'){
return h(Tag, { color: 'yellow' }, () => checkstatus);
}else if(checkstatus == '已审核'){
return h(Tag, { color: 'green' }, () => checkstatus);
}
return h(Tag, {}, () => checkstatus);
}
},
];
export const searchFormSchema: FormSchema[] = [
{
field: 'caseNo',
label: '案件编号',
component: 'Input',
colProps: { span: 5 },
componentProps: {
placeholder: '请输入名称/编号',
},
},
{
field: 'typename',
label:'案件类型',
component: 'ApiSelect',
colProps: { span: 4 },
componentProps: ({formModel}) => {
return {
api: getLoad,
params: { code: 'xcsjtblx' },
// 接口参数
resultField: 'result',
labelField: 'itemName',
valueField: 'itemValue',
};
},
},
{
field: 'countyid',
label:'县/区',
component: 'ApiSelect',
colProps: { span: 4 },
componentProps: ({ tableAction, formModel }) => {
return {
api: getChildrenTree,
params: { parentId: 371300 },
// 接口参数
resultField: 'result',
labelField: 'name',
valueField: 'id',
onChange: () => {
formModel.streetid = '';
},
};
},
},
{
field: 'streetid',
label:'乡镇/街道',
component: 'ApiSelect',
colProps: { span: 4 },
componentProps: ({ formModel }) => {
return {
api: formModel.countyid && getChildrenTree,
params: { parentId: formModel.countyid },
// 接口参数
resultField: 'result',
labelField: 'name',
valueField: 'id',
};
},
}
];

View File

@ -0,0 +1,381 @@
<template>
<div class="modal-content">
<div class="row">
<div class="item">
<div class="label">案件编号</div>
<div class="item-value" style="flex:2">
<a-input v-model:value="props.infoData.case_no" disabled/>
</div>
</div>
<div class="item">
<div class="label">案件类型</div>
<div class="item-value">
<a-select
style="width: 100%"
v-model:value="props.infoData.typename"
:options="typenameOptions"
placeholder="请选择案件类型" disabled/>
</div>
</div>
<div class="item" style="flex:2">
<div class="label">案件详情</div>
<div class="item-value" style="flex:3">
<a-input v-model:value="props.infoData.case_description" disabled/>
</div>
</div>
</div>
<div class="row">
<div class="item">
<div class="label">/</div>
<div class="item-value">
<a-select
style="width: 100%"
v-model:value="props.infoData.countyid"
:options="countyOptions"
placeholder="请选择县/区" disabled/>
</div>
</div>
<div class="item">
<div class="label">乡镇/街道</div>
<div class="item-value">
<a-select
style="width: 100%"
v-model:value="props.infoData.streetid"
:options="streetOptions"
placeholder="请选择乡镇/街道" disabled/>
</div>
</div>
<div class="item">
<div class="label">社区/</div>
<div class="item-value">
<a-select
style="width: 100%"
v-model:value="props.infoData.communityid"
:options="communityOptions"
placeholder="请选择社区/村" disabled/>
</div>
</div>
<div class="item">
<div class="label">详细地址</div>
<div class="item-value" style="flex:2">
<a-input v-model:value="props.infoData.address" disabled/>
</div>
</div>
</div>
<div class="row">
<div class="item">
<div class="label">图斑面积</div>
<div class="item-value">
<a-input v-model:value="props.infoData.area" disabled/>
</div>
</div>
<div class="item">
<div class="label">耕地面积</div>
<div class="item-value">
<a-input v-model:value="props.infoData.gengdi_area" disabled/>
</div>
</div>
<div class="item">
<div class="label">占重点区域面积</div>
<div class="item-value">
<a-input v-model:value="props.infoData.zhongdianquyu_area" disabled/>
</div>
</div>
<div class="item">
<div class="label">占生态红线面积</div>
<div class="item-value">
<a-input v-model:value="props.infoData.shengtaibaohuhongxian_area" disabled/>
</div>
</div>
</div>
<div class="row">
<div class="item">
<div class="label">占空间规划面积</div>
<div class="item-value">
<a-input v-model:value="props.infoData.guotukongjianguihua_area" disabled/>
</div>
</div>
<div class="item">
<div class="label">占农用地面积</div>
<div class="item-value">
<a-input v-model:value="props.infoData.nongyongdi_area" disabled/>
</div>
</div>
<div class="item" style="flex:2">
<div class="label">占永久基本农田面积</div>
<div class="item-value">
<a-input v-model:value="props.infoData.yongjiujibennongtian_area" disabled/>
</div>
<div style="flex:2"></div>
</div>
</div>
<div class="row">
<div class="item">
<div class="label">前影像名称</div>
<div class="item-value" style="flex:2">
<a-input v-model:value="props.infoData.pre_phase_img" disabled />
</div>
</div>
<div class="item">
<div class="label">前时相时间</div>
<div class="item-value" style="flex:2">
<a-input v-model:value="props.infoData.pre_phase_time" disabled/>
</div>
</div>
<div class="item">
<div class="label">备注</div>
<div class="item-value" style="flex:2">
<a-input v-model:value="props.infoData.remark" disabled/>
</div>
</div>
</div>
<div class="row">
<div class="item">
<div class="label">后影像名称</div>
<div class="item-value" style="flex:2">
<a-input v-model:value="props.infoData.later_phase_img" disabled/>
</div>
</div>
<div class="item">
<div class="label">后时相时间</div>
<div class="item-value" style="flex:2">
<a-input v-model:value="props.infoData.later_phase_time" disabled/>
</div>
</div>
<div class="item">
<div class="label">经纬度</div>
<div class="item-value" style="flex:2;display: flex">
<a-input id="lnglat" style="margin-right: 15px;" :value="`${props.infoData.lng},${props.infoData.lat}`" disabled/>
<a-button @click="copyText"></a-button>
<textarea id="copyText" style="position: absolute;left: -9999px;top: -9999px;" :value="`${props.infoData.lng},${props.infoData.lat}`"/>
</div>
</div>
</div>
<div class="row">
<div class="item">
<div class="label">判读人</div>
<div class="item-value" style="flex:2">
<a-input v-model:value="props.infoData.identification_user" disabled/>
</div>
</div>
<div class="item">
<div class="label">判读时间</div>
<div class="item-value" style="flex:2">
<a-input v-model:value="props.infoData.identification_time" disabled/>
</div>
</div>
<div class="item">
</div>
</div>
<div class="row">
<div class="item" style="width: 100%;">
<div class="label">图片</div>
<div style="flex:9;display:flex;">
<a-image-preview-group>
<div class="video-item" v-for="(item, index) in fileList" :key="index" style="display: inline-block;position:relative;">
<!-- <div v-if="!$attrs.disabled" class="video-delete-btn" @click="handlerDelete(index)">
<CloseOutlined />
</div> -->
<a-image :src="item.url" style="width:100px;height:100px;" />
</div>
</a-image-preview-group>
<!-- <Upload
list-type="picture-card"
:showUploadList="false"
:custom-request="customRequest"
@change="handleChange"
>
<div>
<plus-outlined />
<div style="margin-top: 8px">Upload</div>
</div>
</Upload> -->
</div>
</div>
</div>
<div class="footer">
<div class="button-div">
<a-button style="margin-right: 10px;" @click="emits('closeModal')"></a-button>
<a-button v-if="props.control" style="margin-right: 10px;" type="primary" class="danger-button" @click="emits('closeCase',props.infoData.id)">线</a-button>
<a-button v-if="props.control" style="margin-right: 10px;" type="primary" @click="submit"></a-button>
<a-button v-if="props.control" style="margin-right: 10px;" type="primary" class="danger-button" @click="reSubmit"></a-button>
<!-- <a-button v-if="props.control" type="primary"></a-button> -->
</div>
</div>
</div>
</template>
<script setup lang="ts">
import { defineProps, ref, watch, onMounted, defineEmits } from "vue"
import { PlusOutlined, CloseOutlined } from '@ant-design/icons-vue';
import { Upload, message } from 'ant-design-vue';
import { uploadFile } from '@/api/formrender/index';
import { getAppEnvConfig } from '@/utils/env';
import { getLoad } from '@/api/sys/sysDataItemDetail';
import { getChildrenTree } from '@/api/demo/system';
const props = defineProps(['infoData','control'])
const emits = defineEmits(['handleOk','closeModal','closeCase','reSubmit'])
const typenameOptions = ref([])
const countyOptions = ref([])
const streetOptions = ref([])
const communityOptions = ref([])
const fileList = ref<any>([])
const previewVisible = ref(false);
const previewImage = ref('');
const previewTitle = ref('');
onMounted(() => {
getLoad({code:'xcsjtblx'}).then(res => {
typenameOptions.value = res.map(item => {
return {
label: item.itemName,
value: item.itemValue
}
})
})
getChildrenTree({ parentId: 371300 }).then(res => {
countyOptions.value = res.map(item => {
return {
label: item.name,
value: item.id.toString(),
}
})
})
props.infoData.countyid && getChildrenTree({ parentId: props.infoData.countyid }).then(res => {
streetOptions.value = res.map(item => {
return {
label: item.name,
value: item.id.toString(),
}
})
})
props.infoData.streetid && getChildrenTree({ parentId: props.infoData.streetid }).then(res => {
communityOptions.value = res.map(item => {
return {
label: item.name,
value: item.id.toString(),
}
})
})
const { VITE_GLOB_API_URL } = getAppEnvConfig();
props.infoData.casepic && props.infoData.casepic.split(',').forEach(item => {
fileList.value.push({
uid: '-1',
name: item,
status: 'done',
url: VITE_GLOB_API_URL + '/' + item,
})
})
})
watch(() => fileList.value.length, (val) => {
props.infoData.casepic = fileList.value.map(item => item.name).join(',')
})
const handleChange = (info) => {
if (info.file.status !== 'uploading') {
}
if (info.file.status === 'done') {
} else if (info.file.status === 'error') {
}
};
const customRequest = (file) => {
console.log('handleCustomRequest',file)
const { VITE_GLOB_API_URL } = getAppEnvConfig();
const formData = new FormData()
formData.append('files', file.file)
uploadFile(formData).then(res => {
console.log(res)
fileList.value?.push({
uid: '-1',
name: res[0].filePath,
status: 'done',
url: VITE_GLOB_API_URL + '/' + res[0].filePath,
});
})
}
const handlePreview = () => {
}
const handleRemove = () => {
}
const handlerDelete = (index) => {
fileList.value.splice(index, 1);
}
const handlerPreviewImage = (url,list) => {
}
const submit = () => {
console.log('通过')
emits('handleOk')
}
const reSubmit = () => {
emits('reSubmit',props.infoData.original_case_no)
}
const copyText = () => {
const copyTextDom = document.getElementById('copyText')
console.log(copyTextDom)
if(copyTextDom){
copyTextDom.select()
document.execCommand('Copy');
message.success('复制成功')
}
}
</script>
<style lang="scss" scoped>
:deep(.ant-image){
margin-right: 10px;
margin-bottom: 10px;
}
.video-delete-btn {
position: absolute;
top: 0px;
right: 10px;
width: 30px;
height: 30px;
border-bottom-left-radius: 80%;
background: rgb(0 0 0 / 20%);
color: #fff;
line-height: 30px;
text-align: center;
z-index: 999;
}
.modal-content{
padding: 20px;
}
.row{
display: flex;
margin-bottom: 15px;
}
.select-width{
width:100%;
}
.item{
display: flex;
flex:1;
.label{
flex: 1;
padding: 0px 15px;
display: flex;
align-items: center;
justify-content: center;
}
.item-value{
padding: 0px 15px;
flex:1;
}
}
.button-div{
display: flex;
justify-content: flex-end;
.danger-button{
background: #ed6f6f;
&:hover{
background: #faa19d;
}
}
}
</style>

View File

@ -0,0 +1,225 @@
<template>
<PageWrapper dense contentFullHeight fixedHeight contentClass="flex">
<BasicTable class="w-4/4 xl:w-5/5" @register="registerTable">
<template #toolbar>
<!-- <a-button type="primary" @click="handleCreate"></a-button> -->
<!-- <a-upload
:accept="'.xlsx,.csv,.xls'"
:showUploadList="false"
:custom-request="customRequest"
>
<a-button type="primary">导入</a-button>
</a-upload> -->
</template>
<template #bodyCell="{ column, record }">
<template v-if="column.key === 'action'">
<TableAction
:actions="[
{
label: '审核',
onClick: () => {
handleAudit(record);
},
}
]"
/>
</template>
</template>
</BasicTable>
<a-modal width="75%" v-model:open="openModal" title="线索审核" :destroyOnClose="true" :footer="null">
<InfoModal
:infoData="infoData.info"
@handleOk="handleOk"
@closeModal="closeModal"
:control="true"
@closeCase="closeCase"
@reSubmit="reSubmit"/>
</a-modal>
</PageWrapper>
</template>
<script lang="ts" setup>
import { nextTick, onMounted, ref, h } from 'vue';
import { BasicTable, useTable, TableAction } from '@/components/Table';
import { PageWrapper } from '@/components/Page';
import InfoModal from './InfoModal/index.vue'
import { columns, searchFormSchema, dictionary, code } from './util';
import { getDetail } from '@/api/sys/WFSchemeInfo';
import { functionsaveForm, LoadFormScheme } from '@/api/demo/formScheme';
import { buildGUID } from '@/utils/uuid';
import { useUserStore } from '@/store/modules/user';
import { create, saveDraft, GetDraft } from '@/api/sys/WFProcess';
import { message, Modal, Input } from 'ant-design-vue';
import { SaveReSubmitInfo } from '@/api/demo/resubmit';
import { LoadCaseInfoLists, GetCaseInfo, CloseCaseInfo } from '@/api/inspectionaudit/index';
const userStore = useUserStore();
const userInfo = userStore.getUserInfo;
const infoData = ref({})
const openModal = ref(false)
const reSubmitRemark = ref("")
const [registerTable, { reload, expandAll}] = useTable({
title: '待审核',
api: LoadCaseInfoLists,
columns,
rowKey: 'id',
formConfig: {
labelWidth: 120,
schemas: searchFormSchema,
},
striped: false,
//
showIndexColumn: false,
// 使
useSearchForm: true,
//
showTableSetting: true,
bordered: true,
beforeFetch(data) {
let params = {...data,nowStatus: '待审核'}
return params
},
afterFetch(data) {
console.log('afterFetch', data);
},
actionColumn: {
width: 100,
title: '操作',
dataIndex: 'action',
},
handleSearchInfoFn(info) {
return info;
},
});
function handleAudit(record) {
GetCaseInfo({id: record.Id}).then(res => {
console.log(res)
infoData.value = res
openModal.value = true
})
}
const handleOk = async () => {
try {
const { id } = infoData.value.info
const checkValue = await GetDraft({id})
if(checkValue.process == null){
let data = await getDetail({ code });
let content = JSON.parse(data.scheme.content);
const currentNode = content.wfData.find((t) => t.type == 'bpmn:StartEvent');
let formVerison = currentNode.formVerison
let keyValue = ''
const schemaData = await LoadFormScheme({
schemeId: formVerison
});
const scheme = JSON.parse(schemaData.scheme);
scheme.formInfo.tabList.forEach((tabElement) => {
tabElement.schemas.forEach((element) => {
if (element.field == currentNode.formRelationId) {
keyValue = element.componentProps.fieldName;
}
});
});
let commit = {
schemeId: currentNode.formVerison,
pkey: keyValue,
pkeyValue: id,
};
let resultQuery = {
schemeCode: code,
userId: userInfo.id,
title: '',
processId: id,
InstanceInfo: JSON.stringify(commit),
};
await saveDraft(resultQuery);
resultQuery.schemeCode = '';
const result = await create(resultQuery);
if(result){
message.success('发起流程成功');
reload()
openModal.value = false
}else{
message.error('发起流程失败');
}
}else{
message.warning('该案件已发起流程');
}
} catch(err) {
console.log(err)
}
}
const closeModal = () => {
openModal.value = false
}
const closeCase = (id: string) => {
Modal.confirm({
title: '关闭案件',
content: '确定关闭该案件吗?',
onOk: async () => {
const result = await CloseCaseInfo(id)
if(result){
message.success('关闭案件成功');
reload()
openModal.value = false
}else{
message.error('关闭案件失败');
}
},
onCancel() {},
})
}
const reSubmit = (originalcaseno: string) => {
Modal.confirm({
title: '请输入复提原因',
content: h('input',{
class: 'reSubmitInput',
onChange: (e) => reSubmitRemark.value = e.target.value
}),
onOk: async () => {
console.log(reSubmitRemark.value)
const result = await SaveReSubmitInfo({ originalcaseno, remark: reSubmitRemark.value })
if(result){
message.success('复提成功');
reload()
openModal.value = false
}else{
message.error('复提失败');
}
reSubmitRemark.value = ''
},
onCancel() {
reSubmitRemark.value = ''
},
})
}
const customRequest = (file) => {
console.log('handleCustomRequest',file)
// const { VITE_GLOB_API_URL } = getAppEnvConfig();
const formData = new FormData()
formData.append('files', file.file)
// uploadFile(formData).then(res => {
// console.log(res)
// fileList.value?.push({
// uid: '-1',
// name: res[0].filePath,
// status: 'done',
// url: VITE_GLOB_API_URL + '/' + res[0].filePath,
// });
// })
}
</script>
<style lang="scss">
.reSubmitInput{
border: 1px solid;
width: 100%;
height: 35px;
border-radius: 5px;
padding: 0px 10px;
border-color: #000;
transition: 0.2s;
&:focus{
border-color: #6db8ff;
}
}
</style>

View File

@ -0,0 +1,135 @@
import { BasicColumn, FormSchema } from '@/components/Table';
import { h } from 'vue';
import { Tag } from 'ant-design-vue';
import { getChildrenTree } from '@/api/demo/system';
import { getLoad } from '@/api/sys/sysDataItemDetail';
export const code = '0000002'
export const columns: BasicColumn[] = [
{
title: '案件编号',
dataIndex: 'case_no',
width: 200,
},
{
title: '案件描述',
dataIndex: 'case_description',
width: 300,
},
{
title: '案件类型',
dataIndex: 'typename',
},
{
title: '县',
dataIndex: 'countyname',
},
{
title: '镇',
dataIndex: 'streetname',
},
{
title: '判读人',
dataIndex: 'identification_user',
},
{
title: '判读时间',
dataIndex: 'identification_time',
},
{
title: '状态',
dataIndex: 'checkstatus',
customRender: ({ record }) => {
const { checkstatus } = record;
if(checkstatus == '待审核'){
return h(Tag, { color: 'yellow' }, () => checkstatus);
}else if(checkstatus == '已审核'){
return h(Tag, { color: 'green' }, () => checkstatus);
}
return h(Tag, {}, () => checkstatus);
}
},
];
export const searchFormSchema: FormSchema[] = [
{
field: 'caseNo',
label: '案件编号',
component: 'Input',
colProps: { span: 5 },
componentProps: {
placeholder: '请输入名称/编号',
},
},
{
field: 'typename',
label:'案件类型',
component: 'ApiSelect',
colProps: { span: 4 },
componentProps: ({formModel}) => {
return {
api: getLoad,
params: { code: 'xcsjtblx' },
// 接口参数
resultField: 'result',
labelField: 'itemName',
valueField: 'itemValue',
};
},
},
{
field: 'countyid',
label:'县/区',
component: 'ApiSelect',
colProps: { span: 4 },
componentProps: ({ tableAction, formModel }) => {
return {
api: getChildrenTree,
params: { parentId: 371300 },
// 接口参数
resultField: 'result',
labelField: 'name',
valueField: 'id',
onChange: () => {
formModel.streetid = '';
},
};
},
},
{
field: 'streetid',
label:'乡镇/街道',
component: 'ApiSelect',
colProps: { span: 4 },
componentProps: ({ formModel }) => {
return {
api: formModel.countyid && getChildrenTree,
params: { parentId: formModel.countyid },
// 接口参数
resultField: 'result',
labelField: 'name',
valueField: 'id',
};
},
}
];
export const dictionary = {
_input_39: 'case_no',
_input_15: 'typename',
_input_16: 'case_description',
_input_3: 'countyid',
_input_10: 'streetid',
_input_ca1c543fcf014e6abdcb6d329d796cee: 'communityid',
_input_43: 'area',
_input_18fd0953784b4c35b9219bd6defaf376: 'gengdi_area',
_input_42fed651e58c4b5daf9868ff6a0da3b0: 'shengtaibaohuhongxian_area',
_input_520d1d8068f4492ea8c42ce9bb61b3cf: 'nongyongdi_area',
_input_039dd978de5c4176b2913eae5ba60844: 'yongjiujibennongtian_area',
_input_17: 'remark',
_input_4: 'lng',
_input_14: 'lat',
_input_44: 'identification_time',
_image_upload_369: 'casepic',
}

View File

@ -0,0 +1,78 @@
<template>
<PageWrapper dense contentFullHeight fixedHeight contentClass="flex">
<BasicTable class="w-4/4 xl:w-5/5" @register="registerTable">
<template #bodyCell="{ column, record }">
<template v-if="column.key === 'action'">
<TableAction
:actions="[
{
label: '详情',
onClick: () => {
handleAudit(record);
},
}
]"
/>
</template>
</template>
</BasicTable>
<a-modal width="75%" v-model:open="openModal" title="线索审核" :destroyOnClose="true" :footer="null">
<InfoModal :infoData="infoData.info" @handleOk="handleOk" :control="false"/>
</a-modal>
</PageWrapper>
</template>
<script lang="ts" setup>
import { nextTick, onMounted, ref } from 'vue';
import { BasicTable, useTable, TableAction } from '@/components/Table';
import { PageWrapper } from '@/components/Page';
import InfoModal from '../audit/InfoModal/index.vue'
import { columns, searchFormSchema } from './util';
import { LoadCaseInfoLists, GetCaseInfo } from '@/api/inspectionaudit/index';
const infoData = ref({})
const openModal = ref(false)
const [registerTable, { reload, expandAll}] = useTable({
title: '已关闭',
api: LoadCaseInfoLists,
columns,
rowKey: 'id',
formConfig: {
labelWidth: 120,
schemas: searchFormSchema,
},
striped: false,
//
showIndexColumn: false,
// 使
useSearchForm: true,
//
showTableSetting: true,
bordered: true,
beforeFetch(data) {
let params = {...data,nowStatus: '已关闭'}
return params
},
afterFetch(data) {
console.log('afterFetch', data);
},
actionColumn: {
width: 100,
title: '操作',
dataIndex: 'action',
},
handleSearchInfoFn(info) {
return info;
},
});
function handleAudit(record) {
GetCaseInfo({id: record.Id}).then(res => {
console.log(res)
infoData.value = res
openModal.value = true
})
}
const handleOk = () => {
console.log('infoData',infoData.value)
}
</script>

View File

@ -0,0 +1,113 @@
import { BasicColumn, FormSchema } from '@/components/Table';
import { h } from 'vue';
import { Tag } from 'ant-design-vue';
import { getChildrenTree } from '@/api/demo/system';
import { getLoad } from '@/api/sys/sysDataItemDetail';
export const columns: BasicColumn[] = [
{
title: '案件编号',
dataIndex: 'case_no',
width: 200,
},
{
title: '案件描述',
dataIndex: 'case_description',
width: 300,
},
{
title: '案件类型',
dataIndex: 'typename',
},
{
title: '县',
dataIndex: 'countyname',
},
{
title: '镇',
dataIndex: 'streetname',
},
{
title: '判读人',
dataIndex: 'identification_user',
},
{
title: '判读时间',
dataIndex: 'identification_time',
},
{
title: '状态',
dataIndex: 'checkstatus',
customRender: ({ record }) => {
const { checkstatus } = record;
if(checkstatus == '待审核'){
return h(Tag, { color: 'yellow' }, () => checkstatus);
}else if(checkstatus == '已审核'){
return h(Tag, { color: 'green' }, () => checkstatus);
}
return h(Tag, {}, () => checkstatus);
}
},
];
export const searchFormSchema: FormSchema[] = [
{
field: 'caseNo',
label: '案件编号',
component: 'Input',
colProps: { span: 5 },
componentProps: {
placeholder: '请输入名称/编号',
},
},
{
field: 'typename',
label:'案件类型',
component: 'ApiSelect',
colProps: { span: 4 },
componentProps: ({formModel}) => {
return {
api: getLoad,
params: { code: 'xcsjtblx' },
// 接口参数
resultField: 'result',
labelField: 'itemName',
valueField: 'itemValue',
};
},
},
{
field: 'countyid',
label:'县/区',
component: 'ApiSelect',
colProps: { span: 4 },
componentProps: ({ tableAction, formModel }) => {
return {
api: getChildrenTree,
params: { parentId: 371300 },
// 接口参数
resultField: 'result',
labelField: 'name',
valueField: 'id',
onChange: () => {
formModel.streetid = '';
},
};
},
},
{
field: 'streetid',
label:'乡镇/街道',
component: 'ApiSelect',
colProps: { span: 4 },
componentProps: ({ formModel }) => {
return {
api: formModel.countyid && getChildrenTree,
params: { parentId: formModel.countyid },
// 接口参数
resultField: 'result',
labelField: 'name',
valueField: 'id',
};
},
}
];