123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362 |
- import 'package:fis_jsonrpc/rpc.dart';
- import 'package:get/get.dart';
- import 'package:vitalapp/architecture/defines.dart';
- import 'package:vitalapp/architecture/utils/prompt_box.dart';
- import 'package:vitalapp/managers/interfaces/device.dart';
- import 'package:vitalapp/managers/interfaces/models/device.dart';
- import 'package:vitalapp/managers/interfaces/patient.dart';
- import 'package:vitalapp/pages/controllers/crowd_labels.dart';
- import 'package:vitalapp/pages/controllers/home_nav_mixin.dart';
- import 'package:vitalapp/pages/facial_recognition/view.dart';
- import 'package:vitalapp/pages/patient/bluetooth_card_reader/view.dart';
- import 'package:vitalapp/pages/patient/card_reader/index.dart';
- import 'package:vitalapp/pages/patient/create/state.dart';
- import 'package:vitalapp/pages/patient/list/controller.dart';
- import 'package:vitalapp/routes/nav_ids.dart';
- import 'package:vnote_device_plugin/consts/types.dart';
- import '../../facial_recognition/index.dart';
- class CreatePatientController extends FControllerBase with HomeNavMixin {
- final _patientManager = Get.find<IPatientManager>();
- final crowdLabelsController = Get.find<CrowdLabelsController>();
- final _patientListController = Get.find<PatientListController>();
- final _deviceManager = Get.find<IDeviceManager>();
- final state = CreatePatientState();
- @override
- Future<void> onLoad() {
- final params = Get.parameters;
- if (params.containsKey("from")) {
- if (params["from"] == "list") {
- state.isCreateOnly = true;
- }
- }
- return super.onLoad();
- }
- /// 保存档案,调整签约
- void gotoSignContract() async {
- setBusy("正在保存...");
- String? code;
- try {
- code = await _submitForm();
- if (code == null) {
- busy = false;
- PromptBox.toast("保存失败");
- return;
- }
- // final code = "13B95A2B2790464BBFD9B30A71F15C95";
- busy = false;
- Future.delayed(
- const Duration(milliseconds: 800),
- () {
- state.reset(); // 重置状态
- },
- );
- } finally {
- if (code != null) {
- Get.toNamed(
- "/contract/package_list",
- parameters: {"patientCode": code},
- );
- }
- }
- // Get.find<HomeController>().switchNavByName("/patient/list");
- // Future.delayed(
- // const Duration(milliseconds: 800),
- // () {
- // // TODO:
- // Get.find<PatientListController>().gotoDetail(code);
- // busy = false;
- // },
- // );
- }
- /// 存为档案,调整到档案详情
- void gotoPatientDetail() async {
- setBusy("正在保存...");
- final code = await _submitForm();
- if (code == null) {
- busy = false;
- PromptBox.toast("保存失败");
- return;
- } else {
- Future.delayed(
- const Duration(milliseconds: 800),
- () {
- state.reset(); // 重置状态
- busy = false;
- PromptBox.toast("保存成功");
- _patientListController.reloadList();
- },
- );
- }
- ///不跳转到详情页
- // Get.find<HomeController>().switchNavByName("/patient/list");
- // Get.put(PatientListController());
- Future.delayed(
- const Duration(milliseconds: 800),
- () {
- Get.find<PatientListController>().gotoDetail(code);
- busy = false;
- },
- );
- }
- /// 保存并返回
- void saveAndBack() async {
- setBusy("正在保存...");
- final code = await _submitForm();
- busy = false;
- if (code == null) {
- busy = false;
- return;
- }
- Get.back(result: code, id: NavIds.HOME);
- }
- Future<DeviceModel?> getDevice(String type) async {
- List<DeviceModel> devices = await _deviceManager.getDeviceList();
- return devices.firstWhereOrNull((element) => element.type == type);
- }
- /// 点击读卡事件
- void onReadCardClicked() async {
- final DeviceModel? device = await getDevice(DeviceTypes.IC_READER);
- final CardReaderResult? result;
- if (device != null) {
- // return;
- result = await Get.dialog<CardReaderResult>(
- const BluetoothCardReaderDialog(),
- );
- } else {
- result = await Get.dialog<CardReaderResult>(
- const CardReaderDialog(),
- );
- }
- if (result != null && result.success) {
- PromptBox.toast("读取成功");
- state.cardNo = result.cardNo; // 回填身份证号
- state.name = result.name; // 回填姓名
- state.gender = result.gender; // 回填性别
- state.nation = result.nation; // 回填民族
- state.birthday = result.birthday; // 回填出生日期
- state.censusRegister = result.address; // 回填户籍地址
- if (state.isSyncAddresses) {
- state.address = result.address; // 回填现住地址
- }
- } else {
- print("读卡取消");
- }
- }
- /// 点击身份识别建档
- void onFaceRecognitionClicked() async {
- final FaceRecognitionResult? result = await Get.to<FaceRecognitionResult>(
- () => const FacialRecognitionPage(),
- );
- if (result != null && result.success) {
- PromptBox.toast("录入成功");
- state.cardNo = result.cardNo; // 回填身份证号
- state.name = result.name; // 回填姓名
- state.gender = result.gender; // 回填性别
- state.nation = result.nation; // 回填民族
- state.birthday = result.birthday; // 回填出生日期
- state.censusRegister = result.address; // 回填户籍地址
- if (state.isSyncAddresses) {
- state.address = result.address; // 回填现住地址
- }
- } else {
- print("识别取消");
- }
- }
- /// 处理 “同户籍地址” 勾选变更事件
- void onSyncAddressCheckChanged(bool isChecked) {
- state.isSyncAddresses = isChecked;
- if (isChecked) {
- // 同步户籍地址到现住地址
- state.address = state.censusRegister;
- } else {
- state.address = "";
- }
- }
- /// 处理户籍地址变更
- void onCensusRegisterChanged(String value) {
- state.censusRegister = value;
- if (state.isSyncAddresses) {
- state.address = value;
- }
- }
- Future<String?> _submitForm() async {
- final validateMsg = await _validateForm();
- if (validateMsg != null) {
- toast(validateMsg);
- return null;
- }
- final crowdLabelCodes = crowdLabelsController.state.selectedCodes;
- final request = CreatePatientRequest(
- patientName: state.name,
- phone: state.phoneNo,
- patientGender: state.gender,
- nationality: state.nation,
- birthday: state.birthday?.toUtc(),
- cardType: state.cardType,
- cardNo: state.cardNo,
- patientAddress: state.address,
- permanentResidenceAddress: state.censusRegister,
- crowdLabels: crowdLabelCodes,
- );
- final result = await _patientManager.create(request);
- return result;
- }
- bool validateIDCard(String idCard) {
- // 校验身份证号码长度
- if (idCard.length != 18) {
- return false;
- }
- // 校验前17位是否为数字
- String idCard17 = idCard.substring(0, 17);
- if (!isNumeric(idCard17)) {
- return false;
- }
- // 校验最后一位校验码
- String checkCode = getCheckCode(idCard17);
- if (idCard[17].toUpperCase() != checkCode) {
- return false;
- }
- return true;
- }
- bool isNumeric(String str) {
- if (str.isEmpty) {
- return false;
- }
- return double.tryParse(str) != null;
- }
- bool isAlphaNumeric(String str) {
- final RegExp alphaNumericRegExp = RegExp(r'^[a-zA-Z0-9]+$');
- return alphaNumericRegExp.hasMatch(str);
- }
- bool isAlphaNumericChineseWithSpace(String str) {
- final RegExp alphaNumericChineseWithSpaceRegExp =
- RegExp(r'^[a-zA-Z0-9\u4e00-\u9fa5\s]+$');
- return alphaNumericChineseWithSpaceRegExp.hasMatch(str);
- }
- String getCheckCode(String idCard17) {
- List<int> coefficients = [
- 7,
- 9,
- 10,
- 5,
- 8,
- 4,
- 2,
- 1,
- 6,
- 3,
- 7,
- 9,
- 10,
- 5,
- 8,
- 4,
- 2
- ];
- List<String> checkCodes = [
- '1',
- '0',
- 'X',
- '9',
- '8',
- '7',
- '6',
- '5',
- '4',
- '3',
- '2'
- ];
- int sum = 0;
- for (int i = 0; i < idCard17.length; i++) {
- int digit = int.parse(idCard17[i]);
- sum += digit * coefficients[i];
- }
- int remainder = sum % 11;
- return checkCodes[remainder];
- }
- Future<String?> _validateForm() async {
- if (state.name.isEmpty) {
- return "请填写姓名";
- }
- // else {
- // if (!isAlphaNumericChineseWithSpace(state.name) ||
- // state.name.length >= 20) {
- // return "姓名只能由中文、字母或数字组成,并且小于20个字符";
- // }
- // }
- if (state.cardNo.isEmpty) {
- return "请填写证件号";
- }
- if (state.phoneNo.isNotEmpty) {
- if (state.phoneNo.length != 11 || !isNumeric(state.phoneNo)) {
- return "请填写正确的手机号";
- }
- }
- if (state.cardType == CardTypeEnum.Identity) {
- bool isNotIDCard = validateIDCard(state.cardNo);
- if (!isNotIDCard) {
- return "请填写正确的证件号";
- }
- }
- if (state.cardType == CardTypeEnum.SocialInsurance) {
- if (state.cardNo.length != 18 || !isNumeric(state.cardNo)) {
- return "请填写正确的社保号";
- }
- }
- if (state.cardType == CardTypeEnum.Passport) {
- if (state.cardNo.length != 9 || !isAlphaNumeric(state.cardNo)) {
- return "请填写正确的护照号";
- }
- }
- /// TODO 需求变更暂时删除
- // final selectedNormalCodes = crowdLabelsController.state.selectedNormalCodes;
- // if (selectedNormalCodes.length > 1) {
- // return "人群分类:一般人群、儿童、孕妇、老年人,只可选择其一!";
- // }
- // final crowdLabelCodes = crowdLabelsController.state.selectedCodes;
- // if (crowdLabelCodes.isEmpty) {
- // return "请选择人群分类";
- // }
- // if (state.gender == GenderEnum.Male &&
- // crowdLabelCodes.contains('RQFL_YF')) {
- // return "当前居民性别为“男”,人群分类不可选择孕妇!";
- // }
- return null;
- }
- }
|