/*
|
* @Description: 通用低代码呈现页面主数据
|
* @Author: Ben Lin
|
* @version:
|
* @Date: 2024-06-02 17:52:35
|
* @LastEditors: Ben Lin
|
* @LastEditTime: 2024-10-23 23:01:49
|
*/
|
|
import { ActionItem, FormSchema, PopConfirm } from '/@/components/Table';
|
import { useI18n } from '/@/hooks/web/useI18n';
|
import { isArray, isNullOrEmpty, isNullOrUnDef, isTimeViaRegExp8601 } from '/@/utils/is';
|
import { woCustFn, woformSchema } from '/@/views/components/bizMesWo';
|
import { useModal } from '/@/components/Modal';
|
import { Ref, unref } from 'vue';
|
import { getRouteData, getWoRouteData } from '/@/api/tigerapi/mes/router';
|
import { buildUUID } from '/@/utils/uuid';
|
import { useUserStore } from '/@/store/modules/user';
|
import { dateUtil, formatToDateTime } from '/@/utils/dateUtil';
|
import { DeleteEntity, getEntity } from '/@/api/tigerapi/system';
|
import { useGo } from '/@/hooks/web/usePage';
|
import { useQueryStore } from '/@/store/modules/queryInpage';
|
import { RouteRecordName } from 'vue-router';
|
import { cloneDeep } from 'lodash-es';
|
import dayjs from 'dayjs';
|
import { utils } from 'sortablejs';
|
|
const { t } = useI18n();
|
/**
|
* @description: 低代码页面获取操作字段结构Json,如增加按钮及方法
|
* 攻略:
|
* 1. 另新建驼峰实体名.ts的文件,如:BAS_REASON.ts。以便区别不同页面的方法
|
* 2. 替换主页面编辑按钮方法变为跳转到高级页面,方法中传入 { CODE: 主表记录的关键字段值,一般是XXX_CODE的值, ID: 当前记录的ID, Name: 'BAS_DEFECT'(跳转过去需要新增编辑的实体名), Title: `编辑不良代码组:${params['record']['DFTG_CODE']}`(定义tab页签的标题), pCode: 'DFTG_CODE'(主表的关键字段代码) }
|
* 替换主页面新增按钮方法同上
|
* 3. 在菜单管理新建一个高级页面。
|
* 4. 配置高级页面,定义表单列 getFormSchema
|
* 5. 初始化表格 GetBasicColumnAndInit
|
* 6. 设置返回 getHomeUrl
|
* 7. 设置标题 getTitle
|
* 8. 设置新增时就默认的值 getKeyFieldValues
|
* 9. 替换删除方法 GetActionsData
|
* @param {*} params
|
* @param {array} args
|
* @return {*}
|
*/
|
export function GetActionsData(params: {}, ...args) {
|
const data = [] as ActionItem[];
|
return data;
|
}
|
|
export function GetUseModalData(type: string) {
|
let data = {};
|
switch (type) {
|
case 'BAS_DEFECT_GRP':
|
data = {
|
add: useModal(),
|
set: useModal(),
|
addRot: useModal(),
|
setRot: useModal(),
|
};
|
break;
|
}
|
return data;
|
}
|
|
/**
|
* @description: Select 自定义onChange方法
|
* @param {any} e
|
* @param {string} fnName
|
* @param {string} entityName
|
* @return {*}
|
*/
|
export function custOnChange(e: any, fnName: string, entityName: string) {
|
if (!isNullOrEmpty(fnName)) {
|
switch (entityName) {
|
case 'BAS_REASON':
|
// onChangeFns[fnName](e);
|
break;
|
default:
|
break;
|
(e) => {};
|
}
|
} else {
|
(e) => {};
|
}
|
}
|
|
/**
|
* @description: 打开自定义弹出框方法
|
* @return {*}
|
*/
|
export function OpenCustModal(
|
openItemModal: Fn,
|
entityName: string,
|
slotName: string,
|
others: Fn[],
|
...args
|
) {
|
switch (entityName) {
|
case 'BIZ_MES_WO':
|
case 'BIZ_MES_WO_Config': //根据带入的名称打开不同的实体列表
|
woCustFn(openItemModal, slotName, others, args);
|
break;
|
default: //默认打开物料列表
|
openItemModal(true, {
|
title: '物料列表',
|
schemas: [
|
{
|
field: 'ITEM_CODE',
|
component: 'Input',
|
label: '物料编码',
|
colProps: {
|
span: 12,
|
},
|
},
|
],
|
ItemColumns: [
|
{
|
title: t('物料编码'),
|
dataIndex: 'ITEM_CODE',
|
resizable: true,
|
sorter: true,
|
width: 200,
|
},
|
{
|
title: t('物料名称'),
|
dataIndex: 'ITEM_NAME',
|
resizable: true,
|
sorter: true,
|
width: 180,
|
},
|
],
|
tableName: 'BAS_ITEM',
|
rowKey: 'ITEM_CODE',
|
searchInfo: { TABLE_NAME: 'BAS_ITEM' },
|
});
|
break;
|
}
|
}
|
|
/**
|
* @description: 获取自定义弹出框中表单的结构
|
* @param {string} type
|
* @return {*}
|
*/
|
export function getFormSchema(type: string) {
|
let _formSchema = [] as FormSchema[];
|
switch (type) {
|
case 'BIZ_MES_WO':
|
_formSchema = woformSchema;
|
break;
|
default:
|
break;
|
}
|
return _formSchema;
|
}
|
|
/**
|
* @description: 工艺路线初始化
|
* @param {*} lf
|
* @return {*}
|
*/
|
export async function initRoute(lf, rotId, routeData, currlf, rotType) {
|
currlf.value = unref(lf);
|
//通过工艺路线ID获取图形数据,并渲染
|
const _data = rotType == 'Wo' ? await getWoRouteData(rotId) : await getRouteData(rotId);
|
console.log('组件已挂载', _data);
|
if (_data.Data != null) {
|
_data.Data.nodes.forEach((n) => {
|
n.node.properties = JSON.parse(n.node.properties);
|
n['node']['text']['value'] = n.NODE_NAME;
|
routeData.value.nodes.push(n['node']);
|
});
|
console.log('111', routeData.value);
|
_data.Data.edges.forEach((e) => {
|
e.edge.properties = JSON.parse(e.edge.properties);
|
routeData.value.edges.push(e.edge);
|
});
|
_data.Data.acts.forEach((act) => {
|
act.node.properties = JSON.parse(act.node.properties);
|
routeData.value.nodes.push(act.node);
|
});
|
unref(lf).render(routeData.value);
|
// lf.graphModel.translateCenter();
|
// lf.graphModel.fitView();
|
}
|
}
|
|
/* 高级表单公用方法 *********************************Start */
|
|
/**
|
* @description: 查询自定义方法,当在高级表单中的表格中查询时触发事件,并把{ type: type, data: data }传到父组件
|
* @param {string} type 表格的名字,好确定是哪个表格要查询
|
* @param {Ref} data 此表格的原数据
|
* @param {*} emit dtl组件的事件,触发一个'search'事件
|
* @return {*}
|
*/
|
export async function Search(type: string, data: Ref<any>, emit) {
|
emit('search', { type: type, data: data });
|
}
|
|
/**
|
* @description: 高级表单新增编辑方法
|
* @param {Ref} data
|
* @param {*} d
|
* @param {*} u
|
* @param {*} item
|
* @param {*} updates
|
* @return {*}
|
*/
|
export function EditOperation(data: Ref<any[]>, d, u, item, updates) {
|
if (u.isUpdate) {
|
//更新
|
data.value[item] = updates;
|
} else {
|
//新增
|
d.ID = buildUUID();
|
d.CREATE_USER = useUserStore().getUserInfo.userId as string;
|
d.UPDATE_TIME = formatToDateTime(new Date());
|
d.UPDATE_USER = useUserStore().getUserInfo.userId as string;
|
let _data2: any[] = cloneDeep(data.value[item]);
|
_data2.push(d);
|
data.value[item] = _data2;
|
}
|
}
|
|
/**
|
* @description: 自定义删除方法
|
* @param {Fn} args
|
* @param {*} params
|
* @return {*}
|
*/
|
export function custDel(args: Fn[], params: {}) {
|
const name = params['name'];
|
const useTables = args[1];
|
if (!isNullOrEmpty(params['data'])) {
|
const _data = params['data'].value[name].filter((item) => item['ID'] != params['record']['ID']);
|
params['data'].value[name] = _data;
|
useTables[name][1].setProps({
|
dataSource: [],
|
});
|
useTables[name][1].setProps({
|
dataSource: params['data'].value[name],
|
});
|
useTables[name][1].reload();
|
} else {
|
DeleteEntity(params['record'], params['entityName']).then((action) => {
|
if (action.IsSuccessed) {
|
useTables[name][1].reload();
|
}
|
});
|
}
|
}
|
|
/* 高级表单公用方法 *********************************End */
|
|
/**
|
* @description: 获取权限按钮列表
|
* @param {*} params
|
* @return {*}
|
*/
|
export function GenerateActionButton(params: any, buttons: Ref<[]>, openDrawer: Fn, reload: Fn) {
|
const actionItem = [] as ActionItem[];
|
buttons.value.map((x) => {
|
if (x['BUTTON_TYPE'] == 1) {
|
let url = '';
|
let color = undefined as 'success' | 'error' | 'warning' | undefined;
|
let _click = null as any;
|
let _popConfirm = undefined as PopConfirm | undefined;
|
let _tooltip = '';
|
if (x['DO_METHOD'] == 'Edit') {
|
url = 'clarity:note-edit-line';
|
_tooltip = '编辑';
|
_click = editRecord.bind(null, openDrawer, params);
|
} else {
|
_click = () => {};
|
if (x['DO_METHOD'] == 'Delete') {
|
url = 'ant-design:delete-outlined';
|
color = 'error';
|
_tooltip = '删除';
|
_popConfirm = {
|
title: '是否确认删除?',
|
placement: 'left',
|
confirm: deleteRecord.bind(null, reload, params),
|
};
|
}
|
}
|
actionItem.push({
|
icon: isNullOrEmpty(x['ICON_URL']) ? url : x['ICON_URL'],
|
tooltip: _tooltip,
|
onClick: _click,
|
color: color,
|
popConfirm: _popConfirm,
|
name: x['DO_METHOD'],
|
});
|
}
|
});
|
return actionItem;
|
}
|
|
/**
|
* @description: 公用编辑方法
|
* @param {Fn} fn
|
* @param {*} params
|
* @return {*}
|
*/
|
export function editRecord(fn: Fn, params: {}) {
|
fn(true, params);
|
}
|
|
/**
|
* @description: 公用删除方法
|
* @param {Fn} fn
|
* @param {*} params
|
* @return {*}
|
*/
|
function deleteRecord(fn: Fn, params: {}) {
|
console.log(params['record']);
|
//删除
|
DeleteEntity(params['record'], params['entityName']).then((action) => {
|
if (action.IsSuccessed) {
|
fn();
|
}
|
});
|
}
|
|
/**
|
* @description: 跳转并根据传入的参数通过session传入
|
* @param {string} path 跳转地址
|
* @return {*}
|
*/
|
export function goByParams(path: string, params: {}, go) {
|
if (path.split('/').length > 2 && path.split('/')[2] == 'LC') {
|
getEntity({
|
sqlcmd: `ASSEMBLY_NAME ='${path.split('/')[1]}'`,
|
entityName: 'SYS_LOW_CODE',
|
order: '',
|
}).then((data) => {
|
const searchForms = JSON.parse(data.Data.Items[0].SEARCH_FORM_JSON);
|
const colSlots = [] as string[];
|
for (const i in searchForms) {
|
if (!isNullOrUnDef(searchForms[i]['colSlot'])) {
|
colSlots.push('form-' + searchForms[i]['colSlot']);
|
}
|
}
|
|
const _cruds = JSON.parse(data.Data.Items[0].FORM_JSON);
|
const crudColSlots = [] as string[];
|
for (const i in _cruds) {
|
if (!isNullOrUnDef(_cruds[i]['colSlot'])) {
|
crudColSlots.push(_cruds[i]['colSlot']);
|
}
|
}
|
const id = {
|
ID: path.split('/')[1],
|
colSlots: colSlots,
|
crudColSlots: crudColSlots,
|
sName: `${path.split('/')[1]}_update`,
|
};
|
// 将对象转换为JSON字符串并保存到sessionStorage
|
sessionStorage.removeItem(`${id.sName}_params`);
|
sessionStorage.setItem(`${id.sName}_params`, encodeURI(JSON.stringify({ params: params })));
|
go(`/${path.split('/')[1]}/${path.split('/')[2]}/${encodeURI(JSON.stringify(id))}`);
|
});
|
} else if (
|
(path.split('/').length > 2 && path.split('/')[2] == 'High') ||
|
path.split('/')[2] == 'CP'
|
) {
|
const id = { sName: `${path.split('/')[1]}_update`, Name: path.split('/')[1], params: params };
|
// 将对象转换为JSON字符串并保存到sessionStorage
|
sessionStorage.removeItem(`${id.sName}_params`);
|
sessionStorage.setItem(`${id.sName}_params`, encodeURI(JSON.stringify(id)));
|
go(
|
`/${path.split('/')[1]}/${path.split('/')[2]}/${encodeURI(JSON.stringify({ sName: id.sName, Name: id.Name }))}`,
|
);
|
} else {
|
const id = { sName: `${path.split('/')[1]}_update`, params: params };
|
// 将对象转换为JSON字符串并保存到sessionStorage
|
sessionStorage.removeItem(`${id.sName}_params`);
|
sessionStorage.setItem(`${id.sName}_params`, encodeURI(JSON.stringify(id)));
|
go(`${path}/${encodeURI(JSON.stringify({ sName: id.sName }))}`);
|
}
|
}
|
|
/**
|
* @description: 调用api前,参数整理
|
* @param {*} t
|
* @return {*}
|
*/
|
export function SearchInfoFn(param: any, name: RouteRecordName | null | undefined, ByOrg: boolean) {
|
const useQuery = useQueryStore();
|
if (
|
!isNullOrUnDef(useQuery.getCurSearchInfo) &&
|
useQuery.getCurSearchInfo.some((q) => q.name == name)
|
) {
|
const curSearchInfo = useQuery.getCurSearchInfo.filter((q) => q.name == name);
|
const Keys = Object.getOwnPropertyNames(curSearchInfo[0].searchInfo);
|
for (const k in Keys) {
|
if (Keys[k] != 'page' && Keys[k] != 'pageSize') {
|
param[Keys[k]] = curSearchInfo[0].searchInfo[Keys[k]];
|
}
|
}
|
useQuery.setCurSearchInfo({ name: name, searchInfo: param });
|
}
|
if (isNullOrEmpty(param.option) && ByOrg) {
|
param.option = {
|
//根据据点查询,必需带这个参数
|
UserId: useUserStore().getUserInfo.userId,
|
ByOrg: true,
|
CurOrg: useUserStore().getUserInfo.orgCode,
|
};
|
}
|
return param;
|
}
|
|
/**
|
* @description: 请求之后对返回值进行处理
|
* @param {*} t
|
* @return {*}
|
*/
|
export function afterFetchFn(t: any, name: RouteRecordName | null | undefined, f) {
|
const useQuery = useQueryStore();
|
if (
|
!isNullOrUnDef(useQuery.getCurSearchInfo) &&
|
useQuery.getCurSearchInfo.some((q) => q.name == name)
|
) {
|
const curSearchInfo = useQuery.getCurSearchInfo.filter((q) => q.name == name);
|
const params = cloneDeep(curSearchInfo[0].searchInfo);
|
const Keys = Object.getOwnPropertyNames(params);
|
for (const k in Keys) {
|
if (!isNullOrEmpty(params[Keys[k]].length) && isArray(params[Keys[k]])) {
|
if (isTimeViaRegExp8601(params[Keys[k]][0])) {
|
params[Keys[k]][0] = dateUtil(params[Keys[k]][0])
|
params[Keys[k]][1] = dateUtil(params[Keys[k]][1])
|
}
|
}
|
}
|
f.setFieldsValue(params);
|
}
|
}
|