合同模块提交

This commit is contained in:
wangmingwei
2026-05-20 16:09:45 +08:00
parent 39cf1c9b1e
commit fccdf57954
28 changed files with 18569 additions and 8 deletions

View File

@@ -0,0 +1,169 @@
<template>
<BasicDrawer v-bind="$attrs" @register="registerDrawer" :title="title" width="600px" showFooter
:showOkBtn="false">
<template #insertFooter>
</template>
<a-row class="p-10px dynamic-form ">
<!-- 表单 -->
<a-form :colon="false" size="middle" layout= "horizontal"
labelAlign= "right"
:labelCol="{ style: { width: '100px' } }" :model="dataForm" ref="formRef" >
<a-row :gutter="15">
<!-- 具体表单 -->
<a-col :span="24" class="ant-col-item" >
<a-form-item
name="billing_item_code" >
<template #label>计费项目编码
</template> <YunzhupaasInput v-model:value="dataForm.billing_item_code"
placeholder="请输入" disabled
detailed allowClear :style='{"width":"100%"}' :maskConfig = "maskConfig.billing_item_code" >
</YunzhupaasInput>
</a-form-item>
</a-col>
<a-col :span="24" class="ant-col-item" >
<a-form-item
name="billing_item_name" >
<template #label>计费项目名称
</template> <YunzhupaasInput v-model:value="dataForm.billing_item_name"
placeholder="请输入" disabled
detailed allowClear :style='{"width":"100%"}' :maskConfig = "maskConfig.billing_item_name" >
</YunzhupaasInput>
</a-form-item>
</a-col>
<a-col :span="24" class="ant-col-item" >
<a-form-item
name="billing_item_type" >
<template #label>费用类别
</template> <p>{{dataForm.billing_item_type}}</p>
</a-form-item>
</a-col>
<a-col :span="24" class="ant-col-item" >
<a-form-item
name="remark" >
<template #label>备注
</template> <p>{{dataForm.remark}}</p>
</a-form-item>
</a-col>
<!-- 表单结束 -->
</a-row>
</a-form>
</a-row>
</BasicDrawer>
<!-- 有关联表单详情开始 -->
<RelationDetail ref="relationDetailRef" />
<!-- 有关联表单详情结束 -->
</template>
<script lang="ts" setup>
import { getDetailInfo } from './helper/api';
import { getConfigData } from '@/api/onlineDev/visualDev';
import { reactive, toRefs, nextTick, ref, computed, unref ,toRaw} from 'vue';
import { BasicModal, useModal } from '@/components/Modal';
import { BasicDrawer, useDrawer } from '@/components/Drawer';
// 有关联表单详情
import RelationDetail from '@/views/common/dynamicModel/list/detail/index.vue';
// 表单权限
import { usePermission } from '@/hooks/web/usePermission';
import { useMessage } from '@/hooks/web/useMessage';
import { CaretRightOutlined } from '@ant-design/icons-vue';
import { buildUUID } from '@/utils/uuid';
import { useI18n } from '@/hooks/web/useI18n';
import { getDataChange } from '@/api/onlineDev/visualDev';
import { getDataInterfaceDataInfoByIds } from '@/api/systemData/dataInterface';
import ExtraRelationInfo from '@/components/yunzhupaas/RelationForm/src/ExtraRelationInfo.vue';
interface State {
dataForm: any;
title: string;
maskConfig: any;
interfaceRes: any;
locationScope: any;
extraOptions: any;
extraData: any;
}
defineOptions({ name: 'Detail' });
const { createMessage, createConfirm } = useMessage();
const [registerDrawer, { openDrawer, setDrawerProps, closeDrawer }] = useDrawer();
const { t } = useI18n();
const relationDetailRef = ref<any>(null);
const state = reactive<State>({
dataForm:{},
title: t('common.detailText','详情'),
maskConfig:{
billing_item_code: {"prefixType":1,"useUnrealMask":false,"maskType":1,"unrealMaskLength":1,"prefixLimit":0,"suffixLimit":0,"filler":"*","prefixSpecifyChar":"","suffixType":1,"ignoreChar":"","suffixSpecifyChar":""} ,
billing_item_name: {"prefixType":1,"useUnrealMask":false,"maskType":1,"unrealMaskLength":1,"prefixLimit":0,"suffixLimit":0,"filler":"*","prefixSpecifyChar":"","suffixType":1,"ignoreChar":"","suffixSpecifyChar":""} ,
}
,
interfaceRes: {"billing_item_name":[],"billing_item_type":[],"billing_item_code":[],"remark":[]},
locationScope:{
}
,
extraOptions: {
}
,
extraData: {
}
,
});
const { title, dataForm, maskConfig } = toRefs(state);
// 表单权限
const { hasFormP } = usePermission();
defineExpose({ init });
function init(data) {
state.dataForm.id = data.id;
openDrawer();
nextTick(() => {
setTimeout(initData, 0);
});
}
function initData() {
changeLoading(true);
if (state.dataForm.id) {
getData(state.dataForm.id);
} else {
closeDrawer();
}
}
function getData(id) {
getDetailInfo(id).then((res) => {
state.dataForm = res.data || {};
nextTick(() => {
changeLoading(false);
});
});
}
function toDetail(modelId, id, propsValue) {
if (!id) return;
getConfigData(modelId).then((res) => {
if (!res.data || !res.data.formData) return;
const formConf = JSON.parse(res.data.formData);
formConf.popupType = 'general';
formConf.hasPrintBtn = false;
formConf.customBtns = [];
const data = { id, formConf, modelId, propsValue};
relationDetailRef.value?.init(data);
});
}
function setFormProps(data) {
setDrawerProps(data);
}
function changeLoading(loading) {
setFormProps({ loading });
}
function getParamList(key) {
let templateJson: any[] = state.interfaceRes[key];
if (!templateJson || !templateJson.length || !state.dataForm) return templateJson;
for (let i = 0; i < templateJson.length; i++) {
if (templateJson[i].relationField && templateJson[i].sourceType == 1) {
templateJson[i].defaultValue = state.dataForm[templateJson[i].relationField + '_id'] || '';
}
}
return templateJson;
}
</script>

View File

@@ -0,0 +1,384 @@
<template>
<BasicDrawer v-bind="$attrs" @register="registerDrawer" width="600px" showFooter
:cancelText="t('common.cancelText','取消')"
:okText="t('common.okText','确定')"
@ok="handleSubmit" :closeFunc="onClose">
<template #title>
<a-space :size="10">
<div class="text-16px font-medium">{{ title }}</div>
<a-space-compact size="small" block v-if="dataForm.id">
<a-tooltip :title="t('common.prevRecord')">
<a-button size="small" :disabled="getPrevDisabled" @click="handlePrev">
<i class="icon-ym icon-ym-caret-left text-10px"></i>
</a-button>
</a-tooltip>
<a-tooltip :title="t('common.nextRecord')">
<a-button size="small" :disabled="getNextDisabled" @click="handleNext">
<i class="icon-ym icon-ym-caret-right text-10px"></i>
</a-button>
</a-tooltip>
</a-space-compact>
</a-space>
</template>
<template #insertFooter>
<div class="float-left mt-5px">
<yunzhupaasCheckboxSingle v-model:value="submitType" :label="continueText" />
</div>
</template>
<a-row class="p-10px dynamic-form ">
<!-- 表单 -->
<a-form :colon="false" size="middle" layout= "horizontal"
labelAlign= "right"
:labelCol="{ style: { width: '100px' } }" :model="dataForm" :rules="dataRule" ref="formRef" >
<a-row :gutter="15">
<!-- 具体表单 -->
<a-col :span="24" class="ant-col-item" >
<a-form-item
name="billing_item_code" >
<template #label>计费项目编码
</template> <YunzhupaasInput v-model:value="dataForm.billing_item_code" @change="changeData('billing_item_code',-1)"
placeholder="请输入" :allowClear='true' :style='{"width":"100%"}' :maskConfig = "maskConfig.billing_item_code" :showCount = "false" >
</YunzhupaasInput>
</a-form-item>
</a-col>
<a-col :span="24" class="ant-col-item" >
<a-form-item
name="billing_item_name" >
<template #label>计费项目名称
</template> <YunzhupaasInput v-model:value="dataForm.billing_item_name" @change="changeData('billing_item_name',-1)"
placeholder="请输入" :allowClear='true' :style='{"width":"100%"}' :maskConfig = "maskConfig.billing_item_name" :showCount = "false" >
</YunzhupaasInput>
</a-form-item>
</a-col>
<a-col :span="24" class="ant-col-item" >
<a-form-item
name="billing_item_type" >
<template #label>费用类别
</template> <YunzhupaasSelect v-model:value="dataForm.billing_item_type" @change="changeData('billing_item_type',-1)"
placeholder="请选择" :templateJson="state.interfaceRes.billing_item_type" :allowClear='true' :style='{"width":"100%"}' :showSearch='false' :options="optionsObj.billing_item_typeOptions" :fieldNames="optionsObj.billing_item_typeProps"
>
</YunzhupaasSelect>
</a-form-item>
</a-col>
<a-col :span="24" class="ant-col-item" >
<a-form-item
name="remark" >
<template #label>备注
</template> <YunzhupaasTextarea v-model:value="dataForm.remark" @change="changeData('remark',-1)"
placeholder="请输入" :allowClear='true' :style='{"width":"100%"}' :autoSize='{"minRows":4,"maxRows":4}' :showCount = "false" >
</YunzhupaasTextarea>
</a-form-item>
</a-col>
<!-- 表单结束 -->
</a-row>
</a-form>
</a-row>
</BasicDrawer>
</template>
<script lang="ts" setup>
import { create, update, getInfo } from './helper/api';
import { reactive, toRefs, nextTick, ref, unref, computed,toRaw, inject } from 'vue';
import { BasicDrawer, useDrawer } from '@/components/Drawer';
import { yunzhupaasRelationForm } from '@/components/yunzhupaas';
import { useMessage } from '@/hooks/web/useMessage';
import { useI18n } from '@/hooks/web/useI18n';
import { useUserStore } from '@/store/modules/user';
import type { FormInstance } from 'ant-design-vue';
import { thousandsFormat , getDateTimeUnit, getTimeUnit} from '@/utils/yunzhupaas';
import { getDictionaryDataSelector } from '@/api/systemData/dictionary';
import { getDataInterfaceRes } from '@/api/systemData/dataInterface';
import dayjs from 'dayjs';
// 表单权限
import { usePermission } from '@/hooks/web/usePermission';
import { cloneDeep } from 'lodash-es';
import { buildUUID } from '@/utils/uuid';
import { CaretRightOutlined } from '@ant-design/icons-vue';
interface State {
dataForm: any;
tableRows: any;
dataRule: any;
optionsObj: any;
childIndex: any;
isEdit: any;
interfaceRes: any;
//可选范围默认值
ableAll: any;
//掩码配置
maskConfig:any;
//定位属性
locationScope:any;
extraOptions: any;
title: string;
continueText: string; allList: any[];
currIndex: number;
isContinue: boolean;
submitType: number;
showContinueBtn: boolean;
}
const emit = defineEmits(['reload']);
const getLeftTreeActiveInfo: (() => any) | null = inject('getLeftTreeActiveInfo', null);
const userStore = useUserStore();
const userInfo = userStore.getUserInfo;
const { createMessage, createConfirm } = useMessage();
const { t } = useI18n();
const [registerDrawer, { openDrawer, setDrawerProps }] = useDrawer();
const formRef = ref<FormInstance>();
const state = reactive<State>({
dataForm: {
billing_item_code:undefined,
billing_item_name:undefined,
billing_item_type:'',
remark:undefined,
},
tableRows:{
},
dataRule: {
billing_item_code: [
{
required: true,
message: t('sys.validate.textRequiredSuffix','不能为空'),
trigger: 'blur'
},
],
billing_item_name: [
{
required: true,
message: t('sys.validate.textRequiredSuffix','不能为空'),
trigger: 'blur'
},
],
billing_item_type: [
{
required: true,
message: t('sys.validate.arrayRequiredPrefix ','请至少选择一个'),
trigger: 'change'
},
],
},
optionsObj:{
billing_item_typeOptions:[{"fullName":"周期类","id":"Recurring"},{"fullName":"固定金额","id":"Fixed"},{"fullName":"单价 × 约定数量","id":"UnitQty"},{"fullName":"单价 × 实际用量","id":"Usage"},{"fullName":"比例费用","id":"Percentage"},{"fullName":"条件费用","id":"Conditional"}],
billing_item_typeProps:{"label":"fullName","value":"id" },
},
childIndex: -1,
isEdit: false,
interfaceRes: {"billing_item_name":[],"billing_item_type":[],"billing_item_code":[],"remark":[]},
//可选范围默认值
ableAll:{
},
//掩码配置
maskConfig:{
billing_item_code: {"prefixType":1,"useUnrealMask":false,"maskType":1,"unrealMaskLength":1,"prefixLimit":0,"suffixLimit":0,"filler":"*","prefixSpecifyChar":"","suffixType":1,"ignoreChar":"","suffixSpecifyChar":""} ,
billing_item_name: {"prefixType":1,"useUnrealMask":false,"maskType":1,"unrealMaskLength":1,"prefixLimit":0,"suffixLimit":0,"filler":"*","prefixSpecifyChar":"","suffixType":1,"ignoreChar":"","suffixSpecifyChar":""} ,
},
//定位属性
locationScope:{
},
extraOptions:{
},
title: "",
continueText: "", allList: [],
currIndex: 0,
isContinue: false,
submitType: 0,
showContinueBtn: true ,
});
const { title, continueText, showContinueBtn, dataRule, dataForm, optionsObj, ableAll, maskConfig,submitType } = toRefs(state);
const getPrevDisabled = computed(() => state.currIndex === 0);
const getNextDisabled = computed(() => state.currIndex === state.allList.length - 1);
// 表单权限
const { hasFormP } = usePermission();
defineExpose({ init });
function init(data) {
state.submitType = 0;
state.isContinue = false;
state.title = !data.id ? t('common.add2Text','新增') : t('common.editText','编辑');
state.continueText = !data.id ? t('common.continueAndAddText','确定并新增') : t('common.continueText','确定并继续'); setFormProps({ continueLoading: false });
state.dataForm.id = data.id;
openDrawer();
state.allList = data.allList;
state.currIndex = state.allList.length && data.id ? state.allList.findIndex((item) => item.id === data.id) : 0;
nextTick(() => {
getForm().resetFields();
setTimeout(initData, 0);
});
}
function initData() {
changeLoading(true);
if (state.dataForm.id) {
getData(state.dataForm.id);
} else {
//初始化options
// 设置默认值
state.dataForm={
billing_item_code:undefined,
billing_item_name:undefined,
billing_item_type:'',
remark:undefined,
};
if (getLeftTreeActiveInfo) state.dataForm = {...state.dataForm, ...(getLeftTreeActiveInfo() || {}) };
state.childIndex = -1;
changeLoading(false);
}
}
function getForm() {
const form = unref(formRef);
if (!form) {
throw new Error('form is null!');
}
return form;
}
function getData(id) {
getInfo(id).then((res) => {
state.dataForm = res.data || {};
state.childIndex = -1;
changeLoading(false);
});
}
async function handleSubmit(type) {
try {
const values = await getForm()?.validate();
if (!values) return;
setFormProps({ confirmLoading: true });
const formMethod = state.dataForm.id ? update : create;
formMethod(state.dataForm)
.then((res) => {
createMessage.success(res.msg);
setFormProps({ confirmLoading: false });
if (state.submitType == 1) {
initData();
state.isContinue = true;
} else {
setFormProps({ open: false });
emit('reload');
}
})
.catch(() => {
setFormProps({ confirmLoading: false });
});
} catch (_) {}
}
function handlePrev() {
state.currIndex--;
handleGetNewInfo();
}
function handleNext() {
state.currIndex++;
handleGetNewInfo();
}
function handleGetNewInfo() {
changeLoading(true);
getForm().resetFields();
const id = state.allList[state.currIndex].id;
getData(id);
}
function setFormProps(data) {
setDrawerProps(data);
}
function changeLoading(loading) {
setDrawerProps({ loading });
}
async function onClose() {
if (state.isContinue) emit('reload');
return true;
}
function changeData(model, index) {
state.isEdit = false
state.childIndex = index
for (let key in state.interfaceRes) {
if (key != model) {
let faceReList = state.interfaceRes[key]
for (let i = 0; i < faceReList.length; i++) {
let relationField = faceReList[i].relationField;
if(relationField){
let modelAll = relationField.split('-');
let faceMode = '';
let faceMode2 = modelAll.length == 2?modelAll[0].substring(0, modelAll[0].length-4) +modelAll[1]:""
for (let i = 0; i < modelAll.length; i++) {
faceMode += modelAll[i];
}
if (faceMode == model || faceMode2 == model ) {
let options = 'get' + key + 'Options';
eval(options)(true);
changeData(key, index)
}
}
}
}
}
}
function changeDataFormData(type, data, model,index,defaultValue) {
if(!state.isEdit) {
if (type == 2) {
for (let i = 0; i < state.dataForm[data].length; i++) {
if (index == -1) {
state.dataForm[data][i][model] = defaultValue
} else if (index == i) {
state.dataForm[data][i][model] = defaultValue
}
}
} else {
state.dataForm[data] = defaultValue
}
}
}
function getRelationDate(timeRule, timeType, timeTarget, timeValueData, dataValue) {
let timeDataValue: any = null;
let timeValue = Number(timeValueData);
if (timeRule) {
if (timeType == 1) {
timeDataValue = timeValue;
} else if (timeType == 2) {
timeDataValue = dataValue;
} else if (timeType == 3) {
timeDataValue = new Date().getTime();
} else if (timeType == 4 || timeType == 5) {
const type = getTimeUnit(timeTarget);
const method = timeType == 4 ? 'subtract' : 'add';
timeDataValue = dayjs()[method](timeValue, type).valueOf();
}
}
return timeDataValue;
}
function getRelationTime(timeRule, timeType, timeTarget, timeValue, formatType, dataValue) {
let format = formatType == 'HH:mm' ? 'HH:mm:00' : formatType;
let timeDataValue: any = null;
if (timeRule) {
if (timeType == 1) {
timeDataValue = timeValue || '00:00:00';
if (timeDataValue.split(':').length == 3) {
timeDataValue = timeDataValue;
} else {
timeDataValue = timeDataValue + ':00';
}
} else if (timeType == 2) {
timeDataValue = dataValue;
} else if (timeType == 3) {
timeDataValue = dayjs().format(format);
} else if (timeType == 4 || timeType == 5) {
const type = getTimeUnit(timeTarget + 3);
const method = timeType == 4 ? 'subtract' : 'add';
timeDataValue = dayjs()[method](timeValue, type).format(format);
}
}
return timeDataValue;
}
</script>

View File

@@ -0,0 +1,34 @@
import { defHttp } from '@/utils/http/axios';
// 获取列表
export function getList(data) {
return defHttp.post({ url: '/api/bc/BillingItem/getList', data });
}
// 新建
export function create(data) {
return defHttp.post({ url:'/api/bc/BillingItem', data });
}
// 修改
export function update(data) {
return defHttp.put({ url: '/api/bc/BillingItem/'+ data.id, data });
}
// 详情(无转换数据)
export function getInfo(id) {
return defHttp.get({ url: '/api/bc/BillingItem/' + id });
}
// 获取(转换数据)
export function getDetailInfo(id) {
return defHttp.get({ url: '/api/bc/BillingItem/detail/' + id });
}
// 删除
export function del(id) {
return defHttp.delete({ url: '/api/bc/BillingItem/' + id });
}
// 批量删除数据
export function batchDelete(data) {
return defHttp.delete({ url: '/api/bc/BillingItem/batchRemove', data });
}
// 导出
export function exportData(data) {
return defHttp.post({ url: '/api/bc/BillingItem/Actions/Export', data });
}

View File

@@ -0,0 +1,303 @@
const columnList = [
{
"yunzhupaasKey":"input",
"useScan":false,
"suffixIcon":"",
"fullNameI18nCode":[
""
],
"align":"left",
"showCount":false,
"__config__":{
"formId":"formItem6d4cd8",
"yunzhupaasKey":"input",
"visibility":[
"pc",
"app"
],
"noShow":false,
"tipLabel":"",
"tableFixed":"none",
"dragDisabled":false,
"className":[],
"label":"计费项目编码",
"trigger":"blur",
"showLabel":true,
"required":true,
"tableName":"bc_billing_item",
"renderKey":1778484553554,
"layout":"colFormItem",
"tagIcon":"icon-ym icon-ym-generator-input",
"unique":true,
"tag":"YunzhupaasInput",
"regList":[],
"tableAlign":"left",
"span":24
},
"readonly":false,
"prop":"billing_item_code",
"__vModel__":"billing_item_code",
"disabled":false,
"id":"billing_item_code",
"placeholder":"请输入",
"addonBefore":"",
"on":{
"change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}",
"blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}"
},
"clearable":true,
"resizable":true,
"maxlength":null,
"fullName":"计费项目编码",
"label":"计费项目编码",
"sortable":false,
"addonAfter":"",
"maskConfig":{
"prefixType":1,
"useUnrealMask":false,
"maskType":1,
"unrealMaskLength":1,
"prefixLimit":0,
"suffixLimit":0,
"filler":"*",
"prefixSpecifyChar":"",
"suffixType":1,
"ignoreChar":"",
"suffixSpecifyChar":""
},
"width":null,
"useMask":false,
"showPassword":false,
"fixed":"none",
"style":{
"width":"100%"
},
"prefixIcon":"",
"labelI18nCode":""
},
{
"yunzhupaasKey":"input",
"useScan":false,
"suffixIcon":"",
"fullNameI18nCode":[
""
],
"align":"left",
"showCount":false,
"__config__":{
"formId":"formItem4f4dd9",
"yunzhupaasKey":"input",
"visibility":[
"pc",
"app"
],
"noShow":false,
"tipLabel":"",
"tableFixed":"none",
"dragDisabled":false,
"className":[],
"label":"计费项目名称",
"trigger":"blur",
"showLabel":true,
"required":true,
"tableName":"bc_billing_item",
"renderKey":1778484558269,
"layout":"colFormItem",
"tagIcon":"icon-ym icon-ym-generator-input",
"tag":"YunzhupaasInput",
"regList":[],
"tableAlign":"left",
"span":24
},
"readonly":false,
"prop":"billing_item_name",
"__vModel__":"billing_item_name",
"disabled":false,
"id":"billing_item_name",
"placeholder":"请输入",
"addonBefore":"",
"on":{
"change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}",
"blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}"
},
"clearable":true,
"resizable":true,
"maxlength":null,
"fullName":"计费项目名称",
"label":"计费项目名称",
"sortable":false,
"addonAfter":"",
"maskConfig":{
"prefixType":1,
"useUnrealMask":false,
"maskType":1,
"unrealMaskLength":1,
"prefixLimit":0,
"suffixLimit":0,
"filler":"*",
"prefixSpecifyChar":"",
"suffixType":1,
"ignoreChar":"",
"suffixSpecifyChar":""
},
"width":null,
"useMask":false,
"showPassword":false,
"fixed":"none",
"style":{
"width":"100%"
},
"prefixIcon":"",
"labelI18nCode":""
},
{
"yunzhupaasKey":"select",
"filterable":false,
"clearable":true,
"resizable":true,
"multiple":false,
"fullName":"费用类别",
"fullNameI18nCode":[
""
],
"label":"费用类别",
"sortable":false,
"align":"left",
"props":{
"label":"fullName",
"value":"id"
},
"__config__":{
"yunzhupaasKey":"select",
"defaultValue":"",
"dragDisabled":false,
"className":[],
"propsUrl":"",
"templateJson":[],
"showLabel":true,
"required":true,
"tableName":"bc_billing_item",
"renderKey":1778484563169,
"tagIcon":"icon-ym icon-ym-generator-select",
"tag":"YunzhupaasSelect",
"formId":"formItema781b9",
"visibility":[
"pc",
"app"
],
"noShow":false,
"dataType":"static",
"dictionaryType":"",
"tipLabel":"",
"tableFixed":"none",
"label":"费用类别",
"trigger":"change",
"layout":"colFormItem",
"useCache":true,
"propsName":"",
"regList":[],
"tableAlign":"left",
"span":24
},
"prop":"billing_item_type",
"width":null,
"options":[
{
"fullName":"周期类",
"id":"Recurring"
},
{
"fullName":"固定金额",
"id":"Fixed"
},
{
"fullName":"单价 × 约定数量",
"id":"UnitQty"
},
{
"fullName":"单价 × 实际用量",
"id":"Usage"
},
{
"fullName":"比例费用",
"id":"Percentage"
},
{
"fullName":"条件费用",
"id":"Conditional"
}
],
"__vModel__":"billing_item_type",
"fixed":"none",
"style":{
"width":"100%"
},
"disabled":false,
"id":"billing_item_type",
"placeholder":"请选择",
"labelI18nCode":"",
"on":{
"change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}"
}
},
{
"yunzhupaasKey":"textarea",
"clearable":true,
"resizable":true,
"maxlength":null,
"fullName":"备注",
"fullNameI18nCode":[
""
],
"label":"备注",
"sortable":false,
"align":"left",
"autoSize":{
"minRows":4,
"maxRows":4
},
"showCount":false,
"__config__":{
"formId":"formItem683e9d",
"yunzhupaasKey":"textarea",
"visibility":[
"pc",
"app"
],
"noShow":false,
"tipLabel":"",
"tableFixed":"none",
"dragDisabled":false,
"className":[],
"label":"备注",
"trigger":"blur",
"showLabel":true,
"required":false,
"tableName":"bc_billing_item",
"renderKey":1778484793248,
"layout":"colFormItem",
"tagIcon":"icon-ym icon-ym-generator-textarea",
"tag":"YunzhupaasTextarea",
"regList":[],
"tableAlign":"left",
"span":24
},
"readonly":false,
"prop":"remark",
"width":null,
"__vModel__":"remark",
"fixed":"none",
"style":{
"width":"100%"
},
"disabled":false,
"id":"remark",
"placeholder":"请输入",
"labelI18nCode":"",
"on":{
"change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}",
"blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}"
}
}
]
export default columnList

View File

@@ -0,0 +1,164 @@
const searchList = [
{
"yunzhupaasKey":"input",
"useScan":false,
"suffixIcon":"",
"fullNameI18nCode":[
""
],
"showCount":false,
"__config__":{
"formId":"formItem4f4dd9",
"yunzhupaasKey":"input",
"visibility":[
"pc",
"app"
],
"noShow":false,
"tipLabel":"",
"tableFixed":"none",
"dragDisabled":false,
"className":[],
"label":"计费项目名称",
"trigger":"blur",
"showLabel":true,
"required":true,
"tableName":"bc_billing_item",
"renderKey":1778484558269,
"layout":"colFormItem",
"tagIcon":"icon-ym icon-ym-generator-input",
"tag":"YunzhupaasInput",
"regList":[],
"tableAlign":"left",
"span":24
},
"readonly":false,
"prop":"billing_item_name",
"__vModel__":"billing_item_name",
"searchMultiple":false,
"disabled":false,
"id":"billing_item_name",
"placeholder":"请输入",
"addonBefore":"",
"on":{
"change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}",
"blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}"
},
"clearable":true,
"searchType":2,
"maxlength":null,
"fullName":"计费项目名称",
"label":"计费项目名称",
"addonAfter":"",
"maskConfig":{
"prefixType":1,
"useUnrealMask":false,
"maskType":1,
"unrealMaskLength":1,
"prefixLimit":0,
"suffixLimit":0,
"filler":"*",
"prefixSpecifyChar":"",
"suffixType":1,
"ignoreChar":"",
"suffixSpecifyChar":""
},
"isKeyword":false,
"useMask":false,
"showPassword":false,
"style":{
"width":"100%"
},
"prefixIcon":"",
"labelI18nCode":""
},
{
"yunzhupaasKey":"select",
"filterable":false,
"clearable":true,
"searchType":1,
"multiple":false,
"fullName":"费用类别",
"fullNameI18nCode":[
""
],
"label":"费用类别",
"props":{
"label":"fullName",
"value":"id"
},
"__config__":{
"yunzhupaasKey":"select",
"defaultValue":"",
"dragDisabled":false,
"className":[],
"propsUrl":"",
"templateJson":[],
"showLabel":true,
"required":true,
"tableName":"bc_billing_item",
"renderKey":1778484563169,
"tagIcon":"icon-ym icon-ym-generator-select",
"tag":"YunzhupaasSelect",
"formId":"formItema781b9",
"visibility":[
"pc",
"app"
],
"noShow":false,
"dataType":"static",
"dictionaryType":"",
"tipLabel":"",
"tableFixed":"none",
"label":"费用类别",
"trigger":"change",
"layout":"colFormItem",
"useCache":true,
"propsName":"",
"regList":[],
"tableAlign":"left",
"span":24
},
"prop":"billing_item_type",
"options":[
{
"fullName":"周期类",
"id":"Recurring"
},
{
"fullName":"固定金额",
"id":"Fixed"
},
{
"fullName":"单价 × 约定数量",
"id":"UnitQty"
},
{
"fullName":"单价 × 实际用量",
"id":"Usage"
},
{
"fullName":"比例费用",
"id":"Percentage"
},
{
"fullName":"条件费用",
"id":"Conditional"
}
],
"__vModel__":"billing_item_type",
"searchMultiple":true,
"isKeyword":false,
"style":{
"width":"100%"
},
"disabled":false,
"id":"billing_item_type",
"placeholder":"请选择",
"labelI18nCode":"",
"on":{
"change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}"
}
}
]
export default searchList

View File

@@ -0,0 +1,267 @@
const superQueryJson = [
{
"clearable":true,
"maxlength":null,
"useScan":false,
"suffixIcon":"",
"fullName":"计费项目编码",
"fullNameI18nCode":[
""
],
"addonAfter":"",
"showCount":false,
"__config__":{
"formId":"formItem6d4cd8",
"yunzhupaasKey":"input",
"visibility":[
"pc",
"app"
],
"noShow":false,
"tipLabel":"",
"tableFixed":"none",
"dragDisabled":false,
"className":[],
"label":"计费项目编码",
"trigger":"blur",
"showLabel":true,
"required":true,
"tableName":"bc_billing_item",
"renderKey":1778484553554,
"layout":"colFormItem",
"tagIcon":"icon-ym icon-ym-generator-input",
"unique":true,
"tag":"YunzhupaasInput",
"regList":[],
"tableAlign":"left",
"span":24
},
"readonly":false,
"maskConfig":{
"prefixType":1,
"useUnrealMask":false,
"maskType":1,
"unrealMaskLength":1,
"prefixLimit":0,
"suffixLimit":0,
"filler":"*",
"prefixSpecifyChar":"",
"suffixType":1,
"ignoreChar":"",
"suffixSpecifyChar":""
},
"__vModel__":"billing_item_code",
"useMask":false,
"showPassword":false,
"style":{
"width":"100%"
},
"disabled":false,
"id":"billing_item_code",
"placeholder":"请输入",
"prefixIcon":"",
"addonBefore":"",
"on":{
"change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}",
"blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}"
}
},
{
"clearable":true,
"maxlength":null,
"useScan":false,
"suffixIcon":"",
"fullName":"计费项目名称",
"fullNameI18nCode":[
""
],
"addonAfter":"",
"showCount":false,
"__config__":{
"formId":"formItem4f4dd9",
"yunzhupaasKey":"input",
"visibility":[
"pc",
"app"
],
"noShow":false,
"tipLabel":"",
"tableFixed":"none",
"dragDisabled":false,
"className":[],
"label":"计费项目名称",
"trigger":"blur",
"showLabel":true,
"required":true,
"tableName":"bc_billing_item",
"renderKey":1778484558269,
"layout":"colFormItem",
"tagIcon":"icon-ym icon-ym-generator-input",
"tag":"YunzhupaasInput",
"regList":[],
"tableAlign":"left",
"span":24
},
"readonly":false,
"maskConfig":{
"prefixType":1,
"useUnrealMask":false,
"maskType":1,
"unrealMaskLength":1,
"prefixLimit":0,
"suffixLimit":0,
"filler":"*",
"prefixSpecifyChar":"",
"suffixType":1,
"ignoreChar":"",
"suffixSpecifyChar":""
},
"__vModel__":"billing_item_name",
"useMask":false,
"showPassword":false,
"style":{
"width":"100%"
},
"disabled":false,
"id":"billing_item_name",
"placeholder":"请输入",
"prefixIcon":"",
"addonBefore":"",
"on":{
"change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}",
"blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}"
}
},
{
"filterable":false,
"clearable":true,
"multiple":false,
"fullName":"费用类别",
"fullNameI18nCode":[
""
],
"props":{
"label":"fullName",
"value":"id"
},
"__config__":{
"yunzhupaasKey":"select",
"defaultValue":"",
"dragDisabled":false,
"className":[],
"propsUrl":"",
"templateJson":[],
"showLabel":true,
"required":true,
"tableName":"bc_billing_item",
"renderKey":1778484563169,
"tagIcon":"icon-ym icon-ym-generator-select",
"tag":"YunzhupaasSelect",
"formId":"formItema781b9",
"visibility":[
"pc",
"app"
],
"noShow":false,
"dataType":"static",
"dictionaryType":"",
"tipLabel":"",
"tableFixed":"none",
"label":"费用类别",
"trigger":"change",
"layout":"colFormItem",
"useCache":true,
"propsName":"",
"regList":[],
"tableAlign":"left",
"span":24
},
"options":[
{
"fullName":"周期类",
"id":"Recurring"
},
{
"fullName":"固定金额",
"id":"Fixed"
},
{
"fullName":"单价 × 约定数量",
"id":"UnitQty"
},
{
"fullName":"单价 × 实际用量",
"id":"Usage"
},
{
"fullName":"比例费用",
"id":"Percentage"
},
{
"fullName":"条件费用",
"id":"Conditional"
}
],
"__vModel__":"billing_item_type",
"style":{
"width":"100%"
},
"disabled":false,
"id":"billing_item_type",
"placeholder":"请选择",
"on":{
"change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}"
}
},
{
"clearable":true,
"maxlength":null,
"fullName":"备注",
"fullNameI18nCode":[
""
],
"autoSize":{
"minRows":4,
"maxRows":4
},
"showCount":false,
"__config__":{
"formId":"formItem683e9d",
"yunzhupaasKey":"textarea",
"visibility":[
"pc",
"app"
],
"noShow":false,
"tipLabel":"",
"tableFixed":"none",
"dragDisabled":false,
"className":[],
"label":"备注",
"trigger":"blur",
"showLabel":true,
"required":false,
"tableName":"bc_billing_item",
"renderKey":1778484793248,
"layout":"colFormItem",
"tagIcon":"icon-ym icon-ym-generator-textarea",
"tag":"YunzhupaasTextarea",
"regList":[],
"tableAlign":"left",
"span":24
},
"readonly":false,
"__vModel__":"remark",
"style":{
"width":"100%"
},
"disabled":false,
"id":"remark",
"placeholder":"请输入",
"on":{
"change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}",
"blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}"
}
}
]
export default superQueryJson

View File

@@ -0,0 +1,673 @@
<template>
<div class="yunzhupaas-content-wrapper">
<div class="yunzhupaas-content-wrapper-center">
<div class="yunzhupaas-content-wrapper-search-box" v-if="getSearchList.length">
<BasicForm @register="registerSearchForm" :schemas="getSearchList"
@advanced-change="redoHeight" @submit="handleSearchSubmit" @reset="handleSearchReset"
class="search-form">
</BasicForm>
</div>
<div class="yunzhupaas-content-wrapper-content bg-white">
<BasicTable @register="registerTable" v-bind="getTableBindValue" ref="tableRef"
@columns-change="handleColumnChange">
<template #tableTitle>
<a-button type="primary" preIcon="icon-ym icon-ym-btn-add" v-auth="'btn_add'"
@click="addHandle()"> {{t('common.add2Text','新增')}}</a-button>
<a-button type="link" preIcon="icon-ym icon-ym-btn-download" v-auth="'btn_download'"
@click="openExportModal(true, { columnList: state.exportList, selectIds: getSelectRowKeys(), showExportSelected: true })"> {{t('common.exportText','导出')}}</a-button>
</template>
<template #toolbar>
<a-tooltip placement="top">
<template #title>
<span>{{ t('common.superQuery') }}</span>
</template>
<filter-outlined @click="openSuperQuery(true, { columnOptions: superQueryJson })" />
</a-tooltip>
</template>
<template #toolbarAfter>
<ViewList :menuId="route.meta.modelId" :viewList="viewList" @itemClick="handleViewClick" @reload="initViewList" />
<ViewSetting :menuId="route.meta.modelId" :viewList="viewList" :currentView="currentView" @reload="initViewList" />
</template>
<template #bodyCell="{ column, record, index }">
<template v-for="(item, index) in childColumnList" v-if="childColumnList.length">
<template
v-if="column?.id?.includes('-') && item.children && item.children[0] && column.key === item.children[0]?.dataIndex">
<ChildTableColumn :data="record[item.prop]" :head="item.children"
@toggleExpand="toggleExpand(record, item.prop+`Expand`)" @toDetail="toDetail"
:expand="record[item.prop+`Expand`]" :key="index" :showOverflow="true "/>
</template>
</template>
<template v-if="!(record.top || column.id?.includes('-'))">
<template v-if="column.yunzhupaasKey === 'relationForm'">
<p class="link-text"
@click="toDetail(column.modelId, record[column.dataIndex+`_id`], column.propsValue)">
{{ record[column.dataIndex] }}</p>
</template>
<template v-if="column.yunzhupaasKey === 'inputNumber'">
<yunzhupaas-input-number v-model:value="record[column.prop]" :precision="column.precision" :thousands="column.thousands" disabled detailed />
</template>
<template v-if="column.yunzhupaasKey === 'calculate'">
<yunzhupaas-calculate
v-model:value="record[column.prop]"
:isStorage="column.isStorage"
:precision="column.precision"
:thousands="column.thousands"
detailed />
</template>
<template v-if="column.yunzhupaasKey === 'sign'">
<yunzhupaas-sign v-model:value="record[column.prop]" detailed />
</template>
<template v-if="column.yunzhupaasKey === 'signature'">
<yunzhupaas-signature v-model:value="record[column.prop]" detailed />
</template>
<template v-if="column.yunzhupaasKey === 'rate'">
<yunzhupaas-rate v-model:value="record[column.prop]" :count="column.count" :allowHalf="column.allowHalf" disabled />
</template>
<template v-if="column.yunzhupaasKey === 'slider'">
<yunzhupaas-slider v-model:value="record[column.prop]" :min="column.min" :max="column.max" :step="column.step" disabled />
</template>
<template v-if="column.yunzhupaasKey === 'uploadImg'">
<yunzhupaas-upload-img v-model:value="record[column.prop]" disabled detailed simple v-if="record[column.prop]?.length" />
</template>
<template v-if="column.yunzhupaasKey === 'uploadFile'">
<yunzhupaas-upload-file v-model:value="record[column.prop]" disabled detailed simple v-if="record[column.prop]?.length" />
</template>
<template v-if="column.yunzhupaasKey === 'input'">
<yunzhupaas-input
v-model:value="record[column.prop]"
:useMask="column.useMask"
:maskConfig="column.maskConfig"
:showOverflow="true"
detailed />
</template>
</template>
<template v-if="column.key === 'action' && !record.top">
<TableAction :actions="getTableActions(record)" />
</template>
</template>
</BasicTable>
</div>
</div>
<Form ref="formRef" @reload="reload" />
<Detail ref="detailRef" />
<ExportModal @register="registerExportModal" @download="handleDownload" />
<ImportModal @register="registerImportModal" @reload="reload" />
<PrintSelect @register="registerPrintSelect" @change="handleShowBrowse" />
<PrintBrowse @register="registerPrintBrowse" />
<RelationDetail ref="relationDetailRef" />
<SuperQueryModal @register="registerSuperQueryModal" @superQuery="handleSuperQuery" />
</div>
</template>
<script lang="ts" setup>
import { getList, del, exportData, batchDelete } from './helper/api';
import { getConfigData,getViewList } from '@/api/onlineDev/visualDev';
import { getDictionaryDataSelector } from '@/api/systemData/dictionary';
import { getDataInterfaceRes } from '@/api/systemData/dataInterface';
import { getOrgByOrganizeCondition,getDepartmentSelectAsyncList } from '@/api/permission/organize';
import { ref, reactive, onMounted, toRefs, computed, unref, nextTick, toRaw, provide } from 'vue';
import { useMessage } from '@/hooks/web/useMessage';
import { useI18n } from '@/hooks/web/useI18n';
import { useOrganizeStore } from '@/store/modules/organize';
import { useUserStore } from '@/store/modules/user';
import { BasicModal, useModal } from '@/components/Modal';
import { usePopup } from '@/components/Popup';
import { ScrollContainer } from '@/components/Container';
import { BasicLeftTree, TreeActionType } from '@/components/Tree';
import { BasicForm, useForm } from '@/components/Form';
import { BasicTable, useTable, TableAction, ActionItem, TableActionType, SorterResult } from '@/components/Table';
import { SuperQueryModal } from '@/components/CommonModal';
import Form from './Form.vue';
import Detail from './Detail.vue';
// 有关联表单详情:开始
import RelationDetail from '@/views/common/dynamicModel/list/detail/index.vue';
// 有关联表单详情:结束
import ChildTableColumn from '@/views/common/dynamicModel/list/ChildTableColumn.vue';
import { ExportModal } from '@/components/CommonModal';
import { downloadByUrl } from '@/utils/file/download';
import { ImportModal} from '@/components/CommonModal';
// 打印模板多条生成PrintSelect
import PrintSelect from '@/components/PrintDesign/printSelect/index.vue';
import PrintBrowse from '@/components/PrintDesign/printBrowse/index.vue';
import { useRoute,useRouter } from 'vue-router';
import { FilterOutlined } from '@ant-design/icons-vue';
import { getSearchFormSchemas } from '@/components/FormGenerator/src/helper/transform';
import { cloneDeep } from 'lodash-es';
import columnList from './helper/columnList';
import searchList from './helper/searchList';
import superQueryJson from './helper/superQueryJson';
import { dyOptionsList, systemComponentsList } from '@/components/FormGenerator/src/helper/config';
import { thousandsFormat, getParamList} from '@/utils/yunzhupaas';
import { usePermission } from '@/hooks/web/usePermission';
import ViewSetting from '@/views/common/dynamicModel/list/components/ViewSetting.vue';
import ViewList from '@/views/common/dynamicModel/list/components/ViewList.vue';
interface State {
config: any;
columnList: any[];
printListOptions: any[];
columnBtnsList: any[];
customBtnsList: any[];
treeFieldNames: any;
leftTreeData: any[];
leftTreeLoading: boolean;
treeActiveId: string;
treeActiveNodePath: any;
columns: any[];
complexColumns: any[];
childColumnList: any[];
exportList: any[];
cacheList: any[];
currFlow: any;
isCustomCopy: boolean;
candidateType: number;
currRow: any;
workFlowFormData: any;
expandObj: any;
columnSettingList: any[];
searchSchemas: any[];
treeRelationObj: any;
treeQueryJson: any;
leftTreeActiveInfo: any;
keyword: string;
viewList: any[];
currentView: any;
}
const route = useRoute();
const { hasBtnP } = usePermission();
const { createMessage, createConfirm } = useMessage();
const { t } = useI18n();
const organizeStore = useOrganizeStore();
const userStore = useUserStore();
const userInfo = userStore.getUserInfo;
const [registerExportModal, { openModal: openExportModal, closeModal: closeExportModal, setModalProps: setExportModalProps }] = useModal();
const [registerImportModal, { openModal: openImportModal }] = useModal();
const [registerSuperQueryModal, { openModal: openSuperQuery }] = useModal();
const formRef = ref<any>(null);
const tableRef = ref<Nullable<TableActionType>>(null);
const detailRef = ref<any>(null);
const relationDetailRef = ref<any>(null);
const state = reactive<State>({
config: {},
columnList: [],
printListOptions: [],
columnBtnsList: [],
customBtnsList: [],
treeFieldNames: {
children: 'children' ,
title: 'fullName' ,
key: 'id' ,
isLeaf: 'isLeaf',
},
leftTreeData: [],
leftTreeLoading: false,
treeActiveId: '',
treeActiveNodePath: [],
columns: [],
complexColumns: [], // 复杂表头
childColumnList: [],
exportList: [],
cacheList: [],
currFlow: {},
isCustomCopy: false,
candidateType: 1,
currRow: {},
workFlowFormData: {},
expandObj: {},
columnSettingList: [],
searchSchemas: [],
treeRelationObj: null,
treeQueryJson: {},
leftTreeActiveInfo: {},
keyword: '',
viewList: [],
currentView: {},
});
const defaultSearchInfo = {
menuId: route.meta.modelId as string,
moduleId:'823544899306521605',
superQueryJson: '',
dataType:0,
};
const searchInfo = reactive({
...cloneDeep(defaultSearchInfo),
});
const { childColumnList, searchSchemas, viewList, currentView} = toRefs(state);
const [registerSearchForm, { updateSchema, resetFields, submit: searchFormSubmit, setFieldsValue}] = useForm({
baseColProps: { span: 6 },
showActionButtonGroup: true,
showAdvancedButton: true,
compact: true,
});
const [registerTable, { reload, setLoading, getFetchParams, getSelectRows, getSelectRowKeys, redoHeight,clearSelectedRowKeys }] = useTable({
api: getList,
immediate: false,
clickToRowSelect: false,
tableSetting: { setting: false },
afterFetch: (data) => {
const list = data.map((o) => ({
...o,
...state.expandObj,
}));
state.cacheList = cloneDeep(list);
return list;
},
});
const [registerChildTable] = useTable({
pagination: false,
canResize: false,
showTableSetting: false,
});
provide('getLeftTreeActiveInfo', () => state.leftTreeActiveInfo);
const getHasBatchBtn = computed(() => {
let btnsList =[]
btnsList.push('download')
btnsList=btnsList.filter(o => hasBtnP('btn_' + o))
return !!btnsList.length
});
const getColumns = computed(() => {
const columns = state.complexColumns;
return setListValue(state.currentView?.columnList, columns, 'prop');
});
const getSearchList = computed(() => {
const searchSchemas = cloneDeep(state.searchSchemas).map(o => ({ ...o, show: true }));
return setListValue(state.currentView?.searchList, searchSchemas, 'field');
});
const getTableBindValue = computed(() => {
let columns = unref(getColumns);
const defaultSortConfig= [];
const sortField = defaultSortConfig.map(o => (o.sort === 'desc' ? '-' : '') + o.field);
const data: any = {
pagination: { pageSize: 20 }, //有分页
searchInfo: unref(searchInfo),
defSort: { sidx: sortField.join(',') },
sortFn: (sortInfo: SorterResult | SorterResult[]) => {
if (Array.isArray(sortInfo)) {
const sortList = sortInfo.map(o => (o.order === 'descend' ? '-' : '') + o.field);
return { sidx: sortList.join(',') };
} else {
const { field, order } = sortInfo;
if (field && order) {
// 排序字段
return { sidx: (order === 'descend' ? '-' : '') + field };
} else {
return {};
}
}
},
ellipsis:true ,
columns,
bordered: true,
actionColumn: {
width: 150,
title: t('component.table.action'),
dataIndex: 'action',
},
};
if (unref(getHasBatchBtn)) {
const rowSelection: any = { type: 'checkbox' };
data.rowSelection = rowSelection;
}
return data;
});
function init() {
state.config = {};
searchInfo.menuId = route.meta.modelId as string;
state.columnList = columnList;
setLoading(true);
getSearchSchemas();
getColumnList();
initViewList();
nextTick(() => {
unref(getSearchList)?.length ? searchFormSubmit() : reload({ page: 1 });
});
}
function getSearchSchemas() {
const schemas = getSearchFormSchemas(searchList);
state.searchSchemas = schemas;
schemas.forEach((cur) => {
const config = cur.__config__;
if (dyOptionsList.includes(config.yunzhupaasKey)) {
if (config.dataType === 'dictionary') {
if (!config.dictionaryType) return;
getDictionaryDataSelector(config.dictionaryType).then((res) => {
updateSchema([{ field: cur.field, componentProps: { options: res.data.list } }]);
});
}
if (config.dataType === 'dynamic') {
if (!config.propsUrl) return;
const query = { paramList: getParamList(config.templateJson) };
getDataInterfaceRes(config.propsUrl, query).then((res) => {
const data = Array.isArray(res.data) ? res.data : [];
updateSchema([{ field: cur.field, componentProps: { options: data } }]);
});
}
}
cur.defaultValue = cur.value;
});
}
function getColumnList() {
// 没有开启列表权限
let columnList = state.columnList;
state.exportList = columnList;
let columns = columnList.map((o) => ({
...o,
title: o.labelI18nCode ? t(o.labelI18nCode, o.label) : o.label,
dataIndex: o.prop,
align: o.align,
fixed: o.fixed == 'none' ? false : o.fixed,
sorter: o.sortable ? { multiple: 1 } : o.sortable,
width: o.width || 100,
}));
//添加复杂表头
columns = getComplexColumns(columns);
state.columns = columns.filter((o) => o.prop.indexOf('-') < 0);
//子表表头
getChildComplexColumns(columns);
}
//复杂表头
function getComplexColumns(columns) {
//这里生成复杂表头的配置
let complexHeaderList: any[] = [];
if (!complexHeaderList.length) return columns;
let childColumns: any[] = [];
let firstChildColumns: string[] = [];
for (let i = 0; i < complexHeaderList.length; i++) {
const e = complexHeaderList[i];
e.label = e.fullName;
e.labelI18nCode = e.fullNameI18nCode;
e.title = e.fullNameI18nCode ? t(e.fullNameI18nCode, e.fullName) : e.fullName;
e.align = e.align;
e.dataIndex = e.id;
e.prop = e.id;
e.children = [];
e.yunzhupaasKey = 'complexHeader';
if (e.childColumns?.length) {
childColumns.push(...e.childColumns);
for (let k = 0; k < e.childColumns.length; k++) {
const item = e.childColumns[k];
for (let j = 0; j < columns.length; j++) {
const o = columns[j];
if (o.prop == item && o.fixed !== 'left' && o.fixed !== 'right') e.children.push({ ...o });
}
}
}
if (e.children.length) firstChildColumns.push(e.children[0].prop);
}
complexHeaderList = complexHeaderList.filter(o => o.children.length);
let list: any[] = [];
for (let i = 0; i < columns.length; i++) {
const e = columns[i];
if (!childColumns.includes(e.prop)) {
list.push(e);
} else {
if (firstChildColumns.includes(e.prop)) {
const item = complexHeaderList.find(o => o.childColumns.includes(e.prop));
list.push(item);
}
}
}
return list;
}
//子表表头
function getChildComplexColumns(columnList) {
let list: any[] = [];
for (let i = 0; i < columnList.length; i++) {
const e = columnList[i];
if (!e.prop.includes('-')) {
list.push(e);
} else {
let prop = e.prop.split('-')[0];
let vModel = e.prop.split('-')[1];
let label = e.label.split('-')[0];
let childLabel = e.label.replace(label + '-', '');
if (e.fullNameI18nCode && Array.isArray(e.fullNameI18nCode) && e.fullNameI18nCode[0]) label = t(e.fullNameI18nCode[0], label);
let newItem = {
align: 'center',
yunzhupaasKey: 'table',
prop,
label,
title: label,
dataIndex: prop,
children: [],
};
e.dataIndex = vModel;
e.title = e.labelI18nCode ? t(e.labelI18nCode, childLabel) : childLabel;
if (!state.expandObj.hasOwnProperty(prop+`Expand`)) state.expandObj[prop+`Expand`] = false;
if (!list.some((o) => o.prop === prop)) list.push(newItem);
for (let i = 0; i < list.length; i++) {
if (list[i].prop === prop) {
list[i].children.push(e);
break;
}
}
}
}
// 行内分组展示
getMergeList(list);
state.complexColumns = list;
state.childColumnList = list.filter((o) => o.yunzhupaasKey === 'table');
// 子表分组展示宽度取100
for (let i = 0; i < state.childColumnList.length; i++) {
const e = state.childColumnList[i];
if (e.children?.length) e.children = e.children.map(o => ({ ...o, width: 100 }));
}
}
function getMergeList(list) {
list.forEach((item) => {
if (item.yunzhupaasKey === 'table' && item.children && item.children.length) {
item.children.forEach((child, index) => {
if (index == 0) {
child.customCell = () => ({
rowspan: 1,
colspan: item.children.length,
class: 'child-table-box',
});
} else {
child.customCell = () => ({
rowspan: 0,
colspan: 0,
});
}
});
}
});
}
function toggleExpand(row, field) {
row[field] = !row[field];
}
// 关联表单查看详情
function toDetail(modelId, id, propsValue) {
if (!id) return;
getConfigData(modelId).then((res) => {
if (!res.data || !res.data.formData) return;
const formConf = JSON.parse(res.data.formData);
formConf.popupType = 'general';
formConf.hasPrintBtn = false;
formConf.customBtns = [];
const data = { id, formConf, modelId, propsValue};
relationDetailRef.value?.init(data);
});
}
function handleColumnChange(data) {
state.columnSettingList = data;
}
function getTableActions(record): ActionItem[] {
return [
{
label: t('common.editText','编辑') ,
onClick: updateHandle.bind(null, record),
auth: 'btn_edit', //有按钮权限
},
{
label: t('common.delText','删除') ,
color: 'error',
modelConfirm: {
onOk: handleDelete.bind(null, record.id),
},
auth: 'btn_remove', //有按钮权限
},
{
label: t('common.detailText','详情') ,
onClick: goDetail.bind(null, record),
auth: 'btn_detail', //有按钮权限
},
];
}
// 编辑
function updateHandle(record) {
// 不带工作流
const data = {
id: record.id,
menuId: searchInfo.menuId,
allList: state.cacheList,
};
formRef.value?.init(data);
}
// 删除
function handleDelete(id) {
const query={ids:[id] }
batchDelete(query).then((res) => {
createMessage.success(res.msg);
clearSelectedRowKeys();
reload();
});
}
// 查看详情
function goDetail(record) {
// 不带流程
const data = {
id: record.id,
};
detailRef.value?.init(data);
}
// 新增
function addHandle() {
// 不带流程新增
const data = {
id: '',
menuId: searchInfo.menuId,
allList: state.cacheList,
};
formRef.value?.init(data);
}
// 导出
function handleDownload(data) {
let query = { ...getFetchParams(), ...data };
exportData(query)
.then((res) => {
setExportModalProps({ confirmLoading: false });
if (!res.data.url) return;
downloadByUrl({ url: res.data.url });
closeExportModal();
})
.catch(() => {
setExportModalProps({ confirmLoading: false });
});
}
// 高级查询
function handleSuperQuery(superQueryJson) {
searchInfo.superQueryJson = superQueryJson;
reload({ page: 1 });
}
function handleSearchReset() {
clearSelectedRowKeys();
if (!state.resetFromTree) updateSearchFormValue();
if (state.resetFromTree) state.resetFromTree = false;
}
function handleSearchSubmit(data) {
clearSelectedRowKeys();
let obj = {
...defaultSearchInfo,
superQueryJson: searchInfo.superQueryJson,
...data,
};
Object.keys(searchInfo).map(key => {
delete searchInfo[key];
});
for (let [key, value] of Object.entries(obj)) {
searchInfo[key.replaceAll('-', '_')] = value;
}
console.log(searchInfo);
reload({ page: 1 });
}
function updateSearchFormValue() {
if (!state.treeActiveId) return searchFormSubmit();
let queryJson: any = {};
let leftTreeActiveInfo: any = {};
const isMultiple = !state.treeRelationObj ? false : state.treeRelationObj.searchMultiple;
//多级左侧树,需要拼父级->转为查询参数
if (state.treeRelationObj && state.treeRelationObj.yunzhupaasKey && ['organizeSelect', 'cascader', 'areaSelect'].includes(state.treeRelationObj.yunzhupaasKey)) {
let currValue = [];
currValue = state.treeActiveNodePath.map(o => o[state.treeFieldNames.key]);
queryJson = { '': isMultiple ? [currValue] : currValue };
leftTreeActiveInfo = { '': state.treeRelationObj.multiple ? [currValue] : currValue };
} else {
queryJson = { '': isMultiple ? [state.treeActiveId] : state.treeActiveId };
leftTreeActiveInfo = { '': state.treeRelationObj.multiple ? [state.treeActiveId] : state.treeActiveId };
}
state.leftTreeActiveInfo = leftTreeActiveInfo;
if(unref(getSearchList)?.length){
// 有搜索列表
setFieldsValue(queryJson);
searchFormSubmit();
}else{
// 无搜索列表
handleSearchSubmit(queryJson);
}
}
function initViewList(currentId = '') {
const query = {
menuId: route.meta.modelId,
};
getViewList(query).then(res => {
const columns : any[]= state.complexColumns;
const searchList: any[] = state.searchSchemas.map(o => ({ label: o.label, id: o.field, show: o.show, labelI18nCode: o.labelI18nCode }));
const columnList: any[] = columns.map(o => ({ label: o.label, id: o.prop, show: true, fixed: o.fixed || 'none', labelI18nCode: o.labelI18nCode }));
state.viewList = (res.data || []).map(o => {
if (o.type == 0) return { ...o, searchList, columnList };
return { ...o, searchList: o.searchList ? JSON.parse(o.searchList) : [], columnList: o.columnList ? JSON.parse(o.columnList) : [] };
});
if (currentId) {
state.currentView = state.viewList.filter(o => o.id === currentId)[0] || state.viewList[0];
} else {
state.currentView = state.viewList.filter(o => o.status === 1)[0] || state.viewList[0];
}
});
}
function handleViewClick(item) {
state.currentView = item;
}
function setListValue(data: any[] = [], defaultData: any[] = [], key) {
let list: any[] = [];
for (let i = 0; i < data.length; i++) {
for (let j = 0; j < defaultData.length; j++) {
if (data[i].show && data[i].id == defaultData[j][key]) list.push(defaultData[j]);
}
}
return list;
}
onMounted(() => {
init();
});
</script>

View File

@@ -0,0 +1,182 @@
<template>
<BasicDrawer v-bind="$attrs" @register="registerDrawer" :title="title" width="600px" showFooter
:showOkBtn="false">
<template #insertFooter>
</template>
<a-row class="p-10px dynamic-form ">
<!-- 表单 -->
<a-form :colon="false" size="middle" layout= "horizontal"
labelAlign= "right"
:labelCol="{ style: { width: '100px' } }" :model="dataForm" ref="formRef" >
<a-row :gutter="15">
<!-- 具体表单 -->
<a-col :span="24" class="ant-col-item" >
<a-form-item
name="project_type_code" >
<template #label>项目分类编码
</template> <YunzhupaasInput v-model:value="dataForm.project_type_code"
placeholder="请输入" disabled
detailed allowClear :style='{"width":"100%"}' :maskConfig = "maskConfig.project_type_code" >
</YunzhupaasInput>
</a-form-item>
</a-col>
<a-col :span="24" class="ant-col-item" >
<a-form-item
name="project_type_name" >
<template #label>项目分类名称
</template> <YunzhupaasInput v-model:value="dataForm.project_type_name"
placeholder="请输入" disabled
detailed allowClear :style='{"width":"100%"}' :maskConfig = "maskConfig.project_type_name" >
</YunzhupaasInput>
</a-form-item>
</a-col>
<a-col :span="24" class="ant-col-item" >
<a-form-item
name="pid" >
<template #label>上级项目分类
</template> <p>{{dataForm.pid}}</p>
</a-form-item>
</a-col>
<a-col :span="24" class="ant-col-item" >
<a-form-item
name="seq_num" >
<template #label>顺序号
</template> <YunzhupaasInputNumber v-model:value="dataForm.seq_num"
placeholder="请输入" disabled
detailed :style='{"width":"100%"}' :step="1" :controls="false" >
</YunzhupaasInputNumber>
</a-form-item>
</a-col>
<a-col :span="24" class="ant-col-item" >
<a-form-item
name="remark" >
<template #label>备注
</template> <YunzhupaasUploadFile v-model:value="dataForm.remark"
disabled
detailed :fileSize="10" sizeUnit="MB" :limit="9" pathType="defaultPath" timeFormat="YYYY" buttonText="点击上传" >
</YunzhupaasUploadFile>
</a-form-item>
</a-col>
<!-- 表单结束 -->
</a-row>
</a-form>
</a-row>
</BasicDrawer>
<!-- 有关联表单详情开始 -->
<RelationDetail ref="relationDetailRef" />
<!-- 有关联表单详情结束 -->
</template>
<script lang="ts" setup>
import { getDetailInfo } from './helper/api';
import { getConfigData } from '@/api/onlineDev/visualDev';
import { reactive, toRefs, nextTick, ref, computed, unref ,toRaw} from 'vue';
import { BasicModal, useModal } from '@/components/Modal';
import { BasicDrawer, useDrawer } from '@/components/Drawer';
// 有关联表单详情
import RelationDetail from '@/views/common/dynamicModel/list/detail/index.vue';
// 表单权限
import { usePermission } from '@/hooks/web/usePermission';
import { useMessage } from '@/hooks/web/useMessage';
import { CaretRightOutlined } from '@ant-design/icons-vue';
import { buildUUID } from '@/utils/uuid';
import { useI18n } from '@/hooks/web/useI18n';
import { getDataChange } from '@/api/onlineDev/visualDev';
import { getDataInterfaceDataInfoByIds } from '@/api/systemData/dataInterface';
import ExtraRelationInfo from '@/components/yunzhupaas/RelationForm/src/ExtraRelationInfo.vue';
interface State {
dataForm: any;
title: string;
maskConfig: any;
interfaceRes: any;
locationScope: any;
extraOptions: any;
extraData: any;
}
defineOptions({ name: 'Detail' });
const { createMessage, createConfirm } = useMessage();
const [registerDrawer, { openDrawer, setDrawerProps, closeDrawer }] = useDrawer();
const { t } = useI18n();
const relationDetailRef = ref<any>(null);
const state = reactive<State>({
dataForm:{},
title: t('common.detailText','详情'),
maskConfig:{
project_type_code: {"prefixType":1,"useUnrealMask":false,"maskType":1,"unrealMaskLength":1,"prefixLimit":0,"suffixLimit":0,"filler":"*","prefixSpecifyChar":"","suffixType":1,"ignoreChar":"","suffixSpecifyChar":""} ,
project_type_name: {"prefixType":1,"useUnrealMask":false,"maskType":1,"unrealMaskLength":1,"prefixLimit":0,"suffixLimit":0,"filler":"*","prefixSpecifyChar":"","suffixType":1,"ignoreChar":"","suffixSpecifyChar":""} ,
}
,
interfaceRes: {"pid":[],"remark":[],"project_type_name":[],"seq_num":[],"project_type_code":[]},
locationScope:{
}
,
extraOptions: {
}
,
extraData: {
}
,
});
const { title, dataForm, maskConfig } = toRefs(state);
// 表单权限
const { hasFormP } = usePermission();
defineExpose({ init });
function init(data) {
state.dataForm.id = data.id;
openDrawer();
nextTick(() => {
setTimeout(initData, 0);
});
}
function initData() {
changeLoading(true);
if (state.dataForm.id) {
getData(state.dataForm.id);
} else {
closeDrawer();
}
}
function getData(id) {
getDetailInfo(id).then((res) => {
state.dataForm = res.data || {};
nextTick(() => {
changeLoading(false);
});
});
}
function toDetail(modelId, id, propsValue) {
if (!id) return;
getConfigData(modelId).then((res) => {
if (!res.data || !res.data.formData) return;
const formConf = JSON.parse(res.data.formData);
formConf.popupType = 'general';
formConf.hasPrintBtn = false;
formConf.customBtns = [];
const data = { id, formConf, modelId, propsValue};
relationDetailRef.value?.init(data);
});
}
function setFormProps(data) {
setDrawerProps(data);
}
function changeLoading(loading) {
setFormProps({ loading });
}
function getParamList(key) {
let templateJson: any[] = state.interfaceRes[key];
if (!templateJson || !templateJson.length || !state.dataForm) return templateJson;
for (let i = 0; i < templateJson.length; i++) {
if (templateJson[i].relationField && templateJson[i].sourceType == 1) {
templateJson[i].defaultValue = state.dataForm[templateJson[i].relationField + '_id'] || '';
}
}
return templateJson;
}
</script>

View File

@@ -0,0 +1,421 @@
<template>
<BasicDrawer
v-bind="$attrs"
@register="registerDrawer"
width="600px"
showFooter
:cancelText="t('common.cancelText', '取消')"
:okText="t('common.okText', '确定')"
@ok="handleSubmit"
:closeFunc="onClose">
<template #title>
<a-space :size="10">
<div class="text-16px font-medium">{{ title }}</div>
</a-space>
</template>
<a-row class="p-10px dynamic-form">
<!-- 表单 -->
<a-form
:colon="false"
size="middle"
layout="horizontal"
labelAlign="right"
:labelCol="{ style: { width: '100px' } }"
:model="dataForm"
:rules="dataRule"
ref="formRef">
<a-row :gutter="15">
<!-- 具体表单 -->
<a-col :span="24" class="ant-col-item">
<a-form-item name="project_type_code">
<template #label>项目分类编码 </template>
<YunzhupaasInput
v-model:value="dataForm.project_type_code"
@change="changeData('project_type_code', -1)"
placeholder="请输入"
:allowClear="true"
:style="{ width: '100%' }"
:maskConfig="maskConfig.project_type_code"
:showCount="false">
</YunzhupaasInput>
</a-form-item>
</a-col>
<a-col :span="24" class="ant-col-item">
<a-form-item name="project_type_name">
<template #label>项目分类名称 </template>
<YunzhupaasInput
v-model:value="dataForm.project_type_name"
@change="changeData('project_type_name', -1)"
placeholder="请输入"
:allowClear="true"
:style="{ width: '100%' }"
:maskConfig="maskConfig.project_type_name"
:showCount="false">
</YunzhupaasInput>
</a-form-item>
</a-col>
<a-col :span="24" class="ant-col-item">
<a-form-item name="pid">
<template #label>上级项目分类 </template>
<YunzhupaasTreeSelect
v-model:value="dataForm.pid"
@change="changeData('pid', -1)"
placeholder="请选择"
:templateJson="state.interfaceRes.pid"
:allowClear="true"
:style="{ width: '100%' }"
:showSearch="false"
:options="optionsObj.pidOptions"
:fieldNames="optionsObj.pidProps">
</YunzhupaasTreeSelect>
</a-form-item>
</a-col>
<a-col :span="24" class="ant-col-item">
<a-form-item name="seq_num">
<template #label>顺序号 </template>
<YunzhupaasInputNumber
v-model:value="dataForm.seq_num"
@change="changeData('seq_num', -1)"
placeholder="请输入"
:style="{ width: '100%' }"
:step="1"
:controls="false">
</YunzhupaasInputNumber>
</a-form-item>
</a-col>
<a-col :span="24" class="ant-col-item">
<a-form-item name="remark">
<template #label>备注 </template>
<YunzhupaasUploadFile
v-model:value="dataForm.remark"
@change="changeData('remark', -1)"
:fileSize="10"
sizeUnit="MB"
:limit="9"
pathType="defaultPath"
timeFormat="YYYY"
buttonText="点击上传">
</YunzhupaasUploadFile>
</a-form-item>
</a-col>
<!-- 表单结束 -->
</a-row>
</a-form>
</a-row>
</BasicDrawer>
</template>
<script lang="ts" setup>
import { create, update, getInfo,getTreeList } from './helper/api';
import { reactive, toRefs, nextTick, ref, unref, computed, toRaw, inject } from 'vue';
import { BasicDrawer, useDrawer } from '@/components/Drawer';
import { useMessage } from '@/hooks/web/useMessage';
import { useI18n } from '@/hooks/web/useI18n';
import { useUserStore } from '@/store/modules/user';
import type { FormInstance } from 'ant-design-vue';
import { thousandsFormat, getDateTimeUnit, getTimeUnit } from '@/utils/yunzhupaas';
import { getDictionaryDataSelector } from '@/api/systemData/dictionary';
import { getDataInterfaceRes } from '@/api/systemData/dataInterface';
import dayjs from 'dayjs';
// 表单权限
import { usePermission } from '@/hooks/web/usePermission';
import { cloneDeep } from 'lodash-es';
import { buildUUID } from '@/utils/uuid';
import { CaretRightOutlined } from '@ant-design/icons-vue';
interface State {
dataForm: any;
tableRows: any;
dataRule: any;
optionsObj: any;
childIndex: any;
isEdit: any;
interfaceRes: any;
//可选范围默认值
ableAll: any;
//掩码配置
maskConfig: any;
//定位属性
locationScope: any;
extraOptions: any;
title: string;
continueText: string;
allList: any[];
currIndex: number;
isContinue: boolean;
submitType: number;
showContinueBtn: boolean;
}
const emit = defineEmits(['reload']);
const getLeftTreeActiveInfo: (() => any) | null = inject('getLeftTreeActiveInfo', null);
const userStore = useUserStore();
const userInfo = userStore.getUserInfo;
const { createMessage, createConfirm } = useMessage();
const { t } = useI18n();
const [registerDrawer, { openDrawer, setDrawerProps }] = useDrawer();
const formRef = ref<FormInstance>();
const state = reactive<State>({
dataForm: {
project_type_code: undefined,
project_type_name: undefined,
pid: undefined,
seq_num: undefined,
remark: [],
},
tableRows: {},
dataRule: {},
optionsObj: {
pidOptions: [],
pidProps: { label: 'projectTypeName', value: 'projectTypeId', children: 'children' },
},
childIndex: -1,
isEdit: false,
interfaceRes: { pid: [], remark: [], project_type_name: [], seq_num: [], project_type_code: [] },
//可选范围默认值
ableAll: {},
//掩码配置
maskConfig: {
project_type_code: {
prefixType: 1,
useUnrealMask: false,
maskType: 1,
unrealMaskLength: 1,
prefixLimit: 0,
suffixLimit: 0,
filler: '*',
prefixSpecifyChar: '',
suffixType: 1,
ignoreChar: '',
suffixSpecifyChar: '',
},
project_type_name: {
prefixType: 1,
useUnrealMask: false,
maskType: 1,
unrealMaskLength: 1,
prefixLimit: 0,
suffixLimit: 0,
filler: '*',
prefixSpecifyChar: '',
suffixType: 1,
ignoreChar: '',
suffixSpecifyChar: '',
},
},
//定位属性
locationScope: {},
extraOptions: {},
title: '',
continueText: '',
allList: [],
currIndex: 0,
isContinue: false,
submitType: 0,
showContinueBtn: true,
});
const { title, continueText, showContinueBtn, dataRule, dataForm, optionsObj, ableAll, maskConfig, submitType } = toRefs(state);
const getPrevDisabled = computed(() => state.currIndex === 0);
const getNextDisabled = computed(() => state.currIndex === state.allList.length - 1);
// 表单权限
const { hasFormP } = usePermission();
defineExpose({ init });
function init(data) {
state.submitType = 0;
state.isContinue = false;
state.title = !data.id ? t('common.add2Text', '新增') : t('common.editText', '编辑');
state.continueText = !data.id ? t('common.continueAndAddText', '确定并新增') : t('common.continueText', '确定并继续');
setFormProps({ continueLoading: false });
state.dataForm.id = data.id;
openDrawer();
state.allList = data.allList;
state.currIndex = state.allList.length && data.id ? state.allList.findIndex(item => item.id === data.id) : 0;
nextTick(() => {
getForm().resetFields();
setTimeout(initData, 0);
});
}
function initData() {
TreeList()
changeLoading(true);
if (state.dataForm.id) {
getData(state.dataForm.id);
} else {
//初始化options
// 设置默认值
state.dataForm = {
project_type_code: undefined,
project_type_name: undefined,
pid: undefined,
seq_num: undefined,
remark: [],
};
if (getLeftTreeActiveInfo) state.dataForm = { ...state.dataForm, ...(getLeftTreeActiveInfo() || {}) };
state.childIndex = -1;
changeLoading(false);
}
}
function TreeList(){
getTreeList().then(res => {
state.optionsObj.pidOptions = res.data || [];
});
}
function getForm() {
const form = unref(formRef);
if (!form) {
throw new Error('form is null!');
}
return form;
}
function getData(id) {
getInfo(id).then(res => {
state.dataForm = res.data || {};
state.childIndex = -1;
changeLoading(false);
});
}
async function handleSubmit(type) {
try {
const values = await getForm()?.validate();
if (!values) return;
setFormProps({ confirmLoading: true });
const formMethod = state.dataForm.id ? update : create;
formMethod(state.dataForm)
.then(res => {
createMessage.success(res.msg);
setFormProps({ confirmLoading: false });
if (state.submitType == 1) {
initData();
state.isContinue = true;
} else {
setFormProps({ open: false });
emit('reload');
}
})
.catch(() => {
setFormProps({ confirmLoading: false });
});
} catch (_) {}
}
function handlePrev() {
state.currIndex--;
handleGetNewInfo();
}
function handleNext() {
state.currIndex++;
handleGetNewInfo();
}
function handleGetNewInfo() {
changeLoading(true);
getForm().resetFields();
const id = state.allList[state.currIndex].id;
getData(id);
}
function setFormProps(data) {
setDrawerProps(data);
}
function changeLoading(loading) {
setDrawerProps({ loading });
}
async function onClose() {
if (state.isContinue) emit('reload');
return true;
}
function changeData(model, index) {
state.isEdit = false;
state.childIndex = index;
for (let key in state.interfaceRes) {
if (key != model) {
let faceReList = state.interfaceRes[key];
for (let i = 0; i < faceReList.length; i++) {
let relationField = faceReList[i].relationField;
if (relationField) {
let modelAll = relationField.split('-');
let faceMode = '';
let faceMode2 = modelAll.length == 2 ? modelAll[0].substring(0, modelAll[0].length - 4) + modelAll[1] : '';
for (let i = 0; i < modelAll.length; i++) {
faceMode += modelAll[i];
}
if (faceMode == model || faceMode2 == model) {
let options = 'get' + key + 'Options';
eval(options)(true);
changeData(key, index);
}
}
}
}
}
}
function changeDataFormData(type, data, model, index, defaultValue) {
if (!state.isEdit) {
if (type == 2) {
for (let i = 0; i < state.dataForm[data].length; i++) {
if (index == -1) {
state.dataForm[data][i][model] = defaultValue;
} else if (index == i) {
state.dataForm[data][i][model] = defaultValue;
}
}
} else {
state.dataForm[data] = defaultValue;
}
}
}
function getRelationDate(timeRule, timeType, timeTarget, timeValueData, dataValue) {
let timeDataValue: any = null;
let timeValue = Number(timeValueData);
if (timeRule) {
if (timeType == 1) {
timeDataValue = timeValue;
} else if (timeType == 2) {
timeDataValue = dataValue;
} else if (timeType == 3) {
timeDataValue = new Date().getTime();
} else if (timeType == 4 || timeType == 5) {
const type = getTimeUnit(timeTarget);
const method = timeType == 4 ? 'subtract' : 'add';
timeDataValue = dayjs()[method](timeValue, type).valueOf();
}
}
return timeDataValue;
}
function getRelationTime(timeRule, timeType, timeTarget, timeValue, formatType, dataValue) {
let format = formatType == 'HH:mm' ? 'HH:mm:00' : formatType;
let timeDataValue: any = null;
if (timeRule) {
if (timeType == 1) {
timeDataValue = timeValue || '00:00:00';
if (timeDataValue.split(':').length == 3) {
timeDataValue = timeDataValue;
} else {
timeDataValue = timeDataValue + ':00';
}
} else if (timeType == 2) {
timeDataValue = dataValue;
} else if (timeType == 3) {
timeDataValue = dayjs().format(format);
} else if (timeType == 4 || timeType == 5) {
const type = getTimeUnit(timeTarget + 3);
const method = timeType == 4 ? 'subtract' : 'add';
timeDataValue = dayjs()[method](timeValue, type).format(format);
}
}
return timeDataValue;
}
</script>

View File

@@ -0,0 +1,39 @@
import { defHttp } from '@/utils/http/axios';
// 获取列表
export function getList(data) {
return defHttp.post({ url: '/api/bc/ProjectType/getList', data });
}
// 新建
export function create(data) {
return defHttp.post({ url:'/api/bc/ProjectType', data });
}
// 修改
export function update(data) {
return defHttp.put({ url: '/api/bc/ProjectType/'+ data.id, data });
}
// 详情(无转换数据)
export function getInfo(id) {
return defHttp.get({ url: '/api/bc/ProjectType/' + id });
}
// 获取(转换数据)
export function getDetailInfo(id) {
return defHttp.get({ url: '/api/bc/ProjectType/detail/' + id });
}
// 删除
export function del(id) {
return defHttp.delete({ url: '/api/bc/ProjectType/' + id });
}
// 批量删除数据
export function batchDelete(data) {
return defHttp.delete({ url: '/api/bc/ProjectType/batchRemove', data });
}
// 导出
export function exportData(data) {
return defHttp.post({ url: '/api/bc/ProjectType/Actions/Export', data });
}
// 树状列表查询
export function getTreeList() {
return defHttp.get({ url: '/api/bc/ProjectType/getTreeList' });
}

View File

@@ -0,0 +1,347 @@
const columnList = [
{
"yunzhupaasKey":"input",
"useScan":false,
"suffixIcon":"",
"fullNameI18nCode":[
""
],
"align":"left",
"showCount":false,
"__config__":{
"formId":"formItemede56d",
"yunzhupaasKey":"input",
"visibility":[
"pc",
"app"
],
"noShow":false,
"tipLabel":"",
"tableFixed":"none",
"dragDisabled":false,
"className":[],
"label":"项目分类编码",
"trigger":"blur",
"showLabel":true,
"required":false,
"tableName":"bc_project_type",
"renderKey":1778687997809,
"layout":"colFormItem",
"tagIcon":"icon-ym icon-ym-generator-input",
"tag":"YunzhupaasInput",
"regList":[],
"tableAlign":"left",
"span":24
},
"readonly":false,
"prop":"project_type_code",
"__vModel__":"project_type_code",
"disabled":false,
"id":"project_type_code",
"placeholder":"请输入",
"addonBefore":"",
"on":{
"change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}",
"blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}"
},
"clearable":true,
"resizable":true,
"maxlength":null,
"fullName":"项目分类编码",
"label":"项目分类编码",
"sortable":false,
"addonAfter":"",
"maskConfig":{
"prefixType":1,
"useUnrealMask":false,
"maskType":1,
"unrealMaskLength":1,
"prefixLimit":0,
"suffixLimit":0,
"filler":"*",
"prefixSpecifyChar":"",
"suffixType":1,
"ignoreChar":"",
"suffixSpecifyChar":""
},
"width":null,
"useMask":false,
"showPassword":false,
"fixed":"none",
"style":{
"width":"100%"
},
"prefixIcon":"",
"labelI18nCode":""
},
{
"yunzhupaasKey":"input",
"useScan":false,
"suffixIcon":"",
"fullNameI18nCode":[
""
],
"align":"left",
"showCount":false,
"__config__":{
"formId":"formItem98d1b5",
"yunzhupaasKey":"input",
"visibility":[
"pc",
"app"
],
"noShow":false,
"tipLabel":"",
"tableFixed":"none",
"dragDisabled":false,
"className":[],
"label":"项目分类名称",
"trigger":"blur",
"showLabel":true,
"required":false,
"tableName":"bc_project_type",
"renderKey":1778688012177,
"layout":"colFormItem",
"tagIcon":"icon-ym icon-ym-generator-input",
"tag":"YunzhupaasInput",
"regList":[],
"tableAlign":"left",
"span":24
},
"readonly":false,
"prop":"project_type_name",
"__vModel__":"project_type_name",
"disabled":false,
"id":"project_type_name",
"placeholder":"请输入",
"addonBefore":"",
"on":{
"change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}",
"blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}"
},
"clearable":true,
"resizable":true,
"maxlength":null,
"fullName":"项目分类名称",
"label":"项目分类名称",
"sortable":false,
"addonAfter":"",
"maskConfig":{
"prefixType":1,
"useUnrealMask":false,
"maskType":1,
"unrealMaskLength":1,
"prefixLimit":0,
"suffixLimit":0,
"filler":"*",
"prefixSpecifyChar":"",
"suffixType":1,
"ignoreChar":"",
"suffixSpecifyChar":""
},
"width":null,
"useMask":false,
"showPassword":false,
"fixed":"none",
"style":{
"width":"100%"
},
"prefixIcon":"",
"labelI18nCode":""
},
{
"yunzhupaasKey":"treeSelect",
"filterable":false,
"clearable":true,
"resizable":true,
"multiple":false,
"fullName":"上级项目分类",
"fullNameI18nCode":[
""
],
"label":"上级项目分类",
"sortable":false,
"align":"left",
"props":{
"children":"children",
"label":"fullName",
"value":"id"
},
"__config__":{
"yunzhupaasKey":"treeSelect",
"defaultValue":null,
"dragDisabled":false,
"className":[],
"propsUrl":"",
"templateJson":[],
"showLabel":true,
"required":false,
"tableName":"bc_project_type",
"renderKey":1778757286660,
"tagIcon":"icon-ym icon-ym-generator-tree",
"tag":"YunzhupaasTreeSelect",
"formId":"formItemb2dbd9",
"visibility":[
"pc",
"app"
],
"noShow":false,
"dataType":"static",
"dictionaryType":"",
"tipLabel":"",
"tableFixed":"none",
"label":"上级项目分类",
"trigger":"change",
"layout":"colFormItem",
"useCache":true,
"propsName":"",
"regList":[],
"tableAlign":"left",
"span":24
},
"prop":"pid",
"width":null,
"options":[
{
"children":[
{
"fullName":"选项1-1",
"id":"2"
}
],
"fullName":"选项1",
"id":"1"
}
],
"__vModel__":"pid",
"fixed":"none",
"style":{
"width":"100%"
},
"disabled":false,
"id":"pid",
"placeholder":"请选择",
"labelI18nCode":"",
"on":{
"change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}"
}
},
{
"yunzhupaasKey":"inputNumber",
"controls":false,
"resizable":true,
"fullName":"顺序号",
"fullNameI18nCode":[
""
],
"label":"顺序号",
"sortable":false,
"align":"left",
"thousands":false,
"isAmountChinese":false,
"addonAfter":"",
"__config__":{
"formId":"formItemad2faf",
"yunzhupaasKey":"inputNumber",
"visibility":[
"pc",
"app"
],
"noShow":false,
"tipLabel":"",
"tableFixed":"none",
"dragDisabled":false,
"className":[],
"label":"顺序号",
"trigger":[
"blur",
"change"
],
"showLabel":true,
"required":false,
"tableName":"bc_project_type",
"renderKey":1778756981845,
"layout":"colFormItem",
"tagIcon":"icon-ym icon-ym-generator-number",
"tag":"YunzhupaasInputNumber",
"regList":[],
"tableAlign":"left",
"span":24
},
"prop":"seq_num",
"width":null,
"__vModel__":"seq_num",
"fixed":"none",
"style":{
"width":"100%"
},
"step":1,
"disabled":false,
"id":"seq_num",
"placeholder":"请输入",
"addonBefore":"",
"labelI18nCode":"",
"on":{
"change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}",
"blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}"
}
},
{
"yunzhupaasKey":"uploadFile",
"fullNameI18nCode":[
""
],
"align":"left",
"__config__":{
"formId":"formItem1de75c",
"yunzhupaasKey":"uploadFile",
"visibility":[
"pc",
"app"
],
"defaultValue":[],
"noShow":false,
"tipLabel":"",
"tableFixed":"none",
"dragDisabled":false,
"className":[],
"label":"备注",
"trigger":"change",
"showLabel":true,
"required":false,
"tableName":"bc_project_type",
"renderKey":1779096055133,
"layout":"colFormItem",
"tagIcon":"icon-ym icon-ym-generator-upload",
"tag":"YunzhupaasUploadFile",
"regList":[],
"tableAlign":"left",
"span":24
},
"prop":"remark",
"limit":9,
"__vModel__":"remark",
"sizeUnit":"MB",
"disabled":false,
"id":"remark",
"on":{
"change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}"
},
"buttonText":"点击上传",
"resizable":true,
"fullName":"备注",
"label":"备注",
"sortable":false,
"pathType":"defaultPath",
"accept":"",
"folder":"",
"fileSize":10,
"sortRule":[],
"timeFormat":"YYYY",
"width":null,
"tipText":"",
"fixed":"none",
"labelI18nCode":""
}
]
export default columnList

View File

@@ -0,0 +1,76 @@
const searchList = [
{
"yunzhupaasKey":"input",
"useScan":false,
"suffixIcon":"",
"fullNameI18nCode":[
""
],
"showCount":false,
"__config__":{
"formId":"formItem98d1b5",
"yunzhupaasKey":"input",
"visibility":[
"pc",
"app"
],
"noShow":false,
"tipLabel":"",
"tableFixed":"none",
"dragDisabled":false,
"className":[],
"label":"项目分类名称",
"trigger":"blur",
"showLabel":true,
"required":false,
"tableName":"bc_project_type",
"renderKey":1778688012177,
"layout":"colFormItem",
"tagIcon":"icon-ym icon-ym-generator-input",
"tag":"YunzhupaasInput",
"regList":[],
"tableAlign":"left",
"span":24
},
"readonly":false,
"prop":"project_type_name",
"__vModel__":"project_type_name",
"searchMultiple":false,
"disabled":false,
"id":"project_type_name",
"placeholder":"请输入",
"addonBefore":"",
"on":{
"change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}",
"blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}"
},
"clearable":true,
"searchType":2,
"maxlength":null,
"fullName":"项目分类名称",
"label":"分类名称",
"addonAfter":"",
"maskConfig":{
"prefixType":1,
"useUnrealMask":false,
"maskType":1,
"unrealMaskLength":1,
"prefixLimit":0,
"suffixLimit":0,
"filler":"*",
"prefixSpecifyChar":"",
"suffixType":1,
"ignoreChar":"",
"suffixSpecifyChar":""
},
"isKeyword":false,
"useMask":false,
"showPassword":false,
"style":{
"width":"100%"
},
"prefixIcon":"",
"labelI18nCode":""
}
]
export default searchList

View File

@@ -0,0 +1,302 @@
const superQueryJson = [
{
"clearable":true,
"maxlength":null,
"useScan":false,
"suffixIcon":"",
"fullName":"项目分类编码",
"fullNameI18nCode":[
""
],
"addonAfter":"",
"showCount":false,
"__config__":{
"formId":"formItemede56d",
"yunzhupaasKey":"input",
"visibility":[
"pc",
"app"
],
"noShow":false,
"tipLabel":"",
"tableFixed":"none",
"dragDisabled":false,
"className":[],
"label":"项目分类编码",
"trigger":"blur",
"showLabel":true,
"required":false,
"tableName":"bc_project_type",
"renderKey":1778687997809,
"layout":"colFormItem",
"tagIcon":"icon-ym icon-ym-generator-input",
"tag":"YunzhupaasInput",
"regList":[],
"tableAlign":"left",
"span":24
},
"readonly":false,
"maskConfig":{
"prefixType":1,
"useUnrealMask":false,
"maskType":1,
"unrealMaskLength":1,
"prefixLimit":0,
"suffixLimit":0,
"filler":"*",
"prefixSpecifyChar":"",
"suffixType":1,
"ignoreChar":"",
"suffixSpecifyChar":""
},
"__vModel__":"project_type_code",
"useMask":false,
"showPassword":false,
"style":{
"width":"100%"
},
"disabled":false,
"id":"project_type_code",
"placeholder":"请输入",
"prefixIcon":"",
"addonBefore":"",
"on":{
"change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}",
"blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}"
}
},
{
"clearable":true,
"maxlength":null,
"useScan":false,
"suffixIcon":"",
"fullName":"项目分类名称",
"fullNameI18nCode":[
""
],
"addonAfter":"",
"showCount":false,
"__config__":{
"formId":"formItem98d1b5",
"yunzhupaasKey":"input",
"visibility":[
"pc",
"app"
],
"noShow":false,
"tipLabel":"",
"tableFixed":"none",
"dragDisabled":false,
"className":[],
"label":"项目分类名称",
"trigger":"blur",
"showLabel":true,
"required":false,
"tableName":"bc_project_type",
"renderKey":1778688012177,
"layout":"colFormItem",
"tagIcon":"icon-ym icon-ym-generator-input",
"tag":"YunzhupaasInput",
"regList":[],
"tableAlign":"left",
"span":24
},
"readonly":false,
"maskConfig":{
"prefixType":1,
"useUnrealMask":false,
"maskType":1,
"unrealMaskLength":1,
"prefixLimit":0,
"suffixLimit":0,
"filler":"*",
"prefixSpecifyChar":"",
"suffixType":1,
"ignoreChar":"",
"suffixSpecifyChar":""
},
"__vModel__":"project_type_name",
"useMask":false,
"showPassword":false,
"style":{
"width":"100%"
},
"disabled":false,
"id":"project_type_name",
"placeholder":"请输入",
"prefixIcon":"",
"addonBefore":"",
"on":{
"change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}",
"blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}"
}
},
{
"filterable":false,
"clearable":true,
"multiple":false,
"fullName":"上级项目分类",
"fullNameI18nCode":[
""
],
"props":{
"children":"children",
"label":"fullName",
"value":"id"
},
"__config__":{
"yunzhupaasKey":"treeSelect",
"defaultValue":null,
"dragDisabled":false,
"className":[],
"propsUrl":"",
"templateJson":[],
"showLabel":true,
"required":false,
"tableName":"bc_project_type",
"renderKey":1778757286660,
"tagIcon":"icon-ym icon-ym-generator-tree",
"tag":"YunzhupaasTreeSelect",
"formId":"formItemb2dbd9",
"visibility":[
"pc",
"app"
],
"noShow":false,
"dataType":"static",
"dictionaryType":"",
"tipLabel":"",
"tableFixed":"none",
"label":"上级项目分类",
"trigger":"change",
"layout":"colFormItem",
"useCache":true,
"propsName":"",
"regList":[],
"tableAlign":"left",
"span":24
},
"options":[
{
"children":[
{
"fullName":"选项1-1",
"id":"2"
}
],
"fullName":"选项1",
"id":"1"
}
],
"__vModel__":"pid",
"style":{
"width":"100%"
},
"disabled":false,
"id":"pid",
"placeholder":"请选择",
"on":{
"change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}"
}
},
{
"controls":false,
"fullName":"顺序号",
"fullNameI18nCode":[
""
],
"thousands":false,
"isAmountChinese":false,
"addonAfter":"",
"__config__":{
"formId":"formItemad2faf",
"yunzhupaasKey":"inputNumber",
"visibility":[
"pc",
"app"
],
"noShow":false,
"tipLabel":"",
"tableFixed":"none",
"dragDisabled":false,
"className":[],
"label":"顺序号",
"trigger":[
"blur",
"change"
],
"showLabel":true,
"required":false,
"tableName":"bc_project_type",
"renderKey":1778756981845,
"layout":"colFormItem",
"tagIcon":"icon-ym icon-ym-generator-number",
"tag":"YunzhupaasInputNumber",
"regList":[],
"tableAlign":"left",
"span":24
},
"__vModel__":"seq_num",
"style":{
"width":"100%"
},
"step":1,
"disabled":false,
"id":"seq_num",
"placeholder":"请输入",
"addonBefore":"",
"on":{
"change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}",
"blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}"
}
},
{
"buttonText":"点击上传",
"fullName":"备注",
"fullNameI18nCode":[
""
],
"pathType":"defaultPath",
"accept":"",
"__config__":{
"formId":"formItem1de75c",
"yunzhupaasKey":"uploadFile",
"visibility":[
"pc",
"app"
],
"defaultValue":[],
"noShow":false,
"tipLabel":"",
"tableFixed":"none",
"dragDisabled":false,
"className":[],
"label":"备注",
"trigger":"change",
"showLabel":true,
"required":false,
"tableName":"bc_project_type",
"renderKey":1779096055133,
"layout":"colFormItem",
"tagIcon":"icon-ym icon-ym-generator-upload",
"tag":"YunzhupaasUploadFile",
"regList":[],
"tableAlign":"left",
"span":24
},
"folder":"",
"fileSize":10,
"sortRule":[],
"timeFormat":"YYYY",
"limit":9,
"__vModel__":"remark",
"sizeUnit":"MB",
"tipText":"",
"disabled":false,
"id":"remark",
"on":{
"change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}"
}
}
]
export default superQueryJson

View File

@@ -0,0 +1,653 @@
<template>
<div class="yunzhupaas-content-wrapper">
<div class="yunzhupaas-content-wrapper-center">
<div class="yunzhupaas-content-wrapper-search-box" v-if="getSearchList.length">
<BasicForm @register="registerSearchForm" :schemas="getSearchList"
@advanced-change="redoHeight" @submit="handleSearchSubmit" @reset="handleSearchReset"
class="search-form">
</BasicForm>
</div>
<div class="yunzhupaas-content-wrapper-content bg-white">
<BasicTable @register="registerTable" v-bind="getTableBindValue" ref="tableRef"
@columns-change="handleColumnChange">
<template #tableTitle>
<a-button type="primary" preIcon="icon-ym icon-ym-btn-add" v-auth="'btn_add'"
@click="addHandle()"> {{t('common.add2Text','新增')}}</a-button>
</template>
<template #toolbar>
<a-tooltip placement="top">
<template #title>
<span>{{ t('common.superQuery') }}</span>
</template>
<filter-outlined @click="openSuperQuery(true, { columnOptions: superQueryJson })" />
</a-tooltip>
</template>
<template #toolbarAfter>
<ViewList :menuId="route.meta.modelId" :viewList="viewList" @itemClick="handleViewClick" @reload="initViewList" />
<ViewSetting :menuId="route.meta.modelId" :viewList="viewList" :currentView="currentView" @reload="initViewList" />
</template>
<template #bodyCell="{ column, record, index }">
<template v-for="(item, index) in childColumnList" v-if="childColumnList.length">
<template
v-if="column?.id?.includes('-') && item.children && item.children[0] && column.key === item.children[0]?.dataIndex">
<ChildTableColumn :data="record[item.prop]" :head="item.children"
@toggleExpand="toggleExpand(record, item.prop+`Expand`)" @toDetail="toDetail"
:expand="record[item.prop+`Expand`]" :key="index" :showOverflow="true "/>
</template>
</template>
<template v-if="!(record.top || column.id?.includes('-'))">
<template v-if="column.yunzhupaasKey === 'relationForm'">
<p class="link-text"
@click="toDetail(column.modelId, record[column.dataIndex+`_id`], column.propsValue)">
{{ record[column.dataIndex] }}</p>
</template>
<template v-if="column.yunzhupaasKey === 'inputNumber'">
<yunzhupaas-input-number v-model:value="record[column.prop]" :precision="column.precision" :thousands="column.thousands" disabled detailed />
</template>
<template v-if="column.yunzhupaasKey === 'calculate'">
<yunzhupaas-calculate
v-model:value="record[column.prop]"
:isStorage="column.isStorage"
:precision="column.precision"
:thousands="column.thousands"
detailed />
</template>
<template v-if="column.yunzhupaasKey === 'sign'">
<yunzhupaas-sign v-model:value="record[column.prop]" detailed />
</template>
<template v-if="column.yunzhupaasKey === 'signature'">
<yunzhupaas-signature v-model:value="record[column.prop]" detailed />
</template>
<template v-if="column.yunzhupaasKey === 'rate'">
<yunzhupaas-rate v-model:value="record[column.prop]" :count="column.count" :allowHalf="column.allowHalf" disabled />
</template>
<template v-if="column.yunzhupaasKey === 'slider'">
<yunzhupaas-slider v-model:value="record[column.prop]" :min="column.min" :max="column.max" :step="column.step" disabled />
</template>
<template v-if="column.yunzhupaasKey === 'uploadImg'">
<yunzhupaas-upload-img v-model:value="record[column.prop]" disabled detailed simple v-if="record[column.prop]?.length" />
</template>
<template v-if="column.yunzhupaasKey === 'uploadFile'">
<yunzhupaas-upload-file v-model:value="record[column.prop]" disabled detailed simple v-if="record[column.prop]?.length" />
</template>
<template v-if="column.yunzhupaasKey === 'input'">
<yunzhupaas-input
v-model:value="record[column.prop]"
:useMask="column.useMask"
:maskConfig="column.maskConfig"
:showOverflow="true"
detailed />
</template>
</template>
<template v-if="column.key === 'action' && !record.top">
<TableAction :actions="getTableActions(record)" />
</template>
</template>
</BasicTable>
</div>
</div>
<Form ref="formRef" @reload="reload" />
<Detail ref="detailRef" />
<ExportModal @register="registerExportModal" @download="handleDownload" />
<ImportModal @register="registerImportModal" @reload="reload" />
<PrintSelect @register="registerPrintSelect" @change="handleShowBrowse" />
<PrintBrowse @register="registerPrintBrowse" />
<RelationDetail ref="relationDetailRef" />
<SuperQueryModal @register="registerSuperQueryModal" @superQuery="handleSuperQuery" />
</div>
</template>
<script lang="ts" setup>
import { getList, del, exportData, batchDelete } from './helper/api';
import { getConfigData,getViewList } from '@/api/onlineDev/visualDev';
import { getDictionaryDataSelector } from '@/api/systemData/dictionary';
import { getDataInterfaceRes } from '@/api/systemData/dataInterface';
import { getOrgByOrganizeCondition,getDepartmentSelectAsyncList } from '@/api/permission/organize';
import { ref, reactive, onMounted, toRefs, computed, unref, nextTick, toRaw, provide } from 'vue';
import { useMessage } from '@/hooks/web/useMessage';
import { useI18n } from '@/hooks/web/useI18n';
import { useOrganizeStore } from '@/store/modules/organize';
import { useUserStore } from '@/store/modules/user';
import { BasicModal, useModal } from '@/components/Modal';
import { usePopup } from '@/components/Popup';
import { ScrollContainer } from '@/components/Container';
import { BasicLeftTree, TreeActionType } from '@/components/Tree';
import { BasicForm, useForm } from '@/components/Form';
import { BasicTable, useTable, TableAction, ActionItem, TableActionType, SorterResult } from '@/components/Table';
import { SuperQueryModal } from '@/components/CommonModal';
import Form from './Form.vue';
import Detail from './Detail.vue';
// 有关联表单详情:开始
import RelationDetail from '@/views/common/dynamicModel/list/detail/index.vue';
// 有关联表单详情:结束
import ChildTableColumn from '@/views/common/dynamicModel/list/ChildTableColumn.vue';
import { ExportModal } from '@/components/CommonModal';
import { downloadByUrl } from '@/utils/file/download';
import { ImportModal} from '@/components/CommonModal';
// 打印模板多条生成PrintSelect
import PrintSelect from '@/components/PrintDesign/printSelect/index.vue';
import PrintBrowse from '@/components/PrintDesign/printBrowse/index.vue';
import { useRoute,useRouter } from 'vue-router';
import { FilterOutlined } from '@ant-design/icons-vue';
import { getSearchFormSchemas } from '@/components/FormGenerator/src/helper/transform';
import { cloneDeep } from 'lodash-es';
import columnList from './helper/columnList';
import searchList from './helper/searchList';
import superQueryJson from './helper/superQueryJson';
import { dyOptionsList, systemComponentsList } from '@/components/FormGenerator/src/helper/config';
import { thousandsFormat, getParamList} from '@/utils/yunzhupaas';
import { usePermission } from '@/hooks/web/usePermission';
import ViewSetting from '@/views/common/dynamicModel/list/components/ViewSetting.vue';
import ViewList from '@/views/common/dynamicModel/list/components/ViewList.vue';
interface State {
config: any;
columnList: any[];
printListOptions: any[];
columnBtnsList: any[];
customBtnsList: any[];
treeFieldNames: any;
leftTreeData: any[];
leftTreeLoading: boolean;
treeActiveId: string;
treeActiveNodePath: any;
columns: any[];
complexColumns: any[];
childColumnList: any[];
exportList: any[];
cacheList: any[];
currFlow: any;
isCustomCopy: boolean;
candidateType: number;
currRow: any;
workFlowFormData: any;
expandObj: any;
columnSettingList: any[];
searchSchemas: any[];
treeRelationObj: any;
treeQueryJson: any;
leftTreeActiveInfo: any;
keyword: string;
viewList: any[];
currentView: any;
}
const route = useRoute();
const { hasBtnP } = usePermission();
const { createMessage, createConfirm } = useMessage();
const { t } = useI18n();
const organizeStore = useOrganizeStore();
const userStore = useUserStore();
const userInfo = userStore.getUserInfo;
const [registerExportModal, { openModal: openExportModal, closeModal: closeExportModal, setModalProps: setExportModalProps }] = useModal();
const [registerImportModal, { openModal: openImportModal }] = useModal();
const [registerSuperQueryModal, { openModal: openSuperQuery }] = useModal();
const formRef = ref<any>(null);
const tableRef = ref<Nullable<TableActionType>>(null);
const detailRef = ref<any>(null);
const relationDetailRef = ref<any>(null);
const state = reactive<State>({
config: {},
columnList: [],
printListOptions: [],
columnBtnsList: [],
customBtnsList: [],
treeFieldNames: {
children: 'children' ,
title: 'fullName' ,
key: 'id' ,
isLeaf: 'isLeaf',
},
leftTreeData: [],
leftTreeLoading: false,
treeActiveId: '',
treeActiveNodePath: [],
columns: [],
complexColumns: [], // 复杂表头
childColumnList: [],
exportList: [],
cacheList: [],
currFlow: {},
isCustomCopy: false,
candidateType: 1,
currRow: {},
workFlowFormData: {},
expandObj: {},
columnSettingList: [],
searchSchemas: [],
treeRelationObj: null,
treeQueryJson: {},
leftTreeActiveInfo: {},
keyword: '',
viewList: [],
currentView: {},
});
const defaultSearchInfo = {
menuId: route.meta.modelId as string,
moduleId:'824397917879010373',
superQueryJson: '',
pageSize:1000000, //没有分页,树形,分组
};
const searchInfo = reactive({
...cloneDeep(defaultSearchInfo),
});
const { childColumnList, searchSchemas, viewList, currentView} = toRefs(state);
const [registerSearchForm, { updateSchema, resetFields, submit: searchFormSubmit, setFieldsValue}] = useForm({
baseColProps: { span: 6 },
showActionButtonGroup: true,
showAdvancedButton: true,
compact: true,
});
const [registerTable, { reload, setLoading, getFetchParams, getSelectRows, getSelectRowKeys, redoHeight,clearSelectedRowKeys }] = useTable({
api: getList,
immediate: false,
clickToRowSelect: false,
tableSetting: { setting: false },
afterFetch: (data) => {
const list = data.map((o) => ({
...o,
...state.expandObj,
}));
state.cacheList = cloneDeep(list);
return list;
},
});
const [registerChildTable] = useTable({
pagination: false,
canResize: false,
showTableSetting: false,
});
provide('getLeftTreeActiveInfo', () => state.leftTreeActiveInfo);
const getHasBatchBtn = computed(() => {
let btnsList =[]
btnsList=btnsList.filter(o => hasBtnP('btn_' + o))
return !!btnsList.length
});
const getColumns = computed(() => {
const columns = state.complexColumns;
return setListValue(state.currentView?.columnList, columns, 'prop');
});
const getSearchList = computed(() => {
const searchSchemas = cloneDeep(state.searchSchemas).map(o => ({ ...o, show: true }));
return setListValue(state.currentView?.searchList, searchSchemas, 'field');
});
const getTableBindValue = computed(() => {
let columns = unref(getColumns);
const defaultSortConfig=[{"field":"seq_num","sort":"asc","id":"sort413263"}];
const sortField = defaultSortConfig.map(o => (o.sort === 'desc' ? '-' : '') + o.field);
const data: any = {
pagination: false, //没有分页,树形,分组
searchInfo: unref(searchInfo),
defSort: { sidx: sortField.join(',') },
sortFn: (sortInfo: SorterResult | SorterResult[]) => {
if (Array.isArray(sortInfo)) {
const sortList = sortInfo.map(o => (o.order === 'descend' ? '-' : '') + o.field);
return { sidx: sortList.join(',') };
} else {
const { field, order } = sortInfo;
if (field && order) {
// 排序字段
return { sidx: (order === 'descend' ? '-' : '') + field };
} else {
return {};
}
}
},
ellipsis:true ,
columns,
isTreeTable: true,
bordered: true,
actionColumn: {
width: 150,
title: t('component.table.action'),
dataIndex: 'action',
},
};
return data;
});
function init() {
state.config = {};
searchInfo.menuId = route.meta.modelId as string;
state.columnList = columnList;
setLoading(true);
getSearchSchemas();
getColumnList();
initViewList();
nextTick(() => {
unref(getSearchList)?.length ? searchFormSubmit() : reload({ page: 1 });
});
}
function getSearchSchemas() {
const schemas = getSearchFormSchemas(searchList);
state.searchSchemas = schemas;
schemas.forEach((cur) => {
const config = cur.__config__;
if (dyOptionsList.includes(config.yunzhupaasKey)) {
if (config.dataType === 'dictionary') {
if (!config.dictionaryType) return;
getDictionaryDataSelector(config.dictionaryType).then((res) => {
updateSchema([{ field: cur.field, componentProps: { options: res.data.list } }]);
});
}
if (config.dataType === 'dynamic') {
if (!config.propsUrl) return;
const query = { paramList: getParamList(config.templateJson) };
getDataInterfaceRes(config.propsUrl, query).then((res) => {
const data = Array.isArray(res.data) ? res.data : [];
updateSchema([{ field: cur.field, componentProps: { options: data } }]);
});
}
}
cur.defaultValue = cur.value;
});
}
function getColumnList() {
// 没有开启列表权限
let columnList = state.columnList;
state.exportList = columnList;
let columns = columnList.map((o) => ({
...o,
title: o.labelI18nCode ? t(o.labelI18nCode, o.label) : o.label,
dataIndex: o.prop,
align: o.align,
fixed: o.fixed == 'none' ? false : o.fixed,
sorter: o.sortable ? { multiple: 1 } : o.sortable,
width: o.width || 100,
}));
//添加复杂表头
columns = getComplexColumns(columns);
state.columns = columns.filter((o) => o.prop.indexOf('-') < 0);
//子表表头
getChildComplexColumns(columns);
}
//复杂表头
function getComplexColumns(columns) {
//这里生成复杂表头的配置
let complexHeaderList: any[] = [];
if (!complexHeaderList.length) return columns;
let childColumns: any[] = [];
let firstChildColumns: string[] = [];
for (let i = 0; i < complexHeaderList.length; i++) {
const e = complexHeaderList[i];
e.label = e.fullName;
e.labelI18nCode = e.fullNameI18nCode;
e.title = e.fullNameI18nCode ? t(e.fullNameI18nCode, e.fullName) : e.fullName;
e.align = e.align;
e.dataIndex = e.id;
e.prop = e.id;
e.children = [];
e.yunzhupaasKey = 'complexHeader';
if (e.childColumns?.length) {
childColumns.push(...e.childColumns);
for (let k = 0; k < e.childColumns.length; k++) {
const item = e.childColumns[k];
for (let j = 0; j < columns.length; j++) {
const o = columns[j];
if (o.prop == item && o.fixed !== 'left' && o.fixed !== 'right') e.children.push({ ...o });
}
}
}
if (e.children.length) firstChildColumns.push(e.children[0].prop);
}
complexHeaderList = complexHeaderList.filter(o => o.children.length);
let list: any[] = [];
for (let i = 0; i < columns.length; i++) {
const e = columns[i];
if (!childColumns.includes(e.prop)) {
list.push(e);
} else {
if (firstChildColumns.includes(e.prop)) {
const item = complexHeaderList.find(o => o.childColumns.includes(e.prop));
list.push(item);
}
}
}
return list;
}
//子表表头
function getChildComplexColumns(columnList) {
let list: any[] = [];
for (let i = 0; i < columnList.length; i++) {
const e = columnList[i];
if (!e.prop.includes('-')) {
list.push(e);
} else {
let prop = e.prop.split('-')[0];
let vModel = e.prop.split('-')[1];
let label = e.label.split('-')[0];
let childLabel = e.label.replace(label + '-', '');
if (e.fullNameI18nCode && Array.isArray(e.fullNameI18nCode) && e.fullNameI18nCode[0]) label = t(e.fullNameI18nCode[0], label);
let newItem = {
align: 'center',
yunzhupaasKey: 'table',
prop,
label,
title: label,
dataIndex: prop,
children: [],
};
e.dataIndex = vModel;
e.title = e.labelI18nCode ? t(e.labelI18nCode, childLabel) : childLabel;
if (!state.expandObj.hasOwnProperty(prop+`Expand`)) state.expandObj[prop+`Expand`] = false;
if (!list.some((o) => o.prop === prop)) list.push(newItem);
for (let i = 0; i < list.length; i++) {
if (list[i].prop === prop) {
list[i].children.push(e);
break;
}
}
}
}
// 行内分组展示
getMergeList(list);
state.complexColumns = list;
state.childColumnList = list.filter((o) => o.yunzhupaasKey === 'table');
// 子表分组展示宽度取100
for (let i = 0; i < state.childColumnList.length; i++) {
const e = state.childColumnList[i];
if (e.children?.length) e.children = e.children.map(o => ({ ...o, width: 100 }));
}
}
function getMergeList(list) {
list.forEach((item) => {
if (item.yunzhupaasKey === 'table' && item.children && item.children.length) {
item.children.forEach((child, index) => {
if (index == 0) {
child.customCell = () => ({
rowspan: 1,
colspan: item.children.length,
class: 'child-table-box',
});
} else {
child.customCell = () => ({
rowspan: 0,
colspan: 0,
});
}
});
}
});
}
function toggleExpand(row, field) {
row[field] = !row[field];
}
// 关联表单查看详情
function toDetail(modelId, id, propsValue) {
if (!id) return;
getConfigData(modelId).then((res) => {
if (!res.data || !res.data.formData) return;
const formConf = JSON.parse(res.data.formData);
formConf.popupType = 'general';
formConf.hasPrintBtn = false;
formConf.customBtns = [];
const data = { id, formConf, modelId, propsValue};
relationDetailRef.value?.init(data);
});
}
function handleColumnChange(data) {
state.columnSettingList = data;
}
function getTableActions(record): ActionItem[] {
return [
{
label: t('common.editText','编辑') ,
onClick: updateHandle.bind(null, record),
auth: 'btn_edit', //有按钮权限
},
{
label: t('common.delText','删除') ,
color: 'error',
modelConfirm: {
onOk: handleDelete.bind(null, record.id),
},
auth: 'btn_remove', //有按钮权限
},
{
label: t('common.detailText','详情') ,
onClick: goDetail.bind(null, record),
auth: 'btn_detail', //有按钮权限
},
];
}
// 编辑
function updateHandle(record) {
// 不带工作流
const data = {
id: record.id,
menuId: searchInfo.menuId,
allList: state.cacheList,
};
formRef.value?.init(data);
}
// 删除
function handleDelete(id) {
const query={ids:[id] }
batchDelete(query).then((res) => {
createMessage.success(res.msg);
clearSelectedRowKeys();
reload();
});
}
// 查看详情
function goDetail(record) {
// 不带流程
const data = {
id: record.id,
};
detailRef.value?.init(data);
}
// 新增
function addHandle() {
// 不带流程新增
const data = {
id: '',
menuId: searchInfo.menuId,
allList: state.cacheList,
};
formRef.value?.init(data);
}
// 高级查询
function handleSuperQuery(superQueryJson) {
searchInfo.superQueryJson = superQueryJson;
reload({ page: 1 });
}
function handleSearchReset() {
clearSelectedRowKeys();
if (!state.resetFromTree) updateSearchFormValue();
if (state.resetFromTree) state.resetFromTree = false;
}
function handleSearchSubmit(data) {
clearSelectedRowKeys();
let obj = {
...defaultSearchInfo,
superQueryJson: searchInfo.superQueryJson,
...data,
};
Object.keys(searchInfo).map(key => {
delete searchInfo[key];
});
for (let [key, value] of Object.entries(obj)) {
searchInfo[key.replaceAll('-', '_')] = value;
}
console.log(searchInfo);
reload({ page: 1 });
}
function updateSearchFormValue() {
if (!state.treeActiveId) return searchFormSubmit();
let queryJson: any = {};
let leftTreeActiveInfo: any = {};
const isMultiple = !state.treeRelationObj ? false : state.treeRelationObj.searchMultiple;
//多级左侧树,需要拼父级->转为查询参数
if (state.treeRelationObj && state.treeRelationObj.yunzhupaasKey && ['organizeSelect', 'cascader', 'areaSelect'].includes(state.treeRelationObj.yunzhupaasKey)) {
let currValue = [];
currValue = state.treeActiveNodePath.map(o => o[state.treeFieldNames.key]);
queryJson = { '': isMultiple ? [currValue] : currValue };
leftTreeActiveInfo = { '': state.treeRelationObj.multiple ? [currValue] : currValue };
} else {
queryJson = { '': isMultiple ? [state.treeActiveId] : state.treeActiveId };
leftTreeActiveInfo = { '': state.treeRelationObj.multiple ? [state.treeActiveId] : state.treeActiveId };
}
state.leftTreeActiveInfo = leftTreeActiveInfo;
if(unref(getSearchList)?.length){
// 有搜索列表
setFieldsValue(queryJson);
searchFormSubmit();
}else{
// 无搜索列表
handleSearchSubmit(queryJson);
}
}
function initViewList(currentId = '') {
const query = {
menuId: route.meta.modelId,
};
getViewList(query).then(res => {
const columns : any[]= state.complexColumns;
const searchList: any[] = state.searchSchemas.map(o => ({ label: o.label, id: o.field, show: o.show, labelI18nCode: o.labelI18nCode }));
const columnList: any[] = columns.map(o => ({ label: o.label, id: o.prop, show: true, fixed: o.fixed || 'none', labelI18nCode: o.labelI18nCode }));
state.viewList = (res.data || []).map(o => {
if (o.type == 0) return { ...o, searchList, columnList };
return { ...o, searchList: o.searchList ? JSON.parse(o.searchList) : [], columnList: o.columnList ? JSON.parse(o.columnList) : [] };
});
if (currentId) {
state.currentView = state.viewList.filter(o => o.id === currentId)[0] || state.viewList[0];
} else {
state.currentView = state.viewList.filter(o => o.status === 1)[0] || state.viewList[0];
}
});
}
function handleViewClick(item) {
state.currentView = item;
}
function setListValue(data: any[] = [], defaultData: any[] = [], key) {
let list: any[] = [];
for (let i = 0; i < data.length; i++) {
for (let j = 0; j < defaultData.length; j++) {
if (data[i].show && data[i].id == defaultData[j][key]) list.push(defaultData[j]);
}
}
return list;
}
onMounted(() => {
init();
});
</script>

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,34 @@
import { defHttp } from '@/utils/http/axios';
// 获取列表
export function getList(data) {
return defHttp.post({ url: '/api/4/Contract/getList', data });
}
// 新建
export function create(data) {
return defHttp.post({ url:'/api/cm/Contract', data });
}
// 修改
export function update(data) {
return defHttp.put({ url: '/api/cm/Contract/'+ data.id, data });
}
// 详情(无转换数据)
export function getInfo(id) {
return defHttp.get({ url: '/api/cm/Contract/' + id });
}
// 获取(转换数据)
export function getDetailInfo(id) {
return defHttp.get({ url: '/api/cm/Contract/detail/' + id });
}
// 删除
export function del(id) {
return defHttp.delete({ url: '/api/cm/Contract/' + id });
}
// 批量删除数据
export function batchDelete(data) {
return defHttp.delete({ url: '/api/cm/Contract/batchRemove', data });
}
// 导出
export function exportData(data) {
return defHttp.post({ url: '/api/cm/Contract/Actions/Export', data });
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,285 @@
const searchList = [
{
"yunzhupaasKey":"input",
"useScan":false,
"suffixIcon":"",
"fullNameI18nCode":[
""
],
"showCount":false,
"__config__":{
"formId":"formItem667983",
"yunzhupaasKey":"input",
"visibility":[
"pc",
"app"
],
"noShow":false,
"tipLabel":"",
"tableFixed":"none",
"dragDisabled":false,
"className":[],
"label":"合同名称",
"trigger":"blur",
"showLabel":true,
"required":false,
"tableName":"cm_contract",
"renderKey":1778233391557,
"layout":"colFormItem",
"tagIcon":"icon-ym icon-ym-generator-input",
"tag":"YunzhupaasInput",
"regList":[],
"tableAlign":"left",
"span":16
},
"readonly":false,
"prop":"contract_name",
"__vModel__":"contract_name",
"searchMultiple":false,
"disabled":false,
"id":"contract_name",
"placeholder":"请输入",
"addonBefore":"",
"on":{
"change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}",
"blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}"
},
"clearable":true,
"searchType":2,
"maxlength":null,
"fullName":"合同名称",
"label":"合同名称",
"addonAfter":"",
"maskConfig":{
"prefixType":1,
"useUnrealMask":false,
"maskType":1,
"unrealMaskLength":1,
"prefixLimit":0,
"suffixLimit":0,
"filler":"*",
"prefixSpecifyChar":"",
"suffixType":1,
"ignoreChar":"",
"suffixSpecifyChar":""
},
"isKeyword":false,
"useMask":false,
"showPassword":false,
"style":{
"width":"100%"
},
"prefixIcon":"",
"labelI18nCode":""
},
{
"yunzhupaasKey":"organizeSelect",
"filterable":false,
"clearable":true,
"searchType":1,
"ableIds":[],
"multiple":false,
"fullName":"归属组织",
"fullNameI18nCode":[
""
],
"label":"归属组织",
"__config__":{
"formId":"formItem19e51b",
"yunzhupaasKey":"organizeSelect",
"visibility":[
"pc",
"app"
],
"defaultValue":[],
"noShow":false,
"tipLabel":"",
"tableFixed":"none",
"dragDisabled":false,
"className":[],
"label":"归属组织",
"trigger":"change",
"showLabel":true,
"required":false,
"tableName":"cm_contract",
"renderKey":1778234738473,
"layout":"colFormItem",
"tagIcon":"icon-ym icon-ym-generator-company",
"defaultCurrent":true,
"tag":"YunzhupaasOrganizeSelect",
"regList":[],
"tableAlign":"left",
"span":8
},
"prop":"org_id",
"__vModel__":"org_id",
"searchMultiple":true,
"isKeyword":false,
"style":{
"width":"100%"
},
"selectType":"all",
"disabled":false,
"id":"org_id",
"placeholder":"请选择",
"value":[],
"labelI18nCode":"",
"on":{
"change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}"
}
},
{
"yunzhupaasKey":"select",
"filterable":false,
"clearable":true,
"searchType":1,
"multiple":false,
"fullName":"合同分类",
"fullNameI18nCode":[
""
],
"label":"合同分类",
"props":{
"label":"fullName",
"value":"id"
},
"__config__":{
"yunzhupaasKey":"select",
"defaultValue":"",
"dragDisabled":false,
"className":[],
"propsUrl":"",
"templateJson":[],
"showLabel":true,
"required":false,
"tableName":"cm_contract",
"renderKey":1778234785187,
"tagIcon":"icon-ym icon-ym-generator-select",
"tag":"YunzhupaasSelect",
"formId":"formItema4f236",
"visibility":[
"pc",
"app"
],
"noShow":false,
"dataType":"dictionary",
"dictionaryType":"contractCategory",
"tipLabel":"",
"tableFixed":"none",
"label":"合同分类",
"trigger":"change",
"layout":"colFormItem",
"useCache":true,
"propsName":"",
"regList":[],
"tableAlign":"left",
"span":8
},
"prop":"contract_category",
"options":[
{
"enCode":"1010",
"children":null,
"hasChildren":false,
"fullName":"商品销售合同",
"id":"contractCategory-1010",
"parentId":"0"
},
{
"enCode":"1020",
"children":null,
"hasChildren":false,
"fullName":"材料采购合同",
"id":"contractCategory-1020",
"parentId":"0"
},
{
"enCode":"1030",
"children":null,
"hasChildren":false,
"fullName":"资产采购合同",
"id":"contractCategory-1030",
"parentId":"0"
},
{
"enCode":"1040",
"children":null,
"hasChildren":false,
"fullName":"资产租赁合同",
"id":"contractCategory-1040",
"parentId":"0"
},
{
"enCode":"1050",
"children":null,
"hasChildren":false,
"fullName":"软件销售合同",
"id":"contractCategory-1050",
"parentId":"0"
}
],
"__vModel__":"contract_category",
"searchMultiple":true,
"isKeyword":false,
"style":{
"width":"100%"
},
"disabled":false,
"id":"contract_category",
"placeholder":"请选择",
"labelI18nCode":"",
"on":{
"change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}"
}
},
{
"yunzhupaasKey":"billRule",
"searchType":2,
"fullName":"合同编码",
"fullNameI18nCode":[
""
],
"label":"合同编码",
"__config__":{
"formId":"formItemaa97ea",
"yunzhupaasKey":"billRule",
"visibility":[
"pc",
"app"
],
"defaultValue":null,
"noShow":false,
"tipLabel":"",
"tableFixed":"none",
"dragDisabled":false,
"rule":"contractCode",
"className":[],
"label":"合同编码",
"trigger":"change",
"ruleConfig":{},
"showLabel":true,
"required":false,
"tableName":"cm_contract",
"renderKey":1778233919360,
"layout":"colFormItem",
"tagIcon":"icon-ym icon-ym-generator-documents",
"ruleType":1,
"ruleName":"合同编码",
"tag":"YunzhupaasInput",
"tableAlign":"left",
"span":8
},
"readonly":true,
"prop":"contract_code",
"__vModel__":"contract_code",
"searchMultiple":false,
"isKeyword":false,
"style":{
"width":"100%"
},
"id":"contract_code",
"placeholder":"系统自动生成",
"labelI18nCode":""
}
]
export default searchList

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,709 @@
<template>
<div class="yunzhupaas-content-wrapper">
<div class="yunzhupaas-content-wrapper-center">
<div class="yunzhupaas-content-wrapper-search-box" v-if="getSearchList.length">
<BasicForm @register="registerSearchForm" :schemas="getSearchList"
@advanced-change="redoHeight" @submit="handleSearchSubmit" @reset="handleSearchReset"
class="search-form">
</BasicForm>
</div>
<div class="yunzhupaas-content-wrapper-content bg-white">
<BasicTable @register="registerTable" v-bind="getTableBindValue" ref="tableRef"
@columns-change="handleColumnChange">
<template #tableTitle>
<a-button type="primary" preIcon="icon-ym icon-ym-btn-add" v-auth="'btn_add'"
@click="addHandle()"> {{t('common.add2Text','新增')}}</a-button>
<a-button type="link" preIcon="icon-ym icon-ym-btn-download" v-auth="'btn_download'"
@click="openExportModal(true, { columnList: state.exportList, selectIds: getSelectRowKeys(), showExportSelected: true })"> {{t('common.exportText','导出')}}</a-button>
</template>
<template #toolbar>
<a-tooltip placement="top">
<template #title>
<span>{{ t('common.superQuery') }}</span>
</template>
<filter-outlined @click="openSuperQuery(true, { columnOptions: superQueryJson })" />
</a-tooltip>
</template>
<template #toolbarAfter>
<ViewList :menuId="route.meta.modelId" :viewList="viewList" @itemClick="handleViewClick" @reload="initViewList" />
<ViewSetting :menuId="route.meta.modelId" :viewList="viewList" :currentView="currentView" @reload="initViewList" />
</template>
<template #bodyCell="{ column, record, index }">
<template v-for="(item, index) in childColumnList" v-if="childColumnList.length">
<template
v-if="column?.id?.includes('-') && item.children && item.children[0] && column.key === item.children[0]?.dataIndex">
<ChildTableColumn :data="record[item.prop]" :head="item.children"
@toggleExpand="toggleExpand(record, item.prop+`Expand`)" @toDetail="toDetail"
:expand="record[item.prop+`Expand`]" :key="index" :showOverflow="true "/>
</template>
</template>
<template v-if="!(record.top || column.id?.includes('-'))">
<template v-if="column.yunzhupaasKey === 'relationForm'">
<p class="link-text"
@click="toDetail(column.modelId, record[column.dataIndex+`_id`], column.propsValue)">
{{ record[column.dataIndex] }}</p>
</template>
<template v-if="column.yunzhupaasKey === 'inputNumber'">
<yunzhupaas-input-number v-model:value="record[column.prop]" :precision="column.precision" :thousands="column.thousands" disabled detailed />
</template>
<template v-if="column.yunzhupaasKey === 'calculate'">
<yunzhupaas-calculate
v-model:value="record[column.prop]"
:isStorage="column.isStorage"
:precision="column.precision"
:thousands="column.thousands"
detailed />
</template>
<template v-if="column.yunzhupaasKey === 'sign'">
<yunzhupaas-sign v-model:value="record[column.prop]" detailed />
</template>
<template v-if="column.yunzhupaasKey === 'signature'">
<yunzhupaas-signature v-model:value="record[column.prop]" detailed />
</template>
<template v-if="column.yunzhupaasKey === 'rate'">
<yunzhupaas-rate v-model:value="record[column.prop]" :count="column.count" :allowHalf="column.allowHalf" disabled />
</template>
<template v-if="column.yunzhupaasKey === 'slider'">
<yunzhupaas-slider v-model:value="record[column.prop]" :min="column.min" :max="column.max" :step="column.step" disabled />
</template>
<template v-if="column.yunzhupaasKey === 'uploadImg'">
<yunzhupaas-upload-img v-model:value="record[column.prop]" disabled detailed simple v-if="record[column.prop]?.length" />
</template>
<template v-if="column.yunzhupaasKey === 'uploadFile'">
<yunzhupaas-upload-file v-model:value="record[column.prop]" disabled detailed simple v-if="record[column.prop]?.length" />
</template>
<template v-if="column.yunzhupaasKey === 'input'">
<yunzhupaas-input
v-model:value="record[column.prop]"
:useMask="column.useMask"
:maskConfig="column.maskConfig"
:showOverflow="true"
detailed />
</template>
</template>
<template v-if="column.key === 'flowState' && !record.top">
<yunzhupaasTextTag :content="getFlowStatusContent(record.flowState)" :color="getFlowStatusColor(record.flowState)" />
</template>
<template v-if="column.key === 'action' && !record.top">
<TableAction :actions="getTableActions(record)" />
</template>
</template>
</BasicTable>
</div>
</div>
<ExportModal @register="registerExportModal" @download="handleDownload" />
<ImportModal @register="registerImportModal" @reload="reload" />
<PrintSelect @register="registerPrintSelect" @change="handleShowBrowse" />
<PrintBrowse @register="registerPrintBrowse" />
<RelationDetail ref="relationDetailRef" />
<SuperQueryModal @register="registerSuperQueryModal" @superQuery="handleSuperQuery" />
<FlowParser @register="registerFlowParser" @reload="reload" />
</div>
</template>
<script lang="ts" setup>
import { getList, del, exportData, batchDelete } from './helper/api';
import { getConfigData,getViewList } from '@/api/onlineDev/visualDev';
// 工作流
import FlowParser from '@/views/workFlow/components/FlowParser.vue';
import { useDefineSetting } from '@/hooks/setting/useDefineSetting';
import { getFlowStartFormId } from '@/api/workFlow/template';
import { useTabs } from '@/hooks/web/useTabs';
// 工作流
import { getDictionaryDataSelector } from '@/api/systemData/dictionary';
import { getDataInterfaceRes } from '@/api/systemData/dataInterface';
import { getOrgByOrganizeCondition,getDepartmentSelectAsyncList } from '@/api/permission/organize';
import { ref, reactive, onMounted, toRefs, computed, unref, nextTick, toRaw, provide } from 'vue';
import { useMessage } from '@/hooks/web/useMessage';
import { useI18n } from '@/hooks/web/useI18n';
import { useOrganizeStore } from '@/store/modules/organize';
import { useUserStore } from '@/store/modules/user';
import { BasicModal, useModal } from '@/components/Modal';
import { usePopup } from '@/components/Popup';
import { ScrollContainer } from '@/components/Container';
import { BasicLeftTree, TreeActionType } from '@/components/Tree';
import { BasicForm, useForm } from '@/components/Form';
import { BasicTable, useTable, TableAction, ActionItem, TableActionType, SorterResult } from '@/components/Table';
import { SuperQueryModal } from '@/components/CommonModal';
// 有关联表单详情:开始
import RelationDetail from '@/views/common/dynamicModel/list/detail/index.vue';
// 有关联表单详情:结束
import ChildTableColumn from '@/views/common/dynamicModel/list/ChildTableColumn.vue';
import { ExportModal } from '@/components/CommonModal';
import { downloadByUrl } from '@/utils/file/download';
import { ImportModal} from '@/components/CommonModal';
// 打印模板多条生成PrintSelect
import PrintSelect from '@/components/PrintDesign/printSelect/index.vue';
import PrintBrowse from '@/components/PrintDesign/printBrowse/index.vue';
import { useRoute,useRouter } from 'vue-router';
import { FilterOutlined } from '@ant-design/icons-vue';
import { getSearchFormSchemas } from '@/components/FormGenerator/src/helper/transform';
import { cloneDeep } from 'lodash-es';
import columnList from './helper/columnList';
import searchList from './helper/searchList';
import superQueryJson from './helper/superQueryJson';
import { dyOptionsList, systemComponentsList } from '@/components/FormGenerator/src/helper/config';
import { thousandsFormat, getParamList} from '@/utils/yunzhupaas';
import { usePermission } from '@/hooks/web/usePermission';
import ViewSetting from '@/views/common/dynamicModel/list/components/ViewSetting.vue';
import ViewList from '@/views/common/dynamicModel/list/components/ViewList.vue';
interface State {
config: any;
flowId: string;
columnList: any[];
printListOptions: any[];
columnBtnsList: any[];
customBtnsList: any[];
treeFieldNames: any;
leftTreeData: any[];
leftTreeLoading: boolean;
treeActiveId: string;
treeActiveNodePath: any;
columns: any[];
complexColumns: any[];
childColumnList: any[];
exportList: any[];
cacheList: any[];
currFlow: any;
isCustomCopy: boolean;
candidateType: number;
currRow: any;
workFlowFormData: any;
expandObj: any;
columnSettingList: any[];
searchSchemas: any[];
treeRelationObj: any;
treeQueryJson: any;
leftTreeActiveInfo: any;
keyword: string;
viewList: any[];
currentView: any;
}
const route = useRoute();
const { hasBtnP } = usePermission();
const { createMessage, createConfirm } = useMessage();
const { t } = useI18n();
const organizeStore = useOrganizeStore();
const userStore = useUserStore();
const userInfo = userStore.getUserInfo;
const [registerExportModal, { openModal: openExportModal, closeModal: closeExportModal, setModalProps: setExportModalProps }] = useModal();
const [registerImportModal, { openModal: openImportModal }] = useModal();
const [registerSuperQueryModal, { openModal: openSuperQuery }] = useModal();
// 工作流
const { close } = useTabs();
const router = useRouter();
const [registerFlowParser, { openPopup: openFlowParser }] = usePopup();
const { getFlowStatusContent, getFlowStatusColor } = useDefineSetting();
const formRef = ref<any>(null);
const tableRef = ref<Nullable<TableActionType>>(null);
const detailRef = ref<any>(null);
const relationDetailRef = ref<any>(null);
const state = reactive<State>({
config: {},
flowId:'',//请在这里填写流程模板id
columnList: [],
printListOptions: [],
columnBtnsList: [],
customBtnsList: [],
treeFieldNames: {
children: 'children' ,
title: 'fullName' ,
key: 'id' ,
isLeaf: 'isLeaf',
},
leftTreeData: [],
leftTreeLoading: false,
treeActiveId: '',
treeActiveNodePath: [],
columns: [],
complexColumns: [], // 复杂表头
childColumnList: [],
exportList: [],
cacheList: [],
currFlow: {},
isCustomCopy: false,
candidateType: 1,
currRow: {},
workFlowFormData: {},
expandObj: {},
columnSettingList: [],
searchSchemas: [],
treeRelationObj: null,
treeQueryJson: {},
leftTreeActiveInfo: {},
keyword: '',
viewList: [],
currentView: {},
});
const defaultSearchInfo = {
menuId: route.meta.modelId as string,
moduleId:'822512474837222405',
superQueryJson: '',
flowId: state.flowId,
dataType:0,
};
const searchInfo = reactive({
...cloneDeep(defaultSearchInfo),
});
const { childColumnList, searchSchemas, viewList, currentView, flowId } = toRefs(state);
const [registerSearchForm, { updateSchema, resetFields, submit: searchFormSubmit, setFieldsValue}] = useForm({
baseColProps: { span: 6 },
showActionButtonGroup: true,
showAdvancedButton: true,
compact: true,
});
const [registerTable, { reload, setLoading, getFetchParams, getSelectRows, getSelectRowKeys, redoHeight,clearSelectedRowKeys }] = useTable({
api: getList,
immediate: false,
clickToRowSelect: false,
tableSetting: { setting: false },
afterFetch: (data) => {
const list = data.map((o) => ({
...o,
...state.expandObj,
}));
state.cacheList = cloneDeep(list);
return list;
},
});
const [registerChildTable] = useTable({
pagination: false,
canResize: false,
showTableSetting: false,
});
provide('getLeftTreeActiveInfo', () => state.leftTreeActiveInfo);
const getHasBatchBtn = computed(() => {
let btnsList =[]
btnsList.push('download')
btnsList=btnsList.filter(o => hasBtnP('btn_' + o))
return !!btnsList.length
});
const getColumns = computed(() => {
const columns = state.complexColumns;
return setListValue(state.currentView?.columnList, columns, 'prop');
});
const getSearchList = computed(() => {
const searchSchemas = cloneDeep(state.searchSchemas).map(o => ({ ...o, show: true }));
return setListValue(state.currentView?.searchList, searchSchemas, 'field');
});
const getTableBindValue = computed(() => {
let columns = unref(getColumns);
const boo=columns.some(o=>o.dataIndex==='flowState')
if(!boo) columns.push({ title: t('component.table.status'), dataIndex: 'flowState', width: 100, align: 'center', fixed: columns.some(o => o.fixed == 'right') ? 'right' : false, });
const defaultSortConfig=[{"field":"org_id","sort":"asc","id":"sort38782b"},{"field":"project_id","sort":"asc","id":"sort5aa35a"},{"field":"contract_code","sort":"desc","id":"sortb70f27"}];
const sortField = defaultSortConfig.map(o => (o.sort === 'desc' ? '-' : '') + o.field);
const data: any = {
pagination: { pageSize: 20 }, //有分页
searchInfo: unref(searchInfo),
defSort: { sidx: sortField.join(',') },
sortFn: (sortInfo: SorterResult | SorterResult[]) => {
if (Array.isArray(sortInfo)) {
const sortList = sortInfo.map(o => (o.order === 'descend' ? '-' : '') + o.field);
return { sidx: sortList.join(',') };
} else {
const { field, order } = sortInfo;
if (field && order) {
// 排序字段
return { sidx: (order === 'descend' ? '-' : '') + field };
} else {
return {};
}
}
},
ellipsis:true ,
columns,
bordered: true,
actionColumn: {
width: 150,
title: t('component.table.action'),
dataIndex: 'action',
},
};
if (unref(getHasBatchBtn)) {
const rowSelection: any = { type: 'checkbox' };
data.rowSelection = rowSelection;
}
return data;
});
function init() {
state.config = {};
searchInfo.menuId = route.meta.modelId as string;
state.columnList = columnList;
setLoading(true);
getSearchSchemas();
getColumnList();
initViewList();
nextTick(() => {
unref(getSearchList)?.length ? searchFormSubmit() : reload({ page: 1 });
});
}
function getSearchSchemas() {
const schemas = getSearchFormSchemas(searchList);
state.searchSchemas = schemas;
schemas.forEach((cur) => {
const config = cur.__config__;
if (dyOptionsList.includes(config.yunzhupaasKey)) {
if (config.dataType === 'dictionary') {
if (!config.dictionaryType) return;
getDictionaryDataSelector(config.dictionaryType).then((res) => {
updateSchema([{ field: cur.field, componentProps: { options: res.data.list } }]);
});
}
if (config.dataType === 'dynamic') {
if (!config.propsUrl) return;
const query = { paramList: getParamList(config.templateJson) };
getDataInterfaceRes(config.propsUrl, query).then((res) => {
const data = Array.isArray(res.data) ? res.data : [];
updateSchema([{ field: cur.field, componentProps: { options: data } }]);
});
}
}
cur.defaultValue = cur.value;
});
}
function getColumnList() {
// 没有开启列表权限
let columnList = state.columnList;
state.exportList = columnList;
let columns = columnList.map((o) => ({
...o,
title: o.labelI18nCode ? t(o.labelI18nCode, o.label) : o.label,
dataIndex: o.prop,
align: o.align,
fixed: o.fixed == 'none' ? false : o.fixed,
sorter: o.sortable ? { multiple: 1 } : o.sortable,
width: o.width || 100,
}));
//添加复杂表头
columns = getComplexColumns(columns);
state.columns = columns.filter((o) => o.prop.indexOf('-') < 0);
//子表表头
getChildComplexColumns(columns);
}
//复杂表头
function getComplexColumns(columns) {
//这里生成复杂表头的配置
let complexHeaderList: any[] = [];
if (!complexHeaderList.length) return columns;
let childColumns: any[] = [];
let firstChildColumns: string[] = [];
for (let i = 0; i < complexHeaderList.length; i++) {
const e = complexHeaderList[i];
e.label = e.fullName;
e.labelI18nCode = e.fullNameI18nCode;
e.title = e.fullNameI18nCode ? t(e.fullNameI18nCode, e.fullName) : e.fullName;
e.align = e.align;
e.dataIndex = e.id;
e.prop = e.id;
e.children = [];
e.yunzhupaasKey = 'complexHeader';
if (e.childColumns?.length) {
childColumns.push(...e.childColumns);
for (let k = 0; k < e.childColumns.length; k++) {
const item = e.childColumns[k];
for (let j = 0; j < columns.length; j++) {
const o = columns[j];
if (o.prop == item && o.fixed !== 'left' && o.fixed !== 'right') e.children.push({ ...o });
}
}
}
if (e.children.length) firstChildColumns.push(e.children[0].prop);
}
complexHeaderList = complexHeaderList.filter(o => o.children.length);
let list: any[] = [];
for (let i = 0; i < columns.length; i++) {
const e = columns[i];
if (!childColumns.includes(e.prop)) {
list.push(e);
} else {
if (firstChildColumns.includes(e.prop)) {
const item = complexHeaderList.find(o => o.childColumns.includes(e.prop));
list.push(item);
}
}
}
return list;
}
//子表表头
function getChildComplexColumns(columnList) {
let list: any[] = [];
for (let i = 0; i < columnList.length; i++) {
const e = columnList[i];
if (!e.prop.includes('-')) {
list.push(e);
} else {
let prop = e.prop.split('-')[0];
let vModel = e.prop.split('-')[1];
let label = e.label.split('-')[0];
let childLabel = e.label.replace(label + '-', '');
if (e.fullNameI18nCode && Array.isArray(e.fullNameI18nCode) && e.fullNameI18nCode[0]) label = t(e.fullNameI18nCode[0], label);
let newItem = {
align: 'center',
yunzhupaasKey: 'table',
prop,
label,
title: label,
dataIndex: prop,
children: [],
};
e.dataIndex = vModel;
e.title = e.labelI18nCode ? t(e.labelI18nCode, childLabel) : childLabel;
if (!state.expandObj.hasOwnProperty(prop+`Expand`)) state.expandObj[prop+`Expand`] = false;
if (!list.some((o) => o.prop === prop)) list.push(newItem);
for (let i = 0; i < list.length; i++) {
if (list[i].prop === prop) {
list[i].children.push(e);
break;
}
}
}
}
// 行内分组展示
getMergeList(list);
state.complexColumns = list;
state.childColumnList = list.filter((o) => o.yunzhupaasKey === 'table');
// 子表分组展示宽度取100
for (let i = 0; i < state.childColumnList.length; i++) {
const e = state.childColumnList[i];
if (e.children?.length) e.children = e.children.map(o => ({ ...o, width: 100 }));
}
}
function getMergeList(list) {
list.forEach((item) => {
if (item.yunzhupaasKey === 'table' && item.children && item.children.length) {
item.children.forEach((child, index) => {
if (index == 0) {
child.customCell = () => ({
rowspan: 1,
colspan: item.children.length,
class: 'child-table-box',
});
} else {
child.customCell = () => ({
rowspan: 0,
colspan: 0,
});
}
});
}
});
}
function toggleExpand(row, field) {
row[field] = !row[field];
}
// 关联表单查看详情
function toDetail(modelId, id, propsValue) {
if (!id) return;
getConfigData(modelId).then((res) => {
if (!res.data || !res.data.formData) return;
const formConf = JSON.parse(res.data.formData);
formConf.popupType = 'general';
formConf.hasPrintBtn = false;
formConf.customBtns = [];
const data = { id, formConf, modelId, propsValue};
relationDetailRef.value?.init(data);
});
}
function handleColumnChange(data) {
state.columnSettingList = data;
}
function getTableActions(record): ActionItem[] {
return [
{
label: t('common.editText','编辑') ,
disabled: ![0,8,9].includes(record.flowState), //有流程加上
onClick: updateHandle.bind(null, record),
auth: 'btn_edit', //有按钮权限
},
{
label: t('common.delText','删除') ,
color: 'error',
disabled: ![0,9].includes(record.flowState), //有流程加上
modelConfirm: {
onOk: handleDelete.bind(null, record.id),
},
auth: 'btn_remove', //有按钮权限
},
{
label: t('common.detailText','详情') ,
disabled: !record.flowState, //有流程加上
onClick: goDetail.bind(null, record),
auth: 'btn_detail', //有按钮权限
},
];
}
// 编辑
function updateHandle(record) {
// 带工作流
let data = {
id: record.flowTaskId || record.id,
flowId: state.flowId,
opType: '-1',
};
openFlowParser(true, data);
}
// 删除
function handleDelete(id) {
const query={ids:[id] ,flowId:state.flowId }
batchDelete(query).then((res) => {
createMessage.success(res.msg);
clearSelectedRowKeys();
reload();
});
}
// 查看详情
function goDetail(record) {
// 带流程
const data = {
id: record.flowTaskId,
flowId: state.flowId,
opType: 0,
status: record.flowState,
};
openFlowParser(true, data);
}
// 新增
function addHandle() {
// 带流程新增
const data = {
id: '',
flowId: state.flowId,
opType: '-1',
};
openFlowParser(true, data);
}
// 导出
function handleDownload(data) {
let query = { ...getFetchParams(), ...data };
exportData(query)
.then((res) => {
setExportModalProps({ confirmLoading: false });
if (!res.data.url) return;
downloadByUrl({ url: res.data.url });
closeExportModal();
})
.catch(() => {
setExportModalProps({ confirmLoading: false });
});
}
// 高级查询
function handleSuperQuery(superQueryJson) {
searchInfo.superQueryJson = superQueryJson;
reload({ page: 1 });
}
function handleSearchReset() {
clearSelectedRowKeys();
if (!state.resetFromTree) updateSearchFormValue();
if (state.resetFromTree) state.resetFromTree = false;
}
function handleSearchSubmit(data) {
clearSelectedRowKeys();
let obj = {
...defaultSearchInfo,
superQueryJson: searchInfo.superQueryJson,
...data,
};
Object.keys(searchInfo).map(key => {
delete searchInfo[key];
});
for (let [key, value] of Object.entries(obj)) {
searchInfo[key.replaceAll('-', '_')] = value;
}
console.log(searchInfo);
reload({ page: 1 });
}
function updateSearchFormValue() {
if (!state.treeActiveId) return searchFormSubmit();
let queryJson: any = {};
let leftTreeActiveInfo: any = {};
const isMultiple = !state.treeRelationObj ? false : state.treeRelationObj.searchMultiple;
//多级左侧树,需要拼父级->转为查询参数
if (state.treeRelationObj && state.treeRelationObj.yunzhupaasKey && ['organizeSelect', 'cascader', 'areaSelect'].includes(state.treeRelationObj.yunzhupaasKey)) {
let currValue = [];
currValue = state.treeActiveNodePath.map(o => o[state.treeFieldNames.key]);
queryJson = { '': isMultiple ? [currValue] : currValue };
leftTreeActiveInfo = { '': state.treeRelationObj.multiple ? [currValue] : currValue };
} else {
queryJson = { '': isMultiple ? [state.treeActiveId] : state.treeActiveId };
leftTreeActiveInfo = { '': state.treeRelationObj.multiple ? [state.treeActiveId] : state.treeActiveId };
}
state.leftTreeActiveInfo = leftTreeActiveInfo;
if(unref(getSearchList)?.length){
// 有搜索列表
setFieldsValue(queryJson);
searchFormSubmit();
}else{
// 无搜索列表
handleSearchSubmit(queryJson);
}
}
function getFlowId(){
if(!state.flowId){
createMessage.error('流程模板的flowId未填写')
close();
router.replace('/404');
return
}
getFlowStartFormId(state.flowId).then(res => {
init()
}).catch(() => {
close();
router.replace('/404');
});
}
function initViewList(currentId = '') {
const query = {
menuId: route.meta.modelId,
};
getViewList(query).then(res => {
const columns : any[]= state.complexColumns;
const searchList: any[] = state.searchSchemas.map(o => ({ label: o.label, id: o.field, show: o.show, labelI18nCode: o.labelI18nCode }));
const columnList: any[] = columns.map(o => ({ label: o.label, id: o.prop, show: true, fixed: o.fixed || 'none', labelI18nCode: o.labelI18nCode }));
state.viewList = (res.data || []).map(o => {
if (o.type == 0) return { ...o, searchList, columnList };
return { ...o, searchList: o.searchList ? JSON.parse(o.searchList) : [], columnList: o.columnList ? JSON.parse(o.columnList) : [] };
});
if (currentId) {
state.currentView = state.viewList.filter(o => o.id === currentId)[0] || state.viewList[0];
} else {
state.currentView = state.viewList.filter(o => o.status === 1)[0] || state.viewList[0];
}
});
}
function handleViewClick(item) {
state.currentView = item;
}
function setListValue(data: any[] = [], defaultData: any[] = [], key) {
let list: any[] = [];
for (let i = 0; i < data.length; i++) {
for (let j = 0; j < defaultData.length; j++) {
if (data[i].show && data[i].id == defaultData[j][key]) list.push(defaultData[j]);
}
}
return list;
}
onMounted(() => {
getFlowId()
});
</script>

View File

@@ -0,0 +1,192 @@
<template>
<BasicModal v-bind="$attrs" @register="registerModal" :title="title" width="600px"
:minHeight="100" :showOkBtn="false">
<template #insertFooter>
</template>
<!-- 表单 -->
<a-row class="dynamic-form ">
<a-form :colon="false" size="middle" layout= "horizontal"
labelAlign= "right"
:labelCol="{ style: { width: '100px' } }" :model="dataForm" ref="formRef">
<a-row :gutter="15">
<!-- 具体表单 -->
<a-col :span="24" class="ant-col-item" >
<a-form-item
name="project_code" >
<template #label>项目编码
</template> <YunzhupaasInput v-model:value="dataForm.project_code"
placeholder="请输入" disabled
detailed allowClear :style='{"width":"100%"}' :maskConfig = "maskConfig.project_code" >
</YunzhupaasInput>
</a-form-item>
</a-col>
<a-col :span="24" class="ant-col-item" >
<a-form-item
name="project_name" >
<template #label>项目名称
</template> <YunzhupaasInput v-model:value="dataForm.project_name"
placeholder="请输入" disabled
detailed allowClear :style='{"width":"100%"}' :maskConfig = "maskConfig.project_name" >
</YunzhupaasInput>
</a-form-item>
</a-col>
<a-col :span="24" class="ant-col-item" >
<a-form-item
name="project_type_id" >
<template #label>项目类型
</template> <p>{{dataForm.project_type_id}}</p>
</a-form-item>
</a-col>
<a-col :span="24" class="ant-col-item" >
<a-form-item
name="org_id" >
<template #label>归属组织
</template> <p>{{dataForm.org_id}}</p>
</a-form-item>
</a-col>
<a-col :span="24" class="ant-col-item" >
<a-form-item
name="pid" >
<template #label>上级项目
</template> <p>{{dataForm.pid}}</p>
</a-form-item>
</a-col>
<a-col :span="24" class="ant-col-item" >
<a-form-item
name="seq_num" >
<template #label>顺序号
</template> <YunzhupaasInputNumber v-model:value="dataForm.seq_num"
placeholder="请输入" disabled
detailed :style='{"width":"100%"}' :step="1" :controls="false" >
</YunzhupaasInputNumber>
</a-form-item>
</a-col>
<a-col :span="24" class="ant-col-item" >
<a-form-item
name="remark" >
<template #label>备注
</template> <p>{{dataForm.remark}}</p>
</a-form-item>
</a-col>
<!-- 表单结束 -->
</a-row>
</a-form>
</a-row>
</BasicModal>
<!-- 有关联表单详情开始 -->
<RelationDetail ref="relationDetailRef" />
<!-- 有关联表单详情结束 -->
</template>
<script lang="ts" setup>
import { getDetailInfo } from './helper/api';
import { getConfigData } from '@/api/onlineDev/visualDev';
import { reactive, toRefs, nextTick, ref, computed, unref ,toRaw} from 'vue';
import { BasicModal, useModal } from '@/components/Modal';
// 有关联表单详情
import RelationDetail from '@/views/common/dynamicModel/list/detail/index.vue';
// 表单权限
import { usePermission } from '@/hooks/web/usePermission';
import { useMessage } from '@/hooks/web/useMessage';
import { CaretRightOutlined } from '@ant-design/icons-vue';
import { buildUUID } from '@/utils/uuid';
import { useI18n } from '@/hooks/web/useI18n';
import { getDataChange } from '@/api/onlineDev/visualDev';
import { getDataInterfaceDataInfoByIds } from '@/api/systemData/dataInterface';
import ExtraRelationInfo from '@/components/yunzhupaas/RelationForm/src/ExtraRelationInfo.vue';
interface State {
dataForm: any;
title: string;
maskConfig: any;
interfaceRes: any;
locationScope: any;
extraOptions: any;
extraData: any;
}
defineOptions({ name: 'Detail' });
const { createMessage, createConfirm } = useMessage();
const [registerModal, { openModal, setModalProps, closeModal }] = useModal();
const { t } = useI18n();
const relationDetailRef = ref<any>(null);
const state = reactive<State>({
dataForm:{},
title: t('common.detailText','详情'),
maskConfig:{
project_code: {"prefixType":1,"useUnrealMask":false,"maskType":1,"unrealMaskLength":1,"prefixLimit":0,"suffixLimit":0,"filler":"*","prefixSpecifyChar":"","suffixType":1,"ignoreChar":"","suffixSpecifyChar":""} ,
project_name: {"prefixType":1,"useUnrealMask":false,"maskType":1,"unrealMaskLength":1,"prefixLimit":0,"suffixLimit":0,"filler":"*","prefixSpecifyChar":"","suffixType":1,"ignoreChar":"","suffixSpecifyChar":""} ,
}
,
interfaceRes: {"project_type_id":[],"org_id":[],"project_code":[],"pid":[],"remark":[],"project_name":[],"seq_num":[]},
locationScope:{
}
,
extraOptions: {
}
,
extraData: {
}
,
});
const { title, dataForm, maskConfig } = toRefs(state);
// 表单权限
const { hasFormP } = usePermission();
defineExpose({ init });
function init(data) {
state.dataForm.id = data.id;
openModal();
nextTick(() => {
setTimeout(initData, 0);
});
}
function initData() {
changeLoading(true);
if (state.dataForm.id) {
getData(state.dataForm.id);
} else {
closeModal();
}
}
function getData(id) {
getDetailInfo(id).then((res) => {
state.dataForm = res.data || {};
nextTick(() => {
changeLoading(false);
});
});
}
function toDetail(modelId, id, propsValue) {
if (!id) return;
getConfigData(modelId).then((res) => {
if (!res.data || !res.data.formData) return;
const formConf = JSON.parse(res.data.formData);
formConf.popupType = 'general';
formConf.hasPrintBtn = false;
formConf.customBtns = [];
const data = { id, formConf, modelId, propsValue};
relationDetailRef.value?.init(data);
});
}
function setFormProps(data) {
setModalProps(data);
}
function changeLoading(loading) {
setFormProps({ loading });
}
function getParamList(key) {
let templateJson: any[] = state.interfaceRes[key];
if (!templateJson || !templateJson.length || !state.dataForm) return templateJson;
for (let i = 0; i < templateJson.length; i++) {
if (templateJson[i].relationField && templateJson[i].sourceType == 1) {
templateJson[i].defaultValue = state.dataForm[templateJson[i].relationField + '_id'] || '';
}
}
return templateJson;
}
</script>

View File

@@ -0,0 +1,550 @@
<template>
<BasicModal
v-bind="$attrs"
@register="registerModal"
width="600px"
:minHeight="100"
:cancelText="t('common.cancelText', '取消')"
:okText="t('common.okText', '确定')"
@ok="handleSubmit"
:closeFunc="onClose">
<template #title>
<a-space :size="10">
<div class="text-16px font-medium">{{ title }}</div>
</a-space>
</template>
<a-row class="dynamic-form">
<a-form
:colon="false"
size="middle"
layout="horizontal"
labelAlign="right"
:labelCol="{ style: { width: '100px' } }"
:model="dataForm"
:rules="dataRule"
ref="formRef">
<a-row :gutter="15">
<!-- 具体表单 -->
<a-col :span="24" class="ant-col-item">
<a-form-item name="project_code">
<template #label>项目编码 </template>
<YunzhupaasInput
v-model:value="dataForm.project_code"
@change="changeData('project_code', -1)"
placeholder="请输入"
:allowClear="true"
:style="{ width: '100%' }"
:maskConfig="maskConfig.project_code"
:showCount="false">
</YunzhupaasInput>
</a-form-item>
</a-col>
<a-col :span="24" class="ant-col-item">
<a-form-item name="project_name">
<template #label>项目名称 </template>
<YunzhupaasInput
v-model:value="dataForm.project_name"
@change="changeData('project_name', -1)"
placeholder="请输入"
:allowClear="true"
:style="{ width: '100%' }"
:maskConfig="maskConfig.project_name"
:showCount="false">
</YunzhupaasInput>
</a-form-item>
</a-col>
<a-col :span="24" class="ant-col-item">
<a-form-item name="project_type_id">
<template #label>项目类型 </template>
<YunzhupaasTreeSelect
v-model:value="dataForm.project_type_id"
@change="changeData('project_type_id', -1)"
placeholder="请选择"
:templateJson="state.interfaceRes.project_type_id"
:allowClear="true"
:style="{ width: '100%' }"
:showSearch="false"
:options="optionsObj.project_type_idOptions"
:fieldNames="optionsObj.project_type_idProps">
</YunzhupaasTreeSelect>
</a-form-item>
</a-col>
<a-col :span="24" class="ant-col-item">
<a-form-item name="org_id">
<template #label>归属组织 </template>
<YunzhupaasOrganizeSelect
v-model:value="dataForm.org_id"
@change="changeData('org_id', -1)"
placeholder="请选择"
:allowClear="true"
:style="{ width: '100%' }"
:showSearch="false"
selectType="all">
</YunzhupaasOrganizeSelect>
</a-form-item>
</a-col>
<a-col :span="24" class="ant-col-item">
<a-form-item name="pid">
<template #label>上级项目 </template>
<YunzhupaasTreeSelect
v-model:value="dataForm.pid"
@change="changeData('pid', -1)"
placeholder="请选择"
:templateJson="state.interfaceRes.pid"
:allowClear="true"
:style="{ width: '100%' }"
:showSearch="false"
:options="optionsObj.pidOptions"
:fieldNames="optionsObj.pidProps">
</YunzhupaasTreeSelect>
</a-form-item>
</a-col>
<a-col :span="24" class="ant-col-item">
<a-form-item name="seq_num">
<template #label>顺序号 </template>
<YunzhupaasInputNumber
v-model:value="dataForm.seq_num"
@change="changeData('seq_num', -1)"
placeholder="请输入"
:style="{ width: '100%' }"
:step="1"
:controls="false">
</YunzhupaasInputNumber>
</a-form-item>
</a-col>
<a-col :span="24" class="ant-col-item">
<a-form-item name="remark">
<template #label>备注 </template>
<YunzhupaasTextarea
v-model:value="dataForm.remark"
@change="changeData('remark', -1)"
placeholder="请输入"
:allowClear="true"
:style="{ width: '100%' }"
:autoSize="{ minRows: 4, maxRows: 4 }"
:showCount="false">
</YunzhupaasTextarea>
</a-form-item>
</a-col>
<!-- 表单结束 -->
</a-row>
</a-form>
</a-row>
</BasicModal>
</template>
<script lang="ts" setup>
import { create, update, getInfo ,getProjectTreeList} from './helper/api';
import { getTreeList} from '@/views/bsc/projecttype/helper/api';
import { reactive, toRefs, nextTick, ref, unref, computed, toRaw, inject } from 'vue';
import { BasicModal, useModal } from '@/components/Modal';
import { yunzhupaasRelationForm } from '@/components/yunzhupaas';
import { useMessage } from '@/hooks/web/useMessage';
import { useI18n } from '@/hooks/web/useI18n';
import { useUserStore } from '@/store/modules/user';
import type { FormInstance } from 'ant-design-vue';
import { thousandsFormat, getDateTimeUnit, getTimeUnit } from '@/utils/yunzhupaas';
import { getDictionaryDataSelector } from '@/api/systemData/dictionary';
import { getDataInterfaceRes } from '@/api/systemData/dataInterface';
import dayjs from 'dayjs';
// 表单权限
import { usePermission } from '@/hooks/web/usePermission';
import { cloneDeep } from 'lodash-es';
import { buildUUID } from '@/utils/uuid';
import { CaretRightOutlined } from '@ant-design/icons-vue';
interface State {
dataForm: any;
tableRows: any;
dataRule: any;
optionsObj: any;
childIndex: any;
isEdit: any;
interfaceRes: any;
//可选范围默认值
ableAll: any;
//掩码配置
maskConfig: any;
//定位属性
locationScope: any;
extraOptions: any;
title: string;
continueText: string;
allList: any[];
currIndex: number;
isContinue: boolean;
submitType: number;
showContinueBtn: boolean;
}
const emit = defineEmits(['reload']);
const getLeftTreeActiveInfo: (() => any) | null = inject('getLeftTreeActiveInfo', null);
const userStore = useUserStore();
const userInfo = userStore.getUserInfo;
const { createMessage, createConfirm } = useMessage();
const { t } = useI18n();
const [registerModal, { openModal, setModalProps }] = useModal();
const formRef = ref<FormInstance>();
const state = reactive<State>({
dataForm: {
project_code: undefined,
project_name: undefined,
project_type_id: '',
org_id: userInfo.organizeIdList ? userInfo.organizeIdList : '',
pid: '',
seq_num: undefined,
remark: undefined,
},
tableRows: {},
dataRule: {},
optionsObj: {
project_type_idOptions: [],
project_type_idProps: { label: 'projectTypeName', value: 'projectTypeId', children: 'children' },
pidOptions: [],
pidProps: { label: 'projectName', value: 'projectId', children: 'children' },
},
childIndex: -1,
isEdit: false,
interfaceRes: { project_type_id: [], org_id: [], project_code: [], pid: [], remark: [], project_name: [], seq_num: [] },
//可选范围默认值
ableAll: {},
//掩码配置
maskConfig: {
project_code: {
prefixType: 1,
useUnrealMask: false,
maskType: 1,
unrealMaskLength: 1,
prefixLimit: 0,
suffixLimit: 0,
filler: '*',
prefixSpecifyChar: '',
suffixType: 1,
ignoreChar: '',
suffixSpecifyChar: '',
},
project_name: {
prefixType: 1,
useUnrealMask: false,
maskType: 1,
unrealMaskLength: 1,
prefixLimit: 0,
suffixLimit: 0,
filler: '*',
prefixSpecifyChar: '',
suffixType: 1,
ignoreChar: '',
suffixSpecifyChar: '',
},
},
//定位属性
locationScope: {},
extraOptions: {},
title: '',
continueText: '',
allList: [],
currIndex: 0,
isContinue: false,
submitType: 0,
showContinueBtn: true,
});
const { title, continueText, showContinueBtn, dataRule, dataForm, optionsObj, ableAll, maskConfig, submitType } = toRefs(state);
const getPrevDisabled = computed(() => state.currIndex === 0);
const getNextDisabled = computed(() => state.currIndex === state.allList.length - 1);
// 表单权限
const { hasFormP } = usePermission();
defineExpose({ init });
function init(data) {
state.submitType = 0;
state.isContinue = false;
state.title = !data.id ? t('common.add2Text', '新增') : t('common.editText', '编辑');
state.continueText = !data.id ? t('common.continueAndAddText', '确定并新增') : t('common.continueText', '确定并继续');
setFormProps({ continueLoading: false });
state.dataForm.id = data.id;
openModal();
state.allList = data.allList;
state.currIndex = state.allList.length && data.id ? state.allList.findIndex(item => item.id === data.id) : 0;
nextTick(() => {
getForm().resetFields();
setTimeout(initData, 0);
});
}
function initData() {
changeLoading(true);
if (state.dataForm.id) {
getData(state.dataForm.id);
} else {
//初始化options
getproject_type_idOptions();
getpidOptions();
// 设置默认值
state.dataForm = {
project_code: undefined,
project_name: undefined,
project_type_id: '',
org_id: userInfo.organizeIdList ? userInfo.organizeIdList : '',
pid: '',
seq_num: undefined,
remark: undefined,
};
if (getLeftTreeActiveInfo) state.dataForm = { ...state.dataForm, ...(getLeftTreeActiveInfo() || {}) };
state.childIndex = -1;
changeLoading(false);
}
}
function getForm() {
const form = unref(formRef);
if (!form) {
throw new Error('form is null!');
}
return form;
}
function getData(id) {
getInfo(id).then(res => {
state.dataForm = res.data || {};
getproject_type_idOptions();
getpidOptions();
state.childIndex = -1;
changeLoading(false);
});
}
async function handleSubmit(type) {
try {
const values = await getForm()?.validate();
if (!values) return;
setFormProps({ confirmLoading: true });
const formMethod = state.dataForm.id ? update : create;
console.log(state.dataForm);
formMethod(state.dataForm)
.then(res => {
createMessage.success(res.msg);
setFormProps({ confirmLoading: false });
if (state.submitType == 1) {
initData();
state.isContinue = true;
} else {
setFormProps({ open: false });
emit('reload');
}
})
.catch(() => {
setFormProps({ confirmLoading: false });
});
} catch (_) {}
}
function handlePrev() {
state.currIndex--;
handleGetNewInfo();
}
function handleNext() {
state.currIndex++;
handleGetNewInfo();
}
function handleGetNewInfo() {
changeLoading(true);
getForm().resetFields();
const id = state.allList[state.currIndex].id;
getData(id);
}
function setFormProps(data) {
setModalProps(data);
}
function changeLoading(loading) {
setModalProps({ loading });
}
async function onClose() {
if (state.isContinue) emit('reload');
return true;
}
function changeData(model, index) {
state.isEdit = false;
state.childIndex = index;
for (let key in state.interfaceRes) {
if (key != model) {
let faceReList = state.interfaceRes[key];
for (let i = 0; i < faceReList.length; i++) {
let relationField = faceReList[i].relationField;
if (relationField) {
let modelAll = relationField.split('-');
let faceMode = '';
let faceMode2 = modelAll.length == 2 ? modelAll[0].substring(0, modelAll[0].length - 4) + modelAll[1] : '';
for (let i = 0; i < modelAll.length; i++) {
faceMode += modelAll[i];
}
if (faceMode == model || faceMode2 == model) {
let options = 'get' + key + 'Options';
eval(options)(true);
changeData(key, index);
}
}
}
}
}
}
function changeDataFormData(type, data, model, index, defaultValue) {
if (!state.isEdit) {
if (type == 2) {
for (let i = 0; i < state.dataForm[data].length; i++) {
if (index == -1) {
state.dataForm[data][i][model] = defaultValue;
} else if (index == i) {
state.dataForm[data][i][model] = defaultValue;
}
}
} else {
state.dataForm[data] = defaultValue;
}
}
}
//数据选项--远端数据初始化方法
function getproject_type_idOptions(isClear = false) {
const index = state.childIndex;
let templateJsonList = JSON.parse(JSON.stringify(state.interfaceRes.project_type_id));
for (let i = 0; i < templateJsonList.length; i++) {
let json = templateJsonList[i];
if (json.relationField && json.sourceType == 1) {
let relationFieldAll = json.relationField.split('-');
let val = json.defaultValue;
if (relationFieldAll.length > 1 && index > -1) {
if (relationFieldAll[0].endsWith('List')) {
val =
state.dataForm[relationFieldAll[0]] && state.dataForm[relationFieldAll[0]].length
? state.dataForm[relationFieldAll[0]][index][relationFieldAll[1]]
: '';
} else {
val =
state.dataForm[relationFieldAll[0] + 'List'] && state.dataForm[relationFieldAll[0] + 'List'].length
? state.dataForm[relationFieldAll[0] + 'List'][index][relationFieldAll[1]]
: '';
}
} else {
val = state.dataForm[relationFieldAll];
}
json.defaultValue = val ? val : '';
}
}
// let template = {
// paramList: templateJsonList,
// };
getTreeList().then(res => {
state.optionsObj.project_type_idOptions = res.data || [];
if (index == -1) return;
if (isClear) {
changeDataFormData(1, 'List', 'project_type_id', index, '');
}
});
// getDataInterfaceRes('824687938385216645', template).then(res => {
// let data = res.data;
// state.optionsObj.project_type_idOptions = data;
// if (index == -1) return;
// if (isClear) {
// changeDataFormData(1, 'List', 'project_type_id', index, '');
// }
// });
}
//数据选项--远端数据初始化方法
function getpidOptions(isClear = false) {
const index = state.childIndex;
let templateJsonList = JSON.parse(JSON.stringify(state.interfaceRes.pid));
for (let i = 0; i < templateJsonList.length; i++) {
let json = templateJsonList[i];
if (json.relationField && json.sourceType == 1) {
let relationFieldAll = json.relationField.split('-');
let val = json.defaultValue;
if (relationFieldAll.length > 1 && index > -1) {
if (relationFieldAll[0].endsWith('List')) {
val =
state.dataForm[relationFieldAll[0]] && state.dataForm[relationFieldAll[0]].length
? state.dataForm[relationFieldAll[0]][index][relationFieldAll[1]]
: '';
} else {
val =
state.dataForm[relationFieldAll[0] + 'List'] && state.dataForm[relationFieldAll[0] + 'List'].length
? state.dataForm[relationFieldAll[0] + 'List'][index][relationFieldAll[1]]
: '';
}
} else {
val = state.dataForm[relationFieldAll];
}
json.defaultValue = val ? val : '';
}
}
// let template = {
// paramList: templateJsonList,
// };
getProjectTreeList().then(res => {
state.optionsObj.pidOptions = res.data || [];
if (index == -1) return;
if (isClear) {
changeDataFormData(1, 'List', 'pid', index, '');
}
});
// getDataInterfaceRes('826399583931205381', template).then(res => {
// let data = res.data;
// state.optionsObj.pidOptions = data;
// if (index == -1) return;
// if (isClear) {
// changeDataFormData(1, 'List', 'pid', index, '');
// }
// });
}
function getRelationDate(timeRule, timeType, timeTarget, timeValueData, dataValue) {
let timeDataValue: any = null;
let timeValue = Number(timeValueData);
if (timeRule) {
if (timeType == 1) {
timeDataValue = timeValue;
} else if (timeType == 2) {
timeDataValue = dataValue;
} else if (timeType == 3) {
timeDataValue = new Date().getTime();
} else if (timeType == 4 || timeType == 5) {
const type = getTimeUnit(timeTarget);
const method = timeType == 4 ? 'subtract' : 'add';
timeDataValue = dayjs()[method](timeValue, type).valueOf();
}
}
return timeDataValue;
}
function getRelationTime(timeRule, timeType, timeTarget, timeValue, formatType, dataValue) {
let format = formatType == 'HH:mm' ? 'HH:mm:00' : formatType;
let timeDataValue: any = null;
if (timeRule) {
if (timeType == 1) {
timeDataValue = timeValue || '00:00:00';
if (timeDataValue.split(':').length == 3) {
timeDataValue = timeDataValue;
} else {
timeDataValue = timeDataValue + ':00';
}
} else if (timeType == 2) {
timeDataValue = dataValue;
} else if (timeType == 3) {
timeDataValue = dayjs().format(format);
} else if (timeType == 4 || timeType == 5) {
const type = getTimeUnit(timeTarget + 3);
const method = timeType == 4 ? 'subtract' : 'add';
timeDataValue = dayjs()[method](timeValue, type).format(format);
}
}
return timeDataValue;
}
</script>

View File

@@ -0,0 +1,38 @@
import { defHttp } from '@/utils/http/axios';
// 获取列表
export function getList(data) {
return defHttp.post({ url: '/api/bcm/Projects/getList', data });
}
// 新建
export function create(data) {
return defHttp.post({ url:'/api/bcm/Projects', data });
}
// 修改
export function update(data) {
return defHttp.put({ url: '/api/bcm/Projects/'+ data.id, data });
}
// 详情(无转换数据)
export function getInfo(id) {
return defHttp.get({ url: '/api/bcm/Projects/' + id });
}
// 获取(转换数据)
export function getDetailInfo(id) {
return defHttp.get({ url: '/api/bcm/Projects/detail/' + id });
}
// 删除
export function del(id) {
return defHttp.delete({ url: '/api/bcm/Projects/' + id });
}
// 批量删除数据
export function batchDelete(data) {
return defHttp.delete({ url: '/api/bcm/Projects/batchRemove', data });
}
// 导出
export function exportData(data) {
return defHttp.post({ url: '/api/bcm/Projects/Actions/Export', data });
}
// 树状列表查询
export function getProjectTreeList() {
return defHttp.get({ url: '/api/bcm/Projects/getTreeList' });
}

View File

@@ -0,0 +1,461 @@
const columnList = [
{
"yunzhupaasKey":"input",
"useScan":false,
"suffixIcon":"",
"fullNameI18nCode":[
""
],
"align":"left",
"showCount":false,
"__config__":{
"formId":"formItemdcc7a4",
"yunzhupaasKey":"input",
"visibility":[
"pc",
"app"
],
"noShow":false,
"tipLabel":"",
"tableFixed":"none",
"dragDisabled":false,
"className":[],
"label":"项目编码",
"trigger":"blur",
"showLabel":true,
"required":false,
"tableName":"mdm_project",
"renderKey":1779164507492,
"layout":"colFormItem",
"tagIcon":"icon-ym icon-ym-generator-input",
"tag":"YunzhupaasInput",
"regList":[],
"tableAlign":"left",
"span":24
},
"readonly":false,
"prop":"project_code",
"__vModel__":"project_code",
"disabled":false,
"id":"project_code",
"placeholder":"请输入",
"addonBefore":"",
"on":{
"change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}",
"blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}"
},
"clearable":true,
"resizable":true,
"maxlength":null,
"fullName":"项目编码",
"label":"项目编码",
"sortable":false,
"addonAfter":"",
"maskConfig":{
"prefixType":1,
"useUnrealMask":false,
"maskType":1,
"unrealMaskLength":1,
"prefixLimit":0,
"suffixLimit":0,
"filler":"*",
"prefixSpecifyChar":"",
"suffixType":1,
"ignoreChar":"",
"suffixSpecifyChar":""
},
"width":null,
"useMask":false,
"showPassword":false,
"fixed":"none",
"style":{
"width":"100%"
},
"prefixIcon":"",
"labelI18nCode":""
},
{
"yunzhupaasKey":"input",
"useScan":false,
"suffixIcon":"",
"fullNameI18nCode":[
""
],
"align":"left",
"showCount":false,
"__config__":{
"formId":"formItem8ef579",
"yunzhupaasKey":"input",
"visibility":[
"pc",
"app"
],
"noShow":false,
"tipLabel":"",
"tableFixed":"none",
"dragDisabled":false,
"className":[],
"label":"项目名称",
"trigger":"blur",
"showLabel":true,
"required":false,
"tableName":"mdm_project",
"renderKey":1779164513809,
"layout":"colFormItem",
"tagIcon":"icon-ym icon-ym-generator-input",
"tag":"YunzhupaasInput",
"regList":[],
"tableAlign":"left",
"span":24
},
"readonly":false,
"prop":"project_name",
"__vModel__":"project_name",
"disabled":false,
"id":"project_name",
"placeholder":"请输入",
"addonBefore":"",
"on":{
"change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}",
"blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}"
},
"clearable":true,
"resizable":true,
"maxlength":null,
"fullName":"项目名称",
"label":"项目名称",
"sortable":false,
"addonAfter":"",
"maskConfig":{
"prefixType":1,
"useUnrealMask":false,
"maskType":1,
"unrealMaskLength":1,
"prefixLimit":0,
"suffixLimit":0,
"filler":"*",
"prefixSpecifyChar":"",
"suffixType":1,
"ignoreChar":"",
"suffixSpecifyChar":""
},
"width":null,
"useMask":false,
"showPassword":false,
"fixed":"none",
"style":{
"width":"100%"
},
"prefixIcon":"",
"labelI18nCode":""
},
{
"yunzhupaasKey":"treeSelect",
"filterable":false,
"clearable":true,
"resizable":true,
"multiple":false,
"fullName":"项目类型",
"fullNameI18nCode":[
""
],
"label":"项目类型",
"sortable":false,
"align":"left",
"props":{
"children":"children",
"label":"projectTypeName",
"value":"projectTypeId"
},
"__config__":{
"yunzhupaasKey":"treeSelect",
"defaultValue":"",
"dragDisabled":false,
"className":[],
"propsUrl":"824687938385216645",
"templateJson":[],
"showLabel":true,
"required":false,
"tableName":"mdm_project",
"renderKey":1779166086652,
"tagIcon":"icon-ym icon-ym-generator-tree",
"tag":"YunzhupaasTreeSelect",
"formId":"formItemfc12f6",
"visibility":[
"pc",
"app"
],
"noShow":false,
"dataType":"dynamic",
"dictionaryType":"",
"tipLabel":"",
"tableFixed":"none",
"label":"项目类型",
"trigger":"change",
"layout":"colFormItem",
"useCache":true,
"propsName":"获取标准项目分类树结构",
"regList":[],
"tableAlign":"left",
"span":24
},
"prop":"project_type_id",
"width":null,
"options":[],
"__vModel__":"project_type_id",
"fixed":"none",
"style":{
"width":"100%"
},
"disabled":false,
"id":"project_type_id",
"placeholder":"请选择",
"labelI18nCode":"",
"on":{
"change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}"
}
},
{
"yunzhupaasKey":"organizeSelect",
"filterable":false,
"clearable":true,
"resizable":true,
"ableIds":[],
"multiple":false,
"fullName":"归属组织",
"fullNameI18nCode":[
""
],
"label":"归属组织",
"sortable":false,
"align":"left",
"__config__":{
"formId":"formItem9309db",
"yunzhupaasKey":"organizeSelect",
"visibility":[
"pc",
"app"
],
"defaultValue":[],
"noShow":false,
"tipLabel":"",
"tableFixed":"none",
"dragDisabled":false,
"className":[],
"label":"归属组织",
"trigger":"change",
"showLabel":true,
"required":false,
"tableName":"mdm_project",
"renderKey":1779164572941,
"layout":"colFormItem",
"tagIcon":"icon-ym icon-ym-generator-company",
"defaultCurrent":true,
"tag":"YunzhupaasOrganizeSelect",
"regList":[],
"tableAlign":"left",
"span":24
},
"prop":"org_id",
"width":null,
"__vModel__":"org_id",
"fixed":"none",
"style":{
"width":"100%"
},
"selectType":"all",
"disabled":false,
"id":"org_id",
"placeholder":"请选择",
"labelI18nCode":"",
"on":{
"change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}"
}
},
{
"yunzhupaasKey":"treeSelect",
"filterable":false,
"clearable":true,
"resizable":true,
"multiple":false,
"fullName":"上级项目",
"fullNameI18nCode":[
""
],
"label":"上级项目",
"sortable":false,
"align":"left",
"props":{
"children":"children",
"label":"projectName",
"value":"projectId"
},
"__config__":{
"yunzhupaasKey":"treeSelect",
"defaultValue":"",
"dragDisabled":false,
"className":[],
"propsUrl":"826399583931205381",
"templateJson":[],
"showLabel":true,
"required":false,
"tableName":"mdm_project",
"renderKey":1779164602724,
"tagIcon":"icon-ym icon-ym-generator-tree",
"tag":"YunzhupaasTreeSelect",
"formId":"formItemd3f1a4",
"visibility":[
"pc",
"app"
],
"noShow":false,
"dataType":"dynamic",
"dictionaryType":"",
"tipLabel":"",
"tableFixed":"none",
"label":"上级项目",
"trigger":"change",
"layout":"colFormItem",
"useCache":true,
"propsName":"获取标准项目树结构",
"regList":[],
"tableAlign":"left",
"span":24
},
"prop":"pid",
"width":null,
"options":[],
"__vModel__":"pid",
"fixed":"none",
"style":{
"width":"100%"
},
"disabled":false,
"id":"pid",
"placeholder":"请选择",
"labelI18nCode":"",
"on":{
"change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}"
}
},
{
"yunzhupaasKey":"inputNumber",
"controls":false,
"resizable":true,
"fullName":"顺序号",
"fullNameI18nCode":[
""
],
"label":"顺序号",
"sortable":false,
"align":"left",
"thousands":false,
"isAmountChinese":false,
"addonAfter":"",
"__config__":{
"formId":"formItemf01693",
"yunzhupaasKey":"inputNumber",
"visibility":[
"pc",
"app"
],
"noShow":false,
"tipLabel":"",
"tableFixed":"none",
"dragDisabled":false,
"className":[],
"label":"顺序号",
"trigger":[
"blur",
"change"
],
"showLabel":true,
"required":false,
"tableName":"mdm_project",
"renderKey":1779164640574,
"layout":"colFormItem",
"tagIcon":"icon-ym icon-ym-generator-number",
"tag":"YunzhupaasInputNumber",
"regList":[],
"tableAlign":"left",
"span":24
},
"prop":"seq_num",
"width":null,
"__vModel__":"seq_num",
"fixed":"none",
"style":{
"width":"100%"
},
"step":1,
"disabled":false,
"id":"seq_num",
"placeholder":"请输入",
"addonBefore":"",
"labelI18nCode":"",
"on":{
"change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}",
"blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}"
}
},
{
"yunzhupaasKey":"textarea",
"clearable":true,
"resizable":true,
"maxlength":null,
"fullName":"备注",
"fullNameI18nCode":[
""
],
"label":"备注",
"sortable":false,
"align":"left",
"autoSize":{
"minRows":4,
"maxRows":4
},
"showCount":false,
"__config__":{
"formId":"formItem41e3bd",
"yunzhupaasKey":"textarea",
"visibility":[
"pc",
"app"
],
"noShow":false,
"tipLabel":"",
"tableFixed":"none",
"dragDisabled":false,
"className":[],
"label":"备注",
"trigger":"blur",
"showLabel":true,
"required":false,
"tableName":"mdm_project",
"renderKey":1779164655791,
"layout":"colFormItem",
"tagIcon":"icon-ym icon-ym-generator-textarea",
"tag":"YunzhupaasTextarea",
"regList":[],
"tableAlign":"left",
"span":24
},
"readonly":false,
"prop":"remark",
"width":null,
"__vModel__":"remark",
"fixed":"none",
"style":{
"width":"100%"
},
"disabled":false,
"id":"remark",
"placeholder":"请输入",
"labelI18nCode":"",
"on":{
"change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}",
"blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}"
}
}
]
export default columnList

View File

@@ -0,0 +1,132 @@
const searchList = [
{
"yunzhupaasKey":"input",
"useScan":false,
"suffixIcon":"",
"fullNameI18nCode":[
""
],
"showCount":false,
"__config__":{
"formId":"formItem8ef579",
"yunzhupaasKey":"input",
"visibility":[
"pc",
"app"
],
"noShow":false,
"tipLabel":"",
"tableFixed":"none",
"dragDisabled":false,
"className":[],
"label":"项目名称",
"trigger":"blur",
"showLabel":true,
"required":false,
"tableName":"mdm_project",
"renderKey":1779164513809,
"layout":"colFormItem",
"tagIcon":"icon-ym icon-ym-generator-input",
"tag":"YunzhupaasInput",
"regList":[],
"tableAlign":"left",
"span":24
},
"readonly":false,
"prop":"project_name",
"__vModel__":"project_name",
"searchMultiple":false,
"disabled":false,
"id":"project_name",
"placeholder":"请输入",
"addonBefore":"",
"on":{
"change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}",
"blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}"
},
"clearable":true,
"searchType":2,
"maxlength":null,
"fullName":"项目名称",
"label":"项目名称",
"addonAfter":"",
"maskConfig":{
"prefixType":1,
"useUnrealMask":false,
"maskType":1,
"unrealMaskLength":1,
"prefixLimit":0,
"suffixLimit":0,
"filler":"*",
"prefixSpecifyChar":"",
"suffixType":1,
"ignoreChar":"",
"suffixSpecifyChar":""
},
"isKeyword":false,
"useMask":false,
"showPassword":false,
"style":{
"width":"100%"
},
"prefixIcon":"",
"labelI18nCode":""
},
{
"yunzhupaasKey":"organizeSelect",
"filterable":false,
"clearable":true,
"searchType":1,
"ableIds":[],
"multiple":false,
"fullName":"归属组织",
"fullNameI18nCode":[
""
],
"label":"归属组织",
"__config__":{
"formId":"formItem9309db",
"yunzhupaasKey":"organizeSelect",
"visibility":[
"pc",
"app"
],
"defaultValue":[],
"noShow":false,
"tipLabel":"",
"tableFixed":"none",
"dragDisabled":false,
"className":[],
"label":"归属组织",
"trigger":"change",
"showLabel":true,
"required":false,
"tableName":"mdm_project",
"renderKey":1779164572941,
"layout":"colFormItem",
"tagIcon":"icon-ym icon-ym-generator-company",
"defaultCurrent":true,
"tag":"YunzhupaasOrganizeSelect",
"regList":[],
"tableAlign":"left",
"span":24
},
"prop":"org_id",
"__vModel__":"org_id",
"searchMultiple":true,
"isKeyword":false,
"style":{
"width":"100%"
},
"selectType":"all",
"disabled":false,
"id":"org_id",
"placeholder":"请选择",
"value":[],
"labelI18nCode":"",
"on":{
"change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}"
}
}
]
export default searchList

View File

@@ -0,0 +1,398 @@
const superQueryJson = [
{
"clearable":true,
"maxlength":null,
"useScan":false,
"suffixIcon":"",
"fullName":"项目编码",
"fullNameI18nCode":[
""
],
"addonAfter":"",
"showCount":false,
"__config__":{
"formId":"formItemdcc7a4",
"yunzhupaasKey":"input",
"visibility":[
"pc",
"app"
],
"noShow":false,
"tipLabel":"",
"tableFixed":"none",
"dragDisabled":false,
"className":[],
"label":"项目编码",
"trigger":"blur",
"showLabel":true,
"required":false,
"tableName":"mdm_project",
"renderKey":1779164507492,
"layout":"colFormItem",
"tagIcon":"icon-ym icon-ym-generator-input",
"tag":"YunzhupaasInput",
"regList":[],
"tableAlign":"left",
"span":24
},
"readonly":false,
"maskConfig":{
"prefixType":1,
"useUnrealMask":false,
"maskType":1,
"unrealMaskLength":1,
"prefixLimit":0,
"suffixLimit":0,
"filler":"*",
"prefixSpecifyChar":"",
"suffixType":1,
"ignoreChar":"",
"suffixSpecifyChar":""
},
"__vModel__":"project_code",
"useMask":false,
"showPassword":false,
"style":{
"width":"100%"
},
"disabled":false,
"id":"project_code",
"placeholder":"请输入",
"prefixIcon":"",
"addonBefore":"",
"on":{
"change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}",
"blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}"
}
},
{
"clearable":true,
"maxlength":null,
"useScan":false,
"suffixIcon":"",
"fullName":"项目名称",
"fullNameI18nCode":[
""
],
"addonAfter":"",
"showCount":false,
"__config__":{
"formId":"formItem8ef579",
"yunzhupaasKey":"input",
"visibility":[
"pc",
"app"
],
"noShow":false,
"tipLabel":"",
"tableFixed":"none",
"dragDisabled":false,
"className":[],
"label":"项目名称",
"trigger":"blur",
"showLabel":true,
"required":false,
"tableName":"mdm_project",
"renderKey":1779164513809,
"layout":"colFormItem",
"tagIcon":"icon-ym icon-ym-generator-input",
"tag":"YunzhupaasInput",
"regList":[],
"tableAlign":"left",
"span":24
},
"readonly":false,
"maskConfig":{
"prefixType":1,
"useUnrealMask":false,
"maskType":1,
"unrealMaskLength":1,
"prefixLimit":0,
"suffixLimit":0,
"filler":"*",
"prefixSpecifyChar":"",
"suffixType":1,
"ignoreChar":"",
"suffixSpecifyChar":""
},
"__vModel__":"project_name",
"useMask":false,
"showPassword":false,
"style":{
"width":"100%"
},
"disabled":false,
"id":"project_name",
"placeholder":"请输入",
"prefixIcon":"",
"addonBefore":"",
"on":{
"change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}",
"blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}"
}
},
{
"filterable":false,
"clearable":true,
"multiple":false,
"fullName":"项目类型",
"fullNameI18nCode":[
""
],
"props":{
"children":"children",
"label":"projectTypeName",
"value":"projectTypeId"
},
"__config__":{
"yunzhupaasKey":"treeSelect",
"defaultValue":"",
"dragDisabled":false,
"className":[],
"propsUrl":"824687938385216645",
"templateJson":[],
"showLabel":true,
"required":false,
"tableName":"mdm_project",
"renderKey":1779166086652,
"tagIcon":"icon-ym icon-ym-generator-tree",
"tag":"YunzhupaasTreeSelect",
"formId":"formItemfc12f6",
"visibility":[
"pc",
"app"
],
"noShow":false,
"dataType":"dynamic",
"dictionaryType":"",
"tipLabel":"",
"tableFixed":"none",
"label":"项目类型",
"trigger":"change",
"layout":"colFormItem",
"useCache":true,
"propsName":"获取标准项目分类树结构",
"regList":[],
"tableAlign":"left",
"span":24
},
"options":[],
"__vModel__":"project_type_id",
"style":{
"width":"100%"
},
"disabled":false,
"id":"project_type_id",
"placeholder":"请选择",
"on":{
"change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}"
}
},
{
"filterable":false,
"clearable":true,
"ableIds":[],
"multiple":false,
"fullName":"归属组织",
"fullNameI18nCode":[
""
],
"__config__":{
"formId":"formItem9309db",
"yunzhupaasKey":"organizeSelect",
"visibility":[
"pc",
"app"
],
"defaultValue":[],
"noShow":false,
"tipLabel":"",
"tableFixed":"none",
"dragDisabled":false,
"className":[],
"label":"归属组织",
"trigger":"change",
"showLabel":true,
"required":false,
"tableName":"mdm_project",
"renderKey":1779164572941,
"layout":"colFormItem",
"tagIcon":"icon-ym icon-ym-generator-company",
"defaultCurrent":true,
"tag":"YunzhupaasOrganizeSelect",
"regList":[],
"tableAlign":"left",
"span":24
},
"__vModel__":"org_id",
"style":{
"width":"100%"
},
"selectType":"all",
"disabled":false,
"id":"org_id",
"placeholder":"请选择",
"on":{
"change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}"
}
},
{
"filterable":false,
"clearable":true,
"multiple":false,
"fullName":"上级项目",
"fullNameI18nCode":[
""
],
"props":{
"children":"children",
"label":"projectName",
"value":"projectId"
},
"__config__":{
"yunzhupaasKey":"treeSelect",
"defaultValue":"",
"dragDisabled":false,
"className":[],
"propsUrl":"826399583931205381",
"templateJson":[],
"showLabel":true,
"required":false,
"tableName":"mdm_project",
"renderKey":1779164602724,
"tagIcon":"icon-ym icon-ym-generator-tree",
"tag":"YunzhupaasTreeSelect",
"formId":"formItemd3f1a4",
"visibility":[
"pc",
"app"
],
"noShow":false,
"dataType":"dynamic",
"dictionaryType":"",
"tipLabel":"",
"tableFixed":"none",
"label":"上级项目",
"trigger":"change",
"layout":"colFormItem",
"useCache":true,
"propsName":"获取标准项目树结构",
"regList":[],
"tableAlign":"left",
"span":24
},
"options":[],
"__vModel__":"pid",
"style":{
"width":"100%"
},
"disabled":false,
"id":"pid",
"placeholder":"请选择",
"on":{
"change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}"
}
},
{
"controls":false,
"fullName":"顺序号",
"fullNameI18nCode":[
""
],
"thousands":false,
"isAmountChinese":false,
"addonAfter":"",
"__config__":{
"formId":"formItemf01693",
"yunzhupaasKey":"inputNumber",
"visibility":[
"pc",
"app"
],
"noShow":false,
"tipLabel":"",
"tableFixed":"none",
"dragDisabled":false,
"className":[],
"label":"顺序号",
"trigger":[
"blur",
"change"
],
"showLabel":true,
"required":false,
"tableName":"mdm_project",
"renderKey":1779164640574,
"layout":"colFormItem",
"tagIcon":"icon-ym icon-ym-generator-number",
"tag":"YunzhupaasInputNumber",
"regList":[],
"tableAlign":"left",
"span":24
},
"__vModel__":"seq_num",
"style":{
"width":"100%"
},
"step":1,
"disabled":false,
"id":"seq_num",
"placeholder":"请输入",
"addonBefore":"",
"on":{
"change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}",
"blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}"
}
},
{
"clearable":true,
"maxlength":null,
"fullName":"备注",
"fullNameI18nCode":[
""
],
"autoSize":{
"minRows":4,
"maxRows":4
},
"showCount":false,
"__config__":{
"formId":"formItem41e3bd",
"yunzhupaasKey":"textarea",
"visibility":[
"pc",
"app"
],
"noShow":false,
"tipLabel":"",
"tableFixed":"none",
"dragDisabled":false,
"className":[],
"label":"备注",
"trigger":"blur",
"showLabel":true,
"required":false,
"tableName":"mdm_project",
"renderKey":1779164655791,
"layout":"colFormItem",
"tagIcon":"icon-ym icon-ym-generator-textarea",
"tag":"YunzhupaasTextarea",
"regList":[],
"tableAlign":"left",
"span":24
},
"readonly":false,
"__vModel__":"remark",
"style":{
"width":"100%"
},
"disabled":false,
"id":"remark",
"placeholder":"请输入",
"on":{
"change":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}",
"blur":"({ data, rowIndex, formData, setFormData, setShowOrHide, setRequired, setDisabled, onlineUtils }) => {\n // 在此编写代码\n \n}"
}
}
]
export default superQueryJson

View File

@@ -0,0 +1,653 @@
<template>
<div class="yunzhupaas-content-wrapper">
<div class="yunzhupaas-content-wrapper-center">
<div class="yunzhupaas-content-wrapper-search-box" v-if="getSearchList.length">
<BasicForm @register="registerSearchForm" :schemas="getSearchList"
@advanced-change="redoHeight" @submit="handleSearchSubmit" @reset="handleSearchReset"
class="search-form">
</BasicForm>
</div>
<div class="yunzhupaas-content-wrapper-content bg-white">
<BasicTable @register="registerTable" v-bind="getTableBindValue" ref="tableRef"
@columns-change="handleColumnChange">
<template #tableTitle>
<a-button type="primary" preIcon="icon-ym icon-ym-btn-add" v-auth="'btn_add'"
@click="addHandle()"> {{t('common.add2Text','新增')}}</a-button>
</template>
<template #toolbar>
<a-tooltip placement="top">
<template #title>
<span>{{ t('common.superQuery') }}</span>
</template>
<filter-outlined @click="openSuperQuery(true, { columnOptions: superQueryJson })" />
</a-tooltip>
</template>
<template #toolbarAfter>
<ViewList :menuId="route.meta.modelId" :viewList="viewList" @itemClick="handleViewClick" @reload="initViewList" />
<ViewSetting :menuId="route.meta.modelId" :viewList="viewList" :currentView="currentView" @reload="initViewList" />
</template>
<template #bodyCell="{ column, record, index }">
<template v-for="(item, index) in childColumnList" v-if="childColumnList.length">
<template
v-if="column?.id?.includes('-') && item.children && item.children[0] && column.key === item.children[0]?.dataIndex">
<ChildTableColumn :data="record[item.prop]" :head="item.children"
@toggleExpand="toggleExpand(record, item.prop+`Expand`)" @toDetail="toDetail"
:expand="record[item.prop+`Expand`]" :key="index" :showOverflow="true "/>
</template>
</template>
<template v-if="!(record.top || column.id?.includes('-'))">
<template v-if="column.yunzhupaasKey === 'relationForm'">
<p class="link-text"
@click="toDetail(column.modelId, record[column.dataIndex+`_id`], column.propsValue)">
{{ record[column.dataIndex] }}</p>
</template>
<template v-if="column.yunzhupaasKey === 'inputNumber'">
<yunzhupaas-input-number v-model:value="record[column.prop]" :precision="column.precision" :thousands="column.thousands" disabled detailed />
</template>
<template v-if="column.yunzhupaasKey === 'calculate'">
<yunzhupaas-calculate
v-model:value="record[column.prop]"
:isStorage="column.isStorage"
:precision="column.precision"
:thousands="column.thousands"
detailed />
</template>
<template v-if="column.yunzhupaasKey === 'sign'">
<yunzhupaas-sign v-model:value="record[column.prop]" detailed />
</template>
<template v-if="column.yunzhupaasKey === 'signature'">
<yunzhupaas-signature v-model:value="record[column.prop]" detailed />
</template>
<template v-if="column.yunzhupaasKey === 'rate'">
<yunzhupaas-rate v-model:value="record[column.prop]" :count="column.count" :allowHalf="column.allowHalf" disabled />
</template>
<template v-if="column.yunzhupaasKey === 'slider'">
<yunzhupaas-slider v-model:value="record[column.prop]" :min="column.min" :max="column.max" :step="column.step" disabled />
</template>
<template v-if="column.yunzhupaasKey === 'uploadImg'">
<yunzhupaas-upload-img v-model:value="record[column.prop]" disabled detailed simple v-if="record[column.prop]?.length" />
</template>
<template v-if="column.yunzhupaasKey === 'uploadFile'">
<yunzhupaas-upload-file v-model:value="record[column.prop]" disabled detailed simple v-if="record[column.prop]?.length" />
</template>
<template v-if="column.yunzhupaasKey === 'input'">
<yunzhupaas-input
v-model:value="record[column.prop]"
:useMask="column.useMask"
:maskConfig="column.maskConfig"
:showOverflow="true"
detailed />
</template>
</template>
<template v-if="column.key === 'action' && !record.top">
<TableAction :actions="getTableActions(record)" />
</template>
</template>
</BasicTable>
</div>
</div>
<Form ref="formRef" @reload="reload" />
<Detail ref="detailRef" />
<ExportModal @register="registerExportModal" @download="handleDownload" />
<ImportModal @register="registerImportModal" @reload="reload" />
<PrintSelect @register="registerPrintSelect" @change="handleShowBrowse" />
<PrintBrowse @register="registerPrintBrowse" />
<RelationDetail ref="relationDetailRef" />
<SuperQueryModal @register="registerSuperQueryModal" @superQuery="handleSuperQuery" />
</div>
</template>
<script lang="ts" setup>
import { getList, del, exportData, batchDelete } from './helper/api';
import { getConfigData,getViewList } from '@/api/onlineDev/visualDev';
import { getDictionaryDataSelector } from '@/api/systemData/dictionary';
import { getDataInterfaceRes } from '@/api/systemData/dataInterface';
import { getOrgByOrganizeCondition,getDepartmentSelectAsyncList } from '@/api/permission/organize';
import { ref, reactive, onMounted, toRefs, computed, unref, nextTick, toRaw, provide } from 'vue';
import { useMessage } from '@/hooks/web/useMessage';
import { useI18n } from '@/hooks/web/useI18n';
import { useOrganizeStore } from '@/store/modules/organize';
import { useUserStore } from '@/store/modules/user';
import { BasicModal, useModal } from '@/components/Modal';
import { usePopup } from '@/components/Popup';
import { ScrollContainer } from '@/components/Container';
import { BasicLeftTree, TreeActionType } from '@/components/Tree';
import { BasicForm, useForm } from '@/components/Form';
import { BasicTable, useTable, TableAction, ActionItem, TableActionType, SorterResult } from '@/components/Table';
import { SuperQueryModal } from '@/components/CommonModal';
import Form from './Form.vue';
import Detail from './Detail.vue';
// 有关联表单详情:开始
import RelationDetail from '@/views/common/dynamicModel/list/detail/index.vue';
// 有关联表单详情:结束
import ChildTableColumn from '@/views/common/dynamicModel/list/ChildTableColumn.vue';
import { ExportModal } from '@/components/CommonModal';
import { downloadByUrl } from '@/utils/file/download';
import { ImportModal} from '@/components/CommonModal';
// 打印模板多条生成PrintSelect
import PrintSelect from '@/components/PrintDesign/printSelect/index.vue';
import PrintBrowse from '@/components/PrintDesign/printBrowse/index.vue';
import { useRoute,useRouter } from 'vue-router';
import { FilterOutlined } from '@ant-design/icons-vue';
import { getSearchFormSchemas } from '@/components/FormGenerator/src/helper/transform';
import { cloneDeep } from 'lodash-es';
import columnList from './helper/columnList';
import searchList from './helper/searchList';
import superQueryJson from './helper/superQueryJson';
import { dyOptionsList, systemComponentsList } from '@/components/FormGenerator/src/helper/config';
import { thousandsFormat, getParamList} from '@/utils/yunzhupaas';
import { usePermission } from '@/hooks/web/usePermission';
import ViewSetting from '@/views/common/dynamicModel/list/components/ViewSetting.vue';
import ViewList from '@/views/common/dynamicModel/list/components/ViewList.vue';
interface State {
config: any;
columnList: any[];
printListOptions: any[];
columnBtnsList: any[];
customBtnsList: any[];
treeFieldNames: any;
leftTreeData: any[];
leftTreeLoading: boolean;
treeActiveId: string;
treeActiveNodePath: any;
columns: any[];
complexColumns: any[];
childColumnList: any[];
exportList: any[];
cacheList: any[];
currFlow: any;
isCustomCopy: boolean;
candidateType: number;
currRow: any;
workFlowFormData: any;
expandObj: any;
columnSettingList: any[];
searchSchemas: any[];
treeRelationObj: any;
treeQueryJson: any;
leftTreeActiveInfo: any;
keyword: string;
viewList: any[];
currentView: any;
}
const route = useRoute();
const { hasBtnP } = usePermission();
const { createMessage, createConfirm } = useMessage();
const { t } = useI18n();
const organizeStore = useOrganizeStore();
const userStore = useUserStore();
const userInfo = userStore.getUserInfo;
const [registerExportModal, { openModal: openExportModal, closeModal: closeExportModal, setModalProps: setExportModalProps }] = useModal();
const [registerImportModal, { openModal: openImportModal }] = useModal();
const [registerSuperQueryModal, { openModal: openSuperQuery }] = useModal();
const formRef = ref<any>(null);
const tableRef = ref<Nullable<TableActionType>>(null);
const detailRef = ref<any>(null);
const relationDetailRef = ref<any>(null);
const state = reactive<State>({
config: {},
columnList: [],
printListOptions: [],
columnBtnsList: [],
customBtnsList: [],
treeFieldNames: {
children: 'children' ,
title: 'fullName' ,
key: 'id' ,
isLeaf: 'isLeaf',
},
leftTreeData: [],
leftTreeLoading: false,
treeActiveId: '',
treeActiveNodePath: [],
columns: [],
complexColumns: [], // 复杂表头
childColumnList: [],
exportList: [],
cacheList: [],
currFlow: {},
isCustomCopy: false,
candidateType: 1,
currRow: {},
workFlowFormData: {},
expandObj: {},
columnSettingList: [],
searchSchemas: [],
treeRelationObj: null,
treeQueryJson: {},
leftTreeActiveInfo: {},
keyword: '',
viewList: [],
currentView: {},
});
const defaultSearchInfo = {
menuId: route.meta.modelId as string,
moduleId:'826396413712664325',
superQueryJson: '',
pageSize:1000000, //没有分页,树形,分组
};
const searchInfo = reactive({
...cloneDeep(defaultSearchInfo),
});
const { childColumnList, searchSchemas, viewList, currentView} = toRefs(state);
const [registerSearchForm, { updateSchema, resetFields, submit: searchFormSubmit, setFieldsValue}] = useForm({
baseColProps: { span: 6 },
showActionButtonGroup: true,
showAdvancedButton: true,
compact: true,
});
const [registerTable, { reload, setLoading, getFetchParams, getSelectRows, getSelectRowKeys, redoHeight,clearSelectedRowKeys }] = useTable({
api: getList,
immediate: false,
clickToRowSelect: false,
tableSetting: { setting: false },
afterFetch: (data) => {
const list = data.map((o) => ({
...o,
...state.expandObj,
}));
state.cacheList = cloneDeep(list);
return list;
},
});
const [registerChildTable] = useTable({
pagination: false,
canResize: false,
showTableSetting: false,
});
provide('getLeftTreeActiveInfo', () => state.leftTreeActiveInfo);
const getHasBatchBtn = computed(() => {
let btnsList =[]
btnsList=btnsList.filter(o => hasBtnP('btn_' + o))
return !!btnsList.length
});
const getColumns = computed(() => {
const columns = state.complexColumns;
return setListValue(state.currentView?.columnList, columns, 'prop');
});
const getSearchList = computed(() => {
const searchSchemas = cloneDeep(state.searchSchemas).map(o => ({ ...o, show: true }));
return setListValue(state.currentView?.searchList, searchSchemas, 'field');
});
const getTableBindValue = computed(() => {
let columns = unref(getColumns);
const defaultSortConfig=[{"field":"seq_num","sort":"asc","id":"sort1a71b8"}];
const sortField = defaultSortConfig.map(o => (o.sort === 'desc' ? '-' : '') + o.field);
const data: any = {
pagination: false, //没有分页,树形,分组
searchInfo: unref(searchInfo),
defSort: { sidx: sortField.join(',') },
sortFn: (sortInfo: SorterResult | SorterResult[]) => {
if (Array.isArray(sortInfo)) {
const sortList = sortInfo.map(o => (o.order === 'descend' ? '-' : '') + o.field);
return { sidx: sortList.join(',') };
} else {
const { field, order } = sortInfo;
if (field && order) {
// 排序字段
return { sidx: (order === 'descend' ? '-' : '') + field };
} else {
return {};
}
}
},
ellipsis:true ,
columns,
isTreeTable: true,
bordered: true,
actionColumn: {
width: 150,
title: t('component.table.action'),
dataIndex: 'action',
},
};
return data;
});
function init() {
state.config = {};
searchInfo.menuId = route.meta.modelId as string;
state.columnList = columnList;
setLoading(true);
getSearchSchemas();
getColumnList();
initViewList();
nextTick(() => {
unref(getSearchList)?.length ? searchFormSubmit() : reload({ page: 1 });
});
}
function getSearchSchemas() {
const schemas = getSearchFormSchemas(searchList);
state.searchSchemas = schemas;
schemas.forEach((cur) => {
const config = cur.__config__;
if (dyOptionsList.includes(config.yunzhupaasKey)) {
if (config.dataType === 'dictionary') {
if (!config.dictionaryType) return;
getDictionaryDataSelector(config.dictionaryType).then((res) => {
updateSchema([{ field: cur.field, componentProps: { options: res.data.list } }]);
});
}
if (config.dataType === 'dynamic') {
if (!config.propsUrl) return;
const query = { paramList: getParamList(config.templateJson) };
getDataInterfaceRes(config.propsUrl, query).then((res) => {
const data = Array.isArray(res.data) ? res.data : [];
updateSchema([{ field: cur.field, componentProps: { options: data } }]);
});
}
}
cur.defaultValue = cur.value;
});
}
function getColumnList() {
// 没有开启列表权限
let columnList = state.columnList;
state.exportList = columnList;
let columns = columnList.map((o) => ({
...o,
title: o.labelI18nCode ? t(o.labelI18nCode, o.label) : o.label,
dataIndex: o.prop,
align: o.align,
fixed: o.fixed == 'none' ? false : o.fixed,
sorter: o.sortable ? { multiple: 1 } : o.sortable,
width: o.width || 100,
}));
//添加复杂表头
columns = getComplexColumns(columns);
state.columns = columns.filter((o) => o.prop.indexOf('-') < 0);
//子表表头
getChildComplexColumns(columns);
}
//复杂表头
function getComplexColumns(columns) {
//这里生成复杂表头的配置
let complexHeaderList: any[] = [];
if (!complexHeaderList.length) return columns;
let childColumns: any[] = [];
let firstChildColumns: string[] = [];
for (let i = 0; i < complexHeaderList.length; i++) {
const e = complexHeaderList[i];
e.label = e.fullName;
e.labelI18nCode = e.fullNameI18nCode;
e.title = e.fullNameI18nCode ? t(e.fullNameI18nCode, e.fullName) : e.fullName;
e.align = e.align;
e.dataIndex = e.id;
e.prop = e.id;
e.children = [];
e.yunzhupaasKey = 'complexHeader';
if (e.childColumns?.length) {
childColumns.push(...e.childColumns);
for (let k = 0; k < e.childColumns.length; k++) {
const item = e.childColumns[k];
for (let j = 0; j < columns.length; j++) {
const o = columns[j];
if (o.prop == item && o.fixed !== 'left' && o.fixed !== 'right') e.children.push({ ...o });
}
}
}
if (e.children.length) firstChildColumns.push(e.children[0].prop);
}
complexHeaderList = complexHeaderList.filter(o => o.children.length);
let list: any[] = [];
for (let i = 0; i < columns.length; i++) {
const e = columns[i];
if (!childColumns.includes(e.prop)) {
list.push(e);
} else {
if (firstChildColumns.includes(e.prop)) {
const item = complexHeaderList.find(o => o.childColumns.includes(e.prop));
list.push(item);
}
}
}
return list;
}
//子表表头
function getChildComplexColumns(columnList) {
let list: any[] = [];
for (let i = 0; i < columnList.length; i++) {
const e = columnList[i];
if (!e.prop.includes('-')) {
list.push(e);
} else {
let prop = e.prop.split('-')[0];
let vModel = e.prop.split('-')[1];
let label = e.label.split('-')[0];
let childLabel = e.label.replace(label + '-', '');
if (e.fullNameI18nCode && Array.isArray(e.fullNameI18nCode) && e.fullNameI18nCode[0]) label = t(e.fullNameI18nCode[0], label);
let newItem = {
align: 'center',
yunzhupaasKey: 'table',
prop,
label,
title: label,
dataIndex: prop,
children: [],
};
e.dataIndex = vModel;
e.title = e.labelI18nCode ? t(e.labelI18nCode, childLabel) : childLabel;
if (!state.expandObj.hasOwnProperty(prop+`Expand`)) state.expandObj[prop+`Expand`] = false;
if (!list.some((o) => o.prop === prop)) list.push(newItem);
for (let i = 0; i < list.length; i++) {
if (list[i].prop === prop) {
list[i].children.push(e);
break;
}
}
}
}
// 行内分组展示
getMergeList(list);
state.complexColumns = list;
state.childColumnList = list.filter((o) => o.yunzhupaasKey === 'table');
// 子表分组展示宽度取100
for (let i = 0; i < state.childColumnList.length; i++) {
const e = state.childColumnList[i];
if (e.children?.length) e.children = e.children.map(o => ({ ...o, width: 100 }));
}
}
function getMergeList(list) {
list.forEach((item) => {
if (item.yunzhupaasKey === 'table' && item.children && item.children.length) {
item.children.forEach((child, index) => {
if (index == 0) {
child.customCell = () => ({
rowspan: 1,
colspan: item.children.length,
class: 'child-table-box',
});
} else {
child.customCell = () => ({
rowspan: 0,
colspan: 0,
});
}
});
}
});
}
function toggleExpand(row, field) {
row[field] = !row[field];
}
// 关联表单查看详情
function toDetail(modelId, id, propsValue) {
if (!id) return;
getConfigData(modelId).then((res) => {
if (!res.data || !res.data.formData) return;
const formConf = JSON.parse(res.data.formData);
formConf.popupType = 'general';
formConf.hasPrintBtn = false;
formConf.customBtns = [];
const data = { id, formConf, modelId, propsValue};
relationDetailRef.value?.init(data);
});
}
function handleColumnChange(data) {
state.columnSettingList = data;
}
function getTableActions(record): ActionItem[] {
return [
{
label: t('common.editText','编辑') ,
onClick: updateHandle.bind(null, record),
auth: 'btn_edit', //有按钮权限
},
{
label: t('common.delText','删除') ,
color: 'error',
modelConfirm: {
onOk: handleDelete.bind(null, record.id),
},
auth: 'btn_remove', //有按钮权限
},
{
label: t('common.detailText','详情') ,
onClick: goDetail.bind(null, record),
auth: 'btn_detail', //有按钮权限
},
];
}
// 编辑
function updateHandle(record) {
// 不带工作流
const data = {
id: record.id,
menuId: searchInfo.menuId,
allList: state.cacheList,
};
formRef.value?.init(data);
}
// 删除
function handleDelete(id) {
const query={ids:[id] }
batchDelete(query).then((res) => {
createMessage.success(res.msg);
clearSelectedRowKeys();
reload();
});
}
// 查看详情
function goDetail(record) {
// 不带流程
const data = {
id: record.id,
};
detailRef.value?.init(data);
}
// 新增
function addHandle() {
// 不带流程新增
const data = {
id: '',
menuId: searchInfo.menuId,
allList: state.cacheList,
};
formRef.value?.init(data);
}
// 高级查询
function handleSuperQuery(superQueryJson) {
searchInfo.superQueryJson = superQueryJson;
reload({ page: 1 });
}
function handleSearchReset() {
clearSelectedRowKeys();
if (!state.resetFromTree) updateSearchFormValue();
if (state.resetFromTree) state.resetFromTree = false;
}
function handleSearchSubmit(data) {
clearSelectedRowKeys();
let obj = {
...defaultSearchInfo,
superQueryJson: searchInfo.superQueryJson,
...data,
};
Object.keys(searchInfo).map(key => {
delete searchInfo[key];
});
for (let [key, value] of Object.entries(obj)) {
searchInfo[key.replaceAll('-', '_')] = value;
}
console.log(searchInfo);
reload({ page: 1 });
}
function updateSearchFormValue() {
if (!state.treeActiveId) return searchFormSubmit();
let queryJson: any = {};
let leftTreeActiveInfo: any = {};
const isMultiple = !state.treeRelationObj ? false : state.treeRelationObj.searchMultiple;
//多级左侧树,需要拼父级->转为查询参数
if (state.treeRelationObj && state.treeRelationObj.yunzhupaasKey && ['organizeSelect', 'cascader', 'areaSelect'].includes(state.treeRelationObj.yunzhupaasKey)) {
let currValue = [];
currValue = state.treeActiveNodePath.map(o => o[state.treeFieldNames.key]);
queryJson = { '': isMultiple ? [currValue] : currValue };
leftTreeActiveInfo = { '': state.treeRelationObj.multiple ? [currValue] : currValue };
} else {
queryJson = { '': isMultiple ? [state.treeActiveId] : state.treeActiveId };
leftTreeActiveInfo = { '': state.treeRelationObj.multiple ? [state.treeActiveId] : state.treeActiveId };
}
state.leftTreeActiveInfo = leftTreeActiveInfo;
if(unref(getSearchList)?.length){
// 有搜索列表
setFieldsValue(queryJson);
searchFormSubmit();
}else{
// 无搜索列表
handleSearchSubmit(queryJson);
}
}
function initViewList(currentId = '') {
const query = {
menuId: route.meta.modelId,
};
getViewList(query).then(res => {
const columns : any[]= state.complexColumns;
const searchList: any[] = state.searchSchemas.map(o => ({ label: o.label, id: o.field, show: o.show, labelI18nCode: o.labelI18nCode }));
const columnList: any[] = columns.map(o => ({ label: o.label, id: o.prop, show: true, fixed: o.fixed || 'none', labelI18nCode: o.labelI18nCode }));
state.viewList = (res.data || []).map(o => {
if (o.type == 0) return { ...o, searchList, columnList };
return { ...o, searchList: o.searchList ? JSON.parse(o.searchList) : [], columnList: o.columnList ? JSON.parse(o.columnList) : [] };
});
if (currentId) {
state.currentView = state.viewList.filter(o => o.id === currentId)[0] || state.viewList[0];
} else {
state.currentView = state.viewList.filter(o => o.status === 1)[0] || state.viewList[0];
}
});
}
function handleViewClick(item) {
state.currentView = item;
}
function setListValue(data: any[] = [], defaultData: any[] = [], key) {
let list: any[] = [];
for (let i = 0; i < data.length; i++) {
for (let j = 0; j < defaultData.length; j++) {
if (data[i].show && data[i].id == defaultData[j][key]) list.push(defaultData[j]);
}
}
return list;
}
onMounted(() => {
init();
});
</script>

View File

@@ -2,33 +2,33 @@ import { defHttp } from '@/utils/http/axios';
// 获取列表 // 获取列表
export function getList(data) { export function getList(data) {
return defHttp.post({ url: '/api/2/WorkType/getList', data }); return defHttp.post({ url: '/api/bcm/WorkType/getList', data });
} }
// 新建 // 新建
export function create(data) { export function create(data) {
return defHttp.post({ url:'/api/2/WorkType', data }); return defHttp.post({ url:'/api/bcm/WorkType', data });
} }
// 修改 // 修改
export function update(data) { export function update(data) {
return defHttp.put({ url: '/api/2/WorkType/'+ data.id, data }); return defHttp.put({ url: '/api/bcm/WorkType/'+ data.id, data });
} }
// 详情(无转换数据) // 详情(无转换数据)
export function getInfo(id) { export function getInfo(id) {
return defHttp.get({ url: '/api/2/WorkType/' + id }); return defHttp.get({ url: '/api/bcm/WorkType/' + id });
} }
// 获取(转换数据) // 获取(转换数据)
export function getDetailInfo(id) { export function getDetailInfo(id) {
return defHttp.get({ url: '/api/2/WorkType/detail/' + id }); return defHttp.get({ url: '/api/bcm/WorkType/detail/' + id });
} }
// 删除 // 删除
export function del(id) { export function del(id) {
return defHttp.delete({ url: '/api/2/WorkType/' + id }); return defHttp.delete({ url: '/api/bcm/WorkType/' + id });
} }
// 批量删除数据 // 批量删除数据
export function batchDelete(data) { export function batchDelete(data) {
return defHttp.delete({ url: '/api/2/WorkType/batchRemove', data }); return defHttp.delete({ url: '/api/bcm/WorkType/batchRemove', data });
} }
// 导出 // 导出
export function exportData(data) { export function exportData(data) {
return defHttp.post({ url: '/api/2/WorkType/Actions/Export', data }); return defHttp.post({ url: '/api/bcm/WorkType/Actions/Export', data });
} }