# app_script_history

id: 649bbbc19932ee4d0f7f54fa
scriptid: 649aa52d99329f5ca7253c1c
tablename: app_script
clientip: 39.170.92.207
username: sa
createdate: 2023.06.28 13:00:34.000
script:
/**
 * 脚本中心的脚本，以 main函数为执行入口，相关的参数放在arg中，它是一个JSON字符串化后的数据
 *
 */
function main(arg) {
    println(arg);
    var param = JSON.parse(arg);
    var gguid = newGUID();
    var moduleid = 'dy';//模块ID
    var username = "api";
    var userid = getUserIdByName(username);
    var leaderid= 21; //审核人ID
    var billno = newBillNo('', 'dzpz_dy', 'billno', '{11111111}', 'billdate', newDate(), "");
    var dzpz_dy_ds = newDataStore("", "select * from  dzpz_dy");
    dzpz_dy_ds.setUpdateProperty("dzpz_dy", "id", "*", "id");
    dzpz_dy_ds.insertRow(0);
    dzpz_dy_ds.setValue(0, {
        id: gguid, gguid: gguid, userid: userid, username: username, billdate: newDate(), billno: billno,
        reader: param.dyr, 
        leaderid: leaderid , 
        summary: param.dyyy, corpid: '00',
        needwatermark: 0,//不打水印 
        filetype: 'zip', // 
        email: param.email,
        moredata: JSON.stringify(param.callback_param)
    });

    var dzpz_dymx_ds = newDataStore("", "select 8 from dzpz_dymx");
    dzpz_dymx_ds.setUpdateProperty('dzpz_dymx', 'id', '*', "id");
    var pzh = param.pzh  ;
    if( pzh==undefined) pzh =[];
    for (var i = 0; i < pzh.length; i++) {
        var row = dzpz_dymx_ds.insertRow(9999999);
        dzpz_dymx_ds.setValue(row, { id: newGUID(), gguid: gguid, inner_xh: i + 1, pzh: pzh[i], code: param.ktbh });
    }

    var err = updateAll(dzpz_dy_ds, dzpz_dymx_ds);
    if (err != '') return { success: false, messager: err };



    var config = {
        moduleid: moduleid,//凭证调阅模块代码或ID,
        gguid: gguid,
        flow: 'dy', //工作流的代码或ID
        userid: userid, //发起人ID
        subject: `${param.dyr || ''}因 [${param.dyyy || ''}] 调阅凭证`


    };

    var ret = newWork(config);

    if (!ret.success) return ret;

    //自动递交给初审
    var t = taskInfoForWork('dy', gguid);

    //将任务递交下去，如果任务需要签收，则先签收     
    for (var i = 0; i < t.taskList.length; i++) {
        var task = t.taskList[i];

        //可以递交，那么递交下去
        if (task.canSubmit) println(submitWork(moduleid, gguid, task.taskId));
        //需要先签收 ，那么以第一个候选人签收它
        if (task.canClaim) claimWork(moduleid, gguid, task.taskId, task.candidateUserList[0].userId);

    }

    ret.id = gguid;
    ret.billno= billno;
    return ret;


}


id: 649bbbc19932ee4d0f7f5503
scriptid: 649aa52d99329f5ca7253c1c
tablename: app_script
clientip: 39.170.92.207
username: sa
createdate: 2023.06.28 13:01:25.000
script:
/**
 * 脚本中心的脚本，以 main函数为执行入口，相关的参数放在arg中，它是一个JSON字符串化后的数据
 *
 */
function main(arg) {
    println(arg);
    var param = JSON.parse(arg);
    var gguid = newGUID();
    var moduleid = 'dy';//模块ID
    var username = "api";
    var userid = getUserIdByName(username);
    var leaderid= 21; //审核人ID
    var billno = newBillNo('', 'dzpz_dy', 'billno', '{11111111}', 'billdate', newDate(), "");
    var dzpz_dy_ds = newDataStore("", "select * from  dzpz_dy");
    dzpz_dy_ds.setUpdateProperty("dzpz_dy", "id", "*", "id");
    dzpz_dy_ds.insertRow(0);
    dzpz_dy_ds.setValue(0, {
        id: gguid, gguid: gguid, userid: userid, username: username, billdate: newDate(), billno: billno,
        reader: param.dyr, 
        leaderid: leaderid , 
        summary: param.dyyy, corpid: '00',
        needwatermark: 0,//不打水印 
        filetype: 'zip', // 
        email: param.email,
        moredata: JSON.stringify(param.callback_param)
    });

    var dzpz_dymx_ds = newDataStore("", "select * from dzpz_dymx");
    dzpz_dymx_ds.setUpdateProperty('dzpz_dymx', 'id', '*', "id");
    var pzh = param.pzh  ;
    if( pzh==undefined) pzh =[];
    for (var i = 0; i < pzh.length; i++) {
        var row = dzpz_dymx_ds.insertRow(9999999);
        dzpz_dymx_ds.setValue(row, { id: newGUID(), gguid: gguid, inner_xh: i + 1, pzh: pzh[i], code: param.ktbh });
    }

    var err = updateAll(dzpz_dy_ds, dzpz_dymx_ds);
    if (err != '') return { success: false, messager: err };



    var config = {
        moduleid: moduleid,//凭证调阅模块代码或ID,
        gguid: gguid,
        flow: 'dy', //工作流的代码或ID
        userid: userid, //发起人ID
        subject: `${param.dyr || ''}因 [${param.dyyy || ''}] 调阅凭证`


    };

    var ret = newWork(config);

    if (!ret.success) return ret;

    //自动递交给初审
/*
    var t = taskInfoForWork('dy', gguid);

    //将任务递交下去，如果任务需要签收，则先签收     
    for (var i = 0; i < t.taskList.length; i++) {
        var task = t.taskList[i];

        //可以递交，那么递交下去
        if (task.canSubmit) println(submitWork(moduleid, gguid, task.taskId));
        //需要先签收 ，那么以第一个候选人签收它
        if (task.canClaim) claimWork(moduleid, gguid, task.taskId, task.candidateUserList[0].userId);

    }
*/

    ret.id = gguid;
    ret.billno= billno;
    return {success:true , id: gguid , content:{billno:billno}  };


}


id: 649bbbc19932ee4d0f7f5516
scriptid: 649aa52d99329f5ca7253c1c
tablename: app_script
clientip: 39.170.92.207
username: sa
createdate: 2023.06.28 13:04:31.000
script:
/**
 * 脚本中心的脚本，以 main函数为执行入口，相关的参数放在arg中，它是一个JSON字符串化后的数据
 *
 */
function main(arg) {
    println(arg);
    var param = JSON.parse(arg);
    var gguid = newGUID();
    var moduleid = 'dy';//模块ID
    var username = "api";
    var userid = getUserIdByName(username);
    var leaderid= 21; //审核人ID
    var billno = newBillNo('', 'dzpz_dy', 'billno', '{11111111}', 'billdate', newDate(), "");
    var dzpz_dy_ds = newDataStore("", "select * from  dzpz_dy");
    dzpz_dy_ds.setUpdateProperty("dzpz_dy", "id", "*", "id");
    dzpz_dy_ds.insertRow(0);
    dzpz_dy_ds.setValue(0, {
        id: gguid, gguid: gguid, userid: userid, username: username, billdate: newDate(), billno: billno,
        reader: param.dyr, 
        leaderid: leaderid , 
        summary: param.dyyy, corpid: '00',
        needwatermark: 0,//不打水印 
        filetype: 'zip', // 
        email: param.email,
        moredata: JSON.stringify(param.callback_param)
    });

    var dzpz_dymx_ds = newDataStore("", "select * from dzpz_dymx");
    dzpz_dymx_ds.setUpdateProperty('dzpz_dymx', 'id', '*', "id");
    var pzh = param.pzh  ;
    if( pzh==undefined) pzh =[];
    for (var i = 0; i < pzh.length; i++) {
        var row = dzpz_dymx_ds.insertRow(9999999);
        dzpz_dymx_ds.setValue(row, { id: newGUID(), gguid: gguid, inner_xh: i + 1, pzh: pzh[i], code: param.ktbh });
    }

    var err = updateAll(dzpz_dy_ds, dzpz_dymx_ds);
    if (err != '') return { success: false, messager: err };


    var corpid = getStringFromSQL("select corpid from dzpz_dy where id='" + gguid + "'");
    
    var sqls = ["update dzpz_dymx  set bz=null,pz_id= (select max(id) from dzpz_pz where dzpz_pz.pzh= dzpz_dymx.pzh and dzpz_pz.corpid='" + corpid + "' ) where gguid='" + gguid + "' ",
                "update dzpz_dymx  set bz='凭证号不存在' where  gguid='" + gguid + "' and not exists (select dzpz_pz.id from dzpz_pz where  dzpz_pz.pzh= dzpz_dymx.pzh  and dzpz_pz.corpid='" + corpid + "')  " 
             
    ];
    runSQL("", sqls); 


    var config = {
        moduleid: moduleid,//凭证调阅模块代码或ID,
        gguid: gguid,
        flow: 'dy', //工作流的代码或ID
        userid: userid, //发起人ID
        subject: `${param.dyr || ''}因 [${param.dyyy || ''}] 调阅凭证`


    };

    var ret = newWork(config);

    if (!ret.success) return ret;

    //自动递交给初审
/*
    var t = taskInfoForWork('dy', gguid);

    //将任务递交下去，如果任务需要签收，则先签收     
    for (var i = 0; i < t.taskList.length; i++) {
        var task = t.taskList[i];

        //可以递交，那么递交下去
        if (task.canSubmit) println(submitWork(moduleid, gguid, task.taskId));
        //需要先签收 ，那么以第一个候选人签收它
        if (task.canClaim) claimWork(moduleid, gguid, task.taskId, task.candidateUserList[0].userId);

    }
*/

    ret.id = gguid;
    ret.billno= billno;
    return {success:true , id: gguid , content:{billno:billno}  };


}


id: 649bd0a39932ee4d0f7f55c6
scriptid: 60fa600f9932563b7c99baff
tablename: app_script
clientip: 39.170.92.207
username: sa
createdate: 2023.06.28 14:23:11.000
script:
/**
 * 单据点击保存，前端所有的操作被转译成3种操作:insert , delete , update ,
 *  并且可以在  beforeBillSaveOnServer 中返回一些SQL语句，可以在afterBillSaveOnServer中返回一些SQL语句
 *
 * 系统分别在需要的数据库连接中执行这些语句 ， 当所有语句执行成功后，事件被提交。一些细节如下 ：
 *
 * 1 如果单据中的表，属于不同的数据库连接，那么所有的SQL语句会以连接为单位，对语句进行批量执行
 * 2 这些语句的执行顺序是：对同一个数据库连接中的语句， 先执行 beforeBillSaveOnServer 中返回的SQL语句，再执行单据操作转译得到的SQL语句，
 *   再执行 afterBillSaveOnServer 中返回的SQL语句， 当多个（或一个）数据库连接执行完这些语句，且没有错误时，所有的数据库连接做提交，否则全部回滚
 * 3 不要在 beforeBillSaveOnServer 或 afterBillSaveOnServer 中直接执行数据库操作，而是返回SQL语句，让系统批量执行它们，并控制好事务
 * 4 当执行成功后，系统再执行事件函数  afterBillSaveSuccessfulOnServer 。 此事件中可以执行任意操作，它与单据保存事件结束后才被触发执行，
 *   与单据保存并不在一个事务中。
 *
 *
 * @param gguid  要删除记录的gguid ，等同于主表的id
 * @param session  一个JSON对象，用于在整个单据保存过程中的各个事件之间传递数据。本事件做为单据保存的最后一个事件，session对象在使用后将被丢弃
 *
 *
 * @return 本函数不需要返回值
 *
 */
function afterBillSaveSuccessfulOnServer(gguid, session) {

    var corpid = getStringFromSQL("select corpid from dzpz_dy where id='" + gguid + "'");
    //2022.08.11优化，理论上不应该存在重复号码的凭证，但是加上max肯定没错，避免数据异常导致更新失败
    var sqls = ["update dzpz_dymx  set bz=null,pz_id= (select max(id) from dzpz_pz where dzpz_pz.pzh= dzpz_dymx.pzh and dzpz_pz.corpid='" + corpid + "' ) where gguid='" + gguid + "' ",
                "update dzpz_dymx  set bz='凭证号不存在' where  gguid='" + gguid + "' and not exists (select dzpz_pz.id from dzpz_pz where  dzpz_pz.pzh= dzpz_dymx.pzh  and dzpz_pz.corpid='" + corpid + "')  " 
             
    ];

    runSQL("", sqls, true);
    println("----检测凭证是否存在完成---------")
}


/**
 * 用户任务提交后
 * @param flow 流程定义
 * @param node 开始节点
 * @param gguid 单据的gguid

 */
//@comment (group=工作流事件,caption=用户任务提交后)
function onUserTaskSubmitted(flow, userTask, gguid) {
    // println( flow.id) ; //流程定义的ID
    // println( userTask.name);
    println(JSON.stringify(userTask));
    println(gguid);

    if (userTask.id == 'id_6655df8bedc641aa9bacf1720d13ce2d') //领导审批通过后，就开始打包
    {
        //领导审批通过后，就开始打包
        do_package(gguid);
    }

    println(gguid + " " + userTask.name + " 提交完成")


}

//后台打包
function do_package(gguid) {
    var ret= runTask("package", {gguid:gguid}); 
    return  JSON.parse(  ret );
}



function back_urlShare(url , d , t)
{
    var ret= urlShare( url , d, "day", t);
    return ret.url;  
}


id: 649bd0a39932ee4d0f7f55cf
scriptid: 60fa600f9932563b7c99baff
tablename: app_script
clientip: 39.170.92.207
username: sa
createdate: 2023.06.28 14:24:26.000
script:
/**
 * 单据点击保存，前端所有的操作被转译成3种操作:insert , delete , update ,
 *  并且可以在  beforeBillSaveOnServer 中返回一些SQL语句，可以在afterBillSaveOnServer中返回一些SQL语句
 *
 * 系统分别在需要的数据库连接中执行这些语句 ， 当所有语句执行成功后，事件被提交。一些细节如下 ：
 *
 * 1 如果单据中的表，属于不同的数据库连接，那么所有的SQL语句会以连接为单位，对语句进行批量执行
 * 2 这些语句的执行顺序是：对同一个数据库连接中的语句， 先执行 beforeBillSaveOnServer 中返回的SQL语句，再执行单据操作转译得到的SQL语句，
 *   再执行 afterBillSaveOnServer 中返回的SQL语句， 当多个（或一个）数据库连接执行完这些语句，且没有错误时，所有的数据库连接做提交，否则全部回滚
 * 3 不要在 beforeBillSaveOnServer 或 afterBillSaveOnServer 中直接执行数据库操作，而是返回SQL语句，让系统批量执行它们，并控制好事务
 * 4 当执行成功后，系统再执行事件函数  afterBillSaveSuccessfulOnServer 。 此事件中可以执行任意操作，它与单据保存事件结束后才被触发执行，
 *   与单据保存并不在一个事务中。
 *
 *
 * @param gguid  要删除记录的gguid ，等同于主表的id
 * @param session  一个JSON对象，用于在整个单据保存过程中的各个事件之间传递数据。本事件做为单据保存的最后一个事件，session对象在使用后将被丢弃
 *
 *
 * @return 本函数不需要返回值
 *
 */
function afterBillSaveSuccessfulOnServer(gguid, session) {

    var corpid = getStringFromSQL("select corpid from dzpz_dy where id='" + gguid + "'");
    //2022.08.11优化，理论上不应该存在重复号码的凭证，但是加上max肯定没错，避免数据异常导致更新失败
    var sqls = ["update dzpz_dymx  set bz=null,pz_id= (select max(id) from dzpz_pz where dzpz_pz.pzh= dzpz_dymx.pzh and dzpz_pz.corpid='" + corpid + "' ) where gguid='" + gguid + "' ",
                "update dzpz_dymx  set bz='凭证号不存在' where  gguid='" + gguid + "' and not exists (select dzpz_pz.id from dzpz_pz where  dzpz_pz.pzh= dzpz_dymx.pzh  and dzpz_pz.corpid='" + corpid + "')  " 
             
    ];

    runSQL("", sqls, true);
    println("----检测凭证是否存在完成---------")
}


/**
 * 用户任务提交后
 * @param flow 流程定义
 * @param node 开始节点
 * @param gguid 单据的gguid

 */
//@comment (group=工作流事件,caption=用户任务提交后)
function onUserTaskSubmitted(flow, userTask, gguid) {
    // println( flow.id) ; //流程定义的ID
    // println( userTask.name);
    println(JSON.stringify(userTask));
    println(gguid);

    if (userTask.id == 'id_6655df8bedc641aa9bacf1720d13ce2d') //领导审批通过后，就开始打包
    {
        //领导审批通过后，就开始打包
        do_package(gguid);
    }

    println(gguid + " " + userTask.name + " 提交完成")


}

//后台打包
function do_package(gguid) {
    var ret= runTask("package", {gguid:gguid , userid: currentUserId()}); 
    return  JSON.parse(  ret );
}



function back_urlShare(url , d , t)
{
    var ret= urlShare( url , d, "day", t);
    return ret.url;  
}


id: 649bd0a39932ee4d0f7f55d9
scriptid: 649bccb89932ee4d0f7f5577
tablename: app_script
clientip: 39.170.92.207
username: sa
createdate: 2023.06.28 14:25:22.000
script:
//后台打包
function main( arg) {
    var param=  JSON.parse(arg);
    var gguid= param.id; 
    

    var ids = [];
    //2022.08.11 优化， 有可能存在重复的，所能加上 distinct 去重
    var $dzpz_dymx_ds = newDataStore("", "select  pz_id ,pzh , max(filenameprefix) as filenameprefix from  dzpz_dymx where gguid='" + gguid + "' group by pz_id, pzh  order by pzh  ");
    $dzpz_dymx_ds.retrieve();
    println($dzpz_dymx_ds.getSelectLastRetrieved());

    for (var i = 0; i < $dzpz_dymx_ds.getRowCount(); i++) {
        var pz_id = '' + $dzpz_dymx_ds.getString(i, "pz_id");
        var filenameprefix = $dzpz_dymx_ds.getString(i, "filenameprefix");
        if (pz_id == '') continue;
        if (ids.contains(pz_id)) continue;
        ids.push({ id:pz_id , filenameprefix: filenameprefix} );
    }

    if (ids.length == 0) {
        println("没有凭证清单");
        return {success:false, message:"没有凭证清单"};
    }

    println(ids.length + "张凭证需要打包");

    var $dzpz_dy_ds = newDataStore("", "select * from  dzpz_dy where gguid='" + gguid + "'");
    $dzpz_dy_ds.setUpdateProperty("dzpz_dy", "id", "*", "id");
    $dzpz_dy_ds.retrieve();

    var fileName = $dzpz_dy_ds.getString(0, "reader") + formatDate(newDate(), "yyyy.MM.dd") + "因"+$dzpz_dy_ds.getString(0, "summary") + "调阅凭证.zip";

    var ret = runTask("后台打包", {
        gguid: gguid,
        fileName: fileName,
        ids: ids,
        watermark: $dzpz_dy_ds.getInt(0, "needwatermark") == 0 ? "" : (formatDate($dzpz_dy_ds.getValue(0, "billdate"), "yyyy.MM.dd HH:mm") + "\n" + $dzpz_dy_ds.getString(0, "watermark")),
        mergePDF: $dzpz_dy_ds.getString(0, "filetype") == 'pdf' //是否合并成一个pdf文件

    });

    println(ret);
    ret = JSON.parse(ret);

    if (ret.success) {
        $dzpz_dy_ds.setValue(0, "ziptaskid", ret.zipTaskId);
        $dzpz_dy_ds.update(true);
    }
    return ret;
}


id: 649bd0a39932ee4d0f7f5608
scriptid: 649bccb89932ee4d0f7f5577
tablename: app_script
clientip: 39.170.92.207
username: sa
createdate: 2023.06.28 14:36:38.000
script:
//后台打包
function main( arg) {
    var param=  JSON.parse(arg);
    var gguid= param.gguid; 
    

    var ids = [];
    //2022.08.11 优化， 有可能存在重复的，所能加上 distinct 去重
    var $dzpz_dymx_ds = newDataStore("", "select  pz_id ,pzh , max(filenameprefix) as filenameprefix from  dzpz_dymx where gguid='" + gguid + "' group by pz_id, pzh  order by pzh  ");
    $dzpz_dymx_ds.retrieve();
    println($dzpz_dymx_ds.getSelectLastRetrieved());

    for (var i = 0; i < $dzpz_dymx_ds.getRowCount(); i++) {
        var pz_id = '' + $dzpz_dymx_ds.getString(i, "pz_id");
        var filenameprefix = $dzpz_dymx_ds.getString(i, "filenameprefix");
        if (pz_id == '') continue;
        if (ids.contains(pz_id)) continue;
        ids.push({ id:pz_id , filenameprefix: filenameprefix} );
    }

    if (ids.length == 0) {
        println("没有凭证清单");
        return {success:false, message:"没有凭证清单"};
    }

    println(ids.length + "张凭证需要打包");

    var $dzpz_dy_ds = newDataStore("", "select * from  dzpz_dy where gguid='" + gguid + "'");
    $dzpz_dy_ds.setUpdateProperty("dzpz_dy", "id", "*", "id");
    $dzpz_dy_ds.retrieve();

    var fileName = $dzpz_dy_ds.getString(0, "reader") + formatDate(newDate(), "yyyy.MM.dd") + "因"+$dzpz_dy_ds.getString(0, "summary") + "调阅凭证.zip";

    var ret = runTask("后台打包", {
        gguid: gguid,
        fileName: fileName,
        ids: ids,
        watermark: $dzpz_dy_ds.getInt(0, "needwatermark") == 0 ? "" : (formatDate($dzpz_dy_ds.getValue(0, "billdate"), "yyyy.MM.dd HH:mm") + "\n" + $dzpz_dy_ds.getString(0, "watermark")),
        mergePDF: $dzpz_dy_ds.getString(0, "filetype") == 'pdf' //是否合并成一个pdf文件

    });

    println(ret);
    ret = JSON.parse(ret);

    if (ret.success) {
        $dzpz_dy_ds.setValue(0, "ziptaskid", ret.zipTaskId);
        $dzpz_dy_ds.update(true);
    }
    return ret;
}


id: 649bd5769932ee4d0f7f5611
scriptid: 60fa600f9932563b7c99baff
tablename: app_script
clientip: 39.170.92.207
username: sa
createdate: 2023.06.28 14:38:47.000
script:
/**
 * 单据点击保存，前端所有的操作被转译成3种操作:insert , delete , update ,
 *  并且可以在  beforeBillSaveOnServer 中返回一些SQL语句，可以在afterBillSaveOnServer中返回一些SQL语句
 *
 * 系统分别在需要的数据库连接中执行这些语句 ， 当所有语句执行成功后，事件被提交。一些细节如下 ：
 *
 * 1 如果单据中的表，属于不同的数据库连接，那么所有的SQL语句会以连接为单位，对语句进行批量执行
 * 2 这些语句的执行顺序是：对同一个数据库连接中的语句， 先执行 beforeBillSaveOnServer 中返回的SQL语句，再执行单据操作转译得到的SQL语句，
 *   再执行 afterBillSaveOnServer 中返回的SQL语句， 当多个（或一个）数据库连接执行完这些语句，且没有错误时，所有的数据库连接做提交，否则全部回滚
 * 3 不要在 beforeBillSaveOnServer 或 afterBillSaveOnServer 中直接执行数据库操作，而是返回SQL语句，让系统批量执行它们，并控制好事务
 * 4 当执行成功后，系统再执行事件函数  afterBillSaveSuccessfulOnServer 。 此事件中可以执行任意操作，它与单据保存事件结束后才被触发执行，
 *   与单据保存并不在一个事务中。
 *
 *
 * @param gguid  要删除记录的gguid ，等同于主表的id
 * @param session  一个JSON对象，用于在整个单据保存过程中的各个事件之间传递数据。本事件做为单据保存的最后一个事件，session对象在使用后将被丢弃
 *
 *
 * @return 本函数不需要返回值
 *
 */
function afterBillSaveSuccessfulOnServer(gguid, session) {

    var corpid = getStringFromSQL("select corpid from dzpz_dy where id='" + gguid + "'");
    //2022.08.11优化，理论上不应该存在重复号码的凭证，但是加上max肯定没错，避免数据异常导致更新失败
    var sqls = ["update dzpz_dymx  set bz=null,pz_id= (select max(id) from dzpz_pz where dzpz_pz.pzh= dzpz_dymx.pzh and dzpz_pz.corpid='" + corpid + "' ) where gguid='" + gguid + "' ",
                "update dzpz_dymx  set bz='凭证号不存在' where  gguid='" + gguid + "' and not exists (select dzpz_pz.id from dzpz_pz where  dzpz_pz.pzh= dzpz_dymx.pzh  and dzpz_pz.corpid='" + corpid + "')  " 
             
    ];

    runSQL("", sqls, true);
    println("----检测凭证是否存在完成---------")
}


/**
 * 用户任务提交后
 * @param flow 流程定义
 * @param node 开始节点
 * @param gguid 单据的gguid

 */
//@comment (group=工作流事件,caption=用户任务提交后)
function onUserTaskSubmitted(flow, userTask, gguid) {
    // println( flow.id) ; //流程定义的ID
    // println( userTask.name);
    println(JSON.stringify(userTask));
    println(gguid);

    if (userTask.id == 'id_6655df8bedc641aa9bacf1720d13ce2d') //领导审批通过后，就开始打包
    {
        //领导审批通过后，就开始打包
        do_package(gguid);
    }

    println(gguid + " " + userTask.name + " 提交完成")


}

//后台打包
function do_package(gguid) {
    var ret= JSON.parse( runTask("package",{gguid:gguid}));
     
    return ret;
}



function back_urlShare(url , d , t)
{
    var ret= urlShare( url , d, "day", t);
    return ret.url;  
}


id: 649bd5769932ee4d0f7f561a
scriptid: 60fa600f9932563b7c99baff
tablename: app_script
clientip: 39.170.92.207
username: sa
createdate: 2023.06.28 14:39:53.000
script:
/**
 * 单据点击保存，前端所有的操作被转译成3种操作:insert , delete , update ,
 *  并且可以在  beforeBillSaveOnServer 中返回一些SQL语句，可以在afterBillSaveOnServer中返回一些SQL语句
 *
 * 系统分别在需要的数据库连接中执行这些语句 ， 当所有语句执行成功后，事件被提交。一些细节如下 ：
 *
 * 1 如果单据中的表，属于不同的数据库连接，那么所有的SQL语句会以连接为单位，对语句进行批量执行
 * 2 这些语句的执行顺序是：对同一个数据库连接中的语句， 先执行 beforeBillSaveOnServer 中返回的SQL语句，再执行单据操作转译得到的SQL语句，
 *   再执行 afterBillSaveOnServer 中返回的SQL语句， 当多个（或一个）数据库连接执行完这些语句，且没有错误时，所有的数据库连接做提交，否则全部回滚
 * 3 不要在 beforeBillSaveOnServer 或 afterBillSaveOnServer 中直接执行数据库操作，而是返回SQL语句，让系统批量执行它们，并控制好事务
 * 4 当执行成功后，系统再执行事件函数  afterBillSaveSuccessfulOnServer 。 此事件中可以执行任意操作，它与单据保存事件结束后才被触发执行，
 *   与单据保存并不在一个事务中。
 *
 *
 * @param gguid  要删除记录的gguid ，等同于主表的id
 * @param session  一个JSON对象，用于在整个单据保存过程中的各个事件之间传递数据。本事件做为单据保存的最后一个事件，session对象在使用后将被丢弃
 *
 *
 * @return 本函数不需要返回值
 *
 */
function afterBillSaveSuccessfulOnServer(gguid, session) {

    var corpid = getStringFromSQL("select corpid from dzpz_dy where id='" + gguid + "'");
    //2022.08.11优化，理论上不应该存在重复号码的凭证，但是加上max肯定没错，避免数据异常导致更新失败
    var sqls = ["update dzpz_dymx  set bz=null,pz_id= (select max(id) from dzpz_pz where dzpz_pz.pzh= dzpz_dymx.pzh and dzpz_pz.corpid='" + corpid + "' ) where gguid='" + gguid + "' ",
                "update dzpz_dymx  set bz='凭证号不存在' where  gguid='" + gguid + "' and not exists (select dzpz_pz.id from dzpz_pz where  dzpz_pz.pzh= dzpz_dymx.pzh  and dzpz_pz.corpid='" + corpid + "')  " 
             
    ];

    runSQL("", sqls, true);
    println("----检测凭证是否存在完成---------")
}


/**
 * 用户任务提交后
 * @param flow 流程定义
 * @param node 开始节点
 * @param gguid 单据的gguid

 */
//@comment (group=工作流事件,caption=用户任务提交后)
function onUserTaskSubmitted(flow, userTask, gguid) {
    // println( flow.id) ; //流程定义的ID
    // println( userTask.name);
    println(JSON.stringify(userTask));
    println(gguid);

    if (userTask.id == 'id_6655df8bedc641aa9bacf1720d13ce2d') //领导审批通过后，就开始打包
    {
        //领导审批通过后，就开始打包
        do_package(gguid);
    }

    println(gguid + " " + userTask.name + " 提交完成")


}

//后台打包
function do_package(gguid) {
    var ret= JSON.parse( runTask("package",{gguid:gguid}));
    return ret;
}



function back_urlShare(url , d , t)
{
    var ret= urlShare( url , d, "day", t);
    return ret.url;  
}


id: 649be4369932ee4d0f7f57dc
scriptid: 6181ea0bc76eefddf45ea1e5
tablename: app_script
clientip: 39.170.92.207
username: sa
createdate: 2023.06.28 15:45:36.000
script:
function main(arg) {

    println(arg);
    var p = JSON.parse(arg);
   
    var gguid = p.gguid;
    var topic = "打包下载" + gguid;
     
    var ds=newDataStore("","select * from dzpz_dy");
    ds.setUpdateProperty("dzpz_dy" , "id","*","id");
    ds.retrieve(" id='"+gguid+"'");
    ds.setValue(0,"ziptaskid","");
    ds.setValue(0,"zipresult", JSON.stringify(p.zipFiles));
    ds.update(true);
      
    pushMessage(topic,  {action:"gameOver",  result:p}, -1);

    //发送消息给申请人
    var html=[];
    html.push("调阅申请已审批通过，点击链接下载：<br><ul>");
    for( var i=0;i<p.zipFiles.length;i++)
    {
        var url= ''+p.zipFiles[i].url;
        url=url.replace(/&action=view/g , '&action=download');
        html.push('<li><a href="'+url+'" target="_blank">'+p.zipFiles[i].fileName+'</a></li>');
    }
    html.push('</ul>');
    var userid= ds.getInt(0,"userid");
    println( html.join(''));
    chatWith( userid , html.join('')); 

    //
    if( ds.getString(0,"action_after_pack")!='')
    {

        runTask("action_after_pack", {gguid:gguid});
        

}


id: 649be4369932ee4d0f7f57e5
scriptid: 6181ea0bc76eefddf45ea1e5
tablename: app_script
clientip: 39.170.92.207
username: sa
createdate: 2023.06.28 15:45:39.000
script:
function main(arg) {

    println(arg);
    var p = JSON.parse(arg);
   
    var gguid = p.gguid;
    var topic = "打包下载" + gguid;
     
    var ds=newDataStore("","select * from dzpz_dy");
    ds.setUpdateProperty("dzpz_dy" , "id","*","id");
    ds.retrieve(" id='"+gguid+"'");
    ds.setValue(0,"ziptaskid","");
    ds.setValue(0,"zipresult", JSON.stringify(p.zipFiles));
    ds.update(true);
      
    pushMessage(topic,  {action:"gameOver",  result:p}, -1);

    //发送消息给申请人
    var html=[];
    html.push("调阅申请已审批通过，点击链接下载：<br><ul>");
    for( var i=0;i<p.zipFiles.length;i++)
    {
        var url= ''+p.zipFiles[i].url;
        url=url.replace(/&action=view/g , '&action=download');
        html.push('<li><a href="'+url+'" target="_blank">'+p.zipFiles[i].fileName+'</a></li>');
    }
    html.push('</ul>');
    var userid= ds.getInt(0,"userid");
    println( html.join(''));
    chatWith( userid , html.join('')); 

    //
    if( ds.getString(0,"action_after_pack")!='')
    {

        runTask("action_after_pack", {gguid:gguid});
    }
    

}


id: 649be4369932ee4d0f7f57ee
scriptid: 6181ea0bc76eefddf45ea1e5
tablename: app_script
clientip: 39.170.92.207
username: sa
createdate: 2023.06.28 15:46:00.000
script:
function main(arg) {

    println(arg);
    var p = JSON.parse(arg);
   
    var gguid = p.gguid;
    var topic = "打包下载" + gguid;
     
    var ds=newDataStore("","select * from dzpz_dy");
    ds.setUpdateProperty("dzpz_dy" , "id","*","id");
    ds.retrieve(" id='"+gguid+"'");
    ds.setValue(0,"ziptaskid","");
    ds.setValue(0,"zipresult", JSON.stringify(p.zipFiles));
    ds.update(true);
      
    pushMessage(topic,  {action:"gameOver",  result:p}, -1);

    //发送消息给申请人
    var html=[];
    html.push("调阅申请已审批通过，点击链接下载：<br><ul>");
    for( var i=0;i<p.zipFiles.length;i++)
    {
        var url= ''+p.zipFiles[i].url;
        url=url.replace(/&action=view/g , '&action=download');
        html.push('<li><a href="'+url+'" target="_blank">'+p.zipFiles[i].fileName+'</a></li>');
    }
    html.push('</ul>');
    var userid= ds.getInt(0,"userid");
    println( html.join(''));
    chatWith( userid , html.join('')); 

    // 因为打包是异步的，所以打包后续动作放在这里处理
    if( ds.getString(0,"action_after_pack")!='')
    {

        runTask("action_after_pack", {gguid:gguid});
    }


}


id: 649be56e9932ee4d0f7f5829
scriptid: 649bdd0c9932ee4d0f7f571f
tablename: app_script
clientip: 39.170.92.207
username: sa
createdate: 2023.06.28 15:49:20.000
script:
/**
 * 脚本中心的脚本，以 main函数为执行入口，相关的参数放在arg中，它是一个JSON字符串化后的数据
 *
 */
function main(arg)
{
    println( arg);
    var param= JSON.parse(arg);
var gguid=param.gguid; 


        var home = getServiceHomeURL( 'app');
 var ds=newDataStore("","select * from dzpz_dy");
    ds.setUpdateProperty("dzpz_dy" , "id","*","id");
    ds.retrieve(" id='"+gguid+"'");


          var zipResult = ds.getString(0, "zipresult");
        
        zipResult = zipResult.replace(/&action=view/g, '&action=download');
        zipResult = JSON.parse(zipResult);
         let share=[];
        for (var i = 0; i < zipResult.length; i++) {
            var one = zipResult[i];
            var url = one.url;
            url= home +  url;
    let d= 7;
    let t = 3; 
       var  shareRet= urlShare(s, d , t);
       if( ! shareRet.success) 
       {
           println( shareRet.message);
       }else{
           share.push( '<li>'+ shareRet.url +  "  " + one.filename  +"</li>"); 
       }

     

        }
    }


id: 649be56e9932ee4d0f7f5832
scriptid: 649bdd0c9932ee4d0f7f571f
tablename: app_script
clientip: 39.170.92.207
username: sa
createdate: 2023.06.28 15:49:27.000
script:
/**
 * 脚本中心的脚本，以 main函数为执行入口，相关的参数放在arg中，它是一个JSON字符串化后的数据
 *
 */
function main(arg) {
    println(arg);
    var param = JSON.parse(arg);
    var gguid = param.gguid;


    var home = getServiceHomeURL('app');
    var ds = newDataStore("", "select * from dzpz_dy");
    ds.setUpdateProperty("dzpz_dy", "id", "*", "id");
    ds.retrieve(" id='" + gguid + "'");


    var zipResult = ds.getString(0, "zipresult");

    zipResult = zipResult.replace(/&action=view/g, '&action=download');
    zipResult = JSON.parse(zipResult);
    let share = [];
    for (var i = 0; i < zipResult.length; i++) {
        var one = zipResult[i];
        var url = one.url;
        url = home + url;
        let d = 7;
        let t = 3;
        var shareRet = urlShare(s, d, t);
        if (!shareRet.success) {
            println(shareRet.message);
        } else {
            share.push('<li>' + shareRet.url + "  " + one.filename + "</li>");
        }



    }
}


id: 649be56e9932ee4d0f7f583b
scriptid: 649bdd0c9932ee4d0f7f571f
tablename: app_script
clientip: 39.170.92.207
username: sa
createdate: 2023.06.28 15:50:39.000
script:
/**
 * 脚本中心的脚本，以 main函数为执行入口，相关的参数放在arg中，它是一个JSON字符串化后的数据
 *
 */
function main(arg) {
    println(arg);
    var param = JSON.parse(arg);
    var gguid = param.gguid;


    var home = getServiceHomeURL('app');
    var ds = newDataStore("", "select * from dzpz_dy");
    ds.setUpdateProperty("dzpz_dy", "id", "*", "id");
    ds.retrieve(" id='" + gguid + "'");


    var zipResult = ds.getString(0, "zipresult");

    zipResult = zipResult.replace(/&action=view/g, '&action=download');
    zipResult = JSON.parse(zipResult);
    let share = [];
    for (var i = 0; i < zipResult.length; i++) {
        var one = zipResult[i];
        var url = one.url;
        url = home + url;
        let d = 7;  // 7天有效
        let t = 3;  // 3 次下载 
        var shareRet = urlShare(s, d, t);
        if (!shareRet.success) {
            println(shareRet.message);
        } else {
            share.push('<li>' + shareRet.url + "  " + one.filename + "</li>");
        }

    }

    var action= ds.getString(0,"action_after_pack");

    if( action=='sendMail')
    {



    }
}


id: 649be56e9932ee4d0f7f5844
scriptid: 649bdd0c9932ee4d0f7f571f
tablename: app_script
clientip: 39.170.92.207
username: sa
createdate: 2023.06.28 16:01:41.000
script:
/**
 * 脚本中心的脚本，以 main函数为执行入口，相关的参数放在arg中，它是一个JSON字符串化后的数据
 *
 */
function main(arg) {
    println(arg);
    var param = JSON.parse(arg);
    var gguid = param.gguid;


    var home = getServiceHomeURL('app');
    var ds = newDataStore("", "select * from dzpz_dy");
    ds.setUpdateProperty("dzpz_dy", "id", "*", "id");
    ds.retrieve(" id='" + gguid + "'");


    var zipResult = ds.getString(0, "zipresult");

    zipResult = zipResult.replace(/&action=view/g, '&action=download');
    zipResult = JSON.parse(zipResult);
    let share = [];
    for (var i = 0; i < zipResult.length; i++) {
        var one = zipResult[i];
        var url = one.url;
        url = home + url;
        let d = 7;  // 7天有效
        let t = 3;  // 3 次下载 
        var shareRet = urlShare(s, d, t);
        if (!shareRet.success) {
            println(shareRet.message);
        } else {
            share.push('<li>' + shareRet.url + "  " + one.filename + "</li>");
        }

    }

    var action = ds.getString(0, "action_after_pack");

    if (action == 'sendMail') {

        var config = {
            from: { userid: 1 },
            to: { mailAccount: ds.getString(0, "email") },
            mail: {
                subject: ds.getgString(0, "flow_instance_subject"),
                body: share.join("<br>"),
                attachments: [{ name: '销售日报.pdf', url: ret.url }]

            }
        };

        var ret = sendMail(config);
        return ret;


    }

}


id: 649be56e9932ee4d0f7f584d
scriptid: 649bdd0c9932ee4d0f7f571f
tablename: app_script
clientip: 39.170.92.207
username: sa
createdate: 2023.06.28 16:01:56.000
script:
/**
 * 脚本中心的脚本，以 main函数为执行入口，相关的参数放在arg中，它是一个JSON字符串化后的数据
 *
 */
function main(arg) {
    println(arg);
    var param = JSON.parse(arg);
    var gguid = param.gguid;


    var home = getServiceHomeURL('app');
    var ds = newDataStore("", "select * from dzpz_dy");
    ds.setUpdateProperty("dzpz_dy", "id", "*", "id");
    ds.retrieve(" id='" + gguid + "'");


    var zipResult = ds.getString(0, "zipresult");

    zipResult = zipResult.replace(/&action=view/g, '&action=download');
    zipResult = JSON.parse(zipResult);
    var  share = [];
    for (var i = 0; i < zipResult.length; i++) {
        var one = zipResult[i];
        var url = one.url;
        url = home + url;
        let d = 7;  // 7天有效
        let t = 3;  // 3 次下载 
        var shareRet = urlShare(s, d, t);
        if (!shareRet.success) {
            println(shareRet.message);
        } else {
            share.push('<li>' + shareRet.url + "  " + one.filename + "</li>");
        }

    }

    var action = ds.getString(0, "action_after_pack");

    if (action == 'sendMail') {

        var config = {
            from: { userid: 1 },
            to: { mailAccount: ds.getString(0, "email") },
            mail: {
                subject: ds.getgString(0, "flow_instance_subject"),
                body: share.join("<br>"),
                attachments: [{ name: '销售日报.pdf', url: ret.url }]

            }
        };

        var ret = sendMail(config);
        return ret;


    }

}


id: 649be56e9932ee4d0f7f5856
scriptid: 649bdd0c9932ee4d0f7f571f
tablename: app_script
clientip: 39.170.92.207
username: sa
createdate: 2023.06.28 16:02:35.000
script:
/**
 * 脚本中心的脚本，以 main函数为执行入口，相关的参数放在arg中，它是一个JSON字符串化后的数据
 *
 */
function main(arg) {
    println(arg);
    var param = JSON.parse(arg);
    var gguid = param.gguid;


    var home = getServiceHomeURL('app');
    var ds = newDataStore("", "select * from dzpz_dy");
    ds.setUpdateProperty("dzpz_dy", "id", "*", "id");
    ds.retrieve(" id='" + gguid + "'");


    var zipResult = ds.getString(0, "zipresult");

    zipResult = zipResult.replace(/&action=view/g, '&action=download');
    zipResult = JSON.parse(zipResult);
    var  share = [];
    for (var i = 0; i < zipResult.length; i++) {
        var one = zipResult[i];
        var url = one.url;
        url = home + url;
        var d = 7;  // 7天有效
        var t = 3;  // 3 次下载 
        var shareRet = urlShare(s, d, t);
        if (!shareRet.success) {
            println(shareRet.message);
        } else {
            share.push('<li>' + shareRet.url + "  " + one.filename + "</li>");
        }

    }

    var action = ds.getString(0, "action_after_pack");

    if (action == 'sendMail') {

        var config = {
            from: { userid: 1 },
            to: { mailAccount: ds.getString(0, "email") },
            mail: {
                subject: ds.getgString(0, "flow_instance_subject"),
                body: share.join("<br>"),
                attachments: [{ name: '销售日报.pdf', url: ret.url }]

            }
        };

        var ret = sendMail(config);
        return ret;


    }

}


id: 649be56e9932ee4d0f7f585f
scriptid: 649bdd0c9932ee4d0f7f571f
tablename: app_script
clientip: 39.170.92.207
username: sa
createdate: 2023.06.28 16:04:11.000
script:
/**
 * 脚本中心的脚本，以 main函数为执行入口，相关的参数放在arg中，它是一个JSON字符串化后的数据
 *
 */
function main(arg) {
    println(arg);
    var param = JSON.parse(arg);
    var gguid = param.gguid || '963132457484690360';
    println( " gguid="+ gguid);

    var home = getServiceHomeURL('app');
    var ds = newDataStore("", "select * from dzpz_dy");
    ds.setUpdateProperty("dzpz_dy", "id", "*", "id");
    ds.retrieve(" id='" + gguid + "'");


    var zipResult = ds.getString(0, "zipresult");

    zipResult = zipResult.replace(/&action=view/g, '&action=download');
    zipResult = JSON.parse(zipResult);
    var  share = [];
    for (var i = 0; i < zipResult.length; i++) {
        var one = zipResult[i];
        var url = one.url;
        url = home + url;
        var d = 7;  // 7天有效
        var t = 3;  // 3 次下载 
        var shareRet = urlShare(s, d, t);
        if (!shareRet.success) {
            println(shareRet.message);
        } else {
            share.push('<li>' + shareRet.url + "  " + one.filename + "</li>");
        }

    }

    var action = ds.getString(0, "action_after_pack");

    if (action == 'sendMail') {

        var config = {
            from: { userid: 1 },
            to: { mailAccount: ds.getString(0, "email") },
            mail: {
                subject: ds.getgString(0, "flow_instance_subject"),
                body: share.join("<br>"),
                attachments: [{ name: '销售日报.pdf', url: ret.url }]

            }
        };

        var ret = sendMail(config);
        return ret;


    }

}


id: 649be9859932ee4d0f7f5879
scriptid: 649bdd0c9932ee4d0f7f571f
tablename: app_script
clientip: 39.170.92.207
username: sa
createdate: 2023.06.28 16:05:03.000
script:
/**
 * 脚本中心的脚本，以 main函数为执行入口，相关的参数放在arg中，它是一个JSON字符串化后的数据
 *
 */
function main(arg) {
    println(arg);
    var param = JSON.parse(arg);
    var gguid = param.gguid || '963132457484690360';
    println( " gguid="+ gguid);

    var home = getServiceHomeURL('app');
    var ds = newDataStore("", "select * from dzpz_dy");
    ds.setUpdateProperty("dzpz_dy", "id", "*", "id");
    ds.retrieve(" id='" + gguid + "'");


    var zipResult = ds.getString(0, "zipresult");

    zipResult = zipResult.replace(/&action=view/g, '&action=download');
    zipResult = JSON.parse(zipResult);
    var  share = [];
    for (var i = 0; i < zipResult.length; i++) {
        var one = zipResult[i];
        var url = one.url;
        url = home + url;
        var d = 7;  // 7天有效
        var t = 3;  // 3 次下载 
        var shareRet = urlShare(url, d, t);
        if (!shareRet.success) {
            println(shareRet.message);
        } else {
            share.push('<li>' + shareRet.url + "  " + one.filename + "</li>");
        }

    }

    var action = ds.getString(0, "action_after_pack");

    if (action == 'sendMail') {

        var config = {
            from: { userid: 1 },
            to: { mailAccount: ds.getString(0, "email") },
            mail: {
                subject: ds.getgString(0, "flow_instance_subject"),
                body: share.join("<br>"),
                attachments: [{ name: '销售日报.pdf', url: ret.url }]

            }
        };

        var ret = sendMail(config);
        return ret;


    }

}


id: 649be9859932ee4d0f7f5882
scriptid: 649bdd0c9932ee4d0f7f571f
tablename: app_script
clientip: 39.170.92.207
username: sa
createdate: 2023.06.28 16:11:13.000
script:
/**
 * 脚本中心的脚本，以 main函数为执行入口，相关的参数放在arg中，它是一个JSON字符串化后的数据
 *
 */
function main(arg) {
    println(arg);
    var param = JSON.parse(arg);
    var gguid = param.gguid || '963132457484690360';
    println( " gguid="+ gguid);

    var home = getServiceHomeURL('app');
    var ds = newDataStore("", "select * from dzpz_dy");
    ds.setUpdateProperty("dzpz_dy", "id", "*", "id");
    ds.retrieve(" id='" + gguid + "'");


    var zipResult = ds.getString(0, "zipresult");

    zipResult = zipResult.replace(/&action=view/g, '&action=download');
    zipResult = JSON.parse(zipResult);
    var  share = [];
    for (var i = 0; i < zipResult.length; i++) {
        var one = zipResult[i];
        var url = one.url;
        url = home + url;
        var d = 7;  // 7天有效
        var t = 3;  // 3 次下载 
        var shareRet = urlShare(url, d, t);
        if (!shareRet.success) {
            println(shareRet.message);
        } else {
            share.push('<li>' + shareRet.url + "  " + one.filename + "</li>");
        }

    }

    var action = ds.getString(0, "action_after_pack");
    println( action);

    if (action == 'sendMail') {

        var config = {
            from: { userid: 1 },
            to: { mailAccount: ds.getString(0, "email") },
            mail: {
                subject: ds.getgString(0, "flow_instance_subject"),
                body: share.join("<br>"),
                attachments: [{ name: '销售日报.pdf', url: ret.url }]

            }
        };

        var ret = sendMail(config);
        return ret;


    }

}


id: 649be9859932ee4d0f7f588b
scriptid: 649bdd0c9932ee4d0f7f571f
tablename: app_script
clientip: 39.170.92.207
username: sa
createdate: 2023.06.28 16:11:36.000
script:
/**
 * 脚本中心的脚本，以 main函数为执行入口，相关的参数放在arg中，它是一个JSON字符串化后的数据
 *
 */
function main(arg) {
    println(arg);
    var param = JSON.parse(arg);
    var gguid = param.gguid || '963132457484690360';
    println( " gguid="+ gguid);

    var home = getServiceHomeURL('app');
    var ds = newDataStore("", "select * from dzpz_dy");
    ds.setUpdateProperty("dzpz_dy", "id", "*", "id");
    ds.retrieve(" id='" + gguid + "'");


    var zipResult = ds.getString(0, "zipresult");

    zipResult = zipResult.replace(/&action=view/g, '&action=download');
    zipResult = JSON.parse(zipResult);
    var  share = [];
    for (var i = 0; i < zipResult.length; i++) {
        var one = zipResult[i];
        var url = one.url;
        url = home + url;
        var d = 7;  // 7天有效
        var t = 3;  // 3 次下载 
        var shareRet = urlShare(url, d, t);
        if (!shareRet.success) {
            println(shareRet.message);
        } else {
            share.push('<li>' + shareRet.url + "  " + one.filename + "</li>");
        }

    }

    var action = ds.getString(0, "action_after_pack");
    println( action);

    if (action == 'sendMail') {

        var config = {
            from: { userid: 1 },
            to: { mailAccount: ds.getString(0, "email") },
            mail: {
                subject: ds.getString(0, "flow_instance_subject"),
                body: share.join("<br>"),
                attachments: [{ name: '销售日报.pdf', url: ret.url }]

            }
        };

        var ret = sendMail(config);
        return ret;


    }

}


id: 649be9859932ee4d0f7f5894
scriptid: 649bdd0c9932ee4d0f7f571f
tablename: app_script
clientip: 39.170.92.207
username: sa
createdate: 2023.06.28 16:12:06.000
script:
/**
 * 脚本中心的脚本，以 main函数为执行入口，相关的参数放在arg中，它是一个JSON字符串化后的数据
 *
 */
function main(arg) {
    println(arg);
    var param = JSON.parse(arg);
    var gguid = param.gguid || '963132457484690360';
    println( " gguid="+ gguid);

    var home = getServiceHomeURL('app');
    var ds = newDataStore("", "select * from dzpz_dy");
    ds.setUpdateProperty("dzpz_dy", "id", "*", "id");
    ds.retrieve(" id='" + gguid + "'");


    var zipResult = ds.getString(0, "zipresult");

    zipResult = zipResult.replace(/&action=view/g, '&action=download');
    zipResult = JSON.parse(zipResult);
    var  share = [];
    for (var i = 0; i < zipResult.length; i++) {
        var one = zipResult[i];
        var url = one.url;
        url = home + url;
        var d = 7;  // 7天有效
        var t = 3;  // 3 次下载 
        var shareRet = urlShare(url, d, t);
        if (!shareRet.success) {
            println(shareRet.message);
        } else {
            share.push('<li>' + shareRet.url + "  " + one.filename + "</li>");
        }

    }

    var action = ds.getString(0, "action_after_pack");
    println( action);

    if (action == 'sendMail') {

        var config = {
            from: { userid: 1 },
            to: { mailAccount: ds.getString(0, "email") },
            mail: {
                subject: ds.getString(0, "flow_instance_subject"),
                body: share.join("<br>") 

            }
        };

        var ret = sendMail(config);
        return ret;


    }

}


id: 649be9859932ee4d0f7f589d
scriptid: 649bdd0c9932ee4d0f7f571f
tablename: app_script
clientip: 39.170.92.207
username: sa
createdate: 2023.06.28 16:15:18.000
script:
/**
 * 脚本中心的脚本，以 main函数为执行入口，相关的参数放在arg中，它是一个JSON字符串化后的数据
 *
 */
function main(arg) {
    println(arg);
    var param = JSON.parse(arg);
    var gguid = param.gguid || '963132457484690360';
    println( " gguid="+ gguid);

    var home = getServiceHomeURL('app');
    var ds = newDataStore("", "select * from dzpz_dy");
    ds.setUpdateProperty("dzpz_dy", "id", "*", "id");
    ds.retrieve(" id='" + gguid + "'");


    var zipResult = ds.getString(0, "zipresult");

    zipResult = zipResult.replace(/&action=view/g, '&action=download');
    zipResult = JSON.parse(zipResult);
    var  share = [];
    for (var i = 0; i < zipResult.length; i++) {
        var one = zipResult[i];
        var url = one.url;
        url = home + url;
        var d = 7;  // 7天有效
        var t = 3;  // 3 次下载 
        var shareRet = urlShare(url, d,'day', t);
        if (!shareRet.success) {
            println(shareRet.message);
        } else {
            share.push('<li>' + shareRet.url + "  " + one.filename + "</li>");
        }

    }

    var action = ds.getString(0, "action_after_pack");
    println( action);

    if (action == 'sendMail') {

        var config = {
            from: { userid: 1 },
            to: { mailAccount: ds.getString(0, "email") },
            mail: {
                subject: ds.getString(0, "flow_instance_subject"),
                body: share.join("<br>") 

            }
        };

        var ret = sendMail(config);
        return ret;


    }

}


id: 64a53ef18b10ede23ae6083b
scriptid: 64a53ef18b10ede23ae607f1
tablename: app_script
clientip: 0:0:0:0:0:0:0:1
username: sa
createdate: 2023.07.07 10:30:03.000
script:
/**
 * 脚本中心的脚本，以 main函数为执行入口，相关的参数放在arg中，它是一个JSON字符串化后的数据
 *
 */
function main(arg)
{
    println( arg);
    var param= JSON.parse(arg);
   
   var url="https://oa.cemps.ac.cn/services/FzzwsOAHdService?wsdl";



	var content = '<?xml version="1.0" encoding="utf-8"?>'+
					'<soap12:Envelope'+
					'    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" '+
					'    xmlns:xsd="http://www.w3.org/2001/XMLSchema" '+
					'    xmlns:soap12="http://www.w3.org/2003/05/soap-envelope"> '+
					'    <soap12:Body>'+
					'        <getMobileCodeInfo'+
					'            xmlns="http://WebXml.com.cn/">'+
					'            <mobileCode>'+tel+'</mobileCode>'+
					'            <userID></userID>'+
					'        </getMobileCodeInfo>'+
					'    </soap12:Body>'+
					'</soap12:Envelope>';



	var ret= httpPost( url , {
		   header:{'Content-Type':'application/soap+xml;charset=utf-8'},
		   body:content
	   });


	println( ret.response);
	var js= xml2json(ret.response);

}


id: 64a778aa8b10ede23ae60846
scriptid: 64a53ef18b10ede23ae607f1
tablename: app_script
clientip: 0:0:0:0:0:0:0:1
username: sa
createdate: 2023.07.07 11:08:45.000
script:
/**
 * 脚本中心的脚本，以 main函数为执行入口，相关的参数放在arg中，它是一个JSON字符串化后的数据
 *
 */
function main(arg) {
    println(arg);
    var param = JSON.parse(arg);

    var url = "https://oa.cemps.ac.cn/services/FzzwsOAHdService?wsdl";



    var content = '<?xml version="1.0" encoding="utf-8"?>' +
        '<soap12:Envelope' +
        '    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ' +
        '    xmlns:xsd="http://www.w3.org/2001/XMLSchema" ' +
        '    xmlns:soap12="http://www.w3.org/2003/05/soap-envelope"> ' +
        '    <soap12:Body>' +
        '        <ObtainOAinformation' +
        '            xmlns="https://webservices.fzzwsoahd.weaver.com.cn">' +
        '            <in0>146146</in0>' +
        '            <in1>false</in1>' +
        '        </ObtainOAinformation>' +
        '    </soap12:Body>' +
        '</soap12:Envelope>';



    var ret = httpPost(url, {
        header: { 'Content-Type': 'application/soap+xml;charset=utf-8' },
        body: content
    });

    return ret.response;
    println(ret.response);
    var js = xml2json(ret.response);
    return js;
}


id: 64a778aa8b10ede23ae6084f
scriptid: 64a53ef18b10ede23ae607f1
tablename: app_script
clientip: 0:0:0:0:0:0:0:1
username: sa
createdate: 2023.07.07 12:33:38.000
script:
/**
 * 脚本中心的脚本，以 main函数为执行入口，相关的参数放在arg中，它是一个JSON字符串化后的数据
 *
 */
function main(arg) {
    println(arg);
    var param = JSON.parse(arg);

    var url = "https://oa.cemps.ac.cn/services/FzzwsOAHdService?wsdl";



    var content = `
    <?xml version="1.0" encoding="UTF-8"?>

<con:testSuite id="1356a436-7cd8-466d-aa40-b54757bed452" name="FzzwsOAHdServiceHttpBinding TestSuite" xmlns:con="http://eviware.com/soapui/config"><con:settings/><con:runType>SEQUENTIAL</con:runType><con:testCase id="b2eb52bd-64fb-48f2-968f-c2e29ab90455" failOnError="true" failTestCaseOnErrors="true" keepSession="false" maxResults="0" name="ObtainOAinformation TestCase" searchProperties="true"><con:settings/><con:testStep type="request" id="96b0ce85-b4c8-477a-bf8d-ec98a87cae3f" name="ObtainOAinformation"><con:settings/><con:config xsi:type="con:RequestStep" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><con:interface>FzzwsOAHdServiceHttpBinding</con:interface><con:operation>ObtainOAinformation</con:operation><con:request name="ObtainOAinformation" id="8916b91a-b831-4521-bbf7-6d7476b8717d"><con:settings/><con:encoding>UTF-8</con:encoding><con:endpoint>http://oa.cemps.ac.cn/services/FzzwsOAHdService</con:endpoint><con:request><![CDATA[<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="webservices.fzzwsoahd.weaver.com.cn">\r
   <soapenv:Header/>\r
   <soapenv:Body>\r
      <web:ObtainOAinformation>\r
         <web:in0>999999</web:in0>\r
         <web:in1>true</web:in1>\r
      </web:ObtainOAinformation>\r
   </soapenv:Body>\r
</soapenv:Envelope>]]></con:request><con:credentials><con:authType>No Authorization</con:authType></con:credentials><con:wsaConfig action="webservices.fzzwsoahd.weaver.com.cn/FzzwsOAHdServicePortType/ObtainOAinformationRequest"/></con:request></con:config></con:testStep><con:properties/></con:testCase><con:properties/></con:testSuite>
    `



    var ret = httpPost(url, {
        header: { 'Content-Type': 'application/soap+xml;charset=utf-8' },
        body: content
    });

    return ret.response;
    println(ret.response);
    var js = xml2json(ret.response);
    return js;
}


id: 64a778aa8b10ede23ae60858
scriptid: 64a53ef18b10ede23ae607f1
tablename: app_script
clientip: 0:0:0:0:0:0:0:1
username: sa
createdate: 2023.07.07 12:34:19.000
script:
/**
 * 脚本中心的脚本，以 main函数为执行入口，相关的参数放在arg中，它是一个JSON字符串化后的数据
 *
 */
function main(arg) {
    println(arg);
    var param = JSON.parse(arg);

    var url = "https://oa.cemps.ac.cn/services/FzzwsOAHdService?wsdl";



    var content = `
    <?xml version="1.0" encoding="UTF-8"?>

<con:testSuite id="1356a436-7cd8-466d-aa40-b54757bed452" name="FzzwsOAHdServiceHttpBinding TestSuite" 
xmlns:con="http://eviware.com/soapui/config">
<con:settings/>
<con:runType>SEQUENTIAL</con:runType>
<con:testCase id="b2eb52bd-64fb-48f2-968f-c2e29ab90455" failOnError="true" failTestCaseOnErrors="true" 
keepSession="false" maxResults="0" name="ObtainOAinformation TestCase" searchProperties="true">
<con:settings/>
<con:testStep type="request" id="96b0ce85-b4c8-477a-bf8d-ec98a87cae3f" name="ObtainOAinformation"><con:settings/><con:config xsi:type="con:RequestStep" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><con:interface>FzzwsOAHdServiceHttpBinding</con:interface><con:operation>ObtainOAinformation</con:operation><con:request name="ObtainOAinformation" id="8916b91a-b831-4521-bbf7-6d7476b8717d"><con:settings/><con:encoding>UTF-8</con:encoding><con:endpoint>http://oa.cemps.ac.cn/services/FzzwsOAHdService</con:endpoint><con:request><![CDATA[<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="webservices.fzzwsoahd.weaver.com.cn">\r
   <soapenv:Header/>\r
   <soapenv:Body>\r
      <web:ObtainOAinformation>\r
         <web:in0>999999</web:in0>\r
         <web:in1>true</web:in1>\r
      </web:ObtainOAinformation>\r
   </soapenv:Body>\r
</soapenv:Envelope>]]></con:request><con:credentials><con:authType>No Authorization</con:authType></con:credentials><con:wsaConfig action="webservices.fzzwsoahd.weaver.com.cn/FzzwsOAHdServicePortType/ObtainOAinformationRequest"/></con:request></con:config></con:testStep><con:properties/></con:testCase><con:properties/></con:testSuite>
    `



    var ret = httpPost(url, {
        header: { 'Content-Type': 'application/soap+xml;charset=utf-8' },
        body: content
    });

    return ret.response;
    println(ret.response);
    var js = xml2json(ret.response);
    return js;
}


id: 64a778aa8b10ede23ae60861
scriptid: 64a53ef18b10ede23ae607f1
tablename: app_script
clientip: 0:0:0:0:0:0:0:1
username: sa
createdate: 2023.07.07 12:55:00.000
script:
/**
 * 脚本中心的脚本，以 main函数为执行入口，相关的参数放在arg中，它是一个JSON字符串化后的数据
 *
 */
function main(arg) {
    println(arg);
    var param = JSON.parse(arg);

    var url = "https://oa.cemps.ac.cn/services/FzzwsOAHdService?wsdl";



    var content = `
    <?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"  
    xmlns:web="webservices.fzzwsoahd.weaver.com.cn">
   <soapenv:Header/>
   <soapenv:Body>
      <web:ObtainOAinformation>
         <web:in0><![CDATA[99999]]></web:in0>
         <web:in1><![CDATA[true]]></web:in1>
      </web:ObtainOAinformation>
   </soapenv:Body>
</soapenv:Envelope>
`


    var ret = httpPost(url, {
        header: { 'Content-Type': 'application/soap+xml;charset=utf-8' },
        body: content
    });

    return ret.response;
    println(ret.response);
    var js = xml2json(ret.response);
    return js;
}


id: 64a778aa8b10ede23ae6086a
scriptid: 64a53ef18b10ede23ae607f1
tablename: app_script
clientip: 0:0:0:0:0:0:0:1
username: sa
createdate: 2023.07.07 12:55:46.000
script:
/**
 * 脚本中心的脚本，以 main函数为执行入口，相关的参数放在arg中，它是一个JSON字符串化后的数据
 *
 */
function main(arg) {
    println(arg);
    var param = JSON.parse(arg);

    var url = "https://oa.cemps.ac.cn/services/FzzwsOAHdService?wsdl";



    var content = `
    <?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"  
    xmlns:web="webservices.fzzwsoahd.weaver.com.cn">
   <soapenv:Header/>
   <soapenv:Body>
      <web:ObtainOAinformation>
         <web:in0>99999</web:in0>
         <web:in1>true></web:in1>
      </web:ObtainOAinformation>
   </soapenv:Body>
</soapenv:Envelope>
`


    var ret = httpPost(url, {
        header: { 'Content-Type': 'application/soap+xml;charset=utf-8' },
        body: content
    });

    return ret.response;
    println(ret.response);
    var js = xml2json(ret.response);
    return js;
}


id: 64a778aa8b10ede23ae60873
scriptid: 64a53ef18b10ede23ae607f1
tablename: app_script
clientip: 0:0:0:0:0:0:0:1
username: sa
createdate: 2023.07.07 12:57:04.000
script:
/**
 * 脚本中心的脚本，以 main函数为执行入口，相关的参数放在arg中，它是一个JSON字符串化后的数据
 *
 */
function main(arg) {
    println(arg);
    var param = JSON.parse(arg);

    var url = "https://oa.cemps.ac.cn/services/FzzwsOAHdService?wsdl";



    var content = `
    <?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"  
    xmlns:web="webservices.fzzwsoahd.weaver.com.cn">
   <soapenv:Header/>
   <soapenv:Body>
      <web:ObtainOAinformation>
         <web:in0>${requestid}</web:in0>
         <web:in1>true></web:in1>
      </web:ObtainOAinformation>
   </soapenv:Body>
</soapenv:Envelope>
`


    var ret = httpPost(url, {
        header: { 'Content-Type': 'application/soap+xml;charset=utf-8' },
        body: content
    });

    return ret.response;
    println(ret.response);
    var js = xml2json(ret.response);
    return js;
}


id: 64a778aa8b10ede23ae6087c
scriptid: 64a53ef18b10ede23ae607f1
tablename: app_script
clientip: 0:0:0:0:0:0:0:1
username: sa
createdate: 2023.07.07 12:57:26.000
script:
/**
 * 脚本中心的脚本，以 main函数为执行入口，相关的参数放在arg中，它是一个JSON字符串化后的数据
 *
 */
function main(arg) {
    println(arg);
    var param = JSON.parse(arg);

    var url = "https://oa.cemps.ac.cn/services/FzzwsOAHdService?wsdl";



    var content = `
    <?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"  
    xmlns:web="webservices.fzzwsoahd.weaver.com.cn">
   <soapenv:Header/>
   <soapenv:Body>
      <web:ObtainOAinformation>
         <web:in0>${requestid}</web:in0>
         <web:in1>true></web:in1>
      </web:ObtainOAinformation>
   </soapenv:Body>
</soapenv:Envelope>
`


    var ret = httpPost(url, {
        header: { 'Content-Type': 'application/soap+xml;charset=utf-8' },
        body: content
    });

    return ret.response;

}


id: 64a79cef8b10ede23ae608f4
scriptid: 649aa52d99329f5ca7253c1c
tablename: app_script
clientip: 0:0:0:0:0:0:0:1
username: sa
createdate: 2023.07.07 13:32:24.000
script:
/**
 * 脚本中心的脚本，以 main函数为执行入口，相关的参数放在arg中，它是一个JSON字符串化后的数据
 *
 */
function main(arg) {
    println(arg);
    var param = JSON.parse(arg);
    var gguid = newGUID();
    var moduleid = 'dy';//模块ID
    var username = getProperty( "/API创建调阅流程的起草人",  param.creator || "api");
    var userid = getUserIdByName(username);
    var leaderid= 21; //审核人ID
    var billno = newBillNo('', 'dzpz_dy', 'billno', '{11111111}', 'billdate', newDate(), "");
    var dzpz_dy_ds = newDataStore("", "select * from  dzpz_dy");
    dzpz_dy_ds.setUpdateProperty("dzpz_dy", "id", "*", "id");
    dzpz_dy_ds.insertRow(0);
    dzpz_dy_ds.setValue(0, {
        id: gguid, gguid: gguid, userid: userid, username: username, billdate: newDate(), billno: billno,
        reader: param.dyr, 
        leaderid: leaderid , 
        summary: param.dyyy, corpid: '00',
        needwatermark: 0,//不打水印 
        filetype: 'zip', // 
        email: param.email,
        moredata: JSON.stringify(param.callback_param)
    });

    var dzpz_dymx_ds = newDataStore("", "select * from dzpz_dymx");
    dzpz_dymx_ds.setUpdateProperty('dzpz_dymx', 'id', '*', "id");
    var pzh = param.pzh  ;
    if( pzh==undefined) pzh =[];
    for (var i = 0; i < pzh.length; i++) {
        var row = dzpz_dymx_ds.insertRow(9999999);
        dzpz_dymx_ds.setValue(row, { id: newGUID(), gguid: gguid, inner_xh: i + 1, pzh: pzh[i], code: param.ktbh });
    }

    var err = updateAll(dzpz_dy_ds, dzpz_dymx_ds);
    if (err != '') return { success: false, messager: err };


    var corpid = getStringFromSQL("select corpid from dzpz_dy where id='" + gguid + "'");
    
    var sqls = ["update dzpz_dymx  set bz=null,pz_id= (select max(id) from dzpz_pz where dzpz_pz.pzh= dzpz_dymx.pzh and dzpz_pz.corpid='" + corpid + "' ) where gguid='" + gguid + "' ",
                "update dzpz_dymx  set bz='凭证号不存在' where  gguid='" + gguid + "' and not exists (select dzpz_pz.id from dzpz_pz where  dzpz_pz.pzh= dzpz_dymx.pzh  and dzpz_pz.corpid='" + corpid + "')  " 
             
    ];
    runSQL("", sqls); 


    var config = {
        moduleid: moduleid,//凭证调阅模块代码或ID,
        gguid: gguid,
        flow: 'dy', //工作流的代码或ID
        userid: userid, //发起人ID
        subject: `${param.dyr || ''}因 [${param.dyyy || ''}] 调阅凭证`


    };

    var ret = newWork(config);

    if (!ret.success) return ret;

    //自动递交给初审
/*
    var t = taskInfoForWork('dy', gguid);

    //将任务递交下去，如果任务需要签收，则先签收     
    for (var i = 0; i < t.taskList.length; i++) {
        var task = t.taskList[i];

        //可以递交，那么递交下去
        if (task.canSubmit) println(submitWork(moduleid, gguid, task.taskId));
        //需要先签收 ，那么以第一个候选人签收它
        if (task.canClaim) claimWork(moduleid, gguid, task.taskId, task.candidateUserList[0].userId);

    }
*/

    ret.id = gguid;
    ret.billno= billno;
    return {success:true , id: gguid , content:{billno:billno}  };


}


id: 64a79cef8b10ede23ae60903
scriptid: 64a53ef18b10ede23ae607f1
tablename: app_script
clientip: 0:0:0:0:0:0:0:1
username: sa
createdate: 2023.07.07 13:34:42.000
script:
/**
 * 脚本中心的脚本，以 main函数为执行入口，相关的参数放在arg中，它是一个JSON字符串化后的数据
 *
 */
function main(arg) {
    println(arg);
    var param = JSON.parse(arg);
    var requestid= param.requestid ;
    
    var url = "https://oa.cemps.ac.cn/services/FzzwsOAHdService?wsdl";



    var content = `
    <?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"  
    xmlns:web="webservices.fzzwsoahd.weaver.com.cn">
   <soapenv:Header/>
   <soapenv:Body>
      <web:ObtainOAinformation>
         <web:in0>${requestid}</web:in0>
         <web:in1>true></web:in1>
      </web:ObtainOAinformation>
   </soapenv:Body>
</soapenv:Envelope>
`


    var ret = httpPost(url, {
        header: { 'Content-Type': 'application/soap+xml;charset=utf-8' },
        body: content
    });

    return ret.response;

}


id: 64a7aaef8b10ede23ae60c92
scriptid: 60fa600f9932563b7c99baff
tablename: app_script
clientip: 0:0:0:0:0:0:0:1
username: sa
createdate: 2023.07.07 14:09:00.000
script:
/**
 * 单据点击保存，前端所有的操作被转译成3种操作:insert , delete , update ,
 *  并且可以在  beforeBillSaveOnServer 中返回一些SQL语句，可以在afterBillSaveOnServer中返回一些SQL语句
 *
 * 系统分别在需要的数据库连接中执行这些语句 ， 当所有语句执行成功后，事件被提交。一些细节如下 ：
 *
 * 1 如果单据中的表，属于不同的数据库连接，那么所有的SQL语句会以连接为单位，对语句进行批量执行
 * 2 这些语句的执行顺序是：对同一个数据库连接中的语句， 先执行 beforeBillSaveOnServer 中返回的SQL语句，再执行单据操作转译得到的SQL语句，
 *   再执行 afterBillSaveOnServer 中返回的SQL语句， 当多个（或一个）数据库连接执行完这些语句，且没有错误时，所有的数据库连接做提交，否则全部回滚
 * 3 不要在 beforeBillSaveOnServer 或 afterBillSaveOnServer 中直接执行数据库操作，而是返回SQL语句，让系统批量执行它们，并控制好事务
 * 4 当执行成功后，系统再执行事件函数  afterBillSaveSuccessfulOnServer 。 此事件中可以执行任意操作，它与单据保存事件结束后才被触发执行，
 *   与单据保存并不在一个事务中。
 *
 *
 * @param gguid  要删除记录的gguid ，等同于主表的id
 * @param session  一个JSON对象，用于在整个单据保存过程中的各个事件之间传递数据。本事件做为单据保存的最后一个事件，session对象在使用后将被丢弃
 *
 *
 * @return 本函数不需要返回值
 *
 */
function afterBillSaveSuccessfulOnServer(gguid, session) {

    var corpid = getStringFromSQL("select corpid from dzpz_dy where id='" + gguid + "'");
    //2022.08.11优化，理论上不应该存在重复号码的凭证，但是加上max肯定没错，避免数据异常导致更新失败
    var sqls = ["update dzpz_dymx  set bz=null,pz_id= (select max(id) from dzpz_pz where dzpz_pz.pzh= dzpz_dymx.pzh and dzpz_pz.corpid='" + corpid + "' ) where gguid='" + gguid + "' ",
                "update dzpz_dymx  set bz='凭证号不存在' where  gguid='" + gguid + "' and not exists (select dzpz_pz.id from dzpz_pz where  dzpz_pz.pzh= dzpz_dymx.pzh  and dzpz_pz.corpid='" + corpid + "')  " 
             
    ];

    runSQL("", sqls, true);
    println("----检测凭证是否存在完成---------")
}


/**
 * 用户任务提交后
 * @param flow 流程定义
 * @param node 开始节点
 * @param gguid 单据的gguid

 */
//@comment (group=工作流事件,caption=用户任务提交后)
function onUserTaskSubmitted(flow, userTask, gguid) {
    // println( flow.id) ; //流程定义的ID
    // println( userTask.name);
    println(JSON.stringify(userTask));
    println(gguid);
    if( userTask.id =='id_60b3b08f27644fc18af35ba20ecd2bac')
    {
        var  moreData= getStringFromSQL("select moredata from dzpz_dy where id='"+gguid+"'" );
        try{
            moreData=JSON.parse(moreData);
            //起草后，递交
            if( moreData.requestid)
            {
                runTask('oa_callback',{requestid:moreData.requestid});
            }
        }catch(err)
        {

        }
        }
    }

    if (userTask.id == 'id_6655df8bedc641aa9bacf1720d13ce2d') //领导审批通过后，就开始打包
    {
        //领导审批通过后，就开始打包
        do_package(gguid);
    }

    println(gguid + " " + userTask.name + " 提交完成")


}

//后台打包
function do_package(gguid) {
    var ret= JSON.parse( runTask("package",{gguid:gguid}));
    return ret;
}



function back_urlShare(url , d , t)
{
    var ret= urlShare( url , d, "day", t);
    return ret.url;  
}


id: 64a7aaef8b10ede23ae60c9b
scriptid: 60fa600f9932563b7c99baff
tablename: app_script
clientip: 0:0:0:0:0:0:0:1
username: sa
createdate: 2023.07.07 14:09:27.000
script:
/**
 * 单据点击保存，前端所有的操作被转译成3种操作:insert , delete , update ,
 *  并且可以在  beforeBillSaveOnServer 中返回一些SQL语句，可以在afterBillSaveOnServer中返回一些SQL语句
 *
 * 系统分别在需要的数据库连接中执行这些语句 ， 当所有语句执行成功后，事件被提交。一些细节如下 ：
 *
 * 1 如果单据中的表，属于不同的数据库连接，那么所有的SQL语句会以连接为单位，对语句进行批量执行
 * 2 这些语句的执行顺序是：对同一个数据库连接中的语句， 先执行 beforeBillSaveOnServer 中返回的SQL语句，再执行单据操作转译得到的SQL语句，
 *   再执行 afterBillSaveOnServer 中返回的SQL语句， 当多个（或一个）数据库连接执行完这些语句，且没有错误时，所有的数据库连接做提交，否则全部回滚
 * 3 不要在 beforeBillSaveOnServer 或 afterBillSaveOnServer 中直接执行数据库操作，而是返回SQL语句，让系统批量执行它们，并控制好事务
 * 4 当执行成功后，系统再执行事件函数  afterBillSaveSuccessfulOnServer 。 此事件中可以执行任意操作，它与单据保存事件结束后才被触发执行，
 *   与单据保存并不在一个事务中。
 *
 *
 * @param gguid  要删除记录的gguid ，等同于主表的id
 * @param session  一个JSON对象，用于在整个单据保存过程中的各个事件之间传递数据。本事件做为单据保存的最后一个事件，session对象在使用后将被丢弃
 *
 *
 * @return 本函数不需要返回值
 *
 */
function afterBillSaveSuccessfulOnServer(gguid, session) {

    var corpid = getStringFromSQL("select corpid from dzpz_dy where id='" + gguid + "'");
    //2022.08.11优化，理论上不应该存在重复号码的凭证，但是加上max肯定没错，避免数据异常导致更新失败
    var sqls = ["update dzpz_dymx  set bz=null,pz_id= (select max(id) from dzpz_pz where dzpz_pz.pzh= dzpz_dymx.pzh and dzpz_pz.corpid='" + corpid + "' ) where gguid='" + gguid + "' ",
                "update dzpz_dymx  set bz='凭证号不存在' where  gguid='" + gguid + "' and not exists (select dzpz_pz.id from dzpz_pz where  dzpz_pz.pzh= dzpz_dymx.pzh  and dzpz_pz.corpid='" + corpid + "')  " 
             
    ];

    runSQL("", sqls, true);
    println("----检测凭证是否存在完成---------")
}


/**
 * 用户任务提交后
 * @param flow 流程定义
 * @param node 开始节点
 * @param gguid 单据的gguid

 */
//@comment (group=工作流事件,caption=用户任务提交后)
function onUserTaskSubmitted(flow, userTask, gguid) {
    // println( flow.id) ; //流程定义的ID
    // println( userTask.name);
    println(JSON.stringify(userTask));
    println(gguid);
    if( userTask.id =='id_60b3b08f27644fc18af35ba20ecd2bac')
    {
        var  moreData= getStringFromSQL("select moredata from dzpz_dy where id='"+gguid+"'" );
        try{
            moreData=JSON.parse(moreData);
            //起草后，递交后调用OA的接口回写数据
            if( moreData.requestid)
            {
                runTask('oa_callback',{requestid:moreData.requestid});
            }
        }catch(err)
        {

        }
        }
    }

    if (userTask.id == 'id_6655df8bedc641aa9bacf1720d13ce2d') //领导审批通过后，就开始打包
    {
        //领导审批通过后，就开始打包
        do_package(gguid);
    }

    println(gguid + " " + userTask.name + " 提交完成")


}

//后台打包
function do_package(gguid) {
    var ret= JSON.parse( runTask("package",{gguid:gguid}));
    return ret;
}



function back_urlShare(url , d , t)
{
    var ret= urlShare( url , d, "day", t);
    return ret.url;  
}


id: 64a7aaef8b10ede23ae60ca4
scriptid: 60fa600f9932563b7c99baff
tablename: app_script
clientip: 0:0:0:0:0:0:0:1
username: sa
createdate: 2023.07.07 14:09:58.000
script:
/**
 * 单据点击保存，前端所有的操作被转译成3种操作:insert , delete , update ,
 *  并且可以在  beforeBillSaveOnServer 中返回一些SQL语句，可以在afterBillSaveOnServer中返回一些SQL语句
 *
 * 系统分别在需要的数据库连接中执行这些语句 ， 当所有语句执行成功后，事件被提交。一些细节如下 ：
 *
 * 1 如果单据中的表，属于不同的数据库连接，那么所有的SQL语句会以连接为单位，对语句进行批量执行
 * 2 这些语句的执行顺序是：对同一个数据库连接中的语句， 先执行 beforeBillSaveOnServer 中返回的SQL语句，再执行单据操作转译得到的SQL语句，
 *   再执行 afterBillSaveOnServer 中返回的SQL语句， 当多个（或一个）数据库连接执行完这些语句，且没有错误时，所有的数据库连接做提交，否则全部回滚
 * 3 不要在 beforeBillSaveOnServer 或 afterBillSaveOnServer 中直接执行数据库操作，而是返回SQL语句，让系统批量执行它们，并控制好事务
 * 4 当执行成功后，系统再执行事件函数  afterBillSaveSuccessfulOnServer 。 此事件中可以执行任意操作，它与单据保存事件结束后才被触发执行，
 *   与单据保存并不在一个事务中。
 *
 *
 * @param gguid  要删除记录的gguid ，等同于主表的id
 * @param session  一个JSON对象，用于在整个单据保存过程中的各个事件之间传递数据。本事件做为单据保存的最后一个事件，session对象在使用后将被丢弃
 *
 *
 * @return 本函数不需要返回值
 *
 */
function afterBillSaveSuccessfulOnServer(gguid, session) {

    var corpid = getStringFromSQL("select corpid from dzpz_dy where id='" + gguid + "'");
    //2022.08.11优化，理论上不应该存在重复号码的凭证，但是加上max肯定没错，避免数据异常导致更新失败
    var sqls = ["update dzpz_dymx  set bz=null,pz_id= (select max(id) from dzpz_pz where dzpz_pz.pzh= dzpz_dymx.pzh and dzpz_pz.corpid='" + corpid + "' ) where gguid='" + gguid + "' ",
    "update dzpz_dymx  set bz='凭证号不存在' where  gguid='" + gguid + "' and not exists (select dzpz_pz.id from dzpz_pz where  dzpz_pz.pzh= dzpz_dymx.pzh  and dzpz_pz.corpid='" + corpid + "')  "

    ];

    runSQL("", sqls, true);
    println("----检测凭证是否存在完成---------")
}


/**
 * 用户任务提交后
 * @param flow 流程定义
 * @param node 开始节点
 * @param gguid 单据的gguid

 */
//@comment (group=工作流事件,caption=用户任务提交后)
function onUserTaskSubmitted(flow, userTask, gguid) {
    // println( flow.id) ; //流程定义的ID
    // println( userTask.name);
    println(JSON.stringify(userTask));
    println(gguid);
    if (userTask.id == 'id_60b3b08f27644fc18af35ba20ecd2bac') {
        var moreData = getStringFromSQL("select moredata from dzpz_dy where id='" + gguid + "'");
        try {
            moreData = JSON.parse(moreData);
            //起草后，递交后调用OA的接口回写数据
            if (moreData.requestid) {
                runTask('oa_callback', { requestid: moreData.requestid });
            }
        } catch (err) {

        }

    }

    if (userTask.id == 'id_6655df8bedc641aa9bacf1720d13ce2d') //领导审批通过后，就开始打包
    {
        //领导审批通过后，就开始打包
        do_package(gguid);
    }

    println(gguid + " " + userTask.name + " 提交完成")


}

//后台打包
function do_package(gguid) {
    var ret = JSON.parse(runTask("package", { gguid: gguid }));
    return ret;
}



function back_urlShare(url, d, t) {
    var ret = urlShare(url, d, "day", t);
    return ret.url;
}


id: 64a7aaef8b10ede23ae60cad
scriptid: 60fa600f9932563b7c99baff
tablename: app_script
clientip: 0:0:0:0:0:0:0:1
username: sa
createdate: 2023.07.07 14:12:15.000
script:
/**
 * 单据点击保存，前端所有的操作被转译成3种操作:insert , delete , update ,
 *  并且可以在  beforeBillSaveOnServer 中返回一些SQL语句，可以在afterBillSaveOnServer中返回一些SQL语句
 *
 * 系统分别在需要的数据库连接中执行这些语句 ， 当所有语句执行成功后，事件被提交。一些细节如下 ：
 *
 * 1 如果单据中的表，属于不同的数据库连接，那么所有的SQL语句会以连接为单位，对语句进行批量执行
 * 2 这些语句的执行顺序是：对同一个数据库连接中的语句， 先执行 beforeBillSaveOnServer 中返回的SQL语句，再执行单据操作转译得到的SQL语句，
 *   再执行 afterBillSaveOnServer 中返回的SQL语句， 当多个（或一个）数据库连接执行完这些语句，且没有错误时，所有的数据库连接做提交，否则全部回滚
 * 3 不要在 beforeBillSaveOnServer 或 afterBillSaveOnServer 中直接执行数据库操作，而是返回SQL语句，让系统批量执行它们，并控制好事务
 * 4 当执行成功后，系统再执行事件函数  afterBillSaveSuccessfulOnServer 。 此事件中可以执行任意操作，它与单据保存事件结束后才被触发执行，
 *   与单据保存并不在一个事务中。
 *
 *
 * @param gguid  要删除记录的gguid ，等同于主表的id
 * @param session  一个JSON对象，用于在整个单据保存过程中的各个事件之间传递数据。本事件做为单据保存的最后一个事件，session对象在使用后将被丢弃
 *
 *
 * @return 本函数不需要返回值
 *
 */
function afterBillSaveSuccessfulOnServer(gguid, session) {

    var corpid = getStringFromSQL("select corpid from dzpz_dy where id='" + gguid + "'");
    //2022.08.11优化，理论上不应该存在重复号码的凭证，但是加上max肯定没错，避免数据异常导致更新失败
    var sqls = ["update dzpz_dymx  set bz=null,pz_id= (select max(id) from dzpz_pz where dzpz_pz.pzh= dzpz_dymx.pzh and dzpz_pz.corpid='" + corpid + "' ) where gguid='" + gguid + "' ",
    "update dzpz_dymx  set bz='凭证号不存在' where  gguid='" + gguid + "' and not exists (select dzpz_pz.id from dzpz_pz where  dzpz_pz.pzh= dzpz_dymx.pzh  and dzpz_pz.corpid='" + corpid + "')  "

    ];

    runSQL("", sqls, true);
    println("----检测凭证是否存在完成---------")
}


/**
 * 用户任务提交后
 * @param flow 流程定义
 * @param node 开始节点
 * @param gguid 单据的gguid

 */
//@comment (group=工作流事件,caption=用户任务提交后)
function onUserTaskSubmitted(flow, userTask, gguid) {
    // println( flow.id) ; //流程定义的ID
    // println( userTask.name);
    println(JSON.stringify(userTask));
    println(gguid);
    if (userTask.id == 'id_60b3b08f27644fc18af35ba20ecd2bac') {
        var moreData = getStringFromSQL("select moredata from dzpz_dy where id='" + gguid + "'");
        try {
            moreData = JSON.parse(moreData);
            //起草后，递交后调用OA的接口回写数据
            if (moreData.form_id) {
                runTask('oa_callback', { requestid: moreData.form_id });
            }
        } catch (err) {

        }

    }

    if (userTask.id == 'id_6655df8bedc641aa9bacf1720d13ce2d') //领导审批通过后，就开始打包
    {
        //领导审批通过后，就开始打包
        do_package(gguid);
    }

    println(gguid + " " + userTask.name + " 提交完成")


}

//后台打包
function do_package(gguid) {
    var ret = JSON.parse(runTask("package", { gguid: gguid }));
    return ret;
}



function back_urlShare(url, d, t) {
    var ret = urlShare(url, d, "day", t);
    return ret.url;
}


id: 64a7d85e9932ee4d0f7f65dd
scriptid: 60fa600f9932563b7c99baff
tablename: app_script
clientip: 39.170.92.207
username: sa
createdate: 2023.07.11 13:35:23.000
script:
/**
 * 单据点击保存，前端所有的操作被转译成3种操作:insert , delete , update ,
 *  并且可以在  beforeBillSaveOnServer 中返回一些SQL语句，可以在afterBillSaveOnServer中返回一些SQL语句
 *
 * 系统分别在需要的数据库连接中执行这些语句 ， 当所有语句执行成功后，事件被提交。一些细节如下 ：
 *
 * 1 如果单据中的表，属于不同的数据库连接，那么所有的SQL语句会以连接为单位，对语句进行批量执行
 * 2 这些语句的执行顺序是：对同一个数据库连接中的语句， 先执行 beforeBillSaveOnServer 中返回的SQL语句，再执行单据操作转译得到的SQL语句，
 *   再执行 afterBillSaveOnServer 中返回的SQL语句， 当多个（或一个）数据库连接执行完这些语句，且没有错误时，所有的数据库连接做提交，否则全部回滚
 * 3 不要在 beforeBillSaveOnServer 或 afterBillSaveOnServer 中直接执行数据库操作，而是返回SQL语句，让系统批量执行它们，并控制好事务
 * 4 当执行成功后，系统再执行事件函数  afterBillSaveSuccessfulOnServer 。 此事件中可以执行任意操作，它与单据保存事件结束后才被触发执行，
 *   与单据保存并不在一个事务中。
 *
 *
 * @param gguid  要删除记录的gguid ，等同于主表的id
 * @param session  一个JSON对象，用于在整个单据保存过程中的各个事件之间传递数据。本事件做为单据保存的最后一个事件，session对象在使用后将被丢弃
 *
 *
 * @return 本函数不需要返回值
 *
 */
function afterBillSaveSuccessfulOnServer(gguid, session) {

    var corpid = getStringFromSQL("select corpid from dzpz_dy where id='" + gguid + "'");
    //2022.08.11优化，理论上不应该存在重复号码的凭证，但是加上max肯定没错，避免数据异常导致更新失败
    var sqls = ["update dzpz_dymx  set bz=null,pz_id= (select max(id) from dzpz_pz where dzpz_pz.pzh= dzpz_dymx.pzh and dzpz_pz.corpid='" + corpid + "' ) where gguid='" + gguid + "' ",
    "update dzpz_dymx  set bz='凭证号不存在' where  gguid='" + gguid + "' and not exists (select dzpz_pz.id from dzpz_pz where  dzpz_pz.pzh= dzpz_dymx.pzh  and dzpz_pz.corpid='" + corpid + "')  "

    ];

    runSQL("", sqls, true);
    println("----检测凭证是否存在完成---------")
}


/**
 * 用户任务提交后
 * @param flow 流程定义
 * @param node 开始节点
 * @param gguid 单据的gguid

 */
//@comment (group=工作流事件,caption=用户任务提交后)
function onUserTaskSubmitted(flow, userTask, gguid) {
    // println( flow.id) ; //流程定义的ID
    // println( userTask.name);
    println(JSON.stringify(userTask));
    println(gguid);


    if (userTask.id == 'id_60b3b08f27644fc18af35ba20ecd2bac') {
        var moreData = getStringFromSQL("select moredata from dzpz_dy where id='" + gguid + "'");
        try {
            moreData = JSON.parse(moreData);
            //起草后，递交后调用OA的接口回写数据
            if (moreData.form_id) {
                runTask('oa_callback', { requestid: moreData.form_id });
            }
        } catch (err) {

        }

    }


    if (userTask.id == 'id_6655df8bedc641aa9bacf1720d13ce2d') //领导审批通过后，就开始打包
    {
        //领导审批通过后，就开始打包
        do_package(gguid);
    }

    println(gguid + " " + userTask.name + " 提交完成")


}

//后台打包
function do_package(gguid) {
    var ret = JSON.parse(runTask("package", { gguid: gguid }));
    return ret;
}



function back_urlShare(url, d, t) {
    var ret = urlShare(url, d, "day", t);
    return ret.url;
}


id: 64a7d85e9932ee4d0f7f65fb
scriptid: 649aa52d99329f5ca7253c1c
tablename: app_script
clientip: 39.170.92.207
username: sa
createdate: 2023.07.11 13:38:03.000
script:
/**
 * 脚本中心的脚本，以 main函数为执行入口，相关的参数放在arg中，它是一个JSON字符串化后的数据
 *
 */
function main(arg) {
    println(arg);
    var param = JSON.parse(arg);
    var gguid = newGUID();
    var moduleid = 'dy';//模块ID
    var username = getProperty( "/API创建调阅流程的起草人",  param.creator || "api");
    var userid = getUserIdByName(username);
    var leaderid= 21; //审核人ID
    var billno = newBillNo('', 'dzpz_dy', 'billno', '{11111111}', 'billdate', newDate(), "");
    var dzpz_dy_ds = newDataStore("", "select * from  dzpz_dy");
    dzpz_dy_ds.setUpdateProperty("dzpz_dy", "id", "*", "id");
    dzpz_dy_ds.insertRow(0);
    dzpz_dy_ds.setValue(0, {
        id: gguid, gguid: gguid, userid: userid, username: getStringFromSQL("select showname from app_user where id="+ userid )
         , billdate: newDate(), billno: billno,
        reader: param.dyr, 
        leaderid: leaderid , 
        summary: param.dyyy, corpid: '00',
        needwatermark: 0,//不打水印 
        filetype: 'zip', // 
        email: param.email,
        moredata: JSON.stringify(param.callback_param)
    });

    var dzpz_dymx_ds = newDataStore("", "select * from dzpz_dymx");
    dzpz_dymx_ds.setUpdateProperty('dzpz_dymx', 'id', '*', "id");
    var pzh = param.pzh  ;
    if( pzh==undefined) pzh =[];
    for (var i = 0; i < pzh.length; i++) {
        var row = dzpz_dymx_ds.insertRow(9999999);
        dzpz_dymx_ds.setValue(row, { id: newGUID(), gguid: gguid, inner_xh: i + 1, pzh: pzh[i], code: param.ktbh });
    }

    var err = updateAll(dzpz_dy_ds, dzpz_dymx_ds);
    if (err != '') return { success: false, messager: err };


    var corpid = getStringFromSQL("select corpid from dzpz_dy where id='" + gguid + "'");
    
    var sqls = ["update dzpz_dymx  set bz=null,pz_id= (select max(id) from dzpz_pz where dzpz_pz.pzh= dzpz_dymx.pzh and dzpz_pz.corpid='" + corpid + "' ) where gguid='" + gguid + "' ",
                "update dzpz_dymx  set bz='凭证号不存在' where  gguid='" + gguid + "' and not exists (select dzpz_pz.id from dzpz_pz where  dzpz_pz.pzh= dzpz_dymx.pzh  and dzpz_pz.corpid='" + corpid + "')  " 
             
    ];
    runSQL("", sqls); 


    var config = {
        moduleid: moduleid,//凭证调阅模块代码或ID,
        gguid: gguid,
        flow: 'dy', //工作流的代码或ID
        userid: userid, //发起人ID
        subject: `${param.dyr || ''}因 [${param.dyyy || ''}] 调阅凭证`


    };

    var ret = newWork(config);

    if (!ret.success) return ret;

    //自动递交给初审
/*
    var t = taskInfoForWork('dy', gguid);

    //将任务递交下去，如果任务需要签收，则先签收     
    for (var i = 0; i < t.taskList.length; i++) {
        var task = t.taskList[i];

        //可以递交，那么递交下去
        if (task.canSubmit) println(submitWork(moduleid, gguid, task.taskId));
        //需要先签收 ，那么以第一个候选人签收它
        if (task.canClaim) claimWork(moduleid, gguid, task.taskId, task.candidateUserList[0].userId);

    }
*/

    ret.id = gguid;
    ret.billno= billno;
    return {success:true , id: gguid , content:{billno:billno}  };


}


id: 64acc3ca8b10ede23ae60eed
scriptid: 649aa52d99329f5ca7253c1c
tablename: app_script
clientip: 0:0:0:0:0:0:0:1
username: sa
createdate: 2023.07.11 10:53:52.000
script:
/**
 * 脚本中心的脚本，以 main函数为执行入口，相关的参数放在arg中，它是一个JSON字符串化后的数据
 *
 */
function main(arg) {
    println(arg);
    var param = JSON.parse(arg);
    var gguid = newGUID();
    var moduleid = 'dy';//模块ID
    var username = getProperty( "/API创建调阅流程的起草人",  param.creator || "api");
    var userid = getUserIdByName(username);
    var leaderid= 17; //审核人ID
    var billno = newBillNo('', 'dzpz_dy', 'billno', '{11111111}', 'billdate', newDate(), "");
    var dzpz_dy_ds = newDataStore("", "select * from  dzpz_dy");
    dzpz_dy_ds.setUpdateProperty("dzpz_dy", "id", "*", "id");
    dzpz_dy_ds.insertRow(0);
    dzpz_dy_ds.setValue(0, {
        id: gguid, gguid: gguid, userid: userid, username: username, billdate: newDate(), billno: billno,
        reader: param.dyr, 
        leaderid: leaderid , 
        summary: param.dyyy, corpid: '00',
        needwatermark: 0,//不打水印 
        filetype: 'zip', // 
        email: param.email,
        moredata: JSON.stringify(param.callback_param)
    });

    var dzpz_dymx_ds = newDataStore("", "select * from dzpz_dymx");
    dzpz_dymx_ds.setUpdateProperty('dzpz_dymx', 'id', '*', "id");
    var pzh = param.pzh  ;
    if( pzh==undefined) pzh =[];
    for (var i = 0; i < pzh.length; i++) {
        var row = dzpz_dymx_ds.insertRow(9999999);
        dzpz_dymx_ds.setValue(row, { id: newGUID(), gguid: gguid, inner_xh: i + 1, pzh: pzh[i], code: param.ktbh });
    }

    var err = updateAll(dzpz_dy_ds, dzpz_dymx_ds);
    if (err != '') return { success: false, messager: err };


    var corpid = getStringFromSQL("select corpid from dzpz_dy where id='" + gguid + "'");
    
    var sqls = ["update dzpz_dymx  set bz=null,pz_id= (select max(id) from dzpz_pz where dzpz_pz.pzh= dzpz_dymx.pzh and dzpz_pz.corpid='" + corpid + "' ) where gguid='" + gguid + "' ",
                "update dzpz_dymx  set bz='凭证号不存在' where  gguid='" + gguid + "' and not exists (select dzpz_pz.id from dzpz_pz where  dzpz_pz.pzh= dzpz_dymx.pzh  and dzpz_pz.corpid='" + corpid + "')  " 
             
    ];
    runSQL("", sqls); 


    var config = {
        moduleid: moduleid,//凭证调阅模块代码或ID,
        gguid: gguid,
        flow: 'dy', //工作流的代码或ID
        userid: userid, //发起人ID
        subject: `${param.dyr || ''}因 [${param.dyyy || ''}] 调阅凭证`


    };

    var ret = newWork(config);

    if (!ret.success) return ret;

    //自动递交给初审
/*
    var t = taskInfoForWork('dy', gguid);

    //将任务递交下去，如果任务需要签收，则先签收     
    for (var i = 0; i < t.taskList.length; i++) {
        var task = t.taskList[i];

        //可以递交，那么递交下去
        if (task.canSubmit) println(submitWork(moduleid, gguid, task.taskId));
        //需要先签收 ，那么以第一个候选人签收它
        if (task.canClaim) claimWork(moduleid, gguid, task.taskId, task.candidateUserList[0].userId);

    }
*/

    ret.id = gguid;
    ret.billno= billno;
    return {success:true , id: gguid , content:{billno:billno}  };


}


id: 64acc3ca8b10ede23ae60ef6
scriptid: 649aa52d99329f5ca7253c1c
tablename: app_script
clientip: 0:0:0:0:0:0:0:1
username: sa
createdate: 2023.07.11 10:55:54.000
script:
/**
 * 脚本中心的脚本，以 main函数为执行入口，相关的参数放在arg中，它是一个JSON字符串化后的数据
 *
 */
function main(arg) {
    println(arg);
    var param = JSON.parse(arg);
    var gguid = newGUID();
    var moduleid = 'dy';//模块ID
    var username = getProperty( "/API创建调阅流程的起草人",  param.creator || "api");
    var userid = getUserIdByName(username);
    var leaderid= 18; //审核人ID
    var billno = newBillNo('', 'dzpz_dy', 'billno', '{11111111}', 'billdate', newDate(), "");
    var dzpz_dy_ds = newDataStore("", "select * from  dzpz_dy");
    dzpz_dy_ds.setUpdateProperty("dzpz_dy", "id", "*", "id");
    dzpz_dy_ds.insertRow(0);
    dzpz_dy_ds.setValue(0, {
        id: gguid, gguid: gguid, userid: userid, username: username, billdate: newDate(), billno: billno,
        reader: param.dyr, 
        leaderid: leaderid , 
        summary: param.dyyy, corpid: '00',
        needwatermark: 0,//不打水印 
        filetype: 'zip', // 
        email: param.email,
        moredata: JSON.stringify(param.callback_param)
    });

    var dzpz_dymx_ds = newDataStore("", "select * from dzpz_dymx");
    dzpz_dymx_ds.setUpdateProperty('dzpz_dymx', 'id', '*', "id");
    var pzh = param.pzh  ;
    if( pzh==undefined) pzh =[];
    for (var i = 0; i < pzh.length; i++) {
        var row = dzpz_dymx_ds.insertRow(9999999);
        dzpz_dymx_ds.setValue(row, { id: newGUID(), gguid: gguid, inner_xh: i + 1, pzh: pzh[i], code: param.ktbh });
    }

    var err = updateAll(dzpz_dy_ds, dzpz_dymx_ds);
    if (err != '') return { success: false, messager: err };


    var corpid = getStringFromSQL("select corpid from dzpz_dy where id='" + gguid + "'");
    
    var sqls = ["update dzpz_dymx  set bz=null,pz_id= (select max(id) from dzpz_pz where dzpz_pz.pzh= dzpz_dymx.pzh and dzpz_pz.corpid='" + corpid + "' ) where gguid='" + gguid + "' ",
                "update dzpz_dymx  set bz='凭证号不存在' where  gguid='" + gguid + "' and not exists (select dzpz_pz.id from dzpz_pz where  dzpz_pz.pzh= dzpz_dymx.pzh  and dzpz_pz.corpid='" + corpid + "')  " 
             
    ];
    runSQL("", sqls); 


    var config = {
        moduleid: moduleid,//凭证调阅模块代码或ID,
        gguid: gguid,
        flow: 'dy', //工作流的代码或ID
        userid: userid, //发起人ID
        subject: `${param.dyr || ''}因 [${param.dyyy || ''}] 调阅凭证`


    };

    var ret = newWork(config);

    if (!ret.success) return ret;

    //自动递交给初审
/*
    var t = taskInfoForWork('dy', gguid);

    //将任务递交下去，如果任务需要签收，则先签收     
    for (var i = 0; i < t.taskList.length; i++) {
        var task = t.taskList[i];

        //可以递交，那么递交下去
        if (task.canSubmit) println(submitWork(moduleid, gguid, task.taskId));
        //需要先签收 ，那么以第一个候选人签收它
        if (task.canClaim) claimWork(moduleid, gguid, task.taskId, task.candidateUserList[0].userId);

    }
*/

    ret.id = gguid;
    ret.billno= billno;
    return {success:true , id: gguid , content:{billno:billno}  };


}


id: 64acc3ca8b10ede23ae60eff
scriptid: 649aa52d99329f5ca7253c1c
tablename: app_script
clientip: 0:0:0:0:0:0:0:1
username: sa
createdate: 2023.07.11 10:56:59.000
script:
/**
 * 脚本中心的脚本，以 main函数为执行入口，相关的参数放在arg中，它是一个JSON字符串化后的数据
 *
 */
function main(arg) {
    println(arg);
    var param = JSON.parse(arg);
    var gguid = newGUID();
    var moduleid = 'dy';//模块ID
    var username = getProperty( "/API创建调阅流程的起草人",  param.creator || "api");
    var userid = getUserIdByName(username);
    var leaderid= 18; //审核人ID
    var billno = newBillNo('', 'dzpz_dy', 'billno', '{11111111}', 'billdate', newDate(), "");
    var dzpz_dy_ds = newDataStore("", "select * from  dzpz_dy");
    dzpz_dy_ds.setUpdateProperty("dzpz_dy", "id", "*", "id");
    dzpz_dy_ds.insertRow(0);
    dzpz_dy_ds.setValue(0, {
        id: gguid, gguid: gguid, userid: userid, username: getStringFromSQL("select showname from app_user where id="+ userid  , billdate: newDate(), billno: billno,
        reader: param.dyr, 
        leaderid: leaderid , 
        summary: param.dyyy, corpid: '00',
        needwatermark: 0,//不打水印 
        filetype: 'zip', // 
        email: param.email,
        moredata: JSON.stringify(param.callback_param)
    });

    var dzpz_dymx_ds = newDataStore("", "select * from dzpz_dymx");
    dzpz_dymx_ds.setUpdateProperty('dzpz_dymx', 'id', '*', "id");
    var pzh = param.pzh  ;
    if( pzh==undefined) pzh =[];
    for (var i = 0; i < pzh.length; i++) {
        var row = dzpz_dymx_ds.insertRow(9999999);
        dzpz_dymx_ds.setValue(row, { id: newGUID(), gguid: gguid, inner_xh: i + 1, pzh: pzh[i], code: param.ktbh });
    }

    var err = updateAll(dzpz_dy_ds, dzpz_dymx_ds);
    if (err != '') return { success: false, messager: err };


    var corpid = getStringFromSQL("select corpid from dzpz_dy where id='" + gguid + "'");
    
    var sqls = ["update dzpz_dymx  set bz=null,pz_id= (select max(id) from dzpz_pz where dzpz_pz.pzh= dzpz_dymx.pzh and dzpz_pz.corpid='" + corpid + "' ) where gguid='" + gguid + "' ",
                "update dzpz_dymx  set bz='凭证号不存在' where  gguid='" + gguid + "' and not exists (select dzpz_pz.id from dzpz_pz where  dzpz_pz.pzh= dzpz_dymx.pzh  and dzpz_pz.corpid='" + corpid + "')  " 
             
    ];
    runSQL("", sqls); 


    var config = {
        moduleid: moduleid,//凭证调阅模块代码或ID,
        gguid: gguid,
        flow: 'dy', //工作流的代码或ID
        userid: userid, //发起人ID
        subject: `${param.dyr || ''}因 [${param.dyyy || ''}] 调阅凭证`


    };

    var ret = newWork(config);

    if (!ret.success) return ret;

    //自动递交给初审
/*
    var t = taskInfoForWork('dy', gguid);

    //将任务递交下去，如果任务需要签收，则先签收     
    for (var i = 0; i < t.taskList.length; i++) {
        var task = t.taskList[i];

        //可以递交，那么递交下去
        if (task.canSubmit) println(submitWork(moduleid, gguid, task.taskId));
        //需要先签收 ，那么以第一个候选人签收它
        if (task.canClaim) claimWork(moduleid, gguid, task.taskId, task.candidateUserList[0].userId);

    }
*/

    ret.id = gguid;
    ret.billno= billno;
    return {success:true , id: gguid , content:{billno:billno}  };


}


id: 64acc3ca8b10ede23ae60f08
scriptid: 649aa52d99329f5ca7253c1c
tablename: app_script
clientip: 0:0:0:0:0:0:0:1
username: sa
createdate: 2023.07.11 10:57:10.000
script:
/**
 * 脚本中心的脚本，以 main函数为执行入口，相关的参数放在arg中，它是一个JSON字符串化后的数据
 *
 */
function main(arg) {
    println(arg);
    var param = JSON.parse(arg);
    var gguid = newGUID();
    var moduleid = 'dy';//模块ID
    var username = getProperty( "/API创建调阅流程的起草人",  param.creator || "api");
    var userid = getUserIdByName(username);
    var leaderid= 18; //审核人ID
    var billno = newBillNo('', 'dzpz_dy', 'billno', '{11111111}', 'billdate', newDate(), "");
    var dzpz_dy_ds = newDataStore("", "select * from  dzpz_dy");
    dzpz_dy_ds.setUpdateProperty("dzpz_dy", "id", "*", "id");
    dzpz_dy_ds.insertRow(0);
    dzpz_dy_ds.setValue(0, {
        id: gguid, gguid: gguid, userid: userid, username: getStringFromSQL("select showname from app_user where id="+ userid )
         , billdate: newDate(), billno: billno,
        reader: param.dyr, 
        leaderid: leaderid , 
        summary: param.dyyy, corpid: '00',
        needwatermark: 0,//不打水印 
        filetype: 'zip', // 
        email: param.email,
        moredata: JSON.stringify(param.callback_param)
    });

    var dzpz_dymx_ds = newDataStore("", "select * from dzpz_dymx");
    dzpz_dymx_ds.setUpdateProperty('dzpz_dymx', 'id', '*', "id");
    var pzh = param.pzh  ;
    if( pzh==undefined) pzh =[];
    for (var i = 0; i < pzh.length; i++) {
        var row = dzpz_dymx_ds.insertRow(9999999);
        dzpz_dymx_ds.setValue(row, { id: newGUID(), gguid: gguid, inner_xh: i + 1, pzh: pzh[i], code: param.ktbh });
    }

    var err = updateAll(dzpz_dy_ds, dzpz_dymx_ds);
    if (err != '') return { success: false, messager: err };


    var corpid = getStringFromSQL("select corpid from dzpz_dy where id='" + gguid + "'");
    
    var sqls = ["update dzpz_dymx  set bz=null,pz_id= (select max(id) from dzpz_pz where dzpz_pz.pzh= dzpz_dymx.pzh and dzpz_pz.corpid='" + corpid + "' ) where gguid='" + gguid + "' ",
                "update dzpz_dymx  set bz='凭证号不存在' where  gguid='" + gguid + "' and not exists (select dzpz_pz.id from dzpz_pz where  dzpz_pz.pzh= dzpz_dymx.pzh  and dzpz_pz.corpid='" + corpid + "')  " 
             
    ];
    runSQL("", sqls); 


    var config = {
        moduleid: moduleid,//凭证调阅模块代码或ID,
        gguid: gguid,
        flow: 'dy', //工作流的代码或ID
        userid: userid, //发起人ID
        subject: `${param.dyr || ''}因 [${param.dyyy || ''}] 调阅凭证`


    };

    var ret = newWork(config);

    if (!ret.success) return ret;

    //自动递交给初审
/*
    var t = taskInfoForWork('dy', gguid);

    //将任务递交下去，如果任务需要签收，则先签收     
    for (var i = 0; i < t.taskList.length; i++) {
        var task = t.taskList[i];

        //可以递交，那么递交下去
        if (task.canSubmit) println(submitWork(moduleid, gguid, task.taskId));
        //需要先签收 ，那么以第一个候选人签收它
        if (task.canClaim) claimWork(moduleid, gguid, task.taskId, task.candidateUserList[0].userId);

    }
*/

    ret.id = gguid;
    ret.billno= billno;
    return {success:true , id: gguid , content:{billno:billno}  };


}


id: 64ace9968b10ede23ae611c7
scriptid: 60fa600f9932563b7c99baff
tablename: app_script
clientip: 0:0:0:0:0:0:0:1
username: sa
createdate: 2023.07.11 13:36:26.000
script:
/**
 * 单据点击保存，前端所有的操作被转译成3种操作:insert , delete , update ,
 *  并且可以在  beforeBillSaveOnServer 中返回一些SQL语句，可以在afterBillSaveOnServer中返回一些SQL语句
 *
 * 系统分别在需要的数据库连接中执行这些语句 ， 当所有语句执行成功后，事件被提交。一些细节如下 ：
 *
 * 1 如果单据中的表，属于不同的数据库连接，那么所有的SQL语句会以连接为单位，对语句进行批量执行
 * 2 这些语句的执行顺序是：对同一个数据库连接中的语句， 先执行 beforeBillSaveOnServer 中返回的SQL语句，再执行单据操作转译得到的SQL语句，
 *   再执行 afterBillSaveOnServer 中返回的SQL语句， 当多个（或一个）数据库连接执行完这些语句，且没有错误时，所有的数据库连接做提交，否则全部回滚
 * 3 不要在 beforeBillSaveOnServer 或 afterBillSaveOnServer 中直接执行数据库操作，而是返回SQL语句，让系统批量执行它们，并控制好事务
 * 4 当执行成功后，系统再执行事件函数  afterBillSaveSuccessfulOnServer 。 此事件中可以执行任意操作，它与单据保存事件结束后才被触发执行，
 *   与单据保存并不在一个事务中。
 *
 *
 * @param gguid  要删除记录的gguid ，等同于主表的id
 * @param session  一个JSON对象，用于在整个单据保存过程中的各个事件之间传递数据。本事件做为单据保存的最后一个事件，session对象在使用后将被丢弃
 *
 *
 * @return 本函数不需要返回值
 *
 */
function afterBillSaveSuccessfulOnServer(gguid, session) {

    var corpid = getStringFromSQL("select corpid from dzpz_dy where id='" + gguid + "'");
    //2022.08.11优化，理论上不应该存在重复号码的凭证，但是加上max肯定没错，避免数据异常导致更新失败
    var sqls = ["update dzpz_dymx  set bz=null,pz_id= (select max(id) from dzpz_pz where dzpz_pz.pzh= dzpz_dymx.pzh and dzpz_pz.corpid='" + corpid + "' ) where gguid='" + gguid + "' ",
    "update dzpz_dymx  set bz='凭证号不存在' where  gguid='" + gguid + "' and not exists (select dzpz_pz.id from dzpz_pz where  dzpz_pz.pzh= dzpz_dymx.pzh  and dzpz_pz.corpid='" + corpid + "')  "

    ];

    runSQL("", sqls, true);
    println("----检测凭证是否存在完成---------")
}


/**
 * 用户任务提交后
 * @param flow 流程定义
 * @param node 开始节点
 * @param gguid 单据的gguid

 */
//@comment (group=工作流事件,caption=用户任务提交后)
function onUserTaskSubmitted(flow, userTask, gguid) {
    // println( flow.id) ; //流程定义的ID
    // println( userTask.name);
    println(JSON.stringify(userTask));
    println(gguid);
    if (userTask.id == 'id_60b3b08f27644fc18af35ba20ecd2bac') {
        var moreData = getStringFromSQL("select moredata from dzpz_dy where id='" + gguid + "'");
        try {
            moreData = JSON.parse(moreData);
            //起草后，递交后调用OA的接口回写数据
            if (moreData.form_id) {
                runTask('oa_callback', { requestid: moreData.form_id });
            }
        } catch (err) {

        }

    }
    
    if (userTask.id == 'id_6655df8bedc641aa9bacf1720d13ce2d') //领导审批通过后，就开始打包
    {
        //领导审批通过后，就开始打包
        do_package(gguid);
    }

    println(gguid + " " + userTask.name + " 提交完成")


}

//后台打包
function do_package(gguid) {
    var ret = JSON.parse(runTask("package", { gguid: gguid }));
    return ret;
}



function back_urlShare(url, d, t) {
    var ret = urlShare(url, d, "day", t);
    return ret.url;
}


id: 64ace9968b10ede23ae611d0
scriptid: 60fa600f9932563b7c99baff
tablename: app_script
clientip: 0:0:0:0:0:0:0:1
username: sa
createdate: 2023.07.11 13:36:30.000
script:
/**
 * 单据点击保存，前端所有的操作被转译成3种操作:insert , delete , update ,
 *  并且可以在  beforeBillSaveOnServer 中返回一些SQL语句，可以在afterBillSaveOnServer中返回一些SQL语句
 *
 * 系统分别在需要的数据库连接中执行这些语句 ， 当所有语句执行成功后，事件被提交。一些细节如下 ：
 *
 * 1 如果单据中的表，属于不同的数据库连接，那么所有的SQL语句会以连接为单位，对语句进行批量执行
 * 2 这些语句的执行顺序是：对同一个数据库连接中的语句， 先执行 beforeBillSaveOnServer 中返回的SQL语句，再执行单据操作转译得到的SQL语句，
 *   再执行 afterBillSaveOnServer 中返回的SQL语句， 当多个（或一个）数据库连接执行完这些语句，且没有错误时，所有的数据库连接做提交，否则全部回滚
 * 3 不要在 beforeBillSaveOnServer 或 afterBillSaveOnServer 中直接执行数据库操作，而是返回SQL语句，让系统批量执行它们，并控制好事务
 * 4 当执行成功后，系统再执行事件函数  afterBillSaveSuccessfulOnServer 。 此事件中可以执行任意操作，它与单据保存事件结束后才被触发执行，
 *   与单据保存并不在一个事务中。
 *
 *
 * @param gguid  要删除记录的gguid ，等同于主表的id
 * @param session  一个JSON对象，用于在整个单据保存过程中的各个事件之间传递数据。本事件做为单据保存的最后一个事件，session对象在使用后将被丢弃
 *
 *
 * @return 本函数不需要返回值
 *
 */
function afterBillSaveSuccessfulOnServer(gguid, session) {

    var corpid = getStringFromSQL("select corpid from dzpz_dy where id='" + gguid + "'");
    //2022.08.11优化，理论上不应该存在重复号码的凭证，但是加上max肯定没错，避免数据异常导致更新失败
    var sqls = ["update dzpz_dymx  set bz=null,pz_id= (select max(id) from dzpz_pz where dzpz_pz.pzh= dzpz_dymx.pzh and dzpz_pz.corpid='" + corpid + "' ) where gguid='" + gguid + "' ",
    "update dzpz_dymx  set bz='凭证号不存在' where  gguid='" + gguid + "' and not exists (select dzpz_pz.id from dzpz_pz where  dzpz_pz.pzh= dzpz_dymx.pzh  and dzpz_pz.corpid='" + corpid + "')  "

    ];

    runSQL("", sqls, true);
    println("----检测凭证是否存在完成---------")
}


/**
 * 用户任务提交后
 * @param flow 流程定义
 * @param node 开始节点
 * @param gguid 单据的gguid

 */

//@comment (group=工作流事件,caption=用户任务提交后)
function onUserTaskSubmitted(flow, userTask, gguid) {
    // println( flow.id) ; //流程定义的ID
    // println( userTask.name);
    println(JSON.stringify(userTask));
    println(gguid);
    if (userTask.id == 'id_60b3b08f27644fc18af35ba20ecd2bac') {
        var moreData = getStringFromSQL("select moredata from dzpz_dy where id='" + gguid + "'");
        try {
            moreData = JSON.parse(moreData);
            //起草后，递交后调用OA的接口回写数据
            if (moreData.form_id) {
                runTask('oa_callback', { requestid: moreData.form_id });
            }
        } catch (err) {

        }

    }

    if (userTask.id == 'id_6655df8bedc641aa9bacf1720d13ce2d') //领导审批通过后，就开始打包
    {
        //领导审批通过后，就开始打包
        do_package(gguid);
    }

    println(gguid + " " + userTask.name + " 提交完成")


}

//后台打包
function do_package(gguid) {
    var ret = JSON.parse(runTask("package", { gguid: gguid }));
    return ret;
}



function back_urlShare(url, d, t) {
    var ret = urlShare(url, d, "day", t);
    return ret.url;
}


id: 64ace9968b10ede23ae611fb
scriptid: 64a53ef18b10ede23ae607f1
tablename: app_script
clientip: 0:0:0:0:0:0:0:1
username: sa
createdate: 2023.07.11 15:00:00.000
script:
/**
 * 脚本中心的脚本，以 main函数为执行入口，相关的参数放在arg中，它是一个JSON字符串化后的数据
 *
 */
function main(arg) {
    println(arg);
    var param = JSON.parse(arg);
    var requestid= param.requestid ;
    
    var url = "https://oa.cemps.ac.cn/services/FzzwsOAHdService?wsdl";



    var content = `
    <?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"  
    xmlns:web="webservices.fzzwsoahd.weaver.com.cn">
   <soapenv:Header/>
   <soapenv:Body>
      <web:ObtainOAinformation>
         <web:in0>${requestid}</web:in0>
         <web:in1>true</web:in1>
      </web:ObtainOAinformation>
   </soapenv:Body>
</soapenv:Envelope>
`


    var ret = httpPost(url, {
        header: { 'Content-Type': 'application/soap+xml;charset=utf-8' },
        body: content
    });

    return ret.response;

}


id: 64ad00839932ee4d0f7f66ff
scriptid: 6181ea0bc76eefddf45ea1e5
tablename: app_script
clientip: 39.170.92.207
username: sa
createdate: 2023.07.13 10:53:53.000
script:
function main(arg) {

    println(arg);
    var p = JSON.parse(arg);

    var gguid = p.gguid;
    var topic = "打包下载" + gguid;

    var ds = newDataStore("", "select * from dzpz_dy");
    ds.setUpdateProperty("dzpz_dy", "id", "*", "id");
    ds.retrieve(" id='" + gguid + "'");
    ds.setValue(0, "ziptaskid", "");
    ds.setValue(0, "zipresult", JSON.stringify(p.zipFiles));
    ds.update(true);

    pushMessage(topic, { action: "gameOver", result: p }, -1);

    // println(  ds.getJSONRow(0,true));
    var action_after_pack = ds.getString(0, "action_after_pack");
    println("action_after_pack=" + action_after_pack);

    // 因为打包是异步的，所以打包后续动作放在这里处理
    if (action_after_pack != '') {
        println('发送邮件');
        runTask("action_after_pack", { gguid: gguid });
    } else {
        println("打包完成，无需后续操作");

    }

    //发送消息给申请人
    var html = [];
    html.push("调阅申请已审批通过，点击链接下载：<br><ul>");
    for (var i = 0; i < p.zipFiles.length; i++) {
        var url = '' + p.zipFiles[i].url;
        url = url.replace(/&action=view/g, '&action=download');
        html.push('<li><a href="' + url + '" target="_blank">' + p.zipFiles[i].fileName + '</a></li>');
    }
    html.push('</ul>');
    var userid = ds.getInt(0, "userid");
    println(html.join(''));
    chatWith(userid, html.join(''));



}


id: 64ad08348b10ede23ae61247
scriptid: 649a906999329f5ca7253b6b
tablename: app_script
clientip: 0:0:0:0:0:0:0:1
username: sa
createdate: 2023.07.12 14:19:14.000
script:
/**
 * 脚本中心的脚本，以 main函数为执行入口，相关的参数放在arg中，它是一个JSON字符串化后的数据
 *
 */
function main(arg) {
    println(arg);
    var param = JSON.parse(arg);


    var ktbh = param.ktbh || '';
    ktbh= khbh.split(',');
    ktbh="('" + ktbh.join("','")+"')" ;

    if (!param.pzh) return { success: false, message: '没有提供凭证号' };

    var tmpTableName = "t_" + newGUID();
    runSQL("", `drop table  ${tmpTableName}`);
    runSQL("", `create table  ${tmpTableName} ( pzh varchar(40) not null , primary key(pzh)) `);


    for (var i = 0; i < param.pzh.length; i++) {
        var pzh = param.pzh[i];
        runSQL("", `insert into  ${tmpTableName}  ( pzh)  values  ('${pzh}') `);
    }

    try {
        var ds = newDataStore("", `select pzh from ${tmpTableName} a  where not exists ( select b.pzh from pzdjex b  where b.pzh = a.pzh and b.code in  ${ktbh} ) `);
        ds.retrieve();
        if (ds.getRowCount() == 0) {
            ds = newDataStore("", `select pzh from ${tmpTableName} a  where not exists ( select b.pzh from  dzpz_pz b  where b.pzh = a.pzh  ) `);
            ds.retrieve();
            if (ds.getRowCount() == 0) {
                return { success: true, code:'0', messager: `所有凭证号合法，且已影像化` };
            } else {
                var pzhs = [];
                for (var i = 0; i < ds.getRowCount(); i++) {
                    pzhs.push(ds.getString(i, "pzh"));
                }
                runSQL("", `drop table  ${tmpTableName}`);
                return { success: false, code:'1', message: `凭证号合法，但系统中不存在如下凭证的影像资料：${pzhs.join(',')}` };

            }
        }


        var pzhs = [];
        for (var i = 0; i < ds.getRowCount(); i++) {
            pzhs.push(ds.getString(i, "pzh"));
        }
        runSQL("", `drop table  ${tmpTableName}`);
        return { success: false, code:'2'  , message: `系统中不存在课题号为 ${ktbh} 的凭证：${pzhs.join(',')}` };


    }
    catch (err) {

    } finally {
        runSQL("", `drop table  ${tmpTableName}`);
    }


}


id: 64ae47c68b10ede23ae61265
scriptid: 649aa52d99329f5ca7253c1c
tablename: app_script
clientip: 0:0:0:0:0:0:0:1
username: sa
createdate: 2023.07.12 14:27:19.000
script:
/**
 * 脚本中心的脚本，以 main函数为执行入口，相关的参数放在arg中，它是一个JSON字符串化后的数据
 *
 */
function main(arg) {
    println(arg);
    var param = JSON.parse(arg);
    var gguid = newGUID();
    var moduleid = 'dy';//模块ID
    var username = getProperty( "/API创建调阅流程的起草人",  param.creator || "api");
    var userid = getUserIdByName(username);
    var leaderid= 18; //审核人ID
    var billno = newBillNo('', 'dzpz_dy', 'billno', '{11111111}', 'billdate', newDate(), "");
    var dzpz_dy_ds = newDataStore("", "select * from  dzpz_dy");
    dzpz_dy_ds.setUpdateProperty("dzpz_dy", "id", "*", "id");
    dzpz_dy_ds.insertRow(0);
    dzpz_dy_ds.setValue(0, {
        id: gguid, gguid: gguid, userid: userid, username: getStringFromSQL("select showname from app_user where id="+ userid )
         , billdate: newDate(), billno: billno,
        reader: param.dyr, 
        leaderid: leaderid , 
        summary: param.dyyy, corpid: '00',
        needwatermark: 0,//不打水印 
        filetype: 'zip', // 
        email: param.email,
        moredata: JSON.stringify(param.callback_param)
    });

    var dzpz_dymx_ds = newDataStore("", "select * from dzpz_dymx");
    dzpz_dymx_ds.setUpdateProperty('dzpz_dymx', 'id', '*', "id");
    var pzh = param.pzh  ;
    if( pzh==undefined) pzh =[];
    for (var i = 0; i < pzh.length; i++) {
        var row = dzpz_dymx_ds.insertRow(9999999);
        var code= getStringFromSQL("select code from pzdjex b  where  pzh = '"+pzh[i]+"'");
        dzpz_dymx_ds.setValue(row, { id: newGUID(), gguid: gguid, inner_xh: i + 1, pzh: pzh[i], code: code  });
    }

    var err = updateAll(dzpz_dy_ds, dzpz_dymx_ds);
    if (err != '') return { success: false, messager: err };


    var corpid = getStringFromSQL("select corpid from dzpz_dy where id='" + gguid + "'");
    
    var sqls = ["update dzpz_dymx  set bz=null,pz_id= (select max(id) from dzpz_pz where dzpz_pz.pzh= dzpz_dymx.pzh and dzpz_pz.corpid='" + corpid + "' ) where gguid='" + gguid + "' ",
                "update dzpz_dymx  set bz='凭证号不存在' where  gguid='" + gguid + "' and not exists (select dzpz_pz.id from dzpz_pz where  dzpz_pz.pzh= dzpz_dymx.pzh  and dzpz_pz.corpid='" + corpid + "')  " 
             
    ];
    runSQL("", sqls); 


    var config = {
        moduleid: moduleid,//凭证调阅模块代码或ID,
        gguid: gguid,
        flow: 'dy', //工作流的代码或ID
        userid: userid, //发起人ID
        subject: `${param.dyr || ''}因 [${param.dyyy || ''}] 调阅凭证`


    };

    var ret = newWork(config);

    if (!ret.success) return ret;

    //自动递交给初审
/*
    var t = taskInfoForWork('dy', gguid);

    //将任务递交下去，如果任务需要签收，则先签收     
    for (var i = 0; i < t.taskList.length; i++) {
        var task = t.taskList[i];

        //可以递交，那么递交下去
        if (task.canSubmit) println(submitWork(moduleid, gguid, task.taskId));
        //需要先签收 ，那么以第一个候选人签收它
        if (task.canClaim) claimWork(moduleid, gguid, task.taskId, task.candidateUserList[0].userId);

    }
*/

    ret.id = gguid;
    ret.billno= billno;
    return {success:true , id: gguid , content:{billno:billno}  };


}


id: 64ae47c68b10ede23ae61292
scriptid: 6181ea0bc76eefddf45ea1e5
tablename: app_script
clientip: 0:0:0:0:0:0:0:1
username: sa
createdate: 2023.07.12 15:05:53.000
script:
function main(arg) {

    println(arg);
    var p = JSON.parse(arg);

    var gguid = p.gguid;
    var topic = "打包下载" + gguid;

    var ds = newDataStore("", "select * from dzpz_dy");
    ds.setUpdateProperty("dzpz_dy", "id", "*", "id");
    ds.retrieve(" id='" + gguid + "'");
    ds.setValue(0, "ziptaskid", "");
    ds.setValue(0, "zipresult", JSON.stringify(p.zipFiles));
    ds.update(true);

    pushMessage(topic, { action: "gameOver", result: p }, -1);


    // 因为打包是异步的，所以打包后续动作放在这里处理
    if (ds.getString(0, "action_after_pack") != '') {

        runTask("action_after_pack", { gguid: gguid });
    }

    //发送消息给申请人
    var html = [];
    html.push("调阅申请已审批通过，点击链接下载：<br><ul>");
    for (var i = 0; i < p.zipFiles.length; i++) {
        var url = '' + p.zipFiles[i].url;
        url = url.replace(/&action=view/g, '&action=download');
        html.push('<li><a href="' + url + '" target="_blank">' + p.zipFiles[i].fileName + '</a></li>');
    }
    html.push('</ul>');
    var userid = ds.getInt(0, "userid");
    println(html.join(''));
    chatWith(userid, html.join(''));



}


id: 64ae47c68b10ede23ae6129b
scriptid: 6181ea0bc76eefddf45ea1e5
tablename: app_script
clientip: 0:0:0:0:0:0:0:1
username: sa
createdate: 2023.07.12 15:06:18.000
script:
function main(arg) {

    println(arg);
    var p = JSON.parse(arg);

    var gguid = p.gguid;
    var topic = "打包下载" + gguid;

    var ds = newDataStore("", "select * from dzpz_dy");
    ds.setUpdateProperty("dzpz_dy", "id", "*", "id");
    ds.retrieve(" id='" + gguid + "'");
    ds.setValue(0, "ziptaskid", "");
    ds.setValue(0, "zipresult", JSON.stringify(p.zipFiles));
    ds.update(true);

    pushMessage(topic, { action: "gameOver", result: p }, -1);


    // 因为打包是异步的，所以打包后续动作放在这里处理
    if (ds.getString(0, "action_after_pack") != '') {
        runTask("action_after_pack", { gguid: gguid });
    }

    //发送消息给申请人
    var html = [];
    html.push("调阅申请已审批通过，点击链接下载：<br><ul>");
    for (var i = 0; i < p.zipFiles.length; i++) {
        var url = '' + p.zipFiles[i].url;
        url = url.replace(/&action=view/g, '&action=download');
        html.push('<li><a href="' + url + '" target="_blank">' + p.zipFiles[i].fileName + '</a></li>');
    }
    html.push('</ul>');
    var userid = ds.getInt(0, "userid");
    println(html.join(''));
    chatWith(userid, html.join(''));



}


id: 64ae47c68b10ede23ae612a4
scriptid: 6181ea0bc76eefddf45ea1e5
tablename: app_script
clientip: 0:0:0:0:0:0:0:1
username: sa
createdate: 2023.07.12 15:06:55.000
script:
function main(arg) {

    println(arg);
    var p = JSON.parse(arg);

    var gguid = p.gguid;
    var topic = "打包下载" + gguid;

    var ds = newDataStore("", "select * from dzpz_dy");
    ds.setUpdateProperty("dzpz_dy", "id", "*", "id");
    ds.retrieve(" id='" + gguid + "'");
    ds.setValue(0, "ziptaskid", "");
    ds.setValue(0, "zipresult", JSON.stringify(p.zipFiles));
    ds.update(true);

    pushMessage(topic, { action: "gameOver", result: p }, -1);


    // 因为打包是异步的，所以打包后续动作放在这里处理
    if (ds.getString(0, "action_after_pack") != '') {
        println('发送邮件');
        runTask("action_after_pack", { gguid: gguid });
    }

    //发送消息给申请人
    var html = [];
    html.push("调阅申请已审批通过，点击链接下载：<br><ul>");
    for (var i = 0; i < p.zipFiles.length; i++) {
        var url = '' + p.zipFiles[i].url;
        url = url.replace(/&action=view/g, '&action=download');
        html.push('<li><a href="' + url + '" target="_blank">' + p.zipFiles[i].fileName + '</a></li>');
    }
    html.push('</ul>');
    var userid = ds.getInt(0, "userid");
    println(html.join(''));
    chatWith(userid, html.join(''));



}


id: 64af632d8b10ede23ae612ca
scriptid: 6181ea0bc76eefddf45ea1e5
tablename: app_script
clientip: 0:0:0:0:0:0:0:1
username: sa
createdate: 2023.07.13 10:36:30.000
script:
function main(arg) {

    println(arg);
    var p = JSON.parse(arg);

    var gguid = p.gguid;
    var topic = "打包下载" + gguid;

    var ds = newDataStore("", "select * from dzpz_dy");
    ds.setUpdateProperty("dzpz_dy", "id", "*", "id");
    ds.retrieve(" id='" + gguid + "'");
    ds.setValue(0, "ziptaskid", "");
    ds.setValue(0, "zipresult", JSON.stringify(p.zipFiles));
    ds.update(true);

    pushMessage(topic, { action: "gameOver", result: p }, -1);

    println(  ds.getJSONRow(0,true));
    println( "action_after_pack="+ds.getString(0, "action_after_pack"));

    // 因为打包是异步的，所以打包后续动作放在这里处理
    if (ds.getString(0, "action_after_pack") != '') {
        println('发送邮件');
        runTask("action_after_pack", { gguid: gguid });
    }else{
        println("打包染成，无需后续操作");

    }

    //发送消息给申请人
    var html = [];
    html.push("调阅申请已审批通过，点击链接下载：<br><ul>");
    for (var i = 0; i < p.zipFiles.length; i++) {
        var url = '' + p.zipFiles[i].url;
        url = url.replace(/&action=view/g, '&action=download');
        html.push('<li><a href="' + url + '" target="_blank">' + p.zipFiles[i].fileName + '</a></li>');
    }
    html.push('</ul>');
    var userid = ds.getInt(0, "userid");
    println(html.join(''));
    chatWith(userid, html.join(''));



}


id: 64af632d8b10ede23ae612d3
scriptid: 6181ea0bc76eefddf45ea1e5
tablename: app_script
clientip: 0:0:0:0:0:0:0:1
username: sa
createdate: 2023.07.13 10:36:45.000
script:
function main(arg) {

    println(arg);
    var p = JSON.parse(arg);

    var gguid = p.gguid;
    var topic = "打包下载" + gguid;

    var ds = newDataStore("", "select * from dzpz_dy");
    ds.setUpdateProperty("dzpz_dy", "id", "*", "id");
    ds.retrieve(" id='" + gguid + "'");
    ds.setValue(0, "ziptaskid", "");
    ds.setValue(0, "zipresult", JSON.stringify(p.zipFiles));
    ds.update(true);

    pushMessage(topic, { action: "gameOver", result: p }, -1);

   // println(  ds.getJSONRow(0,true));
    println( "action_after_pack="+ds.getString(0, "action_after_pack"));

    // 因为打包是异步的，所以打包后续动作放在这里处理
    if (ds.getString(0, "action_after_pack") != '') {
        println('发送邮件');
        runTask("action_after_pack", { gguid: gguid });
    }else{
        println("打包染成，无需后续操作");

    }

    //发送消息给申请人
    var html = [];
    html.push("调阅申请已审批通过，点击链接下载：<br><ul>");
    for (var i = 0; i < p.zipFiles.length; i++) {
        var url = '' + p.zipFiles[i].url;
        url = url.replace(/&action=view/g, '&action=download');
        html.push('<li><a href="' + url + '" target="_blank">' + p.zipFiles[i].fileName + '</a></li>');
    }
    html.push('</ul>');
    var userid = ds.getInt(0, "userid");
    println(html.join(''));
    chatWith(userid, html.join(''));



}


id: 64af632d8b10ede23ae612e2
scriptid: 6181ea0bc76eefddf45ea1e5
tablename: app_script
clientip: 0:0:0:0:0:0:0:1
username: sa
createdate: 2023.07.13 10:44:33.000
script:
function main(arg) {

    println(arg);
    var p = JSON.parse(arg);

    var gguid = p.gguid;
    var topic = "打包下载" + gguid;

    var ds = newDataStore("", "select * from dzpz_dy");
    ds.setUpdateProperty("dzpz_dy", "id", "*", "id");
    ds.retrieve(" id='" + gguid + "'");
    ds.setValue(0, "ziptaskid", "");
    ds.setValue(0, "zipresult", JSON.stringify(p.zipFiles));
    ds.update(true);

    pushMessage(topic, { action: "gameOver", result: p }, -1);

   // println(  ds.getJSONRow(0,true));
   var action_after_pack = ds.getString(0, "action_after_pack");
    println( "action_after_pack="+ action_after_pack);

    // 因为打包是异步的，所以打包后续动作放在这里处理
    if (action_after_pack !='') {
        println('发送邮件');
        runTask("action_after_pack", { gguid: gguid });
    }else{
        println("打包染成，无需后续操作");

    }

    //发送消息给申请人
    var html = [];
    html.push("调阅申请已审批通过，点击链接下载：<br><ul>");
    for (var i = 0; i < p.zipFiles.length; i++) {
        var url = '' + p.zipFiles[i].url;
        url = url.replace(/&action=view/g, '&action=download');
        html.push('<li><a href="' + url + '" target="_blank">' + p.zipFiles[i].fileName + '</a></li>');
    }
    html.push('</ul>');
    var userid = ds.getInt(0, "userid");
    println(html.join(''));
    chatWith(userid, html.join(''));



}


id: 64af632d8b10ede23ae612eb
scriptid: 6181ea0bc76eefddf45ea1e5
tablename: app_script
clientip: 0:0:0:0:0:0:0:1
username: sa
createdate: 2023.07.13 10:44:57.000
script:
function main(arg) {

    println(arg);
    var p = JSON.parse(arg);

    var gguid = p.gguid;
    var topic = "打包下载" + gguid;

    var ds = newDataStore("", "select * from dzpz_dy");
    ds.setUpdateProperty("dzpz_dy", "id", "*", "id");
    ds.retrieve(" id='" + gguid + "'");
    ds.setValue(0, "ziptaskid", "");
    ds.setValue(0, "zipresult", JSON.stringify(p.zipFiles));
    ds.update(true);

    pushMessage(topic, { action: "gameOver", result: p }, -1);

   // println(  ds.getJSONRow(0,true));
   var action_after_pack = ds.getString(0, "action_after_pack");
    println( "action_after_pack="+ action_after_pack);

    // 因为打包是异步的，所以打包后续动作放在这里处理
    if (action_after_pack !='') {
        println('发送邮件');
        runTask("action_after_pack", { gguid: gguid });
    }else{
        println("打包完成，无需后续操作");

    }

    //发送消息给申请人
    var html = [];
    html.push("调阅申请已审批通过，点击链接下载：<br><ul>");
    for (var i = 0; i < p.zipFiles.length; i++) {
        var url = '' + p.zipFiles[i].url;
        url = url.replace(/&action=view/g, '&action=download');
        html.push('<li><a href="' + url + '" target="_blank">' + p.zipFiles[i].fileName + '</a></li>');
    }
    html.push('</ul>');
    var userid = ds.getInt(0, "userid");
    println(html.join(''));
    chatWith(userid, html.join(''));



}


id: 64af67ad8b10ede23ae6133a
scriptid: 6181ea0bc76eefddf45ea1e5
tablename: app_script
clientip: 0:0:0:0:0:0:0:1
username: sa
createdate: 2023.07.13 10:56:49.000
script:
function main(arg) {

    println(arg);
    var p = JSON.parse(arg);

    var gguid = p.gguid;
    var topic = "打包下载" + gguid;

    var ds = newDataStore("", "select * from dzpz_dy");
    ds.setUpdateProperty("dzpz_dy", "id", "*", "id");
    ds.retrieve(" id='" + gguid + "'");
    ds.setValue(0, "ziptaskid", "");
    ds.setValue(0, "zipresult", JSON.stringify(p.zipFiles));
    ds.update(true);

    pushMessage(topic, { action: "gameOver", result: p }, -1);

   println(ds.getJSONRow(0, true).replace(/,/g , '<br>'));
   var action_after_pack = ds.getString(0, "action_after_pack");
    println( "action_after_pack="+ action_after_pack);

    // 因为打包是异步的，所以打包后续动作放在这里处理
    if (action_after_pack !='') {
        println('发送邮件');
        runTask("action_after_pack", { gguid: gguid });
    }else{
        println("打包完成，无需后续操作");

    }

    //发送消息给申请人
    var html = [];
    html.push("调阅申请已审批通过，点击链接下载：<br><ul>");
    for (var i = 0; i < p.zipFiles.length; i++) {
        var url = '' + p.zipFiles[i].url;
        url = url.replace(/&action=view/g, '&action=download');
        html.push('<li><a href="' + url + '" target="_blank">' + p.zipFiles[i].fileName + '</a></li>');
    }
    html.push('</ul>');
    var userid = ds.getInt(0, "userid");
    println(html.join(''));
    chatWith(userid, html.join(''));



}


id: 64af67ad8b10ede23ae61343
scriptid: 6181ea0bc76eefddf45ea1e5
tablename: app_script
clientip: 0:0:0:0:0:0:0:1
username: sa
createdate: 2023.07.13 10:57:28.000
script:
function main(arg) {

    println(arg);
    var p = JSON.parse(arg);

    var gguid = p.gguid;
    var topic = "打包下载" + gguid;

    var ds = newDataStore("", "select * from dzpz_dy");
    ds.setUpdateProperty("dzpz_dy", "id", "*", "id");
    ds.retrieve(" id='" + gguid + "'");
    ds.setValue(0, "ziptaskid", "");
    ds.setValue(0, "zipresult", JSON.stringify(p.zipFiles));
    if(!ds.update(true)) println( ds.getError().getMessage());

    pushMessage(topic, { action: "gameOver", result: p }, -1);

   println(ds.getJSONRow(0, true).replace(/,/g , '<br>'));
   var action_after_pack = ds.getString(0, "action_after_pack");
    println( "action_after_pack="+ action_after_pack);

    // 因为打包是异步的，所以打包后续动作放在这里处理
    if (action_after_pack !='') {
        println('发送邮件');
        runTask("action_after_pack", { gguid: gguid });
    }else{
        println("打包完成，无需后续操作");

    }

    //发送消息给申请人
    var html = [];
    html.push("调阅申请已审批通过，点击链接下载：<br><ul>");
    for (var i = 0; i < p.zipFiles.length; i++) {
        var url = '' + p.zipFiles[i].url;
        url = url.replace(/&action=view/g, '&action=download');
        html.push('<li><a href="' + url + '" target="_blank">' + p.zipFiles[i].fileName + '</a></li>');
    }
    html.push('</ul>');
    var userid = ds.getInt(0, "userid");
    println(html.join(''));
    chatWith(userid, html.join(''));



}


id: 64af67ad8b10ede23ae6135d
scriptid: 649aa52d99329f5ca7253c1c
tablename: app_script
clientip: 0:0:0:0:0:0:0:1
username: sa
createdate: 2023.07.13 16:49:51.000
script:
/**
 * 脚本中心的脚本，以 main函数为执行入口，相关的参数放在arg中，它是一个JSON字符串化后的数据
 *
 */
function main(arg) {
    println(arg);
    var param = JSON.parse(arg);
    var gguid = newGUID();
    var moduleid = 'dy';//模块ID
    var username = getProperty( "/API创建调阅流程的起草人",  param.creator || "api");
    var userid = getUserIdByName(username);
    var leaderid= 18; //审核人ID
    var billno = newBillNo('', 'dzpz_dy', 'billno', '{11111111}', 'billdate', newDate(), "");
    var dzpz_dy_ds = newDataStore("", "select * from  dzpz_dy");
    dzpz_dy_ds.setUpdateProperty("dzpz_dy", "id", "*", "id");
    dzpz_dy_ds.insertRow(0);
    dzpz_dy_ds.setValue(0, {
        id: gguid, gguid: gguid, userid: userid, username: getStringFromSQL("select showname from app_user where id="+ userid )
         , billdate: newDate(), billno: billno,
        reader: param.dyr, 
        leaderid: leaderid , 
        summary: param.dyyy, corpid: '00',
        needwatermark: 0,//不打水印 
        filetype: 'zip', // 
        email: param.email,
        moredata: JSON.stringify(param.callback_param),
        action_after_pack:'sendMail'
    });

    var dzpz_dymx_ds = newDataStore("", "select * from dzpz_dymx");
    dzpz_dymx_ds.setUpdateProperty('dzpz_dymx', 'id', '*', "id");
    var pzh = param.pzh  ;
    if( pzh==undefined) pzh =[];
    for (var i = 0; i < pzh.length; i++) {
        var row = dzpz_dymx_ds.insertRow(9999999);
        var code= getStringFromSQL("select code from pzdjex b  where  pzh = '"+pzh[i]+"'");
        dzpz_dymx_ds.setValue(row, { id: newGUID(), gguid: gguid, inner_xh: i + 1, pzh: pzh[i], code: code  });
    }

    var err = updateAll(dzpz_dy_ds, dzpz_dymx_ds);
    if (err != '') return { success: false, messager: err };


    var corpid = getStringFromSQL("select corpid from dzpz_dy where id='" + gguid + "'");
    
    var sqls = ["update dzpz_dymx  set bz=null,pz_id= (select max(id) from dzpz_pz where dzpz_pz.pzh= dzpz_dymx.pzh and dzpz_pz.corpid='" + corpid + "' ) where gguid='" + gguid + "' ",
                "update dzpz_dymx  set bz='凭证号不存在' where  gguid='" + gguid + "' and not exists (select dzpz_pz.id from dzpz_pz where  dzpz_pz.pzh= dzpz_dymx.pzh  and dzpz_pz.corpid='" + corpid + "')  " 
             
    ];
    runSQL("", sqls); 


    var config = {
        moduleid: moduleid,//凭证调阅模块代码或ID,
        gguid: gguid,
        flow: 'dy', //工作流的代码或ID
        userid: userid, //发起人ID
        subject: `${param.dyr || ''}因 [${param.dyyy || ''}] 调阅凭证`


    };

    var ret = newWork(config);

    if (!ret.success) return ret;

    //自动递交给初审
/*
    var t = taskInfoForWork('dy', gguid);

    //将任务递交下去，如果任务需要签收，则先签收     
    for (var i = 0; i < t.taskList.length; i++) {
        var task = t.taskList[i];

        //可以递交，那么递交下去
        if (task.canSubmit) println(submitWork(moduleid, gguid, task.taskId));
        //需要先签收 ，那么以第一个候选人签收它
        if (task.canClaim) claimWork(moduleid, gguid, task.taskId, task.candidateUserList[0].userId);

    }
*/

    ret.id = gguid;
    ret.billno= billno;
    return {success:true , id: gguid , content:{billno:billno}  };


}


id: 64afbf848b10ede23ae6139c
scriptid: 60fa600f9932563b7c99baff
tablename: app_script
clientip: 0:0:0:0:0:0:0:1
username: sa
createdate: 2023.07.13 17:10:44.000
script:
/**
 * 单据点击保存，前端所有的操作被转译成3种操作:insert , delete , update ,
 *  并且可以在  beforeBillSaveOnServer 中返回一些SQL语句，可以在afterBillSaveOnServer中返回一些SQL语句
 *
 * 系统分别在需要的数据库连接中执行这些语句 ， 当所有语句执行成功后，事件被提交。一些细节如下 ：
 *
 * 1 如果单据中的表，属于不同的数据库连接，那么所有的SQL语句会以连接为单位，对语句进行批量执行
 * 2 这些语句的执行顺序是：对同一个数据库连接中的语句， 先执行 beforeBillSaveOnServer 中返回的SQL语句，再执行单据操作转译得到的SQL语句，
 *   再执行 afterBillSaveOnServer 中返回的SQL语句， 当多个（或一个）数据库连接执行完这些语句，且没有错误时，所有的数据库连接做提交，否则全部回滚
 * 3 不要在 beforeBillSaveOnServer 或 afterBillSaveOnServer 中直接执行数据库操作，而是返回SQL语句，让系统批量执行它们，并控制好事务
 * 4 当执行成功后，系统再执行事件函数  afterBillSaveSuccessfulOnServer 。 此事件中可以执行任意操作，它与单据保存事件结束后才被触发执行，
 *   与单据保存并不在一个事务中。
 *
 *
 * @param gguid  要删除记录的gguid ，等同于主表的id
 * @param session  一个JSON对象，用于在整个单据保存过程中的各个事件之间传递数据。本事件做为单据保存的最后一个事件，session对象在使用后将被丢弃
 *
 *
 * @return 本函数不需要返回值
 *
 */
function afterBillSaveSuccessfulOnServer(gguid, session) {

    var corpid = getStringFromSQL("select corpid from dzpz_dy where id='" + gguid + "'");
    //2022.08.11优化，理论上不应该存在重复号码的凭证，但是加上max肯定没错，避免数据异常导致更新失败
    var sqls = ["update dzpz_dymx  set bz=null,pz_id= (select max(id) from dzpz_pz where dzpz_pz.pzh= dzpz_dymx.pzh and dzpz_pz.corpid='" + corpid + "' ) where gguid='" + gguid + "' ",
    "update dzpz_dymx  set bz='凭证号不存在' where  gguid='" + gguid + "' and not exists (select dzpz_pz.id from dzpz_pz where  dzpz_pz.pzh= dzpz_dymx.pzh  and dzpz_pz.corpid='" + corpid + "')  "

    ];

    runSQL("", sqls, true);
    println("----检测凭证是否存在完成---------")
}


/**
 * 用户任务提交后
 * @param flow 流程定义
 * @param node 开始节点
 * @param gguid 单据的gguid

 */

//@comment (group=工作流事件,caption=用户任务提交后)
function onUserTaskSubmitted(flow, userTask, gguid) {
    // println( flow.id) ; //流程定义的ID
    // println( userTask.name);
    println(JSON.stringify(userTask));
    println(gguid);
    if (userTask.id == 'id_60b3b08f27644fc18af35ba20ecd2bac') {
        var moreData = getStringFromSQL("select moredata from dzpz_dy where id='" + gguid + "'");
        try {
            moreData = JSON.parse(moreData);
            //起草后，递交后调用OA的接口回写数据
            if (moreData.form_id) {
                runTask('oa_callback', { requestid: moreData.form_id });
            }
        } catch (err) {

        }

    }

    if (userTask.id == 'id_6655df8bedc641aa9bacf1720d13ce2d') //领导审批通过后，就开始打包
    {
        //领导审批通过后，就开始打包
     //   do_package(gguid);
    }

    println(gguid + " " + userTask.name + " 提交完成")


}

//后台打包
function do_package(gguid) {
    var ret = JSON.parse(runTask("package", { gguid: gguid }));
    return ret;
}



function back_urlShare(url, d, t) {
    var ret = urlShare(url, d, "day", t);
    return ret.url;
}


id: 64afc3358b10ede23ae61415
scriptid: 60fa600f9932563b7c99baff
tablename: app_script
clientip: 0:0:0:0:0:0:0:1
username: sa
createdate: 2023.07.13 17:44:47.000
script:
/**
 * 单据点击保存，前端所有的操作被转译成3种操作:insert , delete , update ,
 *  并且可以在  beforeBillSaveOnServer 中返回一些SQL语句，可以在afterBillSaveOnServer中返回一些SQL语句
 *
 * 系统分别在需要的数据库连接中执行这些语句 ， 当所有语句执行成功后，事件被提交。一些细节如下 ：
 *
 * 1 如果单据中的表，属于不同的数据库连接，那么所有的SQL语句会以连接为单位，对语句进行批量执行
 * 2 这些语句的执行顺序是：对同一个数据库连接中的语句， 先执行 beforeBillSaveOnServer 中返回的SQL语句，再执行单据操作转译得到的SQL语句，
 *   再执行 afterBillSaveOnServer 中返回的SQL语句， 当多个（或一个）数据库连接执行完这些语句，且没有错误时，所有的数据库连接做提交，否则全部回滚
 * 3 不要在 beforeBillSaveOnServer 或 afterBillSaveOnServer 中直接执行数据库操作，而是返回SQL语句，让系统批量执行它们，并控制好事务
 * 4 当执行成功后，系统再执行事件函数  afterBillSaveSuccessfulOnServer 。 此事件中可以执行任意操作，它与单据保存事件结束后才被触发执行，
 *   与单据保存并不在一个事务中。
 *
 *
 * @param gguid  要删除记录的gguid ，等同于主表的id
 * @param session  一个JSON对象，用于在整个单据保存过程中的各个事件之间传递数据。本事件做为单据保存的最后一个事件，session对象在使用后将被丢弃
 *
 *
 * @return 本函数不需要返回值
 *
 */
function afterBillSaveSuccessfulOnServer(gguid, session) {

    var corpid = getStringFromSQL("select corpid from dzpz_dy where id='" + gguid + "'");
    //2022.08.11优化，理论上不应该存在重复号码的凭证，但是加上max肯定没错，避免数据异常导致更新失败
    var sqls = ["update dzpz_dymx  set bz=null,pz_id= (select max(id) from dzpz_pz where dzpz_pz.pzh= dzpz_dymx.pzh and dzpz_pz.corpid='" + corpid + "' ) where gguid='" + gguid + "' ",
    "update dzpz_dymx  set bz='凭证号不存在' where  gguid='" + gguid + "' and not exists (select dzpz_pz.id from dzpz_pz where  dzpz_pz.pzh= dzpz_dymx.pzh  and dzpz_pz.corpid='" + corpid + "')  "

    ];

    runSQL("", sqls, true);
    println("----检测凭证是否存在完成---------")
}


/**
 * 用户任务提交后
 * @param flow 流程定义
 * @param node 开始节点
 * @param gguid 单据的gguid

 */

//@comment (group=工作流事件,caption=用户任务提交后)
function onUserTaskSubmitted(flow, userTask, gguid) {
    // println( flow.id) ; //流程定义的ID
    // println( userTask.name);
    println(JSON.stringify(userTask));
    println(gguid);
    if (userTask.id == 'id_60b3b08f27644fc18af35ba20ecd2bac') {
        var moreData = getStringFromSQL("select moredata from dzpz_dy where id='" + gguid + "'");
        try {
            moreData = JSON.parse(moreData);
            //起草后，递交后调用OA的接口回写数据
            if (moreData.form_id) {
                runTask('oa_callback', { requestid: moreData.form_id });
            }
        } catch (err) {

        }

    }

    if (userTask.id == 'id_6655df8bedc641aa9bacf1720d13ce2d') //领导审批通过后，就开始打包
    {
        //领导审批通过后，就开始打包
        //2023.07.13 不要自动打包，等oa调用接口在打包，不然，oa没有通知就打包并发送邮件就不对了
     //   do_package(gguid);
    }

    println(gguid + " " + userTask.name + " 提交完成")


}

//后台打包
function do_package(gguid) {
    var ret = JSON.parse(runTask("package", { gguid: gguid }));
    return ret;
}



function back_urlShare(url, d, t) {
    var ret = urlShare(url, d, "day", t);
    return ret.url;
}


id: 64b8ffe78b10ede23ae615c2
scriptid: 649aa52d99329f5ca7253c1c
tablename: app_script
clientip: 0:0:0:0:0:0:0:1
username: sa
createdate: 2023.07.20 18:48:07.000
script:
/**
 * 脚本中心的脚本，以 main函数为执行入口，相关的参数放在arg中，它是一个JSON字符串化后的数据
 *
 */
function main(arg) {
    println(arg);
    var param = JSON.parse(arg);
    var gguid = newGUID();
    var moduleid = 'dy';//模块ID
    var username = getProperty( "/API创建调阅流程的起草人",  param.creator || "api");
    var userid = getUserIdByName(username);
    var leaderid= 18; //审核人ID
    var billno = newBillNo('', 'dzpz_dy', 'billno', '{11111111}', 'billdate', newDate(), "");
    var dzpz_dy_ds = newDataStore("", "select * from  dzpz_dy");
    dzpz_dy_ds.setUpdateProperty("dzpz_dy", "id", "*", "id");
    dzpz_dy_ds.insertRow(0);
    dzpz_dy_ds.setValue(0, {
        id: gguid, gguid: gguid, userid: userid, username: getStringFromSQL("select showname from app_user where id="+ userid )
         , billdate: newDate(), billno: billno,
        reader: param.dyr, 
        leaderid: leaderid , 
        summary: param.dyyy, corpid: '00',
        needwatermark: 0,//不打水印 
        filetype: 'zip', // 
        email: param.email,
        moredata: JSON.stringify(param.callback_param),
        action_after_pack:'sendMail'
    });

    var dzpz_dymx_ds = newDataStore("", "select * from dzpz_dymx");
    dzpz_dymx_ds.setUpdateProperty('dzpz_dymx', 'id', '*', "id");
    var pzh = param.pzh  ;
    if( pzh==undefined) pzh =[];
    for (var i = 0; i < pzh.length; i++) {
        var row = dzpz_dymx_ds.insertRow(9999999);
       // var code= getStringFromSQL("select code from pzdjex b  where  pzh = '"+pzh[i]+"'");
        dzpz_dymx_ds.setValue(row, { id: newGUID(), gguid: gguid, inner_xh: i + 1, pzh: pzh[i]    });
    }

    var err = updateAll(dzpz_dy_ds, dzpz_dymx_ds);
    if (err != '') return { success: false, messager: err };


    var corpid = getStringFromSQL("select corpid from dzpz_dy where id='" + gguid + "'");
    
    runSQL(""," update dzpz_dymx  set   code=  ( select min(b.code) as code  from pzdjex b  where  b.pzh =dzpz_dymx.pzh ) where  dzpz_dymx.gguid='" + gguid + "' " );
    var sqls = ["update dzpz_dymx  set bz=null,pz_id= (select max(id) from dzpz_pz where dzpz_pz.pzh= dzpz_dymx.pzh and dzpz_pz.corpid='" + corpid + "' ) where gguid='" + gguid + "' ",
                "update dzpz_dymx  set bz='凭证号不存在' where  gguid='" + gguid + "' and not exists (select dzpz_pz.id from dzpz_pz where  dzpz_pz.pzh= dzpz_dymx.pzh  and dzpz_pz.corpid='" + corpid + "')  " 
             
    ];
    runSQL("", sqls); 


    var config = {
        moduleid: moduleid,//凭证调阅模块代码或ID,
        gguid: gguid,
        flow: 'dy', //工作流的代码或ID
        userid: userid, //发起人ID
        subject: `${param.dyr || ''}因 [${param.dyyy || ''}] 调阅凭证`


    };

    var ret = newWork(config);

    if (!ret.success) return ret;

    //自动递交给初审
/*
    var t = taskInfoForWork('dy', gguid);

    //将任务递交下去，如果任务需要签收，则先签收     
    for (var i = 0; i < t.taskList.length; i++) {
        var task = t.taskList[i];

        //可以递交，那么递交下去
        if (task.canSubmit) println(submitWork(moduleid, gguid, task.taskId));
        //需要先签收 ，那么以第一个候选人签收它
        if (task.canClaim) claimWork(moduleid, gguid, task.taskId, task.candidateUserList[0].userId);

    }
*/

    ret.id = gguid;
    ret.billno= billno;
    return {success:true , id: gguid , content:{billno:billno}  };


}


id: 64b8ffe78b10ede23ae615cb
scriptid: 649aa52d99329f5ca7253c1c
tablename: app_script
clientip: 0:0:0:0:0:0:0:1
username: sa
createdate: 2023.07.20 18:49:34.000
script:
/**
 * 脚本中心的脚本，以 main函数为执行入口，相关的参数放在arg中，它是一个JSON字符串化后的数据
 *
 */
function main(arg) {
    println(arg);
    var param = JSON.parse(arg);
    var gguid = newGUID();
    var moduleid = 'dy';//模块ID
    var username = getProperty( "/API创建调阅流程的起草人",  param.creator || "api");
    var userid = getUserIdByName(username);
    var leaderid= 18; //审核人ID
    var billno = newBillNo('', 'dzpz_dy', 'billno', '{11111111}', 'billdate', newDate(), "");
    var dzpz_dy_ds = newDataStore("", "select * from  dzpz_dy");
    dzpz_dy_ds.setUpdateProperty("dzpz_dy", "id", "*", "id");
    dzpz_dy_ds.insertRow(0);
    dzpz_dy_ds.setValue(0, {
        id: gguid, gguid: gguid, userid: userid, username: getStringFromSQL("select showname from app_user where id="+ userid )
         , billdate: newDate(), billno: billno,
        reader: param.dyr, 
        leaderid: leaderid , 
        summary: param.dyyy, corpid: '00',
        needwatermark: 0,//不打水印 
        filetype: 'zip', // 
        email: param.email,
        moredata: JSON.stringify(param.callback_param),
        action_after_pack:'sendMail'
    });

    var dzpz_dymx_ds = newDataStore("", "select * from dzpz_dymx");
    dzpz_dymx_ds.setUpdateProperty('dzpz_dymx', 'id', '*', "id");
    var pzh = param.pzh  ;
    if( pzh==undefined) pzh =[];
    for (var i = 0; i < pzh.length; i++) {
        var row = dzpz_dymx_ds.insertRow(9999999);
       // var code= getStringFromSQL("select code from pzdjex b  where  pzh = '"+pzh[i]+"'");
        dzpz_dymx_ds.setValue(row, { id: newGUID(), gguid: gguid, inner_xh: i + 1, pzh: pzh[i]    });
    }

    var err = updateAll(dzpz_dy_ds, dzpz_dymx_ds);
    if (err != '') return { success: false, messager: err };


    var corpid = getStringFromSQL("select corpid from dzpz_dy where id='" + gguid + "'");
    
    runSQL(""," update dzpz_dymx  set   code= ( select min(b.code) as code  from pzdjex b  where  b.pzh =dzpz_dymx.pzh ) where  dzpz_dymx.gguid='" + gguid + "' ",true );
    var sqls = ["update dzpz_dymx  set bz=null,pz_id= (select max(id) from dzpz_pz where dzpz_pz.pzh= dzpz_dymx.pzh and dzpz_pz.corpid='" + corpid + "' ) where gguid='" + gguid + "' ",
                "update dzpz_dymx  set bz='凭证号不存在' where  gguid='" + gguid + "' and not exists (select dzpz_pz.id from dzpz_pz where  dzpz_pz.pzh= dzpz_dymx.pzh  and dzpz_pz.corpid='" + corpid + "')  " 
             
    ];
    runSQL("", sqls); 


    var config = {
        moduleid: moduleid,//凭证调阅模块代码或ID,
        gguid: gguid,
        flow: 'dy', //工作流的代码或ID
        userid: userid, //发起人ID
        subject: `${param.dyr || ''}因 [${param.dyyy || ''}] 调阅凭证`


    };

    var ret = newWork(config);

    if (!ret.success) return ret;

    //自动递交给初审
/*
    var t = taskInfoForWork('dy', gguid);

    //将任务递交下去，如果任务需要签收，则先签收     
    for (var i = 0; i < t.taskList.length; i++) {
        var task = t.taskList[i];

        //可以递交，那么递交下去
        if (task.canSubmit) println(submitWork(moduleid, gguid, task.taskId));
        //需要先签收 ，那么以第一个候选人签收它
        if (task.canClaim) claimWork(moduleid, gguid, task.taskId, task.candidateUserList[0].userId);

    }
*/

    ret.id = gguid;
    ret.billno= billno;
    return {success:true , id: gguid , content:{billno:billno}  };


}


id: 64c38a0f8b1077f2a5abdd44
scriptid: 60fa600f9932563b7c99bb03
tablename: app_template
clientip: 0:0:0:0:0:0:0:1
username: sa
createdate: 2023.07.28 17:31:53.000
script:
var g_currentUserIsOwner = false; //当前人是不是起草人





/**
 * 表单初始化完成后，执行此事件
 */
//@comment (group=表单事件,caption=表单初始化完成)
function formOpen() {
    book.showTabOnWhere = 'none';
    book.getWorkSheet('下载清单').visible = false;



    if ($dzpz_dy_ds.getString(0, "ziptaskid") == '') {
        book.sheet1.getBrick('cb_cancel').visible = false;
    }

    if (currentUserId() == $dzpz_dy_ds.getInt(0, "userid")) {
        g_currentUserIsOwner = true;
    }
    //按gguid分开接收消息，避免多个打包的消息混在一起
    onPushMessage("打包下载" + currentGUID(), function (info) {
        console.info(info);
        var msg = JSON.parse(info);
        if (msg.action == 'info') {
            console.info(msg.info);
            if (g_currentUserIsOwner) showInfoPane(msg.info);
        }

        if (msg.action == 'gameOver') {
            var result = msg.result;
            //$.alert(JSON.stringify(result));


            $dzpz_dy_ds.setValue(0, "ziptaskid", '', false);//清除打包任务id，因为已经ok了，但不要触发保存
            //不需要保存 ，因为打包完成脚本中已经回填了，仅在界面上回填一下， 方便显示下载清单
            $dzpz_dy_ds.setValue(0, "zipresult", JSON.stringify(result.zipFiles), false);

            console.dir(result);

            cb_package_onClick();

            hideInfoPane();
        }
        if (msg.action == 'over') {

            hideInfoPane();
        }

        if (msg.action == 'error') {
            $.alert(msg.info);
            hideInfoPane();
        }
    })

    $('.navbar-fixed-top').css("z-index", 1);

}
/**
 * 按钮点击事件
 * 当某个按钮被点击时， 首先触发  {按钮名称}_onClick 事件，然后触发 buttonOnClick事件
 * @param sheet  工作表
 * @param cell   按钮所在的单元格
 * @param button 按钮对象
 */
//@comment (group=按钮点击事件,caption=下载模板,needRightControl=false)
function cb_downloadTemplateFile_onClick(sheet, cell, button) {
    var title = "序号\t凭证号\t科目代码\t核算账号编号\t摘要";
    var data = [];
    data.push(title);
    data.push("1\t0001\t1001\tRD0001\tABC");
    data.push("2\t0002\t5501\tRD0002\tBBB");

    var f = $('#form_toexcel')[0];
    f.filename.value = "凭证调阅模板.xlsx";
    f.data.value = JSON.stringify(data);
    f.submit();

}

/**
 * 按钮点击事件
 * 当某个按钮被点击时， 首先触发  {按钮名称}_onClick 事件，然后触发 buttonOnClick事件
 * @param sheet  工作表
 * @param cell   按钮所在的单元格
 * @param button 按钮对象
 */
//@comment (group=按钮点击事件,caption=导入模板,needRightControl=false)
function cb_importFromExcelFile_onClick(sheet, cell, button) {
    toastr.info("*自动保存，准备导入");
    form.save(false, function () {
        book.readXLS(function (data) {
            showInfoPane("*正在导入");
            setTimeout(function () {
                importData(data);
            }, 10);
        });
    });

}



function safeValue(sheet, row, col) {
    if (row > sheet.length - 1) return null;
    var dataRow = sheet[row];
    if (dataRow == null) return null;
    if (col > dataRow.length - 1) return null;
    return dataRow[col];

}

//@comment (group=,caption=从Excel导入数据,needRightControl=false)
function importData(excelData) {
    var excelSheet = excelData[Object.keys(excelData)[0]];


    var headRow = 0; //题头在第几行
    var dataStartRow = 1;// 数据行从第几行开始

    var RC = excelSheet.length;

    book.sheet0.paintPermit = false;

    for (let row = dataStartRow; row < RC; row++) {
        let data = {
            pzh: safeValue(excelSheet, row, 1) || '',
            kmdm: safeValue(excelSheet, row, 2) || '',
            code: safeValue(excelSheet, row, 3) || '',
            memo: safeValue(excelSheet, row, 4) || '',
        }
        //alert(JSON.stringify(data));
        if (data.pzh == '') continue;
        let r = $dzpz_dymx_ds.insertRow(99999);
        $dzpz_dymx_ds.setValue(r, data);
    }


    showInfoPane("*正在保存并检测凭证号");
    form.save(false, function () {


        book.sheet0.paintPermit = false;
        toastr.info("导入完成");

    });
}




var dymx_changed = false;
/**
 * dsname结果集保存前，对row进行数据校验 ，
 * @param dsname 结果集名称
 * @param row  第row行
 * @returns {boolean} true表示检验通过， false表示校验不通过，update被终止
 */
function validate(dsname, row) {
    if (dsname == 'dzpz_dymx') dymx_changed = true;
    return true;
}

/**
 * 数据集中的数据发生变化
 * @param dsname 数据集名称
 * @param row   数据行号
 * @param col    字段名
 * @param oldValue   原值
 * @param newValue  新值
 */
function itemChanged(dsname, row, col, oldValue, newValue) {
    if (col == 'corpid') dymx_changed = true;

}



/**
 * 单据保存成功后执行本事件。如果单据不需要保存，或保存失败，则不执行本事件
 * @param GUID 当前单据的GGUID
 * @param action 当前单据正在进行的动作，比如 edit , view
 */
function afterSaveSuccessful(GGUID, action) {
    if (dymx_changed) form.loadBill(GGUID); //如果明细有变化，那么保存成功后，重新加载单据，因为在单据保存后，模板后端脚本中会同时更新  pz_id 及 bz
    dymx_changed = false;
}


//@comment (group=按钮点击事件,caption=取消打包,needRightControl=false)
function cb_redo_pack_onClick() {

    $confirm('', '确信要清除压缩文件吗?', function () {

        book.getWorkSheet('下载清单').popupDispose( ) ; 
        
        setTimeout(function () {
            showInfoPane("*正在删除已打包的文件");
            setTimeout(function () {
                $dzpz_dy_ds.setValue(0, "ziptaskid", '');
                $dzpz_dy_ds.setValue(0, "zipresult", '');
                form.save(false);
                $q_result_ds.reset();
                hideInfoPane();
                toastr.info("打包文件已经删除。当再次点击打包下载时会重新打包");
            }, 200);
        },1000);
    });


}

//@comment (group=按钮点击事件,caption=取消打包,needRightControl=false)
function cb_cancel_onClick() {

    $confirm('', '确信要终止打包吗?', function () {
        showInfoPane("*正在终止打包...");
        runTask("终止打包", {
            id: $dzpz_dy_ds.getString(0, "ziptaskid")
        },
            function (ret) {
                ret = JSON.parse(ret);
                
                    $dzpz_dy_ds.setValue(0, "ziptaskid", '');
                    $dzpz_dy_ds.setValue(0, "zipresult", '');

                    form.save(false);
                    hideInfoPane();
               
            });

    });
}

//@comment (group=按钮点击事件,caption=打包,needRightControl=false)
function cb_package_onClick() {

    form.save(false, function () {
        var ziptaskid = $dzpz_dy_ds.getString(0, "ziptaskid");
        if (ziptaskid != '') {
            toastr.info("正在压缩中...，请稍候");
            return;
        }

        var zipResult = $dzpz_dy_ds.getString(0, "zipresult");
        if (zipResult == '') {
            toastr.info("正在压缩文件，请稍候");
            do_package(currentGUID(), function (ret) {

                if (ret.success) {
                    $dzpz_dy_ds.setValue(0, "ziptaskid", ret.zipTaskId, false); //后台已经回写了，就里只要界面上更新就ok
                }
            });
            return;
        }

        zipResult = zipResult.replace(/&action=view/g, '&action=download');
        zipResult = JSON.parse(zipResult);
        $q_result_ds.reset();
        for (var i = 0; i < zipResult.length; i++) {
            var one = zipResult[i];
            var row = $q_result_ds.insertRow(999);
            $q_result_ds.setValue(row, one);


        }

        book.getWorkSheet('下载清单').popup("", "下载清单", 800, 300, true, true);
    });
}



function cb_package_onClick___() {

    if (form.isSaveNeeded()) {
        toastr.info("请先保存");
        return;
    }

    let ids = [];
    for (let i = 0; i < $dzpz_dymx_ds.rowCount; i++) {
        if ($dzpz_dymx_ds.getString(i, "pz_id") == '') {
            toastr.error("第" + (i + 1) + "行的凭证号不存在，请核对");
            return;
        }
        ids.push($dzpz_dymx_ds.getString(i, "pz_id"));
    }

    if (ids.length == 0) {
        toastr.info("没有凭证清单");
        return;
    }

    $confirm('', '确信要打包下载吗?', function () {
        showInfoPane("*正在压缩打包...");
        let fileName = formatDate(newDate(), "yyyyMMddHHmm") + ".zip";
        runTask("打包下载", {
            fileName: fileName,
            gguid: currentGUID(),
            ids: ids,
            watermark: $dzpz_dy_ds.getString(0, "billno") + "[" + $dzpz_dy_ds.getString(0, "reader") + "]" +
                formatDate(newDate(), "yyyy.MM.dd HH:mm")
        },
            function (ret) {
                ret = JSON.parse(ret);
                hideInfoPane();
                if (ret.success) {
                    let t = window.location.href;
                    let p = t.indexOf("billedit");
                    t = t.substring(0, p);
                    let url = t + ret.url;
                    $.alert(` <a href="${url}" target="_blank">点击下载${fileName}</a>`, `打包完成`);
                } else {
                    toastr.error(ret.message);
                }
            });

    });

}

/**
 * 按钮点击事件
 * 当某个按钮被点击时， 首先触发  {按钮名称}_onClick 事件，然后触发 buttonOnClick事件
 * @param sheet  工作表
 * @param cell   按钮所在的单元格
 * @param button 按钮对象
 */
//@comment (group=按钮点击事件,caption=调取凭证列表,needRightControl=false)
function cb_pzlist_onClick(sheet, cell, button) {
    // if (form.isSaveNeeded()) {
    //     toastr.info("请先保存");
    //     return;
    // }
    book.getWorkSheet("凭证资料查询").float('fa fa-cog', "凭证资料查询",
        {
            my: 'right-center',
            at: 'right-center',
            autoposition: 'down',
            offsetX: -5,
            offsetY: 5
        }, { width: '70%', height: '90%' });
    smartRetrieve(book.getWorkSheet("凭证资料查询"), "q_pzdjex")
}


/**
 * 按钮点击事件
 * 当某个按钮被点击时， 首先触发  {按钮名称}_onClick 事件，然后触发 buttonOnClick事件
 * @param sheet  工作表
 * @param cell   按钮所在的单元格
 * @param button 按钮对象
 */
//@comment (group=按钮点击事件,caption=选入,needRightControl=false)
function cb_import_onClick(sheet, cell, button) {
    book.getWorkSheet("detail").paintPermit = false;
    let row = book.getDataSource("dzpz_dymx").currentBindRow;

    for (var i = 0; i < $q_pzdjex_ds.getRowCount(); i++) {
        if ($q_pzdjex_ds.getString(i, "selected") == '1') {
            if ($dzpz_dymx_ds.getString(row, "pzh") != '' || row < 0) row = $dzpz_dymx_ds.insertRow(row + 1);
            $dzpz_dymx_ds.setValue(row, {
                pzh: $q_pzdjex_ds.getValue(i, "pzh"),
                kmdm: $q_pzdjex_ds.getValue(i, "kmdm"),
                code: $q_pzdjex_ds.getValue(i, "code"),
                memo: $q_pzdjex_ds.getString(i, "bz")
            });
        }
    }
    book.getDataSource("dzpz_dymx").currentBindRow = row;
    book.getWorkSheet("detail").View.insureSelectionOnScreen(null, false);
    do_removeDuplicated(); //删除重复项

    //********删除行号***********************************
    book.getWorkSheet("凭证资料查询").paintPermit = false;
    for (var i = $q_pzdjex_ds.getRowCount() - 1; i >= 0; i--) {
        if ($q_pzdjex_ds.getString(i, "selected") == '1') $q_pzdjex_ds.deleteRow(i);
    }
    book.getWorkSheet("凭证资料查询").paintPermit = true;
    //**************************************************

    book.getWorkSheet("detail").paintPermit = true;
    book.getWorkSheet("main").paintPermit = true;
}

/**
 * 按钮点击事件
 * 当某个按钮被点击时， 首先触发  {按钮名称}_onClick 事件，然后触发 buttonOnClick事件
 * @param sheet  工作表
 * @param cell   按钮所在的单元格
 * @param button 按钮对象
 */
//@comment (group=按钮点击事件,caption=,needRightControl=false)
function cb_opensheet_dr_onClick(sheet, cell, button) {
    book.getWorkSheet("凭证列表").float('fa fa-cog', "导入凭证列表",
        {
            my: 'right-center',
            at: 'right-center',
            autoposition: 'down',
            offsetX: -5,
            offsetY: 5
        }, { width: 400, height: '80%' });

}

/**
 * 按钮点击事件
 * 当某个按钮被点击时， 首先触发  {按钮名称}_onClick 事件，然后触发 buttonOnClick事件
 * @param sheet  工作表
 * @param cell   按钮所在的单元格
 * @param button 按钮对象
 */
//@comment (group=按钮点击事件,caption=粘贴界面导入,needRightControl=false)
function cb_dr_onClick(sheet, cell, button) {

    book.getWorkSheet("detail").paintPermit = false;
    let row = book.getDataSource("dzpz_dymx").currentBindRow;
    let pzlist = sheet.cells('pzlist').getValueString().split('\n');
    for (let i = 0; i < pzlist.length; i++) {
        if (pzlist[i] !== '') {
            if ($dzpz_dymx_ds.getString(row, "pzh") != '' || row < 0) row = $dzpz_dymx_ds.insertRow(row + 1);

            $dzpz_dymx_ds.setValue(row, {
                pzh: pzlist[i]
            });
        }
    }
    sheet.cells('pzlist').setValue(null);
    sheet.floatPanelClose();

    book.getWorkSheet("detail").paintPermit = true;

}
/**
 * 单元格因为被编辑而改变。当用户通过编辑单元的值而让单元格发生值改变时本事件被触发。
 * 注意，当使用脚本 sheet.cells(row,col).setValue ( value) 来改变单元格的值时，本事件并不触发
 * @param sheet
 * @param cell
 * @param newValue
 * @param innerRow   当单元格没有绑定数据库或绑定到单行数据库时，本参数无意义。如果绑定一个
 * 多行数据库，则表示该单元所绑定的字段的第 innerRow行发生变化
 */
function cellValueChangedByEdit(sheet, cell, newValue, innerRow) {

    //通过数据库绑定情况来判断

    //通过别名来判断
    if (sheet.name == 'detail' && cell.alias == 'st_selectAll') {
        let ds = $dzpz_dymx_ds;
        sheet.paintPermit = false;
        for (var i = 0; i < ds.getRowCount(); i++) {
            ds.setValue(i, "selected", newValue);
        }
        sheet.paintPermit = true;
    }
    if (sheet.name == '凭证资料查询' && cell.alias == 'st_selectAll') {
        let ds = $q_pzdjex_ds;
        sheet.paintPermit = false;
        for (var i = 0; i < ds.getRowCount(); i++) {
            ds.setValue(i, "selected", newValue);
        }
        sheet.paintPermit = true;
    }

    let bind = cell.bind;
    if (bind != null && bind.dataSource == 'dzpz_dymx' && bind.DBCol == 'pzh') {
        showInfoPane('*正在分析凭证号');
        setTimeout(function () {
            do_paste_pzlist(innerRow, newValue) //写入凭证号
        }, 100);
    }
    if (bind != null && bind.dataSource == 'dzpz_dy' && bind.DBCol == 'reader') {
        $dzpz_dy_ds.setValue(0, {
            watermark: '【' + $dzpz_dy_ds.getString(0, "reader") + '】仅用于项目专项审计或检查' 
        })
    }



}

/**
 * 单元格编辑时粘贴内容后触发此事件。
 * @param sheet
 * @param cell
 * @param innerRow   当单元格没有绑定数据库或绑定到单行数据库时，本参数无意义。如果绑定一个
 * 多行数据库，则表示该单元所绑定的字段的第 innerRow行被粘贴了内容
 * @param text 当前单元格编辑框中的内容，并不一定是粘贴的内容，是单元格编辑框中原有的内容加上粘贴的内容
 */
//@comment (group=单元格事件,caption=单元格粘贴内容)
function cellOnPaste(sheet, cell, innerRow, text) {

    //通过别名来判断
    if (cell.alias == 'XXX') {

    }

    //通过数据库绑定情况来判断
    let bind = cell.bind;
    if (bind != null && bind.dataSource == 'dzpz_dymx' && bind.DBCol == 'pzh') {
        sheet.View.forceCurrentEditControlGiveUpFocus();
    }

}


/**
 * 按钮点击事件
 * 当某个按钮被点击时， 首先触发  {按钮名称}_onClick 事件，然后触发 buttonOnClick事件
 * @param sheet  工作表
 * @param cell   按钮所在的单元格
 * @param button 按钮对象
 */
//@comment (group=do,caption=凭证列表粘贴凭证清单后自动后插并赋值,needRightControl=false)
function do_paste_pzlist(innerRow, newValue) {

    if (newValue == null || newValue == '') return;
    let data = newValue.split(' ');
    book.getWorkSheet("detail").paintPermit = false;
    let row = innerRow;
    for (let i = 0; i < data.length; i++) {
        //row = $dzpz_dymx_ds.insertRow(row + 1);
        if (data[i] != '') {
            $dzpz_dymx_ds.setValue(row, {
                pzh: data[i],
                selected: 1
            });
            if (i < data.length - 1) row = $dzpz_dymx_ds.insertRow(row + 1);
        }
    }
    book.getDataSource("dzpz_dymx").currentBindRow = row;
    book.getWorkSheet("detail").View.insureSelectionOnScreen(null, false);
    do_removeDuplicated(); //删除重复项
    book.getWorkSheet("detail").paintPermit = true;
    book.getWorkSheet("main").paintPermit = true;
    hideInfoPane();
}







//@comment (group=,caption=异步打包,needRightControl=false)
function async_package() {

    if (form.isSaveNeeded()) {
        toastr.info("请先保存");
        return;
    }

    let ids = [];
    for (let i = 0; i < $dzpz_dymx_ds.rowCount; i++) {
        if ($dzpz_dymx_ds.getString(i, "pz_id") == '') {
            toastr.error("第" + (i + 1) + "行的凭证号不存在，请核对");
            return;
        }
        ids.push($dzpz_dymx_ds.getString(i, "pz_id"));
    }

    if (ids.length == 0) {
        toastr.info("没有凭证清单");
        return;
    }

    $confirm('', '确信要重新打包吗?', function () {
        showInfoPane("*正在后台打包...");
        let fileName = $dzpz_dy_ds.getString(0, "reader") +
            formatDate(newDate(), "yyyy.MM.dd HH:mm") + "调阅凭证.zip";
        runTask("后台打包", {
            gguid: currentGUID(),
            fileName: fileName,
            ids: ids,
            watermark: $dzpz_dy_ds.getInt(0, "needwatermark") == 0 ? "" : ($dzpz_dy_ds.getString(0, "reader") + "/" + formatDate($dzpz_dy_ds.getValue(0, "billdate"), "yyyy.MM.dd HH:mm") + "\n" + $dzpz_dy_ds.getString(0, "watermark")),
            mergePDF: $dzpz_dy_ds.getString(0, "filetype") == 'pdf' //是否合并成一个pdf文件
        },
            function (ret) {
                ret = JSON.parse(ret);
                hideInfoPane();
                if (ret.success) {
                    $dzpz_dy_ds.setValue(0, "ziptaskid", ret.zipTaskId);
                    form.save(false);
                    hideInfoPane();

                } else {
                    toastr.error(ret.message);
                }
            });

    });


}

//@comment (group=按钮点击事件,caption=标记重复,needRightControl=false)
function cb_qc_onClick() {
    showInfoPane("*正在检测重复的凭证");
    var map = {};
    for (var i = 0; i < $dzpz_dymx_ds.rowCount; i++) {
        var pzh = $dzpz_dymx_ds.getString(i, "pzh");
        if (pzh == '') continue;
        if (map[pzh] == undefined) map[pzh] = []; //每个凭证号映射到一个数组，记录它所在的行号
        map[pzh].push(i); // 记录下凭证号对应的行号

    }

    book.getWorkSheet('detail').paintPermit = false;
    for (pzh in map) {
        var rows = map[pzh];
        $dzpz_dymx_ds.setValue(rows[0], "bz", "");
        for (var i = 1; i < rows.length; i++) {
            $dzpz_dymx_ds.setValue(rows[i], "bz", "与第" + (rows[0] + 1) + "行重复");
        }
    }
    book.getWorkSheet('detail').paintPermit = true;
    hideInfoPane();
}

//@comment (group=按钮点击事件,caption=删除重复的,needRightControl=false)
function cb_removeDuplicated_onClick() {

    $confirm('', '确信要清除重复的凭证号吗?', function () {

        do_removeDuplicated()

    });

}


//@comment (group=do,caption=执行删除重复的,needRightControl=false)
function do_removeDuplicated() {

    showInfoPane("*正在删除重复的凭证");
    book.getWorkSheet('detail').paintPermit = false;
    var pzhs = []; //凭证号清单
    var rows = [];// 需要删除的行号
    for (var i = 0; i < $dzpz_dymx_ds.rowCount; i++) {
        var pzh = $dzpz_dymx_ds.getString(i, "pzh");
        if (pzhs.contains(pzh)) //此凭证号此前已经出现过
        {
            rows.push(i);//  需要删除
        } else {
            pzhs.push(pzh); //没有出现过，那么加它到凭证号清单中
        }
    }
    //现在反着删除
    for (var i = rows.length - 1; i >= 0; i--) {
        $dzpz_dymx_ds.deleteRow(rows[i]);
    }
    //form.save(false);
    book.getWorkSheet('detail').paintPermit = false;
    hideInfoPane();
}



/**
 * 按钮点击事件
 * 当某个按钮被点击时， 首先触发  {按钮名称}_onClick 事件，然后触发 buttonOnClick事件
 * @param sheet  工作表
 * @param cell   按钮所在的单元格
 * @param button 按钮对象
 */
//@comment (group=按钮点击事件,caption=批量删除已选中记录,needRightControl=false)
function cb_selectedRow_delete_onClick(sheet, cell, button) {
    $confirm("提示", "确定要删除选中的记录吗?", function () {
        book.getWorkSheet('detail').paintPermit = false;
        for (let i = $dzpz_dymx_ds.getRowCount() - 1; i >= 0; i--) {
            if ($dzpz_dymx_ds.getInt(i, "selected") == 1) $dzpz_dymx_ds.deleteRow(i);
        }
        if ($dzpz_dymx_ds.getRowCount() == 0) $dzpz_dymx_ds.insertRow(0);
        book.getWorkSheet('detail').cells("st_selectAll").setValue(0);
        book.getWorkSheet('detail').paintPermit = true;
    }, function () { });



}

function copyURL(url)
{

    let s = getServiceHomeURL( 'app')+  url;
    let d= book.sheet3.cells("days").getValueInt();
    let t =book.sheet3.cells("times").getValueInt();
    s=  back_urlShare(s, d , t);
     $setClipboard( s); 
    toastr.info("分享地址已经复制到剪贴板");
}


id: 64c38a0f8b1077f2a5abdd4a
scriptid: 60fa600f9932563b7c99bb03
tablename: app_template
clientip: 0:0:0:0:0:0:0:1
username: sa
createdate: 2023.07.28 17:33:02.000
script:
var g_currentUserIsOwner = false; //当前人是不是起草人





/**
 * 表单初始化完成后，执行此事件
 */
//@comment (group=表单事件,caption=表单初始化完成)
function formOpen() {
    book.showTabOnWhere = 'none';
    book.getWorkSheet('下载清单').visible = false;



    if ($dzpz_dy_ds.getString(0, "ziptaskid") == '') {
        book.sheet1.getBrick('cb_cancel').visible = false;
    }

    if (currentUserId() == $dzpz_dy_ds.getInt(0, "userid")) {
        g_currentUserIsOwner = true;
    }
    //按gguid分开接收消息，避免多个打包的消息混在一起
    onPushMessage("打包下载" + currentGUID(), function (info) {
        console.info(info);
        var msg = JSON.parse(info);
        if (msg.action == 'info') {
            console.info(msg.info);
            if (g_currentUserIsOwner) showInfoPane(msg.info);
        }

        if (msg.action == 'gameOver') {
            var result = msg.result;
            //$.alert(JSON.stringify(result));


            $dzpz_dy_ds.setValue(0, "ziptaskid", '', false);//清除打包任务id，因为已经ok了，但不要触发保存
            //不需要保存 ，因为打包完成脚本中已经回填了，仅在界面上回填一下， 方便显示下载清单
            $dzpz_dy_ds.setValue(0, "zipresult", JSON.stringify(result.zipFiles), false);

            console.dir(result);

            cb_package_onClick();

            hideInfoPane();
        }
        if (msg.action == 'over') {

            hideInfoPane();
        }

        if (msg.action == 'error') {
            $.alert(msg.info);
            hideInfoPane();
        }
    })

    $('.navbar-fixed-top').css("z-index", 1);

}
/**
 * 按钮点击事件
 * 当某个按钮被点击时， 首先触发  {按钮名称}_onClick 事件，然后触发 buttonOnClick事件
 * @param sheet  工作表
 * @param cell   按钮所在的单元格
 * @param button 按钮对象
 */
//@comment (group=按钮点击事件,caption=下载模板,needRightControl=false)
function cb_downloadTemplateFile_onClick(sheet, cell, button) {
    var title = "序号\t凭证号\t科目代码\t核算账号编号\t摘要";
    var data = [];
    data.push(title);
    data.push("1\t0001\t1001\tRD0001\tABC");
    data.push("2\t0002\t5501\tRD0002\tBBB");

    var f = $('#form_toexcel')[0];
    f.filename.value = "凭证调阅模板.xlsx";
    f.data.value = JSON.stringify(data);
    f.submit();

}

/**
 * 按钮点击事件
 * 当某个按钮被点击时， 首先触发  {按钮名称}_onClick 事件，然后触发 buttonOnClick事件
 * @param sheet  工作表
 * @param cell   按钮所在的单元格
 * @param button 按钮对象
 */
//@comment (group=按钮点击事件,caption=导入模板,needRightControl=false)
function cb_importFromExcelFile_onClick(sheet, cell, button) {
    toastr.info("*自动保存，准备导入");
    form.save(false, function () {
        book.readXLS(function (data) {
            showInfoPane("*正在导入");
            setTimeout(function () {
                importData(data);
            }, 10);
        });
    });

}



function safeValue(sheet, row, col) {
    if (row > sheet.length - 1) return null;
    var dataRow = sheet[row];
    if (dataRow == null) return null;
    if (col > dataRow.length - 1) return null;
    return dataRow[col];

}

//@comment (group=,caption=从Excel导入数据,needRightControl=false)
function importData(excelData) {
    var excelSheet = excelData[Object.keys(excelData)[0]];


    var headRow = 0; //题头在第几行
    var dataStartRow = 1;// 数据行从第几行开始

    var RC = excelSheet.length;

    book.sheet0.paintPermit = false;

    for (let row = dataStartRow; row < RC; row++) {
        let data = {
            pzh: safeValue(excelSheet, row, 1) || '',
            kmdm: safeValue(excelSheet, row, 2) || '',
            code: safeValue(excelSheet, row, 3) || '',
            memo: safeValue(excelSheet, row, 4) || '',
        }
        //alert(JSON.stringify(data));
        if (data.pzh == '') continue;
        let r = $dzpz_dymx_ds.insertRow(99999);
        $dzpz_dymx_ds.setValue(r, data);
    }


    showInfoPane("*正在保存并检测凭证号");
    form.save(false, function () {


        book.sheet0.paintPermit = false;
        toastr.info("导入完成");

    });
}




var dymx_changed = false;
/**
 * dsname结果集保存前，对row进行数据校验 ，
 * @param dsname 结果集名称
 * @param row  第row行
 * @returns {boolean} true表示检验通过， false表示校验不通过，update被终止
 */
function validate(dsname, row) {
    if (dsname == 'dzpz_dymx') dymx_changed = true;
    return true;
}

/**
 * 数据集中的数据发生变化
 * @param dsname 数据集名称
 * @param row   数据行号
 * @param col    字段名
 * @param oldValue   原值
 * @param newValue  新值
 */
function itemChanged(dsname, row, col, oldValue, newValue) {
    if (col == 'corpid') dymx_changed = true;

}



/**
 * 单据保存成功后执行本事件。如果单据不需要保存，或保存失败，则不执行本事件
 * @param GUID 当前单据的GGUID
 * @param action 当前单据正在进行的动作，比如 edit , view
 */
function afterSaveSuccessful(GGUID, action) {
    if (dymx_changed) form.loadBill(GGUID); //如果明细有变化，那么保存成功后，重新加载单据，因为在单据保存后，模板后端脚本中会同时更新  pz_id 及 bz
    dymx_changed = false;
}


//@comment (group=按钮点击事件,caption=取消打包,needRightControl=false)
function cb_redo_pack_onClick() {

    $confirm('', '确信要清除压缩文件吗?', function () {

        book.getWorkSheet('下载清单').popupDispose();

        setTimeout(function () {
            showInfoPane("*正在删除已打包的文件");
            setTimeout(function () {
                $dzpz_dy_ds.setValue(0, "ziptaskid", '');
                $dzpz_dy_ds.setValue(0, "zipresult", '');
                form.save(false);
                $q_result_ds.reset();
                hideInfoPane();
                toastr.info("打包文件已经删除。当再次点击打包下载时会重新打包");
            }, 200);
        }, 1000);
    });


}

//@comment (group=按钮点击事件,caption=取消打包,needRightControl=false)
function cb_cancel_onClick() {

    $confirm('', '确信要终止打包吗?', function () {
        showInfoPane("*正在终止打包...");
        runTask("终止打包", {
            id: $dzpz_dy_ds.getString(0, "ziptaskid")
        });

        $dzpz_dy_ds.setValue(0, "ziptaskid", '');
        $dzpz_dy_ds.setValue(0, "zipresult", '');

        form.save(false);
        hideInfoPane();



    });
}

//@comment (group=按钮点击事件,caption=打包,needRightControl=false)
function cb_package_onClick() {

    form.save(false, function () {
        var ziptaskid = $dzpz_dy_ds.getString(0, "ziptaskid");
        if (ziptaskid != '') {
            toastr.info("正在压缩中...，请稍候");
            return;
        }

        var zipResult = $dzpz_dy_ds.getString(0, "zipresult");
        if (zipResult == '') {
            toastr.info("正在压缩文件，请稍候");
            do_package(currentGUID(), function (ret) {

                if (ret.success) {
                    $dzpz_dy_ds.setValue(0, "ziptaskid", ret.zipTaskId, false); //后台已经回写了，就里只要界面上更新就ok
                }
            });
            return;
        }

        zipResult = zipResult.replace(/&action=view/g, '&action=download');
        zipResult = JSON.parse(zipResult);
        $q_result_ds.reset();
        for (var i = 0; i < zipResult.length; i++) {
            var one = zipResult[i];
            var row = $q_result_ds.insertRow(999);
            $q_result_ds.setValue(row, one);


        }

        book.getWorkSheet('下载清单').popup("", "下载清单", 800, 300, true, true);
    });
}



function cb_package_onClick___() {

    if (form.isSaveNeeded()) {
        toastr.info("请先保存");
        return;
    }

    let ids = [];
    for (let i = 0; i < $dzpz_dymx_ds.rowCount; i++) {
        if ($dzpz_dymx_ds.getString(i, "pz_id") == '') {
            toastr.error("第" + (i + 1) + "行的凭证号不存在，请核对");
            return;
        }
        ids.push($dzpz_dymx_ds.getString(i, "pz_id"));
    }

    if (ids.length == 0) {
        toastr.info("没有凭证清单");
        return;
    }

    $confirm('', '确信要打包下载吗?', function () {
        showInfoPane("*正在压缩打包...");
        let fileName = formatDate(newDate(), "yyyyMMddHHmm") + ".zip";
        runTask("打包下载", {
            fileName: fileName,
            gguid: currentGUID(),
            ids: ids,
            watermark: $dzpz_dy_ds.getString(0, "billno") + "[" + $dzpz_dy_ds.getString(0, "reader") + "]" +
                formatDate(newDate(), "yyyy.MM.dd HH:mm")
        },
            function (ret) {
                ret = JSON.parse(ret);
                hideInfoPane();
                if (ret.success) {
                    let t = window.location.href;
                    let p = t.indexOf("billedit");
                    t = t.substring(0, p);
                    let url = t + ret.url;
                    $.alert(` <a href="${url}" target="_blank">点击下载${fileName}</a>`, `打包完成`);
                } else {
                    toastr.error(ret.message);
                }
            });

    });

}

/**
 * 按钮点击事件
 * 当某个按钮被点击时， 首先触发  {按钮名称}_onClick 事件，然后触发 buttonOnClick事件
 * @param sheet  工作表
 * @param cell   按钮所在的单元格
 * @param button 按钮对象
 */
//@comment (group=按钮点击事件,caption=调取凭证列表,needRightControl=false)
function cb_pzlist_onClick(sheet, cell, button) {
    // if (form.isSaveNeeded()) {
    //     toastr.info("请先保存");
    //     return;
    // }
    book.getWorkSheet("凭证资料查询").float('fa fa-cog', "凭证资料查询",
        {
            my: 'right-center',
            at: 'right-center',
            autoposition: 'down',
            offsetX: -5,
            offsetY: 5
        }, { width: '70%', height: '90%' });
    smartRetrieve(book.getWorkSheet("凭证资料查询"), "q_pzdjex")
}


/**
 * 按钮点击事件
 * 当某个按钮被点击时， 首先触发  {按钮名称}_onClick 事件，然后触发 buttonOnClick事件
 * @param sheet  工作表
 * @param cell   按钮所在的单元格
 * @param button 按钮对象
 */
//@comment (group=按钮点击事件,caption=选入,needRightControl=false)
function cb_import_onClick(sheet, cell, button) {
    book.getWorkSheet("detail").paintPermit = false;
    let row = book.getDataSource("dzpz_dymx").currentBindRow;

    for (var i = 0; i < $q_pzdjex_ds.getRowCount(); i++) {
        if ($q_pzdjex_ds.getString(i, "selected") == '1') {
            if ($dzpz_dymx_ds.getString(row, "pzh") != '' || row < 0) row = $dzpz_dymx_ds.insertRow(row + 1);
            $dzpz_dymx_ds.setValue(row, {
                pzh: $q_pzdjex_ds.getValue(i, "pzh"),
                kmdm: $q_pzdjex_ds.getValue(i, "kmdm"),
                code: $q_pzdjex_ds.getValue(i, "code"),
                memo: $q_pzdjex_ds.getString(i, "bz")
            });
        }
    }
    book.getDataSource("dzpz_dymx").currentBindRow = row;
    book.getWorkSheet("detail").View.insureSelectionOnScreen(null, false);
    do_removeDuplicated(); //删除重复项

    //********删除行号***********************************
    book.getWorkSheet("凭证资料查询").paintPermit = false;
    for (var i = $q_pzdjex_ds.getRowCount() - 1; i >= 0; i--) {
        if ($q_pzdjex_ds.getString(i, "selected") == '1') $q_pzdjex_ds.deleteRow(i);
    }
    book.getWorkSheet("凭证资料查询").paintPermit = true;
    //**************************************************

    book.getWorkSheet("detail").paintPermit = true;
    book.getWorkSheet("main").paintPermit = true;
}

/**
 * 按钮点击事件
 * 当某个按钮被点击时， 首先触发  {按钮名称}_onClick 事件，然后触发 buttonOnClick事件
 * @param sheet  工作表
 * @param cell   按钮所在的单元格
 * @param button 按钮对象
 */
//@comment (group=按钮点击事件,caption=,needRightControl=false)
function cb_opensheet_dr_onClick(sheet, cell, button) {
    book.getWorkSheet("凭证列表").float('fa fa-cog', "导入凭证列表",
        {
            my: 'right-center',
            at: 'right-center',
            autoposition: 'down',
            offsetX: -5,
            offsetY: 5
        }, { width: 400, height: '80%' });

}

/**
 * 按钮点击事件
 * 当某个按钮被点击时， 首先触发  {按钮名称}_onClick 事件，然后触发 buttonOnClick事件
 * @param sheet  工作表
 * @param cell   按钮所在的单元格
 * @param button 按钮对象
 */
//@comment (group=按钮点击事件,caption=粘贴界面导入,needRightControl=false)
function cb_dr_onClick(sheet, cell, button) {

    book.getWorkSheet("detail").paintPermit = false;
    let row = book.getDataSource("dzpz_dymx").currentBindRow;
    let pzlist = sheet.cells('pzlist').getValueString().split('\n');
    for (let i = 0; i < pzlist.length; i++) {
        if (pzlist[i] !== '') {
            if ($dzpz_dymx_ds.getString(row, "pzh") != '' || row < 0) row = $dzpz_dymx_ds.insertRow(row + 1);

            $dzpz_dymx_ds.setValue(row, {
                pzh: pzlist[i]
            });
        }
    }
    sheet.cells('pzlist').setValue(null);
    sheet.floatPanelClose();

    book.getWorkSheet("detail").paintPermit = true;

}
/**
 * 单元格因为被编辑而改变。当用户通过编辑单元的值而让单元格发生值改变时本事件被触发。
 * 注意，当使用脚本 sheet.cells(row,col).setValue ( value) 来改变单元格的值时，本事件并不触发
 * @param sheet
 * @param cell
 * @param newValue
 * @param innerRow   当单元格没有绑定数据库或绑定到单行数据库时，本参数无意义。如果绑定一个
 * 多行数据库，则表示该单元所绑定的字段的第 innerRow行发生变化
 */
function cellValueChangedByEdit(sheet, cell, newValue, innerRow) {

    //通过数据库绑定情况来判断

    //通过别名来判断
    if (sheet.name == 'detail' && cell.alias == 'st_selectAll') {
        let ds = $dzpz_dymx_ds;
        sheet.paintPermit = false;
        for (var i = 0; i < ds.getRowCount(); i++) {
            ds.setValue(i, "selected", newValue);
        }
        sheet.paintPermit = true;
    }
    if (sheet.name == '凭证资料查询' && cell.alias == 'st_selectAll') {
        let ds = $q_pzdjex_ds;
        sheet.paintPermit = false;
        for (var i = 0; i < ds.getRowCount(); i++) {
            ds.setValue(i, "selected", newValue);
        }
        sheet.paintPermit = true;
    }

    let bind = cell.bind;
    if (bind != null && bind.dataSource == 'dzpz_dymx' && bind.DBCol == 'pzh') {
        showInfoPane('*正在分析凭证号');
        setTimeout(function () {
            do_paste_pzlist(innerRow, newValue) //写入凭证号
        }, 100);
    }
    if (bind != null && bind.dataSource == 'dzpz_dy' && bind.DBCol == 'reader') {
        $dzpz_dy_ds.setValue(0, {
            watermark: '【' + $dzpz_dy_ds.getString(0, "reader") + '】仅用于项目专项审计或检查'
        })
    }



}

/**
 * 单元格编辑时粘贴内容后触发此事件。
 * @param sheet
 * @param cell
 * @param innerRow   当单元格没有绑定数据库或绑定到单行数据库时，本参数无意义。如果绑定一个
 * 多行数据库，则表示该单元所绑定的字段的第 innerRow行被粘贴了内容
 * @param text 当前单元格编辑框中的内容，并不一定是粘贴的内容，是单元格编辑框中原有的内容加上粘贴的内容
 */
//@comment (group=单元格事件,caption=单元格粘贴内容)
function cellOnPaste(sheet, cell, innerRow, text) {

    //通过别名来判断
    if (cell.alias == 'XXX') {

    }

    //通过数据库绑定情况来判断
    let bind = cell.bind;
    if (bind != null && bind.dataSource == 'dzpz_dymx' && bind.DBCol == 'pzh') {
        sheet.View.forceCurrentEditControlGiveUpFocus();
    }

}


/**
 * 按钮点击事件
 * 当某个按钮被点击时， 首先触发  {按钮名称}_onClick 事件，然后触发 buttonOnClick事件
 * @param sheet  工作表
 * @param cell   按钮所在的单元格
 * @param button 按钮对象
 */
//@comment (group=do,caption=凭证列表粘贴凭证清单后自动后插并赋值,needRightControl=false)
function do_paste_pzlist(innerRow, newValue) {

    if (newValue == null || newValue == '') return;
    let data = newValue.split(' ');
    book.getWorkSheet("detail").paintPermit = false;
    let row = innerRow;
    for (let i = 0; i < data.length; i++) {
        //row = $dzpz_dymx_ds.insertRow(row + 1);
        if (data[i] != '') {
            $dzpz_dymx_ds.setValue(row, {
                pzh: data[i],
                selected: 1
            });
            if (i < data.length - 1) row = $dzpz_dymx_ds.insertRow(row + 1);
        }
    }
    book.getDataSource("dzpz_dymx").currentBindRow = row;
    book.getWorkSheet("detail").View.insureSelectionOnScreen(null, false);
    do_removeDuplicated(); //删除重复项
    book.getWorkSheet("detail").paintPermit = true;
    book.getWorkSheet("main").paintPermit = true;
    hideInfoPane();
}







//@comment (group=,caption=异步打包,needRightControl=false)
function async_package() {

    if (form.isSaveNeeded()) {
        toastr.info("请先保存");
        return;
    }

    let ids = [];
    for (let i = 0; i < $dzpz_dymx_ds.rowCount; i++) {
        if ($dzpz_dymx_ds.getString(i, "pz_id") == '') {
            toastr.error("第" + (i + 1) + "行的凭证号不存在，请核对");
            return;
        }
        ids.push($dzpz_dymx_ds.getString(i, "pz_id"));
    }

    if (ids.length == 0) {
        toastr.info("没有凭证清单");
        return;
    }

    $confirm('', '确信要重新打包吗?', function () {
        showInfoPane("*正在后台打包...");
        let fileName = $dzpz_dy_ds.getString(0, "reader") +
            formatDate(newDate(), "yyyy.MM.dd HH:mm") + "调阅凭证.zip";
        runTask("后台打包", {
            gguid: currentGUID(),
            fileName: fileName,
            ids: ids,
            watermark: $dzpz_dy_ds.getInt(0, "needwatermark") == 0 ? "" : ($dzpz_dy_ds.getString(0, "reader") + "/" + formatDate($dzpz_dy_ds.getValue(0, "billdate"), "yyyy.MM.dd HH:mm") + "\n" + $dzpz_dy_ds.getString(0, "watermark")),
            mergePDF: $dzpz_dy_ds.getString(0, "filetype") == 'pdf' //是否合并成一个pdf文件
        },
            function (ret) {
                ret = JSON.parse(ret);
                hideInfoPane();
                if (ret.success) {
                    $dzpz_dy_ds.setValue(0, "ziptaskid", ret.zipTaskId);
                    form.save(false);
                    hideInfoPane();

                } else {
                    toastr.error(ret.message);
                }
            });

    });


}

//@comment (group=按钮点击事件,caption=标记重复,needRightControl=false)
function cb_qc_onClick() {
    showInfoPane("*正在检测重复的凭证");
    var map = {};
    for (var i = 0; i < $dzpz_dymx_ds.rowCount; i++) {
        var pzh = $dzpz_dymx_ds.getString(i, "pzh");
        if (pzh == '') continue;
        if (map[pzh] == undefined) map[pzh] = []; //每个凭证号映射到一个数组，记录它所在的行号
        map[pzh].push(i); // 记录下凭证号对应的行号

    }

    book.getWorkSheet('detail').paintPermit = false;
    for (pzh in map) {
        var rows = map[pzh];
        $dzpz_dymx_ds.setValue(rows[0], "bz", "");
        for (var i = 1; i < rows.length; i++) {
            $dzpz_dymx_ds.setValue(rows[i], "bz", "与第" + (rows[0] + 1) + "行重复");
        }
    }
    book.getWorkSheet('detail').paintPermit = true;
    hideInfoPane();
}

//@comment (group=按钮点击事件,caption=删除重复的,needRightControl=false)
function cb_removeDuplicated_onClick() {

    $confirm('', '确信要清除重复的凭证号吗?', function () {

        do_removeDuplicated()

    });

}


//@comment (group=do,caption=执行删除重复的,needRightControl=false)
function do_removeDuplicated() {

    showInfoPane("*正在删除重复的凭证");
    book.getWorkSheet('detail').paintPermit = false;
    var pzhs = []; //凭证号清单
    var rows = [];// 需要删除的行号
    for (var i = 0; i < $dzpz_dymx_ds.rowCount; i++) {
        var pzh = $dzpz_dymx_ds.getString(i, "pzh");
        if (pzhs.contains(pzh)) //此凭证号此前已经出现过
        {
            rows.push(i);//  需要删除
        } else {
            pzhs.push(pzh); //没有出现过，那么加它到凭证号清单中
        }
    }
    //现在反着删除
    for (var i = rows.length - 1; i >= 0; i--) {
        $dzpz_dymx_ds.deleteRow(rows[i]);
    }
    //form.save(false);
    book.getWorkSheet('detail').paintPermit = false;
    hideInfoPane();
}



/**
 * 按钮点击事件
 * 当某个按钮被点击时， 首先触发  {按钮名称}_onClick 事件，然后触发 buttonOnClick事件
 * @param sheet  工作表
 * @param cell   按钮所在的单元格
 * @param button 按钮对象
 */
//@comment (group=按钮点击事件,caption=批量删除已选中记录,needRightControl=false)
function cb_selectedRow_delete_onClick(sheet, cell, button) {
    $confirm("提示", "确定要删除选中的记录吗?", function () {
        book.getWorkSheet('detail').paintPermit = false;
        for (let i = $dzpz_dymx_ds.getRowCount() - 1; i >= 0; i--) {
            if ($dzpz_dymx_ds.getInt(i, "selected") == 1) $dzpz_dymx_ds.deleteRow(i);
        }
        if ($dzpz_dymx_ds.getRowCount() == 0) $dzpz_dymx_ds.insertRow(0);
        book.getWorkSheet('detail').cells("st_selectAll").setValue(0);
        book.getWorkSheet('detail').paintPermit = true;
    }, function () { });



}

function copyURL(url) {

    let s = getServiceHomeURL('app') + url;
    let d = book.sheet3.cells("days").getValueInt();
    let t = book.sheet3.cells("times").getValueInt();
    s = back_urlShare(s, d, t);
    $setClipboard(s);
    toastr.info("分享地址已经复制到剪贴板");
}


id: 64c38a0f8b1077f2a5abdd50
scriptid: 60fa600f9932563b7c99bb03
tablename: app_template
clientip: 0:0:0:0:0:0:0:1
username: sa
createdate: 2023.07.28 17:34:08.000
script:
var g_currentUserIsOwner = false; //当前人是不是起草人





/**
 * 表单初始化完成后，执行此事件
 */
//@comment (group=表单事件,caption=表单初始化完成)
function formOpen() {
    book.showTabOnWhere = 'none';
    book.getWorkSheet('下载清单').visible = false;



    if ($dzpz_dy_ds.getString(0, "ziptaskid") == '') {
        book.sheet1.getBrick('cb_cancel').visible = false;
    }

    if (currentUserId() == $dzpz_dy_ds.getInt(0, "userid")) {
        g_currentUserIsOwner = true;
    }
    //按gguid分开接收消息，避免多个打包的消息混在一起
    onPushMessage("打包下载" + currentGUID(), function (info) {
        console.info(info);
        var msg = JSON.parse(info);
        if (msg.action == 'info') {
            console.info(msg.info);
            if (g_currentUserIsOwner) showInfoPane(msg.info);
        }

        if (msg.action == 'gameOver') {
            var result = msg.result;
            //$.alert(JSON.stringify(result));


            $dzpz_dy_ds.setValue(0, "ziptaskid", '', false);//清除打包任务id，因为已经ok了，但不要触发保存
            //不需要保存 ，因为打包完成脚本中已经回填了，仅在界面上回填一下， 方便显示下载清单
            $dzpz_dy_ds.setValue(0, "zipresult", JSON.stringify(result.zipFiles), false);

            console.dir(result);

            cb_package_onClick();

            hideInfoPane();
        }
        if (msg.action == 'over') {

            hideInfoPane();
        }

        if (msg.action == 'error') {
            $.alert(msg.info);
            hideInfoPane();
        }
    })

    $('.navbar-fixed-top').css("z-index", 1);

}
/**
 * 按钮点击事件
 * 当某个按钮被点击时， 首先触发  {按钮名称}_onClick 事件，然后触发 buttonOnClick事件
 * @param sheet  工作表
 * @param cell   按钮所在的单元格
 * @param button 按钮对象
 */
//@comment (group=按钮点击事件,caption=下载模板,needRightControl=false)
function cb_downloadTemplateFile_onClick(sheet, cell, button) {
    var title = "序号\t凭证号\t科目代码\t核算账号编号\t摘要";
    var data = [];
    data.push(title);
    data.push("1\t0001\t1001\tRD0001\tABC");
    data.push("2\t0002\t5501\tRD0002\tBBB");

    var f = $('#form_toexcel')[0];
    f.filename.value = "凭证调阅模板.xlsx";
    f.data.value = JSON.stringify(data);
    f.submit();

}

/**
 * 按钮点击事件
 * 当某个按钮被点击时， 首先触发  {按钮名称}_onClick 事件，然后触发 buttonOnClick事件
 * @param sheet  工作表
 * @param cell   按钮所在的单元格
 * @param button 按钮对象
 */
//@comment (group=按钮点击事件,caption=导入模板,needRightControl=false)
function cb_importFromExcelFile_onClick(sheet, cell, button) {
    toastr.info("*自动保存，准备导入");
    form.save(false, function () {
        book.readXLS(function (data) {
            showInfoPane("*正在导入");
            setTimeout(function () {
                importData(data);
            }, 10);
        });
    });

}



function safeValue(sheet, row, col) {
    if (row > sheet.length - 1) return null;
    var dataRow = sheet[row];
    if (dataRow == null) return null;
    if (col > dataRow.length - 1) return null;
    return dataRow[col];

}

//@comment (group=,caption=从Excel导入数据,needRightControl=false)
function importData(excelData) {
    var excelSheet = excelData[Object.keys(excelData)[0]];


    var headRow = 0; //题头在第几行
    var dataStartRow = 1;// 数据行从第几行开始

    var RC = excelSheet.length;

    book.sheet0.paintPermit = false;

    for (let row = dataStartRow; row < RC; row++) {
        let data = {
            pzh: safeValue(excelSheet, row, 1) || '',
            kmdm: safeValue(excelSheet, row, 2) || '',
            code: safeValue(excelSheet, row, 3) || '',
            memo: safeValue(excelSheet, row, 4) || '',
        }
        //alert(JSON.stringify(data));
        if (data.pzh == '') continue;
        let r = $dzpz_dymx_ds.insertRow(99999);
        $dzpz_dymx_ds.setValue(r, data);
    }


    showInfoPane("*正在保存并检测凭证号");
    form.save(false, function () {


        book.sheet0.paintPermit = false;
        toastr.info("导入完成");

    });
}




var dymx_changed = false;
/**
 * dsname结果集保存前，对row进行数据校验 ，
 * @param dsname 结果集名称
 * @param row  第row行
 * @returns {boolean} true表示检验通过， false表示校验不通过，update被终止
 */
function validate(dsname, row) {
    if (dsname == 'dzpz_dymx') dymx_changed = true;
    return true;
}

/**
 * 数据集中的数据发生变化
 * @param dsname 数据集名称
 * @param row   数据行号
 * @param col    字段名
 * @param oldValue   原值
 * @param newValue  新值
 */
function itemChanged(dsname, row, col, oldValue, newValue) {
    if (col == 'corpid') dymx_changed = true;

}



/**
 * 单据保存成功后执行本事件。如果单据不需要保存，或保存失败，则不执行本事件
 * @param GUID 当前单据的GGUID
 * @param action 当前单据正在进行的动作，比如 edit , view
 */
function afterSaveSuccessful(GGUID, action) {
    if (dymx_changed) form.loadBill(GGUID); //如果明细有变化，那么保存成功后，重新加载单据，因为在单据保存后，模板后端脚本中会同时更新  pz_id 及 bz
    dymx_changed = false;
}


//@comment (group=按钮点击事件,caption=取消打包,needRightControl=false)
function cb_redo_pack_onClick() {

    $confirm('', '确信要清除压缩文件吗?', function () {

        book.getWorkSheet('下载清单').popupDispose();

        setTimeout(function () {
            showInfoPane("*正在删除已打包的文件");
            setTimeout(function () {
                $dzpz_dy_ds.setValue(0, "ziptaskid", '');
                $dzpz_dy_ds.setValue(0, "zipresult", '');
                form.save(false);
                $q_result_ds.reset();
                hideInfoPane();
                toastr.info("打包文件已经删除。当再次点击打包下载时会重新打包");
            }, 200);
        }, 1000);
    });


}

//@comment (group=按钮点击事件,caption=取消打包,needRightControl=false)
function cb_cancel_onClick() {

    $confirm('', '确信要终止打包吗?', function () {
        showInfoPane("*正在终止打包...");
       

        $dzpz_dy_ds.setValue(0, "ziptaskid", '');
        $dzpz_dy_ds.setValue(0, "zipresult", '');

        form.save(false);
        hideInfoPane();

 runTask("终止打包", {
            id: $dzpz_dy_ds.getString(0, "ziptaskid")
        } ,function(ret){});


    });
}

//@comment (group=按钮点击事件,caption=打包,needRightControl=false)
function cb_package_onClick() {

    form.save(false, function () {
        var ziptaskid = $dzpz_dy_ds.getString(0, "ziptaskid");
        if (ziptaskid != '') {
            toastr.info("正在压缩中...，请稍候");
            return;
        }

        var zipResult = $dzpz_dy_ds.getString(0, "zipresult");
        if (zipResult == '') {
            toastr.info("正在压缩文件，请稍候");
            do_package(currentGUID(), function (ret) {

                if (ret.success) {
                    $dzpz_dy_ds.setValue(0, "ziptaskid", ret.zipTaskId, false); //后台已经回写了，就里只要界面上更新就ok
                }
            });
            return;
        }

        zipResult = zipResult.replace(/&action=view/g, '&action=download');
        zipResult = JSON.parse(zipResult);
        $q_result_ds.reset();
        for (var i = 0; i < zipResult.length; i++) {
            var one = zipResult[i];
            var row = $q_result_ds.insertRow(999);
            $q_result_ds.setValue(row, one);


        }

        book.getWorkSheet('下载清单').popup("", "下载清单", 800, 300, true, true);
    });
}



function cb_package_onClick___() {

    if (form.isSaveNeeded()) {
        toastr.info("请先保存");
        return;
    }

    let ids = [];
    for (let i = 0; i < $dzpz_dymx_ds.rowCount; i++) {
        if ($dzpz_dymx_ds.getString(i, "pz_id") == '') {
            toastr.error("第" + (i + 1) + "行的凭证号不存在，请核对");
            return;
        }
        ids.push($dzpz_dymx_ds.getString(i, "pz_id"));
    }

    if (ids.length == 0) {
        toastr.info("没有凭证清单");
        return;
    }

    $confirm('', '确信要打包下载吗?', function () {
        showInfoPane("*正在压缩打包...");
        let fileName = formatDate(newDate(), "yyyyMMddHHmm") + ".zip";
        runTask("打包下载", {
            fileName: fileName,
            gguid: currentGUID(),
            ids: ids,
            watermark: $dzpz_dy_ds.getString(0, "billno") + "[" + $dzpz_dy_ds.getString(0, "reader") + "]" +
                formatDate(newDate(), "yyyy.MM.dd HH:mm")
        },
            function (ret) {
                ret = JSON.parse(ret);
                hideInfoPane();
                if (ret.success) {
                    let t = window.location.href;
                    let p = t.indexOf("billedit");
                    t = t.substring(0, p);
                    let url = t + ret.url;
                    $.alert(` <a href="${url}" target="_blank">点击下载${fileName}</a>`, `打包完成`);
                } else {
                    toastr.error(ret.message);
                }
            });

    });

}

/**
 * 按钮点击事件
 * 当某个按钮被点击时， 首先触发  {按钮名称}_onClick 事件，然后触发 buttonOnClick事件
 * @param sheet  工作表
 * @param cell   按钮所在的单元格
 * @param button 按钮对象
 */
//@comment (group=按钮点击事件,caption=调取凭证列表,needRightControl=false)
function cb_pzlist_onClick(sheet, cell, button) {
    // if (form.isSaveNeeded()) {
    //     toastr.info("请先保存");
    //     return;
    // }
    book.getWorkSheet("凭证资料查询").float('fa fa-cog', "凭证资料查询",
        {
            my: 'right-center',
            at: 'right-center',
            autoposition: 'down',
            offsetX: -5,
            offsetY: 5
        }, { width: '70%', height: '90%' });
    smartRetrieve(book.getWorkSheet("凭证资料查询"), "q_pzdjex")
}


/**
 * 按钮点击事件
 * 当某个按钮被点击时， 首先触发  {按钮名称}_onClick 事件，然后触发 buttonOnClick事件
 * @param sheet  工作表
 * @param cell   按钮所在的单元格
 * @param button 按钮对象
 */
//@comment (group=按钮点击事件,caption=选入,needRightControl=false)
function cb_import_onClick(sheet, cell, button) {
    book.getWorkSheet("detail").paintPermit = false;
    let row = book.getDataSource("dzpz_dymx").currentBindRow;

    for (var i = 0; i < $q_pzdjex_ds.getRowCount(); i++) {
        if ($q_pzdjex_ds.getString(i, "selected") == '1') {
            if ($dzpz_dymx_ds.getString(row, "pzh") != '' || row < 0) row = $dzpz_dymx_ds.insertRow(row + 1);
            $dzpz_dymx_ds.setValue(row, {
                pzh: $q_pzdjex_ds.getValue(i, "pzh"),
                kmdm: $q_pzdjex_ds.getValue(i, "kmdm"),
                code: $q_pzdjex_ds.getValue(i, "code"),
                memo: $q_pzdjex_ds.getString(i, "bz")
            });
        }
    }
    book.getDataSource("dzpz_dymx").currentBindRow = row;
    book.getWorkSheet("detail").View.insureSelectionOnScreen(null, false);
    do_removeDuplicated(); //删除重复项

    //********删除行号***********************************
    book.getWorkSheet("凭证资料查询").paintPermit = false;
    for (var i = $q_pzdjex_ds.getRowCount() - 1; i >= 0; i--) {
        if ($q_pzdjex_ds.getString(i, "selected") == '1') $q_pzdjex_ds.deleteRow(i);
    }
    book.getWorkSheet("凭证资料查询").paintPermit = true;
    //**************************************************

    book.getWorkSheet("detail").paintPermit = true;
    book.getWorkSheet("main").paintPermit = true;
}

/**
 * 按钮点击事件
 * 当某个按钮被点击时， 首先触发  {按钮名称}_onClick 事件，然后触发 buttonOnClick事件
 * @param sheet  工作表
 * @param cell   按钮所在的单元格
 * @param button 按钮对象
 */
//@comment (group=按钮点击事件,caption=,needRightControl=false)
function cb_opensheet_dr_onClick(sheet, cell, button) {
    book.getWorkSheet("凭证列表").float('fa fa-cog', "导入凭证列表",
        {
            my: 'right-center',
            at: 'right-center',
            autoposition: 'down',
            offsetX: -5,
            offsetY: 5
        }, { width: 400, height: '80%' });

}

/**
 * 按钮点击事件
 * 当某个按钮被点击时， 首先触发  {按钮名称}_onClick 事件，然后触发 buttonOnClick事件
 * @param sheet  工作表
 * @param cell   按钮所在的单元格
 * @param button 按钮对象
 */
//@comment (group=按钮点击事件,caption=粘贴界面导入,needRightControl=false)
function cb_dr_onClick(sheet, cell, button) {

    book.getWorkSheet("detail").paintPermit = false;
    let row = book.getDataSource("dzpz_dymx").currentBindRow;
    let pzlist = sheet.cells('pzlist').getValueString().split('\n');
    for (let i = 0; i < pzlist.length; i++) {
        if (pzlist[i] !== '') {
            if ($dzpz_dymx_ds.getString(row, "pzh") != '' || row < 0) row = $dzpz_dymx_ds.insertRow(row + 1);

            $dzpz_dymx_ds.setValue(row, {
                pzh: pzlist[i]
            });
        }
    }
    sheet.cells('pzlist').setValue(null);
    sheet.floatPanelClose();

    book.getWorkSheet("detail").paintPermit = true;

}
/**
 * 单元格因为被编辑而改变。当用户通过编辑单元的值而让单元格发生值改变时本事件被触发。
 * 注意，当使用脚本 sheet.cells(row,col).setValue ( value) 来改变单元格的值时，本事件并不触发
 * @param sheet
 * @param cell
 * @param newValue
 * @param innerRow   当单元格没有绑定数据库或绑定到单行数据库时，本参数无意义。如果绑定一个
 * 多行数据库，则表示该单元所绑定的字段的第 innerRow行发生变化
 */
function cellValueChangedByEdit(sheet, cell, newValue, innerRow) {

    //通过数据库绑定情况来判断

    //通过别名来判断
    if (sheet.name == 'detail' && cell.alias == 'st_selectAll') {
        let ds = $dzpz_dymx_ds;
        sheet.paintPermit = false;
        for (var i = 0; i < ds.getRowCount(); i++) {
            ds.setValue(i, "selected", newValue);
        }
        sheet.paintPermit = true;
    }
    if (sheet.name == '凭证资料查询' && cell.alias == 'st_selectAll') {
        let ds = $q_pzdjex_ds;
        sheet.paintPermit = false;
        for (var i = 0; i < ds.getRowCount(); i++) {
            ds.setValue(i, "selected", newValue);
        }
        sheet.paintPermit = true;
    }

    let bind = cell.bind;
    if (bind != null && bind.dataSource == 'dzpz_dymx' && bind.DBCol == 'pzh') {
        showInfoPane('*正在分析凭证号');
        setTimeout(function () {
            do_paste_pzlist(innerRow, newValue) //写入凭证号
        }, 100);
    }
    if (bind != null && bind.dataSource == 'dzpz_dy' && bind.DBCol == 'reader') {
        $dzpz_dy_ds.setValue(0, {
            watermark: '【' + $dzpz_dy_ds.getString(0, "reader") + '】仅用于项目专项审计或检查'
        })
    }



}

/**
 * 单元格编辑时粘贴内容后触发此事件。
 * @param sheet
 * @param cell
 * @param innerRow   当单元格没有绑定数据库或绑定到单行数据库时，本参数无意义。如果绑定一个
 * 多行数据库，则表示该单元所绑定的字段的第 innerRow行被粘贴了内容
 * @param text 当前单元格编辑框中的内容，并不一定是粘贴的内容，是单元格编辑框中原有的内容加上粘贴的内容
 */
//@comment (group=单元格事件,caption=单元格粘贴内容)
function cellOnPaste(sheet, cell, innerRow, text) {

    //通过别名来判断
    if (cell.alias == 'XXX') {

    }

    //通过数据库绑定情况来判断
    let bind = cell.bind;
    if (bind != null && bind.dataSource == 'dzpz_dymx' && bind.DBCol == 'pzh') {
        sheet.View.forceCurrentEditControlGiveUpFocus();
    }

}


/**
 * 按钮点击事件
 * 当某个按钮被点击时， 首先触发  {按钮名称}_onClick 事件，然后触发 buttonOnClick事件
 * @param sheet  工作表
 * @param cell   按钮所在的单元格
 * @param button 按钮对象
 */
//@comment (group=do,caption=凭证列表粘贴凭证清单后自动后插并赋值,needRightControl=false)
function do_paste_pzlist(innerRow, newValue) {

    if (newValue == null || newValue == '') return;
    let data = newValue.split(' ');
    book.getWorkSheet("detail").paintPermit = false;
    let row = innerRow;
    for (let i = 0; i < data.length; i++) {
        //row = $dzpz_dymx_ds.insertRow(row + 1);
        if (data[i] != '') {
            $dzpz_dymx_ds.setValue(row, {
                pzh: data[i],
                selected: 1
            });
            if (i < data.length - 1) row = $dzpz_dymx_ds.insertRow(row + 1);
        }
    }
    book.getDataSource("dzpz_dymx").currentBindRow = row;
    book.getWorkSheet("detail").View.insureSelectionOnScreen(null, false);
    do_removeDuplicated(); //删除重复项
    book.getWorkSheet("detail").paintPermit = true;
    book.getWorkSheet("main").paintPermit = true;
    hideInfoPane();
}







//@comment (group=,caption=异步打包,needRightControl=false)
function async_package() {

    if (form.isSaveNeeded()) {
        toastr.info("请先保存");
        return;
    }

    let ids = [];
    for (let i = 0; i < $dzpz_dymx_ds.rowCount; i++) {
        if ($dzpz_dymx_ds.getString(i, "pz_id") == '') {
            toastr.error("第" + (i + 1) + "行的凭证号不存在，请核对");
            return;
        }
        ids.push($dzpz_dymx_ds.getString(i, "pz_id"));
    }

    if (ids.length == 0) {
        toastr.info("没有凭证清单");
        return;
    }

    $confirm('', '确信要重新打包吗?', function () {
        showInfoPane("*正在后台打包...");
        let fileName = $dzpz_dy_ds.getString(0, "reader") +
            formatDate(newDate(), "yyyy.MM.dd HH:mm") + "调阅凭证.zip";
        runTask("后台打包", {
            gguid: currentGUID(),
            fileName: fileName,
            ids: ids,
            watermark: $dzpz_dy_ds.getInt(0, "needwatermark") == 0 ? "" : ($dzpz_dy_ds.getString(0, "reader") + "/" + formatDate($dzpz_dy_ds.getValue(0, "billdate"), "yyyy.MM.dd HH:mm") + "\n" + $dzpz_dy_ds.getString(0, "watermark")),
            mergePDF: $dzpz_dy_ds.getString(0, "filetype") == 'pdf' //是否合并成一个pdf文件
        },
            function (ret) {
                ret = JSON.parse(ret);
                hideInfoPane();
                if (ret.success) {
                    $dzpz_dy_ds.setValue(0, "ziptaskid", ret.zipTaskId);
                    form.save(false);
                    hideInfoPane();

                } else {
                    toastr.error(ret.message);
                }
            });

    });


}

//@comment (group=按钮点击事件,caption=标记重复,needRightControl=false)
function cb_qc_onClick() {
    showInfoPane("*正在检测重复的凭证");
    var map = {};
    for (var i = 0; i < $dzpz_dymx_ds.rowCount; i++) {
        var pzh = $dzpz_dymx_ds.getString(i, "pzh");
        if (pzh == '') continue;
        if (map[pzh] == undefined) map[pzh] = []; //每个凭证号映射到一个数组，记录它所在的行号
        map[pzh].push(i); // 记录下凭证号对应的行号

    }

    book.getWorkSheet('detail').paintPermit = false;
    for (pzh in map) {
        var rows = map[pzh];
        $dzpz_dymx_ds.setValue(rows[0], "bz", "");
        for (var i = 1; i < rows.length; i++) {
            $dzpz_dymx_ds.setValue(rows[i], "bz", "与第" + (rows[0] + 1) + "行重复");
        }
    }
    book.getWorkSheet('detail').paintPermit = true;
    hideInfoPane();
}

//@comment (group=按钮点击事件,caption=删除重复的,needRightControl=false)
function cb_removeDuplicated_onClick() {

    $confirm('', '确信要清除重复的凭证号吗?', function () {

        do_removeDuplicated()

    });

}


//@comment (group=do,caption=执行删除重复的,needRightControl=false)
function do_removeDuplicated() {

    showInfoPane("*正在删除重复的凭证");
    book.getWorkSheet('detail').paintPermit = false;
    var pzhs = []; //凭证号清单
    var rows = [];// 需要删除的行号
    for (var i = 0; i < $dzpz_dymx_ds.rowCount; i++) {
        var pzh = $dzpz_dymx_ds.getString(i, "pzh");
        if (pzhs.contains(pzh)) //此凭证号此前已经出现过
        {
            rows.push(i);//  需要删除
        } else {
            pzhs.push(pzh); //没有出现过，那么加它到凭证号清单中
        }
    }
    //现在反着删除
    for (var i = rows.length - 1; i >= 0; i--) {
        $dzpz_dymx_ds.deleteRow(rows[i]);
    }
    //form.save(false);
    book.getWorkSheet('detail').paintPermit = false;
    hideInfoPane();
}



/**
 * 按钮点击事件
 * 当某个按钮被点击时， 首先触发  {按钮名称}_onClick 事件，然后触发 buttonOnClick事件
 * @param sheet  工作表
 * @param cell   按钮所在的单元格
 * @param button 按钮对象
 */
//@comment (group=按钮点击事件,caption=批量删除已选中记录,needRightControl=false)
function cb_selectedRow_delete_onClick(sheet, cell, button) {
    $confirm("提示", "确定要删除选中的记录吗?", function () {
        book.getWorkSheet('detail').paintPermit = false;
        for (let i = $dzpz_dymx_ds.getRowCount() - 1; i >= 0; i--) {
            if ($dzpz_dymx_ds.getInt(i, "selected") == 1) $dzpz_dymx_ds.deleteRow(i);
        }
        if ($dzpz_dymx_ds.getRowCount() == 0) $dzpz_dymx_ds.insertRow(0);
        book.getWorkSheet('detail').cells("st_selectAll").setValue(0);
        book.getWorkSheet('detail').paintPermit = true;
    }, function () { });



}

function copyURL(url) {

    let s = getServiceHomeURL('app') + url;
    let d = book.sheet3.cells("days").getValueInt();
    let t = book.sheet3.cells("times").getValueInt();
    s = back_urlShare(s, d, t);
    $setClipboard(s);
    toastr.info("分享地址已经复制到剪贴板");
}


id: 64c38a0f8b1077f2a5abdd56
scriptid: 60fa600f9932563b7c99bb03
tablename: app_template
clientip: 0:0:0:0:0:0:0:1
username: sa
createdate: 2023.07.28 17:34:53.000
script:
var g_currentUserIsOwner = false; //当前人是不是起草人





/**
 * 表单初始化完成后，执行此事件
 */
//@comment (group=表单事件,caption=表单初始化完成)
function formOpen() {
    book.showTabOnWhere = 'none';
    book.getWorkSheet('下载清单').visible = false;



    if ($dzpz_dy_ds.getString(0, "ziptaskid") == '') {
        book.sheet1.getBrick('cb_cancel').visible = false;
    }

    if (currentUserId() == $dzpz_dy_ds.getInt(0, "userid")) {
        g_currentUserIsOwner = true;
    }
    //按gguid分开接收消息，避免多个打包的消息混在一起
    onPushMessage("打包下载" + currentGUID(), function (info) {
        console.info(info);
        var msg = JSON.parse(info);
        if (msg.action == 'info') {
            console.info(msg.info);
            if (g_currentUserIsOwner) showInfoPane(msg.info);
        }

        if (msg.action == 'gameOver') {
            var result = msg.result;
            //$.alert(JSON.stringify(result));


            $dzpz_dy_ds.setValue(0, "ziptaskid", '', false);//清除打包任务id，因为已经ok了，但不要触发保存
            //不需要保存 ，因为打包完成脚本中已经回填了，仅在界面上回填一下， 方便显示下载清单
            $dzpz_dy_ds.setValue(0, "zipresult", JSON.stringify(result.zipFiles), false);

            console.dir(result);

            cb_package_onClick();

            hideInfoPane();
        }
        if (msg.action == 'over') {

            hideInfoPane();
        }

        if (msg.action == 'error') {
            $.alert(msg.info);
            hideInfoPane();
        }
    })

    $('.navbar-fixed-top').css("z-index", 1);

}
/**
 * 按钮点击事件
 * 当某个按钮被点击时， 首先触发  {按钮名称}_onClick 事件，然后触发 buttonOnClick事件
 * @param sheet  工作表
 * @param cell   按钮所在的单元格
 * @param button 按钮对象
 */
//@comment (group=按钮点击事件,caption=下载模板,needRightControl=false)
function cb_downloadTemplateFile_onClick(sheet, cell, button) {
    var title = "序号\t凭证号\t科目代码\t核算账号编号\t摘要";
    var data = [];
    data.push(title);
    data.push("1\t0001\t1001\tRD0001\tABC");
    data.push("2\t0002\t5501\tRD0002\tBBB");

    var f = $('#form_toexcel')[0];
    f.filename.value = "凭证调阅模板.xlsx";
    f.data.value = JSON.stringify(data);
    f.submit();

}

/**
 * 按钮点击事件
 * 当某个按钮被点击时， 首先触发  {按钮名称}_onClick 事件，然后触发 buttonOnClick事件
 * @param sheet  工作表
 * @param cell   按钮所在的单元格
 * @param button 按钮对象
 */
//@comment (group=按钮点击事件,caption=导入模板,needRightControl=false)
function cb_importFromExcelFile_onClick(sheet, cell, button) {
    toastr.info("*自动保存，准备导入");
    form.save(false, function () {
        book.readXLS(function (data) {
            showInfoPane("*正在导入");
            setTimeout(function () {
                importData(data);
            }, 10);
        });
    });

}



function safeValue(sheet, row, col) {
    if (row > sheet.length - 1) return null;
    var dataRow = sheet[row];
    if (dataRow == null) return null;
    if (col > dataRow.length - 1) return null;
    return dataRow[col];

}

//@comment (group=,caption=从Excel导入数据,needRightControl=false)
function importData(excelData) {
    var excelSheet = excelData[Object.keys(excelData)[0]];


    var headRow = 0; //题头在第几行
    var dataStartRow = 1;// 数据行从第几行开始

    var RC = excelSheet.length;

    book.sheet0.paintPermit = false;

    for (let row = dataStartRow; row < RC; row++) {
        let data = {
            pzh: safeValue(excelSheet, row, 1) || '',
            kmdm: safeValue(excelSheet, row, 2) || '',
            code: safeValue(excelSheet, row, 3) || '',
            memo: safeValue(excelSheet, row, 4) || '',
        }
        //alert(JSON.stringify(data));
        if (data.pzh == '') continue;
        let r = $dzpz_dymx_ds.insertRow(99999);
        $dzpz_dymx_ds.setValue(r, data);
    }


    showInfoPane("*正在保存并检测凭证号");
    form.save(false, function () {


        book.sheet0.paintPermit = false;
        toastr.info("导入完成");

    });
}




var dymx_changed = false;
/**
 * dsname结果集保存前，对row进行数据校验 ，
 * @param dsname 结果集名称
 * @param row  第row行
 * @returns {boolean} true表示检验通过， false表示校验不通过，update被终止
 */
function validate(dsname, row) {
    if (dsname == 'dzpz_dymx') dymx_changed = true;
    return true;
}

/**
 * 数据集中的数据发生变化
 * @param dsname 数据集名称
 * @param row   数据行号
 * @param col    字段名
 * @param oldValue   原值
 * @param newValue  新值
 */
function itemChanged(dsname, row, col, oldValue, newValue) {
    if (col == 'corpid') dymx_changed = true;

}



/**
 * 单据保存成功后执行本事件。如果单据不需要保存，或保存失败，则不执行本事件
 * @param GUID 当前单据的GGUID
 * @param action 当前单据正在进行的动作，比如 edit , view
 */
function afterSaveSuccessful(GGUID, action) {
    if (dymx_changed) form.loadBill(GGUID); //如果明细有变化，那么保存成功后，重新加载单据，因为在单据保存后，模板后端脚本中会同时更新  pz_id 及 bz
    dymx_changed = false;
}


//@comment (group=按钮点击事件,caption=取消打包,needRightControl=false)
function cb_redo_pack_onClick() {

    $confirm('', '确信要清除压缩文件吗?', function () {

        book.getWorkSheet('下载清单').popupDispose();

        setTimeout(function () {
            showInfoPane("*正在删除已打包的文件");
            setTimeout(function () {
                $dzpz_dy_ds.setValue(0, "ziptaskid", '');
                $dzpz_dy_ds.setValue(0, "zipresult", '');
                form.save(false);
                $q_result_ds.reset();
                hideInfoPane();
                toastr.info("打包文件已经删除。当再次点击打包下载时会重新打包");
            }, 200);
        }, 1000);
    });


}

//@comment (group=按钮点击事件,caption=取消打包,needRightControl=false)
function cb_cancel_onClick() {

    $confirm('', '确信要终止打包吗?', function () {
        showInfoPane("*正在终止打包...");


        $dzpz_dy_ds.setValue(0, "ziptaskid", '');
        $dzpz_dy_ds.setValue(0, "zipresult", '');

        form.save(false);
        hideInfoPane();

        runTask("终止打包", {
            id: $dzpz_dy_ds.getString(0, "ziptaskid")
        }, function (ret) { });


    });
}

//@comment (group=按钮点击事件,caption=打包,needRightControl=false)
function cb_package_onClick() {

    form.save(false, function () {
        var ziptaskid = $dzpz_dy_ds.getString(0, "ziptaskid");
        if (ziptaskid != '') {
            toastr.info("正在压缩中...，请稍候");
            return;
        }

        var zipResult = $dzpz_dy_ds.getString(0, "zipresult");
        if (zipResult == '') {
            toastr.info("正在压缩文件，请稍候");
            do_package(currentGUID(), function (ret) {

                if (ret.success) {
                    $dzpz_dy_ds.setValue(0, "ziptaskid", ret.zipTaskId, false); //后台已经回写了，就里只要界面上更新就ok
                }
            });
            return;
        }

        zipResult = zipResult.replace(/&action=view/g, '&action=download');
        zipResult = JSON.parse(zipResult);
        $q_result_ds.reset();
        for (var i = 0; i < zipResult.length; i++) {
            var one = zipResult[i];
            var row = $q_result_ds.insertRow(999);
            $q_result_ds.setValue(row, one);


        }

        book.getWorkSheet('下载清单').popup("", "下载清单", 800, 300, true, true);
    });
}



function cb_package_onClick___() {

    if (form.isSaveNeeded()) {
        toastr.info("请先保存");
        return;
    }

    let ids = [];
    for (let i = 0; i < $dzpz_dymx_ds.rowCount; i++) {
        if ($dzpz_dymx_ds.getString(i, "pz_id") == '') {
            toastr.error("第" + (i + 1) + "行的凭证号不存在，请核对");
            return;
        }
        ids.push($dzpz_dymx_ds.getString(i, "pz_id"));
    }

    if (ids.length == 0) {
        toastr.info("没有凭证清单");
        return;
    }

    $confirm('', '确信要打包下载吗?', function () {
        showInfoPane("*正在压缩打包...");
        let fileName = formatDate(newDate(), "yyyyMMddHHmm") + ".zip";
        runTask("打包下载", {
            fileName: fileName,
            gguid: currentGUID(),
            ids: ids,
            watermark: $dzpz_dy_ds.getString(0, "billno") + "[" + $dzpz_dy_ds.getString(0, "reader") + "]" +
                formatDate(newDate(), "yyyy.MM.dd HH:mm")
        },
            function (ret) {
                ret = JSON.parse(ret);
                hideInfoPane();
                if (ret.success) {
                    let t = window.location.href;
                    let p = t.indexOf("billedit");
                    t = t.substring(0, p);
                    let url = t + ret.url;
                    $.alert(` <a href="${url}" target="_blank">点击下载${fileName}</a>`, `打包完成`);
                } else {
                    toastr.error(ret.message);
                }
            });

    });

}

/**
 * 按钮点击事件
 * 当某个按钮被点击时， 首先触发  {按钮名称}_onClick 事件，然后触发 buttonOnClick事件
 * @param sheet  工作表
 * @param cell   按钮所在的单元格
 * @param button 按钮对象
 */
//@comment (group=按钮点击事件,caption=调取凭证列表,needRightControl=false)
function cb_pzlist_onClick(sheet, cell, button) {
    // if (form.isSaveNeeded()) {
    //     toastr.info("请先保存");
    //     return;
    // }
    book.getWorkSheet("凭证资料查询").float('fa fa-cog', "凭证资料查询",
        {
            my: 'right-center',
            at: 'right-center',
            autoposition: 'down',
            offsetX: -5,
            offsetY: 5
        }, { width: '70%', height: '90%' });
    smartRetrieve(book.getWorkSheet("凭证资料查询"), "q_pzdjex")
}


/**
 * 按钮点击事件
 * 当某个按钮被点击时， 首先触发  {按钮名称}_onClick 事件，然后触发 buttonOnClick事件
 * @param sheet  工作表
 * @param cell   按钮所在的单元格
 * @param button 按钮对象
 */
//@comment (group=按钮点击事件,caption=选入,needRightControl=false)
function cb_import_onClick(sheet, cell, button) {
    book.getWorkSheet("detail").paintPermit = false;
    let row = book.getDataSource("dzpz_dymx").currentBindRow;

    for (var i = 0; i < $q_pzdjex_ds.getRowCount(); i++) {
        if ($q_pzdjex_ds.getString(i, "selected") == '1') {
            if ($dzpz_dymx_ds.getString(row, "pzh") != '' || row < 0) row = $dzpz_dymx_ds.insertRow(row + 1);
            $dzpz_dymx_ds.setValue(row, {
                pzh: $q_pzdjex_ds.getValue(i, "pzh"),
                kmdm: $q_pzdjex_ds.getValue(i, "kmdm"),
                code: $q_pzdjex_ds.getValue(i, "code"),
                memo: $q_pzdjex_ds.getString(i, "bz")
            });
        }
    }
    book.getDataSource("dzpz_dymx").currentBindRow = row;
    book.getWorkSheet("detail").View.insureSelectionOnScreen(null, false);
    do_removeDuplicated(); //删除重复项

    //********删除行号***********************************
    book.getWorkSheet("凭证资料查询").paintPermit = false;
    for (var i = $q_pzdjex_ds.getRowCount() - 1; i >= 0; i--) {
        if ($q_pzdjex_ds.getString(i, "selected") == '1') $q_pzdjex_ds.deleteRow(i);
    }
    book.getWorkSheet("凭证资料查询").paintPermit = true;
    //**************************************************

    book.getWorkSheet("detail").paintPermit = true;
    book.getWorkSheet("main").paintPermit = true;
}

/**
 * 按钮点击事件
 * 当某个按钮被点击时， 首先触发  {按钮名称}_onClick 事件，然后触发 buttonOnClick事件
 * @param sheet  工作表
 * @param cell   按钮所在的单元格
 * @param button 按钮对象
 */
//@comment (group=按钮点击事件,caption=,needRightControl=false)
function cb_opensheet_dr_onClick(sheet, cell, button) {
    book.getWorkSheet("凭证列表").float('fa fa-cog', "导入凭证列表",
        {
            my: 'right-center',
            at: 'right-center',
            autoposition: 'down',
            offsetX: -5,
            offsetY: 5
        }, { width: 400, height: '80%' });

}

/**
 * 按钮点击事件
 * 当某个按钮被点击时， 首先触发  {按钮名称}_onClick 事件，然后触发 buttonOnClick事件
 * @param sheet  工作表
 * @param cell   按钮所在的单元格
 * @param button 按钮对象
 */
//@comment (group=按钮点击事件,caption=粘贴界面导入,needRightControl=false)
function cb_dr_onClick(sheet, cell, button) {

    book.getWorkSheet("detail").paintPermit = false;
    let row = book.getDataSource("dzpz_dymx").currentBindRow;
    let pzlist = sheet.cells('pzlist').getValueString().split('\n');
    for (let i = 0; i < pzlist.length; i++) {
        if (pzlist[i] !== '') {
            if ($dzpz_dymx_ds.getString(row, "pzh") != '' || row < 0) row = $dzpz_dymx_ds.insertRow(row + 1);

            $dzpz_dymx_ds.setValue(row, {
                pzh: pzlist[i]
            });
        }
    }
    sheet.cells('pzlist').setValue(null);
    sheet.floatPanelClose();

    book.getWorkSheet("detail").paintPermit = true;

}
/**
 * 单元格因为被编辑而改变。当用户通过编辑单元的值而让单元格发生值改变时本事件被触发。
 * 注意，当使用脚本 sheet.cells(row,col).setValue ( value) 来改变单元格的值时，本事件并不触发
 * @param sheet
 * @param cell
 * @param newValue
 * @param innerRow   当单元格没有绑定数据库或绑定到单行数据库时，本参数无意义。如果绑定一个
 * 多行数据库，则表示该单元所绑定的字段的第 innerRow行发生变化
 */
function cellValueChangedByEdit(sheet, cell, newValue, innerRow) {

    //通过数据库绑定情况来判断

    //通过别名来判断
    if (sheet.name == 'detail' && cell.alias == 'st_selectAll') {
        let ds = $dzpz_dymx_ds;
        sheet.paintPermit = false;
        for (var i = 0; i < ds.getRowCount(); i++) {
            ds.setValue(i, "selected", newValue);
        }
        sheet.paintPermit = true;
    }
    if (sheet.name == '凭证资料查询' && cell.alias == 'st_selectAll') {
        let ds = $q_pzdjex_ds;
        sheet.paintPermit = false;
        for (var i = 0; i < ds.getRowCount(); i++) {
            ds.setValue(i, "selected", newValue);
        }
        sheet.paintPermit = true;
    }

    let bind = cell.bind;
    if (bind != null && bind.dataSource == 'dzpz_dymx' && bind.DBCol == 'pzh') {
        showInfoPane('*正在分析凭证号');
        setTimeout(function () {
            do_paste_pzlist(innerRow, newValue) //写入凭证号
        }, 100);
    }
    if (bind != null && bind.dataSource == 'dzpz_dy' && bind.DBCol == 'reader') {
        $dzpz_dy_ds.setValue(0, {
            watermark: '【' + $dzpz_dy_ds.getString(0, "reader") + '】仅用于项目专项审计或检查'
        })
    }



}

/**
 * 单元格编辑时粘贴内容后触发此事件。
 * @param sheet
 * @param cell
 * @param innerRow   当单元格没有绑定数据库或绑定到单行数据库时，本参数无意义。如果绑定一个
 * 多行数据库，则表示该单元所绑定的字段的第 innerRow行被粘贴了内容
 * @param text 当前单元格编辑框中的内容，并不一定是粘贴的内容，是单元格编辑框中原有的内容加上粘贴的内容
 */
//@comment (group=单元格事件,caption=单元格粘贴内容)
function cellOnPaste(sheet, cell, innerRow, text) {

    //通过别名来判断
    if (cell.alias == 'XXX') {

    }

    //通过数据库绑定情况来判断
    let bind = cell.bind;
    if (bind != null && bind.dataSource == 'dzpz_dymx' && bind.DBCol == 'pzh') {
        sheet.View.forceCurrentEditControlGiveUpFocus();
    }

}


/**
 * 按钮点击事件
 * 当某个按钮被点击时， 首先触发  {按钮名称}_onClick 事件，然后触发 buttonOnClick事件
 * @param sheet  工作表
 * @param cell   按钮所在的单元格
 * @param button 按钮对象
 */
//@comment (group=do,caption=凭证列表粘贴凭证清单后自动后插并赋值,needRightControl=false)
function do_paste_pzlist(innerRow, newValue) {

    if (newValue == null || newValue == '') return;
    let data = newValue.split(' ');
    book.getWorkSheet("detail").paintPermit = false;
    let row = innerRow;
    for (let i = 0; i < data.length; i++) {
        //row = $dzpz_dymx_ds.insertRow(row + 1);
        if (data[i] != '') {
            $dzpz_dymx_ds.setValue(row, {
                pzh: data[i],
                selected: 1
            });
            if (i < data.length - 1) row = $dzpz_dymx_ds.insertRow(row + 1);
        }
    }
    book.getDataSource("dzpz_dymx").currentBindRow = row;
    book.getWorkSheet("detail").View.insureSelectionOnScreen(null, false);
    do_removeDuplicated(); //删除重复项
    book.getWorkSheet("detail").paintPermit = true;
    book.getWorkSheet("main").paintPermit = true;
    hideInfoPane();
}







//@comment (group=,caption=异步打包,needRightControl=false)
function async_package() {

    if (form.isSaveNeeded()) {
        toastr.info("请先保存");
        return;
    }

    let ids = [];
    for (let i = 0; i < $dzpz_dymx_ds.rowCount; i++) {
        if ($dzpz_dymx_ds.getString(i, "pz_id") == '') {
            toastr.error("第" + (i + 1) + "行的凭证号不存在，请核对");
            return;
        }
        ids.push($dzpz_dymx_ds.getString(i, "pz_id"));
    }

    if (ids.length == 0) {
        toastr.info("没有凭证清单");
        return;
    }

    $confirm('', '确信要重新打包吗?', function () {
        showInfoPane("*正在后台打包...");
        let fileName = $dzpz_dy_ds.getString(0, "reader") +
            formatDate(newDate(), "yyyy.MM.dd HH:mm") + "调阅凭证.zip";
        runTask("后台打包", {
            gguid: currentGUID(),
            fileName: fileName,
            ids: ids,
            watermark: $dzpz_dy_ds.getInt(0, "needwatermark") == 0 ? "" : ($dzpz_dy_ds.getString(0, "reader") + "/" + formatDate($dzpz_dy_ds.getValue(0, "billdate"), "yyyy.MM.dd HH:mm") + "\n" + $dzpz_dy_ds.getString(0, "watermark")),
            mergePDF: $dzpz_dy_ds.getString(0, "filetype") == 'pdf' //是否合并成一个pdf文件
        },
            function (ret) {
                ret = JSON.parse(ret);
                hideInfoPane();
                if (ret.success) {
                    $dzpz_dy_ds.setValue(0, "ziptaskid", ret.zipTaskId);
                    form.save(false);
                    hideInfoPane();

                } else {
                    toastr.error(ret.message);
                }
            });

    });


}

//@comment (group=按钮点击事件,caption=标记重复,needRightControl=false)
function cb_qc_onClick() {
    showInfoPane("*正在检测重复的凭证");
    var map = {};
    for (var i = 0; i < $dzpz_dymx_ds.rowCount; i++) {
        var pzh = $dzpz_dymx_ds.getString(i, "pzh");
        if (pzh == '') continue;
        if (map[pzh] == undefined) map[pzh] = []; //每个凭证号映射到一个数组，记录它所在的行号
        map[pzh].push(i); // 记录下凭证号对应的行号

    }

    book.getWorkSheet('detail').paintPermit = false;
    for (pzh in map) {
        var rows = map[pzh];
        $dzpz_dymx_ds.setValue(rows[0], "bz", "");
        for (var i = 1; i < rows.length; i++) {
            $dzpz_dymx_ds.setValue(rows[i], "bz", "与第" + (rows[0] + 1) + "行重复");
        }
    }
    book.getWorkSheet('detail').paintPermit = true;
    hideInfoPane();
}

//@comment (group=按钮点击事件,caption=删除重复的,needRightControl=false)
function cb_removeDuplicated_onClick() {

    $confirm('', '确信要清除重复的凭证号吗?', function () {

        do_removeDuplicated()

    });

}


//@comment (group=do,caption=执行删除重复的,needRightControl=false)
function do_removeDuplicated() {

    showInfoPane("*正在删除重复的凭证");
    book.getWorkSheet('detail').paintPermit = false;
    var pzhs = []; //凭证号清单
    var rows = [];// 需要删除的行号
    for (var i = 0; i < $dzpz_dymx_ds.rowCount; i++) {
        var pzh = $dzpz_dymx_ds.getString(i, "pzh");
        if (pzhs.contains(pzh)) //此凭证号此前已经出现过
        {
            rows.push(i);//  需要删除
        } else {
            pzhs.push(pzh); //没有出现过，那么加它到凭证号清单中
        }
    }
    //现在反着删除
    for (var i = rows.length - 1; i >= 0; i--) {
        $dzpz_dymx_ds.deleteRow(rows[i]);
    }
    //form.save(false);
    book.getWorkSheet('detail').paintPermit = false;
    hideInfoPane();
}



/**
 * 按钮点击事件
 * 当某个按钮被点击时， 首先触发  {按钮名称}_onClick 事件，然后触发 buttonOnClick事件
 * @param sheet  工作表
 * @param cell   按钮所在的单元格
 * @param button 按钮对象
 */
//@comment (group=按钮点击事件,caption=批量删除已选中记录,needRightControl=false)
function cb_selectedRow_delete_onClick(sheet, cell, button) {
    $confirm("提示", "确定要删除选中的记录吗?", function () {
        book.getWorkSheet('detail').paintPermit = false;
        for (let i = $dzpz_dymx_ds.getRowCount() - 1; i >= 0; i--) {
            if ($dzpz_dymx_ds.getInt(i, "selected") == 1) $dzpz_dymx_ds.deleteRow(i);
        }
        if ($dzpz_dymx_ds.getRowCount() == 0) $dzpz_dymx_ds.insertRow(0);
        book.getWorkSheet('detail').cells("st_selectAll").setValue(0);
        book.getWorkSheet('detail').paintPermit = true;
    }, function () { });



}

function copyURL(url) {

    let s = getServiceHomeURL('app') + url;
    let d = book.sheet3.cells("days").getValueInt();
    let t = book.sheet3.cells("times").getValueInt();
    s = back_urlShare(s, d, t);
    $setClipboard(s);
    toastr.info("分享地址已经复制到剪贴板");
}


id: 64c7b3429932ab2156cd1c63
scriptid: 60d095db993254220bd8519f
tablename: app_script
clientip: 60.186.34.220
username: sa
createdate: 2023.07.31 21:18:52.000
script:
//后端导入excel数据包
function backend_importExcelData(excelData) {
    var ret = {
        'success': false,
        'message': ''
    }
    // return { success: false, message: excelData }
    var dsn = '';
    var masterTable = 'pzdj';
    var tableName = 'pzdjex';
    //ret.message="select id,userid,verifiername from pzdj where gguid='" + currentGUID() + "'";
    //return ret;

    runSQL("", "alter table  pzdjex   modify  bz  varchar(4000) ");
    runSQL("", "alter table  pzdjex   modify  rkdh  varchar(1000) ");
    

    var ds = newDataStore(dsn, "select id,userid,verifiername ,corpid from pzdj where gguid='" + currentGUID() + "'");
    ds.setOnceRetrieveCount(1);
    ds.retrieve('');
    if (ds.getRowCount() == 0) {
        ret.message = '请保存单据后再操作此功能!';
        return ret;
    }

    var corpid = ds.getString(0, "corpid");

    // if (ds.getString(0, "userid") != currentUserId()) {
    //     ret.message = '由于您不是制单人，不允许对当前单据做导入操作!';
    //     return ret;
    // }
    if (ds.getString(0, "verifiername") != '') {
        ret.message = '单据已审核，不允许导入操作!';
        return ret;
    }

    runSQL(dsn, "delete from " + tableName + " where gguid='" + currentGUID() + "'");

    //**********************************************
    //导入的标准功能
    var colLabel2ColName = {
        "年度": "y",
        "调整期间": "m",
        "期间": "m",
        "凭证号": "pzh",
        "调整凭证号": "pzh",
        "会计凭证号": "pzh",
        "凭证日期": "pzrq",
        "会计科目代码": "kmdm",
        "会计科目名称": "kmmc",
        "核算账号编码": "code",
        "借方金额": "jfje",
        "贷方金额": "dfje",
        "财会支出明细编码": "ckzcmxdm",
        "财会支出明细名称": "ckzcmxmc",
        "预会支出明细编码": "ykzcmxdm",
        "预会支出明细名称": "ykzcmxmc",
        "入库单号": "rkdh",
        "是否已过账": "posted",
        "摘要": "bz",
        "制单人": "zdr",
        "经办人": "jbr"
    }

    "年度\t调整期间\t凭证号\t凭证日期\t会计科目代码\t会计科目名称\t财会支出明细编码\t财会支出明细名称\t预会支出明细编码\t预会支出明细名称\t核算账号编码\t入库单号\t是否已过账\t摘要\t制单人";


    //var excelSheet;
    //for (var p in excelData) {
    //    excelSheet = excelData[p];
    //}

    var excelSheet = excelData;

    //分析字段对应关系
    var excelColIndex2ColName = {}; //excel 中的列号对应的中文题头
    var excelColName2ColIndex = {}; //中文题头对应的excel中的列号
    // var colLabel2ColName = {}; //中文题头对应到表的字段名


    var duplicateLabelCount = {};
    var colCount = 50; //最多几个列

    var headRow = 0; //题头在第几行
    var dataStartRow = 1; // 数据行从第几行开始
    //有时可能表头有多行合并，所以要检测一下
    for (var i = 0; i < colCount; i++) {
        var v = trim(sys_excelSafeValue(excelSheet, headRow, i));
        if (v == '')
            continue;
        if (duplicateLabelCount[v] == undefined) {
            duplicateLabelCount[v] = 0;
        }
        duplicateLabelCount[v] = duplicateLabelCount[v] + 1;

        if (duplicateLabelCount[v] > 1)
            v = v + duplicateLabelCount[v];
        //拼上后缀

        excelColIndex2ColName['' + i] = v;
        excelColName2ColIndex[v] = '' + i;
    }

    println(JSON.toString(excelColName2ColIndex));
     println(JSON.toString(excelColIndex2ColName));

    var RC = excelSheet.length;

    var data = [];
    for (var row = dataStartRow; row < RC; row++) {
        if (sys_excelSafeValue(excelSheet, row, 1) == null) break; //空行，直接结束
        var oneRowData = {};
        data.push(oneRowData);
        for (var label in excelColName2ColIndex) {
            var excelCol = excelColName2ColIndex[label];
            var dbCol = colLabel2ColName[label];
            if (dbCol != null) {
                oneRowData[dbCol] = sys_excelSafeValue(excelSheet, row, excelCol);
            }
        }

    }
    //println(JSON.toString(data));

    pushMessage("dr_info", "开始导入...", currentUserId());

    var gguid = currentGUID();
    var userid = currentUserId();
    var username = currentUserName();
    var lastmodifieddate = newDate();
    // println('import_ph:' + import_ph);



    var ds = newDataStore(dsn, "select * from " + tableName);
    ds.setUpdateProperty(tableName, "id", "*", "id");
    for (var i = 0; i < data.length; i++) {
        var row = ds.insertRow(9999999);
        pushMessage("dr_info", "导入进度：" + (i + 1) + "/" + data.length, currentUserId());

        var rowData = data[i];
        for (var col in rowData) {
            var value = rowData[col];
            ds.setValue(row, col, value);
        }
        ds.setValue(row, "id", newGuid());
        ds.setValue(row, "gguid", gguid);
        ds.setValue(row, "userid", userid);
        ds.setValue(row, "username", username);
        ds.setValue(row, "lastmodifieddate", lastmodifieddate);
        ds.setValue(row, "corpid", corpid);

        if (ds.getRowCount() == 1000) {
            if (!ds.update(true)) {
                var errInfo = ds.getError().getMessage();
                println(errInfo);
                pushMessage("dr_info", "异常：" + errInfo, currentUserId());
                return;
            }
            ds.reset();
        }
    }

    pushMessage("dr_info", "正在写入数据库...", currentUserId());

    ds.update(true);
    // $alert('导入完成');
    ret.success = true;
    ret.message = ds.getString(0, "userid");

    //更新起始记账期和截止记账期
    var master_ds = newDataStore(dsn, "select * from " + masterTable);
    master_ds.setUpdateProperty(masterTable, "id", "*", "id");
    master_ds.retrieve("gguid='" + currentGUID() + "'");
    master_ds.setValue(0, "jzq_start", getStringFromSQL2(dsn, "select min(y*100+m) as t from pzdjex where gguid='" + currentGUID() + "'"));
    master_ds.setValue(0, "jzq_end", getStringFromSQL2(dsn, "select max(y*100+m) as t from pzdjex where gguid='" + currentGUID() + "'"));
    master_ds.update(true)

    pushMessage('dr_info', 'over', currentUserId());

    return ret;
}

function sys_excelSafeValue(sheet, row, col) {
    if (row > sheet.length - 1) return null;
    var dataRow = sheet[row];
    if (dataRow == null) return null;
    if (col > dataRow.length - 1) return null;
    return dataRow[col];

}


id: 64c7b3429932ab2156cd1c6c
scriptid: 60d095db993254220bd8519f
tablename: app_script
clientip: 60.186.34.220
username: sa
createdate: 2023.07.31 21:19:13.000
script:
//后端导入excel数据包
function backend_importExcelData(excelData) {
    var ret = {
        'success': false,
        'message': ''
    }
    // return { success: false, message: excelData }
    var dsn = '';
    var masterTable = 'pzdj';
    var tableName = 'pzdjex';
    //ret.message="select id,userid,verifiername from pzdj where gguid='" + currentGUID() + "'";
    //return ret;

    runSQL("", "alter table  pzdjex   modify  bz  varchar(4000) ");
    runSQL("", "alter table  pzdjex   modify  rkdh  varchar(1000) ");
    

    var ds = newDataStore(dsn, "select id,userid,verifiername ,corpid from pzdj where gguid='" + currentGUID() + "'");
    ds.setOnceRetrieveCount(1);
    ds.retrieve('');
    if (ds.getRowCount() == 0) {
        ret.message = '请保存单据后再操作此功能!';
        return ret;
    }

    var corpid = ds.getString(0, "corpid");

    // if (ds.getString(0, "userid") != currentUserId()) {
    //     ret.message = '由于您不是制单人，不允许对当前单据做导入操作!';
    //     return ret;
    // }
    if (ds.getString(0, "verifiername") != '') {
        ret.message = '单据已审核，不允许导入操作!';
        return ret;
    }

    runSQL(dsn, "delete from " + tableName + " where gguid='" + currentGUID() + "'");

    //**********************************************
    //导入的标准功能
    var colLabel2ColName = {
        "年度": "y",
        "调整期间": "m",
        "期间": "m",
        "凭证号": "pzh",
        "调整凭证号": "pzh",
        "会计凭证号": "pzh",
        "凭证日期": "pzrq",
        "会计科目代码": "kmdm",
        "会计科目名称": "kmmc",
        "核算账号编码": "code",
        "借方金额": "jfje",
        "贷方金额": "dfje",
        "财会支出明细编码": "ckzcmxdm",
        "财会支出明细名称": "ckzcmxmc",
        "预会支出明细编码": "ykzcmxdm",
        "预会支出明细名称": "ykzcmxmc",
        "入库单号": "rkdh",
        "是否已过账": "posted",
        "摘要": "bz",
        "制单人": "zdr",
        "经办人": "jbr"
    }

    "年度\t调整期间\t凭证号\t凭证日期\t会计科目代码\t会计科目名称\t财会支出明细编码\t财会支出明细名称\t预会支出明细编码\t预会支出明细名称\t核算账号编码\t入库单号\t是否已过账\t摘要\t制单人";


    //var excelSheet;
    //for (var p in excelData) {
    //    excelSheet = excelData[p];
    //}

    var excelSheet = excelData;

    //分析字段对应关系
    var excelColIndex2ColName = {}; //excel 中的列号对应的中文题头
    var excelColName2ColIndex = {}; //中文题头对应的excel中的列号
    // var colLabel2ColName = {}; //中文题头对应到表的字段名


    var duplicateLabelCount = {};
    var colCount = 50; //最多几个列

    var headRow = 0; //题头在第几行
    var dataStartRow = 1; // 数据行从第几行开始
    //有时可能表头有多行合并，所以要检测一下
    for (var i = 0; i < colCount; i++) {
        var v = trim(sys_excelSafeValue(excelSheet, headRow, i));
        if (v == '')
            continue;
        if (duplicateLabelCount[v] == undefined) {
            duplicateLabelCount[v] = 0;
        }
        duplicateLabelCount[v] = duplicateLabelCount[v] + 1;

        if (duplicateLabelCount[v] > 1)
            v = v + duplicateLabelCount[v];
        //拼上后缀

        excelColIndex2ColName['' + i] = v;
        excelColName2ColIndex[v] = '' + i;
    }

    println(JSON.toString(excelColName2ColIndex));
     println(JSON.toString(excelColIndex2ColName));

    var RC = excelSheet.length;

println("excel数据行数："+RC);
    var data = [];
    for (var row = dataStartRow; row < RC; row++) {
        if (sys_excelSafeValue(excelSheet, row, 1) == null) break; //空行，直接结束
        var oneRowData = {};
        data.push(oneRowData);
        for (var label in excelColName2ColIndex) {
            var excelCol = excelColName2ColIndex[label];
            var dbCol = colLabel2ColName[label];
            if (dbCol != null) {
                oneRowData[dbCol] = sys_excelSafeValue(excelSheet, row, excelCol);
            }
        }

    }
    //println(JSON.toString(data));

    pushMessage("dr_info", "开始导入...", currentUserId());

    var gguid = currentGUID();
    var userid = currentUserId();
    var username = currentUserName();
    var lastmodifieddate = newDate();
    // println('import_ph:' + import_ph);



    var ds = newDataStore(dsn, "select * from " + tableName);
    ds.setUpdateProperty(tableName, "id", "*", "id");
    for (var i = 0; i < data.length; i++) {
        var row = ds.insertRow(9999999);
        pushMessage("dr_info", "导入进度：" + (i + 1) + "/" + data.length, currentUserId());

        var rowData = data[i];
        for (var col in rowData) {
            var value = rowData[col];
            ds.setValue(row, col, value);
        }
        ds.setValue(row, "id", newGuid());
        ds.setValue(row, "gguid", gguid);
        ds.setValue(row, "userid", userid);
        ds.setValue(row, "username", username);
        ds.setValue(row, "lastmodifieddate", lastmodifieddate);
        ds.setValue(row, "corpid", corpid);

        if (ds.getRowCount() == 1000) {
            if (!ds.update(true)) {
                var errInfo = ds.getError().getMessage();
                println(errInfo);
                pushMessage("dr_info", "异常：" + errInfo, currentUserId());
                return;
            }
            ds.reset();
        }
    }

    pushMessage("dr_info", "正在写入数据库...", currentUserId());

    ds.update(true);
    // $alert('导入完成');
    ret.success = true;
    ret.message = ds.getString(0, "userid");

    //更新起始记账期和截止记账期
    var master_ds = newDataStore(dsn, "select * from " + masterTable);
    master_ds.setUpdateProperty(masterTable, "id", "*", "id");
    master_ds.retrieve("gguid='" + currentGUID() + "'");
    master_ds.setValue(0, "jzq_start", getStringFromSQL2(dsn, "select min(y*100+m) as t from pzdjex where gguid='" + currentGUID() + "'"));
    master_ds.setValue(0, "jzq_end", getStringFromSQL2(dsn, "select max(y*100+m) as t from pzdjex where gguid='" + currentGUID() + "'"));
    master_ds.update(true)

    pushMessage('dr_info', 'over', currentUserId());

    return ret;
}

function sys_excelSafeValue(sheet, row, col) {
    if (row > sheet.length - 1) return null;
    var dataRow = sheet[row];
    if (dataRow == null) return null;
    if (col > dataRow.length - 1) return null;
    return dataRow[col];

}


id: 64c7b3429932ab2156cd1c75
scriptid: 60d095db993254220bd8519f
tablename: app_script
clientip: 60.186.34.220
username: sa
createdate: 2023.07.31 21:32:41.000
script:
//后端导入excel数据包
function backend_importExcelData(excelData) {
    var ret = {
        'success': false,
        'message': ''
    }
    // return { success: false, message: excelData }
    var dsn = '';
    var masterTable = 'pzdj';
    var tableName = 'pzdjex';
    //ret.message="select id,userid,verifiername from pzdj where gguid='" + currentGUID() + "'";
    //return ret;

    runSQL("", "alter table  pzdjex   modify  bz  varchar(4000) ");
    runSQL("", "alter table  pzdjex   modify  rkdh  varchar(1000) ");


    var ds = newDataStore(dsn, "select id,userid,verifiername ,corpid from pzdj where gguid='" + currentGUID() + "'");
    ds.setOnceRetrieveCount(1);
    ds.retrieve('');
    if (ds.getRowCount() == 0) {
        ret.message = '请保存单据后再操作此功能!';
        return ret;
    }

    var corpid = ds.getString(0, "corpid");

    // if (ds.getString(0, "userid") != currentUserId()) {
    //     ret.message = '由于您不是制单人，不允许对当前单据做导入操作!';
    //     return ret;
    // }
    if (ds.getString(0, "verifiername") != '') {
        ret.message = '单据已审核，不允许导入操作!';
        return ret;
    }

    runSQL(dsn, "delete from " + tableName + " where gguid='" + currentGUID() + "'");

    //**********************************************
    //导入的标准功能
    var colLabel2ColName = {
        "年度": "y",
        "调整期间": "m",
        "期间": "m",
        "凭证号": "pzh",
        "调整凭证号": "pzh",
        "会计凭证号": "pzh",
        "凭证日期": "pzrq",
        "会计科目代码": "kmdm",
        "会计科目名称": "kmmc",
        "核算账号编码": "code",
        "借方金额": "jfje",
        "贷方金额": "dfje",
        "财会支出明细编码": "ckzcmxdm",
        "财会支出明细名称": "ckzcmxmc",
        "预会支出明细编码": "ykzcmxdm",
        "预会支出明细名称": "ykzcmxmc",
        "入库单号": "rkdh",
        "是否已过账": "posted",
        "摘要": "bz",
        "制单人": "zdr",
        "经办人": "jbr"
    }

    "年度\t调整期间\t凭证号\t凭证日期\t会计科目代码\t会计科目名称\t财会支出明细编码\t财会支出明细名称\t预会支出明细编码\t预会支出明细名称\t核算账号编码\t入库单号\t是否已过账\t摘要\t制单人";


    //var excelSheet;
    //for (var p in excelData) {
    //    excelSheet = excelData[p];
    //}

    var excelSheet = excelData;

    //分析字段对应关系
    var excelColIndex2ColName = {}; //excel 中的列号对应的中文题头
    var excelColName2ColIndex = {}; //中文题头对应的excel中的列号
    // var colLabel2ColName = {}; //中文题头对应到表的字段名


    var duplicateLabelCount = {};
    var colCount = 50; //最多几个列

    var headRow = 0; //题头在第几行
    var dataStartRow = 1; // 数据行从第几行开始
    //有时可能表头有多行合并，所以要检测一下
    for (var i = 0; i < colCount; i++) {
        var v = trim(sys_excelSafeValue(excelSheet, headRow, i));
        if (v == '')
            continue;
        if (duplicateLabelCount[v] == undefined) {
            duplicateLabelCount[v] = 0;
        }
        duplicateLabelCount[v] = duplicateLabelCount[v] + 1;

        if (duplicateLabelCount[v] > 1)
            v = v + duplicateLabelCount[v];
        //拼上后缀

        excelColIndex2ColName['' + i] = v;
        excelColName2ColIndex[v] = '' + i;
    }

    println(JSON.toString(excelColName2ColIndex));
    println(JSON.toString(excelColIndex2ColName));

    var RC = excelSheet.length;

    println("excel数据行数：" + RC);
    var data = [];
    for (var row = dataStartRow; row < RC; row++) {
        if (sys_excelSafeValue(excelSheet, row, 1) == null) break; //空行，直接结束
        var oneRowData = {};
        data.push(oneRowData);
        for (var label in excelColName2ColIndex) {
            var excelCol = excelColName2ColIndex[label];
            var dbCol = colLabel2ColName[label];
            if (dbCol != null) {
                oneRowData[dbCol] = sys_excelSafeValue(excelSheet, row, excelCol);
            }
        }

    }
    //println(JSON.toString(data));

    pushMessage("dr_info", "开始导入...", currentUserId());

    var gguid = currentGUID();
    var userid = currentUserId();
    var username = currentUserName();
    var lastmodifieddate = newDate();
    // println('import_ph:' + import_ph);



    var ds = newDataStore(dsn, "select * from " + tableName);
    ds.setUpdateProperty(tableName, "id", "*", "id");
    for (var i = 0; i < data.length; i++) {
        var row = ds.insertRow(9999999);
        pushMessage("dr_info", "导入进度：" + (i + 1) + "/" + data.length, currentUserId());

        var rowData = data[i];
        for (var col in rowData) {
            var value = rowData[col];
            ds.setValue(row, col, value);
        }
        ds.setValue(row, "id", newGuid());
        ds.setValue(row, "gguid", gguid);
        ds.setValue(row, "userid", userid);
        ds.setValue(row, "username", username);
        ds.setValue(row, "lastmodifieddate", lastmodifieddate);
        ds.setValue(row, "corpid", corpid);

        if (ds.getRowCount() == 1000) {
            if (!ds.update(true)) {
                var errInfo = ds.getError().getMessage();
                println(errInfo);
                pushMessage("dr_info", "异常：" + errInfo, currentUserId());
                return;
            }
            ds.reset();
        }
    }

    pushMessage("dr_info", "正在写入数据库...", currentUserId());

    ds.update(true);
    // $alert('导入完成');
    ret.success = true;
    ret.message = ds.getString(0, "userid");

    //更新起始记账期和截止记账期
    var master_ds = newDataStore(dsn, "select * from " + masterTable);
    master_ds.setUpdateProperty(masterTable, "id", "*", "id");
    master_ds.retrieve("gguid='" + currentGUID() + "'");
    master_ds.setValue(0, "jzq_start", getStringFromSQL2(dsn, "select min(y*100+m) as t from pzdjex where gguid='" + currentGUID() + "'"));
    master_ds.setValue(0, "jzq_end", getStringFromSQL2(dsn, "select max(y*100+m) as t from pzdjex where gguid='" + currentGUID() + "'"));
    master_ds.update(true)

    pushMessage('dr_info', 'over', currentUserId());

    return ret;
}

function sys_excelSafeValue(sheet, row, col) {
    if (row > sheet.length - 1) return null;
    var dataRow = sheet[row];
    if (dataRow == null) return null;
    if (col > dataRow.length - 1) return null;
    return dataRow[col];

}


id: 64c7b3429932ab2156cd1c7e
scriptid: 60d095db993254220bd8519f
tablename: app_script
clientip: 60.186.34.220
username: sa
createdate: 2023.07.31 21:32:59.000
script:
//后端导入excel数据包
function backend_importExcelData(excelData) {
    var ret = {
        'success': false,
        'message': ''
    }
    // return { success: false, message: excelData }
    var dsn = '';
    var masterTable = 'pzdj';
    var tableName = 'pzdjex';
    //ret.message="select id,userid,verifiername from pzdj where gguid='" + currentGUID() + "'";
    //return ret;

    println("1111");
    runSQL("", "alter table  pzdjex   modify  bz  varchar(4000) ");
    runSQL("", "alter table  pzdjex   modify  rkdh  varchar(1000) ");


    var ds = newDataStore(dsn, "select id,userid,verifiername ,corpid from pzdj where gguid='" + currentGUID() + "'");
    ds.setOnceRetrieveCount(1);
    ds.retrieve('');
    if (ds.getRowCount() == 0) {
        ret.message = '请保存单据后再操作此功能!';
        return ret;
    }

    var corpid = ds.getString(0, "corpid");

    // if (ds.getString(0, "userid") != currentUserId()) {
    //     ret.message = '由于您不是制单人，不允许对当前单据做导入操作!';
    //     return ret;
    // }
    if (ds.getString(0, "verifiername") != '') {
        ret.message = '单据已审核，不允许导入操作!';
        return ret;
    }

    runSQL(dsn, "delete from " + tableName + " where gguid='" + currentGUID() + "'");

    //**********************************************
    //导入的标准功能
    var colLabel2ColName = {
        "年度": "y",
        "调整期间": "m",
        "期间": "m",
        "凭证号": "pzh",
        "调整凭证号": "pzh",
        "会计凭证号": "pzh",
        "凭证日期": "pzrq",
        "会计科目代码": "kmdm",
        "会计科目名称": "kmmc",
        "核算账号编码": "code",
        "借方金额": "jfje",
        "贷方金额": "dfje",
        "财会支出明细编码": "ckzcmxdm",
        "财会支出明细名称": "ckzcmxmc",
        "预会支出明细编码": "ykzcmxdm",
        "预会支出明细名称": "ykzcmxmc",
        "入库单号": "rkdh",
        "是否已过账": "posted",
        "摘要": "bz",
        "制单人": "zdr",
        "经办人": "jbr"
    }

    "年度\t调整期间\t凭证号\t凭证日期\t会计科目代码\t会计科目名称\t财会支出明细编码\t财会支出明细名称\t预会支出明细编码\t预会支出明细名称\t核算账号编码\t入库单号\t是否已过账\t摘要\t制单人";


    //var excelSheet;
    //for (var p in excelData) {
    //    excelSheet = excelData[p];
    //}

    var excelSheet = excelData;

    //分析字段对应关系
    var excelColIndex2ColName = {}; //excel 中的列号对应的中文题头
    var excelColName2ColIndex = {}; //中文题头对应的excel中的列号
    // var colLabel2ColName = {}; //中文题头对应到表的字段名


    var duplicateLabelCount = {};
    var colCount = 50; //最多几个列

    var headRow = 0; //题头在第几行
    var dataStartRow = 1; // 数据行从第几行开始
    //有时可能表头有多行合并，所以要检测一下
    for (var i = 0; i < colCount; i++) {
        var v = trim(sys_excelSafeValue(excelSheet, headRow, i));
        if (v == '')
            continue;
        if (duplicateLabelCount[v] == undefined) {
            duplicateLabelCount[v] = 0;
        }
        duplicateLabelCount[v] = duplicateLabelCount[v] + 1;

        if (duplicateLabelCount[v] > 1)
            v = v + duplicateLabelCount[v];
        //拼上后缀

        excelColIndex2ColName['' + i] = v;
        excelColName2ColIndex[v] = '' + i;
    }

    println(JSON.toString(excelColName2ColIndex));
    println(JSON.toString(excelColIndex2ColName));

    var RC = excelSheet.length;

    println("excel数据行数：" + RC);
    var data = [];
    for (var row = dataStartRow; row < RC; row++) {
        if (sys_excelSafeValue(excelSheet, row, 1) == null) break; //空行，直接结束
        var oneRowData = {};
        data.push(oneRowData);
        for (var label in excelColName2ColIndex) {
            var excelCol = excelColName2ColIndex[label];
            var dbCol = colLabel2ColName[label];
            if (dbCol != null) {
                oneRowData[dbCol] = sys_excelSafeValue(excelSheet, row, excelCol);
            }
        }

    }
    //println(JSON.toString(data));

    pushMessage("dr_info", "开始导入...", currentUserId());

    var gguid = currentGUID();
    var userid = currentUserId();
    var username = currentUserName();
    var lastmodifieddate = newDate();
    // println('import_ph:' + import_ph);



    var ds = newDataStore(dsn, "select * from " + tableName);
    ds.setUpdateProperty(tableName, "id", "*", "id");
    for (var i = 0; i < data.length; i++) {
        var row = ds.insertRow(9999999);
        pushMessage("dr_info", "导入进度：" + (i + 1) + "/" + data.length, currentUserId());

        var rowData = data[i];
        for (var col in rowData) {
            var value = rowData[col];
            ds.setValue(row, col, value);
        }
        ds.setValue(row, "id", newGuid());
        ds.setValue(row, "gguid", gguid);
        ds.setValue(row, "userid", userid);
        ds.setValue(row, "username", username);
        ds.setValue(row, "lastmodifieddate", lastmodifieddate);
        ds.setValue(row, "corpid", corpid);

        if (ds.getRowCount() == 1000) {
            if (!ds.update(true)) {
                var errInfo = ds.getError().getMessage();
                println(errInfo);
                pushMessage("dr_info", "异常：" + errInfo, currentUserId());
                return;
            }
            ds.reset();
        }
    }

    pushMessage("dr_info", "正在写入数据库...", currentUserId());

    ds.update(true);
    // $alert('导入完成');
    ret.success = true;
    ret.message = ds.getString(0, "userid");

    //更新起始记账期和截止记账期
    var master_ds = newDataStore(dsn, "select * from " + masterTable);
    master_ds.setUpdateProperty(masterTable, "id", "*", "id");
    master_ds.retrieve("gguid='" + currentGUID() + "'");
    master_ds.setValue(0, "jzq_start", getStringFromSQL2(dsn, "select min(y*100+m) as t from pzdjex where gguid='" + currentGUID() + "'"));
    master_ds.setValue(0, "jzq_end", getStringFromSQL2(dsn, "select max(y*100+m) as t from pzdjex where gguid='" + currentGUID() + "'"));
    master_ds.update(true)

    pushMessage('dr_info', 'over', currentUserId());

    return ret;
}

function sys_excelSafeValue(sheet, row, col) {
    if (row > sheet.length - 1) return null;
    var dataRow = sheet[row];
    if (dataRow == null) return null;
    if (col > dataRow.length - 1) return null;
    return dataRow[col];

}


id: 64c7b3429932ab2156cd1c88
scriptid: 60d095db993254220bd8519f
tablename: app_script
clientip: 60.186.34.220
username: sa
createdate: 2023.07.31 21:36:34.000
script:
//后端导入excel数据包
function backend_importExcelData(excelData) {
    var ret = {
        'success': false,
        'message': ''
    }
    // return { success: false, message: excelData }
    var dsn = '';
    var masterTable = 'pzdj';
    var tableName = 'pzdjex';
    //ret.message="select id,userid,verifiername from pzdj where gguid='" + currentGUID() + "'";
    //return ret;

    println("1111");
    runSQL("", "alter table  pzdjex   modify  bz  varchar(4000) ");
    runSQL("", "alter table  pzdjex   modify  rkdh  varchar(1000) ");


    var ds = newDataStore(dsn, "select id,userid,verifiername ,corpid from pzdj where gguid='" + currentGUID() + "'");
    ds.setOnceRetrieveCount(1);
    ds.retrieve('');
    if (ds.getRowCount() == 0) {
        ret.message = '请保存单据后再操作此功能!';
        return ret;
    }

    var corpid = ds.getString(0, "corpid");

    // if (ds.getString(0, "userid") != currentUserId()) {
    //     ret.message = '由于您不是制单人，不允许对当前单据做导入操作!';
    //     return ret;
    // }
    if (ds.getString(0, "verifiername") != '') {
        ret.message = '单据已审核，不允许导入操作!';
        return ret;
    }

    runSQL(dsn, "delete from " + tableName + " where gguid='" + currentGUID() + "'");

    //**********************************************
    //导入的标准功能
    var colLabel2ColName = {
        "年度": "y",
        "调整期间": "m",
        "期间": "m",
        "凭证号": "pzh",
        "调整凭证号": "pzh",
        "会计凭证号": "pzh",
        "凭证日期": "pzrq",
        "会计科目代码": "kmdm",
        "会计科目名称": "kmmc",
        "核算账号编码": "code",
        "借方金额": "jfje",
        "贷方金额": "dfje",
        "财会支出明细编码": "ckzcmxdm",
        "财会支出明细名称": "ckzcmxmc",
        "预会支出明细编码": "ykzcmxdm",
        "预会支出明细名称": "ykzcmxmc",
        "入库单号": "rkdh",
        "是否已过账": "posted",
        "摘要": "bz",
        "制单人": "zdr",
        "经办人": "jbr"
    }

    "年度\t调整期间\t凭证号\t凭证日期\t会计科目代码\t会计科目名称\t财会支出明细编码\t财会支出明细名称\t预会支出明细编码\t预会支出明细名称\t核算账号编码\t入库单号\t是否已过账\t摘要\t制单人";


    //var excelSheet;
    //for (var p in excelData) {
    //    excelSheet = excelData[p];
    //}

    var excelSheet = excelData;

    //分析字段对应关系
    var excelColIndex2ColName = {}; //excel 中的列号对应的中文题头
    var excelColName2ColIndex = {}; //中文题头对应的excel中的列号
    // var colLabel2ColName = {}; //中文题头对应到表的字段名


    var duplicateLabelCount = {};
    var colCount = 50; //最多几个列

    var headRow = 0; //题头在第几行
    var dataStartRow = 1; // 数据行从第几行开始
    //有时可能表头有多行合并，所以要检测一下
    for (var i = 0; i < colCount; i++) {
        var v = trim(sys_excelSafeValue(excelSheet, headRow, i));
        if (v == '')
            continue;
        if (duplicateLabelCount[v] == undefined) {
            duplicateLabelCount[v] = 0;
        }
        duplicateLabelCount[v] = duplicateLabelCount[v] + 1;

        if (duplicateLabelCount[v] > 1)
            v = v + duplicateLabelCount[v];
        //拼上后缀

        excelColIndex2ColName['' + i] = v;
        excelColName2ColIndex[v] = '' + i;
    }

    println(JSON.toString(excelColName2ColIndex));
    println(JSON.toString(excelColIndex2ColName));

    var RC = excelSheet.length;

    println("excel数据行数：" + RC);
    var data = [];
    for (var row = dataStartRow; row < RC; row++) {
        if (sys_excelSafeValue(excelSheet, row, 3) == null) break; //空行，直接结束
        var oneRowData = {};
        data.push(oneRowData);
        for (var label in excelColName2ColIndex) {
            var excelCol = excelColName2ColIndex[label];
            var dbCol = colLabel2ColName[label];
            if (dbCol != null) {
                oneRowData[dbCol] = sys_excelSafeValue(excelSheet, row, excelCol);
            }
        }

    }
    //println(JSON.toString(data));

    pushMessage("dr_info", "开始导入...", currentUserId());

    var gguid = currentGUID();
    var userid = currentUserId();
    var username = currentUserName();
    var lastmodifieddate = newDate();
    // println('import_ph:' + import_ph);



    var ds = newDataStore(dsn, "select * from " + tableName);
    ds.setUpdateProperty(tableName, "id", "*", "id");
    for (var i = 0; i < data.length; i++) {
        var row = ds.insertRow(9999999);
        pushMessage("dr_info", "导入进度：" + (i + 1) + "/" + data.length, currentUserId());

        var rowData = data[i];
        for (var col in rowData) {
            var value = rowData[col];
            ds.setValue(row, col, value);
        }
        ds.setValue(row, "id", newGuid());
        ds.setValue(row, "gguid", gguid);
        ds.setValue(row, "userid", userid);
        ds.setValue(row, "username", username);
        ds.setValue(row, "lastmodifieddate", lastmodifieddate);
        ds.setValue(row, "corpid", corpid);

        if (ds.getRowCount() == 1000) {
            if (!ds.update(true)) {
                var errInfo = ds.getError().getMessage();
                println(errInfo);
                pushMessage("dr_info", "异常：" + errInfo, currentUserId());
                return;
            }
            ds.reset();
        }
    }

    pushMessage("dr_info", "正在写入数据库...", currentUserId());

    ds.update(true);
    // $alert('导入完成');
    ret.success = true;
    ret.message = ds.getString(0, "userid");

    //更新起始记账期和截止记账期
    var master_ds = newDataStore(dsn, "select * from " + masterTable);
    master_ds.setUpdateProperty(masterTable, "id", "*", "id");
    master_ds.retrieve("gguid='" + currentGUID() + "'");
    master_ds.setValue(0, "jzq_start", getStringFromSQL2(dsn, "select min(y*100+m) as t from pzdjex where gguid='" + currentGUID() + "'"));
    master_ds.setValue(0, "jzq_end", getStringFromSQL2(dsn, "select max(y*100+m) as t from pzdjex where gguid='" + currentGUID() + "'"));
    master_ds.update(true)

    pushMessage('dr_info', 'over', currentUserId());

    return ret;
}

function sys_excelSafeValue(sheet, row, col) {
    if (row > sheet.length - 1) return null;
    var dataRow = sheet[row];
    if (dataRow == null) return null;
    if (col > dataRow.length - 1) return null;
    return dataRow[col];

}


id: 64c7b3429932ab2156cd1c91
scriptid: 60d095db993254220bd8519f
tablename: app_script
clientip: 60.186.34.220
username: sa
createdate: 2023.07.31 21:36:46.000
script:
//后端导入excel数据包
function backend_importExcelData(excelData) {
    var ret = {
        'success': false,
        'message': ''
    }
    // return { success: false, message: excelData }
    var dsn = '';
    var masterTable = 'pzdj';
    var tableName = 'pzdjex';
    //ret.message="select id,userid,verifiername from pzdj where gguid='" + currentGUID() + "'";
    //return ret;

    println("1111");
    runSQL("", "alter table  pzdjex   modify  bz  varchar(4000) ");
    runSQL("", "alter table  pzdjex   modify  rkdh  varchar(1000) ");


    var ds = newDataStore(dsn, "select id,userid,verifiername ,corpid from pzdj where gguid='" + currentGUID() + "'");
    ds.setOnceRetrieveCount(1);
    ds.retrieve('');
    if (ds.getRowCount() == 0) {
        ret.message = '请保存单据后再操作此功能!';
        return ret;
    }

    var corpid = ds.getString(0, "corpid");

    // if (ds.getString(0, "userid") != currentUserId()) {
    //     ret.message = '由于您不是制单人，不允许对当前单据做导入操作!';
    //     return ret;
    // }
    if (ds.getString(0, "verifiername") != '') {
        ret.message = '单据已审核，不允许导入操作!';
        return ret;
    }

    runSQL(dsn, "delete from " + tableName + " where gguid='" + currentGUID() + "'");

    //**********************************************
    //导入的标准功能
    var colLabel2ColName = {
        "年度": "y",
        "调整期间": "m",
        "期间": "m",
        "凭证号": "pzh",
        "调整凭证号": "pzh",
        "会计凭证号": "pzh",
        "凭证日期": "pzrq",
        "会计科目代码": "kmdm",
        "会计科目名称": "kmmc",
        "核算账号编码": "code",
        "借方金额": "jfje",
        "贷方金额": "dfje",
        "财会支出明细编码": "ckzcmxdm",
        "财会支出明细名称": "ckzcmxmc",
        "预会支出明细编码": "ykzcmxdm",
        "预会支出明细名称": "ykzcmxmc",
        "入库单号": "rkdh",
        "是否已过账": "posted",
        "摘要": "bz",
        "制单人": "zdr",
        "经办人": "jbr"
    }

    "年度\t调整期间\t凭证号\t凭证日期\t会计科目代码\t会计科目名称\t财会支出明细编码\t财会支出明细名称\t预会支出明细编码\t预会支出明细名称\t核算账号编码\t入库单号\t是否已过账\t摘要\t制单人";


    //var excelSheet;
    //for (var p in excelData) {
    //    excelSheet = excelData[p];
    //}

    var excelSheet = excelData;

    //分析字段对应关系
    var excelColIndex2ColName = {}; //excel 中的列号对应的中文题头
    var excelColName2ColIndex = {}; //中文题头对应的excel中的列号
    // var colLabel2ColName = {}; //中文题头对应到表的字段名


    var duplicateLabelCount = {};
    var colCount = 50; //最多几个列

    var headRow = 0; //题头在第几行
    var dataStartRow = 1; // 数据行从第几行开始
    //有时可能表头有多行合并，所以要检测一下
    for (var i = 0; i < colCount; i++) {
        var v = trim(sys_excelSafeValue(excelSheet, headRow, i));
        if (v == '')
            continue;
        if (duplicateLabelCount[v] == undefined) {
            duplicateLabelCount[v] = 0;
        }
        duplicateLabelCount[v] = duplicateLabelCount[v] + 1;

        if (duplicateLabelCount[v] > 1)
            v = v + duplicateLabelCount[v];
        //拼上后缀

        excelColIndex2ColName['' + i] = v;
        excelColName2ColIndex[v] = '' + i;
    }

    println(JSON.toString(excelColName2ColIndex));
    println(JSON.toString(excelColIndex2ColName));

    var RC = excelSheet.length;

    println("excel数据行数：" + RC);
    var data = [];
    for (var row = dataStartRow; row < RC; row++) {
       // if (sys_excelSafeValue(excelSheet, row, 3) == null) break; //空行，直接结束
        var oneRowData = {};
        data.push(oneRowData);
        for (var label in excelColName2ColIndex) {
            var excelCol = excelColName2ColIndex[label];
            var dbCol = colLabel2ColName[label];
            if (dbCol != null) {
                oneRowData[dbCol] = sys_excelSafeValue(excelSheet, row, excelCol);
            }
        }

    }
    //println(JSON.toString(data));

    pushMessage("dr_info", "开始导入...", currentUserId());

    var gguid = currentGUID();
    var userid = currentUserId();
    var username = currentUserName();
    var lastmodifieddate = newDate();
    // println('import_ph:' + import_ph);



    var ds = newDataStore(dsn, "select * from " + tableName);
    ds.setUpdateProperty(tableName, "id", "*", "id");
    for (var i = 0; i < data.length; i++) {
        var row = ds.insertRow(9999999);
        pushMessage("dr_info", "导入进度：" + (i + 1) + "/" + data.length, currentUserId());

        var rowData = data[i];
        for (var col in rowData) {
            var value = rowData[col];
            ds.setValue(row, col, value);
        }
        ds.setValue(row, "id", newGuid());
        ds.setValue(row, "gguid", gguid);
        ds.setValue(row, "userid", userid);
        ds.setValue(row, "username", username);
        ds.setValue(row, "lastmodifieddate", lastmodifieddate);
        ds.setValue(row, "corpid", corpid);

        if (ds.getRowCount() == 1000) {
            if (!ds.update(true)) {
                var errInfo = ds.getError().getMessage();
                println(errInfo);
                pushMessage("dr_info", "异常：" + errInfo, currentUserId());
                return;
            }
            ds.reset();
        }
    }

    pushMessage("dr_info", "正在写入数据库...", currentUserId());

    ds.update(true);
    // $alert('导入完成');
    ret.success = true;
    ret.message = ds.getString(0, "userid");

    //更新起始记账期和截止记账期
    var master_ds = newDataStore(dsn, "select * from " + masterTable);
    master_ds.setUpdateProperty(masterTable, "id", "*", "id");
    master_ds.retrieve("gguid='" + currentGUID() + "'");
    master_ds.setValue(0, "jzq_start", getStringFromSQL2(dsn, "select min(y*100+m) as t from pzdjex where gguid='" + currentGUID() + "'"));
    master_ds.setValue(0, "jzq_end", getStringFromSQL2(dsn, "select max(y*100+m) as t from pzdjex where gguid='" + currentGUID() + "'"));
    master_ds.update(true)

    pushMessage('dr_info', 'over', currentUserId());

    return ret;
}

function sys_excelSafeValue(sheet, row, col) {
    if (row > sheet.length - 1) return null;
    var dataRow = sheet[row];
    if (dataRow == null) return null;
    if (col > dataRow.length - 1) return null;
    return dataRow[col];

}


id: 64c7b3429932ab2156cd1c9a
scriptid: 60d095db993254220bd8519f
tablename: app_script
clientip: 60.186.34.220
username: sa
createdate: 2023.07.31 21:36:59.000
script:
//后端导入excel数据包
function backend_importExcelData(excelData) {
    var ret = {
        'success': false,
        'message': ''
    }
    // return { success: false, message: excelData }
    var dsn = '';
    var masterTable = 'pzdj';
    var tableName = 'pzdjex';
    //ret.message="select id,userid,verifiername from pzdj where gguid='" + currentGUID() + "'";
    //return ret;

    println("1111");
    runSQL("", "alter table  pzdjex   modify  bz  varchar(4000) ");
    runSQL("", "alter table  pzdjex   modify  rkdh  varchar(1000) ");


    var ds = newDataStore(dsn, "select id,userid,verifiername ,corpid from pzdj where gguid='" + currentGUID() + "'");
    ds.setOnceRetrieveCount(1);
    ds.retrieve('');
    if (ds.getRowCount() == 0) {
        ret.message = '请保存单据后再操作此功能!';
        return ret;
    }

    var corpid = ds.getString(0, "corpid");

    // if (ds.getString(0, "userid") != currentUserId()) {
    //     ret.message = '由于您不是制单人，不允许对当前单据做导入操作!';
    //     return ret;
    // }
    if (ds.getString(0, "verifiername") != '') {
        ret.message = '单据已审核，不允许导入操作!';
        return ret;
    }

    runSQL(dsn, "delete from " + tableName + " where gguid='" + currentGUID() + "'");

    //**********************************************
    //导入的标准功能
    var colLabel2ColName = {
        "年度": "y",
        "调整期间": "m",
        "期间": "m",
        "凭证号": "pzh",
        "调整凭证号": "pzh",
        "会计凭证号": "pzh",
        "凭证日期": "pzrq",
        "会计科目代码": "kmdm",
        "会计科目名称": "kmmc",
        "核算账号编码": "code",
        "借方金额": "jfje",
        "贷方金额": "dfje",
        "财会支出明细编码": "ckzcmxdm",
        "财会支出明细名称": "ckzcmxmc",
        "预会支出明细编码": "ykzcmxdm",
        "预会支出明细名称": "ykzcmxmc",
        "入库单号": "rkdh",
        "是否已过账": "posted",
        "摘要": "bz",
        "制单人": "zdr",
        "经办人": "jbr"
    }

    "年度\t调整期间\t凭证号\t凭证日期\t会计科目代码\t会计科目名称\t财会支出明细编码\t财会支出明细名称\t预会支出明细编码\t预会支出明细名称\t核算账号编码\t入库单号\t是否已过账\t摘要\t制单人";


    //var excelSheet;
    //for (var p in excelData) {
    //    excelSheet = excelData[p];
    //}

    var excelSheet = excelData;

    //分析字段对应关系
    var excelColIndex2ColName = {}; //excel 中的列号对应的中文题头
    var excelColName2ColIndex = {}; //中文题头对应的excel中的列号
    // var colLabel2ColName = {}; //中文题头对应到表的字段名


    var duplicateLabelCount = {};
    var colCount = 50; //最多几个列

    var headRow = 0; //题头在第几行
    var dataStartRow = 1; // 数据行从第几行开始
    //有时可能表头有多行合并，所以要检测一下
    for (var i = 0; i < colCount; i++) {
        var v = trim(sys_excelSafeValue(excelSheet, headRow, i));
        if (v == '')
            continue;
        if (duplicateLabelCount[v] == undefined) {
            duplicateLabelCount[v] = 0;
        }
        duplicateLabelCount[v] = duplicateLabelCount[v] + 1;

        if (duplicateLabelCount[v] > 1)
            v = v + duplicateLabelCount[v];
        //拼上后缀

        excelColIndex2ColName['' + i] = v;
        excelColName2ColIndex[v] = '' + i;
    }

    println(JSON.toString(excelColName2ColIndex));
    println(JSON.toString(excelColIndex2ColName));

    var RC = excelSheet.length;

    println("excel数据行数：" + RC);
    var data = [];
    for (var row = dataStartRow; row < RC; row++) {
         if (sys_excelSafeValue(excelSheet, row, 3) == null) break; //空行，直接结束
        var oneRowData = {};
        data.push(oneRowData);
        for (var label in excelColName2ColIndex) {
            var excelCol = excelColName2ColIndex[label];
            var dbCol = colLabel2ColName[label];
            if (dbCol != null) {
                oneRowData[dbCol] = sys_excelSafeValue(excelSheet, row, excelCol);
            }
        }

    }
    //println(JSON.toString(data));

    pushMessage("dr_info", "开始导入...", currentUserId());

    var gguid = currentGUID();
    var userid = currentUserId();
    var username = currentUserName();
    var lastmodifieddate = newDate();
    // println('import_ph:' + import_ph);



    var ds = newDataStore(dsn, "select * from " + tableName);
    ds.setUpdateProperty(tableName, "id", "*", "id");
    for (var i = 0; i < data.length; i++) {
        var row = ds.insertRow(9999999);
        pushMessage("dr_info", "导入进度：" + (i + 1) + "/" + data.length, currentUserId());

        var rowData = data[i];
        for (var col in rowData) {
            var value = rowData[col];
            ds.setValue(row, col, value);
        }
        ds.setValue(row, "id", newGuid());
        ds.setValue(row, "gguid", gguid);
        ds.setValue(row, "userid", userid);
        ds.setValue(row, "username", username);
        ds.setValue(row, "lastmodifieddate", lastmodifieddate);
        ds.setValue(row, "corpid", corpid);

        if (ds.getRowCount() == 1000) {
            if (!ds.update(true)) {
                var errInfo = ds.getError().getMessage();
                println(errInfo);
                pushMessage("dr_info", "异常：" + errInfo, currentUserId());
                return;
            }
            ds.reset();
        }
    }

    pushMessage("dr_info", "正在写入数据库...", currentUserId());

    ds.update(true);
    // $alert('导入完成');
    ret.success = true;
    ret.message = ds.getString(0, "userid");

    //更新起始记账期和截止记账期
    var master_ds = newDataStore(dsn, "select * from " + masterTable);
    master_ds.setUpdateProperty(masterTable, "id", "*", "id");
    master_ds.retrieve("gguid='" + currentGUID() + "'");
    master_ds.setValue(0, "jzq_start", getStringFromSQL2(dsn, "select min(y*100+m) as t from pzdjex where gguid='" + currentGUID() + "'"));
    master_ds.setValue(0, "jzq_end", getStringFromSQL2(dsn, "select max(y*100+m) as t from pzdjex where gguid='" + currentGUID() + "'"));
    master_ds.update(true)

    pushMessage('dr_info', 'over', currentUserId());

    return ret;
}

function sys_excelSafeValue(sheet, row, col) {
    if (row > sheet.length - 1) return null;
    var dataRow = sheet[row];
    if (dataRow == null) return null;
    if (col > dataRow.length - 1) return null;
    return dataRow[col];

}


id: 64c7bc809932f3eabab890cd
scriptid: 60d095db993254220bd8519f
tablename: app_script
clientip: 60.186.34.220
username: sa
createdate: 2023.07.31 21:52:17.000
script:
//后端导入excel数据包
function backend_importExcelData(excelData) {
    var ret = {
        'success': false,
        'message': ''
    }
    // return { success: false, message: excelData }
    var dsn = '';
    var masterTable = 'pzdj';
    var tableName = 'pzdjex';
    //ret.message="select id,userid,verifiername from pzdj where gguid='" + currentGUID() + "'";
    //return ret;

    println("1111");
    runSQL("", "alter table  pzdjex   modify  bz  varchar(4000) ");
    runSQL("", "alter table  pzdjex   modify  rkdh  varchar(1000) ");


    var ds = newDataStore(dsn, "select id,userid,verifiername ,corpid from pzdj where gguid='" + currentGUID() + "'");
    ds.setOnceRetrieveCount(1);
    ds.retrieve('');
    if (ds.getRowCount() == 0) {
        ret.message = '请保存单据后再操作此功能!';
        return ret;
    }

    var corpid = ds.getString(0, "corpid");

    // if (ds.getString(0, "userid") != currentUserId()) {
    //     ret.message = '由于您不是制单人，不允许对当前单据做导入操作!';
    //     return ret;
    // }
    if (ds.getString(0, "verifiername") != '') {
        ret.message = '单据已审核，不允许导入操作!';
        return ret;
    }

    runSQL(dsn, "delete from " + tableName + " where gguid='" + currentGUID() + "'");

    //**********************************************
    //导入的标准功能
    var colLabel2ColName = {
        "年度": "y",
        "调整期间": "m",
        "期间": "m",
        "凭证号": "pzh",
        "调整凭证号": "pzh",
        "会计凭证号": "pzh",
        "凭证日期": "pzrq",
        "会计科目代码": "kmdm",
        "会计科目名称": "kmmc",
        "核算账号编码": "code",
        "借方金额": "jfje",
        "贷方金额": "dfje",
        "财会支出明细编码": "ckzcmxdm",
        "财会支出明细名称": "ckzcmxmc",
        "预会支出明细编码": "ykzcmxdm",
        "预会支出明细名称": "ykzcmxmc",
        "入库单号": "rkdh",
        "是否已过账": "posted",
        "摘要": "bz",
        "制单人": "zdr",
        "经办人": "jbr"
    }

    "年度\t调整期间\t凭证号\t凭证日期\t会计科目代码\t会计科目名称\t财会支出明细编码\t财会支出明细名称\t预会支出明细编码\t预会支出明细名称\t核算账号编码\t入库单号\t是否已过账\t摘要\t制单人";


    //var excelSheet;
    //for (var p in excelData) {
    //    excelSheet = excelData[p];
    //}

    var excelSheet = excelData;

    //分析字段对应关系
    var excelColIndex2ColName = {}; //excel 中的列号对应的中文题头
    var excelColName2ColIndex = {}; //中文题头对应的excel中的列号
    // var colLabel2ColName = {}; //中文题头对应到表的字段名


    var duplicateLabelCount = {};
    var colCount = 50; //最多几个列

    var headRow = 0; //题头在第几行
    var dataStartRow = 1; // 数据行从第几行开始
    //有时可能表头有多行合并，所以要检测一下
    for (var i = 0; i < colCount; i++) {
        var v = trim(sys_excelSafeValue(excelSheet, headRow, i));
        if (v == '')
            continue;
        if (duplicateLabelCount[v] == undefined) {
            duplicateLabelCount[v] = 0;
        }
        duplicateLabelCount[v] = duplicateLabelCount[v] + 1;

        if (duplicateLabelCount[v] > 1)
            v = v + duplicateLabelCount[v];
        //拼上后缀

        excelColIndex2ColName['' + i] = v;
        excelColName2ColIndex[v] = '' + i;
    }

    println(JSON.toString(excelColName2ColIndex));
    println(JSON.toString(excelColIndex2ColName));


    var RC = excelSheet.length;

    println("excel数据行数：" + RC);
    var data = [];
    for (var row = dataStartRow; row < RC; row++) {
         if (sys_excelSafeValue(excelSheet, row, 3) == null) break; //空行，直接结束
        var oneRowData = {};
        data.push(oneRowData);
        for (var label in excelColName2ColIndex) {
            var excelCol = excelColName2ColIndex[label];
            var dbCol = colLabel2ColName[label];
            if (dbCol != null) {
                oneRowData[dbCol] = sys_excelSafeValue(excelSheet, row, excelCol);
            }
        }

    }
    //println(JSON.toString(data));

    pushMessage("dr_info", "开始导入...", currentUserId());

    var gguid = currentGUID();
    var userid = currentUserId();
    var username = currentUserName();
    var lastmodifieddate = newDate();
    // println('import_ph:' + import_ph);



    var ds = newDataStore(dsn, "select * from " + tableName);
    ds.setUpdateProperty(tableName, "id", "*", "id");
    for (var i = 0; i < data.length; i++) {
        var row = ds.insertRow(9999999);
        pushMessage("dr_info", "导入进度：" + (i + 1) + "/" + data.length, currentUserId());

        var rowData = data[i];
        for (var col in rowData) {
            var value = rowData[col];
            ds.setValue(row, col, value);
        }
        ds.setValue(row, "id", newGuid());
        ds.setValue(row, "gguid", gguid);
        ds.setValue(row, "userid", userid);
        ds.setValue(row, "username", username);
        ds.setValue(row, "lastmodifieddate", lastmodifieddate);
        ds.setValue(row, "corpid", corpid);

        if (ds.getRowCount() == 1000) {
            if (!ds.update(true)) {
                var errInfo = ds.getError().getMessage();
                println(errInfo);
                pushMessage("dr_info", "异常：" + errInfo, currentUserId());
                return;
            }
            ds.reset();
        }
    }

    pushMessage("dr_info", "正在写入数据库...", currentUserId());

    ds.update(true);
    // $alert('导入完成');
    ret.success = true;
    ret.message = ds.getString(0, "userid");

    //更新起始记账期和截止记账期
    var master_ds = newDataStore(dsn, "select * from " + masterTable);
    master_ds.setUpdateProperty(masterTable, "id", "*", "id");
    master_ds.retrieve("gguid='" + currentGUID() + "'");
    master_ds.setValue(0, "jzq_start", getStringFromSQL2(dsn, "select min(y*100+m) as t from pzdjex where gguid='" + currentGUID() + "'"));
    master_ds.setValue(0, "jzq_end", getStringFromSQL2(dsn, "select max(y*100+m) as t from pzdjex where gguid='" + currentGUID() + "'"));
    master_ds.update(true)

    pushMessage('dr_info', 'over', currentUserId());

    return ret;
}

function sys_excelSafeValue(sheet, row, col) {
    if (row > sheet.length - 1) return null;
    var dataRow = sheet[row];
    if (dataRow == null) return null;
    if (col > dataRow.length - 1) return null;
    return dataRow[col];

}


id: 64c7bc809932f3eabab890e0
scriptid: 60d095db993254220bd8519f
tablename: app_script
clientip: 60.186.34.220
username: sa
createdate: 2023.07.31 21:54:51.000
script:
//后端导入excel数据包
function backend_importExcelData(excelData) {
    var ret = {
        'success': false,
        'message': ''
    }
    // return { success: false, message: excelData }
    var dsn = '';
    var masterTable = 'pzdj';
    var tableName = 'pzdjex';
    //ret.message="select id,userid,verifiername from pzdj where gguid='" + currentGUID() + "'";
    //return ret;

    println("1111");
    runSQL("", "alter table  pzdjex   modify  bz  varchar(4000) ");
    runSQL("", "alter table  pzdjex   modify  rkdh  varchar(1000) ");


    var ds = newDataStore(dsn, "select id,userid,verifiername ,corpid from pzdj where gguid='" + currentGUID() + "'");
    ds.setOnceRetrieveCount(1);
    ds.retrieve('');
    if (ds.getRowCount() == 0) {
        ret.message = '请保存单据后再操作此功能!';
        return ret;
    }

    var corpid = ds.getString(0, "corpid");

    // if (ds.getString(0, "userid") != currentUserId()) {
    //     ret.message = '由于您不是制单人，不允许对当前单据做导入操作!';
    //     return ret;
    // }
    if (ds.getString(0, "verifiername") != '') {
        ret.message = '单据已审核，不允许导入操作!';
        return ret;
    }

    runSQL(dsn, "delete from " + tableName + " where gguid='" + currentGUID() + "'");

    //**********************************************
    //导入的标准功能
    var colLabel2ColName = {
        "年度": "y",
        "调整期间": "m",
        "期间": "m",
        "凭证号": "pzh",
        "调整凭证号": "pzh",
        "会计凭证号": "pzh",
        "凭证日期": "pzrq",
        "会计科目代码": "kmdm",
        "会计科目名称": "kmmc",
        "核算账号编码": "code",
        "借方金额": "jfje",
        "贷方金额": "dfje",
        "财会支出明细编码": "ckzcmxdm",
        "财会支出明细名称": "ckzcmxmc",
        "预会支出明细编码": "ykzcmxdm",
        "预会支出明细名称": "ykzcmxmc",
        "入库单号": "rkdh",
        "是否已过账": "posted",
        "摘要": "bz",
        "制单人": "zdr",
        "经办人": "jbr"
    }

    "年度\t调整期间\t凭证号\t凭证日期\t会计科目代码\t会计科目名称\t财会支出明细编码\t财会支出明细名称\t预会支出明细编码\t预会支出明细名称\t核算账号编码\t入库单号\t是否已过账\t摘要\t制单人";


    //var excelSheet;
    //for (var p in excelData) {
    //    excelSheet = excelData[p];
    //}

    var excelSheet = excelData;

    //分析字段对应关系
    var excelColIndex2ColName = {}; //excel 中的列号对应的中文题头
    var excelColName2ColIndex = {}; //中文题头对应的excel中的列号
    // var colLabel2ColName = {}; //中文题头对应到表的字段名


    var duplicateLabelCount = {};
    var colCount = 50; //最多几个列

    var headRow = 0; //题头在第几行
    var dataStartRow = 1; // 数据行从第几行开始
    //有时可能表头有多行合并，所以要检测一下
    for (var i = 0; i < colCount; i++) {
        var v = trim(sys_excelSafeValue(excelSheet, headRow, i));
        if (v == '')
            continue;
        if (duplicateLabelCount[v] == undefined) {
            duplicateLabelCount[v] = 0;
        }
        duplicateLabelCount[v] = duplicateLabelCount[v] + 1;

        if (duplicateLabelCount[v] > 1)
            v = v + duplicateLabelCount[v];
        //拼上后缀

        excelColIndex2ColName['' + i] = v;
        excelColName2ColIndex[v] = '' + i;
    }

    println(JSON.toString(excelColName2ColIndex));
    println(JSON.toString(excelColIndex2ColName));


    var RC = excelSheet.length;

    println("excel数据行数：" + RC);
    var data = [];
    for (var row = dataStartRow; row < RC; row++) {
        // if (sys_excelSafeValue(excelSheet, row, 3) == null) break; //空行，直接结束
        var oneRowData = {};
        data.push(oneRowData);
        for (var label in excelColName2ColIndex) {
            var excelCol = excelColName2ColIndex[label];
            var dbCol = colLabel2ColName[label];
            if (dbCol != null) {
                oneRowData[dbCol] = sys_excelSafeValue(excelSheet, row, excelCol);
            }
        }

    }
    //println(JSON.toString(data));

    pushMessage("dr_info", "开始导入...", currentUserId());

    var gguid = currentGUID();
    var userid = currentUserId();
    var username = currentUserName();
    var lastmodifieddate = newDate();
    // println('import_ph:' + import_ph);



    var ds = newDataStore(dsn, "select * from " + tableName);
    ds.setUpdateProperty(tableName, "id", "*", "id");
    for (var i = 0; i < data.length; i++) {
        var row = ds.insertRow(9999999);
        pushMessage("dr_info", "导入进度：" + (i + 1) + "/" + data.length, currentUserId());

        var rowData = data[i];
        for (var col in rowData) {
            var value = rowData[col];
            ds.setValue(row, col, value);
        }
        ds.setValue(row, "id", newGuid());
        ds.setValue(row, "gguid", gguid);
        ds.setValue(row, "userid", userid);
        ds.setValue(row, "username", username);
        ds.setValue(row, "lastmodifieddate", lastmodifieddate);
        ds.setValue(row, "corpid", corpid);

        if (ds.getRowCount() == 1000) {
            if (!ds.update(true)) {
                var errInfo = ds.getError().getMessage();
                println(errInfo);
                pushMessage("dr_info", "异常：" + errInfo, currentUserId());
                return;
            }
            ds.reset();
        }
    }

    pushMessage("dr_info", "正在写入数据库...", currentUserId());

    ds.update(true);
    // $alert('导入完成');
    ret.success = true;
    ret.message = ds.getString(0, "userid");

    //更新起始记账期和截止记账期
    var master_ds = newDataStore(dsn, "select * from " + masterTable);
    master_ds.setUpdateProperty(masterTable, "id", "*", "id");
    master_ds.retrieve("gguid='" + currentGUID() + "'");
    master_ds.setValue(0, "jzq_start", getStringFromSQL2(dsn, "select min(y*100+m) as t from pzdjex where gguid='" + currentGUID() + "'"));
    master_ds.setValue(0, "jzq_end", getStringFromSQL2(dsn, "select max(y*100+m) as t from pzdjex where gguid='" + currentGUID() + "'"));
    master_ds.update(true)

    pushMessage('dr_info', 'over', currentUserId());

    return ret;
}

function sys_excelSafeValue(sheet, row, col) {
    if (row > sheet.length - 1) return null;
    var dataRow = sheet[row];
    if (dataRow == null) return null;
    if (col > dataRow.length - 1) return null;
    return dataRow[col];

}


id: 64cb1d2c9932a9c0fc25376c
scriptid: 649aa52d99329f5ca7253c1c
tablename: app_script
clientip: 39.170.92.207
username: sa
createdate: 2023.08.03 11:23:18.000
script:
/**
 * 脚本中心的脚本，以 main函数为执行入口，相关的参数放在arg中，它是一个JSON字符串化后的数据
 *
 */
function main(arg) {
    println(arg);
    var param = JSON.parse(arg);
    var gguid = newGUID();
    var moduleid = 'dy';//模块ID
    var username = getProperty( "/API创建调阅流程的起草人",  param.creator || "api");
    var userid = getIntFromSQL("select id from app_user where showname='"+username+"'");
    var leaderid= 18; //审核人ID
    var billno = newBillNo('', 'dzpz_dy', 'billno', '{11111111}', 'billdate', newDate(), "");
    var dzpz_dy_ds = newDataStore("", "select * from  dzpz_dy");
    dzpz_dy_ds.setUpdateProperty("dzpz_dy", "id", "*", "id");
    dzpz_dy_ds.insertRow(0);
    dzpz_dy_ds.setValue(0, {
        id: gguid, gguid: gguid, userid: userid, username: username , 
        billdate: newDate(), billno: billno,
        reader: param.dyr, 
        leaderid: leaderid , 
        summary: param.dyyy, corpid: '00',
        needwatermark: 0,//不打水印 
        filetype: 'zip', // 
        email: param.email,
        moredata: JSON.stringify(param.callback_param),
        action_after_pack:'sendMail'
    });

    var dzpz_dymx_ds = newDataStore("", "select * from dzpz_dymx");
    dzpz_dymx_ds.setUpdateProperty('dzpz_dymx', 'id', '*', "id");
    var pzh = param.pzh  ;
    if( pzh==undefined) pzh =[];
    for (var i = 0; i < pzh.length; i++) {
        var row = dzpz_dymx_ds.insertRow(9999999);
       // var code= getStringFromSQL("select code from pzdjex b  where  pzh = '"+pzh[i]+"'");
        dzpz_dymx_ds.setValue(row, { id: newGUID(), gguid: gguid, inner_xh: i + 1, pzh: pzh[i]    });
    }

    var err = updateAll(dzpz_dy_ds, dzpz_dymx_ds);
    if (err != '') return { success: false, messager: err };


    var corpid = getStringFromSQL("select corpid from dzpz_dy where id='" + gguid + "'");
    
    runSQL(""," update dzpz_dymx  set   code= ( select min(b.code) as code  from pzdjex b  where  b.pzh =dzpz_dymx.pzh ) where  dzpz_dymx.gguid='" + gguid + "' ",true );
    var sqls = ["update dzpz_dymx  set bz=null,pz_id= (select max(id) from dzpz_pz where dzpz_pz.pzh= dzpz_dymx.pzh and dzpz_pz.corpid='" + corpid + "' ) where gguid='" + gguid + "' ",
                "update dzpz_dymx  set bz='凭证号不存在' where  gguid='" + gguid + "' and not exists (select dzpz_pz.id from dzpz_pz where  dzpz_pz.pzh= dzpz_dymx.pzh  and dzpz_pz.corpid='" + corpid + "')  " 
             
    ];
    runSQL("", sqls); 


    var config = {
        moduleid: moduleid,//凭证调阅模块代码或ID,
        gguid: gguid,
        flow: 'dy', //工作流的代码或ID
        userid: userid, //发起人ID
        subject: `${param.dyr || ''}因 [${param.dyyy || ''}] 调阅凭证`


    };

    var ret = newWork(config);

    if (!ret.success) return ret;

    //自动递交给初审
/*
    var t = taskInfoForWork('dy', gguid);

    //将任务递交下去，如果任务需要签收，则先签收     
    for (var i = 0; i < t.taskList.length; i++) {
        var task = t.taskList[i];

        //可以递交，那么递交下去
        if (task.canSubmit) println(submitWork(moduleid, gguid, task.taskId));
        //需要先签收 ，那么以第一个候选人签收它
        if (task.canClaim) claimWork(moduleid, gguid, task.taskId, task.candidateUserList[0].userId);

    }
*/

    ret.id = gguid;
    ret.billno= billno;
    return {success:true , id: gguid , content:{billno:billno}  };


}


id: 64cb1d2c9932a9c0fc253793
scriptid: 60fa600f9932563b7c99baff
tablename: app_script
clientip: 39.170.92.207
username: sa
createdate: 2023.08.03 11:25:24.000
script:
/**
 * 单据点击保存，前端所有的操作被转译成3种操作:insert , delete , update ,
 *  并且可以在  beforeBillSaveOnServer 中返回一些SQL语句，可以在afterBillSaveOnServer中返回一些SQL语句
 *
 * 系统分别在需要的数据库连接中执行这些语句 ， 当所有语句执行成功后，事件被提交。一些细节如下 ：
 *
 * 1 如果单据中的表，属于不同的数据库连接，那么所有的SQL语句会以连接为单位，对语句进行批量执行
 * 2 这些语句的执行顺序是：对同一个数据库连接中的语句， 先执行 beforeBillSaveOnServer 中返回的SQL语句，再执行单据操作转译得到的SQL语句，
 *   再执行 afterBillSaveOnServer 中返回的SQL语句， 当多个（或一个）数据库连接执行完这些语句，且没有错误时，所有的数据库连接做提交，否则全部回滚
 * 3 不要在 beforeBillSaveOnServer 或 afterBillSaveOnServer 中直接执行数据库操作，而是返回SQL语句，让系统批量执行它们，并控制好事务
 * 4 当执行成功后，系统再执行事件函数  afterBillSaveSuccessfulOnServer 。 此事件中可以执行任意操作，它与单据保存事件结束后才被触发执行，
 *   与单据保存并不在一个事务中。
 *
 *
 * @param gguid  要删除记录的gguid ，等同于主表的id
 * @param session  一个JSON对象，用于在整个单据保存过程中的各个事件之间传递数据。本事件做为单据保存的最后一个事件，session对象在使用后将被丢弃
 *
 *
 * @return 本函数不需要返回值
 *
 */
function afterBillSaveSuccessfulOnServer(gguid, session) {

    var corpid = getStringFromSQL("select corpid from dzpz_dy where id='" + gguid + "'");
    //2022.08.11优化，理论上不应该存在重复号码的凭证，但是加上max肯定没错，避免数据异常导致更新失败
    var sqls = ["update dzpz_dymx  set bz=null,pz_id= (select max(id) from dzpz_pz where dzpz_pz.pzh= dzpz_dymx.pzh and dzpz_pz.corpid='" + corpid + "' ) where gguid='" + gguid + "' ",
    "update dzpz_dymx  set bz='凭证号不存在' where  gguid='" + gguid + "' and not exists (select dzpz_pz.id from dzpz_pz where  dzpz_pz.pzh= dzpz_dymx.pzh  and dzpz_pz.corpid='" + corpid + "')  "

    ];

    runSQL("", sqls, true);
    println("----检测凭证是否存在完成---------")
}


/**
 * 用户任务提交后
 * @param flow 流程定义
 * @param node 开始节点
 * @param gguid 单据的gguid

 */
//@comment (group=工作流事件,caption=用户任务提交后)
function onUserTaskSubmitted(flow, userTask, gguid) {
    // println( flow.id) ; //流程定义的ID
    // println( userTask.name);
    println(JSON.stringify(userTask));
    println(gguid);


    if (userTask.id == 'id_60b3b08f27644fc18af35ba20ecd2bac') {
        var moreData = getStringFromSQL("select moredata from dzpz_dy where id='" + gguid + "'");
        try {
            moreData = JSON.parse(moreData);
            //起草后，递交后调用OA的接口回写数据
            if (moreData.form_id) {
                runTask('oa_callback', { requestid: moreData.form_id });
            }
        } catch (err) {

        }

    }


    if (userTask.id == 'id_6655df8bedc641aa9bacf1720d13ce2d') //领导审批通过后，就开始打包
    {
        //领导审批通过后，就开始打包
       // do_package(gguid);
    }

    println(gguid + " " + userTask.name + " 提交完成")


}

//后台打包
function do_package(gguid) {
    var ret = JSON.parse(runTask("package", { gguid: gguid }));
    return ret;
}



function back_urlShare(url, d, t) {
    var ret = urlShare(url, d, "day", t);
    return ret.url;
}


id: 64cb1d2c9932a9c0fc25379c
scriptid: 60fa600f9932563b7c99baff
tablename: app_script
clientip: 39.170.92.207
username: sa
createdate: 2023.08.03 11:26:24.000
script:
/**
 * 单据点击保存，前端所有的操作被转译成3种操作:insert , delete , update ,
 *  并且可以在  beforeBillSaveOnServer 中返回一些SQL语句，可以在afterBillSaveOnServer中返回一些SQL语句
 *
 * 系统分别在需要的数据库连接中执行这些语句 ， 当所有语句执行成功后，事件被提交。一些细节如下 ：
 *
 * 1 如果单据中的表，属于不同的数据库连接，那么所有的SQL语句会以连接为单位，对语句进行批量执行
 * 2 这些语句的执行顺序是：对同一个数据库连接中的语句， 先执行 beforeBillSaveOnServer 中返回的SQL语句，再执行单据操作转译得到的SQL语句，
 *   再执行 afterBillSaveOnServer 中返回的SQL语句， 当多个（或一个）数据库连接执行完这些语句，且没有错误时，所有的数据库连接做提交，否则全部回滚
 * 3 不要在 beforeBillSaveOnServer 或 afterBillSaveOnServer 中直接执行数据库操作，而是返回SQL语句，让系统批量执行它们，并控制好事务
 * 4 当执行成功后，系统再执行事件函数  afterBillSaveSuccessfulOnServer 。 此事件中可以执行任意操作，它与单据保存事件结束后才被触发执行，
 *   与单据保存并不在一个事务中。
 *
 *
 * @param gguid  要删除记录的gguid ，等同于主表的id
 * @param session  一个JSON对象，用于在整个单据保存过程中的各个事件之间传递数据。本事件做为单据保存的最后一个事件，session对象在使用后将被丢弃
 *
 *
 * @return 本函数不需要返回值
 *
 */
function afterBillSaveSuccessfulOnServer(gguid, session) {

    var corpid = getStringFromSQL("select corpid from dzpz_dy where id='" + gguid + "'");
    //2022.08.11优化，理论上不应该存在重复号码的凭证，但是加上max肯定没错，避免数据异常导致更新失败
    var sqls = ["update dzpz_dymx  set bz=null,pz_id= (select max(id) from dzpz_pz where dzpz_pz.pzh= dzpz_dymx.pzh and dzpz_pz.corpid='" + corpid + "' ) where gguid='" + gguid + "' ",
    "update dzpz_dymx  set bz='凭证号不存在' where  gguid='" + gguid + "' and not exists (select dzpz_pz.id from dzpz_pz where  dzpz_pz.pzh= dzpz_dymx.pzh  and dzpz_pz.corpid='" + corpid + "')  "

    ];

    runSQL("", sqls, true);
    println("----检测凭证是否存在完成---------")
}


/**
 * 用户任务提交后
 * @param flow 流程定义
 * @param node 开始节点
 * @param gguid 单据的gguid

 */
//@comment (group=工作流事件,caption=用户任务提交后)
function onUserTaskSubmitted(flow, userTask, gguid) {
    // println( flow.id) ; //流程定义的ID
    // println( userTask.name);
    println(JSON.stringify(userTask));
    println(gguid);


    if (userTask.id == 'id_60b3b08f27644fc18af35ba20ecd2bac') {
        var moreData = getStringFromSQL("select moredata from dzpz_dy where id='" + gguid + "'");
        try {
            moreData = JSON.parse(moreData);
            //起草后，递交后调用OA的接口回写数据
            if (moreData.form_id) {
                runTask('oa_callback', { requestid: moreData.form_id });
            }
        } catch (err) {

        }

    }


    if (userTask.id == 'id_6655df8bedc641aa9bacf1720d13ce2d') //领导审批通过后，就开始打包
    {
        //领导审批通过后，就开始打包 
        //2023.07 取消了，因为出现一个需求，需要第三方审批通过后，再打包，所以自动打印取消了
       // do_package(gguid);
    }

    println(gguid + " " + userTask.name + " 提交完成")


}

//后台打包
function do_package(gguid) {
    var ret = JSON.parse(runTask("package", { gguid: gguid }));
    return ret;
}



function back_urlShare(url, d, t) {
    var ret = urlShare(url, d, "day", t);
    return ret.url;
}


id: 64db16f78b101d5b59c64757
scriptid: 60fa600f9932563b7c99bb03
tablename: app_template
clientip: 0:0:0:0:0:0:0:1
username: sa
createdate: 2023.08.15 14:17:43.000
script:
var g_currentUserIsOwner = false; //当前人是不是起草人





/**
 * 表单初始化完成后，执行此事件
 */
//@comment (group=表单事件,caption=表单初始化完成)
function formOpen() {
    book.showTabOnWhere = 'none';
    book.getWorkSheet('下载清单').visible = false;



    if ($dzpz_dy_ds.getString(0, "ziptaskid") == '') {
        book.sheet1.getBrick('cb_cancel').visible = false;
    }

    if (currentUserId() == $dzpz_dy_ds.getInt(0, "userid")) {
        g_currentUserIsOwner = true;
    }
    //按gguid分开接收消息，避免多个打包的消息混在一起
    onPushMessage("打包下载" + currentGUID(), function (info) {
        console.info(info);
        var msg = JSON.parse(info);
        if (msg.action == 'info') {
            console.info(msg.info);
            if (g_currentUserIsOwner) showInfoPane(msg.info);
        }

        if (msg.action == 'gameOver') {
            var result = msg.result;
            //$.alert(JSON.stringify(result));


            $dzpz_dy_ds.setValue(0, "ziptaskid", '', false);//清除打包任务id，因为已经ok了，但不要触发保存
            //不需要保存 ，因为打包完成脚本中已经回填了，仅在界面上回填一下， 方便显示下载清单
            $dzpz_dy_ds.setValue(0, "zipresult", JSON.stringify(result.zipFiles), false);

            console.dir(result);

            cb_package_onClick();

            hideInfoPane();
        }
        if (msg.action == 'over') {

            hideInfoPane();
        }

        if (msg.action == 'error') {
            $.alert(msg.info);
            hideInfoPane();
        }
    })

    $('.navbar-fixed-top').css("z-index", 1);

}
/**
 * 按钮点击事件
 * 当某个按钮被点击时， 首先触发  {按钮名称}_onClick 事件，然后触发 buttonOnClick事件
 * @param sheet  工作表
 * @param cell   按钮所在的单元格
 * @param button 按钮对象
 */
//@comment (group=按钮点击事件,caption=下载模板,needRightControl=false)
function cb_downloadTemplateFile_onClick(sheet, cell, button) {
    var title = "序号\t凭证号\t科目代码\t核算账号编号\t摘要";
    var data = [];
    data.push(title);
    data.push("1\t0001\t1001\tRD0001\tABC");
    data.push("2\t0002\t5501\tRD0002\tBBB");

    var f = $('#form_toexcel')[0];
    f.filename.value = "凭证调阅模板.xlsx";
    f.data.value = JSON.stringify(data);
    f.submit();

}

/**
 * 按钮点击事件
 * 当某个按钮被点击时， 首先触发  {按钮名称}_onClick 事件，然后触发 buttonOnClick事件
 * @param sheet  工作表
 * @param cell   按钮所在的单元格
 * @param button 按钮对象
 */
//@comment (group=按钮点击事件,caption=导入模板,needRightControl=false)
function cb_importFromExcelFile_onClick(sheet, cell, button) {
    toastr.info("*自动保存，准备导入");
    form.save(false, function () {
        book.readXLS(function (data) {
            showInfoPane("*正在导入");
            setTimeout(function () {
                importData(data);
            }, 10);
        });
    });

}



function safeValue(sheet, row, col) {
    if (row > sheet.length - 1) return null;
    var dataRow = sheet[row];
    if (dataRow == null) return null;
    if (col > dataRow.length - 1) return null;
    return dataRow[col];

}

//@comment (group=,caption=从Excel导入数据,needRightControl=false)
function importData(excelData) {
    var excelSheet = excelData[Object.keys(excelData)[0]];


    var headRow = 0; //题头在第几行
    var dataStartRow = 1;// 数据行从第几行开始

    var RC = excelSheet.length;

    book.sheet0.paintPermit = false;

    for (let row = dataStartRow; row < RC; row++) {
        let data = {
            pzh: safeValue(excelSheet, row, 1) || '',
            kmdm: safeValue(excelSheet, row, 2) || '',
            code: safeValue(excelSheet, row, 3) || '',
            memo: safeValue(excelSheet, row, 4) || '',
        }
        //alert(JSON.stringify(data));
        if (data.pzh == '') continue;
        let r = $dzpz_dymx_ds.insertRow(99999);
        $dzpz_dymx_ds.setValue(r, data);
    }


    showInfoPane("*正在保存并检测凭证号");
    form.save(false, function () {


        book.sheet0.paintPermit = false;
        toastr.info("导入完成");

    });
}




var dymx_changed = false;
/**
 * dsname结果集保存前，对row进行数据校验 ，
 * @param dsname 结果集名称
 * @param row  第row行
 * @returns {boolean} true表示检验通过， false表示校验不通过，update被终止
 */
function validate(dsname, row) {
    if (dsname == 'dzpz_dymx') dymx_changed = true;

    if (dsname == 'dzpz_dy') {
        if ($dzpz_dy_ds.getInt(0, "pass") == 0) {
            if ($dzpz_dy_ds.getString(0, "rejectreason") == '') {
                toastr.info("请输入拒绝理由");
                return false;
            }
        }
    }
    return true;
}

/**
 * 数据集中的数据发生变化
 * @param dsname 数据集名称
 * @param row   数据行号
 * @param col    字段名
 * @param oldValue   原值
 * @param newValue  新值
 */
function itemChanged(dsname, row, col, oldValue, newValue) {
    if (col == 'corpid') dymx_changed = true;

}



/**
 * 单据保存成功后执行本事件。如果单据不需要保存，或保存失败，则不执行本事件
 * @param GUID 当前单据的GGUID
 * @param action 当前单据正在进行的动作，比如 edit , view
 */
function afterSaveSuccessful(GGUID, action) {
    if (dymx_changed) form.loadBill(GGUID); //如果明细有变化，那么保存成功后，重新加载单据，因为在单据保存后，模板后端脚本中会同时更新  pz_id 及 bz
    dymx_changed = false;
}


//@comment (group=按钮点击事件,caption=取消打包,needRightControl=false)
function cb_redo_pack_onClick() {

    $confirm('', '确信要清除压缩文件吗?', function () {

        book.getWorkSheet('下载清单').popupDispose();

        setTimeout(function () {
            showInfoPane("*正在删除已打包的文件");
            setTimeout(function () {
                $dzpz_dy_ds.setValue(0, "ziptaskid", '');
                $dzpz_dy_ds.setValue(0, "zipresult", '');
                form.save(false);
                $q_result_ds.reset();
                hideInfoPane();
                toastr.info("打包文件已经删除。当再次点击打包下载时会重新打包");
            }, 200);
        }, 1000);
    });


}

//@comment (group=按钮点击事件,caption=取消打包,needRightControl=false)
function cb_cancel_onClick() {

    $confirm('', '确信要终止打包吗?', function () {
        showInfoPane("*正在终止打包...");


        $dzpz_dy_ds.setValue(0, "ziptaskid", '');
        $dzpz_dy_ds.setValue(0, "zipresult", '');

        form.save(false);
        hideInfoPane();

        runTask("终止打包", {
            id: $dzpz_dy_ds.getString(0, "ziptaskid")
        }, function (ret) { });


    });
}

//@comment (group=按钮点击事件,caption=打包,needRightControl=false)
function cb_package_onClick() {

    form.save(false, function () {
        var ziptaskid = $dzpz_dy_ds.getString(0, "ziptaskid");
        if (ziptaskid != '') {
            toastr.info("正在压缩中...，请稍候");
            return;
        }

        var zipResult = $dzpz_dy_ds.getString(0, "zipresult");
        if (zipResult == '') {
            toastr.info("正在压缩文件，请稍候");
            do_package(currentGUID(), function (ret) {

                if (ret.success) {
                    $dzpz_dy_ds.setValue(0, "ziptaskid", ret.zipTaskId, false); //后台已经回写了，就里只要界面上更新就ok
                }
            });
            return;
        }

        zipResult = zipResult.replace(/&action=view/g, '&action=download');
        zipResult = JSON.parse(zipResult);
        $q_result_ds.reset();
        for (var i = 0; i < zipResult.length; i++) {
            var one = zipResult[i];
            var row = $q_result_ds.insertRow(999);
            $q_result_ds.setValue(row, one);


        }

        book.getWorkSheet('下载清单').popup("", "下载清单", 800, 300, true, true);
    });
}



function cb_package_onClick___() {

    if (form.isSaveNeeded()) {
        toastr.info("请先保存");
        return;
    }

    let ids = [];
    for (let i = 0; i < $dzpz_dymx_ds.rowCount; i++) {
        if ($dzpz_dymx_ds.getString(i, "pz_id") == '') {
            toastr.error("第" + (i + 1) + "行的凭证号不存在，请核对");
            return;
        }
        ids.push($dzpz_dymx_ds.getString(i, "pz_id"));
    }

    if (ids.length == 0) {
        toastr.info("没有凭证清单");
        return;
    }

    $confirm('', '确信要打包下载吗?', function () {
        showInfoPane("*正在压缩打包...");
        let fileName = formatDate(newDate(), "yyyyMMddHHmm") + ".zip";
        runTask("打包下载", {
            fileName: fileName,
            gguid: currentGUID(),
            ids: ids,
            watermark: $dzpz_dy_ds.getString(0, "billno") + "[" + $dzpz_dy_ds.getString(0, "reader") + "]" +
                formatDate(newDate(), "yyyy.MM.dd HH:mm")
        },
            function (ret) {
                ret = JSON.parse(ret);
                hideInfoPane();
                if (ret.success) {
                    let t = window.location.href;
                    let p = t.indexOf("billedit");
                    t = t.substring(0, p);
                    let url = t + ret.url;
                    $.alert(` <a href="${url}" target="_blank">点击下载${fileName}</a>`, `打包完成`);
                } else {
                    toastr.error(ret.message);
                }
            });

    });

}

/**
 * 按钮点击事件
 * 当某个按钮被点击时， 首先触发  {按钮名称}_onClick 事件，然后触发 buttonOnClick事件
 * @param sheet  工作表
 * @param cell   按钮所在的单元格
 * @param button 按钮对象
 */
//@comment (group=按钮点击事件,caption=调取凭证列表,needRightControl=false)
function cb_pzlist_onClick(sheet, cell, button) {
    // if (form.isSaveNeeded()) {
    //     toastr.info("请先保存");
    //     return;
    // }
    book.getWorkSheet("凭证资料查询").float('fa fa-cog', "凭证资料查询",
        {
            my: 'right-center',
            at: 'right-center',
            autoposition: 'down',
            offsetX: -5,
            offsetY: 5
        }, { width: '70%', height: '90%' });
    smartRetrieve(book.getWorkSheet("凭证资料查询"), "q_pzdjex")
}


/**
 * 按钮点击事件
 * 当某个按钮被点击时， 首先触发  {按钮名称}_onClick 事件，然后触发 buttonOnClick事件
 * @param sheet  工作表
 * @param cell   按钮所在的单元格
 * @param button 按钮对象
 */
//@comment (group=按钮点击事件,caption=选入,needRightControl=false)
function cb_import_onClick(sheet, cell, button) {
    book.getWorkSheet("detail").paintPermit = false;
    let row = book.getDataSource("dzpz_dymx").currentBindRow;

    for (var i = 0; i < $q_pzdjex_ds.getRowCount(); i++) {
        if ($q_pzdjex_ds.getString(i, "selected") == '1') {
            if ($dzpz_dymx_ds.getString(row, "pzh") != '' || row < 0) row = $dzpz_dymx_ds.insertRow(row + 1);
            $dzpz_dymx_ds.setValue(row, {
                pzh: $q_pzdjex_ds.getValue(i, "pzh"),
                kmdm: $q_pzdjex_ds.getValue(i, "kmdm"),
                code: $q_pzdjex_ds.getValue(i, "code"),
                memo: $q_pzdjex_ds.getString(i, "bz")
            });
        }
    }
    book.getDataSource("dzpz_dymx").currentBindRow = row;
    book.getWorkSheet("detail").View.insureSelectionOnScreen(null, false);
    do_removeDuplicated(); //删除重复项

    //********删除行号***********************************
    book.getWorkSheet("凭证资料查询").paintPermit = false;
    for (var i = $q_pzdjex_ds.getRowCount() - 1; i >= 0; i--) {
        if ($q_pzdjex_ds.getString(i, "selected") == '1') $q_pzdjex_ds.deleteRow(i);
    }
    book.getWorkSheet("凭证资料查询").paintPermit = true;
    //**************************************************

    book.getWorkSheet("detail").paintPermit = true;
    book.getWorkSheet("main").paintPermit = true;
}

/**
 * 按钮点击事件
 * 当某个按钮被点击时， 首先触发  {按钮名称}_onClick 事件，然后触发 buttonOnClick事件
 * @param sheet  工作表
 * @param cell   按钮所在的单元格
 * @param button 按钮对象
 */
//@comment (group=按钮点击事件,caption=,needRightControl=false)
function cb_opensheet_dr_onClick(sheet, cell, button) {
    book.getWorkSheet("凭证列表").float('fa fa-cog', "导入凭证列表",
        {
            my: 'right-center',
            at: 'right-center',
            autoposition: 'down',
            offsetX: -5,
            offsetY: 5
        }, { width: 400, height: '80%' });

}

/**
 * 按钮点击事件
 * 当某个按钮被点击时， 首先触发  {按钮名称}_onClick 事件，然后触发 buttonOnClick事件
 * @param sheet  工作表
 * @param cell   按钮所在的单元格
 * @param button 按钮对象
 */
//@comment (group=按钮点击事件,caption=粘贴界面导入,needRightControl=false)
function cb_dr_onClick(sheet, cell, button) {

    book.getWorkSheet("detail").paintPermit = false;
    let row = book.getDataSource("dzpz_dymx").currentBindRow;
    let pzlist = sheet.cells('pzlist').getValueString().split('\n');
    for (let i = 0; i < pzlist.length; i++) {
        if (pzlist[i] !== '') {
            if ($dzpz_dymx_ds.getString(row, "pzh") != '' || row < 0) row = $dzpz_dymx_ds.insertRow(row + 1);

            $dzpz_dymx_ds.setValue(row, {
                pzh: pzlist[i]
            });
        }
    }
    sheet.cells('pzlist').setValue(null);
    sheet.floatPanelClose();

    book.getWorkSheet("detail").paintPermit = true;

}
/**
 * 单元格因为被编辑而改变。当用户通过编辑单元的值而让单元格发生值改变时本事件被触发。
 * 注意，当使用脚本 sheet.cells(row,col).setValue ( value) 来改变单元格的值时，本事件并不触发
 * @param sheet
 * @param cell
 * @param newValue
 * @param innerRow   当单元格没有绑定数据库或绑定到单行数据库时，本参数无意义。如果绑定一个
 * 多行数据库，则表示该单元所绑定的字段的第 innerRow行发生变化
 */
function cellValueChangedByEdit(sheet, cell, newValue, innerRow) {

    //通过数据库绑定情况来判断

    //通过别名来判断
    if (sheet.name == 'detail' && cell.alias == 'st_selectAll') {
        let ds = $dzpz_dymx_ds;
        sheet.paintPermit = false;
        for (var i = 0; i < ds.getRowCount(); i++) {
            ds.setValue(i, "selected", newValue);
        }
        sheet.paintPermit = true;
    }
    if (sheet.name == '凭证资料查询' && cell.alias == 'st_selectAll') {
        let ds = $q_pzdjex_ds;
        sheet.paintPermit = false;
        for (var i = 0; i < ds.getRowCount(); i++) {
            ds.setValue(i, "selected", newValue);
        }
        sheet.paintPermit = true;
    }

    let bind = cell.bind;
    if (bind != null && bind.dataSource == 'dzpz_dymx' && bind.DBCol == 'pzh') {
        showInfoPane('*正在分析凭证号');
        setTimeout(function () {
            do_paste_pzlist(innerRow, newValue) //写入凭证号
        }, 100);
    }
    if (bind != null && bind.dataSource == 'dzpz_dy' && bind.DBCol == 'reader') {
        $dzpz_dy_ds.setValue(0, {
            watermark: '【' + $dzpz_dy_ds.getString(0, "reader") + '】仅用于项目专项审计或检查'
        })
    }



}

/**
 * 单元格编辑时粘贴内容后触发此事件。
 * @param sheet
 * @param cell
 * @param innerRow   当单元格没有绑定数据库或绑定到单行数据库时，本参数无意义。如果绑定一个
 * 多行数据库，则表示该单元所绑定的字段的第 innerRow行被粘贴了内容
 * @param text 当前单元格编辑框中的内容，并不一定是粘贴的内容，是单元格编辑框中原有的内容加上粘贴的内容
 */
//@comment (group=单元格事件,caption=单元格粘贴内容)
function cellOnPaste(sheet, cell, innerRow, text) {

    //通过别名来判断
    if (cell.alias == 'XXX') {

    }

    //通过数据库绑定情况来判断
    let bind = cell.bind;
    if (bind != null && bind.dataSource == 'dzpz_dymx' && bind.DBCol == 'pzh') {
        sheet.View.forceCurrentEditControlGiveUpFocus();
    }

}


/**
 * 按钮点击事件
 * 当某个按钮被点击时， 首先触发  {按钮名称}_onClick 事件，然后触发 buttonOnClick事件
 * @param sheet  工作表
 * @param cell   按钮所在的单元格
 * @param button 按钮对象
 */
//@comment (group=do,caption=凭证列表粘贴凭证清单后自动后插并赋值,needRightControl=false)
function do_paste_pzlist(innerRow, newValue) {

    if (newValue == null || newValue == '') return;
    let data = newValue.split(' ');
    book.getWorkSheet("detail").paintPermit = false;
    let row = innerRow;
    for (let i = 0; i < data.length; i++) {
        //row = $dzpz_dymx_ds.insertRow(row + 1);
        if (data[i] != '') {
            $dzpz_dymx_ds.setValue(row, {
                pzh: data[i],
                selected: 1
            });
            if (i < data.length - 1) row = $dzpz_dymx_ds.insertRow(row + 1);
        }
    }
    book.getDataSource("dzpz_dymx").currentBindRow = row;
    book.getWorkSheet("detail").View.insureSelectionOnScreen(null, false);
    do_removeDuplicated(); //删除重复项
    book.getWorkSheet("detail").paintPermit = true;
    book.getWorkSheet("main").paintPermit = true;
    hideInfoPane();
}







//@comment (group=,caption=异步打包,needRightControl=false)
function async_package() {

    if (form.isSaveNeeded()) {
        toastr.info("请先保存");
        return;
    }

    let ids = [];
    for (let i = 0; i < $dzpz_dymx_ds.rowCount; i++) {
        if ($dzpz_dymx_ds.getString(i, "pz_id") == '') {
            toastr.error("第" + (i + 1) + "行的凭证号不存在，请核对");
            return;
        }
        ids.push($dzpz_dymx_ds.getString(i, "pz_id"));
    }

    if (ids.length == 0) {
        toastr.info("没有凭证清单");
        return;
    }

    $confirm('', '确信要重新打包吗?', function () {
        showInfoPane("*正在后台打包...");
        let fileName = $dzpz_dy_ds.getString(0, "reader") +
            formatDate(newDate(), "yyyy.MM.dd HH:mm") + "调阅凭证.zip";
        runTask("后台打包", {
            gguid: currentGUID(),
            fileName: fileName,
            ids: ids,
            watermark: $dzpz_dy_ds.getInt(0, "needwatermark") == 0 ? "" : ($dzpz_dy_ds.getString(0, "reader") + "/" + formatDate($dzpz_dy_ds.getValue(0, "billdate"), "yyyy.MM.dd HH:mm") + "\n" + $dzpz_dy_ds.getString(0, "watermark")),
            mergePDF: $dzpz_dy_ds.getString(0, "filetype") == 'pdf' //是否合并成一个pdf文件
        },
            function (ret) {
                ret = JSON.parse(ret);
                hideInfoPane();
                if (ret.success) {
                    $dzpz_dy_ds.setValue(0, "ziptaskid", ret.zipTaskId);
                    form.save(false);
                    hideInfoPane();

                } else {
                    toastr.error(ret.message);
                }
            });

    });


}

//@comment (group=按钮点击事件,caption=标记重复,needRightControl=false)
function cb_qc_onClick() {
    showInfoPane("*正在检测重复的凭证");
    var map = {};
    for (var i = 0; i < $dzpz_dymx_ds.rowCount; i++) {
        var pzh = $dzpz_dymx_ds.getString(i, "pzh");
        if (pzh == '') continue;
        if (map[pzh] == undefined) map[pzh] = []; //每个凭证号映射到一个数组，记录它所在的行号
        map[pzh].push(i); // 记录下凭证号对应的行号

    }

    book.getWorkSheet('detail').paintPermit = false;
    for (pzh in map) {
        var rows = map[pzh];
        $dzpz_dymx_ds.setValue(rows[0], "bz", "");
        for (var i = 1; i < rows.length; i++) {
            $dzpz_dymx_ds.setValue(rows[i], "bz", "与第" + (rows[0] + 1) + "行重复");
        }
    }
    book.getWorkSheet('detail').paintPermit = true;
    hideInfoPane();
}

//@comment (group=按钮点击事件,caption=删除重复的,needRightControl=false)
function cb_removeDuplicated_onClick() {

    $confirm('', '确信要清除重复的凭证号吗?', function () {

        do_removeDuplicated()

    });

}


//@comment (group=do,caption=执行删除重复的,needRightControl=false)
function do_removeDuplicated() {

    showInfoPane("*正在删除重复的凭证");
    book.getWorkSheet('detail').paintPermit = false;
    var pzhs = []; //凭证号清单
    var rows = [];// 需要删除的行号
    for (var i = 0; i < $dzpz_dymx_ds.rowCount; i++) {
        var pzh = $dzpz_dymx_ds.getString(i, "pzh");
        if (pzhs.contains(pzh)) //此凭证号此前已经出现过
        {
            rows.push(i);//  需要删除
        } else {
            pzhs.push(pzh); //没有出现过，那么加它到凭证号清单中
        }
    }
    //现在反着删除
    for (var i = rows.length - 1; i >= 0; i--) {
        $dzpz_dymx_ds.deleteRow(rows[i]);
    }
    //form.save(false);
    book.getWorkSheet('detail').paintPermit = false;
    hideInfoPane();
}



/**
 * 按钮点击事件
 * 当某个按钮被点击时， 首先触发  {按钮名称}_onClick 事件，然后触发 buttonOnClick事件
 * @param sheet  工作表
 * @param cell   按钮所在的单元格
 * @param button 按钮对象
 */
//@comment (group=按钮点击事件,caption=批量删除已选中记录,needRightControl=false)
function cb_selectedRow_delete_onClick(sheet, cell, button) {
    $confirm("提示", "确定要删除选中的记录吗?", function () {
        book.getWorkSheet('detail').paintPermit = false;
        for (let i = $dzpz_dymx_ds.getRowCount() - 1; i >= 0; i--) {
            if ($dzpz_dymx_ds.getInt(i, "selected") == 1) $dzpz_dymx_ds.deleteRow(i);
        }
        if ($dzpz_dymx_ds.getRowCount() == 0) $dzpz_dymx_ds.insertRow(0);
        book.getWorkSheet('detail').cells("st_selectAll").setValue(0);
        book.getWorkSheet('detail').paintPermit = true;
    }, function () { });



}

function copyURL(url) {

    let s = getServiceHomeURL('app') + url;
    let d = book.sheet3.cells("days").getValueInt();
    let t = book.sheet3.cells("times").getValueInt();
    s = back_urlShare(s, d, t);
    $setClipboard(s);
    toastr.info("分享地址已经复制到剪贴板");
}


id: 64db197f8b101d5b59c64766
scriptid: 60fa600f9932563b7c99baff
tablename: app_script
clientip: 0:0:0:0:0:0:0:1
username: sa
createdate: 2023.08.15 14:21:51.000
script:
/**
 * 单据点击保存，前端所有的操作被转译成3种操作:insert , delete , update ,
 *  并且可以在  beforeBillSaveOnServer 中返回一些SQL语句，可以在afterBillSaveOnServer中返回一些SQL语句
 *
 * 系统分别在需要的数据库连接中执行这些语句 ， 当所有语句执行成功后，事件被提交。一些细节如下 ：
 *
 * 1 如果单据中的表，属于不同的数据库连接，那么所有的SQL语句会以连接为单位，对语句进行批量执行
 * 2 这些语句的执行顺序是：对同一个数据库连接中的语句， 先执行 beforeBillSaveOnServer 中返回的SQL语句，再执行单据操作转译得到的SQL语句，
 *   再执行 afterBillSaveOnServer 中返回的SQL语句， 当多个（或一个）数据库连接执行完这些语句，且没有错误时，所有的数据库连接做提交，否则全部回滚
 * 3 不要在 beforeBillSaveOnServer 或 afterBillSaveOnServer 中直接执行数据库操作，而是返回SQL语句，让系统批量执行它们，并控制好事务
 * 4 当执行成功后，系统再执行事件函数  afterBillSaveSuccessfulOnServer 。 此事件中可以执行任意操作，它与单据保存事件结束后才被触发执行，
 *   与单据保存并不在一个事务中。
 *
 *
 * @param gguid  要删除记录的gguid ，等同于主表的id
 * @param session  一个JSON对象，用于在整个单据保存过程中的各个事件之间传递数据。本事件做为单据保存的最后一个事件，session对象在使用后将被丢弃
 *
 *
 * @return 本函数不需要返回值
 *
 */
function afterBillSaveSuccessfulOnServer(gguid, session) {

    var corpid = getStringFromSQL("select corpid from dzpz_dy where id='" + gguid + "'");
    //2022.08.11优化，理论上不应该存在重复号码的凭证，但是加上max肯定没错，避免数据异常导致更新失败
    var sqls = ["update dzpz_dymx  set bz=null,pz_id= (select max(id) from dzpz_pz where dzpz_pz.pzh= dzpz_dymx.pzh and dzpz_pz.corpid='" + corpid + "' ) where gguid='" + gguid + "' ",
    "update dzpz_dymx  set bz='凭证号不存在' where  gguid='" + gguid + "' and not exists (select dzpz_pz.id from dzpz_pz where  dzpz_pz.pzh= dzpz_dymx.pzh  and dzpz_pz.corpid='" + corpid + "')  "

    ];

    runSQL("", sqls, true);
    println("----检测凭证是否存在完成---------")
}


/**
 * 用户任务提交后
 * @param flow 流程定义
 * @param node 开始节点
 * @param gguid 单据的gguid

 */

//@comment (group=工作流事件,caption=用户任务提交后)
function onUserTaskSubmitted(flow, userTask, gguid) {
    // println( flow.id) ; //流程定义的ID
    // println( userTask.name);
    println(JSON.stringify(userTask));
    println(gguid);
    if (userTask.id == 'id_60b3b08f27644fc18af35ba20ecd2bac') {
        var ds= newDataStore("","select * from dzpz_dy where id='" + gguid + "'");
        ds.retrieve();
        var moreData = ds.getString(0,"moredata");
        try {
            moreData = JSON.parse(moreData);
            //起草后，递交后调用OA的接口回写数据
            if (moreData.form_id) {
                var pass= ds.getInt(0,"pass");
                var reason =ds.getString(0,"rejectreason");
                runTask('oa_callback', { requestid: moreData.form_id , pass:pass , reason:reason});
            }
        } catch (err) {

        }

    }

    if (userTask.id == 'id_6655df8bedc641aa9bacf1720d13ce2d') //领导审批通过后，就开始打包
    {
        //领导审批通过后，就开始打包
        //2023.07.13 不要自动打包，等oa调用接口在打包，不然，oa没有通知就打包并发送邮件就不对了
     //   do_package(gguid);
    }

    println(gguid + " " + userTask.name + " 提交完成")


}

//后台打包
function do_package(gguid) {
    var ret = JSON.parse(runTask("package", { gguid: gguid }));
    return ret;
}



function back_urlShare(url, d, t) {
    var ret = urlShare(url, d, "day", t);
    return ret.url;
}


id: 64db211b8b101d5b59c647fc
scriptid: 60fa600f9932563b7c99bb03
tablename: app_template
clientip: 0:0:0:0:0:0:0:1
username: sa
createdate: 2023.08.15 14:59:09.000
script:
var g_currentUserIsOwner = false; //当前人是不是起草人





/**
 * 表单初始化完成后，执行此事件
 */
//@comment (group=表单事件,caption=表单初始化完成)
function formOpen() {
    book.showTabOnWhere = 'none';
    book.getWorkSheet('下载清单').visible = false;



    if ($dzpz_dy_ds.getString(0, "ziptaskid") == '') {
        book.sheet1.getBrick('cb_cancel').visible = false;
    }

    if (currentUserId() == $dzpz_dy_ds.getInt(0, "userid")) {
        g_currentUserIsOwner = true;
    }
    //按gguid分开接收消息，避免多个打包的消息混在一起
    onPushMessage("打包下载" + currentGUID(), function (info) {
        console.info(info);
        var msg = JSON.parse(info);
        if (msg.action == 'info') {
            console.info(msg.info);
            if (g_currentUserIsOwner) showInfoPane(msg.info);
        }

        if (msg.action == 'gameOver') {
            var result = msg.result;
            //$.alert(JSON.stringify(result));


            $dzpz_dy_ds.setValue(0, "ziptaskid", '', false);//清除打包任务id，因为已经ok了，但不要触发保存
            //不需要保存 ，因为打包完成脚本中已经回填了，仅在界面上回填一下， 方便显示下载清单
            $dzpz_dy_ds.setValue(0, "zipresult", JSON.stringify(result.zipFiles), false);

            console.dir(result);

            cb_package_onClick();

            hideInfoPane();
        }
        if (msg.action == 'over') {

            hideInfoPane();
        }

        if (msg.action == 'error') {
            $.alert(msg.info);
            hideInfoPane();
        }
    })

    $('.navbar-fixed-top').css("z-index", 1);

}
/**
 * 按钮点击事件
 * 当某个按钮被点击时， 首先触发  {按钮名称}_onClick 事件，然后触发 buttonOnClick事件
 * @param sheet  工作表
 * @param cell   按钮所在的单元格
 * @param button 按钮对象
 */
//@comment (group=按钮点击事件,caption=下载模板,needRightControl=false)
function cb_downloadTemplateFile_onClick(sheet, cell, button) {
    var title = "序号\t凭证号\t科目代码\t核算账号编号\t摘要";
    var data = [];
    data.push(title);
    data.push("1\t0001\t1001\tRD0001\tABC");
    data.push("2\t0002\t5501\tRD0002\tBBB");

    var f = $('#form_toexcel')[0];
    f.filename.value = "凭证调阅模板.xlsx";
    f.data.value = JSON.stringify(data);
    f.submit();

}

/**
 * 按钮点击事件
 * 当某个按钮被点击时， 首先触发  {按钮名称}_onClick 事件，然后触发 buttonOnClick事件
 * @param sheet  工作表
 * @param cell   按钮所在的单元格
 * @param button 按钮对象
 */
//@comment (group=按钮点击事件,caption=导入模板,needRightControl=false)
function cb_importFromExcelFile_onClick(sheet, cell, button) {
    toastr.info("*自动保存，准备导入");
    form.save(false, function () {
        book.readXLS(function (data) {
            showInfoPane("*正在导入");
            setTimeout(function () {
                importData(data);
            }, 10);
        });
    });

}



function safeValue(sheet, row, col) {
    if (row > sheet.length - 1) return null;
    var dataRow = sheet[row];
    if (dataRow == null) return null;
    if (col > dataRow.length - 1) return null;
    return dataRow[col];

}

//@comment (group=,caption=从Excel导入数据,needRightControl=false)
function importData(excelData) {
    var excelSheet = excelData[Object.keys(excelData)[0]];


    var headRow = 0; //题头在第几行
    var dataStartRow = 1;// 数据行从第几行开始

    var RC = excelSheet.length;

    book.sheet0.paintPermit = false;

    for (let row = dataStartRow; row < RC; row++) {
        let data = {
            pzh: safeValue(excelSheet, row, 1) || '',
            kmdm: safeValue(excelSheet, row, 2) || '',
            code: safeValue(excelSheet, row, 3) || '',
            memo: safeValue(excelSheet, row, 4) || '',
        }
        //alert(JSON.stringify(data));
        if (data.pzh == '') continue;
        let r = $dzpz_dymx_ds.insertRow(99999);
        $dzpz_dymx_ds.setValue(r, data);
    }


    showInfoPane("*正在保存并检测凭证号");
    form.save(false, function () {


        book.sheet0.paintPermit = false;
        toastr.info("导入完成");

    });
}




var dymx_changed = false;
/**
 * dsname结果集保存前，对row进行数据校验 ，
 * @param dsname 结果集名称
 * @param row  第row行
 * @returns {boolean} true表示检验通过， false表示校验不通过，update被终止
 */
function validate(dsname, row) {
    if (dsname == 'dzpz_dymx') dymx_changed = true;

    if (dsname == 'dzpz_dy') {

        if ($dzpz_dy_ds.getValue(0, "pass") == null) {
            
                toastr.info("请选择审批意见");
                return false;
            }

        if ($dzpz_dy_ds.getInt(0, "pass") == 0) {
            if ($dzpz_dy_ds.getString(0, "rejectreason") == '') {
                toastr.info("请输入拒绝理由");
                return false;
            }
        }
    }
    return true;
}

/**
 * 数据集中的数据发生变化
 * @param dsname 数据集名称
 * @param row   数据行号
 * @param col    字段名
 * @param oldValue   原值
 * @param newValue  新值
 */
function itemChanged(dsname, row, col, oldValue, newValue) {
    if (col == 'corpid') dymx_changed = true;

}



/**
 * 单据保存成功后执行本事件。如果单据不需要保存，或保存失败，则不执行本事件
 * @param GUID 当前单据的GGUID
 * @param action 当前单据正在进行的动作，比如 edit , view
 */
function afterSaveSuccessful(GGUID, action) {
    if (dymx_changed) form.loadBill(GGUID); //如果明细有变化，那么保存成功后，重新加载单据，因为在单据保存后，模板后端脚本中会同时更新  pz_id 及 bz
    dymx_changed = false;
}


//@comment (group=按钮点击事件,caption=取消打包,needRightControl=false)
function cb_redo_pack_onClick() {

    $confirm('', '确信要清除压缩文件吗?', function () {

        book.getWorkSheet('下载清单').popupDispose();

        setTimeout(function () {
            showInfoPane("*正在删除已打包的文件");
            setTimeout(function () {
                $dzpz_dy_ds.setValue(0, "ziptaskid", '');
                $dzpz_dy_ds.setValue(0, "zipresult", '');
                form.save(false);
                $q_result_ds.reset();
                hideInfoPane();
                toastr.info("打包文件已经删除。当再次点击打包下载时会重新打包");
            }, 200);
        }, 1000);
    });


}

//@comment (group=按钮点击事件,caption=取消打包,needRightControl=false)
function cb_cancel_onClick() {

    $confirm('', '确信要终止打包吗?', function () {
        showInfoPane("*正在终止打包...");


        $dzpz_dy_ds.setValue(0, "ziptaskid", '');
        $dzpz_dy_ds.setValue(0, "zipresult", '');

        form.save(false);
        hideInfoPane();

        runTask("终止打包", {
            id: $dzpz_dy_ds.getString(0, "ziptaskid")
        }, function (ret) { });


    });
}

//@comment (group=按钮点击事件,caption=打包,needRightControl=false)
function cb_package_onClick() {

    form.save(false, function () {
        var ziptaskid = $dzpz_dy_ds.getString(0, "ziptaskid");
        if (ziptaskid != '') {
            toastr.info("正在压缩中...，请稍候");
            return;
        }

        var zipResult = $dzpz_dy_ds.getString(0, "zipresult");
        if (zipResult == '') {
            toastr.info("正在压缩文件，请稍候");
            do_package(currentGUID(), function (ret) {

                if (ret.success) {
                    $dzpz_dy_ds.setValue(0, "ziptaskid", ret.zipTaskId, false); //后台已经回写了，就里只要界面上更新就ok
                }
            });
            return;
        }

        zipResult = zipResult.replace(/&action=view/g, '&action=download');
        zipResult = JSON.parse(zipResult);
        $q_result_ds.reset();
        for (var i = 0; i < zipResult.length; i++) {
            var one = zipResult[i];
            var row = $q_result_ds.insertRow(999);
            $q_result_ds.setValue(row, one);


        }

        book.getWorkSheet('下载清单').popup("", "下载清单", 800, 300, true, true);
    });
}



function cb_package_onClick___() {

    if (form.isSaveNeeded()) {
        toastr.info("请先保存");
        return;
    }

    let ids = [];
    for (let i = 0; i < $dzpz_dymx_ds.rowCount; i++) {
        if ($dzpz_dymx_ds.getString(i, "pz_id") == '') {
            toastr.error("第" + (i + 1) + "行的凭证号不存在，请核对");
            return;
        }
        ids.push($dzpz_dymx_ds.getString(i, "pz_id"));
    }

    if (ids.length == 0) {
        toastr.info("没有凭证清单");
        return;
    }

    $confirm('', '确信要打包下载吗?', function () {
        showInfoPane("*正在压缩打包...");
        let fileName = formatDate(newDate(), "yyyyMMddHHmm") + ".zip";
        runTask("打包下载", {
            fileName: fileName,
            gguid: currentGUID(),
            ids: ids,
            watermark: $dzpz_dy_ds.getString(0, "billno") + "[" + $dzpz_dy_ds.getString(0, "reader") + "]" +
                formatDate(newDate(), "yyyy.MM.dd HH:mm")
        },
            function (ret) {
                ret = JSON.parse(ret);
                hideInfoPane();
                if (ret.success) {
                    let t = window.location.href;
                    let p = t.indexOf("billedit");
                    t = t.substring(0, p);
                    let url = t + ret.url;
                    $.alert(` <a href="${url}" target="_blank">点击下载${fileName}</a>`, `打包完成`);
                } else {
                    toastr.error(ret.message);
                }
            });

    });

}

/**
 * 按钮点击事件
 * 当某个按钮被点击时， 首先触发  {按钮名称}_onClick 事件，然后触发 buttonOnClick事件
 * @param sheet  工作表
 * @param cell   按钮所在的单元格
 * @param button 按钮对象
 */
//@comment (group=按钮点击事件,caption=调取凭证列表,needRightControl=false)
function cb_pzlist_onClick(sheet, cell, button) {
    // if (form.isSaveNeeded()) {
    //     toastr.info("请先保存");
    //     return;
    // }
    book.getWorkSheet("凭证资料查询").float('fa fa-cog', "凭证资料查询",
        {
            my: 'right-center',
            at: 'right-center',
            autoposition: 'down',
            offsetX: -5,
            offsetY: 5
        }, { width: '70%', height: '90%' });
    smartRetrieve(book.getWorkSheet("凭证资料查询"), "q_pzdjex")
}


/**
 * 按钮点击事件
 * 当某个按钮被点击时， 首先触发  {按钮名称}_onClick 事件，然后触发 buttonOnClick事件
 * @param sheet  工作表
 * @param cell   按钮所在的单元格
 * @param button 按钮对象
 */
//@comment (group=按钮点击事件,caption=选入,needRightControl=false)
function cb_import_onClick(sheet, cell, button) {
    book.getWorkSheet("detail").paintPermit = false;
    let row = book.getDataSource("dzpz_dymx").currentBindRow;

    for (var i = 0; i < $q_pzdjex_ds.getRowCount(); i++) {
        if ($q_pzdjex_ds.getString(i, "selected") == '1') {
            if ($dzpz_dymx_ds.getString(row, "pzh") != '' || row < 0) row = $dzpz_dymx_ds.insertRow(row + 1);
            $dzpz_dymx_ds.setValue(row, {
                pzh: $q_pzdjex_ds.getValue(i, "pzh"),
                kmdm: $q_pzdjex_ds.getValue(i, "kmdm"),
                code: $q_pzdjex_ds.getValue(i, "code"),
                memo: $q_pzdjex_ds.getString(i, "bz")
            });
        }
    }
    book.getDataSource("dzpz_dymx").currentBindRow = row;
    book.getWorkSheet("detail").View.insureSelectionOnScreen(null, false);
    do_removeDuplicated(); //删除重复项

    //********删除行号***********************************
    book.getWorkSheet("凭证资料查询").paintPermit = false;
    for (var i = $q_pzdjex_ds.getRowCount() - 1; i >= 0; i--) {
        if ($q_pzdjex_ds.getString(i, "selected") == '1') $q_pzdjex_ds.deleteRow(i);
    }
    book.getWorkSheet("凭证资料查询").paintPermit = true;
    //**************************************************

    book.getWorkSheet("detail").paintPermit = true;
    book.getWorkSheet("main").paintPermit = true;
}

/**
 * 按钮点击事件
 * 当某个按钮被点击时， 首先触发  {按钮名称}_onClick 事件，然后触发 buttonOnClick事件
 * @param sheet  工作表
 * @param cell   按钮所在的单元格
 * @param button 按钮对象
 */
//@comment (group=按钮点击事件,caption=,needRightControl=false)
function cb_opensheet_dr_onClick(sheet, cell, button) {
    book.getWorkSheet("凭证列表").float('fa fa-cog', "导入凭证列表",
        {
            my: 'right-center',
            at: 'right-center',
            autoposition: 'down',
            offsetX: -5,
            offsetY: 5
        }, { width: 400, height: '80%' });

}

/**
 * 按钮点击事件
 * 当某个按钮被点击时， 首先触发  {按钮名称}_onClick 事件，然后触发 buttonOnClick事件
 * @param sheet  工作表
 * @param cell   按钮所在的单元格
 * @param button 按钮对象
 */
//@comment (group=按钮点击事件,caption=粘贴界面导入,needRightControl=false)
function cb_dr_onClick(sheet, cell, button) {

    book.getWorkSheet("detail").paintPermit = false;
    let row = book.getDataSource("dzpz_dymx").currentBindRow;
    let pzlist = sheet.cells('pzlist').getValueString().split('\n');
    for (let i = 0; i < pzlist.length; i++) {
        if (pzlist[i] !== '') {
            if ($dzpz_dymx_ds.getString(row, "pzh") != '' || row < 0) row = $dzpz_dymx_ds.insertRow(row + 1);

            $dzpz_dymx_ds.setValue(row, {
                pzh: pzlist[i]
            });
        }
    }
    sheet.cells('pzlist').setValue(null);
    sheet.floatPanelClose();

    book.getWorkSheet("detail").paintPermit = true;

}
/**
 * 单元格因为被编辑而改变。当用户通过编辑单元的值而让单元格发生值改变时本事件被触发。
 * 注意，当使用脚本 sheet.cells(row,col).setValue ( value) 来改变单元格的值时，本事件并不触发
 * @param sheet
 * @param cell
 * @param newValue
 * @param innerRow   当单元格没有绑定数据库或绑定到单行数据库时，本参数无意义。如果绑定一个
 * 多行数据库，则表示该单元所绑定的字段的第 innerRow行发生变化
 */
function cellValueChangedByEdit(sheet, cell, newValue, innerRow) {

    //通过数据库绑定情况来判断

    //通过别名来判断
    if (sheet.name == 'detail' && cell.alias == 'st_selectAll') {
        let ds = $dzpz_dymx_ds;
        sheet.paintPermit = false;
        for (var i = 0; i < ds.getRowCount(); i++) {
            ds.setValue(i, "selected", newValue);
        }
        sheet.paintPermit = true;
    }
    if (sheet.name == '凭证资料查询' && cell.alias == 'st_selectAll') {
        let ds = $q_pzdjex_ds;
        sheet.paintPermit = false;
        for (var i = 0; i < ds.getRowCount(); i++) {
            ds.setValue(i, "selected", newValue);
        }
        sheet.paintPermit = true;
    }

    let bind = cell.bind;
    if (bind != null && bind.dataSource == 'dzpz_dymx' && bind.DBCol == 'pzh') {
        showInfoPane('*正在分析凭证号');
        setTimeout(function () {
            do_paste_pzlist(innerRow, newValue) //写入凭证号
        }, 100);
    }
    if (bind != null && bind.dataSource == 'dzpz_dy' && bind.DBCol == 'reader') {
        $dzpz_dy_ds.setValue(0, {
            watermark: '【' + $dzpz_dy_ds.getString(0, "reader") + '】仅用于项目专项审计或检查'
        })
    }



}

/**
 * 单元格编辑时粘贴内容后触发此事件。
 * @param sheet
 * @param cell
 * @param innerRow   当单元格没有绑定数据库或绑定到单行数据库时，本参数无意义。如果绑定一个
 * 多行数据库，则表示该单元所绑定的字段的第 innerRow行被粘贴了内容
 * @param text 当前单元格编辑框中的内容，并不一定是粘贴的内容，是单元格编辑框中原有的内容加上粘贴的内容
 */
//@comment (group=单元格事件,caption=单元格粘贴内容)
function cellOnPaste(sheet, cell, innerRow, text) {

    //通过别名来判断
    if (cell.alias == 'XXX') {

    }

    //通过数据库绑定情况来判断
    let bind = cell.bind;
    if (bind != null && bind.dataSource == 'dzpz_dymx' && bind.DBCol == 'pzh') {
        sheet.View.forceCurrentEditControlGiveUpFocus();
    }

}


/**
 * 按钮点击事件
 * 当某个按钮被点击时， 首先触发  {按钮名称}_onClick 事件，然后触发 buttonOnClick事件
 * @param sheet  工作表
 * @param cell   按钮所在的单元格
 * @param button 按钮对象
 */
//@comment (group=do,caption=凭证列表粘贴凭证清单后自动后插并赋值,needRightControl=false)
function do_paste_pzlist(innerRow, newValue) {

    if (newValue == null || newValue == '') return;
    let data = newValue.split(' ');
    book.getWorkSheet("detail").paintPermit = false;
    let row = innerRow;
    for (let i = 0; i < data.length; i++) {
        //row = $dzpz_dymx_ds.insertRow(row + 1);
        if (data[i] != '') {
            $dzpz_dymx_ds.setValue(row, {
                pzh: data[i],
                selected: 1
            });
            if (i < data.length - 1) row = $dzpz_dymx_ds.insertRow(row + 1);
        }
    }
    book.getDataSource("dzpz_dymx").currentBindRow = row;
    book.getWorkSheet("detail").View.insureSelectionOnScreen(null, false);
    do_removeDuplicated(); //删除重复项
    book.getWorkSheet("detail").paintPermit = true;
    book.getWorkSheet("main").paintPermit = true;
    hideInfoPane();
}







//@comment (group=,caption=异步打包,needRightControl=false)
function async_package() {

    if (form.isSaveNeeded()) {
        toastr.info("请先保存");
        return;
    }

    let ids = [];
    for (let i = 0; i < $dzpz_dymx_ds.rowCount; i++) {
        if ($dzpz_dymx_ds.getString(i, "pz_id") == '') {
            toastr.error("第" + (i + 1) + "行的凭证号不存在，请核对");
            return;
        }
        ids.push($dzpz_dymx_ds.getString(i, "pz_id"));
    }

    if (ids.length == 0) {
        toastr.info("没有凭证清单");
        return;
    }

    $confirm('', '确信要重新打包吗?', function () {
        showInfoPane("*正在后台打包...");
        let fileName = $dzpz_dy_ds.getString(0, "reader") +
            formatDate(newDate(), "yyyy.MM.dd HH:mm") + "调阅凭证.zip";
        runTask("后台打包", {
            gguid: currentGUID(),
            fileName: fileName,
            ids: ids,
            watermark: $dzpz_dy_ds.getInt(0, "needwatermark") == 0 ? "" : ($dzpz_dy_ds.getString(0, "reader") + "/" + formatDate($dzpz_dy_ds.getValue(0, "billdate"), "yyyy.MM.dd HH:mm") + "\n" + $dzpz_dy_ds.getString(0, "watermark")),
            mergePDF: $dzpz_dy_ds.getString(0, "filetype") == 'pdf' //是否合并成一个pdf文件
        },
            function (ret) {
                ret = JSON.parse(ret);
                hideInfoPane();
                if (ret.success) {
                    $dzpz_dy_ds.setValue(0, "ziptaskid", ret.zipTaskId);
                    form.save(false);
                    hideInfoPane();

                } else {
                    toastr.error(ret.message);
                }
            });

    });


}

//@comment (group=按钮点击事件,caption=标记重复,needRightControl=false)
function cb_qc_onClick() {
    showInfoPane("*正在检测重复的凭证");
    var map = {};
    for (var i = 0; i < $dzpz_dymx_ds.rowCount; i++) {
        var pzh = $dzpz_dymx_ds.getString(i, "pzh");
        if (pzh == '') continue;
        if (map[pzh] == undefined) map[pzh] = []; //每个凭证号映射到一个数组，记录它所在的行号
        map[pzh].push(i); // 记录下凭证号对应的行号

    }

    book.getWorkSheet('detail').paintPermit = false;
    for (pzh in map) {
        var rows = map[pzh];
        $dzpz_dymx_ds.setValue(rows[0], "bz", "");
        for (var i = 1; i < rows.length; i++) {
            $dzpz_dymx_ds.setValue(rows[i], "bz", "与第" + (rows[0] + 1) + "行重复");
        }
    }
    book.getWorkSheet('detail').paintPermit = true;
    hideInfoPane();
}

//@comment (group=按钮点击事件,caption=删除重复的,needRightControl=false)
function cb_removeDuplicated_onClick() {

    $confirm('', '确信要清除重复的凭证号吗?', function () {

        do_removeDuplicated()

    });

}


//@comment (group=do,caption=执行删除重复的,needRightControl=false)
function do_removeDuplicated() {

    showInfoPane("*正在删除重复的凭证");
    book.getWorkSheet('detail').paintPermit = false;
    var pzhs = []; //凭证号清单
    var rows = [];// 需要删除的行号
    for (var i = 0; i < $dzpz_dymx_ds.rowCount; i++) {
        var pzh = $dzpz_dymx_ds.getString(i, "pzh");
        if (pzhs.contains(pzh)) //此凭证号此前已经出现过
        {
            rows.push(i);//  需要删除
        } else {
            pzhs.push(pzh); //没有出现过，那么加它到凭证号清单中
        }
    }
    //现在反着删除
    for (var i = rows.length - 1; i >= 0; i--) {
        $dzpz_dymx_ds.deleteRow(rows[i]);
    }
    //form.save(false);
    book.getWorkSheet('detail').paintPermit = false;
    hideInfoPane();
}



/**
 * 按钮点击事件
 * 当某个按钮被点击时， 首先触发  {按钮名称}_onClick 事件，然后触发 buttonOnClick事件
 * @param sheet  工作表
 * @param cell   按钮所在的单元格
 * @param button 按钮对象
 */
//@comment (group=按钮点击事件,caption=批量删除已选中记录,needRightControl=false)
function cb_selectedRow_delete_onClick(sheet, cell, button) {
    $confirm("提示", "确定要删除选中的记录吗?", function () {
        book.getWorkSheet('detail').paintPermit = false;
        for (let i = $dzpz_dymx_ds.getRowCount() - 1; i >= 0; i--) {
            if ($dzpz_dymx_ds.getInt(i, "selected") == 1) $dzpz_dymx_ds.deleteRow(i);
        }
        if ($dzpz_dymx_ds.getRowCount() == 0) $dzpz_dymx_ds.insertRow(0);
        book.getWorkSheet('detail').cells("st_selectAll").setValue(0);
        book.getWorkSheet('detail').paintPermit = true;
    }, function () { });



}

function copyURL(url) {

    let s = getServiceHomeURL('app') + url;
    let d = book.sheet3.cells("days").getValueInt();
    let t = book.sheet3.cells("times").getValueInt();
    s = back_urlShare(s, d, t);
    $setClipboard(s);
    toastr.info("分享地址已经复制到剪贴板");
}


id: 64db211b8b101d5b59c64802
scriptid: 60fa600f9932563b7c99bb03
tablename: app_template
clientip: 0:0:0:0:0:0:0:1
username: sa
createdate: 2023.08.15 14:59:50.000
script:
var g_currentUserIsOwner = false; //当前人是不是起草人





/**
 * 表单初始化完成后，执行此事件
 */
//@comment (group=表单事件,caption=表单初始化完成)
function formOpen() {
    book.showTabOnWhere = 'none';
    book.getWorkSheet('下载清单').visible = false;



    if ($dzpz_dy_ds.getString(0, "ziptaskid") == '') {
        book.sheet1.getBrick('cb_cancel').visible = false;
    }

    if (currentUserId() == $dzpz_dy_ds.getInt(0, "userid")) {
        g_currentUserIsOwner = true;
    }
    //按gguid分开接收消息，避免多个打包的消息混在一起
    onPushMessage("打包下载" + currentGUID(), function (info) {
        console.info(info);
        var msg = JSON.parse(info);
        if (msg.action == 'info') {
            console.info(msg.info);
            if (g_currentUserIsOwner) showInfoPane(msg.info);
        }

        if (msg.action == 'gameOver') {
            var result = msg.result;
            //$.alert(JSON.stringify(result));


            $dzpz_dy_ds.setValue(0, "ziptaskid", '', false);//清除打包任务id，因为已经ok了，但不要触发保存
            //不需要保存 ，因为打包完成脚本中已经回填了，仅在界面上回填一下， 方便显示下载清单
            $dzpz_dy_ds.setValue(0, "zipresult", JSON.stringify(result.zipFiles), false);

            console.dir(result);

            cb_package_onClick();

            hideInfoPane();
        }
        if (msg.action == 'over') {

            hideInfoPane();
        }

        if (msg.action == 'error') {
            $.alert(msg.info);
            hideInfoPane();
        }
    })

    $('.navbar-fixed-top').css("z-index", 1);

}
/**
 * 按钮点击事件
 * 当某个按钮被点击时， 首先触发  {按钮名称}_onClick 事件，然后触发 buttonOnClick事件
 * @param sheet  工作表
 * @param cell   按钮所在的单元格
 * @param button 按钮对象
 */
//@comment (group=按钮点击事件,caption=下载模板,needRightControl=false)
function cb_downloadTemplateFile_onClick(sheet, cell, button) {
    var title = "序号\t凭证号\t科目代码\t核算账号编号\t摘要";
    var data = [];
    data.push(title);
    data.push("1\t0001\t1001\tRD0001\tABC");
    data.push("2\t0002\t5501\tRD0002\tBBB");

    var f = $('#form_toexcel')[0];
    f.filename.value = "凭证调阅模板.xlsx";
    f.data.value = JSON.stringify(data);
    f.submit();

}

/**
 * 按钮点击事件
 * 当某个按钮被点击时， 首先触发  {按钮名称}_onClick 事件，然后触发 buttonOnClick事件
 * @param sheet  工作表
 * @param cell   按钮所在的单元格
 * @param button 按钮对象
 */
//@comment (group=按钮点击事件,caption=导入模板,needRightControl=false)
function cb_importFromExcelFile_onClick(sheet, cell, button) {
    toastr.info("*自动保存，准备导入");
    form.save(false, function () {
        book.readXLS(function (data) {
            showInfoPane("*正在导入");
            setTimeout(function () {
                importData(data);
            }, 10);
        });
    });

}



function safeValue(sheet, row, col) {
    if (row > sheet.length - 1) return null;
    var dataRow = sheet[row];
    if (dataRow == null) return null;
    if (col > dataRow.length - 1) return null;
    return dataRow[col];

}

//@comment (group=,caption=从Excel导入数据,needRightControl=false)
function importData(excelData) {
    var excelSheet = excelData[Object.keys(excelData)[0]];


    var headRow = 0; //题头在第几行
    var dataStartRow = 1;// 数据行从第几行开始

    var RC = excelSheet.length;

    book.sheet0.paintPermit = false;

    for (let row = dataStartRow; row < RC; row++) {
        let data = {
            pzh: safeValue(excelSheet, row, 1) || '',
            kmdm: safeValue(excelSheet, row, 2) || '',
            code: safeValue(excelSheet, row, 3) || '',
            memo: safeValue(excelSheet, row, 4) || '',
        }
        //alert(JSON.stringify(data));
        if (data.pzh == '') continue;
        let r = $dzpz_dymx_ds.insertRow(99999);
        $dzpz_dymx_ds.setValue(r, data);
    }


    showInfoPane("*正在保存并检测凭证号");
    form.save(false, function () {


        book.sheet0.paintPermit = false;
        toastr.info("导入完成");

    });
}




var dymx_changed = false;
/**
 * dsname结果集保存前，对row进行数据校验 ，
 * @param dsname 结果集名称
 * @param row  第row行
 * @returns {boolean} true表示检验通过， false表示校验不通过，update被终止
 */
function validate(dsname, row) {
    if (dsname == 'dzpz_dymx') dymx_changed = true;

    if (dsname == 'dzpz_dy') {

        if ($dzpz_dy_ds.getValue(0, "pass") == null) {
            
                toastr.error("请选择审批意见");
                return false;
            }

        if ($dzpz_dy_ds.getInt(0, "pass") == 0) {
            if ($dzpz_dy_ds.getString(0, "rejectreason") == '') {
                toastr.error("请输入拒绝理由");
                return false;
            }
        }
    }
    return true;
}

/**
 * 数据集中的数据发生变化
 * @param dsname 数据集名称
 * @param row   数据行号
 * @param col    字段名
 * @param oldValue   原值
 * @param newValue  新值
 */
function itemChanged(dsname, row, col, oldValue, newValue) {
    if (col == 'corpid') dymx_changed = true;

}



/**
 * 单据保存成功后执行本事件。如果单据不需要保存，或保存失败，则不执行本事件
 * @param GUID 当前单据的GGUID
 * @param action 当前单据正在进行的动作，比如 edit , view
 */
function afterSaveSuccessful(GGUID, action) {
    if (dymx_changed) form.loadBill(GGUID); //如果明细有变化，那么保存成功后，重新加载单据，因为在单据保存后，模板后端脚本中会同时更新  pz_id 及 bz
    dymx_changed = false;
}


//@comment (group=按钮点击事件,caption=取消打包,needRightControl=false)
function cb_redo_pack_onClick() {

    $confirm('', '确信要清除压缩文件吗?', function () {

        book.getWorkSheet('下载清单').popupDispose();

        setTimeout(function () {
            showInfoPane("*正在删除已打包的文件");
            setTimeout(function () {
                $dzpz_dy_ds.setValue(0, "ziptaskid", '');
                $dzpz_dy_ds.setValue(0, "zipresult", '');
                form.save(false);
                $q_result_ds.reset();
                hideInfoPane();
                toastr.info("打包文件已经删除。当再次点击打包下载时会重新打包");
            }, 200);
        }, 1000);
    });


}

//@comment (group=按钮点击事件,caption=取消打包,needRightControl=false)
function cb_cancel_onClick() {

    $confirm('', '确信要终止打包吗?', function () {
        showInfoPane("*正在终止打包...");


        $dzpz_dy_ds.setValue(0, "ziptaskid", '');
        $dzpz_dy_ds.setValue(0, "zipresult", '');

        form.save(false);
        hideInfoPane();

        runTask("终止打包", {
            id: $dzpz_dy_ds.getString(0, "ziptaskid")
        }, function (ret) { });


    });
}

//@comment (group=按钮点击事件,caption=打包,needRightControl=false)
function cb_package_onClick() {

    form.save(false, function () {
        var ziptaskid = $dzpz_dy_ds.getString(0, "ziptaskid");
        if (ziptaskid != '') {
            toastr.info("正在压缩中...，请稍候");
            return;
        }

        var zipResult = $dzpz_dy_ds.getString(0, "zipresult");
        if (zipResult == '') {
            toastr.info("正在压缩文件，请稍候");
            do_package(currentGUID(), function (ret) {

                if (ret.success) {
                    $dzpz_dy_ds.setValue(0, "ziptaskid", ret.zipTaskId, false); //后台已经回写了，就里只要界面上更新就ok
                }
            });
            return;
        }

        zipResult = zipResult.replace(/&action=view/g, '&action=download');
        zipResult = JSON.parse(zipResult);
        $q_result_ds.reset();
        for (var i = 0; i < zipResult.length; i++) {
            var one = zipResult[i];
            var row = $q_result_ds.insertRow(999);
            $q_result_ds.setValue(row, one);


        }

        book.getWorkSheet('下载清单').popup("", "下载清单", 800, 300, true, true);
    });
}



function cb_package_onClick___() {

    if (form.isSaveNeeded()) {
        toastr.info("请先保存");
        return;
    }

    let ids = [];
    for (let i = 0; i < $dzpz_dymx_ds.rowCount; i++) {
        if ($dzpz_dymx_ds.getString(i, "pz_id") == '') {
            toastr.error("第" + (i + 1) + "行的凭证号不存在，请核对");
            return;
        }
        ids.push($dzpz_dymx_ds.getString(i, "pz_id"));
    }

    if (ids.length == 0) {
        toastr.info("没有凭证清单");
        return;
    }

    $confirm('', '确信要打包下载吗?', function () {
        showInfoPane("*正在压缩打包...");
        let fileName = formatDate(newDate(), "yyyyMMddHHmm") + ".zip";
        runTask("打包下载", {
            fileName: fileName,
            gguid: currentGUID(),
            ids: ids,
            watermark: $dzpz_dy_ds.getString(0, "billno") + "[" + $dzpz_dy_ds.getString(0, "reader") + "]" +
                formatDate(newDate(), "yyyy.MM.dd HH:mm")
        },
            function (ret) {
                ret = JSON.parse(ret);
                hideInfoPane();
                if (ret.success) {
                    let t = window.location.href;
                    let p = t.indexOf("billedit");
                    t = t.substring(0, p);
                    let url = t + ret.url;
                    $.alert(` <a href="${url}" target="_blank">点击下载${fileName}</a>`, `打包完成`);
                } else {
                    toastr.error(ret.message);
                }
            });

    });

}

/**
 * 按钮点击事件
 * 当某个按钮被点击时， 首先触发  {按钮名称}_onClick 事件，然后触发 buttonOnClick事件
 * @param sheet  工作表
 * @param cell   按钮所在的单元格
 * @param button 按钮对象
 */
//@comment (group=按钮点击事件,caption=调取凭证列表,needRightControl=false)
function cb_pzlist_onClick(sheet, cell, button) {
    // if (form.isSaveNeeded()) {
    //     toastr.info("请先保存");
    //     return;
    // }
    book.getWorkSheet("凭证资料查询").float('fa fa-cog', "凭证资料查询",
        {
            my: 'right-center',
            at: 'right-center',
            autoposition: 'down',
            offsetX: -5,
            offsetY: 5
        }, { width: '70%', height: '90%' });
    smartRetrieve(book.getWorkSheet("凭证资料查询"), "q_pzdjex")
}


/**
 * 按钮点击事件
 * 当某个按钮被点击时， 首先触发  {按钮名称}_onClick 事件，然后触发 buttonOnClick事件
 * @param sheet  工作表
 * @param cell   按钮所在的单元格
 * @param button 按钮对象
 */
//@comment (group=按钮点击事件,caption=选入,needRightControl=false)
function cb_import_onClick(sheet, cell, button) {
    book.getWorkSheet("detail").paintPermit = false;
    let row = book.getDataSource("dzpz_dymx").currentBindRow;

    for (var i = 0; i < $q_pzdjex_ds.getRowCount(); i++) {
        if ($q_pzdjex_ds.getString(i, "selected") == '1') {
            if ($dzpz_dymx_ds.getString(row, "pzh") != '' || row < 0) row = $dzpz_dymx_ds.insertRow(row + 1);
            $dzpz_dymx_ds.setValue(row, {
                pzh: $q_pzdjex_ds.getValue(i, "pzh"),
                kmdm: $q_pzdjex_ds.getValue(i, "kmdm"),
                code: $q_pzdjex_ds.getValue(i, "code"),
                memo: $q_pzdjex_ds.getString(i, "bz")
            });
        }
    }
    book.getDataSource("dzpz_dymx").currentBindRow = row;
    book.getWorkSheet("detail").View.insureSelectionOnScreen(null, false);
    do_removeDuplicated(); //删除重复项

    //********删除行号***********************************
    book.getWorkSheet("凭证资料查询").paintPermit = false;
    for (var i = $q_pzdjex_ds.getRowCount() - 1; i >= 0; i--) {
        if ($q_pzdjex_ds.getString(i, "selected") == '1') $q_pzdjex_ds.deleteRow(i);
    }
    book.getWorkSheet("凭证资料查询").paintPermit = true;
    //**************************************************

    book.getWorkSheet("detail").paintPermit = true;
    book.getWorkSheet("main").paintPermit = true;
}

/**
 * 按钮点击事件
 * 当某个按钮被点击时， 首先触发  {按钮名称}_onClick 事件，然后触发 buttonOnClick事件
 * @param sheet  工作表
 * @param cell   按钮所在的单元格
 * @param button 按钮对象
 */
//@comment (group=按钮点击事件,caption=,needRightControl=false)
function cb_opensheet_dr_onClick(sheet, cell, button) {
    book.getWorkSheet("凭证列表").float('fa fa-cog', "导入凭证列表",
        {
            my: 'right-center',
            at: 'right-center',
            autoposition: 'down',
            offsetX: -5,
            offsetY: 5
        }, { width: 400, height: '80%' });

}

/**
 * 按钮点击事件
 * 当某个按钮被点击时， 首先触发  {按钮名称}_onClick 事件，然后触发 buttonOnClick事件
 * @param sheet  工作表
 * @param cell   按钮所在的单元格
 * @param button 按钮对象
 */
//@comment (group=按钮点击事件,caption=粘贴界面导入,needRightControl=false)
function cb_dr_onClick(sheet, cell, button) {

    book.getWorkSheet("detail").paintPermit = false;
    let row = book.getDataSource("dzpz_dymx").currentBindRow;
    let pzlist = sheet.cells('pzlist').getValueString().split('\n');
    for (let i = 0; i < pzlist.length; i++) {
        if (pzlist[i] !== '') {
            if ($dzpz_dymx_ds.getString(row, "pzh") != '' || row < 0) row = $dzpz_dymx_ds.insertRow(row + 1);

            $dzpz_dymx_ds.setValue(row, {
                pzh: pzlist[i]
            });
        }
    }
    sheet.cells('pzlist').setValue(null);
    sheet.floatPanelClose();

    book.getWorkSheet("detail").paintPermit = true;

}
/**
 * 单元格因为被编辑而改变。当用户通过编辑单元的值而让单元格发生值改变时本事件被触发。
 * 注意，当使用脚本 sheet.cells(row,col).setValue ( value) 来改变单元格的值时，本事件并不触发
 * @param sheet
 * @param cell
 * @param newValue
 * @param innerRow   当单元格没有绑定数据库或绑定到单行数据库时，本参数无意义。如果绑定一个
 * 多行数据库，则表示该单元所绑定的字段的第 innerRow行发生变化
 */
function cellValueChangedByEdit(sheet, cell, newValue, innerRow) {

    //通过数据库绑定情况来判断

    //通过别名来判断
    if (sheet.name == 'detail' && cell.alias == 'st_selectAll') {
        let ds = $dzpz_dymx_ds;
        sheet.paintPermit = false;
        for (var i = 0; i < ds.getRowCount(); i++) {
            ds.setValue(i, "selected", newValue);
        }
        sheet.paintPermit = true;
    }
    if (sheet.name == '凭证资料查询' && cell.alias == 'st_selectAll') {
        let ds = $q_pzdjex_ds;
        sheet.paintPermit = false;
        for (var i = 0; i < ds.getRowCount(); i++) {
            ds.setValue(i, "selected", newValue);
        }
        sheet.paintPermit = true;
    }

    let bind = cell.bind;
    if (bind != null && bind.dataSource == 'dzpz_dymx' && bind.DBCol == 'pzh') {
        showInfoPane('*正在分析凭证号');
        setTimeout(function () {
            do_paste_pzlist(innerRow, newValue) //写入凭证号
        }, 100);
    }
    if (bind != null && bind.dataSource == 'dzpz_dy' && bind.DBCol == 'reader') {
        $dzpz_dy_ds.setValue(0, {
            watermark: '【' + $dzpz_dy_ds.getString(0, "reader") + '】仅用于项目专项审计或检查'
        })
    }



}

/**
 * 单元格编辑时粘贴内容后触发此事件。
 * @param sheet
 * @param cell
 * @param innerRow   当单元格没有绑定数据库或绑定到单行数据库时，本参数无意义。如果绑定一个
 * 多行数据库，则表示该单元所绑定的字段的第 innerRow行被粘贴了内容
 * @param text 当前单元格编辑框中的内容，并不一定是粘贴的内容，是单元格编辑框中原有的内容加上粘贴的内容
 */
//@comment (group=单元格事件,caption=单元格粘贴内容)
function cellOnPaste(sheet, cell, innerRow, text) {

    //通过别名来判断
    if (cell.alias == 'XXX') {

    }

    //通过数据库绑定情况来判断
    let bind = cell.bind;
    if (bind != null && bind.dataSource == 'dzpz_dymx' && bind.DBCol == 'pzh') {
        sheet.View.forceCurrentEditControlGiveUpFocus();
    }

}


/**
 * 按钮点击事件
 * 当某个按钮被点击时， 首先触发  {按钮名称}_onClick 事件，然后触发 buttonOnClick事件
 * @param sheet  工作表
 * @param cell   按钮所在的单元格
 * @param button 按钮对象
 */
//@comment (group=do,caption=凭证列表粘贴凭证清单后自动后插并赋值,needRightControl=false)
function do_paste_pzlist(innerRow, newValue) {

    if (newValue == null || newValue == '') return;
    let data = newValue.split(' ');
    book.getWorkSheet("detail").paintPermit = false;
    let row = innerRow;
    for (let i = 0; i < data.length; i++) {
        //row = $dzpz_dymx_ds.insertRow(row + 1);
        if (data[i] != '') {
            $dzpz_dymx_ds.setValue(row, {
                pzh: data[i],
                selected: 1
            });
            if (i < data.length - 1) row = $dzpz_dymx_ds.insertRow(row + 1);
        }
    }
    book.getDataSource("dzpz_dymx").currentBindRow = row;
    book.getWorkSheet("detail").View.insureSelectionOnScreen(null, false);
    do_removeDuplicated(); //删除重复项
    book.getWorkSheet("detail").paintPermit = true;
    book.getWorkSheet("main").paintPermit = true;
    hideInfoPane();
}







//@comment (group=,caption=异步打包,needRightControl=false)
function async_package() {

    if (form.isSaveNeeded()) {
        toastr.info("请先保存");
        return;
    }

    let ids = [];
    for (let i = 0; i < $dzpz_dymx_ds.rowCount; i++) {
        if ($dzpz_dymx_ds.getString(i, "pz_id") == '') {
            toastr.error("第" + (i + 1) + "行的凭证号不存在，请核对");
            return;
        }
        ids.push($dzpz_dymx_ds.getString(i, "pz_id"));
    }

    if (ids.length == 0) {
        toastr.info("没有凭证清单");
        return;
    }

    $confirm('', '确信要重新打包吗?', function () {
        showInfoPane("*正在后台打包...");
        let fileName = $dzpz_dy_ds.getString(0, "reader") +
            formatDate(newDate(), "yyyy.MM.dd HH:mm") + "调阅凭证.zip";
        runTask("后台打包", {
            gguid: currentGUID(),
            fileName: fileName,
            ids: ids,
            watermark: $dzpz_dy_ds.getInt(0, "needwatermark") == 0 ? "" : ($dzpz_dy_ds.getString(0, "reader") + "/" + formatDate($dzpz_dy_ds.getValue(0, "billdate"), "yyyy.MM.dd HH:mm") + "\n" + $dzpz_dy_ds.getString(0, "watermark")),
            mergePDF: $dzpz_dy_ds.getString(0, "filetype") == 'pdf' //是否合并成一个pdf文件
        },
            function (ret) {
                ret = JSON.parse(ret);
                hideInfoPane();
                if (ret.success) {
                    $dzpz_dy_ds.setValue(0, "ziptaskid", ret.zipTaskId);
                    form.save(false);
                    hideInfoPane();

                } else {
                    toastr.error(ret.message);
                }
            });

    });


}

//@comment (group=按钮点击事件,caption=标记重复,needRightControl=false)
function cb_qc_onClick() {
    showInfoPane("*正在检测重复的凭证");
    var map = {};
    for (var i = 0; i < $dzpz_dymx_ds.rowCount; i++) {
        var pzh = $dzpz_dymx_ds.getString(i, "pzh");
        if (pzh == '') continue;
        if (map[pzh] == undefined) map[pzh] = []; //每个凭证号映射到一个数组，记录它所在的行号
        map[pzh].push(i); // 记录下凭证号对应的行号

    }

    book.getWorkSheet('detail').paintPermit = false;
    for (pzh in map) {
        var rows = map[pzh];
        $dzpz_dymx_ds.setValue(rows[0], "bz", "");
        for (var i = 1; i < rows.length; i++) {
            $dzpz_dymx_ds.setValue(rows[i], "bz", "与第" + (rows[0] + 1) + "行重复");
        }
    }
    book.getWorkSheet('detail').paintPermit = true;
    hideInfoPane();
}

//@comment (group=按钮点击事件,caption=删除重复的,needRightControl=false)
function cb_removeDuplicated_onClick() {

    $confirm('', '确信要清除重复的凭证号吗?', function () {

        do_removeDuplicated()

    });

}


//@comment (group=do,caption=执行删除重复的,needRightControl=false)
function do_removeDuplicated() {

    showInfoPane("*正在删除重复的凭证");
    book.getWorkSheet('detail').paintPermit = false;
    var pzhs = []; //凭证号清单
    var rows = [];// 需要删除的行号
    for (var i = 0; i < $dzpz_dymx_ds.rowCount; i++) {
        var pzh = $dzpz_dymx_ds.getString(i, "pzh");
        if (pzhs.contains(pzh)) //此凭证号此前已经出现过
        {
            rows.push(i);//  需要删除
        } else {
            pzhs.push(pzh); //没有出现过，那么加它到凭证号清单中
        }
    }
    //现在反着删除
    for (var i = rows.length - 1; i >= 0; i--) {
        $dzpz_dymx_ds.deleteRow(rows[i]);
    }
    //form.save(false);
    book.getWorkSheet('detail').paintPermit = false;
    hideInfoPane();
}



/**
 * 按钮点击事件
 * 当某个按钮被点击时， 首先触发  {按钮名称}_onClick 事件，然后触发 buttonOnClick事件
 * @param sheet  工作表
 * @param cell   按钮所在的单元格
 * @param button 按钮对象
 */
//@comment (group=按钮点击事件,caption=批量删除已选中记录,needRightControl=false)
function cb_selectedRow_delete_onClick(sheet, cell, button) {
    $confirm("提示", "确定要删除选中的记录吗?", function () {
        book.getWorkSheet('detail').paintPermit = false;
        for (let i = $dzpz_dymx_ds.getRowCount() - 1; i >= 0; i--) {
            if ($dzpz_dymx_ds.getInt(i, "selected") == 1) $dzpz_dymx_ds.deleteRow(i);
        }
        if ($dzpz_dymx_ds.getRowCount() == 0) $dzpz_dymx_ds.insertRow(0);
        book.getWorkSheet('detail').cells("st_selectAll").setValue(0);
        book.getWorkSheet('detail').paintPermit = true;
    }, function () { });



}

function copyURL(url) {

    let s = getServiceHomeURL('app') + url;
    let d = book.sheet3.cells("days").getValueInt();
    let t = book.sheet3.cells("times").getValueInt();
    s = back_urlShare(s, d, t);
    $setClipboard(s);
    toastr.info("分享地址已经复制到剪贴板");
}


id: 64db211b8b101d5b59c64811
scriptid: 60fa600f9932563b7c99baff
tablename: app_script
clientip: 0:0:0:0:0:0:0:1
username: sa
createdate: 2023.08.15 15:04:28.000
script:
/**
 * 单据点击保存，前端所有的操作被转译成3种操作:insert , delete , update ,
 *  并且可以在  beforeBillSaveOnServer 中返回一些SQL语句，可以在afterBillSaveOnServer中返回一些SQL语句
 *
 * 系统分别在需要的数据库连接中执行这些语句 ， 当所有语句执行成功后，事件被提交。一些细节如下 ：
 *
 * 1 如果单据中的表，属于不同的数据库连接，那么所有的SQL语句会以连接为单位，对语句进行批量执行
 * 2 这些语句的执行顺序是：对同一个数据库连接中的语句， 先执行 beforeBillSaveOnServer 中返回的SQL语句，再执行单据操作转译得到的SQL语句，
 *   再执行 afterBillSaveOnServer 中返回的SQL语句， 当多个（或一个）数据库连接执行完这些语句，且没有错误时，所有的数据库连接做提交，否则全部回滚
 * 3 不要在 beforeBillSaveOnServer 或 afterBillSaveOnServer 中直接执行数据库操作，而是返回SQL语句，让系统批量执行它们，并控制好事务
 * 4 当执行成功后，系统再执行事件函数  afterBillSaveSuccessfulOnServer 。 此事件中可以执行任意操作，它与单据保存事件结束后才被触发执行，
 *   与单据保存并不在一个事务中。
 *
 *
 * @param gguid  要删除记录的gguid ，等同于主表的id
 * @param session  一个JSON对象，用于在整个单据保存过程中的各个事件之间传递数据。本事件做为单据保存的最后一个事件，session对象在使用后将被丢弃
 *
 *
 * @return 本函数不需要返回值
 *
 */
function afterBillSaveSuccessfulOnServer(gguid, session) {

    var corpid = getStringFromSQL("select corpid from dzpz_dy where id='" + gguid + "'");
    //2022.08.11优化，理论上不应该存在重复号码的凭证，但是加上max肯定没错，避免数据异常导致更新失败
    var sqls = ["update dzpz_dymx  set bz=null,pz_id= (select max(id) from dzpz_pz where dzpz_pz.pzh= dzpz_dymx.pzh and dzpz_pz.corpid='" + corpid + "' ) where gguid='" + gguid + "' ",
    "update dzpz_dymx  set bz='凭证号不存在' where  gguid='" + gguid + "' and not exists (select dzpz_pz.id from dzpz_pz where  dzpz_pz.pzh= dzpz_dymx.pzh  and dzpz_pz.corpid='" + corpid + "')  "

    ];

    runSQL("", sqls, true);
    println("----检测凭证是否存在完成---------")
}


/**
 * 用户任务提交后
 * @param flow 流程定义
 * @param node 开始节点
 * @param gguid 单据的gguid

 */

//@comment (group=工作流事件,caption=用户任务提交后)
function onUserTaskSubmitted(flow, userTask, gguid) {
    // println( flow.id) ; //流程定义的ID
    // println( userTask.name);
    println(JSON.stringify(userTask));
    println(gguid);
    if (userTask.id == 'id_60b3b08f27644fc18af35ba20ecd2bac') {
        var ds= newDataStore("","select * from dzpz_dy where id='" + gguid + "'");
        ds.retrieve();
        var moreData = ds.getString(0,"moredata");
        try {
            moreData = JSON.parse(moreData);
            //起草后，递交后调用OA的接口回写数据
            if (moreData.form_id) {
                var pass= ds.getInt(0,"pass");
                var reason =ds.getString(0,"rejectreason");
                runTask('oa_callback', { requestid: moreData.form_id , pass:pass , reason:reason});
            }
        } catch (err) {

        }

    }

    if (userTask.id == 'id_6655df8bedc641aa9bacf1720d13ce2d') //领导审批通过后，就开始打包
    {
        //领导审批通过后，就开始打包
        //2023.07.13 不要自动打包，等oa调用接口在打包，不然，oa没有通知就打包并发送邮件就不对了
     //   do_package(gguid);
    }

    println(gguid + " " + userTask.name + " 提交完成")


}

//后台打包
function do_package(gguid) {
    if( getIntFromSQL( "select pass from dzpz_dy where id='"+gguid+"' "  ) ==0) return {success:false, message:"调阅被拒绝，禁止下载"}
    var ret = JSON.parse(runTask("package", { gguid: gguid }));
    return ret;
}



function back_urlShare(url, d, t) {
    var ret = urlShare(url, d, "day", t);
    return ret.url;
}


id: 64db211b8b101d5b59c64817
scriptid: 60fa600f9932563b7c99bb03
tablename: app_template
clientip: 0:0:0:0:0:0:0:1
username: sa
createdate: 2023.08.15 15:05:49.000
script:
var g_currentUserIsOwner = false; //当前人是不是起草人





/**
 * 表单初始化完成后，执行此事件
 */
//@comment (group=表单事件,caption=表单初始化完成)
function formOpen() {
    book.showTabOnWhere = 'none';
    book.getWorkSheet('下载清单').visible = false;



    if ($dzpz_dy_ds.getString(0, "ziptaskid") == '') {
        book.sheet1.getBrick('cb_cancel').visible = false;
    }

    if (currentUserId() == $dzpz_dy_ds.getInt(0, "userid")) {
        g_currentUserIsOwner = true;
    }
    //按gguid分开接收消息，避免多个打包的消息混在一起
    onPushMessage("打包下载" + currentGUID(), function (info) {
        console.info(info);
        var msg = JSON.parse(info);
        if (msg.action == 'info') {
            console.info(msg.info);
            if (g_currentUserIsOwner) showInfoPane(msg.info);
        }

        if (msg.action == 'gameOver') {
            var result = msg.result;
            //$.alert(JSON.stringify(result));


            $dzpz_dy_ds.setValue(0, "ziptaskid", '', false);//清除打包任务id，因为已经ok了，但不要触发保存
            //不需要保存 ，因为打包完成脚本中已经回填了，仅在界面上回填一下， 方便显示下载清单
            $dzpz_dy_ds.setValue(0, "zipresult", JSON.stringify(result.zipFiles), false);

            console.dir(result);

            cb_package_onClick();

            hideInfoPane();
        }
        if (msg.action == 'over') {

            hideInfoPane();
        }

        if (msg.action == 'error') {
            $.alert(msg.info);
            hideInfoPane();
        }
    })

    $('.navbar-fixed-top').css("z-index", 1);

}
/**
 * 按钮点击事件
 * 当某个按钮被点击时， 首先触发  {按钮名称}_onClick 事件，然后触发 buttonOnClick事件
 * @param sheet  工作表
 * @param cell   按钮所在的单元格
 * @param button 按钮对象
 */
//@comment (group=按钮点击事件,caption=下载模板,needRightControl=false)
function cb_downloadTemplateFile_onClick(sheet, cell, button) {
    var title = "序号\t凭证号\t科目代码\t核算账号编号\t摘要";
    var data = [];
    data.push(title);
    data.push("1\t0001\t1001\tRD0001\tABC");
    data.push("2\t0002\t5501\tRD0002\tBBB");

    var f = $('#form_toexcel')[0];
    f.filename.value = "凭证调阅模板.xlsx";
    f.data.value = JSON.stringify(data);
    f.submit();

}

/**
 * 按钮点击事件
 * 当某个按钮被点击时， 首先触发  {按钮名称}_onClick 事件，然后触发 buttonOnClick事件
 * @param sheet  工作表
 * @param cell   按钮所在的单元格
 * @param button 按钮对象
 */
//@comment (group=按钮点击事件,caption=导入模板,needRightControl=false)
function cb_importFromExcelFile_onClick(sheet, cell, button) {
    toastr.info("*自动保存，准备导入");
    form.save(false, function () {
        book.readXLS(function (data) {
            showInfoPane("*正在导入");
            setTimeout(function () {
                importData(data);
            }, 10);
        });
    });

}



function safeValue(sheet, row, col) {
    if (row > sheet.length - 1) return null;
    var dataRow = sheet[row];
    if (dataRow == null) return null;
    if (col > dataRow.length - 1) return null;
    return dataRow[col];

}

//@comment (group=,caption=从Excel导入数据,needRightControl=false)
function importData(excelData) {
    var excelSheet = excelData[Object.keys(excelData)[0]];


    var headRow = 0; //题头在第几行
    var dataStartRow = 1;// 数据行从第几行开始

    var RC = excelSheet.length;

    book.sheet0.paintPermit = false;

    for (let row = dataStartRow; row < RC; row++) {
        let data = {
            pzh: safeValue(excelSheet, row, 1) || '',
            kmdm: safeValue(excelSheet, row, 2) || '',
            code: safeValue(excelSheet, row, 3) || '',
            memo: safeValue(excelSheet, row, 4) || '',
        }
        //alert(JSON.stringify(data));
        if (data.pzh == '') continue;
        let r = $dzpz_dymx_ds.insertRow(99999);
        $dzpz_dymx_ds.setValue(r, data);
    }


    showInfoPane("*正在保存并检测凭证号");
    form.save(false, function () {


        book.sheet0.paintPermit = false;
        toastr.info("导入完成");

    });
}




var dymx_changed = false;
/**
 * dsname结果集保存前，对row进行数据校验 ，
 * @param dsname 结果集名称
 * @param row  第row行
 * @returns {boolean} true表示检验通过， false表示校验不通过，update被终止
 */
function validate(dsname, row) {
    if (dsname == 'dzpz_dymx') dymx_changed = true;

    if (dsname == 'dzpz_dy') {

        if ($dzpz_dy_ds.getValue(0, "pass") == null) {
            
                toastr.error("请选择审批意见");
                return false;
            }

        if ($dzpz_dy_ds.getInt(0, "pass") == 0) {
            if ($dzpz_dy_ds.getString(0, "rejectreason") == '') {
                toastr.error("请输入拒绝理由");
                return false;
            }
        }
    }
    return true;
}

/**
 * 数据集中的数据发生变化
 * @param dsname 数据集名称
 * @param row   数据行号
 * @param col    字段名
 * @param oldValue   原值
 * @param newValue  新值
 */
function itemChanged(dsname, row, col, oldValue, newValue) {
    if (col == 'corpid') dymx_changed = true;

}



/**
 * 单据保存成功后执行本事件。如果单据不需要保存，或保存失败，则不执行本事件
 * @param GUID 当前单据的GGUID
 * @param action 当前单据正在进行的动作，比如 edit , view
 */
function afterSaveSuccessful(GGUID, action) {
    if (dymx_changed) form.loadBill(GGUID); //如果明细有变化，那么保存成功后，重新加载单据，因为在单据保存后，模板后端脚本中会同时更新  pz_id 及 bz
    dymx_changed = false;
}


//@comment (group=按钮点击事件,caption=取消打包,needRightControl=false)
function cb_redo_pack_onClick() {

    $confirm('', '确信要清除压缩文件吗?', function () {

        book.getWorkSheet('下载清单').popupDispose();

        setTimeout(function () {
            showInfoPane("*正在删除已打包的文件");
            setTimeout(function () {
                $dzpz_dy_ds.setValue(0, "ziptaskid", '');
                $dzpz_dy_ds.setValue(0, "zipresult", '');
                form.save(false);
                $q_result_ds.reset();
                hideInfoPane();
                toastr.info("打包文件已经删除。当再次点击打包下载时会重新打包");
            }, 200);
        }, 1000);
    });


}

//@comment (group=按钮点击事件,caption=取消打包,needRightControl=false)
function cb_cancel_onClick() {

    $confirm('', '确信要终止打包吗?', function () {
        showInfoPane("*正在终止打包...");


        $dzpz_dy_ds.setValue(0, "ziptaskid", '');
        $dzpz_dy_ds.setValue(0, "zipresult", '');

        form.save(false);
        hideInfoPane();

        runTask("终止打包", {
            id: $dzpz_dy_ds.getString(0, "ziptaskid")
        }, function (ret) { });


    });
}

//@comment (group=按钮点击事件,caption=打包,needRightControl=false)
function cb_package_onClick() {

    form.save(false, function () {
        var ziptaskid = $dzpz_dy_ds.getString(0, "ziptaskid");
        if (ziptaskid != '') {
            toastr.info("正在压缩中...，请稍候");
            return;
        }

        var zipResult = $dzpz_dy_ds.getString(0, "zipresult");
        if (zipResult == '') {
            toastr.info("正在压缩文件，请稍候");
            do_package(currentGUID(), function (ret) {

                if (ret.success) {
                    $dzpz_dy_ds.setValue(0, "ziptaskid", ret.zipTaskId, false); //后台已经回写了，就里只要界面上更新就ok
                }else{
                    toastr.error( ret.message);
                    return;
                }
            });
            return;
        }

        zipResult = zipResult.replace(/&action=view/g, '&action=download');
        zipResult = JSON.parse(zipResult);
        $q_result_ds.reset();
        for (var i = 0; i < zipResult.length; i++) {
            var one = zipResult[i];
            var row = $q_result_ds.insertRow(999);
            $q_result_ds.setValue(row, one);


        }

        book.getWorkSheet('下载清单').popup("", "下载清单", 800, 300, true, true);
    });
}



function cb_package_onClick___() {

    if (form.isSaveNeeded()) {
        toastr.info("请先保存");
        return;
    }

    let ids = [];
    for (let i = 0; i < $dzpz_dymx_ds.rowCount; i++) {
        if ($dzpz_dymx_ds.getString(i, "pz_id") == '') {
            toastr.error("第" + (i + 1) + "行的凭证号不存在，请核对");
            return;
        }
        ids.push($dzpz_dymx_ds.getString(i, "pz_id"));
    }

    if (ids.length == 0) {
        toastr.info("没有凭证清单");
        return;
    }

    $confirm('', '确信要打包下载吗?', function () {
        showInfoPane("*正在压缩打包...");
        let fileName = formatDate(newDate(), "yyyyMMddHHmm") + ".zip";
        runTask("打包下载", {
            fileName: fileName,
            gguid: currentGUID(),
            ids: ids,
            watermark: $dzpz_dy_ds.getString(0, "billno") + "[" + $dzpz_dy_ds.getString(0, "reader") + "]" +
                formatDate(newDate(), "yyyy.MM.dd HH:mm")
        },
            function (ret) {
                ret = JSON.parse(ret);
                hideInfoPane();
                if (ret.success) {
                    let t = window.location.href;
                    let p = t.indexOf("billedit");
                    t = t.substring(0, p);
                    let url = t + ret.url;
                    $.alert(` <a href="${url}" target="_blank">点击下载${fileName}</a>`, `打包完成`);
                } else {
                    toastr.error(ret.message);
                }
            });

    });

}

/**
 * 按钮点击事件
 * 当某个按钮被点击时， 首先触发  {按钮名称}_onClick 事件，然后触发 buttonOnClick事件
 * @param sheet  工作表
 * @param cell   按钮所在的单元格
 * @param button 按钮对象
 */
//@comment (group=按钮点击事件,caption=调取凭证列表,needRightControl=false)
function cb_pzlist_onClick(sheet, cell, button) {
    // if (form.isSaveNeeded()) {
    //     toastr.info("请先保存");
    //     return;
    // }
    book.getWorkSheet("凭证资料查询").float('fa fa-cog', "凭证资料查询",
        {
            my: 'right-center',
            at: 'right-center',
            autoposition: 'down',
            offsetX: -5,
            offsetY: 5
        }, { width: '70%', height: '90%' });
    smartRetrieve(book.getWorkSheet("凭证资料查询"), "q_pzdjex")
}


/**
 * 按钮点击事件
 * 当某个按钮被点击时， 首先触发  {按钮名称}_onClick 事件，然后触发 buttonOnClick事件
 * @param sheet  工作表
 * @param cell   按钮所在的单元格
 * @param button 按钮对象
 */
//@comment (group=按钮点击事件,caption=选入,needRightControl=false)
function cb_import_onClick(sheet, cell, button) {
    book.getWorkSheet("detail").paintPermit = false;
    let row = book.getDataSource("dzpz_dymx").currentBindRow;

    for (var i = 0; i < $q_pzdjex_ds.getRowCount(); i++) {
        if ($q_pzdjex_ds.getString(i, "selected") == '1') {
            if ($dzpz_dymx_ds.getString(row, "pzh") != '' || row < 0) row = $dzpz_dymx_ds.insertRow(row + 1);
            $dzpz_dymx_ds.setValue(row, {
                pzh: $q_pzdjex_ds.getValue(i, "pzh"),
                kmdm: $q_pzdjex_ds.getValue(i, "kmdm"),
                code: $q_pzdjex_ds.getValue(i, "code"),
                memo: $q_pzdjex_ds.getString(i, "bz")
            });
        }
    }
    book.getDataSource("dzpz_dymx").currentBindRow = row;
    book.getWorkSheet("detail").View.insureSelectionOnScreen(null, false);
    do_removeDuplicated(); //删除重复项

    //********删除行号***********************************
    book.getWorkSheet("凭证资料查询").paintPermit = false;
    for (var i = $q_pzdjex_ds.getRowCount() - 1; i >= 0; i--) {
        if ($q_pzdjex_ds.getString(i, "selected") == '1') $q_pzdjex_ds.deleteRow(i);
    }
    book.getWorkSheet("凭证资料查询").paintPermit = true;
    //**************************************************

    book.getWorkSheet("detail").paintPermit = true;
    book.getWorkSheet("main").paintPermit = true;
}

/**
 * 按钮点击事件
 * 当某个按钮被点击时， 首先触发  {按钮名称}_onClick 事件，然后触发 buttonOnClick事件
 * @param sheet  工作表
 * @param cell   按钮所在的单元格
 * @param button 按钮对象
 */
//@comment (group=按钮点击事件,caption=,needRightControl=false)
function cb_opensheet_dr_onClick(sheet, cell, button) {
    book.getWorkSheet("凭证列表").float('fa fa-cog', "导入凭证列表",
        {
            my: 'right-center',
            at: 'right-center',
            autoposition: 'down',
            offsetX: -5,
            offsetY: 5
        }, { width: 400, height: '80%' });

}

/**
 * 按钮点击事件
 * 当某个按钮被点击时， 首先触发  {按钮名称}_onClick 事件，然后触发 buttonOnClick事件
 * @param sheet  工作表
 * @param cell   按钮所在的单元格
 * @param button 按钮对象
 */
//@comment (group=按钮点击事件,caption=粘贴界面导入,needRightControl=false)
function cb_dr_onClick(sheet, cell, button) {

    book.getWorkSheet("detail").paintPermit = false;
    let row = book.getDataSource("dzpz_dymx").currentBindRow;
    let pzlist = sheet.cells('pzlist').getValueString().split('\n');
    for (let i = 0; i < pzlist.length; i++) {
        if (pzlist[i] !== '') {
            if ($dzpz_dymx_ds.getString(row, "pzh") != '' || row < 0) row = $dzpz_dymx_ds.insertRow(row + 1);

            $dzpz_dymx_ds.setValue(row, {
                pzh: pzlist[i]
            });
        }
    }
    sheet.cells('pzlist').setValue(null);
    sheet.floatPanelClose();

    book.getWorkSheet("detail").paintPermit = true;

}
/**
 * 单元格因为被编辑而改变。当用户通过编辑单元的值而让单元格发生值改变时本事件被触发。
 * 注意，当使用脚本 sheet.cells(row,col).setValue ( value) 来改变单元格的值时，本事件并不触发
 * @param sheet
 * @param cell
 * @param newValue
 * @param innerRow   当单元格没有绑定数据库或绑定到单行数据库时，本参数无意义。如果绑定一个
 * 多行数据库，则表示该单元所绑定的字段的第 innerRow行发生变化
 */
function cellValueChangedByEdit(sheet, cell, newValue, innerRow) {

    //通过数据库绑定情况来判断

    //通过别名来判断
    if (sheet.name == 'detail' && cell.alias == 'st_selectAll') {
        let ds = $dzpz_dymx_ds;
        sheet.paintPermit = false;
        for (var i = 0; i < ds.getRowCount(); i++) {
            ds.setValue(i, "selected", newValue);
        }
        sheet.paintPermit = true;
    }
    if (sheet.name == '凭证资料查询' && cell.alias == 'st_selectAll') {
        let ds = $q_pzdjex_ds;
        sheet.paintPermit = false;
        for (var i = 0; i < ds.getRowCount(); i++) {
            ds.setValue(i, "selected", newValue);
        }
        sheet.paintPermit = true;
    }

    let bind = cell.bind;
    if (bind != null && bind.dataSource == 'dzpz_dymx' && bind.DBCol == 'pzh') {
        showInfoPane('*正在分析凭证号');
        setTimeout(function () {
            do_paste_pzlist(innerRow, newValue) //写入凭证号
        }, 100);
    }
    if (bind != null && bind.dataSource == 'dzpz_dy' && bind.DBCol == 'reader') {
        $dzpz_dy_ds.setValue(0, {
            watermark: '【' + $dzpz_dy_ds.getString(0, "reader") + '】仅用于项目专项审计或检查'
        })
    }



}

/**
 * 单元格编辑时粘贴内容后触发此事件。
 * @param sheet
 * @param cell
 * @param innerRow   当单元格没有绑定数据库或绑定到单行数据库时，本参数无意义。如果绑定一个
 * 多行数据库，则表示该单元所绑定的字段的第 innerRow行被粘贴了内容
 * @param text 当前单元格编辑框中的内容，并不一定是粘贴的内容，是单元格编辑框中原有的内容加上粘贴的内容
 */
//@comment (group=单元格事件,caption=单元格粘贴内容)
function cellOnPaste(sheet, cell, innerRow, text) {

    //通过别名来判断
    if (cell.alias == 'XXX') {

    }

    //通过数据库绑定情况来判断
    let bind = cell.bind;
    if (bind != null && bind.dataSource == 'dzpz_dymx' && bind.DBCol == 'pzh') {
        sheet.View.forceCurrentEditControlGiveUpFocus();
    }

}


/**
 * 按钮点击事件
 * 当某个按钮被点击时， 首先触发  {按钮名称}_onClick 事件，然后触发 buttonOnClick事件
 * @param sheet  工作表
 * @param cell   按钮所在的单元格
 * @param button 按钮对象
 */
//@comment (group=do,caption=凭证列表粘贴凭证清单后自动后插并赋值,needRightControl=false)
function do_paste_pzlist(innerRow, newValue) {

    if (newValue == null || newValue == '') return;
    let data = newValue.split(' ');
    book.getWorkSheet("detail").paintPermit = false;
    let row = innerRow;
    for (let i = 0; i < data.length; i++) {
        //row = $dzpz_dymx_ds.insertRow(row + 1);
        if (data[i] != '') {
            $dzpz_dymx_ds.setValue(row, {
                pzh: data[i],
                selected: 1
            });
            if (i < data.length - 1) row = $dzpz_dymx_ds.insertRow(row + 1);
        }
    }
    book.getDataSource("dzpz_dymx").currentBindRow = row;
    book.getWorkSheet("detail").View.insureSelectionOnScreen(null, false);
    do_removeDuplicated(); //删除重复项
    book.getWorkSheet("detail").paintPermit = true;
    book.getWorkSheet("main").paintPermit = true;
    hideInfoPane();
}







//@comment (group=,caption=异步打包,needRightControl=false)
function async_package() {

    if (form.isSaveNeeded()) {
        toastr.info("请先保存");
        return;
    }

    let ids = [];
    for (let i = 0; i < $dzpz_dymx_ds.rowCount; i++) {
        if ($dzpz_dymx_ds.getString(i, "pz_id") == '') {
            toastr.error("第" + (i + 1) + "行的凭证号不存在，请核对");
            return;
        }
        ids.push($dzpz_dymx_ds.getString(i, "pz_id"));
    }

    if (ids.length == 0) {
        toastr.info("没有凭证清单");
        return;
    }

    $confirm('', '确信要重新打包吗?', function () {
        showInfoPane("*正在后台打包...");
        let fileName = $dzpz_dy_ds.getString(0, "reader") +
            formatDate(newDate(), "yyyy.MM.dd HH:mm") + "调阅凭证.zip";
        runTask("后台打包", {
            gguid: currentGUID(),
            fileName: fileName,
            ids: ids,
            watermark: $dzpz_dy_ds.getInt(0, "needwatermark") == 0 ? "" : ($dzpz_dy_ds.getString(0, "reader") + "/" + formatDate($dzpz_dy_ds.getValue(0, "billdate"), "yyyy.MM.dd HH:mm") + "\n" + $dzpz_dy_ds.getString(0, "watermark")),
            mergePDF: $dzpz_dy_ds.getString(0, "filetype") == 'pdf' //是否合并成一个pdf文件
        },
            function (ret) {
                ret = JSON.parse(ret);
                hideInfoPane();
                if (ret.success) {
                    $dzpz_dy_ds.setValue(0, "ziptaskid", ret.zipTaskId);
                    form.save(false);
                    hideInfoPane();

                } else {
                    toastr.error(ret.message);
                }
            });

    });


}

//@comment (group=按钮点击事件,caption=标记重复,needRightControl=false)
function cb_qc_onClick() {
    showInfoPane("*正在检测重复的凭证");
    var map = {};
    for (var i = 0; i < $dzpz_dymx_ds.rowCount; i++) {
        var pzh = $dzpz_dymx_ds.getString(i, "pzh");
        if (pzh == '') continue;
        if (map[pzh] == undefined) map[pzh] = []; //每个凭证号映射到一个数组，记录它所在的行号
        map[pzh].push(i); // 记录下凭证号对应的行号

    }

    book.getWorkSheet('detail').paintPermit = false;
    for (pzh in map) {
        var rows = map[pzh];
        $dzpz_dymx_ds.setValue(rows[0], "bz", "");
        for (var i = 1; i < rows.length; i++) {
            $dzpz_dymx_ds.setValue(rows[i], "bz", "与第" + (rows[0] + 1) + "行重复");
        }
    }
    book.getWorkSheet('detail').paintPermit = true;
    hideInfoPane();
}

//@comment (group=按钮点击事件,caption=删除重复的,needRightControl=false)
function cb_removeDuplicated_onClick() {

    $confirm('', '确信要清除重复的凭证号吗?', function () {

        do_removeDuplicated()

    });

}


//@comment (group=do,caption=执行删除重复的,needRightControl=false)
function do_removeDuplicated() {

    showInfoPane("*正在删除重复的凭证");
    book.getWorkSheet('detail').paintPermit = false;
    var pzhs = []; //凭证号清单
    var rows = [];// 需要删除的行号
    for (var i = 0; i < $dzpz_dymx_ds.rowCount; i++) {
        var pzh = $dzpz_dymx_ds.getString(i, "pzh");
        if (pzhs.contains(pzh)) //此凭证号此前已经出现过
        {
            rows.push(i);//  需要删除
        } else {
            pzhs.push(pzh); //没有出现过，那么加它到凭证号清单中
        }
    }
    //现在反着删除
    for (var i = rows.length - 1; i >= 0; i--) {
        $dzpz_dymx_ds.deleteRow(rows[i]);
    }
    //form.save(false);
    book.getWorkSheet('detail').paintPermit = false;
    hideInfoPane();
}



/**
 * 按钮点击事件
 * 当某个按钮被点击时， 首先触发  {按钮名称}_onClick 事件，然后触发 buttonOnClick事件
 * @param sheet  工作表
 * @param cell   按钮所在的单元格
 * @param button 按钮对象
 */
//@comment (group=按钮点击事件,caption=批量删除已选中记录,needRightControl=false)
function cb_selectedRow_delete_onClick(sheet, cell, button) {
    $confirm("提示", "确定要删除选中的记录吗?", function () {
        book.getWorkSheet('detail').paintPermit = false;
        for (let i = $dzpz_dymx_ds.getRowCount() - 1; i >= 0; i--) {
            if ($dzpz_dymx_ds.getInt(i, "selected") == 1) $dzpz_dymx_ds.deleteRow(i);
        }
        if ($dzpz_dymx_ds.getRowCount() == 0) $dzpz_dymx_ds.insertRow(0);
        book.getWorkSheet('detail').cells("st_selectAll").setValue(0);
        book.getWorkSheet('detail').paintPermit = true;
    }, function () { });



}

function copyURL(url) {

    let s = getServiceHomeURL('app') + url;
    let d = book.sheet3.cells("days").getValueInt();
    let t = book.sheet3.cells("times").getValueInt();
    s = back_urlShare(s, d, t);
    $setClipboard(s);
    toastr.info("分享地址已经复制到剪贴板");
}


id: 64db211b8b101d5b59c64826
scriptid: 60fa600f9932563b7c99baff
tablename: app_script
clientip: 0:0:0:0:0:0:0:1
username: sa
createdate: 2023.08.15 15:20:19.000
script:
/**
 * 单据点击保存，前端所有的操作被转译成3种操作:insert , delete , update ,
 *  并且可以在  beforeBillSaveOnServer 中返回一些SQL语句，可以在afterBillSaveOnServer中返回一些SQL语句
 *
 * 系统分别在需要的数据库连接中执行这些语句 ， 当所有语句执行成功后，事件被提交。一些细节如下 ：
 *
 * 1 如果单据中的表，属于不同的数据库连接，那么所有的SQL语句会以连接为单位，对语句进行批量执行
 * 2 这些语句的执行顺序是：对同一个数据库连接中的语句， 先执行 beforeBillSaveOnServer 中返回的SQL语句，再执行单据操作转译得到的SQL语句，
 *   再执行 afterBillSaveOnServer 中返回的SQL语句， 当多个（或一个）数据库连接执行完这些语句，且没有错误时，所有的数据库连接做提交，否则全部回滚
 * 3 不要在 beforeBillSaveOnServer 或 afterBillSaveOnServer 中直接执行数据库操作，而是返回SQL语句，让系统批量执行它们，并控制好事务
 * 4 当执行成功后，系统再执行事件函数  afterBillSaveSuccessfulOnServer 。 此事件中可以执行任意操作，它与单据保存事件结束后才被触发执行，
 *   与单据保存并不在一个事务中。
 *
 *
 * @param gguid  要删除记录的gguid ，等同于主表的id
 * @param session  一个JSON对象，用于在整个单据保存过程中的各个事件之间传递数据。本事件做为单据保存的最后一个事件，session对象在使用后将被丢弃
 *
 *
 * @return 本函数不需要返回值
 *
 */
function afterBillSaveSuccessfulOnServer(gguid, session) {

    var corpid = getStringFromSQL("select corpid from dzpz_dy where id='" + gguid + "'");
    //2022.08.11优化，理论上不应该存在重复号码的凭证，但是加上max肯定没错，避免数据异常导致更新失败
    var sqls = ["update dzpz_dymx  set bz=null,pz_id= (select max(id) from dzpz_pz where dzpz_pz.pzh= dzpz_dymx.pzh and dzpz_pz.corpid='" + corpid + "' ) where gguid='" + gguid + "' ",
    "update dzpz_dymx  set bz='凭证号不存在' where  gguid='" + gguid + "' and not exists (select dzpz_pz.id from dzpz_pz where  dzpz_pz.pzh= dzpz_dymx.pzh  and dzpz_pz.corpid='" + corpid + "')  "

    ];

    runSQL("", sqls, true);
    println("----检测凭证是否存在完成---------")
}


/**
 * 用户任务提交后
 * @param flow 流程定义
 * @param node 开始节点
 * @param gguid 单据的gguid

 */

//@comment (group=工作流事件,caption=用户任务提交后)
function onUserTaskSubmitted(flow, userTask, gguid) {
    // println( flow.id) ; //流程定义的ID
    // println( userTask.name);
    println(JSON.stringify(userTask));
    println(gguid);
    if (userTask.id == 'id_60b3b08f27644fc18af35ba20ecd2bac') {
        var ds = newDataStore("", "select * from dzpz_dy where id='" + gguid + "'");
        ds.retrieve();

        if (ds.getInt(0, 'pass') == 0) {
            //递交结束
            while (true) {
                var t = taskInfoForWork('dy', gguid);
                if (t.taskList.length == 0) break;
                //将任务递交下去，如果任务需要签收，则先签收     
                for (var i = 0; i < t.taskList.length; i++) {
                    var task = t.taskList[i];

                    //可以递交，那么递交下去
                    if (task.canSubmit) println(submitWork('dy', gguid, task.taskId));
                    //需要先签收 ，那么以第一个候选人签收它
                    if (task.canClaim) claimWork('dy', gguid, task.taskId, task.candidateUserList[0].userId);

                }


            }
        }

        var moreData = ds.getString(0, "moredata");
        try {
            moreData = JSON.parse(moreData);
            //起草后，递交后调用OA的接口回写数据
            if (moreData.form_id) {
                var pass = ds.getInt(0, "pass");
                var reason = ds.getString(0, "rejectreason");
                runTask('oa_callback', { requestid: moreData.form_id, pass: pass, reason: reason });
            }
        } catch (err) {

        }

    }

    if (userTask.id == 'id_6655df8bedc641aa9bacf1720d13ce2d') //领导审批通过后，就开始打包
    {
        //领导审批通过后，就开始打包
        //2023.07.13 不要自动打包，等oa调用接口在打包，不然，oa没有通知就打包并发送邮件就不对了
        //   do_package(gguid);
    }

    println(gguid + " " + userTask.name + " 提交完成")


}

//后台打包
function do_package(gguid) {
    if (getIntFromSQL("select pass from dzpz_dy where id='" + gguid + "' ") == 0) return { success: false, message: "调阅被拒绝，禁止下载" }
    var ret = JSON.parse(runTask("package", { gguid: gguid }));
    return ret;
}



function back_urlShare(url, d, t) {
    var ret = urlShare(url, d, "day", t);
    return ret.url;
}


id: 64db254a9932a9c0fc2540c5
scriptid: 60fa600f9932563b7c99baff
tablename: app_script
clientip: 101.69.67.59
username: sa
createdate: 2023.08.15 15:13:57.000
script:
/**
 * 单据点击保存，前端所有的操作被转译成3种操作:insert , delete , update ,
 *  并且可以在  beforeBillSaveOnServer 中返回一些SQL语句，可以在afterBillSaveOnServer中返回一些SQL语句
 *
 * 系统分别在需要的数据库连接中执行这些语句 ， 当所有语句执行成功后，事件被提交。一些细节如下 ：
 *
 * 1 如果单据中的表，属于不同的数据库连接，那么所有的SQL语句会以连接为单位，对语句进行批量执行
 * 2 这些语句的执行顺序是：对同一个数据库连接中的语句， 先执行 beforeBillSaveOnServer 中返回的SQL语句，再执行单据操作转译得到的SQL语句，
 *   再执行 afterBillSaveOnServer 中返回的SQL语句， 当多个（或一个）数据库连接执行完这些语句，且没有错误时，所有的数据库连接做提交，否则全部回滚
 * 3 不要在 beforeBillSaveOnServer 或 afterBillSaveOnServer 中直接执行数据库操作，而是返回SQL语句，让系统批量执行它们，并控制好事务
 * 4 当执行成功后，系统再执行事件函数  afterBillSaveSuccessfulOnServer 。 此事件中可以执行任意操作，它与单据保存事件结束后才被触发执行，
 *   与单据保存并不在一个事务中。
 *
 *
 * @param gguid  要删除记录的gguid ，等同于主表的id
 * @param session  一个JSON对象，用于在整个单据保存过程中的各个事件之间传递数据。本事件做为单据保存的最后一个事件，session对象在使用后将被丢弃
 *
 *
 * @return 本函数不需要返回值
 *
 */
function afterBillSaveSuccessfulOnServer(gguid, session) {

    var corpid = getStringFromSQL("select corpid from dzpz_dy where id='" + gguid + "'");
    //2022.08.11优化，理论上不应该存在重复号码的凭证，但是加上max肯定没错，避免数据异常导致更新失败
    var sqls = ["update dzpz_dymx  set bz=null,pz_id= (select max(id) from dzpz_pz where dzpz_pz.pzh= dzpz_dymx.pzh and dzpz_pz.corpid='" + corpid + "' ) where gguid='" + gguid + "' ",
    "update dzpz_dymx  set bz='凭证号不存在' where  gguid='" + gguid + "' and not exists (select dzpz_pz.id from dzpz_pz where  dzpz_pz.pzh= dzpz_dymx.pzh  and dzpz_pz.corpid='" + corpid + "')  "

    ];

    runSQL("", sqls, true);
    println("----检测凭证是否存在完成---------")
}


/**
 * 用户任务提交后
 * @param flow 流程定义
 * @param node 开始节点
 * @param gguid 单据的gguid

 */
//@comment (group=工作流事件,caption=用户任务提交后)
function onUserTaskSubmitted(flow, userTask, gguid) {
    // println( flow.id) ; //流程定义的ID
    // println( userTask.name);
    println(JSON.stringify(userTask));
    println(gguid);


    if (userTask.id == 'id_60b3b08f27644fc18af35ba20ecd2bac') {

        if (getIntFromSQL("select pass  from  dzpz_dy where id='" + gguid + "'")  == 0) {
            //递交结束
            while (true) {
                var t = taskInfoForWork('dy', gguid);
                if (t.taskList.length == 0) break;
                //将任务递交下去，如果任务需要签收，则先签收     
                for (var i = 0; i < t.taskList.length; i++) {
                    var task = t.taskList[i];

                    //可以递交，那么递交下去
                    if (task.canSubmit) println(submitWork(moduleid, gguid, task.taskId));
                    //需要先签收 ，那么以第一个候选人签收它
                    if (task.canClaim) claimWork(moduleid, gguid, task.taskId, task.candidateUserList[0].userId);

                }
                

            }
        }

        var moreData = getStringFromSQL("select moredata from dzpz_dy where id='" + gguid + "'");
        try {
            moreData = JSON.parse(moreData);
            //起草后，递交后调用OA的接口回写数据
            if (moreData.form_id) {
                runTask('oa_callback', { requestid: moreData.form_id });
            }
        } catch (err) {

        }

    }


    if (userTask.id == 'id_6655df8bedc641aa9bacf1720d13ce2d') //领导审批通过后，就开始打包
    {
        //领导审批通过后，就开始打包 
        //2023.07 取消了，因为出现一个需求，需要第三方审批通过后，再打包，所以自动打印取消了
        // do_package(gguid);
    }

    println(gguid + " " + userTask.name + " 提交完成")


}

//后台打包
function do_package(gguid) {
    var ret = JSON.parse(runTask("package", { gguid: gguid }));
    return ret;
}



function back_urlShare(url, d, t) {
    var ret = urlShare(url, d, "day", t);
    return ret.url;
}


id: 64db254a9932a9c0fc2540d8
scriptid: 60fa600f9932563b7c99baff
tablename: app_script
clientip: 101.69.67.59
username: sa
createdate: 2023.08.15 15:17:34.000
script:
/**
 * 单据点击保存，前端所有的操作被转译成3种操作:insert , delete , update ,
 *  并且可以在  beforeBillSaveOnServer 中返回一些SQL语句，可以在afterBillSaveOnServer中返回一些SQL语句
 *
 * 系统分别在需要的数据库连接中执行这些语句 ， 当所有语句执行成功后，事件被提交。一些细节如下 ：
 *
 * 1 如果单据中的表，属于不同的数据库连接，那么所有的SQL语句会以连接为单位，对语句进行批量执行
 * 2 这些语句的执行顺序是：对同一个数据库连接中的语句， 先执行 beforeBillSaveOnServer 中返回的SQL语句，再执行单据操作转译得到的SQL语句，
 *   再执行 afterBillSaveOnServer 中返回的SQL语句， 当多个（或一个）数据库连接执行完这些语句，且没有错误时，所有的数据库连接做提交，否则全部回滚
 * 3 不要在 beforeBillSaveOnServer 或 afterBillSaveOnServer 中直接执行数据库操作，而是返回SQL语句，让系统批量执行它们，并控制好事务
 * 4 当执行成功后，系统再执行事件函数  afterBillSaveSuccessfulOnServer 。 此事件中可以执行任意操作，它与单据保存事件结束后才被触发执行，
 *   与单据保存并不在一个事务中。
 *
 *
 * @param gguid  要删除记录的gguid ，等同于主表的id
 * @param session  一个JSON对象，用于在整个单据保存过程中的各个事件之间传递数据。本事件做为单据保存的最后一个事件，session对象在使用后将被丢弃
 *
 *
 * @return 本函数不需要返回值
 *
 */
function afterBillSaveSuccessfulOnServer(gguid, session) {

    var corpid = getStringFromSQL("select corpid from dzpz_dy where id='" + gguid + "'");
    //2022.08.11优化，理论上不应该存在重复号码的凭证，但是加上max肯定没错，避免数据异常导致更新失败
    var sqls = ["update dzpz_dymx  set bz=null,pz_id= (select max(id) from dzpz_pz where dzpz_pz.pzh= dzpz_dymx.pzh and dzpz_pz.corpid='" + corpid + "' ) where gguid='" + gguid + "' ",
    "update dzpz_dymx  set bz='凭证号不存在' where  gguid='" + gguid + "' and not exists (select dzpz_pz.id from dzpz_pz where  dzpz_pz.pzh= dzpz_dymx.pzh  and dzpz_pz.corpid='" + corpid + "')  "

    ];

    runSQL("", sqls, true);
    println("----检测凭证是否存在完成---------")
}


/**
 * 用户任务提交后
 * @param flow 流程定义
 * @param node 开始节点
 * @param gguid 单据的gguid

 */
//@comment (group=工作流事件,caption=用户任务提交后)
function onUserTaskSubmitted(flow, userTask, gguid) {
    // println( flow.id) ; //流程定义的ID
    // println( userTask.name);
    println(JSON.stringify(userTask));
    println(gguid);


    if (userTask.id == 'id_60b3b08f27644fc18af35ba20ecd2bac') {

        if (getIntFromSQL("select pass  from  dzpz_dy where id='" + gguid + "'")  == 0) {
            //递交结束
            while (true) {
                var t = taskInfoForWork('dy', gguid);
                if (t.taskList.length == 0) break;
                //将任务递交下去，如果任务需要签收，则先签收     
                for (var i = 0; i < t.taskList.length; i++) {
                    var task = t.taskList[i];

                    //可以递交，那么递交下去
                    if (task.canSubmit) println(submitWork('dy', gguid, task.taskId));
                    //需要先签收 ，那么以第一个候选人签收它
                    if (task.canClaim) claimWork('dy', gguid, task.taskId, task.candidateUserList[0].userId);

                }
                

            }
        }

        var moreData = getStringFromSQL("select moredata from dzpz_dy where id='" + gguid + "'");
        try {
            moreData = JSON.parse(moreData);
            //起草后，递交后调用OA的接口回写数据
            if (moreData.form_id) {
                runTask('oa_callback', { requestid: moreData.form_id });
            }
        } catch (err) {

        }

    }


    if (userTask.id == 'id_6655df8bedc641aa9bacf1720d13ce2d') //领导审批通过后，就开始打包
    {
        //领导审批通过后，就开始打包 
        //2023.07 取消了，因为出现一个需求，需要第三方审批通过后，再打包，所以自动打印取消了
        // do_package(gguid);
    }

    println(gguid + " " + userTask.name + " 提交完成")


}

//后台打包
function do_package(gguid) {
    var ret = JSON.parse(runTask("package", { gguid: gguid }));
    return ret;
}



function back_urlShare(url, d, t) {
    var ret = urlShare(url, d, "day", t);
    return ret.url;
}


id: 64db31709932a9c0fc25425c
scriptid: 60fa600f9932563b7c99baff
tablename: app_script
clientip: 101.69.67.59
username: sa
createdate: 2023.08.15 16:05:23.000
script:
/**
 * 单据点击保存，前端所有的操作被转译成3种操作:insert , delete , update ,
 *  并且可以在  beforeBillSaveOnServer 中返回一些SQL语句，可以在afterBillSaveOnServer中返回一些SQL语句
 *
 * 系统分别在需要的数据库连接中执行这些语句 ， 当所有语句执行成功后，事件被提交。一些细节如下 ：
 *
 * 1 如果单据中的表，属于不同的数据库连接，那么所有的SQL语句会以连接为单位，对语句进行批量执行
 * 2 这些语句的执行顺序是：对同一个数据库连接中的语句， 先执行 beforeBillSaveOnServer 中返回的SQL语句，再执行单据操作转译得到的SQL语句，
 *   再执行 afterBillSaveOnServer 中返回的SQL语句， 当多个（或一个）数据库连接执行完这些语句，且没有错误时，所有的数据库连接做提交，否则全部回滚
 * 3 不要在 beforeBillSaveOnServer 或 afterBillSaveOnServer 中直接执行数据库操作，而是返回SQL语句，让系统批量执行它们，并控制好事务
 * 4 当执行成功后，系统再执行事件函数  afterBillSaveSuccessfulOnServer 。 此事件中可以执行任意操作，它与单据保存事件结束后才被触发执行，
 *   与单据保存并不在一个事务中。
 *
 *
 * @param gguid  要删除记录的gguid ，等同于主表的id
 * @param session  一个JSON对象，用于在整个单据保存过程中的各个事件之间传递数据。本事件做为单据保存的最后一个事件，session对象在使用后将被丢弃
 *
 *
 * @return 本函数不需要返回值
 *
 */
function afterBillSaveSuccessfulOnServer(gguid, session) {

    var corpid = getStringFromSQL("select corpid from dzpz_dy where id='" + gguid + "'");
    //2022.08.11优化，理论上不应该存在重复号码的凭证，但是加上max肯定没错，避免数据异常导致更新失败
    var sqls = ["update dzpz_dymx  set bz=null,pz_id= (select max(id) from dzpz_pz where dzpz_pz.pzh= dzpz_dymx.pzh and dzpz_pz.corpid='" + corpid + "' ) where gguid='" + gguid + "' ",
    "update dzpz_dymx  set bz='凭证号不存在' where  gguid='" + gguid + "' and not exists (select dzpz_pz.id from dzpz_pz where  dzpz_pz.pzh= dzpz_dymx.pzh  and dzpz_pz.corpid='" + corpid + "')  "

    ];

    runSQL("", sqls, true);
    println("----检测凭证是否存在完成---------")
}


/**
 * 用户任务提交后
 * @param flow 流程定义
 * @param node 开始节点
 * @param gguid 单据的gguid

 */

//@comment (group=工作流事件,caption=用户任务提交后)
function onUserTaskSubmitted(flow, userTask, gguid) {
    // println( flow.id) ; //流程定义的ID
    // println( userTask.name);
    println(JSON.stringify(userTask));
    println(gguid);
    if (userTask.id == 'id_60b3b08f27644fc18af35ba20ecd2bac') {
        var ds = newDataStore("", "select * from dzpz_dy where id='" + gguid + "'");
        ds.retrieve();

        if (ds.getInt(0, 'pass') == 0) { //如果不同意调阅，则自动递交到结束
            //递交结束
            while (true) {
                var t = taskInfoForWork('dy', gguid);
                if (t.taskList.length == 0) break;
                //将任务递交下去，如果任务需要签收，则先签收     
                for (var i = 0; i < t.taskList.length; i++) {
                    var task = t.taskList[i];

                    //可以递交，那么递交下去
                    if (task.canSubmit) println(submitWork('dy', gguid, task.taskId));
                    //需要先签收 ，那么以第一个候选人签收它
                    if (task.canClaim) claimWork('dy', gguid, task.taskId, task.candidateUserList[0].userId);

                }


            }
        }

        var moreData = ds.getString(0, "moredata");
        try {
            moreData = JSON.parse(moreData);
            //起草后，递交后调用OA的接口回写数据
            if (moreData.form_id) {
                var pass = ds.getInt(0, "pass");
                var reason = ds.getString(0, "rejectreason");
                runTask('oa_callback', { requestid: moreData.form_id, pass: pass, reason: reason });
            }
        } catch (err) {

        }

    }

    if (userTask.id == 'id_6655df8bedc641aa9bacf1720d13ce2d') //领导审批通过后，就开始打包
    {
        //领导审批通过后，就开始打包
        //2023.07.13 不要自动打包，等oa调用接口在打包，不然，oa没有通知就打包并发送邮件就不对了
        //   do_package(gguid);
    }

    println(gguid + " " + userTask.name + " 提交完成")


}

//后台打包
function do_package(gguid) {
    if (getIntFromSQL("select pass from dzpz_dy where id='" + gguid + "' ") == 0) return { success: false, message: "调阅被拒绝，禁止下载" }
    var ret = JSON.parse(runTask("package", { gguid: gguid }));
    return ret;
}



function back_urlShare(url, d, t) {
    var ret = urlShare(url, d, "day", t);
    return ret.url;
}


id: 64f5886899328fedff34a0a6
scriptid: 649bccb89932ee4d0f7f5577
tablename: app_script
clientip: 39.170.92.207
username: sa
createdate: 2023.09.04 15:58:16.000
script:
//后台打包
function main( arg) {
    var param=  JSON.parse(arg);
    var gguid= param.gguid; 
    

    var ids = [];
    //2022.08.11 优化， 有可能存在重复的，所能加上 distinct 去重
    var $dzpz_dymx_ds = newDataStore("", "select  pz_id ,pzh , max(filenameprefix) as filenameprefix from  dzpz_dymx where gguid='" + gguid + "' group by pz_id, pzh  order by pzh  ");
    $dzpz_dymx_ds.retrieve();
    println($dzpz_dymx_ds.getSelectLastRetrieved());

    for (var i = 0; i < $dzpz_dymx_ds.getRowCount(); i++) {
        var pz_id = '' + $dzpz_dymx_ds.getString(i, "pz_id");
        var filenameprefix = $dzpz_dymx_ds.getString(i, "filenameprefix");
        if (pz_id == '') continue;
        if (ids.contains(pz_id)) continue;
        ids.push({ id:pz_id , filenameprefix: filenameprefix} );
    }

    if (ids.length == 0) {
        println("没有凭证清单");
        return {success:false, message:"没有凭证清单"};
    }

    println(ids.length + "张凭证需要打包");

    var $dzpz_dy_ds = newDataStore("", "select * from  dzpz_dy where gguid='" + gguid + "'");
    $dzpz_dy_ds.setUpdateProperty("dzpz_dy", "id", "*", "id");
    $dzpz_dy_ds.retrieve();

    var fileName = $dzpz_dy_ds.getString(0, "reader") + formatDate(newDate(), "yyyy.MM.dd") + "因"+$dzpz_dy_ds.getString(0, "summary") + "调阅凭证.zip";

    var ret = runTask("后台打包", {
        gguid: gguid,
        fileName: fileName,
        ids: ids,
        watermark: $dzpz_dy_ds.getInt(0, "needwatermark") == 0 ? "" : (formatDate($dzpz_dy_ds.getValue(0, "billdate"), "yyyy.MM.dd HH:mm") + "\n" + $dzpz_dy_ds.getString(0, "watermark")+"        "),
        mergePDF: $dzpz_dy_ds.getString(0, "filetype") == 'pdf' //是否合并成一个pdf文件

    });

    println(ret);
    ret = JSON.parse(ret);

    if (ret.success) {
        $dzpz_dy_ds.setValue(0, "ziptaskid", ret.zipTaskId);
        $dzpz_dy_ds.update(true);
    }
    return ret;
}


id: 64f58ea599328fedff34a0af
scriptid: 649bccb89932ee4d0f7f5577
tablename: app_script
clientip: 39.170.92.207
username: sa
createdate: 2023.09.04 16:00:37.000
script:
//后台打包
function main( arg) {
    var param=  JSON.parse(arg);
    var gguid= param.gguid; 
    

    var ids = [];
    //2022.08.11 优化， 有可能存在重复的，所能加上 distinct 去重
    var $dzpz_dymx_ds = newDataStore("", "select  pz_id ,pzh , max(filenameprefix) as filenameprefix from  dzpz_dymx where gguid='" + gguid + "' group by pz_id, pzh  order by pzh  ");
    $dzpz_dymx_ds.retrieve();
    println($dzpz_dymx_ds.getSelectLastRetrieved());

    for (var i = 0; i < $dzpz_dymx_ds.getRowCount(); i++) {
        var pz_id = '' + $dzpz_dymx_ds.getString(i, "pz_id");
        var filenameprefix = $dzpz_dymx_ds.getString(i, "filenameprefix");
        if (pz_id == '') continue;
        if (ids.contains(pz_id)) continue;
        ids.push({ id:pz_id , filenameprefix: filenameprefix} );
    }

    if (ids.length == 0) {
        println("没有凭证清单");
        return {success:false, message:"没有凭证清单"};
    }

    println(ids.length + "张凭证需要打包");

    var $dzpz_dy_ds = newDataStore("", "select * from  dzpz_dy where gguid='" + gguid + "'");
    $dzpz_dy_ds.setUpdateProperty("dzpz_dy", "id", "*", "id");
    $dzpz_dy_ds.retrieve();

    var fileName = $dzpz_dy_ds.getString(0, "reader") + formatDate(newDate(), "yyyy.MM.dd") + "因"+$dzpz_dy_ds.getString(0, "summary") + "调阅凭证.zip";

    var ret = runTask("后台打包", {
        gguid: gguid,
        fileName: fileName,
        ids: ids,
        watermark: $dzpz_dy_ds.getInt(0, "needwatermark") == 0 ? "" : (formatDate($dzpz_dy_ds.getValue(0, "billdate"), "yyyy.MM.dd HH:mm") + "\n" + $dzpz_dy_ds.getString(0, "watermark")+"                    "),
        mergePDF: $dzpz_dy_ds.getString(0, "filetype") == 'pdf' //是否合并成一个pdf文件

    });

    println(ret);
    ret = JSON.parse(ret);

    if (ret.success) {
        $dzpz_dy_ds.setValue(0, "ziptaskid", ret.zipTaskId);
        $dzpz_dy_ds.update(true);
    }
    return ret;
}


id: 6503be1e99328fedff34a204
scriptid: 60fa608c9932563b7c99bba9
tablename: app_template
clientip: 39.170.92.207
username: sa
createdate: 2023.09.15 10:21:55.000
script:
/**
 * 当对某笔单据数据做修改后，列表模板中需要刷新这笔单据的数据，当是修改数据时，
 * 列表中的被修改的行单独执行刷新检索操作。如果是新增单据保存，列表则追加检索出这新增的单据
 *
 *  注意：本函数仅在单据列表模板中使用，当编辑界面保存数据后，触发本事件
 * @param id  需要刷新检索的数据的ID
 * @param row   刷新检索的数据在列表中的行号
 * @param append  true表示是追加检索， false表示是刷新检索
 *
 *
 * @returns {void} 无需返回值
 */
function refreshRetrieveEnd( id ,row , append) {
   //alert( id+  "    "+ row+"    "+  append); 

}


function cellValueChangedByEdit(sheet, cell, newValue, innerRow) {

    //通过别名来判断
    if (cell.alias == 'selectAll') {
        for (var i = 0; i < $dzpz_dy_ds.getRowCount(); i++) {
            $dzpz_dy_ds.setValue(i, { selected: newValue });
        }
    }
}


id: 6503be1e99328fedff34a20c
scriptid: 60fa608c9932563b7c99bba9
tablename: app_template
clientip: 39.170.92.207
username: sa
createdate: 2023.09.15 10:22:26.000
script:
/**
 * 当对某笔单据数据做修改后，列表模板中需要刷新这笔单据的数据，当是修改数据时，
 * 列表中的被修改的行单独执行刷新检索操作。如果是新增单据保存，列表则追加检索出这新增的单据
 *
 *  注意：本函数仅在单据列表模板中使用，当编辑界面保存数据后，触发本事件
 * @param id  需要刷新检索的数据的ID
 * @param row   刷新检索的数据在列表中的行号
 * @param append  true表示是追加检索， false表示是刷新检索
 *
 *
 * @returns {void} 无需返回值
 */
function refreshRetrieveEnd( id ,row , append) {
   //alert( id+  "    "+ row+"    "+  append); 

}


function cellValueChangedByEdit(sheet, cell, newValue, innerRow) {

    //通过别名来判断
    if (cell.alias == 'selectall') {
        for (var i = 0; i < $dzpz_dy_ds.getRowCount(); i++) {
            $dzpz_dy_ds.setValue(i, { selected: newValue });
        }
    }
}


id: 6503be1e99328fedff34a214
scriptid: 60fa608c9932563b7c99bba9
tablename: app_template
clientip: 39.170.92.207
username: sa
createdate: 2023.09.15 10:26:51.000
script:
function formOpen() {
    $('#toolbar_billnew').after(`
<li id="toolbar_tongbu" class=" hiddenToolbar authorization tongbu " style="">
<a href=" " onclick="this.blur();cb_over_onClick();">
<i class="fa fa-star-o fa-fw"></i>&nbsp;<span class="caption">批量结束</span>
</a >
</li>
`);

}



function refreshRetrieveEnd(id, row, append) {
    //alert( id+  "    "+ row+"    "+  append); 

}


function cellValueChangedByEdit(sheet, cell, newValue, innerRow) {

    //通过别名来判断
    if (cell.alias == 'selectall') {
        for (var i = 0; i < $dzpz_dy_ds.getRowCount(); i++) {
            $dzpz_dy_ds.setValue(i, { selected: newValue });
        }
    }
}


function cb_over_onClick() {
    $confirm("提示", "确信要把选中的流程批量结束吗?", function () {
        let ds = $dzpz_dy_ds;
        for (var i = 0; i < ds.getRowCount(); i++) {
            if (ds.getInt(i, "selected") == 0) continue;
            back_flow_over(ds.getString(i, "id"));
            ds.setValue(i, "flow_instance_status", "已结束");
        }
    });


}


id: 6503c1aa99328fedff34a240
scriptid: 60fa608c9932563b7c99bba9
tablename: app_template
clientip: 39.170.92.207
username: sa
createdate: 2023.09.15 10:30:02.000
script:
function formOpen() {
    $('#mainToolBar').append(`
<li id="toolbar_tongbu" class=" hiddenToolbar authorization tongbu " style="">
<a href=" " onclick="this.blur();cb_over_onClick();">
<i class="fa fa-star-o fa-fw"></i>&nbsp;<span class="caption">批量结束</span>
</a >
</li>
`);

}



function refreshRetrieveEnd(id, row, append) {
    //alert( id+  "    "+ row+"    "+  append); 

}


function cellValueChangedByEdit(sheet, cell, newValue, innerRow) {

    //通过别名来判断
    if (cell.alias == 'selectall') {
        for (var i = 0; i < $dzpz_dy_ds.getRowCount(); i++) {
            $dzpz_dy_ds.setValue(i, { selected: newValue });
        }
    }
}


function cb_over_onClick() {
    $confirm("提示", "确信要把选中的流程批量结束吗?", function () {
        let ds = $dzpz_dy_ds;
        for (var i = 0; i < ds.getRowCount(); i++) {
            if (ds.getInt(i, "selected") == 0) continue;
            back_flow_over(ds.getString(i, "id"));
            ds.setValue(i, "flow_instance_status", "已结束");
        }
    });


}


id: 6503c1aa99328fedff34a24a
scriptid: 60fa608c9932563b7c99bba9
tablename: app_template
clientip: 39.170.92.207
username: sa
createdate: 2023.09.15 10:31:01.000
script:
function formOpen() {
    $('#mainToolBar').append(`
<li id="toolbar_tongbu" class=" hiddenToolbar authorization tongbu " style="">
<a href=" " onclick="this.blur();cb_allover_onClick();">
<i class="fa fa-star-o fa-fw"></i>&nbsp;<span class="caption">批量结束</span>
</a >
</li>
`);

}



function refreshRetrieveEnd(id, row, append) {
    //alert( id+  "    "+ row+"    "+  append); 

}


function cellValueChangedByEdit(sheet, cell, newValue, innerRow) {

    //通过别名来判断
    if (cell.alias == 'selectall') {
        for (var i = 0; i < $dzpz_dy_ds.getRowCount(); i++) {
            $dzpz_dy_ds.setValue(i, { selected: newValue });
        }
    }
}


function cb_allover_onClick() {
    $.confirm("提示", "确信要把选中的流程批量结束吗?", function () {
        let ds = $dzpz_dy_ds;
        for (var i = 0; i < ds.getRowCount(); i++) {
            if (ds.getInt(i, "selected") == 0) continue;
            back_flow_over(ds.getString(i, "id"));
            ds.setValue(i, "flow_instance_status", "已结束");
        }
    });


}


id: 6503c1aa99328fedff34a25c
scriptid: 60fa608c9932563b7c99bba9
tablename: app_template
clientip: 39.170.92.207
username: sa
createdate: 2023.09.15 10:32:32.000
script:
function formOpen() {
    $('#mainToolBar').append(`
<li id="toolbar_tongbu" class=" hiddenToolbar authorization tongbu " style="">
<a href="" onclick="this.blur();cb_allover_onClick();">
<i class="fa fa-star-o fa-fw"></i>&nbsp;<span class="caption">批量结束</span>
</a >
</li>
`);

}



function refreshRetrieveEnd(id, row, append) {
    //alert( id+  "    "+ row+"    "+  append); 

}


function cellValueChangedByEdit(sheet, cell, newValue, innerRow) {

    //通过别名来判断
    if (cell.alias == 'selectall') {
        for (var i = 0; i < $dzpz_dy_ds.getRowCount(); i++) {
            $dzpz_dy_ds.setValue(i, { selected: newValue });
        }
    }
}


function cb_allover_onClick() {
    alert(1);
    $confirm("提示", "确信要把选中的流程批量结束吗?", function () {
        let ds = $dzpz_dy_ds;
        for (var i = 0; i < ds.getRowCount(); i++) {
            if (ds.getInt(i, "selected") == 0) continue;
            back_flow_over(ds.getString(i, "id"));
            ds.setValue(i, "flow_instance_status", "已结束");
        }
    });


}


id: 6503c1aa99328fedff34a266
scriptid: 60fa608c9932563b7c99bba9
tablename: app_template
clientip: 39.170.92.207
username: sa
createdate: 2023.09.15 10:33:24.000
script:
function formOpen() {
    $('#mainToolBar').append(`
<li  class=" hiddenToolbar authorization tongbu " style="">
<a href="javascript:cb_allover_onClick();">
<i class="fa fa-star-o fa-fw"></i>&nbsp;<span class="caption">批量结束</span>
</a >
</li>
`);

}



function refreshRetrieveEnd(id, row, append) {
    //alert( id+  "    "+ row+"    "+  append); 

}


function cellValueChangedByEdit(sheet, cell, newValue, innerRow) {

    //通过别名来判断
    if (cell.alias == 'selectall') {
        for (var i = 0; i < $dzpz_dy_ds.getRowCount(); i++) {
            $dzpz_dy_ds.setValue(i, { selected: newValue });
        }
    }
}


function cb_allover_onClick() {
    alert(1);
    $confirm("提示", "确信要把选中的流程批量结束吗?", function () {
        let ds = $dzpz_dy_ds;
        for (var i = 0; i < ds.getRowCount(); i++) {
            if (ds.getInt(i, "selected") == 0) continue;
            back_flow_over(ds.getString(i, "id"));
            ds.setValue(i, "flow_instance_status", "已结束");
        }
    });


}


id: 6503c1aa99328fedff34a270
scriptid: 60fa608c9932563b7c99bba9
tablename: app_template
clientip: 39.170.92.207
username: sa
createdate: 2023.09.15 10:35:38.000
script:
function formOpen() {
    $('#mainToolBar').append(`
<li  class=" hiddenToolbar authorization tongbu " style="">
<a href="javascript:cb_allover_onClick();">
<i class="fa fa-star-o fa-fw"></i>&nbsp;<span class="caption">批量结束</span>
</a >
</li>
`);

}



function refreshRetrieveEnd(id, row, append) {
    //alert( id+  "    "+ row+"    "+  append); 

}


function cellValueChangedByEdit(sheet, cell, newValue, innerRow) {

    //通过别名来判断
    if (cell.alias == 'selectall') {
        for (var i = 0; i < $dzpz_dy_ds.getRowCount(); i++) {
            $dzpz_dy_ds.setValue(i, { selected: newValue });
        }
    }
}


function cb_allover_onClick() {
    
    $confirm("提示", "确信要把选中的流程批量结束吗?", function () {
        let ds = $dzpz_dy_ds;
        toastr.show("正在结束");
        for (var i = 0; i < ds.getRowCount(); i++) {
            if (ds.getInt(i, "selected") == 0) continue;
            back_flow_over(ds.getString(i, "id") , function(){  
            ds.setValue(i, "flow_instance_status", "已结束");
            toastr.hide();
            });
        }
    });


}


id: 6503c1aa99328fedff34a278
scriptid: 60fa608c9932563b7c99bba9
tablename: app_template
clientip: 39.170.92.207
username: sa
createdate: 2023.09.15 10:36:24.000
script:
function formOpen() {
    $('#mainToolBar').append(`
<li  class=" hiddenToolbar authorization tongbu " style="">
<a href="javascript:cb_allover_onClick();">
<i class="fa fa-star-o fa-fw"></i>&nbsp;<span class="caption">批量结束</span>
</a >
</li>
`);

}



function refreshRetrieveEnd(id, row, append) {
    //alert( id+  "    "+ row+"    "+  append); 

}


function cellValueChangedByEdit(sheet, cell, newValue, innerRow) {

    //通过别名来判断
    if (cell.alias == 'selectall') {
        for (var i = 0; i < $dzpz_dy_ds.getRowCount(); i++) {
            $dzpz_dy_ds.setValue(i, { selected: newValue });
        }
    }
}


function cb_allover_onClick() {
    
    $confirm("提示", "确信要把选中的流程批量结束吗?", function () {
        let ds = $dzpz_dy_ds;
        toastr.show("正在结束");
        for (var i = 0; i < ds.getRowCount(); i++) {
            if (ds.getInt(i, "selected") == 0) continue;
            back_flow_over(ds.getString(i, "id") ); 
            ds.setValue(i, "flow_instance_status", "已结束");
           
            
        }
         toastr.hide();
    });


}


id: 650668cc9932de686bb6215f
scriptid: 650666139932de686bb62112
tablename: app_script
clientip: 125.120.128.57
username: sa
createdate: 2023.09.17 10:49:05.000
script:
fu/**
 * 脚本中心的脚本，以 main函数为执行入口，相关的参数放在arg中，它是一个JSON字符串化后的数据
 *
 */
function main(arg)
{
    return ORC( { src:'fileServer?bucketName=电子凭证&objectName=dzpz_imgpool/2021/10/16/616a5b8c99329bc93ec24d80.jpg&fileName=IMG_000.jpg&serverIndex=2&action=view' ,
             left:'50%' , top:'20%' ,height:'10%' ,width:'50%'} );


}


id: 650668cc9932de686bb62168
scriptid: 650666139932de686bb62112
tablename: app_script
clientip: 125.120.128.57
username: sa
createdate: 2023.09.17 10:49:24.000
script:
/**
 * 脚本中心的脚本，以 main函数为执行入口，相关的参数放在arg中，它是一个JSON字符串化后的数据
 *
 */
function main(arg)
{
    return ORC( { src:'fileServer?bucketName=电子凭证&objectName=dzpz_imgpool/2021/10/16/616a5b8c99329bc93ec24d80.jpg&fileName=IMG_000.jpg&serverIndex=2&action=view' ,
             left:'50%' , top:'20%' ,height:'10%' ,width:'50%'} );


}


id: 650668cc9932de686bb62171
scriptid: 650666139932de686bb62112
tablename: app_script
clientip: 125.120.128.57
username: sa
createdate: 2023.09.17 10:50:00.000
script:
/**
 * 脚本中心的脚本，以 main函数为执行入口，相关的参数放在arg中，它是一个JSON字符串化后的数据
 *
 */
function main(arg)
{
    return OCR ( { src:'fileServer?bucketName=电子凭证&objectName=dzpz_imgpool/2021/10/16/616a5b8c99329bc93ec24d80.jpg&fileName=IMG_000.jpg&serverIndex=2&action=view' ,
             left:'50%' , top:'20%' ,height:'10%' ,width:'50%'} );


}


id: 6506b2539932de686bb62190
scriptid: 650666139932de686bb62112
tablename: app_script
clientip: 125.120.128.57
username: sa
createdate: 2023.09.17 16:01:24.000
script:
/**
 * 脚本中心的脚本，以 main函数为执行入口，相关的参数放在arg中，它是一个JSON字符串化后的数据
 *
 */
function main(arg)
{
    return OCR ( { src:'fileServer?bucketName=电子凭证&objectName=dzpz_imgpool/2021/10/16/616a5b8c99329bc93ec24d80.jpg&fileName=IMG_000.jpg&serverIndex=2&action=download' ,
             left:'50%' , top:'20%' ,height:'10%' ,width:'50%'} );


}


id: 6506b2539932de686bb6219e
scriptid: 60a321f05db27838e0c014c3
tablename: app_template
clientip: 125.120.128.57
username: sa
createdate: 2023.09.17 16:50:27.000
script:
var pathToMonit = "";//当前监控的目录
var electron = null;
var pzh_prefix = ""; // 凭证号前缀
var pzh_len = 0; //凭证号长度
var lastPZH = "";
var fullScreenDiv = null;

/*
$(document).ready(function () {
    var script = $(`<script src="ui/imageEditor/filerobot-image-editor.min.js">
    
    </script>`);
    $(document.body).append(script);
});
*/

function formOpen() {

    book.sheet4.visible = false;

    book.showTabOnWhere = "none";
    newImgCommingTipVisible(false);

    book.sheet3.getBrick('cb_delete_pz').visible = false;

    //加载帐套信息及年月
    var corpid = book.sheet2.cells("corpid").getValueString();
    var ym = book.sheet2.cells("ym").getValue();
    //得到年月后，获取凭证号相关设置
    pzh_len = getPZHLen(corpid);
    pzh_prefix = getPZHPrefix(corpid, ym);

    getLastPZH(corpid, ym, function (v) {
        if (v == '') v = pzh_prefix + '00000001'.substring(8 - pzh_len, 8);
        lastPZH = v;
    });

    // smartRetrieve(book.sheet2, "dzpz_pz"); //刷新凭证列表
    // });

    book.getWorkSheet('凭证清单').cells("yue").setValue(getMonth(newDate()));

    book.sheet3.getBrick('FJ').config.promptInfoOnDelete = "确信要将图片从当前凭证中移除，并放回到图片池中吗?";
    book.sheet1.getBrick('imgPool').config.promptInfoOnDelete = "确信要将图片放入回收站吗?";

    //收到来自服务器推送的消息
    onPushMessage("electronPushMessage", function (msg) {
        msg = JSON.parse(msg);
        if (msg.cmd == "newFileUploaded") newImgCommingTipVisible(true); //通知有新文件上传了
        if (msg.cmd == "notifyNeedUploadFileCount") notifyNeedUploadFileCount(msg.fileCount); //通知还有多少个文件等待上传
    });

    //获取当前的electron接口对象
    electron = getElectron(); //getElectron是系统全局功能函数

    book.sheet1.getBrick('imgPool').selectionMode = 'multi'; //图片设置成多选模式

    // 追加一些CSS类 ，用于凭证号标记
    $(document.body).append(`<style>
                        .pzh {position:absolute;left:0;bottom:0px; 
                                height:30px; line-height:30px;width:100%; 
                                background-color:#af4040e0; 
                                color:white;font-weight:bold;font-size:20px;text-align:left;}
                        .delete_pzh { position:absolute; right:0; width:40px; height:44px; top:0; text-align:right; 
                                    vertical-align:top; font-size:24px; color:#ffa0a0;padding-right:5px;}      
                        .delete_pzh:hover { color:white;}      
                          
                        </style>
                    `);


    //注册调整缩略图大小的事件
    $('#blockSize').on('input', resetImgPoolBlockSize);


    setTimeout(function () {
        //调取缩略图大小

        var imgPool = book.sheet1.getBrick('imgPool');
        let blockSize = getImagePoolBlockSize();
        if (blockSize != imgPool.config.blockSize) {
            $('#blockSize').val(blockSize);
            resetImgPoolBlockSize(false);
        }
    }, 1000);

    //调取图片目录设置，注意适当延时
    setTimeout(function () {
        if (electron != null) {
            var hostName = electron.getHostName();
            pathToMonit = getMonitePath(hostName);

            //开启监控
            if (pathToMonit == '') pathToMonit = "c:\\凭证影像采集目录";

            moniteStart(pathToMonit);
            $.alert('请将扫描仪的图片目录指向：' + pathToMonit);
        }

        //显示总共图片数
        getTotalImageCount(function (ret) { book.sheet0.cells('imageCountTotal').setValue('共' + ret + '张') });

    }, 500);



    $(document).on('keydown', function (e) {
        console.info(" kkkkk down");
        if (e.ctrlKey) {
           // fullScreenViewImageOpen();
        }
    });


    $(document).on('keyup', function (e) {
        console.info(" kkkkk up");
        if (!e.ctrlKey) {

           // fullScreenViewImageClose();

        }
    });

}


// 先保存当前选中状态及设置的凭证号信息

var g_selection;
var g_pzMap;
//@comment (group=图片清单刷新,caption=保存选中状态及凭证标记信息,needRightControl=false)
function saveSelectionAndPZInfo() {

    var imgPool = book.sheet1.getBrick('imgPool');

    // 保存当前选中状态及设置的凭证号信息
    var selection = imgPool.getSelectedImageList();
    // 保存设置的凭证号信息
    var pzhMap = {};
    var pzhs = imgPool.dom.find('.pzh');
    for (let i = 0; i < pzhs.length; i++) {
        let id = $(pzhs[i]).parent().attr('id');
        let pzh = $(pzhs[i]).find('.no').text();
        pzhMap[id] = pzh;

    }
    g_selection = selection;
    g_pzMap = pzhMap;
}




//@comment (group=图片清单刷新,caption=还原选中及凭证标记,needRightControl=false)
function restoreSelectionAndPZInfo() {
    var selection = g_selection;
    var pzhMap = g_pzMap;
    var imgPool = book.sheet1.getBrick('imgPool');

    //恢复选中状态
    for (let i = 0; i < selection.length; i++) {
        imgPool.setImageSelected(selection[i].id, true);
    }
    //恢复凭证号
    for (let id in pzhMap) {
        var pzh = pzhMap[id];
        find_pzh(id, true).find('.no').text(pzh);
    }

}

//@comment (group=图片控件,caption=重设小图大小,needRightControl=false)
function resetImgPoolBlockSize(needSaveSetting) {
    if (needSaveSetting == null) needSaveSetting = true;
    var imgPool = book.sheet1.getBrick('imgPool');

    // 先保存当前选中状态及设置的凭证号信息
    saveSelectionAndPZInfo();

    let v = $('#blockSize').val();

    imgPool.config.blockSize = parseInt(v);
    imgPool.rebuildGridly();

    //恢复选中状态
    restoreSelectionAndPZInfo();

    if (needSaveSetting) {
        setTimeout(function () {
            setImagePoolBlockSize(imgPool.getConfig("gguid"), v);
        }, 1000);
    }



}

function resetImageCountInfo() {

    setTimeout(function () {
        book.sheet0.cells("imageCount").setValue("前 " + book.sheet1.getBrick("imgPool").imageCount + " 张");
    }, 300);
}

/**
 * 图片控件初始化完成
 * @param sheet   所在Sheet
 * @param config  图片控件的名称
 *@param data  该图片的详细信息
 *
 */
//@comment (group=图片控件,caption=图片控件初始化完成)
function imageGridlyInited(sheet, name, data) {


    if (name == "imgPool") {
        resetImageCountInfo()
        //图片都初始化后， 定制右上角的工具栏，最多可加5个工具按 钮
        let brick = sheet.getBrick(name);

        book.sheet0.cells("imageCount").setValue(brick.imageCout + "张图片");


        brick.addToolButton(2  //在从右往左数第2个工作栏位置添加一个工具按钮
            , "fa-repeat",   // 字符图标
            "旋转图片",  // 鼠标悬停的提示信息
            "green", //按钮背景色
            function (id) {  //点击后的回调函数

                showInfoPane('*正在旋转图片...');
                setTimeout(function () {
                    //toastr.info(id);  // id 是当前操作的图片对应数据的ID
                    var ret = do_imageRotate(id, "90");
                    if (ret.success) {
                        //把数据中的图片替换，
                        for (let i = 0; i < brick.data.length; i++) {
                            if (brick.data[i].id == id) {
                                //属性从新的属性中替换 
                                for (let prop in brick.data[i]) {
                                    brick.data[i][prop] = ret.data[prop];
                                }
                                break;
                            }
                        }
                        //把缩略图的图片地址替换 ， 

                        let img = $('#' + id).find('.image');
                        img.attr("src", ret.data.url_thumbnail);
                        img.attr('largeimage', ret.data.url_img);
                        //把大图预览的地址替换掉
                        book.sheet0.cells("imgPreview").setValue(ret.data.url_img);
                        hideInfoPane();

                    }
                }, 10);
            }
        );


        brick.addToolButton(3  //在从右往左数第2个工作栏位置添加一个工具按钮
            , "fa-plus",   // 字符图标
            "选中此前",  // 鼠标悬停的提示信息
            "green", //按钮背景色
            function (id) {
                let  selected= $('#' + id).parent().find('.brickSelected').length>0; // 可以用 imgPool.isImageSelected( id) 替换，但此时本函数还没有提供，以后可以换成此函数
                
                let imgPool = book.sheet1.getBrick("imgPool");
                let imgs = imgPool.getCurrentSortedImageList();//得到当前排序后的图片清单
                let found = false;
                for (let i = 0; i < imgs.length; i++) {
                    imgPool.setImageSelected(imgs[i].id, !selected);
                    if (imgs[i].id == id) return;

                }


            });


    }
}


/**
 * 图片控件中图片上的删除按钮被点击
 * @param sheet   所在Sheet
 * @param name  图片控件的名称
 * @param data  图片的信息
 *
 * @returns  {object}    返回一个对象 ， 其中  success= boolean 表示继续执行删除操作，否则表示终止删除操作
 *    如果需要显示一个提示信息，则在 属性 message 中指定
 */
//@comment (group=图片控件,caption=图片上的删除按钮被点击)
function imageOnDelete(sheet, name, data) {

    if (name == 'FJ') {
        if (data.groupname == '凭证') {
            return { success: false, message: "这是凭证，不允许这样移除，请点击“删除凭证”" };
        } else {
            var ret = putImageBackToPool(data.id);
            if (ret.success) {
                smartRetrieve(book.sheet3, "one");
                cb_refresh_onClick();
            } else {
                return ret;
            }

        }
    }

    if (name == 'imgPool') {
        moveImageToRecycle(data.id);
        resetImageCountInfo();
    }
    return { success: true };
}
/**
 * 图片控件中上传按钮被点击
 * @param sheet   所在Sheet
 * @param name  图片控件的名称
 *
 @returns  {object}    返回一个对象 ， 其中  success= boolean 表示继续执行上传操作，否则表示终止上传操作
 *    如果需要显示一个提示信息，则在 属性 message 中指定
 */
//@comment (group=图片控件,caption=图片上传按钮被点击)
function imageOnNewUpload(sheet, name) {


    if (name == 'imgPool') {
        toastr.info("请连接扫描仪，或将图片复制到监控的目录下，图片自动上传");
    }

    if (name == 'FJ') {
        var imgPool = book.sheet1.getBrick('imgPool');
        // 保存当前选中状态及设置的凭证号信息
        var selection = imgPool.getSelectedImageList();
        if (selection.length == 0) {
            toastr.error("至少选中一张图片");
            return { success: false }; // 此返回，阻止了默认的上传操作
        }


        var lastPZ = null;
        for (let i = 0; i < selection.length; i++) {
            var one = selection[i];
            var pzh = getPZH(one.id);
            if (pzh != '') {
                toastr.error("选中的图片中有标记为凭证的，禁止将凭证图片添加到当前凭证中");
                return { success: false }; // 此返回，阻止了默认的上传操作
            }
        }

        var ret = addImageToPZ($one_ds.getString(0, "id"), selection);
        if (ret.success) {
            //刷新图片区
            cb_refresh_onClick();
            //刷新凭证
            loadPZ($one_ds.getString(0, "id"), $one_ds.getString(0, "pzh"), $one_ds.getString(0, "verifiername") != "" ? 1 : 0);
        }

    }


    return { success: false }; // 此返回，阻止了默认的上传操作
}

//先定位 Id的序号， 然后返回它左边的图片的ID
function findLeftImageId(id) {
    let imgPool = book.sheet1.getBrick("imgPool");
    let imgs = imgPool.getCurrentSortedImageList();//得到当前排序后的图片清单
    //找到自已的索引号
    let index = 0;
    for (let i = 0; i < imgs.length; i++) {
        if (imgs[i].id == id) {
            index = i;
            break;
        }
    }

    if (index > 0) return imgs[index - 1].id;
    return "";
}


//找到左边最近的一张凭证号
//如果该凭证与自已相临，那么就同号，因为可能是同一个凭证的不同分页
//否则在那个号上加1做为自已的凭证号
function incLeftNearestPZH(id) {
    let imgPool = book.sheet1.getBrick("imgPool");
    let imgs = imgPool.getCurrentSortedImageList();//得到当前排序后的图片清单
    //找到自已的索引号
    let index = 0;
    for (let i = 0; i < imgs.length; i++) {
        if (imgs[i].id == id) {
            index = i;
            break;
        }
    }

    //再从index往左边查到第一张凭证
    for (let i = index - 1; i >= 0; i--) {
        let tid = imgs[i].id;
        let pzh = getPZH(tid);
        if (pzh == '') continue;
        if (i == index - 1) {
            return pzh; // 左边最近的一张凭证号就在自已的左边，那么就意味着自已与左边那张凭证号可能就是一张凭证的不同分页，所以直接返回凭证号
        } else {
            return stringInc(pzh);
        }

    }
    //到这里，都没有找到凭证号，那么直接返回凭证号前缀
    return stringInc(lastPZH);
}

/**
 * 图片控件中鼠标进入某个图片区域
 * @param sheet   所在Sheet
 * @param config  图片控件的名称
 *@param data  该图片的详细信息
 *
 */
//@comment (group=图片控件,caption=鼠标进入图片区域)
function imageOnMouseEnter(sheet, name, data, event) {
    //console.dir(data);
    var url = data.url_img;
    book.sheet0.cells("imgPreview").setValue(url);
}
//@comment (group=图片控件,caption=鼠标从图片移开,needRightControl=false)
function imageOnMouseOut(sheet, name, data, event) {

    // book.sheet0.cells("imgPreview").setValue("");
}

/**
 * 图片控件中图片顺序变化了
 * @param sheet   所在Sheet
 * @param config  图片控件的配置信息
 *@param ids  调整顺序后的id清单
 *
 */
//@comment (group=图片控件,caption=顺序调整后)
function attachmentOrderChanged(sheet, config, ids) {

     let imgPool = book.sheet1.getBrick("imgPool");
    let imgs = imgPool.getCurrentSortedImageList();//得到当前排序后的图片清单
    reorderImageFileIndex(imgs);

}

/**
 * 图片控件中某个图片被单击
 * @param sheet   所在Sheet
 * @param config  图片控件的名称
 *@param data  该图片的详细信息
 * @param event  事件对象
 *
 *
 */
//@comment (group=图片控件,caption=图片被单击)
function imageOnClick(sheet, name, data, event) {

    if (name == 'imgPool') {
        if (book.sheet0.cells("clickAction").getValue() == 2) imageOnDBLClick(sheet, name, data, event, false);
    }
}


var g_lastPZH = "";
/**
 * 图片控件中某个图片被双击了
 * @param sheet   所在Sheet
 * @param config  图片控件的名称
 *@param data  该图片的详细信息
 *
 */
//@comment (group=图片控件,caption=图片被双击)
function imageOnDBLClick(sheet, name, data, event, showDlg) {

    if (showDlg == undefined) showDlg = true;

    //因为 mouseOut 会把大图清除掉，所以这里重新再设置上
    setTimeout(function () {
        var url = data.url_img;
        book.sheet0.cells("imgPreview").setValue(url);

    }, 200);

    var pzh = '';
    try {

        pzh = find_pzh(data.id, false).find('.no').text();
    } catch (err) {

    }

    if (pzh == undefined) pzh = "";
    if (pzh == '') {

        //找到左边最近的一张凭证号
        //如果该凭证与自已相临，那么就同号，因为可能是同一个凭证的不同分页
        //否则在那个号上加1做为自已的凭证号
        pzh = incLeftNearestPZH(data.id);
        if (pzh > lastPZH) lastPZH = pzh;


    }

    let $setpzh = function (val) {
        if (val == '') {

            var p = find_pzh(data.id, false);
            if (p) p.remove();
            book.sheet1.getBrick("imgPool").setImageSelected(data.id, false);
            return true;
        } else {
            if (val.length - pzh_prefix.length != pzh_len) {
                toastr.error("凭证号(不含前缀)长度必须是" + pzh_len + "位");
                return false;

            }
            g_lastPZH = val; //记下来
            find_pzh(data.id, true).find('.no').text(val);
            book.sheet1.getBrick("imgPool").setImageSelected(data.id, true);
            return true;
        }
    }

    if (!showDlg) {
        $setpzh(pzh);
        return;
    }

    let dlg = inputBox("标记为凭证", "", pzh, "输入凭证号码",

        function (val) { //确认后的回调

            return $setpzh(val);

        }, false,/*不允许为空*/
        //下面是一些事件的切入
        {
            //输入面板初始化完成后
            onContentReady: function () {

                let input = dlg.$content.find('.name');
                input.on('keyup', function () {
                    if (input.val().indexOf(pzh_prefix) != 0) {
                        input.val(pzh_prefix);
                    }
                });
            }
        }
    );




}


function setLoadImagePoolDataOnceCount()
{
    let onceCount = book.sheet0.cells("onceCount").getValueInt();
    if( onceCount<0) onceCount=100;
    if( onceCount>2000) onceCount = 2000;
    setTimeout( function(){ 
        book.sheet0.cells("onceCount").setValue( onceCount);
        book.sheet1.getBrick("imgPool").config.onceCount= onceCount; 
        cb_refresh_onClick();
    },1);

}

//@comment (group=凭证号,caption=得到图片的凭证号如果有的话,needRightControl=false)
function getPZH(id) {
    let obj = find_pzh(id, false);
    if (obj == null) return;
    let s = obj.text();
    s = s.replace(/\s/g, '');
    return s;
}

//@comment (group=凭证号,caption=设置图片的凭证号,needRightControl=false)
function setPZH(id, pzh, needDeleteButton) {
    if (needDeleteButton == undefined) needDeleteButton = true
    find_pzh(id, true, needDeleteButton).find('.no').text(pzh);
}

//@comment (group=凭证号,caption=查找或创建凭证号标记对象,needRightControl=false)
function find_pzh(id, create_if_not_exists, needDeleteButton) {

    if (needDeleteButton == undefined) needDeleteButton = true;

    var d = $('#' + id);
    if (!d) {
        $.alert(id + "不存在");
        return null;
    }

    var ret = d.find('.pzh');
    if (ret.length == 0) {
        if (create_if_not_exists) //如果需要创建，则创建它
        {
            d.append(`<div class="pzh" >
                        <div class="no"></div>
                        <div class="delete_pzh"  ${needDeleteButton ? "" : " style='display:none' "} ><i class="fa fa-close" onclick="removePZH('${id}');  event.preventDefault(); event.stopPropagation();"> </i></div>
                      </div>`);
        }
        ret = d.find('.pzh');
    }
    return ret;

}

//@comment (group=图片控件,caption=移除图片看的凭证号标记,needRightControl=false)
function removePZH(id) {
    var p = find_pzh(id, false);
    if (p) p.remove();
}

function cb_selectall_onClick() { doSelect(true); }
function cb_selectnull_onClick() { doSelect(false); }

function doSelect(b) {
    var imgPool = book.sheet1.getBrick('imgPool');
    if (b) {
        imgPool.selectAll();
    } else {
        imgPool.unSelectAll();
    }
}


function cb_path_onClick() {
    if (electron == null) {
        toastr.error("此功能仅能在客户端APP中执行");
        return;
    }

    var path = electron.showOpenDialogSync('');
    if (path == '') return;
    if (!path.endsWith('凭证影像采集目录')) {

        $.alert("目录名必须是：“凭证影像采集目录”，盘符及上级目录随意。");
        return;
    }
    var hostName = electron.getHostName();
    setMonitePath(hostName, path);

    moniteStart(path);


}

//@comment (group=上传相关,caption=开始文件变化监控,needRightControl=false)
function moniteStart(path) {
    pathToMonit = path;
    book.sheet0.cells('stateBar').setValue("图片目录 " + pathToMonit);

    if (electron == null) {
        toastr.error("此功能仅能在客户端APP中执行");
        return;
    }

    book.sheet0.cells('stateBar').setValue("图片目录 " + pathToMonit + " 监控中...");
    electron.ipcSendMessage({ cmd: "moniteStart", path: path });
}

function cb_refresh_onClick() {
    newImgCommingTipVisible(false);

    // 先保存当前选中状态及设置的凭证号信息
    saveSelectionAndPZInfo();

    var imgPool = book.sheet1.getBrick('imgPool');
    imgPool.reInit(restoreSelectionAndPZInfo); //重新初始化 ,并在初始化完成后， 恢复选中状态

    toastr.info("重新加载完成");



}

//@comment (group=上传相关,caption=上传好一个文件后，通知有新文件,needRightControl=false)
//@comment (group=上传相关,caption=上传好一个文件后通知有新文件,needRightControl=false)
function newImgCommingTipVisible(v) {
    book.sheet0.getBrick('shineText').visible = v;

}

//@comment (group=上传相关,caption=刷新当前还有多少文件要上传的提示,needRightControl=false)
function notifyNeedUploadFileCount(fc) {
    var info = fc == 0 ? "" : "【" + fc + "】个文件正准备上传";
    book.sheet0.cells("stateInfo2").setValue(info);
}


//@comment (group=归档,caption=凭证归档,needRightControl=false)
function cb_auto_onClick() {

    var imgPool = book.sheet1.getBrick('imgPool');
    // 保存当前选中状态及设置的凭证号信息
    var selection = imgPool.getSelectedImageList();
    if (selection.length == 0) {
        toastr.error("至少选中一张图片");
        return;
    }

    let imgs = imgPool.getCurrentSortedImageList();//得到当前排序后的图片清单
    let nn = imgs.length - selection.length;
    if (nn > 0) {
        $confirm("提示", "有" + nn + "张图片没有选中，确信要继续吗?", function () {
            do_pack(selection);
        });
    } else {
        do_pack(selection);
    }
}

var pzGroup = [];

//@comment (group=归档,caption=归档操作,needRightControl=false)
function do_pack(selection) {
    pzGroup = [];
    let pzh2Config = {}; //凭证号对应的配置信息 ， 辅助数据
    let lastPZ = null;
    for (let i = 0; i < selection.length; i++) {
        let one = selection[i];
        let pzh = getPZH(one.id);
        if (pzh == '') {
            if (lastPZ != null) {
                lastPZ.fj.push(one.id);
            }
        } else {
            //新的凭证号
            if (pzh2Config[pzh] == null) {
                lastPZ = {};
                lastPZ.pzh = pzh;
                lastPZ.fj = []; //附件图片
                lastPZ.pz = []; //凭证图片
                pzh2Config[pzh] = lastPZ; //记下凭证号与配置对象的对应关系
                pzGroup.push(lastPZ); //加入到总配置中
            } else {
                //已经存在配置，说明它是该凭证号的更多的分页图片
                //需要检测，它的左边是不是也是同一个号的凭证
                lastPZ = pzh2Config[pzh];

                let leftID = findLeftImageId(one.id); //找到它左边那张图片的ID
                if (leftID == '') {
                    toastr.error("不可能出现的情况");
                    return;
                }
                let leftPZH = getPZH(leftID);
                if (leftPZH != pzh) {
                    $.alert(pzh + '有多张图片，请将它们移动到相邻位置，即同一张凭证的多个分页必须连续相邻，它们之间不要穿插附件图片或其它凭证号图片');
                    return;
                }

            }
            lastPZ.pz.push(one.id); //凭证图片，同一个凭证可能有多个图片 
        }
    }

    if (pzGroup.length == 0) {
        toastr.error("凭证归档操作，至少需要标记一张凭证，并选中它");
        return;
    }

    console.dir();


    do_pzgdqr();



}

//@comment (group=归档,caption=归档确认,needRightControl=false)
function do_pzgdqr() {

    // 整理归档配置信息用于显示
    book.sheet4.paintPermit = false;

    $gd_ds.reset();
    for (let i = 0; i < pzGroup.length; i++) {
        let one = pzGroup[i];
        let row = $gd_ds.insertRow(9999);
        $gd_ds.setValue(row, { pzh: one.pzh, pzs: one.pz.length, fjs: one.fj.length, hj: one.pz.length + one.fj.length });
    }
    book.sheet4.paintPermit = true;

    book.sheet4.popup('fa fa-cog', '归档确认', 450, 450, true, true, {
        action1: {
            text: '确认',
            btnClass: 'btn-green',
            action: function () {
                do_pzgd();
                return true;    //表示关闭弹窗
            }
        },
        cancel: {
            text: '关闭',
            btnClass: 'btn-red',
            action: function () {

                return true;
            }
        }

    });

}
//@comment (group=归档,caption=归档,needRightControl=false)
function do_pzgd() {
    showInfoPane('*正在归档...');
    setButtonsStatus(false); //禁用一些按钮点击
    //alert(JSON.stringify(pzGroup));
    runTask("归档",
        {
            corpid: book.sheet4.cells("corpid").getValueString(),
            ym: book.sheet4.cells("ym").getValueString(),
            pzGroup: pzGroup
        }, function (ret) {
            hideInfoPane();
            ret = JSON.parse(ret);

            if (ret.success) {

                setButtonsStatus(true); //启用一些按钮点击
                smartRetrieve(book.sheet2, "dzpz_pz"); //刷新凭证列表
                //重新检索图片区
                cb_refresh_onClick();
            } else {
                $.alert(ret.message);
            }

        });
}

function setButtonsStatus(b) {

    book.sheet0.getBrick('cb_auto').enabled = b;
}

//@comment (group=,caption=调取某个凭证,needRightControl=false)
function loadPZ(id, pzh, verified) {
    book.sheet3.cells("id").setValue(id);
    smartRetrieve(book.sheet3, "one");
    //附件图片清单
    //不能从 $one_ds中取数，因为上面的smartRetrieve 是异步的
    let action = (verified == 0) ? "edit" : "view";
    book.sheet3.getBrick('cb_delete_pz').visible = verified == 0;
    var FJ = book.sheet3.getBrick('FJ');
    FJ.config.action = action; //控制是否显示删除和新增按钮
    let data = getPZFJ(id); //得到凭证的所有图片
    FJ.buildGridly(data, function () {
        let shortPZH = pzh.substring(pzh_prefix.length);
        //加载图片完成后， 如果是凭证，那么加上凭证号信息
        for (let i = 0; i < data.length; i++) {
            if (data[i].groupname == '凭证') {
                setPZH(data[i].id, shortPZH, false);
            }
        }

    });
    book.sheet3.yOffset = 0; //垂直卷滚条归位
}


//@comment (group=,caption=删除凭证，并把图片回归到池中,needRightControl=false)
function cb_delete_pz_onClick() {
    $confirm("提示", "确信删除本凭证，并将图片全部回归到待归档状态吗?", function () {
        book.sheet3.getBrick('cb_delete_pz').visible = false;
        var id = $one_ds.getString(0, "id");
        var ret = deletePZAndPutBackToPool(id);
        if (ret.success) {
            $one_ds.reset();
            reload_pzh_info(); //可能删除的就是最后一张凭证，所以要重新取一下
            var FJ = book.sheet3.getBrick('FJ');
            FJ.config.action = 'view';
            FJ.buildGridly([]);
            cb_refresh_onClick();//刷新池中图片

        } else {
            toastr.error(ret.message);
        }
    });

}



function cb_trash_onClick() {
    var url = runTask("urlForTrash", {});
    openInMainFrame(url, false, 'fa-trash', '图片回收站');

}

function cb_deleteSelection_onClick() {
    let imgPool = book.sheet1.getBrick('imgPool');
    // 保存当前选中状态及设置的凭证号信息
    let selection = imgPool.getSelectedImageList();
    if (selection.length == 0) {
        toastr.error("至少选中一张图片");
        return;
    }
    let nn = selection.length;
    $confirm("提示", "确信将选中的" + nn + "张图片移入回收站吗?", function () {
        showInfoPane('*正在移和回收站');
        setTimeout(function () {
            do_trush(selection);
            hideInfoPane();
        }, 100);
    });

}

function do_trush(selection) {

    for (let i = 0; i < selection.length; i++) {
        let one = selection[i];
        moveImageToRecycle(one.id);

    }
    cb_refresh_onClick();

}

function cb_size_onClick() {
    let RPM = book.sheet0.RPM;
    let h = RPM.getRowHeight(1);
    if (h > 1) {
        RPM.setRowStretchHeight(1, 0);//弹性高度取消
        RPM.setRowHeight(1, 1);

        RPM.setRowHeight(2, 0);
        book.sheet0.getBrick('dbnav').visible = false;

    } else {

        RPM.setRowStretchHeight(1, 40);//弹性高度取消
        RPM.setRowHeight(1, 300);

        RPM.setRowHeight(2, 30);
        book.sheet0.getBrick('dbnav').visible = true;
    }
}


/**
 * 单元格的值发生了改变
 * @param sheet  所在的工作表
 * @param cell  单元格对象
 * @param oldValue  原先的值
 * @param newValue 变化后的值
 * @param innerRow   当单元格没有绑定数据库或绑定到单行数据库时，本参数无意义。如果绑定一个
 * 多行数据库，则表示该单元所绑定的字段的第 innerRow行发生变化
 */
function cellValueChanged(sheet, cell, oldValue, newValue, innerRow) {

    //通过别名来判断
    if (sheet.name == '凭证清单') {
        if (cell.alias == 'nian' || cell.alias == 'yue') {
            reload_pzh_info();
        };
    }

  

}

/**
 * 单元格因为被编辑而改变。当用户通过编辑单元的值而让单元格发生值改变时本事件被触发。
 * 注意，当使用脚本 sheet.cells(row,col).setValue ( value) 来改变单元格的值时，本事件并不触发
 * @param sheet
 * @param cell
 * @param newValue
 * @param innerRow   当单元格没有绑定数据库或绑定到单行数据库时，本参数无意义。如果绑定一个
 * 多行数据库，则表示该单元所绑定的字段的第 innerRow行发生变化
 */
function cellValueChangedByEdit(sheet, cell, newValue, innerRow) {

     if( cell.alias=='onceCount')  
    {
        setLoadImagePoolDataOnceCount();
     
    }


}



function reload_pzh_info() {
    var sheet = book.getWorkSheet('凭证清单');
    //加载帐套信息及年月
    var corpid = sheet.cells("corpid").getValueString();

    var nian = sheet.cells("nian").getValueString();
    var yue = sheet.cells("yue").getValueString();
    var ym = nian + right("00" + yue, 2);

    //得到年月后，获取凭证号相关设置
    pzh_len = getPZHLen(corpid);
    pzh_prefix = getPZHPrefix(corpid, ym);
    getLastPZH(corpid, ym, function (v) {
        if (v == '') v = pzh_prefix + '00000000'.substring(8 - pzh_len, 8);
        lastPZH = v;

    });

    smartRetrieve(sheet, "dzpz_pz"); //刷新凭证列表
}



function cb_ocr_onClick()
{
     toastr.show("正在自动识别");
     let imgs = imgPool.getCurrentSortedImageList();//得到当前排序后的图片清单
     asyncPool(4,  // 最多4个并发执行
        imgs, //需要处理的数据数组，每个元素可以是任意类型的数据
        function (one, array) // item表示当前处理的对象， array就是整个数据数组
        {
           //函数必须返回一个Promise对象
           return new Promise(function (resolve, reject) {
             
              back_ocr( {src: one.img_url ,  left:'50%' , top:'20%' ,height:'10%' ,width:'50%'}  , function( text)
              {
                  if( text!='') 
                  {

                  }
              });


                resolve(item)
            

        });
    }).then(function () {  //此时，整个数据数组都已经迭代执行完成 ，通常在此善后
        console.info("over");
        toastr.success("自动识别完成");
    });

}


