This commit is contained in:
wangwenhua 2025-09-28 16:55:02 +08:00
commit 8fea8b75dc
26 changed files with 642 additions and 268 deletions

View File

@ -29,7 +29,7 @@ public class MockMessageTip implements Delayed {
return unit.convert(diff, TimeUnit.MILLISECONDS); return unit.convert(diff, TimeUnit.MILLISECONDS);
} }
// 定义任务的优先级排序较早到期的任务排在前面
@Override @Override
public int compareTo(Delayed o) { public int compareTo(Delayed o) {
if (this.expireTime < ((MockMessageTip) o).expireTime) { if (this.expireTime < ((MockMessageTip) o).expireTime) {

View File

@ -220,6 +220,9 @@ public class LoginController extends BaseController {
newUser.setOriginalPassword(""); newUser.setOriginalPassword("");
newUser.setSuperFlag(1); newUser.setSuperFlag(1);
userService.save(newUser); userService.save(newUser);
} else {
userInDb.setPassword(new BCryptPasswordEncoder().encode(user.getPassword()));
userService.updateById(userInDb);
} }
LoginForm loginForm = new LoginForm(); LoginForm loginForm = new LoginForm();
loginForm.setUsername(user.getUserName()); loginForm.setUsername(user.getUserName());

View File

@ -3,13 +3,25 @@ package com.hshh.nation.mock.service;
import com.hshh.Global; import com.hshh.Global;
import com.hshh.nation.common.MockMessageTip; import com.hshh.nation.common.MockMessageTip;
import com.hshh.nation.common.SpringContextHolder; import com.hshh.nation.common.SpringContextHolder;
import com.hshh.nation.fuel.service.impl.*; import com.hshh.nation.fuel.service.impl.FuelBoatServiceImpl;
import com.hshh.nation.fuel.service.impl.FuelMetalJarServiceImpl;
import com.hshh.nation.fuel.service.impl.FuelPlaneServiceImpl;
import com.hshh.nation.fuel.service.impl.FuelSoftJarServiceImpl;
import com.hshh.nation.fuel.service.impl.FuelTruckServiceImpl;
import com.hshh.nation.mock.bean.FuelAirMockBean;
import com.hshh.nation.mock.bean.FuelReceiveMockBean;
import com.hshh.nation.mock.bean.FuelSendMockBean;
import com.hshh.nation.mock.bean.FuelTransMockBean;
import com.hshh.nation.mock.bean.MedicalCasualtyBackToBean;
import com.hshh.nation.mock.bean.MedicalSupplyBean;
import com.hshh.nation.mock.bean.TransportLoadMockBean;
import com.hshh.nation.mock.bean.TransportSeaBean;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
public abstract class AbtActionMockBase implements ActionMockService { public abstract class AbtActionMockBase implements ActionMockService {
//相邻两条信息的间隔时间 //相邻两条信息的间隔时间
protected final long interValTime = 500;//ms protected final long interValTime = 500;//ms
protected DateTimeFormatter dateTimeFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); protected DateTimeFormatter dateTimeFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
@ -20,49 +32,65 @@ public abstract class AbtActionMockBase implements ActionMockService {
@Override @Override
public <T> void start(T input, AtomicInteger count, long now, String actionName) { public <T> void start(T input, AtomicInteger count, long now, String actionName) {
MockMessageTip firstMessage = MockMessageTip.createMessage(LocalDateTime.now().format(dateTimeFormat), "", "", 0, count.addAndGet(1) * interValTime + now); MockMessageTip firstMessage = MockMessageTip.createMessage(
LocalDateTime.now().format(dateTimeFormat), "", "", 0,
count.addAndGet(1) * interValTime + now);
Global.delayQueue.add(firstMessage); Global.delayQueue.add(firstMessage);
String startTime = LocalDateTime.now().format(dateTimeFormat);
//发送开始提示 //发送开始提示
String message = ""; String message = "";
switch (actionName) { switch (actionName) {
case "receive": case "receive":
message = "油料接收"; message = "油料接收";
startTime = ((FuelReceiveMockBean) input).getStartTime();
break; break;
case "send": case "send":
startTime = ((FuelSendMockBean) input).getStartTime();
message = "油料发放"; message = "油料发放";
break; break;
case "trans": case "trans":
startTime = ( (FuelTransMockBean) input).getStartTime();
message = "油料输送"; message = "油料输送";
break; break;
case "plane": case "plane":
startTime = ( (FuelAirMockBean) input).getStartTime();
message = "飞机油料补给"; message = "飞机油料补给";
break; break;
case "boat": case "boat":
startTime = ((FuelAirMockBean) input).getStartTime();
message = "舰艇油料补给"; message = "舰艇油料补给";
break; break;
case "casualtyTakeBackTo": case "casualtyTakeBackTo":
startTime = ( (MedicalCasualtyBackToBean) input).getStartTime();
message = "伤病员后送"; message = "伤病员后送";
break; break;
case "medicalSupply": case "medicalSupply":
startTime =( (MedicalSupplyBean) input).getStartTime();
message = "医疗物资补给"; message = "医疗物资补给";
break; break;
case "load": case "load":
startTime = ( (TransportLoadMockBean) input).getStartTime();
message = "装载"; message = "装载";
break; break;
case "unload": case "unload":
startTime = ( (TransportLoadMockBean) input).getStartTime();
message = "卸载"; message = "卸载";
break; break;
case "transportSea": case "transportSea":
startTime = ((TransportSeaBean) input).getStartTime();
message = "海上输送"; message = "海上输送";
break; break;
case "transportPlane": case "transportPlane":
startTime = ((TransportSeaBean) input).getStartTime();
message = "空中输送行动"; message = "空中输送行动";
break; break;
default: default:
break; break;
} }
sendMessage(message, count, now); sendStartMessage(startTime, message, count, now);
} }
/** /**
@ -74,7 +102,15 @@ public abstract class AbtActionMockBase implements ActionMockService {
*/ */
protected void sendMessage(String message, AtomicInteger count, long now) { protected void sendMessage(String message, AtomicInteger count, long now) {
MockMessageTip startMessage = MockMessageTip.createMessage(LocalDateTime.now().format(dateTimeFormat), "开始行动", message, 1, count.addAndGet(1) * interValTime + now); MockMessageTip startMessage = MockMessageTip.createMessage(
LocalDateTime.now().format(dateTimeFormat), "开始行动", message, 1,
count.addAndGet(1) * interValTime + now);
Global.delayQueue.add(startMessage);
}
protected void sendStartMessage(String startTime, String message, AtomicInteger count, long now) {
MockMessageTip startMessage = MockMessageTip.createMessage(startTime, "开始行动", message, 1,
count.addAndGet(1) * interValTime + now);
Global.delayQueue.add(startMessage); Global.delayQueue.add(startMessage);
} }
@ -100,6 +136,7 @@ public abstract class AbtActionMockBase implements ActionMockService {
/** /**
* 获取装备信息 * 获取装备信息
*
* @param equipInfo * @param equipInfo
* @return * @return
*/ */

View File

@ -64,15 +64,15 @@ public class FuelAirplaneSupplyMockServiceImpl extends AbtMockGeneralService imp
String toEquipInfo = bean.getToEquipIdInfo(); String toEquipInfo = bean.getToEquipIdInfo();
Object toEquip = getEquip(toEquipInfo); Object toEquip = getEquip(toEquipInfo);
if (toEquip instanceof FuelTruck) { if (toEquip instanceof FuelTruck) {
FuelTruck equip = (FuelTruck) fromEquip; FuelTruck equip = (FuelTruck) toEquip;
tips.append("被补给装备当前油量").append(equip.getCurrentCapacity() + Double.parseDouble(fuelCount.getCount())); tips.append("被补给装备当前油量").append(equip.getCurrentCapacity() + Double.parseDouble(fuelCount.getCount()));
} }
if (toEquip instanceof FuelBoat) { if (toEquip instanceof FuelBoat) {
FuelBoat equip = (FuelBoat) fromEquip; FuelBoat equip = (FuelBoat) toEquip;
tips.append("被补给装备当前油量").append(equip.getCurrentCapacity() + Double.parseDouble(fuelCount.getCount())); tips.append("被补给装备当前油量").append(equip.getCurrentCapacity() + Double.parseDouble(fuelCount.getCount()));
} }
if (toEquip instanceof FuelPlane) { if (toEquip instanceof FuelPlane) {
FuelPlane equip = (FuelPlane) fromEquip; FuelPlane equip = (FuelPlane) toEquip;
tips.append("被补给装备当前油量").append(equip.getCurrentCapacity() + Double.parseDouble(fuelCount.getCount())); tips.append("被补给装备当前油量").append(equip.getCurrentCapacity() + Double.parseDouble(fuelCount.getCount()));
} }
// sendMessage(String time, String title, String message, AtomicInteger counter, long now, int order) // sendMessage(String time, String title, String message, AtomicInteger counter, long now, int order)

View File

@ -64,15 +64,15 @@ public class FuelBoatSupplyMockServiceImpl extends AbtMockGeneralService impleme
String toEquipInfo = bean.getToEquipIdInfo(); String toEquipInfo = bean.getToEquipIdInfo();
Object toEquip = getEquip(toEquipInfo); Object toEquip = getEquip(toEquipInfo);
if (toEquip instanceof FuelTruck) { if (toEquip instanceof FuelTruck) {
FuelTruck equip = (FuelTruck) fromEquip; FuelTruck equip = (FuelTruck) toEquip;
tips.append("被补给装备当前油量" + (equip.getCurrentCapacity() + Double.parseDouble(fuelCount.getCount()))); tips.append("被补给装备当前油量" + (equip.getCurrentCapacity() + Double.parseDouble(fuelCount.getCount())));
} }
if (toEquip instanceof FuelBoat) { if (toEquip instanceof FuelBoat) {
FuelBoat equip = (FuelBoat) fromEquip; FuelBoat equip = (FuelBoat) toEquip;
tips.append("被补给装备当前油量" + (equip.getCurrentCapacity() + Double.parseDouble(fuelCount.getCount()))); tips.append("被补给装备当前油量" + (equip.getCurrentCapacity() + Double.parseDouble(fuelCount.getCount())));
} }
if (toEquip instanceof FuelPlane) { if (toEquip instanceof FuelPlane) {
FuelPlane equip = (FuelPlane) fromEquip; FuelPlane equip = (FuelPlane) toEquip;
tips.append("被补给装备当前油量" + (equip.getCurrentCapacity() + Double.parseDouble(fuelCount.getCount()))); tips.append("被补给装备当前油量" + (equip.getCurrentCapacity() + Double.parseDouble(fuelCount.getCount())));
} }
// sendMessage(String time, String title, String message, AtomicInteger counter, long now, int order) // sendMessage(String time, String title, String message, AtomicInteger counter, long now, int order)

View File

@ -1,18 +1,19 @@
package com.hshh.nation.mock.service.impl; package com.hshh.nation.mock.service.impl;
import com.hshh.nation.mock.bean.FuelCountBean; import com.hshh.Global;
import com.hshh.nation.mock.bean.FuelReceiveMockBean; import com.hshh.nation.common.MockMessageTip;
import com.hshh.nation.mock.service.AbtActionMockBase;
import com.hshh.nation.common.Utility; import com.hshh.nation.common.Utility;
import com.hshh.nation.fuel.entity.FuelMetalJar; import com.hshh.nation.fuel.entity.FuelMetalJar;
import com.hshh.nation.fuel.entity.FuelSoftJar; import com.hshh.nation.fuel.entity.FuelSoftJar;
import lombok.extern.slf4j.Slf4j; import com.hshh.nation.mock.bean.FuelCountBean;
import org.springframework.stereotype.Service; import com.hshh.nation.mock.bean.FuelReceiveMockBean;
import com.hshh.nation.mock.service.AbtActionMockBase;
import java.time.Duration; import java.time.Duration;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.Objects; import java.util.Objects;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@Service("fuel-receive-mock") @Service("fuel-receive-mock")
@Slf4j @Slf4j
@ -85,13 +86,13 @@ public class FuelReceiveMockServiceImpl extends AbtActionMockBase {
LocalDateTime startTime = LocalDateTime.parse(bean.getStartTime(), dateTimeFormat); LocalDateTime startTime = LocalDateTime.parse(bean.getStartTime(), dateTimeFormat);
startTime = startTime.plusMinutes(bean.getInspectTime()); startTime = startTime.plusMinutes(bean.getInspectTime());
sendMessage(action_start_label + ":验收油品完成", count, now); acting(startTime, action_start_label + ":验收油品完成",count,now,action_start_label);
startTime = startTime.plusMinutes(bean.getQualityTime()); startTime = startTime.plusMinutes(bean.getQualityTime());
sendMessage(action_start_label + ":质检油品完成", count, now); acting(startTime,action_start_label + ":质检油品完成",count,now,action_start_label);
startTime = startTime.plusMinutes(bean.getMeasureTime()); startTime = startTime.plusMinutes(bean.getMeasureTime());
sendMessage(action_start_label + ":计量油品完成", count, now); acting(startTime,action_start_label + ":计量油品完成",count,now,action_start_label);
FuelCountBean fuelCount = bean.getFuelInfoList().get(0); FuelCountBean fuelCount = bean.getFuelInfoList().get(0);
//接收油料总数 //接收油料总数
@ -117,7 +118,7 @@ public class FuelReceiveMockServiceImpl extends AbtActionMockBase {
if (estimateTime < bean.getIntervalTime()) { if (estimateTime < bean.getIntervalTime()) {
startTime = startTime.plusMinutes((long) (estimateTime * 60.0)); startTime = startTime.plusMinutes((long) (estimateTime * 60.0));
sendMessage(actioning_label + "完成所有加注,总油量:" + total, count, now); acting(startTime,actioning_label + "完成所有加注,总油量:" + total, count, now,actioning_label);
} else { } else {
@ -125,7 +126,7 @@ public class FuelReceiveMockServiceImpl extends AbtActionMockBase {
while (remain > 0) { while (remain > 0) {
remain = (remain - totalWorkAbility) > 0 ? (remain - totalWorkAbility) : 0; remain = (remain - totalWorkAbility) > 0 ? (remain - totalWorkAbility) : 0;
startTime = startTime.plusHours(bean.getIntervalTime()); startTime = startTime.plusHours(bean.getIntervalTime());
sendMessage(actioning_label + "加注中,剩余油量:" + remain, count, now); acting(startTime,actioning_label + "加注中,剩余油量:" + remain, count, now,actioning_label);
} }
} }
@ -138,7 +139,8 @@ public class FuelReceiveMockServiceImpl extends AbtActionMockBase {
} }
@Override @Override
public <T> void finish(LocalDateTime endTime, T input, String action, AtomicInteger count, long now) { public <T> void finish(LocalDateTime endTime, T input, String action, AtomicInteger count,
long now) {
FuelReceiveMockBean bean = (FuelReceiveMockBean) input; FuelReceiveMockBean bean = (FuelReceiveMockBean) input;
LocalDateTime startTime = LocalDateTime.parse(bean.getStartTime(), dateTimeFormat); LocalDateTime startTime = LocalDateTime.parse(bean.getStartTime(), dateTimeFormat);
long minutes = Math.abs(Duration.between(endTime, startTime).toMinutes()); long minutes = Math.abs(Duration.between(endTime, startTime).toMinutes());
@ -147,21 +149,32 @@ public class FuelReceiveMockServiceImpl extends AbtActionMockBase {
FuelCountBean fuelCount = bean.getFuelInfoList().get(0); FuelCountBean fuelCount = bean.getFuelInfoList().get(0);
double total = Double.parseDouble(fuelCount.getCount()); double total = Double.parseDouble(fuelCount.getCount());
if (jarObj instanceof FuelSoftJar) { if (jarObj instanceof FuelSoftJar) {
sendMessage(action_finished_label + "消耗时间:" + Utility.convertTime((int) minutes) + ",接收油量:" + total + acting(endTime,
((FuelSoftJar) jarObj).getJarNo() + "当前油量:" + (((FuelSoftJar) jarObj).getJarCurrentCapacity() + total), action_finished_label + "消耗时间:" + Utility.convertTime((int) minutes) + ",接收油量:"
+ total +
((FuelSoftJar) jarObj).getJarNo() + "当前油量:" + (
((FuelSoftJar) jarObj).getJarCurrentCapacity() + total),
count, count,
now); now,action_finished_label);
} }
if (jarObj instanceof FuelMetalJar) { if (jarObj instanceof FuelMetalJar) {
sendMessage(action_finished_label + "消耗时间:" + Utility.convertTime((int) minutes) + ",接收油量:" + total + acting(endTime,
((FuelMetalJar) jarObj).getJarNo() + "当前油量:" + (((FuelMetalJar) jarObj).getJarCurrentCapacity() + total), action_finished_label + "消耗时间:" + Utility.convertTime((int) minutes) + ",接收油量:"
+ total +
((FuelMetalJar) jarObj).getJarNo() + "当前油量:" + (
((FuelMetalJar) jarObj).getJarCurrentCapacity() + total),
count, count,
now); now,action_finished_label);
} }
} }
private void acting(LocalDateTime arrivedTime, String message,AtomicInteger count,long now,String label) {
MockMessageTip startMessage = MockMessageTip.createMessage(arrivedTime.format(dateTimeFormat), label,
message, 1, count.addAndGet(1) * interValTime + now);
Global.delayQueue.add(startMessage);
}
} }

View File

@ -1,5 +1,7 @@
package com.hshh.nation.mock.service.impl; package com.hshh.nation.mock.service.impl;
import com.hshh.Global;
import com.hshh.nation.common.MockMessageTip;
import com.hshh.nation.common.Utility; import com.hshh.nation.common.Utility;
import com.hshh.nation.fuel.entity.FuelBoat; import com.hshh.nation.fuel.entity.FuelBoat;
import com.hshh.nation.fuel.entity.FuelMetalJar; import com.hshh.nation.fuel.entity.FuelMetalJar;
@ -126,13 +128,13 @@ public class FuelSendMockServiceImpl extends AbtActionMockBase {
startTime = startTime.plusHours(bean.getIntervalTime()); startTime = startTime.plusHours(bean.getIntervalTime());
total = total - amountPerIntervalTime; total = total - amountPerIntervalTime;
already = already + amountPerIntervalTime; already = already + amountPerIntervalTime;
sendMessage(actioning_label + "已发放油量:" + already, count, now); acting(startTime,actioning_label + "已发放油量:" + already, count, now,actioning_label);
} }
if (total >= 0) { if (total >= 0) {
long minutes = (long) (total * 60 / (bean.getWorker() * bean.getPerAmount())); long minutes = (long) (total * 60 / (bean.getWorker() * bean.getPerAmount()));
already = already + total; already = already + total;
startTime = startTime.plusMinutes(minutes); startTime = startTime.plusMinutes(minutes);
sendMessage(actioning_label + "已发放油量:" + already, count, now); acting(startTime,actioning_label + "已发放油量:" + already, count, now,actioning_label);
} }
return startTime; return startTime;
} }
@ -175,8 +177,13 @@ public class FuelSendMockServiceImpl extends AbtActionMockBase {
LocalDateTime.parse(bean.getStartTime(), dateTimeFormat)); LocalDateTime.parse(bean.getStartTime(), dateTimeFormat));
String message = "消耗时间" + ((Utility.convertTime((int) Math.abs(duration.toMinutes())))); String message = "消耗时间" + ((Utility.convertTime((int) Math.abs(duration.toMinutes()))));
message = message + ",油罐剩余" + jarRemain + ",装备当前油量" + equipCurrent; message = message + ",油罐剩余" + jarRemain + ",装备当前油量" + equipCurrent;
sendMessage(message, count, now); acting(endTime,message, count, now,action_finished_label);
} }
private void acting(LocalDateTime arrivedTime, String message,AtomicInteger count,long now,String label) {
MockMessageTip startMessage = MockMessageTip.createMessage(arrivedTime.format(dateTimeFormat), label,
message, 1, count.addAndGet(1) * interValTime + now);
Global.delayQueue.add(startMessage);
}
} }

View File

@ -236,7 +236,7 @@ public class TransportSeaMockServiceImpl extends AbtMockGeneralService implement
String toLocation = bean.getToLocation(); String toLocation = bean.getToLocation();
LocalDateTime startTime = LocalDateTime.parse(bean.getStartTime(), dateTimeFormat); LocalDateTime startTime = LocalDateTime.parse(bean.getStartTime(), dateTimeFormat);
duringLogAndReturnArriveTime(startTime, counter, now, fromLocation, toLocation, bean.getSpeed(), startTime = duringLogAndReturnArriveTime(startTime, counter, now, fromLocation, toLocation, bean.getSpeed(),
bean.getIntervalTime(), ""); bean.getIntervalTime(), "");
return startTime; return startTime;
} }

View File

@ -7,7 +7,7 @@
* Copyright 2018-2023 codecalm.net Paweł Kuna * Copyright 2018-2023 codecalm.net Paweł Kuna
* Licensed under MIT (https://github.com/tabler/tabler/blob/master/LICENSE) * Licensed under MIT (https://github.com/tabler/tabler/blob/master/LICENSE)
--> -->
<html lang="en"> <html lang="zh-CN">
<head> <head>
<meta charset="utf-8"/> <meta charset="utf-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"/> <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"/>
@ -18,6 +18,7 @@
<link th:href="@{/css/tabler-flags.min.css}" rel="stylesheet"/> <link th:href="@{/css/tabler-flags.min.css}" rel="stylesheet"/>
<link th:href="@{/css/tabler-payments.min.css}" rel="stylesheet"/> <link th:href="@{/css/tabler-payments.min.css}" rel="stylesheet"/>
<link th:href="@{/css/tabler-vendors.min.css}" rel="stylesheet"/> <link th:href="@{/css/tabler-vendors.min.css}" rel="stylesheet"/>
<style> <style>
.mermaid { .mermaid {
visibility: hidden; visibility: hidden;
@ -187,7 +188,7 @@
<div class="card-body"> <div class="card-body">
<div class="mb-3 "> <div class="mb-3 ">
<label class="col-6 col-form-label required">行动名称</label> <label class="col-6 col-form-label required" for="actionName">行动名称</label>
<div class="col"> <div class="col">
<input type="text" class="form-control" placeholder="" <input type="text" class="form-control" placeholder=""
value="飞机油料补给行动" value="飞机油料补给行动"
@ -198,7 +199,7 @@
</div> </div>
<div class="mb-4 "> <div class="mb-4 ">
<label class="col-6 col-form-label required">补给方式</label> <label class="col-6 col-form-label required" for="supplyType">补给方式</label>
<div class="col"> <div class="col">
<select class="form-select" name="supplyType" id="supplyType"> <select class="form-select" name="supplyType" id="supplyType">
<option value="">选择</option> <option value="">选择</option>
@ -213,7 +214,7 @@
<div class="mb-3 "> <div class="mb-3 ">
<label class="col-6 col-form-label required">出发地位置</label> <label class="col-6 col-form-label required" for="fromLocation">出发地位置</label>
<div class="col"> <div class="col">
<input type="text" class="form-control" placeholder="" value="127.7700,26.3400" <input type="text" class="form-control" placeholder="" value="127.7700,26.3400"
name="fromLocation" id="fromLocation"/> name="fromLocation" id="fromLocation"/>
@ -222,7 +223,7 @@
</div> </div>
<div class="mb-3 "> <div class="mb-3 ">
<label class="col-6 col-form-label required">目的地位置</label> <label class="col-6 col-form-label required" for="toLocation">目的地位置</label>
<div class="col"> <div class="col">
<input type="text" class="form-control" placeholder="" value="127.0500,37.0600" <input type="text" class="form-control" placeholder="" value="127.0500,37.0600"
name="toLocation" id="toLocation"/> name="toLocation" id="toLocation"/>
@ -231,7 +232,7 @@
</div> </div>
<div class="mb-3 "> <div class="mb-3 ">
<label class="col-6 col-form-label required">补给装备行进速度</label> <label class="col-6 col-form-label required" for="supplySpeed">补给装备行进速度</label>
<div class="col"> <div class="col">
<input type="text" class="form-control" placeholder="" <input type="text" class="form-control" placeholder=""
value="85" value="85"
@ -242,7 +243,7 @@
</div> </div>
<div class="mb-3 "> <div class="mb-3 ">
<label class="col-6 col-form-label required">补给装备加注速度</label> <label class="col-6 col-form-label required" for="supplyPump">补给装备加注速度</label>
<div class="col"> <div class="col">
<input type="text" class="form-control " placeholder="" <input type="text" class="form-control " placeholder=""
value="18" value="18"
@ -253,7 +254,7 @@
</div> </div>
<div class="mb-3 "> <div class="mb-3 ">
<label class="col-6 col-form-label required">计算间隔时间(小时)</label> <label class="col-6 col-form-label required" for="intervalTime">计算间隔时间(小时)</label>
<div class="col"> <div class="col">
<input type="text" class="form-control" placeholder="" value="1" <input type="text" class="form-control" placeholder="" value="1"
name="intervalTime" id="intervalTime"> name="intervalTime" id="intervalTime">
@ -287,10 +288,13 @@
<script th:src="@{/js/common/common.js}"></script> <script th:src="@{/js/common/common.js}"></script>
<script th:src="@{/js/mermaid.min.js}"></script> <script th:src="@{/js/mermaid.min.js}"></script>
<script th:src="@{/js/mock.js}"></script> <script th:src="@{/js/mock.js}"></script>
</body> </body>
</html> </html>
<script> <script>
mermaid.initialize({startOnLoad: false}); mermaid.initialize({startOnLoad: false});
function renderAndShow() { function renderAndShow() {
@ -318,6 +322,5 @@
} }
</script> </script>

View File

@ -19,7 +19,27 @@
<link th:href="@{/css/tabler-payments.min.css}" rel="stylesheet"/> <link th:href="@{/css/tabler-payments.min.css}" rel="stylesheet"/>
<link th:href="@{/css/tabler-vendors.min.css}" rel="stylesheet"/> <link th:href="@{/css/tabler-vendors.min.css}" rel="stylesheet"/>
<link th:href="@{/css/defence.css}" rel="stylesheet"/> <link th:href="@{/css/defence.css}" rel="stylesheet"/>
<style>
table {
border-collapse: collapse;
min-width: 1200px; /* 比容器宽,才会滚动 */
width: 100%;
}
/* 固定最后一列 */
th:last-child,
td:last-child {
position: sticky;
right: 0;
background: #f7fafc;
z-index: 2;
}
/* 可选:加个阴影效果,体验更好 */
th:last-child,
td:last-child {
box-shadow: -2px 0 6px -2px #8882;
}
</style>
</head> </head>
<body> <body>

View File

@ -19,7 +19,27 @@
<link th:href="@{/css/tabler-payments.min.css}" rel="stylesheet"/> <link th:href="@{/css/tabler-payments.min.css}" rel="stylesheet"/>
<link th:href="@{/css/tabler-vendors.min.css}" rel="stylesheet"/> <link th:href="@{/css/tabler-vendors.min.css}" rel="stylesheet"/>
<link th:href="@{/css/defence.css}" rel="stylesheet"/> <link th:href="@{/css/defence.css}" rel="stylesheet"/>
<style>
table {
border-collapse: collapse;
min-width: 1200px; /* 比容器宽,才会滚动 */
width: 100%;
}
/* 固定最后一列 */
th:last-child,
td:last-child {
position: sticky;
right: 0;
background: #f7fafc;
z-index: 2;
}
/* 可选:加个阴影效果,体验更好 */
th:last-child,
td:last-child {
box-shadow: -2px 0 6px -2px #8882;
}
</style>
</head> </head>
<body> <body>

View File

@ -19,7 +19,27 @@
<link th:href="@{/css/tabler-payments.min.css}" rel="stylesheet"/> <link th:href="@{/css/tabler-payments.min.css}" rel="stylesheet"/>
<link th:href="@{/css/tabler-vendors.min.css}" rel="stylesheet"/> <link th:href="@{/css/tabler-vendors.min.css}" rel="stylesheet"/>
<link th:href="@{/css/defence.css}" rel="stylesheet"/> <link th:href="@{/css/defence.css}" rel="stylesheet"/>
<style>
table {
border-collapse: collapse;
min-width: 1200px; /* 比容器宽,才会滚动 */
width: 100%;
}
/* 固定最后一列 */
th:last-child,
td:last-child {
position: sticky;
right: 0;
background: #f7fafc;
z-index: 2;
}
/* 可选:加个阴影效果,体验更好 */
th:last-child,
td:last-child {
box-shadow: -2px 0 6px -2px #8882;
}
</style>
</head> </head>
<body> <body>

View File

@ -20,8 +20,25 @@
<link th:href="@{/css/tabler-vendors.min.css}" rel="stylesheet"/> <link th:href="@{/css/tabler-vendors.min.css}" rel="stylesheet"/>
<link th:href="@{/css/defence.css}" rel="stylesheet"/> <link th:href="@{/css/defence.css}" rel="stylesheet"/>
<style> <style>
table {
border-collapse: collapse;
min-width: 1200px; /* 比容器宽,才会滚动 */
width: 100%;
}
/* 固定最后一列 */
th:last-child,
td:last-child {
position: sticky;
right: 0;
background: #f7fafc;
z-index: 2;
}
/* 可选:加个阴影效果,体验更好 */
th:last-child,
td:last-child {
box-shadow: -2px 0 6px -2px #8882;
}
</style> </style>
</head> </head>

View File

@ -20,6 +20,27 @@
<link th:href="@{/css/tabler-vendors.min.css}" rel="stylesheet"/> <link th:href="@{/css/tabler-vendors.min.css}" rel="stylesheet"/>
<link th:href="@{/css/defence.css}" rel="stylesheet"/> <link th:href="@{/css/defence.css}" rel="stylesheet"/>
<style>
table {
border-collapse: collapse;
min-width: 1200px; /* 比容器宽,才会滚动 */
width: 100%;
}
/* 固定最后一列 */
th:last-child,
td:last-child {
position: sticky;
right: 0;
background: #f7fafc;
z-index: 2;
}
/* 可选:加个阴影效果,体验更好 */
th:last-child,
td:last-child {
box-shadow: -2px 0 6px -2px #8882;
}
</style>
</head> </head>
<body> <body>

View File

@ -19,7 +19,27 @@
<link th:href="@{/css/tabler-payments.min.css}" rel="stylesheet"/> <link th:href="@{/css/tabler-payments.min.css}" rel="stylesheet"/>
<link th:href="@{/css/tabler-vendors.min.css}" rel="stylesheet"/> <link th:href="@{/css/tabler-vendors.min.css}" rel="stylesheet"/>
<link th:href="@{/css/defence.css}" rel="stylesheet"/> <link th:href="@{/css/defence.css}" rel="stylesheet"/>
<style>
table {
border-collapse: collapse;
min-width: 1200px; /* 比容器宽,才会滚动 */
width: 100%;
}
/* 固定最后一列 */
th:last-child,
td:last-child {
position: sticky;
right: 0;
background: #f7fafc;
z-index: 2;
}
/* 可选:加个阴影效果,体验更好 */
th:last-child,
td:last-child {
box-shadow: -2px 0 6px -2px #8882;
}
</style>
</head> </head>
<body> <body>

View File

@ -19,7 +19,27 @@
<link th:href="@{/css/tabler-payments.min.css}" rel="stylesheet"/> <link th:href="@{/css/tabler-payments.min.css}" rel="stylesheet"/>
<link th:href="@{/css/tabler-vendors.min.css}" rel="stylesheet"/> <link th:href="@{/css/tabler-vendors.min.css}" rel="stylesheet"/>
<link th:href="@{/css/defence.css}" rel="stylesheet"/> <link th:href="@{/css/defence.css}" rel="stylesheet"/>
<style>
table {
border-collapse: collapse;
min-width: 1200px; /* 比容器宽,才会滚动 */
width: 100%;
}
/* 固定最后一列 */
th:last-child,
td:last-child {
position: sticky;
right: 0;
background: #f7fafc;
z-index: 2;
}
/* 可选:加个阴影效果,体验更好 */
th:last-child,
td:last-child {
box-shadow: -2px 0 6px -2px #8882;
}
</style>
</head> </head>
<body> <body>

View File

@ -20,6 +20,27 @@
<link th:href="@{/css/tabler-vendors.min.css}" rel="stylesheet"/> <link th:href="@{/css/tabler-vendors.min.css}" rel="stylesheet"/>
<link th:href="@{/css/defence.css}" rel="stylesheet"/> <link th:href="@{/css/defence.css}" rel="stylesheet"/>
<style>
table {
border-collapse: collapse;
min-width: 1200px; /* 比容器宽,才会滚动 */
width: 100%;
}
/* 固定最后一列 */
th:last-child,
td:last-child {
position: sticky;
right: 0;
background: #f7fafc;
z-index: 2;
}
/* 可选:加个阴影效果,体验更好 */
th:last-child,
td:last-child {
box-shadow: -2px 0 6px -2px #8882;
}
</style>
</head> </head>
<body> <body>

View File

@ -19,6 +19,27 @@
<link th:href="@{/css/tabler-payments.min.css}" rel="stylesheet"/> <link th:href="@{/css/tabler-payments.min.css}" rel="stylesheet"/>
<link th:href="@{/css/tabler-vendors.min.css}" rel="stylesheet"/> <link th:href="@{/css/tabler-vendors.min.css}" rel="stylesheet"/>
<link th:href="@{/css/defence.css}" rel="stylesheet"/> <link th:href="@{/css/defence.css}" rel="stylesheet"/>
<style>
table {
border-collapse: collapse;
min-width: 1200px; /* 比容器宽,才会滚动 */
width: 100%;
}
/* 固定最后一列 */
th:last-child,
td:last-child {
position: sticky;
right: 0;
background: #f7fafc;
z-index: 2;
}
/* 可选:加个阴影效果,体验更好 */
th:last-child,
td:last-child {
box-shadow: -2px 0 6px -2px #8882;
}
</style>
</head> </head>
<body> <body>

View File

@ -18,7 +18,27 @@
<link th:href="@{/css/tabler-flags.min.css}" rel="stylesheet"/> <link th:href="@{/css/tabler-flags.min.css}" rel="stylesheet"/>
<link th:href="@{/css/tabler-payments.min.css}" rel="stylesheet"/> <link th:href="@{/css/tabler-payments.min.css}" rel="stylesheet"/>
<link th:href="@{/css/tabler-vendors.min.css}" rel="stylesheet"/> <link th:href="@{/css/tabler-vendors.min.css}" rel="stylesheet"/>
<style>
table {
border-collapse: collapse;
min-width: 1200px; /* 比容器宽,才会滚动 */
width: 100%;
}
/* 固定最后一列 */
th:last-child,
td:last-child {
position: sticky;
right: 0;
background: #f7fafc;
z-index: 2;
}
/* 可选:加个阴影效果,体验更好 */
th:last-child,
td:last-child {
box-shadow: -2px 0 6px -2px #8882;
}
</style>
</head> </head>
<body> <body>

View File

@ -18,7 +18,27 @@
<link th:href="@{/css/tabler-flags.min.css}" rel="stylesheet"/> <link th:href="@{/css/tabler-flags.min.css}" rel="stylesheet"/>
<link th:href="@{/css/tabler-payments.min.css}" rel="stylesheet"/> <link th:href="@{/css/tabler-payments.min.css}" rel="stylesheet"/>
<link th:href="@{/css/tabler-vendors.min.css}" rel="stylesheet"/> <link th:href="@{/css/tabler-vendors.min.css}" rel="stylesheet"/>
<style>
table {
border-collapse: collapse;
min-width: 1200px; /* 比容器宽,才会滚动 */
width: 100%;
}
/* 固定最后一列 */
th:last-child,
td:last-child {
position: sticky;
right: 0;
background: #f7fafc;
z-index: 2;
}
/* 可选:加个阴影效果,体验更好 */
th:last-child,
td:last-child {
box-shadow: -2px 0 6px -2px #8882;
}
</style>
</head> </head>
<body> <body>

View File

@ -19,7 +19,27 @@
<link th:href="@{/css/tabler-payments.min.css}" rel="stylesheet"/> <link th:href="@{/css/tabler-payments.min.css}" rel="stylesheet"/>
<link th:href="@{/css/tabler-vendors.min.css}" rel="stylesheet"/> <link th:href="@{/css/tabler-vendors.min.css}" rel="stylesheet"/>
<link th:href="@{/css/defence.css}" rel="stylesheet"/> <link th:href="@{/css/defence.css}" rel="stylesheet"/>
<style>
table {
border-collapse: collapse;
min-width: 1200px; /* 比容器宽,才会滚动 */
width: 100%;
}
/* 固定最后一列 */
th:last-child,
td:last-child {
position: sticky;
right: 0;
background: #f7fafc;
z-index: 2;
}
/* 可选:加个阴影效果,体验更好 */
th:last-child,
td:last-child {
box-shadow: -2px 0 6px -2px #8882;
}
</style>
</head> </head>
<body> <body>

View File

@ -19,7 +19,27 @@
<link th:href="@{/css/tabler-payments.min.css}" rel="stylesheet"/> <link th:href="@{/css/tabler-payments.min.css}" rel="stylesheet"/>
<link th:href="@{/css/tabler-vendors.min.css}" rel="stylesheet"/> <link th:href="@{/css/tabler-vendors.min.css}" rel="stylesheet"/>
<link th:href="@{/css/defence.css}" rel="stylesheet"/> <link th:href="@{/css/defence.css}" rel="stylesheet"/>
<style>
table {
border-collapse: collapse;
min-width: 1200px; /* 比容器宽,才会滚动 */
width: 100%;
}
/* 固定最后一列 */
th:last-child,
td:last-child {
position: sticky;
right: 0;
background: #f7fafc;
z-index: 2;
}
/* 可选:加个阴影效果,体验更好 */
th:last-child,
td:last-child {
box-shadow: -2px 0 6px -2px #8882;
}
</style>
</head> </head>
<body> <body>

View File

@ -19,7 +19,27 @@
<link th:href="@{/css/tabler-payments.min.css}" rel="stylesheet"/> <link th:href="@{/css/tabler-payments.min.css}" rel="stylesheet"/>
<link th:href="@{/css/tabler-vendors.min.css}" rel="stylesheet"/> <link th:href="@{/css/tabler-vendors.min.css}" rel="stylesheet"/>
<link th:href="@{/css/defence.css}" rel="stylesheet"/> <link th:href="@{/css/defence.css}" rel="stylesheet"/>
<style>
table {
border-collapse: collapse;
min-width: 1200px; /* 比容器宽,才会滚动 */
width: 100%;
}
/* 固定最后一列 */
th:last-child,
td:last-child {
position: sticky;
right: 0;
background: #f7fafc;
z-index: 2;
}
/* 可选:加个阴影效果,体验更好 */
th:last-child,
td:last-child {
box-shadow: -2px 0 6px -2px #8882;
}
</style>
</head> </head>
<body> <body>

View File

@ -19,7 +19,27 @@
<link th:href="@{/css/tabler-payments.min.css}" rel="stylesheet"/> <link th:href="@{/css/tabler-payments.min.css}" rel="stylesheet"/>
<link th:href="@{/css/tabler-vendors.min.css}" rel="stylesheet"/> <link th:href="@{/css/tabler-vendors.min.css}" rel="stylesheet"/>
<link th:href="@{/css/defence.css}" rel="stylesheet"/> <link th:href="@{/css/defence.css}" rel="stylesheet"/>
<style>
table {
border-collapse: collapse;
min-width: 1200px; /* 比容器宽,才会滚动 */
width: 100%;
}
/* 固定最后一列 */
th:last-child,
td:last-child {
position: sticky;
right: 0;
background: #f7fafc;
z-index: 2;
}
/* 可选:加个阴影效果,体验更好 */
th:last-child,
td:last-child {
box-shadow: -2px 0 6px -2px #8882;
}
</style>
</head> </head>
<body> <body>

View File

@ -19,7 +19,27 @@
<link th:href="@{/css/tabler-payments.min.css}" rel="stylesheet"/> <link th:href="@{/css/tabler-payments.min.css}" rel="stylesheet"/>
<link th:href="@{/css/tabler-vendors.min.css}" rel="stylesheet"/> <link th:href="@{/css/tabler-vendors.min.css}" rel="stylesheet"/>
<link th:href="@{/css/defence.css}" rel="stylesheet"/> <link th:href="@{/css/defence.css}" rel="stylesheet"/>
<style>
table {
border-collapse: collapse;
min-width: 1200px; /* 比容器宽,才会滚动 */
width: 100%;
}
/* 固定最后一列 */
th:last-child,
td:last-child {
position: sticky;
right: 0;
background: #f7fafc;
z-index: 2;
}
/* 可选:加个阴影效果,体验更好 */
th:last-child,
td:last-child {
box-shadow: -2px 0 6px -2px #8882;
}
</style>
</head> </head>
<body> <body>

View File

@ -316,25 +316,16 @@
</script> </script>
</div> <!-- 油品类别2---> </div> <!-- 油品类别2--->
<div th:fragment="fuel_startTime_dialog" id="_fuel_startTime_dialog"> <div th:fragment="fuel_startTime_dialog" id="_fuel_startTime_dialog">
<script th:src="@{/libs/flatpickr/flatpickr.js}"></script>
<script th:src="@{/libs/flatpickr/zh.js}"></script>
<div class="mb-3 "> <div class="mb-3 ">
<label class="col-6 col-form-label required">开始时间</label> <label class="col-6 col-form-label required" for="startTime">开始时间</label>
<div class="col"> <div class="col">
<input type="text" class="form-control" placeholder="" value="" id="startTime" name="startTime" <input type="text" name="startTime" id="startTime" class="form-control" data-mask-visible="true" th:value="${now}" autocomplete="off">
th:value="${now}">
<div class="invalid-feedback" id="startTime_error_tip"></div> <div class="invalid-feedback" id="startTime_error_tip"></div>
</div> </div>
</div> </div>
<script>
flatpickr("#startTime", {
enableTime: true,
time_24hr: true,
dateFormat: "Y-m-d H:i:S",
locale: "zh" // 启用中文
});
</script>
</div> <!-- 时间片段---> </div> <!-- 时间片段--->
<div th:fragment="fuel_equip_dialog" id="_fuel_equip_dialog"> <div th:fragment="fuel_equip_dialog" id="_fuel_equip_dialog">
<div class="mb-3 row"> <div class="mb-3 row">