Compare commits

..

No commits in common. "6318206baacee17116132cc25dc361b10b9ba5c8" and "fd20e9bcd5fbd44e1304c7820b3b8e9ca1fd3a90" have entirely different histories.

19 changed files with 1057 additions and 1037 deletions

View File

@ -97,82 +97,77 @@ 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,
baseImgPath: baseImgPath, baseImgPath: baseImgPath,
sectionKey: 'CONFESS', sectionKey: 'CONFESS',
nameKey: 'CONFESS_USER_NAME', nameKey: 'CONFESS_USER_NAME',
headerTitle: '安全交底人意见', headerTitle: '安全交底人意见',
roleTitle: '安全交底人', roleTitle: '安全交底人',
), ),
if (FormUtils.hasValue(signs, 'ACCEPT_CONFESS')) ConfirmWithSignWidget(
ConfirmWithSignWidget( signs: signs,
signs: signs, pd: pd,
pd: pd, baseImgPath: baseImgPath,
baseImgPath: baseImgPath, sectionKey: 'ACCEPT_CONFESS',
sectionKey: 'ACCEPT_CONFESS', nameKey: 'ACCEPT_CONFESS_USER_NAME',
nameKey: 'ACCEPT_CONFESS_USER_NAME', headerTitle: '接受交底人',
headerTitle: '接受交底人', roleTitle: '',
roleTitle: '', ),
), ConfirmWithSignWidget(
if (FormUtils.hasValue(signs, 'GUARDIAN')) signs: signs,
ConfirmWithSignWidget( pd: pd,
signs: signs, baseImgPath: baseImgPath,
pd: pd, sectionKey: 'GUARDIAN',
baseImgPath: baseImgPath, nameKey: 'GUARDIAN_USER_NAME',
sectionKey: 'GUARDIAN', headerTitle: '监护人意见',
nameKey: 'GUARDIAN_USER_NAME', roleTitle: '监护人',
headerTitle: '监护人意见', ),
roleTitle: '监护人', ConfirmWithSignWidget(
), signs: signs,
if (FormUtils.hasValue(signs, 'CONFIRM')) pd: pd,
ConfirmWithSignWidget( baseImgPath: baseImgPath,
signs: signs, sectionKey: 'CONFIRM',
pd: pd, nameKey: 'CONFIRM_USER_NAME',
baseImgPath: baseImgPath, headerTitle: '作业负责人意见',
sectionKey: 'CONFIRM', roleTitle: '作业负责人',
nameKey: 'CONFIRM_USER_NAME', ),
headerTitle: '作业负责人意见', ConfirmWithSignWidget(
roleTitle: '作业负责人', signs: signs,
), pd: pd,
if (FormUtils.hasValue(signs, 'LEADER')) baseImgPath: baseImgPath,
ConfirmWithSignWidget( sectionKey: 'LEADER',
signs: signs, nameKey: 'LEADER_USER_NAME',
pd: pd, headerTitle: '所在单位意见',
baseImgPath: baseImgPath, roleTitle: '所在单位负责人',
sectionKey: 'LEADER', ),
nameKey: 'LEADER_USER_NAME', ConfirmWithSignWidget(
headerTitle: '所在单位意见', signs: signs,
roleTitle: '所在单位负责人', pd: pd,
), baseImgPath: baseImgPath,
if (FormUtils.hasValue(signs, 'AUDIT')) sectionKey: 'AUDIT',
ConfirmWithSignWidget( nameKey: 'AUDIT_USER_NAME',
signs: signs, headerTitle: '安全管理部门意见',
pd: pd, roleTitle: '安全管理部门',
baseImgPath: baseImgPath, ),
sectionKey: 'AUDIT', ConfirmWithSignWidget(
nameKey: 'AUDIT_USER_NAME', signs: signs,
headerTitle: '安全管理部门意见', pd: pd,
roleTitle: '安全管理部门', baseImgPath: baseImgPath,
), sectionKey: 'APPROVE',
if (FormUtils.hasValue(signs, 'APPROVE')) nameKey: 'APPROVE_USER_NAME',
ConfirmWithSignWidget( headerTitle: '动火审批人意见',
signs: signs, roleTitle: '动火审批人',
pd: pd, ),
baseImgPath: baseImgPath,
sectionKey: 'APPROVE',
nameKey: 'APPROVE_USER_NAME',
headerTitle: '动火审批人意见',
roleTitle: '动火审批人',
),
// //
// if (FormUtils.hasValue(signs, 'MONITOR')) // if (FormUtils.hasValue(signs, 'MONITOR'))
@ -181,26 +176,26 @@ 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, baseImgPath: baseImgPath,
baseImgPath: baseImgPath, sectionKey: 'MONITOR',
sectionKey: 'MONITOR', nameKey: 'MONITOR_USER_NAME',
nameKey: 'MONITOR_USER_NAME', headerTitle: '动火前,岗位当班班长验票情况',
headerTitle: '动火前,岗位当班班长验票情况', roleTitle: '动火前,岗位当班班长验票情况',
roleTitle: '动火前,岗位当班班长验票情况', ),
),
if (FormUtils.hasValue(signs, 'ACCEPT')) ConfirmWithSignWidget(
ConfirmWithSignWidget( signs: signs,
signs: signs, pd: pd,
pd: pd, baseImgPath: baseImgPath,
baseImgPath: baseImgPath, sectionKey: 'ACCEPT',
sectionKey: 'ACCEPT', nameKey: 'ACCEPT_USER_NAME',
nameKey: 'ACCEPT_USER_NAME', headerTitle: '验收部门负责人意见',
headerTitle: '验收部门负责人意见', roleTitle: '验收部门负责人',
roleTitle: '验收部门负责人', ),
),
], ],
); );
} }

View File

@ -287,8 +287,10 @@ class _HotWorkListPageState extends State<HotWorkListPage> {
break; break;
} }
LoadingDialogHelper.show(); LoadingDialogHelper.show();
_fetchSteps(); setState(() {
_fetchData(); _fetchSteps();
_fetchData();
});
} }
Widget _buildFlowStepItem({ Widget _buildFlowStepItem({

View File

@ -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: [

View File

@ -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') && ConfirmWithSignWidget(
!widget.isEditable) ...[ signs: widget.signs,
ConfirmWithSignWidget( pd: pd,
signs: signs, baseImgPath: ApiService.baseImgPath,
pd: pd, sectionKey: 'GUARDIAN',
baseImgPath: ApiService.baseImgPath, nameKey: 'WORK_CONTENT',
sectionKey: 'PROJECT_MANAGER', headerTitle: '断路地段示意图(可另附图)及相关说明',
nameKey: 'WORK_CONTENT', imgsKey: 'CONTENT_IMG_PATH',
headerTitle: '断路地段示意图(可另附图)及相关说明', contentKey: 'WORK_CONTENT',
imgsKey: 'CONTENT_IMG_PATH', roleTitle: '',
contentKey: 'WORK_CONTENT', ),
roleTitle: '',
),
const Divider(),
],
ItemListWidget.twoRowButtonTitleText( ItemListWidget.twoRowButtonTitleText(
label: '风险辨识结果', label: '风险辨识结果',

View File

@ -52,11 +52,11 @@ class CutroadFormBaseWork extends StatelessWidget {
} }
Widget signItemWidget( Widget signItemWidget(
String signKey, String signKey,
String nameKey, String nameKey,
String name, String name,
BuildContext context, BuildContext context,
) { ) {
return _itemContainer( return _itemContainer(
Column( Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
@ -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() ?? '',
@ -81,162 +83,134 @@ class CutroadFormBaseWork extends StatelessWidget {
...((signs[signKey] as List<dynamic>) ...((signs[signKey] as List<dynamic>)
.cast<Map<String, dynamic>>() .cast<Map<String, dynamic>>()
.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') if (rawSP is String && rawSP.isNotEmpty) {
? item['SIGN_PATH'] signPaths = rawSP.split(',').map((s) => s.trim()).toList();
: null; } else if (rawSP is List) {
if (rawSP is String && rawSP.isNotEmpty) { signPaths = rawSP.cast<String>();
signPaths = rawSP.split(',').map((s) => s.trim()).toList(); }
} else if (rawSP is List) {
signPaths = rawSP.cast<String>();
}
// 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') if (rawST is String && rawST.isNotEmpty) {
? item['SIGN_TIME'] signTimes = rawST.split(',');
: null; } else if (rawST is List) {
if (rawST is String && rawST.isNotEmpty) { signTimes = rawST.cast<String>();
signTimes = rawST.split(','); }
} else if (rawST is List) {
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') if (rawIP is String && rawIP.isNotEmpty) {
? item['IMG_PATH'] imgPaths = rawIP.split(',').map((s) => s.trim()).take(2).toList();
: null; } else if (rawIP is List) {
if (rawIP is String && rawIP.isNotEmpty) { imgPaths = rawIP.cast<String>().take(2).toList();
imgPaths = }
rawIP.split(',').map((s) => s.trim()).take(2).toList();
} else if (rawIP is List) {
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, child: Column(
horizontal: 10, crossAxisAlignment: CrossAxisAlignment.start,
), children: [
child: Column( if (imgPaths.isNotEmpty) ...[
crossAxisAlignment: CrossAxisAlignment.start, Row(
children: [ children: imgPaths.map((p) {
if (imgPaths.isNotEmpty) ...[ final fullUrl = '$baseImgPath$p';
Row( return GestureDetector(
children: onTap: () => presentOpaque(
imgPaths.map((p) { SingleImageViewer(imageUrl: fullUrl),
final fullUrl = '$baseImgPath$p'; context,
return GestureDetector( ),
onTap: child: Padding(
() => presentOpaque( padding: const EdgeInsets.only(right: 8.0),
SingleImageViewer(imageUrl: fullUrl), child: ClipRRect(
context, borderRadius: BorderRadius.circular(2),
), child: Image.network(
child: Padding( fullUrl,
padding: const EdgeInsets.only( width: 50,
right: 8.0, height: 50,
), fit: BoxFit.fill,
child: ClipRRect( errorBuilder: (_, __, ___) => const Icon(
borderRadius: BorderRadius.circular(2), Icons.broken_image,
child: Image.network( size: 40,
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 = '$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(),
], ),
), const SizedBox(height: 8),
); ],
})
.toList()), //
...List.generate(pairCount, (index) {
final imgPath = signPaths[index];
final timeLabel = signTimes[index];
final fullUrl = '$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()),
], ],
), ),
); );
@ -287,76 +261,71 @@ class CutroadFormBaseWork extends StatelessWidget {
], ],
), ),
), ),
if (FormUtils.hasValue(signs, 'CONFESS')) ConfirmWithSignWidget(
ConfirmWithSignWidget( signs: signs,
signs: signs, pd: pd,
pd: pd, baseImgPath: baseImgPath,
baseImgPath: baseImgPath, sectionKey: 'CONFESS',
sectionKey: 'CONFESS', nameKey: 'CONFESS_USER_NAME',
nameKey: 'CONFESS_USER_NAME', headerTitle: '安全交底人',
headerTitle: '安全交底人', roleTitle: '安全交底人',
roleTitle: '安全交底人', ),
), ConfirmWithSignWidget(
if (FormUtils.hasValue(signs, 'ACCEPT_CONFESS')) signs: signs,
ConfirmWithSignWidget( pd: pd,
signs: signs, baseImgPath: baseImgPath,
pd: pd, sectionKey: 'ACCEPT_CONFESS',
baseImgPath: baseImgPath, nameKey: 'ACCEPT_CONFESS_USER_NAME',
sectionKey: 'ACCEPT_CONFESS', headerTitle: '接受交底人',
nameKey: 'ACCEPT_CONFESS_USER_NAME', roleTitle: '',
headerTitle: '接受交底人', ),
roleTitle: '', ConfirmWithSignWidget(
), signs: signs,
if (FormUtils.hasValue(signs, 'CONFIRM')) pd: pd,
ConfirmWithSignWidget( baseImgPath: baseImgPath,
signs: signs, sectionKey: 'CONFIRM',
pd: pd, nameKey: 'CONFIRM_USER_NAME',
baseImgPath: baseImgPath, headerTitle: '作业负责人意见',
sectionKey: 'CONFIRM', roleTitle: '作业负责人',
nameKey: 'CONFIRM_USER_NAME', ),
headerTitle: '作业负责人意见', ConfirmWithSignWidget(
roleTitle: '作业负责人', signs: signs,
), pd: pd,
if (FormUtils.hasValue(signs, 'LEADER')) baseImgPath: baseImgPath,
ConfirmWithSignWidget( sectionKey: 'LEADER',
signs: signs, nameKey: 'LEADER_USER_NAME',
pd: pd, headerTitle: '所在单位负责人意见',
baseImgPath: baseImgPath, roleTitle: '所在单位负责人',
sectionKey: 'LEADER', ),
nameKey: 'LEADER_USER_NAME', ConfirmWithSignWidget(
headerTitle: '所在单位负责人意见', signs: signs,
roleTitle: '所在单位负责人', pd: pd,
), baseImgPath: baseImgPath,
if (FormUtils.hasValue(signs, 'AUDIT')) sectionKey: 'AUDIT',
ConfirmWithSignWidget( nameKey: 'AUDIT_USER_NAME',
signs: signs, headerTitle: '消防、安全管理部门负责人意见',
pd: pd, roleTitle: '消防、安全管理部门负责人',
baseImgPath: baseImgPath, ),
sectionKey: 'AUDIT', ConfirmWithSignWidget(
nameKey: 'AUDIT_USER_NAME', signs: signs,
headerTitle: '消防、安全管理部门负责人意见', pd: pd,
roleTitle: '消防、安全管理部门负责人', baseImgPath: baseImgPath,
), sectionKey: 'APPROVE',
if (FormUtils.hasValue(signs, 'APPROVE')) nameKey: 'APPROVE_USER_NAME',
ConfirmWithSignWidget( headerTitle: '审批部门负责人意见',
signs: signs, roleTitle: '审批部门负责人',
pd: pd, ),
baseImgPath: baseImgPath,
sectionKey: 'APPROVE', ConfirmWithSignWidget(
nameKey: 'APPROVE_USER_NAME', signs: signs,
headerTitle: '审批部门负责人意见', pd: pd,
roleTitle: '审批部门负责人', baseImgPath: baseImgPath,
), sectionKey: 'ACCEPT',
if (FormUtils.hasValue(signs, 'ACCEPT')) nameKey: 'ACCEPT_USER_NAME',
ConfirmWithSignWidget( headerTitle: '验收部门负责人意见',
signs: signs, roleTitle: '验收部门负责人',
pd: pd, ),
baseImgPath: baseImgPath,
sectionKey: 'ACCEPT',
nameKey: 'ACCEPT_USER_NAME',
headerTitle: '验收部门负责人意见',
roleTitle: '验收部门负责人',
),
], ],
); );
} }

View File

@ -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(),

View File

@ -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({

View File

@ -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: [
@ -142,7 +83,7 @@ class _CutroadSetSafeDetailState extends State<CutroadSetSafeDetail> {
onTap: () { onTap: () {
showSafeFunctionDialog( showSafeFunctionDialog(
context, context,
_getAvailableMeasures(item), // _getAvailableMeasures(item), //
initialSelected: item.selectMeasures, initialSelected: item.selectMeasures,
(selected) { (selected) {
setState(() { setState(() {
@ -228,7 +169,7 @@ class _CutroadSetSafeDetailState extends State<CutroadSetSafeDetail> {
MaterialPageRoute(builder: (context) => MineSignPage()), MaterialPageRoute(builder: (context) => MineSignPage()),
); );
await NativeOrientation.setPortrait(); await NativeOrientation.setPortrait();
if (path != null) { if (path != null) {
final now = DateFormat('yyyy-MM-dd HH:mm').format(DateTime.now()); final now = DateFormat('yyyy-MM-dd HH:mm').format(DateTime.now());
setState(() { setState(() {
imagePaths.add(path); imagePaths.add(path);
@ -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, '请填写作废原因');
@ -365,22 +312,26 @@ class _CutroadSetSafeDetailState extends State<CutroadSetSafeDetail> {
barrierDismissible: false, barrierDismissible: false,
); );
if (confirmed) { if (confirmed) {
LoadingDialogHelper.show(); LoadingDialogHelper.show();
try { try {
final result = await ApiService.saveSafeFunctionSure( final result = await ApiService.saveSafeFunctionSure(
'cutroad', 'cutroad',
formData, formData,
imagePaths, imagePaths,
); );
LoadingDialogHelper.hide(); LoadingDialogHelper.hide();
if (result['result'] == 'success') { if (result['result'] == 'success') {
ToastUtil.showSuccess(context, '保存成功'); ToastUtil.showSuccess(
Navigator.of(context).pop(true); context,
} '保存成功',
} catch (e) { );
LoadingDialogHelper.hide(); Navigator.of(context).pop(true);
ToastUtil.showNormal(context, '操作失败:$e'); }
} } catch (e) {
LoadingDialogHelper.hide();
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,14 +393,12 @@ 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
final isCurrentSelected = current.selectMeasures.any( .any((sm) => sm['BUS_CUTROAD_MEASURES_ID'] == id);
(sm) => sm['BUS_CUTROAD_MEASURES_ID'] == id, return !usedIds.contains(id) || isCurrentSelected;
); }).toList();
return !usedIds.contains(id) || isCurrentSelected;
}).toList();
return list; return list;
} }
@ -596,8 +561,7 @@ class _CutroadSetSafeDetailState extends State<CutroadSetSafeDetail> {
CutroadDetailFormWidget( CutroadDetailFormWidget(
pd: pd, pd: pd,
isEditable: false, isEditable: false,
onChooseLevel: () {}, onChooseLevel: (){},
signs: signs,
), ),
SizedBox(height: 20), SizedBox(height: 20),
_setSafeDetailWidget(), _setSafeDetailWidget(),

View File

@ -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({

View File

@ -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({

View File

@ -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,

View File

@ -52,11 +52,11 @@ class HighWorkFormBaseWork extends StatelessWidget {
} }
Widget signItemWidget( Widget signItemWidget(
String signKey, String signKey,
String nameKey, String nameKey,
String name, String name,
BuildContext context, BuildContext context,
) { ) {
return _itemContainer( return _itemContainer(
Column( Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
@ -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() ?? '',
@ -81,162 +83,134 @@ class HighWorkFormBaseWork extends StatelessWidget {
...((signs[signKey] as List<dynamic>) ...((signs[signKey] as List<dynamic>)
.cast<Map<String, dynamic>>() .cast<Map<String, dynamic>>()
.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') if (rawSP is String && rawSP.isNotEmpty) {
? item['SIGN_PATH'] signPaths = rawSP.split(',').map((s) => s.trim()).toList();
: null; } else if (rawSP is List) {
if (rawSP is String && rawSP.isNotEmpty) { signPaths = rawSP.cast<String>();
signPaths = rawSP.split(',').map((s) => s.trim()).toList(); }
} else if (rawSP is List) {
signPaths = rawSP.cast<String>();
}
// 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') if (rawST is String && rawST.isNotEmpty) {
? item['SIGN_TIME'] signTimes = rawST.split(',');
: null; } else if (rawST is List) {
if (rawST is String && rawST.isNotEmpty) { signTimes = rawST.cast<String>();
signTimes = rawST.split(','); }
} else if (rawST is List) {
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') if (rawIP is String && rawIP.isNotEmpty) {
? item['IMG_PATH'] imgPaths = rawIP.split(',').map((s) => s.trim()).take(2).toList();
: null; } else if (rawIP is List) {
if (rawIP is String && rawIP.isNotEmpty) { imgPaths = rawIP.cast<String>().take(2).toList();
imgPaths = }
rawIP.split(',').map((s) => s.trim()).take(2).toList();
} else if (rawIP is List) {
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, child: Column(
horizontal: 10, crossAxisAlignment: CrossAxisAlignment.start,
), children: [
child: Column( if (imgPaths.isNotEmpty) ...[
crossAxisAlignment: CrossAxisAlignment.start, Row(
children: [ children: imgPaths.map((p) {
if (imgPaths.isNotEmpty) ...[ final fullUrl = '$baseImgPath$p';
Row( return GestureDetector(
children: onTap: () => presentOpaque(
imgPaths.map((p) { SingleImageViewer(imageUrl: fullUrl),
final fullUrl = '$baseImgPath$p'; context,
return GestureDetector( ),
onTap: child: Padding(
() => presentOpaque( padding: const EdgeInsets.only(right: 8.0),
SingleImageViewer(imageUrl: fullUrl), child: ClipRRect(
context, borderRadius: BorderRadius.circular(2),
), child: Image.network(
child: Padding( fullUrl,
padding: const EdgeInsets.only( width: 50,
right: 8.0, height: 50,
), fit: BoxFit.fill,
child: ClipRRect( errorBuilder: (_, __, ___) => const Icon(
borderRadius: BorderRadius.circular(2), Icons.broken_image,
child: Image.network( size: 40,
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 = '$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(),
], ),
), const SizedBox(height: 8),
); ],
})
.toList()), //
...List.generate(pairCount, (index) {
final imgPath = signPaths[index];
final timeLabel = signTimes[index];
final fullUrl = '$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()),
], ],
), ),
); );
@ -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,
if (FormUtils.hasValue(signs, 'CONFIRM')) children: [
ConfirmWithSignWidget( Padding(padding: EdgeInsets.symmetric(horizontal: 8), child: ListItemFactory.headerTitle('作业负责人意见'),),
signs: signs, Padding(
pd: pd, padding: const EdgeInsets.all(8.0),
baseImgPath: baseImgPath, child: Text(signs['CONFIRM'][0]['DESCR'] ?? ''),
sectionKey: 'CONFIRM', ),
nameKey: 'CONFIRM_USER_NAME', ],
headerTitle: '作业负责人意见', ),
roleTitle: '作业负责人', ),
), Divider(height: 1,),
if (FormUtils.hasValue(signs, 'LEADER')) signItemWidget('CONFIRM', 'CONFIRM_USER_NAME', '作业负责人', context),
ConfirmWithSignWidget( ],
signs: signs, )
pd: pd,
baseImgPath: baseImgPath, ],
sectionKey: 'LEADER',
nameKey: 'LEADER_USER_NAME', //
headerTitle: '所在单位负责人意见', if (FormUtils.hasValue(signs, 'LEADER')) ...[
roleTitle: '所在单位负责人', Column(
), children: [
if (FormUtils.hasValue(signs, 'AUDIT')) _itemContainer(
ConfirmWithSignWidget( Column(
signs: signs, crossAxisAlignment: CrossAxisAlignment.start,
pd: pd, children: [
baseImgPath: baseImgPath, Padding(padding: EdgeInsets.symmetric(horizontal: 8), child: ListItemFactory.headerTitle('所在单位意见'),),
sectionKey: 'AUDIT', Padding(
nameKey: 'AUDIT_USER_NAME', padding: const EdgeInsets.all(8.0),
headerTitle: '审核部门意见', child: Text(signs['LEADER'][0]['DESCR'] ?? ''),
roleTitle: '审核部门负责人', ),
), ],
if (FormUtils.hasValue(signs, 'APPROVE')) ),
ConfirmWithSignWidget( ),
signs: signs, Divider(height: 1,),
pd: pd, signItemWidget('LEADER', 'LEADER_USER_NAME', '所在单位负责人', context),
baseImgPath: baseImgPath, ],
sectionKey: 'APPROVE', )
nameKey: 'APPROVE_USER_NAME', ],
headerTitle: '审批人意见',
roleTitle: '审批部门负责人', //
), if (FormUtils.hasValue(signs, 'AUDIT')) ...[
if (FormUtils.hasValue(signs, 'ACCEPT')) Column(
ConfirmWithSignWidget( children: [
signs: signs, _itemContainer(
pd: pd, Column(
baseImgPath: baseImgPath, crossAxisAlignment: CrossAxisAlignment.start,
sectionKey: 'ACCEPT', children: [
nameKey: 'ACCEPT_USER_NAME', Padding(padding: EdgeInsets.symmetric(horizontal: 8), child: ListItemFactory.headerTitle('安全管理部门意见'),),
headerTitle: '验收部门负责人意见', Padding(
roleTitle: '验收部门负责人', 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),
],
)
],
], ],
); );
} }

View File

@ -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({

View File

@ -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);

View File

@ -317,9 +317,10 @@ class _ElectricityListPageState extends State<ElectricityListPage> {
default: default:
break; break;
} }
LoadingDialogHelper.show(); setState(() {
_fetchSteps(); _fetchSteps();
_fetchData(); _fetchData();
});
} }
Widget _buildFlowStepItem({ Widget _buildFlowStepItem({

View File

@ -55,11 +55,11 @@ class BlindboardFormBaseWork extends StatelessWidget {
} }
Widget signItemWidget( Widget signItemWidget(
String signKey, String signKey,
String nameKey, String nameKey,
String name, String name,
BuildContext context, BuildContext context,
) { ) {
return _itemContainer( return _itemContainer(
Column( Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
@ -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() ?? '',
@ -84,162 +86,134 @@ class BlindboardFormBaseWork extends StatelessWidget {
...((signs[signKey] as List<dynamic>) ...((signs[signKey] as List<dynamic>)
.cast<Map<String, dynamic>>() .cast<Map<String, dynamic>>()
.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') if (rawSP is String && rawSP.isNotEmpty) {
? item['SIGN_PATH'] signPaths = rawSP.split(',').map((s) => s.trim()).toList();
: null; } else if (rawSP is List) {
if (rawSP is String && rawSP.isNotEmpty) { signPaths = rawSP.cast<String>();
signPaths = rawSP.split(',').map((s) => s.trim()).toList(); }
} else if (rawSP is List) {
signPaths = rawSP.cast<String>();
}
// 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') if (rawST is String && rawST.isNotEmpty) {
? item['SIGN_TIME'] signTimes = rawST.split(',');
: null; } else if (rawST is List) {
if (rawST is String && rawST.isNotEmpty) { signTimes = rawST.cast<String>();
signTimes = rawST.split(','); }
} else if (rawST is List) {
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') if (rawIP is String && rawIP.isNotEmpty) {
? item['IMG_PATH'] imgPaths = rawIP.split(',').map((s) => s.trim()).take(2).toList();
: null; } else if (rawIP is List) {
if (rawIP is String && rawIP.isNotEmpty) { imgPaths = rawIP.cast<String>().take(2).toList();
imgPaths = }
rawIP.split(',').map((s) => s.trim()).take(2).toList();
} else if (rawIP is List) {
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, child: Column(
horizontal: 10, crossAxisAlignment: CrossAxisAlignment.start,
), children: [
child: Column( if (imgPaths.isNotEmpty) ...[
crossAxisAlignment: CrossAxisAlignment.start, Row(
children: [ children: imgPaths.map((p) {
if (imgPaths.isNotEmpty) ...[ final fullUrl = '$baseImgPath$p';
Row( return GestureDetector(
children: onTap: () => presentOpaque(
imgPaths.map((p) { SingleImageViewer(imageUrl: fullUrl),
final fullUrl = '$baseImgPath$p'; context,
return GestureDetector( ),
onTap: child: Padding(
() => presentOpaque( padding: const EdgeInsets.only(right: 8.0),
SingleImageViewer(imageUrl: fullUrl), child: ClipRRect(
context, borderRadius: BorderRadius.circular(2),
), child: Image.network(
child: Padding( fullUrl,
padding: const EdgeInsets.only( width: 50,
right: 8.0, height: 50,
), fit: BoxFit.fill,
child: ClipRRect( errorBuilder: (_, __, ___) => const Icon(
borderRadius: BorderRadius.circular(2), Icons.broken_image,
child: Image.network( size: 40,
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 = '$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(),
], ),
), const SizedBox(height: 8),
); ],
})
.toList()), //
...List.generate(pairCount, (index) {
final imgPath = signPaths[index];
final timeLabel = signTimes[index];
final fullUrl = '$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()),
], ],
), ),
); );
@ -291,46 +265,45 @@ class BlindboardFormBaseWork extends StatelessWidget {
], ],
), ),
), ),
if (FormUtils.hasValue(signs, 'CONFESS'))
ConfirmWithSignWidget( ConfirmWithSignWidget(
signs: signs, signs: signs,
pd: pd, pd: pd,
baseImgPath: baseImgPath, baseImgPath: baseImgPath,
sectionKey: 'CONFESS', sectionKey: 'CONFESS',
nameKey: 'CONFESS_USER_NAME', nameKey: 'CONFESS_USER_NAME',
headerTitle: '安全交底人', headerTitle: '安全交底人',
roleTitle: '安全交底人', roleTitle: '安全交底人',
), ),
if (FormUtils.hasValue(signs, 'ACCEPT_CONFESS')) ConfirmWithSignWidget(
ConfirmWithSignWidget( signs: signs,
signs: signs, pd: pd,
pd: pd, baseImgPath: baseImgPath,
baseImgPath: baseImgPath, sectionKey: 'ACCEPT_CONFESS',
sectionKey: 'ACCEPT_CONFESS', nameKey: 'ACCEPT_CONFESS_USER_NAME',
nameKey: 'ACCEPT_CONFESS_USER_NAME', headerTitle: '接受交底人',
headerTitle: '接受交底人', roleTitle: '',
roleTitle: '', ),
), ConfirmWithSignWidget(
if (FormUtils.hasValue(signs, 'CONFIRM')) signs: signs,
ConfirmWithSignWidget( pd: pd,
signs: signs, baseImgPath: baseImgPath,
pd: pd, sectionKey: 'CONFIRM',
baseImgPath: baseImgPath, nameKey: 'CONFIRM_USER_NAME',
sectionKey: 'CONFIRM', headerTitle: '作业负责人意见',
nameKey: 'CONFIRM_USER_NAME', roleTitle: '作业负责人',
headerTitle: '作业负责人意见', ),
roleTitle: '作业负责人', ConfirmWithSignWidget(
), signs: signs,
if (FormUtils.hasValue(signs, 'LEADER')) pd: pd,
ConfirmWithSignWidget( baseImgPath: baseImgPath,
signs: signs, sectionKey: 'LEADER',
pd: pd, nameKey: 'LEADER_USER_NAME',
baseImgPath: baseImgPath, headerTitle: '所在单位负责人意见',
sectionKey: 'LEADER', roleTitle: '所在单位负责人',
nameKey: 'LEADER_USER_NAME', ),
headerTitle: '所在单位负责人意见',
roleTitle: '所在单位负责人',
),
], ],
); );
} }

View File

@ -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({

View File

@ -339,9 +339,10 @@ class _SpaceworkListPageState extends State<SpaceworkListPage> {
default: default:
break; break;
} }
LoadingDialogHelper.show(); setState(() {
_fetchSteps(); _fetchSteps();
_fetchData(); _fetchData();
});
} }
Widget _buildFlowStepItem({ Widget _buildFlowStepItem({

View File

@ -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