Yuite客开代码示例

Arthit 于 2025-03-18 发布

前端函数

列表页行内按钮动态控制显示隐藏

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);
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}&timestamp=${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