index.vue 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569
  1. <template>
  2. <scroll-view class="scroll-height" :scroll-y="true" :data-theme="'theme-' + proxy.$settingStore.themeColor.name">
  3. <view id="facilitiesGather" v-if="!successBool">
  4. <view class="centerOne">
  5. <!-- <view class="title"> </view> -->
  6. <u--form :model="form" ref="uForm" :rules="rules" labelWidth="90">
  7. <view>
  8. <view style="padding: 10px 10px 20px 10px; background: #ffffff">
  9. <view style="padding-left: 9px">
  10. <u-form-item label="所属部门" prop="department" :borderBottom="true" @click="handleAction('所属部门')" required>
  11. <u-input v-model="form.department" placeholder="请选择所属部门" suffixIcon="arrow-right" suffixIconStyle="color: #909399" border="none" disabledColor="transparent" disabled />
  12. </u-form-item>
  13. <u-form-item label="设施类型" prop="facilityTypeName" :borderBottom="true" @click="handleAction('设施类型')" required>
  14. <u-input v-model="form.facilityTypeName" placeholder="请选择设施类型" suffixIcon="arrow-right" suffixIconStyle="color: #909399" border="none" disabledColor="transparent" disabled />
  15. </u-form-item>
  16. <u-form-item label="设施名称" prop="facilityName" :borderBottom="true" required>
  17. <u-input v-model="form.facilityName" placeholder="请输入设施名称" border="none" />
  18. </u-form-item>
  19. <u-form-item label="状态" prop="status" :borderBottom="true" required>
  20. <u-radio-group v-model="form.status" placement="row">
  21. <u-radio v-for="se in sexList" :key="se" :activeColor="proxy.$settingStore.themeColor.color" :label="se.text" :name="se.value" style="margin-right: 15px"></u-radio>
  22. </u-radio-group>
  23. </u-form-item>
  24. <u-form-item label="设施地址" prop="address" :borderBottom="true" @click="handleAction('设施地址')" required>
  25. <u-input v-model="form.address" placeholder="请选择设施地址" border="none" disabledColor="transparent" disabled>
  26. <template #suffix>
  27. <view class="iconfont ucicon-map menu-icon" style="font-size: 18px; color: #909399"> </view>
  28. </template>
  29. </u-input>
  30. </u-form-item>
  31. <u-form-item label="行政区划" prop="facilityAddress" :borderBottom="true" required>
  32. <view>
  33. <u-input v-model="form.address" placeholder="" border="none" disabledColor="transparent" disabled />
  34. <u-input v-model="form.facilityAddress" placeholder="请输入详细地址" border="none" />
  35. </view>
  36. </u-form-item>
  37. <u-form-item v-if="!form.typeGuise == 1" label="类型" prop="gpsAreas" :borderBottom="true" @click="handleAction('类型')" required>
  38. <view>{{ form.typeGuise == 1 ? "点" : form.typeGuise == 2 ? "线" : form.typeGuise == 3 ? "面" : "" }}</view>
  39. <view v-if="!form.gpsAreas" style="margin: auto; color: #ff0000">未编辑</view>
  40. <view v-if="form.gpsAreas" style="margin: auto; color: #30bb00">已编辑</view>
  41. <view class="iconfont ucicon-bianji1 menu-icon" style="font-size: 14px; color: #909399"> </view>
  42. </u-form-item>
  43. <u-form-item label="联系人" prop="contact" :borderBottom="true" required>
  44. <u-input v-model="form.contact" placeholder="请输入联系人" border="none" />
  45. </u-form-item>
  46. <u-form-item label="联系电话" prop="contactPhone" required :borderBottom="true">
  47. <u-input v-model="form.contactPhone" placeholder="请输入联系电话" border="none" maxlength="11" />
  48. </u-form-item>
  49. <u-form-item label="设备图片" prop="imagesUrl" required :borderBottom="true">
  50. <view class="flex flex-wrap">
  51. <view class="uploadView" style="width: 110px; margin-bottom: 0px" v-if="form.imagesUrl">
  52. <view class="uploadUimage">
  53. <u-image width="100%" height="100%" :src="form.imagesUrl"></u-image>
  54. </view>
  55. <view class="uploadViewClose" @click="uploadViewClose()">
  56. <u-icon name="close" color="#ffffff" size="12"></u-icon>
  57. </view>
  58. </view>
  59. <view :class="'uploadView upload-buttom'" style="width: 110px; margin-bottom: 0px" v-if="!form.imagesUrl" @click="uploadClick">
  60. <u-icon style="margin: auto" name="plus" color="#909399" size="28"></u-icon>
  61. </view>
  62. </view>
  63. </u-form-item>
  64. <u-form-item label="备注" prop="facilityDesc" required :borderBottom="true">
  65. <u-textarea v-model="form.facilityDesc" placeholder="请输入" border="none" maxlength="30" style="padding: 0px"></u-textarea>
  66. </u-form-item>
  67. <u-form-item v-for="(fo, index) in form.extendData" :key="index" :label="fo.name" :prop="fo.key" :borderBottom="true">
  68. <u-input v-if="fo.type === 'SRK'" v-model="fo.value" :placeholder="'请输入' + fo.name" border="none" disabledColor="transparent" />
  69. <u-radio-group v-if="fo.type === 'DXK'" v-model="fo.value" placement="row">
  70. <u-radio
  71. v-for="se in fo.list"
  72. :key="se"
  73. :activeColor="proxy.$settingStore.themeColor.color"
  74. :label="se.attributeValue"
  75. :name="se.attributeCode"
  76. style="margin-right: 15px"
  77. ></u-radio>
  78. </u-radio-group>
  79. <uni-data-select v-if="fo.type === 'XLK'" v-model="fo.value" :placeholder="'请选择' + fo.name" :localdata="fo.list"></uni-data-select>
  80. </u-form-item>
  81. </view>
  82. </view>
  83. </view>
  84. </u--form>
  85. <view style="padding-bottom: 140px"> </view>
  86. <view class="app-button-fixed">
  87. <view class="app-flex">
  88. <u-button class="app-buttom" style="margin-right: 15px" @click="handleSubmit('取消')" shape="circle"> 取消 </u-button>
  89. <u-button class="app-buttom" type="primary" @click="handleSubmit('提交')" shape="circle"> 提交 </u-button>
  90. </view>
  91. </view>
  92. </view>
  93. <u-picker
  94. :show="actionShow"
  95. :columns="actionsList"
  96. :title="'请选择' + actionTitle"
  97. keyName="name"
  98. visibleItemCount="6"
  99. :defaultIndex="[actionDefaultIndex]"
  100. :closeOnClickOverlay="true"
  101. @close="actionShow = false"
  102. @cancel="actionShow = false"
  103. @confirm="selectAction"
  104. @change="changeHandler"
  105. ></u-picker>
  106. </view>
  107. <view v-else>
  108. <view style="display: flex">
  109. <image style="width: 120px; height: 120px; margin: 50px auto 20px auto" src="@/static/images/unitInfoCollection/success.png" />
  110. </view>
  111. <view style="text-align: center; font-weight: 600">提交成功</view>
  112. </view>
  113. </scroll-view>
  114. </template>
  115. <script setup>
  116. import { onLoad, onShow, onHide, onLaunch, onReady } from "@dcloudio/uni-app";
  117. import { ref, onMounted, inject, shallowRef, reactive, toRefs, getCurrentInstance } from "vue";
  118. import { publicStores, useStores } from "@/store/modules/index";
  119. import { typeSelect, add, uploadAvatar, treeselect } from "@/api/business/fireIot/facilitiesGather/index";
  120. const { proxy } = getCurrentInstance();
  121. const publicStore = publicStores();
  122. //设施类型下拉数据存储
  123. const typeSelectList = ref([[]]);
  124. //部门下拉数据存储
  125. const treeselectList = ref([[]]);
  126. const childrenList1 = ref([[]]);
  127. const dataList = reactive({
  128. sexList: [
  129. {
  130. text: "正常",
  131. value: "0",
  132. },
  133. {
  134. text: "维修",
  135. value: "1",
  136. },
  137. {
  138. text: "关闭",
  139. value: "2",
  140. },
  141. ],
  142. form: {
  143. department: "", //所属部门
  144. facilityType: "", //设施类型
  145. facilityTypeName: "", //设施类型名称
  146. facilityName: "", //设施名称
  147. status: "0", //设施状态
  148. address: "", //设施地址
  149. longitude: "", //经度
  150. latitude: "", //纬度
  151. province: "", //省
  152. city: "", //市
  153. area: "", //区(县)
  154. facilityAddress: "", //详细地址
  155. streetTown: null, //所属街镇
  156. gpsAreas: "", //经纬度集合
  157. contact: "", //联系人
  158. contactPhone: "", //联系方式
  159. imagesUrl: "", //图⽚地址URL
  160. facilityDesc: "", //备注
  161. extendData: [], //扩展属性
  162. recordPictureList: [],
  163. typeGuise: undefined, //点线面类型
  164. },
  165. rules: {
  166. department: [
  167. {
  168. required: false,
  169. message: "请选择所属部门",
  170. trigger: ["blur", "change"],
  171. },
  172. ],
  173. facilityTypeName: [
  174. {
  175. required: true,
  176. message: "请选择设施类型",
  177. trigger: ["blur", "change"],
  178. },
  179. ],
  180. facilityName: [
  181. {
  182. required: true,
  183. message: "请输入设施名称",
  184. trigger: ["blur", "change"],
  185. },
  186. ],
  187. status: [
  188. {
  189. required: true,
  190. message: "请选择设施状态",
  191. trigger: ["blur", "change"],
  192. },
  193. ],
  194. address: [
  195. {
  196. required: false,
  197. message: "请选择设施地址",
  198. trigger: ["blur", "change"],
  199. },
  200. ],
  201. facilityAddress: [
  202. {
  203. required: true,
  204. message: "请输入详细地址",
  205. trigger: ["blur", "change"],
  206. },
  207. ],
  208. contact: [
  209. {
  210. required: true,
  211. message: "请输入联系人",
  212. trigger: ["blur", "change"],
  213. },
  214. ],
  215. contactPhone: [
  216. {
  217. required: true,
  218. message: "请输入联系人电话",
  219. trigger: ["blur", "change"],
  220. },
  221. {
  222. type: "string",
  223. min: 11,
  224. required: true,
  225. message: "请输入正确11位联系人电话",
  226. pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/,
  227. trigger: ["blur", "change"],
  228. },
  229. ],
  230. imagesUrl: [
  231. {
  232. required: true,
  233. message: "请选择图片",
  234. trigger: ["blur", "change"],
  235. },
  236. ],
  237. facilityDesc: [
  238. {
  239. required: true,
  240. message: "请输入备注",
  241. trigger: ["blur", "change"],
  242. },
  243. ],
  244. },
  245. actionIndex: 0,
  246. actionIndex1: 0,
  247. actionTitle: "",
  248. actionShow: false,
  249. actionDefaultIndex: 0,
  250. actionsList: [[]],
  251. });
  252. const { sexList, form, rules, actionIndex, actionIndex1, actionTitle, actionShow, actionDefaultIndex, actionsList } = toRefs(dataList);
  253. const uForm = ref(null);
  254. const successBool = ref(false);
  255. /**
  256. * @api提交
  257. */
  258. function handleSubmit(type) {
  259. let param = {};
  260. if (type == "提交") {
  261. uForm.value
  262. .validate()
  263. .then((res) => {
  264. uni.$u.toast("校验通过");
  265. param = {
  266. facilityType: form.value.facilityType,
  267. facilityName: form.value.facilityName,
  268. status: form.value.status, //设施状态
  269. address: "徐乐路208号", //设施地址
  270. longitude: "121.3632126", //经度
  271. latitude: "30.98168041", //纬度
  272. province: "", //省
  273. city: "", //市
  274. area: "", //区(县)
  275. facilityAddress: form.value.facilityAddress, //详细地址
  276. gpsAreas: "", //经纬度集合
  277. contact: form.value.contact, //联系人
  278. contactPhone: form.value.contactPhone, //联系方式
  279. imagesUrl: form.value.imagesUrl, //图⽚地址URL
  280. facilityDesc: form.value.facilityDesc, //备注
  281. };
  282. form.value.extendData.forEach((el) => {
  283. param.extendData.push({ key: el.key, value: el.value });
  284. });
  285. add(param).then((requset) => {});
  286. })
  287. .catch((errors) => {
  288. uni.$u.toast("校验失败");
  289. });
  290. } else {
  291. proxy.$tab.navigateBack();
  292. }
  293. }
  294. /**
  295. * @action弹出框点击事件
  296. */
  297. function handleAction(value, index, index1) {
  298. actionsList.value = [[]];
  299. if (value == "所属部门") {
  300. actionTitle.value = "所属部门";
  301. actionsList.value = treeselectList.value;
  302. treeselectList.value[0].forEach((el, ind) => {
  303. if (el.name === form.value.department) {
  304. actionDefaultIndex.value = ind;
  305. }
  306. });
  307. }
  308. if (value == "设施类型") {
  309. actionTitle.value = "设施类型";
  310. actionsList.value = typeSelectList.value;
  311. typeSelectList.value[0].forEach((el, ind) => {
  312. if (el.name === form.value.facilityTypeName) {
  313. actionDefaultIndex.value = ind;
  314. }
  315. });
  316. }
  317. if (value == "设施地址") {
  318. proxy.$tab.navigateTo("/pages/business/fireIot/facilitiesGather/mapGather");
  319. return;
  320. }
  321. if (value == "类型") {
  322. return;
  323. }
  324. actionShow.value = true;
  325. }
  326. /**
  327. * @action弹出框选择事件
  328. */
  329. function selectAction(e) {
  330. console.log(e);
  331. if (actionTitle.value == "设施类型") {
  332. form.value.facilityType = e.value[0].value;
  333. form.value.facilityTypeName = e.value[0].name;
  334. form.value.typeGuise = e.value[0].typeGuise;
  335. if (e.value[0].dataField) {
  336. form.value.extendData = e.value[0].dataField;
  337. form.value.extendData.forEach((el) => {
  338. if (el.type === "XLK") {
  339. if (el.list) {
  340. el.list.forEach((e) => {
  341. e.value = e.attributeCode;
  342. e.text = e.attributeValue;
  343. });
  344. }
  345. }
  346. });
  347. } else {
  348. form.value.extendData = [];
  349. }
  350. }
  351. // if (actionTitle.value == "灭火器") {
  352. // form.value.baseBuildList[actionIndex.value].baseBuildExtinguishList[actionIndex1.value].extinguishType = e.value[0].name;
  353. // form.value.baseBuildList[actionIndex.value].baseBuildExtinguishList[actionIndex1.value].extinguishTypeValue = e.value[0].value;
  354. // }
  355. actionShow.value = false;
  356. }
  357. /**
  358. * @action弹出框change事件
  359. */
  360. function changeHandler(e) {
  361. const uPicker = ref(null);
  362. const {
  363. columnIndex,
  364. value,
  365. values, // values为当前变化列的数组内容
  366. index,
  367. // 微信小程序无法将picker实例传出来,只能通过ref操作
  368. picker = uPicker.value,
  369. } = e;
  370. // 当第一列值发生变化时,变化第二列(后一列)对应的选项
  371. console.log(columnIndex, index);
  372. if (columnIndex === 0) {
  373. // picker为选择器this实例,变化第二列对应的选项
  374. picker.setColumnValues(1, columnData[index]);
  375. }
  376. }
  377. /**
  378. * @upload图片上传
  379. * @点击事件
  380. */
  381. function uploadClick() {
  382. uni.chooseImage({
  383. count: 1, //默认9
  384. sizeType: ["original", "compressed"], //可以指定是原图还是压缩图,默认二者都有
  385. sourceType: ["album", "camera"], //从相册选择、摄像头
  386. success: function (res) {
  387. uploadApi(res);
  388. },
  389. });
  390. }
  391. /**
  392. * @upload图片上传
  393. * @api接口请求
  394. */
  395. function uploadApi(res) {
  396. let data = { name: "file", filePath: res.tempFilePaths[0] };
  397. uploadAvatar(data).then((response) => {
  398. form.value.imagesUrl = response.data.url;
  399. });
  400. }
  401. /**
  402. * @upload图片上传
  403. * @点击事件
  404. * @删除事件
  405. */
  406. function uploadViewClose(el) {
  407. form.value.imagesUrl = "";
  408. }
  409. onLoad((options) => {
  410. form.value.baseBuildList = [];
  411. rules.value.baseBuildList = [];
  412. typeSelect({ id: "" }).then((requset) => {
  413. if (requset.status === "SUCCESS") {
  414. requset.data.forEach((el) => {
  415. typeSelectList.value[0].push({ name: el.typeName, value: el.id, typeGuise: el.typeGuise, dataField: el.dataField ? JSON.parse(el.dataField) : [] });
  416. });
  417. }
  418. });
  419. treeselect({}).then((requset) => {
  420. if (requset.status === "SUCCESS") {
  421. console.log(requset.data);
  422. requset.data.forEach((el) => {
  423. treeselectList.value[0].push({ name: el.label, value: el.id, children: el.children });
  424. });
  425. var data = [
  426. {
  427. id: 124,
  428. label: "公司",
  429. children: [
  430. {
  431. id: 125,
  432. label: "it",
  433. children: [
  434. {
  435. id: 126,
  436. label: "二组",
  437. },
  438. ],
  439. },
  440. ],
  441. },
  442. {
  443. id: 124,
  444. label: "公司",
  445. children: [
  446. {
  447. id: 125,
  448. label: "it1",
  449. children: [
  450. {
  451. id: 126,
  452. label: "1组",
  453. },
  454. ],
  455. },
  456. ],
  457. },
  458. {
  459. id: 124,
  460. label: "公司",
  461. children: [
  462. {
  463. id: 125,
  464. label: "it2",
  465. children: [
  466. {
  467. id: 126,
  468. label: "3组",
  469. },
  470. ],
  471. },
  472. ],
  473. },
  474. ];
  475. data.forEach((el) => {
  476. treeselectList.value[0].push({ name: el.label, value: el.id, children: el.children });
  477. });
  478. }
  479. });
  480. });
  481. onShow(() => {
  482. //调用系统主题颜色
  483. proxy.$settingStore.systemThemeColor([1]);
  484. });
  485. </script>
  486. <style lang="scss">
  487. #facilitiesGather {
  488. .centerOne,
  489. .centerTwo {
  490. .title {
  491. color: #333333;
  492. text-align: center;
  493. }
  494. }
  495. :deep(.u-picker__view__column__item) {
  496. font-size: 13px;
  497. }
  498. :deep(.uni-select) {
  499. padding-left: 0;
  500. border: 0;
  501. font-size: 15px;
  502. }
  503. :deep(.uni-select__input-placeholder) {
  504. font-size: 15px;
  505. color: rgb(192, 196, 204);
  506. }
  507. :deep(.uni-select--mask) {
  508. position: relative;
  509. }
  510. }
  511. </style>