You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

ocrHandle.ts 13KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464
  1. import { reactive } from "vue";
  2. import { requestNew } from "@/utils/network/request";
  3. import { Index, handleDataList } from "@/components/form-builder/tools";
  4. import { etcCarOcrCard, fileUpload } from "@/utils/network/api.js";
  5. import { useQdOrderStore } from "@/stores/qdOrder.js";
  6. // 配合formBuilderVue3模板使用
  7. export default function() {
  8. const ocrDataFu = [
  9. {
  10. title: "准牵引总质量(kg)",
  11. key: "towing",
  12. isNumbers: true,
  13. sendKey: "permittedTowWeight"
  14. },
  15. {
  16. title: "核定载人数",
  17. key: "apc",
  18. isNumbers: true,
  19. sendKey: "approvedCount"
  20. },
  21. {
  22. title: "核定载质量(kg)",
  23. isNumbers: true,
  24. key: "alc",
  25. sendKey: "permittedWeight"
  26. },
  27. {
  28. title: "总质量(kg)",
  29. isNumbers: true,
  30. key: "gross",
  31. sendKey: "totalMass"
  32. },
  33. {
  34. title: "整备质量(kg)",
  35. isNumbers: true,
  36. key: "unladen",
  37. sendKey: "maintenaceMass"
  38. },
  39. {
  40. title: "外廓尺寸",
  41. key: "overall",
  42. substring: 2, //截取最后两位
  43. sendKey: "vehicleDimensions"
  44. }
  45. ];
  46. let submitQuery = reactive<any>({
  47. orderId: "", //订单ID
  48. man: "", //所有人
  49. character: "", //使用性质
  50. register: "", //注册日期
  51. customerId: "", //用户编号
  52. vehicleId: "",
  53. vehicleIdNum: "", //车牌编号
  54. issueDate: "", //发证日期
  55. vehPosImgUrl: "", //行驶证正面
  56. vehNegImgUrl: "", //行驶证证反面
  57. type: "0", //0,客车 1.货车
  58. useUserType: 0, //车辆用户类型
  59. useUserTypeName: "普通车",
  60. vehicleSign: 2, //前/后装标识
  61. vin: "", //车辆识别代号
  62. engineNum: "", //发动机号码
  63. vehicleType: "", //车辆类型
  64. vehicleModel: "", //行驶证品牌型号
  65. approvedCount: "", //核定人数
  66. totalMass: "", //总质量
  67. maintenaceMass: "", //整备质量
  68. permittedWeight: "", //核定载质量
  69. vehicleDimensions: "", //车辆尺寸
  70. permittedTowWeight: "", //准牵引总质量
  71. axleCount: "", //车轴数
  72. ownerName: "", //车主姓名
  73. ownerIdType: "", //车主证件类型
  74. ownerIdNum: "", //车主证件号码
  75. ownPosImgUrl: "", //车主证件正面图片
  76. ownNegImgUrl: "", //车主证件反面图片
  77. agreementId: "", //签约编号
  78. channelId: "5201018892300000001", //编号渠道
  79. scenePayType: "", //
  80. transportIdNum: "", //道路运输证编号
  81. licenseIdNum: "", //经营许可证编号
  82. vehBodyUrl: "" ,//车身照片
  83. proxyUrl:"",
  84. agentIdType:"",
  85. userIdType:"",
  86. });
  87. const qdOrderStore = useQdOrderStore();
  88. let registerQuery = reactive<any>({});
  89. let ocrDatas = {};
  90. let vehicChargeVal = {};
  91. // 行驶证主业或副业处理
  92. const cardImageOcr = (fileList, item, formData) => {
  93. let imageType: string;
  94. if (item.title == "行驶证主页") {
  95. imageType = "1";
  96. } else if (item.title == "行驶证副页") {
  97. imageType = "2";
  98. }
  99. const params = {
  100. source: "1",
  101. agencyId: qdOrderStore.qdOrderVal.agencyId,
  102. imageType: imageType,
  103. fileName: fileList.fileName,
  104. // imageBase64: fileList.path
  105. imageUrl: fileList.url
  106. };
  107. console.log("请求中etcCarOcrCard", params);
  108. requestNew("/iaw/ocr/vehicleLicenseOcr", {
  109. data: params
  110. // showLoading: true
  111. }).then(async res => {
  112. if (res.code !== 0) return;
  113. let data: any = res.data;
  114. const itemData = formData.value[Index(item.title, formData.value)];
  115. // itemData[itemData.value] = data.imageUrl
  116. itemData[itemData.value] = fileList.pathDomain;
  117. console.log(data, "ocr返回数据");
  118. if(data.man != null){
  119. submitQuery.man = data.man
  120. }
  121. // item[item.value] = data.imageUrl
  122. if (imageType === "1") {
  123. // 需要处理展示的页面
  124. // 正面
  125. if (!data.plate_a || !data.engine) {
  126. uni.showModal({
  127. title: "提示",
  128. content: "识别错误,请上传正确的图片",
  129. success: function(res) {}
  130. });
  131. return;
  132. }
  133. const ocrData = [
  134. {
  135. title: "车牌号",
  136. key: "plate_a"
  137. },
  138. {
  139. title: "车辆类型",
  140. key: "vehicle"
  141. },
  142. // {
  143. // title: '使用性质',
  144. // key: 'character',
  145. // },
  146. {
  147. title: "发动机号码",
  148. key: "engine"
  149. },
  150. {
  151. title: "品牌型号",
  152. key: "model"
  153. },
  154. {
  155. title: "车辆识别代码",
  156. key: "vin"
  157. },
  158. {
  159. title: "所有人",
  160. key: "man"
  161. },
  162. {
  163. title: "发证日期",
  164. key: "issue"
  165. },
  166. {
  167. title: "注册日期",
  168. key: "register"
  169. }
  170. ];
  171. // 处理数据展示
  172. handleDataList(ocrData, data, formData);
  173. ocrDatas = data
  174. } else {
  175. if (!data.gross || !data.apc) {
  176. uni.showModal({
  177. title: "提示",
  178. content: "识别错误,请上传正确的图片",
  179. success: function(res) {}
  180. });
  181. return;
  182. }
  183. // 处理数据展示
  184. handleDataList(ocrDataFu, data, formData);
  185. console.log(formData, "formData");
  186. }
  187. await handleVehicCharge(formData);
  188. handleVehicUsePropert(formData);
  189. });
  190. };
  191. // 收费车型
  192. const handleVehicCharge = formData => {
  193. const approvedCountVal =
  194. formData.value[Index("核定载人数", formData.value)];
  195. const axleCountVal = formData.value[Index("车轴数", formData.value)];
  196. const vehicleDimensionsVal =
  197. formData.value[Index("外廓尺寸", formData.value)];
  198. const totalMassVal = formData.value[Index("总质量(kg)", formData.value)];
  199. if (
  200. !axleCountVal[axleCountVal.value] ||
  201. !vehicleDimensionsVal[vehicleDimensionsVal.value]
  202. ) {
  203. return;
  204. }
  205. let data = {
  206. agentId: qdOrderStore.qdOrderVal.agencyId,
  207. approvedCount: approvedCountVal[approvedCountVal.value],
  208. axleCount: axleCountVal[axleCountVal.value],
  209. channelId: qdOrderStore.qdOrderVal.channelId, //网点编号
  210. channelType: qdOrderStore.qdOrderVal.promotionModes,
  211. openId: "",
  212. totalMass: totalMassVal[totalMassVal.value],
  213. vanType: qdOrderStore.qdOrderVal.vanType,
  214. vehicleDimensions: vehicleDimensionsVal[vehicleDimensionsVal.value]
  215. .replace("mm", "")
  216. .trim()
  217. };
  218. if (qdOrderStore.qdOrderVal.promotionModes === 2) {
  219. data.openId = qdOrderStore.qdOrderVal.staffId; //操作人id
  220. } else if (qdOrderStore.qdOrderVal.promotionModes === 1) {
  221. data.openId = qdOrderStore.qdOrderVal.userId; //操作人id
  222. }
  223. let options = {
  224. data: data,
  225. method: "POST",
  226. showLoading: true
  227. };
  228. console.log(options, "options");
  229. return requestNew("/iaw/h5/order/web/vehicCharge", options).then(res => {
  230. console.log(res, "res vehicCharge");
  231. if (res.code !== 0) return;
  232. const itemData = formData.value[Index("收费车型", formData.value)];
  233. itemData[itemData.value] = res.data.code;
  234. vehicChargeVal = res.data;
  235. console.log(itemData);
  236. });
  237. };
  238. // 车辆使用性质
  239. const handleVehicUsePropert = formData => {
  240. console.log(vehicChargeVal,'vehicChargeVal',ocrDatas)
  241. if (!vehicChargeVal.value || !ocrDatas.character) {
  242. return;
  243. }
  244. // itemData[itemData.value] = data.imageUrl
  245. let data = {
  246. agentId: qdOrderStore.qdOrderVal.agencyId,
  247. channelId: qdOrderStore.qdOrderVal.channelId, //网点编号
  248. channelType: qdOrderStore.qdOrderVal.promotionModes,
  249. openId: "",
  250. plateNum: qdOrderStore.qdOrderVal.vehiclePlate,
  251. vehicChargeName: vehicChargeVal.value,
  252. vehicleTypeName: ocrDatas.vehicle,
  253. vehicleUsePropertName: ocrDatas.character
  254. };
  255. if (qdOrderStore.qdOrderVal.promotionModes === 2) {
  256. data.openId = qdOrderStore.qdOrderVal.staffId; //操作人id
  257. } else if (qdOrderStore.qdOrderVal.promotionModes === 1) {
  258. data.openId = qdOrderStore.qdOrderVal.userId; //操作人id
  259. }
  260. let options = {
  261. data: data,
  262. method: "POST",
  263. showLoading: true
  264. };
  265. console.log(options, "options");
  266. return requestNew("/iaw/h5/order/web/vehicUsePropert", options)
  267. .then(res => {
  268. console.log(res, "res");
  269. if (res.code !== 0) return;
  270. const itemData = formData.value[Index("使用性质", formData.value)];
  271. itemData[itemData.value] = res.data.vehicUse || "";
  272. })
  273. .finally(() => {});
  274. };
  275. // 身份证类别识别
  276. function idCardOcr(fileList, item, formData) {
  277. let imageType;
  278. if (item.title == "人像面" || item.title == "经办人证件人像面") {
  279. imageType = "1";
  280. } else if (item.title == "国徽面" || item.title == "经办人证件国徽面") {
  281. imageType = "2";
  282. }
  283. const data = {
  284. source: "1",
  285. agencyId: qdOrderStore.qdOrderVal.agencyId,
  286. imageType: imageType,
  287. fileName: fileList.fileName,
  288. // imageBase64: fileList.path,
  289. url: fileList.url,
  290. };
  291. uni.showLoading({
  292. title: '正在识别图片...',
  293. mask: true
  294. });
  295. requestNew('/iaw/ocr/idCardOcr', {
  296. data: data
  297. }).then(res => {
  298. if (res.code !== 0) return
  299. let data : any = res.data;
  300. console.log(res.data,'res.datares.datares.datares.data');
  301. let ocrData = [
  302. ];
  303. const itemData = formData.value[Index(item.title, formData.value)]
  304. itemData[itemData.value] = fileList.pathDomain
  305. console.log(data, 'dataocr');
  306. if(data.idno != null){
  307. submitQuery.idno = data.idno
  308. }
  309. if(data.name != null){
  310. submitQuery.idName = data.name
  311. submitQuery.ownerPosImgUrl = data.imageUrl
  312. } else {
  313. submitQuery.ownerNegImgUrl = data.imageUrl
  314. }
  315. if(data.address != null){
  316. submitQuery.ownerIdAddress = data.address
  317. }
  318. // if(data.address != null){
  319. // submitQuery.ownerIdAddress = data.address
  320. // }
  321. if(data.mobile != null){
  322. submitQuery.ownerTel = data.mobile
  323. }
  324. if (imageType == "1") {
  325. // 人像面
  326. if (!data.name || !data.idno) {
  327. uni.showModal({
  328. title: "提示",
  329. content: "很抱歉,我们无法识别您的证件,请按规范上传正反面,确保图片清晰、背景简洁(如白墙或桌面),减少证件反光和阴影",
  330. success: function (res) { }
  331. });
  332. return;
  333. }
  334. if (item.title == "经办人证件人像面") {
  335. ocrData = ocrData.concat([
  336. {
  337. title: "经办人姓名",
  338. key: "name"
  339. },
  340. {
  341. title: "经办人证件号码",
  342. key: "idno"
  343. }
  344. ]);
  345. submitQuery.agentIdType = 101; //身份证类型
  346. submitQuery.agentAddress = data.address; //经办人住址
  347. // registerQuery.agentGender = data.gender == '男' ? 'MALE' : 'FEMALE' //经办人性别
  348. } else {
  349. ocrData = ocrData.concat([
  350. {
  351. title: "姓名",
  352. key: "name"
  353. },
  354. {
  355. title: "证件号码",
  356. key: "idno"
  357. },
  358. {
  359. title: "住址",
  360. key: "address"
  361. }
  362. ]);
  363. submitQuery.userIdType = 101; //身份证
  364. registerQuery.gender = data.gender == '男' ? 'MALE' : 'FEMALE' //用户性别
  365. }
  366. } else {
  367. if (!data.enddate) {
  368. uni.showModal({
  369. title: "提示",
  370. content: "很抱歉,我们无法识别您的证件,请按规范上传正反面,确保图片清晰、背景简洁(如白墙或桌面),减少证件反光和阴影",
  371. success: function (res) { }
  372. });
  373. return;
  374. }
  375. if (item.title == "经办人证件国徽面") {
  376. submitQuery.agentIdVld = data.enddate; //经办人证件有效期
  377. } else {
  378. submitQuery.customerIdVld = data.enddate; //证件有效期
  379. }
  380. }
  381. // 处理数据展示
  382. handleDataList(ocrData, data, formData);
  383. console.log(data,'data');
  384. console.log(formData, 'formData');
  385. }).finally(()=>{
  386. uni.hideLoading();
  387. });
  388. }
  389. // 社会信用代码ocr识别
  390. function cardImageOcrYY(fileList, item, formData) {
  391. const params = {
  392. type: "business_license",
  393. url: fileList.url,
  394. };
  395. submitQuery.userIdType = "203"; //203 公司信用代码
  396. // 将图片上传
  397. cardFileImageUpdate(fileList, item, formData);
  398. //暂不识别营业执照
  399. return
  400. // request(ocrAllQuery, {
  401. // data: params
  402. // }).then(res => {
  403. // let data : any = JSON.parse(res.bizContent);
  404. // console.log(data, '公司ocr', '请求参数', params)
  405. // if (data.result) {
  406. // submitQuery.value.userIdType = "203"; //203 公司信用代码
  407. // const corporateName = formData.value[Index("公司名称", formData.value)];
  408. // const businessLicense = JSON.parse(data.result.businessLicense)
  409. // corporateName[corporateName.value] = businessLicense["名称"] || '';
  410. // submitQuery.value.address = businessLicense[
  411. // "住所"
  412. // ] || ''; //公司地址ocr获取不到,手动填写
  413. // const creditNum = formData.value[Index("社会信用代码", formData.value)];
  414. // creditNum[creditNum.value] = businessLicense[
  415. // "统一社会信用代码"
  416. // ];
  417. // // 将图片上传
  418. // cardFileImageUpdate(fileList, item, formData);
  419. // }
  420. // });
  421. }
  422. //身份证上传
  423. function uploadImgHandleId(fileList, item, formData) {
  424. if (
  425. ["人像面", "国徽面", "经办人证件人像面", "经办人证件国徽面"].includes(
  426. item.title
  427. )
  428. ) {
  429. idCardOcr(fileList, item, formData);
  430. } else if (item.title == "营业执照") {
  431. cardImageOcrYY(fileList, item, formData);
  432. } else {
  433. cardFileImageUpdate(fileList, item, formData);
  434. }
  435. }
  436. // 车身照上传
  437. const cardFileImageUpdate = (fileList, item, formData) => {
  438. const dataItem = formData.value[Index(item.title, formData.value)];
  439. dataItem[dataItem.value] = fileList.pathDomain;
  440. };
  441. //图像文件上传
  442. const uploadImgHandle = (fileList, item, formData) => {
  443. if (item.title == "行驶证主页" || item.title == "行驶证副页") {
  444. cardImageOcr(fileList, item, formData);
  445. } else {
  446. cardFileImageUpdate(fileList, item, formData);
  447. }
  448. };
  449. return {
  450. uploadImgHandle,
  451. submitQuery,
  452. ocrDataFu,
  453. handleVehicCharge,
  454. handleVehicUsePropert,
  455. uploadImgHandleId,
  456. };
  457. }