八项作业翻版完成
parent
698ccad423
commit
72c9e8c00d
|
|
@ -247,8 +247,8 @@ class ListItemFactory {
|
|||
/// YesNo
|
||||
static Widget createYesNoSection({
|
||||
required String title,
|
||||
required String yesLabel,
|
||||
required String noLabel,
|
||||
String yesLabel = '是',
|
||||
String noLabel = '否',
|
||||
required bool groupValue,
|
||||
required ValueChanged<bool> onChanged,
|
||||
double verticalPadding = 15,
|
||||
|
|
@ -313,14 +313,15 @@ class ListItemFactory {
|
|||
}
|
||||
|
||||
/// 列表标题头(蓝色标识+文字)
|
||||
static Widget createBuildSimpleSection(String title) {
|
||||
static Widget createBuildSimpleSection(String title, {double horPadding = 10}) {
|
||||
|
||||
return Container(
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.white,
|
||||
borderRadius: BorderRadius.circular(8),
|
||||
),
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 10),
|
||||
padding: EdgeInsets.symmetric(horizontal: horPadding, vertical: 10),
|
||||
child: Row(
|
||||
children: [
|
||||
Container(width: 3, height: 15, color: Colors.blue),
|
||||
|
|
|
|||
|
|
@ -61,10 +61,12 @@ class _MediaPickerGridState extends State<MediaPickerRow> {
|
|||
Future<void> _showPickerOptions() async {
|
||||
showModalBottomSheet(
|
||||
context: context,
|
||||
backgroundColor: Colors.white,
|
||||
builder: (_) => SafeArea(
|
||||
child: Wrap(
|
||||
children: [
|
||||
ListTile(
|
||||
titleAlignment: ListTileTitleAlignment.center,
|
||||
leading: Icon(
|
||||
widget.mediaType == MediaType.image
|
||||
? Icons.camera_alt
|
||||
|
|
@ -79,6 +81,8 @@ class _MediaPickerGridState extends State<MediaPickerRow> {
|
|||
},
|
||||
),
|
||||
ListTile(
|
||||
titleAlignment: ListTileTitleAlignment.center,
|
||||
|
||||
leading: Icon(
|
||||
widget.mediaType == MediaType.image
|
||||
? Icons.photo_library
|
||||
|
|
@ -95,6 +99,8 @@ class _MediaPickerGridState extends State<MediaPickerRow> {
|
|||
},
|
||||
),
|
||||
ListTile(
|
||||
titleAlignment: ListTileTitleAlignment.center,
|
||||
|
||||
leading: const Icon(Icons.close),
|
||||
title: const Text('取消'),
|
||||
onTap: () => Navigator.of(context).pop(),
|
||||
|
|
@ -212,7 +218,7 @@ class _MediaPickerGridState extends State<MediaPickerRow> {
|
|||
),
|
||||
Positioned(
|
||||
top: -15,
|
||||
right: -10,
|
||||
right: -15,
|
||||
child: IconButton(
|
||||
icon: const Icon(Icons.cancel, size: 20, color: Colors.red),
|
||||
onPressed: () => _removeMedia(index),
|
||||
|
|
@ -263,7 +269,7 @@ class RepairedPhotoSection extends StatefulWidget {
|
|||
this.isShowAI = false,
|
||||
required this.onChanged,
|
||||
required this.onAiIdentify,
|
||||
this.horizontalPadding = 10,
|
||||
this.horizontalPadding = 5,
|
||||
this.onMediaAdded,
|
||||
this.onMediaRemoved,
|
||||
this.isRequired = false,
|
||||
|
|
|
|||
|
|
@ -679,6 +679,7 @@ U6Hzm1ninpWeE+awIDAQAB
|
|||
},
|
||||
);
|
||||
}
|
||||
/// 所有签名列表
|
||||
static Future<Map<String, dynamic>> listSignFinished(String workType,String hotworkId) {
|
||||
// 根据 workType 生成对应的字段名,比如 'hotwork' -> 'HOTWORK_ID'
|
||||
final idKey = '${workType.toUpperCase()}_ID';
|
||||
|
|
|
|||
|
|
@ -31,18 +31,18 @@ void main() async {
|
|||
WidgetsFlutterBinding.ensureInitialized();
|
||||
|
||||
// 初始化 EasyLoading
|
||||
// 配置 EasyLoading 全局实例
|
||||
EasyLoading.instance
|
||||
..displayDuration = const Duration(milliseconds: 2000)
|
||||
..indicatorType = EasyLoadingIndicatorType.fadingCircle
|
||||
..loadingStyle = EasyLoadingStyle.dark
|
||||
..indicatorSize = 45.0
|
||||
..radius = 10.0
|
||||
..progressColor = Colors.blue
|
||||
..backgroundColor = Colors.black.withOpacity(0.7)
|
||||
..indicatorColor = Colors.blue
|
||||
..textColor = Colors.white
|
||||
..maskColor = Colors.black.withOpacity(0.3)
|
||||
..userInteractions = false
|
||||
..displayDuration = const Duration(seconds: 20)
|
||||
..indicatorType = EasyLoadingIndicatorType.ring // 使用环形指示器
|
||||
..loadingStyle = EasyLoadingStyle.custom // 必须使用自定义样式
|
||||
..indicatorSize = 36.0 // 接近系统默认大小
|
||||
..radius = 0 // 无圆角
|
||||
..progressColor = Colors.blue // 进度条颜色为系统蓝色
|
||||
..backgroundColor = Colors.grey.shade100
|
||||
..indicatorColor = Colors.blue // 指示器颜色为系统蓝色
|
||||
..textColor = Colors.black // 隐藏文字
|
||||
..userInteractions = false // 允许用户交互(系统指示器不阻止交互)
|
||||
..dismissOnTap = false;
|
||||
|
||||
await initializeDateFormatting('zh_CN', null);
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@ import 'package:flutter/material.dart';
|
|||
import 'package:qhd_prevention/customWidget/custom_button.dart';
|
||||
import 'package:qhd_prevention/customWidget/single_image_viewer.dart';
|
||||
import 'package:qhd_prevention/http/ApiService.dart';
|
||||
import 'package:qhd_prevention/tools/tools.dart';
|
||||
|
||||
class ItemListWidget {
|
||||
static const Color detailtextColor = Colors.black54;
|
||||
|
|
@ -19,8 +20,10 @@ class ItemListWidget {
|
|||
String hintText = '请输入',
|
||||
double fontSize = 15, // 字体大小
|
||||
bool isRequired = true,
|
||||
bool strongRequired = false, /// 强制必选 不受是否可以编译和是否必选影响
|
||||
bool strongRequired = false,
|
||||
ValueChanged<String>? onChanged,
|
||||
|
||||
/// 强制必选 不受是否可以编译和是否必选影响
|
||||
TextInputType keyboardType = TextInputType.text,
|
||||
}) {
|
||||
return Container(
|
||||
|
|
@ -50,6 +53,7 @@ class ItemListWidget {
|
|||
child: TextField(
|
||||
autofocus: false,
|
||||
controller: controller,
|
||||
onChanged: onChanged, // <--- 直接回传实时值
|
||||
keyboardType: keyboardType,
|
||||
style: TextStyle(fontSize: fontSize),
|
||||
maxLines: 1,
|
||||
|
|
@ -152,8 +156,7 @@ class ItemListWidget {
|
|||
bool isClean = false,
|
||||
VoidCallback? onTapClean, // 清除回调
|
||||
bool isRequired = true,
|
||||
String cleanText = '清除'
|
||||
|
||||
String cleanText = '清除',
|
||||
}) {
|
||||
return InkWell(
|
||||
onTap: isEditable ? onTap : null,
|
||||
|
|
@ -184,7 +187,8 @@ class ItemListWidget {
|
|||
padding: EdgeInsets.symmetric(horizontal: 10, vertical: 0),
|
||||
textStyle: TextStyle(fontSize: 11, color: Colors.white),
|
||||
borderRadius: 10,
|
||||
backgroundColor: cleanText == '清除' ? Colors.red : Colors.green,
|
||||
backgroundColor:
|
||||
cleanText == '清除' ? Colors.red : Colors.green,
|
||||
onPressed: onTapClean,
|
||||
),
|
||||
SizedBox(height: 20),
|
||||
|
|
@ -269,10 +273,17 @@ class ItemListWidget {
|
|||
CustomButton(
|
||||
text: cleanText,
|
||||
height: 20,
|
||||
padding: EdgeInsets.symmetric(horizontal: 10, vertical: 0),
|
||||
textStyle: TextStyle(fontSize: 11, color: Colors.white),
|
||||
padding: EdgeInsets.symmetric(
|
||||
horizontal: 10,
|
||||
vertical: 0,
|
||||
),
|
||||
textStyle: TextStyle(
|
||||
fontSize: 11,
|
||||
color: Colors.white,
|
||||
),
|
||||
borderRadius: 10,
|
||||
backgroundColor: cleanText == '清除' ? Colors.red : Colors.green,
|
||||
backgroundColor:
|
||||
cleanText == '清除' ? Colors.red : Colors.green,
|
||||
onPressed: onTapClean,
|
||||
),
|
||||
SizedBox(height: 20),
|
||||
|
|
@ -292,7 +303,6 @@ class ItemListWidget {
|
|||
),
|
||||
),
|
||||
),
|
||||
|
||||
],
|
||||
),
|
||||
),
|
||||
|
|
@ -302,7 +312,6 @@ class ItemListWidget {
|
|||
);
|
||||
}
|
||||
|
||||
|
||||
/// 两行垂直布局:
|
||||
/// 第一行:可点击选择(带箭头)或仅显示标题
|
||||
/// 第二行:多行输入框或多行文本展示
|
||||
|
|
@ -541,7 +550,7 @@ class ItemListWidget {
|
|||
static Widget OneRowButtonTitle({
|
||||
required String label, // 标题
|
||||
required String buttonText, // 按钮文字
|
||||
required VoidCallback? onTap, // 第一行点击回调
|
||||
required VoidCallback onTap, // 第一行点击回调
|
||||
double fontSize = 15, // 字体大小
|
||||
Color btnColor = Colors.blue,
|
||||
bool isRequired = false,
|
||||
|
|
@ -602,10 +611,11 @@ class ItemListWidget {
|
|||
),
|
||||
GestureDetector(
|
||||
onTap: () {
|
||||
if (imgPath.isNotEmpty)
|
||||
if (imgPath.isNotEmpty) {
|
||||
SingleImageViewer(
|
||||
imageUrl: '${ApiService.baseImgPath}${imgPath}',
|
||||
);
|
||||
}
|
||||
},
|
||||
child:
|
||||
imgPath.isNotEmpty
|
||||
|
|
@ -621,6 +631,83 @@ class ItemListWidget {
|
|||
);
|
||||
}
|
||||
|
||||
/// 两行垂直布局:
|
||||
/// 标题
|
||||
/// 第二行:图片
|
||||
static Widget twoRowTitleAndImages({
|
||||
required String title, // 第一行标题
|
||||
required List<dynamic>? imageUrls, // 传入 pd['CONTENT_IMG_PATH']
|
||||
double row2Height = 80, // 第二行高度
|
||||
double fontSize = 15, // 字体大小
|
||||
void Function(String)? onTapCallBack,
|
||||
bool isRequired = true,
|
||||
}) {
|
||||
return Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
|
||||
children: [
|
||||
// 标题部分
|
||||
Padding(
|
||||
padding: const EdgeInsets.symmetric(vertical: 8.0, horizontal: 12),
|
||||
child: Text(
|
||||
title,
|
||||
style: TextStyle(
|
||||
fontSize: fontSize,
|
||||
fontWeight: FontWeight.bold,
|
||||
),
|
||||
),
|
||||
),
|
||||
|
||||
// 图片横向滚动区域
|
||||
SizedBox(
|
||||
height: 80, // 图片区域固定高度
|
||||
child: ListView.builder(
|
||||
padding: EdgeInsets.symmetric(horizontal: 12),
|
||||
scrollDirection: Axis.horizontal,
|
||||
itemCount: imageUrls?.length,
|
||||
itemBuilder: (context, index) {
|
||||
return Container(
|
||||
margin: const EdgeInsets.only(right: 8), // 图片间距
|
||||
child: ClipRRect(
|
||||
|
||||
borderRadius: BorderRadius.circular(8),
|
||||
child: GestureDetector(
|
||||
onTap: () {
|
||||
if (onTapCallBack != null) onTapCallBack('${ApiService.baseImgPath}${imageUrls![index] ?? ''}');
|
||||
},
|
||||
child: Image.network(
|
||||
'${ApiService.baseImgPath}${imageUrls![index] ?? ''}',
|
||||
width: 80, // 图片宽度
|
||||
height: 80, // 图片高度
|
||||
fit: BoxFit.cover,
|
||||
loadingBuilder: (context, child, loadingProgress) {
|
||||
if (loadingProgress == null) return child;
|
||||
return Container(
|
||||
width: 80,
|
||||
height: 80,
|
||||
color: Colors.grey[200],
|
||||
child: const Center(child: CircularProgressIndicator()),
|
||||
);
|
||||
},
|
||||
errorBuilder: (context, error, stackTrace) {
|
||||
return Container(
|
||||
width: 80,
|
||||
height: 80,
|
||||
color: Colors.grey[200],
|
||||
child: const Icon(Icons.broken_image, size: 40),
|
||||
);
|
||||
},
|
||||
),
|
||||
)
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
static Widget itemContainer(Widget child) {
|
||||
return Container(
|
||||
decoration: BoxDecoration(
|
||||
|
|
|
|||
|
|
@ -19,7 +19,7 @@ class MeasuresListWidget extends StatelessWidget {
|
|||
required this.baseImgPath,
|
||||
required this.isAllowEdit,
|
||||
this.onSign,
|
||||
this.isShowSign = false,
|
||||
this.isShowSign = true,
|
||||
|
||||
});
|
||||
/// 接口返回的原始 Map 列表
|
||||
|
|
@ -164,6 +164,7 @@ class MeasuresListWidget extends StatelessWidget {
|
|||
(item['IMG_PATH'] as String).split(','),
|
||||
'',
|
||||
),
|
||||
|
||||
],
|
||||
),
|
||||
),
|
||||
|
|
|
|||
|
|
@ -100,7 +100,7 @@ class _HotworkGasListState extends State<HotworkGasList> {
|
|||
final img = baseImgPath + images[i];
|
||||
return GestureDetector(
|
||||
onTap: () {
|
||||
present(
|
||||
presentOpaque(
|
||||
SingleImageViewer(imageUrl: img),
|
||||
context,
|
||||
);
|
||||
|
|
|
|||
|
|
@ -1,36 +1,42 @@
|
|||
import 'dart:math' as math;
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:qhd_prevention/customWidget/ItemWidgetFactory.dart';
|
||||
import 'package:qhd_prevention/customWidget/single_image_viewer.dart';
|
||||
import 'package:qhd_prevention/http/ApiService.dart';
|
||||
|
||||
import '../../../../../../tools/tools.dart';
|
||||
import '../../../item_list_widget.dart';
|
||||
import '../../special_Wrok/MeasuresListWidget.dart';
|
||||
|
||||
/// 通用高处作业明细表单组件(支持编辑/只读)
|
||||
/// 通用断路作业明细表单组件(支持编辑/只读)
|
||||
class CutroadDetailFormWidget extends StatefulWidget {
|
||||
final Map<String, dynamic> pd;
|
||||
final bool isEditable;
|
||||
final VoidCallback onChooseLevel;
|
||||
|
||||
/// 编辑模式下需提供以下控制器,非编辑模式可不传
|
||||
final TextEditingController? locationController; // 地点
|
||||
final TextEditingController? hightController; // 高度
|
||||
final TextEditingController? contentController; // 内容
|
||||
final TextEditingController? unitController; // 涉及部门
|
||||
final TextEditingController? contentController; // 原因
|
||||
final TextEditingController? relatedController;
|
||||
final TextEditingController? riskController;
|
||||
/// 其他签字数据
|
||||
final signs;
|
||||
|
||||
const CutroadDetailFormWidget({
|
||||
Key? key,
|
||||
required this.pd,
|
||||
required this.isEditable,
|
||||
required this.onChooseLevel,
|
||||
this.locationController,
|
||||
this.hightController,
|
||||
this.unitController,
|
||||
this.contentController,
|
||||
this.relatedController,
|
||||
this.riskController,
|
||||
this.signs = null,
|
||||
|
||||
}) : assert(
|
||||
!isEditable ||
|
||||
(locationController != null &&
|
||||
hightController != null &&
|
||||
(unitController != null &&
|
||||
contentController != null &&
|
||||
relatedController != null &&
|
||||
riskController != null),
|
||||
|
|
@ -43,16 +49,180 @@ class CutroadDetailFormWidget extends StatefulWidget {
|
|||
}
|
||||
|
||||
class _CutroadDetailFormWidgetState extends State<CutroadDetailFormWidget> {
|
||||
String _getWorkLevelText(dynamic level) {
|
||||
switch (level?.toString()) {
|
||||
case '1': return 'I级高处作业';
|
||||
case '2': return 'II级高处作业';
|
||||
case '3': return 'III级高处作业';
|
||||
case '4': return 'IV级高处作业';
|
||||
default: return '';
|
||||
}
|
||||
Widget _itemContainer(Widget child) {
|
||||
return Container(
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.white,
|
||||
borderRadius: BorderRadius.circular(8),
|
||||
),
|
||||
padding: const EdgeInsets.symmetric(horizontal: 5, vertical: 8),
|
||||
child: child,
|
||||
);
|
||||
}
|
||||
Widget signItemWidget(
|
||||
String signKey,
|
||||
String nameKey,
|
||||
String name,
|
||||
BuildContext context,
|
||||
) {
|
||||
return _itemContainer(
|
||||
Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
// 标题行
|
||||
Padding(
|
||||
padding: const EdgeInsets.symmetric(vertical: 5, horizontal: 10),
|
||||
child: Row(
|
||||
children: [
|
||||
Expanded(
|
||||
child: ListItemFactory.headerTitle(name),
|
||||
),
|
||||
if (FormUtils.hasValue(widget.pd, nameKey))
|
||||
Text(
|
||||
widget.pd[nameKey]?.toString() ?? '',
|
||||
style: const TextStyle(fontSize: 16),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 8),
|
||||
|
||||
if (FormUtils.hasValue(widget.signs, signKey))
|
||||
...((widget.signs[signKey] as List<dynamic>)
|
||||
.cast<Map<String, dynamic>>()
|
||||
.map((item) {
|
||||
// 解析 SIGN_PATH
|
||||
List<String> signPaths = [];
|
||||
final rawSP = FormUtils.hasValue(item, 'SIGN_PATH') ? item['SIGN_PATH'] : null;
|
||||
if (rawSP is String && rawSP.isNotEmpty) {
|
||||
signPaths = rawSP.split(',').map((s) => s.trim()).toList();
|
||||
} else if (rawSP is List) {
|
||||
signPaths = rawSP.cast<String>();
|
||||
}
|
||||
|
||||
// 解析 SIGN_TIME 保留空格
|
||||
List<String> signTimes = [];
|
||||
final rawST = FormUtils.hasValue(item, 'SIGN_TIME') ? item['SIGN_TIME'] : null;
|
||||
if (rawST is String && rawST.isNotEmpty) {
|
||||
signTimes = rawST.split(',');
|
||||
} else if (rawST is List) {
|
||||
signTimes = rawST.cast<String>();
|
||||
}
|
||||
|
||||
final pairCount = math.min(signPaths.length, signTimes.length);
|
||||
|
||||
// 解析 IMG_PATH, 最多 2 张
|
||||
List<String> imgPaths = [];
|
||||
final rawIP = FormUtils.hasValue(item, 'IMG_PATH') ? item['IMG_PATH'] : null;
|
||||
if (rawIP is String && rawIP.isNotEmpty) {
|
||||
imgPaths = rawIP.split(',').map((s) => s.trim()).take(2).toList();
|
||||
} else if (rawIP is List) {
|
||||
imgPaths = rawIP.cast<String>().take(2).toList();
|
||||
}
|
||||
|
||||
return Padding(
|
||||
padding: const EdgeInsets.symmetric(vertical: 8.0, horizontal: 10),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
if (imgPaths.isNotEmpty) ...[
|
||||
Row(
|
||||
children: imgPaths.map((p) {
|
||||
final fullUrl = '${ApiService.baseImgPath}$p';
|
||||
return GestureDetector(
|
||||
onTap: () => presentOpaque(
|
||||
SingleImageViewer(imageUrl: fullUrl),
|
||||
context,
|
||||
),
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.only(right: 8.0),
|
||||
child: ClipRRect(
|
||||
borderRadius: BorderRadius.circular(2),
|
||||
child: Image.network(
|
||||
fullUrl,
|
||||
width: 50,
|
||||
height: 50,
|
||||
fit: BoxFit.cover,
|
||||
errorBuilder: (_, __, ___) => const Icon(
|
||||
Icons.broken_image,
|
||||
size: 40,
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}).toList(),
|
||||
),
|
||||
const SizedBox(height: 8),
|
||||
],
|
||||
|
||||
// 签名及时间
|
||||
...List.generate(pairCount, (index) {
|
||||
final imgPath = signPaths[index];
|
||||
final timeLabel = signTimes[index];
|
||||
final fullUrl = '${ApiService.baseImgPath}$imgPath';
|
||||
const imageWidth = 200.0;
|
||||
const imageHeight = 100.0;
|
||||
|
||||
return Padding(
|
||||
padding: const EdgeInsets.symmetric(vertical: 8.0),
|
||||
child: Column(
|
||||
children: [
|
||||
Row(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
GestureDetector(
|
||||
onTap: () => presentOpaque(
|
||||
SingleImageViewer(imageUrl: fullUrl),
|
||||
context,
|
||||
),
|
||||
child: ClipRRect(
|
||||
borderRadius: BorderRadius.circular(4),
|
||||
child: Image.network(
|
||||
fullUrl,
|
||||
width: imageWidth,
|
||||
height: imageHeight,
|
||||
fit: BoxFit.cover,
|
||||
errorBuilder: (_, __, ___) =>
|
||||
const Icon(Icons.broken_image, size: 60),
|
||||
),
|
||||
),
|
||||
),
|
||||
const SizedBox(width: 12),
|
||||
Expanded(
|
||||
child: SizedBox(
|
||||
height: imageHeight,
|
||||
child: Align(
|
||||
alignment: Alignment.bottomRight,
|
||||
child: Text(
|
||||
timeLabel,
|
||||
style: const TextStyle(
|
||||
fontSize: 14,
|
||||
color: Colors.black87,
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
if (index < pairCount - 1)
|
||||
const Padding(
|
||||
padding: EdgeInsets.only(top: 8.0),
|
||||
child: Divider(height: 1),
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}),
|
||||
],
|
||||
),
|
||||
);
|
||||
}).toList()),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final pd = widget.pd;
|
||||
|
|
@ -74,36 +244,45 @@ class _CutroadDetailFormWidgetState extends State<CutroadDetailFormWidget> {
|
|||
const Divider(),
|
||||
],
|
||||
ItemListWidget.singleLineTitleText(
|
||||
label: '作业地点:',
|
||||
isEditable: widget.isEditable,
|
||||
controller: widget.locationController,
|
||||
text: pd['WORK_PLACE'] ?? '',
|
||||
label: '申请部门:',
|
||||
isEditable: false,
|
||||
text: pd['APPLY_DEPARTMENT_NAME'] ?? '',
|
||||
),
|
||||
const Divider(),
|
||||
|
||||
ItemListWidget.singleLineTitleText(
|
||||
label: '作业高度(米):',
|
||||
keyboardType: TextInputType.numberWithOptions(
|
||||
decimal: true, // 允许小数点
|
||||
signed: false, // 允许负号(如需)
|
||||
),
|
||||
label: '涉及相关单位(部门):',
|
||||
isEditable: widget.isEditable,
|
||||
controller: widget.hightController,
|
||||
text: pd['WORK_HIGH'] ?? '',
|
||||
),
|
||||
const Divider(),
|
||||
ItemListWidget.selectableLineTitleTextRightButton(
|
||||
label: '高处作业级别:',
|
||||
isEditable: widget.isEditable,
|
||||
onTap: widget.onChooseLevel,
|
||||
text: _getWorkLevelText(pd['WORK_LEVEL']),
|
||||
hintText: '请输入涉及相关单位(部门)',
|
||||
controller: widget.unitController,
|
||||
text: pd['OTHER_DEPT'] ?? '',
|
||||
),
|
||||
const Divider(),
|
||||
ItemListWidget.multiLineTitleTextField(
|
||||
label: '作业内容:',
|
||||
label: '断路原因:',
|
||||
isEditable: widget.isEditable,
|
||||
controller: widget.contentController,
|
||||
text: pd['WORK_CONTENT'] ?? '',
|
||||
hintText: '请输入断路原因',
|
||||
text: pd['WORK_REASON'] ?? '',
|
||||
),
|
||||
if (!widget.isEditable && FormUtils.hasValue(pd, 'WORK_CONTENT')) ...[
|
||||
ItemListWidget.singleLineTitleText(
|
||||
label: '断路地段示意图相关说明:',
|
||||
isEditable: false,
|
||||
text: pd['WORK_CONTENT'] ?? '',
|
||||
),
|
||||
const Divider(),
|
||||
],
|
||||
if (!widget.isEditable && FormUtils.hasValue(pd, 'CONTENT_IMG_PATH')) ...[
|
||||
ItemListWidget.twoRowTitleAndImages(
|
||||
onTapCallBack: (val) {
|
||||
presentOpaque(SingleImageViewer(imageUrl: val), context);
|
||||
},
|
||||
title: '断路地段示意图:',
|
||||
imageUrls: pd['CONTENT_IMG_PATH'],
|
||||
),
|
||||
const Divider(),
|
||||
],
|
||||
const Divider(),
|
||||
ItemListWidget.twoRowButtonTitleText(
|
||||
label: '关联其他特殊作业及安全作业票编号:',
|
||||
|
|
@ -152,6 +331,14 @@ class _CutroadDetailFormWidgetState extends State<CutroadDetailFormWidget> {
|
|||
controller: widget.riskController,
|
||||
text: pd['RISK_IDENTIFICATION'] ?? '',
|
||||
),
|
||||
|
||||
if (widget.signs != null && FormUtils.hasValue(widget.signs, 'PROJECT_MANAGER'))
|
||||
Column(
|
||||
children: [
|
||||
Divider(),
|
||||
signItemWidget('PROJECT_MANAGER', 'PROJECT_MANAGER_USER_NAME', '作业项目负责人', context),
|
||||
],
|
||||
)
|
||||
],
|
||||
),
|
||||
);
|
||||
|
|
|
|||
|
|
@ -224,6 +224,7 @@ class CutroadFormBaseWork extends StatelessWidget {
|
|||
children: [
|
||||
// 1. 作业详情表单
|
||||
CutroadDetailFormWidget(
|
||||
signs: signs,
|
||||
pd: pd,
|
||||
isEditable: isEditable,
|
||||
onChooseLevel: onChooseLevel,
|
||||
|
|
@ -324,7 +325,7 @@ class CutroadFormBaseWork extends StatelessWidget {
|
|||
Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Padding(padding: EdgeInsets.symmetric(horizontal: 8), child: ListItemFactory.headerTitle('安全管理部门意见'),),
|
||||
Padding(padding: EdgeInsets.symmetric(horizontal: 8), child: ListItemFactory.headerTitle('消防、安全管理部门意见'),),
|
||||
Padding(
|
||||
padding: const EdgeInsets.all(8.0),
|
||||
child: Text(signs['AUDIT'][0]['DESCR'] ?? ''),
|
||||
|
|
@ -333,7 +334,7 @@ class CutroadFormBaseWork extends StatelessWidget {
|
|||
),
|
||||
),
|
||||
Divider(height: 1,),
|
||||
signItemWidget('AUDIT', 'AUDIT_USER_NAME', '安全管理部门负责人', context),
|
||||
signItemWidget('AUDIT', 'AUDIT_USER_NAME', '消防、安全管理部门负责人', context),
|
||||
],
|
||||
)
|
||||
],
|
||||
|
|
|
|||
|
|
@ -175,6 +175,9 @@ class _CutroadListPageState extends State<CutroadListPage> {
|
|||
case '提交申请':
|
||||
await pushPage(CutroadApplyDetail(CUTROAD_ID: item['CUTROAD_ID'], flow: widget.flow), context);
|
||||
break;
|
||||
case '作业项目负责人':
|
||||
await pushPage(CutroadZyrDetail(CUTROAD_ID: item['CUTROAD_ID'], flow: widget.flow), context);
|
||||
break;
|
||||
case '设置安全措施确认人':
|
||||
await pushPage(CutroadSetSafeDetail(CUTROAD_ID: item['CUTROAD_ID'], flow: widget.flow), context);
|
||||
break;
|
||||
|
|
@ -190,16 +193,13 @@ class _CutroadListPageState extends State<CutroadListPage> {
|
|||
case '接受交底人签字':
|
||||
await pushPage(CutroadJsjdDetail(CUTROAD_ID: item['CUTROAD_ID'], flow: widget.flow), context);
|
||||
break;
|
||||
case '作业人签字':
|
||||
await pushPage(CutroadZyrDetail(CUTROAD_ID: item['CUTROAD_ID'], flow: widget.flow), context);
|
||||
break;
|
||||
case '作业负责人签字':
|
||||
await pushPage(CutroadZyfzDetail(CUTROAD_ID: item['CUTROAD_ID'], flow: widget.flow), context);
|
||||
break;
|
||||
case '所在单位签字':
|
||||
await pushPage(CutroadSzdwDetail(CUTROAD_ID: item['CUTROAD_ID'], flow: widget.flow), context);
|
||||
break;
|
||||
case '审核人签字':
|
||||
case '消防、安全管理部门签字':
|
||||
await pushPage(CutroadShbmDetail(CUTROAD_ID: item['CUTROAD_ID'], flow: widget.flow), context);
|
||||
break;
|
||||
case '审批人签字':
|
||||
|
|
@ -298,18 +298,7 @@ class _CutroadListPageState extends State<CutroadListPage> {
|
|||
);
|
||||
}
|
||||
|
||||
String _getWorkLevelText(dynamic level) {
|
||||
switch (level?.toString()) {
|
||||
case '1':
|
||||
return 'I级高处作业';
|
||||
case '2':
|
||||
return 'II级高处作业';
|
||||
case '3':
|
||||
return 'III级高处作业';
|
||||
default:
|
||||
return 'IV级高处作业';
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Widget _buildListItem(Map<String, dynamic> item) {
|
||||
return Card(
|
||||
|
|
@ -330,44 +319,46 @@ class _CutroadListPageState extends State<CutroadListPage> {
|
|||
"编号: ${item['CHECK_NO'] ?? ''}",
|
||||
style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold),
|
||||
),
|
||||
Text(
|
||||
"作业级别: ${_getWorkLevelText(item['WORK_LEVEL'])}",
|
||||
style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold),
|
||||
),
|
||||
|
||||
],
|
||||
),
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Text("申请人: ${item['APPLY_USER_NAME'] ?? ''}"),
|
||||
Text("作业项目负责人: ${item['PROJECT_MANAGER_USER_NAME'] ?? ''}"),
|
||||
],
|
||||
),
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Text("监护人: ${item['GUARDIAN_USER_NAME'] ?? ''}"),
|
||||
],
|
||||
),
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Text("安全交底人: ${item['CONFESS_USER_NAME'] ?? ''}"),
|
||||
],
|
||||
),
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Text("接受交底人: ${item['ACCEPT_CONFESS_USER_NAME'] ?? ''}"),
|
||||
],
|
||||
),
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Text("作业负责人: ${item['CONFIRM_USER_NAME'] ?? ''}"),
|
||||
Text("所在单位负责人: ${item['LEADER_USER_NAME'] ?? ''}"),
|
||||
],
|
||||
),
|
||||
|
||||
if (item['AUDIT_USER_NAME'] != null)
|
||||
Text("安全管理部门负责人: ${item['AUDIT_USER_NAME'] ?? ''}"),
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
if (item['APPROVE_USER_NAME'] != null)
|
||||
Text("审批部门负责人: ${item['APPROVE_USER_NAME'] ?? ''}"),
|
||||
Text("所在单位负责人: ${item['LEADER_USER_NAME'] ?? ''}"),
|
||||
Text("消防、安全管理部门: ${item['AUDIT_USER_NAME'] ?? ''}"),
|
||||
],
|
||||
),
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Text("审批部门负责人: ${item['APPROVE_USER_NAME'] ?? ''}"),
|
||||
Text("验收部门负责人: ${item['ACCEPT_USER_NAME'] ?? ''}"),
|
||||
],
|
||||
),
|
||||
|
||||
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
|
|
|
|||
|
|
@ -17,13 +17,13 @@ import 'package:qhd_prevention/pages/home/tap/tabList/special_Wrok/MeasuresListW
|
|||
|
||||
|
||||
enum EditUserType {
|
||||
PROJECT_MANAGER('作业人项目负责单位', '作业人项目负责人', true),
|
||||
GUARDIAN('监护人单位', '监护人', true),
|
||||
CONFESS('安全交底人单位', '安全交底人', true),
|
||||
ACCEPT_CONFESS('接受交底人单位', '接受交底人', true),
|
||||
WORK_USER('作业人单位', '作业人', true),
|
||||
CONFIRM('作业负责人单位', '作业负责人', true),
|
||||
LEADER('所在单位', '所在单位负责人', true),
|
||||
AUDIT('审核部门', '审核部门负责人', true),
|
||||
AUDIT('安全管理部门', '安全管理部门负责人', true),
|
||||
APPROVE('审批部门', '审批部门负责人', true),
|
||||
WORK_START('作业开始负责人单位', '作业开始负责人', true),
|
||||
WORK_END('作业结束负责人单位', '作业结束负责人', true),
|
||||
|
|
@ -53,8 +53,6 @@ class CutroadApplyDetail extends StatefulWidget {
|
|||
|
||||
class _CutroadApplyDetailState extends State<CutroadApplyDetail> {
|
||||
late bool isEditable = false;
|
||||
final levelList = ["I级高处作业", "II级高处作业", "III级高处作业","IV级高处作业"];
|
||||
|
||||
/// 编辑还是新增
|
||||
late String msg = 'add';
|
||||
|
||||
|
|
@ -63,8 +61,7 @@ class _CutroadApplyDetailState extends State<CutroadApplyDetail> {
|
|||
late Map<String, dynamic> signs = {};
|
||||
late List<Map<String, dynamic>> measuresList = [];
|
||||
|
||||
final TextEditingController _locationController = TextEditingController();
|
||||
final TextEditingController _hightController = TextEditingController();
|
||||
final TextEditingController _unitController = TextEditingController();
|
||||
final TextEditingController _contentController = TextEditingController();
|
||||
final TextEditingController _relatedController = TextEditingController();
|
||||
final TextEditingController _riskController = TextEditingController();
|
||||
|
|
@ -93,15 +90,13 @@ class _CutroadApplyDetailState extends State<CutroadApplyDetail> {
|
|||
|
||||
_contentController.addListener(() {
|
||||
setState(() {
|
||||
pd['WORK_CONTENT'] = _contentController.text.trim();
|
||||
pd['WORK_REASON'] = _contentController.text.trim();
|
||||
});
|
||||
});
|
||||
_locationController.addListener(() {
|
||||
pd['WORK_PLACE'] = _locationController.text.trim();
|
||||
});
|
||||
_hightController.addListener(() {
|
||||
pd['WORK_HIGH'] = _hightController.text.trim();
|
||||
_unitController.addListener(() {
|
||||
pd['OTHER_DEPT'] = _unitController.text.trim();
|
||||
});
|
||||
|
||||
_relatedController.addListener(() {
|
||||
pd['SPECIAL_WORK'] = _relatedController.text.trim();
|
||||
});
|
||||
|
|
@ -119,11 +114,7 @@ class _CutroadApplyDetailState extends State<CutroadApplyDetail> {
|
|||
}
|
||||
|
||||
void set_pd_USER_ID(EditUserType type, String id) {
|
||||
if (type == EditUserType.WORK_USER) {
|
||||
pd['${type.name}_ID'] = id;
|
||||
}else{
|
||||
pd['${type.name}_USER_ID'] = id;
|
||||
}
|
||||
}
|
||||
|
||||
void set_pd_USER_Name(EditUserType type, String name) {
|
||||
|
|
@ -139,34 +130,15 @@ class _CutroadApplyDetailState extends State<CutroadApplyDetail> {
|
|||
}
|
||||
|
||||
String get_pd_USER_ID(EditUserType type) {
|
||||
if (type == EditUserType.WORK_USER) {
|
||||
return pd['${type.name}_ID'] ?? '';
|
||||
}else{
|
||||
|
||||
return pd['${type.name}_USER_ID'] ?? '';
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
String get_pd_USER_Name(EditUserType type) {
|
||||
return pd['${type.name}_USER_NAME'] ?? '';
|
||||
}
|
||||
|
||||
Future<void> _chooseLevel() async {
|
||||
final choice = await BottomPicker.show<String>(
|
||||
context,
|
||||
items: levelList,
|
||||
itemBuilder: (item) => Text(item, textAlign: TextAlign.center),
|
||||
initialIndex: 0,
|
||||
);
|
||||
if (choice != null) {
|
||||
// 用户点击确定并选择了 choice
|
||||
setState(() {
|
||||
pd['WORK_LEVEL_NAME'] = choice;
|
||||
pd['WORK_LEVEL'] = (levelList.indexOf(choice) + 1).toString();
|
||||
FocusHelper.clearFocus(context);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
Widget _card(Widget child) {
|
||||
return Container(
|
||||
padding: EdgeInsets.symmetric(vertical: 5),
|
||||
|
|
@ -181,16 +153,6 @@ class _CutroadApplyDetailState extends State<CutroadApplyDetail> {
|
|||
Widget _chooseItem(EditUserType type) {
|
||||
bool isClean = false;
|
||||
bool isRequird = true;
|
||||
if (pd['WORK_LEVEL'] == '1' && type == EditUserType.AUDIT) {
|
||||
isRequird = false;
|
||||
isClean = true;
|
||||
|
||||
}
|
||||
if (pd['WORK_LEVEL'] != '4' && type == EditUserType.APPROVE) {
|
||||
isRequird = false;
|
||||
isClean = true;
|
||||
|
||||
}
|
||||
|
||||
return Column(
|
||||
children: [
|
||||
|
|
@ -302,31 +264,25 @@ class _CutroadApplyDetailState extends State<CutroadApplyDetail> {
|
|||
Future<void> _submit(String status) async {
|
||||
// 通用文本字段校验规则
|
||||
final textRules = <Map<String, dynamic>>[
|
||||
{'value': _locationController.text.trim(), 'message': '请填写地点及部位'},
|
||||
{'value': _hightController.text.trim(), 'message': '请填写高度'},
|
||||
{'value': _unitController.text.trim(), 'message': '请输入涉及相关单位(部门)'},
|
||||
|
||||
{'value': _contentController.text.trim(), 'message': '请填写作业内容'},
|
||||
{'value': _contentController.text.trim(), 'message': '请输入断路原因'},
|
||||
{
|
||||
'value': _relatedController.text.trim(),
|
||||
'message': '请输入关联的其他特殊作业及安全作业票编号',
|
||||
},
|
||||
{'value': _riskController.text.trim(), 'message': '请填写风险辨识结果'},
|
||||
];
|
||||
final level = pd['WORK_LEVEL'] ?? '';
|
||||
print('---level-$level');
|
||||
|
||||
/// 各项负责人校验
|
||||
final unitRules = <EditUserType>[
|
||||
EditUserType.PROJECT_MANAGER,
|
||||
EditUserType.GUARDIAN,
|
||||
EditUserType.CONFESS,
|
||||
EditUserType.ACCEPT_CONFESS,
|
||||
EditUserType.CONFIRM,
|
||||
EditUserType.LEADER,
|
||||
if (pd['WORK_LEVEL'] != '1')
|
||||
EditUserType.AUDIT,
|
||||
if (pd['WORK_LEVEL'] == '4')
|
||||
EditUserType.APPROVE,
|
||||
EditUserType.WORK_USER,
|
||||
EditUserType.WORK_START,
|
||||
EditUserType.WORK_END,
|
||||
EditUserType.ACCEPT,
|
||||
|
|
@ -339,11 +295,7 @@ class _CutroadApplyDetailState extends State<CutroadApplyDetail> {
|
|||
return;
|
||||
}
|
||||
}
|
||||
// 级别校验
|
||||
if (level.length == 0) {
|
||||
ToastUtil.showNormal(context, '请输入高处作业级别');
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
for (var type in unitRules) {
|
||||
if (get_pd_DEPARTMENT_ID(type).length == 0) {
|
||||
|
|
@ -358,15 +310,8 @@ class _CutroadApplyDetailState extends State<CutroadApplyDetail> {
|
|||
}
|
||||
// LoadingDialogHelper.show();
|
||||
|
||||
String taskId = '0';
|
||||
if (pd['WORK_LEVEL'] == '1') {
|
||||
taskId = '5';
|
||||
} else if (pd['WORK_LEVEL'] == '2' || pd['WORK_LEVEL'] == '3') {
|
||||
taskId = '6';
|
||||
} else if (pd['WORK_LEVEL'] == '4') {
|
||||
taskId = '7';
|
||||
}
|
||||
pd['WORK_LEVEL_NAME'] = levelList[int.parse(pd['WORK_LEVEL'])];
|
||||
String taskId = '12';
|
||||
|
||||
pd['USER_ID'] = SessionService.instance.loginUserId;
|
||||
pd['STEP_ID'] = status;
|
||||
pd['CORPINFO_ID'] = SessionService.instance.corpinfoId;
|
||||
|
|
@ -433,12 +378,9 @@ class _CutroadApplyDetailState extends State<CutroadApplyDetail> {
|
|||
_getSigns(pd['CUTROAD_ID'] ?? '');
|
||||
_getMeasures(pd['CUTROAD_ID'] ?? '');
|
||||
}
|
||||
pd['WORK_LEVEL'] = pd['WORK_LEVEL']?.toString() ?? '';
|
||||
|
||||
// 给所有输入框赋值
|
||||
_contentController.text = pd['WORK_CONTENT'] ?? '';
|
||||
_locationController.text = pd['WORK_PLACE'] ?? '';
|
||||
_hightController.text = pd['WORK_HIGH'] ?? '';
|
||||
_contentController.text = pd['WORK_REASON'] ?? '';
|
||||
_unitController.text = pd['OTHER_DEPT'] ?? '';
|
||||
_relatedController.text = pd['SPECIAL_WORK'] ?? '';
|
||||
_riskController.text = pd['RISK_IDENTIFICATION'] ?? '';
|
||||
});
|
||||
|
|
@ -473,7 +415,7 @@ class _CutroadApplyDetailState extends State<CutroadApplyDetail> {
|
|||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
backgroundColor: h_backGroundColor(),
|
||||
appBar: MyAppbar(title: '高处作业申请'),
|
||||
appBar: MyAppbar(title: '断路作业申请'),
|
||||
body: SafeArea(
|
||||
child: SingleChildScrollView(
|
||||
padding: EdgeInsets.all(12),
|
||||
|
|
@ -481,20 +423,21 @@ class _CutroadApplyDetailState extends State<CutroadApplyDetail> {
|
|||
children: [
|
||||
_card(
|
||||
CutroadDetailFormWidget(
|
||||
signs: signs,
|
||||
pd: pd,
|
||||
isEditable: isEditable,
|
||||
contentController: _contentController,
|
||||
locationController: _locationController,
|
||||
hightController: _hightController,
|
||||
unitController: _unitController,
|
||||
relatedController: _relatedController,
|
||||
riskController: _riskController,
|
||||
onChooseLevel: _chooseLevel,
|
||||
onChooseLevel: (){},
|
||||
),
|
||||
),
|
||||
if (isEditable)
|
||||
Column(
|
||||
children: [
|
||||
|
||||
SizedBox(height: 15),
|
||||
_card(_chooseItem(EditUserType.PROJECT_MANAGER)),
|
||||
SizedBox(height: 15),
|
||||
_card(_chooseItem(EditUserType.GUARDIAN)),
|
||||
SizedBox(height: 15),
|
||||
|
|
@ -502,8 +445,6 @@ class _CutroadApplyDetailState extends State<CutroadApplyDetail> {
|
|||
SizedBox(height: 15),
|
||||
_card(_chooseItem(EditUserType.ACCEPT_CONFESS)),
|
||||
SizedBox(height: 15),
|
||||
_card(_chooseItem(EditUserType.WORK_USER)),
|
||||
SizedBox(height: 15),
|
||||
_card(_chooseItem(EditUserType.CONFIRM)),
|
||||
SizedBox(height: 15),
|
||||
_card(_chooseItem(EditUserType.LEADER)),
|
||||
|
|
|
|||
|
|
@ -330,6 +330,7 @@ class _CutroadJhrDetailState extends State<CutroadJhrDetail> {
|
|||
children: [
|
||||
// _card(_defaultDetail()),
|
||||
CutroadDetailFormWidget(
|
||||
signs: signs,
|
||||
pd: pd,
|
||||
isEditable: false,
|
||||
onChooseLevel: (){},
|
||||
|
|
|
|||
|
|
@ -294,7 +294,6 @@ class _CutroadKszyDetailState extends State<CutroadKszyDetail> {
|
|||
GestureDetector(
|
||||
child: Row(
|
||||
children: [
|
||||
Text('* ', style: TextStyle(color: Colors.red)),
|
||||
Expanded(
|
||||
child: ListItemFactory.createRowSpaceBetweenItem(
|
||||
leftText: '作业开始时间',
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@ import 'package:qhd_prevention/pages/mine/mine_sign_page.dart';
|
|||
import 'package:qhd_prevention/pages/my_appbar.dart';
|
||||
|
||||
|
||||
/// 安全管理部门意见
|
||||
/// 消防、安全管理部门意见
|
||||
class CutroadShbmDetail extends StatefulWidget {
|
||||
const CutroadShbmDetail({
|
||||
super.key,
|
||||
|
|
@ -263,7 +263,7 @@ class _CutroadShbmDetailState extends State<CutroadShbmDetail> {
|
|||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: MyAppbar(title: '审核部门意见'),
|
||||
appBar: MyAppbar(title: '消防、安全管理部门意见'),
|
||||
body: SafeArea(
|
||||
child: SingleChildScrollView(
|
||||
padding: EdgeInsets.all(12),
|
||||
|
|
@ -284,7 +284,7 @@ class _CutroadShbmDetailState extends State<CutroadShbmDetail> {
|
|||
Column(
|
||||
children: [
|
||||
ListItemFactory.createBuildMultilineInput(
|
||||
'审核部门意见',
|
||||
'消防、安全管理部门意见',
|
||||
'请输入意见',
|
||||
_contentController,
|
||||
isRequired: true
|
||||
|
|
@ -295,7 +295,7 @@ class _CutroadShbmDetailState extends State<CutroadShbmDetail> {
|
|||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
ListItemFactory.headerTitle('审核部门负责人'),
|
||||
ListItemFactory.headerTitle('消防、安全管理部门负责人'),
|
||||
CustomButton(
|
||||
text: '新增手写签字',
|
||||
height: 36,
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@ import 'package:flutter/material.dart';
|
|||
import 'package:intl/intl.dart';
|
||||
import 'package:qhd_prevention/customWidget/ItemWidgetFactory.dart';
|
||||
import 'package:qhd_prevention/customWidget/custom_button.dart';
|
||||
import 'package:qhd_prevention/customWidget/photo_picker_row.dart';
|
||||
import 'package:qhd_prevention/customWidget/toast_util.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/item_list_widget.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/dl_work/CutroadFormBaseWork.dart';
|
||||
|
|
@ -14,8 +15,14 @@ import 'package:qhd_prevention/customWidget/custom_alert_dialog.dart';
|
|||
import 'package:qhd_prevention/customWidget/single_image_viewer.dart';
|
||||
import 'package:qhd_prevention/pages/mine/mine_sign_page.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/dl_work/CutroadFormBaseWork.dart';
|
||||
/// 本地路径 + 线上路径模型
|
||||
class ImageData {
|
||||
String localPath;
|
||||
String serverPath;
|
||||
|
||||
/// 作业人意见
|
||||
ImageData({required this.localPath, required this.serverPath});
|
||||
}
|
||||
/// 作业项目负责人意见
|
||||
class CutroadZyrDetail extends StatefulWidget {
|
||||
const CutroadZyrDetail({
|
||||
super.key,
|
||||
|
|
@ -35,7 +42,9 @@ class _CutroadZyrDetailState extends State<CutroadZyrDetail> {
|
|||
|
||||
/// 详情
|
||||
late Map<String, dynamic> pd = {};
|
||||
final TextEditingController _contentController = TextEditingController();
|
||||
|
||||
late List<ImageData> imgList = [];
|
||||
/// 安全防护措施列表
|
||||
late List<Map<String, dynamic>> measuresList = [];
|
||||
late Map<String, dynamic> signs = {};
|
||||
|
|
@ -132,6 +141,14 @@ class _CutroadZyrDetailState extends State<CutroadZyrDetail> {
|
|||
String reasonText = '';
|
||||
|
||||
if (status == '1') {
|
||||
if (_contentController.text.trim().isEmpty) {
|
||||
ToastUtil.showNormal(context, '请输入断路地段示意图相关说明');
|
||||
return;
|
||||
}
|
||||
if (imgList.isEmpty) {
|
||||
ToastUtil.showNormal(context, '请上传缩略图');
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
await showDialog<String>(
|
||||
context: context,
|
||||
|
|
@ -152,10 +169,18 @@ class _CutroadZyrDetailState extends State<CutroadZyrDetail> {
|
|||
return;
|
||||
}
|
||||
}
|
||||
|
||||
final serverPathString = imgList
|
||||
.map((e) => e.serverPath)
|
||||
.where((s) => s.isNotEmpty)
|
||||
.map((s) => s) // 将 String? 转回 String
|
||||
.join(',');
|
||||
// 存回 measures
|
||||
final Map<String, dynamic> formData = {};
|
||||
// 提交参数
|
||||
formData['WORK_CONTENT'] = _contentController.text.trim();
|
||||
formData['CONIMG_PATH'] = serverPathString;
|
||||
|
||||
formData['DESCR'] = FormUtils.hasValue(pd, 'DESCR') ?pd['DESCR']: '无';
|
||||
formData['CUTROAD_ID'] = widget.CUTROAD_ID;
|
||||
formData['SIGNTIME'] = signTimes.join(',');
|
||||
formData['USER_ID'] = SessionService.instance.loginUserId;
|
||||
|
|
@ -222,7 +247,25 @@ class _CutroadZyrDetailState extends State<CutroadZyrDetail> {
|
|||
signs = data['signs'] ?? {};
|
||||
});
|
||||
}
|
||||
/// 拍照或选图后的回调
|
||||
Future<void> _onImageAdded(String localPath) async {
|
||||
// 上传到服务器
|
||||
final res = await ApiService.uploadSaveFile(localPath);
|
||||
final url = res['FILE_PATH'] as String;
|
||||
setState(() {
|
||||
imgList.add(ImageData(localPath: localPath, serverPath: url));
|
||||
});
|
||||
}
|
||||
|
||||
/// 删除图片处理:调用删除接口并更新列表
|
||||
Future<void> _onImageRemoved(ImageData item) async {
|
||||
if (item.serverPath != null) {
|
||||
await ApiService.deleteSaveFile(item.serverPath!);
|
||||
}
|
||||
setState(() {
|
||||
imgList.remove(item);
|
||||
});
|
||||
}
|
||||
/// 底部按钮
|
||||
Widget _bottomButtons() {
|
||||
return Row(
|
||||
|
|
@ -257,7 +300,7 @@ class _CutroadZyrDetailState extends State<CutroadZyrDetail> {
|
|||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: MyAppbar(title: '作业人意见'),
|
||||
appBar: MyAppbar(title: '作业项目负责人意见'),
|
||||
body: SafeArea(
|
||||
child: SingleChildScrollView(
|
||||
padding: EdgeInsets.all(12),
|
||||
|
|
@ -276,13 +319,34 @@ class _CutroadZyrDetailState extends State<CutroadZyrDetail> {
|
|||
ItemListWidget.itemContainer(
|
||||
Column(
|
||||
children: [
|
||||
|
||||
ListItemFactory.createBuildMultilineInput(
|
||||
'断路地段示意图相关说明:',
|
||||
'请输入断路地段示意图相关说明',
|
||||
_contentController,
|
||||
isRequired: true
|
||||
),
|
||||
Divider(),
|
||||
RepairedPhotoSection(
|
||||
title: '断路地段示意图:',
|
||||
maxCount: 100,
|
||||
mediaType: MediaType.image,
|
||||
onChanged: (paths) {},
|
||||
isShowNum: false,
|
||||
horizontalPadding: 0,
|
||||
isRequired: true,
|
||||
onMediaAdded: _onImageAdded,
|
||||
onMediaRemoved: (path) {
|
||||
final item = imgList.firstWhere((e) => e.localPath == path);
|
||||
_onImageRemoved(item);
|
||||
},
|
||||
onAiIdentify: () {},
|
||||
),
|
||||
Column(
|
||||
children: [
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
ListItemFactory.headerTitle('作业人'),
|
||||
ListItemFactory.headerTitle('作业项目负责人'),
|
||||
CustomButton(
|
||||
text: '新增手写签字',
|
||||
height: 36,
|
||||
|
|
|
|||
|
|
@ -294,7 +294,6 @@ class _HoistworkKszyDetailState extends State<HoistworkKszyDetail> {
|
|||
GestureDetector(
|
||||
child: Row(
|
||||
children: [
|
||||
Text('* ', style: TextStyle(color: Colors.red)),
|
||||
Expanded(
|
||||
child: ListItemFactory.createRowSpaceBetweenItem(
|
||||
leftText: '作业开始时间',
|
||||
|
|
|
|||
|
|
@ -294,7 +294,6 @@ class _HighworkKszyDetailState extends State<HighworkKszyDetail> {
|
|||
GestureDetector(
|
||||
child: Row(
|
||||
children: [
|
||||
Text('* ', style: TextStyle(color: Colors.red)),
|
||||
Expanded(
|
||||
child: ListItemFactory.createRowSpaceBetweenItem(
|
||||
leftText: '作业开始时间',
|
||||
|
|
|
|||
|
|
@ -15,11 +15,12 @@ class ElectricityDetailFormWidget extends StatefulWidget {
|
|||
/// 编辑模式下需提供以下控制器,非编辑可不传
|
||||
final TextEditingController? contentController;
|
||||
final TextEditingController? locationController;
|
||||
final TextEditingController? methodController;
|
||||
final TextEditingController? hotworkPersonController;
|
||||
final TextEditingController? cardController;
|
||||
final TextEditingController? powerController;
|
||||
final TextEditingController? ratedPowerController;
|
||||
final TextEditingController? VController;
|
||||
final TextEditingController? relatedController;
|
||||
final TextEditingController? riskController;
|
||||
|
||||
const ElectricityDetailFormWidget({
|
||||
Key? key,
|
||||
required this.pd,
|
||||
|
|
@ -29,18 +30,20 @@ class ElectricityDetailFormWidget extends StatefulWidget {
|
|||
required this.onAnalyzeTap,
|
||||
this.contentController,
|
||||
this.locationController,
|
||||
this.methodController,
|
||||
this.hotworkPersonController,
|
||||
this.cardController,
|
||||
this.powerController,
|
||||
this.ratedPowerController,
|
||||
this.VController,
|
||||
this.relatedController,
|
||||
this.riskController,
|
||||
}) : assert(
|
||||
!isEditable ||
|
||||
(contentController != null &&
|
||||
locationController != null &&
|
||||
methodController != null &&
|
||||
hotworkPersonController != null &&
|
||||
relatedController != null &&
|
||||
riskController != null),
|
||||
cardController != null &&
|
||||
powerController != null &&
|
||||
ratedPowerController != null &&
|
||||
VController != null),
|
||||
'Editable mode requires all TextEditingController parameters',
|
||||
),
|
||||
super(key: key);
|
||||
|
|
@ -82,49 +85,86 @@ class _ElectricityDetailFormWidgetState extends State<ElectricityDetailFormWidge
|
|||
),
|
||||
],
|
||||
const Divider(),
|
||||
|
||||
ItemListWidget.singleLineTitleText(
|
||||
label: '作业地点:',
|
||||
isEditable: widget.isEditable,
|
||||
controller: widget.locationController,
|
||||
text: pd['WORK_PLACE'] ?? '',
|
||||
),
|
||||
const Divider(),
|
||||
ItemListWidget.multiLineTitleTextField(
|
||||
label: '作业内容:',
|
||||
isEditable: widget.isEditable,
|
||||
controller: widget.contentController,
|
||||
text: pd['WORK_CONTENT'] ?? '',
|
||||
),
|
||||
|
||||
const Divider(),
|
||||
ItemListWidget.singleLineTitleText(
|
||||
label: '动火地点及动火部位:',
|
||||
label: '电工证号:',
|
||||
isEditable: widget.isEditable,
|
||||
controller: widget.locationController,
|
||||
text: pd['WORK_PLACE'] ?? '',
|
||||
controller: widget.cardController,
|
||||
hintText: '请输入电工证号',
|
||||
text: pd['CARD_NO'] ?? '',
|
||||
),
|
||||
const Divider(),
|
||||
ItemListWidget.selectableLineTitleTextRightButton(
|
||||
label: '动火作业级别:',
|
||||
isEditable: widget.isEditable,
|
||||
onTap: widget.onChooseLevel,
|
||||
text: pd['WORK_LEVEL'] ?? '',
|
||||
),
|
||||
const Divider(),
|
||||
ItemListWidget.singleLineTitleText(
|
||||
label: '动火方式:',
|
||||
isEditable: widget.isEditable,
|
||||
controller: widget.methodController,
|
||||
text: pd['WORK_FUNCTION'] ?? '',
|
||||
),
|
||||
if (pd['WORK_START_DATE']?.toString().isNotEmpty == true) ...[
|
||||
const Divider(),
|
||||
ItemListWidget.singleLineTitleText(
|
||||
label: '动火作业实施时间:',
|
||||
isEditable: false,
|
||||
text: '${pd['WORK_START_DATE']} 至 ${pd['WORK_END_DATE'] ?? '--'}',
|
||||
|
||||
if (FormUtils.hasValue(pd, 'WORK_START_DATE'))
|
||||
Column(
|
||||
children: [
|
||||
ItemListWidget.singleLineTitleText(
|
||||
label: '作业开始时间:',
|
||||
isEditable: false,
|
||||
text: pd['WORK_START_DATE'] ?? '',
|
||||
),
|
||||
const Divider(),
|
||||
|
||||
],
|
||||
),
|
||||
],
|
||||
const Divider(),
|
||||
ItemListWidget.twoRowSelectableTitleText(
|
||||
label: '动火人及证书编号:',
|
||||
if (FormUtils.hasValue(pd, 'WORK_END_DATE'))
|
||||
Column(
|
||||
children: [
|
||||
ItemListWidget.singleLineTitleText(
|
||||
label: '作业结束时间:',
|
||||
isEditable: false,
|
||||
text: pd['WORK_END_DATE'] ?? '',
|
||||
),
|
||||
const Divider(),
|
||||
|
||||
],
|
||||
),
|
||||
ItemListWidget.singleLineTitleText(
|
||||
label: '电源接入点及许可用电功率:',
|
||||
isEditable: widget.isEditable,
|
||||
onTap: widget.onChooseHotworkUser,
|
||||
text: pd['WORK_USER'] ?? '',
|
||||
controller: widget.hotworkPersonController,
|
||||
controller: widget.powerController,
|
||||
hintText: '请输入电源接入点及许可用电功率',
|
||||
text: pd['ALLOW_POWER'] ?? '',
|
||||
),
|
||||
const Divider(),
|
||||
ItemListWidget.singleLineTitleText(
|
||||
label: '用电设备名称及额定功率:',
|
||||
isEditable: widget.isEditable,
|
||||
controller: widget.ratedPowerController,
|
||||
hintText: '请输入用电设备名称及额定功率',
|
||||
text: pd['RATED_POWER'] ?? '',
|
||||
),
|
||||
const Divider(),
|
||||
ItemListWidget.singleLineTitleText(
|
||||
label: '工作电压:',
|
||||
isEditable: widget.isEditable,
|
||||
controller: widget.VController,
|
||||
hintText: '请输入工作电压',
|
||||
text: pd['WORK_VOLTAGE'] ?? '',
|
||||
),
|
||||
const Divider(),
|
||||
if (FormUtils.hasValue(pd, 'LEADER_CARD_NO'))
|
||||
ItemListWidget.singleLineTitleText(
|
||||
label: '负责人电工号:',
|
||||
isEditable: false,
|
||||
text: pd['LEADER_CARD_NO'] ?? '',
|
||||
),
|
||||
|
||||
const Divider(),
|
||||
ItemListWidget.twoRowButtonTitleText(
|
||||
label: '关联其他特殊作业及安全作业票编号:',
|
||||
|
|
|
|||
|
|
@ -267,7 +267,8 @@ class SpecialWorkFormBaseWork extends StatelessWidget {
|
|||
// 4. 各环节签字及意见
|
||||
if (FormUtils.hasValue(signs, 'GUARDIAN'))
|
||||
signItemWidget('GUARDIAN', 'GUARDIAN_USER_NAME', '监护人', context),
|
||||
|
||||
if (FormUtils.hasValue(signs, 'ELECTRICITY'))
|
||||
signItemWidget('ELECTRICITY', 'ELECTRICITY_USER_NAME', 'jia人', context),
|
||||
if (FormUtils.hasValue(signs, 'CONFESS'))
|
||||
signItemWidget('CONFESS', 'CONFESS_USER_NAME', '安全交底人', context),
|
||||
|
||||
|
|
|
|||
|
|
@ -18,7 +18,7 @@ import 'package:qhd_prevention/pages/mine/mine_sign_page.dart';
|
|||
import 'package:qhd_prevention/pages/my_appbar.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_Wrok/MeasuresListWidget.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/lsyd_work/qtfx_work_detail/electricity_gas_list.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/dh_work/HotWorkDetailFormWidget.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/lsyd_work/ElectricityDetailFormWidget.dart';
|
||||
|
||||
/// 安全措施确认
|
||||
class ElectricitySafeFuncSure extends StatefulWidget {
|
||||
|
|
@ -449,7 +449,7 @@ class _ElectricitySafeFuncSureState extends State<ElectricitySafeFuncSure> {
|
|||
padding: EdgeInsets.all(12),
|
||||
child: Column(
|
||||
children: [
|
||||
HotWorkDetailFormWidget(
|
||||
ElectricityDetailFormWidget(
|
||||
pd: pd,
|
||||
isEditable: false,
|
||||
onChooseLevel: () {},
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@ import 'package:qhd_prevention/customWidget/ItemWidgetFactory.dart';
|
|||
import 'package:qhd_prevention/customWidget/custom_button.dart';
|
||||
import 'package:qhd_prevention/customWidget/toast_util.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/item_list_widget.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/dh_work/SpecialWorkFormBaseWork.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/lsyd_work/SpecialWorkFormBaseWork.dart';
|
||||
import 'package:qhd_prevention/tools/tools.dart';
|
||||
import 'package:qhd_prevention/customWidget/custom_alert_dialog.dart';
|
||||
import 'package:qhd_prevention/customWidget/photo_picker_row.dart';
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ import 'package:qhd_prevention/customWidget/ItemWidgetFactory.dart';
|
|||
import 'package:qhd_prevention/customWidget/custom_button.dart';
|
||||
import 'package:qhd_prevention/customWidget/toast_util.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/item_list_widget.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/dh_work/SpecialWorkFormBaseWork.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/lsyd_work/SpecialWorkFormBaseWork.dart';
|
||||
import 'package:qhd_prevention/tools/tools.dart';
|
||||
import 'package:qhd_prevention/customWidget/custom_alert_dialog.dart';
|
||||
import 'package:qhd_prevention/customWidget/single_image_viewer.dart';
|
||||
|
|
|
|||
|
|
@ -2,15 +2,17 @@ import 'package:flutter/material.dart';
|
|||
import 'package:qhd_prevention/customWidget/toast_util.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/lsyd_work/lsyd_work_detai/electricity_apply_detail.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/lsyd_work/aqcs_work_detail/electricity_safe_func_sure.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/lsyd_work/aqgl_work_detail/electricity_aqgl_detail.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/lsyd_work/aqjd_work_detail/electricity_aqjd_detail.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/lsyd_work/jhr_work_detail/electricity_jhr_detail.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/lsyd_work/jszy_work_detail/electricity_jszy_detail.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/lsyd_work/kszy_work_detail/electricity_kszy_detail.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/lsyd_work/psdw_work_detail/electricity_psdw_detail.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/lsyd_work/szaq_work_detail/electricity_set_safe_detail.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/lsyd_work/szdw_work_detail/electricity_szdw_detail.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/lsyd_work/yddw_work_detail/electricity_yddw_detail.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/lsyd_work/ydr_work_detail/electricity_ydr_detail.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/lsyd_work/ysgd_work_detail/electricity_ysgd_detail.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/lsyd_work/zyfz_work_detail/electricity_zyfz_detail.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/lsyd_work/zyr_work_detail/electricity_zyr_detail.dart';
|
||||
import 'package:qhd_prevention/pages/my_appbar.dart';
|
||||
import 'package:qhd_prevention/tools/tools.dart';
|
||||
import 'package:qhd_prevention/customWidget/bottom_picker.dart';
|
||||
|
|
@ -23,7 +25,12 @@ import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/lsyd_work/jsj
|
|||
class ElectricityListPage extends StatefulWidget {
|
||||
final String flow;
|
||||
final String workTypeTitle;
|
||||
const ElectricityListPage({Key? key, required this.flow, required this.workTypeTitle}) : super(key: key);
|
||||
|
||||
const ElectricityListPage({
|
||||
Key? key,
|
||||
required this.flow,
|
||||
required this.workTypeTitle,
|
||||
}) : super(key: key);
|
||||
|
||||
@override
|
||||
_ElectricityListPageState createState() => _ElectricityListPageState();
|
||||
|
|
@ -102,7 +109,7 @@ class _ElectricityListPageState extends State<ElectricityListPage> {
|
|||
'KEYWORDS': searchKeywords,
|
||||
'WORK_STATE': '0',
|
||||
};
|
||||
final url = '/app/hotwork/list?showCount=-1¤tPage=$currentPage';
|
||||
final url = '/app/electricity/list?showCount=-1¤tPage=$currentPage';
|
||||
final response = await ApiService.specialCheckListWorkCount(data, url);
|
||||
|
||||
setState(() {
|
||||
|
|
@ -127,10 +134,14 @@ class _ElectricityListPageState extends State<ElectricityListPage> {
|
|||
list.clear();
|
||||
_fetchData();
|
||||
}
|
||||
|
||||
/// 申请
|
||||
void _handleApply() {
|
||||
// 处理申请按钮点击逻辑
|
||||
pushPage(ElectricityApplyDetail(ELECTRICITY_ID: '', flow: widget.flow), context);
|
||||
pushPage(
|
||||
ElectricityApplyDetail(ELECTRICITY_ID: '', flow: widget.flow),
|
||||
context,
|
||||
);
|
||||
}
|
||||
|
||||
/// 打开流程图
|
||||
|
|
@ -156,82 +167,145 @@ class _ElectricityListPageState extends State<ElectricityListPage> {
|
|||
).showSnackBar(SnackBar(content: Text('获取流程图失败: $e')));
|
||||
}
|
||||
}
|
||||
// case 0: title = '提交申请'; break;
|
||||
// case 1: title = '气体检测'; break;
|
||||
// case 2: title = '设置安全措施确认人'; break;
|
||||
// case 3: title = '安全措施确认'; break;
|
||||
// case 4: title = '监护人签字'; break;
|
||||
// case 5: title = '用电人签字'; break;
|
||||
// case 6: title = '安全交底人签字'; break;
|
||||
// case 7: title = '接受交底人签字'; break;
|
||||
// case 8: title = '作业人签字'; break;
|
||||
// case 9: title = '作业负责人签字'; break;
|
||||
// case 10: title = '用电单位签字'; break;
|
||||
// case 11: title = '配送电单位签字'; break;
|
||||
// case 12: title = '开始作业'; break;
|
||||
// case 13: title = '结束作业'; break;
|
||||
// case 14: title = '验收签字'; break;
|
||||
|
||||
void _goToDetail(Map<String, dynamic> item) async {
|
||||
switch (widget.flow) {
|
||||
case '提交申请':
|
||||
await pushPage(ElectricityApplyDetail(ELECTRICITY_ID: item['ELECTRICITY_ID'], flow: widget.flow), context);
|
||||
await pushPage(
|
||||
ElectricityApplyDetail(
|
||||
ELECTRICITY_ID: item['ELECTRICITY_ID'],
|
||||
flow: widget.flow,
|
||||
),
|
||||
context,
|
||||
);
|
||||
_fetchData();
|
||||
break;
|
||||
case '气体检测':
|
||||
await pushPage(ElectricityGasList(ELECTRICITY_ID: item['ELECTRICITY_ID'], addFlag:true), context);
|
||||
await pushPage(
|
||||
ElectricityGasList(
|
||||
ELECTRICITY_ID: item['ELECTRICITY_ID'],
|
||||
addFlag: true,
|
||||
),
|
||||
context,
|
||||
);
|
||||
break;
|
||||
case '设置安全措施确认人':
|
||||
await pushPage(ElectricitySetSafeDetail(ELECTRICITY_ID: item['ELECTRICITY_ID'], flow: widget.flow), context);
|
||||
await pushPage(
|
||||
ElectricitySetSafeDetail(
|
||||
ELECTRICITY_ID: item['ELECTRICITY_ID'],
|
||||
flow: widget.flow,
|
||||
),
|
||||
context,
|
||||
);
|
||||
break;
|
||||
case '安全措施确认':
|
||||
await pushPage(ElectricitySafeFuncSure(ELECTRICITY_ID: item['ELECTRICITY_ID'], flow: widget.flow), context);
|
||||
await pushPage(
|
||||
ElectricitySafeFuncSure(
|
||||
ELECTRICITY_ID: item['ELECTRICITY_ID'],
|
||||
flow: widget.flow,
|
||||
),
|
||||
context,
|
||||
);
|
||||
break;
|
||||
case '监护人签字':
|
||||
await pushPage(ElectricityJhrDetail(ELECTRICITY_ID: item['ELECTRICITY_ID'], flow: widget.flow), context);
|
||||
await pushPage(
|
||||
ElectricityJhrDetail(
|
||||
ELECTRICITY_ID: item['ELECTRICITY_ID'],
|
||||
flow: widget.flow,
|
||||
),
|
||||
context,
|
||||
);
|
||||
break;
|
||||
case '用电人签字':
|
||||
// await pushPage(ElectricityJhrDetail(ELECTRICITY_ID: item['ELECTRICITY_ID'], flow: widget.flow), context);
|
||||
await pushPage(ElectricityYdrDetail(ELECTRICITY_ID: item['ELECTRICITY_ID'], flow: widget.flow), context);
|
||||
break;
|
||||
case '安全交底人签字':
|
||||
await pushPage(ElectricityAqjdDetail(ELECTRICITY_ID: item['ELECTRICITY_ID'], flow: widget.flow), context);
|
||||
await pushPage(
|
||||
ElectricityAqjdDetail(
|
||||
ELECTRICITY_ID: item['ELECTRICITY_ID'],
|
||||
flow: widget.flow,
|
||||
),
|
||||
context,
|
||||
);
|
||||
|
||||
break;
|
||||
case '接受交底人签字':
|
||||
await pushPage(ElectricityJsjdDetail(ELECTRICITY_ID: item['ELECTRICITY_ID'], flow: widget.flow), context);
|
||||
await pushPage(
|
||||
ElectricityJsjdDetail(
|
||||
ELECTRICITY_ID: item['ELECTRICITY_ID'],
|
||||
flow: widget.flow,
|
||||
),
|
||||
context,
|
||||
);
|
||||
break;
|
||||
case '作业人签字':
|
||||
// await pushPage(ElectricityZyfzDetail(ELECTRICITY_ID: item['ELECTRICITY_ID'], flow: widget.flow), context);
|
||||
await pushPage(ElectricityZyrDetail(ELECTRICITY_ID: item['ELECTRICITY_ID'], flow: widget.flow), context);
|
||||
break;
|
||||
case '作业负责人签字':
|
||||
await pushPage(ElectricityZyfzDetail(ELECTRICITY_ID: item['ELECTRICITY_ID'], flow: widget.flow), context);
|
||||
await pushPage(
|
||||
ElectricityZyfzDetail(
|
||||
ELECTRICITY_ID: item['ELECTRICITY_ID'],
|
||||
flow: widget.flow,
|
||||
),
|
||||
context,
|
||||
);
|
||||
break;
|
||||
case '用电单位签字':
|
||||
await pushPage(ElectricitySzdwDetail(ELECTRICITY_ID: item['ELECTRICITY_ID'], flow: widget.flow), context);
|
||||
await pushPage(
|
||||
ElectricityYddwDetail(
|
||||
ELECTRICITY_ID: item['ELECTRICITY_ID'],
|
||||
flow: widget.flow,
|
||||
),
|
||||
context,
|
||||
);
|
||||
|
||||
break;
|
||||
case '配送电单位签字':
|
||||
await pushPage(ElectricityAqglDetail(ELECTRICITY_ID: item['ELECTRICITY_ID'], flow: widget.flow), context);
|
||||
await pushPage(
|
||||
ElectricityPsdwDetail(
|
||||
ELECTRICITY_ID: item['ELECTRICITY_ID'],
|
||||
flow: widget.flow,
|
||||
),
|
||||
context,
|
||||
);
|
||||
|
||||
break;
|
||||
// case '审批人签字':
|
||||
// routeName = '/hotwork-approve-detail';
|
||||
// await pushPage(ElectricityDhspDetail(ELECTRICITY_ID: item['ELECTRICITY_ID'], flow: widget.flow), context);
|
||||
//
|
||||
// break;
|
||||
// case '当班班长验票':
|
||||
// routeName = '/hotwork-monitor-detail';
|
||||
// await pushPage(ElectricityDbbzDetail(ELECTRICITY_ID: item['ELECTRICITY_ID'], flow: widget.flow), context);
|
||||
// case '审批人签字':
|
||||
// routeName = '/hotwork-approve-detail';
|
||||
// await pushPage(ElectricityDhspDetail(ELECTRICITY_ID: item['ELECTRICITY_ID'], flow: widget.flow), context);
|
||||
//
|
||||
// break;
|
||||
// case '当班班长验票':
|
||||
// routeName = '/hotwork-monitor-detail';
|
||||
// await pushPage(ElectricityDbbzDetail(ELECTRICITY_ID: item['ELECTRICITY_ID'], flow: widget.flow), context);
|
||||
|
||||
break;
|
||||
case '开始作业':
|
||||
await pushPage(ElectricityKszyDetail(ELECTRICITY_ID: item['ELECTRICITY_ID'], flow: widget.flow), context);
|
||||
await pushPage(
|
||||
ElectricityKszyDetail(
|
||||
ELECTRICITY_ID: item['ELECTRICITY_ID'],
|
||||
flow: widget.flow,
|
||||
),
|
||||
context,
|
||||
);
|
||||
break;
|
||||
case '结束作业':
|
||||
await pushPage(ElectricityJszyDetail(ELECTRICITY_ID: item['ELECTRICITY_ID'], flow: widget.flow), context);
|
||||
await pushPage(
|
||||
ElectricityJszyDetail(
|
||||
ELECTRICITY_ID: item['ELECTRICITY_ID'],
|
||||
flow: widget.flow,
|
||||
),
|
||||
context,
|
||||
);
|
||||
break;
|
||||
case '验收签字':
|
||||
await pushPage(ElectricityYsgdDetail(ELECTRICITY_ID: item['ELECTRICITY_ID'], flow: widget.flow), context);
|
||||
await pushPage(
|
||||
ElectricityYsgdDetail(
|
||||
ELECTRICITY_ID: item['ELECTRICITY_ID'],
|
||||
flow: widget.flow,
|
||||
),
|
||||
context,
|
||||
);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
|
@ -240,7 +314,6 @@ class _ElectricityListPageState extends State<ElectricityListPage> {
|
|||
_fetchSteps();
|
||||
_fetchData();
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
Widget _buildFlowStepItem({
|
||||
|
|
@ -253,9 +326,7 @@ class _ElectricityListPageState extends State<ElectricityListPage> {
|
|||
final Color dotColor =
|
||||
status == 1 ? Colors.green : (status == 0 ? Colors.blue : Colors.grey);
|
||||
final Color textColor =
|
||||
status == 1
|
||||
? Colors.green
|
||||
: (status == 0 ? Colors.blue : Colors.black);
|
||||
status == 1 ? Colors.green : (status == 0 ? Colors.blue : Colors.black);
|
||||
|
||||
return ListTile(
|
||||
visualDensity: VisualDensity(vertical: -4),
|
||||
|
|
@ -326,8 +397,10 @@ class _ElectricityListPageState extends State<ElectricityListPage> {
|
|||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Text("编号: ${item['CHECK_NO'] ?? ''}", style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold),),
|
||||
Text("作业级别: ${item['WORK_LEVEL'] ?? ''}", style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold),),
|
||||
Text(
|
||||
"编号: ${item['CHECK_NO'] ?? ''}",
|
||||
style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold),
|
||||
),
|
||||
],
|
||||
),
|
||||
const SizedBox(height: 8),
|
||||
|
|
@ -335,7 +408,8 @@ class _ElectricityListPageState extends State<ElectricityListPage> {
|
|||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Text("申请人: ${item['APPLY_USER_NAME'] ?? ''}"),
|
||||
Text("分析人: ${item['ANALYZE_USER_NAME'] ?? ''}"),
|
||||
if (FormUtils.hasValue(item, 'ANALYZE_USER_NAME'))
|
||||
Text("分析人: ${item['ANALYZE_USER_NAME'] ?? ''}"),
|
||||
],
|
||||
),
|
||||
const SizedBox(height: 8),
|
||||
|
|
@ -343,36 +417,31 @@ class _ElectricityListPageState extends State<ElectricityListPage> {
|
|||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Text("监护人: ${item['GUARDIAN_USER_NAME'] ?? ''}"),
|
||||
Text("批准人: ${item['APPROVE_USER_NAME'] ?? ''}"),
|
||||
Text("安全交底人: ${item['CONFESS_USER_NAME'] ?? ''}"),
|
||||
],
|
||||
),
|
||||
const SizedBox(height: 8),
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Text("安全交底人: ${item['CONFESS_USER_NAME'] ?? ''}"),
|
||||
Text("接受交底人: ${item['ACCEPT_CONFESS_USER_NAME'] ?? ''}"),
|
||||
],
|
||||
),
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Text("接受交底人: ${item['ACCEPT_CONFESS_USER_NAME'] ?? ''}"),
|
||||
Text("作业负责人: ${item['CONFIRM_USER_NAME'] ?? ''}"),
|
||||
],
|
||||
),
|
||||
const SizedBox(height: 8),
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Text("作业负责人: ${item['CONFIRM_USER_NAME'] ?? ''}"),
|
||||
Text("动火点负责人: ${item['LEADER_USER_NAME'] ?? ''}"),
|
||||
],
|
||||
),
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Text("用电单位负责人: ${item['AUDIT_USER_NAME'] ?? ''}"),
|
||||
Text("配送电单位负责人: ${item['APPROVE_USER_NAME'] ?? ''}"),
|
||||
],
|
||||
),
|
||||
|
||||
const SizedBox(height: 8),
|
||||
if (item['AUDIT_USER_NAME'] != null)
|
||||
Text("安全管理部门负责人: ${item['AUDIT_USER_NAME'] ?? ''}"),
|
||||
const SizedBox(height: 8),
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Text("动火前在岗班长: ${item['MONITOR_USER_NAME'] ?? ''}"),
|
||||
Text("验收部门负责人: ${item['ACCEPT_USER_NAME'] ?? ''}"),
|
||||
],
|
||||
),
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [Text("验收部门负责人: ${item['ACCEPT_USER_NAME'] ?? ''}")],
|
||||
),
|
||||
const SizedBox(height: 8),
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
|
|
@ -386,17 +455,19 @@ class _ElectricityListPageState extends State<ElectricityListPage> {
|
|||
],
|
||||
),
|
||||
const SizedBox(height: 8),
|
||||
Row(children: [
|
||||
CustomButton(
|
||||
text: '查看流程图',
|
||||
height: 35,
|
||||
padding: EdgeInsets.symmetric(horizontal: 12),
|
||||
margin: EdgeInsets.only(left: 0),
|
||||
backgroundColor: Colors.blue,
|
||||
onPressed: () => _openFlowDrawer(item['ELECTRICITY_ID']),
|
||||
),
|
||||
SizedBox(width: 1,)
|
||||
],)
|
||||
Row(
|
||||
children: [
|
||||
CustomButton(
|
||||
text: '查看流程图',
|
||||
height: 35,
|
||||
padding: EdgeInsets.symmetric(horizontal: 12),
|
||||
margin: EdgeInsets.only(left: 0),
|
||||
backgroundColor: Colors.blue,
|
||||
onPressed: () => _openFlowDrawer(item['ELECTRICITY_ID']),
|
||||
),
|
||||
SizedBox(width: 1),
|
||||
],
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ import 'package:intl/intl.dart';
|
|||
import 'package:qhd_prevention/customWidget/ItemWidgetFactory.dart';
|
||||
import 'package:qhd_prevention/customWidget/custom_button.dart';
|
||||
import 'package:qhd_prevention/customWidget/toast_util.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/dh_work/HotWorkDetailFormWidget.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/lsyd_work/ElectricityDetailFormWidget.dart';
|
||||
import 'package:qhd_prevention/tools/tools.dart';
|
||||
import 'package:qhd_prevention/http/ApiService.dart';
|
||||
import 'package:qhd_prevention/pages/my_appbar.dart';
|
||||
|
|
@ -327,7 +327,7 @@ class _ElectricityJhrDetailState extends State<ElectricityJhrDetail> {
|
|||
child: Column(
|
||||
children: [
|
||||
// _card(_defaultDetail()),
|
||||
HotWorkDetailFormWidget(
|
||||
ElectricityDetailFormWidget(
|
||||
pd: pd,
|
||||
isEditable: false,
|
||||
onChooseLevel: (){},
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@ import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/lsyd_work/qtf
|
|||
import 'package:qhd_prevention/customWidget/custom_alert_dialog.dart';
|
||||
import 'package:qhd_prevention/customWidget/single_image_viewer.dart';
|
||||
import 'package:qhd_prevention/pages/mine/mine_sign_page.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/dh_work/SpecialWorkFormBaseWork.dart';/// 接受交底人签字
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/lsyd_work/SpecialWorkFormBaseWork.dart';/// 接受交底人签字
|
||||
class ElectricityJsjdDetail extends StatefulWidget {
|
||||
const ElectricityJsjdDetail({
|
||||
super.key,
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@ import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/lsyd_work/qtf
|
|||
import 'package:qhd_prevention/customWidget/custom_alert_dialog.dart';
|
||||
import 'package:qhd_prevention/customWidget/single_image_viewer.dart';
|
||||
import 'package:qhd_prevention/pages/mine/mine_sign_page.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/dh_work/SpecialWorkFormBaseWork.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/lsyd_work/SpecialWorkFormBaseWork.dart';
|
||||
import 'package:qhd_prevention/customWidget/picker/CupertinoDatePicker.dart';
|
||||
|
||||
/// 作业结束时间选择
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@ import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/lsyd_work/qtf
|
|||
import 'package:qhd_prevention/customWidget/custom_alert_dialog.dart';
|
||||
import 'package:qhd_prevention/customWidget/single_image_viewer.dart';
|
||||
import 'package:qhd_prevention/pages/mine/mine_sign_page.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/dh_work/SpecialWorkFormBaseWork.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/lsyd_work/SpecialWorkFormBaseWork.dart';
|
||||
|
||||
import 'package:qhd_prevention/customWidget/picker/CupertinoDatePicker.dart';
|
||||
/// 作业开始时间选择
|
||||
|
|
|
|||
|
|
@ -7,7 +7,8 @@ import 'package:qhd_prevention/customWidget/department_person_picker.dart';
|
|||
import 'package:qhd_prevention/customWidget/department_picker.dart';
|
||||
import 'package:qhd_prevention/customWidget/toast_util.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/item_list_widget.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/dh_work/HotWorkDetailFormWidget.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/lsyd_work/ElectricityDetailFormWidget.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/lsyd_work/ElectricityDetailFormWidget.dart';
|
||||
import 'package:qhd_prevention/tools/h_colors.dart';
|
||||
import 'package:qhd_prevention/tools/tools.dart';
|
||||
import 'package:qhd_prevention/http/ApiService.dart';
|
||||
|
|
@ -16,17 +17,17 @@ import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/lsyd_work/qtf
|
|||
import 'package:qhd_prevention/customWidget/bottom_picker.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_Wrok/MeasuresListWidget.dart';
|
||||
|
||||
|
||||
enum EditUserType {
|
||||
// 12个
|
||||
ANALYZE('分析单位', '分析单位负责人', true),
|
||||
GUARDIAN('监护人单位', '监护人', true),
|
||||
ELECTRICITY('用电单位', '用电人', true),//
|
||||
CONFESS('安全交底人单位', '安全交底人', true),
|
||||
ACCEPT_CONFESS('接受交底人单位', '接受交底人', true),
|
||||
WORK('作业人单位', '作业人', true), //
|
||||
CONFIRM('作业负责人单位', '作业负责人', true),
|
||||
LEADER('所在单位', '所在单位负责人', true),
|
||||
AUDIT('安全管理部门', '安全管理部门负责人', true),
|
||||
APPROVE('动火审批单位', '动火审批负责人', true),
|
||||
MONITOR('动火前在岗部门', '动火前在岗班长', true),
|
||||
AUDIT('用电单位', '用电单位负责人', true),
|
||||
APPROVE('配送电单位', '配送电单负责人', true),
|
||||
WORK_START('作业开始负责人单位', '作业开始负责人', true),
|
||||
WORK_END('作业结束负责人单位', '作业结束负责人', true),
|
||||
ACCEPT('验收部门', '验收部门负责人', true);
|
||||
|
|
@ -39,7 +40,6 @@ enum EditUserType {
|
|||
const EditUserType(this.displayName, this.personName, this.isRequired);
|
||||
}
|
||||
|
||||
|
||||
class ElectricityApplyDetail extends StatefulWidget {
|
||||
const ElectricityApplyDetail({
|
||||
super.key,
|
||||
|
|
@ -56,11 +56,13 @@ class ElectricityApplyDetail extends StatefulWidget {
|
|||
|
||||
class _ElectricityApplyDetailState extends State<ElectricityApplyDetail> {
|
||||
late bool isEditable = false;
|
||||
final levelList = ["特级", "一级", "二级"];
|
||||
|
||||
/// 编辑还是新增
|
||||
late String msg = 'add';
|
||||
|
||||
// 是否进行气体分析
|
||||
bool _isGasAnalyze = false;
|
||||
|
||||
/// 详情
|
||||
late Map<String, dynamic> pd = {};
|
||||
late Map<String, dynamic> signs = {};
|
||||
|
|
@ -68,14 +70,14 @@ class _ElectricityApplyDetailState extends State<ElectricityApplyDetail> {
|
|||
|
||||
final TextEditingController _contentController = TextEditingController();
|
||||
final TextEditingController _locationController = TextEditingController();
|
||||
final TextEditingController _methodController = TextEditingController();
|
||||
final TextEditingController _hotworkPersonController =
|
||||
TextEditingController();
|
||||
final TextEditingController _cardController = TextEditingController();
|
||||
final TextEditingController _powerController = TextEditingController();
|
||||
final TextEditingController _ratedPowerController = TextEditingController();
|
||||
final TextEditingController _VController = TextEditingController();
|
||||
final TextEditingController _relatedController = TextEditingController();
|
||||
final TextEditingController _riskController = TextEditingController();
|
||||
|
||||
/// 动火人及证书编号
|
||||
late List<dynamic> workUserList = [];
|
||||
// 负责人电工号
|
||||
final TextEditingController _fzCardController = TextEditingController();
|
||||
|
||||
// 存储各单位的人员列表
|
||||
final Map<EditUserType, List<Map<String, dynamic>>> _personCache = {};
|
||||
|
|
@ -88,28 +90,34 @@ class _ElectricityApplyDetailState extends State<ElectricityApplyDetail> {
|
|||
_getData();
|
||||
} else {
|
||||
isEditable = true;
|
||||
pd['ANALYZE_TIME'] = 1;
|
||||
pd['APPLY_DEPARTMENT_ID'] = SessionService.instance.deptId;
|
||||
pd['APPLY_DEPARTMENT_NAME'] =
|
||||
SessionService.instance.loginUser!['DEPARTMENT_NAME'] ?? '';
|
||||
pd['APPLY_USER_ID'] = SessionService.instance.loginUserId;
|
||||
pd['APPLY_USER_NAME'] = SessionService.instance.username;
|
||||
}
|
||||
_getHotWorkNameList();
|
||||
|
||||
_contentController.addListener(() {
|
||||
setState(() {
|
||||
pd['WORK_CONTENT'] = _contentController.text.trim();
|
||||
});
|
||||
pd['WORK_CONTENT'] = _contentController.text.trim();
|
||||
|
||||
});
|
||||
_locationController.addListener(() {
|
||||
pd['WORK_PLACE'] = _locationController.text.trim();
|
||||
});
|
||||
_methodController.addListener(() {
|
||||
pd['WORK_FUNCTION'] = _methodController.text.trim();
|
||||
_cardController.addListener(() {
|
||||
pd['CARD_NO'] = _cardController.text.trim();
|
||||
});
|
||||
_hotworkPersonController.addListener(() {
|
||||
pd['WORK_USER'] = _hotworkPersonController.text.trim();
|
||||
_powerController.addListener(() {
|
||||
pd['ALLOW_POWER'] = _powerController.text.trim();
|
||||
});
|
||||
_ratedPowerController.addListener(() {
|
||||
pd['RATED_POWER'] = _ratedPowerController.text.trim();
|
||||
});
|
||||
_VController.addListener(() {
|
||||
pd['WORK_VOLTAGE'] = _VController.text.trim();
|
||||
});
|
||||
_fzCardController.addListener(() {
|
||||
pd['LEADER_CARD_NO'] = _VController.text.trim();
|
||||
});
|
||||
_relatedController.addListener(() {
|
||||
pd['SPECIAL_WORK'] = _relatedController.text.trim();
|
||||
|
|
@ -148,47 +156,13 @@ class _ElectricityApplyDetailState extends State<ElectricityApplyDetail> {
|
|||
}
|
||||
|
||||
String get_pd_USER_Name(EditUserType type) {
|
||||
if (type == EditUserType.WORK) {
|
||||
return pd['${type.name}_USER_USER_NAME'] ?? '';
|
||||
}
|
||||
return pd['${type.name}_USER_NAME'] ?? '';
|
||||
}
|
||||
|
||||
Future<void> _chooseLevel() async {
|
||||
final choice = await BottomPicker.show<String>(
|
||||
context,
|
||||
items: levelList,
|
||||
itemBuilder: (item) => Text(item, textAlign: TextAlign.center),
|
||||
initialIndex: 0,
|
||||
);
|
||||
if (choice != null) {
|
||||
// 用户点击确定并选择了 choice
|
||||
setState(() {
|
||||
pd['WORK_LEVEL'] = choice;
|
||||
FocusHelper.clearFocus(context);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> _chooseHorkUser() async {
|
||||
final choice = await BottomPicker.show<String>(
|
||||
context,
|
||||
items: workUserList.map((item) => item['NAME'] as String).toList(),
|
||||
itemBuilder: (item) => Text(item, textAlign: TextAlign.center),
|
||||
initialIndex: 0,
|
||||
);
|
||||
if (choice != null) {
|
||||
setState(() {
|
||||
pd['WORK_USER'] = choice;
|
||||
_hotworkPersonController.text = choice;
|
||||
Map<String, dynamic> result = workUserList.firstWhere(
|
||||
(item) => item['NAME'] == choice,
|
||||
orElse: () => {}, // 避免找不到时报错
|
||||
);
|
||||
if (FormUtils.hasValue(result, 'USER_ID')) {
|
||||
pd['WORK_USER_ID'] = result['USER_ID'];
|
||||
}
|
||||
FocusHelper.clearFocus(context);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
Widget _card(Widget child) {
|
||||
return Container(
|
||||
|
|
@ -205,26 +179,6 @@ class _ElectricityApplyDetailState extends State<ElectricityApplyDetail> {
|
|||
bool isClean = false;
|
||||
bool isRequired = true;
|
||||
|
||||
if (isEditable) {
|
||||
if (type == EditUserType.AUDIT && (pd['WORK_LEVEL'] ?? '') == '二级') {
|
||||
isClean = true;
|
||||
isRequired = false;
|
||||
}
|
||||
|
||||
// 如果既不是二级也不是一级,就加上 APPROVE
|
||||
if (type == EditUserType.APPROVE && pd['WORK_LEVEL'] != '特级') {
|
||||
isRequired = false;
|
||||
isClean = true;
|
||||
|
||||
}
|
||||
// EditUserType.APPROVE,
|
||||
if (type == EditUserType.APPROVE &&
|
||||
((pd['WORK_LEVEL'] ?? '') == '二级' ||
|
||||
(pd['WORK_LEVEL'] ?? '') == '一级')) {
|
||||
isClean = true;
|
||||
}
|
||||
}
|
||||
|
||||
return Column(
|
||||
children: [
|
||||
ItemListWidget.selectableLineTitleTextRightButton(
|
||||
|
|
@ -250,6 +204,19 @@ class _ElectricityApplyDetailState extends State<ElectricityApplyDetail> {
|
|||
text: pd['${type.name}_USER_NAME'] ?? '请选择',
|
||||
onTap: () => choosePersonHandle(type),
|
||||
),
|
||||
if (type == EditUserType.CONFIRM)
|
||||
Column(
|
||||
children: [
|
||||
Divider(),
|
||||
ItemListWidget.singleLineTitleText(
|
||||
label: '负责人电工号:',
|
||||
isEditable: isEditable,
|
||||
controller: _fzCardController,
|
||||
hintText: '请输入负责人电工号',
|
||||
text: pd['LEADER_CARD_NO'] ?? '',
|
||||
),
|
||||
],
|
||||
)
|
||||
],
|
||||
);
|
||||
}
|
||||
|
|
@ -301,13 +268,15 @@ class _ElectricityApplyDetailState extends State<ElectricityApplyDetail> {
|
|||
return;
|
||||
}
|
||||
|
||||
if (personList.isEmpty) { // 一般这种情况是因为重新编辑没有缓存对应部门的负责人,所以先拉取一下接口
|
||||
if (personList.isEmpty) {
|
||||
// 一般这种情况是因为重新编辑没有缓存对应部门的负责人,所以先拉取一下接口
|
||||
await _getPersonListForUnitId(unitId, type);
|
||||
final list = _personCache[type] ?? [];
|
||||
|
||||
if (list.isEmpty) { // 如果还是没数据,说明该部门没有可选的人
|
||||
if (list.isEmpty) {
|
||||
// 如果还是没数据,说明该部门没有可选的人
|
||||
ToastUtil.showNormal(context, '暂无数据,请选择其他单位');
|
||||
}else{
|
||||
} else {
|
||||
choosePersonHandle(type);
|
||||
}
|
||||
return;
|
||||
|
|
@ -337,40 +306,46 @@ class _ElectricityApplyDetailState extends State<ElectricityApplyDetail> {
|
|||
// 通用文本字段校验规则
|
||||
final textRules = <Map<String, dynamic>>[
|
||||
{'value': _contentController.text.trim(), 'message': '请填写作业内容'},
|
||||
{'value': _locationController.text.trim(), 'message': '请填写动火地点及部位'},
|
||||
{'value': _methodController.text.trim(), 'message': '请填写动火方式'},
|
||||
{'value': _hotworkPersonController.text.trim(), 'message': '请填写动火人及证书编号'},
|
||||
{'value': _locationController.text.trim(), 'message': '请输入作业地点'},
|
||||
{'value': _cardController.text.trim(), 'message': '请输入电工证号'},
|
||||
{'value': _powerController.text.trim(), 'message': '请输入电源接入点及许可用电功率'},
|
||||
{
|
||||
'value': _relatedController.text.trim(),
|
||||
'message': '请输入关联的其他特殊作业及安全作业票编号',
|
||||
'value': _ratedPowerController.text.trim(),
|
||||
'message': '请输入用电设备名称及额定功率',
|
||||
},
|
||||
{
|
||||
'value': _fzCardController.text.trim(),
|
||||
'message': '请输入负责人电工号',
|
||||
},
|
||||
{'value': _VController.text.trim(), 'message': '请输入工作电压'},
|
||||
{'value': _relatedController.text.trim(), 'message': '请输入关联的其他特殊作业及安全作业票编号'},
|
||||
{'value': _riskController.text.trim(), 'message': '请填写风险辨识结果'},
|
||||
|
||||
|
||||
];
|
||||
final level = pd['WORK_LEVEL'] ?? '';
|
||||
print('---level-$level');
|
||||
|
||||
/// 各项负责人校验
|
||||
final unitRules = <EditUserType>[
|
||||
EditUserType.ANALYZE,
|
||||
if (_isGasAnalyze)
|
||||
EditUserType.ANALYZE,
|
||||
EditUserType.GUARDIAN,
|
||||
EditUserType.ELECTRICITY,
|
||||
EditUserType.CONFESS,
|
||||
EditUserType.ACCEPT_CONFESS,
|
||||
EditUserType.WORK,
|
||||
EditUserType.CONFIRM,
|
||||
EditUserType.LEADER,
|
||||
// 如果不是二级,或者SAFETY_USER_ID有值就加上 AUDIT
|
||||
if (pd['WORK_LEVEL'] != '二级' || FormUtils.hasValue(pd, 'SAFETY_USER_ID')) EditUserType.AUDIT,
|
||||
EditUserType.AUDIT,
|
||||
// 如果既不是二级也不是一级,就加上 APPROVE
|
||||
if (pd['WORK_LEVEL'] == '特级')
|
||||
EditUserType.APPROVE,
|
||||
|
||||
EditUserType.MONITOR,
|
||||
EditUserType.AUDIT,
|
||||
EditUserType.APPROVE,
|
||||
EditUserType.WORK_START,
|
||||
EditUserType.WORK_END,
|
||||
EditUserType.ACCEPT,
|
||||
];
|
||||
|
||||
if (status == '1') {
|
||||
if (!_isGasAnalyze) {
|
||||
pd['ANALYZE_DEPARTMENT_ID'] = '';
|
||||
pd['ANALYZE_USER_ID'] = '';
|
||||
}
|
||||
// 文本校验
|
||||
for (var rule in textRules) {
|
||||
if ((rule['value'] as String).isEmpty) {
|
||||
|
|
@ -378,11 +353,6 @@ class _ElectricityApplyDetailState extends State<ElectricityApplyDetail> {
|
|||
return;
|
||||
}
|
||||
}
|
||||
// 级别校验
|
||||
if (level.length == 0) {
|
||||
ToastUtil.showNormal(context, '请选择动火级别');
|
||||
return;
|
||||
}
|
||||
|
||||
for (var type in unitRules) {
|
||||
if (get_pd_DEPARTMENT_ID(type).length == 0) {
|
||||
|
|
@ -397,20 +367,15 @@ class _ElectricityApplyDetailState extends State<ElectricityApplyDetail> {
|
|||
}
|
||||
// LoadingDialogHelper.show();
|
||||
|
||||
String taskId = '0';
|
||||
if (level == '特级') {
|
||||
taskId = '1';
|
||||
} else if (level == '一级') {
|
||||
taskId = '2';
|
||||
} else if (level == '二级') {
|
||||
taskId = '3';
|
||||
}
|
||||
String taskId = '8';
|
||||
|
||||
pd['USER_ID'] = SessionService.instance.loginUserId;
|
||||
pd['STEP_ID'] = status;
|
||||
pd['CORPINFO_ID'] = SessionService.instance.corpinfoId;
|
||||
pd['OPERATOR'] = SessionService.instance.loginUserId;
|
||||
pd['CREATOR'] = SessionService.instance.loginUserId;
|
||||
pd['ACTION_USER'] = SessionService.instance.username;
|
||||
pd['ISANALYZE'] = _isGasAnalyze ? 1 : 0;
|
||||
pd['APPLY_STATUS'] = status;
|
||||
pd['TASK_ID'] = taskId;
|
||||
|
||||
|
|
@ -428,15 +393,14 @@ class _ElectricityApplyDetailState extends State<ElectricityApplyDetail> {
|
|||
String jsonStr = jsonEncode(pd);
|
||||
printLongString(jsonStr);
|
||||
try {
|
||||
String url = "/app/hotwork/" + msg;
|
||||
String url = "/app/electricity/" + msg;
|
||||
final result = await ApiService.submitHomework(url, pd);
|
||||
LoadingDialogHelper.hide();
|
||||
if (result['result'] == 'success') {
|
||||
ToastUtil.showSuccess(context, status == '1' ? '提交成功' : '已暂存');
|
||||
Navigator.pop(context);
|
||||
}else{
|
||||
} else {
|
||||
ToastUtil.showSuccess(context, '提交失败');
|
||||
|
||||
}
|
||||
} catch (e) {
|
||||
LoadingDialogHelper.hide();
|
||||
|
|
@ -444,18 +408,13 @@ class _ElectricityApplyDetailState extends State<ElectricityApplyDetail> {
|
|||
}
|
||||
}
|
||||
|
||||
Future<void> _getHotWorkNameList() async {
|
||||
final result = await ApiService.getHotWorkNameList();
|
||||
setState(() {
|
||||
workUserList = result['varList'] ?? '';
|
||||
List<String> names =
|
||||
workUserList.map((item) => item['NAME'] as String).toList();
|
||||
});
|
||||
}
|
||||
|
||||
/// 初始化拉取数据
|
||||
Future<void> _getData() async {
|
||||
final data = await ApiService.getHomeworkFindById('electricity', widget.ELECTRICITY_ID);
|
||||
final data = await ApiService.getHomeworkFindById(
|
||||
'electricity',
|
||||
widget.ELECTRICITY_ID,
|
||||
);
|
||||
setState(() {
|
||||
pd = data['pd'];
|
||||
if (pd['STEP_ID'] == 0) {
|
||||
|
|
@ -467,8 +426,10 @@ class _ElectricityApplyDetailState extends State<ElectricityApplyDetail> {
|
|||
// 给所有输入框赋值
|
||||
_contentController.text = pd['WORK_CONTENT'] ?? '';
|
||||
_locationController.text = pd['WORK_PLACE'] ?? '';
|
||||
_methodController.text = pd['WORK_FUNCTION'] ?? '';
|
||||
_hotworkPersonController.text = pd['WORK_USER'] ?? '';
|
||||
_cardController.text = pd['WORK_FUNCTION'] ?? '';
|
||||
_powerController.text = pd['WORK_USER'] ?? '';
|
||||
_ratedPowerController.text = pd['SPECIAL_WORK'] ?? '';
|
||||
_VController.text = pd['WORK_VOLTAGE'] ?? '';
|
||||
_relatedController.text = pd['SPECIAL_WORK'] ?? '';
|
||||
_riskController.text = pd['RISK_IDENTIFICATION'] ?? '';
|
||||
});
|
||||
|
|
@ -480,7 +441,8 @@ class _ElectricityApplyDetailState extends State<ElectricityApplyDetail> {
|
|||
}
|
||||
|
||||
Future<void> _getSigns(String homework_id) async {
|
||||
final data = await ApiService.listSignFinished('electricity',
|
||||
final data = await ApiService.listSignFinished(
|
||||
'electricity',
|
||||
homework_id.length > 0 ? homework_id : widget.ELECTRICITY_ID,
|
||||
);
|
||||
setState(() {
|
||||
|
|
@ -489,7 +451,8 @@ class _ElectricityApplyDetailState extends State<ElectricityApplyDetail> {
|
|||
}
|
||||
|
||||
Future<void> _getMeasures(String homework_id) async {
|
||||
final data = await ApiService.listSignFinishMeasures('electricity',
|
||||
final data = await ApiService.listSignFinishMeasures(
|
||||
'electricity',
|
||||
homework_id.length > 0 ? homework_id : widget.ELECTRICITY_ID,
|
||||
);
|
||||
setState(() {
|
||||
|
|
@ -503,24 +466,26 @@ class _ElectricityApplyDetailState extends State<ElectricityApplyDetail> {
|
|||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
backgroundColor: h_backGroundColor(),
|
||||
appBar: MyAppbar(title: '动火安全作业申请'),
|
||||
appBar: MyAppbar(title: '临时用电作业申请'),
|
||||
body: SafeArea(
|
||||
child: SingleChildScrollView(
|
||||
padding: EdgeInsets.all(12),
|
||||
child: Column(
|
||||
children: [
|
||||
_card(
|
||||
HotWorkDetailFormWidget(
|
||||
ElectricityDetailFormWidget(
|
||||
pd: pd,
|
||||
isEditable: isEditable,
|
||||
contentController: _contentController,
|
||||
locationController: _locationController,
|
||||
methodController: _methodController,
|
||||
hotworkPersonController: _hotworkPersonController,
|
||||
cardController: _cardController,
|
||||
powerController: _powerController,
|
||||
ratedPowerController: _ratedPowerController,
|
||||
VController: _VController,
|
||||
relatedController: _relatedController,
|
||||
riskController: _riskController,
|
||||
onChooseLevel: _chooseLevel,
|
||||
onChooseHotworkUser: _chooseHorkUser,
|
||||
onChooseLevel: () {},
|
||||
onChooseHotworkUser: (){},
|
||||
onAnalyzeTap: () {
|
||||
pushPage(
|
||||
ElectricityGasList(ELECTRICITY_ID: widget.ELECTRICITY_ID),
|
||||
|
|
@ -529,28 +494,46 @@ class _ElectricityApplyDetailState extends State<ElectricityApplyDetail> {
|
|||
},
|
||||
),
|
||||
),
|
||||
SizedBox(height: 10),
|
||||
ListItemFactory.createYesNoSection(
|
||||
title: '是否进行气体分析',
|
||||
horizontalPadding: 0,
|
||||
groupValue: _isGasAnalyze,
|
||||
onChanged: (val) {
|
||||
setState(() {
|
||||
_isGasAnalyze = val;
|
||||
});
|
||||
},
|
||||
),
|
||||
if (isEditable)
|
||||
Column(
|
||||
children: [
|
||||
SizedBox(height: 15),
|
||||
_card(_chooseItem(EditUserType.ANALYZE)),
|
||||
SizedBox(height: 15),
|
||||
if (_isGasAnalyze)
|
||||
Column(
|
||||
children: [
|
||||
_card(_chooseItem(EditUserType.ANALYZE)),
|
||||
SizedBox(height: 15),
|
||||
],
|
||||
),
|
||||
|
||||
_card(_chooseItem(EditUserType.GUARDIAN)),
|
||||
SizedBox(height: 15),
|
||||
_card(_chooseItem(EditUserType.CONFESS)),
|
||||
SizedBox(height: 15),
|
||||
_card(_chooseItem(EditUserType.ELECTRICITY)),
|
||||
SizedBox(height: 15),
|
||||
_card(_chooseItem(EditUserType.CONFESS)),
|
||||
SizedBox(height: 15),
|
||||
_card(_chooseItem(EditUserType.ACCEPT_CONFESS)),
|
||||
SizedBox(height: 15),
|
||||
_card(_chooseItem(EditUserType.CONFIRM)),
|
||||
_card(_chooseItem(EditUserType.WORK)),
|
||||
SizedBox(height: 15),
|
||||
_card(_chooseItem(EditUserType.LEADER)),
|
||||
_card(_chooseItem(EditUserType.CONFIRM)),
|
||||
SizedBox(height: 15),
|
||||
_card(_chooseItem(EditUserType.AUDIT)),
|
||||
SizedBox(height: 15),
|
||||
_card(_chooseItem(EditUserType.APPROVE)),
|
||||
SizedBox(height: 15),
|
||||
_card(_chooseItem(EditUserType.MONITOR)),
|
||||
SizedBox(height: 15),
|
||||
_card(
|
||||
Column(
|
||||
mainAxisAlignment: MainAxisAlignment.start,
|
||||
|
|
@ -604,7 +587,7 @@ class _ElectricityApplyDetailState extends State<ElectricityApplyDetail> {
|
|||
color: Colors.white,
|
||||
child: MeasuresListWidget(
|
||||
measuresList:
|
||||
measuresList, // List<Map<String, dynamic>>
|
||||
measuresList, // List<Map<String, dynamic>>
|
||||
baseImgPath: ApiService.baseImgPath,
|
||||
isAllowEdit: false,
|
||||
),
|
||||
|
|
@ -632,45 +615,9 @@ class _ElectricityApplyDetailState extends State<ElectricityApplyDetail> {
|
|||
),
|
||||
isEditable
|
||||
? Row(
|
||||
spacing: 10,
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Expanded(
|
||||
child: CustomButton(
|
||||
height: 45,
|
||||
textStyle: TextStyle(
|
||||
fontSize: 16,
|
||||
color: Colors.white,
|
||||
),
|
||||
text: '提交',
|
||||
backgroundColor: Colors.blue,
|
||||
onPressed: () {
|
||||
_submit('1');
|
||||
},
|
||||
),
|
||||
),
|
||||
|
||||
Expanded(
|
||||
child: CustomButton(
|
||||
textStyle: TextStyle(
|
||||
fontSize: 16,
|
||||
color: Colors.white,
|
||||
),
|
||||
text: '暂存',
|
||||
backgroundColor: Colors.green,
|
||||
onPressed: () {
|
||||
_submit('0');
|
||||
},
|
||||
),
|
||||
),
|
||||
],
|
||||
)
|
||||
: Column(
|
||||
children: [
|
||||
SizedBox(height: 20),
|
||||
Row(
|
||||
spacing: 10,
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
SizedBox(width: 50),
|
||||
Expanded(
|
||||
child: CustomButton(
|
||||
height: 45,
|
||||
|
|
@ -678,18 +625,54 @@ class _ElectricityApplyDetailState extends State<ElectricityApplyDetail> {
|
|||
fontSize: 16,
|
||||
color: Colors.white,
|
||||
),
|
||||
text: '返回',
|
||||
backgroundColor: Colors.green,
|
||||
text: '提交',
|
||||
backgroundColor: Colors.blue,
|
||||
onPressed: () {
|
||||
Navigator.pop(context);
|
||||
_submit('1');
|
||||
},
|
||||
),
|
||||
),
|
||||
SizedBox(width: 50),
|
||||
|
||||
Expanded(
|
||||
child: CustomButton(
|
||||
textStyle: TextStyle(
|
||||
fontSize: 16,
|
||||
color: Colors.white,
|
||||
),
|
||||
text: '暂存',
|
||||
backgroundColor: Colors.green,
|
||||
onPressed: () {
|
||||
_submit('0');
|
||||
},
|
||||
),
|
||||
),
|
||||
],
|
||||
)
|
||||
: Column(
|
||||
children: [
|
||||
SizedBox(height: 20),
|
||||
Row(
|
||||
children: [
|
||||
SizedBox(width: 50),
|
||||
Expanded(
|
||||
child: CustomButton(
|
||||
height: 45,
|
||||
textStyle: TextStyle(
|
||||
fontSize: 16,
|
||||
color: Colors.white,
|
||||
),
|
||||
text: '返回',
|
||||
backgroundColor: Colors.green,
|
||||
onPressed: () {
|
||||
Navigator.pop(context);
|
||||
},
|
||||
),
|
||||
),
|
||||
SizedBox(width: 50),
|
||||
],
|
||||
),
|
||||
],
|
||||
),
|
||||
],
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@ import 'package:qhd_prevention/customWidget/ItemWidgetFactory.dart';
|
|||
import 'package:qhd_prevention/customWidget/custom_button.dart';
|
||||
import 'package:qhd_prevention/customWidget/toast_util.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/item_list_widget.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/dh_work/SpecialWorkFormBaseWork.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/lsyd_work/SpecialWorkFormBaseWork.dart';
|
||||
import 'package:qhd_prevention/tools/tools.dart';
|
||||
import 'package:qhd_prevention/customWidget/custom_alert_dialog.dart';
|
||||
import 'package:qhd_prevention/customWidget/single_image_viewer.dart';
|
||||
|
|
@ -15,9 +15,9 @@ import 'package:qhd_prevention/pages/my_appbar.dart';
|
|||
import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/lsyd_work/qtfx_work_detail/electricity_gas_list.dart';
|
||||
|
||||
|
||||
/// 安全管理部门意见
|
||||
class ElectricityAqglDetail extends StatefulWidget {
|
||||
const ElectricityAqglDetail({
|
||||
/// 配送电单位意见
|
||||
class ElectricityPsdwDetail extends StatefulWidget {
|
||||
const ElectricityPsdwDetail({
|
||||
super.key,
|
||||
required this.ELECTRICITY_ID,
|
||||
required this.flow,
|
||||
|
|
@ -27,10 +27,10 @@ class ElectricityAqglDetail extends StatefulWidget {
|
|||
final String flow;
|
||||
|
||||
@override
|
||||
State<ElectricityAqglDetail> createState() => _ElectricityAqglDetailState();
|
||||
State<ElectricityPsdwDetail> createState() => _ElectricityPsdwDetailState();
|
||||
}
|
||||
|
||||
class _ElectricityAqglDetailState extends State<ElectricityAqglDetail> {
|
||||
class _ElectricityPsdwDetailState extends State<ElectricityPsdwDetail> {
|
||||
late bool isEditable = false;
|
||||
|
||||
/// 详情
|
||||
|
|
@ -263,7 +263,7 @@ class _ElectricityAqglDetailState extends State<ElectricityAqglDetail> {
|
|||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: MyAppbar(title: '安全管理部门意见'),
|
||||
appBar: MyAppbar(title: '配送电单位意见'),
|
||||
body: SafeArea(
|
||||
child: SingleChildScrollView(
|
||||
padding: EdgeInsets.all(12),
|
||||
|
|
@ -290,7 +290,7 @@ class _ElectricityAqglDetailState extends State<ElectricityAqglDetail> {
|
|||
Column(
|
||||
children: [
|
||||
ListItemFactory.createBuildMultilineInput(
|
||||
'安全管理部门意见',
|
||||
'配送电单位意见',
|
||||
'请输入意见',
|
||||
_contentController,
|
||||
isRequired: true
|
||||
|
|
@ -301,7 +301,7 @@ class _ElectricityAqglDetailState extends State<ElectricityAqglDetail> {
|
|||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
ListItemFactory.headerTitle('安全管理部门负责人'),
|
||||
ListItemFactory.headerTitle('配送电单位负责人'),
|
||||
CustomButton(
|
||||
text: '新增手写签字',
|
||||
height: 36,
|
||||
|
|
@ -1,272 +0,0 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:qhd_prevention/customWidget/custom_button.dart';
|
||||
import 'package:qhd_prevention/customWidget/toast_util.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/item_list_widget.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/sxkj_work/qtfx_work_detail/spacework_gas_list.dart';
|
||||
import 'package:qhd_prevention/tools/h_colors.dart';
|
||||
import 'package:qhd_prevention/tools/tools.dart';
|
||||
import 'package:qhd_prevention/http/ApiService.dart';
|
||||
import 'package:qhd_prevention/pages/my_appbar.dart';
|
||||
import 'package:qhd_prevention/customWidget/custom_alert_dialog.dart';
|
||||
import 'package:qhd_prevention/customWidget/single_image_viewer.dart';
|
||||
|
||||
/// 气体分析
|
||||
class ElectricityGasEdit extends StatefulWidget {
|
||||
const ElectricityGasEdit({
|
||||
super.key,
|
||||
required this.CONFINEDSPACE_ID,
|
||||
this.addFlag = false,
|
||||
});
|
||||
|
||||
final String CONFINEDSPACE_ID;
|
||||
final bool addFlag;
|
||||
|
||||
@override
|
||||
State<ElectricityGasEdit> createState() => _ElectricityGasEditState();
|
||||
}
|
||||
|
||||
class _ElectricityGasEditState extends State<ElectricityGasEdit> {
|
||||
Map<String, dynamic> pd = {};
|
||||
final TextEditingController _gasName1Controller = TextEditingController();
|
||||
final TextEditingController _gasName2Controller = TextEditingController();
|
||||
final TextEditingController _gasName3Controller = TextEditingController();
|
||||
final TextEditingController _gasName4Controller = TextEditingController();
|
||||
final TextEditingController _gasStandard1Controller = TextEditingController();
|
||||
final TextEditingController _gasStandard2Controller = TextEditingController();
|
||||
final TextEditingController _gasStandard3Controller = TextEditingController();
|
||||
final TextEditingController _gasStandard4Controller = TextEditingController();
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
_getData();
|
||||
}
|
||||
|
||||
Future<void> _getData() async {
|
||||
try {
|
||||
final result = await ApiService.getConfinedspacegaswh(widget.CONFINEDSPACE_ID);
|
||||
if (FormUtils.hasValue(result, 'pd')) {
|
||||
setState(() {
|
||||
pd = result['pd'];
|
||||
_gasName1Controller.text = pd['GAS_NAME1'] ?? '';
|
||||
_gasStandard1Controller.text = pd['GAS_STANDARD1'] ?? '';
|
||||
_gasName2Controller.text = pd['GAS_NAME2'] ?? '';
|
||||
_gasStandard2Controller.text = pd['GAS_STANDARD2'] ?? '';
|
||||
_gasName3Controller.text = pd['GAS_NAME3'] ?? '';
|
||||
_gasStandard3Controller.text = pd['GAS_STANDARD3'] ?? '';
|
||||
_gasName4Controller.text = pd['GAS_NAME4'] ?? '';
|
||||
_gasStandard4Controller.text = pd['GAS_STANDARD4'] ?? '';
|
||||
});
|
||||
}
|
||||
} catch (e) {
|
||||
ToastUtil.showNormal(context, '获取数据失败: \$e');
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> _gasAnalyze() async {
|
||||
// 清理旧的气体信息,避免遗留空字段
|
||||
for (var key in [
|
||||
'GAS_NAME1', 'GAS_STANDARD1',
|
||||
'GAS_NAME2', 'GAS_STANDARD2',
|
||||
'GAS_NAME3', 'GAS_STANDARD3',
|
||||
'GAS_NAME4', 'GAS_STANDARD4'
|
||||
]) {
|
||||
pd.remove(key);
|
||||
}
|
||||
|
||||
// 收集输入值,仅在非空时写入 pd
|
||||
void assignIfNotEmpty(String key, String value) {
|
||||
if (value.trim().isNotEmpty) pd[key] = value.trim();
|
||||
}
|
||||
|
||||
assignIfNotEmpty('GAS_NAME1', _gasName1Controller.text);
|
||||
assignIfNotEmpty('GAS_STANDARD1', _gasStandard1Controller.text);
|
||||
assignIfNotEmpty('GAS_NAME2', _gasName2Controller.text);
|
||||
assignIfNotEmpty('GAS_STANDARD2', _gasStandard2Controller.text);
|
||||
assignIfNotEmpty('GAS_NAME3', _gasName3Controller.text);
|
||||
assignIfNotEmpty('GAS_STANDARD3', _gasStandard3Controller.text);
|
||||
assignIfNotEmpty('GAS_NAME4', _gasName4Controller.text);
|
||||
assignIfNotEmpty('GAS_STANDARD4', _gasStandard4Controller.text);
|
||||
|
||||
// 固定字段
|
||||
pd['CONFINEDSPACE_ID'] = widget.CONFINEDSPACE_ID;
|
||||
pd['ANALYZE_USER'] = SessionService.instance.username;
|
||||
|
||||
// 校验至少填写了一项气体名称
|
||||
final hasAnyName = pd.containsKey('GAS_NAME1') || pd.containsKey('GAS_NAME2') ||
|
||||
pd.containsKey('GAS_NAME3') || pd.containsKey('GAS_NAME4');
|
||||
if (!hasAnyName) {
|
||||
ToastUtil.showNormal(context,
|
||||
widget.addFlag ? '最少填写一项气体名称' : '无气体检测信息');
|
||||
return;
|
||||
}
|
||||
|
||||
// 配对校验:有名称必须有标准,反之亦然
|
||||
void checkPair(String nameKey, String stdKey, String label) {
|
||||
final hasName = pd.containsKey(nameKey);
|
||||
final hasStd = pd.containsKey(stdKey);
|
||||
if (hasName && !hasStd) {
|
||||
ToastUtil.showNormal(context, '请输入$label 的合格标准');
|
||||
throw '';
|
||||
}
|
||||
if (!hasName && hasStd) {
|
||||
ToastUtil.showNormal(context, '请输入$label 的名称');
|
||||
throw '';
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
checkPair('GAS_NAME1', 'GAS_STANDARD1', '有毒有害气体名称1');
|
||||
checkPair('GAS_NAME2', 'GAS_STANDARD2', '有毒有害气体名称2');
|
||||
checkPair('GAS_NAME3', 'GAS_STANDARD3', '可燃气体名称1');
|
||||
checkPair('GAS_NAME4', 'GAS_STANDARD4', '可燃气体名称2');
|
||||
} catch (_) {
|
||||
return;
|
||||
}
|
||||
|
||||
// 提交
|
||||
final isEdit = pd.containsKey('CONFINEDSPACEGASWH_ID') &&
|
||||
pd['CONFINEDSPACEGASWH_ID'] != null;
|
||||
final url = isEdit ? '/app/confinedspacegaswh/edit' : '/app/confinedspacegaswh/add';
|
||||
try {
|
||||
LoadingDialogHelper.show();
|
||||
final res = await ApiService.submitSpaceGas(url, pd);
|
||||
LoadingDialogHelper.hide();
|
||||
if (res != null && res['result'] == 'success') {
|
||||
|
||||
Map<String, dynamic> arguments = {
|
||||
'isShow': widget.addFlag,
|
||||
'CONFINEDSPACE_ID': widget.CONFINEDSPACE_ID,
|
||||
'addFlag': 1,
|
||||
'GAS_NAME1': pd['GAS_NAME1'] ?? '',
|
||||
'GAS_NAME2': pd['GAS_NAME2'] ?? '',
|
||||
'GAS_NAME3': pd['GAS_NAME3'] ?? '',
|
||||
'GAS_NAME4': pd['GAS_NAME4'] ?? '',
|
||||
};
|
||||
pushPage(SpaceworkGasList(CONFINEDSPACE_ID: widget.CONFINEDSPACE_ID, saveParams: arguments,addFlag: true,), context);
|
||||
} else {
|
||||
ToastUtil.showNormal(context, res['message'] ?? '提交失败');
|
||||
}
|
||||
} catch (e) {
|
||||
LoadingDialogHelper.hide();
|
||||
ToastUtil.showNormal(context, '提交异常: $e');
|
||||
}
|
||||
}
|
||||
|
||||
Widget _card(Widget child) {
|
||||
return Container(
|
||||
padding: const EdgeInsets.symmetric(vertical: 5),
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.white,
|
||||
borderRadius: BorderRadius.circular(5),
|
||||
),
|
||||
child: child,
|
||||
);
|
||||
}
|
||||
|
||||
Widget _buildListContent() {
|
||||
return Padding(
|
||||
padding: const EdgeInsets.all(12),
|
||||
child: SingleChildScrollView(
|
||||
child: Column(
|
||||
children: [
|
||||
_card(
|
||||
Column(
|
||||
children: [
|
||||
ItemListWidget.selectableLineTitleTextField(
|
||||
label: '有毒有害气体名称1:',
|
||||
isEditable: true,
|
||||
controller: _gasName1Controller,
|
||||
text: '',
|
||||
),
|
||||
const Divider(),
|
||||
ItemListWidget.selectableLineTitleTextField(
|
||||
label: '合格标准:',
|
||||
isEditable: true,
|
||||
controller: _gasStandard1Controller,
|
||||
text: '',
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 12),
|
||||
_card(
|
||||
Column(
|
||||
children: [
|
||||
ItemListWidget.selectableLineTitleTextField(
|
||||
label: '有毒有害气体名称2:',
|
||||
isEditable: true,
|
||||
controller: _gasName2Controller,
|
||||
text: '',
|
||||
),
|
||||
const Divider(),
|
||||
ItemListWidget.selectableLineTitleTextField(
|
||||
label: '合格标准:',
|
||||
isEditable: true,
|
||||
controller: _gasStandard2Controller,
|
||||
text: '',
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 12),
|
||||
_card(
|
||||
Column(
|
||||
children: [
|
||||
ItemListWidget.selectableLineTitleTextField(
|
||||
label: '可燃气体名称1:',
|
||||
isEditable: true,
|
||||
controller: _gasName3Controller,
|
||||
text: '',
|
||||
),
|
||||
const Divider(),
|
||||
ItemListWidget.selectableLineTitleTextField(
|
||||
label: '合格标准:',
|
||||
isEditable: true,
|
||||
controller: _gasStandard3Controller,
|
||||
text: '',
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 12),
|
||||
_card(
|
||||
Column(
|
||||
children: [
|
||||
ItemListWidget.selectableLineTitleTextField(
|
||||
label: '可燃气体名称2:',
|
||||
isEditable: true,
|
||||
controller: _gasName4Controller,
|
||||
text: '',
|
||||
),
|
||||
const Divider(),
|
||||
ItemListWidget.selectableLineTitleTextField(
|
||||
label: '合格标准:',
|
||||
isEditable: true,
|
||||
controller: _gasStandard4Controller,
|
||||
text: '',
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 20),
|
||||
CustomButton(
|
||||
text: '气体分析',
|
||||
backgroundColor: Colors.green,
|
||||
onPressed: _gasAnalyze,
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
backgroundColor: h_backGroundColor(),
|
||||
appBar: MyAppbar(title: '气体名称'),
|
||||
body: SafeArea(child: _buildListContent()),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
@ -75,23 +75,23 @@ class _ElectricityGasListState extends State<ElectricityGasList> {
|
|||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Text('分析时间: ${item['ANALYZE_TIME'] ?? ''}'),
|
||||
Text('代表性气体: ${item['ANALYZE_GAS'] ?? ''}'),
|
||||
],
|
||||
),
|
||||
const SizedBox(height: 6),
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Text('分析数据: ${item['ANALYZE_RESULT'] ?? ''}'),
|
||||
if ((item['ANALYZE_PLACE'] ?? '').toString().isNotEmpty)
|
||||
Text('分析地点: ${item['ANALYZE_PLACE']}'),
|
||||
],
|
||||
),
|
||||
const SizedBox(height: 6),
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Text('可燃气体检测结果: ${item['ANALYZE_RESULT'] ?? ''}'),
|
||||
|
||||
],
|
||||
),
|
||||
const SizedBox(height: 6),
|
||||
Row(
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
children: [
|
||||
const Text('分析人:'),
|
||||
Text('分析人:${item['ANALYZE_USER'] ?? ''}'),
|
||||
const SizedBox(width: 8),
|
||||
Expanded(
|
||||
child: Wrap(
|
||||
|
|
@ -101,7 +101,7 @@ class _ElectricityGasListState extends State<ElectricityGasList> {
|
|||
final img = baseImgPath + images[i];
|
||||
return GestureDetector(
|
||||
onTap: () {
|
||||
present(
|
||||
presentOpaque(
|
||||
SingleImageViewer(imageUrl: img),
|
||||
context,
|
||||
);
|
||||
|
|
@ -119,7 +119,7 @@ class _ElectricityGasListState extends State<ElectricityGasList> {
|
|||
if (widget.addFlag)
|
||||
TextButton(
|
||||
onPressed: () =>
|
||||
_deleteItem(item['HOTWORKGAS_ID'].toString()),
|
||||
_deleteItem(item['ELECTRICITYGAS_ID'].toString()),
|
||||
style: TextButton.styleFrom(
|
||||
backgroundColor: Colors.red,
|
||||
padding: const EdgeInsets.symmetric(horizontal: 12),
|
||||
|
|
@ -171,7 +171,7 @@ class _ElectricityGasListState extends State<ElectricityGasList> {
|
|||
return Scaffold(
|
||||
backgroundColor: Colors.white,
|
||||
appBar: MyAppbar(
|
||||
title: '气体分析详情',
|
||||
title: '临时用电作业气体分析',
|
||||
actions: [
|
||||
if (widget.addFlag)
|
||||
TextButton(
|
||||
|
|
|
|||
|
|
@ -1,5 +1,4 @@
|
|||
import 'dart:io';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/sxkj_work/qtfx_work_detail/spacework_gas_list.dart';
|
||||
import 'package:dotted_line/dotted_line.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:intl/intl.dart';
|
||||
|
|
@ -15,13 +14,8 @@ import 'package:qhd_prevention/tools/tools.dart';
|
|||
import 'package:qhd_prevention/pages/mine/mine_sign_page.dart';
|
||||
|
||||
class ElectricityGasTestPage extends StatefulWidget {
|
||||
const ElectricityGasTestPage({
|
||||
Key? key,
|
||||
required this.ELECTRICITY_ID,
|
||||
this.saveParams = const {},
|
||||
}) : super(key: key);
|
||||
const ElectricityGasTestPage({Key? key, required this.ELECTRICITY_ID}) : super(key: key);
|
||||
|
||||
final Map<String, dynamic> saveParams;
|
||||
final String ELECTRICITY_ID;
|
||||
|
||||
@override
|
||||
|
|
@ -32,24 +26,13 @@ class _ElectricityGasTestPageState extends State<ElectricityGasTestPage> {
|
|||
String _selectData = '';
|
||||
List<String> imagePaths = [];
|
||||
List<String> signTimes = []; // 签字时间列表
|
||||
Map<String, dynamic> pd = {};
|
||||
final TextEditingController _PartController = TextEditingController(); // 部位
|
||||
final TextEditingController _O2Controller = TextEditingController(); // 结果
|
||||
final TextEditingController _addressController =
|
||||
TextEditingController(); // 地点
|
||||
|
||||
final TextEditingController _gas1Controller = TextEditingController(); // 地点
|
||||
final TextEditingController _gas2Controller = TextEditingController(); // 地点
|
||||
final TextEditingController _gas3Controller = TextEditingController(); // 地点
|
||||
final TextEditingController _gas4Controller = TextEditingController(); // 地点
|
||||
|
||||
final TextEditingController _pointController = TextEditingController();
|
||||
final TextEditingController _resultController = TextEditingController();
|
||||
bool _loading = false;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
pd['ANALYZE_USER'] = SessionService.instance.username;
|
||||
pd['ELECTRICITY_ID'] = widget.ELECTRICITY_ID;
|
||||
}
|
||||
|
||||
Future<void> _chooseDatePicker() async {
|
||||
|
|
@ -57,7 +40,6 @@ class _ElectricityGasTestPageState extends State<ElectricityGasTestPage> {
|
|||
if (picked != null) {
|
||||
setState(() {
|
||||
_selectData = DateFormat('yyyy-MM-dd HH:mm').format(picked);
|
||||
pd['ANALYZE_TIME'] = _selectData;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
@ -80,59 +62,58 @@ class _ElectricityGasTestPageState extends State<ElectricityGasTestPage> {
|
|||
|
||||
Widget _signListWidget() {
|
||||
return Column(
|
||||
children:
|
||||
imagePaths.map((path) {
|
||||
return Column(
|
||||
children: imagePaths.map((path) {
|
||||
return Column(
|
||||
children: [
|
||||
const SizedBox(height: 10),
|
||||
const Divider(),
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
const SizedBox(height: 10),
|
||||
const Divider(),
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
GestureDetector(
|
||||
child: // 用一个 ConstrainedBox 限制最大尺寸,并改为 BoxFit.contain
|
||||
ConstrainedBox(
|
||||
constraints: const BoxConstraints(
|
||||
maxWidth: 200,
|
||||
maxHeight: 150,
|
||||
),
|
||||
child: Image.file(
|
||||
File(path),
|
||||
// 改为完整显示
|
||||
fit: BoxFit.contain,
|
||||
),
|
||||
),
|
||||
onTap: () {
|
||||
presentOpaque(
|
||||
SingleImageViewer(imageUrl: path),
|
||||
context,
|
||||
);
|
||||
},
|
||||
),
|
||||
Column(
|
||||
children: [
|
||||
GestureDetector(
|
||||
child: // 用一个 ConstrainedBox 限制最大尺寸,并改为 BoxFit.contain
|
||||
ConstrainedBox(
|
||||
constraints: const BoxConstraints(
|
||||
maxWidth: 200,
|
||||
maxHeight: 150,
|
||||
),
|
||||
child: Image.file(
|
||||
File(path),
|
||||
// 改为完整显示
|
||||
fit: BoxFit.contain,
|
||||
),
|
||||
Container(
|
||||
padding: const EdgeInsets.only(right: 5),
|
||||
child: CustomButton(
|
||||
text: 'X',
|
||||
height: 30,
|
||||
padding: const EdgeInsets.symmetric(horizontal: 10),
|
||||
backgroundColor: Colors.red,
|
||||
onPressed: () {
|
||||
setState(() {
|
||||
imagePaths.remove(path);
|
||||
});
|
||||
},
|
||||
),
|
||||
onTap: () {
|
||||
presentOpaque(
|
||||
SingleImageViewer(imageUrl: path),
|
||||
context,
|
||||
);
|
||||
},
|
||||
),
|
||||
Column(
|
||||
children: [
|
||||
Container(
|
||||
padding: const EdgeInsets.only(right: 5),
|
||||
child: CustomButton(
|
||||
text: 'X',
|
||||
height: 30,
|
||||
padding: const EdgeInsets.symmetric(horizontal: 10),
|
||||
backgroundColor: Colors.red,
|
||||
onPressed: () {
|
||||
setState(() {
|
||||
imagePaths.remove(path);
|
||||
});
|
||||
},
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 80),
|
||||
],
|
||||
),
|
||||
const SizedBox(height: 80),
|
||||
],
|
||||
),
|
||||
],
|
||||
);
|
||||
}).toList(),
|
||||
),
|
||||
],
|
||||
);
|
||||
}).toList(),
|
||||
);
|
||||
}
|
||||
|
||||
|
|
@ -142,13 +123,7 @@ class _ElectricityGasTestPageState extends State<ElectricityGasTestPage> {
|
|||
return;
|
||||
}
|
||||
if (status == 1) {
|
||||
if (_selectData.isEmpty) {
|
||||
ToastUtil.showNormal(context, '请选择取样分析时间');
|
||||
return;
|
||||
}
|
||||
if (_PartController.text.isEmpty ||
|
||||
_O2Controller.text.isEmpty ||
|
||||
_addressController.text.isEmpty) {
|
||||
if (_selectData.isEmpty || _resultController.text.isEmpty || _pointController.text.isEmpty) {
|
||||
ToastUtil.showNormal(context, '请完善所有字段');
|
||||
return;
|
||||
}
|
||||
|
|
@ -158,82 +133,53 @@ class _ElectricityGasTestPageState extends State<ElectricityGasTestPage> {
|
|||
if (status != 1) {
|
||||
await showDialog<String>(
|
||||
context: context,
|
||||
builder:
|
||||
(_) => CustomAlertDialog(
|
||||
title: '作废原因',
|
||||
mode: DialogMode.input,
|
||||
hintText: '请输入作废原因',
|
||||
cancelText: '取消',
|
||||
confirmText: '确定',
|
||||
onInputConfirm: (text) {
|
||||
reasonText = text;
|
||||
},
|
||||
),
|
||||
builder: (_) => CustomAlertDialog(
|
||||
title: '作废原因',
|
||||
mode: DialogMode.input,
|
||||
hintText: '请输入作废原因',
|
||||
cancelText: '取消',
|
||||
confirmText: '确定',
|
||||
onInputConfirm: (text) {
|
||||
reasonText = text;
|
||||
},
|
||||
),
|
||||
);
|
||||
if (reasonText.isEmpty) {
|
||||
ToastUtil.showNormal(context, '请填写作废原因');
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (FormUtils.hasValue(widget.saveParams, 'GAS_NAME1')) {
|
||||
if (_gas1Controller.text.trim().isEmpty) {
|
||||
pd['DATA1'] = 0;
|
||||
} else {
|
||||
pd['DATA1'] = _gas1Controller.text;
|
||||
}
|
||||
}
|
||||
if (FormUtils.hasValue(widget.saveParams, 'GAS_NAME2')) {
|
||||
if (_gas2Controller.text.trim().isEmpty) {
|
||||
pd['DATA2'] = 0;
|
||||
} else {
|
||||
pd['DATA2'] = _gas2Controller.text;
|
||||
}
|
||||
}
|
||||
if (FormUtils.hasValue(widget.saveParams, 'GAS_NAME3')) {
|
||||
if (_gas3Controller.text.trim().isEmpty) {
|
||||
pd['DATA3'] = 0;
|
||||
} else {
|
||||
pd['DATA3'] = _gas3Controller.text;
|
||||
}
|
||||
}
|
||||
if (FormUtils.hasValue(widget.saveParams, 'GAS_NAME4')) {
|
||||
if (_gas4Controller.text.trim().isEmpty) {
|
||||
pd['DATA4'] = 0;
|
||||
} else {
|
||||
pd['DATA4'] = _gas4Controller.text;
|
||||
}
|
||||
}
|
||||
|
||||
bool isConfirm = false;
|
||||
await showDialog<bool>(
|
||||
context: context,
|
||||
builder: (_) => CustomAlertDialog(
|
||||
title: '请确认',
|
||||
content: status == 1 ? '通过本作业票?' : '作废本作业票?',
|
||||
onConfirm: () {
|
||||
isConfirm = true;
|
||||
},
|
||||
),
|
||||
);
|
||||
if (isConfirm != true) return;
|
||||
|
||||
setState(() => _loading = true);
|
||||
|
||||
final formData = {
|
||||
...pd,
|
||||
'ANALYZE_PART': _PartController.text,
|
||||
'OXYGEN_CONTENT': _O2Controller.text,
|
||||
'ANALYZE_PLACE': _addressController.text,
|
||||
'ELECTRICITY_ID': widget.ELECTRICITY_ID,
|
||||
'ANALYZE_TIME': _selectData,
|
||||
'ANALYZE_USER': SessionService.instance.username,
|
||||
'ANALYZE_PLACE': _pointController.text,
|
||||
'ANALYZE_RESULT': _resultController.text,
|
||||
|
||||
'APPLY_STATUS': status,
|
||||
'STEP_REASON': reasonText ?? '',
|
||||
'SIGNTIME': signTimes.join(','),
|
||||
'SIGNTIME':signTimes.join(','),
|
||||
'CORPINFO_ID': SessionService.instance.corpinfoId,
|
||||
'USER_ID': SessionService.instance.loginUserId,
|
||||
};
|
||||
await showDialog<bool>(
|
||||
context: context,
|
||||
builder:
|
||||
(_) => CustomAlertDialog(
|
||||
title: '请确认',
|
||||
content: status == 1 ? '通过本作业票?' : '作废本作业票?',
|
||||
onConfirm: () {
|
||||
isConfirm = true;
|
||||
},
|
||||
),
|
||||
);
|
||||
if (isConfirm != true) return;
|
||||
|
||||
try {
|
||||
await ApiService.saveGasTest('confinedspace',formData, imagePaths);
|
||||
await ApiService.saveGasTest('electricity',formData, imagePaths);
|
||||
ToastUtil.showNormal(context, status == 1 ? '保存成功' : '作废成功');
|
||||
Navigator.of(context).pop(status == 1);
|
||||
} catch (e) {
|
||||
|
|
@ -243,169 +189,96 @@ class _ElectricityGasTestPageState extends State<ElectricityGasTestPage> {
|
|||
}
|
||||
}
|
||||
|
||||
Future<void> setRequest() async {}
|
||||
Future<void> setRequest() async {
|
||||
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: MyAppbar(title: '气体检测'),
|
||||
body: SafeArea(
|
||||
child:
|
||||
_loading
|
||||
? const Center(child: CircularProgressIndicator())
|
||||
: SingleChildScrollView(
|
||||
padding: const EdgeInsets.all(12),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.stretch,
|
||||
children: [
|
||||
Container(
|
||||
padding: const EdgeInsets.all(5),
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.white,
|
||||
borderRadius: BorderRadius.circular(10),
|
||||
),
|
||||
child: Column(
|
||||
children: [
|
||||
if (FormUtils.hasValue(
|
||||
widget.saveParams,
|
||||
'GAS_NAME1',
|
||||
))
|
||||
Column(
|
||||
children: [
|
||||
ItemListWidget.singleLineTitleText(
|
||||
label: '${widget.saveParams['GAS_NAME1']}:',
|
||||
isEditable: true,
|
||||
isRequired: false,
|
||||
strongRequired: false,
|
||||
controller: _gas1Controller,
|
||||
),
|
||||
const Divider(),
|
||||
],
|
||||
),
|
||||
if (FormUtils.hasValue(
|
||||
widget.saveParams,
|
||||
'GAS_NAME2',
|
||||
))
|
||||
Column(
|
||||
children: [
|
||||
ItemListWidget.singleLineTitleText(
|
||||
label: '${widget.saveParams['GAS_NAME2']}:',
|
||||
isEditable: true,
|
||||
isRequired: false,
|
||||
strongRequired: false,
|
||||
controller: _gas2Controller,
|
||||
),
|
||||
const Divider(),
|
||||
],
|
||||
),
|
||||
if (FormUtils.hasValue(
|
||||
widget.saveParams,
|
||||
'GAS_NAME3',
|
||||
))
|
||||
Column(
|
||||
children: [
|
||||
ItemListWidget.singleLineTitleText(
|
||||
label: '${widget.saveParams['GAS_NAME3']}:',
|
||||
isEditable: true,
|
||||
isRequired: false,
|
||||
strongRequired: false,
|
||||
controller: _gas3Controller,
|
||||
),
|
||||
const Divider(),
|
||||
],
|
||||
),
|
||||
if (FormUtils.hasValue(
|
||||
widget.saveParams,
|
||||
'GAS_NAME4',
|
||||
))
|
||||
Column(
|
||||
children: [
|
||||
ItemListWidget.singleLineTitleText(
|
||||
label: '${widget.saveParams['GAS_NAME4']}:',
|
||||
isEditable: true,
|
||||
isRequired: false,
|
||||
strongRequired: false,
|
||||
controller: _gas4Controller,
|
||||
),
|
||||
const Divider(),
|
||||
],
|
||||
),
|
||||
|
||||
ItemListWidget.selectableLineTitleTextRightButton(
|
||||
label: '取样分析时间',
|
||||
isEditable: true,
|
||||
text: _selectData,
|
||||
onTap: _chooseDatePicker,
|
||||
),
|
||||
const Divider(),
|
||||
ItemListWidget.singleLineTitleText(
|
||||
label: '分析部位:',
|
||||
hintText: '请输入分析部位',
|
||||
isEditable: true,
|
||||
controller: _PartController,
|
||||
),
|
||||
const Divider(),
|
||||
ItemListWidget.singleLineTitleText(
|
||||
label: '氧气含量:',
|
||||
hintText: '请输入氧气含量',
|
||||
isEditable: true,
|
||||
controller: _O2Controller,
|
||||
),
|
||||
|
||||
const Divider(),
|
||||
ItemListWidget.singleLineTitleText(
|
||||
label: '分析地点:',
|
||||
hintText: '请输入分析地点',
|
||||
isEditable: true,
|
||||
controller: _addressController,
|
||||
),
|
||||
const Divider(),
|
||||
ItemListWidget.singleLineTitleText(
|
||||
label: '分析人:',
|
||||
isEditable: false,
|
||||
strongRequired: true,
|
||||
text: SessionService.instance.username,
|
||||
),
|
||||
const SizedBox(height: 20),
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.end,
|
||||
children: [
|
||||
CustomButton(
|
||||
text: '新增手写签字',
|
||||
height: 40,
|
||||
backgroundColor: Colors.blue,
|
||||
onPressed: _sign,
|
||||
),
|
||||
],
|
||||
),
|
||||
if (imagePaths.isNotEmpty) _signListWidget(),
|
||||
],
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 20),
|
||||
Row(
|
||||
children: [
|
||||
Expanded(
|
||||
child: CustomButton(
|
||||
text: '作废',
|
||||
backgroundColor: Colors.red,
|
||||
onPressed: () => _submit(-1),
|
||||
),
|
||||
),
|
||||
const SizedBox(width: 20),
|
||||
Expanded(
|
||||
child: CustomButton(
|
||||
text: '保存',
|
||||
backgroundColor: Colors.blue,
|
||||
onPressed: () => _submit(1),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
],
|
||||
),
|
||||
appBar: MyAppbar(title: '气体检测'),
|
||||
body: SafeArea(child:
|
||||
_loading
|
||||
? const Center(child: CircularProgressIndicator())
|
||||
: SingleChildScrollView(
|
||||
padding: const EdgeInsets.all(12),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.stretch,
|
||||
children: [
|
||||
Container(
|
||||
padding: const EdgeInsets.all(5),
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.white,
|
||||
borderRadius: BorderRadius.circular(10),
|
||||
),
|
||||
),
|
||||
child: Column(
|
||||
children: [
|
||||
ItemListWidget.selectableLineTitleTextRightButton(
|
||||
label: '分析时间',
|
||||
isEditable: true,
|
||||
text: _selectData,
|
||||
onTap: _chooseDatePicker,
|
||||
),
|
||||
|
||||
const Divider(),
|
||||
ItemListWidget.singleLineTitleText(
|
||||
label: '分析点:',
|
||||
isEditable: true,
|
||||
controller: _pointController,
|
||||
),
|
||||
const Divider(),
|
||||
|
||||
ItemListWidget.singleLineTitleText(
|
||||
label: '可燃气体检测结果:',
|
||||
isEditable: true,
|
||||
controller: _resultController,
|
||||
),
|
||||
const Divider(),
|
||||
ItemListWidget.singleLineTitleText(
|
||||
label: '分析人:',
|
||||
isEditable: false,
|
||||
text: SessionService.instance.username,
|
||||
),
|
||||
const SizedBox(height: 20),
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.end,
|
||||
children: [
|
||||
CustomButton(
|
||||
text: '新增手写签字',
|
||||
height: 40,
|
||||
backgroundColor: Colors.blue,
|
||||
onPressed: _sign,
|
||||
),
|
||||
],
|
||||
),
|
||||
if (imagePaths.isNotEmpty) _signListWidget(),
|
||||
],
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 20),
|
||||
Row(
|
||||
children: [
|
||||
Expanded(
|
||||
child: CustomButton(
|
||||
text: '作废',
|
||||
backgroundColor: Colors.red,
|
||||
onPressed: () => _submit(-1),
|
||||
),
|
||||
),
|
||||
const SizedBox(width: 20),
|
||||
Expanded(
|
||||
child: CustomButton(
|
||||
text: '保存',
|
||||
backgroundColor: Colors.blue,
|
||||
onPressed: () => _submit(1),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -43,6 +43,7 @@ class _SafeFunctionDialogState extends State<SafeFunctionDialog> {
|
|||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return AlertDialog(
|
||||
backgroundColor: Colors.white,
|
||||
insetPadding: const EdgeInsets.symmetric(horizontal: 12, vertical: 24),
|
||||
content: SizedBox(
|
||||
width: MediaQuery.of(context).size.width - 24,
|
||||
|
|
|
|||
|
|
@ -9,7 +9,7 @@ import 'package:qhd_prevention/customWidget/department_person_picker.dart';
|
|||
import 'package:qhd_prevention/customWidget/department_picker.dart';
|
||||
import 'package:qhd_prevention/customWidget/toast_util.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/item_list_widget.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/dh_work/HotWorkDetailFormWidget.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/lsyd_work/ElectricityDetailFormWidget.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/lsyd_work/qtfx_work_detail/electricity_gas_list.dart';
|
||||
import 'package:qhd_prevention/tools/tools.dart';
|
||||
import 'package:qhd_prevention/http/ApiService.dart';
|
||||
|
|
@ -18,7 +18,7 @@ import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/lsyd_work/qtf
|
|||
import 'package:qhd_prevention/customWidget/custom_alert_dialog.dart';
|
||||
import 'package:qhd_prevention/customWidget/single_image_viewer.dart';
|
||||
import 'package:qhd_prevention/pages/mine/mine_sign_page.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_Wrok/dh_work/szaq_work_detail/SafeFunctionDialog.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/lsyd_work/szaq_work_detail/SafeFunctionDialog.dart';
|
||||
/// 设置安全措施确认人
|
||||
class ElectricitySetSafeDetail extends StatefulWidget {
|
||||
const ElectricitySetSafeDetail({
|
||||
|
|
@ -568,7 +568,7 @@ class _ElectricitySetSafeDetailState extends State<ElectricitySetSafeDetail> {
|
|||
child: Column(
|
||||
children: [
|
||||
// _card(_defaultDetail()),
|
||||
HotWorkDetailFormWidget(
|
||||
ElectricityDetailFormWidget(
|
||||
pd: pd,
|
||||
isEditable: false,
|
||||
onChooseLevel: (){},
|
||||
|
|
|
|||
|
|
@ -12,11 +12,11 @@ import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/lsyd_work/qtf
|
|||
import 'package:qhd_prevention/customWidget/custom_alert_dialog.dart';
|
||||
import 'package:qhd_prevention/customWidget/single_image_viewer.dart';
|
||||
import 'package:qhd_prevention/pages/mine/mine_sign_page.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/dh_work/SpecialWorkFormBaseWork.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/lsyd_work/SpecialWorkFormBaseWork.dart';
|
||||
|
||||
/// 所在单位意见
|
||||
class ElectricitySzdwDetail extends StatefulWidget {
|
||||
const ElectricitySzdwDetail({
|
||||
/// 用电单位意见
|
||||
class ElectricityYddwDetail extends StatefulWidget {
|
||||
const ElectricityYddwDetail({
|
||||
super.key,
|
||||
required this.ELECTRICITY_ID,
|
||||
required this.flow,
|
||||
|
|
@ -26,10 +26,10 @@ class ElectricitySzdwDetail extends StatefulWidget {
|
|||
final String flow;
|
||||
|
||||
@override
|
||||
State<ElectricitySzdwDetail> createState() => _ElectricitySzdwDetailState();
|
||||
State<ElectricityYddwDetail> createState() => _ElectricityYddwDetailState();
|
||||
}
|
||||
|
||||
class _ElectricitySzdwDetailState extends State<ElectricitySzdwDetail> {
|
||||
class _ElectricityYddwDetailState extends State<ElectricityYddwDetail> {
|
||||
late bool isEditable = false;
|
||||
|
||||
/// 详情
|
||||
|
|
@ -133,7 +133,7 @@ class _ElectricitySzdwDetailState extends State<ElectricitySzdwDetail> {
|
|||
String DESCR = _contentController.text.trim();
|
||||
|
||||
if (DESCR.isEmpty) {
|
||||
ToastUtil.showNormal(context, '请输入所在单位负责人意见');
|
||||
ToastUtil.showNormal(context, '请输入用电单位意见');
|
||||
return;
|
||||
}
|
||||
if (status == '1') {
|
||||
|
|
@ -263,7 +263,7 @@ class _ElectricitySzdwDetailState extends State<ElectricitySzdwDetail> {
|
|||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: MyAppbar(title: '所在单位意见'),
|
||||
appBar: MyAppbar(title: '用电单位意见'),
|
||||
body: SafeArea(
|
||||
child: SingleChildScrollView(
|
||||
padding: EdgeInsets.all(12),
|
||||
|
|
@ -290,7 +290,7 @@ class _ElectricitySzdwDetailState extends State<ElectricitySzdwDetail> {
|
|||
Column(
|
||||
children: [
|
||||
ListItemFactory.createBuildMultilineInput(
|
||||
'所在单位负责人意见',
|
||||
'用电单位意见',
|
||||
'请输入意见',
|
||||
_contentController,
|
||||
isRequired: true
|
||||
|
|
@ -301,7 +301,7 @@ class _ElectricitySzdwDetailState extends State<ElectricitySzdwDetail> {
|
|||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
ListItemFactory.headerTitle('所在单位负责人'),
|
||||
ListItemFactory.headerTitle('用电单位负责人'),
|
||||
CustomButton(
|
||||
text: '新增手写签字',
|
||||
height: 36,
|
||||
|
|
@ -0,0 +1,321 @@
|
|||
import 'dart:io';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:intl/intl.dart';
|
||||
import 'package:qhd_prevention/customWidget/ItemWidgetFactory.dart';
|
||||
import 'package:qhd_prevention/customWidget/custom_button.dart';
|
||||
import 'package:qhd_prevention/customWidget/toast_util.dart';
|
||||
import 'package:qhd_prevention/tools/tools.dart';
|
||||
import 'package:qhd_prevention/http/ApiService.dart';
|
||||
import 'package:qhd_prevention/pages/my_appbar.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/lsyd_work/qtfx_work_detail/electricity_gas_list.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/lsyd_work/SpecialWorkFormBaseWork.dart';
|
||||
import 'package:qhd_prevention/customWidget/custom_alert_dialog.dart';
|
||||
import 'package:qhd_prevention/customWidget/single_image_viewer.dart';
|
||||
import 'package:qhd_prevention/pages/mine/mine_sign_page.dart';
|
||||
/// 用电人签字
|
||||
class ElectricityYdrDetail extends StatefulWidget {
|
||||
const ElectricityYdrDetail({
|
||||
super.key,
|
||||
required this.ELECTRICITY_ID,
|
||||
required this.flow,
|
||||
});
|
||||
|
||||
final String ELECTRICITY_ID;
|
||||
final String flow;
|
||||
|
||||
@override
|
||||
State<ElectricityYdrDetail> createState() => _ElectricityYdrDetailState();
|
||||
}
|
||||
|
||||
class _ElectricityYdrDetailState extends State<ElectricityYdrDetail> {
|
||||
late bool isEditable = false;
|
||||
/// 详情
|
||||
late Map<String, dynamic> pd = {};
|
||||
/// 安全防护措施列表
|
||||
late List<Map<String, dynamic>> measuresList = [];
|
||||
late Map<String, dynamic> signs = {};
|
||||
|
||||
|
||||
List<String> imagePaths = [];
|
||||
List<String> signTimes = []; // 签字时间列表
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
_getData();
|
||||
}
|
||||
|
||||
/// 签字
|
||||
Future<void> _sign() async {
|
||||
final path = await Navigator.push(
|
||||
context,
|
||||
MaterialPageRoute(builder: (context) => MineSignPage()),
|
||||
);
|
||||
if (path != null) {
|
||||
final now = DateFormat('yyyy-MM-dd HH:mm').format(DateTime.now());
|
||||
|
||||
setState(() {
|
||||
imagePaths.add(path);
|
||||
signTimes.add(now);
|
||||
FocusHelper.clearFocus(context);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
Widget _signListWidget() {
|
||||
return Column(
|
||||
children:
|
||||
imagePaths.map((path) {
|
||||
return Column(
|
||||
children: [
|
||||
const SizedBox(height: 10),
|
||||
const Divider(),
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
GestureDetector(
|
||||
child: // 用一个 ConstrainedBox 限制最大尺寸,并改为 BoxFit.contain
|
||||
ConstrainedBox(
|
||||
constraints: const BoxConstraints(
|
||||
maxWidth: 200,
|
||||
maxHeight: 150,
|
||||
),
|
||||
child: Image.file(
|
||||
File(path),
|
||||
// 改为完整显示
|
||||
fit: BoxFit.contain,
|
||||
),
|
||||
),
|
||||
onTap: () {
|
||||
presentOpaque(
|
||||
SingleImageViewer(imageUrl: path),
|
||||
context,
|
||||
);
|
||||
},
|
||||
),
|
||||
Column(
|
||||
children: [
|
||||
Container(
|
||||
padding: const EdgeInsets.only(right: 5),
|
||||
child: CustomButton(
|
||||
text: 'X',
|
||||
height: 30,
|
||||
padding: const EdgeInsets.symmetric(horizontal: 10),
|
||||
backgroundColor: Colors.red,
|
||||
onPressed: () {
|
||||
setState(() {
|
||||
imagePaths.remove(path);
|
||||
});
|
||||
},
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 80),
|
||||
],
|
||||
),
|
||||
],
|
||||
),
|
||||
],
|
||||
);
|
||||
}).toList(),
|
||||
);
|
||||
}
|
||||
|
||||
/// 作废 -1 通过 1
|
||||
Future<void> _submit(String status) async {
|
||||
if (imagePaths.isEmpty) {
|
||||
ToastUtil.showNormal(context, '请签字');
|
||||
return;
|
||||
}
|
||||
String reasonText = '';
|
||||
|
||||
if (status == '1') {
|
||||
} else {
|
||||
await showDialog<String>(
|
||||
context: context,
|
||||
builder:
|
||||
(_) => CustomAlertDialog(
|
||||
title: '作废原因',
|
||||
mode: DialogMode.input,
|
||||
hintText: '请输入作废原因',
|
||||
cancelText: '取消',
|
||||
confirmText: '确定',
|
||||
onInputConfirm: (text) {
|
||||
reasonText = text;
|
||||
},
|
||||
),
|
||||
);
|
||||
if (reasonText.isEmpty) {
|
||||
ToastUtil.showNormal(context, '请填写作废原因');
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
final Map<String, dynamic> formData = {};
|
||||
// 提交参数
|
||||
formData['ELECTRICITY_ID'] = widget.ELECTRICITY_ID;
|
||||
formData['SIGNTIME'] = signTimes.join(',');
|
||||
formData['USER_ID'] = SessionService.instance.loginUserId;
|
||||
formData['APPLY_STATUS'] = status;
|
||||
formData['STEP_REASON'] = reasonText;
|
||||
|
||||
await showDialog<String>(
|
||||
context: context,
|
||||
builder:
|
||||
(_) => CustomAlertDialog(
|
||||
title: '提示',
|
||||
content: '请确认' + (status == '1' ? "通过" : "作废") + '本作业票?',
|
||||
cancelText: '取消',
|
||||
confirmText: '确定',
|
||||
onConfirm: () async {
|
||||
LoadingDialogHelper.show();
|
||||
try {
|
||||
final result = await ApiService.saveSafeFunctionSure(
|
||||
'electricity',
|
||||
formData,
|
||||
imagePaths,
|
||||
);
|
||||
LoadingDialogHelper.hide();
|
||||
if (result['result'] == 'success') {
|
||||
ToastUtil.showSuccess(
|
||||
context,
|
||||
'保存成功',
|
||||
);
|
||||
Navigator.pop(context);
|
||||
}
|
||||
} catch (e) {
|
||||
LoadingDialogHelper.hide();
|
||||
ToastUtil.showNormal(context, '操作失败:$e');
|
||||
}
|
||||
},
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
/// 初始化拉取数据
|
||||
Future<void> _getData() async {
|
||||
final data = await ApiService.getHomeworkFindById('electricity', widget.ELECTRICITY_ID);
|
||||
setState(() {
|
||||
pd = data['pd'];
|
||||
|
||||
_getSigns(pd['ELECTRICITY_ID'] ?? '');
|
||||
_getMeasures(pd['ELECTRICITY_ID'] ?? '');
|
||||
});
|
||||
}
|
||||
|
||||
Future<void> _getMeasures(String homework_id) async {
|
||||
final data = await ApiService.listSignFinishMeasures('electricity',
|
||||
homework_id.length > 0 ? homework_id : widget.ELECTRICITY_ID,
|
||||
);
|
||||
setState(() {
|
||||
measuresList = List<Map<String, dynamic>>.from(
|
||||
data['finishMeasuresList'] ?? <Map<String, dynamic>>[],
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
Future<void> _getSigns(String homework_id) async {
|
||||
final data = await ApiService.listSignFinished('electricity',
|
||||
homework_id.length > 0 ? homework_id : widget.ELECTRICITY_ID,
|
||||
);
|
||||
setState(() {
|
||||
signs = data['signs'] ?? {};
|
||||
});
|
||||
}
|
||||
|
||||
/// 其他安全防护措施
|
||||
Widget _setSafeDetailWidget() {
|
||||
return Container(
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.white,
|
||||
borderRadius: BorderRadius.circular(8),
|
||||
),
|
||||
padding: EdgeInsets.symmetric(horizontal: 5),
|
||||
child: Column(
|
||||
children: [
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
ListItemFactory.createBuildSimpleSection('用电人'),
|
||||
CustomButton(
|
||||
text: '新增手写签字',
|
||||
height: 36,
|
||||
backgroundColor: Colors.green,
|
||||
onPressed: () {
|
||||
_sign();
|
||||
},
|
||||
),
|
||||
],
|
||||
),
|
||||
SizedBox(height: 10),
|
||||
if (imagePaths.isNotEmpty) _signListWidget(),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
/// 底部按钮
|
||||
Widget _bottomButtons() {
|
||||
return Row(
|
||||
spacing: 10,
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Expanded(
|
||||
child: CustomButton(
|
||||
height: 45,
|
||||
textStyle: TextStyle(fontSize: 16, color: Colors.white),
|
||||
text: '作废',
|
||||
backgroundColor: Colors.red,
|
||||
onPressed: () {
|
||||
_submit('-1');
|
||||
},
|
||||
),
|
||||
),
|
||||
Expanded(
|
||||
child: CustomButton(
|
||||
textStyle: TextStyle(fontSize: 16, color: Colors.white),
|
||||
text: '通过',
|
||||
backgroundColor: Colors.green,
|
||||
onPressed: () {
|
||||
_submit('1');
|
||||
},
|
||||
),
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: MyAppbar(title: '用电人签字确认'),
|
||||
body: SafeArea(
|
||||
child: SingleChildScrollView(
|
||||
padding: EdgeInsets.all(12),
|
||||
child: Column(
|
||||
children: [
|
||||
// _card(_defaultDetail()),
|
||||
SpecialWorkFormBaseWork(
|
||||
pd: pd,
|
||||
measuresList: measuresList,
|
||||
signs: signs,
|
||||
baseImgPath: ApiService.baseImgPath,
|
||||
isEditable: false,
|
||||
onChooseLevel: () {},
|
||||
onChooseHotworkUser: () {},
|
||||
onAnalyzeTap: () {
|
||||
pushPage(
|
||||
ElectricityGasList(ELECTRICITY_ID: widget.ELECTRICITY_ID),
|
||||
context,
|
||||
);
|
||||
},
|
||||
),
|
||||
SizedBox(height: 20),
|
||||
_setSafeDetailWidget(),
|
||||
SizedBox(height: 20),
|
||||
_bottomButtons(),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
@ -12,7 +12,7 @@ import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/lsyd_work/qtf
|
|||
import 'package:qhd_prevention/customWidget/custom_alert_dialog.dart';
|
||||
import 'package:qhd_prevention/customWidget/single_image_viewer.dart';
|
||||
import 'package:qhd_prevention/pages/mine/mine_sign_page.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/dh_work/SpecialWorkFormBaseWork.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/lsyd_work/SpecialWorkFormBaseWork.dart';
|
||||
import 'package:qhd_prevention/customWidget/picker/CupertinoDatePicker.dart';
|
||||
import 'package:qhd_prevention/customWidget/photo_picker_row.dart';
|
||||
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@ import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/lsyd_work/qtf
|
|||
import 'package:qhd_prevention/customWidget/custom_alert_dialog.dart';
|
||||
import 'package:qhd_prevention/customWidget/single_image_viewer.dart';
|
||||
import 'package:qhd_prevention/pages/mine/mine_sign_page.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/dh_work/SpecialWorkFormBaseWork.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/lsyd_work/SpecialWorkFormBaseWork.dart';
|
||||
|
||||
/// 作业负责人意见
|
||||
class ElectricityZyfzDetail extends StatefulWidget {
|
||||
|
|
|
|||
|
|
@ -0,0 +1,308 @@
|
|||
import 'dart:io';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:intl/intl.dart';
|
||||
import 'package:qhd_prevention/customWidget/ItemWidgetFactory.dart';
|
||||
import 'package:qhd_prevention/customWidget/custom_button.dart';
|
||||
import 'package:qhd_prevention/customWidget/toast_util.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/item_list_widget.dart';
|
||||
import 'package:qhd_prevention/tools/tools.dart';
|
||||
import 'package:qhd_prevention/http/ApiService.dart';
|
||||
import 'package:qhd_prevention/pages/my_appbar.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/lsyd_work/qtfx_work_detail/electricity_gas_list.dart';
|
||||
import 'package:qhd_prevention/customWidget/custom_alert_dialog.dart';
|
||||
import 'package:qhd_prevention/customWidget/single_image_viewer.dart';
|
||||
import 'package:qhd_prevention/pages/mine/mine_sign_page.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/lsyd_work/SpecialWorkFormBaseWork.dart';/// 作业人签字
|
||||
class ElectricityZyrDetail extends StatefulWidget {
|
||||
const ElectricityZyrDetail({
|
||||
super.key,
|
||||
required this.ELECTRICITY_ID,
|
||||
required this.flow,
|
||||
});
|
||||
|
||||
final String ELECTRICITY_ID;
|
||||
final String flow;
|
||||
|
||||
@override
|
||||
State<ElectricityZyrDetail> createState() => _ElectricityZyrDetailState();
|
||||
}
|
||||
|
||||
class _ElectricityZyrDetailState extends State<ElectricityZyrDetail> {
|
||||
late bool isEditable = false;
|
||||
|
||||
/// 详情
|
||||
late Map<String, dynamic> pd = {};
|
||||
|
||||
/// 安全防护措施列表
|
||||
late List<Map<String, dynamic>> measuresList = [];
|
||||
late Map<String, dynamic> signs = {};
|
||||
|
||||
List<String> signImages = [];
|
||||
List<String> signTimes = []; // 签字时间列表
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
_getData();
|
||||
}
|
||||
|
||||
/// 签字
|
||||
Future<void> _sign() async {
|
||||
final path = await Navigator.push(
|
||||
context,
|
||||
MaterialPageRoute(builder: (context) => MineSignPage()),
|
||||
);
|
||||
if (path != null) {
|
||||
final now = DateFormat('yyyy-MM-dd HH:mm').format(DateTime.now());
|
||||
|
||||
setState(() {
|
||||
signImages.add(path);
|
||||
signTimes.add(now);
|
||||
FocusHelper.clearFocus(context);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
Widget _signListWidget() {
|
||||
return Column(
|
||||
children:
|
||||
signImages.map((path) {
|
||||
return Column(
|
||||
children: [
|
||||
const SizedBox(height: 10),
|
||||
const Divider(),
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
GestureDetector(
|
||||
child: // 用一个 ConstrainedBox 限制最大尺寸,并改为 BoxFit.contain
|
||||
ConstrainedBox(
|
||||
constraints: const BoxConstraints(
|
||||
maxWidth: 200,
|
||||
maxHeight: 150,
|
||||
),
|
||||
child: Image.file(
|
||||
File(path),
|
||||
// 改为完整显示
|
||||
fit: BoxFit.contain,
|
||||
),
|
||||
),
|
||||
onTap: () {
|
||||
presentOpaque(
|
||||
SingleImageViewer(imageUrl: path),
|
||||
context,
|
||||
);
|
||||
},
|
||||
),
|
||||
Column(
|
||||
children: [
|
||||
Container(
|
||||
padding: const EdgeInsets.only(right: 5),
|
||||
child: CustomButton(
|
||||
text: 'X',
|
||||
height: 30,
|
||||
padding: const EdgeInsets.symmetric(horizontal: 10),
|
||||
backgroundColor: Colors.red,
|
||||
onPressed: () {
|
||||
setState(() {
|
||||
signImages.remove(path);
|
||||
});
|
||||
},
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 80),
|
||||
],
|
||||
),
|
||||
],
|
||||
),
|
||||
],
|
||||
);
|
||||
}).toList(),
|
||||
);
|
||||
}
|
||||
|
||||
/// 作废 -1 通过 1
|
||||
Future<void> _submit(String status) async {
|
||||
if (signImages.isEmpty) {
|
||||
ToastUtil.showNormal(context, '请签字');
|
||||
return;
|
||||
}
|
||||
String reasonText = '';
|
||||
|
||||
if (status == '1') {
|
||||
} else {
|
||||
await showDialog<String>(
|
||||
context: context,
|
||||
builder:
|
||||
(_) => CustomAlertDialog(
|
||||
title: '作废原因',
|
||||
mode: DialogMode.input,
|
||||
hintText: '请输入作废原因',
|
||||
cancelText: '取消',
|
||||
confirmText: '确定',
|
||||
onInputConfirm: (text) {
|
||||
reasonText = text;
|
||||
},
|
||||
),
|
||||
);
|
||||
if (reasonText.isEmpty) {
|
||||
ToastUtil.showNormal(context, '请填写作废原因');
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// 存回 measures
|
||||
final Map<String, dynamic> formData = {};
|
||||
// 提交参数
|
||||
formData['ELECTRICITY_ID'] = widget.ELECTRICITY_ID;
|
||||
formData['SIGNTIME'] = signTimes.join(',');
|
||||
formData['USER_ID'] = SessionService.instance.loginUserId;
|
||||
formData['APPLY_STATUS'] = status;
|
||||
formData['STEP_REASON'] = reasonText;
|
||||
|
||||
await showDialog<String>(
|
||||
context: context,
|
||||
builder:
|
||||
(_) => CustomAlertDialog(
|
||||
title: '提示',
|
||||
content: '请确认' + (status == '1' ? "通过" : "作废") + '本作业票?',
|
||||
cancelText: '取消',
|
||||
confirmText: '确定',
|
||||
onConfirm: () async {
|
||||
LoadingDialogHelper.show();
|
||||
try {
|
||||
final result = await ApiService.saveSafeFunctionSure(
|
||||
'electricity',
|
||||
formData,
|
||||
signImages,
|
||||
);
|
||||
LoadingDialogHelper.hide();
|
||||
if (result['result'] == 'success') {
|
||||
ToastUtil.showSuccess(context, '保存成功');
|
||||
Navigator.pop(context);
|
||||
}
|
||||
} catch (e) {
|
||||
LoadingDialogHelper.hide();
|
||||
ToastUtil.showNormal(context, '操作失败:$e');
|
||||
}
|
||||
},
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
/// 初始化拉取数据
|
||||
Future<void> _getData() async {
|
||||
final data = await ApiService.getHomeworkFindById('electricity', widget.ELECTRICITY_ID);
|
||||
setState(() {
|
||||
pd = data['pd'];
|
||||
|
||||
_getSigns(pd['ELECTRICITY_ID'] ?? '');
|
||||
_getMeasures(pd['ELECTRICITY_ID'] ?? '');
|
||||
});
|
||||
}
|
||||
|
||||
Future<void> _getMeasures(String homework_id) async {
|
||||
final data = await ApiService.listSignFinishMeasures('electricity',
|
||||
homework_id.length > 0 ? homework_id : widget.ELECTRICITY_ID,
|
||||
);
|
||||
setState(() {
|
||||
measuresList = List<Map<String, dynamic>>.from(
|
||||
data['finishMeasuresList'] ?? <Map<String, dynamic>>[],
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
Future<void> _getSigns(String homework_id) async {
|
||||
final data = await ApiService.listSignFinished('electricity',
|
||||
homework_id.length > 0 ? homework_id : widget.ELECTRICITY_ID,
|
||||
);
|
||||
setState(() {
|
||||
signs = data['signs'] ?? {};
|
||||
});
|
||||
}
|
||||
|
||||
/// 底部按钮
|
||||
Widget _bottomButtons() {
|
||||
return Row(
|
||||
spacing: 10,
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Expanded(
|
||||
child: CustomButton(
|
||||
height: 45,
|
||||
textStyle: TextStyle(fontSize: 16, color: Colors.white),
|
||||
text: '作废',
|
||||
backgroundColor: Colors.red,
|
||||
onPressed: () {
|
||||
_submit('-1');
|
||||
},
|
||||
),
|
||||
),
|
||||
Expanded(
|
||||
child: CustomButton(
|
||||
textStyle: TextStyle(fontSize: 16, color: Colors.white),
|
||||
text: '通过',
|
||||
backgroundColor: Colors.green,
|
||||
onPressed: () {
|
||||
_submit('1');
|
||||
},
|
||||
),
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: MyAppbar(title: '作业人签字确认'),
|
||||
body: SafeArea(
|
||||
child: SingleChildScrollView(
|
||||
padding: EdgeInsets.all(12),
|
||||
child: Column(
|
||||
spacing: 12,
|
||||
children: [
|
||||
// _setSafeDetailWidget(),
|
||||
SpecialWorkFormBaseWork(
|
||||
pd: pd,
|
||||
measuresList: measuresList,
|
||||
signs: signs,
|
||||
baseImgPath: ApiService.baseImgPath,
|
||||
isEditable: false,
|
||||
onChooseLevel: () {},
|
||||
onChooseHotworkUser: () {},
|
||||
onAnalyzeTap: () {
|
||||
pushPage(
|
||||
ElectricityGasList(ELECTRICITY_ID: widget.ELECTRICITY_ID),
|
||||
context,
|
||||
);
|
||||
},
|
||||
),
|
||||
ItemListWidget.itemContainer(
|
||||
Column(
|
||||
children: [
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
ListItemFactory.headerTitle('作业人'),
|
||||
CustomButton(
|
||||
text: '新增手写签字',
|
||||
height: 36,
|
||||
backgroundColor: Colors.green,
|
||||
onPressed: () {
|
||||
_sign();
|
||||
},
|
||||
),
|
||||
],
|
||||
),
|
||||
if (signImages.isNotEmpty) _signListWidget(),
|
||||
],
|
||||
),
|
||||
),
|
||||
_bottomButtons(),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
@ -1,19 +1,58 @@
|
|||
import 'dart:convert';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:qhd_prevention/customWidget/ItemWidgetFactory.dart';
|
||||
import 'package:qhd_prevention/customWidget/custom_button.dart';
|
||||
import 'package:qhd_prevention/customWidget/single_image_viewer.dart';
|
||||
|
||||
import '../../../../../../tools/tools.dart';
|
||||
import '../../../item_list_widget.dart';
|
||||
import '../../special_Wrok/MeasuresListWidget.dart';
|
||||
|
||||
/// 通用高处作业明细表单组件(支持编辑/只读)
|
||||
class MBCD_data_model {
|
||||
String BOARD_MATERIAL;
|
||||
String BOARD_SPECIFICATION;
|
||||
String BOARD_NO;
|
||||
|
||||
MBCD_data_model({
|
||||
required this.BOARD_MATERIAL,
|
||||
required this.BOARD_SPECIFICATION,
|
||||
required this.BOARD_NO,
|
||||
});
|
||||
|
||||
factory MBCD_data_model.fromJson(Map<String, dynamic> json) {
|
||||
return MBCD_data_model(
|
||||
BOARD_MATERIAL: json['BOARD_MATERIAL'] as String? ?? '',
|
||||
BOARD_SPECIFICATION: json['BOARD_SPECIFICATION'] as String? ?? '',
|
||||
// 修复:这里应该读取 BOARD_NO,而不是 BOARD_SPECIFICATION
|
||||
BOARD_NO: json['BOARD_NO'] as String? ?? '',
|
||||
);
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
return {
|
||||
'BOARD_MATERIAL': BOARD_MATERIAL,
|
||||
'BOARD_SPECIFICATION': BOARD_SPECIFICATION,
|
||||
'BOARD_NO': BOARD_NO,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
/// 通用盲板作业明细表单组件(支持编辑/只读)
|
||||
class BlindboardDetailFormWidget extends StatefulWidget {
|
||||
final Map<String, dynamic> pd;
|
||||
final List<dynamic> boardList;
|
||||
|
||||
final bool isEditable;
|
||||
final VoidCallback onChooseLevel;
|
||||
|
||||
/// 编辑模式下需提供以下控制器,非编辑模式可不传
|
||||
final TextEditingController? locationController; // 地点
|
||||
final TextEditingController? hightController; // 高度
|
||||
final TextEditingController? contentController; // 内容
|
||||
final TextEditingController? nameController; // 名称
|
||||
/// 管道参数
|
||||
final TextEditingController? mediumController; // 介质
|
||||
final TextEditingController? temperatureController; // 温度
|
||||
final TextEditingController? pressureController; // 压力
|
||||
|
||||
final TextEditingController? relatedController;
|
||||
final TextEditingController? riskController;
|
||||
|
||||
|
|
@ -22,40 +61,51 @@ class BlindboardDetailFormWidget extends StatefulWidget {
|
|||
required this.pd,
|
||||
required this.isEditable,
|
||||
required this.onChooseLevel,
|
||||
this.locationController,
|
||||
this.hightController,
|
||||
this.contentController,
|
||||
required this.boardList,
|
||||
this.nameController,
|
||||
this.mediumController,
|
||||
this.temperatureController,
|
||||
this.pressureController,
|
||||
this.relatedController,
|
||||
this.riskController,
|
||||
}) : assert(
|
||||
!isEditable ||
|
||||
(locationController != null &&
|
||||
hightController != null &&
|
||||
contentController != null &&
|
||||
relatedController != null &&
|
||||
riskController != null),
|
||||
'Editable mode requires all TextEditingController parameters',
|
||||
),
|
||||
super(key: key);
|
||||
!isEditable ||
|
||||
(nameController != null &&
|
||||
mediumController != null &&
|
||||
temperatureController != null &&
|
||||
pressureController != null &&
|
||||
relatedController != null &&
|
||||
riskController != null),
|
||||
'Editable mode requires all TextEditingController parameters',
|
||||
),
|
||||
super(key: key);
|
||||
|
||||
@override
|
||||
State<BlindboardDetailFormWidget> createState() => _BlindboardDetailFormWidgetState();
|
||||
State<BlindboardDetailFormWidget> createState() =>
|
||||
_BlindboardDetailFormWidgetState();
|
||||
}
|
||||
|
||||
class _BlindboardDetailFormWidgetState extends State<BlindboardDetailFormWidget> {
|
||||
class _BlindboardDetailFormWidgetState
|
||||
extends State<BlindboardDetailFormWidget> {
|
||||
/// 盲板抽堵参数
|
||||
late final List<Map<String, dynamic>> boardList;
|
||||
|
||||
String _getWorkLevelText(dynamic level) {
|
||||
switch (level?.toString()) {
|
||||
case '1': return 'I级高处作业';
|
||||
case '2': return 'II级高处作业';
|
||||
case '3': return 'III级高处作业';
|
||||
case '4': return 'IV级高处作业';
|
||||
default: return '';
|
||||
case '1':
|
||||
return '堵盲板';
|
||||
case '2':
|
||||
return '抽盲板';
|
||||
default:
|
||||
return '';
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final boardList = widget.boardList;
|
||||
final pd = widget.pd;
|
||||
|
||||
return Container(
|
||||
padding: const EdgeInsets.symmetric(vertical: 10),
|
||||
decoration: const BoxDecoration(
|
||||
|
|
@ -74,53 +124,183 @@ class _BlindboardDetailFormWidgetState extends State<BlindboardDetailFormWidget>
|
|||
const Divider(),
|
||||
],
|
||||
ItemListWidget.singleLineTitleText(
|
||||
label: '作业地点:',
|
||||
isEditable: widget.isEditable,
|
||||
controller: widget.locationController,
|
||||
text: pd['WORK_PLACE'] ?? '',
|
||||
label: '申请部门:',
|
||||
isEditable: false,
|
||||
text: pd['APPLY_DEPARTMENT_NAME'] ?? '',
|
||||
),
|
||||
const Divider(),
|
||||
ItemListWidget.singleLineTitleText(
|
||||
label: '作业高度(米):',
|
||||
keyboardType: TextInputType.numberWithOptions(
|
||||
decimal: true, // 允许小数点
|
||||
signed: false, // 允许负号(如需)
|
||||
),
|
||||
isEditable: widget.isEditable,
|
||||
controller: widget.hightController,
|
||||
text: pd['WORK_HIGH'] ?? '',
|
||||
label: '申请人:',
|
||||
isEditable: false,
|
||||
text: pd['APPLY_USER_NAME'] ?? '',
|
||||
),
|
||||
const Divider(),
|
||||
ItemListWidget.selectableLineTitleTextRightButton(
|
||||
label: '高处作业级别:',
|
||||
label: '作业方式:',
|
||||
isEditable: widget.isEditable,
|
||||
onTap: widget.onChooseLevel,
|
||||
text: _getWorkLevelText(pd['WORK_LEVEL']),
|
||||
text: _getWorkLevelText(pd['WORK_TYPE']),
|
||||
),
|
||||
const Divider(),
|
||||
ItemListWidget.multiLineTitleTextField(
|
||||
label: '作业内容:',
|
||||
ItemListWidget.singleLineTitleText(
|
||||
label: '设备管道名称:',
|
||||
isEditable: widget.isEditable,
|
||||
controller: widget.contentController,
|
||||
text: pd['WORK_CONTENT'] ?? '',
|
||||
controller: widget.nameController,
|
||||
text: pd['NAME'] ?? '',
|
||||
),
|
||||
const Divider(),
|
||||
ListItemFactory.createBuildSimpleSection('管道参数'),
|
||||
Container(
|
||||
padding: EdgeInsets.symmetric(horizontal: 10),
|
||||
child: Column(
|
||||
children: [
|
||||
ItemListWidget.singleLineTitleText(
|
||||
label: '介质:',
|
||||
isEditable: widget.isEditable,
|
||||
controller: widget.mediumController,
|
||||
text: pd['MEDIUM'] ?? '',
|
||||
),
|
||||
const Divider(),
|
||||
ItemListWidget.singleLineTitleText(
|
||||
label: '温度:',
|
||||
isEditable: widget.isEditable,
|
||||
controller: widget.temperatureController,
|
||||
text: pd['TEMPERATURE'] ?? '',
|
||||
),
|
||||
const Divider(),
|
||||
ItemListWidget.singleLineTitleText(
|
||||
label: '压力:',
|
||||
isEditable: widget.isEditable,
|
||||
controller: widget.pressureController,
|
||||
text: pd['PRESSURE'] ?? '',
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
|
||||
const Divider(),
|
||||
...boardList.map((board) {
|
||||
return Container(
|
||||
padding: EdgeInsets.symmetric(horizontal: 10),
|
||||
child: Column(
|
||||
children: [
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
ListItemFactory.createBuildSimpleSection('盲板抽堵参数', horPadding: 0),
|
||||
if (widget.isEditable)
|
||||
CustomButton(
|
||||
onPressed: () {
|
||||
setState(() {
|
||||
if (boardList.indexOf(board) == 0) {
|
||||
boardList.add({
|
||||
'BOARD_MATERIAL': '',
|
||||
'BOARD_SPECIFICATION': '',
|
||||
'BOARD_NO': '',
|
||||
});
|
||||
} else {
|
||||
boardList.remove(board);
|
||||
}
|
||||
});
|
||||
},
|
||||
text: boardList.indexOf(board) == 0 ? '添加' : '删除',
|
||||
backgroundColor:
|
||||
boardList.indexOf(board) == 0
|
||||
? Colors.blue
|
||||
: Colors.red,
|
||||
padding: EdgeInsets.symmetric(
|
||||
horizontal: 15,
|
||||
vertical: 2,
|
||||
),
|
||||
height: 30,
|
||||
borderRadius: 15,
|
||||
),
|
||||
],
|
||||
),
|
||||
ItemListWidget.singleLineTitleText(
|
||||
label: '材质:',
|
||||
isEditable: widget.isEditable,
|
||||
text: board['BOARD_MATERIAL'],
|
||||
hintText: '请输入材质',
|
||||
onChanged: (val) {
|
||||
setState(() {
|
||||
board['BOARD_MATERIAL'] = val;
|
||||
});
|
||||
},
|
||||
isRequired: false,
|
||||
),
|
||||
const Divider(),
|
||||
|
||||
ItemListWidget.singleLineTitleText(
|
||||
label: '规格:',
|
||||
isEditable: widget.isEditable,
|
||||
text: board['BOARD_SPECIFICATION'],
|
||||
onChanged: (val) {
|
||||
setState(() {
|
||||
board['BOARD_SPECIFICATION'] = val;
|
||||
});
|
||||
},
|
||||
hintText: '请输入规格',
|
||||
isRequired: false,
|
||||
),
|
||||
const Divider(),
|
||||
|
||||
ItemListWidget.singleLineTitleText(
|
||||
label: '编号:',
|
||||
isEditable: widget.isEditable,
|
||||
text: board['BOARD_NO'],
|
||||
onChanged: (val) {
|
||||
setState(() {
|
||||
board['BOARD_NO'] = val;
|
||||
});
|
||||
},
|
||||
hintText: '请输入编号',
|
||||
isRequired: false,
|
||||
),
|
||||
if (boardList.indexOf(board) != boardList.length-1)
|
||||
const Divider(),
|
||||
|
||||
],
|
||||
),
|
||||
);
|
||||
}),
|
||||
const Divider(),
|
||||
if (!widget.isEditable && FormUtils.hasValue(pd, 'BOARD_PATH')) ...[
|
||||
ItemListWidget.singleLineTitleText(
|
||||
label: '盲板抽堵位置及安全措施:',
|
||||
isEditable: false,
|
||||
text:'',
|
||||
),
|
||||
const Divider(),
|
||||
|
||||
],
|
||||
if (!widget.isEditable && FormUtils.hasValue(pd, 'BOARD_PATH')) ...[
|
||||
ItemListWidget.twoRowTitleAndImages(
|
||||
onTapCallBack: (val) {
|
||||
presentOpaque(SingleImageViewer(imageUrl: val), context);
|
||||
},
|
||||
title: '断路地段示意图:',
|
||||
imageUrls: pd['BOARD_PATH'],
|
||||
),
|
||||
const Divider(),
|
||||
],
|
||||
ItemListWidget.twoRowButtonTitleText(
|
||||
label: '关联其他特殊作业及安全作业票编号:',
|
||||
isEditable: widget.isEditable,
|
||||
onTap: () async {
|
||||
final val = await showDialog<String>(
|
||||
context: context,
|
||||
builder: (_) => SelectionPopup(
|
||||
type: 'assignments',
|
||||
initialValue: pd['SPECIAL_WORK'] ?? '',
|
||||
onConfirm: (v) {
|
||||
setState(() {
|
||||
pd['SPECIAL_WORK'] = v;
|
||||
widget.relatedController?.text = v;
|
||||
});
|
||||
},
|
||||
),
|
||||
builder:
|
||||
(_) => SelectionPopup(
|
||||
type: 'assignments',
|
||||
initialValue: pd['SPECIAL_WORK'] ?? '',
|
||||
onConfirm: (v) {
|
||||
setState(() {
|
||||
pd['SPECIAL_WORK'] = v;
|
||||
widget.relatedController?.text = v;
|
||||
});
|
||||
},
|
||||
),
|
||||
);
|
||||
FocusHelper.clearFocus(context);
|
||||
},
|
||||
|
|
@ -135,16 +315,17 @@ class _BlindboardDetailFormWidgetState extends State<BlindboardDetailFormWidget>
|
|||
onTap: () async {
|
||||
await showDialog<String>(
|
||||
context: context,
|
||||
builder: (_) => SelectionPopup(
|
||||
type: 'identification',
|
||||
initialValue: pd['RISK_IDENTIFICATION'] ?? '',
|
||||
onConfirm: (v) {
|
||||
setState(() {
|
||||
pd['RISK_IDENTIFICATION'] = v;
|
||||
widget.riskController?.text = v;
|
||||
});
|
||||
},
|
||||
),
|
||||
builder:
|
||||
(_) => SelectionPopup(
|
||||
type: 'identification',
|
||||
initialValue: pd['RISK_IDENTIFICATION'] ?? '',
|
||||
onConfirm: (v) {
|
||||
setState(() {
|
||||
pd['RISK_IDENTIFICATION'] = v;
|
||||
widget.riskController?.text = v;
|
||||
});
|
||||
},
|
||||
),
|
||||
);
|
||||
FocusHelper.clearFocus(context);
|
||||
},
|
||||
|
|
|
|||
|
|
@ -10,6 +10,7 @@ import '../../special_Wrok/MeasuresListWidget.dart';
|
|||
class BlindboardFormBaseWork extends StatelessWidget {
|
||||
/// 基础数据
|
||||
final Map<String, dynamic> pd;
|
||||
final List<dynamic> boardList;
|
||||
|
||||
/// 安全防护措施列表
|
||||
final List<Map<String, dynamic>> measuresList;
|
||||
|
|
@ -35,6 +36,8 @@ class BlindboardFormBaseWork extends StatelessWidget {
|
|||
required this.measuresList,
|
||||
required this.signs,
|
||||
required this.baseImgPath,
|
||||
required this.boardList,
|
||||
|
||||
this.isEditable = false,
|
||||
required this.onChooseLevel,
|
||||
required this.onAnalyzeTap,
|
||||
|
|
@ -224,6 +227,7 @@ class BlindboardFormBaseWork extends StatelessWidget {
|
|||
children: [
|
||||
// 1. 作业详情表单
|
||||
BlindboardDetailFormWidget(
|
||||
boardList: boardList,
|
||||
pd: pd,
|
||||
isEditable: isEditable,
|
||||
onChooseLevel: onChooseLevel,
|
||||
|
|
|
|||
|
|
@ -38,6 +38,8 @@ class _BlindboardSafeFuncSureState extends State<BlindboardSafeFuncSure> {
|
|||
|
||||
/// 详情
|
||||
late Map<String, dynamic> pd = {};
|
||||
late List<dynamic> boardList = [];
|
||||
|
||||
late List<Map<String, dynamic>> measuresList = [];
|
||||
/// 其他安全措施
|
||||
final TextEditingController _otherController = TextEditingController();
|
||||
|
|
@ -289,6 +291,7 @@ class _BlindboardSafeFuncSureState extends State<BlindboardSafeFuncSure> {
|
|||
final data = await ApiService.getHomeworkFindById('blindboard', widget.BLINDBOARD_ID);
|
||||
setState(() {
|
||||
pd = data['pd'];
|
||||
boardList = data['boardList'];
|
||||
_getMeasures();
|
||||
});
|
||||
}
|
||||
|
|
@ -450,6 +453,7 @@ class _BlindboardSafeFuncSureState extends State<BlindboardSafeFuncSure> {
|
|||
child: Column(
|
||||
children: [
|
||||
BlindboardDetailFormWidget(
|
||||
boardList: boardList,
|
||||
pd: pd,
|
||||
isEditable: false,
|
||||
onChooseLevel: () {},
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@ import 'package:qhd_prevention/customWidget/ItemWidgetFactory.dart';
|
|||
import 'package:qhd_prevention/customWidget/custom_button.dart';
|
||||
import 'package:qhd_prevention/customWidget/toast_util.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/item_list_widget.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_Wrok/gc_work/SpecialWorkFormBaseWork.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_Wrok/mbcd_work/BlindboardFormBaseWork.dart';
|
||||
import 'package:qhd_prevention/tools/tools.dart';
|
||||
import 'package:qhd_prevention/customWidget/custom_alert_dialog.dart';
|
||||
import 'package:qhd_prevention/customWidget/photo_picker_row.dart';
|
||||
|
|
@ -42,6 +42,7 @@ class _BlindboardAqjdDetailState extends State<BlindboardAqjdDetail> {
|
|||
|
||||
/// 详情
|
||||
late Map<String, dynamic> pd = {};
|
||||
late List<dynamic> boardList = [];
|
||||
late List<ImageData> imgList = [];
|
||||
|
||||
/// 安全防护措施列表
|
||||
|
|
@ -233,6 +234,7 @@ class _BlindboardAqjdDetailState extends State<BlindboardAqjdDetail> {
|
|||
final data = await ApiService.getHomeworkFindById('blindboard', widget.BLINDBOARD_ID);
|
||||
setState(() {
|
||||
pd = data['pd'];
|
||||
boardList = data['boardList'];
|
||||
|
||||
_getSigns(pd['BLINDBOARD_ID'] ?? '');
|
||||
_getMeasures(pd['BLINDBOARD_ID'] ?? '');
|
||||
|
|
@ -301,7 +303,8 @@ class _BlindboardAqjdDetailState extends State<BlindboardAqjdDetail> {
|
|||
spacing: 12,
|
||||
children: [
|
||||
// _setSafeDetailWidget(),
|
||||
HighWorkFormBaseWork(
|
||||
BlindboardFormBaseWork(
|
||||
boardList: boardList,
|
||||
pd: pd,
|
||||
measuresList: measuresList,
|
||||
signs: signs,
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:qhd_prevention/customWidget/toast_util.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/mbcd_work/cjry_work_detail/blindboard_cjry_detail.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/mbcd_work/jsjd_work_detail/blindboard_jsjd_detail.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/mbcd_work/mbcd_work_detai/blindboard_apply_detail.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/mbcd_work/aqcs_work_detail/blindboard_safe_func_sure.dart';
|
||||
|
|
@ -167,14 +168,14 @@ class _BlindboardListPageState extends State<BlindboardListPage> {
|
|||
}
|
||||
|
||||
void _goToDetail(Map<String, dynamic> item) async {
|
||||
final Map<String, dynamic> data = {
|
||||
'BLINDBOARD_ID': item['BLINDBOARD_ID'],
|
||||
'flow': widget.flow,
|
||||
};
|
||||
|
||||
switch (widget.flow) {
|
||||
case '提交申请':
|
||||
await pushPage(BlindboardApplyDetail(BLINDBOARD_ID: item['BLINDBOARD_ID'], flow: widget.flow), context);
|
||||
break;
|
||||
case '车间人员签字':
|
||||
await pushPage(BlindboardCjryDetail(BLINDBOARD_ID: item['BLINDBOARD_ID'], flow: widget.flow), context);
|
||||
break;
|
||||
case '设置安全措施确认人':
|
||||
await pushPage(BlindboardSetSafeDetail(BLINDBOARD_ID: item['BLINDBOARD_ID'], flow: widget.flow), context);
|
||||
break;
|
||||
|
|
@ -207,11 +208,6 @@ class _BlindboardListPageState extends State<BlindboardListPage> {
|
|||
break;
|
||||
case '开始作业':
|
||||
await pushPage(BlindboardKszyDetail(BLINDBOARD_ID: item['BLINDBOARD_ID'], flow: widget.flow), context);
|
||||
|
||||
break;
|
||||
case '结束作业':
|
||||
await pushPage(BlindboardJszyDetail(BLINDBOARD_ID: item['BLINDBOARD_ID'], flow: widget.flow), context);
|
||||
|
||||
break;
|
||||
case '验收签字':
|
||||
await pushPage(BlindboardYsgdDetail(BLINDBOARD_ID: item['BLINDBOARD_ID'], flow: widget.flow), context);
|
||||
|
|
@ -301,13 +297,13 @@ class _BlindboardListPageState extends State<BlindboardListPage> {
|
|||
String _getWorkLevelText(dynamic level) {
|
||||
switch (level?.toString()) {
|
||||
case '1':
|
||||
return 'I级高处作业';
|
||||
return 'I级盲板作业';
|
||||
case '2':
|
||||
return 'II级高处作业';
|
||||
return 'II级盲板作业';
|
||||
case '3':
|
||||
return 'III级高处作业';
|
||||
return 'III级盲板作业';
|
||||
default:
|
||||
return 'IV级高处作业';
|
||||
return 'IV级盲板作业';
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -330,10 +326,6 @@ class _BlindboardListPageState extends State<BlindboardListPage> {
|
|||
"编号: ${item['CHECK_NO'] ?? ''}",
|
||||
style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold),
|
||||
),
|
||||
Text(
|
||||
"作业级别: ${_getWorkLevelText(item['WORK_LEVEL'])}",
|
||||
style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold),
|
||||
),
|
||||
],
|
||||
),
|
||||
Row(
|
||||
|
|
@ -357,17 +349,8 @@ class _BlindboardListPageState extends State<BlindboardListPage> {
|
|||
Text("所在单位负责人: ${item['LEADER_USER_NAME'] ?? ''}"),
|
||||
],
|
||||
),
|
||||
Text("验收部门负责人: ${item['ACCEPT_USER_NAME'] ?? ''}"),
|
||||
|
||||
if (item['AUDIT_USER_NAME'] != null)
|
||||
Text("安全管理部门负责人: ${item['AUDIT_USER_NAME'] ?? ''}"),
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
if (item['APPROVE_USER_NAME'] != null)
|
||||
Text("审批部门负责人: ${item['APPROVE_USER_NAME'] ?? ''}"),
|
||||
Text("验收部门负责人: ${item['ACCEPT_USER_NAME'] ?? ''}"),
|
||||
],
|
||||
),
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
|
|
|
|||
|
|
@ -0,0 +1,371 @@
|
|||
import 'dart:io';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:intl/intl.dart';
|
||||
import 'package:qhd_prevention/customWidget/ItemWidgetFactory.dart';
|
||||
import 'package:qhd_prevention/customWidget/custom_button.dart';
|
||||
import 'package:qhd_prevention/customWidget/photo_picker_row.dart';
|
||||
import 'package:qhd_prevention/customWidget/toast_util.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/item_list_widget.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/dl_work/CutroadFormBaseWork.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/mbcd_work/BlindboardDetailFormWidget.dart';
|
||||
import 'package:qhd_prevention/tools/tools.dart';
|
||||
import 'package:qhd_prevention/http/ApiService.dart';
|
||||
import 'package:qhd_prevention/pages/my_appbar.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/dh_work/qtfx_work_detail/hotwork_gas_list.dart';
|
||||
import 'package:qhd_prevention/customWidget/custom_alert_dialog.dart';
|
||||
import 'package:qhd_prevention/customWidget/single_image_viewer.dart';
|
||||
import 'package:qhd_prevention/pages/mine/mine_sign_page.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/dl_work/CutroadFormBaseWork.dart';
|
||||
/// 本地路径 + 线上路径模型
|
||||
class ImageData {
|
||||
String localPath;
|
||||
String serverPath;
|
||||
|
||||
ImageData({required this.localPath, required this.serverPath});
|
||||
}
|
||||
///车间人员签字
|
||||
class BlindboardCjryDetail extends StatefulWidget {
|
||||
const BlindboardCjryDetail({
|
||||
super.key,
|
||||
required this.BLINDBOARD_ID,
|
||||
required this.flow,
|
||||
});
|
||||
|
||||
final String BLINDBOARD_ID;
|
||||
final String flow;
|
||||
|
||||
@override
|
||||
State<BlindboardCjryDetail> createState() => _BlindboardCjryDetailState();
|
||||
}
|
||||
|
||||
class _BlindboardCjryDetailState extends State<BlindboardCjryDetail> {
|
||||
late bool isEditable = false;
|
||||
|
||||
/// 详情
|
||||
late Map<String, dynamic> pd = {};
|
||||
late List<dynamic> boardList = [];
|
||||
|
||||
// final TextEditingController _contentController = TextEditingController();
|
||||
|
||||
late List<ImageData> imgList = [];
|
||||
/// 安全防护措施列表
|
||||
late List<Map<String, dynamic>> measuresList = [];
|
||||
late Map<String, dynamic> signs = {};
|
||||
|
||||
List<String> signImages = [];
|
||||
List<String> signTimes = []; // 签字时间列表
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
_getData();
|
||||
}
|
||||
|
||||
/// 签字
|
||||
Future<void> _sign() async {
|
||||
final path = await Navigator.push(
|
||||
context,
|
||||
MaterialPageRoute(builder: (context) => MineSignPage()),
|
||||
);
|
||||
if (path != null) {
|
||||
final now = DateFormat('yyyy-MM-dd HH:mm').format(DateTime.now());
|
||||
|
||||
setState(() {
|
||||
signImages.add(path);
|
||||
signTimes.add(now);
|
||||
FocusHelper.clearFocus(context);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
Widget _signListWidget() {
|
||||
return Column(
|
||||
children:
|
||||
signImages.map((path) {
|
||||
return Column(
|
||||
children: [
|
||||
const SizedBox(height: 10),
|
||||
const Divider(),
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
GestureDetector(
|
||||
child: // 用一个 ConstrainedBox 限制最大尺寸,并改为 BoxFit.contain
|
||||
ConstrainedBox(
|
||||
constraints: const BoxConstraints(
|
||||
maxWidth: 200,
|
||||
maxHeight: 150,
|
||||
),
|
||||
child: Image.file(
|
||||
File(path),
|
||||
// 改为完整显示
|
||||
fit: BoxFit.contain,
|
||||
),
|
||||
),
|
||||
onTap: () {
|
||||
presentOpaque(
|
||||
SingleImageViewer(imageUrl: path),
|
||||
context,
|
||||
);
|
||||
},
|
||||
),
|
||||
Column(
|
||||
children: [
|
||||
Container(
|
||||
padding: const EdgeInsets.only(right: 5),
|
||||
child: CustomButton(
|
||||
text: 'X',
|
||||
height: 30,
|
||||
padding: const EdgeInsets.symmetric(horizontal: 10),
|
||||
backgroundColor: Colors.red,
|
||||
onPressed: () {
|
||||
setState(() {
|
||||
signImages.remove(path);
|
||||
});
|
||||
},
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 80),
|
||||
],
|
||||
),
|
||||
],
|
||||
),
|
||||
],
|
||||
);
|
||||
}).toList(),
|
||||
);
|
||||
}
|
||||
|
||||
/// 作废 -1 通过 1
|
||||
Future<void> _submit(String status) async {
|
||||
if (signImages.isEmpty) {
|
||||
ToastUtil.showNormal(context, '请签字');
|
||||
return;
|
||||
}
|
||||
String reasonText = '';
|
||||
|
||||
if (status == '1') {
|
||||
// if (_contentController.text.trim().isEmpty) {
|
||||
// ToastUtil.showNormal(context, '盲板抽堵位置及安全措施');
|
||||
// return;
|
||||
// }
|
||||
if (imgList.isEmpty) {
|
||||
ToastUtil.showNormal(context, '请上传盲板抽堵位置图');
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
await showDialog<String>(
|
||||
context: context,
|
||||
builder:
|
||||
(_) => CustomAlertDialog(
|
||||
title: '作废原因',
|
||||
mode: DialogMode.input,
|
||||
hintText: '请输入作废原因',
|
||||
cancelText: '取消',
|
||||
confirmText: '确定',
|
||||
onInputConfirm: (text) {
|
||||
reasonText = text;
|
||||
},
|
||||
),
|
||||
);
|
||||
if (reasonText.isEmpty) {
|
||||
ToastUtil.showNormal(context, '请填写作废原因');
|
||||
return;
|
||||
}
|
||||
}
|
||||
final serverPathString = imgList
|
||||
.map((e) => e.serverPath)
|
||||
.where((s) => s.isNotEmpty)
|
||||
.map((s) => s) // 将 String? 转回 String
|
||||
.join(',');
|
||||
// 存回 measures
|
||||
final Map<String, dynamic> formData = {};
|
||||
// 提交参数
|
||||
// formData['WORK_CONTENT'] = _contentController.text.trim();
|
||||
formData['CONIMG_PATH'] = serverPathString;
|
||||
|
||||
formData['DESCR'] = FormUtils.hasValue(pd, 'DESCR') ?pd['DESCR']: '无';
|
||||
formData['BLINDBOARD_ID'] = pd['BLINDBOARD_ID'] ?? widget.BLINDBOARD_ID;
|
||||
formData['SIGNTIME'] = signTimes.join(',');
|
||||
formData['USER_ID'] = SessionService.instance.loginUserId;
|
||||
formData['APPLY_STATUS'] = status;
|
||||
formData['STEP_REASON'] = reasonText;
|
||||
|
||||
await showDialog<String>(
|
||||
context: context,
|
||||
builder:
|
||||
(_) => CustomAlertDialog(
|
||||
title: '提示',
|
||||
content: '请确认' + (status == '1' ? "通过" : "作废") + '本作业票?',
|
||||
cancelText: '取消',
|
||||
confirmText: '确定',
|
||||
onConfirm: () async {
|
||||
LoadingDialogHelper.show();
|
||||
try {
|
||||
final result = await ApiService.saveSafeFunctionSure(
|
||||
'blindboard',
|
||||
formData,
|
||||
signImages,
|
||||
);
|
||||
LoadingDialogHelper.hide();
|
||||
if (result['result'] == 'success') {
|
||||
ToastUtil.showSuccess(context, '保存成功');
|
||||
Navigator.pop(context);
|
||||
}
|
||||
} catch (e) {
|
||||
LoadingDialogHelper.hide();
|
||||
ToastUtil.showNormal(context, '操作失败:$e');
|
||||
}
|
||||
},
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
/// 初始化拉取数据
|
||||
Future<void> _getData() async {
|
||||
LoadingDialogHelper.show();
|
||||
final data = await ApiService.getHomeworkFindById('blindboard', widget.BLINDBOARD_ID);
|
||||
setState(() {
|
||||
pd = data['pd'];
|
||||
boardList = data['boardList'];
|
||||
|
||||
_getSigns(pd['BLINDBOARD_ID'] ?? '');
|
||||
_getMeasures(pd['BLINDBOARD_ID'] ?? '');
|
||||
});
|
||||
LoadingDialogHelper.hide();
|
||||
|
||||
}
|
||||
Future<void> _getMeasures(String homework_id) async {
|
||||
final data = await ApiService.listSignFinishMeasures('blindboard',
|
||||
homework_id.length > 0 ? homework_id : widget.BLINDBOARD_ID,
|
||||
);
|
||||
setState(() {
|
||||
measuresList = List<Map<String, dynamic>>.from(
|
||||
data['finishMeasuresList'] ?? <Map<String, dynamic>>[],
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
Future<void> _getSigns(String homework_id) async {
|
||||
final data = await ApiService.listSignFinished('blindboard',
|
||||
homework_id.length > 0 ? homework_id : widget.BLINDBOARD_ID,
|
||||
);
|
||||
setState(() {
|
||||
signs = data['signs'] ?? {};
|
||||
});
|
||||
}
|
||||
/// 拍照或选图后的回调
|
||||
Future<void> _onImageAdded(String localPath) async {
|
||||
// 上传到服务器
|
||||
final res = await ApiService.uploadSaveFile(localPath);
|
||||
final url = res['FILE_PATH'] as String;
|
||||
setState(() {
|
||||
imgList.add(ImageData(localPath: localPath, serverPath: url));
|
||||
});
|
||||
}
|
||||
|
||||
/// 删除图片处理:调用删除接口并更新列表
|
||||
Future<void> _onImageRemoved(ImageData item) async {
|
||||
if (item.serverPath != null) {
|
||||
await ApiService.deleteSaveFile(item.serverPath!);
|
||||
}
|
||||
setState(() {
|
||||
imgList.remove(item);
|
||||
});
|
||||
}
|
||||
/// 底部按钮
|
||||
Widget _bottomButtons() {
|
||||
return Row(
|
||||
spacing: 10,
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Expanded(
|
||||
child: CustomButton(
|
||||
height: 45,
|
||||
textStyle: TextStyle(fontSize: 16, color: Colors.white),
|
||||
text: '作废',
|
||||
backgroundColor: Colors.red,
|
||||
onPressed: () {
|
||||
_submit('-1');
|
||||
},
|
||||
),
|
||||
),
|
||||
Expanded(
|
||||
child: CustomButton(
|
||||
textStyle: TextStyle(fontSize: 16, color: Colors.white),
|
||||
text: '通过',
|
||||
backgroundColor: Colors.green,
|
||||
onPressed: () {
|
||||
_submit('1');
|
||||
},
|
||||
),
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: MyAppbar(title: '车间人员签字'),
|
||||
body: SafeArea(
|
||||
child: SingleChildScrollView(
|
||||
padding: EdgeInsets.all(12),
|
||||
child: Column(
|
||||
spacing: 12,
|
||||
children: [
|
||||
BlindboardDetailFormWidget(
|
||||
pd: pd,
|
||||
boardList: boardList,
|
||||
isEditable: false,
|
||||
onChooseLevel: (){},
|
||||
),
|
||||
ItemListWidget.itemContainer(
|
||||
Column(
|
||||
children: [
|
||||
ListItemFactory.headerTitle('盲板抽堵位置及安全措施'),
|
||||
Divider(),
|
||||
RepairedPhotoSection(
|
||||
title: '断路地段示意图:',
|
||||
maxCount: 100,
|
||||
mediaType: MediaType.image,
|
||||
onChanged: (paths) {},
|
||||
isShowNum: false,
|
||||
horizontalPadding: 0,
|
||||
isRequired: true,
|
||||
onMediaAdded: _onImageAdded,
|
||||
onMediaRemoved: (path) {
|
||||
final item = imgList.firstWhere((e) => e.localPath == path);
|
||||
_onImageRemoved(item);
|
||||
},
|
||||
onAiIdentify: () {},
|
||||
),
|
||||
Column(
|
||||
children: [
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
ListItemFactory.headerTitle('车间人员'),
|
||||
CustomButton(
|
||||
text: '新增手写签字',
|
||||
height: 36,
|
||||
backgroundColor: Colors.green,
|
||||
onPressed: () {
|
||||
_sign();
|
||||
},
|
||||
),
|
||||
],
|
||||
),
|
||||
if (signImages.isNotEmpty) _signListWidget(),
|
||||
],
|
||||
)
|
||||
],
|
||||
),
|
||||
),
|
||||
_bottomButtons(),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
@ -34,6 +34,7 @@ class _BlindboardJhrDetailState extends State<BlindboardJhrDetail> {
|
|||
late bool isEditable = false;
|
||||
/// 详情
|
||||
late Map<String, dynamic> pd = {};
|
||||
late List<dynamic> boardList = [];
|
||||
/// 安全防护措施列表
|
||||
late List<Map<String, dynamic>> measuresList = [];
|
||||
late Map<String, dynamic> signs = {};
|
||||
|
|
@ -198,7 +199,7 @@ class _BlindboardJhrDetailState extends State<BlindboardJhrDetail> {
|
|||
final data = await ApiService.getHomeworkFindById('blindboard', widget.BLINDBOARD_ID);
|
||||
setState(() {
|
||||
pd = data['pd'];
|
||||
|
||||
boardList = data['boardList'];
|
||||
_getSigns(pd['BLINDBOARD_ID'] ?? '');
|
||||
_getMeasures(pd['BLINDBOARD_ID'] ?? '');
|
||||
});
|
||||
|
|
@ -331,6 +332,7 @@ class _BlindboardJhrDetailState extends State<BlindboardJhrDetail> {
|
|||
// _card(_defaultDetail()),
|
||||
BlindboardDetailFormWidget(
|
||||
pd: pd,
|
||||
boardList: boardList,
|
||||
isEditable: false,
|
||||
onChooseLevel: (){},
|
||||
),
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@ import 'package:qhd_prevention/pages/my_appbar.dart';
|
|||
import 'package:qhd_prevention/customWidget/custom_alert_dialog.dart';
|
||||
import 'package:qhd_prevention/customWidget/single_image_viewer.dart';
|
||||
import 'package:qhd_prevention/pages/mine/mine_sign_page.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/gc_work/SpecialWorkFormBaseWork.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_Wrok/mbcd_work/BlindboardFormBaseWork.dart';
|
||||
|
||||
/// 接受交底人签字
|
||||
|
||||
|
|
@ -35,6 +35,7 @@ class _BlindboardJsjdDetailState extends State<BlindboardJsjdDetail> {
|
|||
|
||||
/// 详情
|
||||
late Map<String, dynamic> pd = {};
|
||||
late List<dynamic> boardList = [];
|
||||
|
||||
/// 安全防护措施列表
|
||||
late List<Map<String, dynamic>> measuresList = [];
|
||||
|
|
@ -200,6 +201,7 @@ class _BlindboardJsjdDetailState extends State<BlindboardJsjdDetail> {
|
|||
);
|
||||
setState(() {
|
||||
pd = data['pd'];
|
||||
boardList = data['boardList'];
|
||||
|
||||
_getSigns(pd['BLINDBOARD_ID'] ?? '');
|
||||
_getMeasures(pd['BLINDBOARD_ID'] ?? '');
|
||||
|
|
@ -270,7 +272,8 @@ class _BlindboardJsjdDetailState extends State<BlindboardJsjdDetail> {
|
|||
spacing: 12,
|
||||
children: [
|
||||
// _setSafeDetailWidget(),
|
||||
HighWorkFormBaseWork(
|
||||
BlindboardFormBaseWork(
|
||||
boardList: boardList,
|
||||
pd: pd,
|
||||
measuresList: measuresList,
|
||||
signs: signs,
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@ import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/dh_work/qtfx_
|
|||
import 'package:qhd_prevention/customWidget/custom_alert_dialog.dart';
|
||||
import 'package:qhd_prevention/customWidget/single_image_viewer.dart';
|
||||
import 'package:qhd_prevention/pages/mine/mine_sign_page.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_Wrok/gc_work/SpecialWorkFormBaseWork.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_Wrok/mbcd_work/BlindboardFormBaseWork.dart';
|
||||
import 'package:qhd_prevention/customWidget/picker/CupertinoDatePicker.dart';
|
||||
|
||||
/// 作业结束时间选择
|
||||
|
|
@ -35,6 +35,7 @@ class _BlindboardJszyDetailState extends State<BlindboardJszyDetail> {
|
|||
|
||||
/// 详情
|
||||
late Map<String, dynamic> pd = {};
|
||||
late List<dynamic> boardList = [];
|
||||
/// 选择的时间
|
||||
String endTime = '';
|
||||
|
||||
|
|
@ -239,6 +240,7 @@ class _BlindboardJszyDetailState extends State<BlindboardJszyDetail> {
|
|||
final data = await ApiService.getHomeworkFindById('blindboard', widget.BLINDBOARD_ID);
|
||||
setState(() {
|
||||
pd = data['pd'];
|
||||
boardList = data['boardList'];
|
||||
|
||||
_getSigns(pd['BLINDBOARD_ID'] ?? '');
|
||||
_getMeasures(pd['BLINDBOARD_ID'] ?? '');
|
||||
|
|
@ -307,7 +309,8 @@ class _BlindboardJszyDetailState extends State<BlindboardJszyDetail> {
|
|||
spacing: 12,
|
||||
children: [
|
||||
// _setSafeDetailWidget(),
|
||||
HighWorkFormBaseWork(
|
||||
BlindboardFormBaseWork(
|
||||
boardList: boardList,
|
||||
pd: pd,
|
||||
measuresList: measuresList,
|
||||
signs: signs,
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@ import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/dh_work/qtfx_
|
|||
import 'package:qhd_prevention/customWidget/custom_alert_dialog.dart';
|
||||
import 'package:qhd_prevention/customWidget/single_image_viewer.dart';
|
||||
import 'package:qhd_prevention/pages/mine/mine_sign_page.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_Wrok/gc_work/SpecialWorkFormBaseWork.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_Wrok/mbcd_work/BlindboardFormBaseWork.dart';
|
||||
|
||||
import 'package:qhd_prevention/customWidget/picker/CupertinoDatePicker.dart';
|
||||
|
||||
|
|
@ -36,6 +36,7 @@ class _BlindboardKszyDetailState extends State<BlindboardKszyDetail> {
|
|||
|
||||
/// 详情
|
||||
late Map<String, dynamic> pd = {};
|
||||
late List<dynamic> boardList = [];
|
||||
|
||||
/// 选择的时间
|
||||
String startTime = '';
|
||||
|
|
@ -209,6 +210,7 @@ class _BlindboardKszyDetailState extends State<BlindboardKszyDetail> {
|
|||
);
|
||||
setState(() {
|
||||
pd = data['pd'];
|
||||
boardList = data['boardList'];
|
||||
|
||||
_getSigns(pd['BLINDBOARD_ID'] ?? '');
|
||||
_getMeasures(pd['BLINDBOARD_ID'] ?? '');
|
||||
|
|
@ -279,7 +281,8 @@ class _BlindboardKszyDetailState extends State<BlindboardKszyDetail> {
|
|||
spacing: 12,
|
||||
children: [
|
||||
// _setSafeDetailWidget(),
|
||||
HighWorkFormBaseWork(
|
||||
BlindboardFormBaseWork(
|
||||
boardList: boardList,
|
||||
pd: pd,
|
||||
measuresList: measuresList,
|
||||
signs: signs,
|
||||
|
|
@ -294,7 +297,6 @@ class _BlindboardKszyDetailState extends State<BlindboardKszyDetail> {
|
|||
GestureDetector(
|
||||
child: Row(
|
||||
children: [
|
||||
Text('* ', style: TextStyle(color: Colors.red)),
|
||||
Expanded(
|
||||
child: ListItemFactory.createRowSpaceBetweenItem(
|
||||
leftText: '作业开始时间',
|
||||
|
|
|
|||
|
|
@ -15,18 +15,15 @@ import 'package:qhd_prevention/pages/my_appbar.dart';
|
|||
import 'package:qhd_prevention/customWidget/bottom_picker.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_Wrok/MeasuresListWidget.dart';
|
||||
|
||||
|
||||
enum EditUserType {
|
||||
WORKSHOP('车间人员单位', '车间人员', true),
|
||||
GUARDIAN('监护人单位', '监护人', true),
|
||||
CONFESS('安全交底人单位', '安全交底人', true),
|
||||
ACCEPT_CONFESS('接受交底人单位', '接受交底人', true),
|
||||
WORK_USER('作业人单位', '作业人', true),
|
||||
CONFIRM('作业负责人单位', '作业负责人', true),
|
||||
LEADER('所在单位', '所在单位负责人', true),
|
||||
AUDIT('审核部门', '审核部门负责人', true),
|
||||
APPROVE('审批部门', '审批部门负责人', true),
|
||||
WORK_START('作业开始负责人单位', '作业开始负责人', true),
|
||||
WORK_END('作业结束负责人单位', '作业结束负责人', true),
|
||||
WORK_START('实际作业开始负责人单位', '实际作业开始负责人', true),
|
||||
ACCEPT('验收部门', '验收部门负责人', true);
|
||||
|
||||
/// 对应的单位显示名
|
||||
|
|
@ -53,19 +50,27 @@ class BlindboardApplyDetail extends StatefulWidget {
|
|||
|
||||
class _BlindboardApplyDetailState extends State<BlindboardApplyDetail> {
|
||||
late bool isEditable = false;
|
||||
final levelList = ["I级高处作业", "II级高处作业", "III级高处作业","IV级高处作业"];
|
||||
final levelList = ["堵盲板", "抽盲板"];
|
||||
|
||||
/// 编辑还是新增
|
||||
late String msg = 'add';
|
||||
|
||||
/// 详情
|
||||
late Map<String, dynamic> pd = {};
|
||||
late List<dynamic> boardList = [
|
||||
{'BOARD_MATERIAL': '', 'BOARD_SPECIFICATION': '', 'BOARD_NO': ''},
|
||||
];
|
||||
|
||||
late Map<String, dynamic> signs = {};
|
||||
late List<Map<String, dynamic>> measuresList = [];
|
||||
|
||||
final TextEditingController _locationController = TextEditingController();
|
||||
final TextEditingController _hightController = TextEditingController();
|
||||
final TextEditingController _contentController = TextEditingController();
|
||||
final TextEditingController _nameController = TextEditingController(); // 名称
|
||||
/// 管道参数
|
||||
final TextEditingController _mediumController = TextEditingController(); // 介质
|
||||
final TextEditingController _temperatureController =
|
||||
TextEditingController(); // 温度
|
||||
final TextEditingController _pressureController =
|
||||
TextEditingController(); // 压力
|
||||
final TextEditingController _relatedController = TextEditingController();
|
||||
final TextEditingController _riskController = TextEditingController();
|
||||
|
||||
|
|
@ -91,16 +96,19 @@ class _BlindboardApplyDetailState extends State<BlindboardApplyDetail> {
|
|||
}
|
||||
_getHotWorkNameList();
|
||||
|
||||
_contentController.addListener(() {
|
||||
_nameController.addListener(() {
|
||||
setState(() {
|
||||
pd['WORK_CONTENT'] = _contentController.text.trim();
|
||||
pd['NAME'] = _nameController.text.trim();
|
||||
});
|
||||
});
|
||||
_locationController.addListener(() {
|
||||
pd['WORK_PLACE'] = _locationController.text.trim();
|
||||
_mediumController.addListener(() {
|
||||
pd['MEDIUM'] = _mediumController.text.trim();
|
||||
});
|
||||
_hightController.addListener(() {
|
||||
pd['WORK_HIGH'] = _hightController.text.trim();
|
||||
_temperatureController.addListener(() {
|
||||
pd['TEMPERATURE'] = _temperatureController.text.trim();
|
||||
});
|
||||
_pressureController.addListener(() {
|
||||
pd['PRESSURE'] = _pressureController.text.trim();
|
||||
});
|
||||
_relatedController.addListener(() {
|
||||
pd['SPECIAL_WORK'] = _relatedController.text.trim();
|
||||
|
|
@ -121,7 +129,7 @@ class _BlindboardApplyDetailState extends State<BlindboardApplyDetail> {
|
|||
void set_pd_USER_ID(EditUserType type, String id) {
|
||||
if (type == EditUserType.WORK_USER) {
|
||||
pd['${type.name}_ID'] = id;
|
||||
}else{
|
||||
} else {
|
||||
pd['${type.name}_USER_ID'] = id;
|
||||
}
|
||||
}
|
||||
|
|
@ -141,7 +149,7 @@ class _BlindboardApplyDetailState extends State<BlindboardApplyDetail> {
|
|||
String get_pd_USER_ID(EditUserType type) {
|
||||
if (type == EditUserType.WORK_USER) {
|
||||
return pd['${type.name}_ID'] ?? '';
|
||||
}else{
|
||||
} else {
|
||||
return pd['${type.name}_USER_ID'] ?? '';
|
||||
}
|
||||
}
|
||||
|
|
@ -160,8 +168,8 @@ class _BlindboardApplyDetailState extends State<BlindboardApplyDetail> {
|
|||
if (choice != null) {
|
||||
// 用户点击确定并选择了 choice
|
||||
setState(() {
|
||||
pd['WORK_LEVEL_NAME'] = choice;
|
||||
pd['WORK_LEVEL'] = (levelList.indexOf(choice) + 1).toString();
|
||||
pd['WORK_TYPE_NAME'] = choice;
|
||||
pd['WORK_TYPE'] = (levelList.indexOf(choice) + 1).toString();
|
||||
FocusHelper.clearFocus(context);
|
||||
});
|
||||
}
|
||||
|
|
@ -181,16 +189,6 @@ class _BlindboardApplyDetailState extends State<BlindboardApplyDetail> {
|
|||
Widget _chooseItem(EditUserType type) {
|
||||
bool isClean = false;
|
||||
bool isRequird = true;
|
||||
if (pd['WORK_LEVEL'] == '1' && type == EditUserType.AUDIT) {
|
||||
isRequird = false;
|
||||
isClean = true;
|
||||
|
||||
}
|
||||
if (pd['WORK_LEVEL'] != '4' && type == EditUserType.APPROVE) {
|
||||
isRequird = false;
|
||||
isClean = true;
|
||||
|
||||
}
|
||||
|
||||
return Column(
|
||||
children: [
|
||||
|
|
@ -268,13 +266,15 @@ class _BlindboardApplyDetailState extends State<BlindboardApplyDetail> {
|
|||
return;
|
||||
}
|
||||
|
||||
if (personList.isEmpty) { // 一般这种情况是因为重新编辑没有缓存对应部门的负责人,所以先拉取一下接口
|
||||
if (personList.isEmpty) {
|
||||
// 一般这种情况是因为重新编辑没有缓存对应部门的负责人,所以先拉取一下接口
|
||||
await _getPersonListForUnitId(unitId, type);
|
||||
final list = _personCache[type] ?? [];
|
||||
|
||||
if (list.isEmpty) { // 如果还是没数据,说明该部门没有可选的人
|
||||
if (list.isEmpty) {
|
||||
// 如果还是没数据,说明该部门没有可选的人
|
||||
ToastUtil.showNormal(context, '暂无数据,请选择其他单位');
|
||||
}else{
|
||||
} else {
|
||||
choosePersonHandle(type);
|
||||
}
|
||||
return;
|
||||
|
|
@ -302,17 +302,19 @@ class _BlindboardApplyDetailState extends State<BlindboardApplyDetail> {
|
|||
Future<void> _submit(String status) async {
|
||||
// 通用文本字段校验规则
|
||||
final textRules = <Map<String, dynamic>>[
|
||||
{'value': _locationController.text.trim(), 'message': '请填写地点及部位'},
|
||||
{'value': _hightController.text.trim(), 'message': '请填写高度'},
|
||||
{'value': _nameController.text.trim(), 'message': '请输入设备管线名'},
|
||||
{'value': pd['WORK_TYPE'], 'message': '请选择作业方式'},
|
||||
{'value': _mediumController.text.trim(), 'message': '请输入介质'},
|
||||
{'value': _temperatureController.text.trim(), 'message': '请输入温度'},
|
||||
{'value': _pressureController.text.trim(), 'message': '请输入压力'},
|
||||
|
||||
{'value': _contentController.text.trim(), 'message': '请填写作业内容'},
|
||||
{
|
||||
'value': _relatedController.text.trim(),
|
||||
'message': '请输入关联的其他特殊作业及安全作业票编号',
|
||||
},
|
||||
{'value': _riskController.text.trim(), 'message': '请填写风险辨识结果'},
|
||||
];
|
||||
final level = pd['WORK_LEVEL'] ?? '';
|
||||
final level = pd['WORK_TYPE'] ?? '';
|
||||
print('---level-$level');
|
||||
|
||||
/// 各项负责人校验
|
||||
|
|
@ -322,13 +324,9 @@ class _BlindboardApplyDetailState extends State<BlindboardApplyDetail> {
|
|||
EditUserType.ACCEPT_CONFESS,
|
||||
EditUserType.CONFIRM,
|
||||
EditUserType.LEADER,
|
||||
if (pd['WORK_LEVEL'] != '1')
|
||||
EditUserType.AUDIT,
|
||||
if (pd['WORK_LEVEL'] == '4')
|
||||
EditUserType.APPROVE,
|
||||
EditUserType.WORKSHOP,
|
||||
EditUserType.WORK_USER,
|
||||
EditUserType.WORK_START,
|
||||
EditUserType.WORK_END,
|
||||
EditUserType.ACCEPT,
|
||||
];
|
||||
if (status == '1') {
|
||||
|
|
@ -341,7 +339,7 @@ class _BlindboardApplyDetailState extends State<BlindboardApplyDetail> {
|
|||
}
|
||||
// 级别校验
|
||||
if (level.length == 0) {
|
||||
ToastUtil.showNormal(context, '请输入高处作业级别');
|
||||
ToastUtil.showNormal(context, '请选择盲板作业方式');
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -358,15 +356,9 @@ class _BlindboardApplyDetailState extends State<BlindboardApplyDetail> {
|
|||
}
|
||||
// LoadingDialogHelper.show();
|
||||
|
||||
String taskId = '0';
|
||||
if (pd['WORK_LEVEL'] == '1') {
|
||||
taskId = '5';
|
||||
} else if (pd['WORK_LEVEL'] == '2' || pd['WORK_LEVEL'] == '3') {
|
||||
taskId = '6';
|
||||
} else if (pd['WORK_LEVEL'] == '4') {
|
||||
taskId = '7';
|
||||
}
|
||||
pd['WORK_LEVEL_NAME'] = levelList[int.parse(pd['WORK_LEVEL'])];
|
||||
String taskId = '13';
|
||||
|
||||
pd['WORK_TYPE_NAME'] = levelList[int.parse(pd['WORK_TYPE'])];
|
||||
pd['USER_ID'] = SessionService.instance.loginUserId;
|
||||
pd['STEP_ID'] = status;
|
||||
pd['CORPINFO_ID'] = SessionService.instance.corpinfoId;
|
||||
|
|
@ -374,12 +366,13 @@ class _BlindboardApplyDetailState extends State<BlindboardApplyDetail> {
|
|||
pd['CREATOR'] = SessionService.instance.loginUserId;
|
||||
pd['ACTION_USER'] = SessionService.instance.username;
|
||||
pd['APPLY_STATUS'] = status;
|
||||
pd['boardList'] = jsonEncode(boardList).toString();
|
||||
|
||||
// 提交参数
|
||||
if (msg == 'add') {
|
||||
pd['STEP_ID'] = status;
|
||||
pd['TASK_ID'] = taskId;
|
||||
pd['BLINDBOARD_ID'] = widget.BLINDBOARD_ID;
|
||||
pd['BLINDBOARD_ID'] = pd['BLINDBOARD_ID'] ?? widget.BLINDBOARD_ID;
|
||||
pd['APPLY_DEPARTMENT_ID'] = SessionService.instance.deptId;
|
||||
pd['APPLY_DEPARTMENT_NAME'] =
|
||||
SessionService.instance.loginUser?['DEPARTMENT_NAME'] ?? '';
|
||||
|
|
@ -423,23 +416,26 @@ class _BlindboardApplyDetailState extends State<BlindboardApplyDetail> {
|
|||
|
||||
/// 初始化拉取数据
|
||||
Future<void> _getData() async {
|
||||
|
||||
final data = await ApiService.getHomeworkFindById('blindboard', widget.BLINDBOARD_ID);
|
||||
final data = await ApiService.getHomeworkFindById(
|
||||
'blindboard',
|
||||
widget.BLINDBOARD_ID,
|
||||
);
|
||||
setState(() {
|
||||
pd = data['pd'];
|
||||
boardList = data['boardList'];
|
||||
if (pd['STEP_ID'] == 0) {
|
||||
isEditable = true;
|
||||
} else {
|
||||
_getSigns(pd['BLINDBOARD_ID'] ?? '');
|
||||
_getMeasures(pd['BLINDBOARD_ID'] ?? '');
|
||||
}
|
||||
pd['WORK_LEVEL'] = pd['WORK_LEVEL']?.toString() ?? '';
|
||||
pd['WORK_TYPE'] = pd['WORK_TYPE']?.toString() ?? '';
|
||||
|
||||
// 给所有输入框赋值
|
||||
_contentController.text = pd['WORK_CONTENT'] ?? '';
|
||||
_locationController.text = pd['WORK_PLACE'] ?? '';
|
||||
_hightController.text = pd['WORK_HIGH'] ?? '';
|
||||
_relatedController.text = pd['SPECIAL_WORK'] ?? '';
|
||||
_nameController.text = pd['NAME'] ?? '';
|
||||
_mediumController.text = pd['MEDIUM'] ?? '';
|
||||
_temperatureController.text = pd['TEMPERATURE'] ?? '';
|
||||
_pressureController.text = pd['PRESSURE'] ?? '';
|
||||
_riskController.text = pd['RISK_IDENTIFICATION'] ?? '';
|
||||
});
|
||||
// final data = await ApiService.getHomeworkFindById('blindboard', widget.BLINDBOARD_ID);
|
||||
|
|
@ -450,7 +446,8 @@ class _BlindboardApplyDetailState extends State<BlindboardApplyDetail> {
|
|||
}
|
||||
|
||||
Future<void> _getSigns(String homework_id) async {
|
||||
final data = await ApiService.listSignFinished('blindboard',
|
||||
final data = await ApiService.listSignFinished(
|
||||
'blindboard',
|
||||
homework_id.length > 0 ? homework_id : widget.BLINDBOARD_ID,
|
||||
);
|
||||
setState(() {
|
||||
|
|
@ -459,7 +456,8 @@ class _BlindboardApplyDetailState extends State<BlindboardApplyDetail> {
|
|||
}
|
||||
|
||||
Future<void> _getMeasures(String homework_id) async {
|
||||
final data = await ApiService.listSignFinishMeasures('blindboard',
|
||||
final data = await ApiService.listSignFinishMeasures(
|
||||
'blindboard',
|
||||
homework_id.length > 0 ? homework_id : widget.BLINDBOARD_ID,
|
||||
);
|
||||
setState(() {
|
||||
|
|
@ -473,7 +471,7 @@ class _BlindboardApplyDetailState extends State<BlindboardApplyDetail> {
|
|||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
backgroundColor: h_backGroundColor(),
|
||||
appBar: MyAppbar(title: '高处作业申请'),
|
||||
appBar: MyAppbar(title: '盲板作业申请'),
|
||||
body: SafeArea(
|
||||
child: SingleChildScrollView(
|
||||
padding: EdgeInsets.all(12),
|
||||
|
|
@ -481,11 +479,13 @@ class _BlindboardApplyDetailState extends State<BlindboardApplyDetail> {
|
|||
children: [
|
||||
_card(
|
||||
BlindboardDetailFormWidget(
|
||||
boardList: boardList,
|
||||
pd: pd,
|
||||
isEditable: isEditable,
|
||||
contentController: _contentController,
|
||||
locationController: _locationController,
|
||||
hightController: _hightController,
|
||||
nameController: _nameController,
|
||||
mediumController: _mediumController,
|
||||
temperatureController: _temperatureController,
|
||||
pressureController: _pressureController,
|
||||
relatedController: _relatedController,
|
||||
riskController: _riskController,
|
||||
onChooseLevel: _chooseLevel,
|
||||
|
|
@ -494,7 +494,8 @@ class _BlindboardApplyDetailState extends State<BlindboardApplyDetail> {
|
|||
if (isEditable)
|
||||
Column(
|
||||
children: [
|
||||
|
||||
SizedBox(height: 15),
|
||||
_card(_chooseItem(EditUserType.WORKSHOP)),
|
||||
SizedBox(height: 15),
|
||||
_card(_chooseItem(EditUserType.GUARDIAN)),
|
||||
SizedBox(height: 15),
|
||||
|
|
@ -507,10 +508,7 @@ class _BlindboardApplyDetailState extends State<BlindboardApplyDetail> {
|
|||
_card(_chooseItem(EditUserType.CONFIRM)),
|
||||
SizedBox(height: 15),
|
||||
_card(_chooseItem(EditUserType.LEADER)),
|
||||
SizedBox(height: 15),
|
||||
_card(_chooseItem(EditUserType.AUDIT)),
|
||||
SizedBox(height: 15),
|
||||
_card(_chooseItem(EditUserType.APPROVE)),
|
||||
|
||||
SizedBox(height: 15),
|
||||
_card(
|
||||
Column(
|
||||
|
|
@ -531,26 +529,7 @@ class _BlindboardApplyDetailState extends State<BlindboardApplyDetail> {
|
|||
],
|
||||
),
|
||||
),
|
||||
SizedBox(height: 15),
|
||||
_card(
|
||||
Column(
|
||||
mainAxisAlignment: MainAxisAlignment.start,
|
||||
children: [
|
||||
_chooseItem(EditUserType.WORK_END),
|
||||
Divider(),
|
||||
Row(
|
||||
children: [
|
||||
SizedBox(width: 12),
|
||||
Text(
|
||||
'友情提示:负责填写作业实际结束时间',
|
||||
style: TextStyle(color: Colors.red),
|
||||
),
|
||||
],
|
||||
),
|
||||
SizedBox(height: 5),
|
||||
],
|
||||
),
|
||||
),
|
||||
|
||||
SizedBox(height: 15),
|
||||
_card(_chooseItem(EditUserType.ACCEPT)),
|
||||
SizedBox(height: 15),
|
||||
|
|
@ -565,7 +544,7 @@ class _BlindboardApplyDetailState extends State<BlindboardApplyDetail> {
|
|||
color: Colors.white,
|
||||
child: MeasuresListWidget(
|
||||
measuresList:
|
||||
measuresList, // List<Map<String, dynamic>>
|
||||
measuresList, // List<Map<String, dynamic>>
|
||||
baseImgPath: ApiService.baseImgPath,
|
||||
isAllowEdit: false,
|
||||
),
|
||||
|
|
@ -593,45 +572,9 @@ class _BlindboardApplyDetailState extends State<BlindboardApplyDetail> {
|
|||
),
|
||||
isEditable
|
||||
? Row(
|
||||
spacing: 10,
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Expanded(
|
||||
child: CustomButton(
|
||||
height: 45,
|
||||
textStyle: TextStyle(
|
||||
fontSize: 16,
|
||||
color: Colors.white,
|
||||
),
|
||||
text: '提交',
|
||||
backgroundColor: Colors.blue,
|
||||
onPressed: () {
|
||||
_submit('1');
|
||||
},
|
||||
),
|
||||
),
|
||||
|
||||
Expanded(
|
||||
child: CustomButton(
|
||||
textStyle: TextStyle(
|
||||
fontSize: 16,
|
||||
color: Colors.white,
|
||||
),
|
||||
text: '暂存',
|
||||
backgroundColor: Colors.green,
|
||||
onPressed: () {
|
||||
_submit('0');
|
||||
},
|
||||
),
|
||||
),
|
||||
],
|
||||
)
|
||||
: Column(
|
||||
children: [
|
||||
SizedBox(height: 20),
|
||||
Row(
|
||||
spacing: 10,
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
SizedBox(width: 50),
|
||||
Expanded(
|
||||
child: CustomButton(
|
||||
height: 45,
|
||||
|
|
@ -639,18 +582,54 @@ class _BlindboardApplyDetailState extends State<BlindboardApplyDetail> {
|
|||
fontSize: 16,
|
||||
color: Colors.white,
|
||||
),
|
||||
text: '返回',
|
||||
backgroundColor: Colors.green,
|
||||
text: '提交',
|
||||
backgroundColor: Colors.blue,
|
||||
onPressed: () {
|
||||
Navigator.pop(context);
|
||||
_submit('1');
|
||||
},
|
||||
),
|
||||
),
|
||||
SizedBox(width: 50),
|
||||
|
||||
Expanded(
|
||||
child: CustomButton(
|
||||
textStyle: TextStyle(
|
||||
fontSize: 16,
|
||||
color: Colors.white,
|
||||
),
|
||||
text: '暂存',
|
||||
backgroundColor: Colors.green,
|
||||
onPressed: () {
|
||||
_submit('0');
|
||||
},
|
||||
),
|
||||
),
|
||||
],
|
||||
)
|
||||
: Column(
|
||||
children: [
|
||||
SizedBox(height: 20),
|
||||
Row(
|
||||
children: [
|
||||
SizedBox(width: 50),
|
||||
Expanded(
|
||||
child: CustomButton(
|
||||
height: 45,
|
||||
textStyle: TextStyle(
|
||||
fontSize: 16,
|
||||
color: Colors.white,
|
||||
),
|
||||
text: '返回',
|
||||
backgroundColor: Colors.green,
|
||||
onPressed: () {
|
||||
Navigator.pop(context);
|
||||
},
|
||||
),
|
||||
),
|
||||
SizedBox(width: 50),
|
||||
],
|
||||
),
|
||||
],
|
||||
),
|
||||
],
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@ import 'package:qhd_prevention/customWidget/ItemWidgetFactory.dart';
|
|||
import 'package:qhd_prevention/customWidget/custom_button.dart';
|
||||
import 'package:qhd_prevention/customWidget/toast_util.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/item_list_widget.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_Wrok/gc_work/SpecialWorkFormBaseWork.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_Wrok/mbcd_work/BlindboardFormBaseWork.dart';
|
||||
import 'package:qhd_prevention/tools/tools.dart';
|
||||
import 'package:qhd_prevention/customWidget/custom_alert_dialog.dart';
|
||||
import 'package:qhd_prevention/customWidget/single_image_viewer.dart';
|
||||
|
|
@ -34,6 +34,7 @@ class _BlindboardShbmDetailState extends State<BlindboardShbmDetail> {
|
|||
|
||||
/// 详情
|
||||
late Map<String, dynamic> pd = {};
|
||||
late List<dynamic> boardList = [];
|
||||
final TextEditingController _contentController = TextEditingController();
|
||||
|
||||
/// 安全防护措施列表
|
||||
|
|
@ -203,6 +204,7 @@ class _BlindboardShbmDetailState extends State<BlindboardShbmDetail> {
|
|||
final data = await ApiService.getHomeworkFindById('blindboard', widget.BLINDBOARD_ID);
|
||||
setState(() {
|
||||
pd = data['pd'];
|
||||
boardList = data['boardList'];
|
||||
|
||||
_getSigns(pd['BLINDBOARD_ID'] ?? '');
|
||||
_getMeasures(pd['BLINDBOARD_ID'] ?? '');
|
||||
|
|
@ -271,7 +273,8 @@ class _BlindboardShbmDetailState extends State<BlindboardShbmDetail> {
|
|||
spacing: 12,
|
||||
children: [
|
||||
// _setSafeDetailWidget(),
|
||||
HighWorkFormBaseWork(
|
||||
BlindboardFormBaseWork(
|
||||
boardList: boardList,
|
||||
pd: pd,
|
||||
measuresList: measuresList,
|
||||
signs: signs,
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@ import 'package:qhd_prevention/pages/my_appbar.dart';
|
|||
import 'package:qhd_prevention/customWidget/custom_alert_dialog.dart';
|
||||
import 'package:qhd_prevention/customWidget/single_image_viewer.dart';
|
||||
import 'package:qhd_prevention/pages/mine/mine_sign_page.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_Wrok/gc_work/SpecialWorkFormBaseWork.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_Wrok/mbcd_work/BlindboardFormBaseWork.dart';
|
||||
|
||||
/// 审批部门意见
|
||||
class BlindboardSpbmDetail extends StatefulWidget {
|
||||
|
|
@ -33,6 +33,7 @@ class _BlindboardSpbmDetailState extends State<BlindboardSpbmDetail> {
|
|||
|
||||
/// 详情
|
||||
late Map<String, dynamic> pd = {};
|
||||
late List<dynamic> boardList = [];
|
||||
final TextEditingController _contentController = TextEditingController();
|
||||
|
||||
/// 安全防护措施列表
|
||||
|
|
@ -179,7 +180,7 @@ class _BlindboardSpbmDetailState extends State<BlindboardSpbmDetail> {
|
|||
LoadingDialogHelper.show();
|
||||
try {
|
||||
final result = await ApiService.saveSafeFunctionSure(
|
||||
'blindboard',
|
||||
'blindboard',
|
||||
formData,
|
||||
signImages,
|
||||
);
|
||||
|
|
@ -199,9 +200,13 @@ class _BlindboardSpbmDetailState extends State<BlindboardSpbmDetail> {
|
|||
|
||||
/// 初始化拉取数据
|
||||
Future<void> _getData() async {
|
||||
final data = await ApiService.getHomeworkFindById('blindboard', widget.BLINDBOARD_ID);
|
||||
final data = await ApiService.getHomeworkFindById(
|
||||
'blindboard',
|
||||
widget.BLINDBOARD_ID,
|
||||
);
|
||||
setState(() {
|
||||
pd = data['pd'];
|
||||
boardList = data['boardList'];
|
||||
|
||||
_getSigns(pd['BLINDBOARD_ID'] ?? '');
|
||||
_getMeasures(pd['BLINDBOARD_ID'] ?? '');
|
||||
|
|
@ -209,7 +214,8 @@ class _BlindboardSpbmDetailState extends State<BlindboardSpbmDetail> {
|
|||
}
|
||||
|
||||
Future<void> _getMeasures(String homework_id) async {
|
||||
final data = await ApiService.listSignFinishMeasures('blindboard',
|
||||
final data = await ApiService.listSignFinishMeasures(
|
||||
'blindboard',
|
||||
homework_id.length > 0 ? homework_id : widget.BLINDBOARD_ID,
|
||||
);
|
||||
setState(() {
|
||||
|
|
@ -220,7 +226,8 @@ class _BlindboardSpbmDetailState extends State<BlindboardSpbmDetail> {
|
|||
}
|
||||
|
||||
Future<void> _getSigns(String homework_id) async {
|
||||
final data = await ApiService.listSignFinished('blindboard',
|
||||
final data = await ApiService.listSignFinished(
|
||||
'blindboard',
|
||||
homework_id.length > 0 ? homework_id : widget.BLINDBOARD_ID,
|
||||
);
|
||||
setState(() {
|
||||
|
|
@ -270,7 +277,8 @@ class _BlindboardSpbmDetailState extends State<BlindboardSpbmDetail> {
|
|||
spacing: 12,
|
||||
children: [
|
||||
// _setSafeDetailWidget(),
|
||||
HighWorkFormBaseWork(
|
||||
BlindboardFormBaseWork(
|
||||
boardList: boardList,
|
||||
pd: pd,
|
||||
measuresList: measuresList,
|
||||
signs: signs,
|
||||
|
|
@ -286,8 +294,7 @@ class _BlindboardSpbmDetailState extends State<BlindboardSpbmDetail> {
|
|||
'审批部门负责人意见',
|
||||
'请输入意见',
|
||||
_contentController,
|
||||
isRequired: true
|
||||
|
||||
isRequired: true,
|
||||
),
|
||||
Divider(),
|
||||
Column(
|
||||
|
|
@ -313,7 +320,7 @@ class _BlindboardSpbmDetailState extends State<BlindboardSpbmDetail> {
|
|||
),
|
||||
if (signImages.isNotEmpty) _signListWidget(),
|
||||
],
|
||||
)
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
|
|
|
|||
|
|
@ -37,6 +37,8 @@ class _BlindboardSetSafeDetailState extends State<BlindboardSetSafeDetail> {
|
|||
|
||||
/// 详情
|
||||
late Map<String, dynamic> pd = {};
|
||||
late List<dynamic> boardList = [];
|
||||
|
||||
late List<Map<String, dynamic>> measuresList = [];
|
||||
|
||||
/// 安全防护措施列表
|
||||
|
|
@ -355,6 +357,7 @@ class _BlindboardSetSafeDetailState extends State<BlindboardSetSafeDetail> {
|
|||
final data = await ApiService.getHomeworkFindById('blindboard', widget.BLINDBOARD_ID);
|
||||
setState(() {
|
||||
pd = data['pd'];
|
||||
boardList = data['boardList'];
|
||||
_getMeasures();
|
||||
});
|
||||
}
|
||||
|
|
@ -567,6 +570,7 @@ class _BlindboardSetSafeDetailState extends State<BlindboardSetSafeDetail> {
|
|||
children: [
|
||||
// _card(_defaultDetail()),
|
||||
BlindboardDetailFormWidget(
|
||||
boardList: boardList,
|
||||
pd: pd,
|
||||
isEditable: false,
|
||||
onChooseLevel: (){},
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@ import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/dh_work/qtfx_
|
|||
import 'package:qhd_prevention/customWidget/custom_alert_dialog.dart';
|
||||
import 'package:qhd_prevention/customWidget/single_image_viewer.dart';
|
||||
import 'package:qhd_prevention/pages/mine/mine_sign_page.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_Wrok/gc_work/SpecialWorkFormBaseWork.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_Wrok/mbcd_work/BlindboardFormBaseWork.dart';
|
||||
|
||||
/// 所在单位意见
|
||||
class BlindboardSzdwDetail extends StatefulWidget {
|
||||
|
|
@ -34,6 +34,7 @@ class _BlindboardSzdwDetailState extends State<BlindboardSzdwDetail> {
|
|||
|
||||
/// 详情
|
||||
late Map<String, dynamic> pd = {};
|
||||
late List<dynamic> boardList = [];
|
||||
final TextEditingController _contentController = TextEditingController();
|
||||
|
||||
/// 安全防护措施列表
|
||||
|
|
@ -203,6 +204,7 @@ class _BlindboardSzdwDetailState extends State<BlindboardSzdwDetail> {
|
|||
final data = await ApiService.getHomeworkFindById('blindboard', widget.BLINDBOARD_ID);
|
||||
setState(() {
|
||||
pd = data['pd'];
|
||||
boardList = data['boardList'];
|
||||
|
||||
_getSigns(pd['BLINDBOARD_ID'] ?? '');
|
||||
_getMeasures(pd['BLINDBOARD_ID'] ?? '');
|
||||
|
|
@ -271,7 +273,8 @@ class _BlindboardSzdwDetailState extends State<BlindboardSzdwDetail> {
|
|||
spacing: 12,
|
||||
children: [
|
||||
// _setSafeDetailWidget(),
|
||||
HighWorkFormBaseWork(
|
||||
BlindboardFormBaseWork(
|
||||
boardList: boardList,
|
||||
pd: pd,
|
||||
measuresList: measuresList,
|
||||
signs: signs,
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@ import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/dh_work/qtfx_
|
|||
import 'package:qhd_prevention/customWidget/custom_alert_dialog.dart';
|
||||
import 'package:qhd_prevention/customWidget/single_image_viewer.dart';
|
||||
import 'package:qhd_prevention/pages/mine/mine_sign_page.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_Wrok/gc_work/SpecialWorkFormBaseWork.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_Wrok/mbcd_work/BlindboardFormBaseWork.dart';
|
||||
import 'package:qhd_prevention/customWidget/picker/CupertinoDatePicker.dart';
|
||||
import 'package:qhd_prevention/customWidget/photo_picker_row.dart';
|
||||
|
||||
|
|
@ -43,8 +43,11 @@ class _BlindboardYsgdDetailState extends State<BlindboardYsgdDetail> {
|
|||
|
||||
/// 详情
|
||||
late Map<String, dynamic> pd = {};
|
||||
late List<dynamic> boardList = [];
|
||||
|
||||
/// 选择的时间
|
||||
String startTime = '';
|
||||
|
||||
/// 验收意见
|
||||
final TextEditingController _contentController = TextEditingController();
|
||||
late List<ImageData> imgList = [];
|
||||
|
|
@ -60,6 +63,7 @@ class _BlindboardYsgdDetailState extends State<BlindboardYsgdDetail> {
|
|||
super.initState();
|
||||
_getData();
|
||||
}
|
||||
|
||||
/// 拍照或选图后的回调
|
||||
Future<void> _onImageAdded(String localPath) async {
|
||||
// 上传到服务器
|
||||
|
|
@ -79,6 +83,7 @@ class _BlindboardYsgdDetailState extends State<BlindboardYsgdDetail> {
|
|||
imgList.remove(item);
|
||||
});
|
||||
}
|
||||
|
||||
/// 签字
|
||||
Future<void> _sign() async {
|
||||
final path = await Navigator.push(
|
||||
|
|
@ -172,17 +177,7 @@ class _BlindboardYsgdDetailState extends State<BlindboardYsgdDetail> {
|
|||
ToastUtil.showNormal(context, '请选择验收时间');
|
||||
return;
|
||||
}
|
||||
// final workStart = DateTime.parse(pd['WORK_START_DATE'] as String);
|
||||
final endTime = DateTime.parse(pd['WORK_END_DATE'] as String);
|
||||
final acceptTime = DateTime.parse(startTime);
|
||||
|
||||
final intervalMs = endTime.difference(acceptTime).inMilliseconds;
|
||||
const thresholdMs = 30 * 60 * 1000;
|
||||
|
||||
if (intervalMs >= thresholdMs) {
|
||||
ToastUtil.showNormal(context, '请在作业结束30分钟内完成验收');
|
||||
return;
|
||||
}
|
||||
if (imgList.isEmpty) {
|
||||
ToastUtil.showNormal(context, '请上传验收视频');
|
||||
|
||||
|
|
@ -211,7 +206,7 @@ class _BlindboardYsgdDetailState extends State<BlindboardYsgdDetail> {
|
|||
final serverPathString = imgList
|
||||
.map((e) => e.serverPath)
|
||||
.where((s) => s.isNotEmpty)
|
||||
.map((s) => s) // 将 String? 转回 String
|
||||
.map((s) => s) // 将 String? 转回 String
|
||||
.join(',');
|
||||
// 存回 measures
|
||||
final Map<String, dynamic> formData = {};
|
||||
|
|
@ -237,7 +232,7 @@ class _BlindboardYsgdDetailState extends State<BlindboardYsgdDetail> {
|
|||
LoadingDialogHelper.show();
|
||||
try {
|
||||
final result = await ApiService.saveSafeFunctionSure(
|
||||
'blindboard',
|
||||
'blindboard',
|
||||
formData,
|
||||
signImages,
|
||||
);
|
||||
|
|
@ -257,9 +252,13 @@ class _BlindboardYsgdDetailState extends State<BlindboardYsgdDetail> {
|
|||
|
||||
/// 初始化拉取数据
|
||||
Future<void> _getData() async {
|
||||
final data = await ApiService.getHomeworkFindById('blindboard', widget.BLINDBOARD_ID);
|
||||
final data = await ApiService.getHomeworkFindById(
|
||||
'blindboard',
|
||||
widget.BLINDBOARD_ID,
|
||||
);
|
||||
setState(() {
|
||||
pd = data['pd'];
|
||||
boardList = data['boardList'];
|
||||
|
||||
_getSigns(pd['BLINDBOARD_ID'] ?? '');
|
||||
_getMeasures(pd['BLINDBOARD_ID'] ?? '');
|
||||
|
|
@ -267,7 +266,8 @@ class _BlindboardYsgdDetailState extends State<BlindboardYsgdDetail> {
|
|||
}
|
||||
|
||||
Future<void> _getMeasures(String homework_id) async {
|
||||
final data = await ApiService.listSignFinishMeasures('blindboard',
|
||||
final data = await ApiService.listSignFinishMeasures(
|
||||
'blindboard',
|
||||
homework_id.length > 0 ? homework_id : widget.BLINDBOARD_ID,
|
||||
);
|
||||
setState(() {
|
||||
|
|
@ -278,7 +278,8 @@ class _BlindboardYsgdDetailState extends State<BlindboardYsgdDetail> {
|
|||
}
|
||||
|
||||
Future<void> _getSigns(String homework_id) async {
|
||||
final data = await ApiService.listSignFinished('blindboard',
|
||||
final data = await ApiService.listSignFinished(
|
||||
'blindboard',
|
||||
homework_id.length > 0 ? homework_id : widget.BLINDBOARD_ID,
|
||||
);
|
||||
setState(() {
|
||||
|
|
@ -328,7 +329,8 @@ class _BlindboardYsgdDetailState extends State<BlindboardYsgdDetail> {
|
|||
spacing: 12,
|
||||
children: [
|
||||
// _setSafeDetailWidget(),
|
||||
HighWorkFormBaseWork(
|
||||
BlindboardFormBaseWork(
|
||||
boardList: boardList,
|
||||
pd: pd,
|
||||
measuresList: measuresList,
|
||||
signs: signs,
|
||||
|
|
@ -345,16 +347,25 @@ class _BlindboardYsgdDetailState extends State<BlindboardYsgdDetail> {
|
|||
'完工验收',
|
||||
'请输入意见',
|
||||
_contentController,
|
||||
isRequired: true
|
||||
isRequired: true,
|
||||
),
|
||||
Divider(),
|
||||
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 {
|
||||
DateTime? picked = await BottomDateTimePicker.showDate(context);
|
||||
DateTime? picked = await BottomDateTimePicker.showDate(
|
||||
context,
|
||||
);
|
||||
if (picked != null) {
|
||||
setState(() {
|
||||
startTime = DateFormat('yyyy-MM-dd HH:mm').format(picked);
|
||||
startTime = DateFormat(
|
||||
'yyyy-MM-dd HH:mm',
|
||||
).format(picked);
|
||||
});
|
||||
FocusHelper.clearFocus(context);
|
||||
}
|
||||
|
|
@ -366,11 +377,13 @@ class _BlindboardYsgdDetailState extends State<BlindboardYsgdDetail> {
|
|||
title: '验收视频',
|
||||
maxCount: 1,
|
||||
mediaType: MediaType.video,
|
||||
horizontalPadding: 0,
|
||||
horizontalPadding: 0,
|
||||
onChanged: (paths) {},
|
||||
onMediaAdded: _onImageAdded,
|
||||
onMediaRemoved: (path) {
|
||||
final item = imgList.firstWhere((e) => e.localPath == path);
|
||||
final item = imgList.firstWhere(
|
||||
(e) => e.localPath == path,
|
||||
);
|
||||
_onImageRemoved(item);
|
||||
},
|
||||
onAiIdentify: () {},
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@ import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/dh_work/qtfx_
|
|||
import 'package:qhd_prevention/customWidget/custom_alert_dialog.dart';
|
||||
import 'package:qhd_prevention/customWidget/single_image_viewer.dart';
|
||||
import 'package:qhd_prevention/pages/mine/mine_sign_page.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_Wrok/gc_work/SpecialWorkFormBaseWork.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_Wrok/mbcd_work/BlindboardFormBaseWork.dart';
|
||||
|
||||
/// 作业负责人意见
|
||||
class BlindboardZyfzDetail extends StatefulWidget {
|
||||
|
|
@ -34,6 +34,7 @@ class _BlindboardZyfzDetailState extends State<BlindboardZyfzDetail> {
|
|||
|
||||
/// 详情
|
||||
late Map<String, dynamic> pd = {};
|
||||
late List<dynamic> boardList = [];
|
||||
final TextEditingController _contentController = TextEditingController();
|
||||
|
||||
/// 安全防护措施列表
|
||||
|
|
@ -203,6 +204,7 @@ class _BlindboardZyfzDetailState extends State<BlindboardZyfzDetail> {
|
|||
final data = await ApiService.getHomeworkFindById('blindboard', widget.BLINDBOARD_ID);
|
||||
setState(() {
|
||||
pd = data['pd'];
|
||||
boardList = data['boardList'];
|
||||
|
||||
_getSigns(pd['BLINDBOARD_ID'] ?? '');
|
||||
_getMeasures(pd['BLINDBOARD_ID'] ?? '');
|
||||
|
|
@ -270,7 +272,8 @@ class _BlindboardZyfzDetailState extends State<BlindboardZyfzDetail> {
|
|||
child: Column(
|
||||
spacing: 12,
|
||||
children: [
|
||||
HighWorkFormBaseWork(
|
||||
BlindboardFormBaseWork(
|
||||
boardList: boardList,
|
||||
pd: pd,
|
||||
measuresList: measuresList,
|
||||
signs: signs,
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@ import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/dh_work/qtfx_
|
|||
import 'package:qhd_prevention/customWidget/custom_alert_dialog.dart';
|
||||
import 'package:qhd_prevention/customWidget/single_image_viewer.dart';
|
||||
import 'package:qhd_prevention/pages/mine/mine_sign_page.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_Wrok/gc_work/SpecialWorkFormBaseWork.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_Wrok/mbcd_work/BlindboardFormBaseWork.dart';
|
||||
|
||||
/// 作业人意见
|
||||
class BlindboardZyrDetail extends StatefulWidget {
|
||||
|
|
@ -34,6 +34,7 @@ class _BlindboardZyrDetailState extends State<BlindboardZyrDetail> {
|
|||
|
||||
/// 详情
|
||||
late Map<String, dynamic> pd = {};
|
||||
late List<dynamic> boardList = [];
|
||||
|
||||
/// 安全防护措施列表
|
||||
late List<Map<String, dynamic>> measuresList = [];
|
||||
|
|
@ -196,6 +197,7 @@ class _BlindboardZyrDetailState extends State<BlindboardZyrDetail> {
|
|||
final data = await ApiService.getHomeworkFindById('blindboard', widget.BLINDBOARD_ID);
|
||||
setState(() {
|
||||
pd = data['pd'];
|
||||
boardList = data['boardList'];
|
||||
|
||||
_getSigns(pd['BLINDBOARD_ID'] ?? '');
|
||||
_getMeasures(pd['BLINDBOARD_ID'] ?? '');
|
||||
|
|
@ -263,7 +265,8 @@ class _BlindboardZyrDetailState extends State<BlindboardZyrDetail> {
|
|||
child: Column(
|
||||
spacing: 12,
|
||||
children: [
|
||||
HighWorkFormBaseWork(
|
||||
BlindboardFormBaseWork(
|
||||
boardList: boardList,
|
||||
pd: pd,
|
||||
measuresList: measuresList,
|
||||
signs: signs,
|
||||
|
|
|
|||
|
|
@ -102,7 +102,7 @@ class _SpaceworkGasListState extends State<SpaceworkGasList> {
|
|||
final img = baseImgPath + images[i];
|
||||
return GestureDetector(
|
||||
onTap: () {
|
||||
present(
|
||||
presentOpaque(
|
||||
SingleImageViewer(imageUrl: img),
|
||||
context,
|
||||
);
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
|
|||
import 'package:qhd_prevention/customWidget/ItemWidgetFactory.dart';
|
||||
import 'package:qhd_prevention/http/ApiService.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/dh_work/hotwork_list_page.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/dl_work/cutroad_list_page.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/work_tab_icon_grid.dart';
|
||||
import 'package:qhd_prevention/pages/my_appbar.dart';
|
||||
import 'package:qhd_prevention/tools/tools.dart';
|
||||
|
|
@ -23,15 +24,20 @@ class _WorkTabDlListState extends State<WorkTabDlList> {
|
|||
_getData();
|
||||
}
|
||||
Future<void> _getData() async {
|
||||
final data = await ApiService.specialcheckWorkCount('highwork');
|
||||
final data = await ApiService.specialcheckWorkCount('cutroad');
|
||||
setState(() {
|
||||
final eight_work_count = data['count'] ?? {};
|
||||
buttonInfos = [
|
||||
{
|
||||
"icon": "assets/icon-apps/icon-yxkj-1.png",
|
||||
"title": "高处作业\n申请",
|
||||
"title": "断路作业\n申请",
|
||||
"unreadCount": eight_work_count['CREATE'] ?? '0',
|
||||
},
|
||||
{
|
||||
"icon": "assets/icon-apps/icon-yxkj-2.png",
|
||||
"title": "作业项目负责人\n意见",
|
||||
"unreadCount": eight_work_count['PROJECT_MANAGER'] ?? '0',
|
||||
},
|
||||
{
|
||||
"icon": "assets/icon-apps/icon-yh-1.png",
|
||||
"title": "设置安全\n措施确认人",
|
||||
|
|
@ -58,11 +64,6 @@ class _WorkTabDlListState extends State<WorkTabDlList> {
|
|||
"title": "接受交底人\n意见",
|
||||
"unreadCount": eight_work_count['ACCEPT_CONFESS'] ?? '0',
|
||||
},
|
||||
{
|
||||
"icon": "assets/icon-apps/icon-yxkj-2.png",
|
||||
"title": "作业人\n意见",
|
||||
"unreadCount": eight_work_count['WORK_USER'] ?? '0',
|
||||
},
|
||||
{
|
||||
"icon": "assets/icon-apps/icon-yxkj-2.png",
|
||||
"title": "作业负责人\n意见",
|
||||
|
|
@ -75,9 +76,10 @@ class _WorkTabDlListState extends State<WorkTabDlList> {
|
|||
},
|
||||
{
|
||||
"icon": "assets/icon-apps/icon-901.png",
|
||||
"title": "审核部门\n意见",
|
||||
"unreadCount": eight_work_count['REVIEWER'] ?? '0',
|
||||
"title": "消防、安全管理\n部门意见",
|
||||
"unreadCount": eight_work_count['AUDIT'] ?? '0',
|
||||
},
|
||||
|
||||
{
|
||||
"icon": "assets/icon-apps/icon-901.png",
|
||||
"title": "审批部门\n意见",
|
||||
|
|
@ -107,15 +109,15 @@ class _WorkTabDlListState extends State<WorkTabDlList> {
|
|||
String title = '';
|
||||
switch (index) {
|
||||
case 0: title = '提交申请'; break;
|
||||
case 1: title = '设置安全措施确认人'; break;
|
||||
case 2: title = '安全措施确认'; break;
|
||||
case 3: title = '监护人签字'; break;
|
||||
case 4: title = '安全交底人签字'; break;
|
||||
case 5: title = '接受交底人签字'; break;
|
||||
case 6: title = '作业人签字'; break;
|
||||
case 1: title = '作业项目负责人'; break;
|
||||
case 2: title = '设置安全措施确认人'; break;
|
||||
case 3: title = '安全措施确认'; break;
|
||||
case 4: title = '监护人签字'; break;
|
||||
case 5: title = '安全交底人签字'; break;
|
||||
case 6: title = '接受交底人签字'; break;
|
||||
case 7: title = '作业负责人签字'; break;
|
||||
case 8: title = '所在单位签字'; break;
|
||||
case 9: title = '审核人签字'; break;
|
||||
case 9: title = '消防、安全管理部门签字'; break;
|
||||
case 10: title = '审批人签字'; break;
|
||||
case 11: title = '开始作业'; break;
|
||||
case 12: title = '结束作业'; break;
|
||||
|
|
@ -123,18 +125,18 @@ class _WorkTabDlListState extends State<WorkTabDlList> {
|
|||
default:
|
||||
print("按钮 $index 被点击");
|
||||
}
|
||||
await pushPage(HotWorkListPage(flow: title, workTypeTitle: '高处作业'), context);
|
||||
await pushPage(CutroadListPage(flow: title, workTypeTitle: '断路作业'), context);
|
||||
_getData();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: MyAppbar(title: '高处作业'),
|
||||
appBar: MyAppbar(title: '断路作业'),
|
||||
body: SafeArea(
|
||||
child: Column(
|
||||
children: [
|
||||
ListItemFactory.createBuildSimpleSection('高处作业审批管理'),
|
||||
ListItemFactory.createBuildSimpleSection('断路作业审批管理'),
|
||||
WorkTabIconGrid(
|
||||
buttonInfos: buttonInfos,
|
||||
onItemPressed: _handleItemPressed,
|
||||
|
|
|
|||
|
|
@ -49,10 +49,15 @@ class _WorkTabLsydListState extends State<WorkTabLsydList> {
|
|||
"unreadCount": eight_work_count['MEASURES_CONFIRM'] ?? '0',
|
||||
},
|
||||
{
|
||||
"icon": "assets/icon-apps/icon-yxkj-4.png",
|
||||
"title": "用电人意见",
|
||||
"icon": "assets/icon-apps/icon-zl-9.png",
|
||||
"title": "监护人\n意见",
|
||||
"unreadCount": eight_work_count['GUARDIAN'] ?? '0',
|
||||
},
|
||||
{
|
||||
"icon": "assets/icon-apps/icon-yxkj-4.png",
|
||||
"title": "用电人\n意见",
|
||||
"unreadCount": eight_work_count['ELECTRICITY'] ?? '0',
|
||||
},
|
||||
{
|
||||
"icon": "assets/icon-apps/icon-807.png",
|
||||
"title": "安全交底人\n意见",
|
||||
|
|
@ -76,12 +81,12 @@ class _WorkTabLsydListState extends State<WorkTabLsydList> {
|
|||
{
|
||||
"icon": "assets/icon-apps/icon-907.png",
|
||||
"title": "用电单位\n意见",
|
||||
"unreadCount": eight_work_count['LEADER'] ?? '0',
|
||||
"unreadCount": eight_work_count['AUDIT'] ?? '0',
|
||||
},
|
||||
{
|
||||
"icon": "assets/icon-apps/icon-907.png",
|
||||
"title": "配送电单位\n意见",
|
||||
"unreadCount": eight_work_count['REVIEWER'] ?? '0',
|
||||
"unreadCount": eight_work_count['APPROVE'] ?? '0',
|
||||
},
|
||||
{
|
||||
"icon": "assets/icon-apps/icon-aq-1.png",
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
|
|||
import 'package:qhd_prevention/customWidget/ItemWidgetFactory.dart';
|
||||
import 'package:qhd_prevention/http/ApiService.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/dh_work/hotwork_list_page.dart';
|
||||
import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/mbcd_work/blindboard_list_page.dart';
|
||||
import 'package:qhd_prevention/pages/my_appbar.dart';
|
||||
import 'package:qhd_prevention/tools/tools.dart';
|
||||
|
||||
|
|
@ -112,7 +113,7 @@ class _WorkTabMbcdListState extends State<WorkTabMbcdList> {
|
|||
default:
|
||||
print("按钮 $index 被点击");
|
||||
}
|
||||
await pushPage(HotWorkListPage(flow: title, workTypeTitle: '盲板作业',), context);
|
||||
await pushPage(BlindboardListPage(flow: title, workTypeTitle: '盲板作业',), context);
|
||||
_getData();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -65,7 +65,7 @@ class _NotifPageState extends State<NotifPage>
|
|||
}
|
||||
|
||||
Future<void> _getNotifList(String keyWord) async {
|
||||
// LoadingDialogHelper.show();
|
||||
LoadingDialogHelper.show();
|
||||
try {
|
||||
final result = await ApiService.getNotifList("-1", pageNum.toString(),keyWord);
|
||||
if (result['result'] == 'success') {
|
||||
|
|
@ -74,7 +74,10 @@ class _NotifPageState extends State<NotifPage>
|
|||
_list.addAll(newList);
|
||||
});
|
||||
}
|
||||
LoadingDialogHelper.hide();
|
||||
} catch (e) {
|
||||
LoadingDialogHelper.hide();
|
||||
|
||||
print('加载出错: $e');
|
||||
} finally {
|
||||
LoadingDialogHelper.hide();
|
||||
|
|
|
|||
Loading…
Reference in New Issue