1
duhe
2024-07-15 a2574099d74dbc873b9a8316500bdd79da516e68
WebTM/views/²É¹º¹ÜÀí/²É¹º¶©µ¥/Cg_POOrderBillEdit.html
@@ -367,18 +367,18 @@
            //#endregion
            //记录组织的值
            var HOrgIDBar = 0;
            var HOrgIDBar = 0;      //声明了一个名为 HOrgIDBar çš„变量,并将其初始化为 0
            //#region è¿›å…¥é¡µé¢å³åŠ è½½
            //判断是否登录 æœªç™»å½•则跳到登录页
            get_LoginIs();
            get_LoginIs();  //执行登入方法
            //#region ã€åŠ¨æ€èŽ·å–æ¨¡å—åç§°ã€‘
            var HModuleType = "1102";
            var HModuleType = "1102";       //定义一个字符串赋值  ç±»åž‹ç»™hmoduletype  å˜é‡
            //通过单据类型,从数据库动态获取单据模块命名,引用js文件 PageTitle.js
            var HPageTitle = get_PageTitle(HModuleType) == "" ? $("h1").html() : get_PageTitle(HModuleType);
            $("h1").html('<b>' + HPageTitle + '</b>');
            var HPageTitle = get_PageTitle(HModuleType) == "" ? $("h1").html() : get_PageTitle(HModuleType);  //通过HModuleType  å•据类型获取并可能引用了一个名为 PageTitle.js çš„JavaScript文件根据get_PageTitle函数方法获取HModuleType
            $("h1").html('<b>' + HPageTitle + '</b>'); //值来显示h1页面
            //#endregion
            //获取页面跳转参数
@@ -386,33 +386,34 @@
            var OperationType = params[params[0]]; //从参数中获取 æ•°æ®ç±»åž‹  1添加 ä¿å­˜  2复制  3 ç¼–辑
            var linterid = params[params[1]]; //从参数中获取 å•据内码
            $("#HUSEORGID").val(sessionStorage["OrganizationID"]);
            $("#HUSEORGID").val(sessionStorage["OrganizationID"]);  // èŽ·å– ä¸ºHUSEORGID的元素的值设置为当前会话中存储在sessionStorage中名为OrganizationID的值
            //#region åˆå§‹åŒ–组织
            Organ();
            Organ();     //执行登入方法
            //#endregion
            //#region èŽ·å–ç»„ç»‡
            function Organ() {
                //获取登录页组织列
                var Organization = '';
                $.ajax({
                    type: "get",
                    url: GetWEBURL() + "/Web/GetOrganizations",
                    success: function (result) {
                        if (result.count == 1) { // è¯´æ˜ŽéªŒè¯æˆåŠŸäº†ï¼Œ
                            var data = result.data;
                            for (var i = 0; i < data.length; i++) {
                var Organization = '';  //定义一给参数设置为空字符串
                $.ajax({                //异步请求
                    type: "get",           //请求类型
                    url: GetWEBURL() + "/Web/GetOrganizations", // //请求路径地址
                    success: function (result) {    // å½“请求成功时,执行这个函数
                        if (result.count == 1) { // è¯´æ˜ŽéªŒè¯æˆåŠŸäº†ï¼Œ   // å¦‚果服务器返回的数据中的`count`字段等于1,这可能表示审核操作成功执行
                            var data = result.data;    //从响应数据中获取 data å±žæ€§  èµ‹å€¼ç»™å˜é‡
                            for (var i = 0; i < data.length; i++) {  //  // éåކ data æ•°ç»„
                      // å¯¹äºŽæ•°ç»„中的每一项,构建一个 <option> æ ‡ç­¾çš„ HTML å­—符串,并将其追加到 Organization å˜é‡ä¸­ã€‚这个 <option> æ ‡ç­¾åŒ…含组织的 ID ä½œä¸º value å’Œç»„织的名称作为显示文本,且文字颜色被设置为蓝色
                                Organization += '<option  style="color:blue;" value="' + data[i].ID + '">' + data[i].Name + '</option>';
                            }
                            $("#HOrgID").append(Organization);
                            if (OperationType == 1 || OperationType == 4 || OperationType == null) {
                                HOrgIDBar = sessionStorage["OrganizationID"];
                            $("#HOrgID").append(Organization);  //获取id为HOrgID字段 ä½¿ç”¨append æ–¹æ³•å°† Organization å˜é‡ä¸­çš„ HTML å­—符串添加到HOrgID
                            if (OperationType == 1 || OperationType == 4 || OperationType == null) {// // è¿™é‡Œæ£€æŸ¥ OperationType å˜é‡çš„值
                                HOrgIDBar = sessionStorage["OrganizationID"];  //从 sessionStorage ä¸­èŽ·å–åä¸º "OrganizationID" çš„项的值,赋值给变量
                            }
                            $("#HOrgID").val(HOrgIDBar);
                            form.render('select');
                            $("#HOrgID").val(HOrgIDBar);  //获取ID ä¸º HOrgID å…ƒç´ çš„选中项的值为 HOrgIDBar å˜é‡çš„值。。
                            form.render('select');  //渲染页面上的 select å…ƒç´ 
                        }
                        layer.closeAll("loading");
                        layer.closeAll("loading");  //关闭所有类型为 "loading" çš„ layer å¼¹å‡ºå±‚
                    }
                })
            }
@@ -420,87 +421,88 @@
            //判断是否新增
            if (linterid == null || linterid == 0) {
            if (linterid == null || linterid == 0) {    //判断 linterid å˜é‡æ˜¯å¦ä¸ºç©ºæˆ–者等于0
                //获取最大单据号 new
                OptionData = 1;
                $("#HMaker").val(sessionStorage["HUserName"]);
                $("#HInterID").val("0");
                $("#HBillNo").val("");
                $.ajax({
                    url: GetWEBURL() + "/Web/GetMAXNum",
                    type: "GET",
                    data: { "HBillType": '1102' },
                    success: function (d) {
                OptionData = 1;  // å°†å˜é‡ OptionData è®¾ç½®ä¸º 1。这个变量可能用于控制某些逻辑或行为
                $("#HMaker").val(sessionStorage["HUserName"]);   //通过HMaker  id获取 å­˜å‚¨å™¨  sessionStorage中HUserName键对应的值
                $("#HInterID").val("0");                // å°è¯•获取id ä¸º HInterID的元素 å­—符串为‘’0‘’的值             å°† ID ä¸º HInterID çš„元素的值设置为 "0"
                $("#HBillNo").val("");                  // å°è¯•获取id ä¸º HBillNo的元素的值元素清空,即设置为空字符串。
                $.ajax({                            //异步请求
                    url: GetWEBURL() + "/Web/GetMAXNum",//请求地址
                    type: "GET",                    //请求类型
                    data: { "HBillType": '1102' },      //请求值 HBillType类型  è®¾ç½®å­—符串为1102   //请求参数  hbillteyp  å€¼ä¸º1100
                    success: function (d) {  // å®šä¹‰å½“请求成功时的回调函数。这个函数接受一个参数 d包含了服务器响应的数据
                        //console.log(d.data);
                        $("#HBillNo").val(d.data[0].HBillNo);
                        $("#HDate").val(Format(new Date(), "yyyy-MM-dd"));
                        $("#HInterID").val(d.data[0].HInterID);
                        $("#HSSDate").val(Format(new Date(), "yyyy-MM-dd")); //结算方式
                        $("#HBillNo").val(d.data[0].HBillNo);     //设置 ID ä¸º HBillNo çš„元素的值为响应数据中 data æ•°ç»„的第一个元素的 HBillNo å±žæ€§å€¼    é€šå¸¸ç”¨äºŽè‡ªåŠ¨å¡«å……æœ€å¤§å•æ®å·
                        $("#HDate").val(Format(new Date(), "yyyy-MM-dd"));//调用 Format çš„函数,将当前日期格式化为 "yyyy-MM-dd" æ ¼å¼ï¼Œå¹¶è®¾ç½® ID ä¸º HDate çš„元素的值。   ç”¨äºŽè‡ªåŠ¨å¡«å……å•æ®çš„æ—¥æœŸ
                        $("#HInterID").val(d.data[0].HInterID);             //更新 ID ä¸º HInterID çš„元素的值为响应数据中 data æ•°ç»„的第一个元素的 HInterID å±žæ€§å€¼ã€‚
                        $("#HSSDate").val(Format(new Date(), "yyyy-MM-dd")); //结算方式           å†æ¬¡è°ƒç”¨ Format å‡½æ•°å°†å½“前日期格式化为 "yyyy-MM-dd" æ ¼å¼ï¼Œå¹¶è®¾ç½® ID ä¸º HSSDate çš„元素的值
                    }
                });
                //页面初始化加载
                $("#HDeptID").val(sessionStorage["HDeptID"]);
                $("#HDeptName").val(sessionStorage["HDept"]);
                $("#HEmpName").val(sessionStorage["HUserName"]);
                $("#HEmpID").val(sessionStorage["HEmpID"]);
                $("#HDeptID").val(sessionStorage["HDeptID"]);  // èŽ·å–é¡µé¢ä¸ŠID为"HDeptID"的元素的值设置为sessionStorage中"HDeptID"键对应的值
                $("#HDeptName").val(sessionStorage["HDept"]);  // èŽ·å–é¡µé¢ä¸ŠID为"HDeptName"的元素的值设置为sessionStorage中"HDeptName"键对应的值
                $("#HEmpName").val(sessionStorage["HUserName"]);   // èŽ·å–é¡µé¢ä¸ŠID为"HEmpName"的元素的值设置为sessionStorage中"HEmpName"键对应的值
                $("#HEmpID").val(sessionStorage["HEmpID"]);     // èŽ·å–é¡µé¢ä¸ŠID为"HEmpID"的元素的值设置为sessionStorage中"HEmpID"键对应的值
             
                //根据当前登录用户的部门 èŽ·å– ä¸»ç®¡
                if ($("#HDeptID").val()!=0) {
                    $.ajax({
                        url: GetWEBURL() + "Gy_Department/list",
                        async: false,
                        type: "GET",
                        data: {
                            "sWhere": "and HItemID = '" + $("#HDeptID").val() + "'", "user": sessionStorage["HUserName"], "Organization": sessionStorage["Organization"]
                if ($("#HDeptID").val() != 0) {       //  åˆ¤æ–­ èŽ·å–åˆ°id为hdeptid的值是为0
                    $.ajax({                          //异步请求
                        url: GetWEBURL() + "Gy_Department/list", //请求的地址
                        async: false,                   //是否异步
                        type: "GET",                        //请求类型
                        data: {         //定义发送到服务器的数据
                             //sWhere(用于筛选条件的字符串,基于HDeptID的值)、user(从sessionStorage中获取的当前用户名)、Organization(从sessionStorage中获取的当前组织信息)
                            "sWhere": "and HItemID = '" + $("#HDeptID").val() + "'", "user": sessionStorage["HUserName"], "Organization": sessionStorage["Organization"]//定义的类型有HItemID,user,Organization
                        },
                        success: function (result) {
                            $("#HManagerID").val(result.data[0].HEmpID);
                            $("#HManagerName").val(result.data[0].负责人);
                        success: function (result) {    //请求成功时的回调函数
                            $("#HManagerID").val(result.data[0].HEmpID);  // å°† ID ä¸º HManagerID çš„元素的值设置为响应数据中 data æ•°ç»„的第一个元素的 HEmpID å±žæ€§å€¼ã€‚
                            $("#HManagerName").val(result.data[0].负责人); // æ›´æ–°è¿”回数据第一个对象的负责人名称
                        }, error: function () {
                            layer.alert("发生错误!", { icon: 5 });
                            layer.alert("发生错误!", { icon: 5 });   //提示发生错误  è­¦ç¤ºæ ‡å‡†ä¸º5的类型
                        }
                    });
                }
               
            } else {//如果修改则走下面 new
                $("#HInterID").val(linterid);
                RoadBillMain(linterid);
                $("#HInterID").val(linterid);   // å°† ID ä¸º HInterID çš„元素的值设置为变量 linterid çš„值。
                RoadBillMain(linterid);//调用一个名为RoadBillMain的函数,并将linterid作为参数传递
            }
            //#endregion
            var rowdata = [{
                "HMaterID": 0, "物料代码": "", "物料名称": "", "规格型号": "", "HUnitID": 0, "计量单位": "", "HWHID": 0, "HWHName": "", "HQty": "", "HRemark": ""
                , "HPrice": "", "HTaxPrice": "", "HMoney": "", "HDiscountRate": 1, "HRelTaxPrice": "", "HTaxRate": 0, "HTaxMoney": "", "HlineTotal": "", "HlineTotalBB": "", "HDate": Format(new Date, "yyyy- MM - dd"),
            }];
            }];  //定义一个包含数组  è®¾ç½®åˆå§‹åŒ–值  ä¸º â€˜0’, ç©ºï¼ŒçŠ¶æ€ä¸º1  è®¾ç½®æ—¶é—´ç±»åž‹yyyy-mm-dd
            // åˆå§‹åŒ–界
            set_InitGrid();
            set_InitGrid();//执行初始化界面方法
            //头工具栏事件
            table.on('toolbar(mainTable)', function (obj) {
                var checkStatus = table.checkStatus('mainTable')
                    , data = checkStatus.data;
            table.on('toolbar(mainTable)', function (obj) {   //监听mainTable表格上的工具栏事件 è§¦å‘回调函数obj参数
                var checkStatus = table.checkStatus('mainTable')  //  ç›‘听选中的的状态
                    , data = checkStatus.data;          //从选中状态中提取数据,这些数据是表格中被选中的行
                //新增行表格数据
                var NewRow = {
                    "HMaterID": 0, "物料代码": "", "物料名称": "", "规格型号": "", "HUnitID": 0, "计量单位": "", "HWHID": 0, "HWHName": "", "HQty": "", "HRemark": ""
                    , "HPrice": "", "HTaxPrice": "", "HMoney": "", "HDiscountRate": "1", "HRelTaxPrice": "", "HTaxRate":0, "HTaxMoney": "", "HlineTotal": "", "HlineTotalBB": "", "HDate": Format(new Date, "yyyy- MM - dd")
                     };
                switch (obj.event) {
                    case 'btn-AddLine':
                        table.cache["mainTable"].push(NewRow);
                        option.data = table.cache["mainTable"];
                };  ////定义 NewRow的对象,它包含了新行应该有的数据字段  è®¾ç½®å€¼ä¸ºç©ºæˆ–默认值
                switch (obj.event) { // switch (obj.event)用于根据obj.event的值来决定执行哪个case块
                    case 'btn-AddLine':   //当为新增
                        table.cache["mainTable"].push(NewRow);//将NewRow对象添加到table.cache["mainTable"]数组中,  æ•°ç»„存储了表格的所有行数据
                        option.data = table.cache["mainTable"];//更新option.data为新的数据数组显示到表格上  //将数据绑定到data上
                        table.render(option);
                        table.render(option);  //渲染表格
                        //刷新复选框
                        //checkRefresh();
                        break;
                    case 'btn-CopyLine':
                        var copydata = JSON.stringify(data);
                        if (data.length <= 0) {
                            layer.msg("请选择需要复制的一行!");
                    case 'btn-CopyLine':  //当为复制一行时
                        var copydata = JSON.stringify(data);  // æŠŠèŽ·å–åˆ°çš„data数据转为json类型 å¹¶èµ‹å€¼ç»™å˜é‡
                        if (data.length <= 0) {         //判断字符串的长度
                            layer.msg("请选择需要复制的一行!");  //提示请选择一行复制
                        }
                        else if (data.length > 1) {
                            layer.msg("只能选择复制一行!");
                        else if (data.length > 1) {   //当字符串的长度大于1时
                            layer.msg("只能选择复制一行!");//提醒  åªèƒ½é€‰æ‹©ä¸€è¡Œ
                        }
                        else {
                            var copydata2 = copydata.substring(1, copydata.length);//去除首行字符'['
@@ -575,21 +577,21 @@
            });
            //行内事件
            table.on('tool(mainTable)', function (obj) {
            table.on('tool(mainTable)', function (obj) {   //监听mainTable2表格上的工具栏事件 è§¦å‘回调函数obj参数
                set_GridDelete(obj);   //行内删除
                set_GridCellCheck(obj); //行内快捷键筛选
                var data = obj.data;
                if (obj.event == 'HDate') {
                    var field = $(this).data('field');
                var data = obj.data;  //获取当前行的数据                //将obj.data å­—符串类型 èµ‹å€¼ç»™data
                if (obj.event == 'HDate') {    //判断接受到的数据字段  id是否为 Hdata
                    var field = $(this).data('field');//获取日期字段
                    laydate.render({
                        elem: this.firstChild
                        , show: true //直接显示
                        , closeStop: this
                        , done: function (nowDate) {
                        elem: this.firstChild        //将日期选择器绑定到触发事件的元素的第一个子元素
                        , show: true                //直接显示       æ—¥æœŸé€‰æ‹©å™¨ï¼Œè€Œä¸æ˜¯ç­‰å¾…用户点击
                        , closeStop: this           // åˆ¤æ–­ç‚¹å‡»æ—¥æœŸé€‰æ‹©å™¨å¤–部时是否关闭
                        , done: function (nowDate) {    //当日期选择完成时执行的回调函数
                            //时间选择完成,行数据更新
                            data[field] = nowDate;
                            obj.update(data);
                            data[field] = nowDate;  //data对象中的日期字段
                            obj.update(data);  //更新回调数据
                            //刷新复选框
                            //checkRefresh();
                        }
@@ -601,28 +603,28 @@
            //#region ç›‘听单元格编辑  å•元格编辑后 å˜æ›´
            table.on('edit(mainTable)', function (obj) {
            table.on('edit(mainTable)', function (obj) {  //监听mainTable表格上的工具栏事件 è§¦å‘回调函数obj参数
                //数值格式校验工具
                var ref = /^\d+(\.\d+)?$/;          //非负数正则表达式
                var temp = "";
                var temp = "";                         //定义一个空字符串变量 temp
                // å•元格编辑之前的值
                var oldText = $(this).prev().text();
                var value = obj.value //得到修改后的值
                    , data = obj.data //得到所在行所有键值
                    , field = obj.field; //得到字段
                var oldText = $(this).prev().text();                         //获取当前的值赋值给oldtext           èŽ·å–å½“å‰å…ƒç´ ï¼ˆå¯èƒ½æ˜¯ä¸€ä¸ªè¡¨æ ¼å•å…ƒæ ¼ï¼‰çš„å‰ä¸€ä¸ªåŒçº§å…ƒç´ çš„æ–‡æœ¬å†…å®¹ï¼Œå¹¶å°†è¿™ä¸ªæ–‡æœ¬å†…å®¹å­˜å‚¨åœ¨å˜é‡oldText中
                var value = obj.value                   //得到修改后的值
                    , data = obj.data                   //得到所在行所有键值
                    , field = obj.field;                        //得到字段
                switch (field) {
                    case "HQty":                                         //数量
                        //数据格式校验
                        temp = value + "";
                        if (!ref.test(temp) || temp == 0) {
                        temp = value + "";                       //修改后的值 è½¬ä¸ºå­—符串 èµ‹å€¼ç»™  å˜é‡temp
                        if (!ref.test(temp) || temp == 0) { //使用表达式来判断字符串是否为0           // å®šä¹‰çš„æ­£åˆ™è¡¨è¾¾å¼ref(用于匹配非负数的字符串表示,但注意它不会匹配单独的0作为有效输入,因为.\d+部分是可选的,且前面没有允许0作为整数部分的单独情况)来测试temp字符串
                            //恢复数据到编辑前
                            obj.update({
                                HQty: oldText
                            obj.update({   //使用obj.update方法更新表格中某一行的数据
                                HQty: oldText    //将hqty字段恢复到保存单元格的值
                            });
                            table.render(option);
                            table.render(option);  //渲染表格
                            layer.msg("数量请输入大于0的数字!");
                            layer.msg("数量请输入大于0的数字!");  //提示数量请输入大于
                            return;
                        }
@@ -638,25 +640,26 @@
                        var HlineTotalBB = Number(((HMoney + HTaxMoney) * HExRate).toFixed(4));      //本位币价税合计=(税额+金额)*汇率
                        //同步更新表格和缓存对应的值
                        obj.update({
                            HQty: HQty
                            , HPrice: HPrice
                            , HMoney: HMoney
                            , HTaxMoney: HTaxMoney
                            , HlineTotal: HlineTotal
                            , HlineTotalBB: HlineTotalBB
                        obj.update({     //更新表格数据                æ–¹æ³•是该对象提供的一个方法,用于更新其内部状态或与之关联的数据源
                              HQty: HQty                            //更新HQty字段,其值来自变量HQty
                            , HPrice: HPrice                             //更新HPrice字段,其值来自变量HPrice
                            , HMoney: HMoney                         //更新HMoney字段,其值来自变量HMoney
                            , HTaxMoney: HTaxMoney                       //更新HTaxMoney字段,HTaxMoney
                            , HlineTotal: HlineTotal                         //更新HlineTotal字段,其值来自变量HlineTotal
                            , HlineTotalBB: HlineTotalBB                     //更新HlineTotalBB字段,其值来自变量HlineTotalBB
                        });
                        break;
                    case "HPrice":                                         //单价
                        //数据格式校验
                        temp = value + "";
                        if (!ref.test(temp) ) {
                        //数据格式校验
                        temp = value + "";     //修改后的值 è½¬ä¸ºå­—符串 èµ‹å€¼ç»™  å˜é‡temp
                      // ref很可能是一个正则表达式对象,用于匹配特定的字符串模式。ref.test(temp)会检查变量temp(即转换后的单价字符串)是否符合ref定义的模式。如果test方法返回false
                        if (!ref.test(temp)) { //检查单价字符串是否符合预期的格式
                            //恢复数据到编辑前
                            obj.update({
                                HPrice: oldText
                            obj.update({            //更新表格某一行数据
                                HPrice: oldText     //将hprice字段恢复到保存前的值
                            });
                            layer.msg("单价请输入数字!");
                            layer.msg("单价请输入数字!");   //请输入单价的数值
                            return;
                        }
@@ -674,27 +677,27 @@
                        var HlineTotalBB = Number(((HMoney + HTaxMoney) * HExRate).toFixed(4));     //本位币价税合计=(税额+金额)*汇率
                        //同步更新表格和缓存对应的值
                        obj.update({
                            HQty: HQty
                            , HPrice: HPrice
                            , HMoney: HMoney
                            , HTaxMoney: HTaxMoney
                            , HlineTotal: HlineTotal
                            , HTaxPrice, HTaxPrice
                            , HRelTaxPrice: HRelTaxPrice
                            , HlineTotalBB: HlineTotalBB
                        obj.update({                    //更新表格数据                æ–¹æ³•是该对象提供的一个方法,用于更新其内部状态或与之关联的数据源
                            HQty: HQty                               //更新HQty字段,HQty
                            , HPrice: HPrice                         //更新HPrice字段,HPrice
                            , HMoney: HMoney                      //更新HMoney字段,HMoney
                            , HTaxMoney: HTaxMoney                  //更新HTaxMoney字段,HTaxMoney
                            , HlineTotal: HlineTotal             //更新HlineTotal字段,HlineTotal
                            , HTaxPrice, HTaxPrice                   //更新HTaxPrice字段,HTaxPrice
                            , HRelTaxPrice: HRelTaxPrice            //更新HRelTaxPrice字段,其值来自变量HRelTaxPrice
                            , HlineTotalBB: HlineTotalBB              //更新HlineTotalBB字段,其值来自变量HlineTotalBB
                        });
                        break;
                    case "HTaxRate":                                                       //税率
                        //数据格式校验
                        temp = value + "";
                        if (!ref.test(temp)) {
                        temp = value + "";             //修改后的值 è½¬ä¸ºå­—符串 èµ‹å€¼ç»™  å˜é‡temp
                        if (!ref.test(temp)) {  //判断税率字符串是否符合预期格式
                            //恢复数据到编辑前
                            obj.update({
                                HTaxRate: oldText
                            obj.update({                //更新表格某一行数据
                                HTaxRate: oldText       //  å°†å­—段HTaxRate的数据恢复到更新之前的数据
                            });
                            layer.msg("税率请输入数字!");
                            layer.msg("税率请输入数字!"); //提示请输入税率的数值
                            return;
                        }
@@ -702,7 +705,7 @@
                        //数据校验合格,重算记录
                        var HTaxRate = obj.data.HTaxRate * 0.01;           //税率 
                        var HQty = obj.data.HQty * 1;                   //数量
                        var HPrice = obj.data.HPrice * 1;
                        var HPrice = obj.data.HPrice * 1;                   //单价
                        var HMoney = HQty * HPrice;                     //金额=数量*单价
                        var HTaxMoney = Number((HMoney * HTaxRate).toFixed(4));         //税额=金额*税率
                        var HTaxPrice = Number((HPrice * (1 + HTaxRate)).toFixed(4));        //含税单价=单价*(1+税率)
@@ -714,7 +717,7 @@
                        var HlineTotalBB = Number(((HMoney + HTaxMoney) * HExRate).toFixed(4));       //本位币价税合计=(税额+金额)*汇率
                        //同步更新表格和缓存对应的值
                        obj.update({
                        obj.update({   //更新表格数据
                            HTaxRate: HTaxRate * 100
                            , HQty: HQty
                            , HPrice: HPrice
@@ -754,17 +757,17 @@
                        //同步更新表格和缓存对应的值
                        obj.update({
                            HTaxRate: HTaxRate * 100
                            , HQty: HQty
                            , HPrice: HPrice
                            , HMoney: HMoney
                            , HTaxMoney: HTaxMoney
                            , HTaxPrice: HTaxPrice
                            , HDiscountRate: HDiscountRate
                            , HRelTaxPrice: HRelTaxPrice
                            HTaxRate: HTaxRate * 100                //将HTaxRate属性的值乘以100,并更新为新的值    ç¨ŽçŽ‡ä¹˜100  ä»Žå°æ•°ç±»åž‹å˜ä¸ºæ•´æ•°æˆ–浮点型
                            , HQty: HQty                  //更新HQty字段,,其值来自变量HQty
                            , HPrice: HPrice                //更新HPrice字段,其值来自变量HPrice
                            , HMoney: HMoney                      //更新HMoney字段,其值来自变量HMoney
                            , HTaxMoney: HTaxMoney                  //更新HTaxMoney字段,其值来自变量HTaxMoney
                            , HTaxPrice: HTaxPrice                  //更新HTaxPrice字段,其值来自变量HTaxPrice
                            , HDiscountRate: HDiscountRate                  //更新HDiscountRate字段,其值来自变量HDiscountRate
                            , HRelTaxPrice: HRelTaxPrice                  //更新HRelTaxPrice字段,其值来自变量HRelTaxPrice
                        });
                        break;
                        table.render(option);
                        table.render(option);  //渲染表格
                    default:
                }
            });
@@ -773,33 +776,33 @@
            //#endregion
            //#region æ–‡æœ¬æ¡†ç›‘听
            $(document).ready(function () {
            $(document).ready(function () {  // å½“文档加载完成后执行的函数
                //#region æ±‡çŽ‡å¤±ç„¦äº‹ä»¶
                var oldHExRate = "";                          //修改前的值
                var newHExRate = "";                          //修改后的值
                $("#HExRate").on('focus', function (data) {
                    oldHExRate = $("#HExRate").val() * 1;   //汇率文本框获取焦点时获取修改前的值
                }).on('blur', function (data) {
                    newHExRate = $("#HExRate").val();       //汇率文本框失焦时获取修改后的值
                var oldHExRate = "";                          //修改前的值  åˆå§‹åŒ–为空字符串
                var newHExRate = "";                          //修改后的值 åˆå§‹åŒ–为空字符串
                $("#HExRate").on('focus', function (data) {    // å½“#HExRate元素获得焦点时,执行此函数
                    oldHExRate = $("#HExRate").val() * 1;    //汇率文本框获取焦点时获取修改前的值       èŽ·å–å½“å‰æ±‡çŽ‡å€¼å¹¶å°†å…¶è½¬æ¢ä¸ºæ•°å­—ï¼ˆä¹˜ä»¥1是一种常用的类型转换技巧)
                }).on('blur', function (data) {         // å½“#HExRate元素失去焦点时,执行此函数
                    newHExRate = $("#HExRate").val();       //汇率文本框失焦时获取修改后的值            èŽ·å–å¤±åŽ»ç„¦ç‚¹åŽçš„æ±‡çŽ‡å€¼ï¼ˆä»ç„¶æ˜¯å­—ç¬¦ä¸²
                    //判断输入的汇率是否合法
                    var ref = /^\d+(\.\d+)?$/;          //非负数正则表达式
                    if (!ref.test(newHExRate)) {
                        layer.msg("汇率请输入不小于0的数字!");
                        $("#HExRate").val(oldHExRate);
                    if (!ref.test(newHExRate)) {       // å¦‚果输入的汇率不匹配正则表达式,
                        layer.msg("汇率请输入不小于0的数字!");      // ä½¿ç”¨Layui的layer弹出层显示提示信息
                        $("#HExRate").val(oldHExRate);    //将汇率值恢复为修改前的值
                        return false;
                    }
                    //输入的汇率合法,重算
                    var HExRate = newHExRate * 1;                       //汇率
                    $("#HExRate").val(HExRate);
                    $("#HExRate").val(HExRate);                         //获取id为HExRate元素设置为 HExRate çš„值
                    for (var i = 0; i < option.data.length; i++) {
                        var HMoney = option.data[i].HMoney;
                        var HTaxMoney = option.data[i].HTaxMoney;
                        option.data[i].HlineTotalBB = (option.data[i].HMoney + option.data[i].HTaxMoney) * HExRate;
                    for (var i = 0; i < option.data.length; i++) { // éåŽ†è¡¨æ ¼æ•°æ®ï¼Œæ ¹æ®æ–°çš„æ±‡çŽ‡é‡æ–°è®¡ç®—æ¯è¡Œçš„æ€»é‡‘é¢
                        var HMoney = option.data[i].HMoney; // èŽ·å–å½“å‰è¡Œçš„HMoney值
                        var HTaxMoney = option.data[i].HTaxMoney;    // èŽ·å–å½“å‰è¡Œçš„HTaxMoney值
                        option.data[i].HlineTotalBB = (option.data[i].HMoney + option.data[i].HTaxMoney) * HExRate;    // è®¡ç®—新的行总金额(可能是不含税金额+税额)* æ±‡çއ
                    }
                    table.render(option);
                    table.render(option);  //渲染表格
                });
                //#endregion
@@ -810,36 +813,41 @@
            //#region åˆ¤æ–­æ˜¯å¦ç™»å½• æœªç™»å½•则跳到登录页
            function get_LoginIs() {
                if (sessionStorage.login != "login") {
                    layer.confirm("登录失效,请重新登录!", {
                        icon: 4, skin: 'layui-layer-lan', title: "温馨提示", closeBtn: 0, btn: ['重新登录']
                    }, function () { window.location.href = "../../user/login.html"; });
                // è¿™è¡Œä»£ç æ£€æŸ¥sessionStorage中的login项的值是否不等于字符串"login"
                if (sessionStorage.login != "login") {   // åˆ¤æ–­æ˜¯å¦
                    layer.confirm("登录失效,请重新登录!", {    //提示登入失败重新登入
                        icon: 4,            // å¼¹å‡ºå±‚的图标
                        skin: 'layui-layer-lan',  // å¼¹å‡ºå±‚的样式名
                        title: "温馨提示", // å¼¹å‡ºå±‚的标题
                        closeBtn: 0,   // æ˜¯å¦æ˜¾ç¤ºå…³é—­æŒ‰é’®ï¼Œ0表示不显示
                        btn: ['重新登录'] // è‡ªå®šä¹‰æŒ‰é’®ï¼Œè¿™é‡Œåªæœ‰ä¸€ä¸ªæŒ‰é’®ï¼ŒæŒ‰é’®ä¸Šçš„æ–‡å­—是“重新登录”
                    }, function () { window.location.href = "../../user/login.html"; }); //重新调用  ç™»å…¥é¡µé¢    // ç‚¹å‡»æŒ‰é’®æ—¶æ‰§è¡Œçš„函数
                }
            }
            //#endregion
            //#region  æ—¶é—´è½¬æ¢
            function formatDate(date) {
                var d = new Date(date),
                    month = '' + (d.getMonth() + 1),
                    day = '' + d.getDate(),
                    year = d.getFullYear();
            function formatDate(date) {
                var d = new Date(date),      //定义一个将date值转换为时间类型赋值给d     åˆ›å»ºä¸€ä¸ªæ–°çš„Date对象d,使用传入的date参数(字符串或时间戳)作为构造函数的参数
                    month = '' + (d.getMonth() + 1),  //从d对象中获取月份,将这个月份数字转换成字符串
                    day = '' + d.getDate(),             //从d对象中获取,将这个日字转换成字符串
                    year = d.getFullYear(); // ä»Žd对象中获取完整的年份
                if (month.length < 2) month = '0' + month;
                if (day.length < 2) day = '0' + day;
                if (month.length < 2) month = '0' + month;  //判断月份的长度是否小于2位数  å°äºŽè¿™åœ¨å‰åŠ ä¸ª0
                if (day.length < 2) day = '0' + day;        //判断天数长度是否小于2位数  å°äºŽè¿™åœ¨å‰åŠ ä¸ª0
                return [year, month, day].join('-');
                return [year, month, day].join('-'); //将年份、月份和日字符串放入一个数组中,并使用join方法将它们连接成一个字符串
            }
            //#endregion
            function set_InitGrid() {
                option = {
                    elem: '#mainTable'
                    , toolbar: '#toolbarDemo'
                    , totalRow: true
                    , limit: 500
                    , height: 500
                    , loading: false
                    elem: '#mainTable'      // ä½¿ç”¨#mainTable作为表格的DOM元素
                    , toolbar: '#toolbarDemo'        //加载tolbardemo这个表格
                    , totalRow: true               // æ˜¯å¦æ˜¾ç¤ºåˆè®¡è¡Œ
                    , limit: 500                //默认显示行数
                    , height: 500                  //高度
                    , loading: false                //是否显示加载状态
                    , cols: [[ //子表
                        { type: 'checkbox', fixed: 'left', totalRowText: '合计行' , style: 'background-color:#efefef4d;'}
                        , { type: 'numbers', title: '序号', width: 100, style: 'background-color:#efefef4d;'}
@@ -867,72 +875,70 @@
                    ]]
                }
                option.data = rowdata;
                table.render(option);
                option.data = rowdata;   //子表的值赋值给option.data   å‘option对象添加一个data属性,并将其设置为rowdata
                table.render(option);//渲界面
            }
            //#region åŠ è½½è¡¨å¤´
            function RoadBillMain(linterid) {
                //查询检验方案单是否存在
                var ajaxLoad = layer.load();
                $.ajax({
                    url: GetWEBURL() + "/Cg_POOrderBill/cx",
                    type: "GET",
                    data: {
                        "HInterID": linterid
                    },
                var ajaxLoad = layer.load();;//遮罩    æŠŠlayer.load è°ƒç”¨èµ‹å€¼ç»™å®šä¹‰å˜é‡ ajaxLoad
                $.ajax({                //异步请求
                    url: GetWEBURL() + "/Cg_POOrderBill/cx",  //请求地址
                    type: "GET",  //请求类型
                    data: { "HInterID": linterid },  // å°†linterid作为请求参数发送
                    success: function (result) {
                        if (result.code == 1) { // è¯´æ˜ŽéªŒè¯æˆåŠŸäº†ï¼Œ
                            var data = result.data;
                            allVal = result.data[0];
                            var data = result.data;   //声明data变量,并将其赋值为result对象中的data属性
                            allVal = result.data[0];  //result.data数组(或类数组对象)的第一个元素赋值给变量allVal
                            form.val("component-form-group", { //formTest å³ class="layui-form" æ‰€åœ¨å…ƒç´ å±žæ€§ lay-filter="" å¯¹åº”的值
                                "HBillNo": data[0].单据号
                                , "HDate": formatDate(data[0].日期)
                                , "HSSDate": formatDate(data[0].结算日期)
                                //, "HInnerBillNo": data.内部单据号
                                , "HAddress": data[0].交货地点
                                , "HDeptName": data[0].部门
                                , "HDeptID": data[0].HDeptID
                                , "HSupID": data[0].HSupID
                                , "HSupName": data[0].供应商
                                "HBillNo": data[0].单据号   //设置单据号的第一个值为“HBillNo”字段的值是data[0].单据号`的值
                                , "HDate": formatDate(data[0].日期)   //设置“HDate”字段的值为`data[0].日期`经过`formatDate`函数处理后的格式
                                , "HSSDate": formatDate(data[0].结算日期) //但设置的是“结算日期”字段。
                                //, "HInnerBillNo": data.内部单据号
                                , "HAddress": data[0].交货地点  // è®¾ç½®â€œäº¤è´§åœ°ç‚¹â€å­—段的值。
                                , "HDeptName": data[0].部门// è®¾ç½®â€œéƒ¨é—¨â€åç§°å­—段的值。
                                , "HDeptID": data[0].HDeptID  // è®¾ç½®â€œHDeptID”名称字段的值。
                                , "HSupID": data[0].HSupID    // è®¾ç½®â€œHSupID”名称字段的值。
                                , "HSupName": data[0].供应商   // è®¾ç½®â€œä¾›åº”商”名称字段的值。
                                , "HEmpID": data[0].HEmpID
                                , "HEmpName": data[0].业务员
                                , "HEmpName": data[0].业务员  // è®¾ç½®â€œä¸šåŠ¡å‘˜â€åç§°å­—æ®µçš„å€¼ã€‚
                                , "HCurID": data[0].HCurID
                                , "HCurName": data[0].币别
                                , "HExRate": data[0].汇率
                                , "HManagerName": data[0].主管
                                , "HCurName": data[0].币别            // è®¾ç½®â€œå¸åˆ«â€åç§°å­—段的值。
                                , "HExRate": data[0].汇率         // è®¾ç½®â€œæ±‡çŽ‡â€åç§°å­—æ®µçš„å€¼ã€‚
                                , "HManagerName": data[0].主管        // è®¾ç½®â€œä¸»ç®¡â€åç§°å­—段的值。
                                , "HManagerID": data[0].HManagerID
                                , "HPSStyleID": data[0].HPSStyleID
                                , "HPSStyleName": data[0].采购方式
                                , "HPSStyleName": data[0].采购方式       // è®¾ç½®â€œé‡‡è´­æ–¹å¼â€åç§°å­—段的值。
                                , "HSSID": data[0].HSSID
                                , "HSSName": data[0].结算方式
                                , "HLinkMan": data[0].联系人
                                , "HLinkPhone": data[0].联系电话
                                , "HInnerBillNo": data[0].辅助字段
                                , "HSSName": data[0].结算方式       // è®¾ç½®â€œç»“算方式”名称字段的值。
                                , "HLinkMan": data[0].联系人       // è®¾ç½®â€œè”系人”名称字段的值。
                                , "HLinkPhone": data[0].联系电话       // è®¾ç½®â€œè”系电话”名称字段的值。
                                , "HInnerBillNo": data[0].辅助字段       // è®¾ç½®â€œè¾…助字段”名称字段的值。
                                , "HProjectID": data[0].HProjectID
                                , "HProjectNumber": data[0].项目代码
                                , "HProjectName": data[0].项目名称
                                , "HProjectNumber": data[0].项目代码       // è®¾ç½®â€œé¡¹ç›®ä»£ç â€åç§°å­—段的值。
                                , "HProjectName": data[0].项目名称       // è®¾ç½®â€œé¡¹ç›®åç§°â€åç§°å­—段的值。
                                , "HWHID": data[0].HWHID
                                , "HOrgID": data[0].HOrgID
                                , "HWHName": data[0].仓库
                                , "HRemark": data[0].表头备注
                                , "HMaker": data[0].制单人
                                , "HChecker": data[0].审核人
                                , "HCloseMan": data[0].关闭人
                                , "HMakeDate": data[0].制单日期
                                , "HCheckDate": data[0].审核日期
                                , "HCloseDate": data[0].关闭日期
                                , "HUpDateDate": data[0].修改日期
                                , "HDeleteDate": data[0].作废日期
                                , "HWHName": data[0].仓库       // è®¾ç½®â€œä»“库”名称字段的值。
                                , "HRemark": data[0].表头备注       // è®¾ç½®â€œè¡¨å¤´å¤‡æ³¨â€åç§°å­—段的值。
                                , "HMaker": data[0].制单人       // è®¾ç½®â€œåˆ¶å•人”名称字段的值。
                                , "HChecker": data[0].审核人       // è®¾ç½®â€œå®¡æ ¸äººâ€åç§°å­—段的值。
                                , "HCloseMan": data[0].关闭人       // è®¾ç½®â€œå…³é—­äººâ€åç§°å­—段的值。
                                , "HMakeDate": data[0].制单日期       // è®¾ç½®â€œåˆ¶å•日期”名称字段的值。
                                , "HCheckDate": data[0].审核日期       // è®¾ç½®â€œå®¡æ ¸æ—¥æœŸâ€åç§°å­—段的值。
                                , "HCloseDate": data[0].关闭日期       // è®¾ç½®â€œå…³é—­æ—¥æœŸâ€åç§°å­—段的值。
                                , "HUpDateDate": data[0].修改日期       // è®¾ç½®â€œä¿®æ”¹æ—¥æœŸâ€åç§°å­—段的值。
                                , "HDeleteDate": data[0].作废日期       // è®¾ç½®â€œä½œåºŸæ—¥æœŸâ€åç§°å­—段的值。
                            });
                           //组织的值HOrgID变化,重新渲染
                            HOrgIDBar = data.HOrgID;
                            HOrgIDBar = data.HOrgID; //修改变量赋值,确保从数组中获取HOrgID
                            //子表  èµ‹å€¼
                            var rowdata = [];
                            for (var i = 0; i < data.length; i++) {
                                rowdata.push(
                            var rowdata = [];   //初始化一个空数组 rowdata,用于存储处理后的数据行
                            for (var i = 0; i < data.length; i++) {//开始一个循环,遍历 data æ•°ç»„中的每个元素。
                                rowdata.push(   // rowdata.push(...) å°†ä¸€ä¸ªæ–°å¯¹è±¡æ·»åŠ åˆ° rowdata æ•°ç»„中
                                    {
                                        "HMaterID": data[i].HMaterID, "物料代码": data[i].物料代码, "物料名称": data[i].物料名称
                                        , "规格型号": data[i].规格型号, "HUnitID": data[i].HUnitID
@@ -944,171 +950,181 @@
                                    }
                                )
                            }
                            option.data = rowdata;
                            table.render(option);
                            form.render('select');
                            option.data = rowdata;  //将数组rowdata赋值 ç»™option.data的属性
                            table.render(option);       //渲染表格
                            form.render('select');  //用form.render方法,并指定'select'作为参数  ä¸ºç¡®è®¤æ•°æ®å˜åŒ–相关的选择框都被正确地更新或渲染
                            layer.close(ajaxLoad);
                            layer.close(ajaxLoad); //调用layer.close方法,并传入ajaxLoad作为参数关闭这个加载层     è¡¨æ˜Žå¼‚步请求已经完成并且数据已经被处理
                        } else {
                            layer.close(ajaxLoad);
                            layer.alert(result.msg, { icon: 5, btn: ['退出'], time: 100000, offset: 't' });
                            layer.close(ajaxLoad); //关闭加载层  åœ¨å¼‚步请求失败或返回了错误结果时执行。
                            layer.alert(result.msg, { icon: 5, btn: ['退出'], time: 100000, offset: 't' });//result.msg对象,提示弹窗 ç±»åž‹ä¸º5, æŒ‰é’®ï¼Œå’ŒæŒ‰é’®çš„名称为退出  æ—¶é—´ ä¸º100秒,以及偏移量(`offset: 't'
                        }
                    }, error: function () {
                        layer.close(ajaxLoad);
                        layer.alert("发生错误!", { icon: 5 });
                        layer.close(ajaxLoad);  //关闭
                        layer.alert("发生错误!", { icon: 5 });//提示发生错误 è­¦ç¤ºæ ‡å¿— 5
                    }
                });
            }
            //#endregion
            //#region ä¿å­˜æ–¹æ³•
            function set_SaveBill(data) {
            function set_SaveBill(data) { //set_SaveBill çš„函数,它接收一个参数 data
                if ($("#HCurID").val() == 0) {
                    layer.msg("请选择币别!", { icon: 5, btn: ['确认'], time: 100000, offset: 't', skin: 'layui-layer-lan', title: "温馨提示" });
                    return;
                if ($("#HCurID").val() == 0) {  //检查页面上ID为HCurID的元素的值是否为0 å¦‚果为0  è¯´æ˜Žç”¨æˆ·æ²¡æœ‰é€‰æ‹©å¸åˆ«ï¼Œ
                    //提示请选择币别,警示标志为5,选择按钮及按钮名称 ï¼Œæ—¶é—´ä¸º100秒  ï¼Œoffset: 't'和skin: 'layui-layer-lan'分别用于调整消息框的位置和样式  æ ‡é¢˜ä¸ºâ€™æ¸©é¦¨æç¤ºâ€˜
                    layer.msg("请选择币别!", { icon: 5, btn: ['确认'], time: 100000, offset: 't', skin: 'layui-layer-lan', title: "温馨提示" });
                    return; //return; é˜»æ­¢å‡½æ•°ç»§ç»­æ‰§è¡Œ
                }
                if ($("#HExRate").val() == 0) {
                     //提示请输入汇率,警示标志为5,选择按钮及按钮名称 ï¼Œæ—¶é—´ä¸º100秒  ï¼Œoffset: 't'和skin: 'layui-layer-lan'分别用于调整消息框的位置和样式  æ ‡é¢˜ä¸ºâ€™æ¸©é¦¨æç¤ºâ€˜
                    layer.msg("请输入汇率!", { icon: 5, btn: ['确认'], time: 100000, offset: 't', skin: 'layui-layer-lan', title: "温馨提示" });
                    return;
                }
                if ($("#HEmpID").val() == 0) {
                     //提示请选择采购员,警示标志为5,选择按钮及按钮名称 ï¼Œæ—¶é—´ä¸º100秒  ï¼Œoffset: 't'和skin: 'layui-layer-lan'分别用于调整消息框的位置和样式  æ ‡é¢˜ä¸ºâ€™æ¸©é¦¨æç¤ºâ€˜
                    layer.msg("请选择采购员!", { icon: 5, btn: ['确认'], time: 100000, offset: 't', skin: 'layui-layer-lan', title: "温馨提示" });
                    return;
                }
                if ($("#HDeptID").val() == 0) {
                     //提示请选择采购部门,警示标志为5,选择按钮及按钮名称 ï¼Œæ—¶é—´ä¸º100秒  ï¼Œoffset: 't'和skin: 'layui-layer-lan'分别用于调整消息框的位置和样式  æ ‡é¢˜ä¸ºâ€™æ¸©é¦¨æç¤ºâ€˜
                    layer.msg("请选择采购部门!", { icon: 5, btn: ['确认'], time: 100000, offset: 't', skin: 'layui-layer-lan', title: "温馨提示" });
                    return;
                }
                if ($("#HSupID").val() == 0) {
                     //提示请选择供应商,警示标志为5,选择按钮及按钮名称 ï¼Œæ—¶é—´ä¸º100秒  ï¼Œoffset: 't'和skin: 'layui-layer-lan'分别用于调整消息框的位置和样式  æ ‡é¢˜ä¸ºâ€™æ¸©é¦¨æç¤ºâ€˜
                    layer.msg("请选择供应商!", { icon: 5, btn: ['确认'], time: 100000, offset: 't', skin: 'layui-layer-lan', title: "温馨提示" });
                    return;
                }
                if ($("#HPSStyleID").val() == 0) {
                     //提示请选择采购方式,警示标志为5,选择按钮及按钮名称 ï¼Œæ—¶é—´ä¸º100秒  ï¼Œoffset: 't'和skin: 'layui-layer-lan'分别用于调整消息框的位置和样式  æ ‡é¢˜ä¸ºâ€™æ¸©é¦¨æç¤ºâ€˜
                    layer.msg("请选择采购方式!", { icon: 5, btn: ['确认'], time: 100000, offset: 't', skin: 'layui-layer-lan', title: "温馨提示" });
                    return;
                }
                if ($("#HSSID").val() == 0) {
                     //提示请选择结算方式,警示标志为5,选择按钮及按钮名称 ï¼Œæ—¶é—´ä¸º100秒  ï¼Œoffset: 't'和skin: 'layui-layer-lan'分别用于调整消息框的位置和样式  æ ‡é¢˜ä¸ºâ€™æ¸©é¦¨æç¤ºâ€˜
                    layer.msg("请选择结算方式!", { icon: 5, btn: ['确认'], time: 100000, offset: 't', skin: 'layui-layer-lan', title: "温馨提示" });
                    return;
                }
                //子表数据检验简单表单验证
                //后续可用多个数组存储列名扩展
                for (var i = 0; i < option.data.length; i++) {
                    if (typeof option.data[i] !== 'object' || option.data[i] === null || Array.isArray(option.data[i])) {
                for (var i = 0; i < option.data.length; i++) {//遍历option.data数组
                    //检查当前元素(option.data[i])是否不是对象、是否为null或是否为数组。                     è¿™æ˜¯å› ä¸ºä»£ç åŽç»­éƒ¨åˆ†å‡è®¾æ¯ä¸ªå…ƒç´ éƒ½æ˜¯ä¸€ä¸ªå¯¹è±¡ï¼Œç”¨äºŽæ£€æŸ¥å…¶å±žæ€§
                    if (typeof option.data[i] !== 'object' || option.data[i] === null || Array.isArray(option.data[i])) {
                        continue; // è·³è¿‡éžå¯¹è±¡é¡¹ï¼ˆå¦‚空数组)  
                    }
                    var rowData = option.data[i];
                    for (var col of Object.keys(rowData)) {
                        if (rowData[col] == "0" && col != "LAY_TABLE_INDEX") {
                            layer.msg("第" + (i + 1) + "行:" + col + "不能为0!");
                            return;
                    var rowData = option.data[i];   //option.data[i]元素是一个有效的对象将其赋值给rowData变量
                    for (var col of Object.keys(rowData)) {  //遍历rowData对象的所有键  Object.keys(rowData)返回一个包含rowData所有自身属性键的数组
                        if (rowData[col] == "0" && col != "LAY_TABLE_INDEX") {  //检查当前属性的值是否等于"0",并且属性名不是"LAY_TABLE_INDEX"
                            layer.msg("第" + (i + 1) + "行:" + col + "不能为0!"); //提示第几行不能为0                          å¦‚果找到值为"0"的属性,并且该属性名不是"LAY_TABLE_INDEX",则通过layer.msg显示一个警告消息,指出哪个行和哪个列的值不能为0
                            return;
                        }
                    }
                }
                var num = [];
                for (var i = 0; i < table.cache["mainTable"].length; i++) {
                    if (table.cache["mainTable"][i] != "") {
                        table.cache["mainTable"][i].LAY_TABLE_INDEX = i;
                        num.push(table.cache["mainTable"][i])
                var num = [];  //定义一个 ç©ºæ•°ç»„
                for (var i = 0; i < table.cache["mainTable"].length; i++) {  //遍历 table.cache["mainTable"] æ•°ç»„
                    if (table.cache["mainTable"][i] != "") {            // æ£€æŸ¥å½“前元素(table.cache["mainTable"][i])是否不等于空字符串("")
                        table.cache["mainTable"][i].LAY_TABLE_INDEX = i; //如果当前元素非空,这行代码会给该元素添加一个名为 LAY_TABLE_INDEX çš„属性,并将其值设置为当前元素的索引 i
                        num.push(table.cache["mainTable"][i])//将当前元素(添加到之前声明的 num æ•°ç»„中。num æ•°ç»„最终将包含所有非空且已添加 LAY_TABLE_INDEX å±žæ€§çš„ table.cache["mainTable"] æ•°ç»„中的元素
                    }
                }
                var sMainStr = JSON.stringify(data.field);
                var sSubStr = JSON.stringify(num);
                var sAllStr = JSON.stringify(allVal);
                var sMainStr = JSON.stringify(data.field); //将data.field å¯¹è±¡è½¬æ¢æˆ JSON å­—符串,并存储在 sMainStr
                var sSubStr = JSON.stringify(num);      //将num å¯¹è±¡è½¬æ¢æˆ JSON å­—符串,并存储在 sSubStr
                var sAllStr = JSON.stringify(allVal); //将allVal å¯¹è±¡è½¬æ¢æˆ JSON å­—符串,并存储在 sAllStr
                //var hentryid = linteridSub;//子表 æŽ’序id
                var sMainSub = sMainStr + ';' + sSubStr + ';' + OperationType + ";" + sessionStorage["HUserName"] + ";" + sAllStr;
                //将前面三个 JSON å­—符串以及 OperationType å˜é‡å’Œ sessionStorage["HUserName"] çš„值通过分号拼接起来,形成了一个新的字符串 sMainSub
                var sMainSub = sMainStr + ';' + sSubStr + ';' + OperationType + ";" + sessionStorage["HUserName"] + ";" + sAllStr;
                $.ajax({
                    type: "POST",
                $.ajax({   //异步请求
                    type: "POST",  //请求类型
                    url: GetWEBURL() + "Cg_POOrderBill/POOrderBillEdit", //方法所在页面和方法名
                    async: true,
                    data: { "sMainSub": sMainSub },
                    dataType: "json",
                    success: function (data) {
                        if (data.count == 1) { // è¯´æ˜ŽéªŒè¯æˆåŠŸäº†ï¼Œ
                            layer.msg(data.Message, { icon: 1 });
                    async: true,            //是否异步进行请求
                    data: { "sMainSub": sMainSub },    // å°†hmaterid作为请求参数发送发送到服务器的数据
                    dataType: "json",              //类型为json
                    success: function (data) {// å½“请求成功时执行的回调函数
                        if (data.count == 1) { // è¯´æ˜ŽéªŒè¯æˆåŠŸäº†ï¼Œ   // æ£€æŸ¥è¿”回的数据中count属性的值是否为1,这可能表示操作成功
                            layer.msg(data.Message, { icon: 1 }); //使用layer插件显示一个消息,图标为1(通常表示成功)
                            $('#add-btn').addClass("layui-btn-disabled").attr("disabled", true);
                            $('#add-btn').addClass("layui-btn-disabled").attr("disabled", true);// ç¦ç”¨æ·»åŠ æŒ‰é’®ï¼Œé˜²æ­¢é‡å¤æäº¤
                            //保存后浏览
                            //ReRoadBillMain();
                        }
                        else {
                            layer.alert(data.Message, { icon: 5 });
                            layer.alert(data.Message, { icon: 5 });// å¦‚果操作未成功,显示一个包含错误信息的警告框,图标为5(通常表示错误)
                        }
                        layer.closeAll("loading");
                        layer.closeAll("loading");  //关闭所有正在显示的加载层
                    },
                    error: function (err) {
                        layer.alert("错误:" + err, { icon: 5 });
                        console.log("Reason" + sMainStr);
                    error: function (err) { // å½“请求失败时执行的回调函数
                        layer.alert("错误:" + err, { icon: 5 });  //示一个包含错误信息的警告框,图标为5
                        console.log("Reason" + sMainStr); //在控制台打印错误信息
                    }
                });
            }
            //#endregion
            //行内快捷键筛选
            function set_GridCellCheck(obj) {
                $(document).off('keydown', ".layui-table-edit").on('keydown', '.layui-table-edit', function (e) {
                    if (event.key == "F7") {
            function set_GridCellCheck(obj) {       //定义了一个名为set_GridCellCheck的函数,它接受一个参数obj
                //使用$(document).off('keydown', ".layui-table-edit")来移除(如果存在的话)之前绑定到文档中所有.layui-table-edit类元素上的keydown事件监听器
                $(document).off('keydown', ".layui-table-edit").on('keydown', '.layui-table-edit', function (e) {
                    if (event.key == "F7") {//检查触发事件的键盘按键是否是F7键
                        //物料
                        if (obj.event == "HMaterID") {
                            var HOrgID = $("#HOrgID").val();
                        if (obj.event == "HMaterID") {//判断传入的obj对象的event属性是否等于字符串"HMaterID"
                            var HOrgID = $("#HOrgID").val();  //获取id="HOrgID"的元素中获取其值,并将该值存储在变量HOrgID中
                            layer.open({
                                type: 2
                            layer.open({  //打开层
                                type: 2         // //表示弹出层的内容是一个 iframe       ç±»åž‹ä¸º2
                                , skin: "layui-layer-rim" //加上边框
                                , title: "物料列表"  //标题
                                , closeBtn: 1  //窗体右上角关闭 çš„ æ ·å¼
                                , shift: 2 //弹出动画
                                , area: ["90%", "90%"] //窗体大小
                                , maxmin: true //设置最大最小按钮是否显示
                                , content: ['../../基础资料/公用基础资料/Gy_Material.html?openType=2&HOrgID=' + HOrgID, 'yes']
                                , btn: ["确定", "取消"]
                                , btn1: function (index, laero) {
                                , content: ['../../基础资料/公用基础资料/Gy_Material.html?openType=2&HOrgID=' + HOrgID, 'yes']   //页面加载
                                , btn: ["确定", "取消"]  //属性定义了弹出层上的按钮数“确定”和“取消
                                , btn1: function (index, laero) { //当点击“确定”按钮时会被调用
                                    //按钮一  çš„回调
                                    var iframeWindow = window["layui-layer-iframe" + index];//获取弹框页面
                                    var checkStatus = iframeWindow.layui.table.checkStatus("mainTable");//获取选中的数据
                                      OptionData = checkStatus.data[0];
                                    var rowIndex = $(obj.tr).attr("data-index") * 1;
                                    for (var i = 0; i < checkStatus.data.length; i++) {
                                        if (rowIndex + i >= option.data.length) {
                                    OptionData = checkStatus.data[0];  //把选中数据的第一条赋值给OptionData变量
                                    var rowIndex = $(obj.tr).attr("data-index") * 1;  //attr("data-index")用于获取该tr元素上data-index属性的值*1转换类型然后赋值给rowIndex
                                    for (var i = 0; i < checkStatus.data.length; i++) {  //判断选中的数据的长度  ç”¨äºŽéåކcheckStatus.data数组中的每个元素
                                        if (rowIndex + i >= option.data.length) {           //判断rowIndex + i的索引超出了option.data数组的长度,说明option.data数组需要扩展以包含更多行
                                            var NewRow = {
                                                "HMaterID": 0, "物料代码": "", "物料名称": "", "规格型号": "", "HUnitID": 0, "计量单位": "", "HWHID": 0, "HWHName": "", "HQty": 1, "HRemark": ""
                                                , "HPrice": "0", "HTaxPrice": "0", "HMoney": "0", "HDiscountRate": "1", "HRelTaxPrice": "0", "HTaxRate": "0", "HTaxMoney": "0", "HlineTotal": "0", "HlineTotalBB": "0", "HDate": Format(new Date, "yyyy- MM - dd")
                                            };
                                            };  // åˆ›å»ºä¸€ä¸ªæ–°çš„包含数组   å…¶åˆå§‹å€¼ä¸ºç©ºæˆ–者0  æˆ–者是时间格式
                                             
                                            table.cache["mainTable"].push(NewRow);
                                            option.data = table.cache["mainTable"];
                                            table.cache["mainTable"].push(NewRow);    //创建新的包含数组  ä¼ å…¥table.cache["mainTable"]数组
                                            option.data = table.cache["mainTable"];  //把传入 table.cache["mainTable"]数组的值赋值给option.data çš„属性
                                            table.render(option);
                                            table.render(option);//渲染界面
                                        }
                                        var HMaterID = checkStatus.data[i].HItemID;
                                        var resultData = getMaterialByMaterID(HMaterID);
                                        option.data[rowIndex + i].HMaterID = resultData.HMaterID;
                                        option.data[rowIndex + i].物料代码 = resultData.HMaterNumber;
                                        option.data[rowIndex + i].物料名称 = resultData.HMaterName;
                                        option.data[rowIndex + i].规格型号 = resultData.HMaterModel;
                                        option.data[rowIndex + i].HUnitID = resultData.HUnitID;
                                        option.data[rowIndex + i].计量单位 = resultData.HUnitName;
                                        option.data[rowIndex + i].HQty = 1;
                                        var HMaterID = checkStatus.data[i].HItemID; //checkStatus.data数组中的当前元素(索引为i)中获取HItemID属性的值 å¹¶èµ‹å€¼ç»™HMaterID
                                        var resultData = getMaterialByMaterID(HMaterID);  //使用HMaterID作为参数来调用getMaterialByMaterID函数来获取该物料的详细信息
                                        option.data[rowIndex + i].HMaterID = resultData.HMaterID;  //将option.data数组中对应行的HMaterID属性更新为从resultData对象中获取的物料ID
                                        option.data[rowIndex + i].物料代码 = resultData.HMaterNumber; //将option.data数组中对应行的 ç‰©æ–™ä»£ç  å±žæ€§æ›´æ–°ä¸ºä»ŽresultData对象中获取的物料ID
                                        option.data[rowIndex + i].物料名称 = resultData.HMaterName; //将option.data数组中对应行的  ç‰©æ–™åç§°  å±žæ€§æ›´æ–°ä¸ºä»ŽresultData对象中获取的物料ID
                                        option.data[rowIndex + i].规格型号 = resultData.HMaterModel; //将option.data数组中对应行的  è§„格型号  å±žæ€§æ›´æ–°ä¸ºä»ŽresultData对象中获取的物料ID
                                        option.data[rowIndex + i].HUnitID = resultData.HUnitID; //将option.data数组中对应行的 HUnitID å±žæ€§æ›´æ–°ä¸ºä»ŽresultData对象中获取的物料ID
                                        option.data[rowIndex + i].计量单位 = resultData.HUnitName; //将option.data数组中对应行的 è®¡é‡å•位 å±žæ€§æ›´æ–°ä¸ºä»ŽresultData对象中获取的物料ID   æ›´æ–°è®¡é‡å•位属性
                                        option.data[rowIndex + i].HQty = 1;  //将对应行的HQty属性(可能代表数量)设置为1。这表示对于每个选中的物料,其默认数量被设置为1
                                    }
                                    table.render(option);
                                    layer.closeAll();
                                    table.render(option); //重新渲染表格以显示更新后的数据
                                    layer.closeAll();  //关闭所有通过layer
                                    //layer.close(layer.index); //它获取的始终是最新弹出的某个层,值是由layer内部动态递增计算的
                                }
                                , btn2: function (index, layero) {
                                , btn2: function (index, layero) {   //当点击“取消”按钮时会被调用
                                    //按钮【按钮二】的回调
                                    //return false å¼€å¯è¯¥ä»£ç å¯ç¦æ­¢ç‚¹å‡»è¯¥æŒ‰é’®å…³é—­
                                },
                                end: function () {
                                    obj.update({
                                        "HMaterID": OptionData.HItemID
                                end: function () {
                                    obj.update({ //更新表格数据
                                        "HMaterID": OptionData.HItemID             //设置HItemID的值为“HBillNo”字段的值HItemID`的值
                                        ,"物料代码" : OptionData.物料代码
                                       , "物料名称" :OptionData.物料名称
                                        ,"规格型号" : OptionData.规格型号
@@ -1120,24 +1136,24 @@
                                });
                        }
                        //计量单位
                        if (obj.event == "HUnitID") {
                        if (obj.event == "HUnitID") {  //判断  obj.event事件 æ˜¯å¦ç­‰äºŽå­—符串 'HUnitID'。如果等于,则执行if循环
                            layer.open({
                                type: 2
                                , skin: "layui-layer-rim" //加上边框
                                , title: "计量单位列表"  //标题
                                , closeBtn: 1  //窗体右上角关闭 çš„ æ ·å¼
                                , shift: 2 //弹出动画
                                , area: ["90%", "90%"] //窗体大小
                                , maxmin: true //设置最大最小按钮是否显示
                                , content: ['../../基础资料/公用基础资料/Gy_Unit.html', 'yes']
                                , btn: ["确定", "取消"]
                                , btn1: function (index, laero) {
                                type: 2             //表示弹出层的内容是一个 iframe       ç±»åž‹ä¸º2
                                , skin: "layui-layer-rim"        //加上边框
                                , title: "计量单位列表"           //标题
                                , closeBtn: 1                    //窗体右上角关闭 çš„ æ ·å¼
                                , shift: 2                  //弹出动画
                                , area: ["90%", "90%"]          //窗体大小
                                , maxmin: true                  //设置最大最小按钮是否显示
                                , content: ['../../基础资料/公用基础资料/Gy_Unit.html', 'yes']   //设置 iframe çš„ URL,URL ä¸­åŒ…含了查询参数,来调用所需要的值
                                , btn: ["确定", "取消"]        //自定义选择按钮  å…¶æŒ‰é’®çš„名称为  ç¡®å®šï¼Œå–消
                                , btn1: function (index, laero) {  //按钮监听 è°ƒç”¨å›žè°ƒ
                                //按钮一  çš„回调
                                var iframeWindow = window["layui-layer-iframe" + index];//获取弹框页面
                                var checkStatus = iframeWindow.layui.table.checkStatus("mainTable");//获取选中的数据
                                if (checkStatus.data.length != 1) {
                                    return layer.msg("请选择一条数据");
                                if (checkStatus.data.length != 1) {  //判断选中的数据是否为一条
                                    return layer.msg("请选择一条数据");  //提示请选中一条
                                }
                                OptionData = checkStatus.data[0];
                                //更新表格缓存的数据
@@ -1157,18 +1173,18 @@
                        }
                        //仓库
                        if (obj.event == "HWHID") {
                            layer.open({
                                type: 2
                        if (obj.event == "HWHID") {  //判断obj.event事件  çš„字符串是否==HWHID
                            layer.open({            //打开层
                                type: 2      //表示弹出层的内容是一个 iframe       ç±»åž‹ä¸º2
                                , skin: "layui-layer-rim" //加上边框
                                , title: "计量单位列表"  //标题
                                , closeBtn: 1  //窗体右上角关闭 çš„ æ ·å¼
                                , shift: 2 //弹出动画
                                , shift: 2   //弹出动画
                                , area: ["90%", "90%"] //窗体大小
                                , maxmin: true //设置最大最小按钮是否显示
                                , content: ['../../基础资料/公用基础资料/Gy_Warehouse.html?type=Warehouse', 'yes']
                                , btn: ["确定", "取消"]
                                , btn1: function (index, laero) {
                                , content: ['../../基础资料/公用基础资料/Gy_Warehouse.html?type=Warehouse', 'yes']//设置 iframe çš„ URL,URL ä¸­åŒ…含了查询参数,来调用所需要的值
                                , btn: ["确定", "取消"]  //自定义选择按钮  å…¶æŒ‰é’®çš„名称为  ç¡®å®šï¼Œå–消
                                , btn1: function (index, laero) {  //当为为确认时
                                    //按钮一  çš„回调
                                    var iframeWindow = window["layui-layer-iframe" + index];//获取弹框页面
                                    var checkStatus = iframeWindow.layui.table.checkStatus("mainTable");//获取选中的数据
@@ -1192,7 +1208,7 @@
                                }
                            })
                        }
                    obj.event = "";
                    obj.event = ""; //把boj.event属性  åˆå§‹åŒ–为空
                    return false;
                }
@@ -1219,19 +1235,19 @@
            }
            //采购员
            function get_checkEmp() {
                layer.open({
                layer.open({  //打开层
                    type: 2//弹窗类型
                    , skin: 'layui-layer-rim' //加上边框
                    , area: ['90%', '90%']//大小
                    , title: '采购员列表'//标题
                    , shift: 2//弹出动画
                    , content: ['../../基础资料/公用基础资料/Gy_EmployeeList.html?Type=HEmp', 'yes']
                    , btn: ['确定', '取消']
                    , content: ['../../基础资料/公用基础资料/Gy_EmployeeList.html?Type=HEmp', 'yes']  //设置 iframe çš„ URL,URL ä¸­åŒ…含了查询参数,来调用所需要的值
                    , btn: ['确定', '取消']   //自定义选择按钮 å…¶æŒ‰é’®çš„名称为  ç¡®å®šï¼Œå–消
                    , btn1: function (index, layero) {//按钮【按钮一】的回调
                        var iframeWindow = window['layui-layer-iframe' + index]  //获取弹框页面
                        var checkStatus = iframeWindow.layui.table.checkStatus('mainTable');//获取table的elem:"#test"
                        if (checkStatus.data.length === 0) {
                            return layer.msg('请选择数据');
                        if (checkStatus.data.length === 0) {      //判断是否选择了数据
                            return layer.msg('请选择数据');          //提示请选择数据
                        }
                        $("#HEmpName").val(checkStatus.data[0].职员名称);
                        $("#HEmpID").val(checkStatus.data[0].HItemID);
@@ -1455,22 +1471,22 @@
            //#region æ ¹æ®ç‰©æ–™ID获取物料详细信息
            function getMaterialByMaterID(HMaterID) {
                var resultData = {};
                $.ajax({
                    url: GetWEBURL() + "Cg_POOrderBill/getMaterialByMaterID",
                    async: false,
                    type: "GET",
                    data: {
                        "HMaterID": HMaterID
                $.ajax({  // å¼‚步请求
                    url: GetWEBURL() + "Cg_POOrderBill/getMaterialByMaterID",  //请求地址
                    async: false,   //是否开启异步
                    type: "GET",   //请求类型
                    data: {   //定义发送到服务器的数据
                        "HMaterID": HMaterID     //  å°†hmaterid作为请求参数发送
                    },
                    success: function (result) {
                        if (result.code == 1) {
                            var data = result.data;
                            resultData = data[0];
                    success: function (result) {   // å½“请求成功时,执行这个函数
                        if (result.code == 1) { // å¦‚果服务器返回的数据中的`code字段等于1,这可能表示审核操作成功执行
                            var data = result.data; //声明data变量,并将其赋值为result对象中的data属性
                            resultData = data[0];   //将data数组(或类数组对象)的第一个元素赋值给变量resultData
                        } else {
                            layer.alert(result.msg, { icon: 5, btn: ['退出'], time: 100000, offset: 't' });
                            layer.alert(result.msg, { icon: 5, btn: ['退出'], time: 100000, offset: 't' }); //result.msg对象,提示弹窗 ç±»åž‹ä¸º5, æŒ‰é’®ï¼Œå’ŒæŒ‰é’®çš„名称为退出  æ—¶é—´ ä¸º100秒,以及偏移量(`offset: 't'
                        }
                    }, error: function () {
                        layer.alert("发生错误!", { icon: 5 });
                        layer.alert("发生错误!", { icon: 5 });  //提示弹窗 å‘生错误 ï¼Œè­¦ç¤ºæ ‡å¿—为5的
                    }
                });
                return resultData;