Compare commits
No commits in common. "6318206baacee17116132cc25dc361b10b9ba5c8" and "fd20e9bcd5fbd44e1304c7820b3b8e9ca1fd3a90" have entirely different histories.
6318206baa
...
fd20e9bcd5
|
|
@ -97,13 +97,14 @@ class SpecialWorkFormBaseWork extends StatelessWidget {
|
||||||
children: [
|
children: [
|
||||||
ListItemFactory.createBuildSimpleSection('其他安全防护措施'),
|
ListItemFactory.createBuildSimpleSection('其他安全防护措施'),
|
||||||
OtherMeasuresWidget(
|
OtherMeasuresWidget(
|
||||||
|
|
||||||
otherMeasures: signs['MEASURES_CONFIRM'],
|
otherMeasures: signs['MEASURES_CONFIRM'],
|
||||||
baseImgPath: baseImgPath,
|
baseImgPath: baseImgPath,
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
if (FormUtils.hasValue(signs, 'CONFESS'))
|
|
||||||
ConfirmWithSignWidget(
|
ConfirmWithSignWidget(
|
||||||
signs: signs,
|
signs: signs,
|
||||||
pd: pd,
|
pd: pd,
|
||||||
|
|
@ -113,7 +114,6 @@ class SpecialWorkFormBaseWork extends StatelessWidget {
|
||||||
headerTitle: '安全交底人意见',
|
headerTitle: '安全交底人意见',
|
||||||
roleTitle: '安全交底人',
|
roleTitle: '安全交底人',
|
||||||
),
|
),
|
||||||
if (FormUtils.hasValue(signs, 'ACCEPT_CONFESS'))
|
|
||||||
ConfirmWithSignWidget(
|
ConfirmWithSignWidget(
|
||||||
signs: signs,
|
signs: signs,
|
||||||
pd: pd,
|
pd: pd,
|
||||||
|
|
@ -123,7 +123,6 @@ class SpecialWorkFormBaseWork extends StatelessWidget {
|
||||||
headerTitle: '接受交底人',
|
headerTitle: '接受交底人',
|
||||||
roleTitle: '',
|
roleTitle: '',
|
||||||
),
|
),
|
||||||
if (FormUtils.hasValue(signs, 'GUARDIAN'))
|
|
||||||
ConfirmWithSignWidget(
|
ConfirmWithSignWidget(
|
||||||
signs: signs,
|
signs: signs,
|
||||||
pd: pd,
|
pd: pd,
|
||||||
|
|
@ -133,7 +132,6 @@ class SpecialWorkFormBaseWork extends StatelessWidget {
|
||||||
headerTitle: '监护人意见',
|
headerTitle: '监护人意见',
|
||||||
roleTitle: '监护人',
|
roleTitle: '监护人',
|
||||||
),
|
),
|
||||||
if (FormUtils.hasValue(signs, 'CONFIRM'))
|
|
||||||
ConfirmWithSignWidget(
|
ConfirmWithSignWidget(
|
||||||
signs: signs,
|
signs: signs,
|
||||||
pd: pd,
|
pd: pd,
|
||||||
|
|
@ -143,7 +141,6 @@ class SpecialWorkFormBaseWork extends StatelessWidget {
|
||||||
headerTitle: '作业负责人意见',
|
headerTitle: '作业负责人意见',
|
||||||
roleTitle: '作业负责人',
|
roleTitle: '作业负责人',
|
||||||
),
|
),
|
||||||
if (FormUtils.hasValue(signs, 'LEADER'))
|
|
||||||
ConfirmWithSignWidget(
|
ConfirmWithSignWidget(
|
||||||
signs: signs,
|
signs: signs,
|
||||||
pd: pd,
|
pd: pd,
|
||||||
|
|
@ -153,7 +150,6 @@ class SpecialWorkFormBaseWork extends StatelessWidget {
|
||||||
headerTitle: '所在单位意见',
|
headerTitle: '所在单位意见',
|
||||||
roleTitle: '所在单位负责人',
|
roleTitle: '所在单位负责人',
|
||||||
),
|
),
|
||||||
if (FormUtils.hasValue(signs, 'AUDIT'))
|
|
||||||
ConfirmWithSignWidget(
|
ConfirmWithSignWidget(
|
||||||
signs: signs,
|
signs: signs,
|
||||||
pd: pd,
|
pd: pd,
|
||||||
|
|
@ -163,7 +159,6 @@ class SpecialWorkFormBaseWork extends StatelessWidget {
|
||||||
headerTitle: '安全管理部门意见',
|
headerTitle: '安全管理部门意见',
|
||||||
roleTitle: '安全管理部门',
|
roleTitle: '安全管理部门',
|
||||||
),
|
),
|
||||||
if (FormUtils.hasValue(signs, 'APPROVE'))
|
|
||||||
ConfirmWithSignWidget(
|
ConfirmWithSignWidget(
|
||||||
signs: signs,
|
signs: signs,
|
||||||
pd: pd,
|
pd: pd,
|
||||||
|
|
@ -181,7 +176,6 @@ class SpecialWorkFormBaseWork extends StatelessWidget {
|
||||||
// // 作业开始负责人签字
|
// // 作业开始负责人签字
|
||||||
// if (FormUtils.hasValue(signs, 'WORK_START'))
|
// if (FormUtils.hasValue(signs, 'WORK_START'))
|
||||||
// signItemWidget('WORK_START', 'WORK_START_USER_NAME', '作业开始负责人', context),
|
// signItemWidget('WORK_START', 'WORK_START_USER_NAME', '作业开始负责人', context),
|
||||||
if (FormUtils.hasValue(signs, 'MONITOR'))
|
|
||||||
ConfirmWithSignWidget(
|
ConfirmWithSignWidget(
|
||||||
signs: signs,
|
signs: signs,
|
||||||
pd: pd,
|
pd: pd,
|
||||||
|
|
@ -191,7 +185,7 @@ class SpecialWorkFormBaseWork extends StatelessWidget {
|
||||||
headerTitle: '动火前,岗位当班班长验票情况',
|
headerTitle: '动火前,岗位当班班长验票情况',
|
||||||
roleTitle: '动火前,岗位当班班长验票情况',
|
roleTitle: '动火前,岗位当班班长验票情况',
|
||||||
),
|
),
|
||||||
if (FormUtils.hasValue(signs, 'ACCEPT'))
|
|
||||||
ConfirmWithSignWidget(
|
ConfirmWithSignWidget(
|
||||||
signs: signs,
|
signs: signs,
|
||||||
pd: pd,
|
pd: pd,
|
||||||
|
|
@ -201,6 +195,7 @@ class SpecialWorkFormBaseWork extends StatelessWidget {
|
||||||
headerTitle: '验收部门负责人意见',
|
headerTitle: '验收部门负责人意见',
|
||||||
roleTitle: '验收部门负责人',
|
roleTitle: '验收部门负责人',
|
||||||
),
|
),
|
||||||
|
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -287,8 +287,10 @@ class _HotWorkListPageState extends State<HotWorkListPage> {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
LoadingDialogHelper.show();
|
LoadingDialogHelper.show();
|
||||||
|
setState(() {
|
||||||
_fetchSteps();
|
_fetchSteps();
|
||||||
_fetchData();
|
_fetchData();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
Widget _buildFlowStepItem({
|
Widget _buildFlowStepItem({
|
||||||
|
|
|
||||||
|
|
@ -58,7 +58,6 @@ class _HotworkSetSafeDetailState extends State<HotworkSetSafeDetail> {
|
||||||
return jsonEncode(jsonList);
|
return jsonEncode(jsonList);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Widget _chooseItem(MeasureItem item) {
|
Widget _chooseItem(MeasureItem item) {
|
||||||
return Column(
|
return Column(
|
||||||
children: [
|
children: [
|
||||||
|
|
|
||||||
|
|
@ -14,8 +14,6 @@ import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/MeasuresListW
|
||||||
/// 通用断路作业明细表单组件(支持编辑/只读)
|
/// 通用断路作业明细表单组件(支持编辑/只读)
|
||||||
class CutroadDetailFormWidget extends StatefulWidget {
|
class CutroadDetailFormWidget extends StatefulWidget {
|
||||||
final Map<String, dynamic> pd;
|
final Map<String, dynamic> pd;
|
||||||
final Map<String, dynamic> signs;
|
|
||||||
|
|
||||||
final bool isEditable;
|
final bool isEditable;
|
||||||
final VoidCallback onChooseLevel;
|
final VoidCallback onChooseLevel;
|
||||||
|
|
||||||
|
|
@ -38,11 +36,12 @@ class CutroadDetailFormWidget extends StatefulWidget {
|
||||||
/// 作业地点经纬度
|
/// 作业地点经纬度
|
||||||
final VoidCallback? onWorkAreaLocationHandle;
|
final VoidCallback? onWorkAreaLocationHandle;
|
||||||
|
|
||||||
|
/// 其他签字数据
|
||||||
|
final signs;
|
||||||
|
|
||||||
const CutroadDetailFormWidget({
|
const CutroadDetailFormWidget({
|
||||||
Key? key,
|
Key? key,
|
||||||
required this.pd,
|
required this.pd,
|
||||||
required this.signs,
|
|
||||||
|
|
||||||
required this.isEditable,
|
required this.isEditable,
|
||||||
required this.onChooseLevel,
|
required this.onChooseLevel,
|
||||||
|
|
||||||
|
|
@ -56,6 +55,7 @@ class CutroadDetailFormWidget extends StatefulWidget {
|
||||||
this.contentController,
|
this.contentController,
|
||||||
this.relatedController,
|
this.relatedController,
|
||||||
this.riskController,
|
this.riskController,
|
||||||
|
this.signs = null,
|
||||||
}) : assert(
|
}) : assert(
|
||||||
!isEditable ||
|
!isEditable ||
|
||||||
(unitController != null &&
|
(unitController != null &&
|
||||||
|
|
@ -83,6 +83,178 @@ class _CutroadDetailFormWidgetState extends State<CutroadDetailFormWidget> {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Widget signItemWidget(
|
||||||
|
String signKey,
|
||||||
|
BuildContext context,
|
||||||
|
) {
|
||||||
|
return _itemContainer(
|
||||||
|
Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
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.fill,
|
||||||
|
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.fill,
|
||||||
|
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
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
if (FormUtils.hasValue(widget.pd, 'LATITUDE')) {
|
if (FormUtils.hasValue(widget.pd, 'LATITUDE')) {
|
||||||
|
|
@ -90,7 +262,6 @@ class _CutroadDetailFormWidgetState extends State<CutroadDetailFormWidget> {
|
||||||
'${widget.pd['LATITUDE']},${widget.pd['LONGITUDE']}'; //参数map
|
'${widget.pd['LATITUDE']},${widget.pd['LONGITUDE']}'; //参数map
|
||||||
}
|
}
|
||||||
final pd = widget.pd;
|
final pd = widget.pd;
|
||||||
final signs = widget.signs;
|
|
||||||
|
|
||||||
return Container(
|
return Container(
|
||||||
padding: const EdgeInsets.symmetric(vertical: 10),
|
padding: const EdgeInsets.symmetric(vertical: 10),
|
||||||
|
|
@ -128,16 +299,10 @@ class _CutroadDetailFormWidgetState extends State<CutroadDetailFormWidget> {
|
||||||
text: pd['CONFIRM_DEPARTMENT_NAME'] ?? '',
|
text: pd['CONFIRM_DEPARTMENT_NAME'] ?? '',
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
if (FormUtils.hasValue(pd, 'CONFIRM_USER_NAME') &&
|
if (FormUtils.hasValue(pd, 'CONFIRM_USER_NAME')&& !widget.isEditable) ...[
|
||||||
!widget.isEditable) ...[
|
|
||||||
const Divider(),
|
const Divider(),
|
||||||
// ItemListWidget.OneRowImageTitle(label: '作业负责人', imgPatlabel: '作业负责人', imgPath: imgPathh: imgPath)
|
// ItemListWidget.OneRowImageTitle(label: '作业负责人', imgPatlabel: '作业负责人', imgPath: imgPathh: imgPath)
|
||||||
SignRowImageTitle(
|
SignRowImageTitle(label: '作业负责人:', signKey: 'CONFIRM', signs: widget.signs, text: pd['CONFIRM_USER_NAME']??'',),
|
||||||
label: '作业负责人:',
|
|
||||||
signKey: 'CONFIRM',
|
|
||||||
signs: widget.signs,
|
|
||||||
text: pd['CONFIRM_USER_NAME'] ?? '',
|
|
||||||
),
|
|
||||||
],
|
],
|
||||||
const Divider(),
|
const Divider(),
|
||||||
ItemListWidget.singleLineTitleText(
|
ItemListWidget.singleLineTitleText(
|
||||||
|
|
@ -147,16 +312,10 @@ class _CutroadDetailFormWidgetState extends State<CutroadDetailFormWidget> {
|
||||||
controller: widget.unitController,
|
controller: widget.unitController,
|
||||||
text: pd['OTHER_DEPT'] ?? '',
|
text: pd['OTHER_DEPT'] ?? '',
|
||||||
),
|
),
|
||||||
if (FormUtils.hasValue(pd, 'CONFIRM_USER_NAME') &&
|
if (FormUtils.hasValue(pd, 'CONFIRM_USER_NAME')&& !widget.isEditable) ...[
|
||||||
!widget.isEditable) ...[
|
|
||||||
const Divider(),
|
const Divider(),
|
||||||
// ItemListWidget.OneRowImageTitle(label: '作业负责人', imgPath: imgPath)
|
// ItemListWidget.OneRowImageTitle(label: '作业负责人', imgPath: imgPath)
|
||||||
SignRowImageTitle(
|
SignRowImageTitle(label: '监护人:', signKey: 'GUARDIAN', signs: widget.signs, text: pd['GUARDIAN_USER_NAME']??'',),
|
||||||
label: '监护人:',
|
|
||||||
signKey: 'GUARDIAN',
|
|
||||||
signs: widget.signs,
|
|
||||||
text: pd['GUARDIAN_USER_NAME'] ?? '',
|
|
||||||
),
|
|
||||||
],
|
],
|
||||||
const Divider(),
|
const Divider(),
|
||||||
ItemListWidget.multiLineTitleTextField(
|
ItemListWidget.multiLineTitleTextField(
|
||||||
|
|
@ -193,21 +352,17 @@ class _CutroadDetailFormWidgetState extends State<CutroadDetailFormWidget> {
|
||||||
text: pd['SPECIAL_WORK'] ?? '',
|
text: pd['SPECIAL_WORK'] ?? '',
|
||||||
),
|
),
|
||||||
const Divider(),
|
const Divider(),
|
||||||
if (FormUtils.hasValue(signs, 'PROJECT_MANAGER') &&
|
|
||||||
!widget.isEditable) ...[
|
|
||||||
ConfirmWithSignWidget(
|
ConfirmWithSignWidget(
|
||||||
signs: signs,
|
signs: widget.signs,
|
||||||
pd: pd,
|
pd: pd,
|
||||||
baseImgPath: ApiService.baseImgPath,
|
baseImgPath: ApiService.baseImgPath,
|
||||||
sectionKey: 'PROJECT_MANAGER',
|
sectionKey: 'GUARDIAN',
|
||||||
nameKey: 'WORK_CONTENT',
|
nameKey: 'WORK_CONTENT',
|
||||||
headerTitle: '断路地段示意图(可另附图)及相关说明',
|
headerTitle: '断路地段示意图(可另附图)及相关说明',
|
||||||
imgsKey: 'CONTENT_IMG_PATH',
|
imgsKey: 'CONTENT_IMG_PATH',
|
||||||
contentKey: 'WORK_CONTENT',
|
contentKey: 'WORK_CONTENT',
|
||||||
roleTitle: '',
|
roleTitle: '',
|
||||||
),
|
),
|
||||||
const Divider(),
|
|
||||||
],
|
|
||||||
|
|
||||||
ItemListWidget.twoRowButtonTitleText(
|
ItemListWidget.twoRowButtonTitleText(
|
||||||
label: '风险辨识结果',
|
label: '风险辨识结果',
|
||||||
|
|
|
||||||
|
|
@ -66,7 +66,9 @@ class CutroadFormBaseWork extends StatelessWidget {
|
||||||
padding: const EdgeInsets.symmetric(vertical: 5, horizontal: 10),
|
padding: const EdgeInsets.symmetric(vertical: 5, horizontal: 10),
|
||||||
child: Row(
|
child: Row(
|
||||||
children: [
|
children: [
|
||||||
Expanded(child: ListItemFactory.headerTitle('$name')),
|
Expanded(
|
||||||
|
child: ListItemFactory.headerTitle('$name'),
|
||||||
|
),
|
||||||
if (FormUtils.hasValue(pd, nameKey))
|
if (FormUtils.hasValue(pd, nameKey))
|
||||||
Text(
|
Text(
|
||||||
pd[nameKey]?.toString() ?? '',
|
pd[nameKey]?.toString() ?? '',
|
||||||
|
|
@ -83,10 +85,7 @@ class CutroadFormBaseWork extends StatelessWidget {
|
||||||
.map((item) {
|
.map((item) {
|
||||||
// 解析 SIGN_PATH
|
// 解析 SIGN_PATH
|
||||||
List<String> signPaths = [];
|
List<String> signPaths = [];
|
||||||
final rawSP =
|
final rawSP = FormUtils.hasValue(item, 'SIGN_PATH') ? item['SIGN_PATH'] : null;
|
||||||
FormUtils.hasValue(item, 'SIGN_PATH')
|
|
||||||
? item['SIGN_PATH']
|
|
||||||
: null;
|
|
||||||
if (rawSP is String && rawSP.isNotEmpty) {
|
if (rawSP is String && rawSP.isNotEmpty) {
|
||||||
signPaths = rawSP.split(',').map((s) => s.trim()).toList();
|
signPaths = rawSP.split(',').map((s) => s.trim()).toList();
|
||||||
} else if (rawSP is List) {
|
} else if (rawSP is List) {
|
||||||
|
|
@ -95,57 +94,40 @@ class CutroadFormBaseWork extends StatelessWidget {
|
||||||
|
|
||||||
// 解析 SIGN_TIME 保留空格
|
// 解析 SIGN_TIME 保留空格
|
||||||
List<String> signTimes = [];
|
List<String> signTimes = [];
|
||||||
final rawST =
|
final rawST = FormUtils.hasValue(item, 'SIGN_TIME') ? item['SIGN_TIME'] : null;
|
||||||
FormUtils.hasValue(item, 'SIGN_TIME')
|
|
||||||
? item['SIGN_TIME']
|
|
||||||
: null;
|
|
||||||
if (rawST is String && rawST.isNotEmpty) {
|
if (rawST is String && rawST.isNotEmpty) {
|
||||||
signTimes = rawST.split(',');
|
signTimes = rawST.split(',');
|
||||||
} else if (rawST is List) {
|
} else if (rawST is List) {
|
||||||
signTimes = rawST.cast<String>();
|
signTimes = rawST.cast<String>();
|
||||||
}
|
}
|
||||||
|
|
||||||
final pairCount = math.min(
|
final pairCount = math.min(signPaths.length, signTimes.length);
|
||||||
signPaths.length,
|
|
||||||
signTimes.length,
|
|
||||||
);
|
|
||||||
|
|
||||||
// 解析 IMG_PATH, 最多 2 张
|
// 解析 IMG_PATH, 最多 2 张
|
||||||
List<String> imgPaths = [];
|
List<String> imgPaths = [];
|
||||||
final rawIP =
|
final rawIP = FormUtils.hasValue(item, 'IMG_PATH') ? item['IMG_PATH'] : null;
|
||||||
FormUtils.hasValue(item, 'IMG_PATH')
|
|
||||||
? item['IMG_PATH']
|
|
||||||
: null;
|
|
||||||
if (rawIP is String && rawIP.isNotEmpty) {
|
if (rawIP is String && rawIP.isNotEmpty) {
|
||||||
imgPaths =
|
imgPaths = rawIP.split(',').map((s) => s.trim()).take(2).toList();
|
||||||
rawIP.split(',').map((s) => s.trim()).take(2).toList();
|
|
||||||
} else if (rawIP is List) {
|
} else if (rawIP is List) {
|
||||||
imgPaths = rawIP.cast<String>().take(2).toList();
|
imgPaths = rawIP.cast<String>().take(2).toList();
|
||||||
}
|
}
|
||||||
|
|
||||||
return Padding(
|
return Padding(
|
||||||
padding: const EdgeInsets.symmetric(
|
padding: const EdgeInsets.symmetric(vertical: 8.0, horizontal: 10),
|
||||||
vertical: 8.0,
|
|
||||||
horizontal: 10,
|
|
||||||
),
|
|
||||||
child: Column(
|
child: Column(
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
children: [
|
children: [
|
||||||
if (imgPaths.isNotEmpty) ...[
|
if (imgPaths.isNotEmpty) ...[
|
||||||
Row(
|
Row(
|
||||||
children:
|
children: imgPaths.map((p) {
|
||||||
imgPaths.map((p) {
|
|
||||||
final fullUrl = '$baseImgPath$p';
|
final fullUrl = '$baseImgPath$p';
|
||||||
return GestureDetector(
|
return GestureDetector(
|
||||||
onTap:
|
onTap: () => presentOpaque(
|
||||||
() => presentOpaque(
|
|
||||||
SingleImageViewer(imageUrl: fullUrl),
|
SingleImageViewer(imageUrl: fullUrl),
|
||||||
context,
|
context,
|
||||||
),
|
),
|
||||||
child: Padding(
|
child: Padding(
|
||||||
padding: const EdgeInsets.only(
|
padding: const EdgeInsets.only(right: 8.0),
|
||||||
right: 8.0,
|
|
||||||
),
|
|
||||||
child: ClipRRect(
|
child: ClipRRect(
|
||||||
borderRadius: BorderRadius.circular(2),
|
borderRadius: BorderRadius.circular(2),
|
||||||
child: Image.network(
|
child: Image.network(
|
||||||
|
|
@ -153,8 +135,7 @@ class CutroadFormBaseWork extends StatelessWidget {
|
||||||
width: 50,
|
width: 50,
|
||||||
height: 50,
|
height: 50,
|
||||||
fit: BoxFit.fill,
|
fit: BoxFit.fill,
|
||||||
errorBuilder:
|
errorBuilder: (_, __, ___) => const Icon(
|
||||||
(_, __, ___) => const Icon(
|
|
||||||
Icons.broken_image,
|
Icons.broken_image,
|
||||||
size: 40,
|
size: 40,
|
||||||
),
|
),
|
||||||
|
|
@ -183,11 +164,8 @@ class CutroadFormBaseWork extends StatelessWidget {
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
children: [
|
children: [
|
||||||
GestureDetector(
|
GestureDetector(
|
||||||
onTap:
|
onTap: () => presentOpaque(
|
||||||
() => presentOpaque(
|
SingleImageViewer(imageUrl: fullUrl),
|
||||||
SingleImageViewer(
|
|
||||||
imageUrl: fullUrl,
|
|
||||||
),
|
|
||||||
context,
|
context,
|
||||||
),
|
),
|
||||||
child: ClipRRect(
|
child: ClipRRect(
|
||||||
|
|
@ -197,11 +175,8 @@ class CutroadFormBaseWork extends StatelessWidget {
|
||||||
width: imageWidth,
|
width: imageWidth,
|
||||||
height: imageHeight,
|
height: imageHeight,
|
||||||
fit: BoxFit.fill,
|
fit: BoxFit.fill,
|
||||||
errorBuilder:
|
errorBuilder: (_, __, ___) =>
|
||||||
(_, __, ___) => const Icon(
|
const Icon(Icons.broken_image, size: 60),
|
||||||
Icons.broken_image,
|
|
||||||
size: 60,
|
|
||||||
),
|
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
@ -235,8 +210,7 @@ class CutroadFormBaseWork extends StatelessWidget {
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
})
|
}).toList()),
|
||||||
.toList()),
|
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
@ -287,7 +261,6 @@ class CutroadFormBaseWork extends StatelessWidget {
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
if (FormUtils.hasValue(signs, 'CONFESS'))
|
|
||||||
ConfirmWithSignWidget(
|
ConfirmWithSignWidget(
|
||||||
signs: signs,
|
signs: signs,
|
||||||
pd: pd,
|
pd: pd,
|
||||||
|
|
@ -297,7 +270,6 @@ class CutroadFormBaseWork extends StatelessWidget {
|
||||||
headerTitle: '安全交底人',
|
headerTitle: '安全交底人',
|
||||||
roleTitle: '安全交底人',
|
roleTitle: '安全交底人',
|
||||||
),
|
),
|
||||||
if (FormUtils.hasValue(signs, 'ACCEPT_CONFESS'))
|
|
||||||
ConfirmWithSignWidget(
|
ConfirmWithSignWidget(
|
||||||
signs: signs,
|
signs: signs,
|
||||||
pd: pd,
|
pd: pd,
|
||||||
|
|
@ -307,7 +279,6 @@ class CutroadFormBaseWork extends StatelessWidget {
|
||||||
headerTitle: '接受交底人',
|
headerTitle: '接受交底人',
|
||||||
roleTitle: '',
|
roleTitle: '',
|
||||||
),
|
),
|
||||||
if (FormUtils.hasValue(signs, 'CONFIRM'))
|
|
||||||
ConfirmWithSignWidget(
|
ConfirmWithSignWidget(
|
||||||
signs: signs,
|
signs: signs,
|
||||||
pd: pd,
|
pd: pd,
|
||||||
|
|
@ -317,7 +288,6 @@ class CutroadFormBaseWork extends StatelessWidget {
|
||||||
headerTitle: '作业负责人意见',
|
headerTitle: '作业负责人意见',
|
||||||
roleTitle: '作业负责人',
|
roleTitle: '作业负责人',
|
||||||
),
|
),
|
||||||
if (FormUtils.hasValue(signs, 'LEADER'))
|
|
||||||
ConfirmWithSignWidget(
|
ConfirmWithSignWidget(
|
||||||
signs: signs,
|
signs: signs,
|
||||||
pd: pd,
|
pd: pd,
|
||||||
|
|
@ -327,7 +297,6 @@ class CutroadFormBaseWork extends StatelessWidget {
|
||||||
headerTitle: '所在单位负责人意见',
|
headerTitle: '所在单位负责人意见',
|
||||||
roleTitle: '所在单位负责人',
|
roleTitle: '所在单位负责人',
|
||||||
),
|
),
|
||||||
if (FormUtils.hasValue(signs, 'AUDIT'))
|
|
||||||
ConfirmWithSignWidget(
|
ConfirmWithSignWidget(
|
||||||
signs: signs,
|
signs: signs,
|
||||||
pd: pd,
|
pd: pd,
|
||||||
|
|
@ -337,7 +306,6 @@ class CutroadFormBaseWork extends StatelessWidget {
|
||||||
headerTitle: '消防、安全管理部门负责人意见',
|
headerTitle: '消防、安全管理部门负责人意见',
|
||||||
roleTitle: '消防、安全管理部门负责人',
|
roleTitle: '消防、安全管理部门负责人',
|
||||||
),
|
),
|
||||||
if (FormUtils.hasValue(signs, 'APPROVE'))
|
|
||||||
ConfirmWithSignWidget(
|
ConfirmWithSignWidget(
|
||||||
signs: signs,
|
signs: signs,
|
||||||
pd: pd,
|
pd: pd,
|
||||||
|
|
@ -347,7 +315,7 @@ class CutroadFormBaseWork extends StatelessWidget {
|
||||||
headerTitle: '审批部门负责人意见',
|
headerTitle: '审批部门负责人意见',
|
||||||
roleTitle: '审批部门负责人',
|
roleTitle: '审批部门负责人',
|
||||||
),
|
),
|
||||||
if (FormUtils.hasValue(signs, 'ACCEPT'))
|
|
||||||
ConfirmWithSignWidget(
|
ConfirmWithSignWidget(
|
||||||
signs: signs,
|
signs: signs,
|
||||||
pd: pd,
|
pd: pd,
|
||||||
|
|
@ -357,6 +325,7 @@ class CutroadFormBaseWork extends StatelessWidget {
|
||||||
headerTitle: '验收部门负责人意见',
|
headerTitle: '验收部门负责人意见',
|
||||||
roleTitle: '验收部门负责人',
|
roleTitle: '验收部门负责人',
|
||||||
),
|
),
|
||||||
|
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -36,6 +36,9 @@ class CutroadSafeFuncSure extends StatefulWidget {
|
||||||
class _CutroadSafeFuncSureState extends State<CutroadSafeFuncSure> {
|
class _CutroadSafeFuncSureState extends State<CutroadSafeFuncSure> {
|
||||||
late bool isEditable = false;
|
late bool isEditable = false;
|
||||||
|
|
||||||
|
/// 详情
|
||||||
|
late Map<String, dynamic> pd = {};
|
||||||
|
late List<Map<String, dynamic>> measuresList = [];
|
||||||
/// 其他安全措施
|
/// 其他安全措施
|
||||||
final TextEditingController _otherController = TextEditingController();
|
final TextEditingController _otherController = TextEditingController();
|
||||||
|
|
||||||
|
|
@ -50,70 +53,7 @@ class _CutroadSafeFuncSureState extends State<CutroadSafeFuncSure> {
|
||||||
_getData();
|
_getData();
|
||||||
|
|
||||||
}
|
}
|
||||||
late Map<String, dynamic> pd = {};
|
|
||||||
late Map<String, dynamic> signs = {};
|
|
||||||
late List<Map<String, dynamic>> measuresList = [];
|
|
||||||
|
|
||||||
/// 初始化拉取数据(并行获取 pd / signs / measures,最后一次 setState)
|
|
||||||
Future<void> _getData() async {
|
|
||||||
LoadingDialogHelper.show();
|
|
||||||
|
|
||||||
try {
|
|
||||||
// 并行发起三个请求,并在出错时返回安全的默认值(避免 Future.wait 因一个失败而中断)
|
|
||||||
final futurePd = ApiService.getHomeworkFindById('cutroad', widget.CUTROAD_ID)
|
|
||||||
.catchError((e) {
|
|
||||||
// 可加入日志记录 e
|
|
||||||
return <String, dynamic>{}; // 回退为空 map
|
|
||||||
});
|
|
||||||
|
|
||||||
final futureSigns = ApiService.listSignFinished('cutroad', widget.CUTROAD_ID)
|
|
||||||
.catchError((e) {
|
|
||||||
return <String, dynamic>{'signs': <String, dynamic>{}};
|
|
||||||
});
|
|
||||||
|
|
||||||
final futureMeasures = ApiService.listSignFinishAllMeasures('cutroad')
|
|
||||||
.catchError((e) {
|
|
||||||
return <String, dynamic>{'measuresList': <Map<String, dynamic>>[]};
|
|
||||||
});
|
|
||||||
|
|
||||||
final results = await Future.wait([futurePd, futureSigns, futureMeasures]);
|
|
||||||
|
|
||||||
final pdResult = results[0] as Map<String, dynamic>? ?? <String, dynamic>{};
|
|
||||||
final signsResult = results[1] as Map<String, dynamic>? ?? <String, dynamic>{};
|
|
||||||
final measuresResult = results[2] as Map<String, dynamic>? ?? <String, dynamic>{};
|
|
||||||
|
|
||||||
// 从各自的结果里提取需要的字段,使用默认值以防字段缺失或类型不对
|
|
||||||
final newPd = (pdResult['pd'] is Map<String, dynamic>)
|
|
||||||
? Map<String, dynamic>.from(pdResult['pd'])
|
|
||||||
: <String, dynamic>{};
|
|
||||||
|
|
||||||
final newSigns = (signsResult['signs'] is Map<String, dynamic>)
|
|
||||||
? Map<String, dynamic>.from(signsResult['signs'])
|
|
||||||
: <String, dynamic>{};
|
|
||||||
|
|
||||||
final newMeasuresList = <Map<String, dynamic>>[];
|
|
||||||
final rawMeasures = measuresResult['measuresList'];
|
|
||||||
if (rawMeasures is List) {
|
|
||||||
for (final m in rawMeasures) {
|
|
||||||
if (m is Map) {
|
|
||||||
newMeasuresList.add(Map<String, dynamic>.from(m));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!mounted) return;
|
|
||||||
|
|
||||||
setState(() {
|
|
||||||
pd = newPd;
|
|
||||||
signs = newSigns;
|
|
||||||
measuresList = newMeasuresList;
|
|
||||||
});
|
|
||||||
} catch (e, st) {
|
|
||||||
debugPrint('[_getData] 未捕获异常: $e\n$st');
|
|
||||||
} finally {
|
|
||||||
LoadingDialogHelper.hide();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/// 弹出单位选择
|
/// 弹出单位选择
|
||||||
void chooseUnitHandle(MeasureItem item) {
|
void chooseUnitHandle(MeasureItem item) {
|
||||||
showModalBottomSheet(
|
showModalBottomSheet(
|
||||||
|
|
@ -325,6 +265,27 @@ if (path != null) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/// 初始化拉取数据
|
||||||
|
Future<void> _getData() async {
|
||||||
|
final data = await ApiService.getHomeworkFindById('cutroad', widget.CUTROAD_ID);
|
||||||
|
setState(() {
|
||||||
|
pd = data['pd'];
|
||||||
|
_getMeasures();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> _getMeasures() async {
|
||||||
|
final data = await ApiService.listSignSureAllMeasures('cutroad',widget.CUTROAD_ID);
|
||||||
|
setState(() {
|
||||||
|
measuresList = List<Map<String, dynamic>>.from(
|
||||||
|
data['measuresForSignList'] ?? <Map<String, dynamic>>[],
|
||||||
|
);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
Future<void> _itemToSign(Map<String, dynamic> measures, int index) async {
|
Future<void> _itemToSign(Map<String, dynamic> measures, int index) async {
|
||||||
// 签名图片列表
|
// 签名图片列表
|
||||||
final List<Map<String, dynamic>> signImgList = measures['SIGN_ITEM'] ?? [];
|
final List<Map<String, dynamic>> signImgList = measures['SIGN_ITEM'] ?? [];
|
||||||
|
|
@ -475,7 +436,6 @@ if (path != null) {
|
||||||
pd: pd,
|
pd: pd,
|
||||||
isEditable: false,
|
isEditable: false,
|
||||||
onChooseLevel: () {},
|
onChooseLevel: () {},
|
||||||
signs: signs,
|
|
||||||
),
|
),
|
||||||
SizedBox(height: 20),
|
SizedBox(height: 20),
|
||||||
_setSafeDetailWidget(),
|
_setSafeDetailWidget(),
|
||||||
|
|
|
||||||
|
|
@ -230,9 +230,14 @@ class _CutroadListPageState extends State<CutroadListPage> {
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
LoadingDialogHelper.show();
|
setState(() {
|
||||||
_fetchSteps();
|
_fetchSteps();
|
||||||
_fetchData();
|
});
|
||||||
|
// Navigator.pushNamed(
|
||||||
|
// context,
|
||||||
|
// routeName,
|
||||||
|
// arguments: {'CUTROAD_ID': item['CUTROAD_ID'], 'flow': widget.flow},
|
||||||
|
// );
|
||||||
}
|
}
|
||||||
|
|
||||||
Widget _buildFlowStepItem({
|
Widget _buildFlowStepItem({
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,6 @@ import 'package:qhd_prevention/customWidget/custom_alert_dialog.dart';
|
||||||
import 'package:qhd_prevention/customWidget/single_image_viewer.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/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/dh_work/szaq_work_detail/SafeFunctionDialog.dart';
|
||||||
|
|
||||||
/// 设置安全措施确认人
|
/// 设置安全措施确认人
|
||||||
class CutroadSetSafeDetail extends StatefulWidget {
|
class CutroadSetSafeDetail extends StatefulWidget {
|
||||||
const CutroadSetSafeDetail({
|
const CutroadSetSafeDetail({
|
||||||
|
|
@ -36,6 +35,10 @@ class CutroadSetSafeDetail extends StatefulWidget {
|
||||||
class _CutroadSetSafeDetailState extends State<CutroadSetSafeDetail> {
|
class _CutroadSetSafeDetailState extends State<CutroadSetSafeDetail> {
|
||||||
late bool isEditable = false;
|
late bool isEditable = false;
|
||||||
|
|
||||||
|
/// 详情
|
||||||
|
late Map<String, dynamic> pd = {};
|
||||||
|
late List<Map<String, dynamic>> measuresList = [];
|
||||||
|
|
||||||
/// 安全防护措施列表
|
/// 安全防护措施列表
|
||||||
late List<MeasureItem> measuresListCopy = [];
|
late List<MeasureItem> measuresListCopy = [];
|
||||||
List<String> imagePaths = [];
|
List<String> imagePaths = [];
|
||||||
|
|
@ -46,70 +49,6 @@ class _CutroadSetSafeDetailState extends State<CutroadSetSafeDetail> {
|
||||||
_getData();
|
_getData();
|
||||||
addMeasuresListCopy();
|
addMeasuresListCopy();
|
||||||
}
|
}
|
||||||
late Map<String, dynamic> pd = {};
|
|
||||||
late Map<String, dynamic> signs = {};
|
|
||||||
late List<Map<String, dynamic>> measuresList = [];
|
|
||||||
|
|
||||||
/// 初始化拉取数据(并行获取 pd / signs / measures,最后一次 setState)
|
|
||||||
Future<void> _getData() async {
|
|
||||||
LoadingDialogHelper.show();
|
|
||||||
|
|
||||||
try {
|
|
||||||
// 并行发起三个请求,并在出错时返回安全的默认值(避免 Future.wait 因一个失败而中断)
|
|
||||||
final futurePd = ApiService.getHomeworkFindById('cutroad', widget.CUTROAD_ID)
|
|
||||||
.catchError((e) {
|
|
||||||
// 可加入日志记录 e
|
|
||||||
return <String, dynamic>{}; // 回退为空 map
|
|
||||||
});
|
|
||||||
|
|
||||||
final futureSigns = ApiService.listSignFinished('cutroad', widget.CUTROAD_ID)
|
|
||||||
.catchError((e) {
|
|
||||||
return <String, dynamic>{'signs': <String, dynamic>{}};
|
|
||||||
});
|
|
||||||
|
|
||||||
final futureMeasures = ApiService.listSignFinishAllMeasures('cutroad')
|
|
||||||
.catchError((e) {
|
|
||||||
return <String, dynamic>{'measuresList': <Map<String, dynamic>>[]};
|
|
||||||
});
|
|
||||||
|
|
||||||
final results = await Future.wait([futurePd, futureSigns, futureMeasures]);
|
|
||||||
|
|
||||||
final pdResult = results[0] as Map<String, dynamic>? ?? <String, dynamic>{};
|
|
||||||
final signsResult = results[1] as Map<String, dynamic>? ?? <String, dynamic>{};
|
|
||||||
final measuresResult = results[2] as Map<String, dynamic>? ?? <String, dynamic>{};
|
|
||||||
|
|
||||||
// 从各自的结果里提取需要的字段,使用默认值以防字段缺失或类型不对
|
|
||||||
final newPd = (pdResult['pd'] is Map<String, dynamic>)
|
|
||||||
? Map<String, dynamic>.from(pdResult['pd'])
|
|
||||||
: <String, dynamic>{};
|
|
||||||
|
|
||||||
final newSigns = (signsResult['signs'] is Map<String, dynamic>)
|
|
||||||
? Map<String, dynamic>.from(signsResult['signs'])
|
|
||||||
: <String, dynamic>{};
|
|
||||||
|
|
||||||
final newMeasuresList = <Map<String, dynamic>>[];
|
|
||||||
final rawMeasures = measuresResult['measuresList'];
|
|
||||||
if (rawMeasures is List) {
|
|
||||||
for (final m in rawMeasures) {
|
|
||||||
if (m is Map) {
|
|
||||||
newMeasuresList.add(Map<String, dynamic>.from(m));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!mounted) return;
|
|
||||||
|
|
||||||
setState(() {
|
|
||||||
pd = newPd;
|
|
||||||
signs = newSigns;
|
|
||||||
measuresList = newMeasuresList;
|
|
||||||
});
|
|
||||||
} catch (e, st) {
|
|
||||||
debugPrint('[_getData] 未捕获异常: $e\n$st');
|
|
||||||
} finally {
|
|
||||||
LoadingDialogHelper.hide();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
String measuresListToJson() {
|
String measuresListToJson() {
|
||||||
final List<Map<String, dynamic>> jsonList =
|
final List<Map<String, dynamic>> jsonList =
|
||||||
|
|
@ -117,6 +56,8 @@ class _CutroadSetSafeDetailState extends State<CutroadSetSafeDetail> {
|
||||||
return jsonEncode(jsonList);
|
return jsonEncode(jsonList);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Widget _chooseItem(MeasureItem item) {
|
Widget _chooseItem(MeasureItem item) {
|
||||||
return Column(
|
return Column(
|
||||||
children: [
|
children: [
|
||||||
|
|
@ -308,11 +249,17 @@ class _CutroadSetSafeDetailState extends State<CutroadSetSafeDetail> {
|
||||||
int index = 0;
|
int index = 0;
|
||||||
for (var item in measuresListCopy) {
|
for (var item in measuresListCopy) {
|
||||||
if (item.USER_ID.isEmpty) {
|
if (item.USER_ID.isEmpty) {
|
||||||
ToastUtil.showNormal(context, '第${index + 1}项未设置确认人');
|
ToastUtil.showNormal(
|
||||||
|
context,
|
||||||
|
'第${index + 1}项未设置确认人',
|
||||||
|
);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (item.selectMeasures.isEmpty) {
|
if (item.selectMeasures.isEmpty) {
|
||||||
ToastUtil.showNormal(context, '第${index + 1}项未选择安全措施');
|
ToastUtil.showNormal(
|
||||||
|
context,
|
||||||
|
'第${index + 1}项未选择安全措施',
|
||||||
|
);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
final userId = item.USER_ID;
|
final userId = item.USER_ID;
|
||||||
|
|
@ -339,7 +286,7 @@ class _CutroadSetSafeDetailState extends State<CutroadSetSafeDetail> {
|
||||||
title: '作废原因',
|
title: '作废原因',
|
||||||
hintText: '请输入作废原因',
|
hintText: '请输入作废原因',
|
||||||
cancelText: '取消',
|
cancelText: '取消',
|
||||||
confirmText: '确定',
|
confirmText: '确定'
|
||||||
);
|
);
|
||||||
if (reasonText.isEmpty) {
|
if (reasonText.isEmpty) {
|
||||||
ToastUtil.showNormal(context, '请填写作废原因');
|
ToastUtil.showNormal(context, '请填写作废原因');
|
||||||
|
|
@ -374,13 +321,17 @@ class _CutroadSetSafeDetailState extends State<CutroadSetSafeDetail> {
|
||||||
);
|
);
|
||||||
LoadingDialogHelper.hide();
|
LoadingDialogHelper.hide();
|
||||||
if (result['result'] == 'success') {
|
if (result['result'] == 'success') {
|
||||||
ToastUtil.showSuccess(context, '保存成功');
|
ToastUtil.showSuccess(
|
||||||
|
context,
|
||||||
|
'保存成功',
|
||||||
|
);
|
||||||
Navigator.of(context).pop(true);
|
Navigator.of(context).pop(true);
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
LoadingDialogHelper.hide();
|
LoadingDialogHelper.hide();
|
||||||
ToastUtil.showNormal(context, '操作失败:$e');
|
ToastUtil.showNormal(context, '操作失败:$e');
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -391,6 +342,23 @@ class _CutroadSetSafeDetailState extends State<CutroadSetSafeDetail> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// 初始化拉取数据
|
||||||
|
Future<void> _getData() async {
|
||||||
|
final data = await ApiService.getHomeworkFindById('cutroad', widget.CUTROAD_ID);
|
||||||
|
setState(() {
|
||||||
|
pd = data['pd'];
|
||||||
|
_getMeasures();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> _getMeasures() async {
|
||||||
|
final data = await ApiService.listSignFinishAllMeasures('cutroad');
|
||||||
|
setState(() {
|
||||||
|
measuresList = List<Map<String, dynamic>>.from(
|
||||||
|
data['measuresList'] ?? <Map<String, dynamic>>[],
|
||||||
|
);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
void removeMeasuresListCopy(int index) {
|
void removeMeasuresListCopy(int index) {
|
||||||
setState(() {
|
setState(() {
|
||||||
|
|
@ -414,7 +382,6 @@ class _CutroadSetSafeDetailState extends State<CutroadSetSafeDetail> {
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/// 计算当前 item 可选的安全措施
|
/// 计算当前 item 可选的安全措施
|
||||||
List<Map<String, dynamic>> _getAvailableMeasures(MeasureItem current) {
|
List<Map<String, dynamic>> _getAvailableMeasures(MeasureItem current) {
|
||||||
// 把除了 current 之外,已经被选走的措施 ID 全部搜集起来
|
// 把除了 current 之外,已经被选走的措施 ID 全部搜集起来
|
||||||
|
|
@ -426,12 +393,10 @@ class _CutroadSetSafeDetailState extends State<CutroadSetSafeDetail> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// 返回:所有 measuresList 中,ID 不在 usedIds 或者正好属于 current 的那几条
|
// 返回:所有 measuresList 中,ID 不在 usedIds 或者正好属于 current 的那几条
|
||||||
List<Map<String, dynamic>> list =
|
List<Map<String, dynamic>> list = measuresList.where((m) {
|
||||||
measuresList.where((m) {
|
|
||||||
final id = m['BUS_CUTROAD_MEASURES_ID'];
|
final id = m['BUS_CUTROAD_MEASURES_ID'];
|
||||||
final isCurrentSelected = current.selectMeasures.any(
|
final isCurrentSelected = current.selectMeasures
|
||||||
(sm) => sm['BUS_CUTROAD_MEASURES_ID'] == id,
|
.any((sm) => sm['BUS_CUTROAD_MEASURES_ID'] == id);
|
||||||
);
|
|
||||||
return !usedIds.contains(id) || isCurrentSelected;
|
return !usedIds.contains(id) || isCurrentSelected;
|
||||||
}).toList();
|
}).toList();
|
||||||
|
|
||||||
|
|
@ -597,7 +562,6 @@ class _CutroadSetSafeDetailState extends State<CutroadSetSafeDetail> {
|
||||||
pd: pd,
|
pd: pd,
|
||||||
isEditable: false,
|
isEditable: false,
|
||||||
onChooseLevel: (){},
|
onChooseLevel: (){},
|
||||||
signs: signs,
|
|
||||||
),
|
),
|
||||||
SizedBox(height: 20),
|
SizedBox(height: 20),
|
||||||
_setSafeDetailWidget(),
|
_setSafeDetailWidget(),
|
||||||
|
|
|
||||||
|
|
@ -314,9 +314,15 @@ class _BreakgroundListPageState extends State<BreakgroundListPage> {
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
LoadingDialogHelper.show();
|
setState(() {
|
||||||
_fetchSteps();
|
_fetchSteps();
|
||||||
_fetchData();
|
_fetchData();
|
||||||
|
});
|
||||||
|
// Navigator.pushNamed(
|
||||||
|
// context,
|
||||||
|
// routeName,
|
||||||
|
// arguments: {'BREAKGROUND_ID': item['BREAKGROUND_ID'], 'flow': widget.flow},
|
||||||
|
// );
|
||||||
}
|
}
|
||||||
|
|
||||||
Widget _buildFlowStepItem({
|
Widget _buildFlowStepItem({
|
||||||
|
|
|
||||||
|
|
@ -231,9 +231,15 @@ class _HoistworkListPageState extends State<HoistworkListPage> {
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
LoadingDialogHelper.show();
|
setState(() {
|
||||||
_fetchSteps();
|
_fetchSteps();
|
||||||
_fetchData();
|
_fetchData();
|
||||||
|
});
|
||||||
|
// Navigator.pushNamed(
|
||||||
|
// context,
|
||||||
|
// routeName,
|
||||||
|
// arguments: {'HOISTING_ID': item['HOISTING_ID'], 'flow': widget.flow},
|
||||||
|
// );
|
||||||
}
|
}
|
||||||
|
|
||||||
Widget _buildFlowStepItem({
|
Widget _buildFlowStepItem({
|
||||||
|
|
|
||||||
|
|
@ -93,16 +93,6 @@ class _HighWorkDetailFormWidgetState extends State<HighWorkDetailFormWidget> {
|
||||||
),
|
),
|
||||||
const Divider(),
|
const Divider(),
|
||||||
],
|
],
|
||||||
ItemListWidget.singleLineTitleText(
|
|
||||||
label: '作业申请单位:',
|
|
||||||
isEditable: false,
|
|
||||||
text: pd['APPLY_DEPARTMENT_NAME'] ?? '',
|
|
||||||
),
|
|
||||||
ItemListWidget.singleLineTitleText(
|
|
||||||
label: '申请人:',
|
|
||||||
isEditable: false,
|
|
||||||
text: pd['APPLY_USER_NAME'] ?? '',
|
|
||||||
),
|
|
||||||
ItemListWidget.singleLineTitleText(
|
ItemListWidget.singleLineTitleText(
|
||||||
label: '作业地点:',
|
label: '作业地点:',
|
||||||
isEditable: widget.isEditable,
|
isEditable: widget.isEditable,
|
||||||
|
|
|
||||||
|
|
@ -66,7 +66,9 @@ class HighWorkFormBaseWork extends StatelessWidget {
|
||||||
padding: const EdgeInsets.symmetric(vertical: 5, horizontal: 10),
|
padding: const EdgeInsets.symmetric(vertical: 5, horizontal: 10),
|
||||||
child: Row(
|
child: Row(
|
||||||
children: [
|
children: [
|
||||||
Expanded(child: ListItemFactory.headerTitle(name)),
|
Expanded(
|
||||||
|
child: ListItemFactory.headerTitle(name),
|
||||||
|
),
|
||||||
if (FormUtils.hasValue(pd, nameKey))
|
if (FormUtils.hasValue(pd, nameKey))
|
||||||
Text(
|
Text(
|
||||||
pd[nameKey]?.toString() ?? '',
|
pd[nameKey]?.toString() ?? '',
|
||||||
|
|
@ -83,10 +85,7 @@ class HighWorkFormBaseWork extends StatelessWidget {
|
||||||
.map((item) {
|
.map((item) {
|
||||||
// 解析 SIGN_PATH
|
// 解析 SIGN_PATH
|
||||||
List<String> signPaths = [];
|
List<String> signPaths = [];
|
||||||
final rawSP =
|
final rawSP = FormUtils.hasValue(item, 'SIGN_PATH') ? item['SIGN_PATH'] : null;
|
||||||
FormUtils.hasValue(item, 'SIGN_PATH')
|
|
||||||
? item['SIGN_PATH']
|
|
||||||
: null;
|
|
||||||
if (rawSP is String && rawSP.isNotEmpty) {
|
if (rawSP is String && rawSP.isNotEmpty) {
|
||||||
signPaths = rawSP.split(',').map((s) => s.trim()).toList();
|
signPaths = rawSP.split(',').map((s) => s.trim()).toList();
|
||||||
} else if (rawSP is List) {
|
} else if (rawSP is List) {
|
||||||
|
|
@ -95,57 +94,40 @@ class HighWorkFormBaseWork extends StatelessWidget {
|
||||||
|
|
||||||
// 解析 SIGN_TIME 保留空格
|
// 解析 SIGN_TIME 保留空格
|
||||||
List<String> signTimes = [];
|
List<String> signTimes = [];
|
||||||
final rawST =
|
final rawST = FormUtils.hasValue(item, 'SIGN_TIME') ? item['SIGN_TIME'] : null;
|
||||||
FormUtils.hasValue(item, 'SIGN_TIME')
|
|
||||||
? item['SIGN_TIME']
|
|
||||||
: null;
|
|
||||||
if (rawST is String && rawST.isNotEmpty) {
|
if (rawST is String && rawST.isNotEmpty) {
|
||||||
signTimes = rawST.split(',');
|
signTimes = rawST.split(',');
|
||||||
} else if (rawST is List) {
|
} else if (rawST is List) {
|
||||||
signTimes = rawST.cast<String>();
|
signTimes = rawST.cast<String>();
|
||||||
}
|
}
|
||||||
|
|
||||||
final pairCount = math.min(
|
final pairCount = math.min(signPaths.length, signTimes.length);
|
||||||
signPaths.length,
|
|
||||||
signTimes.length,
|
|
||||||
);
|
|
||||||
|
|
||||||
// 解析 IMG_PATH, 最多 2 张
|
// 解析 IMG_PATH, 最多 2 张
|
||||||
List<String> imgPaths = [];
|
List<String> imgPaths = [];
|
||||||
final rawIP =
|
final rawIP = FormUtils.hasValue(item, 'IMG_PATH') ? item['IMG_PATH'] : null;
|
||||||
FormUtils.hasValue(item, 'IMG_PATH')
|
|
||||||
? item['IMG_PATH']
|
|
||||||
: null;
|
|
||||||
if (rawIP is String && rawIP.isNotEmpty) {
|
if (rawIP is String && rawIP.isNotEmpty) {
|
||||||
imgPaths =
|
imgPaths = rawIP.split(',').map((s) => s.trim()).take(2).toList();
|
||||||
rawIP.split(',').map((s) => s.trim()).take(2).toList();
|
|
||||||
} else if (rawIP is List) {
|
} else if (rawIP is List) {
|
||||||
imgPaths = rawIP.cast<String>().take(2).toList();
|
imgPaths = rawIP.cast<String>().take(2).toList();
|
||||||
}
|
}
|
||||||
|
|
||||||
return Padding(
|
return Padding(
|
||||||
padding: const EdgeInsets.symmetric(
|
padding: const EdgeInsets.symmetric(vertical: 8.0, horizontal: 10),
|
||||||
vertical: 8.0,
|
|
||||||
horizontal: 10,
|
|
||||||
),
|
|
||||||
child: Column(
|
child: Column(
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
children: [
|
children: [
|
||||||
if (imgPaths.isNotEmpty) ...[
|
if (imgPaths.isNotEmpty) ...[
|
||||||
Row(
|
Row(
|
||||||
children:
|
children: imgPaths.map((p) {
|
||||||
imgPaths.map((p) {
|
|
||||||
final fullUrl = '$baseImgPath$p';
|
final fullUrl = '$baseImgPath$p';
|
||||||
return GestureDetector(
|
return GestureDetector(
|
||||||
onTap:
|
onTap: () => presentOpaque(
|
||||||
() => presentOpaque(
|
|
||||||
SingleImageViewer(imageUrl: fullUrl),
|
SingleImageViewer(imageUrl: fullUrl),
|
||||||
context,
|
context,
|
||||||
),
|
),
|
||||||
child: Padding(
|
child: Padding(
|
||||||
padding: const EdgeInsets.only(
|
padding: const EdgeInsets.only(right: 8.0),
|
||||||
right: 8.0,
|
|
||||||
),
|
|
||||||
child: ClipRRect(
|
child: ClipRRect(
|
||||||
borderRadius: BorderRadius.circular(2),
|
borderRadius: BorderRadius.circular(2),
|
||||||
child: Image.network(
|
child: Image.network(
|
||||||
|
|
@ -153,8 +135,7 @@ class HighWorkFormBaseWork extends StatelessWidget {
|
||||||
width: 50,
|
width: 50,
|
||||||
height: 50,
|
height: 50,
|
||||||
fit: BoxFit.fill,
|
fit: BoxFit.fill,
|
||||||
errorBuilder:
|
errorBuilder: (_, __, ___) => const Icon(
|
||||||
(_, __, ___) => const Icon(
|
|
||||||
Icons.broken_image,
|
Icons.broken_image,
|
||||||
size: 40,
|
size: 40,
|
||||||
),
|
),
|
||||||
|
|
@ -183,11 +164,8 @@ class HighWorkFormBaseWork extends StatelessWidget {
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
children: [
|
children: [
|
||||||
GestureDetector(
|
GestureDetector(
|
||||||
onTap:
|
onTap: () => presentOpaque(
|
||||||
() => presentOpaque(
|
SingleImageViewer(imageUrl: fullUrl),
|
||||||
SingleImageViewer(
|
|
||||||
imageUrl: fullUrl,
|
|
||||||
),
|
|
||||||
context,
|
context,
|
||||||
),
|
),
|
||||||
child: ClipRRect(
|
child: ClipRRect(
|
||||||
|
|
@ -197,11 +175,8 @@ class HighWorkFormBaseWork extends StatelessWidget {
|
||||||
width: imageWidth,
|
width: imageWidth,
|
||||||
height: imageHeight,
|
height: imageHeight,
|
||||||
fit: BoxFit.fill,
|
fit: BoxFit.fill,
|
||||||
errorBuilder:
|
errorBuilder: (_, __, ___) =>
|
||||||
(_, __, ___) => const Icon(
|
const Icon(Icons.broken_image, size: 60),
|
||||||
Icons.broken_image,
|
|
||||||
size: 60,
|
|
||||||
),
|
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
@ -235,8 +210,7 @@ class HighWorkFormBaseWork extends StatelessWidget {
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
})
|
}).toList()),
|
||||||
.toList()),
|
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
@ -289,85 +263,132 @@ class HighWorkFormBaseWork extends StatelessWidget {
|
||||||
|
|
||||||
// 4. 各环节签字及意见
|
// 4. 各环节签字及意见
|
||||||
if (FormUtils.hasValue(signs, 'GUARDIAN'))
|
if (FormUtils.hasValue(signs, 'GUARDIAN'))
|
||||||
ConfirmWithSignWidget(
|
signItemWidget('GUARDIAN', 'GUARDIAN_USER_NAME', '监护人', context),
|
||||||
signs: signs,
|
|
||||||
pd: pd,
|
|
||||||
baseImgPath: baseImgPath,
|
|
||||||
sectionKey: 'GUARDIAN',
|
|
||||||
nameKey: 'GUARDIAN_USER_NAME',
|
|
||||||
headerTitle: '监护人意见',
|
|
||||||
roleTitle: '监护人',
|
|
||||||
),
|
|
||||||
if (FormUtils.hasValue(signs, 'CONFESS'))
|
if (FormUtils.hasValue(signs, 'CONFESS'))
|
||||||
ConfirmWithSignWidget(
|
signItemWidget('CONFESS', 'CONFESS_USER_NAME', '安全交底人', context),
|
||||||
signs: signs,
|
|
||||||
pd: pd,
|
|
||||||
baseImgPath: baseImgPath,
|
|
||||||
sectionKey: 'CONFESS',
|
|
||||||
nameKey: 'CONFESS_USER_NAME',
|
|
||||||
headerTitle: '安全交底人',
|
|
||||||
roleTitle: '安全交底人',
|
|
||||||
),
|
|
||||||
if (FormUtils.hasValue(signs, 'ACCEPT_CONFESS'))
|
if (FormUtils.hasValue(signs, 'ACCEPT_CONFESS'))
|
||||||
ConfirmWithSignWidget(
|
signItemWidget('ACCEPT_CONFESS', 'ACCEPT_CONFESS_USER_NAME', '接受交底人', context),
|
||||||
signs: signs,
|
|
||||||
pd: pd,
|
// 作业负责人意见
|
||||||
baseImgPath: baseImgPath,
|
if (FormUtils.hasValue(signs, 'CONFIRM')) ...[
|
||||||
sectionKey: 'ACCEPT_CONFESS',
|
Column(
|
||||||
nameKey: 'ACCEPT_CONFESS_USER_NAME',
|
children: [
|
||||||
headerTitle: '接受交底人',
|
_itemContainer(
|
||||||
roleTitle: '',
|
Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
Padding(padding: EdgeInsets.symmetric(horizontal: 8), child: ListItemFactory.headerTitle('作业负责人意见'),),
|
||||||
|
Padding(
|
||||||
|
padding: const EdgeInsets.all(8.0),
|
||||||
|
child: Text(signs['CONFIRM'][0]['DESCR'] ?? ''),
|
||||||
),
|
),
|
||||||
if (FormUtils.hasValue(signs, 'CONFIRM'))
|
],
|
||||||
ConfirmWithSignWidget(
|
|
||||||
signs: signs,
|
|
||||||
pd: pd,
|
|
||||||
baseImgPath: baseImgPath,
|
|
||||||
sectionKey: 'CONFIRM',
|
|
||||||
nameKey: 'CONFIRM_USER_NAME',
|
|
||||||
headerTitle: '作业负责人意见',
|
|
||||||
roleTitle: '作业负责人',
|
|
||||||
),
|
),
|
||||||
if (FormUtils.hasValue(signs, 'LEADER'))
|
|
||||||
ConfirmWithSignWidget(
|
|
||||||
signs: signs,
|
|
||||||
pd: pd,
|
|
||||||
baseImgPath: baseImgPath,
|
|
||||||
sectionKey: 'LEADER',
|
|
||||||
nameKey: 'LEADER_USER_NAME',
|
|
||||||
headerTitle: '所在单位负责人意见',
|
|
||||||
roleTitle: '所在单位负责人',
|
|
||||||
),
|
),
|
||||||
if (FormUtils.hasValue(signs, 'AUDIT'))
|
Divider(height: 1,),
|
||||||
ConfirmWithSignWidget(
|
signItemWidget('CONFIRM', 'CONFIRM_USER_NAME', '作业负责人', context),
|
||||||
signs: signs,
|
],
|
||||||
pd: pd,
|
)
|
||||||
baseImgPath: baseImgPath,
|
|
||||||
sectionKey: 'AUDIT',
|
],
|
||||||
nameKey: 'AUDIT_USER_NAME',
|
|
||||||
headerTitle: '审核部门意见',
|
// 所在单位负责人意见
|
||||||
roleTitle: '审核部门负责人',
|
if (FormUtils.hasValue(signs, 'LEADER')) ...[
|
||||||
|
Column(
|
||||||
|
children: [
|
||||||
|
_itemContainer(
|
||||||
|
Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
Padding(padding: EdgeInsets.symmetric(horizontal: 8), child: ListItemFactory.headerTitle('所在单位意见'),),
|
||||||
|
Padding(
|
||||||
|
padding: const EdgeInsets.all(8.0),
|
||||||
|
child: Text(signs['LEADER'][0]['DESCR'] ?? ''),
|
||||||
),
|
),
|
||||||
if (FormUtils.hasValue(signs, 'APPROVE'))
|
],
|
||||||
ConfirmWithSignWidget(
|
|
||||||
signs: signs,
|
|
||||||
pd: pd,
|
|
||||||
baseImgPath: baseImgPath,
|
|
||||||
sectionKey: 'APPROVE',
|
|
||||||
nameKey: 'APPROVE_USER_NAME',
|
|
||||||
headerTitle: '审批人意见',
|
|
||||||
roleTitle: '审批部门负责人',
|
|
||||||
),
|
),
|
||||||
if (FormUtils.hasValue(signs, 'ACCEPT'))
|
|
||||||
ConfirmWithSignWidget(
|
|
||||||
signs: signs,
|
|
||||||
pd: pd,
|
|
||||||
baseImgPath: baseImgPath,
|
|
||||||
sectionKey: 'ACCEPT',
|
|
||||||
nameKey: 'ACCEPT_USER_NAME',
|
|
||||||
headerTitle: '验收部门负责人意见',
|
|
||||||
roleTitle: '验收部门负责人',
|
|
||||||
),
|
),
|
||||||
|
Divider(height: 1,),
|
||||||
|
signItemWidget('LEADER', 'LEADER_USER_NAME', '所在单位负责人', context),
|
||||||
|
],
|
||||||
|
)
|
||||||
|
],
|
||||||
|
|
||||||
|
// 安全管理部门负责人意见
|
||||||
|
if (FormUtils.hasValue(signs, 'AUDIT')) ...[
|
||||||
|
Column(
|
||||||
|
children: [
|
||||||
|
_itemContainer(
|
||||||
|
Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
Padding(padding: EdgeInsets.symmetric(horizontal: 8), child: ListItemFactory.headerTitle('安全管理部门意见'),),
|
||||||
|
Padding(
|
||||||
|
padding: const EdgeInsets.all(8.0),
|
||||||
|
child: Text(signs['AUDIT'][0]['DESCR'] ?? ''),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Divider(height: 1,),
|
||||||
|
signItemWidget('AUDIT', 'AUDIT_USER_NAME', '安全管理部门负责人', context),
|
||||||
|
],
|
||||||
|
)
|
||||||
|
],
|
||||||
|
|
||||||
|
// 审批人意见
|
||||||
|
if (FormUtils.hasValue(signs, 'APPROVE')) ...[
|
||||||
|
Column(
|
||||||
|
children: [
|
||||||
|
_itemContainer(
|
||||||
|
Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
Padding(padding: EdgeInsets.symmetric(horizontal: 8), child: ListItemFactory.headerTitle('审批人意见'),),
|
||||||
|
Padding(
|
||||||
|
padding: const EdgeInsets.all(8.0),
|
||||||
|
child: Text(signs['APPROVE'][0]['DESCR'] ?? ''),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Divider(height: 1,),
|
||||||
|
signItemWidget('APPROVE', 'APPROVE_USER_NAME', '审批负责人', context),
|
||||||
|
],
|
||||||
|
)
|
||||||
|
],
|
||||||
|
|
||||||
|
// // 作业开始负责人签字
|
||||||
|
// if (FormUtils.hasValue(signs, 'WORK_START'))
|
||||||
|
// signItemWidget('WORK_START', 'WORK_START_USER_NAME', '作业开始负责人', context),
|
||||||
|
//
|
||||||
|
// // 作业结束负责人签字
|
||||||
|
// if (FormUtils.hasValue(signs, 'WORK_END'))
|
||||||
|
// signItemWidget('WORK_END', 'WORK_END_USER_NAME', '作业结束负责人', context),
|
||||||
|
|
||||||
|
// 完工验收意见和签字
|
||||||
|
if (FormUtils.hasValue(signs, 'ACCEPT')) ...[
|
||||||
|
Column(
|
||||||
|
children: [
|
||||||
|
_itemContainer(
|
||||||
|
Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
Padding(padding: EdgeInsets.symmetric(horizontal: 8), child: ListItemFactory.headerTitle('完工验收意见'),),
|
||||||
|
Padding(
|
||||||
|
padding: const EdgeInsets.all(8.0),
|
||||||
|
child: Text(signs['ACCEPT'][0]['DESCR'] ?? ''),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Divider(height: 1,),
|
||||||
|
signItemWidget('ACCEPT', 'ACCEPT_USER_NAME', '验收部门负责人', context),
|
||||||
|
],
|
||||||
|
)
|
||||||
|
],
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -228,9 +228,15 @@ class _HighworkListPageState extends State<HighworkListPage> {
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
LoadingDialogHelper.show();
|
setState(() {
|
||||||
_fetchSteps();
|
_fetchSteps();
|
||||||
_fetchData();
|
_fetchData();
|
||||||
|
});
|
||||||
|
// Navigator.pushNamed(
|
||||||
|
// context,
|
||||||
|
// routeName,
|
||||||
|
// arguments: {'HIGHWORK_ID': item['HIGHWORK_ID'], 'flow': widget.flow},
|
||||||
|
// );
|
||||||
}
|
}
|
||||||
|
|
||||||
Widget _buildFlowStepItem({
|
Widget _buildFlowStepItem({
|
||||||
|
|
|
||||||
|
|
@ -36,6 +36,10 @@ class HighworkSetSafeDetail extends StatefulWidget {
|
||||||
class _HighworkSetSafeDetailState extends State<HighworkSetSafeDetail> {
|
class _HighworkSetSafeDetailState extends State<HighworkSetSafeDetail> {
|
||||||
late bool isEditable = false;
|
late bool isEditable = false;
|
||||||
|
|
||||||
|
/// 详情
|
||||||
|
late Map<String, dynamic> pd = {};
|
||||||
|
late List<Map<String, dynamic>> measuresList = [];
|
||||||
|
|
||||||
/// 安全防护措施列表
|
/// 安全防护措施列表
|
||||||
late List<MeasureItem> measuresListCopy = [];
|
late List<MeasureItem> measuresListCopy = [];
|
||||||
List<String> imagePaths = [];
|
List<String> imagePaths = [];
|
||||||
|
|
@ -46,70 +50,7 @@ class _HighworkSetSafeDetailState extends State<HighworkSetSafeDetail> {
|
||||||
_getData();
|
_getData();
|
||||||
addMeasuresListCopy();
|
addMeasuresListCopy();
|
||||||
}
|
}
|
||||||
late Map<String, dynamic> pd = {};
|
|
||||||
late Map<String, dynamic> signs = {};
|
|
||||||
late List<Map<String, dynamic>> measuresList = [];
|
|
||||||
|
|
||||||
/// 初始化拉取数据(并行获取 pd / signs / measures,最后一次 setState)
|
|
||||||
Future<void> _getData() async {
|
|
||||||
LoadingDialogHelper.show();
|
|
||||||
|
|
||||||
try {
|
|
||||||
// 并行发起三个请求,并在出错时返回安全的默认值(避免 Future.wait 因一个失败而中断)
|
|
||||||
final futurePd = ApiService.getHomeworkFindById('highwork', widget.HIGHWORK_ID)
|
|
||||||
.catchError((e) {
|
|
||||||
// 可加入日志记录 e
|
|
||||||
return <String, dynamic>{}; // 回退为空 map
|
|
||||||
});
|
|
||||||
|
|
||||||
final futureSigns = ApiService.listSignFinished('highwork', widget.HIGHWORK_ID)
|
|
||||||
.catchError((e) {
|
|
||||||
return <String, dynamic>{'signs': <String, dynamic>{}};
|
|
||||||
});
|
|
||||||
|
|
||||||
final futureMeasures = ApiService.listSignFinishAllMeasures('highwork')
|
|
||||||
.catchError((e) {
|
|
||||||
return <String, dynamic>{'measuresList': <Map<String, dynamic>>[]};
|
|
||||||
});
|
|
||||||
|
|
||||||
final results = await Future.wait([futurePd, futureSigns, futureMeasures]);
|
|
||||||
|
|
||||||
final pdResult = results[0] as Map<String, dynamic>? ?? <String, dynamic>{};
|
|
||||||
final signsResult = results[1] as Map<String, dynamic>? ?? <String, dynamic>{};
|
|
||||||
final measuresResult = results[2] as Map<String, dynamic>? ?? <String, dynamic>{};
|
|
||||||
|
|
||||||
// 从各自的结果里提取需要的字段,使用默认值以防字段缺失或类型不对
|
|
||||||
final newPd = (pdResult['pd'] is Map<String, dynamic>)
|
|
||||||
? Map<String, dynamic>.from(pdResult['pd'])
|
|
||||||
: <String, dynamic>{};
|
|
||||||
|
|
||||||
final newSigns = (signsResult['signs'] is Map<String, dynamic>)
|
|
||||||
? Map<String, dynamic>.from(signsResult['signs'])
|
|
||||||
: <String, dynamic>{};
|
|
||||||
|
|
||||||
final newMeasuresList = <Map<String, dynamic>>[];
|
|
||||||
final rawMeasures = measuresResult['measuresList'];
|
|
||||||
if (rawMeasures is List) {
|
|
||||||
for (final m in rawMeasures) {
|
|
||||||
if (m is Map) {
|
|
||||||
newMeasuresList.add(Map<String, dynamic>.from(m));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!mounted) return;
|
|
||||||
|
|
||||||
setState(() {
|
|
||||||
pd = newPd;
|
|
||||||
signs = newSigns;
|
|
||||||
measuresList = newMeasuresList;
|
|
||||||
});
|
|
||||||
} catch (e, st) {
|
|
||||||
debugPrint('[_getData] 未捕获异常: $e\n$st');
|
|
||||||
} finally {
|
|
||||||
LoadingDialogHelper.hide();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
String measuresListToJson() {
|
String measuresListToJson() {
|
||||||
final List<Map<String, dynamic>> jsonList =
|
final List<Map<String, dynamic>> jsonList =
|
||||||
measuresListCopy.map((item) => item.toJson()).toList();
|
measuresListCopy.map((item) => item.toJson()).toList();
|
||||||
|
|
@ -392,6 +333,27 @@ class _HighworkSetSafeDetailState extends State<HighworkSetSafeDetail> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// 初始化拉取数据
|
||||||
|
Future<void> _getData() async {
|
||||||
|
final data = await ApiService.getHomeworkFindById(
|
||||||
|
'highwork',
|
||||||
|
widget.HIGHWORK_ID,
|
||||||
|
);
|
||||||
|
setState(() {
|
||||||
|
pd = data['pd'];
|
||||||
|
_getMeasures();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> _getMeasures() async {
|
||||||
|
final data = await ApiService.listSignFinishAllMeasures('highwork');
|
||||||
|
setState(() {
|
||||||
|
measuresList = List<Map<String, dynamic>>.from(
|
||||||
|
data['measuresList'] ?? <Map<String, dynamic>>[],
|
||||||
|
);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
void removeMeasuresListCopy(int index) {
|
void removeMeasuresListCopy(int index) {
|
||||||
setState(() {
|
setState(() {
|
||||||
measuresListCopy.removeAt(index);
|
measuresListCopy.removeAt(index);
|
||||||
|
|
|
||||||
|
|
@ -317,9 +317,10 @@ class _ElectricityListPageState extends State<ElectricityListPage> {
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
LoadingDialogHelper.show();
|
setState(() {
|
||||||
_fetchSteps();
|
_fetchSteps();
|
||||||
_fetchData();
|
_fetchData();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
Widget _buildFlowStepItem({
|
Widget _buildFlowStepItem({
|
||||||
|
|
|
||||||
|
|
@ -69,7 +69,9 @@ class BlindboardFormBaseWork extends StatelessWidget {
|
||||||
padding: const EdgeInsets.symmetric(vertical: 5, horizontal: 10),
|
padding: const EdgeInsets.symmetric(vertical: 5, horizontal: 10),
|
||||||
child: Row(
|
child: Row(
|
||||||
children: [
|
children: [
|
||||||
Expanded(child: ListItemFactory.headerTitle(name)),
|
Expanded(
|
||||||
|
child: ListItemFactory.headerTitle(name),
|
||||||
|
),
|
||||||
if (FormUtils.hasValue(pd, nameKey))
|
if (FormUtils.hasValue(pd, nameKey))
|
||||||
Text(
|
Text(
|
||||||
pd[nameKey]?.toString() ?? '',
|
pd[nameKey]?.toString() ?? '',
|
||||||
|
|
@ -86,10 +88,7 @@ class BlindboardFormBaseWork extends StatelessWidget {
|
||||||
.map((item) {
|
.map((item) {
|
||||||
// 解析 SIGN_PATH
|
// 解析 SIGN_PATH
|
||||||
List<String> signPaths = [];
|
List<String> signPaths = [];
|
||||||
final rawSP =
|
final rawSP = FormUtils.hasValue(item, 'SIGN_PATH') ? item['SIGN_PATH'] : null;
|
||||||
FormUtils.hasValue(item, 'SIGN_PATH')
|
|
||||||
? item['SIGN_PATH']
|
|
||||||
: null;
|
|
||||||
if (rawSP is String && rawSP.isNotEmpty) {
|
if (rawSP is String && rawSP.isNotEmpty) {
|
||||||
signPaths = rawSP.split(',').map((s) => s.trim()).toList();
|
signPaths = rawSP.split(',').map((s) => s.trim()).toList();
|
||||||
} else if (rawSP is List) {
|
} else if (rawSP is List) {
|
||||||
|
|
@ -98,57 +97,40 @@ class BlindboardFormBaseWork extends StatelessWidget {
|
||||||
|
|
||||||
// 解析 SIGN_TIME 保留空格
|
// 解析 SIGN_TIME 保留空格
|
||||||
List<String> signTimes = [];
|
List<String> signTimes = [];
|
||||||
final rawST =
|
final rawST = FormUtils.hasValue(item, 'SIGN_TIME') ? item['SIGN_TIME'] : null;
|
||||||
FormUtils.hasValue(item, 'SIGN_TIME')
|
|
||||||
? item['SIGN_TIME']
|
|
||||||
: null;
|
|
||||||
if (rawST is String && rawST.isNotEmpty) {
|
if (rawST is String && rawST.isNotEmpty) {
|
||||||
signTimes = rawST.split(',');
|
signTimes = rawST.split(',');
|
||||||
} else if (rawST is List) {
|
} else if (rawST is List) {
|
||||||
signTimes = rawST.cast<String>();
|
signTimes = rawST.cast<String>();
|
||||||
}
|
}
|
||||||
|
|
||||||
final pairCount = math.min(
|
final pairCount = math.min(signPaths.length, signTimes.length);
|
||||||
signPaths.length,
|
|
||||||
signTimes.length,
|
|
||||||
);
|
|
||||||
|
|
||||||
// 解析 IMG_PATH, 最多 2 张
|
// 解析 IMG_PATH, 最多 2 张
|
||||||
List<String> imgPaths = [];
|
List<String> imgPaths = [];
|
||||||
final rawIP =
|
final rawIP = FormUtils.hasValue(item, 'IMG_PATH') ? item['IMG_PATH'] : null;
|
||||||
FormUtils.hasValue(item, 'IMG_PATH')
|
|
||||||
? item['IMG_PATH']
|
|
||||||
: null;
|
|
||||||
if (rawIP is String && rawIP.isNotEmpty) {
|
if (rawIP is String && rawIP.isNotEmpty) {
|
||||||
imgPaths =
|
imgPaths = rawIP.split(',').map((s) => s.trim()).take(2).toList();
|
||||||
rawIP.split(',').map((s) => s.trim()).take(2).toList();
|
|
||||||
} else if (rawIP is List) {
|
} else if (rawIP is List) {
|
||||||
imgPaths = rawIP.cast<String>().take(2).toList();
|
imgPaths = rawIP.cast<String>().take(2).toList();
|
||||||
}
|
}
|
||||||
|
|
||||||
return Padding(
|
return Padding(
|
||||||
padding: const EdgeInsets.symmetric(
|
padding: const EdgeInsets.symmetric(vertical: 8.0, horizontal: 10),
|
||||||
vertical: 8.0,
|
|
||||||
horizontal: 10,
|
|
||||||
),
|
|
||||||
child: Column(
|
child: Column(
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
children: [
|
children: [
|
||||||
if (imgPaths.isNotEmpty) ...[
|
if (imgPaths.isNotEmpty) ...[
|
||||||
Row(
|
Row(
|
||||||
children:
|
children: imgPaths.map((p) {
|
||||||
imgPaths.map((p) {
|
|
||||||
final fullUrl = '$baseImgPath$p';
|
final fullUrl = '$baseImgPath$p';
|
||||||
return GestureDetector(
|
return GestureDetector(
|
||||||
onTap:
|
onTap: () => presentOpaque(
|
||||||
() => presentOpaque(
|
|
||||||
SingleImageViewer(imageUrl: fullUrl),
|
SingleImageViewer(imageUrl: fullUrl),
|
||||||
context,
|
context,
|
||||||
),
|
),
|
||||||
child: Padding(
|
child: Padding(
|
||||||
padding: const EdgeInsets.only(
|
padding: const EdgeInsets.only(right: 8.0),
|
||||||
right: 8.0,
|
|
||||||
),
|
|
||||||
child: ClipRRect(
|
child: ClipRRect(
|
||||||
borderRadius: BorderRadius.circular(2),
|
borderRadius: BorderRadius.circular(2),
|
||||||
child: Image.network(
|
child: Image.network(
|
||||||
|
|
@ -156,8 +138,7 @@ class BlindboardFormBaseWork extends StatelessWidget {
|
||||||
width: 50,
|
width: 50,
|
||||||
height: 50,
|
height: 50,
|
||||||
fit: BoxFit.fill,
|
fit: BoxFit.fill,
|
||||||
errorBuilder:
|
errorBuilder: (_, __, ___) => const Icon(
|
||||||
(_, __, ___) => const Icon(
|
|
||||||
Icons.broken_image,
|
Icons.broken_image,
|
||||||
size: 40,
|
size: 40,
|
||||||
),
|
),
|
||||||
|
|
@ -186,11 +167,8 @@ class BlindboardFormBaseWork extends StatelessWidget {
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
children: [
|
children: [
|
||||||
GestureDetector(
|
GestureDetector(
|
||||||
onTap:
|
onTap: () => presentOpaque(
|
||||||
() => presentOpaque(
|
SingleImageViewer(imageUrl: fullUrl),
|
||||||
SingleImageViewer(
|
|
||||||
imageUrl: fullUrl,
|
|
||||||
),
|
|
||||||
context,
|
context,
|
||||||
),
|
),
|
||||||
child: ClipRRect(
|
child: ClipRRect(
|
||||||
|
|
@ -200,11 +178,8 @@ class BlindboardFormBaseWork extends StatelessWidget {
|
||||||
width: imageWidth,
|
width: imageWidth,
|
||||||
height: imageHeight,
|
height: imageHeight,
|
||||||
fit: BoxFit.fill,
|
fit: BoxFit.fill,
|
||||||
errorBuilder:
|
errorBuilder: (_, __, ___) =>
|
||||||
(_, __, ___) => const Icon(
|
const Icon(Icons.broken_image, size: 60),
|
||||||
Icons.broken_image,
|
|
||||||
size: 60,
|
|
||||||
),
|
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
@ -238,8 +213,7 @@ class BlindboardFormBaseWork extends StatelessWidget {
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
})
|
}).toList()),
|
||||||
.toList()),
|
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
@ -291,7 +265,7 @@ class BlindboardFormBaseWork extends StatelessWidget {
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
if (FormUtils.hasValue(signs, 'CONFESS'))
|
|
||||||
ConfirmWithSignWidget(
|
ConfirmWithSignWidget(
|
||||||
signs: signs,
|
signs: signs,
|
||||||
pd: pd,
|
pd: pd,
|
||||||
|
|
@ -301,7 +275,6 @@ class BlindboardFormBaseWork extends StatelessWidget {
|
||||||
headerTitle: '安全交底人',
|
headerTitle: '安全交底人',
|
||||||
roleTitle: '安全交底人',
|
roleTitle: '安全交底人',
|
||||||
),
|
),
|
||||||
if (FormUtils.hasValue(signs, 'ACCEPT_CONFESS'))
|
|
||||||
ConfirmWithSignWidget(
|
ConfirmWithSignWidget(
|
||||||
signs: signs,
|
signs: signs,
|
||||||
pd: pd,
|
pd: pd,
|
||||||
|
|
@ -311,7 +284,6 @@ class BlindboardFormBaseWork extends StatelessWidget {
|
||||||
headerTitle: '接受交底人',
|
headerTitle: '接受交底人',
|
||||||
roleTitle: '',
|
roleTitle: '',
|
||||||
),
|
),
|
||||||
if (FormUtils.hasValue(signs, 'CONFIRM'))
|
|
||||||
ConfirmWithSignWidget(
|
ConfirmWithSignWidget(
|
||||||
signs: signs,
|
signs: signs,
|
||||||
pd: pd,
|
pd: pd,
|
||||||
|
|
@ -321,7 +293,6 @@ class BlindboardFormBaseWork extends StatelessWidget {
|
||||||
headerTitle: '作业负责人意见',
|
headerTitle: '作业负责人意见',
|
||||||
roleTitle: '作业负责人',
|
roleTitle: '作业负责人',
|
||||||
),
|
),
|
||||||
if (FormUtils.hasValue(signs, 'LEADER'))
|
|
||||||
ConfirmWithSignWidget(
|
ConfirmWithSignWidget(
|
||||||
signs: signs,
|
signs: signs,
|
||||||
pd: pd,
|
pd: pd,
|
||||||
|
|
@ -331,6 +302,8 @@ class BlindboardFormBaseWork extends StatelessWidget {
|
||||||
headerTitle: '所在单位负责人意见',
|
headerTitle: '所在单位负责人意见',
|
||||||
roleTitle: '所在单位负责人',
|
roleTitle: '所在单位负责人',
|
||||||
),
|
),
|
||||||
|
|
||||||
|
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -228,9 +228,14 @@ class _BlindboardListPageState extends State<BlindboardListPage> {
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
LoadingDialogHelper.show();
|
setState(() {
|
||||||
_fetchSteps();
|
_fetchSteps();
|
||||||
_fetchData();
|
});
|
||||||
|
// Navigator.pushNamed(
|
||||||
|
// context,
|
||||||
|
// routeName,
|
||||||
|
// arguments: {'BLINDBOARD_ID': item['BLINDBOARD_ID'], 'flow': widget.flow},
|
||||||
|
// );
|
||||||
}
|
}
|
||||||
|
|
||||||
Widget _buildFlowStepItem({
|
Widget _buildFlowStepItem({
|
||||||
|
|
|
||||||
|
|
@ -339,9 +339,10 @@ class _SpaceworkListPageState extends State<SpaceworkListPage> {
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
LoadingDialogHelper.show();
|
setState(() {
|
||||||
_fetchSteps();
|
_fetchSteps();
|
||||||
_fetchData();
|
_fetchData();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
Widget _buildFlowStepItem({
|
Widget _buildFlowStepItem({
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev
|
||||||
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
|
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
|
||||||
# In Windows, build-name is used as the major, minor, and patch parts
|
# In Windows, build-name is used as the major, minor, and patch parts
|
||||||
# of the product and file versions while build-number is used as the build suffix.
|
# of the product and file versions while build-number is used as the build suffix.
|
||||||
version: 2.1.2+7
|
version: 2.1.2+6
|
||||||
|
|
||||||
environment:
|
environment:
|
||||||
sdk: ^3.7.0
|
sdk: ^3.7.0
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue