八项作业统一修改时间选择到秒级

main
hs 2025-09-02 08:43:05 +08:00
parent c75dfba154
commit ae49b49153
47 changed files with 986 additions and 500 deletions

380
assets/map/index.html Normal file
View File

@ -0,0 +1,380 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<title>特殊作业扎点</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="viewport" content="initial-scale=1.0, user-scalable=no">
<meta http-equiv="X-UA-Compatible" content="IE=Edge">
<style>
body, html, #container {
overflow: hidden;
width: 100%;
height: 100%;
margin: 0;
font-family: "微软雅黑";
}
#hint {
position: absolute;
z-index: 9999;
left: 10px;
top: 10px;
padding: 6px 10px;
background: rgba(255,255,255,0.9);
border-radius: 4px;
font-size: 12px;
}
</style>
<!-- Baidu Map WebGL (保留你的 key) -->
<script type="text/javascript"
src="https://api.map.baidu.com/api?v=1.0&type=webgl&ak=OElqFYoKiAH8KFtph8ftLKF5NlNrbCUr"></script>
<script src="./uni.webview.1.5.4.js"></script>
</head>
<body onload="onLoad()">
<div id="container"></div>
<div id="hint" style="display:none"></div>
</body>
<script>
// 地图与数据容器
var map = null;
var marker = null;
var GSON_LON_LAT_WSG84 = []; // WGS84 多点 [[lon,lat,alt], ...]
var GSON_LON_LAT_BD09 = []; // 转换后的 BD09 二维点 [[lng,lat],...]
var convertor = null;
// ---------------------------
// 通用通知宿主Flutter / 原生 / web
// 会尝试多种桥接方式
// data 可以是对象或字符串
// ---------------------------
function notifyHost(data) {
try {
// prefer passing object where supported
if (window.JS && typeof window.JS.postMessage === 'function') {
// webview_flutter JavaScriptChannel expects string
var payload = (typeof data === 'string') ? data : JSON.stringify(data);
window.JS.postMessage(payload);
return;
}
if (window.flutter_inappwebview && typeof window.flutter_inappwebview.callHandler === 'function') {
// flutter_inappwebview can accept objects
window.flutter_inappwebview.callHandler('messageHandler', data);
return;
}
if (window.webkit && window.webkit.messageHandlers && window.webkit.messageHandlers.JS && typeof window.webkit.messageHandlers.JS.postMessage === 'function') {
window.webkit.messageHandlers.JS.postMessage(data);
return;
}
// fallback to uni (if present) to keep backward compatibility
if (window.uni && typeof window.uni.postMessage === 'function') {
window.uni.postMessage({data: data});
return;
}
// last resort, console (useful for debugging)
console.log('notifyHost:', data);
} catch (e) {
console.error('notifyHost error:', e);
}
}
// ---------------------------
// 尝试从 URL 初始化(如果 Flutter 把参数拼在 URL 上)
// 支持参数: longitude, latitude, GSON (JSON string, 已 encodeURIComponent)
// ---------------------------
function tryInitFromUrl() {
try {
const params = new URLSearchParams(window.location.search);
const lon = params.get('longitude');
const lat = params.get('latitude');
const gsonRaw = params.get('GSON'); // 预期是 encodeURIComponent(JSON.stringify([...]))
var has = false;
if (lon && lat) has = true;
if (gsonRaw) has = true;
if (!has) return false;
var gson = null;
if (gsonRaw) {
try {
gson = JSON.parse(decodeURIComponent(gsonRaw));
} catch (e) {
// 如果直接是未 encode 的 JSON 字符串,也尝试解析
try { gson = JSON.parse(gsonRaw); } catch (e2) { gson = null; }
}
}
// 使用从 url 获取到的数据执行初始化
initWithData({
longitude: parseFloat(lon),
latitude: parseFloat(lat),
GSON: gson
});
return true;
} catch (e) {
console.warn('tryInitFromUrl error', e);
return false;
}
}
// ---------------------------
// Flutter/宿主可调用的初始化函数
// 支持两种调用方式:
// 1) initWithData({longitude: xx, latitude: yy, GSON: [...]})
// 2) initWithData(longitude, latitude, GSONArray)
// GSONArray 结构应与原来一致([[lon,lat,alt], ...]
// ---------------------------
window.initWithData = function() {
var args = arguments;
var payload = {};
if (args.length === 1 && typeof args[0] === 'object') {
payload = args[0];
} else {
// try positional
payload.longitude = args[0];
payload.latitude = args[1];
payload.GSON = args[2];
}
try {
if (!payload) payload = {};
// default safe parse
var lon = Number(payload.longitude) || 0;
var lat = Number(payload.latitude) || 0;
var gson = payload.GSON || [];
// ensure convertor exists
if (!convertor && window.BMapGL && typeof BMapGL.Convertor === 'function') {
convertor = new BMapGL.Convertor();
}
// set global wgs84 list (if provided)
if (Array.isArray(gson) && gson.length > 0) {
GSON_LON_LAT_WSG84 = gson;
}
// init map & polygon
fnInitMap(lon, lat);
if (GSON_LON_LAT_WSG84 && GSON_LON_LAT_WSG84.length > 0) {
fnInitConvertorData(GSON_LON_LAT_WSG84);
}
showHint('地图已初始化');
return true;
} catch (e) {
console.error('initWithData error', e);
return false;
}
};
// 显示调试提示
function showHint(text) {
var el = document.getElementById('hint');
if (!el) return;
el.style.display = 'block';
el.innerText = text;
setTimeout(function(){ el.style.display = 'none'; }, 4000);
}
// ---------------------------
// 页面加载
// ---------------------------
function onLoad() {
// create convertor if possible
if (window.BMapGL && typeof BMapGL.Convertor === 'function') {
convertor = new BMapGL.Convertor();
} else {
console.warn('BMapGL.Convertor not ready yet.');
}
// 创建地图对象(延迟绑定 center等 init 时调用)
map = new BMapGL.Map('container');
map.enableScrollWheelZoom(true);
map.setDisplayOptions({ building: false });
map.addEventListener('click', MapClick);
// 如果 URL 带参数则自动初始化,否则等待宿主调用 initWithData(...)
var ok = tryInitFromUrl();
if (!ok) {
showHint('等待宿主调用 initWithData(...) 初始化地图');
}
}
// ---------------------------
// 点在多边形内判定(二维,只用 lon/lat
// polygon = [[lng,lat], ...]
// point = [lng, lat]
// ---------------------------
function isPointInPolygon(point, polygon) {
const x = point[0];
const y = point[1];
let inside = false;
for (let i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {
const xi = polygon[i][0], yi = polygon[i][1];
const xj = polygon[j][0], yj = polygon[j][1];
const intersect = ((yi > y) !== (yj > y))
&& (x < (xj - xi) * (y - yi) / (yj - yi) + xi);
if (intersect) inside = !inside;
}
return inside;
}
// 地图点击处理
function MapClick(e) {
try {
if (marker) map.removeOverlay(marker);
marker = new BMapGL.Marker(new BMapGL.Point(e.latlng.lng, e.latlng.lat));
const x = [e.latlng.lng, e.latlng.lat];
let inside = (GSON_LON_LAT_BD09 && GSON_LON_LAT_BD09.length > 0) ? isPointInPolygon(x, GSON_LON_LAT_BD09) : true;
if (!inside) {
//alert("当前选择点位不在区域中!");
notifyHost({type:'point_selected', ok:false, reason:'out_of_polygon', lng:e.latlng.lng, lat:e.latlng.lat});
} else {
map.addOverlay(marker);
// 把 BD09 -> WGS84 转换后的点回传给宿主
fnConvertorBd09ToWgs84Data2(e.latlng.lng, e.latlng.lat);
notifyHost({type:'point_selected', ok:true, lng:e.latlng.lng, lat:e.latlng.lat});
}
} catch (err) {
console.error('MapClick error', err);
}
}
// ---------------------------
// 将 WGS84 多点转换为 BD09 并绘制多边形
// arr: [[lon,lat,...], ...] 注意原 arr GSON_LON_LAT_WSG84顺序是 lon, lat
// ---------------------------
function fnInitConvertorData(arr) {
try {
if (!convertor) convertor = new BMapGL.Convertor();
var points = [];
for (let i = 0; i < arr.length; i++) {
var xi = arr[i][0], yi = arr[i][1];
points.push(new BMapGL.Point(xi, yi));
}
convertor.translate(points, 1, 5, function(res) {
if (!res || !res.points) {
console.warn('convertor.translate returned no points', res);
return;
}
GSON_LON_LAT_BD09 = [];
var list = [];
for (var p = 0; p < res.points.length; p++) {
let item = res.points[p];
GSON_LON_LAT_BD09.push([item.lng, item.lat]);
list.push(new BMapGL.Point(item.lng, item.lat));
}
var polygon = new BMapGL.Polygon(list, {
zIndex: 999,
strokeColor: 'blue',
strokeWeight: 5,
strokeOpacity: 0.5
});
map.addOverlay(polygon);
});
} catch (e) {
console.error('fnInitConvertorData error', e);
}
}
// ---------------------------
// 初始化地图中心longitude, latitude 为 WGS84
// ---------------------------
function fnInitMap(longitude, latitude) {
try {
if (!convertor) convertor = new BMapGL.Convertor();
var ponits = [ new BMapGL.Point(longitude, latitude) ];
convertor.translate(ponits, 1, 5, function(res) {
if (!res || !res.points || res.points.length === 0) {
console.warn('fnInitMap: translate failed', res);
return;
}
var pt = res.points[0];
map.centerAndZoom(new BMapGL.Point(pt.lng, pt.lat), 18);
});
} catch (e) {
console.error('fnInitMap error', e);
}
}
// ---------------------------
// BD09 -> WGS84 JS 版算法),并把结果 post 给宿主
// 注意: bdLat, bdLon 参数顺序(原函数输入顺序)
// 返回 [wgsLat, wgsLon](跟原实现一致)
// ---------------------------
const bd09ToWgs84 = (bdLat, bdLon) => {
const x_pi = (Math.PI * 3000.0) / 180.0;
const x = bdLon - 0.0065;
const y = bdLat - 0.006;
const z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * x_pi);
const theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * x_pi);
const gcjLon = z * Math.cos(theta);
const gcjLat = z * Math.sin(theta);
let dlat = transformlat(gcjLon - 105.0, gcjLat - 35.0);
let dlng = transformlng(gcjLon - 105.0, gcjLat - 35.0);
const radlat = (gcjLat / 180.0) * Math.PI;
let magic = Math.sin(radlat);
magic = 1 - 0.006693421622965943 * magic * magic;
const sqrtmagic = Math.sqrt(magic);
dlat = (dlat * 180.0) / (((6378245.0 * (1 - 0.006693421622965943)) / (magic * sqrtmagic)) * Math.PI);
dlng = (dlng * 180.0) / ((6378245.0 / sqrtmagic) * Math.cos(radlat) * Math.PI);
const mglat = gcjLat + dlat;
const mglng = gcjLon + dlng;
const wgsLon = gcjLon * 2 - mglng;
const wgsLat = gcjLat * 2 - mglat;
return [wgsLat, wgsLon];
};
const transformlat = (lng, lat) => {
let ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + 0.1 * lng * lat + 0.2 * Math.sqrt(Math.abs(lng));
ret += ((20.0 * Math.sin(6.0 * lng * Math.PI) + 20.0 * Math.sin(2.0 * lng * Math.PI)) * 2.0) / 3.0;
ret += ((20.0 * Math.sin(lat * Math.PI) + 40.0 * Math.sin((lat / 3.0) * Math.PI)) * 2.0) / 3.0;
ret += ((160.0 * Math.sin((lat / 12.0) * Math.PI) + 320 * Math.sin((lat * Math.PI) / 30.0)) * 2.0) / 3.0;
return ret;
};
const transformlng = (lng, lat) => {
let ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + 0.1 * lng * lat + 0.1 * Math.sqrt(Math.abs(lng));
ret += ((20.0 * Math.sin(6.0 * lng * Math.PI) + 20.0 * Math.sin(2.0 * lng * Math.PI)) * 2.0) / 3.0;
ret += ((20.0 * Math.sin(lng * Math.PI) + 40.0 * Math.sin((lng / 3.0) * Math.PI)) * 2.0) / 3.0;
ret += ((150.0 * Math.sin((lng / 12.0) * Math.PI) + 300.0 * Math.sin((lng / 30.0) * Math.PI)) * 2.0) / 3.0;
return ret;
};
// ---------------------------
// 使用百度 convertor如果可用把 BD09 点转回 WGS84 并 postMessage 给宿主
// 备用:也会调用 bd09ToWgs84 本地算法
// ---------------------------
function fnConvertorBd09ToWgs84Data2(lng, lat) {
try {
// first try convertor.translate from BMapGL
if (convertor && typeof convertor.translate === 'function') {
var pts = [ new BMapGL.Point(lng, lat) ];
convertor.translate(pts, 5, 1, function(res) {
if (res && res.points && res.points.length > 0) {
var p = res.points[0];
// res.points are in WGS84? depends on convert params; keep compatibility:
notifyHost({type:'converted', longitue: p.lng, latitude: p.lat});
return;
}
// fallback to local algorithm if convertor result absent
var w = bd09ToWgs84(lat, lng);
notifyHost({type:'converted', longitue: w[1], latitude: w[0]});
});
} else {
var w = bd09ToWgs84(lat, lng);
notifyHost({type:'converted', longitue: w[1], latitude: w[0]});
}
} catch (e) {
console.error('fnConvertorBd09ToWgs84Data2 error', e);
var w = bd09ToWgs84(lat, lng);
notifyHost({type:'converted', longitue: w[1], latitude: w[0]});
}
}
// 兼容老方法名
window.fnInitMap = fnInitMap;
window.fnInitConvertorData = fnInitConvertorData;
window.fnConvertorBd09ToWgs84Data2 = fnConvertorBd09ToWgs84Data2;
</script>
</html>

View File

@ -4,22 +4,22 @@ import 'package:flutter/material.dart';
/// ///
/// DateTime? picked = await BottomDateTimePicker.showDate( /// DateTime? picked = await BottomDateTimePicker.showDate(
/// context, /// context,
/// mode: BottomPickerMode.date, // BottomPickerMode.dateTime /// mode: BottomPickerMode.date, // BottomPickerMode.dateTime BottomPickerMode.dateTimeWithSeconds
/// allowFuture: true, /// allowFuture: true,
/// allowPast: false, // false /// allowPast: false, // false
/// minTimeStr: '2025-08-20 08:30', /// minTimeStr: '2025-08-20 08:30:45',
/// ); /// );
/// if (picked != null) { /// if (picked != null) {
/// print('用户选择的时间:$picked'); /// print('用户选择的时间:$picked');
/// } /// }
enum BottomPickerMode { dateTime, date } enum BottomPickerMode { dateTime, date, dateTimeWithSeconds }
class BottomDateTimePicker { class BottomDateTimePicker {
static Future<DateTime?> showDate( static Future<DateTime?> showDate(
BuildContext context, { BuildContext context, {
bool allowFuture = true, bool allowFuture = true,
bool allowPast = true, // bool allowPast = true, //
String? minTimeStr, // 'yyyy-MM-dd HH:mm' String? minTimeStr, // 'yyyy-MM-dd HH:mm:ss'
BottomPickerMode mode = BottomPickerMode.dateTime, BottomPickerMode mode = BottomPickerMode.dateTime,
}) { }) {
return showModalBottomSheet<DateTime>( return showModalBottomSheet<DateTime>(
@ -65,6 +65,7 @@ class _InlineDateTimePickerContentState
final List<int> months = List.generate(12, (i) => i + 1); final List<int> months = List.generate(12, (i) => i + 1);
final List<int> hours = List.generate(24, (i) => i); final List<int> hours = List.generate(24, (i) => i);
final List<int> minutes = List.generate(60, (i) => i); final List<int> minutes = List.generate(60, (i) => i);
final List<int> seconds = List.generate(60, (i) => i); //
// //
late List<int> days; late List<int> days;
@ -75,6 +76,7 @@ class _InlineDateTimePickerContentState
late FixedExtentScrollController dayCtrl; late FixedExtentScrollController dayCtrl;
late FixedExtentScrollController hourCtrl; late FixedExtentScrollController hourCtrl;
late FixedExtentScrollController minuteCtrl; late FixedExtentScrollController minuteCtrl;
late FixedExtentScrollController secondCtrl; //
// //
late int selectedYear; late int selectedYear;
@ -82,6 +84,7 @@ class _InlineDateTimePickerContentState
late int selectedDay; late int selectedDay;
late int selectedHour; late int selectedHour;
late int selectedMinute; late int selectedMinute;
late int selectedSecond; //
DateTime? _minTime; // DateTime? _minTime; //
@ -111,16 +114,21 @@ class _InlineDateTimePickerContentState
} }
} }
// date //
if (widget.mode == BottomPickerMode.date) { if (widget.mode == BottomPickerMode.date) {
initial = DateTime(initial.year, initial.month, initial.day); initial = DateTime(initial.year, initial.month, initial.day);
} else if (widget.mode == BottomPickerMode.dateTime) {
initial = DateTime(initial.year, initial.month, initial.day,
initial.hour, initial.minute);
} }
// dateTimeWithSeconds
selectedYear = initial.year; selectedYear = initial.year;
selectedMonth = initial.month; selectedMonth = initial.month;
selectedDay = initial.day; selectedDay = initial.day;
selectedHour = initial.hour; selectedHour = initial.hour;
selectedMinute = initial.minute; selectedMinute = initial.minute;
selectedSecond = initial.second;
// //
days = _getDaysInMonth(selectedYear, selectedMonth); days = _getDaysInMonth(selectedYear, selectedMonth);
@ -136,6 +144,8 @@ class _InlineDateTimePickerContentState
initialItem: selectedHour.clamp(0, hours.length - 1)); initialItem: selectedHour.clamp(0, hours.length - 1));
minuteCtrl = FixedExtentScrollController( minuteCtrl = FixedExtentScrollController(
initialItem: selectedMinute.clamp(0, minutes.length - 1)); initialItem: selectedMinute.clamp(0, minutes.length - 1));
secondCtrl = FixedExtentScrollController( //
initialItem: selectedSecond.clamp(0, seconds.length - 1));
// minTime / // minTime /
WidgetsBinding.instance.addPostFrameCallback((_) { WidgetsBinding.instance.addPostFrameCallback((_) {
@ -149,7 +159,7 @@ class _InlineDateTimePickerContentState
return List.generate(lastDay, (i) => i + 1); return List.generate(lastDay, (i) => i + 1);
} }
// 'yyyy-MM-dd HH:mm' DateTime null // 'yyyy-MM-dd HH:mm:ss' DateTime null
DateTime? _parseMinTime(String? s) { DateTime? _parseMinTime(String? s) {
if (s == null || s.trim().isEmpty) return null; if (s == null || s.trim().isEmpty) return null;
try { try {
@ -159,13 +169,14 @@ class _InlineDateTimePickerContentState
parts[0].split('-').map((e) => int.parse(e)).toList(); parts[0].split('-').map((e) => int.parse(e)).toList();
final timeParts = (parts.length > 1) final timeParts = (parts.length > 1)
? parts[1].split(':').map((e) => int.parse(e)).toList() ? parts[1].split(':').map((e) => int.parse(e)).toList()
: [0, 0]; : [0, 0, 0];
final year = dateParts[0]; final year = dateParts[0];
final month = dateParts[1]; final month = dateParts[1];
final day = dateParts[2]; final day = dateParts[2];
final hour = (timeParts.isNotEmpty) ? timeParts[0] : 0; final hour = (timeParts.isNotEmpty) ? timeParts[0] : 0;
final minute = (timeParts.length > 1) ? timeParts[1] : 0; final minute = (timeParts.length > 1) ? timeParts[1] : 0;
return DateTime(year, month, day, hour, minute); final second = (timeParts.length > 2) ? timeParts[2] : 0;
return DateTime(year, month, day, hour, minute, second);
} catch (e) { } catch (e) {
debugPrint('parseMinTime failed for "$s": $e'); debugPrint('parseMinTime failed for "$s": $e');
return null; return null;
@ -190,30 +201,51 @@ class _InlineDateTimePickerContentState
void _enforceConstraintsAndUpdateControllers() { void _enforceConstraintsAndUpdateControllers() {
final now = DateTime.now(); final now = DateTime.now();
final isDateOnly = widget.mode == BottomPickerMode.date; final isDateOnly = widget.mode == BottomPickerMode.date;
final isDateTimeOnly = widget.mode == BottomPickerMode.dateTime;
final DateTime picked = isDateOnly DateTime picked;
? DateTime(selectedYear, selectedMonth, selectedDay) if (isDateOnly) {
: DateTime( picked = DateTime(selectedYear, selectedMonth, selectedDay);
selectedYear, selectedMonth, selectedDay, selectedHour, selectedMinute); } else if (isDateTimeOnly) {
picked = DateTime(
selectedYear, selectedMonth, selectedDay, selectedHour, selectedMinute);
} else {
picked = DateTime(selectedYear, selectedMonth, selectedDay,
selectedHour, selectedMinute, selectedSecond);
}
// _minTime allowPast // _minTime allowPast
DateTime? minRef; DateTime? minRef;
if (!widget.allowPast) { if (!widget.allowPast) {
// now 00:00 // now 00:00
minRef = isDateOnly if (isDateOnly) {
? DateTime(now.year, now.month, now.day) minRef = DateTime(now.year, now.month, now.day);
: now; } else if (isDateTimeOnly) {
minRef = DateTime(now.year, now.month, now.day, now.hour, now.minute);
} else {
minRef = now;
}
// _minTime now _minTime // _minTime now _minTime
if (_minTime != null && _minTime!.isAfter(minRef)) { if (_minTime != null && _minTime!.isAfter(minRef)) {
minRef = isDateOnly minRef = _minTime;
? DateTime(_minTime!.year, _minTime!.month, _minTime!.day) //
: _minTime; if (isDateOnly) {
minRef = DateTime(minRef!.year, minRef.month, minRef.day);
} else if (isDateTimeOnly) {
minRef = DateTime(minRef!.year, minRef.month, minRef.day,
minRef.hour, minRef.minute);
}
} }
} else if (_minTime != null) { } else if (_minTime != null) {
// _minTime _minTime // _minTime _minTime
minRef = isDateOnly minRef = _minTime;
? DateTime(_minTime!.year, _minTime!.month, _minTime!.day) //
: _minTime; if (isDateOnly) {
minRef = DateTime(minRef!.year, minRef.month, minRef.day);
} else if (isDateTimeOnly) {
minRef = DateTime(minRef!.year, minRef.month, minRef.day,
minRef.hour, minRef.minute);
}
} }
if (minRef != null && picked.isBefore(minRef)) { if (minRef != null && picked.isBefore(minRef)) {
@ -224,9 +256,15 @@ class _InlineDateTimePickerContentState
if (!isDateOnly) { if (!isDateOnly) {
selectedHour = minRef.hour; selectedHour = minRef.hour;
selectedMinute = minRef.minute; selectedMinute = minRef.minute;
if (!isDateTimeOnly) {
selectedSecond = minRef.second;
} else {
selectedSecond = 0;
}
} else { } else {
selectedHour = 0; selectedHour = 0;
selectedMinute = 0; selectedMinute = 0;
selectedSecond = 0;
} }
_updateDays(jumpDay: false); _updateDays(jumpDay: false);
@ -236,15 +274,24 @@ class _InlineDateTimePickerContentState
if (!isDateOnly) { if (!isDateOnly) {
hourCtrl.jumpToItem(selectedHour); hourCtrl.jumpToItem(selectedHour);
minuteCtrl.jumpToItem(selectedMinute); minuteCtrl.jumpToItem(selectedMinute);
if (!isDateTimeOnly) {
secondCtrl.jumpToItem(selectedSecond);
}
} }
return; return;
} }
// allowFuture == false // allowFuture == false
if (!widget.allowFuture) { if (!widget.allowFuture) {
final DateTime nowRef = isDateOnly DateTime nowRef;
? DateTime(now.year, now.month, now.day) if (isDateOnly) {
: now; nowRef = DateTime(now.year, now.month, now.day);
} else if (isDateTimeOnly) {
nowRef = DateTime(now.year, now.month, now.day, now.hour, now.minute);
} else {
nowRef = now;
}
if (picked.isAfter(nowRef)) { if (picked.isAfter(nowRef)) {
selectedYear = nowRef.year; selectedYear = nowRef.year;
selectedMonth = nowRef.month; selectedMonth = nowRef.month;
@ -252,9 +299,15 @@ class _InlineDateTimePickerContentState
if (!isDateOnly) { if (!isDateOnly) {
selectedHour = nowRef.hour; selectedHour = nowRef.hour;
selectedMinute = nowRef.minute; selectedMinute = nowRef.minute;
if (!isDateTimeOnly) {
selectedSecond = nowRef.second;
} else {
selectedSecond = 0;
}
} else { } else {
selectedHour = 0; selectedHour = 0;
selectedMinute = 0; selectedMinute = 0;
selectedSecond = 0;
} }
_updateDays(jumpDay: false); _updateDays(jumpDay: false);
@ -264,6 +317,9 @@ class _InlineDateTimePickerContentState
if (!isDateOnly) { if (!isDateOnly) {
hourCtrl.jumpToItem(selectedHour); hourCtrl.jumpToItem(selectedHour);
minuteCtrl.jumpToItem(selectedMinute); minuteCtrl.jumpToItem(selectedMinute);
if (!isDateTimeOnly) {
secondCtrl.jumpToItem(selectedSecond);
}
} }
return; return;
} }
@ -277,14 +333,20 @@ class _InlineDateTimePickerContentState
dayCtrl.dispose(); dayCtrl.dispose();
hourCtrl.dispose(); hourCtrl.dispose();
minuteCtrl.dispose(); minuteCtrl.dispose();
secondCtrl.dispose(); //
super.dispose(); super.dispose();
} }
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final isDateOnly = widget.mode == BottomPickerMode.date; final isDateOnly = widget.mode == BottomPickerMode.date;
final isDateTimeOnly = widget.mode == BottomPickerMode.dateTime;
//
final height = isDateOnly ? 280 : (isDateTimeOnly ? 330 : 380);
return SizedBox( return SizedBox(
height: isDateOnly ? 280 : 330, height: height.toDouble(),
child: Column( child: Column(
children: [ children: [
// //
@ -299,15 +361,27 @@ class _InlineDateTimePickerContentState
), ),
TextButton( TextButton(
onPressed: () { onPressed: () {
final result = isDateOnly DateTime result;
? DateTime(selectedYear, selectedMonth, selectedDay) if (isDateOnly) {
: DateTime( result = DateTime(selectedYear, selectedMonth, selectedDay);
selectedYear, } else if (isDateTimeOnly) {
selectedMonth, result = DateTime(
selectedDay, selectedYear,
selectedHour, selectedMonth,
selectedMinute, selectedDay,
); selectedHour,
selectedMinute,
);
} else {
result = DateTime(
selectedYear,
selectedMonth,
selectedDay,
selectedHour,
selectedMinute,
selectedSecond,
);
}
Navigator.of(context).pop(result); Navigator.of(context).pop(result);
}, },
child: const Text("确定", style: TextStyle(color: Colors.blue)), child: const Text("确定", style: TextStyle(color: Colors.blue)),
@ -317,7 +391,7 @@ class _InlineDateTimePickerContentState
), ),
const Divider(height: 1), const Divider(height: 1),
// date //
Expanded( Expanded(
child: Row( child: Row(
children: [ children: [
@ -384,6 +458,19 @@ class _InlineDateTimePickerContentState
}); });
}, },
), ),
// dateTimeWithSeconds
if (widget.mode == BottomPickerMode.dateTimeWithSeconds)
_buildPicker(
controller: secondCtrl,
items: seconds.map((e) => e.toString().padLeft(2, '0')).toList(),
onSelected: (idx) {
setState(() {
selectedSecond = seconds[idx];
_enforceConstraintsAndUpdateControllers();
});
},
),
], ],
), ),
), ),
@ -409,4 +496,4 @@ class _InlineDateTimePickerContentState
), ),
); );
} }
} }

View File

@ -773,7 +773,7 @@ class _SafecheckDetailState extends State<SafecheckDetail> {
text: form['INSPECTION_TIME_START'] ?? '', text: form['INSPECTION_TIME_START'] ?? '',
onTap: () async { onTap: () async {
DateTime? picked = DateTime? picked =
await BottomDateTimePicker.showDate(context); await BottomDateTimePicker.showDate(context,mode: BottomPickerMode.dateTimeWithSeconds,);
if (picked != null) { if (picked != null) {
setState(() { setState(() {
form['INSPECTION_TIME_START'] = DateFormat( form['INSPECTION_TIME_START'] = DateFormat(
@ -792,7 +792,7 @@ class _SafecheckDetailState extends State<SafecheckDetail> {
text: form['INSPECTION_TIME_END'] ?? '', text: form['INSPECTION_TIME_END'] ?? '',
onTap: () async { onTap: () async {
DateTime? picked = DateTime? picked =
await BottomDateTimePicker.showDate(context); await BottomDateTimePicker.showDate(context,mode: BottomPickerMode.dateTimeWithSeconds,);
if (picked != null) { if (picked != null) {
setState(() { setState(() {
form['INSPECTION_TIME_END'] = DateFormat( form['INSPECTION_TIME_END'] = DateFormat(

View File

@ -1023,6 +1023,7 @@ class _SafecheckStartDetailState extends State<SafecheckStartDetail> {
text: form['INSPECTION_TIME_START'] ?? '', text: form['INSPECTION_TIME_START'] ?? '',
onTap: () async { onTap: () async {
DateTime? picked = await BottomDateTimePicker.showDate( DateTime? picked = await BottomDateTimePicker.showDate(
mode: BottomPickerMode.dateTimeWithSeconds,
context, context,
); );
if (picked != null) { if (picked != null) {
@ -1043,6 +1044,7 @@ class _SafecheckStartDetailState extends State<SafecheckStartDetail> {
text: form['INSPECTION_TIME_END'] ?? '', text: form['INSPECTION_TIME_END'] ?? '',
onTap: () async { onTap: () async {
DateTime? picked = await BottomDateTimePicker.showDate( DateTime? picked = await BottomDateTimePicker.showDate(
mode: BottomPickerMode.dateTimeWithSeconds,
context, context,
); );
if (picked != null) { if (picked != null) {

View File

@ -155,13 +155,13 @@ class _DangerousOptionsPageState extends State<DangerousOptionsPage> {
} }
Future<void> _sign() async { Future<void> _sign() async {
await NativeOrientation.setLandscape(); await NativeOrientation.setLandscape();
final String path = await Navigator.push( final String path = await Navigator.push(
context, context,
MaterialPageRoute(builder: (c) => MineSignPage()), MaterialPageRoute(builder: (c) => MineSignPage()),
); );
await NativeOrientation.setPortrait(); await NativeOrientation.setPortrait();
if (path != null) { if (path != null) {
final now = DateFormat('yyyy-MM-dd HH:mm').format(DateTime.now()); final now = DateFormat('yyyy-MM-dd HH:mm').format(DateTime.now());
setState(() { setState(() {
final imageData = SignImageData( final imageData = SignImageData(

View File

@ -1,5 +1,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:intl/intl.dart';
import 'package:qhd_prevention/customWidget/ItemWidgetFactory.dart'; import 'package:qhd_prevention/customWidget/ItemWidgetFactory.dart';
import 'package:qhd_prevention/customWidget/picker/CupertinoDatePicker.dart';
import '../../../../../../tools/tools.dart'; import '../../../../../../tools/tools.dart';
import '../../../item_list_widget.dart'; import '../../../item_list_widget.dart';
@ -16,11 +18,8 @@ class HotWorkDetailFormWidget extends StatefulWidget {
// //
final VoidCallback? onChooseVideoManager; ///
/// final VoidCallback? onChooseVideoManager;///
final VoidCallback? onWorkStartTimeHandle;
final VoidCallback? onWorkEndTimeHandle;
///
final VoidCallback? onContractorHandle; final VoidCallback? onContractorHandle;
/// ///
final VoidCallback? onWorkAreaHandle; final VoidCallback? onWorkAreaHandle;
@ -45,8 +44,6 @@ class HotWorkDetailFormWidget extends StatefulWidget {
required this.onAnalyzeTap, required this.onAnalyzeTap,
/// ///
this.onChooseVideoManager, this.onChooseVideoManager,
this.onWorkStartTimeHandle,
this.onWorkEndTimeHandle,
this.onContractorHandle, this.onContractorHandle,
this.onWorkAreaHandle, this.onWorkAreaHandle,
this.onWorkAreaLocationHandle, this.onWorkAreaLocationHandle,
@ -161,6 +158,7 @@ class _HotWorkDetailFormWidgetState extends State<HotWorkDetailFormWidget> {
const Divider(), const Divider(),
ItemListWidget.twoRowButtonTitleText( ItemListWidget.twoRowButtonTitleText(
label: '关联其他特殊作业及安全作业票编号', label: '关联其他特殊作业及安全作业票编号',
isRequired: false,
isEditable: widget.isEditable, isEditable: widget.isEditable,
onTap: () async { onTap: () async {
await showDialog<String>( await showDialog<String>(
@ -228,14 +226,49 @@ class _HotWorkDetailFormWidgetState extends State<HotWorkDetailFormWidget> {
ItemListWidget.selectableLineTitleTextRightButton( ItemListWidget.selectableLineTitleTextRightButton(
label: '预计作业开始时间:', label: '预计作业开始时间:',
isEditable: widget.isEditable, isEditable: widget.isEditable,
onTap: widget.onWorkStartTimeHandle ?? () {}, onTap: () async {
DateTime? picked = await BottomDateTimePicker.showDate(
mode: BottomPickerMode.dateTimeWithSeconds,
context,
allowFuture: true,
);
if (picked != null) {
setState(() {
pd['WORK_EXPECTED_START_TIME'] = DateFormat(
'yyyy-MM-dd HH:mm:ss',
).format(picked);
///
if (FormUtils.hasValue(pd, 'WORK_EXPECTED_END_TIME') &&
!isBeforeStr(
pd['WORK_EXPECTED_START_TIME'],
pd['WORK_EXPECTED_END_TIME'],
)) {
pd['WORK_EXPECTED_END_TIME'] = '';
}
});
}
},
text: pd['WORK_EXPECTED_START_TIME'] ?? '', text: pd['WORK_EXPECTED_START_TIME'] ?? '',
), ),
const Divider(), const Divider(),
ItemListWidget.selectableLineTitleTextRightButton( ItemListWidget.selectableLineTitleTextRightButton(
label: '预计作业结束时间:', label: '预计作业结束时间:',
isEditable: widget.isEditable, isEditable: widget.isEditable,
onTap: widget.onWorkEndTimeHandle ?? () {}, onTap: () async {
DateTime? picked = await BottomDateTimePicker.showDate(
context,
minTimeStr: pd['WORK_EXPECTED_START_TIME'] ?? '',
allowFuture: true,
);
if (picked != null) {
setState(() {
pd['WORK_EXPECTED_END_TIME'] = DateFormat(
'yyyy-MM-dd HH:mm:ss',
).format(picked);
});
}
},
text: pd['WORK_EXPECTED_END_TIME'] ?? '', text: pd['WORK_EXPECTED_END_TIME'] ?? '',
), ),
const Divider(), const Divider(),

View File

@ -265,44 +265,7 @@ class _HotworkApplyDetailState extends State<HotworkApplyDetail> {
}); });
} }
} }
///
Future<void> _chooseWorkStartTime() async {
DateTime? picked = await BottomDateTimePicker.showDate(
context,
allowFuture: true,
);
if (picked != null) {
setState(() {
pd['WORK_EXPECTED_START_TIME'] = DateFormat(
'yyyy-MM-dd HH:mm:ss',
).format(picked);
///
if (FormUtils.hasValue(pd, 'WORK_EXPECTED_END_TIME') &&
!isBeforeStr(
pd['WORK_EXPECTED_START_TIME'],
pd['WORK_EXPECTED_END_TIME'],
)) {
pd['WORK_EXPECTED_END_TIME'] = '';
}
});
}
}
///
Future<void> _chooseWorkEndTime() async {
DateTime? picked = await BottomDateTimePicker.showDate(
context,
minTimeStr: pd['WORK_EXPECTED_START_TIME'] ?? '',
allowFuture: true,
);
if (picked != null) {
setState(() {
pd['WORK_EXPECTED_END_TIME'] = DateFormat(
'yyyy-MM-dd HH:mm:ss',
).format(picked);
});
}
}
/// ///
Future<void> _showLocationHandle() async{ Future<void> _showLocationHandle() async{
if (!FormUtils.hasValue(pd, 'ELECTRONIC_FENCE_AREA_ID')) { if (!FormUtils.hasValue(pd, 'ELECTRONIC_FENCE_AREA_ID')) {
@ -725,8 +688,6 @@ class _HotworkApplyDetailState extends State<HotworkApplyDetail> {
onChooseHotworkUser: _chooseHorkUser, onChooseHotworkUser: _chooseHorkUser,
// //
onChooseVideoManager: _chooseVideoManager, onChooseVideoManager: _chooseVideoManager,
onWorkStartTimeHandle: _chooseWorkStartTime,
onWorkEndTimeHandle: _chooseWorkEndTime,
onContractorHandle: _chooseUnitManager, onContractorHandle: _chooseUnitManager,
onWorkAreaHandle: _getWorkArea, onWorkAreaHandle: _getWorkArea,
onWorkAreaLocationHandle: _showLocationHandle, onWorkAreaLocationHandle: _showLocationHandle,

View File

@ -336,6 +336,7 @@ class _HotworkJszyDetailState extends State<HotworkJszyDetail> {
), ),
onTap: () async { onTap: () async {
DateTime? picked = await BottomDateTimePicker.showDate( DateTime? picked = await BottomDateTimePicker.showDate(
mode: BottomPickerMode.dateTimeWithSeconds,
context, context,
); );
if (picked != null) { if (picked != null) {

View File

@ -308,6 +308,7 @@ class _HotworkKszyDetailState extends State<HotworkKszyDetail> {
), ),
onTap: () async { onTap: () async {
DateTime? picked = await BottomDateTimePicker.showDate( DateTime? picked = await BottomDateTimePicker.showDate(
mode: BottomPickerMode.dateTimeWithSeconds,
context, context,
); );
if (picked != null) { if (picked != null) {

View File

@ -366,6 +366,7 @@ class _HotworkYsgdDetailState extends State<HotworkYsgdDetail> {
), ),
onTap: () async { onTap: () async {
DateTime? picked = await BottomDateTimePicker.showDate( DateTime? picked = await BottomDateTimePicker.showDate(
mode: BottomPickerMode.dateTimeWithSeconds,
context, context,
); );
if (picked != null) { if (picked != null) {

View File

@ -1,7 +1,9 @@
import 'dart:math' as math; import 'dart:math' as math;
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:intl/intl.dart';
import 'package:qhd_prevention/customWidget/ItemWidgetFactory.dart'; import 'package:qhd_prevention/customWidget/ItemWidgetFactory.dart';
import 'package:qhd_prevention/customWidget/picker/CupertinoDatePicker.dart';
import 'package:qhd_prevention/customWidget/single_image_viewer.dart'; import 'package:qhd_prevention/customWidget/single_image_viewer.dart';
import 'package:qhd_prevention/http/ApiService.dart'; import 'package:qhd_prevention/http/ApiService.dart';
@ -22,11 +24,8 @@ class CutroadDetailFormWidget extends StatefulWidget {
final TextEditingController? riskController; final TextEditingController? riskController;
// //
final VoidCallback? onChooseVideoManager; ///
/// final VoidCallback? onChooseVideoManager;///
final VoidCallback? onWorkStartTimeHandle;
final VoidCallback? onWorkEndTimeHandle;
///
final VoidCallback? onContractorHandle; final VoidCallback? onContractorHandle;
/// ///
final VoidCallback? onWorkAreaHandle; final VoidCallback? onWorkAreaHandle;
@ -43,8 +42,6 @@ class CutroadDetailFormWidget extends StatefulWidget {
/// ///
this.onChooseVideoManager, this.onChooseVideoManager,
this.onWorkStartTimeHandle,
this.onWorkEndTimeHandle,
this.onContractorHandle, this.onContractorHandle,
this.onWorkAreaHandle, this.onWorkAreaHandle,
this.onWorkAreaLocationHandle, this.onWorkAreaLocationHandle,
@ -313,6 +310,7 @@ class _CutroadDetailFormWidgetState extends State<CutroadDetailFormWidget> {
ItemListWidget.twoRowButtonTitleText( ItemListWidget.twoRowButtonTitleText(
label: '关联其他特殊作业及安全作业票编号', label: '关联其他特殊作业及安全作业票编号',
isRequired: false,
isEditable: widget.isEditable, isEditable: widget.isEditable,
onTap: () async { onTap: () async {
final val = await showDialog<String>( final val = await showDialog<String>(
@ -379,14 +377,49 @@ class _CutroadDetailFormWidgetState extends State<CutroadDetailFormWidget> {
ItemListWidget.selectableLineTitleTextRightButton( ItemListWidget.selectableLineTitleTextRightButton(
label: '预计作业开始时间:', label: '预计作业开始时间:',
isEditable: widget.isEditable, isEditable: widget.isEditable,
onTap: widget.onWorkStartTimeHandle ?? () {}, onTap: () async {
DateTime? picked = await BottomDateTimePicker.showDate(
mode: BottomPickerMode.dateTimeWithSeconds,
context,
allowFuture: true,
);
if (picked != null) {
setState(() {
pd['WORK_EXPECTED_START_TIME'] = DateFormat(
'yyyy-MM-dd HH:mm:ss',
).format(picked);
///
if (FormUtils.hasValue(pd, 'WORK_EXPECTED_END_TIME') &&
!isBeforeStr(
pd['WORK_EXPECTED_START_TIME'],
pd['WORK_EXPECTED_END_TIME'],
)) {
pd['WORK_EXPECTED_END_TIME'] = '';
}
});
}
},
text: pd['WORK_EXPECTED_START_TIME'] ?? '', text: pd['WORK_EXPECTED_START_TIME'] ?? '',
), ),
const Divider(), const Divider(),
ItemListWidget.selectableLineTitleTextRightButton( ItemListWidget.selectableLineTitleTextRightButton(
label: '预计作业结束时间:', label: '预计作业结束时间:',
isEditable: widget.isEditable, isEditable: widget.isEditable,
onTap: widget.onWorkEndTimeHandle ?? () {}, onTap: () async {
DateTime? picked = await BottomDateTimePicker.showDate(
context,
minTimeStr: pd['WORK_EXPECTED_START_TIME'] ?? '',
allowFuture: true,
);
if (picked != null) {
setState(() {
pd['WORK_EXPECTED_END_TIME'] = DateFormat(
'yyyy-MM-dd HH:mm:ss',
).format(picked);
});
}
},
text: pd['WORK_EXPECTED_END_TIME'] ?? '', text: pd['WORK_EXPECTED_END_TIME'] ?? '',
), ),
const Divider(), const Divider(),

View File

@ -441,44 +441,8 @@ class _CutroadApplyDetailState extends State<CutroadApplyDetail> {
}); });
} }
} }
///
Future<void> _chooseWorkStartTime() async {
DateTime? picked = await BottomDateTimePicker.showDate(
context,
allowFuture: true,
);
if (picked != null) {
setState(() {
pd['WORK_EXPECTED_START_TIME'] = DateFormat(
'yyyy-MM-dd HH:mm:ss',
).format(picked);
///
if (FormUtils.hasValue(pd, 'WORK_EXPECTED_END_TIME') &&
!isBeforeStr(
pd['WORK_EXPECTED_START_TIME'],
pd['WORK_EXPECTED_END_TIME'],
)) {
pd['WORK_EXPECTED_END_TIME'] = '';
}
});
}
}
///
Future<void> _chooseWorkEndTime() async {
DateTime? picked = await BottomDateTimePicker.showDate(
context,
minTimeStr: pd['WORK_EXPECTED_START_TIME'] ?? '',
allowFuture: true,
);
if (picked != null) {
setState(() {
pd['WORK_EXPECTED_END_TIME'] = DateFormat(
'yyyy-MM-dd HH:mm:ss',
).format(picked);
});
}
}
/// ///
Future<void> _showLocationHandle() async{ Future<void> _showLocationHandle() async{
if (!FormUtils.hasValue(pd, 'ELECTRONIC_FENCE_AREA_ID')) { if (!FormUtils.hasValue(pd, 'ELECTRONIC_FENCE_AREA_ID')) {
@ -604,8 +568,6 @@ class _CutroadApplyDetailState extends State<CutroadApplyDetail> {
onChooseLevel: (){}, onChooseLevel: (){},
// //
onChooseVideoManager: _chooseVideoManager, onChooseVideoManager: _chooseVideoManager,
onWorkStartTimeHandle: _chooseWorkStartTime,
onWorkEndTimeHandle: _chooseWorkEndTime,
onContractorHandle: _chooseUnitManager, onContractorHandle: _chooseUnitManager,
onWorkAreaHandle: _getWorkArea, onWorkAreaHandle: _getWorkArea,
onWorkAreaLocationHandle: _showLocationHandle, onWorkAreaLocationHandle: _showLocationHandle,

View File

@ -35,6 +35,7 @@ class _CutroadJszyDetailState extends State<CutroadJszyDetail> {
/// ///
late Map<String, dynamic> pd = {}; late Map<String, dynamic> pd = {};
/// ///
String endTime = ''; String endTime = '';
@ -58,7 +59,7 @@ class _CutroadJszyDetailState extends State<CutroadJszyDetail> {
MaterialPageRoute(builder: (context) => MineSignPage()), MaterialPageRoute(builder: (context) => MineSignPage()),
); );
await NativeOrientation.setPortrait(); await NativeOrientation.setPortrait();
if (path != null) { if (path != null) {
final now = DateFormat('yyyy-MM-dd HH:mm').format(DateTime.now()); final now = DateFormat('yyyy-MM-dd HH:mm').format(DateTime.now());
setState(() { setState(() {
signImages.add(path); signImages.add(path);
@ -125,6 +126,7 @@ if (path != null) {
}).toList(), }).toList(),
); );
} }
bool checkWorkTime(Map<String, dynamic> pd, BuildContext context) { bool checkWorkTime(Map<String, dynamic> pd, BuildContext context) {
// //
final start = DateTime.parse(pd['WORK_START_DATE'] as String); final start = DateTime.parse(pd['WORK_START_DATE'] as String);
@ -137,9 +139,9 @@ if (path != null) {
return false; return false;
} }
return true; return true;
} }
/// -1 1 /// -1 1
Future<void> _submit(String status) async { Future<void> _submit(String status) async {
if (signImages.isEmpty) { if (signImages.isEmpty) {
@ -161,7 +163,7 @@ if (path != null) {
title: '作废原因', title: '作废原因',
hintText: '请输入作废原因', hintText: '请输入作废原因',
cancelText: '取消', cancelText: '取消',
confirmText: '确定' confirmText: '确定',
); );
if (reasonText.isEmpty) { if (reasonText.isEmpty) {
ToastUtil.showNormal(context, '请填写作废原因'); ToastUtil.showNormal(context, '请填写作废原因');
@ -188,29 +190,31 @@ if (path != null) {
barrierDismissible: false, barrierDismissible: false,
); );
if (confirmed) { if (confirmed) {
LoadingDialogHelper.show(); LoadingDialogHelper.show();
try { try {
final result = await ApiService.saveSafeFunctionSure( final result = await ApiService.saveSafeFunctionSure(
'cutroad', 'cutroad',
formData, formData,
signImages, signImages,
); );
LoadingDialogHelper.hide(); LoadingDialogHelper.hide();
if (result['result'] == 'success') { if (result['result'] == 'success') {
ToastUtil.showSuccess(context, '保存成功'); ToastUtil.showSuccess(context, '保存成功');
Navigator.of(context).pop(true); Navigator.of(context).pop(true);
} }
} catch (e) { } catch (e) {
LoadingDialogHelper.hide(); LoadingDialogHelper.hide();
ToastUtil.showNormal(context, '操作失败:$e'); ToastUtil.showNormal(context, '操作失败:$e');
} }
} }
} }
/// ///
Future<void> _getData() async { Future<void> _getData() async {
final data = await ApiService.getHomeworkFindById('cutroad', widget.CUTROAD_ID); final data = await ApiService.getHomeworkFindById(
'cutroad',
widget.CUTROAD_ID,
);
setState(() { setState(() {
pd = data['pd']; pd = data['pd'];
@ -220,7 +224,8 @@ if (path != null) {
} }
Future<void> _getMeasures(String homework_id) async { Future<void> _getMeasures(String homework_id) async {
final data = await ApiService.listSignFinishMeasures('cutroad', final data = await ApiService.listSignFinishMeasures(
'cutroad',
homework_id.length > 0 ? homework_id : widget.CUTROAD_ID, homework_id.length > 0 ? homework_id : widget.CUTROAD_ID,
); );
setState(() { setState(() {
@ -231,7 +236,8 @@ if (path != null) {
} }
Future<void> _getSigns(String homework_id) async { Future<void> _getSigns(String homework_id) async {
final data = await ApiService.listSignFinished('cutroad', final data = await ApiService.listSignFinished(
'cutroad',
homework_id.length > 0 ? homework_id : widget.CUTROAD_ID, homework_id.length > 0 ? homework_id : widget.CUTROAD_ID,
); );
setState(() { setState(() {
@ -294,12 +300,23 @@ if (path != null) {
Column( Column(
children: [ children: [
GestureDetector( GestureDetector(
child: ListItemFactory.createRowSpaceBetweenItem(leftText: '作业结束时间', rightText: endTime.isEmpty?'请选择':endTime, isRight: true, isRequired: true), child: ListItemFactory.createRowSpaceBetweenItem(
leftText: '作业结束时间',
rightText: endTime.isEmpty ? '请选择' : endTime,
isRight: true,
isRequired: true,
),
onTap: () async { onTap: () async {
DateTime? picked = await BottomDateTimePicker.showDate(context); DateTime? picked = await BottomDateTimePicker.showDate(
mode: BottomPickerMode.dateTimeWithSeconds,
context,
);
if (picked != null) { if (picked != null) {
setState(() { setState(() {
endTime = DateFormat('yyyy-MM-dd HH:mm').format(picked); endTime = DateFormat(
'yyyy-MM-dd HH:mm',
).format(picked);
}); });
} }
}, },

View File

@ -298,6 +298,7 @@ setState(() {
), ),
onTap: () async { onTap: () async {
DateTime? picked = await BottomDateTimePicker.showDate( DateTime? picked = await BottomDateTimePicker.showDate(
mode: BottomPickerMode.dateTimeWithSeconds,
context, context,
); );
if (picked != null) { if (picked != null) {

View File

@ -43,8 +43,10 @@ class _CutroadYsgdDetailState extends State<CutroadYsgdDetail> {
/// ///
late Map<String, dynamic> pd = {}; late Map<String, dynamic> pd = {};
/// ///
String startTime = ''; String startTime = '';
/// ///
final TextEditingController _contentController = TextEditingController(); final TextEditingController _contentController = TextEditingController();
late List<ImageData> imgList = []; late List<ImageData> imgList = [];
@ -60,6 +62,7 @@ class _CutroadYsgdDetailState extends State<CutroadYsgdDetail> {
super.initState(); super.initState();
_getData(); _getData();
} }
/// ///
Future<void> _onImageAdded(String localPath) async { Future<void> _onImageAdded(String localPath) async {
// //
@ -79,6 +82,7 @@ class _CutroadYsgdDetailState extends State<CutroadYsgdDetail> {
imgList.remove(item); imgList.remove(item);
}); });
} }
/// ///
Future<void> _sign() async { Future<void> _sign() async {
await NativeOrientation.setLandscape(); await NativeOrientation.setLandscape();
@ -89,7 +93,7 @@ class _CutroadYsgdDetailState extends State<CutroadYsgdDetail> {
await NativeOrientation.setPortrait(); await NativeOrientation.setPortrait();
if (path != null) { if (path != null) {
final now = DateFormat('yyyy-MM-dd HH:mm').format(DateTime.now()); final now = DateFormat('yyyy-MM-dd HH:mm').format(DateTime.now());
setState(() { setState(() {
signImages.add(path); signImages.add(path);
signTimes.add(now); signTimes.add(now);
FocusHelper.clearFocus(context); FocusHelper.clearFocus(context);
@ -195,7 +199,7 @@ setState(() {
title: '作废原因', title: '作废原因',
hintText: '请输入作废原因', hintText: '请输入作废原因',
cancelText: '取消', cancelText: '取消',
confirmText: '确定' confirmText: '确定',
); );
if (reasonText.isEmpty) { if (reasonText.isEmpty) {
ToastUtil.showNormal(context, '请填写作废原因'); ToastUtil.showNormal(context, '请填写作废原因');
@ -205,7 +209,7 @@ setState(() {
final serverPathString = imgList final serverPathString = imgList
.map((e) => e.serverPath) .map((e) => e.serverPath)
.where((s) => s.isNotEmpty) .where((s) => s.isNotEmpty)
.map((s) => s) // String? String .map((s) => s) // String? String
.join(','); .join(',');
// measures // measures
final Map<String, dynamic> formData = {}; final Map<String, dynamic> formData = {};
@ -228,29 +232,31 @@ setState(() {
barrierDismissible: false, barrierDismissible: false,
); );
if (confirmed) { if (confirmed) {
LoadingDialogHelper.show(); LoadingDialogHelper.show();
try { try {
final result = await ApiService.saveSafeFunctionSure( final result = await ApiService.saveSafeFunctionSure(
'cutroad', 'cutroad',
formData, formData,
signImages, signImages,
); );
LoadingDialogHelper.hide(); LoadingDialogHelper.hide();
if (result['result'] == 'success') { if (result['result'] == 'success') {
ToastUtil.showSuccess(context, '保存成功'); ToastUtil.showSuccess(context, '保存成功');
Navigator.of(context).pop(true); Navigator.of(context).pop(true);
} }
} catch (e) { } catch (e) {
LoadingDialogHelper.hide(); LoadingDialogHelper.hide();
ToastUtil.showNormal(context, '操作失败:$e'); ToastUtil.showNormal(context, '操作失败:$e');
} }
} }
} }
/// ///
Future<void> _getData() async { Future<void> _getData() async {
final data = await ApiService.getHomeworkFindById('cutroad', widget.CUTROAD_ID); final data = await ApiService.getHomeworkFindById(
'cutroad',
widget.CUTROAD_ID,
);
setState(() { setState(() {
pd = data['pd']; pd = data['pd'];
@ -260,7 +266,8 @@ setState(() {
} }
Future<void> _getMeasures(String homework_id) async { Future<void> _getMeasures(String homework_id) async {
final data = await ApiService.listSignFinishMeasures('cutroad', final data = await ApiService.listSignFinishMeasures(
'cutroad',
homework_id.length > 0 ? homework_id : widget.CUTROAD_ID, homework_id.length > 0 ? homework_id : widget.CUTROAD_ID,
); );
setState(() { setState(() {
@ -271,7 +278,8 @@ setState(() {
} }
Future<void> _getSigns(String homework_id) async { Future<void> _getSigns(String homework_id) async {
final data = await ApiService.listSignFinished('cutroad', final data = await ApiService.listSignFinished(
'cutroad',
homework_id.length > 0 ? homework_id : widget.CUTROAD_ID, homework_id.length > 0 ? homework_id : widget.CUTROAD_ID,
); );
setState(() { setState(() {
@ -338,16 +346,26 @@ setState(() {
'完工验收', '完工验收',
'请输入意见', '请输入意见',
_contentController, _contentController,
isRequired: true isRequired: true,
), ),
Divider(), Divider(),
GestureDetector( GestureDetector(
child: ListItemFactory.createRowSpaceBetweenItem(leftText: '验收时间', rightText: startTime.isEmpty?'请选择':startTime, isRight: true, isRequired: true), child: ListItemFactory.createRowSpaceBetweenItem(
leftText: '验收时间',
rightText: startTime.isEmpty ? '请选择' : startTime,
isRight: true,
isRequired: true,
),
onTap: () async { onTap: () async {
DateTime? picked = await BottomDateTimePicker.showDate(context); DateTime? picked = await BottomDateTimePicker.showDate(
mode: BottomPickerMode.dateTimeWithSeconds,
context,
);
if (picked != null) { if (picked != null) {
setState(() { setState(() {
startTime = DateFormat('yyyy-MM-dd HH:mm').format(picked); startTime = DateFormat(
'yyyy-MM-dd HH:mm',
).format(picked);
}); });
FocusHelper.clearFocus(context); FocusHelper.clearFocus(context);
} }
@ -359,14 +377,19 @@ setState(() {
title: '验收视频', title: '验收视频',
maxCount: 1, maxCount: 1,
mediaType: MediaType.video, mediaType: MediaType.video,
horizontalPadding: 0, horizontalPadding: 0,
onChanged: (paths) {}, onChanged: (paths) {},
onMediaAdded: _onImageAdded, onMediaAdded: _onImageAdded,
onMediaTapped: (path) { onMediaTapped: (path) {
presentOpaque(SingleImageViewer(imageUrl: path), context); presentOpaque(
}, SingleImageViewer(imageUrl: path),
context,
);
},
onMediaRemoved: (path) { onMediaRemoved: (path) {
final item = imgList.firstWhere((e) => e.localPath == path); final item = imgList.firstWhere(
(e) => e.localPath == path,
);
_onImageRemoved(item); _onImageRemoved(item);
}, },
onAiIdentify: () {}, onAiIdentify: () {},

View File

@ -1,6 +1,8 @@
import 'dart:math' as math; import 'dart:math' as math;
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:intl/intl.dart';
import 'package:qhd_prevention/customWidget/picker/CupertinoDatePicker.dart';
import 'package:qhd_prevention/customWidget/ItemWidgetFactory.dart'; import 'package:qhd_prevention/customWidget/ItemWidgetFactory.dart';
import 'package:qhd_prevention/customWidget/single_image_viewer.dart'; import 'package:qhd_prevention/customWidget/single_image_viewer.dart';
import 'package:qhd_prevention/http/ApiService.dart'; import 'package:qhd_prevention/http/ApiService.dart';
@ -23,11 +25,8 @@ class BreakgroundDetailFormWidget extends StatefulWidget {
final TextEditingController? relatedController; final TextEditingController? relatedController;
final TextEditingController? riskController; final TextEditingController? riskController;
// //
final VoidCallback? onChooseVideoManager; ///
/// final VoidCallback? onChooseVideoManager;///
final VoidCallback? onWorkStartTimeHandle;
final VoidCallback? onWorkEndTimeHandle;
///
final VoidCallback? onContractorHandle; final VoidCallback? onContractorHandle;
/// ///
final VoidCallback? onWorkAreaHandle; final VoidCallback? onWorkAreaHandle;
@ -42,8 +41,6 @@ class BreakgroundDetailFormWidget extends StatefulWidget {
required this.signs, required this.signs,
/// ///
this.onChooseVideoManager, this.onChooseVideoManager,
this.onWorkStartTimeHandle,
this.onWorkEndTimeHandle,
this.onContractorHandle, this.onContractorHandle,
this.onWorkAreaHandle, this.onWorkAreaHandle,
this.onWorkAreaLocationHandle, this.onWorkAreaLocationHandle,
@ -358,6 +355,7 @@ class _BreakgroundDetailFormWidgetState
], ],
ItemListWidget.twoRowButtonTitleText( ItemListWidget.twoRowButtonTitleText(
label: '关联其他特殊作业及安全作业票编号', label: '关联其他特殊作业及安全作业票编号',
isRequired: false,
isEditable: widget.isEditable, isEditable: widget.isEditable,
onTap: () async { onTap: () async {
final val = await showDialog<String>( final val = await showDialog<String>(
@ -426,14 +424,49 @@ class _BreakgroundDetailFormWidgetState
ItemListWidget.selectableLineTitleTextRightButton( ItemListWidget.selectableLineTitleTextRightButton(
label: '预计作业开始时间:', label: '预计作业开始时间:',
isEditable: widget.isEditable, isEditable: widget.isEditable,
onTap: widget.onWorkStartTimeHandle ?? () {}, onTap: () async {
DateTime? picked = await BottomDateTimePicker.showDate(
mode: BottomPickerMode.dateTimeWithSeconds,
context,
allowFuture: true,
);
if (picked != null) {
setState(() {
pd['WORK_EXPECTED_START_TIME'] = DateFormat(
'yyyy-MM-dd HH:mm:ss',
).format(picked);
///
if (FormUtils.hasValue(pd, 'WORK_EXPECTED_END_TIME') &&
!isBeforeStr(
pd['WORK_EXPECTED_START_TIME'],
pd['WORK_EXPECTED_END_TIME'],
)) {
pd['WORK_EXPECTED_END_TIME'] = '';
}
});
}
},
text: pd['WORK_EXPECTED_START_TIME'] ?? '', text: pd['WORK_EXPECTED_START_TIME'] ?? '',
), ),
const Divider(), const Divider(),
ItemListWidget.selectableLineTitleTextRightButton( ItemListWidget.selectableLineTitleTextRightButton(
label: '预计作业结束时间:', label: '预计作业结束时间:',
isEditable: widget.isEditable, isEditable: widget.isEditable,
onTap: widget.onWorkEndTimeHandle ?? () {}, onTap: () async {
DateTime? picked = await BottomDateTimePicker.showDate(
context,
minTimeStr: pd['WORK_EXPECTED_START_TIME'] ?? '',
allowFuture: true,
);
if (picked != null) {
setState(() {
pd['WORK_EXPECTED_END_TIME'] = DateFormat(
'yyyy-MM-dd HH:mm:ss',
).format(picked);
});
}
},
text: pd['WORK_EXPECTED_END_TIME'] ?? '', text: pd['WORK_EXPECTED_END_TIME'] ?? '',
), ),
const Divider(), const Divider(),

View File

@ -217,44 +217,8 @@ class _BreakgroundApplyDetailState extends State<BreakgroundApplyDetail> {
}); });
} }
} }
///
Future<void> _chooseWorkStartTime() async {
DateTime? picked = await BottomDateTimePicker.showDate(
context,
allowFuture: true,
);
if (picked != null) {
setState(() {
pd['WORK_EXPECTED_START_TIME'] = DateFormat(
'yyyy-MM-dd HH:mm:ss',
).format(picked);
///
if (FormUtils.hasValue(pd, 'WORK_EXPECTED_END_TIME') &&
!isBeforeStr(
pd['WORK_EXPECTED_START_TIME'],
pd['WORK_EXPECTED_END_TIME'],
)) {
pd['WORK_EXPECTED_END_TIME'] = '';
}
});
}
}
///
Future<void> _chooseWorkEndTime() async {
DateTime? picked = await BottomDateTimePicker.showDate(
context,
minTimeStr: pd['WORK_EXPECTED_START_TIME'] ?? '',
allowFuture: true,
);
if (picked != null) {
setState(() {
pd['WORK_EXPECTED_END_TIME'] = DateFormat(
'yyyy-MM-dd HH:mm:ss',
).format(picked);
});
}
}
/// ///
Future<void> _showLocationHandle() async{ Future<void> _showLocationHandle() async{
if (!FormUtils.hasValue(pd, 'ELECTRONIC_FENCE_AREA_ID')) { if (!FormUtils.hasValue(pd, 'ELECTRONIC_FENCE_AREA_ID')) {
@ -629,8 +593,6 @@ class _BreakgroundApplyDetailState extends State<BreakgroundApplyDetail> {
onChooseLevel: _chooseLevel, onChooseLevel: _chooseLevel,
// //
onChooseVideoManager: _chooseVideoManager, onChooseVideoManager: _chooseVideoManager,
onWorkStartTimeHandle: _chooseWorkStartTime,
onWorkEndTimeHandle: _chooseWorkEndTime,
onContractorHandle: _chooseUnitManager, onContractorHandle: _chooseUnitManager,
onWorkAreaHandle: _getWorkArea, onWorkAreaHandle: _getWorkArea,
onWorkAreaLocationHandle: _showLocationHandle, onWorkAreaLocationHandle: _showLocationHandle,

View File

@ -310,6 +310,7 @@ class _BreakgroundJszyDetailState extends State<BreakgroundJszyDetail> {
), ),
onTap: () async { onTap: () async {
DateTime? picked = await BottomDateTimePicker.showDate( DateTime? picked = await BottomDateTimePicker.showDate(
mode: BottomPickerMode.dateTimeWithSeconds,
context, context,
); );
if (picked != null) { if (picked != null) {

View File

@ -299,6 +299,7 @@ class _BreakgroundKszyDetailState extends State<BreakgroundKszyDetail> {
), ),
onTap: () async { onTap: () async {
DateTime? picked = await BottomDateTimePicker.showDate( DateTime? picked = await BottomDateTimePicker.showDate(
mode: BottomPickerMode.dateTimeWithSeconds,
context, context,
); );
if (picked != null) { if (picked != null) {

View File

@ -360,6 +360,7 @@ class _BreakgroundYsgdDetailState extends State<BreakgroundYsgdDetail> {
), ),
onTap: () async { onTap: () async {
DateTime? picked = await BottomDateTimePicker.showDate( DateTime? picked = await BottomDateTimePicker.showDate(
mode: BottomPickerMode.dateTimeWithSeconds,
context, context,
); );
if (picked != null) { if (picked != null) {

View File

@ -5,7 +5,8 @@ import 'package:qhd_prevention/customWidget/ItemWidgetFactory.dart';
import 'package:qhd_prevention/customWidget/single_image_viewer.dart'; import 'package:qhd_prevention/customWidget/single_image_viewer.dart';
import 'package:qhd_prevention/http/ApiService.dart'; import 'package:qhd_prevention/http/ApiService.dart';
import 'package:qhd_prevention/tools/h_colors.dart'; import 'package:qhd_prevention/tools/h_colors.dart';
import 'package:intl/intl.dart';
import 'package:qhd_prevention/customWidget/picker/CupertinoDatePicker.dart';
import '../../../../../../tools/tools.dart'; import '../../../../../../tools/tools.dart';
import '../../../item_list_widget.dart'; import '../../../item_list_widget.dart';
import '../../special_Wrok/MeasuresListWidget.dart'; import '../../special_Wrok/MeasuresListWidget.dart';
@ -25,11 +26,8 @@ class HoistWorkDetailFormWidget extends StatefulWidget {
final TextEditingController? riskController; final TextEditingController? riskController;
// //
final VoidCallback? onChooseVideoManager; ///
/// final VoidCallback? onChooseVideoManager;///
final VoidCallback? onWorkStartTimeHandle;
final VoidCallback? onWorkEndTimeHandle;
///
final VoidCallback? onContractorHandle; final VoidCallback? onContractorHandle;
/// ///
final VoidCallback? onWorkAreaHandle; final VoidCallback? onWorkAreaHandle;
@ -44,8 +42,6 @@ class HoistWorkDetailFormWidget extends StatefulWidget {
required this.signs, required this.signs,
/// ///
this.onChooseVideoManager, this.onChooseVideoManager,
this.onWorkStartTimeHandle,
this.onWorkEndTimeHandle,
this.onContractorHandle, this.onContractorHandle,
this.onWorkAreaHandle, this.onWorkAreaHandle,
this.onWorkAreaLocationHandle, this.onWorkAreaLocationHandle,
@ -343,6 +339,7 @@ class _HoistworkDetailFormWidgetState extends State<HoistWorkDetailFormWidget> {
], ],
ItemListWidget.twoRowButtonTitleText( ItemListWidget.twoRowButtonTitleText(
label: '关联其他特殊作业及安全作业票编号', label: '关联其他特殊作业及安全作业票编号',
isRequired: false,
isEditable: widget.isEditable, isEditable: widget.isEditable,
onTap: () async { onTap: () async {
final val = await showDialog<String>( final val = await showDialog<String>(
@ -408,14 +405,49 @@ class _HoistworkDetailFormWidgetState extends State<HoistWorkDetailFormWidget> {
ItemListWidget.selectableLineTitleTextRightButton( ItemListWidget.selectableLineTitleTextRightButton(
label: '预计作业开始时间:', label: '预计作业开始时间:',
isEditable: widget.isEditable, isEditable: widget.isEditable,
onTap: widget.onWorkStartTimeHandle ?? () {}, onTap: () async {
DateTime? picked = await BottomDateTimePicker.showDate(
mode: BottomPickerMode.dateTimeWithSeconds,
context,
allowFuture: true,
);
if (picked != null) {
setState(() {
pd['WORK_EXPECTED_START_TIME'] = DateFormat(
'yyyy-MM-dd HH:mm:ss',
).format(picked);
///
if (FormUtils.hasValue(pd, 'WORK_EXPECTED_END_TIME') &&
!isBeforeStr(
pd['WORK_EXPECTED_START_TIME'],
pd['WORK_EXPECTED_END_TIME'],
)) {
pd['WORK_EXPECTED_END_TIME'] = '';
}
});
}
},
text: pd['WORK_EXPECTED_START_TIME'] ?? '', text: pd['WORK_EXPECTED_START_TIME'] ?? '',
), ),
const Divider(), const Divider(),
ItemListWidget.selectableLineTitleTextRightButton( ItemListWidget.selectableLineTitleTextRightButton(
label: '预计作业结束时间:', label: '预计作业结束时间:',
isEditable: widget.isEditable, isEditable: widget.isEditable,
onTap: widget.onWorkEndTimeHandle ?? () {}, onTap: () async {
DateTime? picked = await BottomDateTimePicker.showDate(
context,
minTimeStr: pd['WORK_EXPECTED_START_TIME'] ?? '',
allowFuture: true,
);
if (picked != null) {
setState(() {
pd['WORK_EXPECTED_END_TIME'] = DateFormat(
'yyyy-MM-dd HH:mm:ss',
).format(picked);
});
}
},
text: pd['WORK_EXPECTED_END_TIME'] ?? '', text: pd['WORK_EXPECTED_END_TIME'] ?? '',
), ),
const Divider(), const Divider(),

View File

@ -179,44 +179,8 @@ class _HoistworkApplyDetailState extends State<HoistworkApplyDetail> {
}); });
} }
} }
///
Future<void> _chooseWorkStartTime() async {
DateTime? picked = await BottomDateTimePicker.showDate(
context,
allowFuture: true,
);
if (picked != null) {
setState(() {
pd['WORK_EXPECTED_START_TIME'] = DateFormat(
'yyyy-MM-dd HH:mm:ss',
).format(picked);
///
if (FormUtils.hasValue(pd, 'WORK_EXPECTED_END_TIME') &&
!isBeforeStr(
pd['WORK_EXPECTED_START_TIME'],
pd['WORK_EXPECTED_END_TIME'],
)) {
pd['WORK_EXPECTED_END_TIME'] = '';
}
});
}
}
///
Future<void> _chooseWorkEndTime() async {
DateTime? picked = await BottomDateTimePicker.showDate(
context,
minTimeStr: pd['WORK_EXPECTED_START_TIME'] ?? '',
allowFuture: true,
);
if (picked != null) {
setState(() {
pd['WORK_EXPECTED_END_TIME'] = DateFormat(
'yyyy-MM-dd HH:mm:ss',
).format(picked);
});
}
}
/// ///
Future<void> _showLocationHandle() async{ Future<void> _showLocationHandle() async{
if (!FormUtils.hasValue(pd, 'ELECTRONIC_FENCE_AREA_ID')) { if (!FormUtils.hasValue(pd, 'ELECTRONIC_FENCE_AREA_ID')) {
@ -657,8 +621,6 @@ class _HoistworkApplyDetailState extends State<HoistworkApplyDetail> {
onChooseLevel: _chooseLevel, onChooseLevel: _chooseLevel,
// //
onChooseVideoManager: _chooseVideoManager, onChooseVideoManager: _chooseVideoManager,
onWorkStartTimeHandle: _chooseWorkStartTime,
onWorkEndTimeHandle: _chooseWorkEndTime,
onContractorHandle: _chooseUnitManager, onContractorHandle: _chooseUnitManager,
onWorkAreaHandle: _getWorkArea, onWorkAreaHandle: _getWorkArea,
onWorkAreaLocationHandle: _showLocationHandle, onWorkAreaLocationHandle: _showLocationHandle,

View File

@ -310,6 +310,7 @@ class _HoistworkJszyDetailState extends State<HoistworkJszyDetail> {
), ),
onTap: () async { onTap: () async {
DateTime? picked = await BottomDateTimePicker.showDate( DateTime? picked = await BottomDateTimePicker.showDate(
mode: BottomPickerMode.dateTimeWithSeconds,
context, context,
); );
if (picked != null) { if (picked != null) {

View File

@ -299,6 +299,7 @@ class _HoistworkKszyDetailState extends State<HoistworkKszyDetail> {
), ),
onTap: () async { onTap: () async {
DateTime? picked = await BottomDateTimePicker.showDate( DateTime? picked = await BottomDateTimePicker.showDate(
mode: BottomPickerMode.dateTimeWithSeconds,
context, context,
); );
if (picked != null) { if (picked != null) {

View File

@ -360,6 +360,7 @@ class _HoistworkYsgdDetailState extends State<HoistworkYsgdDetail> {
), ),
onTap: () async { onTap: () async {
DateTime? picked = await BottomDateTimePicker.showDate( DateTime? picked = await BottomDateTimePicker.showDate(
mode: BottomPickerMode.dateTimeWithSeconds,
context, context,
); );
if (picked != null) { if (picked != null) {

View File

@ -1,6 +1,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:qhd_prevention/customWidget/ItemWidgetFactory.dart'; import 'package:qhd_prevention/customWidget/ItemWidgetFactory.dart';
import 'package:intl/intl.dart';
import 'package:qhd_prevention/customWidget/picker/CupertinoDatePicker.dart';
import '../../../../../../tools/tools.dart'; import '../../../../../../tools/tools.dart';
import '../../../item_list_widget.dart'; import '../../../item_list_widget.dart';
import '../../special_Wrok/MeasuresListWidget.dart'; import '../../special_Wrok/MeasuresListWidget.dart';
@ -11,11 +12,8 @@ class HighWorkDetailFormWidget extends StatefulWidget {
final bool isEditable; final bool isEditable;
final VoidCallback onChooseLevel; final VoidCallback onChooseLevel;
// //
final VoidCallback? onChooseVideoManager; ///
/// final VoidCallback? onChooseVideoManager;///
final VoidCallback? onWorkStartTimeHandle;
final VoidCallback? onWorkEndTimeHandle;
///
final VoidCallback? onContractorHandle; final VoidCallback? onContractorHandle;
/// ///
final VoidCallback? onWorkAreaHandle; final VoidCallback? onWorkAreaHandle;
@ -36,8 +34,6 @@ class HighWorkDetailFormWidget extends StatefulWidget {
required this.onChooseLevel, required this.onChooseLevel,
/// ///
this.onChooseVideoManager, this.onChooseVideoManager,
this.onWorkStartTimeHandle,
this.onWorkEndTimeHandle,
this.onContractorHandle, this.onContractorHandle,
this.onWorkAreaHandle, this.onWorkAreaHandle,
this.onWorkAreaLocationHandle, this.onWorkAreaLocationHandle,
@ -132,6 +128,7 @@ class _HighWorkDetailFormWidgetState extends State<HighWorkDetailFormWidget> {
const Divider(), const Divider(),
ItemListWidget.twoRowButtonTitleText( ItemListWidget.twoRowButtonTitleText(
label: '关联其他特殊作业及安全作业票编号', label: '关联其他特殊作业及安全作业票编号',
isRequired: false,
isEditable: widget.isEditable, isEditable: widget.isEditable,
onTap: () async { onTap: () async {
final val = await showDialog<String>( final val = await showDialog<String>(
@ -197,14 +194,49 @@ class _HighWorkDetailFormWidgetState extends State<HighWorkDetailFormWidget> {
ItemListWidget.selectableLineTitleTextRightButton( ItemListWidget.selectableLineTitleTextRightButton(
label: '预计作业开始时间:', label: '预计作业开始时间:',
isEditable: widget.isEditable, isEditable: widget.isEditable,
onTap: widget.onWorkStartTimeHandle ?? () {}, onTap: () async {
DateTime? picked = await BottomDateTimePicker.showDate(
mode: BottomPickerMode.dateTimeWithSeconds,
context,
allowFuture: true,
);
if (picked != null) {
setState(() {
pd['WORK_EXPECTED_START_TIME'] = DateFormat(
'yyyy-MM-dd HH:mm:ss',
).format(picked);
///
if (FormUtils.hasValue(pd, 'WORK_EXPECTED_END_TIME') &&
!isBeforeStr(
pd['WORK_EXPECTED_START_TIME'],
pd['WORK_EXPECTED_END_TIME'],
)) {
pd['WORK_EXPECTED_END_TIME'] = '';
}
});
}
},
text: pd['WORK_EXPECTED_START_TIME'] ?? '', text: pd['WORK_EXPECTED_START_TIME'] ?? '',
), ),
const Divider(), const Divider(),
ItemListWidget.selectableLineTitleTextRightButton( ItemListWidget.selectableLineTitleTextRightButton(
label: '预计作业结束时间:', label: '预计作业结束时间:',
isEditable: widget.isEditable, isEditable: widget.isEditable,
onTap: widget.onWorkEndTimeHandle ?? () {}, onTap: () async {
DateTime? picked = await BottomDateTimePicker.showDate(
context,
minTimeStr: pd['WORK_EXPECTED_START_TIME'] ?? '',
allowFuture: true,
);
if (picked != null) {
setState(() {
pd['WORK_EXPECTED_END_TIME'] = DateFormat(
'yyyy-MM-dd HH:mm:ss',
).format(picked);
});
}
},
text: pd['WORK_EXPECTED_END_TIME'] ?? '', text: pd['WORK_EXPECTED_END_TIME'] ?? '',
), ),
const Divider(), const Divider(),

View File

@ -173,44 +173,8 @@ class _HighworkApplyDetailState extends State<HighworkApplyDetail> {
}); });
} }
} }
///
Future<void> _chooseWorkStartTime() async {
DateTime? picked = await BottomDateTimePicker.showDate(
context,
allowFuture: true,
);
if (picked != null) {
setState(() {
pd['WORK_EXPECTED_START_TIME'] = DateFormat(
'yyyy-MM-dd HH:mm:ss',
).format(picked);
///
if (FormUtils.hasValue(pd, 'WORK_EXPECTED_END_TIME') &&
!isBeforeStr(
pd['WORK_EXPECTED_START_TIME'],
pd['WORK_EXPECTED_END_TIME'],
)) {
pd['WORK_EXPECTED_END_TIME'] = '';
}
});
}
}
///
Future<void> _chooseWorkEndTime() async {
DateTime? picked = await BottomDateTimePicker.showDate(
context,
minTimeStr: pd['WORK_EXPECTED_START_TIME'] ?? '',
allowFuture: true,
);
if (picked != null) {
setState(() {
pd['WORK_EXPECTED_END_TIME'] = DateFormat(
'yyyy-MM-dd HH:mm:ss',
).format(picked);
});
}
}
/// ///
Future<void> _showLocationHandle() async{ Future<void> _showLocationHandle() async{
if (!FormUtils.hasValue(pd, 'ELECTRONIC_FENCE_AREA_ID')) { if (!FormUtils.hasValue(pd, 'ELECTRONIC_FENCE_AREA_ID')) {
@ -659,8 +623,6 @@ class _HighworkApplyDetailState extends State<HighworkApplyDetail> {
onChooseLevel: _chooseLevel, onChooseLevel: _chooseLevel,
// //
onChooseVideoManager: _chooseVideoManager, onChooseVideoManager: _chooseVideoManager,
onWorkStartTimeHandle: _chooseWorkStartTime,
onWorkEndTimeHandle: _chooseWorkEndTime,
onContractorHandle: _chooseUnitManager, onContractorHandle: _chooseUnitManager,
onWorkAreaHandle: _getWorkArea, onWorkAreaHandle: _getWorkArea,
onWorkAreaLocationHandle: _showLocationHandle, onWorkAreaLocationHandle: _showLocationHandle,

View File

@ -310,6 +310,7 @@ class _HighworkJszyDetailState extends State<HighworkJszyDetail> {
), ),
onTap: () async { onTap: () async {
DateTime? picked = await BottomDateTimePicker.showDate( DateTime? picked = await BottomDateTimePicker.showDate(
mode: BottomPickerMode.dateTimeWithSeconds,
context, context,
); );
if (picked != null) { if (picked != null) {

View File

@ -299,6 +299,7 @@ class _HighworkKszyDetailState extends State<HighworkKszyDetail> {
), ),
onTap: () async { onTap: () async {
DateTime? picked = await BottomDateTimePicker.showDate( DateTime? picked = await BottomDateTimePicker.showDate(
mode: BottomPickerMode.dateTimeWithSeconds,
context, context,
); );
if (picked != null) { if (picked != null) {

View File

@ -360,6 +360,7 @@ class _HighworkYsgdDetailState extends State<HighworkYsgdDetail> {
), ),
onTap: () async { onTap: () async {
DateTime? picked = await BottomDateTimePicker.showDate( DateTime? picked = await BottomDateTimePicker.showDate(
mode: BottomPickerMode.dateTimeWithSeconds,
context, context,
); );
if (picked != null) { if (picked != null) {

View File

@ -1,6 +1,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:qhd_prevention/customWidget/ItemWidgetFactory.dart'; import 'package:qhd_prevention/customWidget/ItemWidgetFactory.dart';
import 'package:intl/intl.dart';
import 'package:qhd_prevention/customWidget/picker/CupertinoDatePicker.dart';
import '../../../../../../tools/tools.dart'; import '../../../../../../tools/tools.dart';
import '../../../item_list_widget.dart'; import '../../../item_list_widget.dart';
import '../../special_Wrok/MeasuresListWidget.dart'; import '../../special_Wrok/MeasuresListWidget.dart';
@ -13,11 +14,8 @@ class ElectricityDetailFormWidget extends StatefulWidget {
final VoidCallback onChooseHotworkUser; final VoidCallback onChooseHotworkUser;
final VoidCallback onAnalyzeTap; final VoidCallback onAnalyzeTap;
// //
final VoidCallback? onChooseVideoManager; ///
/// final VoidCallback? onChooseVideoManager;///
final VoidCallback? onWorkStartTimeHandle;
final VoidCallback? onWorkEndTimeHandle;
///
final VoidCallback? onContractorHandle; final VoidCallback? onContractorHandle;
/// ///
final VoidCallback? onWorkAreaHandle; final VoidCallback? onWorkAreaHandle;
@ -43,8 +41,6 @@ class ElectricityDetailFormWidget extends StatefulWidget {
/// ///
this.onChooseVideoManager, this.onChooseVideoManager,
this.onWorkStartTimeHandle,
this.onWorkEndTimeHandle,
this.onContractorHandle, this.onContractorHandle,
this.onWorkAreaHandle, this.onWorkAreaHandle,
this.onWorkAreaLocationHandle, this.onWorkAreaLocationHandle,
@ -199,6 +195,7 @@ class _ElectricityDetailFormWidgetState extends State<ElectricityDetailFormWidge
ItemListWidget.twoRowButtonTitleText( ItemListWidget.twoRowButtonTitleText(
label: '关联其他特殊作业及安全作业票编号', label: '关联其他特殊作业及安全作业票编号',
isRequired: false,
isEditable: widget.isEditable, isEditable: widget.isEditable,
onTap: () async { onTap: () async {
final val = await showDialog<String>( final val = await showDialog<String>(
@ -265,14 +262,49 @@ class _ElectricityDetailFormWidgetState extends State<ElectricityDetailFormWidge
ItemListWidget.selectableLineTitleTextRightButton( ItemListWidget.selectableLineTitleTextRightButton(
label: '预计作业开始时间:', label: '预计作业开始时间:',
isEditable: widget.isEditable, isEditable: widget.isEditable,
onTap: widget.onWorkStartTimeHandle ?? () {}, onTap: () async {
DateTime? picked = await BottomDateTimePicker.showDate(
mode: BottomPickerMode.dateTimeWithSeconds,
context,
allowFuture: true,
);
if (picked != null) {
setState(() {
pd['WORK_EXPECTED_START_TIME'] = DateFormat(
'yyyy-MM-dd HH:mm:ss',
).format(picked);
///
if (FormUtils.hasValue(pd, 'WORK_EXPECTED_END_TIME') &&
!isBeforeStr(
pd['WORK_EXPECTED_START_TIME'],
pd['WORK_EXPECTED_END_TIME'],
)) {
pd['WORK_EXPECTED_END_TIME'] = '';
}
});
}
},
text: pd['WORK_EXPECTED_START_TIME'] ?? '', text: pd['WORK_EXPECTED_START_TIME'] ?? '',
), ),
const Divider(), const Divider(),
ItemListWidget.selectableLineTitleTextRightButton( ItemListWidget.selectableLineTitleTextRightButton(
label: '预计作业结束时间:', label: '预计作业结束时间:',
isEditable: widget.isEditable, isEditable: widget.isEditable,
onTap: widget.onWorkEndTimeHandle ?? () {}, onTap: () async {
DateTime? picked = await BottomDateTimePicker.showDate(
context,
minTimeStr: pd['WORK_EXPECTED_START_TIME'] ?? '',
allowFuture: true,
);
if (picked != null) {
setState(() {
pd['WORK_EXPECTED_END_TIME'] = DateFormat(
'yyyy-MM-dd HH:mm:ss',
).format(picked);
});
}
},
text: pd['WORK_EXPECTED_END_TIME'] ?? '', text: pd['WORK_EXPECTED_END_TIME'] ?? '',
), ),
const Divider(), const Divider(),

View File

@ -316,6 +316,7 @@ class _ElectricityJszyDetailState extends State<ElectricityJszyDetail> {
), ),
onTap: () async { onTap: () async {
DateTime? picked = await BottomDateTimePicker.showDate( DateTime? picked = await BottomDateTimePicker.showDate(
mode: BottomPickerMode.dateTimeWithSeconds,
context, context,
); );
if (picked != null) { if (picked != null) {

View File

@ -308,6 +308,7 @@ class _ElectricityKszyDetailState extends State<ElectricityKszyDetail> {
), ),
onTap: () async { onTap: () async {
DateTime? picked = await BottomDateTimePicker.showDate( DateTime? picked = await BottomDateTimePicker.showDate(
mode: BottomPickerMode.dateTimeWithSeconds,
context, context,
); );
if (picked != null) { if (picked != null) {

View File

@ -191,44 +191,8 @@ class _ElectricityApplyDetailState extends State<ElectricityApplyDetail> {
}); });
} }
} }
///
Future<void> _chooseWorkStartTime() async {
DateTime? picked = await BottomDateTimePicker.showDate(
context,
allowFuture: true,
);
if (picked != null) {
setState(() {
pd['WORK_EXPECTED_START_TIME'] = DateFormat(
'yyyy-MM-dd HH:mm:ss',
).format(picked);
///
if (FormUtils.hasValue(pd, 'WORK_EXPECTED_END_TIME') &&
!isBeforeStr(
pd['WORK_EXPECTED_START_TIME'],
pd['WORK_EXPECTED_END_TIME'],
)) {
pd['WORK_EXPECTED_END_TIME'] = '';
}
});
}
}
///
Future<void> _chooseWorkEndTime() async {
DateTime? picked = await BottomDateTimePicker.showDate(
context,
minTimeStr: pd['WORK_EXPECTED_START_TIME'] ?? '',
allowFuture: true,
);
if (picked != null) {
setState(() {
pd['WORK_EXPECTED_END_TIME'] = DateFormat(
'yyyy-MM-dd HH:mm:ss',
).format(picked);
});
}
}
/// ///
Future<void> _showLocationHandle() async{ Future<void> _showLocationHandle() async{
if (!FormUtils.hasValue(pd, 'ELECTRONIC_FENCE_AREA_ID')) { if (!FormUtils.hasValue(pd, 'ELECTRONIC_FENCE_AREA_ID')) {
@ -670,8 +634,6 @@ class _ElectricityApplyDetailState extends State<ElectricityApplyDetail> {
}, },
// //
onChooseVideoManager: _chooseVideoManager, onChooseVideoManager: _chooseVideoManager,
onWorkStartTimeHandle: _chooseWorkStartTime,
onWorkEndTimeHandle: _chooseWorkEndTime,
onContractorHandle: _chooseUnitManager, onContractorHandle: _chooseUnitManager,
onWorkAreaHandle: _getWorkArea, onWorkAreaHandle: _getWorkArea,
onWorkAreaLocationHandle: _showLocationHandle, onWorkAreaLocationHandle: _showLocationHandle,

View File

@ -366,6 +366,7 @@ class _ElectricityYsgdDetailState extends State<ElectricityYsgdDetail> {
), ),
onTap: () async { onTap: () async {
DateTime? picked = await BottomDateTimePicker.showDate( DateTime? picked = await BottomDateTimePicker.showDate(
mode: BottomPickerMode.dateTimeWithSeconds,
context, context,
); );
if (picked != null) { if (picked != null) {

View File

@ -4,7 +4,8 @@ import 'package:flutter/material.dart';
import 'package:qhd_prevention/customWidget/ItemWidgetFactory.dart'; import 'package:qhd_prevention/customWidget/ItemWidgetFactory.dart';
import 'package:qhd_prevention/customWidget/custom_button.dart'; import 'package:qhd_prevention/customWidget/custom_button.dart';
import 'package:qhd_prevention/customWidget/single_image_viewer.dart'; import 'package:qhd_prevention/customWidget/single_image_viewer.dart';
import 'package:intl/intl.dart';
import 'package:qhd_prevention/customWidget/picker/CupertinoDatePicker.dart';
import '../../../../../../tools/tools.dart'; import '../../../../../../tools/tools.dart';
import '../../../item_list_widget.dart'; import '../../../item_list_widget.dart';
import '../../special_Wrok/MeasuresListWidget.dart'; import '../../special_Wrok/MeasuresListWidget.dart';
@ -46,11 +47,8 @@ class BlindboardDetailFormWidget extends StatefulWidget {
final bool isEditable; final bool isEditable;
final VoidCallback onChooseLevel; final VoidCallback onChooseLevel;
// //
final VoidCallback? onChooseVideoManager; ///
/// final VoidCallback? onChooseVideoManager;///
final VoidCallback? onWorkStartTimeHandle;
final VoidCallback? onWorkEndTimeHandle;
///
final VoidCallback? onContractorHandle; final VoidCallback? onContractorHandle;
/// ///
final VoidCallback? onWorkAreaHandle; final VoidCallback? onWorkAreaHandle;
@ -74,8 +72,6 @@ class BlindboardDetailFormWidget extends StatefulWidget {
required this.boardList, required this.boardList,
/// ///
this.onChooseVideoManager, this.onChooseVideoManager,
this.onWorkStartTimeHandle,
this.onWorkEndTimeHandle,
this.onContractorHandle, this.onContractorHandle,
this.onWorkAreaHandle, this.onWorkAreaHandle,
this.onWorkAreaLocationHandle, this.onWorkAreaLocationHandle,
@ -308,6 +304,7 @@ class _BlindboardDetailFormWidgetState
], ],
ItemListWidget.twoRowButtonTitleText( ItemListWidget.twoRowButtonTitleText(
label: '关联其他特殊作业及安全作业票编号', label: '关联其他特殊作业及安全作业票编号',
isRequired: false,
isEditable: widget.isEditable, isEditable: widget.isEditable,
onTap: () async { onTap: () async {
final val = await showDialog<String>( final val = await showDialog<String>(
@ -375,14 +372,49 @@ class _BlindboardDetailFormWidgetState
ItemListWidget.selectableLineTitleTextRightButton( ItemListWidget.selectableLineTitleTextRightButton(
label: '预计作业开始时间:', label: '预计作业开始时间:',
isEditable: widget.isEditable, isEditable: widget.isEditable,
onTap: widget.onWorkStartTimeHandle ?? () {}, onTap: () async {
DateTime? picked = await BottomDateTimePicker.showDate(
mode: BottomPickerMode.dateTimeWithSeconds,
context,
allowFuture: true,
);
if (picked != null) {
setState(() {
pd['WORK_EXPECTED_START_TIME'] = DateFormat(
'yyyy-MM-dd HH:mm:ss',
).format(picked);
///
if (FormUtils.hasValue(pd, 'WORK_EXPECTED_END_TIME') &&
!isBeforeStr(
pd['WORK_EXPECTED_START_TIME'],
pd['WORK_EXPECTED_END_TIME'],
)) {
pd['WORK_EXPECTED_END_TIME'] = '';
}
});
}
},
text: pd['WORK_EXPECTED_START_TIME'] ?? '', text: pd['WORK_EXPECTED_START_TIME'] ?? '',
), ),
const Divider(), const Divider(),
ItemListWidget.selectableLineTitleTextRightButton( ItemListWidget.selectableLineTitleTextRightButton(
label: '预计作业结束时间:', label: '预计作业结束时间:',
isEditable: widget.isEditable, isEditable: widget.isEditable,
onTap: widget.onWorkEndTimeHandle ?? () {}, onTap: () async {
DateTime? picked = await BottomDateTimePicker.showDate(
context,
minTimeStr: pd['WORK_EXPECTED_START_TIME'] ?? '',
allowFuture: true,
);
if (picked != null) {
setState(() {
pd['WORK_EXPECTED_END_TIME'] = DateFormat(
'yyyy-MM-dd HH:mm:ss',
).format(picked);
});
}
},
text: pd['WORK_EXPECTED_END_TIME'] ?? '', text: pd['WORK_EXPECTED_END_TIME'] ?? '',
), ),
const Divider(), const Divider(),

View File

@ -313,6 +313,7 @@ class _BlindboardJszyDetailState extends State<BlindboardJszyDetail> {
), ),
onTap: () async { onTap: () async {
DateTime? picked = await BottomDateTimePicker.showDate( DateTime? picked = await BottomDateTimePicker.showDate(
mode: BottomPickerMode.dateTimeWithSeconds,
context, context,
); );
if (picked != null) { if (picked != null) {

View File

@ -302,6 +302,7 @@ class _BlindboardKszyDetailState extends State<BlindboardKszyDetail> {
), ),
onTap: () async { onTap: () async {
DateTime? picked = await BottomDateTimePicker.showDate( DateTime? picked = await BottomDateTimePicker.showDate(
mode: BottomPickerMode.dateTimeWithSeconds,
context, context,
); );
if (picked != null) { if (picked != null) {

View File

@ -181,44 +181,8 @@ class _BlindboardApplyDetailState extends State<BlindboardApplyDetail> {
}); });
} }
} }
///
Future<void> _chooseWorkStartTime() async {
DateTime? picked = await BottomDateTimePicker.showDate(
context,
allowFuture: true,
);
if (picked != null) {
setState(() {
pd['WORK_EXPECTED_START_TIME'] = DateFormat(
'yyyy-MM-dd HH:mm:ss',
).format(picked);
///
if (FormUtils.hasValue(pd, 'WORK_EXPECTED_END_TIME') &&
!isBeforeStr(
pd['WORK_EXPECTED_START_TIME'],
pd['WORK_EXPECTED_END_TIME'],
)) {
pd['WORK_EXPECTED_END_TIME'] = '';
}
});
}
}
///
Future<void> _chooseWorkEndTime() async {
DateTime? picked = await BottomDateTimePicker.showDate(
context,
minTimeStr: pd['WORK_EXPECTED_START_TIME'] ?? '',
allowFuture: true,
);
if (picked != null) {
setState(() {
pd['WORK_EXPECTED_END_TIME'] = DateFormat(
'yyyy-MM-dd HH:mm:ss',
).format(picked);
});
}
}
/// ///
Future<void> _showLocationHandle() async{ Future<void> _showLocationHandle() async{
if (!FormUtils.hasValue(pd, 'ELECTRONIC_FENCE_AREA_ID')) { if (!FormUtils.hasValue(pd, 'ELECTRONIC_FENCE_AREA_ID')) {
@ -659,8 +623,6 @@ class _BlindboardApplyDetailState extends State<BlindboardApplyDetail> {
onChooseLevel: _chooseLevel, onChooseLevel: _chooseLevel,
// //
onChooseVideoManager: _chooseVideoManager, onChooseVideoManager: _chooseVideoManager,
onWorkStartTimeHandle: _chooseWorkStartTime,
onWorkEndTimeHandle: _chooseWorkEndTime,
onContractorHandle: _chooseUnitManager, onContractorHandle: _chooseUnitManager,
onWorkAreaHandle: _getWorkArea, onWorkAreaHandle: _getWorkArea,
onWorkAreaLocationHandle: _showLocationHandle, onWorkAreaLocationHandle: _showLocationHandle,

View File

@ -353,6 +353,7 @@ class _BlindboardYsgdDetailState extends State<BlindboardYsgdDetail> {
), ),
onTap: () async { onTap: () async {
DateTime? picked = await BottomDateTimePicker.showDate( DateTime? picked = await BottomDateTimePicker.showDate(
mode: BottomPickerMode.dateTimeWithSeconds,
context, context,
); );
if (picked != null) { if (picked != null) {

View File

@ -1,6 +1,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:qhd_prevention/customWidget/ItemWidgetFactory.dart'; import 'package:qhd_prevention/customWidget/ItemWidgetFactory.dart';
import 'package:intl/intl.dart';
import 'package:qhd_prevention/customWidget/picker/CupertinoDatePicker.dart';
import '../../../../../../tools/tools.dart'; import '../../../../../../tools/tools.dart';
import '../../../item_list_widget.dart'; import '../../../item_list_widget.dart';
import '../../special_Wrok/MeasuresListWidget.dart'; import '../../special_Wrok/MeasuresListWidget.dart';
@ -14,11 +15,8 @@ class SpaceWorkDetailFormWidget extends StatefulWidget {
final VoidCallback onChooseSpaceName; final VoidCallback onChooseSpaceName;
final VoidCallback onAnalyzeTap; final VoidCallback onAnalyzeTap;
// //
final VoidCallback? onChooseVideoManager; ///
/// final VoidCallback? onChooseVideoManager;///
final VoidCallback? onWorkStartTimeHandle;
final VoidCallback? onWorkEndTimeHandle;
///
final VoidCallback? onContractorHandle; final VoidCallback? onContractorHandle;
/// ///
final VoidCallback? onWorkAreaHandle; final VoidCallback? onWorkAreaHandle;
@ -42,8 +40,6 @@ class SpaceWorkDetailFormWidget extends StatefulWidget {
required this.onAnalyzeTap, required this.onAnalyzeTap,
/// ///
this.onChooseVideoManager, this.onChooseVideoManager,
this.onWorkStartTimeHandle,
this.onWorkEndTimeHandle,
this.onContractorHandle, this.onContractorHandle,
this.onWorkAreaHandle, this.onWorkAreaHandle,
this.onWorkAreaLocationHandle, this.onWorkAreaLocationHandle,
@ -171,7 +167,6 @@ class _SpaceWorkDetailFormWidgetState extends State<SpaceWorkDetailFormWidget> {
ItemListWidget.selectableLineTitleTextRightButton( ItemListWidget.selectableLineTitleTextRightButton(
label: '作业开始时间:', label: '作业开始时间:',
isEditable: false, isEditable: false,
onTap: widget.onChooseLevel,
text: pd['WORK_START_DATE'] ?? '', text: pd['WORK_START_DATE'] ?? '',
), ),
], ],
@ -180,13 +175,13 @@ class _SpaceWorkDetailFormWidgetState extends State<SpaceWorkDetailFormWidget> {
ItemListWidget.selectableLineTitleTextRightButton( ItemListWidget.selectableLineTitleTextRightButton(
label: '作业结束时间:', label: '作业结束时间:',
isEditable: false, isEditable: false,
onTap: widget.onChooseLevel,
text: pd['WORK_END_DATE'] ?? '', text: pd['WORK_END_DATE'] ?? '',
), ),
], ],
const Divider(), const Divider(),
ItemListWidget.twoRowButtonTitleText( ItemListWidget.twoRowButtonTitleText(
label: '关联其他特殊作业及安全作业票编号', label: '关联其他特殊作业及安全作业票编号',
isRequired: false,
isEditable: widget.isEditable, isEditable: widget.isEditable,
onTap: () async { onTap: () async {
final val = await showDialog<String>( final val = await showDialog<String>(
@ -254,14 +249,49 @@ class _SpaceWorkDetailFormWidgetState extends State<SpaceWorkDetailFormWidget> {
ItemListWidget.selectableLineTitleTextRightButton( ItemListWidget.selectableLineTitleTextRightButton(
label: '预计作业开始时间:', label: '预计作业开始时间:',
isEditable: widget.isEditable, isEditable: widget.isEditable,
onTap: widget.onWorkStartTimeHandle ?? () {}, onTap: () async {
DateTime? picked = await BottomDateTimePicker.showDate(
mode: BottomPickerMode.dateTimeWithSeconds,
context,
allowFuture: true,
);
if (picked != null) {
setState(() {
pd['WORK_EXPECTED_START_TIME'] = DateFormat(
'yyyy-MM-dd HH:mm:ss',
).format(picked);
///
if (FormUtils.hasValue(pd, 'WORK_EXPECTED_END_TIME') &&
!isBeforeStr(
pd['WORK_EXPECTED_START_TIME'],
pd['WORK_EXPECTED_END_TIME'],
)) {
pd['WORK_EXPECTED_END_TIME'] = '';
}
});
}
},
text: pd['WORK_EXPECTED_START_TIME'] ?? '', text: pd['WORK_EXPECTED_START_TIME'] ?? '',
), ),
const Divider(), const Divider(),
ItemListWidget.selectableLineTitleTextRightButton( ItemListWidget.selectableLineTitleTextRightButton(
label: '预计作业结束时间:', label: '预计作业结束时间:',
isEditable: widget.isEditable, isEditable: widget.isEditable,
onTap: widget.onWorkEndTimeHandle ?? () {}, onTap: () async {
DateTime? picked = await BottomDateTimePicker.showDate(
context,
minTimeStr: pd['WORK_EXPECTED_START_TIME'] ?? '',
allowFuture: true,
);
if (picked != null) {
setState(() {
pd['WORK_EXPECTED_END_TIME'] = DateFormat(
'yyyy-MM-dd HH:mm:ss',
).format(picked);
});
}
},
text: pd['WORK_EXPECTED_END_TIME'] ?? '', text: pd['WORK_EXPECTED_END_TIME'] ?? '',
), ),
const Divider(), const Divider(),

View File

@ -320,6 +320,7 @@ class _SpaceworkJszyDetailState extends State<SpaceworkJszyDetail> {
), ),
onTap: () async { onTap: () async {
DateTime? picked = await BottomDateTimePicker.showDate( DateTime? picked = await BottomDateTimePicker.showDate(
mode: BottomPickerMode.dateTimeWithSeconds,
context, context,
); );
if (picked != null) { if (picked != null) {

View File

@ -313,6 +313,7 @@ class _SpaceworkKszyDetailState extends State<SpaceworkKszyDetail> {
), ),
onTap: () async { onTap: () async {
DateTime? picked = await BottomDateTimePicker.showDate( DateTime? picked = await BottomDateTimePicker.showDate(
mode: BottomPickerMode.dateTimeWithSeconds,
context, context,
); );
if (picked != null) { if (picked != null) {

View File

@ -186,45 +186,9 @@ class _SpaceworkApplyDetailState extends State<SpaceworkApplyDetail> {
} }
} }
///
Future<void> _chooseWorkStartTime() async {
DateTime? picked = await BottomDateTimePicker.showDate(
context,
allowFuture: true,
);
if (picked != null) {
setState(() {
pd['WORK_EXPECTED_START_TIME'] = DateFormat(
'yyyy-MM-dd HH:mm:ss',
).format(picked);
///
if (FormUtils.hasValue(pd, 'WORK_EXPECTED_END_TIME') &&
!isBeforeStr(
pd['WORK_EXPECTED_START_TIME'],
pd['WORK_EXPECTED_END_TIME'],
)) {
pd['WORK_EXPECTED_END_TIME'] = '';
}
});
}
}
///
Future<void> _chooseWorkEndTime() async {
DateTime? picked = await BottomDateTimePicker.showDate(
context,
minTimeStr: pd['WORK_EXPECTED_START_TIME'] ?? '',
allowFuture: true,
);
if (picked != null) {
setState(() {
pd['WORK_EXPECTED_END_TIME'] = DateFormat(
'yyyy-MM-dd HH:mm:ss',
).format(picked);
});
}
}
/// ///
Future<void> _showLocationHandle() async { Future<void> _showLocationHandle() async {
@ -665,8 +629,6 @@ class _SpaceworkApplyDetailState extends State<SpaceworkApplyDetail> {
onAnalyzeTap: () {}, onAnalyzeTap: () {},
// //
onChooseVideoManager: _chooseVideoManager, onChooseVideoManager: _chooseVideoManager,
onWorkStartTimeHandle: _chooseWorkStartTime,
onWorkEndTimeHandle: _chooseWorkEndTime,
onContractorHandle: _chooseUnitManager, onContractorHandle: _chooseUnitManager,
onWorkAreaHandle: _getWorkArea, onWorkAreaHandle: _getWorkArea,
onWorkAreaLocationHandle: _showLocationHandle, onWorkAreaLocationHandle: _showLocationHandle,

View File

@ -370,6 +370,7 @@ class _SpaceworkYsgdDetailState extends State<SpaceworkYsgdDetail> {
), ),
onTap: () async { onTap: () async {
DateTime? picked = await BottomDateTimePicker.showDate( DateTime? picked = await BottomDateTimePicker.showDate(
mode: BottomPickerMode.dateTimeWithSeconds,
context, context,
); );
if (picked != null) { if (picked != null) {

View File

@ -214,7 +214,7 @@ class _MinePageState extends State<MinePage> {
child: Row( child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
Text(text, style: TextStyle(fontSize: 16),), Text(text, style: TextStyle(fontSize: 14),),
Icon(Icons.chevron_right) Icon(Icons.chevron_right)
], ],
), ),

View File

@ -6,6 +6,7 @@ import 'dart:ui' as ui;
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:path_provider/path_provider.dart'; import 'package:path_provider/path_provider.dart';
import 'package:qhd_prevention/tools/tools.dart';
class MineSignPage extends StatelessWidget { class MineSignPage extends StatelessWidget {
const MineSignPage({super.key}); const MineSignPage({super.key});
@ -95,6 +96,7 @@ class _SignatureConfirmPageState extends State<SignatureConfirmPage> {
@override @override
void initState() { void initState() {
super.initState(); super.initState();
NativeOrientation.setLandscape();
SystemChrome.setPreferredOrientations([ SystemChrome.setPreferredOrientations([
DeviceOrientation.landscapeRight, DeviceOrientation.landscapeRight,
DeviceOrientation.landscapeLeft, DeviceOrientation.landscapeLeft,
@ -106,8 +108,9 @@ class _SignatureConfirmPageState extends State<SignatureConfirmPage> {
// //
SystemChrome.setPreferredOrientations([ SystemChrome.setPreferredOrientations([
DeviceOrientation.portraitUp, DeviceOrientation.portraitUp,
]); ]);
NativeOrientation.setPortrait();
super.dispose(); super.dispose();
} }