選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

index.vue 29KB

1週間前
1週間前
1週間前
1週間前
1週間前
1週間前
1週間前
1週間前
1週間前
1週間前
1週間前
1週間前
1週間前
1週間前
1週間前
1週間前
1週間前
1週間前
1週間前
1週間前
1週間前
1週間前
1週間前
1週間前
1週間前
1週間前
1週間前
1週間前
1週間前
1週間前
1週間前
1週間前
1週間前
1週間前
1週間前
1週間前
1週間前
1週間前
1週間前
1週間前
1週間前
1週間前
1週間前
1週間前
1週間前
1週間前
1週間前
1週間前
1週間前
1週間前
1週間前
1週間前
1週間前
1週間前
1週間前
1週間前
1週間前
1週間前
1週間前
1週間前
1週間前
1週間前
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>