Bladeren bron

模板的页面与接口调整

liukai 1 week geleden
bovenliggende
commit
483a1fdb40

+ 31 - 45
packages/cpt_uk/lib/modules/job/template_add/template_add_controller.dart

@@ -1,5 +1,6 @@
 import 'package:domain/entity/response/job_template_edit_index_entity.dart';
-import 'package:domain/repository/labour_repository.dart';
+import 'package:domain/entity/response/u_k_template_detail_entity.dart';
+import 'package:domain/repository/uk_job_repository.dart';
 import 'package:get/get.dart';
 import 'package:plugin_platform/engine/notify/notify_engine.dart';
 import 'package:plugin_platform/engine/toast/toast_engine.dart';
@@ -11,19 +12,19 @@ import 'package:shared/utils/util.dart';
 import 'template_add_state.dart';
 
 class TemplateAddController extends GetxController with DioCancelableMixin {
-  final LabourRepository _labourRepository = Get.find();
+  final UKJobRepository _labourRepository = Get.find();
   final LabourTemplateAddState state = LabourTemplateAddState();
 
   // 获取添加或者编辑的详情
   void _fetchAddEditIndexDetail() async {
     //获取到数据
-    Future<HttpResult<JobTemplateEditIndexEntity>> taskFuture;
+    Future<HttpResult<UKTemplateDetailEntity>> taskFuture;
     if (Utils.isNotEmpty(state.templateId) && state.templateId != "0") {
       //编辑
-      taskFuture = _labourRepository.fetchJobTemplateEditIndex(state.templateId, cancelToken: cancelToken);
+      taskFuture = _labourRepository.fetchJobTemplateDetail(templateId: state.templateId, cancelToken: cancelToken);
     } else {
       //新增
-      taskFuture = _labourRepository.fetchJobTemplateAddIndex(cancelToken: cancelToken);
+      taskFuture = _labourRepository.fetchJobTemplateIndex(cancelToken: cancelToken);
     }
 
     var result = await taskFuture;
@@ -35,31 +36,18 @@ class TemplateAddController extends GetxController with DioCancelableMixin {
       var templateNameController = state.formData['template_name']!['controller'];
       var descController = state.formData['desc']!['controller'];
       var noteController = state.formData['note']!['controller'];
-      templateNameController.text = state.indexEntity?.jobTitle ?? "";
-      descController.text = state.indexEntity?.description ?? "";
-      noteController.text = state.indexEntity?.note ?? "";
-
-      //默认赋值
-      state.optionLanguageList = state.indexEntity?.languageList.map((e) => e.txt!).toList() ?? [];
-      Log.d("当前语言的选项为:${state.optionLanguageList}");
-      Log.d("当前年龄的选项为:${state.indexEntity?.ageList}");
-      Log.d("当前性别的选项为:${state.indexEntity?.languageList}");
-
-      state.selectedAgeList = state.indexEntity?.ageList.where((e) => e.checked == "checked").map((e) => e.value!).toList() ?? [];
-      Log.d("当前选中的年龄:${state.selectedAgeList}");
-      state.selectedLanguageList = state.indexEntity?.languageList.where((e) => e.checked == "checked").map((e) => e.value!).toList() ?? [];
-      Log.d("当前选中的语言:${state.selectedLanguageList}");
-
-      if (state.indexEntity?.sexList != null) {
-        state.gender = state.indexEntity!.sexList.firstWhere((e) => e.checked == "checked", orElse: () => JobTemplateEditIndexSexList(),).value;
-      } else {
-        state.gender = null;
-      }
-      Log.d("当前选中的性别:${state.gender}");
+      templateNameController.text = state.indexEntity?.row?.jobTitle ?? "";
+      descController.text = state.indexEntity?.row?.description ?? "";
+      noteController.text = state.indexEntity?.row?.note ?? "";
+
+      //默认CheckBox
+      state.selectedCertificateList = state.indexEntity?.certificateList?.where((e) => e.checked == "checked").map((e) => e.value!).toList() ?? [];
+      Log.d("当前选中的证书:${state.selectedCertificateList}");
+      state.selectedVehicleList = state.indexEntity?.vehicleList?.where((e) => e.checked == "checked").map((e) => e.value!).toList() ?? [];
+      Log.d("当前选中的交通工具:${state.selectedVehicleList}");
 
       //刷新
       update();
-
     } else {
       ToastEngine.show(result.errorMsg ?? "Network Load Error".tr);
     }
@@ -71,36 +59,34 @@ class TemplateAddController extends GetxController with DioCancelableMixin {
     var descController = state.formData['desc']!['controller'];
     var noteController = state.formData['note']!['controller'];
 
-    String templateName = templateNameController.text.toString();
+    String templateTitle = templateNameController.text.toString();
     String desc = descController.text.toString();
     String note = noteController.text.toString();
 
     //只校验模版的名称
-    if (Utils.isEmpty(templateName)) {
-      ToastEngine.show("Enter Job Template Name".tr);
+    if (Utils.isEmpty(templateTitle)) {
+      ToastEngine.show("Enter Job Template Title".tr);
       return;
     }
 
     Future<HttpResult> taskFuture;
     if (Utils.isNotEmpty(state.templateId) && state.templateId != "0") {
-      taskFuture = _labourRepository.editLabourTemplateSubmit(
-        state.templateId,
-        templateName,
-        desc,
-        note,
-        state.selectedAgeList.join(","),
-        state.gender,
-        state.selectedLanguageList.join(","),
+      taskFuture = _labourRepository.editJobTemplateSubmit(
+        templateId: state.templateId,
+        jobTitle: templateTitle,
+        certificate: state.selectedCertificateList,
+        vehicle: state.selectedVehicleList,
+        desc: desc,
+        note: note,
         cancelToken: cancelToken,
       );
     } else {
-      taskFuture = _labourRepository.addLabourTemplateSubmit(
-        templateName,
-        desc,
-        note,
-        state.selectedAgeList.join(","),
-        state.gender,
-        state.selectedLanguageList.join(","),
+      taskFuture = _labourRepository.addJobTemplateSubmit(
+        jobTitle: templateTitle,
+        certificate: state.selectedCertificateList,
+        vehicle: state.selectedVehicleList,
+        desc: desc,
+        note: note,
         cancelToken: cancelToken,
       );
     }

+ 49 - 56
packages/cpt_uk/lib/modules/job/template_add/template_add_page.dart

@@ -93,7 +93,7 @@ class _LabourTemplateAddState extends BaseState<UKTemplateAddPage, TemplateAddCo
                         crossAxisAlignment: CrossAxisAlignment.start,
                         children: [
                           //模板名称
-                          FormRequireText(text: "Template Name".tr).marginOnly(left: 15, top: 19),
+                          FormRequireText(text: "Template Title".tr).marginOnly(left: 15, top: 19),
 
                           CustomTextField(
                             formKey: "template_name",
@@ -107,11 +107,11 @@ class _LabourTemplateAddState extends BaseState<UKTemplateAddPage, TemplateAddCo
                             marginTop: 10,
                           ),
 
-                          //年龄
+                          //证书
                           Visibility(
-                            visible: state.indexEntity?.ageList.isNotEmpty == true,
+                            visible: state.indexEntity?.certificateList?.isNotEmpty == true,
                             child: MyTextView(
-                              "Age".tr,
+                              "Certificate".tr,
                               textColor: Colors.white,
                               fontSize: 14,
                               isFontRegular: true,
@@ -120,52 +120,27 @@ class _LabourTemplateAddState extends BaseState<UKTemplateAddPage, TemplateAddCo
                             ),
                           ),
 
-                          // 年龄的多选
+                          // 证书的多选
                           Visibility(
-                            visible: state.indexEntity?.ageList.isNotEmpty == true,
+                            visible: state.indexEntity?.certificateList?.isNotEmpty == true,
                             child: CustomCheckBox(
-                              options: state.indexEntity?.ageList.map((e) => e.txt!).toList() ?? [],
+                              options: state.indexEntity?.certificateList?.map((e) => e.txt!).toList() ?? [],
                               onOptionsSelected: (selected) {
                                 // 转换选中的索引为对应的 value
-                                state.selectedAgeList = selected
+                                state.selectedCertificateList = selected
                                     .map((index) {
-                                      return state.indexEntity?.ageList[index].value; // 获取对应的 value
+                                      return state.indexEntity?.certificateList?[index].value; // 获取对应的 value
                                     })
                                     .whereType<String>()
                                     .toList();
                               },
-                              selectedOptions: state.indexEntity?.ageList.where((e) => e.checked == "checked").map((e) => e.txt!).toList() ?? [],
+                              selectedOptions: state.indexEntity?.certificateList?.where((e) => e.checked == "checked").map((e) => e.txt!).toList() ?? [],
                             ).marginOnly(left: 15, right: 15, top: 10),
                           ),
 
-                          //性别
-                          Visibility(
-                            visible: state.indexEntity?.sexList.isNotEmpty == true,
-                            child: MyTextView(
-                              "Gender".tr,
-                              textColor: Colors.white,
-                              fontSize: 14,
-                              isFontRegular: true,
-                              marginLeft: 15,
-                              marginTop: 15,
-                            ),
-                          ),
-
-                          //性别单选
-                          Visibility(
-                            visible: state.indexEntity?.sexList.isNotEmpty == true,
-                            child: CustomRadioCheck(
-                              options: state.indexEntity?.sexList.map((e) => e.txt!).toList() ?? [],
-                              onOptionSelected: (index, text) {
-                                state.gender = state.indexEntity!.sexList[index].value;
-                              },
-                              selectedPosition: state.indexEntity?.sexList.indexWhere((e) => e.checked == "checked") ?? -1,
-                            ).marginOnly(left: 15, right: 15, top: 10),
-                          ),
-
-                          //语言
+                          // 交通工具
                           MyTextView(
-                            "Language".tr,
+                            "Vehicle".tr,
                             textColor: Colors.white,
                             fontSize: 14,
                             isFontRegular: true,
@@ -173,26 +148,44 @@ class _LabourTemplateAddState extends BaseState<UKTemplateAddPage, TemplateAddCo
                             marginTop: 15,
                           ),
 
+                          //交通工具的多选
+                          Visibility(
+                            visible: state.indexEntity?.vehicleList?.isNotEmpty == true,
+                            child: CustomCheckBox(
+                              options: state.indexEntity?.vehicleList?.map((e) => e.txt!).toList() ?? [],
+                              onOptionsSelected: (selected) {
+                                // 转换选中的索引为对应的 value
+                                state.selectedVehicleList = selected
+                                    .map((index) {
+                                  return state.indexEntity?.vehicleList?[index].value; // 获取对应的 value
+                                })
+                                    .whereType<String>()
+                                    .toList();
+                              },
+                              selectedOptions: state.indexEntity?.vehicleList?.where((e) => e.checked == "checked").map((e) => e.txt!).toList() ?? [],
+                            ).marginOnly(left: 15, right: 15, top: 10),
+                          ),
+
                           // 语言的多选
-                          GetBuilder<TemplateAddController>(
-                            builder: (controller) {
-                              return CustomCheckBox(
-                                options: state.optionLanguageList,
-                                onOptionsSelected: (selected) {
-                                  // 转换选中的索引为对应的 value
-                                  state.selectedLanguageList = selected
-                                      .map((index) {
-                                        return state.indexEntity?.languageList[index].value; // 获取对应的 value
-                                      })
-                                      .whereType<String>()
-                                      .toList();
-                                },
-                                selectedOptions: state.indexEntity?.languageList.where((e) => e.checked == "checked").map((e) => e.txt!).toList() ?? [],
-                              );
-                            },
-                            id: "language",
-                            init: controller,
-                          ).marginOnly(left: 15, right: 15, top: 10),
+                          // GetBuilder<TemplateAddController>(
+                          //   builder: (controller) {
+                          //     return CustomCheckBox(
+                          //       options: state.optionLanguageList,
+                          //       onOptionsSelected: (selected) {
+                          //         // 转换选中的索引为对应的 value
+                          //         state.selectedLanguageList = selected
+                          //             .map((index) {
+                          //               return state.indexEntity?.languageList[index].value; // 获取对应的 value
+                          //             })
+                          //             .whereType<String>()
+                          //             .toList();
+                          //       },
+                          //       selectedOptions: state.indexEntity?.languageList.where((e) => e.checked == "checked").map((e) => e.txt!).toList() ?? [],
+                          //     );
+                          //   },
+                          //   id: "language",
+                          //   init: controller,
+                          // ).marginOnly(left: 15, right: 15, top: 10),
 
                           //备注
                           MyTextView(

+ 4 - 7
packages/cpt_uk/lib/modules/job/template_add/template_add_state.dart

@@ -1,4 +1,5 @@
 import 'package:domain/entity/response/job_template_edit_index_entity.dart';
+import 'package:domain/entity/response/u_k_template_detail_entity.dart';
 import 'package:flutter/material.dart';
 import 'package:plugin_basic/basic_export.dart';
 
@@ -34,12 +35,8 @@ class LabourTemplateAddState {
   String templateId = "";
   void Function(dynamic value)? cb;
 
-  JobTemplateEditIndexEntity? indexEntity;  //新增或者编辑的详情
+  UKTemplateDetailEntity? indexEntity;  //新增或者编辑的详情
 
-
-  List<String> selectedAgeList = [];   //选中的 age 的 id
-  List<String> selectedLanguageList = [];   //选中的 language 的 id
-  String? gender;
-
-  List<String> optionLanguageList =[];  // language 的选项字符串
+  List<String> selectedCertificateList = [];   //选中的 age 的 id
+  List<String> selectedVehicleList = [];   //选中的 language 的 id
 }

+ 41 - 16
packages/cpt_uk/lib/modules/job/template_list/item_template.dart

@@ -1,5 +1,5 @@
 import 'package:cs_resources/constants/color_constants.dart';
-import 'package:domain/entity/response/job_template_s_g_entity.dart';
+import 'package:domain/entity/response/u_k_template_entity.dart';
 import 'package:flutter/cupertino.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter/widgets.dart';
@@ -13,7 +13,7 @@ import 'package:widgets/my_text_view.dart';
  */
 class TemplateItem extends StatelessWidget {
   final int index;
-  final JobTemplateSGRows item;
+  final UKTemplateRows item;
   final VoidCallback? onDeleteAction;
   final VoidCallback? onEditAction;
 
@@ -43,13 +43,13 @@ class TemplateItem extends StatelessWidget {
             crossAxisAlignment: CrossAxisAlignment.center,
             children: [
               MyTextView(
-                "${"Template Name".tr}:",
+                "${"Title".tr}:",
                 isFontRegular: true,
                 textColor: ColorConstants.textGrayAECAE5,
                 fontSize: 14,
               ),
               MyTextView(
-                item.name ?? "-",
+                item.jobTitle ?? "-",
                 marginLeft: 5,
                 isFontMedium: true,
                 textColor: Colors.white,
@@ -58,19 +58,21 @@ class TemplateItem extends StatelessWidget {
             ],
           ),
 
-          // 创建人
+          // 证书
           Row(
             mainAxisSize: MainAxisSize.max,
             crossAxisAlignment: CrossAxisAlignment.center,
             children: [
               MyTextView(
-                "${"Created By".tr}:",
+                "${"Certificate".tr}:",
                 isFontRegular: true,
                 textColor: ColorConstants.textGrayAECAE5,
                 fontSize: 14,
               ),
+
+              //文本
               MyTextView(
-                item.createdBy ?? "-",
+                item.certificate ?? "-",
                 marginLeft: 5,
                 isFontRegular: true,
                 textColor: Colors.white,
@@ -79,21 +81,44 @@ class TemplateItem extends StatelessWidget {
             ],
           ).marginOnly(top: 14),
 
-          // 创建时间
+          // 交通工具
           Row(
             mainAxisSize: MainAxisSize.max,
             crossAxisAlignment: CrossAxisAlignment.center,
             children: [
               MyTextView(
-                "Created At:".tr,
+                "${"Vehicle".tr}:",
                 isFontRegular: true,
                 textColor: ColorConstants.textGrayAECAE5,
                 fontSize: 14,
               ),
 
-              //状态
+              //文本
               MyTextView(
-                item.createdAt ?? "-",
+                item.vehicle ?? "-",
+                marginLeft: 5,
+                isFontRegular: true,
+                textColor: Colors.white,
+                fontSize: 14,
+              ).expanded(),
+            ],
+          ).marginOnly(top: 14),
+
+          // 创建者
+          Row(
+            mainAxisSize: MainAxisSize.max,
+            crossAxisAlignment: CrossAxisAlignment.center,
+            children: [
+              MyTextView(
+                "${"Created By".tr}:",
+                isFontRegular: true,
+                textColor: ColorConstants.textGrayAECAE5,
+                fontSize: 14,
+              ),
+
+              //文本
+              MyTextView(
+                item.createdBy ?? "-",
                 marginLeft: 5,
                 isFontRegular: true,
                 textColor: Colors.white,
@@ -108,13 +133,13 @@ class TemplateItem extends StatelessWidget {
             crossAxisAlignment: CrossAxisAlignment.center,
             children: [
               MyTextView(
-                "${"Updated At".tr}:",
+                "${"Created At".tr}:",
                 isFontRegular: true,
                 textColor: ColorConstants.textGrayAECAE5,
                 fontSize: 14,
               ),
               MyTextView(
-                item.updatedAt ?? "-",
+                item.createdAt ?? "-",
                 marginLeft: 5,
                 isFontRegular: true,
                 textColor: Colors.white,
@@ -125,7 +150,7 @@ class TemplateItem extends StatelessWidget {
 
           //按钮组
           Visibility(
-            visible: item.actionList.isNotEmpty,
+            visible: true,
             child: Row(
               mainAxisSize: MainAxisSize.max,
               mainAxisAlignment: MainAxisAlignment.end,
@@ -133,7 +158,7 @@ class TemplateItem extends StatelessWidget {
               children: [
                 //编辑按钮
                 Visibility(
-                  visible: item.actionList.contains("edit"),
+                  visible: true,
                   child: MyButton(
                     onPressed: () {
                       FocusScope.of(context).unfocus();
@@ -150,7 +175,7 @@ class TemplateItem extends StatelessWidget {
 
                 //删除按钮
                 Visibility(
-                  visible: item.actionList.contains("delete"),
+                  visible: true,
                   child: MyButton(
                     onPressed: () {
                       FocusScope.of(context).unfocus();

+ 7 - 36
packages/cpt_uk/lib/modules/job/template_list/template_list_controller.dart

@@ -1,5 +1,6 @@
 import 'package:domain/entity/response/job_template_s_g_entity.dart';
-import 'package:domain/repository/labour_sg_repository.dart';
+import 'package:domain/entity/response/u_k_template_entity.dart';
+import 'package:domain/repository/uk_job_repository.dart';
 import 'package:get/get.dart';
 import 'package:plugin_platform/engine/dialog/dialog_engine.dart';
 import 'package:plugin_platform/engine/notify/notify_engine.dart';
@@ -13,7 +14,7 @@ import '../template_add/template_add_page.dart';
 import 'template_list_state.dart';
 
 class TemplateListController extends GetxController with DioCancelableMixin {
-  final LabourSGRepository _labourRepository = Get.find();
+  final UKJobRepository _labourRepository = Get.find();
   final TemplateListState state = TemplateListState();
 
   var _curPage = 1;
@@ -75,7 +76,7 @@ class TemplateListController extends GetxController with DioCancelableMixin {
   }
 
   // 处理数据与展示的逻辑
-  void handleList(List<JobTemplateSGRows>? list) {
+  void handleList(List<UKTemplateRows>? list) {
     if (list != null && list.isNotEmpty) {
       //有数据,判断是刷新还是加载更多的数据
       if (_curPage == 1) {
@@ -146,7 +147,8 @@ class TemplateListController extends GetxController with DioCancelableMixin {
   void gotoEditPage(String templateId) {
     UKTemplateAddPage.startInstance(templateId, (result) {
       if (result is String) {
-        fetchItemByIdAndRefreshItem(templateId);
+        //编辑完成之后刷机吧
+        refreshController.callRefresh();
       }
     });
   }
@@ -166,7 +168,7 @@ class TemplateListController extends GetxController with DioCancelableMixin {
   // 请求接口删除JobTitle
   void _requestDeactivate(int index) async {
     final item = state.datas[index];
-    var result = await _labourRepository.deleteJobTemplateSubmit(item.id.toString(), cancelToken: cancelToken);
+    var result = await _labourRepository.deleteJobTemplate(templateId: item.id, cancelToken: cancelToken);
 
     if (result.isSuccess) {
       NotifyEngine.showSuccess("Successful".tr);
@@ -181,35 +183,4 @@ class TemplateListController extends GetxController with DioCancelableMixin {
       ToastEngine.show(result.errorMsg ?? "Network Load Error".tr);
     }
   }
-
-  /// 根据ID获取Item对象,用于刷新
-  void fetchItemByIdAndRefreshItem(String ids) async {
-    var result = await _labourRepository.fetchJobTemplateListByIds(
-      ids,
-      cancelToken: cancelToken,
-    );
-
-    //处理数据
-    if (result.isSuccess) {
-      var data = result.data;
-      if (data != null && data.rows.isNotEmpty) {
-        List<JobTemplateSGRows> newItem = data.rows;
-
-        // 创建一个 Map 来加速查找
-        Map<int, JobTemplateSGRows> newItemMap = {for (var item in newItem) item.id: item};
-
-        // 遍历 state.datas 进行替换
-        for (int i = 0; i < state.datas.length; i++) {
-          if (newItemMap.containsKey(state.datas[i].id)) {
-            state.datas[i] = newItemMap[state.datas[i].id]!;
-          }
-        }
-
-        //刷新
-        update();
-      }
-    } else {
-      ToastEngine.show(result.errorMsg ?? "Network Load Error".tr);
-    }
-  }
 }

+ 2 - 1
packages/cpt_uk/lib/modules/job/template_list/template_list_state.dart

@@ -1,4 +1,5 @@
 import 'package:domain/entity/response/job_template_s_g_entity.dart';
+import 'package:domain/entity/response/u_k_template_entity.dart';
 import 'package:flutter/material.dart';
 
 class TemplateListState {
@@ -8,6 +9,6 @@ class TemplateListState {
   String keyword = "";
 
   //页面的列表数据
-  List<JobTemplateSGRows> datas = [];
+  List<UKTemplateRows> datas = [];
 
 }

+ 64 - 0
packages/cs_domain/lib/entity/response/u_k_template_detail_entity.dart

@@ -0,0 +1,64 @@
+import 'package:domain/entity/response/index_option_entity.dart';
+import 'package:domain/generated/json/base/json_field.dart';
+import 'package:domain/generated/json/u_k_template_detail_entity.g.dart';
+import 'dart:convert';
+export 'package:domain/generated/json/u_k_template_detail_entity.g.dart';
+
+@JsonSerializable()
+class UKTemplateDetailEntity {
+  UKTemplateDetailRow? row;
+  @JSONField(name: "certificate_list")
+  List<IndexOptionEntity>? certificateList = [];
+  @JSONField(name: "vehicle_list")
+  List<IndexOptionEntity>? vehicleList = [];
+
+  UKTemplateDetailEntity();
+
+  factory UKTemplateDetailEntity.fromJson(Map<String, dynamic> json) => $UKTemplateDetailEntityFromJson(json);
+
+  Map<String, dynamic> toJson() => $UKTemplateDetailEntityToJson(this);
+
+  @override
+  String toString() {
+    return jsonEncode(this);
+  }
+}
+
+@JsonSerializable()
+class UKTemplateDetailRow {
+  String? id;
+  @JSONField(name: "company_id")
+  String? companyId;
+  @JSONField(name: "job_title")
+  String? jobTitle;
+  @JSONField(name: "contact_name")
+  String? contactName;
+  @JSONField(name: "contact_no")
+  String? contactNo;
+  String? vehicle;
+  String? certificate;
+  String? age;
+  String? language;
+  int gender = 0;
+  String? description;
+  String? note;
+  @JSONField(name: "operator_id")
+  String? operatorId;
+  @JSONField(name: "created_at")
+  String? createdAt;
+  @JSONField(name: "updated_at")
+  String? updatedAt;
+  @JSONField(name: "deleted_at")
+  String? deletedAt;
+
+  UKTemplateDetailRow();
+
+  factory UKTemplateDetailRow.fromJson(Map<String, dynamic> json) => $UKTemplateDetailRowFromJson(json);
+
+  Map<String, dynamic> toJson() => $UKTemplateDetailRowToJson(this);
+
+  @override
+  String toString() {
+    return jsonEncode(this);
+  }
+}

+ 45 - 0
packages/cs_domain/lib/entity/response/u_k_template_entity.dart

@@ -0,0 +1,45 @@
+import 'package:domain/generated/json/base/json_field.dart';
+import 'package:domain/generated/json/u_k_template_entity.g.dart';
+import 'dart:convert';
+export 'package:domain/generated/json/u_k_template_entity.g.dart';
+
+@JsonSerializable()
+class UKTemplateEntity {
+	int total = 0;
+	List<UKTemplateRows> rows = [];
+
+	UKTemplateEntity();
+
+	factory UKTemplateEntity.fromJson(Map<String, dynamic> json) => $UKTemplateEntityFromJson(json);
+
+	Map<String, dynamic> toJson() => $UKTemplateEntityToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}
+
+@JsonSerializable()
+class UKTemplateRows {
+	String? id;
+	@JSONField(name: "job_title")
+	String? jobTitle;
+	String? vehicle;
+	String? certificate;
+	@JSONField(name: "created_by")
+	String? createdBy;
+	@JSONField(name: "created_at")
+	String? createdAt;
+
+	UKTemplateRows();
+
+	factory UKTemplateRows.fromJson(Map<String, dynamic> json) => $UKTemplateRowsFromJson(json);
+
+	Map<String, dynamic> toJson() => $UKTemplateRowsToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}

+ 18 - 0
packages/cs_domain/lib/generated/json/base/json_convert_content.dart

@@ -84,6 +84,8 @@ import 'package:domain/entity/response/u_k_report_labour_entity.dart';
 import 'package:domain/entity/response/u_k_report_working_hours_entity.dart';
 import 'package:domain/entity/response/u_k_security_attendance_entity.dart';
 import 'package:domain/entity/response/u_k_security_attendance_option_entity.dart';
+import 'package:domain/entity/response/u_k_template_detail_entity.dart';
+import 'package:domain/entity/response/u_k_template_entity.dart';
 import 'package:domain/entity/server_time.dart';
 
 JsonConvert jsonConvert = JsonConvert();
@@ -721,6 +723,18 @@ class JsonConvert {
     if (<UKSecurityAttendanceOptionFilter>[] is M) {
       return data.map<UKSecurityAttendanceOptionFilter>((Map<String, dynamic> e) => UKSecurityAttendanceOptionFilter.fromJson(e)).toList() as M;
     }
+    if (<UKTemplateDetailEntity>[] is M) {
+      return data.map<UKTemplateDetailEntity>((Map<String, dynamic> e) => UKTemplateDetailEntity.fromJson(e)).toList() as M;
+    }
+    if (<UKTemplateDetailRow>[] is M) {
+      return data.map<UKTemplateDetailRow>((Map<String, dynamic> e) => UKTemplateDetailRow.fromJson(e)).toList() as M;
+    }
+    if (<UKTemplateEntity>[] is M) {
+      return data.map<UKTemplateEntity>((Map<String, dynamic> e) => UKTemplateEntity.fromJson(e)).toList() as M;
+    }
+    if (<UKTemplateRows>[] is M) {
+      return data.map<UKTemplateRows>((Map<String, dynamic> e) => UKTemplateRows.fromJson(e)).toList() as M;
+    }
     if (<ServerTime>[] is M) {
       return data.map<ServerTime>((Map<String, dynamic> e) => ServerTime.fromJson(e)).toList() as M;
     }
@@ -912,6 +926,10 @@ class JsonConvertClassCollection {
     (UKSecurityInOut).toString(): UKSecurityInOut.fromJson,
     (UKSecurityAttendanceOptionEntity).toString(): UKSecurityAttendanceOptionEntity.fromJson,
     (UKSecurityAttendanceOptionFilter).toString(): UKSecurityAttendanceOptionFilter.fromJson,
+    (UKTemplateDetailEntity).toString(): UKTemplateDetailEntity.fromJson,
+    (UKTemplateDetailRow).toString(): UKTemplateDetailRow.fromJson,
+    (UKTemplateEntity).toString(): UKTemplateEntity.fromJson,
+    (UKTemplateRows).toString(): UKTemplateRows.fromJson,
     (ServerTime).toString(): ServerTime.fromJson,
   };
 

+ 173 - 0
packages/cs_domain/lib/generated/json/u_k_template_detail_entity.g.dart

@@ -0,0 +1,173 @@
+import 'package:domain/generated/json/base/json_convert_content.dart';
+import 'package:domain/entity/response/u_k_template_detail_entity.dart';
+import 'package:domain/entity/response/index_option_entity.dart';
+
+
+UKTemplateDetailEntity $UKTemplateDetailEntityFromJson(Map<String, dynamic> json) {
+  final UKTemplateDetailEntity uKTemplateDetailEntity = UKTemplateDetailEntity();
+  final UKTemplateDetailRow? row = jsonConvert.convert<UKTemplateDetailRow>(json['row']);
+  if (row != null) {
+    uKTemplateDetailEntity.row = row;
+  }
+  final List<IndexOptionEntity>? certificateList = (json['certificate_list'] as List<dynamic>?)?.map(
+          (e) => jsonConvert.convert<IndexOptionEntity>(e) as IndexOptionEntity).toList();
+  if (certificateList != null) {
+    uKTemplateDetailEntity.certificateList = certificateList;
+  }
+  final List<IndexOptionEntity>? vehicleList = (json['vehicle_list'] as List<dynamic>?)?.map(
+          (e) => jsonConvert.convert<IndexOptionEntity>(e) as IndexOptionEntity).toList();
+  if (vehicleList != null) {
+    uKTemplateDetailEntity.vehicleList = vehicleList;
+  }
+  return uKTemplateDetailEntity;
+}
+
+Map<String, dynamic> $UKTemplateDetailEntityToJson(UKTemplateDetailEntity entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['row'] = entity.row?.toJson();
+  data['certificate_list'] = entity.certificateList?.map((v) => v.toJson()).toList();
+  data['vehicle_list'] = entity.vehicleList?.map((v) => v.toJson()).toList();
+  return data;
+}
+
+extension UKTemplateDetailEntityExtension on UKTemplateDetailEntity {
+  UKTemplateDetailEntity copyWith({
+    UKTemplateDetailRow? row,
+    List<IndexOptionEntity>? certificateList,
+    List<IndexOptionEntity>? vehicleList,
+  }) {
+    return UKTemplateDetailEntity()
+      ..row = row ?? this.row
+      ..certificateList = certificateList ?? this.certificateList
+      ..vehicleList = vehicleList ?? this.vehicleList;
+  }
+}
+
+UKTemplateDetailRow $UKTemplateDetailRowFromJson(Map<String, dynamic> json) {
+  final UKTemplateDetailRow uKTemplateDetailRow = UKTemplateDetailRow();
+  final String? id = jsonConvert.convert<String>(json['id']);
+  if (id != null) {
+    uKTemplateDetailRow.id = id;
+  }
+  final String? companyId = jsonConvert.convert<String>(json['company_id']);
+  if (companyId != null) {
+    uKTemplateDetailRow.companyId = companyId;
+  }
+  final String? jobTitle = jsonConvert.convert<String>(json['job_title']);
+  if (jobTitle != null) {
+    uKTemplateDetailRow.jobTitle = jobTitle;
+  }
+  final String? contactName = jsonConvert.convert<String>(json['contact_name']);
+  if (contactName != null) {
+    uKTemplateDetailRow.contactName = contactName;
+  }
+  final String? contactNo = jsonConvert.convert<String>(json['contact_no']);
+  if (contactNo != null) {
+    uKTemplateDetailRow.contactNo = contactNo;
+  }
+  final String? vehicle = jsonConvert.convert<String>(json['vehicle']);
+  if (vehicle != null) {
+    uKTemplateDetailRow.vehicle = vehicle;
+  }
+  final String? certificate = jsonConvert.convert<String>(json['certificate']);
+  if (certificate != null) {
+    uKTemplateDetailRow.certificate = certificate;
+  }
+  final String? age = jsonConvert.convert<String>(json['age']);
+  if (age != null) {
+    uKTemplateDetailRow.age = age;
+  }
+  final String? language = jsonConvert.convert<String>(json['language']);
+  if (language != null) {
+    uKTemplateDetailRow.language = language;
+  }
+  final int? gender = jsonConvert.convert<int>(json['gender']);
+  if (gender != null) {
+    uKTemplateDetailRow.gender = gender;
+  }
+  final String? description = jsonConvert.convert<String>(json['description']);
+  if (description != null) {
+    uKTemplateDetailRow.description = description;
+  }
+  final String? note = jsonConvert.convert<String>(json['note']);
+  if (note != null) {
+    uKTemplateDetailRow.note = note;
+  }
+  final String? operatorId = jsonConvert.convert<String>(json['operator_id']);
+  if (operatorId != null) {
+    uKTemplateDetailRow.operatorId = operatorId;
+  }
+  final String? createdAt = jsonConvert.convert<String>(json['created_at']);
+  if (createdAt != null) {
+    uKTemplateDetailRow.createdAt = createdAt;
+  }
+  final String? updatedAt = jsonConvert.convert<String>(json['updated_at']);
+  if (updatedAt != null) {
+    uKTemplateDetailRow.updatedAt = updatedAt;
+  }
+  final String? deletedAt = jsonConvert.convert<String>(json['deleted_at']);
+  if (deletedAt != null) {
+    uKTemplateDetailRow.deletedAt = deletedAt;
+  }
+  return uKTemplateDetailRow;
+}
+
+Map<String, dynamic> $UKTemplateDetailRowToJson(UKTemplateDetailRow entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['id'] = entity.id;
+  data['company_id'] = entity.companyId;
+  data['job_title'] = entity.jobTitle;
+  data['contact_name'] = entity.contactName;
+  data['contact_no'] = entity.contactNo;
+  data['vehicle'] = entity.vehicle;
+  data['certificate'] = entity.certificate;
+  data['age'] = entity.age;
+  data['language'] = entity.language;
+  data['gender'] = entity.gender;
+  data['description'] = entity.description;
+  data['note'] = entity.note;
+  data['operator_id'] = entity.operatorId;
+  data['created_at'] = entity.createdAt;
+  data['updated_at'] = entity.updatedAt;
+  data['deleted_at'] = entity.deletedAt;
+  return data;
+}
+
+extension UKTemplateDetailRowExtension on UKTemplateDetailRow {
+  UKTemplateDetailRow copyWith({
+    String? id,
+    String? companyId,
+    String? jobTitle,
+    String? contactName,
+    String? contactNo,
+    String? vehicle,
+    String? certificate,
+    String? age,
+    String? language,
+    int? gender,
+    String? description,
+    String? note,
+    String? operatorId,
+    String? createdAt,
+    String? updatedAt,
+    String? deletedAt,
+  }) {
+    return UKTemplateDetailRow()
+      ..id = id ?? this.id
+      ..companyId = companyId ?? this.companyId
+      ..jobTitle = jobTitle ?? this.jobTitle
+      ..contactName = contactName ?? this.contactName
+      ..contactNo = contactNo ?? this.contactNo
+      ..vehicle = vehicle ?? this.vehicle
+      ..certificate = certificate ?? this.certificate
+      ..age = age ?? this.age
+      ..language = language ?? this.language
+      ..gender = gender ?? this.gender
+      ..description = description ?? this.description
+      ..note = note ?? this.note
+      ..operatorId = operatorId ?? this.operatorId
+      ..createdAt = createdAt ?? this.createdAt
+      ..updatedAt = updatedAt ?? this.updatedAt
+      ..deletedAt = deletedAt ?? this.deletedAt;
+  }
+}

+ 93 - 0
packages/cs_domain/lib/generated/json/u_k_template_entity.g.dart

@@ -0,0 +1,93 @@
+import 'package:domain/generated/json/base/json_convert_content.dart';
+import 'package:domain/entity/response/u_k_template_entity.dart';
+
+UKTemplateEntity $UKTemplateEntityFromJson(Map<String, dynamic> json) {
+  final UKTemplateEntity uKTemplateEntity = UKTemplateEntity();
+  final int? total = jsonConvert.convert<int>(json['total']);
+  if (total != null) {
+    uKTemplateEntity.total = total;
+  }
+  final List<UKTemplateRows>? rows = (json['rows'] as List<dynamic>?)?.map(
+          (e) => jsonConvert.convert<UKTemplateRows>(e) as UKTemplateRows).toList();
+  if (rows != null) {
+    uKTemplateEntity.rows = rows;
+  }
+  return uKTemplateEntity;
+}
+
+Map<String, dynamic> $UKTemplateEntityToJson(UKTemplateEntity entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['total'] = entity.total;
+  data['rows'] = entity.rows.map((v) => v.toJson()).toList();
+  return data;
+}
+
+extension UKTemplateEntityExtension on UKTemplateEntity {
+  UKTemplateEntity copyWith({
+    int? total,
+    List<UKTemplateRows>? rows,
+  }) {
+    return UKTemplateEntity()
+      ..total = total ?? this.total
+      ..rows = rows ?? this.rows;
+  }
+}
+
+UKTemplateRows $UKTemplateRowsFromJson(Map<String, dynamic> json) {
+  final UKTemplateRows uKTemplateRows = UKTemplateRows();
+  final String? id = jsonConvert.convert<String>(json['id']);
+  if (id != null) {
+    uKTemplateRows.id = id;
+  }
+  final String? jobTitle = jsonConvert.convert<String>(json['job_title']);
+  if (jobTitle != null) {
+    uKTemplateRows.jobTitle = jobTitle;
+  }
+  final String? vehicle = jsonConvert.convert<String>(json['vehicle']);
+  if (vehicle != null) {
+    uKTemplateRows.vehicle = vehicle;
+  }
+  final String? certificate = jsonConvert.convert<String>(json['certificate']);
+  if (certificate != null) {
+    uKTemplateRows.certificate = certificate;
+  }
+  final String? createdBy = jsonConvert.convert<String>(json['created_by']);
+  if (createdBy != null) {
+    uKTemplateRows.createdBy = createdBy;
+  }
+  final String? createdAt = jsonConvert.convert<String>(json['created_at']);
+  if (createdAt != null) {
+    uKTemplateRows.createdAt = createdAt;
+  }
+  return uKTemplateRows;
+}
+
+Map<String, dynamic> $UKTemplateRowsToJson(UKTemplateRows entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['id'] = entity.id;
+  data['job_title'] = entity.jobTitle;
+  data['vehicle'] = entity.vehicle;
+  data['certificate'] = entity.certificate;
+  data['created_by'] = entity.createdBy;
+  data['created_at'] = entity.createdAt;
+  return data;
+}
+
+extension UKTemplateRowsExtension on UKTemplateRows {
+  UKTemplateRows copyWith({
+    String? id,
+    String? jobTitle,
+    String? vehicle,
+    String? certificate,
+    String? createdBy,
+    String? createdAt,
+  }) {
+    return UKTemplateRows()
+      ..id = id ?? this.id
+      ..jobTitle = jobTitle ?? this.jobTitle
+      ..vehicle = vehicle ?? this.vehicle
+      ..certificate = certificate ?? this.certificate
+      ..createdBy = createdBy ?? this.createdBy
+      ..createdAt = createdAt ?? this.createdAt;
+  }
+}

+ 185 - 1
packages/cs_domain/lib/repository/uk_job_repository.dart

@@ -1,5 +1,12 @@
+import 'package:domain/entity/response/u_k_template_detail_entity.dart';
+import 'package:domain/entity/response/u_k_template_entity.dart';
 import 'package:get/get.dart';
 import 'package:plugin_platform/http/http_provider.dart';
+import 'package:plugin_platform/http/http_result.dart';
+import 'package:plugin_platform/platform_export.dart';
+import 'package:shared/utils/util.dart';
+
+import '../constants/api_constants.dart';
 
 /// UK工作相关数据仓库
 class UKJobRepository extends GetxService {
@@ -7,4 +14,181 @@ class UKJobRepository extends GetxService {
 
   UKJobRepository({required this.httpProvider});
 
-}
+  /// 用工模版中的工作标题列表
+  Future<HttpResult<UKTemplateEntity>> fetchJobTemplateList(
+    String? keyword, {
+    required int curPage,
+    CancelToken? cancelToken,
+  }) async {
+    //参数
+    Map<String, String> params = {};
+    params["cur_page"] = curPage.toString();
+    params["page_size"] = "10";
+
+    if (!Utils.isEmpty(keyword)) {
+      params["job_title"] = keyword!;
+    }
+
+    final result = await httpProvider.requestNetResult(
+      ApiConstants.apiJobTemplateListSG,
+      params: params,
+      cancelToken: cancelToken,
+    );
+
+    if (result.isSuccess) {
+      final json = result.getDataJson();
+      var data = UKTemplateEntity.fromJson(json!);
+      return result.convert<UKTemplateEntity>(data: data);
+    }
+    return result.convert();
+  }
+
+  /// 用工模版中的添加选项
+  Future<HttpResult<UKTemplateDetailEntity>> fetchJobTemplateIndex({
+    CancelToken? cancelToken,
+  }) async {
+    final result = await httpProvider.requestNetResult(
+      ApiConstants.apiJobTemplateAddIndexSG,
+      isShowLoadingDialog: true,
+      cancelToken: cancelToken,
+    );
+
+    if (result.isSuccess) {
+      final json = result.getDataJson();
+      var data = UKTemplateDetailEntity.fromJson(json!);
+      return result.convert<UKTemplateDetailEntity>(data: data);
+    }
+    return result.convert();
+  }
+
+  /// 工作模板的添加提交
+  Future<HttpResult> addJobTemplateSubmit({
+    required String jobTitle,
+    List<String>? certificate,
+    List<String>? vehicle,
+    String? note,
+    String? desc,
+    CancelToken? cancelToken,
+  }) async {
+    //参数
+    Map<String, dynamic> params = {};
+    params['job_title'] = jobTitle;
+
+    if (certificate != null && certificate.isNotEmpty) {
+      params['certificate[]'] = certificate;
+    }
+    if (vehicle != null && vehicle.isNotEmpty) {
+      params['vehicle[]'] = vehicle;
+    }
+    if (Utils.isNotEmpty(note)) {
+      params['note'] = note ?? "";
+    }
+    if (Utils.isNotEmpty(desc)) {
+      params['description'] = desc ?? "";
+    }
+
+    final result = await httpProvider.requestNetResult(
+      ApiConstants.apiJobTemplateAddSubmitSG,
+      method: HttpMethod.POST,
+      params: params,
+      networkDebounce: true,
+      isShowLoadingDialog: true,
+      cancelToken: cancelToken,
+    );
+
+    if (result.isSuccess) {
+      return result.convert();
+    }
+    return result.convert();
+  }
+
+  /// 用工模版中的详情
+  Future<HttpResult<UKTemplateDetailEntity>> fetchJobTemplateDetail({
+    required String? templateId,
+    CancelToken? cancelToken,
+  }) async {
+    Map<String, String> params = {};
+    params['template_id'] = templateId ?? "";
+
+    final result = await httpProvider.requestNetResult(
+      ApiConstants.apiJobTemplateEditIndexSG,
+      params: params,
+      isShowLoadingDialog: true,
+      cancelToken: cancelToken,
+    );
+
+    if (result.isSuccess) {
+      final json = result.getDataJson();
+      var data = UKTemplateDetailEntity.fromJson(json!);
+      return result.convert<UKTemplateDetailEntity>(data: data);
+    }
+    return result.convert();
+  }
+
+  /// 工作模板的编辑提交
+  Future<HttpResult> editJobTemplateSubmit({
+    required String templateId,
+    required String jobTitle,
+    List<String>? certificate,
+    List<String>? vehicle,
+    String? note,
+    String? desc,
+    CancelToken? cancelToken,
+  }) async {
+    //参数
+    Map<String, dynamic> params = {};
+    params['job_title'] = jobTitle;
+    params['template_id'] = templateId;
+
+    if (certificate != null && certificate.isNotEmpty) {
+      params['certificate[]'] = certificate;
+    }
+    if (vehicle != null && vehicle.isNotEmpty) {
+      params['vehicle[]'] = vehicle;
+    }
+    if (Utils.isNotEmpty(note)) {
+      params['note'] = note ?? "";
+    }
+    if (Utils.isNotEmpty(desc)) {
+      params['description'] = desc ?? "";
+    }
+
+    final result = await httpProvider.requestNetResult(
+      ApiConstants.apiJobTemplateEditSubmitSG,
+      method: HttpMethod.POST,
+      params: params,
+      networkDebounce: true,
+      isShowLoadingDialog: true,
+      cancelToken: cancelToken,
+    );
+
+    if (result.isSuccess) {
+      return result.convert();
+    }
+    return result.convert();
+  }
+
+  ///工作模板的删除
+  Future<HttpResult> deleteJobTemplate({
+    required String? templateId,
+    CancelToken? cancelToken,
+  }) async {
+    //参数
+    Map<String, String> params = {};
+    params['template_id'] = templateId ?? "";
+
+    final result = await httpProvider.requestNetResult(
+      ApiConstants.apiJobTemplateDeleteSG,
+      method: HttpMethod.POST,
+      params: params,
+      networkDebounce: true,
+      isShowLoadingDialog: true,
+      cancelToken: cancelToken,
+    );
+
+    if (result.isSuccess) {
+      return result.convert();
+    }
+    return result.convert();
+  }
+}

+ 2 - 0
packages/cs_resources/lib/local/language/en_US.dart

@@ -294,6 +294,8 @@ const Map<String, String> en_US = {
   'Contract Rate Management': 'Contract Rate Management',
   'No Register': 'No Register',
   'Expired': 'Expired',
+  'Certificate': 'Certificate',
+  'Vehicle': 'Vehicle',
 
   //插件的国际化
   'Pull to refresh': 'Pull to refresh',

+ 2 - 0
packages/cs_resources/lib/local/language/zh_CN.dart

@@ -294,6 +294,8 @@ const Map<String, String> zh_CN = {
   'Contract Rate Management': '合同时薪管理',
   'No Register': '未注册',
   'Expired': '已过期',
+  'Certificate': '证书',
+  'Vehicle': '交通工具',
 
   //插件的国际化
   'Pull to refresh': '下拉刷新',