diff --git a/.env.development b/.env.development index c93d479..c5ff07d 100644 --- a/.env.development +++ b/.env.development @@ -10,7 +10,7 @@ VITE_PUBLIC_PATH = / # 如果接口地址匹配到,则会转发到http://localhost:3000,防止本地出现跨域问题 # 可以有多个,注意多个不能换行,否则代理将会失效 #VITE_PROXY = [["/api","http://localhost:3000"],["/upload","http://localhost:3300/upload"]] -VITE_PROXY=[["/api","http://back.ges.bjgastx.com"]] +VITE_PROXY=[["/api","http://127.0.0.1:8090"]] # 是否删除Console.log VITE_DROP_CONSOLE = false diff --git a/Dockerfile-arm64 b/Dockerfile-arm64 index 1d2285d..316d9ef 100644 --- a/Dockerfile-arm64 +++ b/Dockerfile-arm64 @@ -12,6 +12,6 @@ VOLUME ["/etc/nginx/nginx.conf", "/usr/share/nginx/html"] CMD ["nginx","-g","daemon off;"] -# docker build -t itc-web-arm64:1.0.0 . +# docker build -f Dockerfile-arm64 -t itc-web-arm64:1.0.0 . diff --git a/package.json b/package.json index c73234b..8d93e45 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "itc-framework", - "version": "2.0.4", + "version": "2.0.7", "author": { "name": "ITC", "email": "gdyditc@geg.com.cn", @@ -210,4 +210,4 @@ "prettier --write" ] } -} +} \ No newline at end of file diff --git a/src/App.vue b/src/App.vue index 81fc062..0eac3e7 100644 --- a/src/App.vue +++ b/src/App.vue @@ -55,7 +55,7 @@ return '关闭提示'; }; - if(!getAppEnvConfig().VITE_GLOB_CLOSE_ALERT_DISABLED){ + if(!import.meta.env.VITE_GLOB_CLOSE_ALERT_DISABLED){ window.addEventListener('beforeunload', beforeUnloadHandler); } @@ -79,3 +79,12 @@ line-height: 35px; } + diff --git a/src/api/system/Testfrom3/index.ts b/src/api/system/Testfrom3/index.ts new file mode 100644 index 0000000..4768741 --- /dev/null +++ b/src/api/system/Testfrom3/index.ts @@ -0,0 +1,110 @@ +import { Testfrom3PageModel, Testfrom3PageParams, Testfrom3PageResult } from './model/Testfrom3Model'; +import { defHttp } from '/@/utils/http/axios'; +import { ErrorMessageMode } from '/#/axios'; + +enum Api { + Page = '/system/testfrom3/page', + List = '/system/testfrom3/list', + Info = '/system/testfrom3/info', + Testfrom3 = '/system/testfrom3', + + + Export = '/system/testfrom3/export', +} + +/** + * @description: 查询Testfrom3分页列表 + */ +export async function getTestfrom3Page(params: Testfrom3PageParams, mode: ErrorMessageMode = 'modal') { + return defHttp.get( + { + url: Api.Page, + params, + }, + { + errorMessageMode: mode, + }, + ); +} + +/** + * @description: 获取Testfrom3信息 + */ +export async function getTestfrom3(id: String, mode: ErrorMessageMode = 'modal') { + return defHttp.get( + { + url: Api.Info, + params: { id }, + }, + { + errorMessageMode: mode, + }, + ); +} + +/** + * @description: 新增Testfrom3 + */ +export async function addTestfrom3(testfrom3: Recordable, mode: ErrorMessageMode = 'modal') { + return defHttp.post( + { + url: Api.Testfrom3, + params: testfrom3, + }, + { + errorMessageMode: mode, + }, + ); +} + +/** + * @description: 更新Testfrom3 + */ +export async function updateTestfrom3(testfrom3: Recordable, mode: ErrorMessageMode = 'modal') { + return defHttp.put( + { + url: Api.Testfrom3, + params: testfrom3, + }, + { + errorMessageMode: mode, + }, + ); +} + +/** + * @description: 删除Testfrom3(批量删除) + */ +export async function deleteTestfrom3(ids: string[], mode: ErrorMessageMode = 'modal') { + return defHttp.delete( + { + url: Api.Testfrom3, + data: ids, + }, + { + errorMessageMode: mode, + }, + ); +} + + + +/** + * @description: 导出Testfrom3 + */ +export async function exportTestfrom3( + params?: object, + mode: ErrorMessageMode = 'modal' +) { + return defHttp.download( + { + url: Api.Export, + method: 'GET', + params, + responseType: 'blob', + }, + { + errorMessageMode: mode, + }, + ); +} \ No newline at end of file diff --git a/src/api/system/Testfrom3/model/Testfrom3Model.ts b/src/api/system/Testfrom3/model/Testfrom3Model.ts new file mode 100644 index 0000000..f28dcf4 --- /dev/null +++ b/src/api/system/Testfrom3/model/Testfrom3Model.ts @@ -0,0 +1,32 @@ +import { BasicPageParams, BasicFetchResult } from '/@/api/model/baseModel'; + +/** + * @description: Testfrom3分页参数 模型 + */ +export interface Testfrom3PageParams extends BasicPageParams { + danXingWenBen5518: string; + + danXingWenBen5841: string; + + jiShuZuJian6835: string; +} + +/** + * @description: Testfrom3分页返回值模型 + */ +export interface Testfrom3PageModel { + id: string; + + danXingWenBen5518: string; + + danXingWenBen5841: string; + + jiShuZuJian6835: string; +} + +0; + +/** + * @description: Testfrom3分页返回值结构 + */ +export type Testfrom3PageResult = BasicFetchResult; \ No newline at end of file diff --git a/src/api/system/dataMigration/index.ts b/src/api/system/dataMigration/index.ts index af38afb..0e667d1 100644 --- a/src/api/system/dataMigration/index.ts +++ b/src/api/system/dataMigration/index.ts @@ -3,9 +3,11 @@ import { ErrorMessageMode } from '/#/axios'; enum Api { ExportDatas= '/system/dataMigration/exportDatas', + ImportDatas= '/system/dataMigration/importDatas', DownloadDatas='/system/dataMigration/downloadDatas', LogList='/system/dataMigration/logList', LogDetails='/system/dataMigration/logDetails', + GetUploadedData='/system/dataMigration/getUploadedData' } /** @@ -24,6 +26,38 @@ export async function exportDatas(params, mode: ErrorMessageMode = 'modal') { } +/** + * @description: 系统配置迁移-导入资源 + */ +export async function importDatas(params, mode: ErrorMessageMode = 'modal') { + return defHttp.post( + { + url: Api.ImportDatas+"/"+params.dirName, + data:params.data, + timeout: 5 * 60 * 1000, + }, + { + errorMessageMode: mode, + }, + ); +} + +/** + * @description: 获取上传的数据 + */ +export async function getUploadedData(params,mode: ErrorMessageMode = 'modal') { + return defHttp.get<[]>( + { + url: Api.GetUploadedData, + params + }, + { + errorMessageMode: mode, + }, + ); +} + + /** * @description: 根据uuid(目录名称)下载数据 */ diff --git a/src/api/system/file/index.ts b/src/api/system/file/index.ts index e6fa105..f172df7 100644 --- a/src/api/system/file/index.ts +++ b/src/api/system/file/index.ts @@ -1,13 +1,27 @@ import { defHttp } from '/@/utils/http/axios'; import { ErrorMessageMode } from '/#/axios'; -import { FilePageListParams, FilePageListSearchModel, FilePageListResultModel } from './model'; +import { FilePageListParams, FilePageListSearchModel, FilePageListResultModel, ZipFilesModel, FileModel } from './model'; enum Api { File = '/system/file', Info = '/system/file/info', + InfoByDownloadUrl = '/system/file/info-byDownloadUrl', List = '/system/file', Page = '/system/file/page', DeleteFile = '/system/file/delete-single', + ZipFiles = '/system/file/package-files', +} + +export async function getInfoByDownloadUrl(params: {id: string}, mode: ErrorMessageMode = 'modal') { + return defHttp.get( + { + url: Api.InfoByDownloadUrl, + params, + }, + { + errorMessageMode: mode, + }, + ); } /** @@ -73,6 +87,18 @@ export async function getFileList(params: FilePageListParams, mode: ErrorMessage ); } +export async function getZipFiles(params, mode: ErrorMessageMode = 'modal') { + return defHttp.get( + { + url: Api.ZipFiles, + params, + }, + { + errorMessageMode: mode, + }, + ); +} + export async function getAppToken(params, mode: ErrorMessageMode = 'modal') { return defHttp.get( { diff --git a/src/api/system/file/model/index.ts b/src/api/system/file/model/index.ts index 745419c..5543ac4 100644 --- a/src/api/system/file/model/index.ts +++ b/src/api/system/file/model/index.ts @@ -34,6 +34,17 @@ export interface FileModel { fileType: string; downloadCount: number; remark: string; + fileUrlFixed: string; //加签后的url +} + +/** + * 文件上传打包 返回模型 + */ +export interface ZipFilesModel { + url: string; + type: string; + msg: string; + name: string; } /** diff --git a/src/api/system/login/model/index.ts b/src/api/system/login/model/index.ts index 9eecbce..e6b0a96 100644 --- a/src/api/system/login/model/index.ts +++ b/src/api/system/login/model/index.ts @@ -8,7 +8,7 @@ export interface LoginParams { password: string; tenantCode: string; deviceType?: number; - captchaCode: string; + captchaCode?: string; } export interface RoleInfo { diff --git a/src/api/system/systemConfig/index.ts b/src/api/system/systemConfig/index.ts index 53f621f..26873fe 100644 --- a/src/api/system/systemConfig/index.ts +++ b/src/api/system/systemConfig/index.ts @@ -7,8 +7,6 @@ enum Api { List = '/system/systemConfig/list', Info = '/system/systemConfig/info', XjrSystemConfig = '/system/systemConfig', - - Export = '/system/systemConfig/export', } @@ -107,4 +105,5 @@ export async function exportXjrSystemConfig( errorMessageMode: mode, }, ); -} \ No newline at end of file +} + diff --git a/src/api/system/systemNotice/index.ts b/src/api/system/systemNotice/index.ts index 9183db8..aa5637a 100644 --- a/src/api/system/systemNotice/index.ts +++ b/src/api/system/systemNotice/index.ts @@ -1,14 +1,15 @@ import { XjrNoticePageModel, XjrNoticePageParams, XjrNoticePageResult } from './model/SystemNoticeModel'; import { defHttp } from '/@/utils/http/axios'; import { ErrorMessageMode } from '/#/axios'; +import { BasicPageParams } from "/@/api/model/baseModel"; enum Api { Page = '/system/systemNotice/page', List = '/system/systemNotice/list', Info = '/system/systemNotice/info', XjrNotice = '/system/systemNotice', - - + QueryLoginUserNotices = '/system/systemNotice/queryLoginUserNotices', + SetNoticeUserIsRead = '/system/systemNotice/setNoticeUserIsRead' } /** @@ -84,4 +85,36 @@ export async function deleteXjrNotice(ids: string[], mode: ErrorMessageMode = 'm errorMessageMode: mode, }, ); -} \ No newline at end of file +} + +/** + * 查询登录用户系统通知 + * @param params + * @param mode + */ +export async function queryLoginUserNotices(params: BasicPageParams, mode: ErrorMessageMode = 'modal') { + return defHttp.post( + { + url: Api.QueryLoginUserNotices, + params: params, + }, + { + errorMessageMode: mode, + showLoading: false + }, + ); +} + +/** + * 设置用户消息为已读状态 + * @param ids + * @param mode + */ +export async function setSystemNoticeRead(ids, mode: ErrorMessageMode = 'modal') { + return defHttp.post( + { url: Api.SetNoticeUserIsRead, params: {noticeIds: ids} }, + { + errorMessageMode: mode, + }, + ); +} diff --git a/src/api/system/tenant/index.ts b/src/api/system/tenant/index.ts index 0d5c1f9..1e4e021 100644 --- a/src/api/system/tenant/index.ts +++ b/src/api/system/tenant/index.ts @@ -11,6 +11,7 @@ enum Api { Status = '/system/tenant/status', Authorize = '/system/tenant/authorize', Switch = '/system/switch-tenant', + Export = '/system/tenant/export', } /** @@ -191,3 +192,25 @@ export async function changeTenant(tenantCode: String, mode: ErrorMessageMode = }, ); } + +/** + * @description:导出租户 + */ +export async function exportTenant( + params?: object, + mode: ErrorMessageMode = 'modal' +) { + return defHttp.download( + { + url: Api.Export, + params:{ + id:params.id + }, + method: 'GET', + responseType: 'blob', + }, + { + errorMessageMode: mode, + }, + ); +} diff --git a/src/api/system/user/index.ts b/src/api/system/user/index.ts index 1402da3..8acc01b 100644 --- a/src/api/system/user/index.ts +++ b/src/api/system/user/index.ts @@ -30,6 +30,8 @@ enum Api { Online = '/organization/user/online-users/page', OffOnline = '/organization/user/offline-users', Profile = '/organization/user/get-user-organization-info', + GetUserNamePrefix = '/organization/user/getUserNamePrefix', + getUserByDepartTree = '/organization/user/get-user-department-tree' } /** @@ -307,3 +309,33 @@ export async function getUserProfile(mode: ErrorMessageMode = 'modal') { }, ); } + +/** + * @description: 获取XjrSystemConfig用户名前缀 + */ +export async function getUserNamePrefix(mode: ErrorMessageMode = 'modal') { + return defHttp.get( + { + url: Api.GetUserNamePrefix + }, + { + errorMessageMode: mode + } + ); +} +/** + * @description: 将用户转化为departTree形式 + */ +export async function getUserByDepartTree(ids, mode: ErrorMessageMode = 'modal') { + return defHttp.post( + { + url: Api.getUserByDepartTree, + params: { + ids: ids + }, + }, + { + errorMessageMode: mode, + }, + ); +} diff --git a/src/api/workflow/task.ts b/src/api/workflow/task.ts index 5b6f425..7505cd9 100644 --- a/src/api/workflow/task.ts +++ b/src/api/workflow/task.ts @@ -38,6 +38,8 @@ enum Api { Withdraw = '/workflow/execute/my-task/withdraw', SetAssignee = '/workflow/execute/set-assignee', withdrawNode = '/workflow/execute/withdraw-node', + AddTask = '/workflow/adminOperation/add-task', + SubTask = '/workflow/adminOperation/sub-task', } /** @@ -272,6 +274,24 @@ export async function postSetSign( }, ); } +/** + * @description: 加签减签 + */ + +export async function postSetSignV2( + data, + mode: ErrorMessageMode = 'modal', +) { + return defHttp.post( + { + url: Api.SetSign, + params: data, + }, + { + errorMessageMode: mode, + }, + ); +} /** * @description: 转办 */ @@ -439,3 +459,33 @@ export async function getDrawNode(processId, mode: ErrorMessageMode = 'modal') { }, ); } +/** + * @description: 加签 + */ + +export async function postAddTask(params, mode: ErrorMessageMode = 'modal') { + return defHttp.post( + { + url: Api.AddTask, + params: params, + }, + { + errorMessageMode: mode, + }, + ); +} +/** + * @description: 减签 + */ + +export async function postSubTask(params, mode: ErrorMessageMode = 'modal') { + return defHttp.post( + { + url: Api.SubTask, + params: params, + }, + { + errorMessageMode: mode, + }, + ); +} diff --git a/src/components/CustomComponent/index.ts b/src/components/CustomComponent/index.ts new file mode 100644 index 0000000..d4590fe --- /dev/null +++ b/src/components/CustomComponent/index.ts @@ -0,0 +1,4 @@ +import { withInstall } from '/@/utils'; +import customComponent from './src/CustomComponent.vue'; +export const CustomComponent = withInstall(customComponent); + diff --git a/src/components/CustomComponent/src/CustomComponent.vue b/src/components/CustomComponent/src/CustomComponent.vue new file mode 100644 index 0000000..5c41c08 --- /dev/null +++ b/src/components/CustomComponent/src/CustomComponent.vue @@ -0,0 +1,60 @@ + + diff --git a/src/components/Designer/src/components/HiddenComponent.vue b/src/components/Designer/src/components/HiddenComponent.vue index 4eebe77..0b44b3e 100644 --- a/src/components/Designer/src/components/HiddenComponent.vue +++ b/src/components/Designer/src/components/HiddenComponent.vue @@ -37,7 +37,7 @@ - + diff --git a/src/components/Designer/src/components/componentProperty/PropertyOption.vue b/src/components/Designer/src/components/componentProperty/PropertyOption.vue index 3d64cd4..57ddcd2 100644 --- a/src/components/Designer/src/components/componentProperty/PropertyOption.vue +++ b/src/components/Designer/src/components/componentProperty/PropertyOption.vue @@ -18,7 +18,7 @@ - + {{ field.name }} @@ -467,6 +467,15 @@ + + + 单选 + 多选 + + diff --git a/src/components/Designer/src/types/index.ts b/src/components/Designer/src/types/index.ts index f69d0de..b8cdf30 100644 --- a/src/components/Designer/src/types/index.ts +++ b/src/components/Designer/src/types/index.ts @@ -247,6 +247,7 @@ export const advanceComponents = [ showSearch: false, clearable: false, disabled: false, + mode: 'multiple', staticOptions: [ { key: 1, diff --git a/src/components/Form/src/componentMap.ts b/src/components/Form/src/componentMap.ts index 5413b15..54e95f0 100644 --- a/src/components/Form/src/componentMap.ts +++ b/src/components/Form/src/componentMap.ts @@ -24,6 +24,7 @@ import SelectDepartment from './components/SelectDepartment.vue'; import SelectDepartmentV2 from './components/SelectDepartmentV2.vue'; import SelectUser from './components/SelectUser.vue'; import SelectUserV2 from './components/SelectUserV2.vue'; +import SelectUserShowTree from './components/SelectUserShowTree.vue'; import CommonInfo from './components/CommonInfo.vue'; import SelectArea from './components/SelectArea.vue'; import AutoCodeRule from './components/AutoCodeRule.vue'; @@ -66,6 +67,7 @@ import { XjrDatePicker } from '/@/components/DatePicker'; import { Slider } from '/@/components/Slider'; import { CodeTextArea } from '/@/components/Input'; import { OneForOne } from '/@/components/OneForOne'; +import { CustomComponent } from '/@/components/CustomComponent'; import SubForm from './components/SubFormV2.vue'; import ErpApply from './components/ErpApply.vue'; import ErpUpload from './components/ErpUpload.vue'; @@ -102,6 +104,7 @@ componentMap.set('Rate', Rate); componentMap.set('DeptTree', SelectDepartment); componentMap.set('Dept', SelectDepartmentV2); componentMap.set('User', SelectUserV2); +componentMap.set('UserTree', SelectUserShowTree); componentMap.set('Info', CommonInfo); componentMap.set('Area', SelectArea); componentMap.set('SubForm', SubForm); @@ -145,6 +148,7 @@ componentMap.set('ErpApply', ErpApply); componentMap.set('ErpUpload', ErpUpload); componentMap.set('ErpCheck', ErpCheck); componentMap.set('AutoComplete', AutoComplete); +componentMap.set('CustomComponent', CustomComponent); export function add(compName: ComponentType, component: Component) { componentMap.set(compName, component); diff --git a/src/components/Form/src/components/Readonly.vue b/src/components/Form/src/components/Readonly.vue index d69d8f7..6cddc14 100644 --- a/src/components/Form/src/components/Readonly.vue +++ b/src/components/Form/src/components/Readonly.vue @@ -1,12 +1,12 @@ - diff --git a/src/components/Form/src/components/SelectDepartmentV2.vue b/src/components/Form/src/components/SelectDepartmentV2.vue index f401ef3..6da631c 100644 --- a/src/components/Form/src/components/SelectDepartmentV2.vue +++ b/src/components/Form/src/components/SelectDepartmentV2.vue @@ -1,6 +1,9 @@ diff --git a/src/components/Form/src/components/SubFormV2Setup.vue b/src/components/Form/src/components/SubFormV2Setup.vue index 59f2bfd..78bcef8 100644 --- a/src/components/Form/src/components/SubFormV2Setup.vue +++ b/src/components/Form/src/components/SubFormV2Setup.vue @@ -168,6 +168,10 @@ type: Boolean, default: true }, + /** + * 按钮组 [{name: '按钮', click: function(){}}] + */ + buttons: Array, // 是否开启分页 showPagination: Boolean, /** @@ -197,6 +201,7 @@ const headColums = ref([]); // 多表头 const originHeads = ref([]); // 多表头源数据 const columns = ref(props.columns); + const allColumns = ref([]) // 注入表单数据 const formModel = inject('formModel', null); @@ -224,6 +229,9 @@ } function addDataKey(rows) { + if (!rows) { + return []; + } rows.forEach((row) => { if (!row['_key_']) { row['_key_'] = Math.random(); @@ -244,6 +252,7 @@ }); } setColWidth(columns); + allColumns.value = cloneDeep(columns.value) columns.value = filterColum(columns.value); nextTick(() => { //处理多表头 @@ -260,6 +269,7 @@ watch( () => props.columns, (val) => { + allColumns.value = cloneDeep(val) columns.value = filterColum(val); setColWidth(columns); } @@ -327,6 +337,29 @@ } }); } + const removeById = (id) => { + data.value = deleteNodeById(data.value, id); + }; + function deleteNodeById(tree, idToDelete) { + function deepCloneAndFilter(nodes) { + return nodes.map((node) => { + if (node.id === idToDelete) { + return null; // 当前节点要删除 + } + + // 递归处理 children + + const newChildren = node.children ? deepCloneAndFilter(node.children) : []; + + return { + ...node, + children: newChildren.length ? newChildren : undefined + }; + }).filter(Boolean); + } + + return deepCloneAndFilter(tree); + } const add = () => { //给各个组件赋默认值 @@ -364,17 +397,25 @@ } }; - const remove = (index) => { - data.value.splice(index, 1); - emit('change', unref(data)); - emit('update:value', unref(data)); + const remove = (record) => { + let index; + if (typeof record === 'number' || typeof record === 'string') { + index = Number(record); + } else { + index = data.value.findIndex((r) => r._key_ === record._key_); + } + if (index !== -1 && index < data.value.length) { + data.value.splice(index, 1); + emit('change', unref(data)); + emit('update:value', unref(data)); + } }; const renderSubFormList = async (list) => { list?.forEach((x) => { const dataObj = {}; - columns.value?.map((item) => { - if (!item?.dataIndex) return; + allColumns.value?.map((item) => { + if (!item?.dataIndex || !item.componentProps.isShow) return; dataObj[item.dataIndex as string] = item.componentProps?.prestrainField ? x[item.componentProps.prestrainField] : null; }); @@ -562,7 +603,8 @@ data, headColums, columns, - renderSubFormList + renderSubFormList, + removeById } } } diff --git a/src/components/Form/src/components/Upload.vue b/src/components/Form/src/components/Upload.vue index a2148e1..73b1bfd 100644 --- a/src/components/Form/src/components/Upload.vue +++ b/src/components/Form/src/components/Upload.vue @@ -48,7 +48,7 @@ + >
@@ -75,15 +75,45 @@
@@ -110,11 +140,11 @@ diff --git a/src/components/MultiplePopup/src/components/MultipleSelect.vue b/src/components/MultiplePopup/src/components/MultipleSelect.vue index 14de957..22a8b43 100644 --- a/src/components/MultiplePopup/src/components/MultipleSelect.vue +++ b/src/components/MultiplePopup/src/components/MultipleSelect.vue @@ -1,6 +1,6 @@