personInfo-detail.vue 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382
  1. <style scoped>
  2. .user-panel {
  3. margin: 10px auto;
  4. }
  5. </style>
  6. <template>
  7. <el-dialog
  8. :visible.sync="showDialog"
  9. :title="title"
  10. :modal-append-to-body="false"
  11. style="text-align:left;"
  12. @close="closeDialog"
  13. :close-on-click-modal="false"
  14. >
  15. <div class="user-panel" v-loading="loading">
  16. <el-form ref="form" :model="formModel" :rules="ruleValidate" :label-width="'100px'">
  17. <el-row>
  18. <el-col :span="12">
  19. <el-form-item label="单位" prop="companyId">
  20. <el-select
  21. v-model="formModel.companyId"
  22. filterable
  23. placeholder="请选择"
  24. style="width:90%"
  25. >
  26. <el-option
  27. v-for="company in companyResult"
  28. :key="company.id"
  29. :label="company.name"
  30. :value="company.id"
  31. ></el-option>
  32. </el-select>
  33. </el-form-item>
  34. </el-col>
  35. <el-col :span="12">
  36. <el-form-item label="姓名" prop="name">
  37. <el-input v-model="formModel.name" placeholder="请输入姓名"></el-input>
  38. </el-form-item>
  39. </el-col>
  40. </el-row>
  41. <el-row>
  42. <el-col :span="12">
  43. <el-form-item label="手机号" prop="phone">
  44. <el-input v-model="formModel.phone" placeholder="请输入手机号"></el-input>
  45. </el-form-item>
  46. </el-col>
  47. <el-col :span="12">
  48. <el-form-item label="身份证" prop="idCard">
  49. <el-input v-model="formModel.idCard" placeholder="请输入身份证"></el-input>
  50. </el-form-item>
  51. </el-col>
  52. </el-row>
  53. <el-row>
  54. <el-col :span="24">
  55. <el-form-item label="用户身份" prop="popedom">
  56. <el-select
  57. v-model="formModel.popedom"
  58. filterable
  59. multiple
  60. placeholder="请选择"
  61. style="width:100%"
  62. >
  63. <el-option
  64. v-for="popedom in popedomList"
  65. :key="popedom.value"
  66. :label="popedom.name"
  67. :value="popedom.value"
  68. ></el-option>
  69. </el-select>
  70. </el-form-item>
  71. </el-col>
  72. </el-row>
  73. <el-row>
  74. <el-col :span="24">
  75. <el-form-item label="关联单位" prop="personCompany">
  76. <el-select
  77. v-model="formModel.personCompany"
  78. filterable
  79. multiple
  80. placeholder="请选择"
  81. style="width:100%"
  82. >
  83. <el-option
  84. v-for="company in companyResult"
  85. :key="company.id"
  86. :label="company.name"
  87. :value="company.id"
  88. ></el-option>
  89. </el-select>
  90. </el-form-item>
  91. </el-col>
  92. </el-row>
  93. <el-row>
  94. <el-col :span="24">
  95. <el-form-item label="照片" prop="faceImageUrl">
  96. <el-upload
  97. class="avatar-uploader"
  98. name="photoFile"
  99. :action="uploadUrl"
  100. :show-file-list="false"
  101. :headers="headers"
  102. :data="uploadData"
  103. :on-success="handleAvatarSuccess"
  104. :before-upload="beforeAvatarUpload"
  105. >
  106. <img v-if="fileUrl" :src="fileUrl" class="avatar" />
  107. <i v-else class="el-icon-plus avatar-uploader-icon"></i>
  108. </el-upload>
  109. </el-form-item>
  110. </el-col>
  111. </el-row>
  112. <el-row>
  113. <el-col :span="24">
  114. <el-form-item label="开放权限">
  115. <el-checkbox v-model="formModel.faceEnabled">人脸识别</el-checkbox>
  116. <el-checkbox v-model="formModel.cardEnabled">门禁卡</el-checkbox>
  117. <el-checkbox v-model="formModel.appEnabled">手机开锁</el-checkbox>
  118. <el-checkbox v-model="formModel.guestEnabled">访客权限</el-checkbox>
  119. </el-form-item>
  120. </el-col>
  121. </el-row>
  122. <el-row>
  123. <el-col :span="12">
  124. <el-form-item label="同步人脸信息" prop="faceBound">
  125. <el-radio-group v-model="formModel.faceBound">
  126. <el-radio :label="true">是</el-radio>
  127. <el-radio :label="false">否</el-radio>
  128. </el-radio-group>
  129. </el-form-item>
  130. </el-col>
  131. </el-row>
  132. <el-row>
  133. <el-col :span="12">
  134. <el-form-item label="微信通知" prop="wechatNoticeEnabled">
  135. <el-radio-group v-model="formModel.wechatNoticeEnabled">
  136. <el-radio :label="true">接受</el-radio>
  137. <el-radio :label="false">拒绝</el-radio>
  138. </el-radio-group>
  139. </el-form-item>
  140. </el-col>
  141. </el-row>
  142. <el-row>
  143. <el-col :span="12">
  144. <el-form-item label="是否允许查看本单位数据" prop="allowViewLocal">
  145. <el-radio-group v-model="formModel.allowViewLocal">
  146. <el-radio :label="true">是</el-radio>
  147. <el-radio :label="false">否</el-radio>
  148. </el-radio-group>
  149. </el-form-item>
  150. </el-col>
  151. </el-row>
  152. <el-row>
  153. <el-col :span="12">
  154. <el-form-item :label="companyPosition1" prop="position1">
  155. <el-input v-model="formModel.position1" placeholder="请输入一级位置"></el-input>
  156. </el-form-item>
  157. </el-col>
  158. <el-col :span="12">
  159. <el-form-item :label="companyPosition2" prop="position2">
  160. <el-input v-model="formModel.position2" placeholder="请输入二级位置"></el-input>
  161. </el-form-item>
  162. </el-col>
  163. </el-row>
  164. <el-row>
  165. <el-col :span="12">
  166. <el-form-item :label="companyPosition3" prop="position3">
  167. <el-input v-model="formModel.position3" placeholder="请输入三级位置"></el-input>
  168. </el-form-item>
  169. </el-col>
  170. <el-col :span="12">
  171. <el-form-item :label="companyPosition4" prop="position4">
  172. <el-input v-model="formModel.position4" placeholder="请输入四级位置"></el-input>
  173. </el-form-item>
  174. </el-col>
  175. </el-row>
  176. <el-row>
  177. <el-col :span="12">
  178. <el-form-item :label="companyPosition5" prop="position5">
  179. <el-input v-model="formModel.position5" placeholder="请输入五级位置"></el-input>
  180. </el-form-item>
  181. </el-col>
  182. </el-row>
  183. </el-form>
  184. </div>
  185. <span slot="footer" class="dialog-footer">
  186. <el-button @click="closeDialog">取 消</el-button>
  187. <el-button type="primary" @click="handleSubmit" :loading="submitting">确 定</el-button>
  188. </span>
  189. </el-dialog>
  190. </template>
  191. <script>
  192. import Constant from "@/constant";
  193. import personInfoApi from "@/api/base/personInfo";
  194. import dataDictionaryApi from "@/api/sys/dataDictionary";
  195. import personCompanyApi from "@/api/base/personCompany";
  196. import { getToken } from "@/utils/auth"; // get token from cookie
  197. export default {
  198. props: [
  199. "businessKey",
  200. "title",
  201. "companyResult",
  202. "companyPosition1",
  203. "companyPosition2",
  204. "companyPosition3",
  205. "companyPosition4",
  206. "companyPosition5"
  207. ],
  208. data() {
  209. let checkIdCard = (rule, value, callback) => {
  210. var identNumber = value;
  211. if (!/(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/.test(identNumber)) {
  212. return callback(new Error("格式错误"));
  213. } else if (!/(^\d{15}$)|(^\d{17}([0-9]|X)$)/.test(identNumber)) {
  214. //身份证号码为15位或者18位,15位时全为数字,18位前17位为数字,最后一位是校验位,可能为数字或字符X。
  215. return callback(new Error("格式错误"));
  216. } else {
  217. return callback();
  218. }
  219. };
  220. return {
  221. formModel: {},
  222. ruleValidate: {
  223. companyId: [{ required: true, message: "请选择单位", trigger: "blur" }],
  224. name: [{ required: true, message: "姓名不能为空", trigger: "blur" }],
  225. phone: [{ required: true, message: "手机号不能为空", trigger: "blur" }],
  226. // idCard: [
  227. // { required: false, message: "身份证不能为空", trigger: "blur" },
  228. // {
  229. // validator: checkIdCard,
  230. // trigger: "blur"
  231. // }
  232. // ]
  233. popedom: [
  234. { required: true, message: "请选择用户身份", trigger: "blur" }
  235. ]
  236. },
  237. showDialog: true,
  238. loading: false,
  239. submitting: false,
  240. checkList: [],
  241. //上传地址
  242. uploadUrl: Constant.serverUrl + "/uploadPicture",
  243. uploadData: {
  244. subFolder: "personInfo"
  245. },
  246. fileUrl: "",
  247. headers: {
  248. Authorization: getToken()
  249. },
  250. popedomList: []
  251. };
  252. },
  253. created() {
  254. var formData = new FormData();
  255. formData.append("catalogName", "用户身份");
  256. return dataDictionaryApi.findByCatalogName(formData).then(response => {
  257. var jsonData = response.data;
  258. this.popedomList = jsonData.data;
  259. });
  260. },
  261. methods: {
  262. closeDialog() {
  263. this.$emit("close", false);
  264. },
  265. handleSubmit() {
  266. var self = this;
  267. this.$refs["form"].validate(valid => {
  268. if (valid) {
  269. (function() {
  270. var id = self.formModel.id;
  271. //数组转换为字符串
  272. //用户身份
  273. if (self.formModel.popedom!=null && self.formModel.popedom != "") {
  274. var popedom = self.formModel.popedom.join(",");
  275. self.formModel.popedom = popedom;
  276. }
  277. //子单位
  278. if (self.formModel.personCompany!=null && self.formModel.personCompany != "") {
  279. var personCompany = self.formModel.personCompany.join(",");
  280. self.formModel.personCompany = personCompany;
  281. }
  282. if (id == null || id.length == 0) {
  283. return personInfoApi.add(self.formModel);
  284. } else {
  285. return personInfoApi.update(self.formModel);
  286. }
  287. })().then(function(response) {
  288. var jsonData = response.data;
  289. if (jsonData.result) {
  290. self.$message({
  291. message: "保存成功!",
  292. type: "success"
  293. });
  294. self.$emit("close", true);
  295. } else {
  296. self.$message({
  297. message: jsonData.message + "",
  298. type: "warning"
  299. });
  300. self.$emit("close", false);
  301. }
  302. });
  303. }
  304. });
  305. },
  306. handleAvatarSuccess(res, file) {
  307. var self = this;
  308. self.formModel.faceImageUrl = res.data;
  309. self.fileUrl =
  310. res.data + "?x-oss-process=image/resize,m_lfit,h_400,w_400";
  311. },
  312. beforeAvatarUpload(file) {
  313. const isJPG = file.type === "image/jpeg";
  314. const isLt2M = file.size / 1024 / 1024 < 2;
  315. if (!isJPG) {
  316. this.$message.error("上传头像图片只能是 JPG 格式!");
  317. }
  318. if (!isLt2M) {
  319. this.$message.error("上传头像图片大小不能超过 2MB!");
  320. }
  321. return isJPG && isLt2M;
  322. }
  323. },
  324. mounted: function() {
  325. var self = this;
  326. (function() {
  327. if (self.businessKey.length == 0) {
  328. return personInfoApi.create();
  329. } else {
  330. return personInfoApi.edit(self.businessKey);
  331. }
  332. })()
  333. .then(response => {
  334. var jsonData = response.data;
  335. self.loading = false;
  336. if (jsonData.result) {
  337. self.formModel = jsonData.data;
  338. let faceImageUrl = self.formModel.faceImageUrl;
  339. if (faceImageUrl != null) {
  340. self.fileUrl =
  341. faceImageUrl + "?x-oss-process=image/resize,m_lfit,h_400,w_400";
  342. }
  343. if (self.businessKey.length == 0) {
  344. self.formModel.popedom = ["1"];
  345. } else {
  346. var popedom = self.formModel.popedom;
  347. if (popedom != "") {
  348. self.formModel.popedom = popedom.split(",");
  349. }
  350. var personCompany = self.formModel.personCompany;
  351. if (personCompany != "") {
  352. self.formModel.personCompany = personCompany.split(",");
  353. }
  354. var wechatNoticeEnabled = self.formModel.wechatNoticeEnabled;
  355. if (wechatNoticeEnabled != "") {
  356. self.formModel.wechatNoticeEnabled = true;
  357. }
  358. }
  359. } else {
  360. self.$message.error(jsonData.message + "");
  361. }
  362. })
  363. .catch(error => {
  364. self.$message.error(error + "");
  365. });
  366. }
  367. };
  368. </script>