longz
2026-04-17 beddc8530aaf1d396cf3bc8a932fa67e54b96e64
线路管理班次设置 自动生成行程表
3个文件已修改
286 ■■■■■ 已修改文件
ManagementYKDTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tLine/tLine_add.html 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementYKDTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tLine/tLine_edit.html 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementYKDTravel/guns-admin/src/main/webapp/static/modular/system/tLine/tLine_info.js 192 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementYKDTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tLine/tLine_add.html
@@ -161,6 +161,38 @@
            <div class="row">
                <div class="col-sm-11">
                    <div class="form-group">
                        <label class="col-sm-2 control-label">批量生成:</label>
                        <label class="col-sm-1 control-label">始发时间:</label>
                        <div class="col-sm-2">
                            <input type="text" name="firstShiftTime" id="firstShiftTime" class="form-control" placeholder="始发时间"/>
                        </div>
                        <label class="col-sm-1 control-label">末班时间:</label>
                        <div class="col-sm-2">
                            <input type="text" name="lastShiftTime" id="lastShiftTime" class="form-control" placeholder="末班时间"/>
                        </div>
                    </div>
                    <div class="form-group">
                        <label class="col-sm-2 control-label"></label>
                        <label class="col-sm-1 control-label">间隔:</label>
                        <div class="col-sm-2">
                            <select class="form-control" id="shiftGap">
                                <option value="">选择间隔</option>
                                <option value="30">30分钟</option>
                                <option value="60">60分钟</option>
                                <option value="90">90分钟</option>
                                <option value="120">120分钟</option>
                            </select>
                        </div>
                        <label class="col-sm-1 control-label">车次数:</label>
                        <div class="col-sm-2">
                            <input type="text" name="batchCarNum" id="batchCarNum" class="form-control"/>
                        </div>
                        <div class="col-sm-2">
                            <#button btnCss="info" name="生成" id="batchEnsure" icon="fa-check" clickFun="TLineInfoDlg.generateShiftList()"/>
                        </div>
                    </div>
                    <div class="form-group">
                        <label class="col-sm-2 control-label">班次时间:</label>
                        <div class="col-sm-2">
                            <input type="text" name="shiftTime" id="shiftTime" class="form-control" placeholder="选择时间"/>
@@ -170,7 +202,7 @@
                            <input type="text" name="carNum" id="carNum" class="form-control" />
                        </div>
                        <div class="col-sm-2">
                            <#button btnCss="info" name="添加" id="ensure" icon="fa-check" clickFun="TLineInfoDlg.addShift()"/>
                            <#button btnCss="info" name="手动添加" id="ensure" icon="fa-check" clickFun="TLineInfoDlg.addShift()"/>
                        </div>
                    </div>
                    <div class="form-group">
@@ -225,6 +257,16 @@
        ,range: '-'
        ,format: 'HH:mm'
    });
    laydate.render({
        elem: '#firstShiftTime'
        ,type: 'time'
        ,format: 'HH:mm'
    });
    laydate.render({
        elem: '#lastShiftTime'
        ,type: 'time'
        ,format: 'HH:mm'
    });
    var regDouble = /^(0|[1-9]\d{0,2})(\.\d{1,2})?$/;
    var regXiShu = /^(0(\.\d{1,2})?|1?)$/;
    var regXiShu1 = /^([1-9]{1,})(\.\d{1,2})?$/;
ManagementYKDTravel/guns-admin/src/main/webapp/WEB-INF/view/system/tLine/tLine_edit.html
@@ -170,6 +170,37 @@
            <div class="row">
                <div class="col-sm-11">
                    <div class="form-group">
                        <label class="col-sm-2 control-label">批量生成:</label>
                        <label class="col-sm-1 control-label">始发时间:</label>
                        <div class="col-sm-2">
                            <input type="text" name="firstShiftTime" id="firstShiftTime" class="form-control" placeholder="始发时间"/>
                        </div>
                        <label class="col-sm-1 control-label">末班时间:</label>
                        <div class="col-sm-2">
                            <input type="text" name="lastShiftTime" id="lastShiftTime" class="form-control" placeholder="末班时间"/>
                        </div>
                    </div>
                    <div class="form-group">
                        <label class="col-sm-2 control-label"></label>
                        <label class="col-sm-1 control-label">间隔:</label>
                        <div class="col-sm-2">
                            <select class="form-control" id="shiftGap">
                                <option value="">选择间隔</option>
                                <option value="30">30分钟</option>
                                <option value="60">60分钟</option>
                                <option value="90">90分钟</option>
                                <option value="120">120分钟</option>
                            </select>
                        </div>
                        <label class="col-sm-1 control-label">车次数:</label>
                        <div class="col-sm-2">
                            <input type="text" name="batchCarNum" id="batchCarNum" class="form-control"/>
                        </div>
                        <div class="col-sm-2">
                            <#button btnCss="info" name="生成" id="batchEnsure" icon="fa-check" clickFun="TLineInfoDlg.generateShiftList()"/>
                        </div>
                    </div>
                    <div class="form-group">
                        <label class="col-sm-2 control-label">班次时间:</label>
                        <div class="col-sm-2">
                            <input type="text" name="shiftTime" id="shiftTime" class="form-control" placeholder="选择时间"/>
@@ -179,7 +210,7 @@
                            <input type="text" name="carNum" id="carNum" class="form-control" />
                        </div>
                        <div class="col-sm-2">
                            <#button btnCss="info" name="添加" id="ensure" icon="fa-check" clickFun="TLineInfoDlg.addShift()"/>
                            <#button btnCss="info" name="手动添加" id="ensure" icon="fa-check" clickFun="TLineInfoDlg.addShift()"/>
                        </div>
                    </div>
                    <div class="form-group">
@@ -200,7 +231,12 @@
                                    <tr class="shiftValueClass">
                                        <td style="text-align: center;"><input type="hidden" id="time2Value" name="time2Value" value="${obj.addTime}">${obj.addTime}</td>
                                        <td style="text-align: center;"><input type="hidden" id="shiftTimeValue" name="shiftTimeValue" value="${obj.startTime} - ${obj.endTime}">${obj.startTime} - ${obj.endTime}</td>
                                        <td style="text-align: center;"><input type="hidden" id="carNumValue" name="carNumValue" value="${obj.carNum}">${obj.carNum}</td>
                                        <td style="text-align: center;">
                                            <input type="hidden" id="carNumValue" name="carNumValue" value="${obj.carNum}">
                                            <button type="button" onclick="TLineInfoDlg.changeCarNum(this,-1)">-</button>
                                            <input type="text" name="carNumEditValue" value="${obj.carNum}" oninput="TLineInfoDlg.onCarNumInput(this)" onblur="TLineInfoDlg.onCarNumBlur(this)" style="width:60px;text-align:center;margin:0 6px;">
                                            <button type="button" onclick="TLineInfoDlg.changeCarNum(this,1)">+</button>
                                        </td>
                                        <td style="text-align: center;"><button onclick="deleteSub(this)">移除</button></td>
                                    </tr>
                                    @}
@@ -240,6 +276,16 @@
        ,range: '-'
        ,format: 'HH:mm'
    });
    laydate.render({
        elem: '#firstShiftTime'
        ,type: 'time'
        ,format: 'HH:mm'
    });
    laydate.render({
        elem: '#lastShiftTime'
        ,type: 'time'
        ,format: 'HH:mm'
    });
    var regDouble = /^(([1-9]{1}\d*)|(0{1}))(\.\d{0,2})?$/;
    var regXiShu = /^(0(\.\d{1,2})?)$/;
    var regXiShu1 = /^([1-9]{1,})(\.\d{1,2})?$/;
ManagementYKDTravel/guns-admin/src/main/webapp/static/modular/system/tLine/tLine_info.js
@@ -162,6 +162,9 @@
        Feng.error("请至少设置一条价格设置");
        return;
    }
    if(!TLineInfoDlg.validateShiftCarNum()){
        return;
    }
    var shuArr=[];
    $(".shiftValueClass").each(function () {
        shuArr.push({
@@ -222,6 +225,9 @@
    });
    if(subArr.length <= 0){
        Feng.error("请至少设置一条价格设置");
        return;
    }
    if(!TLineInfoDlg.validateShiftCarNum()){
        return;
    }
    var shuArr=[];
@@ -411,6 +417,9 @@
    }else if (!regInt.test(carNum)){
        Feng.info("车次数格式不正确");
        return;
    }else if (parseInt(carNum, 10) <= 0){
        Feng.info("车次数必须为正整数");
        return;
    }
    times = shiftTime.split(" - ");
@@ -438,18 +447,187 @@
            return;
        }
    }
    //封装数据
    var str = '<tr class="shiftValueClass">' +
        '<td style="text-align: center;"><input type="hidden" id="time2Value" name="time2Value" value="'+getNowFormatDate()+'">' + getNowFormatDate() + '</td>' +
        '<td style="text-align: center;"><input type="hidden" id="shiftTimeValue" name="shiftTimeValue" value="'+shiftTime+'">'+shiftTime+'</td>' +
        '<td style="text-align: center;"><input type="hidden" id="carNumValue" name="carNumValue" value="'+carNum+'">'+carNum+'</td>' +
        '<td style="text-align: center;"><button onclick="deleteSub(this)">移除</button></td></tr>';
    $("#shiftValue").append(str);
    TLineInfoDlg.appendShiftRow(shiftTime, carNum);
    //清除数据
    $("#shiftTime").val("");
    $("#carNum").val("");
}
TLineInfoDlg.appendShiftRow = function (shiftTime, carNum) {
    var str = '<tr class="shiftValueClass">' +
        '<td style="text-align: center;"><input type="hidden" id="time2Value" name="time2Value" value="'+getNowFormatDate()+'">' + getNowFormatDate() + '</td>' +
        '<td style="text-align: center;"><input type="hidden" id="shiftTimeValue" name="shiftTimeValue" value="'+shiftTime+'">'+shiftTime+'</td>' +
        '<td style="text-align: center;">' +
        '<input type="hidden" id="carNumValue" name="carNumValue" value="'+carNum+'">' +
        '<button type="button" onclick="TLineInfoDlg.changeCarNum(this,-1)">-</button>' +
        '<input type="text" name="carNumEditValue" value="'+carNum+'" oninput="TLineInfoDlg.onCarNumInput(this)" onblur="TLineInfoDlg.onCarNumBlur(this)" style="width:60px;text-align:center;margin:0 6px;">' +
        '<button type="button" onclick="TLineInfoDlg.changeCarNum(this,1)">+</button>' +
        '</td>' +
        '<td style="text-align: center;"><button onclick="deleteSub(this)">移除</button></td></tr>';
    $("#shiftValue").append(str);
}
TLineInfoDlg.normalizePositiveInt = function (numStr) {
    var onlyNum = (numStr || "").replace(/[^\d]/g, "");
    onlyNum = onlyNum.replace(/^0+/, "");
    return onlyNum;
}
TLineInfoDlg.syncCarNumValue = function (input) {
    var $input = $(input);
    var value = TLineInfoDlg.normalizePositiveInt($input.val());
    $input.val(value);
    $input.closest("td").find("input[name='carNumValue']").val(value);
}
TLineInfoDlg.onCarNumInput = function (input) {
    TLineInfoDlg.syncCarNumValue(input);
}
TLineInfoDlg.onCarNumBlur = function (input) {
    var $input = $(input);
    var value = TLineInfoDlg.normalizePositiveInt($input.val());
    if (value == "" || parseInt(value, 10) <= 0) {
        value = "1";
    }
    $input.val(value);
    $input.closest("td").find("input[name='carNumValue']").val(value);
}
TLineInfoDlg.changeCarNum = function (btn, step) {
    var $td = $(btn).closest("td");
    var $input = $td.find("input[name='carNumEditValue']");
    var value = TLineInfoDlg.normalizePositiveInt($input.val());
    var num = parseInt(value, 10);
    if (isNaN(num) || num <= 0) {
        num = 1;
    }
    num = num + step;
    if (num <= 0) {
        num = 1;
    }
    $input.val(num);
    $td.find("input[name='carNumValue']").val(num);
}
TLineInfoDlg.validateShiftCarNum = function () {
    var valid = true;
    $(".shiftValueClass").each(function () {
        var $row = $(this);
        var $editInput = $row.find("input[name='carNumEditValue']");
        if ($editInput.length > 0) {
            TLineInfoDlg.onCarNumBlur($editInput[0]);
        }
        var carNum = $row.find("input[name*='carNumValue']").val();
        if (!/^[1-9]\d*$/.test(carNum)) {
            valid = false;
            return false;
        }
    });
    if (!valid) {
        Feng.error("班次车次数必须为正整数");
    }
    return valid;
}
TLineInfoDlg.toMinutes = function (timeStr) {
    var arr = timeStr.split(":");
    return parseInt(arr[0], 10) * 60 + parseInt(arr[1], 10);
}
TLineInfoDlg.toTimeStr = function (minutes) {
    var h = Math.floor(minutes / 60);
    var m = minutes % 60;
    return (h < 10 ? "0" + h : "" + h) + ":" + (m < 10 ? "0" + m : "" + m);
}
/**
 * 批量生成班次
 * 规则:
 * 第一次:始发时间 - 始发时间+间隔
 * 后续:上次后段时间 - 后段时间+间隔
 */
TLineInfoDlg.generateShiftList = function () {
    var firstShiftTime = $("#firstShiftTime").val();
    var lastShiftTime = $("#lastShiftTime").val();
    var shiftGap = $("#shiftGap").val();
    var batchCarNum = $("#batchCarNum").val();
    if (firstShiftTime == "") {
        Feng.info("请选择始发时间");
        return;
    }
    if (lastShiftTime == "") {
        Feng.info("请选择末班时间");
        return;
    }
    if (shiftGap == "") {
        Feng.info("请选择间隔时间");
        return;
    }
    if (batchCarNum == "") {
        Feng.info("请填写每班车次数");
        return;
    }
    if (!regInt.test(batchCarNum)) {
        Feng.info("车次数格式不正确");
        return;
    }
    if (parseInt(batchCarNum, 10) <= 0) {
        Feng.info("车次数必须为正整数");
        return;
    }
    var startMinute = TLineInfoDlg.toMinutes(firstShiftTime);
    var lastMinute = TLineInfoDlg.toMinutes(lastShiftTime);
    var gap = parseInt(shiftGap, 10);
    if (startMinute > lastMinute) {
        Feng.info("始发时间不能大于末班时间");
        return;
    }
    var existsMap = {};
    $(".shiftValueClass").each(function () {
        var shiftTimeValue = $(this).find("input[name*='shiftTimeValue']").val();
        if (shiftTimeValue) {
            shiftTimeValue = shiftTimeValue.replace(/\s+/g, "");
        }
        existsMap[shiftTimeValue] = true;
    });
    var currentStart = startMinute;
    var generated = 0;
    var duplicate = 0;
    while (currentStart <= lastMinute) {
        var currentEnd = currentStart + gap;
        if (currentEnd > 24 * 60) {
            break;
        }
        var shiftTime = TLineInfoDlg.toTimeStr(currentStart) + " - " + TLineInfoDlg.toTimeStr(currentEnd);
        var shiftTimeKey = shiftTime.replace(/\s+/g, "");
        if (!existsMap[shiftTimeKey]) {
            TLineInfoDlg.appendShiftRow(shiftTime, batchCarNum);
            existsMap[shiftTimeKey] = true;
            generated++;
        } else {
            duplicate++;
        }
        currentStart = currentEnd;
    }
    if (generated == 0) {
        Feng.info("未生成新班次,班次时间可能已存在");
        return;
    }
    if (duplicate > 0) {
        Feng.success("已生成" + generated + "条班次,跳过重复" + duplicate + "条");
    } else {
        Feng.success("已生成" + generated + "条班次");
    }
}
/**
 * 添加公司
 */