Ошибка запуска запланированного сценария из сценария формы суллета в Suitescript 2.0? - PullRequest
0 голосов
/ 19 октября 2019

Я новичок в suitescripts. Я сделал скрипт формы Suitelet с 3 полями, которые будут действовать как фильтры в запланированном скрипте. Запланированный скрипт отправки файла PDF на определенное электронное письмо после фильтрации 3 значений скрипта масти из моего сохраненного поиска. Когда я нажимаю кнопку в форме суллета, после ввода полей запланированный сценарий продолжает обрабатываться в течение 1 часа, а затем завершается ошибкой. Я думаю, что я поместил неправильные фильтры в загрузку сохраненного поиска в моем запланированном скрипте. Сохраненный поиск (customsearch_mx_itemsearch) без каких-либо фильтров или критериев. Пожалуйста, помогите, если кто-нибудь знает. Спасибо

Форма My Suitelet Сценарий:

define(['N/ui/serverWidget', 'N/search', 'N/render', 'N/runtime', 'N/file', 'N/task'],
  function (ui, search, render, runtime, file, task) {
    /**
     * main function for suitelet
     * @param {object} ctx
     */

    function onRequest(ctx) {

      var req = ctx.request;
      var res = ctx.response;
      var param = req.parameters;
      /**
       * create form is creating the UI for report generation
       */
      if (req.method === 'GET') {
        // createForm(req, res, param);
        createForm(req, res, param);
      } else {
        generateReport(req, res, param);
      }
    }

    // R E Q U E S T
    function createForm(req, res, param) {

      if (req.method === 'GET') {
        var form = ui.createForm({
          title: 'Generate Item Report'
        });

        var item = form.addField({
          id: 'custpage_selectitem',
          type: ui.FieldType.SELECT,
          label: 'Select Item',
          source: 'item'
        });
        item.isMandatory = true;

        var gender = form.addField({
          id: 'custpage_selectgender',
          type: ui.FieldType.SELECT,
          label: 'Select Gender',
          source: 'customrecord6'
        });
        gender.isMandatory = true;

        var fromDate = form.addField({
          id: 'custpage_selectdate',
          // type: ui.FieldType.DATETIME,
          type: ui.FieldType.DATE,
          label: 'Select Date/Time',
        });


        form.addSubmitButton({
          label: 'Generate Report'
        });

        res.writePage(form);
      }
    }

    // R E S P O N C E
    function generateReport(req, res, param) {
      var param = req.parameters;
      log.debug('parameters', param);
      var script = runtime.getCurrentScript();

      var filters = {
        'isgender': param.custpage_selectgender,
        'isItem': param.custpage_selectitem,
        'fromDate': param.custpage_selectdate
      };

      log.debug('filters', filters);

      var scriptTask = task.create({ taskType: task.TaskType.SCHEDULED_SCRIPT });
      // scriptTask.scriptId = 3920;
      scriptTask.scriptId = 'customscript_mx_itemreport_ss';
      scriptTask.deploymentId = 'customdeploy_mx_itemreport_ss';
      scriptTask.params = {
        custscript_searchfilter_report: JSON.stringify(filters)
      };
      log.debug('workingtillhere');
      var scriptTaskId = scriptTask.submit();
      res.write("Your report is being generated. It will be emailed to you shortly.")

    }

    return {
      onRequest: onRequest
    };
  });

Мой сценарий по расписанию:

define(['N/ui/serverWidget', 'N/search', 'N/render', 'N/runtime', 'N/file', 'N/email'],
  function (ui, search, render, runtime, file, email) {

    function execute() {
      try {
        generateReport();
      }
      catch (e) {
        log.error('generateReport ERROR', e);
      }
    }

    function generateReport(req, res, param) {

      var slfilters = runtime.getCurrentScript().getParameter({ name: 'custscript_searchfilter_report' });
      log.debug('slfilters', slfilters);

      if (!!slfilters) {
        slfilters = JSON.parse(slfilters);
      }
      log.debug('slfilters2', slfilters);

      var getUser = runtime.getCurrentUser();

      var gender = slfilters.isgender
      log.debug('gender', gender)
      var item = slfilters.isItem
      log.debug('item', item)

      var item = getItems(item, gender);
      log.debug('items table', item)

      var xmlTemplateFile = file.load(3918);
      var template = script.getParameter({ name: 'custscript_template' });
      var renderer = render.create();
      renderer.templateContent = xmlTemplateFile.getContents();
      var customSources = {
        alias: 'searchdata',
        format: render.DataSource.JSON,
        data: JSON.stringify({
          value: item,
        })
      };
      renderer.addCustomDataSource(customSources);

      var xml = renderer.renderAsString();
      var pdf = render.xmlToPdf({
        "xmlString": xml
      });

      email.send({
        author: 317,
        recipients: 'aniswtf@gmail.com',
        subject: 'Item Report',
        body: 'Report Generated: ',
        attachments: [pdf]
      });
    }

    //
    // ─── GET RESULTS ───────────────────────────────────────────────────
    //
    const getResults = function (set) {
      var results = [];
      var i = 0;
      while (true) {
        var result = set.getRange({
          "start": i,
          "end": i + 1000
        });
        if (!result) break;
        results = results.concat(result);
        if (result.length < 1000) break;
        i += 1000;
      }
      return results;
    };

    //
    // ─── GET ITEMS ───────────────────────────────────────────────────
    //
    function getItems(item, gender) {

      try {
        var itemSearch = search.load({
          id: 'customsearch_mx_itemsearch'
        });

        var defaultFilters = itemSearch.filters;
        var arrFilters = [];

        arrFilters.push(search.createFilter({
          name: 'custitem5',//gender
          operator: 'anyof',
          values: [gender]
        }));
        arrFilters.push(search.createFilter({
          name: 'internalid',
          operator: 'anyof',
          values: [item]
        }));

        //defaultFilters.push(arrFilters)
        defaultFilters = defaultFilters.concat(arrFilters);

        var results = getResults(itemSearch.run()).map(function (x) {
          return {

            'category': x.getText({
              name: "custitem10",
              join: "parent"
            }),
            'season': x.getValue({
              name: "custitem11",
              join: "parent"
            }),
            'riselabel': x.getValue({
              name: "custitem_itemriselabel",
              join: "parent"
            }),
            'fit': x.getValue({
              name: "custitem9",
              join: "parent"
            }),
            'name': x.getValue({ //sku
              name: "itemid",
              join: "parent"
            }),
            'style': x.getValue({
              name: "custitem8",
              join: "parent"
            }),
            'inseam': x.getValue({
              name: "custitem7",
              join: "parent"
            }),
            'wash': x.getValue({
              name: "custitem_washname",
              join: "parent"
            }),
          };
        });
        return results;

      } catch (e) {
        log.error('error in getItems', e)
      }

    }
    return {
      execute: execute
    };
  });

1 Ответ

2 голосов
/ 19 октября 2019

У вас есть аргументы req, res и param, определенные для generateReport(), но вы фактически не заполняете их, когда вы вызываете generateReport() в execute(). Вам нужно будет передать значения для этих параметров.

...