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 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