addBuild.vue 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280
  1. <template>
  2. <el-dialog
  3. :title="buildTitle"
  4. :visible.sync="buildDialogVis"
  5. id="messageDialog"
  6. width="850px"
  7. >
  8. <el-form
  9. :inline="true"
  10. :model="form"
  11. label-width="160px"
  12. :label-position="'right'"
  13. :rules="rules"
  14. ref="ruleForm"
  15. >
  16. <template v-for="(val,key) in buildMessage">
  17. <h4>{{key}}</h4>
  18. <div
  19. :key="item.InfoPointCode"
  20. v-for="item in val"
  21. :class="[{'upload-file':item.InputMode == 'F2' || item.Path === 'BuildingInfo.BuildingType.Pic'}]"
  22. style="width: 50%;display: inline-block"
  23. >
  24. <el-form-item
  25. :class="{FloorTypeSelect:item.InputMode == 'D1'||item.Unit}"
  26. :label="item.InfoPointName"
  27. :prop="item.InfoPointCode"
  28. v-if="all||item.Visible"
  29. >
  30. <el-input
  31. v-model="form[item.Path]"
  32. v-if="item.InputMode == 'B1' || item.InputMode == 'B2'"
  33. />
  34. <el-input type="number" v-else-if="item.InputMode == 'A1'||item.InputMode == 'A2'"
  35. v-model="form[item.Path]">
  36. <template slot="append" v-if="item.Unit">{{item.Unit}}</template>
  37. </el-input>
  38. <el-select
  39. placeholder="请选择"
  40. v-else-if="item.InputMode == 'D1' || item.InputMode == 'E2'"
  41. v-model="form[item.Path]"
  42. >
  43. <el-option :key="op.Name" :label="op.Name" :value="op.Code" v-for="op in item.options"></el-option>
  44. </el-select>
  45. <el-select
  46. placeholder="请选择"
  47. v-else-if="item.InputMode == 'D2'"
  48. v-model="form[item.Path]"
  49. multiple
  50. collapse-tags
  51. >
  52. <el-option :key="op.Name" :label="op.Name" :value="op.Code" v-for="op in item.options"></el-option>
  53. </el-select>
  54. <el-date-picker
  55. v-model="form[item.Path]"
  56. type="daterange"
  57. v-else-if="item.InputMode == 'C6'"
  58. value-format="yyyy-MM-dd"
  59. range-separator="至"
  60. start-placeholder="开始日期"
  61. end-placeholder="结束日期"
  62. />
  63. <el-cascader
  64. v-else-if="item.InputMode == 'D1L'"
  65. placeholder="请选择"
  66. :options="item.options"
  67. v-model="form[item.Path]"
  68. :props="{ checkStrictly: true ,value: 'Code',label:'Name'}"
  69. clearable
  70. style="width: 200px"
  71. />
  72. <el-input
  73. v-else-if="item.InputMode == 'L'||item.InputMode == 'L1'||item.InputMode == 'L2'||item.InputMode == 'M'"
  74. v-model="form[item.Path]">
  75. <template slot="append" v-if="item.Unit">{{item.Unit}}</template>
  76. </el-input>
  77. <el-date-picker
  78. placeholder="选择日期"
  79. value-format="yyyy-MM-dd"
  80. type="date" v-else-if="item.InputMode == 'C5'" v-model="form[item.Path]">
  81. </el-date-picker>
  82. <uploadImgs
  83. :readOnly="false"
  84. v-else-if="item.InputMode == 'F2'&& item.Path === 'BuildingInfo.BuildingType.Pic'"
  85. v-model="form[item.Path]"
  86. :keysArr="Array.isArray(buildData[item.Path]) ? buildData[item.Path]:[]"
  87. :context-key="item.Path"
  88. :isShow="1"
  89. @change="changeItem"
  90. />
  91. <upload-files
  92. v-model="form[item.Path]"
  93. v-else-if="item.InputMode == 'F2'"
  94. :readOnly="false"
  95. :isShow="1"
  96. :keys-arr="Array.isArray(buildData[item.Path]) ? buildData[item.Path]:[] "
  97. :show-file-list="false"
  98. :context-key="item.Path"
  99. @change="changeItem"
  100. />
  101. <el-input disabled title="暂不支持" v-else v-model="form[item.Path]"/>
  102. </el-form-item>
  103. </div>
  104. </template>
  105. </el-form>
  106. <span
  107. class="dialog-footer"
  108. slot="footer"
  109. >
  110. <el-button @click="buildDialogVis = false">取 消</el-button>
  111. <el-button @click="submitForm('ruleForm')" type="primary">确 定</el-button>
  112. </span>
  113. <el-dialog :visible.sync="dialogVisible">
  114. <img width="100%" :src="dialogImageUrl" alt="">
  115. </el-dialog>
  116. </el-dialog>
  117. </template>
  118. <script>
  119. import uploadFiles from "@/components/business_space/lib/uploadFiles";
  120. import uploadImgs from "@/components/business_space/lib/uploadImgsName";
  121. function flattenKeys(obj) {
  122. let res = {}
  123. function isObject(val) {
  124. return typeof val === 'object' && !Array.isArray(val)
  125. }
  126. function digKeys(prev, obj) {
  127. Object.entries(obj).forEach(([key, value]) => {
  128. const currentKey = prev ? `${prev}.${key}` : key
  129. if (isObject(value)) {
  130. digKeys(currentKey, value)
  131. } else {
  132. res[currentKey] = value
  133. }
  134. })
  135. }
  136. digKeys('', obj)
  137. return res
  138. }
  139. export default {
  140. data() {
  141. return {
  142. buildName: '',
  143. keysArr: [], //保存临时的文件key
  144. buildDialogVis: false,
  145. form: {},
  146. dialogImageUrl: '',
  147. dialogVisible: false,
  148. all: true,
  149. rules: {
  150. "BuildLocalID": [
  151. {"required": true, "message": "请输入建筑本地编码", "trigger": "blur"}
  152. ],
  153. "BuildLocalName": [
  154. {"required": true, "message": "请输入建筑本地名称", "trigger": "blur"}
  155. ]
  156. },
  157. buildData: {},
  158. }
  159. },
  160. components: {uploadFiles, uploadImgs},
  161. props: ['buildTitle', 'buildMessage', 'currentBuild'],
  162. computed: {
  163. },
  164. mounted() {
  165. },
  166. methods: {
  167. deepCopy(obj) {
  168. return JSON.parse(JSON.stringify(obj))
  169. },
  170. showDialog(data) {
  171. //获取信息
  172. let buildData = data || {}; // string =>array key
  173. buildData = flattenKeys(buildData);
  174. for (let key in this.buildMessage) {
  175. let arr = this.buildMessage[key];
  176. if (Array.isArray(arr)) {
  177. let list = arr.filter(i => i.InputMode == 'D2' || i.InputMode == 'C6');
  178. list.forEach(j => {
  179. if (buildData.hasOwnProperty(j.Path)) {
  180. if (!Array.isArray(buildData[j.Path])) {
  181. buildData[j.Path] = buildData[j.Path].split(',');
  182. }
  183. }
  184. })
  185. }
  186. }
  187. this.buildData = buildData;
  188. this.timeoutSetVal()
  189. this.buildDialogVis = true
  190. },
  191. timeoutSetVal() {
  192. let that = this
  193. setTimeout(() => {
  194. if (that.form) {
  195. that.form = that.buildData
  196. } else {
  197. this.timeoutSetVal()
  198. }
  199. })
  200. },
  201. closeDialog() {
  202. this.buildDialogVis = false
  203. },
  204. submitForm(formName) {
  205. this.$refs[formName].validate((valid) => {
  206. if (valid) {
  207. console.log(this.form);
  208. for (let key in this.buildMessage) {
  209. let arr = this.buildMessage[key];
  210. if (Array.isArray(arr)) {
  211. let list = arr.filter(i => i.InputMode == 'D2' || i.InputMode == 'C6');
  212. list.forEach(j => {
  213. if (this.form.hasOwnProperty(j.Path)) {
  214. if (Array.isArray(this.form[j.Path])) {
  215. this.form[j.Path] = this.form[j.Path].join(',');
  216. }
  217. }
  218. })
  219. }
  220. }
  221. this.$emit('handleBuild', this.form)
  222. } else {
  223. return false;
  224. }
  225. });
  226. },
  227. changeItem(val) {
  228. console.log(val)
  229. let _key = Object.keys(val)[0] + '';
  230. this.form[_key] = val[_key];
  231. },
  232. }
  233. }
  234. </script>
  235. <style lang="less" scoped>
  236. #messageDialog {
  237. /deep/ .el-date-editor.el-input, .el-date-editor.el-input__inner, /deep/ .el-select {
  238. width: 200px;
  239. }
  240. /deep/ .FloorTypeSelect .el-form-item__content {
  241. width: 200px;
  242. }
  243. /deep/ .el-dialog__body {
  244. height: 420px;
  245. overflow: auto;
  246. }
  247. .upload-file {
  248. width: 100% !important;
  249. display: block !important;
  250. }
  251. }
  252. </style>