create.vue 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350
  1. <template>
  2. <van-nav-bar title="线上报修" safe-area-inset-top>
  3. <template #left>
  4. <van-icon
  5. :name="require('@/assets/arrow-left.svg')"
  6. size="24"
  7. @click="backPath"
  8. />
  9. </template>
  10. </van-nav-bar>
  11. <div class="page_info">
  12. <van-form
  13. input-align="right"
  14. error-message-align="right"
  15. @submit="onSubmit"
  16. >
  17. <van-cell-group :border="false">
  18. <van-field
  19. v-model="dataForm.repairPositionName"
  20. label="报修位置"
  21. required
  22. is-link
  23. placeholder="请选择报修位置"
  24. clearable
  25. :rules="[{ required: true, message: '请选择报修位置' }]"
  26. @click="showRepairPositionPicker = true"
  27. />
  28. <van-popup
  29. v-model:show="showRepairPositionPicker"
  30. round
  31. position="bottom"
  32. >
  33. <van-cascader
  34. v-model="dataForm.repairPosition"
  35. title="请选择报修位置"
  36. active-color="#2e69eb"
  37. :options="positionList"
  38. :field-names="fieldNames"
  39. @close="showRepairPositionPicker = false"
  40. @finish="onFinish"
  41. />
  42. </van-popup>
  43. <van-field
  44. v-model="dataForm.repairRegionName"
  45. label="报修区域"
  46. required
  47. is-link
  48. placeholder="请选择报修区域"
  49. clearable
  50. :rules="[{ required: true, message: '请选择报修区域' }]"
  51. @click="showRepairRegionPicker = true"
  52. />
  53. <van-popup
  54. v-model:show="showRepairRegionPicker"
  55. round
  56. position="bottom"
  57. >
  58. <van-picker
  59. :columns="repairRegionList"
  60. :columns-field-names="columnsFieldNames"
  61. @cancel="showRepairRegionPicker = false"
  62. @confirm="
  63. (value) => {
  64. dataForm.repairRegion = value.dictValue;
  65. dataForm.repairRegionName = value.dictLabel;
  66. showRepairRegionPicker = false;
  67. }
  68. "
  69. />
  70. </van-popup>
  71. <van-field
  72. v-model="dataForm.repairTypeName"
  73. label="报修类型"
  74. required
  75. is-link
  76. placeholder="请选择报修类型"
  77. clearable
  78. :rules="[{ required: true, message: '请选择报修类型' }]"
  79. @click="showRepairTypePicker = true"
  80. />
  81. <van-popup v-model:show="showRepairTypePicker" round position="bottom">
  82. <van-picker
  83. :columns="repairTypeList"
  84. :columns-field-names="columnsFieldNames"
  85. @cancel="showRepairTypePicker = false"
  86. @confirm="
  87. (value) => {
  88. dataForm.repairType = value.dictValue;
  89. dataForm.repairTypeName = value.dictLabel;
  90. showRepairTypePicker = false;
  91. }
  92. "
  93. />
  94. </van-popup>
  95. <van-field
  96. v-model="dataForm.contactPerson"
  97. label="联系人"
  98. required
  99. placeholder="请输入联系人"
  100. clearable
  101. :rules="[{ required: true, message: '请输入联系人' }]"
  102. />
  103. <van-field
  104. v-model="dataForm.contactPhone"
  105. label="联系电话"
  106. required
  107. maxlength="11"
  108. placeholder="请输入联系电话"
  109. clearable
  110. :rules="[{ required: true, message: '请输入联系电话' }]"
  111. />
  112. <van-field
  113. v-model="dataForm.faultDes"
  114. type="textarea"
  115. label="故障描述"
  116. required
  117. rows="4"
  118. autosize
  119. maxlength="1000"
  120. show-word-limit
  121. placeholder="请输入故障描述"
  122. clearable
  123. :rules="[{ required: true, message: '请输入故障描述' }]"
  124. />
  125. <van-cell title="上传照片" :border="false" class="upload_cell">
  126. <template #value>
  127. <van-uploader
  128. v-model="fileList"
  129. multiple
  130. :upload-icon="require('@/assets/camera.svg')"
  131. :max-size="500 * 1024"
  132. :max-count="10"
  133. accept="image/jpeg,image/jpg,image/png"
  134. :before-read="beforeRead"
  135. :before-delete="beforeDelete"
  136. :after-read="afterRead"
  137. @oversize="onOversize"
  138. />
  139. </template>
  140. </van-cell>
  141. </van-cell-group>
  142. <van-submit-bar class="save_btn">
  143. <template #button>
  144. <van-button block type="primary" native-type="submit">
  145. 提交
  146. </van-button>
  147. </template>
  148. </van-submit-bar>
  149. </van-form>
  150. </div>
  151. </template>
  152. <script>
  153. import Api from "@/utils/api";
  154. import { getDictDataList } from "@/utils/index";
  155. export default {
  156. data() {
  157. return {
  158. loading: false,
  159. fileList: [],
  160. tempFileList: [],
  161. positionList: [],
  162. columnsFieldNames: {
  163. text: "dictLabel",
  164. value: "dictValue",
  165. },
  166. fieldNames: {
  167. text: "orgName",
  168. value: "orgId",
  169. children: "childrenList",
  170. },
  171. showRepairPositionPicker: false,
  172. showRepairRegionPicker: false,
  173. showRepairTypePicker: false,
  174. repairRegionList: [],
  175. repairTypeList: [],
  176. dataForm: {
  177. id: "",
  178. buildingId: "",
  179. storeyId: "",
  180. houseId: "",
  181. repairPosition: "",
  182. repairPositionName: "",
  183. repairRegion: 1,
  184. repairRegionName: "",
  185. repairType: 1,
  186. repairTypeName: "",
  187. contactPerson: "",
  188. contactPhone: "",
  189. faultDes: "",
  190. faultPics: "",
  191. },
  192. };
  193. },
  194. created() {
  195. this.getBuildList();
  196. this.getRepairTypeList();
  197. this.getRepairRegionList();
  198. },
  199. methods: {
  200. getRepairTypeList() {
  201. this.repairTypeList = getDictDataList("RepairType");
  202. },
  203. getRepairRegionList() {
  204. this.repairRegionList = getDictDataList("RepairRegion");
  205. },
  206. //获取楼栋
  207. getBuildList() {
  208. Api.getBuildInfo().then((res) => {
  209. if (res.code == 0) {
  210. this.positionList = res.data[0].childrenList;
  211. }
  212. });
  213. },
  214. onFinish(val) {
  215. this.dataForm.buildingId = val.selectedOptions[0].orgId;
  216. this.dataForm.storeyId = val.selectedOptions[1].orgId;
  217. this.dataForm.houseId = val.selectedOptions[2].orgId;
  218. this.dataForm.repairPositionName =
  219. val.selectedOptions[0].orgName +
  220. "/" +
  221. val.selectedOptions[1].orgName +
  222. "/" +
  223. val.selectedOptions[2].orgName;
  224. this.showRepairPositionPicker = false;
  225. },
  226. onOversize() {
  227. this.$toast("单个文件大小不能超过 500kb");
  228. },
  229. beforeRead(file) {
  230. if (file instanceof Array) {
  231. const obj = file.find(
  232. (item) =>
  233. !(
  234. item.type == "image/jpg" ||
  235. item.type == "image/jpeg" ||
  236. item.type == "image/png"
  237. )
  238. );
  239. if (obj) {
  240. this.$toast("请上传 jpeg、jpg或png 格式图片");
  241. return false;
  242. }
  243. } else {
  244. const isJPG = file.type == "image/jpg";
  245. const isJPEG = file.type == "image/jpeg";
  246. const isPNG = file.type == "image/png";
  247. if (!(isJPG || isJPEG || isPNG)) {
  248. this.$toast("请上传 jpeg、jpg或png 格式图片");
  249. return false;
  250. }
  251. }
  252. return true;
  253. },
  254. beforeDelete(file) {
  255. this.tempFileList = this.tempFileList.filter(
  256. (item) => item.name != file.file.name
  257. );
  258. this.fileList = this.fileList.filter(
  259. (item) => item.file.name != file.file.name
  260. );
  261. },
  262. afterRead(file) {
  263. if (file instanceof Array) {
  264. file.forEach((file) => {
  265. file.status = "uploading";
  266. file.message = "上传中...";
  267. setTimeout(async () => {
  268. await this.uploadFile(file);
  269. }, 1000);
  270. });
  271. } else {
  272. file.status = "uploading";
  273. file.message = "上传中...";
  274. setTimeout(() => {
  275. this.uploadFile(file);
  276. }, 1000);
  277. }
  278. },
  279. uploadFile(file) {
  280. // 这时候我们创建一个formData对象实例
  281. const formData = new FormData();
  282. // 通过append方法添加需要的file
  283. // 这里需要注意 append(key, value)来添加数据,如果指定的key不存在则会新增一条数据,如果key存在,则添加到数据的末尾
  284. formData.append("file", file.file);
  285. // 上传文件、成功后, 把Url 赋值给 field
  286. Api.uploadFile(formData).then((res) => {
  287. if (res.code == 0) {
  288. file.status = "done";
  289. file.message = "上传成功";
  290. this.tempFileList.push({ name: file.file.name, url: res.data });
  291. } else {
  292. file.status = "failed";
  293. file.message = "上传失败";
  294. }
  295. });
  296. },
  297. onSubmit() {
  298. let tempArr = [];
  299. this.tempFileList.forEach((item) => {
  300. tempArr.push(item.url);
  301. });
  302. this.dataForm.faultPics = tempArr.join(",");
  303. this.$toast.loading({
  304. message: "保存中...",
  305. forbidClick: true,
  306. });
  307. Api.repairSave(this.dataForm).then((res) => {
  308. this.$toast.clear();
  309. if (res.code == 0) {
  310. this.$toast.success("保存成功");
  311. } else {
  312. this.$toast.fail("保存失败");
  313. }
  314. });
  315. },
  316. backPath() {
  317. this.$router.back();
  318. },
  319. },
  320. };
  321. </script>
  322. <style lang="scss" scoped>
  323. .page_info {
  324. margin-top: 12px;
  325. /deep/ {
  326. .upload_cell {
  327. .van-cell__title {
  328. flex: unset;
  329. }
  330. .van-cell__value {
  331. margin-left: 8px;
  332. text-align: center;
  333. }
  334. }
  335. }
  336. }
  337. </style>