前端函数
列表页行内按钮动态控制显示隐藏
let gridModel = viewModel.getGridModel("a62856_collectcontract5_2223221264998203535");
gridModel &&
gridModel.on("beforeSetDataSource", function (data) {
//表格--onBeforeSetDataSource
console.log("333");
//获取列表所有数据
//const rows = data;
//从缓存区获取按钮
const actions = gridModel.getCache("actions");
if (!actions) return;
const actionsStates = [];
data.forEach((x) => {
const actionState = {};
actions.forEach((action) => {
actionState[action.cItemName] = { visible: true };
if (action.cItemName == "btnEdit") {
if (x.verifystate == 1) {
actionState[action.cItemName] = { visible: false };
}
}
});
actionsStates.push(actionState);
});
setTimeout(function () {
gridModel.setActionsState(actionsStates);
}, 50);
});
获取 UTF+8 日期
var timezone = 8; //目标时区时间,东八区
var offset_GMT = new Date().getTimezoneOffset(); //本地时间和格林威治的时间差,单位为分钟
var nowDate = new Date().getTime(); //本地时间距 1970 年 1 月 1 日午夜(GMT 时间)之间的毫秒数
var date = new Date(nowDate + offset_GMT * 60 * 1000 + timezone * 60 * 60 * 1000);
console.log(date);
日期格式化 yyyy-MM-dd HH:mm:ss
function padStart(str, length, padChar = "0") {
str = String(str); // 确保传入的是字符串
while (str.length < length) {
str = padChar + str;
}
return str;
}
// 第一种
function getDate() {
const date = new Date();
const utcTime = date.getTime(); // 获取当前时间的 UTC 时间戳
const timeZoneOffset = 8 * 60 * 60 * 1000; // UTC+8 的时区偏移(以毫秒为单位)
// 获取 UTC+8 时间
const localDate = new Date(utcTime + timeZoneOffset);
const formattedDate = `${localDate.getFullYear()}-${padStart(localDate.getMonth() + 1, 2)}-${padStart(localDate.getDate(), 2)} ${padStart(localDate.getHours(), 2)}:${padStart(
localDate.getMinutes(),
2
)}:${padStart(localDate.getSeconds(), 2)}`;
return formattedDate;
}
// 第二种
const date = new Date();
// 将结果转换回字符串格式
const year = date.getFullYear();
const month = ("0" + (date.getMonth() + 1)).slice(-2); // 补零
const day = ("0" + date.getDate()).slice(-2); // 补零
const hours = ("0" + date.getHours()).slice(-2); // 补零
const minutes = ("0" + date.getMinutes()).slice(-2); // 补零
const seconds = ("0" + date.getSeconds()).slice(-2); // 补零
const formattedDate = `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
保存前修改字段的值
viewModel.on("beforeSave", function (args) {
const billData = JSON.parse(args.data.data);
if (!billData.id) {
billData.note = "test";
const temp = JSON.stringify(billData);
args.data.data = temp;
}
});
保存前异步校验+错误弹窗提示
viewModel.on("beforeSave", function (args) {
let data = JSON.parse(args.data.data);
let returnPromise = new cb.promise();
cb.rest.invokeFunction(
"",
{},
function (err, res) {
console.log(res, err);
if (err) {
cb.utils.alert(err.message, "error");
return false;
}
if (res.data.length > 0) {
cb.utils.alert({
title: "BOM版本号重复,请重新输入!",
type: "warning",
duration: "3",
mask: false,
});
return false;
}
returnPromise.resolve();
},
undefined,
{ domainKey: "engineeringdata" }
);
return returnPromise;
});
前端同步调用后端 API 函数
let res = cb.rest.invokeFunction("", {}, function (err, res) {}, viewModel, { async: false });
console.log(res);
console.log(res.result); //调用成功返回的对象
页面初始化赋值查询字段赋值
// 公共模型初始化完成
viewModel.on("afterInitCommonViewModel", function () {
// 获取查询区模型
const filtervm = viewModel.getCache("FilterViewModel");
// 查询区模型DOM初始化后
filtervm.on("afterInit", function () {
let org = cb.context.getDefaultOrg(); //获取工作台设置的默认业务单元
if (org) {
// 获取控件的真实模型
const salesOrgModel = filtervm.get("salesOrgId_name").getFromModel();
// 赋予查询区字段初始值
salesOrgModel.setValue(org);
}
});
});
设置字段隐藏显示
viewModel.get("defineDts__GYLC").setVisible(true / false);
取消表格字段的页面 link
viewModel.getGridModel("orderMaterial").setColumnState("productName", "bJointQuery", false);
参照特征字段自定义设置显示字段
viewModel.get('defineDts') &&
viewModel.get('defineDts').get('GYLC2') &&
viewModel
.get('defineDts')
.get('GYLC2')
.on('afterReferOkClick', function (data) {
//console.log(data);
if (data.length > 0) {
viewModel.get('defineDts__GYLC2').setState('textField', 'oid_userDefine_2169807402329178120');//oid_userDefine_2169807402329178120 从列表数据加载请求获取字段名称
}
});
//在afterLoadData事件也设置一下
viewModel.on('afterLoadData', function (args) {
viewModel.get('defineDts__GYLC2').setState('textField', 'oid_userDefine_2169807402329178120');
}
//获取页面的状态
let mode = viewModel.getParams().mode.toLowerCase();
mode == 'browse' // 'add'
调用异步函数获取返回值
function getOrderMaterialData(input) {
let returnPromise = new cb.promise();
cb.rest.invokeFunction("", input, function (err, res) {
console.info(res);
if (err) {
returnPromise.reject(err.message); // 这里会触发失败处理函数
} else {
let orderMaterialRows = res.data;
returnPromise.resolve(orderMaterialRows);
}
});
return returnPromise;
}
let orderMaterialDataPromise = getOrderMaterialData(input, orderProductRow);
orderMaterialDataPromise.then(
function (orderMaterialRows) {
console.info(orderMaterialRows);
},
function (error) {
cb.utils.alert(error, "error");
}
);
表格相关
//以表格单元格值变化前事件为例
viewModel.getGridModel("orderProduct") &&
viewModel.getGridModel("orderProduct").on("beforeCellValueChange", function (data) {
if (data.rowIndex < 0) return true;
let orderProductRow = viewModel.getGridModel("orderProduct").getRow(data.rowIndex);
orderProductRow.bomId = null;
viewModel.getGridModel("orderProduct").updateRow(data.rowIndex, orderProductRow);
// 直接修改
//viewModel.getGridModel('orderProduct').setCellValue(data.rowIndex, 'mrpQuantity', 100);
// for循环修改
// for (let i = 0; i < orderMaterialData.length; i++) {
// let orderMaterialRow = orderMaterialData[i];
// viewModel.getGridModel('orderMaterial').updateRow(i, {
// recipientQuantity: 100
// });
// }
// 阻止事件变更
// return false;
let orderMaterialData = viewModel.getGridModel("orderMaterial")?.getData();
// 给每行数据加索引再根据索引删除
viewModel.getGridModel("orderMaterial")?.deleteRows(orderMaterialData.map((x, index) => ({ ...x, originalIndex: index })).map((x) => x.originalIndex));
viewModel.getGridModel("orderMaterial")?.insertRows(0, orderMaterialRows);
if (data.cellName == "productDefineDts") {
// 特征字段判断是否被修改
if ((!data.value.BOMExpandMode && !data.oldValue?.BOMExpandMode) || (data.value.BOMExpandMode && data.oldValue?.BOMExpandMode == data.value.BOMExpandMode)) {
return true;
}
}
});
//获取表格下拉框的数据集
let editRowModelInfo = viewModel.getGridModel().getEditRowModel();
let listModelInfo = editRowModelInfo.get("inMark");
let inMarkData = listModelInfo.__data.dataSource;
//阻止新增行
viewModel.getGridModel().on("beforeInsertRow", function (e) {
const rows = viewModel.getGridModel().getRows();
if (rows.length >= 4) {
cb.utils.alert("表体不能超过4条", "error");
return false;
}
return true;
});
//手动触发单元格的公式计算
gridModel.execute("afterCellValueChange", { rowIndex: 0, cellName: "price", value: 1 });
//触发整个表格: viewModel.execute('formulaRules', [ {target: 'orderDetails'} ])
//详细见文档: https://bip-pre.yonyoucloud.com/iuap-yonbuilder-designer/ucf-wh/docs-mdf/mdf/index.html#/guides/13-gongshiyunxingshi
后端函数
调用开发平台接口
let env = ObjectStore.env();
let header = {
"Content-Type": "application/json;charset=UTF-8",
};
let body = {};
let url = env.url + "/iuap-api-gateway/yonbip/mfg/bom/save/V1";
let infoString = ObjectStore.openLinkerPure("post", url, "ED", body); // `ED`应用编码
let infoObject = JSON.parse(infoString);
获取开发平台接口的 AccessToken
let AbstractTrigger = require("AbstractTrigger");
function hexToBytes(hex) {
const bytes = [];
for (let i = 0; i < hex.length; i += 2) {
bytes.push(parseInt(hex.substr(i, 2), 16));
}
return bytes;
}
function bytesToBase64(bytes) {
const base64Chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
let base64 = "";
let padding = 0;
for (let i = 0; i < bytes.length; i += 3) {
const byte1 = bytes[i];
const byte2 = i + 1 < bytes.length ? bytes[i + 1] : (padding++, 0);
const byte3 = i + 2 < bytes.length ? bytes[i + 2] : (padding++, 0);
const base64Index1 = byte1 >> 2;
const base64Index2 = ((byte1 & 3) << 4) | (byte2 >> 4);
const base64Index3 = ((byte2 & 15) << 2) | (byte3 >> 6);
const base64Index4 = byte3 & 63;
base64 += base64Chars[base64Index1] + base64Chars[base64Index2] + (padding >= 2 ? "=" : base64Chars[base64Index3]) + (padding >= 1 ? "=" : base64Chars[base64Index4]);
}
return base64;
}
class MyTrigger extends AbstractTrigger {
execute(context, param) {
let header = {
"Content-Type": "application/json;charset=UTF-8",
};
let appKey = "appKey";
let timestamp = Date.now();
const hmacSHA256 = HmacSHA256(`appKey${appKey}timestamp${timestamp}`, "appSecret");
const bytes = hexToBytes(hmacSHA256);
const base64String = bytesToBase64(bytes);
let signature = encodeURIComponent(base64String);
let body = {};
let url = `https://c3.yonyoucloud.com/iuap-api-auth/open-auth/selfAppAuth/getAccessToken?appKey=${appKey}×tamp=${timestamp}&signature=${signature}`;
let infoString = ObjectStore.postman("get", url, header, body);
let data = JSON.parse(infoString);
//throw new Error(JSON.stringify(data))
return data.data;
}
}
exports({ entryPoint: MyTrigger });
常用函数示例
const sum = (arr) => arr.reduce((total, item) => total + item, 0); //求和函数
const multiply = (arr) => arr.reduce((total, item) => total * item, 1); //乘法函数
const numbers = data.filter((item) => item.id != id).map((item) => item.oriSum); //过滤加转换
numbers.forEach((x) => {
//forEach循环
//x
});
for (let i = 0; i < orderMaterialData.length; i++) {
//for循环
}
data.toFixed(4); //保留小数
// map对象写法
function domTreeMap(list) {
return list.map((x) => {
return {
productCode: x.productCode,
ZJBOM2: x.ZJBOM2,
};
});
}
// 分组
function groupByFields(array, fields) {
return array.reduce((acc, item) => {
const key = fields.map((field) => item[field]).join("-");
if (!acc.has(key)) {
acc.set(key, []);
}
acc.get(key).push(item);
return acc;
}, new Map());
}
const grouped = groupByFields(data, ["id"]); //调用
其他
常用 Uri
组织: org.func.BaseOrg
部门:bd.adminOrg.AdminOrgVO
员工: bd.staff.Staff、bd.staff.StaffNew
客户:aa.merchant.Merchant
供应商:aa.vendor.Vendor
物料:pc.product.Product
计量单位:pc.unit.Unit
批次号:st.batchno.Batchno
税目税率:bd.taxrate.TaxRateVO
仓库:aa.warehouse.Warehouse
省市区:bd.region.BaseRegionVO
项目:bd.project.ProjectVO