帖子
帖子
用户
博客
课程
显示全部楼层
143
帖子
2
勋章
4万+
Y币

案例-销售订单子表excel导入

[复制链接]
发表于 2024-3-7 14:34:21
案例整理自其他客开老师的开发成果
一、场景
客开实现在销售订单新增时,通过excel导入子表数据,然后再点保存。
注意事项,标准版此种客开方案对单次导入的数据量有要求,每次最好不要超过200

二、开发步骤
1、引入三方js插件
从网上下载即可

2、设计器增加按钮
按钮增加后如果预览看不到
先在设计器-页面配置中调整显示

然后去“角色管理”菜单,给当前用户的角色勾选按钮权限
3、前端脚本
  1. loadJsXlsx(viewModel);
  2. //分录导入--单击
  3. createInput(viewModel);

  4. function loadJsXlsx(viewModel) {
  5.     //动态引入js-xlsx库
  6.     var secScript = document.createElement('script');
  7.     //保存传入的viewModel对象
  8.     // window.viewModelInfo = viewModel;

  9.     secScript.setAttribute('type', 'text/javascript');
  10.     //传入文件地址 subId:应用ID
  11.     secScript.setAttribute('src', `/iuap-yonbuilder-runtime/opencomponentsystem/public/SCMSA/xlsx.core.min.js?domainKey=developplatform`);
  12.     document.body.insertBefore(secScript, document.body.lastChild);
  13. }

  14. function createInput(viewModel) {
  15.     var fileInput = document.createElement('input');
  16.     fileInput.id = 'file_input_info';
  17.     fileInput.type = 'file';
  18.     fileInput.style = 'display:none';
  19.     document.body.insertBefore(fileInput, document.body.lastChild);

  20.     //给文件input注册改变事件
  21.     document.getElementById('file_input_info').addEventListener('change', function (e) {
  22.         var files = e.target.files;

  23.         if (files.length == 0) return;

  24.         var filesData = files[0];

  25.         readWorkbookFromLocalFile(filesData, function (workbook) {
  26.             readWorkbook(workbook, viewModel);
  27.             document.getElementById('file_input_info').value = "";
  28.         });
  29.     });
  30. }

  31. //触发文件点击事件
  32. function selectFile() {
  33.     document.getElementById('file_input_info').click();
  34. }

  35. //读取本地excel文件
  36. function readWorkbookFromLocalFile(file, callback) {
  37.     var reader = new FileReader();

  38.     reader.onload = function (e) {
  39.         var localData = e.target.result;
  40.         var workbook = XLSX.read(localData, { type: 'binary' });
  41.         if (callback) callback(workbook);
  42.     };
  43.     reader.readAsBinaryString(file);
  44. }

  45. //读取excel里面数据,进行缓存
  46. function readWorkbook(workbook, viewModel) {
  47.     var sheetNames = workbook.SheetNames; // 工作表名称集合
  48.     const workbookDatas = [];
  49.     let sheetNamesItem = sheetNames[0];
  50.     workbookDatas[0] = XLSX.utils.sheet_to_json(workbook.Sheets[sheetNamesItem]);
  51.     let workbookData = workbookDatas[0];
  52.     let DataCount = workbookData.length;

  53.     //循环获取的excel物料编码值,获取物料对应信息
  54.     let QryMatInParm = [];
  55.     for (let i = 0; i < DataCount; i++) {

  56.         let workbookDataInfo = workbookData[i];

  57.         let ProductCode = workbookDataInfo.商品编码;
  58.         QryMatInParm.push(ProductCode);
  59.     }

  60.     let RtMatInfo = [];
  61.     //根据物料编码集合获取物料的信息
  62.     cb.rest.invokeFunction("SCMSA.BackScript.SOQueryMatInfo", { codes: QryMatInParm },
  63.         function (err, res) {
  64.             console.log(err);
  65.             console.log(res);
  66.             RtMatInfo = res["res"];

  67.             //批量插入行传入参数
  68.             let InParms = [];

  69.             //获取单据日期
  70.             const PlanDate = viewModel.get('vouchdate').getValue();

  71.             //组织
  72.             const salesOrgId = viewModel.get('salesOrgId').getValue();
  73.             const salesOrgId_code = viewModel.get('salesOrgId_code').getValue();
  74.             const salesOrgId_name = viewModel.get('salesOrgId_name').getValue();

  75.             for (let i = 0; i < DataCount; i++) {
  76.                 let InParm = {};
  77.                 let workbookDataInfo = workbookData[i];

  78.                 let ProductCode = "";
  79.                 ProductCode = workbookDataInfo.商品编码;
  80.                 InParm.realProductCode = ProductCode;
  81.                 InParm.productCode = ProductCode;

  82.                 //根据物料获取物料的信息
  83.                 const MatResult = RtMatInfo.find(item => item.code == ProductCode);

  84.                 if (MatResult !== undefined) {
  85.                     //商品名称
  86.                     const name = MatResult.name;
  87.                     InParm.productName = name;

  88.                     //商品id
  89.                     let productId = MatResult.id;
  90.                     // productId="1944077975384227800";
  91.                     InParm.productId = productId;
  92.                     // InParm.realProductCode = productId;

  93.                     //销售单位
  94.                     const batchUnit = MatResult.batchUnitName;
  95.                     InParm.productAuxUnitName = batchUnit;

  96.                     //计价单位
  97.                     const batchPriceUnit = MatResult.batchPriceUnitName;
  98.                     InParm.productUnitName = batchPriceUnit;

  99.                     //税率
  100.                     const outTaxrate = MatResult.outTaxrate;
  101.                     const outTaxrateName = MatResult.outTaxrateName;
  102.                     const outTaxrateCode = MatResult.outTaxrateCode;
  103.                     if (outTaxrate !== undefined) {
  104.                         InParm.taxId = outTaxrate;

  105.                     }

  106.                     if (outTaxrate !== undefined) {
  107.                         InParm.taxRate = outTaxrateName;
  108.                     }

  109.                     if (outTaxrate !== undefined) {
  110.                         InParm.taxCode = outTaxrateCode;
  111.                     }
  112.                 }

  113.                 //计划发货日期
  114.                 InParm.consignTime = PlanDate;

  115.                 //库存组织
  116.                 InParm.stockOrgId_name = salesOrgId_name;
  117.                 InParm.stockOrgId_code = salesOrgId_code;
  118.                 InParm.stockOrgId = salesOrgId;

  119.                 //开票组织
  120.                 InParm.settlementOrgId_name = salesOrgId_name;
  121.                 InParm.settlementOrgId_code = salesOrgId_code;
  122.                 InParm.settlementOrgId = salesOrgId;

  123.                 // InParm.subQty = workbookDataInfo.数量;
  124.                 InParms.push(InParm);
  125.             }

  126.             //获取表格现有行数
  127.             let AllRows = viewModel.getGridModel("orderDetails").getRows();
  128.             let RowCount = AllRows.length;

  129.             viewModel.getGridModel("orderDetails").insertRows(RowCount, InParms);

  130.             let BatchSetArr = [];
  131.             for (let j = 0; j < DataCount; j++) {
  132.                 let workbookDataInfo1 = workbookData[j];
  133.                 const subQty = workbookDataInfo1.数量;

  134.                 let IndexRow = j + RowCount;
  135.                 //批量更新数量字段
  136.                 viewModel.getGridModel("orderDetails").setCellValue(IndexRow, "subQty", subQty, true);

  137.                 let BatchSetObj = {};
  138.                 BatchSetObj.rowIndex = j;
  139.                 BatchSetObj.cellName = "subQty";
  140.                 BatchSetObj.value = subQty;
  141.                 BatchSetObj.check = true;
  142.                 BatchSetArr.push(BatchSetObj);
  143.             }

  144.             //设置表头本币信息
  145.             viewModel.get('orderPrices!natCurrency').setValue('1915846150329466908');
  146.             viewModel.get('orderPrices!domesticName').setValue('人民币');
  147.             viewModel.get('orderPrices!domesticCode').setValue('CNY');
  148.             // viewModel.getGridModel("orderDetails").setCellValues(BatchSetArr);
  149.         });
  150. }
  151. //点击按钮上传excel
  152. viewModel.get('button138jf').on('click', function (data) {
  153.         selectFile();
  154.     });
复制代码


4、api函数
  1. let AbstractAPIHandler = require('AbstractAPIHandler');
  2. class MyAPIHandler extends AbstractAPIHandler {
  3.     execute(request) {
  4.         const matCodes = request.codes;
  5.         let CodeCount = matCodes.length;
  6.         let TotCodeStr = "";
  7.         for (let i = 0; i < CodeCount; i++) {
  8.             const MatCode = matCodes[i];
  9.             TotCodeStr += "'" + MatCode + "',"
  10.         }

  11.         TotCodeStr += "'final'";

  12.         //物料详情信息

  13.         let QryInfos = ObjectStore.queryByYonQL("select id,code,name"
  14.             + " from pc.product.Product where code in(" + TotCodeStr + ")", "productcenter");
  15.         QryInfos.forEach(function (QryInfo) {
  16.             let QryUnitInfos = ObjectStore.queryByYonQL("select batchPriceUnit,batchUnit,outTaxrate"
  17.                 + " from pc.product.ProductDetail where productId ='" + QryInfo.id + "'", "productcenter");
  18.                
  19.             const batchUnitId= QryUnitInfos[0].batchUnit;
  20.             const batchPriceUnitId= QryUnitInfos[0].batchPriceUnit;
  21.             const outTaxrateId= QryUnitInfos[0].outTaxrate;
  22.             
  23.             QryInfo.batchPriceUnit = batchPriceUnitId;
  24.             QryInfo.batchUnit = batchUnitId;
  25.             QryInfo.outTaxrate = outTaxrateId;
  26.             
  27.             //根据销售单位id获取单位名称和编码
  28.         let QrybatchUnitInfos = ObjectStore.queryByYonQL("select code,name from pc.unit.Unit where id='" + batchUnitId + "'");
  29.         const batchUnitName = QrybatchUnitInfos[0].name;
  30.         const batchUnitCode = QrybatchUnitInfos[0].code;
  31.         QryInfo.batchUnitName=batchUnitName;
  32.          QryInfo.batchUnitCode=batchUnitCode;
  33.          
  34.          //根据计量单位id获取单位名称和编码
  35.           let QrybatchPriceUnitInfos = ObjectStore.queryByYonQL("select code,name from pc.unit.Unit where id='" + batchPriceUnitId + "'");
  36.         const batchPriceUnitName = QrybatchPriceUnitInfos[0].name;
  37.         const batchPriceUnitCode = QrybatchPriceUnitInfos[0].code;
  38.         QryInfo.batchPriceUnitName=batchPriceUnitName;
  39.          QryInfo.batchPriceUnitCode=batchPriceUnitCode;
  40.          
  41.          if(outTaxrateId!==undefined){
  42.             //根据税率id获取税率编码和名称
  43.         let QryoutTaxrateInfos = ObjectStore.queryByYonQL("select code,ntaxrate from archive.taxArchives.TaxRateArchive where id='" + outTaxrateId + "'");
  44.         const outTaxrateName = QryoutTaxrateInfos[0].ntaxrate;
  45.         const outTaxrateCode = QryoutTaxrateInfos[0].code;
  46.         QryInfo.outTaxrateName=outTaxrateName;
  47.          QryInfo.outTaxrateCode=outTaxrateCode;
  48.          }
  49.         });

  50.         return { res: QryInfos };
  51.     }
  52. }
  53. exports({ "entryPoint": MyAPIHandler });
复制代码


本帖子中包含更多资源,您需要 登录 才可以下载或查看,没有帐号?立即注册

X
您需要登录后才可以回帖 登录

本版积分规则