shipOwnerDetail.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450
  1. <template>
  2. <div class="line-container-p18">
  3. <i class="el-icon-arrow-left"></i>
  4. <div
  5. class="dib go-back ml8 pointer"
  6. @click="router.replace('/shipOwnerManage/shipOwnerList')"
  7. >
  8. 返回船东列表
  9. </div>
  10. </div>
  11. <div class="container-title">船东信息</div>
  12. <div class="line-container-p18">
  13. <div class="line">
  14. <div class="info-line">
  15. <div class="info-line-title">船东姓名</div>
  16. <el-input
  17. class="info-line-text"
  18. v-model="userDetail.userName"
  19. :disabled="unchangeableShipOwner"
  20. ></el-input>
  21. </div>
  22. <div class="info-line">
  23. <div class="info-line-title">船东手机号</div>
  24. <el-input
  25. class="info-line-text"
  26. v-model="userDetail.phone"
  27. :disabled="unchangeableShipOwner"
  28. ></el-input>
  29. </div>
  30. </div>
  31. <div class="line">
  32. <div class="info-line">
  33. <div class="info-line-title">船东身份证</div>
  34. <el-input
  35. class="info-line-text"
  36. v-model="userDetail.idcardNo"
  37. :disabled="unchangeableShipOwner"
  38. ></el-input>
  39. </div>
  40. <div class="info-line">
  41. <div class="info-line-title">偏好货种</div>
  42. <el-input
  43. class="info-line-text"
  44. v-model="userDetail.preferenceCargo"
  45. :disabled="unchangeableShipOwner"
  46. ></el-input>
  47. </div>
  48. </div>
  49. <div class="line">
  50. <div class="info-line aic">
  51. <div class="info-line-title">上传身份证</div>
  52. <el-upload
  53. action="https://interface.huihenduo.com.cn/hhd-pat/cos/upload"
  54. list-type="picture-card"
  55. :on-preview="handlePictureCardPreview"
  56. :on-remove="handleRemoveIdFront"
  57. :data="idParams"
  58. :on-success="idFrontUploadSuccess"
  59. :file-list="idFrontFile"
  60. :disabled="unchangeableShipOwner"
  61. :limit="1"
  62. >
  63. <div class="upload-plus-icon">+</div>
  64. <div class="upload-text">身份证人像面</div>
  65. </el-upload>
  66. <el-upload
  67. style="margin-left: 40px"
  68. action="https://interface.huihenduo.com.cn/hhd-pat/cos/upload"
  69. list-type="picture-card"
  70. :on-preview="handlePictureCardPreview"
  71. :on-remove="handleRemoveIdBack"
  72. :data="idParams"
  73. :on-success="idBackUploadSuccess"
  74. :file-list="idBackFile"
  75. :disabled="unchangeableShipOwner"
  76. :limit="1"
  77. >
  78. <div class="upload-plus-icon">+</div>
  79. <div class="upload-text">身份证国徽面</div>
  80. </el-upload>
  81. </div>
  82. </div>
  83. <div class="df aic jcfe">
  84. <el-button v-if="unchangeableShipOwner" type="primary" @click="change(1)">
  85. 修改
  86. </el-button>
  87. <el-button v-if="!unchangeableShipOwner" @click="cancelChange(1)">
  88. 取消
  89. </el-button>
  90. <el-button
  91. v-if="!unchangeableShipOwner"
  92. type="primary"
  93. @click="submitChange(1)"
  94. >
  95. 提交
  96. </el-button>
  97. </div>
  98. </div>
  99. <div class="container-title">船舶信息</div>
  100. <div class="line-container-p18">
  101. <div class="line">
  102. <div class="info-line">
  103. <div class="info-line-title">船名</div>
  104. <el-input
  105. class="info-line-text"
  106. v-model="shipDetail.shipname"
  107. :disabled="unchangeableShip"
  108. ></el-input>
  109. </div>
  110. <div class="info-line">
  111. <div class="info-line-title">MMSI</div>
  112. <el-input
  113. class="info-line-text"
  114. v-model="shipDetail.mmsi"
  115. :disabled="unchangeableShip"
  116. ></el-input>
  117. </div>
  118. </div>
  119. <div class="line">
  120. <div class="info-line">
  121. <div class="info-line-title">船长</div>
  122. <el-input
  123. class="info-line-text"
  124. v-model="shipDetail.length"
  125. :disabled="unchangeableShip"
  126. ></el-input>
  127. </div>
  128. <div class="info-line">
  129. <div class="info-line-title">船宽</div>
  130. <el-input
  131. class="info-line-text"
  132. v-model="shipDetail.breadth"
  133. :disabled="unchangeableShip"
  134. ></el-input>
  135. </div>
  136. </div>
  137. <div class="line">
  138. <div class="info-line">
  139. <div class="info-line-title">吨位</div>
  140. <el-input
  141. class="info-line-text"
  142. v-model="shipDetail.tonnage"
  143. :disabled="unchangeableShip"
  144. ></el-input>
  145. </div>
  146. <div class="info-line">
  147. <div class="info-line-title">载货吨位</div>
  148. <el-input
  149. class="info-line-text"
  150. v-model="shipDetail.loadTons"
  151. :disabled="unchangeableShip"
  152. ></el-input>
  153. </div>
  154. </div>
  155. <div class="line">
  156. <div class="info-line">
  157. <div class="info-line-title">吃水</div>
  158. <el-input
  159. class="info-line-text"
  160. v-model="shipDetail.draught"
  161. :disabled="unchangeableShip"
  162. ></el-input>
  163. </div>
  164. </div>
  165. <div class="line">
  166. <div class="info-line">
  167. <div class="info-line-title">船舶证书</div>
  168. <el-upload
  169. action="https://interface.huihenduo.com.cn/hhd-pat/cos/upload"
  170. list-type="picture-card"
  171. :on-preview="handlePictureCardPreview"
  172. :on-remove="handleRemoveShip"
  173. :data="shipParams"
  174. :on-success="shipUploadSuccess"
  175. :file-list="shipfileList"
  176. :limit="2"
  177. :disabled="unchangeableShip"
  178. >
  179. <i class="el-icon-plus"></i>
  180. </el-upload>
  181. </div>
  182. </div>
  183. </div>
  184. <div class="df aic jcfe">
  185. <el-button v-if="unchangeableShip" type="primary" @click="change(0)">
  186. 修改
  187. </el-button>
  188. <el-button v-if="!unchangeableShip" @click="cancelChange(0)">
  189. 取消
  190. </el-button>
  191. <el-button v-if="!unchangeableShip" type="primary" @click="submitChange(0)">
  192. 提交
  193. </el-button>
  194. </div>
  195. <el-dialog v-model="dialogVisible" title="图片预览" width="30%">
  196. <el-image
  197. :src="dialogImageUrl"
  198. style="height: 100%; width: 100%"
  199. ></el-image>
  200. </el-dialog>
  201. </template>
  202. <script>
  203. import { ref, h, reactive, toRefs, onMounted } from "vue";
  204. // import { uploadUrl } from "../../apis/config";
  205. import { ElNotification, ElMessageBox, ElMessage } from "element-plus";
  206. import store from "../../store";
  207. import router from "../../router";
  208. import md5 from "md5";
  209. import api from "../../apis/fetch";
  210. import { useRoute } from "_vue-router@4.0.12@vue-router";
  211. import _ from "lodash";
  212. export default {
  213. setup() {
  214. const route = useRoute();
  215. let userDetail = ref({});
  216. let shipDetail = ref({});
  217. let idFrontFile = ref([]);
  218. let idBackFile = ref([]);
  219. let shipFileList = ref([]);
  220. let unchangeableShipOwner = ref(true);
  221. let unchangeableShip = ref(true);
  222. async function getUserDetail() {
  223. let res = await api.getUserDetail({
  224. userId: route.query.userId,
  225. });
  226. console.log(res.data.result);
  227. if (res.data.status == 0) {
  228. let r = res.data.result;
  229. let {
  230. //船东信息
  231. idcardBackDownloadUrl,
  232. idcardBackFileKey,
  233. idcardBackViewUrl,
  234. idcardFrontDownloadUrl,
  235. idcardFrontFileKey,
  236. idcardFrontViewUrl,
  237. idcardNo,
  238. phone,
  239. preferenceCargo,
  240. userId,
  241. userName,
  242. // 船舶信息
  243. breadth,
  244. draught,
  245. length,
  246. loadTons,
  247. mmsi,
  248. shipId,
  249. shipname,
  250. tonnage,
  251. shipCerts,
  252. } = r;
  253. userDetail.value = {
  254. idcardNo,
  255. phone,
  256. preferenceCargo,
  257. userId,
  258. userName,
  259. };
  260. idFrontFile.value = [
  261. {
  262. url: idcardFrontViewUrl,
  263. idcardFrontDownloadUrl,
  264. idcardFrontFileKey,
  265. idcardFrontViewUrl,
  266. },
  267. ];
  268. idBackFile.value = [
  269. {
  270. url: idcardBackViewUrl,
  271. idcardBackDownloadUrl,
  272. idcardBackFileKey,
  273. idcardBackViewUrl,
  274. },
  275. ];
  276. shipDetail.value = {
  277. breadth,
  278. draught,
  279. length,
  280. loadTons,
  281. mmsi,
  282. shipId,
  283. shipname,
  284. tonnage,
  285. shipCerts,
  286. };
  287. } else {
  288. ElNotification({
  289. type: "error",
  290. title: res.data.msg,
  291. });
  292. console.log(res);
  293. }
  294. }
  295. let idParams = ref({
  296. type: 1,
  297. location: "",
  298. userId: 0,
  299. });
  300. let shipParams = ref({
  301. type: 2,
  302. userId: 0,
  303. location: "",
  304. });
  305. let dialogImageUrl = ref();
  306. let dialogVisible = ref();
  307. function idFrontUploadSuccess(response, file, list) {
  308. idFrontFile.value = list;
  309. }
  310. function idBackUploadSuccess(response, file, list) {
  311. idBackFile.value = list;
  312. }
  313. function shipUploadSuccess(response, file, list) {
  314. shipFileList.value = list;
  315. }
  316. function handlePictureCardPreview(file) {
  317. dialogVisible.value = true;
  318. dialogImageUrl.value = file.url;
  319. }
  320. function handleRemoveIdFront(file, list) {
  321. idFrontFile.value = list;
  322. console.log("idFrontFile", idFrontFile.value);
  323. }
  324. let userDetailCache = ref({});
  325. let idFrontFileCache = ref([]);
  326. let idBackFileCache = ref([]);
  327. let shipDetailCache = ref({});
  328. let shipFileListCache = ref([]);
  329. function change(type) {
  330. if (type) {
  331. userDetailCache.value = _.cloneDeep(userDetail.value);
  332. idFrontFileCache.value = _.cloneDeep(idFrontFile.value);
  333. idBackFileCache.value = _.cloneDeep(idBackFile.value);
  334. unchangeableShipOwner.value = false;
  335. } else {
  336. shipDetailCache.value = _.cloneDeep(shipDetail.value);
  337. shipFileListCache.value = _.cloneDeep(shipFileList.value);
  338. unchangeableShip.value = false;
  339. }
  340. }
  341. function cancelChange(type) {
  342. if (type) {
  343. if (!_.isEqual(userDetail.value, userDetailCache.value)) {
  344. userDetail.value = _.cloneDeep(userDetailCache.value);
  345. }
  346. if (!_.isEqual(idFrontFile.value, idFrontFileCache.value)) {
  347. idFrontFile.value = [];
  348. idFrontFile.value = _.cloneDeep(idFrontFileCache.value);
  349. }
  350. if (!_.isEqual(idBackFile.value, idBackFileCache.value)) {
  351. idBackFile.value = [];
  352. idBackFile.value = _.cloneDeep(idBackFileCache.value);
  353. }
  354. unchangeableShipOwner.value = true;
  355. } else {
  356. if (!_.isEqual(shipDetail.value, shipDetailCache.value)) {
  357. shipDetail.value = _.cloneDeep(shipDetailCache.value);
  358. }
  359. if (!_.isEqual(shipFileList.value, shipFileListCache.value)) {
  360. shipFileList.value = _.cloneDeep(shipFileListCache.value);
  361. }
  362. unchangeableShip.value = true;
  363. }
  364. }
  365. function handleRemoveIdFront(file, list) {
  366. idFrontFile.value = list;
  367. }
  368. function handleRemoveIdBack(file, list) {
  369. idBackFile.value = list;
  370. }
  371. function handleRemoveShip(file, list) {
  372. shipFileList.value = list;
  373. }
  374. async function submitChange(type) {
  375. if (type) {
  376. console.log(userDetail.value);
  377. console.log(idFrontFile.value);
  378. console.log(idBackFile.value);
  379. } else {
  380. }
  381. return;
  382. let res = await api.updateUserDetail(data);
  383. console.log(res);
  384. }
  385. onMounted(() => {
  386. getUserDetail();
  387. });
  388. return {
  389. idFrontUploadSuccess,
  390. idBackUploadSuccess,
  391. shipUploadSuccess,
  392. getUserDetail,
  393. userDetail,
  394. shipDetail,
  395. unchangeableShipOwner,
  396. unchangeableShip,
  397. dialogImageUrl,
  398. dialogVisible,
  399. handleRemoveIdFront,
  400. handleRemoveIdBack,
  401. handleRemoveShip,
  402. idParams,
  403. shipParams,
  404. handlePictureCardPreview,
  405. submitChange,
  406. change,
  407. cancelChange,
  408. router,
  409. idFrontFile,
  410. idBackFile,
  411. // uploadUrl,
  412. };
  413. },
  414. };
  415. </script>
  416. <style scoped>
  417. :deep().el-upload-list__item-thumbnail {
  418. object-fit: contain;
  419. }
  420. .upload-plus-icon {
  421. height: 15%;
  422. color: rgb(139, 147, 156);
  423. line-height: 100px;
  424. font-size: 40px;
  425. font-weight: 200;
  426. }
  427. .upload-text {
  428. height: 25%;
  429. color: rgb(139, 147, 156);
  430. }
  431. </style>