organInfo.vue 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440
  1. <!-- -->
  2. <template>
  3. <div class="m-core">
  4. <el-alert
  5. :title="tenantInfo == 'SETTING' ? '基本信息' : '机构信息'"
  6. type="info"
  7. :closable="false"
  8. style="margin-bottom: 20px"
  9. ></el-alert>
  10. <!-- label-position="top" -->
  11. <el-form ref="form" label-position="top" :model="form" label-width="140px" :inline="true">
  12. <el-col :span="24">
  13. <el-form-item label="机构LOGO" prop="logo"
  14. :rules="[{ required: true, message: '请上传机构LOGO', trigger: 'blur, change' }]">
  15. <div style="width: 300px !important">
  16. <el-upload
  17. class="avatar-uploader"
  18. action="/api-web/uploadFile"
  19. accept=".png"
  20. :headers="headers"
  21. :show-file-list="false"
  22. :disabled="isDisabled"
  23. :on-success="handleAvatarSuccess"
  24. :before-upload="beforeAvatarUpload"
  25. >
  26. <img v-if="form.logo" :src="form.logo" class="avatar" />
  27. <i v-else class="el-icon-plus avatar-uploader-icon"></i>
  28. </el-upload>
  29. <div class="tips" v-show="!isDisabled" style="line-height: 1;color: red;">图片尺寸:72x72;支持的格式:png;</div>
  30. </div>
  31. </el-form-item>
  32. <el-form-item label="主题" v-if="tenantInfo == 'SETTING'" prop="theme" :rules="[{ required: true, message: '请选择主题', trigger: 'change' }]">
  33. <el-select
  34. v-model="form.theme"
  35. :disabled="isDisabled"
  36. placeholder="请选择主题"
  37. >
  38. <el-option label="大雅绿" value="green"></el-option>
  39. </el-select>
  40. </el-form-item>
  41. <el-form-item label="主题色" v-if="tenantInfo == 'SETTING'" prop="themeColor" :rules="[{ required: true, message: '请选择主题色', trigger: 'change' }]">
  42. <div style="width: 300px !important">
  43. <!-- <el-color-picker :disabled="isDisabled" v-model="form.themeColor"></el-color-picker> -->
  44. <!-- <theme-picker /> -->
  45. <div class="themeColor">
  46. <el-tooltip v-for="item in themeList" :key="item.color" effect="dark" :content="item.name" placement="top">
  47. <div class="themeColor-block" @click="onSelectTheme(item)" :style="item.style"><i class="el-icon-check" v-show="item.selected"></i></div>
  48. </el-tooltip>
  49. </div>
  50. </div>
  51. </el-form-item>
  52. </el-col>
  53. <el-form-item label="公司全称" prop="tsignName"
  54. :rules="[{ required: true, message: '请输入公司全称', trigger: 'blur' }]">
  55. <el-input
  56. v-model.trim="form.tsignName"
  57. :disabled="isDisabled || tenantInfo == 'SETTING'"
  58. placeholder="请输入公司全称"
  59. ></el-input>
  60. </el-form-item>
  61. <el-form-item label="营业执照编号" prop="tsignCode"
  62. :rules="[{ required: true, message: '请输入营业执照编号', trigger: 'blur' }]">
  63. <el-input
  64. v-model.trim="form.tsignCode"
  65. :disabled="isDisabled || tenantInfo == 'SETTING'"
  66. placeholder="请输入营业执照编号"
  67. ></el-input>
  68. </el-form-item>
  69. <el-form-item label="所在城市" required>
  70. <el-form-item prop="province" :rules="[{ required: true, message: '请选择省', trigger: 'change' }]" style="margin-right: 0;">
  71. <el-select
  72. v-model.trim="form.province"
  73. filterable
  74. placeholder="请选择省"
  75. :disabled="isDisabled"
  76. clearable
  77. style="width: 148px !important;"
  78. @change="onChangeProvince"
  79. >
  80. <el-option
  81. v-for="item in provinceList"
  82. :key="item.value"
  83. :label="item.label"
  84. :value="item.value"
  85. ></el-option>
  86. </el-select>
  87. </el-form-item>
  88. <el-form-item prop="city" :rules="[{ required: true, message: '请选择市', trigger: 'change' }]">
  89. <el-select
  90. v-model.trim="form.city"
  91. filterable
  92. :disabled="isDisabled"
  93. style="width: 148px !important;"
  94. placeholder="请选择市"
  95. clearable
  96. >
  97. <el-option
  98. v-for="item in cityList"
  99. :key="item.value"
  100. :label="item.label"
  101. :value="item.value"
  102. ></el-option>
  103. </el-select>
  104. </el-form-item>
  105. </el-form-item>
  106. <el-form-item label="机构简称" prop="name"
  107. :rules="[{ required: true, message: '请输入机构简称', trigger: 'blur' }]">
  108. <el-input
  109. v-model.trim="form.name"
  110. :disabled="isDisabled"
  111. :max="8"
  112. :maxlength="8"
  113. placeholder="请输入机构简称(最多8个字)"
  114. ></el-input>
  115. </el-form-item>
  116. <el-form-item label="机构联系人" prop="contacts"
  117. :rules="[{ required: true, message: '请输入机构联系人', trigger: 'blur' }]">
  118. <el-input
  119. v-model.trim="form.contacts"
  120. :disabled="isDisabled"
  121. placeholder="请输入机构联系人"
  122. ></el-input>
  123. </el-form-item>
  124. <el-form-item label="联系人手机号" prop="phone"
  125. :rules="[{ required: true, message: '请输入联系人手机号', trigger: 'blur' },
  126. { pattern: /^1[3456789]\d{9}$/, message: '请输入正确的手机号', trigger: 'blur' }]">
  127. <el-input
  128. v-model.trim="form.phone"
  129. :max="11"
  130. :disabled="isDisabled"
  131. type="number"
  132. oninput="if(value.length > 11)value=value.slice(0, 11)"
  133. style="width: 187px"
  134. placeholder="请输入联系人手机号"
  135. ></el-input>
  136. </el-form-item>
  137. <el-form-item label="机构邮箱" prop="email"
  138. :rules="[{ required: true, message: '请输入机构邮箱', trigger: 'blur' },
  139. { pattern: /^\w+((.\w+)|(-\w+))@[A-Za-z0-9]+((.|-)[A-Za-z0-9]+).[A-Za-z0-9]+$/, message: '请输入正确的邮箱格式', trigger: 'blur' }]">
  140. <el-input
  141. v-model.trim="form.email"
  142. :disabled="isDisabled"
  143. placeholder="请输入机构邮箱"
  144. ></el-input>
  145. </el-form-item>
  146. <!-- -->
  147. <el-form-item label="机构客服电话" prop="customerServicePhone">
  148. <el-input
  149. v-model.trim="form.customerServicePhone"
  150. type="number"
  151. :disabled="isDisabled"
  152. placeholder="请输入机构客服电话"
  153. ></el-input>
  154. </el-form-item>
  155. <el-form-item label="机构地址" prop="address">
  156. <el-input
  157. v-model.trim="form.address"
  158. :disabled="isDisabled"
  159. placeholder="请输入机构地址"
  160. ></el-input>
  161. </el-form-item>
  162. <el-form-item label="机构简介" prop="remark">
  163. <el-input
  164. type="textarea"
  165. show-word-limit
  166. :max="200"
  167. :disabled="isDisabled"
  168. v-model.trim="form.remark"
  169. ></el-input>
  170. </el-form-item>
  171. </el-form>
  172. </div>
  173. </template>
  174. <script>
  175. import { getToken } from "@/utils/auth";
  176. import {
  177. areaQueryChild,
  178. getParentArea,
  179. } from "@/api/specialSetting";
  180. import ThemePicker from '@/components/ThemePicker'
  181. export default {
  182. props: ['type', 'data', 'tenantInfo'],
  183. components: { ThemePicker },
  184. data () {
  185. return {
  186. headers: {
  187. Authorization: getToken(),
  188. },
  189. themeList: [{
  190. selected: true,
  191. name: '大雅绿(默认)',
  192. color: '#14928a',
  193. style: 'background-color: #14928a'
  194. }, {
  195. selected: false,
  196. name: '拂晓蓝',
  197. color: '#1890ff',
  198. style: 'background-color: #1890ff'
  199. }, {
  200. selected: false,
  201. name: '薄暮',
  202. color: '#f5222d',
  203. style: 'background-color: #f5222d'
  204. }, {
  205. selected: false,
  206. name: '火山',
  207. color: '#fa541c',
  208. style: 'background-color: #fa541c'
  209. }, {
  210. selected: false,
  211. name: '日暮',
  212. color: '#faad14',
  213. style: 'background-color: #faad14'
  214. }, {
  215. selected: false,
  216. name: '明青',
  217. color: '#13c2c2',
  218. style: 'background-color: #13c2c2'
  219. }, {
  220. selected: false,
  221. name: '极客蓝',
  222. color: '#2f54eb',
  223. style: 'background-color: #2f54eb'
  224. }, {
  225. selected: false,
  226. name: '酱紫',
  227. color: '#722ed1',
  228. style: 'background-color: #722ed1'
  229. }],
  230. form: {
  231. tsignName: null,
  232. tsignCode: null,
  233. logo: null,
  234. name: null,
  235. contacts: null,
  236. province: null,
  237. city: null, // 分部编号
  238. phone: null,
  239. email: null,
  240. address: null,
  241. customerServicePhone: null,
  242. remark: null,
  243. theme: 'green',
  244. themeColor: '#14928a'
  245. },
  246. payState: null,
  247. imageWidthM: 72,
  248. imageHeightM: 72,
  249. provinceList: [],
  250. cityList: []
  251. };
  252. },
  253. async mounted () {
  254. await this.getAreaList()
  255. if(this.data) {
  256. this.form = { ...this.data }
  257. this.payState = this.data.payState
  258. }
  259. // 选中默认颜色
  260. this.themeList.forEach(theme => {
  261. if(theme.color == this.form.themeColor) {
  262. theme.selected = true
  263. } else {
  264. theme.selected = false
  265. }
  266. })
  267. // 判断是否有城市编号
  268. if(this.form.areaId) {
  269. await getParentArea({ id: this.form.areaId }).then(async (res) => {
  270. if (res.code == 200 && res.data) {
  271. await this.getAreaList(res.data.id, () => {
  272. this.$set(this.form, "province", res.data.id);
  273. this.$set(this.form, "city", this.form.areaId);
  274. });
  275. this.branchStatus = true;
  276. }
  277. });
  278. } else {
  279. this.$set(this.form, "province", null);
  280. this.$set(this.form, "city", null);
  281. }
  282. this.$refs.form.clearValidate()
  283. },
  284. computed: {
  285. isDisabled() {
  286. // console.log(this.payState)
  287. if(this.tenantInfo == 'SETTING') {
  288. return false
  289. } else {
  290. return this.type == 'setting' || this.payState == 1 ? true : false
  291. }
  292. }
  293. },
  294. methods: {
  295. onSelectTheme(item) {
  296. this.themeList.forEach(theme => {
  297. theme.selected = false
  298. })
  299. item.selected = true
  300. this.form.themeColor = item.color
  301. },
  302. onSubmit() {
  303. let state = false
  304. this.$refs.form.validate(_ => {
  305. state = _
  306. })
  307. return state
  308. },
  309. onChangeProvince(val) {
  310. this.form.city = null;
  311. this.getAreaList(val);
  312. },
  313. getAreaList(parentId, callback) {
  314. parentId = parentId ? parentId : 0;
  315. areaQueryChild({ parentId: parentId }).then((res) => {
  316. if (res.code == 200 && res.data) {
  317. let tempData = [];
  318. res.data.forEach((item) => {
  319. tempData.push({
  320. label: item.name,
  321. value: item.id,
  322. });
  323. });
  324. if (parentId) {
  325. this.cityList = tempData;
  326. } else {
  327. this.provinceList = tempData;
  328. }
  329. if (callback && typeof callback == "function") {
  330. callback();
  331. }
  332. }
  333. });
  334. },
  335. getValues() { // 获取数据
  336. this.form.areaId = this.form.city;
  337. return this.form
  338. },
  339. handleAvatarSuccess(res) {
  340. this.form.logo = res.data.url;
  341. },
  342. beforeAvatarUpload(file) {
  343. const imageType = {
  344. "image/png": true
  345. };
  346. const isImage = imageType[file.type];
  347. const isLt2M = file.size / 1024 / 1024 < 2;
  348. const imageWidth = this.imageWidthM;
  349. const imageHeigh = this.imageHeightM;
  350. const _URL = window.URL || window.webkitURL;
  351. const isSize = new Promise((resolve, reject) => {
  352. const img = new Image();
  353. img.onload = function () {
  354. if (imageWidth && imageHeigh) {
  355. this.width === imageWidth && this.height === imageHeigh
  356. ? resolve()
  357. : reject(`请上传${imageWidth}x${imageHeigh}尺寸图片`);
  358. } else if (imageWidth && !imageHeigh) {
  359. this.width === imageWidth
  360. ? resolve()
  361. : reject(`请上传宽为${imageWidth}的图片`);
  362. } else if (!imageWidth && imageHeigh) {
  363. this.height === imageHeigh
  364. ? resolve()
  365. : reject(`请上传高为${imageHeigh}的图片`);
  366. } else {
  367. resolve();
  368. }
  369. };
  370. img.src = _URL.createObjectURL(file);
  371. }).then(
  372. () => {
  373. return file;
  374. },
  375. (src) => {
  376. this.$message.error(src);
  377. this.uploadImgLoading = false;
  378. return Promise.reject();
  379. }
  380. );
  381. if (!isImage) {
  382. this.$message.error("只能上传图片格式!");
  383. }
  384. if (!isLt2M) {
  385. this.$message.error("上传头像图片大小不能超过 2MB!");
  386. }
  387. return isImage && isLt2M && isSize;
  388. },
  389. },
  390. };
  391. </script>
  392. <style lang='scss' scoped>
  393. /deep/.avatar-uploader .el-upload {
  394. border: 1px dashed #d9d9d9;
  395. border-radius: 6px;
  396. cursor: pointer;
  397. position: relative;
  398. overflow: hidden;
  399. background: #e7e7e7;
  400. }
  401. .avatar-uploader-icon {
  402. font-size: 28px;
  403. color: #8c939d;
  404. width: 72px;
  405. height: 72px;
  406. line-height: 72px;
  407. text-align: center;
  408. }
  409. .el-input, .el-select, .el-textarea {
  410. width: 300px !important;
  411. }
  412. .avatar {
  413. width: 72px;
  414. height: 72px;
  415. display: block;
  416. }
  417. .themeColor-block {
  418. width: 20px;
  419. height: 20px;
  420. border-radius: 2px;
  421. display: inline-block;
  422. cursor: pointer;
  423. vertical-align: middle;
  424. overflow: hidden;
  425. .el-icon-check {
  426. display: flex;
  427. align-items: center;
  428. justify-content: center;
  429. height: 21px;
  430. color: white;
  431. }
  432. }
  433. .themeColor-block + .themeColor-block {
  434. margin-left: 8px;
  435. }
  436. </style>