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.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899
  1. <template>
  2. <div>
  3. <crud-template ref="crudRef" class="as-weight" :homeData="field" :tableData="tableData" @btnSearch="btnSearch"
  4. @unitClick="unitClick" @handleEdit="handleEdit" @handleInfo="handleInfo" @cancel="cancel"
  5. @CurrentChange="handleCurrentChange" @refreshLeft="refreshLeft" @submit="submit">
  6. <template #search>
  7. <el-select clearable v-model="searchForm.orderType" style="width: 140px;" placeholder="业务类型">
  8. <el-option v-for="item in ORDER_TYPE" :key="item.value" :label="item.label" :value="item.value"/>
  9. </el-select>
  10. <!-- <el-select clearable v-model="searchForm.auditStatus" style="width: 140px;" placeholder="审核状态">-->
  11. <!-- <el-option v-for="item in AUDIT_STATUS" :key="item.value" :label="item.label" :value="item.value"/>-->
  12. <!-- </el-select>-->
  13. <el-input maxlength="30" v-trim clearable v-model="searchForm.customerName" style="width: 180px" placeholder="用户名称"/>
  14. <el-input maxlength="20" v-trim clearable v-model="searchForm.customerIdNum" style="width: 180px" placeholder="用户证件号码"/>
  15. <el-input maxlength="20" v-trim clearable v-model="searchForm.customerTel" style="width: 140px" placeholder="用户手机号"/>
  16. <el-input maxlength="60" v-trim clearable v-model="searchForm.vehiclePlate" placeholder="请输入车牌号"
  17. :style="{ width: '240px', margin: '0 10px 10px 0' }">
  18. <template #append>
  19. <el-select clearable v-model="searchForm.vehiclePlateColor" placeholder="车牌颜色" style="width: 120px">
  20. <el-option :label="item.label" :key="item.label" :value="item.value" v-for="item in VEHICLE_COLOR_TYPE" />
  21. </el-select>
  22. </template>
  23. </el-input>
  24. <el-input maxlength="30" v-trim clearable v-model="searchForm.customerId" style="width: 180px" placeholder="用户编号"/>
  25. </template>
  26. <template #operation="{ scope }">
  27. <el-button v-if="IsPermission(route, 'CANCEL_LIST') && scope.row.orderStatus === 'NORMAL'" type="warning" size="small" class="code-btn" @click="auditCancel(scope.row)">取消</el-button>
  28. <el-button v-if="IsPermission(route, 'INFO_LIST')" type="success" size="small" class="code-btn" @click="showInfo(scope.row)">详情</el-button>
  29. <el-button v-if="IsPermission(route, 'AUDIT_LIST') && scope.row.orderStatus === 'NORMAL' && scope.row.orderStep === 'WAITING_AUDIT' &&
  30. (scope.row.orderType === 'USER_UPDATE' || scope.row.orderType === 'LOSS' || scope.row.orderType === 'RELEASE_VEHICLE')
  31. " type="primary" size="small" class="code-btn" @click="audit(scope.row)">审核</el-button>
  32. </template>
  33. </crud-template>
  34. <!--审核、查看-->
  35. <el-dialog v-model="auditDialog" :title="infoTitle" width="800" :before-close="handleClose">
  36. <div v-loading="auditLoading">
  37. <div v-if="operationType==='audit'">
  38. <el-button type="primary" @click="auditSubmit()">提 交</el-button>
  39. <el-button @click="refreshData">关 闭</el-button>
  40. <el-button type="warning" plain v-show="!auditShow" @click="showAudit(true)">审核提示</el-button>
  41. </div>
  42. <!--提示框-->
  43. <TipText v-if="tipTextStr" :text="tipTextStr" :auditShow="auditShow" :operationType="operationType" @showAudit="showAudit"/>
  44. <div v-if="operationType==='audit'">
  45. <h4>审核信息</h4>
  46. <el-form ref="auditFormRef" :model="auditForm" label-width="auto" :rules="rules">
  47. <el-row :gutter="15">
  48. <el-col :span="8">
  49. <el-form-item label="审核人" prop="auditName" :error="formErrors.auditName">
  50. <el-input readonly disabled v-model="auditForm.auditName"/>
  51. </el-form-item>
  52. </el-col>
  53. <el-col :span="8">
  54. <el-form-item label="审核结果" prop="auditStatus" :error="formErrors.auditStatus">
  55. <el-select v-model="auditForm.auditStatus" @change="handleAuditChange" placeholder="请选择审核结果">
  56. <el-option label="通过" :value="true"/>
  57. <el-option label="不通过" :value="false"/>
  58. </el-select>
  59. </el-form-item>
  60. </el-col>
  61. <el-col :span="8">
  62. <el-form-item class="audit-time" label="审核时间" prop="auditTime" :error="formErrors.auditTime">
  63. <el-date-picker readonly disabled v-model="auditForm.auditTime" style="width: 100%" type="datetime"/>
  64. </el-form-item>
  65. </el-col>
  66. <el-col :span="24">
  67. <el-form-item label="审核意见" prop="reason" :error="formErrors.reason">
  68. <el-input v-model="auditForm.reason" maxlength="30" show-word-limit type="textarea" rows="3" placeholder="请输入审核意见"/>
  69. </el-form-item>
  70. </el-col>
  71. </el-row>
  72. </el-form>
  73. </div>
  74. <div class="base-info">
  75. <div class="demo-collapse">
  76. <el-collapse v-model="activeNames" @change="handleChange">
  77. <el-collapse-item title="审核信息" name="0" v-if="operationType==='info'">
  78. <AuditInfo v-if="assOrderInfo" :assOrderInfo="assOrderInfo"/>
  79. </el-collapse-item>
  80. <el-collapse-item title="基础信息" name="1">
  81. <BaseInfo v-if="orderType==='LOSS'" :baseInfo="assOrderInfo" :config="lossOrderInfoConfig"/>
  82. <BaseInfo v-else :baseInfo="assOrderInfo" :config="assOrderInfoConfig"/>
  83. </el-collapse-item>
  84. <!-- 客户变更信息 -->
  85. <el-collapse-item v-if="orderType==='USER_UPDATE'" title="客户变更信息" name="2">
  86. <ChangeInfo v-if="assOrderInfo" :auditChangeInfo="auditChangeInfo" :assOrderInfo="assOrderInfo"/>
  87. </el-collapse-item>
  88. <!-- 挂失/解除挂失信息 -->
  89. <el-collapse-item v-if="orderType==='LOSS'" title="挂失/解除挂失信息" name="2">
  90. <LossInfo v-if="lossInfo" :lossInfo="lossInfo" :config="lossInfoConfig"/>
  91. </el-collapse-item>
  92. <!-- 解除车牌占用信息 -->
  93. <el-collapse-item v-if="orderType==='RELEASE_VEHICLE'" title="申请人基本信息" name="2">
  94. <ReleasePlateInfo v-if="releaseBaseForm" :fields="releaseBaseConfig" :form-data="releaseBaseForm" :rules="releaseRules"/>
  95. </el-collapse-item>
  96. <el-collapse-item v-if="orderType==='RELEASE_VEHICLE'" title="行驶证信息" name="3">
  97. <ReleasePlateInfo v-if="drivingInfoForm" :fields="drivingInfoConfig" :form-data="drivingInfoForm" :rules="releaseRules"/>
  98. </el-collapse-item>
  99. <el-collapse-item v-if="orderType==='RELEASE_VEHICLE'" title="车主信息" name="4">
  100. <ReleasePlateInfo v-if="ownerInfoForm" :fields="ownerInfoConfig" :form-data="ownerInfoForm" :rules="releaseRules"/>
  101. </el-collapse-item>
  102. <el-collapse-item v-if="orderType==='RELEASE_VEHICLE'" title="车牌占用信息" name="5">
  103. <ReleasePlateInfo v-if="customerInfoForm" :fields="customerInfoConfig" :form-data="customerInfoForm" :rules="releaseRules"/>
  104. </el-collapse-item>
  105. <el-collapse-item v-if="orderType==='RELEASE_VEHICLE'" title="卡签信息" name="6">
  106. <ReleasePlateInfo v-if="cardObuForm" :fields="cardObuConfig" :form-data="cardObuForm" :rules="releaseRules"/>
  107. </el-collapse-item>
  108. </el-collapse>
  109. </div>
  110. </div>
  111. <div class="btn-bom" v-if="operationType==='info'">
  112. <el-button @click="refreshData">关 闭</el-button>
  113. </div>
  114. </div>
  115. </el-dialog>
  116. <!--取消-->
  117. <el-dialog v-model="cancelDialog" :title="cancelTitle" width="500">
  118. <div v-loading="cancelLoading">
  119. <el-form ref="cancelFormRef" :model="cancelForm" label-width="auto" :rules="rules">
  120. <el-form-item label="取消原因" prop="cancelReason">
  121. <el-input v-model="cancelForm.cancelReason" maxlength="30" show-word-limit type="textarea" rows="3" placeholder="请输入取消原因"/>
  122. </el-form-item>
  123. </el-form>
  124. <div class="btn-bom">
  125. <el-button type="primary" @click="cancelSubmit()">确 定</el-button>
  126. <el-button @click="cancelDialog = false">取 消</el-button>
  127. </div>
  128. </div>
  129. </el-dialog>
  130. </div>
  131. </template>
  132. <!-- 用户信息修改审核 -->
  133. <script setup lang="ts">
  134. import {ref, toRaw, onMounted, computed, reactive, onUnmounted} from "vue";
  135. // @ts-ignore crudFrom模板
  136. import CrudTemplate from "@/crud/index.vue";
  137. import TipText from "./TipText.vue";
  138. import BaseInfo from "./BaseInfo.vue";
  139. import AuditInfo from "./AuditInfo.vue";
  140. import ChangeInfo from "./ChangeInfo.vue";
  141. import LossInfo from "./LossInfo.vue";
  142. import ReleasePlateInfo from "./ReleasePlateInfo.vue"
  143. interface InfoConfigItem {
  144. prop: string;
  145. label: string;
  146. listData?: any[];
  147. span?: number;
  148. isImage?: boolean;
  149. isImageList?: boolean;
  150. }
  151. interface releaseConfigItem {
  152. prop: string;
  153. label: string;
  154. listData?: any[];
  155. span?: number;
  156. type?: string;
  157. disabled?: boolean;
  158. labelWidth?: number;
  159. }
  160. import $storeinitData from "@/store/initData"; //引入tab vuex
  161. import BaseService from "@/utils/baseService"; //引入接口请求
  162. import {ElMessage,ElMessageBox} from "element-plus"; //提示
  163. import {useRoute} from 'vue-router';
  164. import {IsPermission} from "@/router/routerUtil";
  165. import {dataDesensitization,changeAddress,getDictLabel} from "@/utils/utils";
  166. import type { CollapseModelValue } from 'element-plus'
  167. import $storeInitData from "@/store/initData";
  168. //或取路由传入过来的对象数据
  169. const route = useRoute();
  170. const crudRef = ref();
  171. //启用状态
  172. const VEHICLE_COLOR_TYPE = computed(() => {
  173. return $storeinitData.state.dictData["VEHICLE_COLOR_TYPE"] || [];
  174. });
  175. const SYSTEM_SORT = computed(() => {
  176. return $storeinitData.state.dictData["SOURCE_TYPE"] || [];
  177. });
  178. //用户证件类型
  179. const CERTIFICATE_TYPE = computed(() => {
  180. return $storeinitData.state.dictData["ID_TYPE"] || [];
  181. });
  182. //订单状态
  183. const ORDER_STATUS = computed(() => {
  184. return $storeinitData.state.dictData["ASS_ORDER_STATUS"] || [];
  185. });
  186. //审核状态
  187. const AUDIT_STATUS = computed(() => {
  188. return $storeinitData.state.dictData["AUDIT_STATUS"] || [];
  189. });
  190. //用户类型
  191. const USER_TYPE = computed(() => {
  192. return $storeinitData.state.dictData["ETC_USER_TYPE"] || [];
  193. });
  194. //订单类型
  195. const ORDER_TYPE = computed(() => {
  196. return $storeinitData.state.dictData["ASS_ORDER_TYPE"] || [];
  197. });
  198. const DEVICE_LOSS_TYPE = computed(() => {
  199. return $storeinitData.state.dictData["DEVICE_LOSS_TYPE"] ?? [];
  200. });
  201. // 卡状态
  202. const CARD_STATUS = computed(() => {
  203. return $storeinitData.state.dictData['CARD_STATUS'] || []
  204. })
  205. // 签状态
  206. const OBU_STATUS = computed(() => {
  207. return $storeinitData.state.dictData['OBU_STATUS'] || []
  208. })
  209. const rules = reactive({
  210. auditStatus: [{required: true, message: '请选择审核结果', trigger: 'change'}],
  211. auditName: [{required: true, message: '审核人不能为空', trigger: 'blur'}],
  212. auditTime: [{required: true, message: '审核时间不能为空', trigger: 'blur'}],
  213. reason: [{required: false, message: '审核意见不能为空', trigger: 'blur'}],
  214. cancelReason: [{required: true, message: '取消原因不能为空', trigger: 'blur'}],
  215. })
  216. //查询参数
  217. const searchForm = ref({
  218. customerId: '', // 用户编号
  219. customerName: '', // 用户名称
  220. customerIdType: '', // 用户证件号类型
  221. customerIdNum: '', // 用户证件号码
  222. customerTel: '', // 用户手机号
  223. orderType: '',
  224. orderStatus: '',
  225. vehiclePlate: '',
  226. vehiclePlateColor: '',
  227. });
  228. let tableData: any = ref([]);
  229. const typeOption = ref("");
  230. const auditDialog = ref(false);
  231. const auditShow = ref(true);
  232. const auditLoading = ref(true);
  233. const infoTitle = ref('查看');
  234. const auditFormRef = ref();
  235. const formErrors = ref({
  236. reason: '',
  237. auditStatus: '',
  238. auditTime: '',
  239. auditName: '',
  240. });
  241. const auditForm = ref({
  242. orderNo: '',
  243. auditName: '',
  244. auditStatus: '',
  245. auditTime: '',
  246. reason: '',
  247. });
  248. const cancelFormRef = ref()
  249. const cancelDialog = ref(false)
  250. const cancelLoading = ref(false)
  251. const cancelTitle = ref('取消')
  252. const cancelForm = ref({
  253. orderNo: '',
  254. cancelReason: '',
  255. });
  256. //操作类型
  257. const orderType = ref('')
  258. const tipTextStr = ref('')
  259. const operationType = ref('info')
  260. const assOrderInfo = ref({});
  261. const auditChangeInfo = ref({});
  262. const lossInfo = ref({});
  263. const name = computed(() => {
  264. return $storeInitData.getters.userName
  265. })
  266. function auditCancel(row:any){
  267. cancelTitle.value = getDictLabel(ORDER_TYPE, row.orderType)+'取消'
  268. cancelForm.value.orderNo = row.orderNo
  269. cancelForm.value.cancelReason = ''
  270. cancelDialog.value = true
  271. cancelFormRef.value.clearValidate();
  272. }
  273. function cancelSubmit(){
  274. cancelFormRef.value.validate().then((valid: any) => {
  275. if(valid){
  276. cancelLoading.value = true
  277. let params = {
  278. orderNo: cancelForm.value.orderNo,
  279. reason: cancelForm.value.cancelReason
  280. }
  281. BaseService.postN('/managew/api/assOrderinfo/cancel', params).then((res: any) => {
  282. if (res && res.statusCode === 0) {
  283. ElMessage.success("操作成功");
  284. cancelDialog.value = false
  285. cancelLoading.value = false
  286. getList();
  287. }
  288. }).catch((error) => {
  289. cancelLoading.value = false
  290. })
  291. }
  292. })
  293. }
  294. function showInfo(row:any){
  295. // console.log("row.assOrderType",row.orderType)
  296. infoTitle.value = getDictLabel(ORDER_TYPE, row.orderType)+'查看'
  297. orderType.value = row.orderType
  298. auditLoading.value = true;
  299. operationType.value = 'info'
  300. auditDialog.value = true;
  301. auditShow.value = true;
  302. tipTextStr.value = ''
  303. if(orderType.value === 'USER_UPDATE'){
  304. customerChangeInfoGet(row)
  305. }else if(orderType.value === 'LOSS'){
  306. let params = {
  307. orderNo: row.orderNo,
  308. };
  309. BaseService.postN('/managew/api/device/detail', params).then((res: any) => {
  310. if (res && res.statusCode === 0) {
  311. assOrderInfo.value = res.data.orderInfo
  312. tipTextStr.value = assOrderInfo.value.auditReason
  313. lossInfo.value = res.data.lossInfo;
  314. auditLoading.value = false;
  315. activeNames.value = ['1','0'];
  316. }
  317. }).catch((error) => {
  318. refreshData()
  319. }).finally(() => {
  320. auditLoading.value = false;
  321. crudRef.value.tableLoding = false;
  322. });
  323. }else if(orderType.value === 'RELEASE_VEHICLE'){
  324. assOrderInfo.value = row
  325. releasePlateInfoGet(row)
  326. }else {
  327. assOrderInfo.value = row
  328. crudRef.value.tableLoding = false;
  329. setTimeout(() => {
  330. auditLoading.value = false;
  331. activeNames.value = ['0'];
  332. }, 200)
  333. setTimeout(() => {
  334. activeNames.value = ['0','1'];
  335. }, 300)
  336. }
  337. }
  338. function audit(row:any){
  339. infoTitle.value = getDictLabel(ORDER_TYPE, row.orderType)+'审核'
  340. orderType.value = row.orderType
  341. operationType.value = 'audit'
  342. activeNames.value = ['1'];
  343. auditLoading.value = true;
  344. auditDialog.value = true;
  345. auditShow.value = true;
  346. auditForm.value = {
  347. orderNo: row.orderNo,
  348. auditName: name.value,
  349. auditStatus: true,
  350. auditTime: new Date(),
  351. reason:'',
  352. }
  353. if(orderType.value === 'USER_UPDATE'){
  354. customerChangeInfoGet(row);
  355. }else if(orderType.value === 'RELEASE_VEHICLE'){
  356. assOrderInfo.value = row
  357. releasePlateInfoGet(row);
  358. }
  359. }
  360. function customerChangeInfoGet(row:any){
  361. BaseService.postN('/managew/customerInfoChange/detail', {orderNo:row.orderNo}).then((res: any) => {
  362. if (res && res.statusCode === 0) {
  363. assOrderInfo.value = res.data.orderInfo
  364. tipTextStr.value = assOrderInfo.value.auditReason
  365. auditChangeInfo.value = res.data.changeInfo
  366. auditLoading.value = false;
  367. activeNames.value = ['1','0'];
  368. }
  369. }).catch((error) => {
  370. refreshData()
  371. }).finally(() => {
  372. auditLoading.value = false;
  373. crudRef.value.tableLoding = false;
  374. });
  375. }
  376. function releasePlateInfoGet(row:any){
  377. releaseBaseConfig.value.forEach((item:any) => {
  378. item.disabled = true;
  379. })
  380. drivingInfoConfig.value.forEach((item:any) => {
  381. item.disabled = true;
  382. })
  383. ownerInfoConfig.value.forEach((item:any) => {
  384. item.disabled = true;
  385. })
  386. cardObuConfig.value.forEach((item:any) => {
  387. item.disabled = true;
  388. })
  389. customerInfoConfig.value.forEach((item:any) => {
  390. item.disabled = true;
  391. })
  392. let params = {
  393. orderNo: row.orderNo,
  394. };
  395. BaseService.postN('/managew/api/afterSale/releasePlate/view', params).then((res: any) => {
  396. if (res && res.statusCode === 0) {
  397. const data = res.data;
  398. const applyInfo = data.applyInfo;
  399. const drivingInfo = data.drivingInfo;
  400. const ownerInfo = data.ownerInfo;
  401. const customerInfo = data.customerInfo;
  402. const cardInfo = data.cardInfo;
  403. const obuInfo = data.obuInfo;
  404. tipTextStr.value = data.tap;
  405. releaseBaseForm.value = {
  406. ...applyInfo,
  407. }
  408. drivingInfoForm.value = {
  409. ...drivingInfo
  410. }
  411. ownerInfoForm.value = {
  412. ...ownerInfo
  413. }
  414. customerInfoForm.value = {
  415. ...customerInfo
  416. }
  417. cardObuForm.value = {
  418. cardId: cardInfo.cardId,
  419. cardStatus: cardInfo.cardStatus,
  420. cardEnableTime: cardInfo.cardEnableTime,
  421. obuId: obuInfo.obuId,
  422. obuStatus: obuInfo.obuStatus,
  423. obuEnableTime: obuInfo.obuEnableTime,
  424. }
  425. auditLoading.value = false;
  426. activeNames.value = ['1','0'];
  427. }
  428. }).catch((error) => {
  429. refreshData()
  430. }).finally(() => {
  431. auditLoading.value = false;
  432. crudRef.value.tableLoding = false;
  433. });
  434. }
  435. const assOrderInfoConfig: InfoConfigItem[] = [
  436. { prop: 'orderNo', label: '订单号' },
  437. { prop: 'orderType', label: '订单类型', listData: ORDER_TYPE},
  438. { prop: 'customerId', label: '用户编号' },
  439. { prop: 'customerName', label: '姓名', },
  440. { prop: 'customerIdNum', label: '证件号码' },
  441. { prop: 'customerTel', label: '手机号码', },
  442. { prop: 'orderSource', label: '申请来源', listData: SYSTEM_SORT },
  443. { prop: 'applyTime', label: '申请时间', },
  444. { prop: 'orderStatus', label: '订单状态', listData: ORDER_STATUS},
  445. { prop: 'userType', label: '客户类型', listData: USER_TYPE},
  446. ]
  447. const lossOrderInfoConfig: InfoConfigItem[] = [
  448. ...assOrderInfoConfig,
  449. { prop: 'vehiclePlate', label: '车牌号' },
  450. { prop: 'vehiclePlateColor', label: '车牌颜色', listData: VEHICLE_COLOR_TYPE },
  451. { prop: 'cardId', label: '卡编号' },
  452. { prop: 'obuId', label: '签编号' },
  453. ]
  454. const lossInfoConfig: InfoConfigItem[] = [
  455. { prop: 'orderNo', label: '售后订单号',span:2 },
  456. { prop: 'lossOrderNo', label: '挂失订单号',span:2 },
  457. { prop: 'agencyId', label: '渠道编号'},
  458. { prop: 'vehicleType', label: '收费车型' },
  459. { prop: 'lossType', label: '挂失解挂类型',listData: DEVICE_LOSS_TYPE},
  460. { prop: 'applyTime', label: '挂失解挂时间' },
  461. { prop: 'vehPosImgUrl', label: '行驶证正面',isImage: true },
  462. { prop: 'vehNegImgUrl', label: '行驶证反面',isImage: true },
  463. ]
  464. const releaseBaseConfig = ref<releaseConfigItem[]>([
  465. // { prop: 'userType', label: '用户类型', type: 'select', listData: USER_TYPE, disabled: false },
  466. { prop: 'mobile', label: '手机号码', type: 'text', disabled: false, span: 8 },
  467. { prop: 'name', label: '申请人姓名', type: 'text', disabled: false, span: 7 },
  468. { prop: 'customerIdNum', label: '申请人证件号', type: 'text', disabled: false, span: 9 },
  469. { prop: 'userPosImagesUrl', label: '申请人身份证正面', type: 'img', disabled: false },
  470. { prop: 'userNegImagesUrl', label: '申请人身份证背面', type: 'img', disabled: false },
  471. ])
  472. const releaseBaseForm = ref({
  473. userType: '',
  474. mobile: '',
  475. name: '',
  476. customerIdNum: '',
  477. userPosImagesUrl: '',
  478. userNegImagesUrl: '',
  479. });
  480. const drivingInfoConfig = ref<releaseConfigItem[]>([
  481. { prop: 'vehicleOwnerName', label: '行驶证姓名', type: 'text', disabled: false, span:8 },
  482. { prop: 'plateNum', label: '车牌号', type: 'text', disabled: false, span:8 },
  483. { prop: 'plateColor', label: '车牌颜色', type: 'select', listData: VEHICLE_COLOR_TYPE, disabled: false,span:8 },
  484. { prop: 'vehPosImgUrl', label: '行驶证正面', type: 'img', disabled: false },
  485. { prop: 'vehNegImgUrl', label: '行驶证背面', type: 'img', disabled: false },
  486. ])
  487. const drivingInfoForm = ref({
  488. plateNum: '',
  489. plateColor: '',
  490. vehicleOwnerName: '',
  491. vehPosImgUrl: '',
  492. vehNegImgUrl: '',
  493. });
  494. const ownerInfoConfig = ref<releaseConfigItem[]>([
  495. { prop: 'ownerName', label: '名称', type: 'text', disabled: false },
  496. { prop: 'ownerIdNum', label: '证件号', type: 'text', disabled: false },
  497. { prop: 'ownerPosImgUrl', label: '证件正面', type: 'img', disabled: false },
  498. { prop: 'ownerNegImgUrl', label: '证件反面', type: 'img', disabled: false },
  499. { prop: 'proxyUrl', label: '授权书', type: 'img', disabled: false },
  500. ])
  501. const ownerInfoForm = ref({
  502. ownerIdNum:'',
  503. ownerName:'',
  504. ownerPosImgUrl:'',
  505. ownerNegImgUrl:'',
  506. proxyUrl:'',
  507. });
  508. const customerInfoConfig = ref<releaseConfigItem[]>([
  509. { prop: 'customerName', label: '名称', type: 'text', disabled: false },
  510. { prop: 'customerTel', label: '手机号', type: 'text', disabled: false },
  511. { prop: 'customerIdNum', label: '证件号', type: 'text', disabled: false },
  512. { prop: 'customerIdType', label: '证件类型', type: 'select', listData: CERTIFICATE_TYPE, disabled: false },
  513. ])
  514. const customerInfoForm = ref({
  515. customerName:'',
  516. customerTel:'',
  517. customerIdNum:'',
  518. customerIdType:'',
  519. });
  520. const cardObuConfig = ref<releaseConfigItem[]>([
  521. { prop: 'cardId', label: '卡号', type: 'text', disabled: false, span: 8, labelWidth: '80px' },
  522. { prop: 'cardStatus', label: '卡状态', type: 'select', listData: CARD_STATUS, disabled: false, span: 7,labelWidth: '80px' },
  523. { prop: 'cardEnableTime', label: '卡启用时间', type: 'text', disabled: false, span: 9 },
  524. { prop: 'obuId', label: '签号', type: 'text', disabled: false, span: 8,labelWidth: '80px' },
  525. { prop: 'obuStatus', label: '签状态', type: 'select', listData: OBU_STATUS, disabled: false, span: 7,labelWidth: '80px' },
  526. { prop: 'obuEnableTime', label: '签启用时间', type: 'text', disabled: false, span: 9 },
  527. ])
  528. const cardObuForm = ref({
  529. cardId: '',
  530. cardStatus: '',
  531. cardEnableTime: '',
  532. obuId: '',
  533. obuStatus: '',
  534. obuEnableTime: '',
  535. });
  536. const releaseRules = reactive({
  537. // userType: [{required: true, message: '请选择客户类型', trigger: 'change'}],
  538. // mobile: [{required: true, message: '请输入手机号码', trigger: 'blur'}],
  539. // vehiclePlate: [{required: true, message: '请输入车牌号', trigger: 'blur'}],
  540. // vehiclePlateColor: [{required: true, message: '请选择车牌颜色', trigger: 'change'}],
  541. // name: [{required: true, message: '请输入申请人姓名', trigger: 'blur'}],
  542. // customerIdNum: [{required: true, message: '请输入申请人证件号', trigger: 'blur'}],
  543. // userPosImagesUrl: [{required: true, message: '请上传申请人身份证正面', trigger: 'change'}],
  544. // userNegImagesUrl: [{required: true, message: '请上传申请人身份证背面', trigger: 'change'}],
  545. })
  546. function showAudit(show){
  547. auditShow.value = show;
  548. }
  549. function handleAuditChange(){
  550. let auditStatus = auditForm.value.auditStatus
  551. rules.reason = [{
  552. required: !auditStatus,
  553. message: '请输入审核意见',
  554. trigger: 'blur'
  555. }];
  556. }
  557. function auditSubmit(){
  558. formErrors.value = Object.keys(formErrors.value).reduce((acc, key) => {
  559. acc[key] = '';
  560. return acc;
  561. }, {} as Record<string, string>);
  562. auditFormRef.value.validate((valid: any) => {
  563. let params = {
  564. ...auditForm.value
  565. }
  566. delete params.auditTime;
  567. delete params.auditName;
  568. if (valid) {
  569. auditLoading.value = true;
  570. BaseService.postN('/managew/api/assOrderinfo/review', params).then((res: any) => {
  571. if (res && res.statusCode === 0) {
  572. ElMessage.success('操作成功');
  573. auditDialog.value = false;
  574. activeNames.value = [];
  575. auditLoading.value = false;
  576. getList();
  577. }
  578. }).catch((error) => {
  579. auditLoading.value = false;
  580. Object.keys(error).forEach((key) => {
  581. if (formErrors.value[key] !== undefined) {
  582. formErrors.value[key] = error[key];
  583. }
  584. });
  585. });
  586. }
  587. })
  588. }
  589. const handleClose = (done: () => void) => {
  590. if (operationType.value === 'info') {
  591. refreshData()
  592. } else {
  593. ElMessageBox.confirm('该审核未保存提交,确定要关闭吗?').then(() => {
  594. done()
  595. refreshData()
  596. }).catch(() => {
  597. // refreshData()
  598. // catch error
  599. })
  600. }
  601. }
  602. const activeNames = ref([])
  603. const handleChange = (val: CollapseModelValue) => {
  604. // console.log(val)
  605. }
  606. onMounted(() => {
  607. getList();
  608. });
  609. // 搜索按钮
  610. function btnSearch() {
  611. field.value.paging.currentPage = 1;
  612. getList();
  613. }
  614. const userType = ref() // 用户类型 1个人 2单位
  615. // 编辑按钮
  616. function handleEdit(idx: any, row: any) {
  617. }
  618. // 取消
  619. function cancel() {
  620. crudRef.value.reset();
  621. }
  622. //分页
  623. function handleCurrentChange(val: number) {
  624. field.value.paging.currentPage = val;
  625. getList();
  626. }
  627. // 搜索重置
  628. function refreshLeft() {
  629. searchForm.value = {
  630. customerId: '',
  631. customerName: '',
  632. customerIdType: '',
  633. customerIdNum: '',
  634. customerTel: '',
  635. vehiclePlate: '',
  636. vehiclePlateColor: '',
  637. };
  638. field.value.paging.currentPage = 1;
  639. getList();
  640. }
  641. function refreshData(){
  642. auditDialog.value = false;
  643. orderType.value = ''
  644. operationType.value = 'info'
  645. assOrderInfo.value = {}
  646. auditChangeInfo.value = {}
  647. lossInfo.value = {}
  648. releaseBaseForm.value = {}
  649. drivingInfoForm.value = {}
  650. ownerInfoForm.value = {}
  651. customerInfoForm.value = {}
  652. cardObuForm.value = {}
  653. activeNames.value = [];
  654. }
  655. // 详情
  656. function handleInfo(idx: any, row: any) {
  657. }
  658. //编辑与添加提交
  659. function submit(data: any) {
  660. }
  661. //获取列表
  662. function getList() {
  663. if(!IsPermission(route, 'QUERY_BASE')){
  664. ElMessage.error('您没有权限,请联系管理员!')
  665. return
  666. }
  667. let falg = false
  668. let params: any = {
  669. pageNo: field.value.paging.currentPage,
  670. pageSize: field.value.paging.pageSize,
  671. }
  672. let searchFormList = {...searchForm.value};
  673. for (let key in searchFormList) {
  674. if (searchFormList[key]) {
  675. falg = true
  676. params[key] = searchFormList[key];
  677. }
  678. }
  679. let vehiclePlate = params.vehiclePlate || ''
  680. let vehiclePlateColor = params.vehiclePlateColor || ''
  681. if(vehiclePlate !== '' && vehiclePlateColor !== ''){
  682. params.vehicleId = vehiclePlate + '_' + vehiclePlateColor
  683. }else if(vehiclePlate === '' && vehiclePlateColor !== ''){
  684. ElMessage.error("请输入车牌号");
  685. return
  686. } else if(vehiclePlate !== '' && vehiclePlateColor === ''){
  687. ElMessage.error("请选择车牌颜色");
  688. return
  689. }
  690. crudRef.value.tableLoding = true;
  691. BaseService.postN('/managew/api/assOrderinfo/page', params).then((res: any) => {
  692. if (res && res.statusCode === 0) {
  693. //数据转换
  694. let bizContent = res
  695. let data = bizContent.data.result || [];
  696. //数据渲染
  697. tableData.value = data;
  698. crudRef.value.tableLoding = false;
  699. field.value.paging.total = bizContent.data.totalCount;
  700. }
  701. }).catch((error) => {
  702. crudRef.value.tableLoding = false;
  703. });
  704. }
  705. let formLabelWidth = "180px";
  706. //表单数据配置
  707. let field: any = ref({
  708. dialogInfo: false, //是否展示详情 (默认false)
  709. dialogCustom: true,
  710. border: true, //是否添加边框(默认false)
  711. searchShow: IsPermission(route, 'QUERY_BASE'), //搜索展示
  712. crudChildShow: false,
  713. operateFixed: true,
  714. paginStart: true, //是否显示分页查询 (默认false)
  715. dialogWidth: "60%",
  716. operateWidth: "190", //操作栏宽度
  717. operateTitle: '操作', //操作栏标题(默认为"")
  718. crud: {
  719. add: false,
  720. },
  721. operate: {
  722. info: false,
  723. edit: false,
  724. delete: false, //是否删除(默认true)
  725. remark: false, // 查看
  726. announcement: false, // 公告
  727. forbidden: false, // 禁用
  728. enable: false, // 启用
  729. authorization: false, // 授权
  730. cancel: false, // 取消订单
  731. },
  732. tableSize: -1,
  733. paging: {
  734. pageSize: 10,
  735. currentPage: 1,
  736. total: 0,
  737. },
  738. extend: [
  739. {
  740. label: "序号",
  741. type: "index",
  742. width: "50px",
  743. },
  744. ],
  745. field: [
  746. {
  747. prop: "customerName",
  748. label: "用户名称",
  749. },
  750. {
  751. width: '150',
  752. prop: "customerId",
  753. label: "用户编号",
  754. },
  755. {
  756. width: '100',
  757. prop: "customerTel",
  758. label: "手机号",
  759. funRuleStarts: true,
  760. funRule: (value: any) => {
  761. return dataDesensitization(value)
  762. },
  763. },
  764. {
  765. width: '150',
  766. prop: "customerIdNum",
  767. label: "证件号码",
  768. funRuleStarts: true,
  769. funRule: (value: any) => {
  770. return dataDesensitization(value)
  771. },
  772. },
  773. {
  774. width: '100',
  775. prop: "orderType",
  776. label: "业务类型",
  777. listData: ORDER_TYPE,
  778. },
  779. {
  780. width: '140',
  781. prop: "applyTime",
  782. label: "申请时间",
  783. },
  784. // {
  785. // prop: "auditStatus",
  786. // label: "审核状态",
  787. // width: '80',
  788. // listData: AUDIT_STATUS,
  789. // },
  790. {
  791. width: '80',
  792. prop: "auditName",
  793. label: "审核人",
  794. },
  795. {
  796. width: '140',
  797. prop: "auditTime",
  798. label: "审核时间",
  799. },
  800. ],
  801. });
  802. </script>
  803. <style scoped>
  804. ::v-deep.base-info .desc-label {
  805. width: 80px;
  806. text-align: right;
  807. font-size: 14px;
  808. }
  809. ::v-deep.audit-time .el-input__prefix {
  810. display: none;
  811. }
  812. ::v-deep.base-info .el-collapse-item__header{
  813. font-size: 14px;
  814. font-weight: bolder;
  815. color: #606266;
  816. }
  817. .btn-bom{
  818. margin-top: 20px;
  819. text-align: right;
  820. }
  821. </style>