基础框架修改内容同步

main
刘妍 3 months ago
parent 4a4c869dce
commit 383b09adf0

@ -1,206 +0,0 @@
// WFProcess 流程模版基本信息
import { defHttp } from '@/utils/http/axios';
import {
taskCountParams,
caseInfoParams,
countModel,
taskInfoParams,
addCaseFavoriteParams,
updateCaseInfoParams,
} from './model/index';
enum Api {
// 获取待办任务统计数据
LoadTaskCount = '/api/DroneCaseInfoSingle/LoadTaskCount',
// 获取图斑信息统计数据
LoadDroneCaseInfoCount = '/api/DroneCaseInfoSingle/LoadDroneCaseInfoCount',
// 分页获取图斑信息列表
LoadDroneCaseInfoDetail = '/api/DroneCaseInfoSingle/LoadTasklList',
// 分页获取任务信息列表
LoadTaskDetailList = '/api/DroneCaseInfoSingle/LoadTaskDetailList',
// 收藏图斑
AddCaseFavorite = '/api/DroneCaseInfoSingle/AddCaseFavorite',
// 获取收藏图斑列表
FavoriteCaseList = '/api/DroneCaseinfo/FavoriteCaseList',
DeleteFavoriteCase = '/api/DroneCaseInfoSingle/DeleteFavoriteCase',
// 获取图斑详情
GetCaseInfoById = '/api/DroneCaseInfoSingle/GetCaseInfoById',
// 更新图斑行政区划
UpdateDroneCaseInfo = '/api/DroneCaseInfoSingle/UpdateDroneCaseInfo',
// 督办流程
Supervise = '/api/WFProcess/Supervise',
// 获取部门父级
LoadParents = '/api/Orgs/LoadParents',
// 审核列表收藏
AddtaskFavorite = '/api/DroneCaseInfoSingle/AddtaskFavorite',
// 审核列表删除收藏
DeleteTaskCase = '/api/DroneCaseInfoSingle/DeleteTaskCase',
// 获取当前账号可以看见的乡镇
loadStreet = '/api/DroneCaseInfoSingle/loadStreet',
// 违法处理,待办任务列表
LoadTaskIllegalDetailList = '/api/DroneCaseInfoSingle/LoadTaskIllegalDetailList',
// 分割图斑
SplitCase = '/api/DroneCaseInfoSingle/CaseSplit',
// 恢复还原
RecoverCase = '/api/DroneCaseInfoSingle/CaseRecover',
// 获取图斑中心点
GetPolygonCenter = '/api/DroneCaseInfoSingle/GetCenterPoints',
// 获取用户访问机构权限
GetUserOrgs = '/api/Check/GetOrgs',
// 大屏下发图斑统计
IssuedStatitical = '/api/DroneScreenDisplay/CaseOffenceXiaFa',
// 大屏核实新增统计
VerifyStatitical = '/api/DroneScreenDisplay/CaseOffenceCheckAdd',
// 大屏整改剩余统计
RectificationStatitical = '/api/DroneScreenDisplay/CaseOffenceModifyRemain',
// 获取案件图片坐标、方位角信息
LoadCaseImgList = '/api/DroneCaseInfoSingle/LoadCaseImgList',
// 获取范围内影像服务信息
GetIntersects = '/api/GeoTiffManager/GetIntersects',
// 获取网络环境
GetNetWorkEev = '/api/DroneCloudQuery/IsPublic',
// 获取其他专题或历史图斑图片
rebackzhuantipic = '/api/DroneCaseInfoSingle/rebackzhuantipic',
CopyImg = '/api/DroneCaseInfoSingle/CopyImg',
// 获取其他专题或历史图斑附件
rebackzhuantifujian = '/api/DroneCaseInfoSingle/rebackzhuantifujian',
Copyfujian = '/api/DroneCaseInfoSingle/Copyfujian',
}
/**
* @description: getCaseFlowLog
*/
export function getLoadTaskCount(params?: taskCountParams) {
return defHttp.get<countModel>({ url: Api.LoadTaskCount, params });
}
export function getLoadStreet() {
return defHttp.get({ url: Api.loadStreet });
}
/**
* @description: getCaseFlowLog
*/
export function getLoadDroneCaseInfoCount(params?: taskCountParams) {
return defHttp.get<countModel>({ url: Api.LoadDroneCaseInfoCount, params });
}
/**
* @description: getCaseFlowLog
*/
export function getLoadDroneCaseInfoDetail(params?: caseInfoParams) {
return defHttp.get({ url: Api.LoadDroneCaseInfoDetail, params });
}
/**
* @description: getCaseFlowLog
*/
export function getLoadTaskDetailList(params?: taskInfoParams) {
return defHttp.get({ url: Api.LoadTaskDetailList, params });
}
export function addCaseFavorite(params?: addCaseFavoriteParams) {
return defHttp.post({ url: Api.AddCaseFavorite, params });
}
export function addTaskFavorite(params?: { taskId: string; favoriteUserId: string }) {
return defHttp.post({ url: Api.AddtaskFavorite, params });
}
export function deleteFavoriteCase(params: string) {
return defHttp.post({ url: Api.DeleteFavoriteCase, data: params });
}
export function deleteTaskCase(params: string) {
return defHttp.post({ url: Api.DeleteTaskCase, data: params });
}
export function getFavoriteCaseList(params?: { uid: string }) {
return defHttp.get({ url: Api.FavoriteCaseList, params });
}
export function getCaseInfoById(params?: { id: string }) {
return defHttp.get({ url: Api.GetCaseInfoById, params });
}
export const updateDroneCaseInfo = (params: updateCaseInfoParams) =>
defHttp.post({ url: Api.UpdateDroneCaseInfo, params });
export const updateSupervise = (params: { id: string; supervise: number }) =>
defHttp.post({ url: `${Api.Supervise}?id=${params.id}&supervise=${params.supervise}`, params });
export const getLoadParents = (params: { childId: Number }) =>
defHttp.get({ url: `${Api.LoadParents}?childId=${params.childId}` });
export function getLoadTaskIllegalDetailList(params?: taskInfoParams) {
return defHttp.get({ url: Api.LoadTaskIllegalDetailList, params });
}
export function splitCase(params) {
return defHttp.post({ url: Api.SplitCase, data: params });
}
export function recoverCase(params) {
return defHttp.post({ url: Api.RecoverCase, data: params });
}
export function getPolygonCenter(params) {
return defHttp.get({ url: Api.GetPolygonCenter, params });
}
export function getUserOrgs(params) {
return defHttp.get({ url: Api.GetUserOrgs, params });
}
export function getIssuedStatitical(params) {
return defHttp.get({
url: Api.IssuedStatitical,
params,
});
}
export function getVerifyStatitical(params) {
return defHttp.get({
url: Api.VerifyStatitical,
params,
});
}
export function getRectificationStatitical(params) {
return defHttp.get({
url: Api.RectificationStatitical,
params,
});
}
export function getLoadCaseImgList(params) {
return defHttp.get({
url: Api.LoadCaseImgList,
params,
});
}
export function getIntersectTif(params) {
return defHttp.get({ url: Api.GetIntersects, params });
}
export function getNetworkType() {
return defHttp.get({ url: Api.GetNetWorkEev });
}
export function rebackzhuantipic(params: { zhuanti; CaseId }) {
return defHttp.get({
url: Api.rebackzhuantipic,
params,
});
}
export function CopyImg(params: { caseid; images }) {
return defHttp.post({
url: Api.CopyImg,
data: params,
});
}
export function rebackzhuantifujian(params: { zhuanti; CaseId }) {
return defHttp.get({
url: Api.rebackzhuantifujian,
params,
});
}
export function Copyfujian(params: string[]) {
return defHttp.post({
url: Api.Copyfujian,
data: params,
});
}

@ -1,54 +0,0 @@
export interface taskCountParams {
year?: number;
}
export interface taskInfoParams {
page?: number;
limit?: number;
level?: number;
areaid?: string;
geomid?: string;
year?: number;
is_build_complete?: number;
}
export interface addCaseFavoriteParams {
id: string;
caseNo: string;
favoriteUserId: string;
}
export interface caseInfoParams {
page?: number;
limit?: number;
level?: number;
areaid?: string;
year?: number;
geomid?: string;
countyid?: string;
streetid?: string;
is_illegal?: number;
weifaleixing?: number;
measure_name?: string;
is_build_complete?: number;
handle_status_id?: number;
key?: string;
}
export interface countItem {
areaid: string;
areaname: string;
level: number;
count: number;
}
export type countModel = countItem[];
export interface updateCaseInfoParams {
id?: string;
countyid?: string;
countyname?: string;
streetid?: string;
streetname?: string;
communityid?: string;
communityname?: string;
}

@ -247,8 +247,8 @@
let oldDefaultGroupData = subTableDataStore.getOldDefaultGroupData;
let result = {};
Object.keys(data).forEach((key) => {
if (key.indexOf('_select') !== -1 || key.indexOf('_upload') !== -1) {
if(oldDefaultGroupData[key] != data[key]){
if (key.indexOf('_select') !== -1 || key.indexOf('_upload') !== -1 || key.indexOf('_date_picker') !== -1) {
if(oldDefaultGroupData[key] != data[key] && data[key]){
result[key] = data[key];
}
}

@ -3,7 +3,11 @@
<div v-show="tabsColumns.length > 1">
<a-tabs v-model:activeKey="activeTabsKey" style="width: 100%" @change="tabsChange">
<a-tab-pane v-for="(colItem, index) in tabsColumns" :tab="colItem.label" :key="index">
<BasicForm :ref="`tabsFormRef${index}`" @register="registerForm" :key="index">
<BasicForm
:ref="(el) => (tabsFormRefs[index] = el)"
@register="registerForm"
:key="index"
>
<template #CardGroup>
<CardGourp
v-if="cardGroupData.length > 0 && cardGroupData[index]"
@ -103,7 +107,9 @@
instanceInfo: Object,
issueId: String,
isDetail: Boolean,
noSubmit: Array<String>,
});
subTableDataStore.setInstance(props.instanceInfo);
const subTableId = ref(null);
const subTableColumns: any = ref([]);
const subTableDB = ref([]);
@ -120,6 +126,7 @@
const subTableRef = ref<any>();
const cardGroupData = ref([]);
const cardGourpFormData = ref({});
const tabsFormRefs = ref<any>([]);
subTableDataStore.clearGoupData();
const nowTime = ref(dayjs().format('YYYY-MM-DD HH:mm:ss'));
const userName = localStorage.getItem('fireUserLoginName');
@ -193,6 +200,12 @@
});
}
});
// id
if (element?.itemProps?.noSubmit) {
if (!props.noSubmit?.includes(element.field)) {
props.noSubmit?.push(element.field);
}
}
});
});
subTableColumns.value = [];
@ -267,22 +280,22 @@
// if (cardGroupData.value.length !== index) {
// cardGroupData.value.push(null);
// }
while(cardGroupData.value.length !== index){
while (cardGroupData.value.length !== index) {
cardGroupData.value.push(null);
}
let copyElement = {...element}
copyElement.componentProps.options.forEach(option => {
option.children.forEach(item => {
item['requiredString'] = item.itemProps.required? true: false
if(item.component == "CardGroup"){
item.componentProps.options.forEach(deepOption => {
deepOption.children.forEach(deepItem => {
deepItem['requiredString'] = deepItem.itemProps.required? true: false
})
})
let copyElement = { ...element };
copyElement.componentProps.options.forEach((option) => {
option.children.forEach((item) => {
item['requiredString'] = item.itemProps.required ? true : false;
if (item.component == 'CardGroup') {
item.componentProps.options.forEach((deepOption) => {
deepOption.children.forEach((deepItem) => {
deepItem['requiredString'] = deepItem.itemProps.required ? true : false;
});
});
}
})
})
});
});
cardGroupData.value.push(copyElement);
// cardGroupData.value.push({
// ...element,
@ -363,14 +376,18 @@
async function getFormDetail(element) {
var instance = props.instanceInfo;
if (!instance) return;
const querys = {
id: props.formVerison,
key: keyValue.value,
keyValue: instance.pkeyValue,
keyValue: !instance.parentPkeyValue ? instance.pkeyValue : instance.parentPkeyValue,
};
const data = await functionGetFormDataFormScheme(querys);
let obj = new Object();
for (var i in data) {
//
data[i] = [data[i][0]];
subTableDB.value.forEach((element) => {
if (element.type == 'chlid') {
subTableDataStore.getTableData.forEach((element) => {
@ -431,7 +448,7 @@
// todo
cardItemKeyList.forEach((item) => {
if (item.indexOf('grid') !== -1) {
cardValues.value[cardItem][item] = infoUseSubTableData.value;
cardValues.value[cardItem][item] = infoUseSubTableData.value.reverse();
}
});
});
@ -472,79 +489,21 @@
}
let resultObj = {};
let values;
switch (activeTabsKey.value) {
case 0:
resultObj = proxy.$refs.tabsFormRef0[0].getFieldsValue();
proxy.$refs.tabsFormRef0[0].setFieldsValue({
...resultObj,
...subTableDataStore.getGroupData,
});
await proxy.$refs.tabsFormRef0[0].validate();
values = proxy.$refs.tabsFormRef0[0].getFieldsValue();
break;
case 1:
resultObj = proxy.$refs.tabsFormRef1[0].getFieldsValue();
proxy.$refs.tabsFormRef1[0].setFieldsValue({
...resultObj,
...subTableDataStore.getGroupData,
});
await proxy.$refs.tabsFormRef1[0].validate();
values = proxy.$refs.tabsFormRef1[0].getFieldsValue();
console.log('resultValue111', JSON.parse(JSON.stringify(values)));
break;
case 2:
resultObj = proxy.$refs.tabsFormRef2[0].getFieldsValue();
proxy.$refs.tabsFormRef2[0].setFieldsValue({
...resultObj,
...subTableDataStore.getGroupData,
});
await proxy.$refs.tabsFormRef2[0].validate();
values = proxy.$refs.tabsFormRef2[0].getFieldsValue();
break;
case 3:
resultObj = proxy.$refs.tabsFormRef3[0].getFieldsValue();
proxy.$refs.tabsFormRef3[0].setFieldsValue({
...resultObj,
...subTableDataStore.getGroupData,
});
await proxy.$refs.tabsFormRef3[0].validate();
values = proxy.$refs.tabsFormRef3[0].getFieldsValue();
break;
case 4:
resultObj = proxy.$refs.tabsFormRef4[0].getFieldsValue();
proxy.$refs.tabsFormRef4[0].setFieldsValue({
...resultObj,
...subTableDataStore.getGroupData,
});
await proxy.$refs.tabsFormRef4[0].validate();
values = proxy.$refs.tabsFormRef4[0].getFieldsValue();
break;
case 5:
resultObj = proxy.$refs.tabsFormRef5[0].getFieldsValue();
proxy.$refs.tabsFormRef5[0].setFieldsValue({
...resultObj,
...subTableDataStore.getGroupData,
});
await proxy.$refs.tabsFormRef5[0].validate();
values = proxy.$refs.tabsFormRef5[0].getFieldsValue();
break;
case 6:
resultObj = proxy.$refs.tabsFormRef6[0].getFieldsValue();
proxy.$refs.tabsFormRef6[0].setFieldsValue({
...resultObj,
...subTableDataStore.getGroupData,
});
await proxy.$refs.tabsFormRef6[0].validate();
values = proxy.$refs.tabsFormRef6[0].getFieldsValue();
break;
default:
resultObj = getFieldsValue();
setFieldsValue({
...resultObj,
...subTableDataStore.getGroupData,
});
values = await validate();
break;
if (tabsColumns.length > 1) {
resultObj = tabsFormRefs[activeTabsKey.value].getFieldsValue();
tabsFormRefs[activeTabsKey.value].setFieldsValue({
...resultObj,
...subTableDataStore.getGroupData,
});
await tabsFormRefs[activeTabsKey.value].validate();
values = tabsFormRefs[activeTabsKey.value].getFieldsValue();
} else {
resultObj = getFieldsValue();
setFieldsValue({
...resultObj,
...subTableDataStore.getGroupData,
});
values = await validate();
}
for (const key in values) {
for (const fieKey in FieldsValue.value) {

@ -44,6 +44,11 @@ export default {
'Business rule task': '业务规则任务',
'Script task': '脚本任务',
'Call activity': '调用活动',
Transaction: '转运',
'Sub Process': '子流程',
'Sub-process': '子流程',
'Event Sub Process': '事件子流程',
'Event sub-process': '事件子流程',
'Sub-process (collapsed)': '子流程(已折叠)',
'Sub-process (expanded)': '子流程(扩大)',
'Intermediate throw event': '中间抛出事件',

@ -31,6 +31,13 @@
:pageType="props.pageType"
:class="data.currentWfNode.type == 'bpmn:SubProcess' ? '' : 'hidden'"
/>
<!-- 转运子流程 -->
<transaction-option
ref="transactionRef"
:element="data.currentWfNode"
:pageType="props.pageType"
:class="data.currentWfNode.type == 'bpmn:Transaction' ? '' : 'hidden'"
/>
<!-- 排他网关 -->
<exclusive-gateway-option
ref="exclusiveGatewayRef"
@ -105,6 +112,7 @@
subprocessOption,
mylineOption,
scriptOption,
transactionOption,
} from './page';
import { flowStore } from '@/store/modules/flow';
@ -140,6 +148,7 @@
const taskRef = ref<any>();
const endRef = ref<any>();
const subprocessRef = ref<any>();
const transactionRef = ref<any>();
const exclusiveGatewayRef = ref<any>();
const parallelGatewayRef = ref<any>();
const inclusiveGatewayRef = ref<any>();
@ -231,7 +240,7 @@
isInit: true,
formTitle: '',
issueCode: '',
mapConfig:{},
mapConfig: {},
};
break;
case 'bpmn:EndEvent':
@ -310,6 +319,13 @@
isInit: true,
};
break;
case 'bpmn:Transaction':
data.wfNodeName = '子流程转运';
data.currentWfNode = {
id: element.id,
type: element.type,
};
break;
case 'bpmn:ExclusiveGateway':
data.wfNodeName = '排他网关';
data.currentWfNode = {

@ -7,5 +7,6 @@ export { default as parallelGatewayOption } from './parallelGateway/index.vue';
export { default as exclusiveGatewayOption } from './exclusiveGateway/index.vue';
export { default as inclusiveGatewayOption } from './inclusiveGateway/index.vue';
export { default as subprocessOption } from './subprocess/index.vue';
export { default as transactionOption } from './transaction/index.vue';
export { default as mylineOption } from './myline/index.vue';
export { default as scriptOption } from './script/index.vue';

@ -0,0 +1,82 @@
<!-- 开始节点配置 -->
<template>
<div class="subprocess">
<a-form
ref="formRef"
:model="node"
labelAlign="left"
:label-col="labelCol"
:wrapper-col="wrapperCol"
:disabled="data.componentDisabled"
>
<a-form-item label="节点标识">
<a-input v-model:value="node.id" placeholder="请输入" readonly />
</a-form-item>
</a-form>
</div>
</template>
<script lang="ts" setup>
import { reactive, defineProps, ref, watch, onMounted } from 'vue';
import { getLoad, getVerisonsLoad } from '@/api/sys/WFSchemeInfo';
import { flowStore } from '@/store/modules/flow';
const flowWfDataStore = flowStore();
const labelCol = { span: 7 };
const wrapperCol = { span: 17 };
const props = defineProps({
element: {
type: Object,
default: () => {
return {};
},
},
schemeCode: String,
pageType: String,
pageView: String,
});
let node: any = ref({});
const data = reactive({
componentDisabled: props.pageType == 'detail' ? true : false,
});
const list: any = ref([]);
const verisons: any = ref([]);
watch(
() => props.element,
(newVal) => {
if (newVal.type == 'bpmn:Transaction') {
const currentNode = flowWfDataStore.getWfDataNode(newVal.id);
if (currentNode) {
node.value = currentNode;
} else {
node.value = newVal;
}
}
},
);
async function getSchemeList() {
const data = await getLoad();
list.value = data;
}
async function changeScheme() {
const data = await getVerisonsLoad({ id: node.value.wfschemeId });
verisons.value = data;
}
onMounted(() => {
getSchemeList();
if (props.element.type == 'bpmn:SubProcess') {
const currentNode = flowWfDataStore.getWfDataNode(props.element.id);
if (currentNode) {
node.value = currentNode;
} else {
node.value = props.element;
}
}
});
defineExpose({});
</script>
<style></style>

@ -1,6 +1,6 @@
<template>
<div>
<div style="display: flex;">
<div style="display: flex">
<UploadDragger
class="upload-file"
v-bind="$attrs"
@ -20,7 +20,6 @@
<p class="ant-upload-text">单击或拖动文件到此区域进行上传</p>
<p class="ant-upload-hint"> 支持单次或批量上传 </p>
</UploadDragger>
<div :class="`copy-other ${$attrs.disabled? 'copy-other-disabled': ''}`" @click="openSelectOther"></div>
</div>
<div class="file-item" v-for="(item, index) in fileList" :key="index">
@ -38,12 +37,6 @@
<Modal :open="previewOpen" :title="previewTitle" :footer="null" @cancel="handleCancel">
<img alt="" style="width: 100%" :src="previewImage" />
</Modal>
<a-modal v-model:open="openSelectOtherModal" title="历史举证" :footer="null" :destroyOnClose="true">
<FileUploadSelectOtherModal
:server="props.server"
@save="saveOtherFile"
/>
</a-modal>
</div>
</template>
@ -69,7 +62,7 @@
import { UploadResultStatus } from '@/components/Upload/src/types/typing';
import { fileUploadApi } from '@/api/sys/upload';
import axios from 'axios';
import FileUploadSelectOtherModal from './FileUploadSelectOtherModal.vue'
import FileUploadSelectOtherModal from './FileUploadSelectOtherModal.vue';
defineOptions({ name: 'ImageUpload' });
@ -77,7 +70,7 @@
const props = defineProps({
...uploadContainerProps,
});
const attrs = useAttrs()
const attrs = useAttrs();
const { t } = useI18n();
const { createMessage } = useMessage();
const { accept, helpText, maxNumber, maxSize } = toRefs(props);
@ -95,7 +88,6 @@
const fileList = ref<UploadProps['fileList']>([]);
const isLtMsg = ref<boolean>(true);
const isActMsg = ref<boolean>(true);
const openSelectOtherModal = ref(false)
watch(
() => props.value,
@ -144,48 +136,47 @@
},
);
const openFile = (url) => {
console.log(url)
if(url.indexOf('.pdf') !== -1){
console.log(url);
if (url.indexOf('.pdf') !== -1) {
axios({
method: 'get',
url: url,
responseType: 'blob',
headers: {
'Content-Disposition': 'inline',
}
})
.then(response => {
let blob = new Blob([response.data], {type: 'application/pdf'});
let pdfUrl = window.URL.createObjectURL(blob)
window.open(pdfUrl);
},
})
.catch(error => {
console.error(error);
});
}else{
.then((response) => {
let blob = new Blob([response.data], { type: 'application/pdf' });
let pdfUrl = window.URL.createObjectURL(blob);
window.open(pdfUrl);
})
.catch((error) => {
console.error(error);
});
} else {
window.open(url, '_blank');
}
}
};
function handlerDealFileName(path){
function handlerDealFileName(path) {
const regex = /([^/\\]+)(?=\.[^/\\]*$|$)/;
const matchStr = path.match(regex);
if(matchStr?.length){
if (matchStr?.length) {
return matchStr[0];
}
}
const showIcon = (url) => {
if(
url.indexOf('.png') !== -1 ||
url.indexOf('.pdf') !== -1 ||
url.indexOf('.jpg') !== -1 ||
if (
url.indexOf('.png') !== -1 ||
url.indexOf('.pdf') !== -1 ||
url.indexOf('.jpg') !== -1 ||
url.indexOf('.jpeg') !== -1
){
) {
return true;
}
return false
}
return false;
};
function getBase64<T extends string | ArrayBuffer | null>(file: File) {
return new Promise<T>((resolve, reject) => {
const reader = new FileReader();
@ -297,24 +288,6 @@
});
return path;
}
const openSelectOther = () => {
if(attrs.disabled) return
openSelectOtherModal.value = true
}
const saveOtherFile = (list:string[]) => {
const { server } = props;
list.forEach(item => {
fileList.value?.push({
uid: '-1',
name: item,
status: 'done',
url: server + '/' + item,
});
})
const value = getValue();
emit('change', value);
openSelectOtherModal.value = false
}
</script>
<style lang="less">
@ -347,26 +320,26 @@
}
</style>
<style lang="scss" scoped>
.upload-file{
width: calc(100% - 161px);
}
.copy-other{
width: 161px;
// height: 100px;
border: 1px dashed #d9d9d9;
background-color: rgba(0, 0, 0, 0.02);
cursor: pointer;
border-radius: 8px;
display: flex;
align-items: center;
justify-content: center;
margin-left: 10px;
}
.copy-other:hover{
border-color: #0960bd;
}
.copy-other-disabled{
cursor: no-drop;
border-color: #d9d9d9 !important;
}
.upload-file {
width: calc(100% - 161px);
}
.copy-other {
width: 161px;
// height: 100px;
border: 1px dashed #d9d9d9;
background-color: rgba(0, 0, 0, 0.02);
cursor: pointer;
border-radius: 8px;
display: flex;
align-items: center;
justify-content: center;
margin-left: 10px;
}
.copy-other:hover {
border-color: #0960bd;
}
.copy-other-disabled {
cursor: no-drop;
border-color: #d9d9d9 !important;
}
</style>

@ -1,152 +0,0 @@
<template>
<a-spin :spinning="loading">
<div class="modal-content">
<div class="subject" v-for="subject in fileList">
<div class="subject-name">{{ subject.zname }}</div>
<div class="show-file-div">
<div class="item-file" v-for="(item, index) in subject.val">
<a-checkbox
style="margin-right: 10px"
:checked="selectFile.some((obj) => obj === item.path)"
@change="changeSelect(selectFile.some((obj) => obj === item.path) ? 1 : 2, item.path)"
>
</a-checkbox>
<Icon
icon="material-symbols:attach-file"
:size="20"
style="cursor: pointer"
@click="hanlderPreViewFile(item.path)"
/>
{{ item.path }}
</div>
</div>
</div>
</div>
<div class="button-div">
<a-button type="primary" @click="save"></a-button>
</div>
<a-modal
v-model:open="previewFileModalVisible"
style="width: 100vw"
title="文件预览"
wrap-class-name="full-modal"
>
<FilePreview v-if="previewFileModalVisible" :fileUrl="previewFileUrl"></FilePreview>
<template #footer>
<a-button key="cancel" @click="handleCancelPreviewFile"></a-button>
<a-button key="confirm" type="primary" @click="handlerDownloadFle"></a-button>
</template>
</a-modal>
</a-spin>
</template>
<script setup lang="ts">
import { defineProps, onMounted, ref, defineEmits } from 'vue';
import { rebackzhuantifujian, Copyfujian } from '@/api/tiankongdi/index';
import Icon from '@/components/Icon/Icon.vue';
import { message } from 'ant-design-vue';
import { getZhuantiName } from '@/utils/global';
import FilePreview from '@/components/Upload/src/components/FilePreview.vue';
const props = defineProps(['server']);
const emits = defineEmits(['save']);
const fileList = ref<string[]>([]);
const selectFile = ref<string[]>([]);
const loading = ref(false);
const previewFileModalVisible = ref(false);
const previewFileUrl = ref('');
onMounted(() => {
loading.value = true;
let caseid = sessionStorage.getItem('SelectOtherId');
rebackzhuantifujian({ CaseId: caseid, zhuanti: getZhuantiName() })
.then((res) => {
console.log('res', res);
fileList.value = res;
})
.finally(() => {
loading.value = false;
});
});
const changeSelect = (type, item) => {
switch (type) {
case 1:
selectFile.value = selectFile.value.filter((useItem) => useItem !== item);
break;
case 2:
selectFile.value.push(item);
break;
}
};
const save = () => {
if (selectFile.value.length <= 0) {
message.warning('至少选择一个文件');
return;
}
loading.value = true;
Copyfujian(selectFile.value)
.then((res) => {
console.log(res);
emits('save', res);
})
.finally(() => {
loading.value = false;
});
};
const hanlderPreViewFile = (url) => {
previewFileUrl.value = `${props.server}/${url}`;
previewFileModalVisible.value = true;
};
const handlerDownloadFle = () => {
window.open(previewFileUrl.value, 'mozillaTab');
};
const handleCancelPreviewFile = () => {
previewFileModalVisible.value = false;
};
</script>
<style lang="scss" scoped>
.modal-content {
min-height: 500px;
padding: 0px 20px;
max-height: 678px;
overflow: auto;
scrollbar-width: none;
::-webkit-scrollbar {
width: 0;
height: 0;
}
.subject {
margin-bottom: 10px;
.subject-name {
height: 30px;
background-color: #8b8b8b;
display: flex;
align-items: center;
justify-content: center;
color: #fff;
font-size: 20px;
font-weight: 500;
margin-bottom: 10px;
}
.show-file-div {
width: 100%;
.item-file {
display: flex;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.item-file:hover {
background-color: #f4f4f4;
}
}
}
}
.button-div {
display: flex;
justify-content: end;
padding: 20px;
}
</style>

@ -1,22 +1,26 @@
<template>
<div style="display: flex;flex-wrap: wrap;width:880px;">
<div style="display: flex; flex-wrap: wrap; width: 880px">
<a-image-preview-group
ref="imageGroup"
:preview="{
getContainer:getContainer,
src:currentImageSrcUrl,
onVisibleChange:handlerImageChange
getContainer: getContainer,
src: currentImageSrcUrl,
onVisibleChange: handlerImageChange,
}"
@keydown.native.stop
>
<div v-for="(item, index) in fileList" :key="index" style="display: inline-block;position:relative;">
<div
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
style="width:100px;height:100px;"
style="width: 100px; height: 100px"
:src="item.url"
@click="handlerPreviewImage(item,index)"
@click="handlerPreviewImage(item, index)"
@keydown.native.stop
></a-image>
</div>
@ -39,16 +43,9 @@
<div style="margin-top: 8px">{{ t('component.upload.upload') }}</div>
</div>
</Upload>
<div v-if="!$attrs.disabled" class="copy-other" @click="openSelectOther"></div>
<!-- <Modal :open="previewOpen" :title="previewTitle" :footer="null" @cancel="handleCancel">
<img alt="" style="width: 100%" :src="previewImage" />
</Modal> -->
<a-modal v-model:open="openSelectOtherModal" title="历史举证" :footer="null" :destroyOnClose="true">
<ImageUploadSelectOtherModal
:server="props.server"
@save="saveOtherImage"
/>
</a-modal>
</div>
</template>
@ -70,20 +67,13 @@
import { fileUploadApi } from '@/api/sys/upload';
import ImagePreview from '@/components/Upload/src/components/image_preview.vue';
import { userFormFileStore } from '@/store/modules/formFileUrl';
import ImageUploadSelectOtherModal from './ImageUploadSelectOtherModal.vue'
import ImageUploadSelectOtherModal from './ImageUploadSelectOtherModal.vue';
const formFileStore = userFormFileStore();
const currentImageSrcUrl = ref<String>("");
onMounted(()=>{
})
const currentImageSrcUrl = ref<String>('');
onMounted(() => {});
defineOptions({ name: 'ImageUpload' });
@ -91,8 +81,6 @@
const props = defineProps({
...uploadContainerProps,
});
const openSelectOtherModal = ref(false)
const { t } = useI18n();
const { createMessage } = useMessage();
@ -178,7 +166,7 @@
// }
const handlePreview = async (file: UploadFile) => {
const { server,azimuth } = props;
const { server, azimuth } = props;
if (!file.url && !file.preview) {
// file.preview = await getBase64<string>(file.originFileObj!);
}
@ -202,11 +190,10 @@
const handlerDelete = (index) => {
fileList.value.splice(index, 1);
let value = getValue();
emit('change', value)
emit('change', value);
emit('update:value', value);
};
const handleRemove = async (file: UploadFile) => {
if (fileList.value) {
const index = fileList.value.findIndex((item) => item.uid === file.uid);
@ -302,57 +289,39 @@
const globalImagePreviewUrl = ref<Number>();
function handlerPreviewImage(item,index): void {
const { azimuth} = props;
function handlerPreviewImage(item, index): void {
const { azimuth } = props;
// if(azimuth){
globalImagePreviewUrl.value = index
globalImagePreviewUrl.value = index;
// }
// globalImagePreviewUrl.value = url + '?' + Math.random();
formFileStore.setUrl(item.url);
formFileStore.setUrlList(fileList)
formFileStore.setUrlList(fileList);
}
const isInitImageLisener = ref<Boolean>(false);
//
function handlerImageChange(e):void{
function handlerImageChange(e): void {
isInitImageLisener.value = false;
if (e && !isInitImageLisener.value) {
setTimeout(function () {
const targetNode = document.getElementsByClassName('ant-image-preview-img');
targetNode?.forEach((node,index)=>{
let imageObserver = new MutationObserver((mutationsList)=>{
for(const mutation of mutationsList){
if (node.getAttribute(mutation.attributeName).match('http')){
targetNode?.forEach((node, index) => {
let imageObserver = new MutationObserver((mutationsList) => {
for (const mutation of mutationsList) {
if (node.getAttribute(mutation.attributeName).match('http')) {
formFileStore.setUrl(node.getAttribute(mutation.attributeName));
}
}
})
});
const config = { attributes: true };
imageObserver.observe(node, config);
isInitImageLisener.value = true;
})
});
}, 250);
}
}
const openSelectOther = () => {
openSelectOtherModal.value = true
}
const saveOtherImage = (list:string[]) => {
const { server } = props;
list.forEach(item => {
fileList.value?.push({
uid: '-1',
name: item,
status: 'done',
url: server + '/' + item,
});
})
const value = getValue();
emit('change', value);
openSelectOtherModal.value = false
}
</script>
@ -426,12 +395,13 @@
transform: translate(-50%, -50%);
z-index: 999;
}
:deep(.ant-image){
:deep(.ant-image) {
margin-right: 10px;
margin-bottom: 10px;
}
#process-form-container{
width:50%;height:500px;
#process-form-container {
width: 50%;
height: 500px;
overflow: hidden;
float: left;
position: relative;
@ -448,19 +418,19 @@
position: absolute;
bottom: 0;
width: 100%;
.ant-image-preview-operations-operation{
.ant-image-preview-operations-operation {
// flex:1;
}
}
.ant-image-preview-operations-operation:nth-last-child(1){
.ant-image-preview-operations-operation:nth-last-child(1) {
display: none;
}
.ant-image-preview-operations-operation:nth-last-child(2){
}
.ant-image-preview-operations-operation:nth-last-child(2) {
display: none;
}
}
}
.copy-other{
.copy-other {
width: 100px;
height: 100px;
border: 1px dashed #d9d9d9;
@ -472,7 +442,7 @@
justify-content: center;
margin-left: 10px;
}
.copy-other:hover{
.copy-other:hover {
border-color: #0960bd;
}
</style>

@ -1,155 +0,0 @@
<template>
<a-spin :spinning="loading">
<div class="modal-content">
<div class="subject" v-for="subject in imageList">
<div class="subject-name">{{ subject.zname }}</div>
<div class="show-image-div">
<div class="image-item" v-for="(item, index) in subject.val">
<a-image
style="width: 100px; height: 100px"
:src="`${props.server}/${item.FilePath}`"
></a-image>
<div
class="select-div"
@click="
changeSelect(
selectImage.some((obj) => obj === item.FilePath) ? 1 : 2,
item.FilePath,
)
"
>
<Icon
v-if="selectImage.some((obj) => obj === item.FilePath)"
icon="material-symbols-light:check-circle"
:size="25"
style="color: #18a058"
/>
<Icon
v-else
icon="material-symbols-light:check-circle-outline"
:size="25"
style="color: #cacdcd"
/>
</div>
</div>
</div>
</div>
</div>
<div class="button-div">
<a-button type="primary" @click="save"></a-button>
</div>
</a-spin>
</template>
<script setup lang="ts">
import { defineProps, onMounted, ref, defineEmits } from 'vue';
import { rebackzhuantipic, CopyImg } from '@/api/tiankongdi/index';
import Icon from '@/components/Icon/Icon.vue';
import { message } from 'ant-design-vue';
import { getZhuantiName } from '@/utils/global';
const props = defineProps(['caseid', 'server', 'zhuanti']);
const emits = defineEmits(['save']);
const imageList = ref<string[]>([]);
const selectImage = ref<string[]>([]);
const loading = ref(false);
onMounted(() => {
loading.value = true;
let caseid = sessionStorage.getItem('SelectOtherId');
rebackzhuantipic({ CaseId: caseid, zhuanti: getZhuantiName() })
.then((res) => {
imageList.value = res;
})
.finally(() => {
loading.value = false;
});
});
const changeSelect = (type, item) => {
switch (type) {
case 1:
selectImage.value = selectImage.value.filter((useItem) => useItem !== item);
break;
case 2:
selectImage.value.push(item);
break;
}
};
const save = () => {
if (selectImage.value.length <= 0) {
message.warning('至少选择一张图片');
return;
}
loading.value = true;
let params = {
caseid: sessionStorage.getItem('SelectOtherId'),
images: selectImage.value,
};
CopyImg(params)
.then((res) => {
emits('save', res);
})
.finally(() => {
loading.value = false;
});
};
</script>
<style lang="scss" scoped>
.modal-content {
min-height: 500px;
padding: 0px 20px;
max-height: 678px;
overflow: auto;
scrollbar-width: none;
::-webkit-scrollbar {
width: 0;
height: 0;
}
.subject {
margin-bottom: 10px;
.subject-name {
height: 30px;
background-color: #8b8b8b;
display: flex;
align-items: center;
justify-content: center;
color: #fff;
font-size: 20px;
font-weight: 500;
margin-bottom: 10px;
}
.show-image-div {
width: 100%;
// height: 100%;
display: flex;
flex-wrap: wrap;
align-content: flex-start;
.image-item {
position: relative;
width: 100px;
height: 100px;
margin-right: 12px;
margin-bottom: 10px;
.select-div {
position: absolute;
bottom: 0px;
height: 20px;
width: 100%;
height: 30px;
background-color: #00000075;
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
}
}
}
}
}
.button-div {
display: flex;
justify-content: end;
padding: 20px;
}
</style>

@ -12,18 +12,7 @@ export const PAGE_NOT_FOUND_ROUTE: AppRouteRecordRaw = {
hideBreadcrumb: true,
hideMenu: true,
},
children: [
{
path: '/:path(.*)*',
name: PAGE_NOT_FOUND_NAME + '1',
component: EXCEPTION_COMPONENT,
meta: {
title: 'ErrorPage',
hideBreadcrumb: true,
hideMenu: true,
},
},
],
children: [],
};
export const REDIRECT_ROUTE: AppRouteRecordRaw = {

@ -32,6 +32,7 @@ export function getAppEnvConfig() {
: (window[ENV_NAME] as unknown as GlobEnvConfig);
const {
VITE_GLOB_APP_TITLE,
VITE_GLOB_APP_EN_TITLE,
VITE_GLOB_API_URL_PREFIX,
VITE_GLOB_UPLOAD_URL,
VITE_GLOB_APP_LOGO,
@ -49,6 +50,7 @@ export function getAppEnvConfig() {
}
return {
VITE_GLOB_APP_TITLE,
VITE_GLOB_APP_EN_TITLE,
VITE_GLOB_API_URL,
VITE_GLOB_API_URL_PREFIX,
VITE_GLOB_UPLOAD_URL,

@ -25,6 +25,13 @@
<FormItem label="是否开启位置跳转">
<Switch v-model:checked="formConfig.currentItem.mapSetData.isEnablePostionJump" />
</FormItem>
<FormItem label="控制属性" v-if="controlPropsList.length">
<Col v-for="item of controlPropsList" :key="item.name">
<Checkbox v-model:checked="formConfig.currentItem.itemProps[item.name]">
{{ item.label }}
</Checkbox>
</Col>
</FormItem>
</Form>
<Form
label-align="left"

@ -362,4 +362,10 @@ export const baseFormItemControlAttrs: IBaseFormItemControlAttrs[] = [
componentProps: {},
includes: ['Input'],
},
{
name: 'noSubmit',
label: '不提交数据',
component: 'Checkbox',
exclude: ['alert'],
},
];

@ -31,6 +31,10 @@
ref="formBoxRef"
:formConfig="formConfig"
:formVerison="designerData.formCurrentNode.formVerison"
:processId="designerData.process.id"
:formRelationId="designerData.formCurrentNode.formRelationId"
:instanceInfo="designerData.process.instanceInfo"
:noSubmit="noSubmit"
v-if="formVisble"
/>
</div>
@ -112,6 +116,7 @@
import { buildGUID } from '@/utils/uuid';
import { IFormConfig } from '@/views/demo/form-design/typings/v-form-component';
import { useMessage } from '@/hooks/web/useMessage';
import { getBPMNTask } from '@/api/sys/WFTask';
const MapboxMap = defineAsyncComponent(() => import('@/components/MapboxMaps/MapComponent.vue'));
const mapConfig = ref({});
@ -133,10 +138,14 @@
ParentNodeId: String,
ParentTaskId: String,
ParentProcessId: String,
type: Number,
taskId: String,
});
console.log(props, 'props');
const emit = defineEmits(['closeModel']);
const keyValue = ref('');
const pcForm = ref();
const noSubmit = ref<string[]>([])
//
const formConfig = ref<IFormConfig>({
//
@ -169,6 +178,7 @@
formVerison: '',
formCode: '',
formCurrentNode: {},
process: {},
});
const activeName = ref('form');
const formData = reactive({
@ -310,16 +320,25 @@
for (var item in res) {
if (res[item] == undefined) {
res[item] = '';
if (item.search('_input_guid') != -1) {
if (item.search('_input_guid') != -1 && res[item] == '') {
res[item] = buildGUID();
}
}
}
querys.data = JSON.stringify(res);
const formValue = await functionsaveForm(querys);
if (formValue) {
handleCreateFlow(processId);
}
setTimeout(async () => {
//
let resultQuery = {}
Object.keys(res).forEach(key => {
if(!noSubmit.value.includes(key)){
resultQuery[key] = res[key]
}
})
querys.data = JSON.stringify(resultQuery);
const formValue = await functionsaveForm(querys);
if (formValue) {
handleCreateFlow(processId);
}
},100)
}
})
.catch((error) => {
@ -413,7 +432,17 @@
onBeforeMount(() => {
getDetailInfo();
getDelegateUsers();
if (props.type == 3) {
getTaskInfo();
}
});
async function getTaskInfo() {
let query: any = {
id: props.taskId,
};
let data = await getBPMNTask(query);
designerData.process = data.process;
}
</script>
<style lang="less" scoped>
.preview-box {

@ -10,8 +10,10 @@
<div class="maper-container" v-if="mapConfig?.isShowMap">
<MapboxMap
:caseno="props.auditData.case_no || props.auditData.caseno"
:countyname="props.auditData.countyname"
:caseno="casenoValue"
:countyname="
props.auditData && props.auditData.countyname ? props.auditData.countyname : ''
"
:mapConfig="mapConfig"
:geomsList="geomsList"
@handlerDrawComplete="handlerDrawComplete"
@ -60,6 +62,7 @@
:formVerison="designerData.formCurrentNode.formVerison"
:formRelationId="designerData.formCurrentNode.formRelationId"
:instanceInfo="designerData.process.instanceInfo"
:noSubmit="noSubmit"
@getFormSuccess="getFormSuccess"
v-if="formVisble"
/>
@ -134,6 +137,7 @@
:formVerison="designerData.formCurrentNode.formVerison"
:formRelationId="designerData.formCurrentNode.formRelationId"
:instanceInfo="designerData.process.instanceInfo"
:noSubmit="noSubmit"
@getFormSuccess="getFormSuccess"
v-if="formVisble"
/>
@ -337,6 +341,15 @@
auditData: Object,
});
const casenoValue = () => {
if (props.auditData && props.auditData.case_no) {
return props.auditData.case_no;
} else if (props.auditData && props.auditData.caseno) {
return props.auditData.caseno;
} else {
return '';
}
};
const formData = ref({
des: '',
});
@ -413,6 +426,7 @@
bottom: '0px',
right: '0px',
});
const noSubmit = ref<string[]>([]);
function changeActive(activeKey) {
if (activeKey == 'flow') {
@ -434,7 +448,9 @@
caseid: props.processId,
category: flowCodeName(designerData.process.schemeCode),
});
MapboxComponent.value.handlerLoadPictureAzimuth(imageList.value);
if (MapboxComponent.value) {
MapboxComponent.value.handlerLoadPictureAzimuth(imageList.value);
}
}
async function getTaskInfo() {
@ -446,6 +462,9 @@
flowContent.value = data.flowContent;
flowViewer.value = data.flowViewer;
designerData.process = data.process;
if (data.process.isChild == 1) {
designerData.process.instanceInfo.parentPkeyValue = data.process.parentProcessId;
}
designerData.task = data.task;
let content = JSON.parse(data.scheme.content);
@ -487,7 +506,9 @@
}
getConfig({ code: 'mapsetting' }).then((res) => {
mapConfig.value = JSON.parse(res.codeValue);
if (res) {
mapConfig.value = JSON.parse(res.codeValue);
}
});
if (currentNode.authFields.length > 0) {
@ -766,7 +787,9 @@
schemeId: designerData.formCurrentNode.formVerison,
isUpdate: true,
pkey: instanceInfo.pkey,
pkeyValue: instanceInfo.pkeyValue,
pkeyValue: !instanceInfo.parentPkeyValue
? instanceInfo.pkeyValue
: instanceInfo.parentPkeyValue,
};
await formBoxRef.value
.getForm()
@ -789,7 +812,14 @@
}
console.log('审核提交');
setTimeout(async () => {
querys.data = JSON.stringify(res);
//
let resultQuery = {};
Object.keys(res).forEach((key) => {
if (!noSubmit.value.includes(key)) {
resultQuery[key] = res[key];
}
});
querys.data = JSON.stringify(resultQuery);
spinning.value = true;
const formValue = await functionsaveForm(querys);
spinning.value = false;
@ -1099,8 +1129,10 @@
onBeforeMount(() => {
getTaskInfo();
// ID session
sessionStorage.setItem('SelectOtherId',props.processId)
sessionStorage.setItem('SelectOtherZhuantiCode',props.auditData.processcode)
sessionStorage.setItem('SelectOtherId', props.processId);
if (props.auditData && props.auditData.processcode) {
sessionStorage.setItem('SelectOtherZhuantiCode', props.auditData.processcode);
}
});
function onFormContainerMouseOver(event) {}

@ -46,6 +46,8 @@
:ParentNodeId="childRecord.unitId"
:ParentTaskId="childRecord.id"
:ParentProcessId="childRecord.processId"
:type="childRecord.type"
:taskId="taskId"
@closeModel="closeMolder"
/>
</a-modal>
@ -160,6 +162,7 @@
if (record.type == 3) {
previewOpen.value = true;
childRecord.value = record;
taskId.value = record.id;
} else {
let data = await getDetail({ code: record.processCode });
let scheme = JSON.parse(data.scheme.content);

@ -30,7 +30,7 @@
height: `${50 * bi}px`,
}"
>
低空感知平台
{{VITE_GLOB_APP_TITLE}}
</span>
</a-row>
<a-row>
@ -43,7 +43,7 @@
opacity: `${0.3 * bi}`,
}"
>
Low-Altitude Perception Platform
{{VITE_GLOB_APP_EN_TITLE}}
</span>
</a-row>
</a-col>
@ -104,7 +104,7 @@
import { LoginStateEnum, useLoginState } from './useLogin';
const { getLoginState } = useLoginState();
import { getAppEnvConfig } from '@/utils/env';
const { VITE_GLOB_APP_MANAGEMENT_UNIT, VITE_GLOB_APP_TECHINICAL_SUPPORT } = getAppEnvConfig();
const { VITE_GLOB_APP_MANAGEMENT_UNIT, VITE_GLOB_APP_TECHINICAL_SUPPORT,VITE_GLOB_APP_EN_TITLE, VITE_GLOB_APP_TITLE } = getAppEnvConfig();
const isRegister = computed(() => unref(getLoginState) === LoginStateEnum.REGISTER);

1
types/config.d.ts vendored

@ -153,6 +153,7 @@ export interface GlobConfig {
export interface GlobEnvConfig {
// Site title
VITE_GLOB_APP_TITLE: string;
VITE_GLOB_APP_EN_TITLE: string;
// Service interface url
VITE_GLOB_API_URL: string;
// Service interface url prefix

Loading…
Cancel
Save